[613] | 1 | XTIDCTX ;OAKCIOFO/JLG - TERM/CONCEPT CONTEXT directories ;04/20/2005 15:12
|
---|
| 2 | ;;7.3;TOOLKIT;**93**;Apr 25, 1995
|
---|
| 3 | ; Reference to global "^DD" supported by IA #4634
|
---|
| 4 | Q
|
---|
| 5 | ; encapsulates the location (directory) of term/concept
|
---|
| 6 | ; references based on FILE/FIELD.
|
---|
| 7 | ; It eventually encapsulates the retrieval of
|
---|
| 8 | ; specific term/concept references (TERM defined in XTIDTERM) based
|
---|
| 9 | ; on the internal reference (IREF).
|
---|
| 10 | ; There are two current implementations: one for terms defined
|
---|
| 11 | ; as "set of codes"; the other defined in VistA files that have
|
---|
| 12 | ; been updated to contain VUID-related data in their DD.
|
---|
| 13 | ; CTX and TERM are passed by reference in all the subroutines
|
---|
| 14 | ;
|
---|
| 15 | CONTEXT(TFILE,TFIELD,CTX) ; determine and create context impl
|
---|
| 16 | ; returns new CTX array
|
---|
| 17 | ; CTX("TYPE")=<"SET" or "TABLE" or "ROOT">
|
---|
| 18 | ; CTX("TERM FILE#")=<TFILE or "">
|
---|
| 19 | ; CTX("TERM FIELD#")=<TFIELD or "">
|
---|
| 20 | ; CTX("SOURCE FILE#")=<8985.1 or TFILE or "">
|
---|
| 21 | ; CTX("TERMSTATUS SUBFILE#")=
|
---|
| 22 | ; <subfile for the multi-valued field
|
---|
| 23 | ; 99.991, EFFECTIVE DATE/TIME or "">
|
---|
| 24 | N TTYPE
|
---|
| 25 | Q:$D(CTX)
|
---|
| 26 | S TFILE=$G(TFILE),TFIELD=$G(TFIELD)
|
---|
| 27 | S TTYPE=$$GETTYPE(TFILE,TFIELD)
|
---|
| 28 | Q:TTYPE=""
|
---|
| 29 | I TTYPE="SET" D CONTEXT^XTIDSET(TFILE,TFIELD,.CTX) Q
|
---|
| 30 | I TTYPE="TABLE" D CONTEXT^XTIDTBL(TFILE,.01,.CTX) Q
|
---|
| 31 | I TTYPE="ROOT" D ROOTCTX(.CTX) Q
|
---|
| 32 | Q
|
---|
| 33 | ;
|
---|
| 34 | VALIDREF(CTX,TIREF) ; validate IREF
|
---|
| 35 | ; validate internal reference against given CTX
|
---|
| 36 | N VALID S VALID=1
|
---|
| 37 | Q:'$D(CTX) 'VALID
|
---|
| 38 | I CTX("TYPE")="SET" D Q VALID
|
---|
| 39 | . S VALID=$$VALIDREF^XTIDSET(.CTX,$G(TIREF))
|
---|
| 40 | ;
|
---|
| 41 | I CTX("TYPE")="TABLE" D Q VALID
|
---|
| 42 | . S VALID=$$VALIDREF^XTIDTBL(.CTX,$G(TIREF))
|
---|
| 43 | ;
|
---|
| 44 | Q 'VALID
|
---|
| 45 | FINDTERM(CTX,TIREF,TERM) ; find term
|
---|
| 46 | ; find the single term reference for given term IREF
|
---|
| 47 | ; return TERM data as new TERM array
|
---|
| 48 | ; IREF is unique within a given CTX, except for "RO0T" context
|
---|
| 49 | ; on success, attach CTX to TERM array
|
---|
| 50 | Q:'$D(CTX)!($D(TERM))
|
---|
| 51 | I CTX("TYPE")="SET" D FINDTERM^XTIDSET(.CTX,$G(TIREF),.TERM)
|
---|
| 52 | I CTX("TYPE")="TABLE" D FINDTERM^XTIDTBL(.CTX,$G(TIREF),.TERM)
|
---|
| 53 | ; don't find term reference for "ROOT" type, where IREF is not unique
|
---|
| 54 | ; on success, attach CTX to TERM
|
---|
| 55 | I $D(TERM) M TERM("CTX")=CTX
|
---|
| 56 | Q
|
---|
| 57 | ;
|
---|
| 58 | NEWTERM(CTX,TIREF,VUID) ; create a new term reference with given VUID
|
---|
| 59 | ; only for "set of codes"
|
---|
| 60 | ; on success (term entry), new TERM array is returned
|
---|
| 61 | ; create a new entry in the Kernel (8985.1) file only (set of codes)
|
---|
| 62 | N SUCCESS
|
---|
| 63 | S TIREF=$G(TIREF),VUID=+$G(VUID)
|
---|
| 64 | Q:'$D(CTX)!('VUID) 0
|
---|
| 65 | ; create new term reference entry only for "set of codes"
|
---|
| 66 | Q:CTX("TYPE")'="SET" 0
|
---|
| 67 | Q $$NEWTERM^XTIDSET(.CTX,TIREF,VUID)
|
---|
| 68 | ;
|
---|
| 69 | GETTERM(CTX,FILE,IENS,TERM) ; get term
|
---|
| 70 | ; return TERM data as new TERM array
|
---|
| 71 | ; called from CTX implementations only
|
---|
| 72 | ; subroutine might be moved to XTIDTERM
|
---|
| 73 | ; D GETS^DIQ(FILE,IENS,FIELD,FLAGS,TARGET_ROOT,MSG_ROOT)
|
---|
| 74 | N DIERR,MSG
|
---|
| 75 | S FILE=+$G(FILE),IENS=$G(IENS)
|
---|
| 76 | ; ensure only CTX implementations use this for callback
|
---|
| 77 | Q:'$D(CTX)!($D(TERM))!('FILE)!(IENS']"")
|
---|
| 78 | D GETS^DIQ(FILE,IENS,"**","IR","TERM","MSG")
|
---|
| 79 | Q:$D(MSG("DIERR"))
|
---|
| 80 | Q
|
---|
| 81 | ;
|
---|
| 82 | SRCHTRMS(CTX,VUID,XTCARR,MASTER) ; search term reference entries
|
---|
| 83 | ; search term reference entries based on VUID and its context
|
---|
| 84 | S VUID=$G(VUID),XTCARR=$G(XTCARR),MASTER=+$G(MASTER)
|
---|
| 85 | ; CTX must be defined
|
---|
| 86 | Q:'$D(CTX)!(XTCARR']"")!('VUID)
|
---|
| 87 | I CTX("TYPE")="SET" D SRCHTRMS^XTIDSET(.CTX,VUID,XTCARR,MASTER) Q
|
---|
| 88 | I CTX("TYPE")="TABLE" D SRCHTRMS^XTIDTBL(.CTX,VUID,XTCARR,MASTER) Q
|
---|
| 89 | I CTX("TYPE")="ROOT" D Q
|
---|
| 90 | . ; each CTX implementation should contribute to XTCARR array
|
---|
| 91 | . N FL
|
---|
| 92 | . ; search "set of codes" first
|
---|
| 93 | . ; temporarily set context info
|
---|
| 94 | . S CTX("TYPE")="SET"
|
---|
| 95 | . S CTX("SOURCE FILE#")=8985.1
|
---|
| 96 | . D SRCHTRMS^XTIDSET(.CTX,VUID,XTCARR,MASTER)
|
---|
| 97 | . ; search all "table" files
|
---|
| 98 | . ; temporarily set context info
|
---|
| 99 | . S CTX("TYPE")="TABLE"
|
---|
| 100 | . S FL=0
|
---|
| 101 | . F S FL=$O(^DIC(FL)) Q:'FL D
|
---|
| 102 | . . Q:'$D(^DD(FL,99.991))
|
---|
| 103 | . . Q:FL=8985.1
|
---|
| 104 | . . S CTX("SOURCE FILE#")=FL
|
---|
| 105 | . . S CTX("TERM FILE#")=FL
|
---|
| 106 | . . S CTX("TERM FIELD#")=.01
|
---|
| 107 | . . D SRCHTRMS^XTIDTBL(.CTX,VUID,XTCARR,MASTER)
|
---|
| 108 | . ;
|
---|
| 109 | . ; reset context info
|
---|
| 110 | . S CTX("TYPE")="ROOT"
|
---|
| 111 | . S CTX("SOURCE FILE#")=""
|
---|
| 112 | . S CTX("TERM FILE#")=""
|
---|
| 113 | . S CTX("TERM FIELD#")=""
|
---|
| 114 | ;
|
---|
| 115 | Q
|
---|
| 116 | ;
|
---|
| 117 | ADDTARRY(XTC2ARR,FILE,FIELD,IREF,VALUE) ;
|
---|
| 118 | ; adds element and value to XTC2ARR array (by name)
|
---|
| 119 | ; called by CTX implementations of SRCHTRMS()
|
---|
| 120 | ; increased count
|
---|
| 121 | N COUNT
|
---|
| 122 | S COUNT=$G(@XTC2ARR)
|
---|
| 123 | S @XTC2ARR@(+$G(FILE),+$G(FIELD),$G(IREF))=$G(VALUE)
|
---|
| 124 | S @XTC2ARR=COUNT+1
|
---|
| 125 | Q
|
---|
| 126 | ;
|
---|
| 127 | GETTYPE(FILE,FIELD) ; determine type of context
|
---|
| 128 | ; based on FILE and FIELD combination
|
---|
| 129 | ; D FIELD^DID(FILE,FIELD,FLAGS,ATTRIBUTES,TARGET_ROOT,MSG_ROOT)
|
---|
| 130 | N DIERR,ATTR,MSG,TYPE
|
---|
| 131 | S FILE=+$G(FILE),FIELD=$G(FIELD)
|
---|
| 132 | S TYPE=""
|
---|
| 133 | ; file may be empty in GETIREF^XTID use-case
|
---|
| 134 | I 'FILE S TYPE="ROOT" Q TYPE
|
---|
| 135 | ; determine if "table" type, by checking VUID DD
|
---|
| 136 | I FIELD=""!(FIELD=.01) D
|
---|
| 137 | . N VFIELD
|
---|
| 138 | . S VFIELD=99.99 ; test existence of VUID field
|
---|
| 139 | . D FIELD^DID(FILE,VFIELD,"","LABEL","ATTR","MSG")
|
---|
| 140 | . ;Q:$D(MSG("DIERR")) ; INVALID type returned
|
---|
| 141 | . I $G(ATTR("LABEL"))="VUID" S TYPE="TABLE"
|
---|
| 142 | ;
|
---|
| 143 | Q:TYPE'="" TYPE
|
---|
| 144 | ; determine if FIELD is a SET OF CODES
|
---|
| 145 | ; D FIELD^DID(FILE,FIELD,"","TYPE","ATTR","MSG")
|
---|
| 146 | ; Q:$D(MSG("DIERR")) TYPE
|
---|
| 147 | ; I $G(ATTR("TYPE"))="SET" S TYPE="SET" Q TYPE
|
---|
| 148 | ; DS requested to assume "SET"
|
---|
| 149 | S TYPE="SET"
|
---|
| 150 | Q TYPE
|
---|
| 151 | ;
|
---|
| 152 | ROOTCTX(CTX) ; set up Context for "ROOT" type
|
---|
| 153 | ; called from CONTEXT^XTIDCTX(TFILE,TFIELD,CTX)
|
---|
| 154 | ; called only when TFILE is not defined
|
---|
| 155 | S CTX("TYPE")="ROOT"
|
---|
| 156 | S CTX("TERM FILE#")=""
|
---|
| 157 | S CTX("TERM FIELD#")=""
|
---|
| 158 | ; the default source file
|
---|
| 159 | S CTX("SOURCE FILE#")=""
|
---|
| 160 | ; TERMSTATUS 99.991, EFFECTIVE DATE/TIME subfile
|
---|
| 161 | S CTX("TERMSTATUS SUBFILE#")=""
|
---|
| 162 | Q
|
---|
| 163 | ;
|
---|