From cc0d0f58d7261d12a8d6a89153f58ea693618e79 Mon Sep 17 00:00:00 2001 From: "Kevin M. Rosenberg" Date: Tue, 6 May 2003 01:34:57 +0000 Subject: [PATCH] r4821: *** empty log message *** --- package.lisp | 55 +++--------- parse-common.lisp | 25 +++--- parse-macros.lisp | 48 ++++++----- sql-classes.lisp | 151 +++++++++++++++++++------------- sql-create.lisp | 215 +++++++++++++--------------------------------- 5 files changed, 193 insertions(+), 301 deletions(-) diff --git a/package.lisp b/package.lisp index d006cae..012e58a 100644 --- a/package.lisp +++ b/package.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Apr 2000 ;;;; -;;;; $Id: package.lisp,v 1.16 2003/05/02 05:37:16 kevin Exp $ +;;;; $Id: package.lisp,v 1.17 2003/05/06 01:34:57 kevin Exp $ ;;;; ;;;; This file, part of UMLisp, is ;;;; Copyright (c) 2000-2002 by Kevin M. Rosenberg, M.D. @@ -25,17 +25,18 @@ ;; From classes.lisp #:umlsclass - #:ucon #:uterm #:ustr #:usrl #:uso #:ucxt #:urank #:udef #:usat #:usab #:ulo #:urel - #:ucoc #:usty #:uatx #:uxw #:uxnw #:uxns - #:lexterm #:labr #:lagr #:lcmp #:lmod #:lnom #:lprn #:lprp #:lspl #:ltrm #:ltyp #:lwd - #:sdef #:sstr #:sstre1 #:sstre2 - #:sty #:tui #:def #:sab #:srl #:tty #:rank #:supres #:atn #:atv #:vcui #:rcui #:vsab + #:ucon #:uterm #:ustr #:usrl #:uso #:ucxt #:urank #:udef #:usat #:usab #:ulo + #:urel #:ucoc #:usty #:uatx #:uxw #:uxnw #:uxns + #:lexterm #:labr #:lagr #:lcmp #:lmod #:lnom #:lprn #:lprp #:lspl #:ltrm + #:ltyp #:lwd #:sdef #:sstr #:sstre1 #:sstre2 + #:sty #:tui #:def #:sab #:srl #:tty #:rank #:supres #:atn #:atv #:vcui + #:rcui #:vsab #:rl #:sty2 #:ui #:ui2 #:ui3 #:eui #:bas #:eui2 #:bas2 #:cui #:lui #:sui #:wd #:lat #:nstr :cuilist - #:rsab - #:lat - #:s#def #:s#sty #:s#term #:s#str #:s#atx #:s#lo #:s#sat #:s#rel #:s#coc #:s#so #:s#cxt - + #:rsab #:lat + #:s#def #:s#sty #:s#term #:s#str #:s#atx #:s#lo #:s#sat #:s#rel #:s#coc + #:s#so #:s#cxt + ;; From class-support.lisp #:ucon-has-tui #:english-term-p @@ -161,40 +162,6 @@ #:ustr_freq #:usty_freq #:usrl_freq - - #:urank - #:urel - #:usat - #:uso - #:ucxt - #:ustr - #:ulo - #:uterm - #:usty - #:urel - #:ucoc - #:uatx - #:ucon - #:uxw - #:uxnw - #:uxns - #:lexterm - #:labr - #:lagr - #:lcmp - #:lmod - #:lmod - #:lprn - #:prp - #:lspl - #:ltrm - #:ltyp - #:sdef - #:sstr - #:sstre1 - #:sstre2 - - #:english-term-p )) diff --git a/parse-common.lisp b/parse-common.lisp index c47acb4..1e40444 100644 --- a/parse-common.lisp +++ b/parse-common.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Apr 2000 ;;;; -;;;; $Id: parse-common.lisp,v 1.5 2003/05/05 23:13:28 kevin Exp $ +;;;; $Id: parse-common.lisp,v 1.6 2003/05/06 01:34:57 kevin Exp $ ;;;; ;;;; This file, part of UMLisp, is ;;;; Copyright (c) 2000-2002 by Kevin M. Rosenberg, M.D. @@ -16,8 +16,10 @@ ;;;; as governed by the terms of the GNU General Public License. ;;;; ************************************************************************* -(in-package :umlisp) -(declaim (optimize (speed 3) (safety 1) (compilation-speed 0) (debug 3))) +(in-package #:umlisp) + +(eval-when (:compile-toplevel) + (declaim (optimize (speed 3) (safety 1) (compilation-speed 0) (debug 3)))) (defun umls-pathname (filename &optional (extension "")) "Return pathname for a umls filename" @@ -37,19 +39,12 @@ (pathname filename))) -(defun read-umls-line-new (strm) - "Read a line from a UMLS stream, split into fields" - (let ((line (read-line strm nil 'eof))) - (if (stringp line) ;; ensure not 'eof - (delimited-string-to-list line #\| t) - line))) - -(defun read-umls-line (strm) +(defun read-umls-line (strm &optional (eof 'eof)) "Read a line from a UMLS stream, split into fields" - (let ((line (read-line strm nil 'eof))) - (if (stringp line) ;; ensure not 'eof - (delimited-string-to-list line #\| t) - line))) + (let ((line (read-line strm nil eof))) + (if (eq line eof) + eof + (delimited-string-to-list line #\| t)))) ;;; Find field lengths for LEX and NET files diff --git a/parse-macros.lisp b/parse-macros.lisp index d356282..65a608c 100644 --- a/parse-macros.lisp +++ b/parse-macros.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Apr 2000 ;;;; -;;;; $Id: parse-macros.lisp,v 1.3 2003/05/05 23:13:28 kevin Exp $ +;;;; $Id: parse-macros.lisp,v 1.4 2003/05/06 01:34:57 kevin Exp $ ;;;; ;;;; This file, part of UMLisp, is ;;;; Copyright (c) 2000-2002 by Kevin M. Rosenberg, M.D. @@ -16,41 +16,43 @@ ;;;; as governed by the terms of the GNU General Public License. ;;;; ************************************************************************* -(in-package :umlisp) -(declaim (optimize (speed 3) (safety 1) (compilation-speed 0) (debug 3))) +(in-package #:umlisp) (defmacro with-umls-file ((line filename) &body body) "Opens a UMLS and processes each parsed line with (body) argument" - (let ((ustream (gensym))) + (let ((ustream (gensym "STRM-")) + (eof (gensym "EOF-"))) `(with-open-file - (,ustream (umls-pathname ,filename) - :direction :input :if-exists :overwrite) - (do ((,line (read-umls-line ,ustream) (read-umls-line ,ustream))) - ((eq ,line 'eof) t) - ,@body)))) + (,ustream (umls-pathname ,filename) :direction :input) + (do ((,line (read-umls-line ,ustream ,eof) + (read-umls-line ,ustream ,eof))) + ((eq ,line 'eof) t) + ,@body)))) (defmacro with-buffered-umls-file ((line filename) &body body) -"Opens a UMLS and processes each parsed line with (body) argument" - (let ((ustream (gensym)) - (buffer (gensym))) + "Opens a UMLS and processes each parsed line with (body) argument" + (let ((ustream (gensym "STRM-")) + (buffer (gensym "BUF-")) + (eof (gensym "EOF-"))) `(let ((,buffer (make-fields-buffer))) (with-open-file - (,ustream (umls-pathname ,filename) - :direction :input :if-exists :overwrite) - (do ((,line (read-buffered-fields ,buffer ,ustream) (read-buffered-fields ,buffer ,ustream))) - ((eq ,line 'kl::eof) t) + (,ustream (umls-pathname ,filename) :direction :input) + (do ((,line (read-buffered-fields ,buffer ,ustream #\| ,eof) + (read-buffered-fields ,buffer ,ustream #\| ,eof))) + ((eq ,line ,eof) t) ,@body))))) (defmacro with-buffered2-umls-file ((line filename) &body body) -"Opens a UMLS and processes each parsed line with (body) argument" - (let ((ustream (gensym)) - (buffer (gensym))) + "Opens a UMLS and processes each parsed line with (body) argument" + (let ((ustream (gensym "STRM-")) + (buffer (gensym "BUF-")) + (eof (gensym "EOF-"))) `(let ((,buffer (make-fields-buffer2))) (with-open-file (,ustream (umls-pathname ,filename) - :direction :input :if-exists :overwrite) - (do ((,line (read-buffered-fields2 ,buffer ,ustream) (read-buffered-fields2 ,buffer ,ustream))) - ((eq ,line 'eof) t) + :direction :input :if-exists :overwrite) + (do ((,line (read-buffered-fields ,buffer ,ustream #\| ,eof) + (read-buffered-fields ,buffer ,ustream #\| ,eof))) + ((eq ,line ,eof) t) ,@body))))) - diff --git a/sql-classes.lisp b/sql-classes.lisp index 728c756..6e62db2 100644 --- a/sql-classes.lisp +++ b/sql-classes.lisp @@ -7,7 +7,7 @@ ;;;; Author: Kevin M. Rosenberg ;;;; Date Started: Apr 2000 ;;;; -;;;; $Id: sql-classes.lisp,v 1.70 2003/05/05 23:13:28 kevin Exp $ +;;;; $Id: sql-classes.lisp,v 1.71 2003/05/06 01:34:57 kevin Exp $ ;;;; ;;;; This file, part of UMLisp, is ;;;; Copyright (c) 2000-2002 by Kevin M. Rosenberg, M.D. @@ -30,7 +30,9 @@ &key (lrl "KCUILRL") single distinct order like) (let* ((%%fields (format nil "select ~A~{~:@(~A~)~^,~} from ~:@(~A~)" (if distinct "distinct " "") fields table)) - (%%order (if order (format nil " order by ~{~:@(~A~) ~(~A~)~^,~}" order) "")) + (%%order (if order (format nil " order by ~{~:@(~A~) ~(~A~)~^,~}" + order) + "")) (%%lrl (format nil " and ~:@(~A~)<=" lrl)) (%%where (when where-name (format nil " where ~:@(~A~)~A" where-name @@ -173,15 +175,16 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (defun find-ucon-lui (lui &key (srl *current-srl*)) "Find list of ucon for lui" - (with-umlisp-query (mrcon (cui kpfstr kcuilrl) srl lui (parse-lui lui) :distinct t) + (with-umlisp-query (mrcon (cui kpfstr kcuilrl) srl lui (parse-lui lui) + :distinct t) (make-instance 'ucon :cui (ensure-integer cui) :pfstr kpfstr :lrl (ensure-integer kcuilrl)))) (defun find-ucon-sui (sui &key (srl *current-srl*)) "Find list of ucon for sui" - (with-umlisp-query (mrcon (cui kpfstr kcuilrl) srl sui (parse-sui sui) :distinct t) - (make-instance 'ucon :cui (ensure-integer cui) - :pfstr kpfstr + (with-umlisp-query (mrcon (cui kpfstr kcuilrl) srl sui (parse-sui sui) + :distinct t) + (make-instance 'ucon :cui (ensure-integer cui) :pfstr kpfstr :lrl (ensure-integer kcuilrl)))) (defun find-ucon-cuisui (cui sui &key (srl *current-srl*)) @@ -214,7 +217,8 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (defun find-ucon-all2 (&key (srl *current-srl*)) "Return list of all ucon's" - (with-umlisp-query (mrcon (cui kpfstr kcuilrl) srl nil nil :order (cui asc) :distinct t) + (with-umlisp-query (mrcon (cui kpfstr kcuilrl) srl nil nil :order (cui asc) + :distinct t) (make-instance 'ucon :cui (ensure-integer cui) :pfstr kpfstr :lrl (ensure-integer kcuilrl)))) @@ -229,7 +233,8 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (make-instance 'ucon :cui (ensure-integer cui) :pfstr pfstr :lrl (ensure-integer cuilrl)))) - (query-string mrcon (cui kpfstr kcuilrl) srl nil nil :order (cui asc) :distinct t) + (query-string mrcon (cui kpfstr kcuilrl) srl nil nil :order (cui asc) + :distinct t) :database db))) @@ -245,20 +250,25 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (defun find-usty-word (word &key (srl *current-srl*)) "Return a list of usty that match word" - (with-umlisp-query (mrsty (tui sty) srl sty word :lrl klrl :like t :distinct t) + (with-umlisp-query (mrsty (tui sty) srl sty word :lrl klrl :like t + :distinct t) (make-instance 'usty :tui (ensure-integer tui) :sty sty))) (defun find-urel-cui (cui &key (srl *current-srl*)) "Return a list of urel for cui" - (with-umlisp-query (mrrel (rel cui2 rela sab sl mg kpfstr2) srl cui1 (parse-cui cui) :lrl "KSRL") - (make-instance 'urel :cui1 (parse-cui cui) :rel rel :cui2 (ensure-integer cui2) - :rela rela :sab sab :sl sl :mg mg :pfstr2 kpfstr2))) + (with-umlisp-query (mrrel (rel cui2 rela sab sl mg kpfstr2) srl cui1 + (parse-cui cui) :lrl "KSRL") + (make-instance 'urel :cui1 (parse-cui cui) :rel rel + :cui2 (ensure-integer cui2) :rela rela :sab sab :sl sl + :mg mg :pfstr2 kpfstr2))) (defun find-urel-cui2 (cui2 &key (srl *current-srl*)) "Return a list of urel for cui2" - (with-umlisp-query (mrrel (rel cui1 rela sab sl mg kpfstr2) srl cui2 (parse-cui cui2) :lrl "KSRL") - (make-instance 'urel :cui2 (parse-cui cui2) :rel rel :cui1 (ensure-integer cui1) - :rela rela :sab sab :sl sl :mg mg :pfstr2 kpfstr2))) + (with-umlisp-query (mrrel (rel cui1 rela sab sl mg kpfstr2) srl cui2 + (parse-cui cui2) :lrl "KSRL") + (make-instance 'urel :cui2 (parse-cui cui2) :rel rel + :cui1 (ensure-integer cui1) :rela rela :sab sab :sl sl + :mg mg :pfstr2 kpfstr2))) (defun find-ucon-rel-cui2 (cui2 &key (srl *current-srl*)) (mapcar @@ -267,21 +277,23 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (defun find-ucoc-cui (cui &key (srl *current-srl*)) "Return a list of ucoc for cui" - (with-umlisp-query (mrcoc (cui2 soc cot cof coa kpfstr2) srl cui1 (parse-cui cui) - :lrl "KSRL" :order (cof asc)) + (with-umlisp-query (mrcoc (cui2 soc cot cof coa kpfstr2) srl cui1 + (parse-cui cui) :lrl "KSRL" :order (cof asc)) (setq cui2 (ensure-integer cui2)) (when (zerop cui2) (setq cui2 nil)) - (make-instance 'ucoc :cui1 (parse-cui cui) :cui2 (ensure-integer cui2) :soc soc - :cot cot :cof (ensure-integer cof) :coa coa :pfstr2 kpfstr2))) + (make-instance 'ucoc :cui1 (parse-cui cui) :cui2 (ensure-integer cui2) + :soc soc :cot cot :cof (ensure-integer cof) :coa coa + :pfstr2 kpfstr2))) (defun find-ucoc-cui2 (cui2 &key (srl *current-srl*)) "Return a list of ucoc for cui2" - (with-umlisp-query (mrcoc (cui1 soc cot cof coa kpfstr2) srl cui2 (parse-cui cui2) - :lrl "KSRL" :order (cof asc)) + (with-umlisp-query (mrcoc (cui1 soc cot cof coa kpfstr2) srl cui2 + (parse-cui cui2) :lrl "KSRL" :order (cof asc)) (setq cui2 (ensure-integer cui2)) (when (zerop cui2) (setq cui2 nil)) - (make-instance 'ucoc :cui1 (ensure-integer cui1) :cui2 (parse-cui cui2) :soc soc - :cot cot :cof (ensure-integer cof) :coa coa :pfstr2 kpfstr2))) + (make-instance 'ucoc :cui1 (ensure-integer cui1) :cui2 (parse-cui cui2) + :soc soc :cot cot :cof (ensure-integer cof) :coa coa + :pfstr2 kpfstr2))) (defun find-ucon-coc-cui2 (cui2 &key (srl *current-srl*)) "List of ucon with co-occurance cui2" @@ -291,9 +303,10 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (defun find-ulo-cui (cui &key (srl *current-srl*)) "Return a list of ulo for cui" - (with-umlisp-query (mrlo (isn fr un sui sna soui) srl cui (parse-cui cui) :lrl "KLRL") - (make-instance 'ulo :isn isn :fr (ensure-integer fr) :un un :sui (ensure-integer sui) - :sna sna :soui soui))) + (with-umlisp-query (mrlo (isn fr un sui sna soui) srl cui (parse-cui cui) + :lrl "KLRL") + (make-instance 'ulo :isn isn :fr (ensure-integer fr) :un un + :sui (ensure-integer sui) :sna sna :soui soui))) (defgeneric suistr (lo)) (defmethod suistr ((lo ulo)) @@ -308,8 +321,8 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (defun find-uterm-cui (cui &key (srl *current-srl*)) "Return a list of uterm for cui" - (with-umlisp-query (mrcon (lui lat ts kluilrl) srl cui (parse-cui cui) :lrl kluilrl - :distinct t) + (with-umlisp-query (mrcon (lui lat ts kluilrl) srl cui (parse-cui cui) + :lrl kluilrl :distinct t) (make-instance 'uterm :lui (ensure-integer lui) :cui (parse-cui cui) :lat lat :ts ts :lrl (ensure-integer kluilrl)))) @@ -330,20 +343,24 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (defun find-ustr-cuilui (cui lui &key (srl *current-srl*)) "Return a list of ustr for cui/lui" - (with-umlisp-query (mrcon (sui stt str lrl) srl kcuilui (make-cuilui cui lui) :lrl lrl) + (with-umlisp-query (mrcon (sui stt str lrl) srl kcuilui + (make-cuilui cui lui) :lrl lrl) (make-instance 'ustr :sui (ensure-integer sui) :cui cui :lui lui :cuisui (make-cuisui cui sui) :stt stt :str str :lrl (ensure-integer lrl)))) (defun find-ustr-cuisui (cui sui &key (srl *current-srl*)) "Return the single ustr for cuisui" - (with-umlisp-query (mrcon (lui stt str lrl) srl kcuisui (make-cuisui cui sui) :lrl lrl :single t) + (with-umlisp-query (mrcon (lui stt str lrl) srl kcuisui + (make-cuisui cui sui) :lrl lrl :single t) (make-instance 'ustr :sui sui :cui cui :cuisui (make-cuisui cui sui) - :lui (ensure-integer lui) :stt stt :str str :lrl (ensure-integer lrl)))) + :lui (ensure-integer lui) :stt stt :str str + :lrl (ensure-integer lrl)))) (defun find-ustr-sui (sui &key (srl *current-srl*)) "Return the list of ustr for sui" - (with-umlisp-query (mrcon (cui lui stt str lrl) srl sui (parse-sui sui) :lrl lrl) + (with-umlisp-query (mrcon (cui lui stt str lrl) srl sui (parse-sui sui) + :lrl lrl) (make-instance 'ustr :sui sui :cui cui :stt stt :str str :cuisui (make-cuisui (ensure-integer cui) (parse-sui sui)) :lui (ensure-integer lui) :lrl (ensure-integer lrl)))) @@ -354,7 +371,8 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (let ((cuisui (ensure-integer kcuisui))) (apply #'find-ustr-cuisui (append - (multiple-value-list (decompose-cuisui cuisui)) (list :srl srl)))))) + (multiple-value-list (decompose-cuisui cuisui)) + (list :srl srl)))))) (defun find-ustr-all (&key (srl *current-srl*)) "Return list of all ustr's" @@ -362,11 +380,14 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (clsql:map-query 'list #'(lambda (cui lui sui stt lrl pfstr) - (make-instance 'ustr :cui (ensure-integer cui) :lui (ensure-integer lui) - :sui (ensure-integer sui) :stt stt :str pfstr - :cuisui (make-cuisui (ensure-integer cui) (ensure-integer sui)) + (make-instance 'ustr :cui (ensure-integer cui) + :lui (ensure-integer lui) :sui (ensure-integer sui) + :stt stt :str pfstr + :cuisui (make-cuisui (ensure-integer cui) + (ensure-integer sui)) :lrl (ensure-integer lrl))) - (query-string mrcon (cui lui sui stt lrl kpfstr) srl nil nil :lrl lrl :distinct t + (query-string mrcon (cui lui sui stt lrl kpfstr) srl nil nil :lrl lrl + :distinct t :order (sui asc)) :database db))) @@ -376,24 +397,27 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" str)) (defun find-uso-cuisui (cui sui &key (srl *current-srl*)) - (with-umlisp-query (mrso (sab code srl tty) srl kcuisui (make-cuisui cui sui) :lrl srl) + (with-umlisp-query (mrso (sab code srl tty) srl kcuisui + (make-cuisui cui sui) :lrl srl) (make-instance 'uso :sab sab :code code :srl srl :tty tty))) (defun find-ucxt-cuisui (cui sui &key (srl *current-srl*)) - (with-umlisp-query (mrcxt (sab code cxn cxl rnk cxs cui2 hcd rela xc) srl kcuisui - (make-cuisui cui sui) :lrl ksrl) + (with-umlisp-query (mrcxt (sab code cxn cxl rnk cxs cui2 hcd rela xc) + srl kcuisui (make-cuisui cui sui) :lrl ksrl) (make-instance 'ucxt :sab sab :code code - :cxn (ensure-integer cxn) :cxl cxl :cxs cxs :hcd hcd :rela rela :xc xc - :rnk (ensure-integer rnk) :cui2 (ensure-integer cui2)))) + :cxn (ensure-integer cxn) :cxl cxl :cxs cxs :hcd hcd + :rela rela :xc xc :rnk (ensure-integer rnk) + :cui2 (ensure-integer cui2)))) (defun find-usat-ui (cui &optional (lui nil) (sui nil) &key (srl *current-srl*)) (let ((ls (format nil "select CODE,ATN,SAB,ATV from MRSAT where "))) (cond - (sui (string-append ls (format nil "KCUISUI=~d" (make-cuisui cui sui)))) - (lui (string-append ls (format nil "KCUILUI=~d and sui=0" (make-cuilui cui lui)))) - (t (string-append ls (format nil "cui=~d and lui=0 and sui=0" cui)))) + (sui (string-append ls (format nil "KCUISUI=~D" (make-cuisui cui sui)))) + (lui (string-append ls (format nil "KCUILUI=~D and sui=0" + (make-cuilui cui lui)))) + (t (string-append ls (format nil "cui=~D and lui=0 and sui=0" cui)))) (when srl - (string-append ls (format nil " and KSRL <= ~d" srl))) + (string-append ls (format nil " and KSRL <= ~D" srl))) (loop for tuple in (mutex-sql-query ls) collect (destructuring-bind (code atn sab atv) tuple (make-instance 'usat :code code :atn atn :sab sab :atv atv))))) @@ -415,27 +439,30 @@ is OBJNAME from TABLE where WHERE-NAME field = WHERE-VALUE with FIELDS" (defun find-usab-all () "Find usab for a key" - (with-umlisp-query (mrsab (vcui rcui vsab rsab son sf sver mstart mend imeta rmeta slc - scc srl tfr cfr cxty ttyl atnl lat cenc curver sabin) - nil nil nil) + (with-umlisp-query (mrsab (vcui rcui vsab rsab son sf sver mstart mend imeta + rmeta slc scc srl tfr cfr cxty ttyl atnl lat + cenc curver sabin) nil nil nil) (make-instance 'usab :vcui (ensure-integer vcui) - :rcui (ensure-integer rcui) :vsab vsab :rsab rsab :son son :sf sf - :sver sver :mstart mstart :mend mend :imeta imeta :rmeta rmeta - :slc slc :scc scc :srl (ensure-integer srl) :tfr (ensure-integer tfr) - :cfr (ensure-integer cfr) :cxty cxty :ttyl ttyl :atnl atnl :lat lat - :cenc cenc :curver curver :sabin sabin))) + :rcui (ensure-integer rcui) :vsab vsab :rsab rsab :son son + :sf sf :sver sver :mstart mstart :mend mend :imeta imeta + :rmeta rmeta :slc slc :scc scc :srl (ensure-integer srl) + :tfr (ensure-integer tfr) :cfr (ensure-integer cfr) + :cxty cxty :ttyl ttyl :atnl atnl :lat lat :cenc cenc + :curver curver :sabin sabin))) (defun find-usab-by-key (key-name key) "Find usab for a key" - (with-umlisp-query-eval ('mrsab '(vcui rcui vsab rsab son sf sver mstart mend imeta - rmeta slc scc srl tfr cfr cxty ttyl atnl lat cenc - curver sabin) nil key-name key :single t) + (with-umlisp-query-eval ('mrsab '(vcui rcui vsab rsab son sf sver mstart + mend imeta rmeta slc scc srl tfr cfr cxty + ttyl atnl lat cenc curver sabin) + nil key-name key :single t) (make-instance 'usab :vcui (ensure-integer vcui) - :rcui (ensure-integer rcui) :vsab vsab :rsab rsab :son son :sf sf - :sver sver :mstart mstart :mend mend :imeta imeta :rmeta rmeta - :slc slc :scc scc :srl (ensure-integer srl) :tfr (ensure-integer tfr) - :cfr (ensure-integer cfr) :cxty cxty :ttyl ttyl :atnl atnl :lat lat - :cenc cenc :curver curver :sabin sabin))) + :rcui (ensure-integer rcui) :vsab vsab :rsab rsab :son son + :sf sf :sver sver :mstart mstart :mend mend :imeta imeta + :rmeta rmeta :slc slc :scc scc :srl (ensure-integer srl) + :tfr (ensure-integer tfr) :cfr (ensure-integer cfr) + :cxty cxty :ttyl ttyl :atnl atnl :lat lat :cenc cenc + :curver curver :sabin sabin))) (defun find-usab-rsab (rsab) "Find usab for rsab" diff --git a/sql-create.lisp b/sql-create.lisp index 236b137..19be192 100644 --- a/sql-create.lisp +++ b/sql-create.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Apr 2000 ;;;; -;;;; $Id: sql-create.lisp,v 1.7 2003/05/05 23:13:28 kevin Exp $ +;;;; $Id: sql-create.lisp,v 1.8 2003/05/06 01:34:57 kevin Exp $ ;;;; ;;;; This file, part of UMLisp, is ;;;; Copyright (c) 2000-2002 by Kevin M. Rosenberg, M.D. @@ -17,25 +17,9 @@ ;;;; ************************************************************************* (in-package :umlisp) -(declaim (optimize (speed 3) (safety 1) (compilation-speed 0) (debug 3))) - - -(defun create-table-cmd-old (file) - "Return sql command to create a table" - (let ((col-func - (lambda (c) - (let ((sqltype (umls-col-sqltype c))) - (concatenate 'string (umls-col-col c) - " " - (if (or (string-equal sqltype "VARCHAR") - (string-equal sqltype "CHAR")) - (format nil "~a (~a)" sqltype (umls-col-max c)) - sqltype) - ","))))) - (format nil "CREATE TABLE ~a (~a)" (umls-file-table file) - (string-trim-last-character - (mapcar-append-string col-func (umls-cols-for-umls-file file)))))) +(eval-when (:compile-toplevel) + (declaim (optimize (speed 3) (safety 1) (compilation-speed 0) (debug 3)))) (defun create-table-cmd (file) "Return sql command to create a table" @@ -56,32 +40,6 @@ "Return SQL command to create a custom table" (format nil "CREATE TABLE ~a AS ~a;" tablename sql-cmd)) -(defun insert-values-cmd-old (file values) - "Return sql insert command for a row of values" - (let ((insert-func - (lambda (col value) - (concatenate - 'string - (umls-col-quotechar col) - (if (null (umls-col-parsefunc col)) - value - (format nil "~A" (funcall (umls-col-parsefunc col) value))) - (umls-col-quotechar col) - ",")))) - (format - nil "INSERT INTO ~a (~a) VALUES (~a)" - (umls-file-table file) - (string-trim-last-character - (mapcar-append-string (lambda (c) (concatenate 'string c ",")) - (umls-file-fields file))) - (string-trim-last-character - (concatenate 'string - (mapcar2-append-string insert-func - (remove-custom-cols (umls-file-colstructs file)) - values) - (custom-col-values-old (custom-colstructs-for-file file) values "," t))) - ))) - (defun insert-col-value (col value) (if (null (umls-col-parsefunc col)) value @@ -102,18 +60,6 @@ (mapcar insert-func (remove-custom-cols (umls-file-colstructs file)) values) (custom-col-values (custom-colstructs-for-file file) values t))))) -(defun custom-col-values-old (colstructs values delim doquote) - "Returns a string of column values for SQL inserts for custom columns" - (let ((result "")) - (dolist (col colstructs) - (let* ((func (umls-col-custom-value-func col)) - (custom-value (funcall func values))) - (string-append result - (if doquote (umls-col-quotechar col)) - (escape-backslashes custom-value) - (if doquote (umls-col-quotechar col)) - delim))) - result)) (defun custom-col-value (col doquote values) (let ((custom-value (funcall (umls-col-custom-value-func col) values))) @@ -146,46 +92,43 @@ (remove-if-not #'umls-col-custom-value-func (umls-file-colstructs file))) (defun noneng-lang-index-files () - (remove-if-not (lambda (f) (and (> (length (umls-file-fil f)) 4) - (string-equal (umls-file-fil f) "MRXW." :end1 5) - (not (string-equal (umls-file-fil f) "MRXW.ENG")) - (not (string-equal (umls-file-fil f) "MRXW.NONENG")))) - *umls-files*)) + (remove-if-not + (lambda (f) (and (> (length (umls-file-fil f)) 4) + (string-equal (umls-file-fil f) "MRXW." :end1 5) + (not (string-equal (umls-file-fil f) "MRXW.ENG")) + (not (string-equal (umls-file-fil f) "MRXW.NONENG")))) + *umls-files*)) ;;; SQL Command Functions (defun create-index-cmd (colname tablename length) "Return sql create index command" (format nil "CREATE INDEX ~a ON ~a (~a ~a)" - (concatenate 'string tablename "_" colname "_X") tablename colname - (if (integerp length) - (format nil "(~d)" length) - ""))) + (concatenate 'string tablename "_" colname "_X") + tablename colname + (if (integerp length) (format nil "(~d)" length) ""))) (defun create-all-tables-cmdfile () "Return sql commands to create all tables. Not need for automated SQL import" (mapcar (lambda (f) (format nil "~a~%~%" (create-table-cmd f))) *umls-files*)) - ;; SQL Execution functions (defun sql-drop-tables (conn) "SQL Databases: drop all tables" - (mapcar - (lambda (file) - (ignore-errors - (sql-execute (format nil "DROP TABLE ~a" (umls-file-table file)) conn))) - *umls-files*)) + (dolist (file *umls-files*) + (ignore-errors + (sql-execute (format nil "DROP TABLE ~a" (umls-file-table file)) conn)))) (defun sql-create-tables (conn) "SQL Databases: create all tables" - (mapcar (lambda (file) (sql-execute (create-table-cmd file) conn)) *umls-files*)) + (dolist (file *umls-files*) + (sql-execute (create-table-cmd file) conn))) (defun sql-create-custom-tables (conn) "SQL Databases: create all custom tables" - (mapcar (lambda (ct) - (sql-execute (create-custom-table-cmd (car ct) (cadr ct)) conn)) - +custom-tables+)) + (dolist (ct +custom-tables+) + (sql-execute (create-custom-table-cmd (car ct) (cadr ct)) conn))) (defun sql-insert-values (conn file) "SQL Databases: inserts all values for a file" @@ -194,19 +137,19 @@ (defun sql-insert-all-values (conn) "SQL Databases: inserts all values for all files" - (mapcar (lambda (file) (sql-insert-values conn file)) *umls-files*)) + (dolist (file *umls-files*) + (sql-insert-values conn file))) (defun sql-create-indexes (conn &optional (indexes +index-cols+)) "SQL Databases: create all indexes" - (mapcar - (lambda (idx) - (sql-execute (create-index-cmd (car idx) (cadr idx) (caddr idx)) conn)) - indexes)) + (dolist (idx indexes) + (sql-execute (create-index-cmd (car idx) (cadr idx) (caddr idx)) conn))) (defun make-usrl (conn) (sql-execute "drop table if exists USRL" conn) (sql-execute "create table USRL (sab varchar(80), srl integer)" conn) - (dolist (tuple (mutex-sql-query "select distinct SAB,SRL from MRSO order by SAB asc")) + (dolist (tuple (mutex-sql-query + "select distinct SAB,SRL from MRSO order by SAB asc")) (sql-execute (format nil "insert into USRL (sab,srl) values ('~a',~d)" (car tuple) (ensure-integer (cadr tuple))) conn))) @@ -248,80 +191,41 @@ This is much faster that using create-umls-db-insert." (defun translate-all-files (&optional (extension ".trans")) "Copy translated files and return postgresql copy commands to import" (make-noneng-index-file extension) - (map 'nil (lambda (f) (translate-file f extension)) *umls-files*)) + (dolist (f *umls-files*) (translate-umls-file f extension))) -(defun translate-file (file extension) +(defun translate-file (filename extension files) "Translate a umls file into a format suitable for sql copy cmd" - (let ((path (umls-pathname (umls-file-fil file) extension))) + (let ((path (umls-pathname filename extension)) + (input-files (mklist files))) (if (probe-file path) - (progn - (format t "File ~A already exists: skipping~%" path) - nil) - (with-open-file (ostream path :direction :output) - (with-umls-file (line (umls-file-fil file)) - (umls-translate file line ostream) - (princ #\newline ostream)) - t)))) + (format t "File ~A already exists: skipping~%" path) + (dolist (input-file input-files) + (with-open-file (ostream :direction :output) + (with-umls-file (line (umls-file-fil input-file)) + (umls-translate file line ostream) + (princ #\newline ostream))))))) + +(defun translate-umls-file (file extension) + "Translate a umls file into a format suitable for sql copy cmd" + (translate-file (umls-file-fil file) extension (umls-file-fil file))) (defun make-noneng-index-file (extension) "Make non-english index file" - (let* ((outfile (find-umls-file "MRXW.NONENG")) - (path (umls-pathname (umls-file-fil outfile) extension))) - - (if (probe-file path) - (progn - (format t "File ~A already exists: skipping~%" path) - nil) - (progn - (with-open-file (ostream path :direction :output) - (dolist (inputfile (noneng-lang-index-files)) - (with-umls-file (line (umls-file-fil inputfile)) - (umls-translate outfile line ostream) ;; use outfile for custom cols - (princ #\newline ostream)))) - t)))) + (translate-file (find-umls-file "MRXW.NONENG" extension + (noneng-lang-index-files)))) (defun pg-copy-cmd (file extension) "Return postgresql copy statement for a file" - (format nil "COPY ~a FROM '~a' using delimiters '|' with null as ''" - (umls-file-table file) (umls-pathname (umls-file-fil file) extension))) + (format + nil "COPY ~a FROM '~a' using delimiters '|' with null as ''" + (umls-file-table file) (umls-pathname (umls-file-fil file) extension))) (defun mysql-copy-cmd (file extension) "Return mysql copy statement for a file" - (format nil "LOAD DATA LOCAL INFILE \"~a\" INTO TABLE ~a FIELDS TERMINATED BY \"|\"" - (umls-pathname (umls-file-fil file) extension) (umls-file-table file))) - -(defun umls-translate-old (file line) - "Translate a single line for sql output" - (string-trim-last-character - (concatenate 'string - (mapcar2-append-string - (lambda (col value) - (concatenate - 'string - (if (eq (umls-col-datatype col) 'sql-u) - (format nil "~d" (parse-ui value "")) - (escape-backslashes value)) - "|")) - (remove-custom-cols (umls-file-colstructs file)) - line) - (custom-col-values-old (custom-colstructs-for-file file) line "|" nil)))) - -(defun concat-separated-strings (separator &rest lists) - (format nil (format nil "~~{~~A~~^~A~~}" separator) (mapappend #'identity lists))) - -(defun print-separated-strings (strm separator &rest lists) - (declare (optimize (speed 3) (safety 0) (space 0) (debug 0) (compilation-speed 0))) - (do* ((rest-lists lists (cdr rest-lists)) - (list (car rest-lists) (car rest-lists)) - (last-list (null (cdr rest-lists)) (null (cdr rest-lists)))) - ((null list) strm) - (do* ((lst list (cdr lst)) - (elem (car lst) (car lst)) - (last-elem (null (cdr lst)) (null (cdr lst)))) - ((null lst)) - (write-string elem strm) - (unless (and last-elem last-list) - (write-string separator strm))))) + (format + nil + "LOAD DATA LOCAL INFILE \"~a\" INTO TABLE ~a FIELDS TERMINATED BY \"|\"" + (umls-pathname (umls-file-fil file) extension) (umls-file-table file))) (defun col-value (col value) (if (eq (umls-col-datatype col) 'sql-u) @@ -389,16 +293,13 @@ This is much faster that using create-umls-db-insert." (defun max-umls-row () "Return length of longest row" - (if t - 6000 ;;; hack to use on systems without MRCOLS/MRFILES -- ok for UMLS2001 - (progn - (unless *umls-files* - (init-umls)) - (let ((rowsizes '())) - (dolist (file *umls-files*) - (let ((row 0) - (fields (umls-file-colstructs file))) - (dolist (field fields) - (incf row (1+ (umls-col-max field)))) - (push row rowsizes))) - (car (sort rowsizes #'>)))))) + (unless *umls-files* + (init-umls)) + (let ((rowsizes '())) + (dolist (file *umls-files*) + (let ((row 0) + (fields (umls-file-colstructs file))) + (dolist (field fields) + (incf row (1+ (umls-col-max field)))) + (push row rowsizes))) + (car (sort rowsizes #'>)))) -- 2.34.1