1 | 'use strict';
|
2 |
|
3 | var algorithms = {
|
4 |
|
5 | |
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 | where: function(query, table, where, count) {
|
13 | count = (typeof count === 'number') ? count : 0;
|
14 |
|
15 |
|
16 | let decideWhereAndOr = (table, column, operator, value, pref) => {
|
17 | if(!count) {
|
18 | query = query.where([table, column], operator, value);
|
19 | }
|
20 | else {
|
21 | if(pref && pref === 'or') {
|
22 | query = query.or([table, column], operator, value);
|
23 | }
|
24 | else if (pref && pref === 'and') {
|
25 | query = query.and([table, column], operator, value);
|
26 | }
|
27 | }
|
28 | count++;
|
29 | };
|
30 |
|
31 | for(let column in where) {
|
32 | if(typeof where[column] === 'object') {
|
33 | for(let op in where[column]) {
|
34 | let operator = algorithms.getOperator(op);
|
35 | if(Array.isArray(where[column][op])) {
|
36 | where[column][op].map((value) => {
|
37 | let pref = (op === '$and') ? 'and' : 'or'
|
38 | decideWhereAndOr(table, column, '=', value, pref);
|
39 | });
|
40 | }
|
41 | else {
|
42 | decideWhereAndOr(table, column, operator, where[column][op], 'and');
|
43 | }
|
44 | }
|
45 | } else {
|
46 | decideWhereAndOr(table, column, '=', where[column], 'and');
|
47 | }
|
48 | }
|
49 |
|
50 | return {
|
51 | query: query,
|
52 | count: count
|
53 | };
|
54 | },
|
55 |
|
56 | |
57 |
|
58 |
|
59 |
|
60 | getOperator: function(operator) {
|
61 | let result;
|
62 | switch(operator) {
|
63 | case '$eq':
|
64 | result = '=';
|
65 | break;
|
66 | case '$ne':
|
67 | result = '!=';
|
68 | break;
|
69 | case '$lt':
|
70 | result = '<';
|
71 | break;
|
72 | case '$gt':
|
73 | result = '>';
|
74 | break;
|
75 | case '$lte':
|
76 | result = '<=';
|
77 | break;
|
78 | case '$gte':
|
79 | result = '>=';
|
80 | break;
|
81 | case '$like':
|
82 | result = 'LIKE';
|
83 | break;
|
84 | case '$notLike':
|
85 | result = 'NOT LIKE';
|
86 | break;
|
87 | case '$or':
|
88 | result = 'or';
|
89 | break;
|
90 | case '$and':
|
91 | result = 'and';
|
92 | break;
|
93 | }
|
94 | return result;
|
95 | }
|
96 |
|
97 | };
|
98 |
|
99 | var Query = {
|
100 |
|
101 | |
102 |
|
103 |
|
104 |
|
105 |
|
106 |
|
107 |
|
108 |
|
109 | create: function(params) {
|
110 | return params.ORM.querier.table(params.table)
|
111 | .insert([params.data])
|
112 | .returning(params.returning)
|
113 | .exec();
|
114 | },
|
115 |
|
116 | |
117 |
|
118 |
|
119 |
|
120 |
|
121 |
|
122 |
|
123 |
|
124 |
|
125 | update: function(params) {
|
126 | let query = params.ORM.querier.table(params.table);
|
127 | query = query.update(params.data);
|
128 | let whereCount = 0;
|
129 | let results = algorithms.where(query, params.table, params.where, whereCount);
|
130 | whereCount += results.count;
|
131 | query = results.query;
|
132 | query = query.returning(params.returning);
|
133 | return query.exec();
|
134 | },
|
135 |
|
136 | |
137 |
|
138 |
|
139 |
|
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 |
|
146 |
|
147 | find: function(params) {
|
148 | return new Promise((resolve, reject) => {
|
149 |
|
150 |
|
151 | let query = params.ORM.querier.table(params.table)
|
152 | .distinct()
|
153 | .select([[params.table, '*']]);
|
154 |
|
155 |
|
156 | for(let table in params.join) {
|
157 | let relationship = params.relationships[table];
|
158 | let throughTable = relationship.getThroughTable();
|
159 | let identiferA, identiferB;
|
160 | if(relationship.type === 'BELONGS_TO_ONE') {
|
161 | identiferA = relationship.identifer.parent;
|
162 | identiferB = relationship.identifer.child;
|
163 | } else {
|
164 | identiferA = relationship.identifer.child;
|
165 | identiferB = relationship.identifer.parent;
|
166 | }
|
167 | query.innerJoin(throughTable).on(
|
168 | [throughTable, identiferA], '=', [params.table, identiferB]);
|
169 | }
|
170 |
|
171 |
|
172 | let whereCount = 0;
|
173 |
|
174 |
|
175 | let results = algorithms.where(query, params.table, params.where, whereCount);
|
176 | whereCount += results.count;
|
177 | query = results.query;
|
178 |
|
179 |
|
180 | for(let table in params.join) {
|
181 | let relationship = params.relationships[table];
|
182 | let throughTable = relationship.getThroughTable();
|
183 | let relationTable = relationship.modelFactoryName;
|
184 |
|
185 |
|
186 |
|
187 | if(relationship.type === 'BELONGS_TO_MANY') {
|
188 | let targetModelFactory = relationship.getTargetModel();
|
189 |
|
190 | let relation = params.ORM.querier.table(throughTable)
|
191 | .select([[throughTable, relationship.identifer.child]])
|
192 | .innerJoin(relationTable)
|
193 | .on(
|
194 | [throughTable, targetModelFactory.identifer.child],
|
195 | '=',
|
196 | [relationTable, targetModelFactory.identifer.parent]
|
197 | );
|
198 |
|
199 | let joinWhereCount = 0;
|
200 | let results = algorithms.where(relation, relationTable, params.join[table], joinWhereCount);
|
201 | joinWhereCount += results.count;
|
202 | relation = results.query;
|
203 |
|
204 | if(!whereCount) {
|
205 | query = query.where([params.table, relationship.identifer.parent]);
|
206 | } else {
|
207 | query = query.and([params.table, relationship.identifer.parent]);
|
208 | }
|
209 | query = query.in(relation.sql());
|
210 | whereCount++;
|
211 | }
|
212 |
|
213 |
|
214 |
|
215 |
|
216 |
|
217 | else {
|
218 |
|
219 | let results = algorithms.where(query, relationTable, params.join[table], whereCount);
|
220 | whereCount += results.count;
|
221 | query = results.query;
|
222 | }
|
223 |
|
224 | }
|
225 |
|
226 |
|
227 | query.exec()
|
228 | .then((results) => resolve(results))
|
229 | .catch((error) => reject(error));
|
230 | });
|
231 | },
|
232 |
|
233 | |
234 |
|
235 |
|
236 |
|
237 |
|
238 |
|
239 |
|
240 |
|
241 | delete: function(params) {
|
242 | let query = params.ORM.querier.table(params.table);
|
243 | query = query.delete();
|
244 | let whereCount = 0;
|
245 | let results = algorithms.where(query, params.table, params.where, whereCount);
|
246 | whereCount += results.count;
|
247 | query = results.query;
|
248 | query = query.returning(params.returning);
|
249 | return query.exec();
|
250 | }
|
251 |
|
252 | };
|
253 |
|
254 | module.exports = Query; |
\ | No newline at end of file |