1 | DICLIX ;SEA/TOAD,SF/TKW-FileMan: Lister, Search Compound Indexes ;6/5/00 10:13
|
---|
2 | ;;22.0;VA FileMan;**4,3**;Mar 30, 1999;
|
---|
3 | ;Per VHA Directive 10-93-142, this routine should not be modified.
|
---|
4 | ;
|
---|
5 | WALK(DIFLAGS,DINDEX,DIDENT,DIFILE,DIEN,DIFIEN,DISCREEN,DILIST,DINDEX0,DIXV,DIC) ;
|
---|
6 | ;
|
---|
7 | ; a walker to traverse a compound index, taking actions
|
---|
8 | ; DINDEX is an array describing the index and how to walk it
|
---|
9 | ;
|
---|
10 | PREP ; prepare to loop through subscript
|
---|
11 | ;
|
---|
12 | N DISUB S DISUB=DINDEX("AT")
|
---|
13 | N DIVAL S DIVAL=DINDEX(DISUB)
|
---|
14 | N DIPART,DIMORE S DIPART=$G(DINDEX(DISUB,"PART")),DIMORE=+$G(DINDEX(DISUB,"MORE?"))
|
---|
15 | I $G(DINDEX(DISUB,"USE")),DIVAL'="" D
|
---|
16 | . S DIVAL=$O(@DINDEX(DISUB,"ROOT")@(DIVAL),-DINDEX(DISUB,"WAY"))
|
---|
17 | ;
|
---|
18 | LOOP ; loop through subscripts
|
---|
19 | ;
|
---|
20 | N DIDONE,DISKIP S DIDONE=0 F D Q:DIDONE!$G(DIERR)
|
---|
21 | . S DIVAL=$O(@DINDEX(DISUB,"ROOT")@(DIVAL),DINDEX(DISUB,"WAY"))
|
---|
22 | .
|
---|
23 | DATA . ; if we're in the data subscripts, we need to walk further
|
---|
24 | .
|
---|
25 | . I DISUB'>DINDEX("#") D Q
|
---|
26 | . . I DISUB=1,$O(DIXV(0)) D LOWSUB
|
---|
27 | . . S DISKIP=0
|
---|
28 | . . I DIVAL'="",'$D(DINDEX(DISUB,"IXROOT")) D CHK Q:DISKIP
|
---|
29 | . . S:DIVAL="" DIDONE=1
|
---|
30 | . . Q:DIDONE
|
---|
31 | . . S DINDEX(DISUB)=DIVAL,DINDEX("AT")=DISUB+1
|
---|
32 | . . I $D(DINDEX("ROOTCNG",DISUB+1)) D BLDTMP^DICLIX1(.DINDEX,.DISCREEN,DIFLAGS,.DIDENT)
|
---|
33 | . . D WALK(.DIFLAGS,.DINDEX,.DIDENT,.DIFILE,.DIEN,DIFIEN,.DISCREEN,.DILIST,.DINDEX0,"",.DIC)
|
---|
34 | . . S DINDEX("AT")=DISUB
|
---|
35 | . . I $G(DINDEX("DONE"))!$G(DIERR) S DIDONE=1
|
---|
36 | . . Q
|
---|
37 | .
|
---|
38 | IEN . ; otherwise, we're in the IEN subscripts & need to process
|
---|
39 | .
|
---|
40 | . I DIVAL="" S DIDONE=1 Q
|
---|
41 | . I DINDEX="B" N DISKIPMN,DIMNEM S DISKIPMN=0 D Q:DISKIPMN
|
---|
42 | . . I $D(@DINDEX(DISUB,"ROOT")@(DIVAL))#2 Q:'^(DIVAL)
|
---|
43 | . . E Q:'$O(@DINDEX(DISUB,"ROOT")@(DIVAL,""))
|
---|
44 | . . I DIFLAGS["M" S DISKIPMN=1 Q
|
---|
45 | . . S DIMNEM="" Q
|
---|
46 | . I $G(DINDEX(DISUB,"TO")) D Q:DIDONE
|
---|
47 | . . Q:$D(DINDEX(DISUB,"IXROOT"))
|
---|
48 | . . D BACKPAST^DICLIX1(DIFLAGS,.DINDEX,DISUB,DIVAL,.DIDONE) Q
|
---|
49 | . D TRY
|
---|
50 | . Q
|
---|
51 | CLEAN ; clean up after loop, exit
|
---|
52 | S DINDEX(DISUB)=""
|
---|
53 | I DISUB>1,$G(DINDEX(DISUB,"PART"))]"" S DINDEX(DISUB)=DINDEX(DISUB,"FROM")
|
---|
54 | Q
|
---|
55 | ;
|
---|
56 | CHK ; See whether we have a match or are at the end of the subscripts.
|
---|
57 | D MATCH I DIDONE,'$G(DINDEX("DONE")),DIMORE D
|
---|
58 | . S DIDONE=0 D FINDMORE^DICLIX0(DISUB,.DIVAL,DIPART,.DINDEX,.DIMORE) I DIVAL="" S DIDONE=1 Q
|
---|
59 | . D MATCH Q
|
---|
60 | Q
|
---|
61 | ;
|
---|
62 | MATCH ; No more subscripts or partial matches, or past our TO value?
|
---|
63 | Q:DIVAL=""
|
---|
64 | I $P(DIVAL,$G(DIPART))'="" S DIDONE=1 Q
|
---|
65 | Q:$G(DINDEX(DISUB,"TO"))=""
|
---|
66 | I DIFLAGS["p" D BACKPAST^DICLIX1(DIFLAGS,.DINDEX0,DISUB,DIVAL,.DIDONE) Q
|
---|
67 | I $G(DINDEX(DISUB+1,"TO"))="" D BACKPAST^DICLIX1(DIFLAGS,.DINDEX,DISUB,DIVAL,.DIDONE)
|
---|
68 | Q
|
---|
69 | ;
|
---|
70 | LOWSUB ; Find next subscript value from multiple pointed-to files
|
---|
71 | N I,DILOWNO,DILOWVAL S DILOWNO=+DIFILE("STACK"),DILOWVAL=DIVAL
|
---|
72 | I DILOWVAL="" D I 'DILOWNO K DIXV Q
|
---|
73 | . K DIXV(DILOWNO),DIFILE("STACKEND",DILOWNO)
|
---|
74 | . S DILOWNO=$O(DIXV(0)),DILOWVAL=$G(DIXV(+DILOWNO,1,"NXTVAL"))
|
---|
75 | . Q
|
---|
76 | N J S J=DILOWNO
|
---|
77 | I DILOWVAL'="" F I=0:0 S I=$O(DIFILE("STACKEND",I)) Q:'I I I'=J D
|
---|
78 | . I DINDEX(1,"WAY")=1,DILOWVAL']]DIXV(I,1,"NXTVAL") Q
|
---|
79 | . I DINDEX(1,"WAY")=-1,DIXV(I,1,"NXTVAL")']]DILOWVAL Q
|
---|
80 | . S DILOWNO=I,DILOWVAL=$G(DIXV(DILOWNO,1,"NXTVAL"))
|
---|
81 | . Q
|
---|
82 | I DILOWNO'=DIFILE("STACK") D
|
---|
83 | . I DIVAL'="" S DIXV(+DIFILE("STACK"),1,"NXTVAL")=DIVAL
|
---|
84 | . S DIFILE("STACK")=DILOWNO_U_DIFILE("STACKEND",DILOWNO)
|
---|
85 | . S DIVAL=DILOWVAL
|
---|
86 | . S DIFILE=+$P(DIFILE("STACK"),U,3)
|
---|
87 | . M DINDEX=DIXV(DILOWNO) Q
|
---|
88 | Q
|
---|
89 | ;
|
---|
90 | TRY ; Apply screens to entry. If passed, add entry to output.
|
---|
91 | S (DIEN,DINDEX(DISUB))=DIVAL
|
---|
92 | I DIFLAGS["p" D
|
---|
93 | . S DINDEX0(1,"EXT")=DINDEX(1)
|
---|
94 | . D BACKTRAK^DICL3(.DIFLAGS,.DIFILE,DIFILE("STACK"),.DIEN,DIFIEN,.DINDEX0,.DINDEX,.DIDENT,.DISCREEN,.DILIST)
|
---|
95 | . S:$G(DINDEX0("DONE")) (DIDONE,DINDEX("DONE"))=1 Q
|
---|
96 | I DIFLAGS'["p" D
|
---|
97 | . N DI0NODE S DI0NODE=$G(@DIFILE(DIFILE)@(DIEN,0))
|
---|
98 | . Q:$$SCREEN^DICL2(.DIFILE,.DIEN,DIFLAGS,DIFIEN,.DISCREEN,.DINDEX,DI0NODE)
|
---|
99 | . D ACCEPT^DICL2(.DIFILE,.DIEN,.DIFLAGS,DIFIEN,.DINDEX,.DIDENT,.DILIST,DI0NODE)
|
---|
100 | . Q
|
---|
101 | Q:$G(DIERR)!($G(DINDEX("DONE")))
|
---|
102 | I DIDENT(-1)=DIDENT(-1,"MAX") D
|
---|
103 | . I 'DIDENT(-1,"JUST LOOKING") S DIDONE=1,DINDEX("DONE")=1 Q
|
---|
104 | . ; If called from online DIC help ^DICQ, display list.
|
---|
105 | . Q:DIFLAGS'["h"
|
---|
106 | . K DTOUT,DUOUT S DICQ(0,"MAP")=DIDENT(-3)
|
---|
107 | . D DSP^DICQ1(.DINDEX,.DICQ,.DIC,.DIFILE)
|
---|
108 | . I $G(DTOUT)!($G(DUOUT)) S (DINDEX("DONE"),DIDONE)=1 Q
|
---|
109 | . S DILIST("ORDER")=$S(DINDEX("WAY")=1:0,1:DIDENT(-1,"MAX")+1)
|
---|
110 | . S DIDENT(-1)=0,DIDENT(-1,"JUST LOOKING")=0 Q
|
---|
111 | Q
|
---|
112 | ;
|
---|
113 | ;
|
---|