1 | RGUTMTL ;CAIRO/DKM - Multi-term lookup support ;04-Sep-1998 11:26;DKM
|
---|
2 | ;;2.1;RUN TIME LIBRARY;;Mar 22, 1999
|
---|
3 | ;=================================================================
|
---|
4 | ; Parse term into component words (KWIC)
|
---|
5 | PARSE2(RGTRM,RGRTN,RGMIN) ;
|
---|
6 | N X,L,C,%
|
---|
7 | K RGRTN
|
---|
8 | S %="RGRTN(I)",X=$$UP^XLFSTR(RGTRM),RGMIN=+$G(RGMIN)
|
---|
9 | D S^XTLKWIC
|
---|
10 | S L="",C=0
|
---|
11 | F S L=$O(RGRTN(L)) Q:L="" D
|
---|
12 | .I $L(L)<RGMIN K RGRTN(L)
|
---|
13 | .E S C=C+1
|
---|
14 | Q C
|
---|
15 | ; Parse term into component words
|
---|
16 | PARSE(RGTRM,RGRTN,RGMIN) ;
|
---|
17 | N X,Y,Z,L,C
|
---|
18 | K RGRTN
|
---|
19 | S RGTRM=$$UP^XLFSTR(RGTRM),C=0,RGMIN=+$G(RGMIN,1),Z=""
|
---|
20 | F X=1:1 Q:'$L(RGTRM) D:$E(RGTRM,X)'?1AN
|
---|
21 | .S Y=Z,Z=$E(RGTRM,X),L=$E(RGTRM,1,X-1),RGTRM=$E(RGTRM,X+1,999),X=0
|
---|
22 | .I $L(L)'<RGMIN,L'=+L,'$D(RGRTN(L)) S RGRTN(L)=Y,C=C+1,Y=""
|
---|
23 | Q C
|
---|
24 | ; Create/delete an MTL cross reference for term
|
---|
25 | XREF(RGRT,RGTRM,RGDA,RGDEL) ;
|
---|
26 | N RGZ,RGG
|
---|
27 | S RGZ=$L(RGRT),RGG=$S($E(RGRT,RGZ)=")":$E(RGRT,1,RGZ-1)_",",1:RGRT_"(")_"RGZ,",RGZ=$C(1)
|
---|
28 | F S RGZ=$O(RGDA(RGZ),-1) Q:'RGZ S RGG=RGG_""""_RGDA(RGZ)_""","
|
---|
29 | S RGG=RGG_""""_RGDA_""")"
|
---|
30 | Q:'$$PARSE(RGTRM,.RGZ)
|
---|
31 | S RGZ="",RGDEL=''$G(RGDEL)
|
---|
32 | L +@RGRT
|
---|
33 | F S RGZ=$O(RGZ(RGZ)) Q:RGZ="" D
|
---|
34 | .I ''$D(@RGG)=RGDEL D
|
---|
35 | ..I RGDEL K @RGG K:$D(@RGRT@(RGZ))<10 @RGRT@(RGZ)
|
---|
36 | ..E D:'$D(@RGRT@(RGZ)) REFNEW(RGZ) S @RGG=""
|
---|
37 | ..D REFCNT(RGZ,$S(RGDEL:-1,1:1))
|
---|
38 | L -@RGRT
|
---|
39 | Q
|
---|
40 | ; Increment/decrement reference count for term and its stems
|
---|
41 | REFCNT(RGX,RGI) ;
|
---|
42 | Q:'$L(RGX)
|
---|
43 | I $D(@RGRT@(RGX)) D
|
---|
44 | .N RGZ
|
---|
45 | .S RGZ=$G(@RGRT@(RGX))+RGI
|
---|
46 | .I RGZ<1 K @RGRT@(RGX)
|
---|
47 | .E S @RGRT@(RGX)=RGZ
|
---|
48 | D REFCNT($E(RGX,1,$L(RGX)-1),RGI)
|
---|
49 | Q
|
---|
50 | ; Create new term reference
|
---|
51 | REFNEW(RGX) ;
|
---|
52 | N RGZ,RGC,RGABR
|
---|
53 | S RGZ=RGX,RGC=0,RGABR=0
|
---|
54 | F S RGZ=$$STEM(RGZ,RGX) Q:'$L(RGZ) S RGC=RGC+$G(@RGRT@(RGZ)),RGZ=RGZ_$C(255)
|
---|
55 | S @RGRT@(RGX)=RGC
|
---|
56 | Q
|
---|
57 | ; Lookup a term in an MTL index
|
---|
58 | ; RGRT = Root of index (e.g., ^RGCOD(990.9,"AD"))
|
---|
59 | ; RGTRM = Term to lookup
|
---|
60 | ; RGRTN = Root of returned array (note: killed before populated)
|
---|
61 | ; RGABR = If nonzero, user can abort lookup with ^
|
---|
62 | LKP(RGRT,RGTRM,RGRTN,RGABR) ;
|
---|
63 | N RGX,RGY,RGW,RGF,RGIEN,RGL,RGM,RGTRM1
|
---|
64 | I $$NEWERR^%ZTER N $ET S $ET=""
|
---|
65 | K @RGRTN
|
---|
66 | S RGABR=+$G(RGABR),@$$TRAP^RGZOSF("LKP2^RGUTMTL")
|
---|
67 | I $$PARSE(RGTRM,.RGTRM)=1 S RGW(1,$O(RGTRM("")))=""
|
---|
68 | E D
|
---|
69 | .S RGTRM="",RGM=9999999999
|
---|
70 | .F S RGTRM=$O(RGTRM(RGTRM)) Q:RGTRM="" D Q:RGL<0
|
---|
71 | ..S RGX=RGTRM(RGTRM)["=",RGY=RGTRM(RGTRM)["~",RGTRM1="",RGL=$S(RGY:9999999999,1:-1)
|
---|
72 | ..I 'RGY F S RGTRM1=$$STEM(RGTRM1,RGTRM,RGX) Q:RGTRM1="" D:$D(^(RGTRM1))>1 Q:RGL>RGM
|
---|
73 | ...S:RGL=-1 RGL=0
|
---|
74 | ...S RGL=RGL+$G(^(RGTRM1))
|
---|
75 | ...S RGTRM1=RGTRM1_$C(255)
|
---|
76 | ..S RGW(RGL,RGTRM)=""
|
---|
77 | ..I RGL>0,RGL<RGM S RGM=RGL
|
---|
78 | ..D:RGABR ABORT
|
---|
79 | Q:$D(RGW(-1)) 0
|
---|
80 | S RGW="",RGF=0
|
---|
81 | F S RGW=$O(RGW(RGW)),RGTRM="" Q:RGW="" D Q:RGF=-1
|
---|
82 | .F S RGTRM=$O(RGW(RGW,RGTRM)) Q:RGTRM="" D Q:RGF=-1
|
---|
83 | ..S RGX=RGTRM(RGTRM)["=",RGY=RGTRM(RGTRM)["~"
|
---|
84 | ..I RGF D
|
---|
85 | ...S RGIEN=0
|
---|
86 | ...F S RGIEN=$O(@RGRTN@(RGIEN)),RGTRM1="" Q:'RGIEN D Q:RGF=-1
|
---|
87 | ....F S RGTRM1=$$STEM(RGTRM1,RGTRM,RGX) Q:RGTRM1="" Q:$D(^(RGTRM1,RGIEN))
|
---|
88 | ....I RGY-(RGTRM1="") K @RGRTN@(RGIEN) S:$D(@RGRTN)'>1 RGF=-1
|
---|
89 | ..E D
|
---|
90 | ...S RGTRM1="",RGF=1
|
---|
91 | ...F S RGTRM1=$$STEM(RGTRM1,RGTRM,RGX) Q:RGTRM1="" M @RGRTN=^(RGTRM1)
|
---|
92 | ...S:$D(@RGRTN)'>1 RGF=-1
|
---|
93 | Q $D(@RGRTN)>1
|
---|
94 | LKP2 K @RGRTN
|
---|
95 | Q -1
|
---|
96 | ; Check for user abort
|
---|
97 | ABORT N RGZ
|
---|
98 | R RGZ#1:0
|
---|
99 | D:RGZ=U RAISE^RGZOSF()
|
---|
100 | Q
|
---|
101 | ; Return in successive calls all terms sharing common stem
|
---|
102 | ; (sets naked reference)
|
---|
103 | STEM(RGLAST,RGSTEM,RGF) ;
|
---|
104 | D:RGABR ABORT
|
---|
105 | I RGLAST="" S RGLAST=RGSTEM Q:$D(@RGRT@(RGLAST)) RGLAST
|
---|
106 | Q:$G(RGF) ""
|
---|
107 | S RGLAST=$O(@RGRT@(RGLAST))
|
---|
108 | Q $S($E(RGLAST,1,$L(RGSTEM))=RGSTEM:RGLAST,1:"")
|
---|