XTLKKSCH ; IHS/OHPRD/ACC,SFISC/JC - "AND"ING INVERTED LIST SEARCH ;07/22/93 15:45
;;7.3;TOOLKIT;;Apr 25, 1995
; XTLKNWDS,XTLKREF1,XTLKREF4,XTLKWORD() ARE PASSED IN AND
; SHOULD NOT BE KILLED
K ^TMP("XTLKHITS",$J) S ^TMP("XTLKHITS",$J)=0
I $D(XTLKHLIM) S XTLKHLM1=XTLKHLIM+1
E S XTLKHLM1=0
S XTLKCMAX=XTLKDFN(1) F XTLKI=1:1:XTLKNWDS S:XTLKDFN(XTLKI)<XTLKCMAX XTLKCMAX=XTLKDFN(XTLKI)
RESTRT ;
S XTLKI=0,XTLKEMTY=0
SCLOOP ;
S XTLKI=XTLKI+1
G:XTLKI>XTLKNWDS!(XTLKEMTY) ENDCHK
CMP S XTLKLOW=XTLKDFN(XTLKI)<XTLKCMAX,XTLKHIGH=XTLKDFN(XTLKI)>XTLKCMAX
I XTLKLOW D INCSTK:XTLKPRTL(XTLKI),INCONE:'XTLKPRTL(XTLKI) G:'XTLKEMTY CMP
I XTLKHIGH S XTLKCMAX=XTLKDFN(XTLKI),XTLKI=0
G SCLOOP
ENDCHK ;
G:XTLKEMTY EXIT
D NOTCHK W:XTLKSAY=1 "." D:'XTLKELIM CHKSCRN
I 'XTLKELIM S ^TMP("XTLKHITS",$J)=^TMP("XTLKHITS",$J)+1,^TMP("XTLKHITS",$J,^TMP("XTLKHITS",$J))=XTLKCMAX,XTLKHLM1=XTLKHLM1-1 G:XTLKHLM1=0 STOP
S XTLKCMAX=XTLKCMAX+1
G RESTRT
STOP W !,"Too many terms meet your criteria; please refine your search.",! K ^TMP("XTLKHITS",$J) S ^TMP("XTLKHITS",$J)=0
EXIT K XTLKEMTY,XTLKHIGH,XTLKLOW,XTLKMDFN,XTLKNUM,XTLKCMAX,XTLKHLM1
K XTLKPRTL,XTLKWORD,XTLKAWRD,XTLKDFN,XTLKADFN,XTLKELIM
K XTLKWD,XTLKD,XTLKI,XTLKJ,XTLKQ
Q
;
NOTCHK ; CHECK POSSIBLE HIT FOR ELIMINATION BY "NOT"
S XTLKELIM=0,XTLKD=XTLKCMAX
S XTLKJ="" F XTLKQ=0:0 S XTLKJ=$O(^TMP($J,"AWRD",0,XTLKJ)) Q:XTLKJ="" S XTLKWD=^TMP($J,"AWRD",0,XTLKJ) I $D(@XTLKREF4) S XTLKELIM=1 Q
Q
;
CHKSCRN ; CHECK SCREEN
S Y=XTLKCMAX I $D(@(XTLKREF1_"Y,0)")) X:$D(DIC("S")) DIC("S") E S XTLKELIM=1
Q
;
INCONE ; ADVANCE DFN FOR EXACT MATCH CASE
S XTLKD=XTLKDFN(XTLKI),XTLKWD=XTLKWORD(XTLKI)
S:XTLKD<XTLKCMAX XTLKD=XTLKCMAX-1
F XTLKQ=0:0 S XTLKD=$O(@XTLKREF4) Q:XTLKD=""!(XTLKD'<XTLKCMAX)
S XTLKDFN(XTLKI)=XTLKD
S:XTLKD="" XTLKEMTY=1
Q
;
INCSTK ; ADVANCE COMPOSITE DFN FOR PARTIAL MATCH CASE
S XTLKJ=0
F XTLKQ=0:0 S XTLKJ=$O(^TMP($J,"AWRD",XTLKI,XTLKJ)) Q:XTLKJ="" D INC1 Q:XTLKD'=""
I XTLKJ="" S (XTLKD,XTLKDFN(XTLKI))="",XTLKEMTY=1 Q
S XTLKMDFN=XTLKD
F XTLKQ=0:0 S XTLKJ=$O(^TMP($J,"AWRD",XTLKI,XTLKJ)) Q:XTLKJ="" D INC1 S:XTLKD'=""&(XTLKD<XTLKMDFN) XTLKMDFN=XTLKD
S XTLKDFN(XTLKI)=XTLKMDFN
Q
INC1 ;
S XTLKD=^TMP($J,"ADFN",XTLKI,XTLKJ),XTLKWD=^TMP($J,"AWRD",XTLKI,XTLKJ)
Q:^TMP($J,"ADFN",XTLKI,XTLKJ)'<XTLKCMAX
S XTLKD=XTLKCMAX-1
F XTLKQ=0:0 S XTLKD=$O(@XTLKREF4) Q:XTLKD=""!(XTLKD'<XTLKCMAX)
S:XTLKD'="" ^TMP($J,"ADFN",XTLKI,XTLKJ)=XTLKD
K:XTLKD="" ^TMP($J,"AWRD",XTLKI,XTLKJ),^TMP($J,"ADFN",XTLKI,XTLKJ)
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXTLKKSCH 2545 printed Oct 16, 2024@18:41:57 Page 2
XTLKKSCH ; IHS/OHPRD/ACC,SFISC/JC - "AND"ING INVERTED LIST SEARCH ;07/22/93 15:45
+1 ;;7.3;TOOLKIT;;Apr 25, 1995
+2 ; XTLKNWDS,XTLKREF1,XTLKREF4,XTLKWORD() ARE PASSED IN AND
+3 ; SHOULD NOT BE KILLED
+4 KILL ^TMP("XTLKHITS",$JOB)
SET ^TMP("XTLKHITS",$JOB)=0
+5 IF $DATA(XTLKHLIM)
SET XTLKHLM1=XTLKHLIM+1
+6 IF '$TEST
SET XTLKHLM1=0
+7 SET XTLKCMAX=XTLKDFN(1)
FOR XTLKI=1:1:XTLKNWDS
if XTLKDFN(XTLKI)<XTLKCMAX
SET XTLKCMAX=XTLKDFN(XTLKI)
RESTRT ;
+1 SET XTLKI=0
SET XTLKEMTY=0
SCLOOP ;
+1 SET XTLKI=XTLKI+1
+2 if XTLKI>XTLKNWDS!(XTLKEMTY)
GOTO ENDCHK
CMP SET XTLKLOW=XTLKDFN(XTLKI)<XTLKCMAX
SET XTLKHIGH=XTLKDFN(XTLKI)>XTLKCMAX
+1 IF XTLKLOW
if XTLKPRTL(XTLKI)
DO INCSTK
if 'XTLKPRTL(XTLKI)
DO INCONE
if 'XTLKEMTY
GOTO CMP
+2 IF XTLKHIGH
SET XTLKCMAX=XTLKDFN(XTLKI)
SET XTLKI=0
+3 GOTO SCLOOP
ENDCHK ;
+1 if XTLKEMTY
GOTO EXIT
+2 DO NOTCHK
if XTLKSAY=1
WRITE "."
if 'XTLKELIM
DO CHKSCRN
+3 IF 'XTLKELIM
SET ^TMP("XTLKHITS",$JOB)=^TMP("XTLKHITS",$JOB)+1
SET ^TMP("XTLKHITS",$JOB,^TMP("XTLKHITS",$JOB))=XTLKCMAX
SET XTLKHLM1=XTLKHLM1-1
if XTLKHLM1=0
GOTO STOP
+4 SET XTLKCMAX=XTLKCMAX+1
+5 GOTO RESTRT
STOP WRITE !,"Too many terms meet your criteria; please refine your search.",!
KILL ^TMP("XTLKHITS",$JOB)
SET ^TMP("XTLKHITS",$JOB)=0
EXIT KILL XTLKEMTY,XTLKHIGH,XTLKLOW,XTLKMDFN,XTLKNUM,XTLKCMAX,XTLKHLM1
+1 KILL XTLKPRTL,XTLKWORD,XTLKAWRD,XTLKDFN,XTLKADFN,XTLKELIM
+2 KILL XTLKWD,XTLKD,XTLKI,XTLKJ,XTLKQ
+3 QUIT
+4 ;
NOTCHK ; CHECK POSSIBLE HIT FOR ELIMINATION BY "NOT"
+1 SET XTLKELIM=0
SET XTLKD=XTLKCMAX
+2 SET XTLKJ=""
FOR XTLKQ=0:0
SET XTLKJ=$ORDER(^TMP($JOB,"AWRD",0,XTLKJ))
if XTLKJ=""
QUIT
SET XTLKWD=^TMP($JOB,"AWRD",0,XTLKJ)
IF $DATA(@XTLKREF4)
SET XTLKELIM=1
QUIT
+3 QUIT
+4 ;
CHKSCRN ; CHECK SCREEN
+1 SET Y=XTLKCMAX
IF $DATA(@(XTLKREF1_"Y,0)"))
if $DATA(DIC("S"))
XECUTE DIC("S")
IF '$TEST
SET XTLKELIM=1
+2 QUIT
+3 ;
INCONE ; ADVANCE DFN FOR EXACT MATCH CASE
+1 SET XTLKD=XTLKDFN(XTLKI)
SET XTLKWD=XTLKWORD(XTLKI)
+2 if XTLKD<XTLKCMAX
SET XTLKD=XTLKCMAX-1
+3 FOR XTLKQ=0:0
SET XTLKD=$ORDER(@XTLKREF4)
if XTLKD=""!(XTLKD'<XTLKCMAX)
QUIT
+4 SET XTLKDFN(XTLKI)=XTLKD
+5 if XTLKD=""
SET XTLKEMTY=1
+6 QUIT
+7 ;
INCSTK ; ADVANCE COMPOSITE DFN FOR PARTIAL MATCH CASE
+1 SET XTLKJ=0
+2 FOR XTLKQ=0:0
SET XTLKJ=$ORDER(^TMP($JOB,"AWRD",XTLKI,XTLKJ))
if XTLKJ=""
QUIT
DO INC1
if XTLKD'=""
QUIT
+3 IF XTLKJ=""
SET (XTLKD,XTLKDFN(XTLKI))=""
SET XTLKEMTY=1
QUIT
+4 SET XTLKMDFN=XTLKD
+5 FOR XTLKQ=0:0
SET XTLKJ=$ORDER(^TMP($JOB,"AWRD",XTLKI,XTLKJ))
if XTLKJ=""
QUIT
DO INC1
if XTLKD'=""&(XTLKD<XTLKMDFN)
SET XTLKMDFN=XTLKD
+6 SET XTLKDFN(XTLKI)=XTLKMDFN
+7 QUIT
INC1 ;
+1 SET XTLKD=^TMP($JOB,"ADFN",XTLKI,XTLKJ)
SET XTLKWD=^TMP($JOB,"AWRD",XTLKI,XTLKJ)
+2 if ^TMP($JOB,"ADFN",XTLKI,XTLKJ)'<XTLKCMAX
QUIT
+3 SET XTLKD=XTLKCMAX-1
+4 FOR XTLKQ=0:0
SET XTLKD=$ORDER(@XTLKREF4)
if XTLKD=""!(XTLKD'<XTLKCMAX)
QUIT
+5 if XTLKD'=""
SET ^TMP($JOB,"ADFN",XTLKI,XTLKJ)=XTLKD
+6 if XTLKD=""
KILL ^TMP($JOB,"AWRD",XTLKI,XTLKJ),^TMP($JOB,"ADFN",XTLKI,XTLKJ)
+7 QUIT