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
|