r11599: add support for find-uconso-multiword
authorKevin M. Rosenberg <kevin@rosenberg.net>
Thu, 29 Mar 2007 15:53:21 +0000 (15:53 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Thu, 29 Mar 2007 15:53:21 +0000 (15:53 +0000)
classes.lisp
package.lisp
sql-classes.lisp

index d054bdd382cb09953b0ca0eb09b5db205867817c..76ba8d7bfbe194046e749528e28a20664689aa85 100644 (file)
 (defclass uconso (umlsclass)
   ((cui :value-type fixnum :initarg :cui :reader cui :print-formatter fmt-cui
        :hyperlink find-ucon-cui)
+   (pfstr :value-type cdata :initarg :pfstr :reader pfstr
+          :compute-cached-value (find-pfstr-cui cui))
    (lat :value-type string :initarg :lat :reader lat)
    (ts :value-type string :initarg :ts :reader ts)
    (lui :value-type fixnum :initarg :lui :reader lui :print-formatter fmt-lui)
index 3ea74903b1e5362edd799f9cbe3820ca18e84425..45bb26c01a2156cce0dedee03eee0018f7390e06 100644 (file)
    #:find-uterm-word
    #:find-uterm-normalized-word
    #:find-ucon-multiword
+   #:find-uconso-multiword
    #:find-ucon-normalized-multiword
    #:find-ustr-multiword
    #:find-ustr-normalized-multiword
index 8d8be13f98c0750ee05255367156a13d676d4065..ec68c5e159066c798df3ece2e3223d2e13da7e79 100644 (file)
@@ -728,20 +728,35 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS"
                                     :lrl 'klrl :order '(cui asc))
     (find-ucon-cui cui :srl srl)))
 
+(defun find-uconso-word (word &key (srl *current-srl*) (like nil))
+  "Return list of uconso objects that match word. Optionally, use SQL's LIKE syntax"
+  (collect-umlisp-query-eval ('mrxw_eng '(cui) srl 'wd word :like like :distinct t
+                                    :lrl 'klrl :order '(cui asc))
+    (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"
+          (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 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))))
+
 (defun find-ucon-word-sab (word &key sab (srl *current-srl*) (like nil))
-  "Return list of ustr that match word in matching SAB. Optionally, use SQL's LIKE syntax"
-  (let ((query (format nil "SELECT 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) ""))))
+  "Return list of ucon that match word in matching SAB. Optionally, use SQL's LIKE syntax"
+  (let ((query (mrconso-query-word-cui word sab srl like)))
     (loop for tuple in (mutex-sql-query query)
           collect (make-instance 'ucon :cui (first tuple)))))
 
@@ -865,6 +880,17 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS"
     (find-uobj-multiword str #'find-ucon-word #'sort-score-pfstr-str
                          #'cui srl only-exact-if-match limit)))
 
+(defun find-uconso-multiword (str &key (srl *current-srl*)
+                                    (only-exact-if-match t)
+                                     limit
+                                     sab)
+  (if sab
+      (find-uobj-multiword str #'find-uconso-word-sab #'sort-score-pfstr-str
+                           #'cui srl only-exact-if-match limit
+                           :extra-lookup-args (list :sab sab))
+    (find-uobj-multiword str #'find-uconso-word #'sort-score-pfstr-str
+                         #'cui srl only-exact-if-match limit)))
+
 (defun find-uterm-multiword (str &key (srl *current-srl*)
                                      (only-exact-if-match t)
                                       limit)