(defun current-srl! (srl)
(setq *current-srl* srl))
-(defmacro query-string (table fields &optional srl where-name where-value
+(defmacro query-string (table fields srl where-name where-value
&key (lrl "KCUILRL") single distinct order like limit
filter)
(let* ((%%fields (format nil "SELECT ~A~{~:@(~A~)~^,~} FROM ~:@(~A~)"
(t
""))))))
-(defun query-string-eval (table fields &optional srl where-name where-value
+(defun query-string-eval (table fields srl where-name where-value
&key (lrl "KCUILRL") single distinct order like limit filter)
(when single (setq limit 1))
(concatenate
(ensure-cui-integer cui)
(when cui
(make-instance 'ucon :cui cui)))
-
+
(defun find-ucon-cui (cui &key (srl *current-srl*) without-pfstr)
"Find ucon for a cui. If set SAB, the without-pfstr is on by default"
(ensure-cui-integer cui)
(make-instance 'ucon :cui cui :pfstr str
: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"
+(defun find-uconso-cui (cui &key sab (srl *current-srl*))
+ "Find uconso for a cui."
(ensure-cui-integer cui)
(unless cui (return-from find-uconso-cui 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)
- (make-instance 'uconso :cui cui :lat lat :ts ts :lui lui :stt stt :sui sui :ispref ispref
+ srl suppress cvf kpfeng kcuisui kcuilui kcuilrl
+ kluilrl ksuilrl) srl cui cui
+ :filter (if sab (concatenate 'string "SAB='" sab "'") nil))
+ (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
+ :str str :srl srl :suppress suppress :cvf cvf :kpfeng kpfeng
+ :kcuisui kcuisui :kcuilui kcuilui :kcuilrl kcuilrl :kluilrl kluilrl
+ :ksuilrl ksuilrl)))
+
+
+(defun find-uconso-code (code &key first sab (srl *current-srl*) (like nil))
+ "Return list of uconso objects that match code. Optional, filter for SAB. Optionally, use SQL's LIKE syntax"
+ (collect-umlisp-query (mrconso (cui sab) srl code code :like like :distinct t
+ :lrl klrl
+ :filter (if sab (concatenate 'string "SAB='" sab "'") nil))
+ (let ((uconsos (find-uconso-cui cui :sab sab :srl srl)))
+ (if first
+ (first uconsos)
+ uconsos))))
+
+(defun find-uconso-sui (sui &key sab (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 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
+ :distinct t
+ :filter (if sab (concatenate 'string "SAB='" sab "'") nil))
+ (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)))
(ensure-cui-integer cui)
(collect-umlisp-query (mrrel (aui1 rel stype1 cui2 aui2 stype2 rela rui srui sab sl rg dir suppress cvf)
srl cui1 cui :lrl "KSRL" :filter filter)
- (let ((rel
+ (let ((rel
(make-instance 'urel :cui1 cui :aui1 (ensure-integer aui1) :stype1 stype1 :rel rel
:cui2 (ensure-integer cui2) :aui2 (ensure-integer aui2) :stype2 stype2
:rui (ensure-integer rui) :srui srui :rela rela :sab sab :sl sl :rg rg :dir dir
:sui sui :saui saui :sdui sdui :scui scui :lat lat
:str str)))
-(defun find-ucxt-cuisui (cui sui &key (srl *current-srl*))
- (ensure-cui-integer cui)
- (ensure-sui-integer sui)
- (collect-umlisp-query (mrcxt (sab rank code cxn cxl cxs cui2 hcd rela xc)
- srl kcuisui (make-cuisui cui sui) :lrl ksrl)
- (make-instance 'ucxt :sab sab :code code
- :rank rank
- :cxn (ensure-integer cxn) :cxl cxl :cxs cxs :hcd hcd
- :rela rela :xc xc
- :cui2 (ensure-integer cui2))))
-
(defun find-uhier-cui (cui &key (srl *current-srl*))
(ensure-cui-integer cui)
(collect-umlisp-query (mrhier (aui cxn paui sab rela ptr hcd cvf)
:paui (ensure-integer paui)
:sab sab :rela rela :ptr ptr :hcd hcd :cvf cvf)))
-(defun find-usat-ui (cui &optional (lui nil) (sui nil) &key (srl *current-srl*))
+(defun find-usat-ui (cui &optional lui sui &key (srl *current-srl*))
(ensure-cui-integer cui)
(ensure-lui-integer lui)
(ensure-sui-integer sui)
(collect-umlisp-query (mrsty (cui) srl tui tui :lrl klrl :order (cui asc))
(find-ucon-cui (ensure-integer cui) :srl srl)))
-(defun find-ucon-word (word &key (srl *current-srl*) (like nil))
- "Return list of ucons 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-ucon-cui cui :srl srl)))
-
-(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) ""))))
- (loop for tuple in (mutex-sql-query query)
- collect (make-instance 'ucon :cui (first tuple)))))
-
-(defun find-ustr-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.sui,c.cui,c.lui,c.str,c.lrl,c.stt,c.suppress,c.cuisui FROM MRCONSO c,MRXW_ENG x WHERE x.WD ~A '~A' AND x.cui=c.cui AND x.lui=c.lui AND x.sui=c.sui AND ~A ~A"
- (if like "LIKE" "=")
- (clsql-sys::sql-escape-quotes word)
- (typecase sab
- (string
- (format nil " c.sab='" (clsql-sys::sql-escape-quotes sab)))
- (cons
- (format nil " c.sab IN (~('~A'~^,~))"
- (mapcar 'clsql-sys::sql-escape-quotes sab)))
- (t
- (error "SAB missing")))
- (if srl (format nil "AND KCUILRL <= ~D" srl) ""))))
- (loop for tuple in (mutex-sql-query query)
- collect (destructuring-bind (sui cui lui str lrl stt suppress cuisui) tuple
- (make-instance 'ustr :sui sui :cui cui :lui lui :str str :lrl lrl
- :stt stt :suppress suppress :cuisui cuisui)))))
-
+(defun mrconso-query-word-cui (word sab srl like)
+ (format nil "SELECT DISTINCT c.cui FROM MRCONSO c,MRXW_ENG x WHERE x.WD~A'~A' AND x.cui=c.cui~A~A"
+ (if like " LIKE " "=")
+ (clsql-sys::sql-escape-quotes word)
+ (etypecase sab
+ (string
+ (format nil " AND c.sab='~A'" (clsql-sys::sql-escape-quotes sab)))
+ (cons
+ (format nil " AND c.sab IN (~{'~A'~^,~})"
+ (mapcar 'clsql-sys::sql-escape-quotes sab)))
+ (null
+ ""))
+ (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~A~A"
+ (if like " LIKE " "=")
+ (clsql-sys::sql-escape-quotes word)
+ (etypecase sab
+ (string
+ (format nil " AND c.sab='~A'" (clsql-sys::sql-escape-quotes sab)))
+ (cons
+ (format nil " AND c.sab IN (~{'~A'~^,~})"
+ (mapcar 'clsql-sys::sql-escape-quotes sab)))
+ (null
+ ""))
+ (if srl (format nil " AND KCUILRL <= ~A" srl) "")))
+
+(defun find-uconso-word (word &key sab (srl *current-srl*) (like nil))
+ "Return list of uconso that match word. Optionally, matching SAB. Optionally, use SQL's LIKE syntax"
+ (cond
+ (sab
+ (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 sui :sab sab))))
+ (remove-duplicates uconsos :key 'cui)))
+ (t
+ (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 find-ucon-word (word &key sab (srl *current-srl*) (like nil))
+ "Return list of ucon that match word in matching SAB. Optionally, use SQL's LIKE syntax"
+ (cond
+ (sab
+ (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)))))
+ (t
+ (collect-umlisp-query-eval ('mrxw_eng '(cui) srl 'wd word :like like :distinct t
+ :lrl 'klrl :order '(cui asc))
+ (find-ucon-cui cui :srl srl)))))
(defun find-ucon-normalized-word (word &key (srl *current-srl*) (like nil))
"Return list of ucons that match word, optionally use SQL's LIKE syntax"
:lrl 'klrl :order '(cui asc))
sui))
-(defun find-ustr-word (word &key (srl *current-srl*))
- "Return list of ustrs that match word"
- (collect-umlisp-query (mrxw_eng (cui sui) srl wd word :lrl klrl
- :order (cui asc sui asc))
- (find-ustr-cuisui (ensure-integer cui) (ensure-integer sui) :srl srl)))
+(defun find-ustr-word (word &key sab (srl *current-srl*) (like nil))
+ "Return list of ustr that match word in matching SAB. Optionally, use SQL's LIKE syntax"
+ (cond
+ (sab
+ (let ((query (format nil "SELECT c.sui,c.cui,c.lui,c.str,c.lrl,c.stt,c.suppress,c.cuisui FROM MRCONSO c,MRXW_ENG x WHERE x.WD ~A '~A' AND x.cui=c.cui AND x.lui=c.lui AND x.sui=c.sui~A~A"
+ (if like "LIKE" "=")
+ (clsql-sys::sql-escape-quotes word)
+ (typecase sab
+ (string
+ (format nil " AND c.sab='~A'" (clsql-sys::sql-escape-quotes sab)))
+ (cons
+ (format nil " AND c.sab IN (~('~A'~^,~))"
+ (mapcar 'clsql-sys::sql-escape-quotes sab)))
+ (null
+ ""))
+ (if srl (format nil " AND KCUILRL <= ~D" srl) ""))))
+ (loop for tuple in (mutex-sql-query query)
+ collect (destructuring-bind (sui cui lui str lrl stt suppress cuisui) tuple
+ (make-instance 'ustr :sui sui :cui cui :lui lui :str str :lrl lrl
+ :stt stt :suppress suppress :cuisui cuisui)))))
+ (t
+ (collect-umlisp-query (mrxw_eng (cui sui) srl wd word :lrl klrl
+ :order (cui asc sui asc))
+ (find-ustr-cuisui (ensure-integer cui) (ensure-integer sui) :srl srl)))))
(defun find-ustr-normalized-word (word &key (srl *current-srl*))
"Return list of ustrs that match word"
(only-exact-if-match t)
limit
sab)
- (if sab
- (find-uobj-multiword str #'find-ucon-word-sab #'sort-score-pfstr-str
- #'cui srl only-exact-if-match limit
- :extra-lookup-args (list :sab sab))
- (find-uobj-multiword str #'find-ucon-word #'sort-score-pfstr-str
- #'cui srl only-exact-if-match limit)))
+ (find-uobj-multiword str #'find-ucon-word #'sort-score-pfstr-str
+ #'cui srl only-exact-if-match limit
+ :extra-lookup-args (list :sab sab)))
+
+(defun find-uconso-multiword (str &key (srl *current-srl*)
+ (only-exact-if-match t)
+ limit
+ sab)
+ (find-uobj-multiword str #'find-uconso-word #'sort-score-pfstr-str
+ #'cui srl only-exact-if-match limit
+ :extra-lookup-args (list :sab sab)))
(defun find-uterm-multiword (str &key (srl *current-srl*)
(only-exact-if-match t)
(only-exact-if-match t)
limit
sab)
- (if sab
- (find-uobj-multiword str #'find-ustr-word-sab #'sort-score-ustr-str
- #'sui srl only-exact-if-match limit
- :extra-lookup-args (list :sab sab))
- (find-uobj-multiword str #'find-ustr-word #'sort-score-ustr-str
- #'sui srl only-exact-if-match limit)))
+ (find-uobj-multiword str #'find-ustr-word #'sort-score-ustr-str
+ #'sui srl only-exact-if-match limit
+ :extra-lookup-args (list :sab sab)))
(defun sort-score-pfstr-str (str uobjs)
"Return list of sorted and scored ucons. Score by match of str to ucon-pfstr"