+(defun sql-create-indexes-mysql (conn indexes verbose)
+ (let ((tables nil)
+ (table-cols nil))
+ (dolist (idx indexes)
+ (pushnew (second idx) tables :test 'string-equal)
+ (let ((table-col (find (second idx) table-cols :key 'car :test 'string-equal)))
+ (if table-col
+ (vector-push-extend (cons (first idx) (third idx)) (second table-col))
+ (push (list (second idx) (make-array (list 1) :initial-contents (list (cons (first idx) (third idx)))
+ :adjustable t :fill-pointer 1))
+ table-cols))))
+ (dolist (table tables)
+ (let ((table-col (find table table-cols :key 'car :test 'string-equal))
+ (first t)
+ (str (format nil "ALTER TABLE ~A" table)))
+ (loop for col across (second table-col)
+ do
+ (let ((colname (car col))
+ (length (cdr col)))
+ (ignore-errors (sql-execute (drop-index-cmd colname table) conn))
+ (setq str (concatenate 'string
+ str
+ (if first
+ (progn
+ (setq first nil)
+ " ")
+ ", ")
+ (format nil "ADD INDEX ~A (~A)"
+ (concatenate 'string table "_" colname "_X")
+ (concatenate 'string
+ colname
+ (if (integerp length)
+ (format nil " (~d)" length)
+ "")))))))
+ (when verbose
+ (format t "UMLS Import: Creating indexes for columns ~A on table ~A.~%"
+ (mapcar 'car (coerce (second table-col) 'list)) table))
+ (when conn
+ (sql-execute str conn))
+ ))))
+