:lrl kcuilrl))))
(defun find-uconso-cui (cui &key (srl *current-srl*))
- "Find ucon for a cui. If set SAB, the without-pfstr is on by default"
+ "Find uconso for a cui."
(ensure-cui-integer cui)
(unless cui (return-from find-uconso-cui nil))
:kcuisui kcuisui :kcuilui kcuilui :kcuilrl kcuilrl :kluilrl kluilrl
:ksuilrl ksuilrl)))
+(defun find-uconso-cui-sab (cui sab &key (srl *current-srl*))
+ "Find uconso for a cui. If set SAB, the without-pfstr is on by default"
+ (ensure-cui-integer cui)
+ (unless (and cui (stringp sab))
+ (return-from find-uconso-cui-sab nil))
+
+ (collect-umlisp-query (mrconso (lat ts lui stt sui ispref aui saui scui sdui sab tty code str
+ srl suppress cvf kpfeng kcuisui kcuilui kcuilrl
+ kluilrl ksuilrl) srl cui cui
+ :filter (concatenate 'string "SAB='" sab "'"))
+ (make-instance 'uconso :cui cui :lat lat :ts ts :lui lui :stt stt :sui sui :ispref ispref
+ :aui aui :saui saui :scui scui :sdui sdui :sab sab :tty tty :code code
+ :str str :srl srl :suppress suppress :cvf cvf :kpfeng kpfeng
+ :kcuisui kcuisui :kcuilui kcuilui :kcuilrl kcuilrl :kluilrl kluilrl
+ :ksuilrl ksuilrl)))
+
+(defun find-uconso-sui-sab (sui sab &key (srl *current-srl*))
+ "Find uconso for a sui. If set SAB, the without-pfstr is on by default"
+ (ensure-sui-integer sui)
+ (unless (and sui (stringp sab))
+ (return-from find-uconso-sui-sab nil))
+
+ (collect-umlisp-query (mrconso (cui lat ts lui stt sui ispref aui saui scui sdui sab tty code str
+ srl suppress cvf kpfeng kcuisui kcuilui kcuilrl
+ kluilrl ksuilrl) srl sui sui
+ :filter (concatenate 'string "SAB='" sab "'"))
+ (make-instance 'uconso :cui cui :lat lat :ts ts :lui lui :stt stt :sui sui :ispref ispref
+ :aui aui :saui saui :scui scui :sdui sdui :sab sab :tty tty :code code
+ :str str :srl srl :suppress suppress :cvf cvf :kpfeng kpfeng
+ :kcuisui kcuisui :kcuilui kcuilui :kcuilrl kcuilrl :kluilrl kluilrl
+ :ksuilrl ksuilrl)))
+
(defun find-pfstr-cui (cui &key (srl *current-srl*))
"Find preferred string for a cui"
(ensure-cui-integer cui)
(find-uconso-cui cui :srl srl)))
(defun mrconso-query-word-cui (word sab srl like)
- (format nil "SELECT c.cui FROM MRCONSO c,MRXW_ENG x WHERE x.WD ~A '~A' AND x.cui=c.cui AND ~A ~A"
+ (format nil "SELECT DISTINCT c.cui FROM MRCONSO c,MRXW_ENG x WHERE x.WD ~A '~A' AND x.cui=c.cui AND ~A ~A"
+ (if like "LIKE" "=")
+ (clsql-sys::sql-escape-quotes word)
+ (etypecase sab
+ (string
+ (format nil " c.sab='~A'" (clsql-sys::sql-escape-quotes sab)))
+ (cons
+ (format nil " c.sab IN (~{'~A'~^,~})"
+ (mapcar 'clsql-sys::sql-escape-quotes sab)))
+ (null
+ (error "SAB missing")))
+ (if srl (format nil "AND KCUILRL <= ~A" srl) "")))
+
+(defun mrconso-query-word-sui (word sab srl like)
+ (format nil "SELECT DISTINCT c.sui FROM MRCONSO c,MRXW_ENG x WHERE x.WD ~A '~A' AND x.sui=c.sui AND ~A ~A"
(if like "LIKE" "=")
(clsql-sys::sql-escape-quotes word)
(etypecase sab
(defun find-uconso-word-sab (word &key sab (srl *current-srl*) (like nil))
"Return list of uconso that match word in matching SAB. Optionally, use SQL's LIKE syntax"
- (let ((query (mrconso-query-word-cui word sab srl like)))
- (loop for cui in (remove-duplicates (sort (mapcar 'car (mutex-sql-query query)) #'<))
- collect (find-uconso-cui cui))))
+ (let ((sui-query (mrconso-query-word-sui word sab srl like))
+ (uconsos nil))
+ (dolist (sui (remove-duplicates (sort (mapcar 'car (mutex-sql-query sui-query)) #'<)))
+ (setq uconsos (nconc uconsos (find-uconso-sui-sab sui sab))))
+ (remove-duplicates uconsos :key 'cui)))
(defun find-ucon-word-sab (word &key sab (srl *current-srl*) (like nil))
"Return list of ucon that match word in matching SAB. Optionally, use SQL's LIKE syntax"