UNPKG

5.31 kBJavaScriptView Raw
1'use strict';
2
3var algorithms = {
4
5 where: function(query, table, where, count) {
6 count = (typeof count === 'number') ? count : 0;
7 let operator = '=';
8 for(let column in where) {
9 if(!count) {
10 query = query.where([table, column], operator, where[column]);
11 } else {
12 query = query.and([table, column], operator, where[column]);
13 }
14 count++;
15 }
16 return {
17 query: query,
18 count: count
19 };
20 }
21
22};
23
24var Query = {
25
26 /**
27 * Create
28 * @param {Object} params
29 * @param {Object} params.ORM
30 * @param {string} params.table
31 * @param {Object} params.data
32 * @param {Object} params.returning
33 */
34 create: function(params) {
35 return params.ORM.querier.table(params.table)
36 .insert([params.data])
37 .returning(params.returning)
38 .exec();
39 },
40
41 /**
42 * Update
43 * @param {Object} params
44 * @param {Object} params.ORM
45 * @param {string} params.table
46 * @param {Object} params.where
47 * @param {Object} params.data
48 * @param {Object} params.returning
49 */
50 update: function(params) {
51 let query = params.ORM.querier.table(params.table);
52 query = query.update(params.data);
53 let whereCount = 0;
54 let results = algorithms.where(query, params.table, params.where, whereCount);
55 whereCount += results.count;
56 query = results.query;
57 query = query.returning(params.returning);
58 return query.exec();
59 },
60
61 /**
62 * Find
63 * @param {Object} params
64 * @param {Object} params.ORM
65 * @param {string} params.table
66 * @param {Object} params.join
67 * @param {Object} params.where
68 * @param {Object} params.relationships
69 * @param {Object} params.options
70 * @param {Object} params.returning
71 */
72 find: function(params) {
73 return new Promise((resolve, reject) => {
74 //
75 // Query
76 let query = params.ORM.querier.table(params.table)
77 .distinct()
78 .select([[params.table, '*']]);
79 //
80 // Join
81 for(let table in params.join) {
82 let relationship = params.relationships[table];
83 let throughTable = relationship.getThroughTable();
84 let parent = (relationship.type === 'BELONGS_TO_MANY')
85 ? relationship.identifer.parent_0
86 : relationship.identifer.parent;
87 let child = (relationship.type === 'BELONGS_TO_MANY')
88 ? relationship.identifer.child_0
89 : relationship.identifer.child;
90 query.innerJoin(throughTable).on([throughTable, parent], '=', [params.table, child]);
91 }
92 // Where
93 let whereCount = 0;
94 // Where table attributes
95 let results = algorithms.where(query, params.table, params.where, whereCount);
96 whereCount += results.count;
97 query = results.query;
98 // Where join attributes
99 for(let table in params.join) {
100 let relationship = params.relationships[table];
101 let throughTable = relationship.getThroughTable();
102 //
103 // BelongsToMany
104 if(relationship.type === 'BELONGS_TO_MANY') {
105 let relationTable = relationship.modelFactoryName;
106 let parent_0 = relationship.identifer.parent_0;
107 let child_0 = relationship.identifer.child_0;
108 let parent_1 = relationship.identifer.parent_1;
109 let child_1 = relationship.identifer.child_1;
110 // Relation select
111 let relation = params.ORM.querier.table(throughTable)
112 .select([[throughTable, parent_0]])
113 .innerJoin(relationTable)
114 .on([throughTable, parent_1], '=', [relationTable, child_1]);
115 // Relation where
116 let joinWhereCount = 0;
117 params.join[table].map((table) => {
118 // Where table attributes
119 let results = algorithms.where(relation, relationTable, table, joinWhereCount);
120 joinWhereCount += results.count;
121 relation = results.query;
122 });
123 // In
124 if(!whereCount) {
125 query = query.where([params.table, child_0]);
126 } else {
127 query = query.and([params.table, child_0]);
128 }
129 query = query.in(relation.sql());
130 whereCount++;
131 }
132 //
133 // BelongsToOne
134 // hasOne
135 // hasMany
136 else {
137 // Where table attributes
138 let results = algorithms.where(query, table, params.join[table], whereCount);
139 whereCount += results.count;
140 query = results.query;
141 }
142 }
143 //
144 // Execute
145 query.exec()
146 .then((results) => resolve(results))
147 .catch((error) => reject(error));
148 });
149 },
150
151 /**
152 * Delete
153 * @param {Object} params
154 * @param {Object} params.ORM
155 * @param {string} params.table
156 * @param {Object} params.where
157 * @param {Object} params.returning
158 */
159 delete: function(params) {
160 let query = params.ORM.querier.table(params.table);
161 query = query.delete();
162 let whereCount = 0;
163 let results = algorithms.where(query, params.table, params.where, whereCount);
164 whereCount += results.count;
165 query = results.query;
166 query = query.returning(params.returning);
167 return query.exec();
168 }
169
170};
171
172module.exports = Query;
\No newline at end of file