[895] | 1 | TMGSRCH2 ;TMG/kst/Search API ; 6/19/10
|
---|
| 2 | ;;1.0;TMG-LIB;**1**;06/19/10
|
---|
| 3 | ;
|
---|
| 4 | ;"TMG Search only in TIU documents for 1 patient
|
---|
| 5 | ;
|
---|
| 6 | ;"Copyright Kevin Toppenberg MD 6/19/10
|
---|
| 7 | ;"Released under GNU General Public License (GPL)
|
---|
| 8 | ;"
|
---|
| 9 | ;"=======================================================================
|
---|
| 10 | ;" RPC -- Public Functions.
|
---|
| 11 | ;"=======================================================================
|
---|
| 12 | ;"LAUNCHSR(DFN,TMGSRCH) --Launch background task to achieve search
|
---|
| 13 | ;"STATUS() -- Get status of background searching task
|
---|
| 14 | ;"RESULTS(OUT) -- get result from background search
|
---|
| 15 | ;"CLEAR -- Tell background task to stop, and clear data array
|
---|
| 16 | ;"STOP --Tell background task to stop searching
|
---|
| 17 | ;"=======================================================================
|
---|
| 18 | ;"PRIVATE API FUNCTIONS
|
---|
| 19 | ;"=======================================================================
|
---|
| 20 | ;"CHANGESRCH(BKJOB,DFN,TMGSRCH) -- tell background task to change search parameters
|
---|
| 21 | ;"MSG(BKJOB,MSG) -- Purpose to message background task
|
---|
| 22 | ;"SRCHTIU(DFN,TMGSRCH,PARENTJOB) -- search all of one patient's documents for requested words
|
---|
| 23 | ;"PREPSRCH(PARENTJOB,DFN,TMGSRCH,WORDS,IENLIST) -- Parse search phrase, user prior runs if possible.
|
---|
| 24 | ;"PARSSRCH(TMGSRCH,WORDS) -- Separate search phrase out into array of words
|
---|
| 25 | ;"SRCH1TIU(PARENTJOB,IEN,TERM) -- Search TIU DOCUMENT report text for TERM
|
---|
| 26 | ;"=======================================================================
|
---|
| 27 | ;"=======================================================================
|
---|
| 28 | ;"Dependencies:
|
---|
| 29 | ;"=======================================================================
|
---|
| 30 | ;"=======================================================================
|
---|
| 31 | ;
|
---|
| 32 | LAUNCHSR(DFN,TMGSRCH) ;
|
---|
| 33 | ;"Purpose: Launch background task to achieve search
|
---|
| 34 | ;"Input: DFN -- The patient IEN to look up.
|
---|
| 35 | ;" TMGSRCH -- Search string. Notes:
|
---|
| 36 | ;" Each word (or partial word) to look up is separated by spaces
|
---|
| 37 | ;" All words are combined in AND fashion
|
---|
| 38 | ;" Search is NOT case sensitive.
|
---|
| 39 | ;" Exact pharases can be specified by quotes.
|
---|
| 40 | ;" Example: 'dog cat monkey "in a barrel"
|
---|
| 41 | NEW THISJOB SET THISJOB=$J
|
---|
| 42 | NEW STATUS SET STATUS=$GET(^TMG("TMP","SEARCH","SRCHTIU",THISJOB,"MSG"))
|
---|
| 43 | IF STATUS="BKGND RUNNING" DO
|
---|
| 44 | . DO CHANGESRCH(DFN,TMGSRCH)
|
---|
| 45 | ELSE DO
|
---|
| 46 | . NEW DEBUG SET DEBUG=0
|
---|
| 47 | . IF DEBUG=0 DO ;"Can be changed when stepping through code.
|
---|
| 48 | . . KILL ^TMG("TMP","SEARCH","SRCHTIU",THISJOB)
|
---|
| 49 | . . JOB SRCHTIU(DFN,TMGSRCH,THISJOB)
|
---|
| 50 | . . SET ^TMG("TMP","SEARCH","SRCHTIU",THISJOB,"BACKGROUND")=$ZJOB
|
---|
| 51 | . ELSE DO
|
---|
| 52 | . . DO SRCHTIU(DFN,TMGSRCH,THISJOB)
|
---|
| 53 | QUIT
|
---|
| 54 | ;
|
---|
| 55 | ;
|
---|
| 56 | STATUS() ;
|
---|
| 57 | ;"Purpose: To check status of background searching task
|
---|
| 58 | ;"Input: none
|
---|
| 59 | ;"Output: returns 1^status string, or "1^" if none
|
---|
| 60 | NEW RESULT
|
---|
| 61 | SET RESULT=$GET(^TMG("TMP","SEARCH","SRCHTIU",$J,"MSG"))
|
---|
| 62 | IF +$PIECE(RESULT,"^",1)'=$PIECE(RESULT,"^",1) SET RESULT="1^"_RESULT
|
---|
| 63 | STATDN QUIT RESULT
|
---|
| 64 | ;
|
---|
| 65 | ;
|
---|
| 66 | RESULTS(OUT) ;
|
---|
| 67 | ;"Purpose: To get result from background search
|
---|
| 68 | ;"Input: OUT -- PASS BY REFERENCE. An OUT PARAMETER. Format
|
---|
| 69 | ;" OUT(0)=FoundCount^Success, or -1^Message
|
---|
| 70 | ;" OUT(1)=IEN1
|
---|
| 71 | ;" OUT(2)=IEN2 ... etc.
|
---|
| 72 | NEW STATUS SET STATUS=$$STATUS()
|
---|
| 73 | IF +STATUS=-1 SET OUT(0)=STATUS GOTO RSLTDN
|
---|
| 74 | ;"IF STATUS'="DONE" SET OUT(0)="-1^Search not completed"
|
---|
| 75 | NEW IENLIST MERGE IENLIST=^TMG("TMP","SEARCH","SRCHTIU",$J,"IEN LIST")
|
---|
| 76 | NEW CT SET CT=0
|
---|
| 77 | NEW IEN SET IEN=0
|
---|
| 78 | FOR SET IEN=$ORDER(IENLIST(IEN)) QUIT:(+IEN'>0) DO
|
---|
| 79 | . SET CT=CT+1
|
---|
| 80 | . SET OUT(CT)=IEN
|
---|
| 81 | IF $DATA(OUT)=0 SET OUT(0)="-1^No results found"
|
---|
| 82 | ELSE SET OUT(0)=(CT-1)_"^Success"
|
---|
| 83 | RSLTDN QUIT
|
---|
| 84 | ;
|
---|
| 85 | ;
|
---|
| 86 | CLEAR ;"Purpose: Tell background task to stop, and clear data array
|
---|
| 87 | DO STOP
|
---|
| 88 | KILL ^TMG("TMP","SEARCH","SRCHTIU",$J)
|
---|
| 89 | QUIT
|
---|
| 90 | ;
|
---|
| 91 | ;
|
---|
| 92 | STOP ;"Purpose: Tell background task to stop searching
|
---|
| 93 | DO MSG("STOP")
|
---|
| 94 | QUIT
|
---|
| 95 | ;
|
---|
| 96 | ;
|
---|
| 97 | CHANGESRCH(DFN,TMGSRCH) ;
|
---|
| 98 | ;"Purpose: to tell background task to change search parameters
|
---|
| 99 | DO MSG("RESTART^"_DFN_"^"_TMGSRCH)
|
---|
| 100 | QUIT
|
---|
| 101 | ;
|
---|
| 102 | ;
|
---|
| 103 | MSG(MSG) ;
|
---|
| 104 | ;"Purpose to message background task
|
---|
| 105 | SET ^TMG("TMP","SEARCH","SRCHTIU",$J,"MSG")=MSG
|
---|
| 106 | QUIT
|
---|
| 107 | ;
|
---|
| 108 | ;
|
---|
| 109 | ;"==========================================================================
|
---|
| 110 | SRCHTIU(DFN,TMGSRCH,PARENTJOB) ;
|
---|
| 111 | ;"Purpose: To search all of one patient's documents for requested words
|
---|
| 112 | ;"Input: DFN -- The patient IEN to look up.
|
---|
| 113 | ;" TMGSRCH -- Search string. Notes:
|
---|
| 114 | ;" Each word (or partial word) to look up is separated by spaces
|
---|
| 115 | ;" All words are combined in AND fashion
|
---|
| 116 | ;" Search is NOT case sensitive.
|
---|
| 117 | ;" Exact pharases can be specified by quotes.
|
---|
| 118 | ;" Example: 'dog cat monkey "in a barrel"
|
---|
| 119 | ;" PARENTJOB -- the job of the RPCBroker task that called this.
|
---|
| 120 | ;"NOTE: this routine will monitor global for messages:
|
---|
| 121 | ;" ^TMG("TMP","SEARCH","SRCHTIU",PARENTJOB,"MSG")=message
|
---|
| 122 | ;" If message of "STOP" is found, then search will be stopped.
|
---|
| 123 | ;"Output: Matching documents will be stored at:
|
---|
| 124 | ;" ^TMG("TMP","SEARCH","SRCHTIU",PARENTJOB,"IEN LIST",IEN)=""
|
---|
| 125 | ;" ^TMG("TMP","SEARCH","SRCHTIU",PARENTJOB,"IEN LIST",IEN)=""
|
---|
| 126 | ;" ^TMG("TMP","SEARCH","SRCHTIU",PARENTJOB,"DFN")=DFN
|
---|
| 127 | ;" ^TMG("TMP","SEARCH","SRCHTIU",PARENTJOB,"FILTER",FilterValue)=""
|
---|
| 128 | ;" ^TMG("TMP","SEARCH","SRCHTIU",PARENTJOB,"FILTER",FilterValue)=""
|
---|
| 129 | ;" When search is done, then message will be stored as
|
---|
| 130 | ;" ^TMG("TMP","SEARCH","SRCHTIU",PARENTJOB,"MSG")="DONE"
|
---|
| 131 | ;"Results: none
|
---|
| 132 | ;"NOTE: This function is designed so that it can do searching on the fly,
|
---|
| 133 | ;" as the user is typing in additional terms. Thus, if a prior
|
---|
| 134 | ;" search is found, and the prior search doesn't contain any terms
|
---|
| 135 | ;" that are not in the current search, then this search cycle will
|
---|
| 136 | ;" start with the results of the prior search.
|
---|
| 137 | ;" --A consequence of this is that a search of all the documents
|
---|
| 138 | ;" will be done first for search term #1, and then term #2, RATHER
|
---|
| 139 | ;" THAN searching 1 document for all the search terms. This should
|
---|
| 140 | ;" not cause too much of a performace hit because searches for other
|
---|
| 141 | ;" terms will be limited to matches for earlier terms
|
---|
| 142 | ;
|
---|
| 143 | NEW ABORT,IEN,IENLIST
|
---|
| 144 | NEW DEBUGI SET DEBUGI=0
|
---|
| 145 | SET DFN=+$GET(DFN)
|
---|
| 146 | SET TMGSRCH=$GET(TMGSRCH)
|
---|
| 147 | NEW REF SET REF=$NAME(^TMG("TMP","SEARCH","SRCHTIU",PARENTJOB))
|
---|
| 148 | L1 SET @REF@("MSG")="BKGND RUNNING"
|
---|
| 149 | DO PREPSRCH(PARENTJOB,DFN,TMGSRCH,.WORDS,.IENLIST)
|
---|
| 150 | SET ABORT=0
|
---|
| 151 | NEW TERMCT,TERM
|
---|
| 152 | FOR TERMCT=1:1 SET TERM=$GET(WORDS(TERMCT)) QUIT:(TERM="")!ABORT DO
|
---|
| 153 | . ;"SET @REF@("DEBUG",DEBUGI)="TERM="_TERM,DEBUGI=DEBUGI+1
|
---|
| 154 | . KILL @REF@("IEN LIST") ;"List will get progressively smaller. So kill and reset each cycle.
|
---|
| 155 | . ;"SET @REF@("DEBUG",DEBUGI)="@REF@('IENLIST') killed",DEBUGI=DEBUGI+1
|
---|
| 156 | . SET IEN=0
|
---|
| 157 | . FOR SET IEN=$ORDER(IENLIST(IEN)) QUIT:(+IEN'>0)!(ABORT) DO
|
---|
| 158 | . . ;"SET @REF@("DEBUG",DEBUGI)="IEN="_IEN,DEBUGI=DEBUGI+1
|
---|
| 159 | . . NEW MSG SET MSG=@REF@("MSG")
|
---|
| 160 | . . IF MSG="STOP" SET ABORT=1 QUIT
|
---|
| 161 | . . IF MSG="RESTART" SET ABORT=2 QUIT
|
---|
| 162 | . . NEW SRCHRSLT SET SRCHRSLT=$$SRCH1TIU(PARENTJOB,IEN,TERM)
|
---|
| 163 | . . ;"SET @REF@("DEBUG",DEBUGI)="Search 1 result="_SRCHRSLT,DEBUGI=DEBUGI+1
|
---|
| 164 | . . IF SRCHRSLT=0 KILL IENLIST(IEN)
|
---|
| 165 | . . ELSE IF (SRCHRSLT<0) SET ABORT=-SRCHRSLT
|
---|
| 166 | . . ;"SET @REF@("DEBUG",DEBUGI)="IENList count="_$$ListCt^TMGMISC("IENLIST"),DEBUGI=DEBUGI+1
|
---|
| 167 | . IF ABORT=0 DO
|
---|
| 168 | . . ;"SET @REF@("DEBUG",DEBUGI)="ABOUT TO MERGE00IENList count="_$$ListCt^TMGMISC("IENLIST"),DEBUGI=DEBUGI+1
|
---|
| 169 | . . ;"SET @REF@("DEBUG",DEBUGI)="merging",DEBUGI=DEBUGI+1
|
---|
| 170 | . . MERGE @REF@("IEN LIST")=IENLIST
|
---|
| 171 | . . ;"SET @REF@("DEBUG",DEBUGI)="@REF@(IENList count="_$$ListCt^TMGMISC($name(@REF@("IEN LIST"))),DEBUGI=DEBUGI+1
|
---|
| 172 | . . ;"SET @REF@("DEBUG",DEBUGI)="REF="_REF,DEBUGI=DEBUGI+1
|
---|
| 173 | . . SET @REF@("FILTER",TERM)=""
|
---|
| 174 | ;"SET @REF@("DEBUG",DEBUGI)="ABORT="_ABORT,DEBUGI=DEBUGI+1
|
---|
| 175 | IF ABORT=2 GOTO L1 ;"Restart
|
---|
| 176 | ;"SET @REF@("DEBUG",DEBUGI)="@REF@(IENList count="_$$ListCt^TMGMISC($name(@REF@("IEN LIST"))),DEBUGI=DEBUGI+1
|
---|
| 177 | SET @REF@("MSG")="DONE"
|
---|
| 178 | KILL @REF@("BACKGROUND")
|
---|
| 179 | ;"SET @REF@("DEBUG",DEBUGI)="@REF@(IENList count="_$$ListCt^TMGMISC($name(@REF@("IEN LIST"))),DEBUGI=DEBUGI+1
|
---|
| 180 | QUIT ;"This will cause thie JOB'd task to exit and stop execution
|
---|
| 181 | ;
|
---|
| 182 | ;
|
---|
| 183 | PREPSRCH(PARENTJOB,DFN,TMGSRCH,WORDS,IENLIST) ;
|
---|
| 184 | ;"Purpose: To Parse the search phrase, and look for prior runs, and use
|
---|
| 185 | ;" that work if possible.
|
---|
| 186 | ;"Input: PARENTJOB -- the job of the RPCBroker task that called this.
|
---|
| 187 | ;" DFN -- The patient IEN to look up.
|
---|
| 188 | ;" TMGSRCH -- The Search Phrase. See docs in SRCHTIU
|
---|
| 189 | ;" e.g: 'dog cat monkey "in a barrel"
|
---|
| 190 | ;" WORDS -- PASS BY REFERENCE. An OUT PARAMETER. Format:
|
---|
| 191 | ;" WORDS(WordOrPhrase)=""
|
---|
| 192 | ;" e.g. WORDS(1)="DOG"
|
---|
| 193 | ;" WORDS(2)="CAT"
|
---|
| 194 | ;" WORDS(3)="MONKEY"
|
---|
| 195 | ;" WORDS(4)="IN A BARREL"
|
---|
| 196 | ;" Note: If prior run is being built upon, then entries that
|
---|
| 197 | ;" have already been searched for will be removed.
|
---|
| 198 | ;"Results: none
|
---|
| 199 | DO PARSSRCH(TMGSRCH,.WORDS)
|
---|
| 200 | NEW REF SET REF=$NAME(^TMG("TMP","SEARCH","SRCHTIU",PARENTJOB))
|
---|
| 201 | KILL IENLIST
|
---|
| 202 | NEW NEWSRCH SET NEWSRCH=0 ;"Boolean for need to start over a new search
|
---|
| 203 | IF $GET(@REF@("DFN"))'=DFN SET NEWSRCH=1 GOTO NS
|
---|
| 204 | ;"Look through all prior filters and see if any filters applied that
|
---|
| 205 | ;" are not in current search
|
---|
| 206 | NEW FILTERS,CT
|
---|
| 207 | FOR CT=1:1 QUIT:$DATA(WORDS(CT))=0 SET FILTERS($GET(WORDS(CT)))=1
|
---|
| 208 | NEW OLDFILTER MERGE OLDFILTER=@REF@("FILTER")
|
---|
| 209 | NEW OFLTR SET OFLTR=""
|
---|
| 210 | FOR SET OFLTR=$ORDER(OLDFILTER(OFLTR)) QUIT:(OFLTR="")!NEWSRCH DO
|
---|
| 211 | . IF $GET(FILTERS(OFLTR))=1 KILL FILTERS(OFLTR) QUIT ;"filter term used before, so delete from use again
|
---|
| 212 | . ;"Now check if new filters contain a longer verson of old term. I.e. prior
|
---|
| 213 | . ;" filter term was 'kitt' and now it is 'kitten'
|
---|
| 214 | . NEW FOUND SET FOUND=0
|
---|
| 215 | . NEW F SET F=""
|
---|
| 216 | . FOR SET F=$ORDER(FILTERS(F)) QUIT:(F="")!FOUND DO
|
---|
| 217 | . . IF $EXTRACT(F,1,$LENGTH(OFLTR))'=OFLTR QUIT
|
---|
| 218 | . . SET FOUND=1
|
---|
| 219 | . . KILL @REF@("FILTER",OFLTR) ;"Remove old partial term from history
|
---|
| 220 | . IF FOUND=0 SET NEWSRCH=1 ;"A filter was put on old set that is not in new set, so start over
|
---|
| 221 | NS IF NEWSRCH=1 DO
|
---|
| 222 | . MERGE IENLIST=^TIU(8925,"C",DFN)
|
---|
| 223 | . KILL @REF@("IEN LIST")
|
---|
| 224 | . KILL @REF@("FILTER")
|
---|
| 225 | ELSE DO
|
---|
| 226 | . MERGE IENLIST=^TMG("TMP","SEARCH","SRCHTIU",$J,"IEN LIST")
|
---|
| 227 | . ;"Recreate WORDS array as numbered list with just desired entries
|
---|
| 228 | . SET CT=0 FOR SET CT=$ORDER(WORDS(CT)) QUIT:(CT="") DO
|
---|
| 229 | . . IF $DATA(FILTERS(WORDS(CT)))=0 KILL WORDS(CT) ;"Kill all entries in WORDS not in FILTERS
|
---|
| 230 | . NEW I SET I=1
|
---|
| 231 | . NEW TEMP
|
---|
| 232 | . SET CT=0 FOR SET CT=$ORDER(WORDS(CT)) QUIT:(CT="") DO
|
---|
| 233 | . . SET TEMP(I)=$GET(WORDS(CT)),I=I+1
|
---|
| 234 | . KILL WORDS MERGE WORDS=TEMP
|
---|
| 235 | SET @REF@("DFN")=DFN
|
---|
| 236 | QUIT
|
---|
| 237 | ;
|
---|
| 238 | ;
|
---|
| 239 | PARSSRCH(TMGSRCH,WORDS) ;
|
---|
| 240 | ;"Purpose: Separate search phrase out into array of words
|
---|
| 241 | ;"Input: TMGSRCH -- The Search Phrase. See docs in SRCHTIU
|
---|
| 242 | ;" e.g: 'dog cat monkey "in a barrel"
|
---|
| 243 | ;" WORDS -- PASS BY REFERENCE. An OUT PARAMETER. Format:
|
---|
| 244 | ;" WORDS(WordOrPhrase)=""
|
---|
| 245 | ;" e.g. WORDS(1)="DOG"
|
---|
| 246 | ;" WORDS(2)="CAT"
|
---|
| 247 | ;" WORDS(3)="MONKEY"
|
---|
| 248 | ;" WORDS(4)="IN A BARREL"
|
---|
| 249 | ;"Results: none
|
---|
| 250 | KILL WORDS
|
---|
| 251 | SET TMGSRCH=$GET(TMGSRCH)
|
---|
| 252 | NEW CT SET CT=0
|
---|
| 253 | NEW ENTRY,POS
|
---|
| 254 | FOR QUIT:(TMGSRCH="") DO
|
---|
| 255 | . SET TMGSRCH=$$TRIM^XLFSTR(TMGSRCH)
|
---|
| 256 | . IF $EXTRACT(TMGSRCH,1)="""" DO
|
---|
| 257 | . . SET ENTRY=$$GetWord^TMGSTUTL(TMGSRCH,2,"""","""")
|
---|
| 258 | . . IF ENTRY'="" DO
|
---|
| 259 | . . . SET CT=CT+1
|
---|
| 260 | . . . SET WORDS(CT)=$$UP^XLFSTR(ENTRY)
|
---|
| 261 | . . SET ENTRY=""""_ENTRY
|
---|
| 262 | . . IF $FIND(TMGSRCH,ENTRY_"""")>0 SET ENTRY=ENTRY_""""
|
---|
| 263 | . . NEW SPEC
|
---|
| 264 | . . SET SPEC(ENTRY)=""
|
---|
| 265 | . . SET SPEC(" ")=" "
|
---|
| 266 | . . SET TMGSRCH=$$REPLACE^XLFSTR(TMGSRCH,.SPEC)
|
---|
| 267 | . SET ENTRY=$PIECE(TMGSRCH," ",1)
|
---|
| 268 | . SET $PIECE(TMGSRCH," ",1)=""
|
---|
| 269 | . IF ENTRY'="" DO
|
---|
| 270 | . . SET CT=CT+1
|
---|
| 271 | . . SET WORDS(CT)=$$UP^XLFSTR(ENTRY)
|
---|
| 272 | QUIT
|
---|
| 273 | ;
|
---|
| 274 | ;
|
---|
| 275 | SRCH1TIU(PARENTJOB,IEN,TERM) ;
|
---|
| 276 | ;"Purpose: Search TIU DOCUMENT report text for TERM
|
---|
| 277 | ;"Input: IEN -- IEN in 8925
|
---|
| 278 | ;" TERM -- a word, or phrase, to search for in report text
|
---|
| 279 | ;"NOTE: Not case sensitive
|
---|
| 280 | ;"Result: 1 if found, 0 if not found, -1 if Abort signal found, -2 if RESTART signal
|
---|
| 281 | NEW REF SET REF=$NAME(^TMG("TMP","SEARCH","SRCHTIU",PARENTJOB))
|
---|
| 282 | NEW FOUND SET FOUND=0 ;"default to not found
|
---|
| 283 | NEW LINE SET LINE=0
|
---|
| 284 | NEW CT SET CT=0
|
---|
| 285 | NEW ABORT SET ABORT=0
|
---|
| 286 | FOR SET LINE=$ORDER(^TIU(8925,IEN,"TEXT",LINE)) QUIT:(+LINE'>0)!FOUND!ABORT DO
|
---|
| 287 | . SET CT=CT+1
|
---|
| 288 | . IF CT#5=0 DO QUIT:ABORT ;"Check messages every 5 lines or so
|
---|
| 289 | . . SET CT=0
|
---|
| 290 | . . NEW MSG SET MSG=@REF@("MSG")
|
---|
| 291 | . . IF MSG="STOP" SET ABORT=1 QUIT
|
---|
| 292 | . . IF MSG="RESTART" SET ABORT=2 QUIT
|
---|
| 293 | . NEW ONELINE SET ONELINE=$$UP^XLFSTR($GET(^TIU(8925,IEN,"TEXT",LINE,0)))
|
---|
| 294 | . IF ONELINE[TERM SET FOUND=1
|
---|
| 295 | IF ABORT SET FOUND=-ABORT
|
---|
| 296 | QUIT FOUND
|
---|
| 297 | ;
|
---|