UNPKG

7.09 kBJavaScriptView Raw
1'use strict';
2
3var algorithms = {
4
5 /**
6 * where
7 * @param {Object} query
8 * @param {string} table
9 * @param {Object} where
10 * @param {int} count
11 */
12 where: function(query, table, where, count) {
13 count = (typeof count === 'number') ? count : 0;
14
15 // Decide between AND or OR
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 * getOperator
58 * @param {string} operator
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
99var Query = {
100
101 /**
102 * Create
103 * @param {Object} params
104 * @param {Object} params.ORM
105 * @param {string} params.table
106 * @param {Object} params.data
107 * @param {string[]} params.returning
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 * Update
118 * @param {Object} params
119 * @param {Object} params.ORM
120 * @param {string} params.table
121 * @param {Object} params.where
122 * @param {Object} params.data
123 * @param {string[]} params.returning
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 * Find
138 * @param {Object} params
139 * @param {Object} params.ORM
140 * @param {string} params.table
141 * @param {Object} params.join
142 * @param {Object} params.where
143 * @param {Object} params.relationships
144 * @param {Object} params.options
145 * @param {string[]} params.returning
146 */
147 find: function(params) {
148 return new Promise((resolve, reject) => {
149 //
150 // Query
151 let query = params.ORM.querier.table(params.table)
152 .distinct()
153 .select([[params.table, '*']]);
154 //
155 // Join
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 // Where
172 let whereCount = 0;
173
174 // Where table attributes
175 let results = algorithms.where(query, params.table, params.where, whereCount);
176 whereCount += results.count;
177 query = results.query;
178
179 // Where join attributes
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 // BelongsToMany
187 if(relationship.type === 'BELONGS_TO_MANY') {
188 let targetModelFactory = relationship.getTargetModel();
189 // Relation select
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 // Relation where
199 let joinWhereCount = 0;
200 let results = algorithms.where(relation, relationTable, params.join[table], joinWhereCount);
201 joinWhereCount += results.count;
202 relation = results.query;
203 // In
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 // BelongsToOne
215 // HasOne
216 // HasMany
217 else {
218 // Where table attributes
219 let results = algorithms.where(query, relationTable, params.join[table], whereCount);
220 whereCount += results.count;
221 query = results.query;
222 }
223
224 }
225 //
226 // Execute
227 query.exec()
228 .then((results) => resolve(results))
229 .catch((error) => reject(error));
230 });
231 },
232
233 /**
234 * Delete
235 * @param {Object} params
236 * @param {Object} params.ORM
237 * @param {string} params.table
238 * @param {Object} params.where
239 * @param {string[]} params.returning
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
254module.exports = Query;
\No newline at end of file