annotate implementations/tabcode/ecolm.lisp @ 330:2fbff655ba47 tip

Removed cpitch-adj and cents SQL columns
author Jeremy Gow <jeremy.gow@gmail.com>
date Mon, 21 Jan 2013 11:08:11 +0000
parents 5b2d0e5a99f1
children
rev   line source
d@183 1 (in-package #:amuse-ecolm)
d@180 2
d@180 3 (defun get-ecolm-connection ()
d@180 4 (clsql:connect (list "127.0.0.1" "ecolm" "basicuser" "basicuser" "29183")
d@180 5 :if-exists :old :database-type :mysql))
d@180 6
d@180 7 (defclass ecolm-identifier (identifier tabcode-object)
d@180 8 ((edition-id :initarg :ed-id :accessor edition-id)
d@180 9 (edition-text-id :initarg :ed-id :accessor %edition-text-id)
d@180 10 (piece-id :initarg :p-id :accessor piece-id)
d@180 11 (tabcode :initarg :code :accessor %tabcode)))
d@180 12
d@180 13 (defclass ecolm-search ()
d@183 14 ((piece-title :initarg :piece :reader piece-title)
d@183 15 (source-title :initarg :source :reader source-title)
d@183 16 (cluster-name :initarg :cluster :reader cluster-name)))
d@180 17
d@180 18 (defun edition-text-id (ecolm-id)
d@180 19 (unless (or (slot-boundp ecolm-id 'edition-text-id)
d@180 20 (slot-boundp ecolm-id 'edition-id))
d@180 21 (get-best-edition ecolm-id))
d@180 22 (unless (slot-boundp ecolm-id 'edition-text-id)
d@180 23 (get-best-edition-text ecolm-id))
d@180 24 (%edition-text-id ecolm-id))
d@180 25
d@180 26 (defun get-best-edition (ecolm-id)
d@180 27 (let ((edition (clsql:query (format nil "SELECT et.`Edition ID`,
d@180 28 `EditionText ID`, `EditionText Text`
d@180 29 FROM Piece_Editions pe NATURAL JOIN Edition_Texts et
d@180 30 WHERE `Piece ID`=~D
d@180 31 ORDER BY `EditionText Stage` DESC,
d@180 32 `EditionText Date` DESC
d@180 33 LIMIT 0,1" (piece-id ecolm-id)))))
d@180 34 (setf (edition-id ecolm-id) (caar edition)
d@180 35 (%edition-text-id ecolm-id) (second (car edition))
d@180 36 (%tabcode ecolm-id) (third (car edition)))))
d@180 37
d@180 38 (defun get-best-edition-text (ecolm-id)
d@180 39 (let ((edition (clsql:query (format nil "SELECT et.`EditionText ID`,
d@180 40 `EditionText Text`
d@180 41 FROM Edition_Texts et
d@180 42 WHERE `Edition ID`=~D
d@180 43 ORDER BY `EditionText Stage` DESC, `EditionText Date` DESC
d@180 44 LIMIT 0,1" (edition-id ecolm-id)))))
d@180 45 (setf (%edition-text-id ecolm-id) (caar edition)
d@180 46 (%tabcode ecolm-id) (second (car edition)))))
d@180 47
d@180 48 (defun tabcode (identifier)
d@180 49 (if (slot-boundp identifier 'tabcode)
d@180 50 (%tabcode identifier)
d@180 51 (when (edition-text-id identifier)
d@180 52 (%tabcode identifier))))
d@180 53
d@180 54 (defmethod get-composition ((identifier ecolm-identifier))
d@183 55 (amuse-tabcode::get-composition-from-tabwords
d@183 56 (tabcode::parse-tabcode-string (tabcode identifier))))
d@183 57
d@183 58 (defun make-ecolm-search (&key (piece-title nil) (source-title nil) (cluster-name nil))
d@183 59 (make-instance 'ecolm-search
d@183 60 :piece piece-title
d@183 61 :source source-title
d@183 62 :cluster cluster-name))
d@183 63
d@183 64 (defun ecolm-search (&key (piece-title nil) (source-title nil) (cluster-name nil))
d@183 65 (get-ecolm-search-results (make-ecolm-search :piece-title piece-title
d@183 66 :source-title source-title
d@183 67 :cluster-name cluster-name)))
d@183 68
d@183 69 (defun get-ecolm-search-results (ecolm-search)
d@183 70 (let ((prefixes '("SELECT DISTINCT p.`Piece ID` FROM Pieces p"))
d@183 71 (where-clauses '("WHERE 1"))
d@183 72 (results)
d@183 73 (query-string "") (sourcep))
d@183 74 (when (and (slot-boundp ecolm-search 'piece-title)
d@183 75 (piece-title ecolm-search))
d@183 76 (push " LEFT JOIN Piece_Names pn USING (`Piece ID`) "
d@183 77 prefixes)
d@183 78 (push (format nil " AND (`Piece Title` LIKE '~D' OR `PieceName Alias` LIKE '~D') "
d@183 79 (piece-title ecolm-search) (piece-title ecolm-search))
d@183 80 where-clauses))
d@183 81 (when (and (slot-boundp ecolm-search 'source-title)
d@183 82 (source-title ecolm-search))
d@183 83 (setf sourcep t)
d@183 84 (push " LEFT JOIN Sources s ON p.`Source ID`=s.`Source ID`
d@183 85 LEFT JOIN Source_Names sn ON s.`Source ID`=sn.`Source ID` "
d@183 86 prefixes)
d@183 87 (push (format nil " AND (`Source Title` LIKE '~D' OR `SourceName Alias` LIKE '~D') "
d@183 88 (source-title ecolm-search) (source-title ecolm-search))
d@183 89 where-clauses))
d@183 90 (when (and (slot-boundp ecolm-search 'cluster-name)
d@183 91 (cluster-name ecolm-search))
d@183 92 (push (if sourcep
d@183 93 " LEFT JOIN Cluster_Pieces cp ON p.`Piece ID`=cp.`Piece ID`
d@183 94 LEFT JOIN Clusters c1 ON cp.`Cluster ID`=c1.`Cluster ID`
d@183 95 LEFT JOIN Cluster_Sources cs on s.`Source ID`=cs.`Source ID`
d@183 96 LEFT JOIN Clusters c2 ON cs.`Cluster ID`=c2.`Cluster ID` "
d@183 97 " LEFT JOIN Cluster_Pieces cp ON p.`Piece ID`=cp.`Piece ID`
d@183 98 LEFT JOIN Clusters c1 ON cp.`Cluster ID`=c1.`Cluster ID` ")
d@183 99 prefixes)
d@183 100 (push (format nil " AND (c1.`Cluster Name` LIKE '~D'~D)"
d@183 101 (cluster-name ecolm-search)
d@183 102 (if sourcep
d@183 103 (format nil "OR c2.`Cluster Name` LIKE '~D'"
d@183 104 (cluster-name ecolm-search))
d@183 105 ""))
d@183 106
d@183 107 where-clauses))
d@183 108 (setf query-string (concatenate 'string
d@183 109 (apply #'concatenate
d@183 110 'string (reverse prefixes))
d@183 111 (apply #'concatenate
d@183 112 'string (reverse where-clauses)))
d@183 113 results (clsql:query query-string))
d@183 114 (remove-if-not #'edition-text-id (mapcar #'(lambda (x) (make-instance 'ecolm-identifier :p-id x)) results))))
d@183 115