r4740: *** empty log message ***
[umlisp.git] / sql-classes.lisp
index da55a01d9c9cb40674d04379696ab042928ea307..161b9cd792bf854d1754eff6d4c40aa770e67641 100644 (file)
@@ -7,7 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Apr 2000
 ;;;;
-;;;; $Id: sql-classes.lisp,v 1.15 2003/05/02 07:09:07 kevin Exp $
+;;;; $Id: sql-classes.lisp,v 1.16 2003/05/02 18:47:53 kevin Exp $
 ;;;;
 ;;;; This file, part of UMLisp, is
 ;;;;    Copyright (c) 2000-2002 by Kevin M. Rosenberg, M.D.
@@ -17,7 +17,7 @@
 ;;;; *************************************************************************
 
 (in-package :umlisp)
-(declaim (optimize (speed 3) (safety 1) (compilation-speed 0) (debug 3)))
+(declaim (optimize (compilation-speed 0) (debug 3)))
 
 
 (defvar *current-srl* nil)
              (setq found-ustr ustr))))))
     found-ustr))
 
+(defun umlisp-query (table fields srl where-name where-value
+                    &key (lrlname "KCUILRL") final)
+  "Query the UMLisp database. Return a list of umlisp objects whose name
+is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS"
+  (when where-value
+    (mutex-sql-query
+     (query-string table fields srl where-name where-value lrlname final))))
+
+  
+(defun query-string (table fields &optional srl where-name where-value
+                    (lrlname "KCUILRL") final)
+  (let ((qs (format nil "select ~{~:@(~A~)~^,~} from ~:@(~A~)" fields table)))
+    (when where-name
+      (setq qs (concatenate 'string qs
+                           (format nil
+                                   (if (stringp where-value)
+                                       " where ~A='~A'"
+                                       " where ~A=~A")
+                                   where-name where-value))))
+    (when srl
+      (setq qs (concatenate 'string qs (format nil " and ~:@(~A~) <= ~D"
+                                              lrlname srl))))
+    (when final
+      (setq qs (concatenate 'string qs " " final)))
+    qs))
 
 (defun find-ucon-cui (cui &key (srl *current-srl*))
+  "Find ucon for a cui"
+  (loop
+   (for tuple in (umlisp-query 'mrcon '(kpfstr kcuilrl) srl
+                              'cui (parse-cui cui) :final "limit 1")
+       collect
+       (make-instance 'ucon :cui (parse-cui cui)
+                      :pfstr (car tuple) 
+                      :lrl (ensure-integer (cadr tuple))))))
+
+(defun find-ucon-cui-old (cui &key (srl *current-srl*))
   "Find ucon for a cui"
   (when (stringp cui) (setq cui (parse-cui cui)))
   (when cui
-    (let ((ls (format nil "select KPFSTR,KCUILRL from MRCON where CUI=~d" cui)))
-      (when srl
-       (string-append ls (format nil " and KCUILRL <= ~d" srl)))
-      (string-append ls " limit 1")
+    (let ((ls
+          (maybe-add-srl
+           (format nil "select KPFSTR,KCUILRL from MRCON where CUI=~d" cui)
+           srl :final "limit 1")))
       (awhen (car (mutex-sql-query ls))
             (make-instance 'ucon :cui cui :pfstr (car it) 
                            :lrl (ensure-integer (cadr it)))))))
   "Find ucon for a cui"
   (when (stringp cui) (setq cui (parse-cui cui)))
   (when cui
-    (let ((ls (format nil "select KCUILRL from MRCON where CUI=~d" cui)))
-      (when srl
-       (string-append ls (format nil " and KCUILRL <= ~d" srl)))
-      (string-append ls " limit 1")
+    (let ((ls (maybe-add-srl
+              (format nil "select KCUILRL from MRCON where CUI=~d" cui)
+              srl :final "limit 1")))
       (awhen (car (mutex-sql-query ls))
             (make-instance 'ucon :cui cui
                            :lrl (ensure-integer (car it))
 
 (defun find-pfstr-cui (cui &key (srl *current-srl*))
   "Find preferred string for a cui"
-  (when (stringp cui)
-      (setq cui (parse-cui cui)))
+  (when (stringp cui) (setq cui (parse-cui cui)))
   (when cui
-      (let ((ls (format nil "select KPFSTR from MRCON where CUI=~d" cui)))
-       (when srl
-         (string-append ls (format nil " and KCUILRL <= ~d" srl)))
-       (string-append ls " limit 1")
+      (let ((ls (maybe-add-srl
+                (format nil "select KPFSTR from MRCON where CUI=~d" cui)
+                srl :final "limit 1")))
        (awhen (car (mutex-sql-query ls))
               (car it)))))
 
   (when (stringp lui) (setq lui (parse-lui lui)))
   (when lui
       (let ((ucons '())
-           (ls (format nil "select distinct CUI,KPFSTR,KCUILRL from MRCON where LUI=~d" lui)))
-       (if srl
-           (string-append ls (format nil " and KCUILRL <= ~d" srl)))
+           (ls
+            (maybe-add-srl
+             (format nil "select distinct CUI,KPFSTR,KCUILRL from MRCON where LUI=~d" lui)
+             srl)))
        (dolist (tuple (mutex-sql-query ls))
          (destructuring-bind (cui pfstr lrl) tuple
            (push (make-instance 'ucon :cui (ensure-integer cui)
   (when (stringp sui) (setq sui (parse-sui sui)))
   (when sui
     (let ((ucons '())
-         (ls (format nil "select distinct CUI,KPFSTR,KCUILRL from MRCON where SUI=~d" sui)))
-      (when srl
-       (string-append ls (format nil " and KCUILRL <= ~d" srl)))
+         (ls (maybe-add-srl
+              (format nil "select distinct CUI,KPFSTR,KCUILRL from MRCON where SUI=~d" sui)
+              srl)))
       (let ((tuples (mutex-sql-query ls)))
        (dolist (tuple tuples)
          (destructuring-bind (cui pfstr lrl) tuple
   (when (stringp cui) (setq cui (parse-cui cui)))
   (when (stringp sui) (setq sui (parse-sui sui)))
   (when (and cui sui)
-    (let ((ls (format nil "select distinct CUI,KPFSTR,KCUILRL from MRCON where KCUISUI=~d"
-                     (make-cuisui cui sui))))
-      (when srl
-       (string-append ls (format nil " and KCUILRL <= ~d" srl)))
+    (let ((ls
+          (maybe-add-srl
+           (format nil "select distinct CUI,KPFSTR,KCUILRL from MRCON where KCUISUI=~d"
+                     (make-cuisui cui sui))
+           srl)))
       (awhen (car (mutex-sql-query ls))
             (destructuring-bind (cui pfstr lrl) it
               (make-instance 'ucon :cui (ensure-integer cui)
   "Find ucon that are exact match for str"
   (when str
     (let ((ucons '())
-         (ls (format nil "select distinct CUI,KPFSTR,KCUILRL from MRCON where STR='~a'" str)))
-      (when srl
-       (string-append ls " and KCUILRL <= ~d" srl))
+         (ls (maybe-add-srl
+              (format nil "select distinct CUI,KPFSTR,KCUILRL from MRCON where STR='~a'" str)
+              srl)))
       (dolist (tuple (mutex-sql-query ls))
        (destructuring-bind (cui pfstr lrl) tuple
          (push (make-instance 'ucon :cui (ensure-integer cui) 
 
 (defun find-ucon-all (&key (srl *current-srl*))
   "Return list of all ucon's"
-  (let ((ls "select distinct CUI,KPFSTR,KCUILRL from MRCON"))
-    (when srl
-      (string-append ls (format nil " where KCUILRL <= ~d" srl)))
+  (let ((ls (maybe-add-srl "select distinct CUI,KPFSTR,KCUILRL from MRCON"
+                          srl)))
     (string-append ls " order by CUI asc")
     (with-sql-connection (db)
       (clsql:map-query 
 
 (defun map-ucon-all (fn &key (srl *current-srl*))
   "Return list of all ucon's"
-  (let ((ls "select distinct CUI,KPFSTR,KCUILRL from MRCON"))
-    (when srl
-      (string-append ls (format nil " where KCUILRL <= ~d" srl)))
-    (string-append ls " order by CUI asc")
+  (let ((ls (maybe-add-srl "select distinct CUI,KPFSTR,KCUILRL from MRCON"
+                          srl :final "order by CUI asc")))
     (with-sql-connection (db)
       (clsql:map-query 
        nil
 (defun find-udef-cui (cui &key (srl *current-srl*))
   "Return a list of udefs for cui"
   (let ((udefs '())
-       (ls (format nil "select SAB,DEF from MRDEF where CUI=~d" cui)))
-    (when srl
-       (string-append ls (format nil " and KSRL <= ~d" srl)))
+       (ls (maybe-add-srl
+            (format nil "select SAB,DEF from MRDEF where CUI=~d" cui)
+            srl :var "KSRL")))
     (dolist (tuple (mutex-sql-query ls))
       (destructuring-bind (sab def) tuple
        (push (make-instance 'udef :sab sab :def def) udefs)))
 (defun find-usty-cui (cui &key (srl *current-srl*))
   "Return a list of usty for cui"
   (let ((ustys '())
-       (ls (format nil "select TUI,STY from MRSTY where CUI=~d" cui)))
-    (when srl
-       (string-append ls (format nil " and KLRL <= ~d" srl)))
+       (ls (maybe-add-srl
+            (format nil "select TUI,STY from MRSTY where CUI=~d" cui)
+            srl :var "KLRL")))
     (dolist (tuple (mutex-sql-query ls))
       (destructuring-bind (tui sty) tuple
        (push (make-instance 'usty :tui (ensure-integer tui) :sty sty) ustys)))
 (defun find-usty-word (word &key (srl *current-srl*))
   "Return a list of usty that match word"
   (let ((ustys '())
-       (ls (format nil "select distinct TUI,STY from MRSTY where STY like '%~a%'" word)))
-    (when srl
-       (string-append ls (format nil " and KLRL <= ~d" srl)))
+       (ls (maybe-add-srl
+            (format nil "select distinct TUI,STY from MRSTY where STY like '%~a%'" word)
+            srl :var "KLRL")))
     (dolist (tuple (mutex-sql-query ls))
       (destructuring-bind (tui sty) tuple
        (push (make-instance 'usty :tui (ensure-integer tui) :sty sty) ustys)))
 (defun find-urel-cui (cui &key (srl *current-srl*))
   "Return a list of urel for cui"
   (let ((urels '())
-       (ls (format nil "select REL,CUI2,RELA,SAB,SL,MG,KPFSTR2 from MRREL where CUI1=~d" cui)))
-    (when srl
-       (string-append ls (format nil " and KSRL <= ~d" srl)))
+       (ls (maybe-add-srl
+            (format nil "select REL,CUI2,RELA,SAB,SL,MG,KPFSTR2 from MRREL where CUI1=~d" cui)
+            srl :var "KSRL")))
     (dolist (tuple (mutex-sql-query ls))
       (destructuring-bind (rel cui2 rela sab sl mg pfstr2) tuple
        (push (make-instance 'urel 
 (defun find-urel-cui2 (cui2 &key (srl *current-srl*))
   "Return a list of urel for cui2"
   (let ((urels '())
-       (ls (format nil "select REL,CUI1,RELA,SAB,SL,MG,KPFSTR2 from MRREL where CUI2=~d" cui2)))
-    (when srl
-       (string-append ls (format nil " and SRL <= ~d" srl)))
+       (ls (maybe-add-srl
+            (format nil "select REL,CUI1,RELA,SAB,SL,MG,KPFSTR2 from MRREL where CUI2=~d" cui2)
+            srl :var "SRL")))
     (dolist (tuple (mutex-sql-query ls))
       (destructuring-bind (rel cui1 rela sab sl mg pfstr2) tuple
        (push (make-instance 'urel 
 (defun find-ucoc-cui (cui &key (srl *current-srl*))
   "Return a list of ucoc for cui"
   (let ((ucocs '())
-       (ls (format nil "select CUI2,SOC,COT,COF,COA,KPFSTR2 from MRCOC where CUI1=~d" cui)))
-    (when srl
-       (string-append ls (format nil " and KLRL <= ~d" srl)))
-    (string-append ls " order by COF asc")
+       (ls (maybe-add-srl
+            (format nil "select CUI2,SOC,COT,COF,COA,KPFSTR2 from MRCOC where CUI1=~d" cui)
+            srl :var "KLRL" :final "order by COF asc")))
     (dolist (tuple (mutex-sql-query ls))
       (destructuring-bind (cui2 soc cot cof coa pfstr2) tuple
        (setq cui2 (ensure-integer cui2))