- APCUKSCH ; "AND"ING INVERTED LIST SEARCH ; [ 11/13/86 9:50 AM ]
- K HITS S HITS=0
- I $D(HITLIMIT) S HLIM=HITLIMIT+1
- E S HLIM=0
- S CMAX=DFN(1) F I=1:1:NWDS S:DFN(I)<CMAX CMAX=DFN(I)
- RESTRT ;
- S I=0,EMPTY=0
- SCLOOP ;
- S I=I+1
- G:I>NWDS!(EMPTY) ENDCHK
- CMP S LOW=DFN(I)<CMAX,HIGH=DFN(I)>CMAX
- I LOW D INCSTK:PARTIAL(I),INCONE:'PARTIAL(I) G:'EMPTY CMP
- I HIGH S CMAX=DFN(I),I=0
- G SCLOOP
- ENDCHK ;
- G:EMPTY EXIT
- D NOTCHK W "." D:'ELIM CHKSCRN
- I 'ELIM S HITS=HITS+1,HITS(HITS)=CMAX,HLIM=HLIM-1 G:HLIM=0 STOP
- S CMAX=CMAX+1
- G RESTRT
- STOP W !,"Too many terms meet your criteria; please refine your search.",! K HITS S HITS=0
- EXIT K EMPTY,HIGH,LOW,MINDFN,NUM,CMAX
- K PARTIAL,WORD,AWORD,DFN,ADFN
- K WD,D,J
- Q
- ;
- NOTCHK ; CHECK POSSIBLE HIT FOR ELIMINATION BY "NOT"
- S ELIM=0,D=CMAX
- S J="" F Q=0:0 S J=$O(AWORD(0,J)) Q:J="" S WD=AWORD(0,J) I $D(@REF4) S ELIM=1 Q
- Q
- ;
- CHKSCRN ; CHECK SCREEN
- S Y=CMAX I 1,$D(@(REF1_"Y,0)")) X:$D(DIC("S")) DIC("S") E S ELIM=1
- Q
- ;
- INCONE ; ADVANCE DFN FOR EXACT MATCH CASE
- S D=DFN(I),WD=WORD(I)
- S:D<CMAX D=CMAX-1
- F Q=0:0 S D=$O(@REF4) Q:D=""!(D'<CMAX)
- S DFN(I)=D
- S:D="" EMPTY=1
- Q
- ;
- INCSTK ; ADVANCE COMPOSITE DFN FOR PARTIAL MATCH CASE
- S J=0
- F Q=0:0 S J=$O(AWORD(I,J)) Q:J="" D INC1 Q:D'=""
- I J="" S (D,DFN(I))="",EMPTY=1 Q
- S MINDFN=D
- F Q=0:0 S J=$O(AWORD(I,J)) Q:J="" D INC1 S:D'=""&(D<MINDFN) MINDFN=D
- S DFN(I)=MINDFN
- Q
- INC1 ;
- S D=ADFN(I,J),WD=AWORD(I,J)
- Q:ADFN(I,J)'<CMAX
- S D=CMAX-1
- F Q=0:0 S D=$O(@REF4) Q:D=""!(D'<CMAX)
- S:D'="" ADFN(I,J)=D
- K:D="" AWORD(I,J),ADFN(I,J)
- Q