-(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 '(kcuisui) srl 'wd word :like like
+ :lrl 'klrl :order '(kcuisui asc))
+ (find-uconso-cuisui kcuisui :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)))))