From 546945f759de17c366255c1536a41aea54e2a1de Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Thu, 29 Mar 2007 16:34:05 +0000 Subject: [PATCH] r11600: fix find-uconso-multiword --- sql-classes.lisp | 58 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/sql-classes.lisp b/sql-classes.lisp index ec68c5e..d434e94 100644 --- a/sql-classes.lisp +++ b/sql-classes.lisp @@ -247,7 +247,7 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" :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)) @@ -260,6 +260,38 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" :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) @@ -735,7 +767,21 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (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 @@ -750,9 +796,11 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (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" -- 2.34.1