r11600: fix find-uconso-multiword
authorKevin M. Rosenberg <kevin@rosenberg.net>
Thu, 29 Mar 2007 16:34:05 +0000 (16:34 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Thu, 29 Mar 2007 16:34:05 +0000 (16:34 +0000)
sql-classes.lisp

index ec68c5e159066c798df3ece2e3223d2e13da7e79..d434e94d308f3cd5193429f6ab5a0035b1f6e57d 100644 (file)
@@ -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*))
                        :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))
 
   (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)))
 
                    :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)
 (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)
     (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
           (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"
 
 (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"
 
 (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"