sql-love 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -32
- package/dist/index.cjs +16 -0
- package/dist/index.d.ts +732 -9
- package/dist/index.mjs +16 -0
- package/package.json +27 -10
- package/.github/workflows/node.js.yml +0 -37
- package/.prettierrc.json +0 -13
- package/CHANGELOG.md +0 -39
- package/CONTRIBUTING.md +0 -85
- package/assets/sql-love-logo.png +0 -0
- package/codecov.yml +0 -7
- package/dist/index.js +0 -9
- package/dist/src/Parser/Parser.d.ts +0 -157
- package/dist/src/Parser/Parser.js +0 -304
- package/dist/src/SelectBuilder/SelectBuilder.d.ts +0 -379
- package/dist/src/SelectBuilder/SelectBuilder.js +0 -810
- package/dist/src/extractGrouped/extractGrouped.d.ts +0 -17
- package/dist/src/extractGrouped/extractGrouped.js +0 -31
- package/dist/src/extractIndexed/extractIndexed.d.ts +0 -12
- package/dist/src/extractIndexed/extractIndexed.js +0 -23
- package/dist/src/extractLookup/extractLookup.d.ts +0 -9
- package/dist/src/extractLookup/extractLookup.js +0 -21
- package/dist/src/getPagination/getPagination.d.ts +0 -16
- package/dist/src/getPagination/getPagination.js +0 -40
- package/dist/src/runMysql/runMysql.d.ts +0 -58
- package/dist/src/runMysql/runMysql.js +0 -61
- package/dist/src/runPrisma/runPrisma.d.ts +0 -41
- package/dist/src/runPrisma/runPrisma.js +0 -34
- package/dist/src/substrCount/substrCount.d.ts +0 -6
- package/dist/src/substrCount/substrCount.js +0 -14
- package/dist/src/toSafeJson/toSafeJson.d.ts +0 -25
- package/dist/src/toSafeJson/toSafeJson.js +0 -45
- package/index.ts +0 -19
- package/src/Parser/Parser.spec.ts +0 -226
- package/src/Parser/Parser.ts +0 -325
- package/src/SelectBuilder/SelectBuilder.spec.ts +0 -785
- package/src/SelectBuilder/SelectBuilder.ts +0 -914
- package/src/extractGrouped/extractGrouped.spec.ts +0 -43
- package/src/extractGrouped/extractGrouped.ts +0 -36
- package/src/extractIndexed/extractIndexed.spec.ts +0 -40
- package/src/extractIndexed/extractIndexed.ts +0 -28
- package/src/extractLookup/extractLookup.spec.ts +0 -38
- package/src/extractLookup/extractLookup.ts +0 -33
- package/src/getPagination/getPagination.spec.ts +0 -75
- package/src/getPagination/getPagination.ts +0 -42
- package/src/runMysql/runMysql.spec.ts +0 -286
- package/src/runMysql/runMysql.ts +0 -106
- package/src/runPrisma/runPrisma.spec.ts +0 -99
- package/src/runPrisma/runPrisma.ts +0 -75
- package/src/substrCount/substrCount.spec.ts +0 -29
- package/src/substrCount/substrCount.ts +0 -14
- package/src/toSafeJson/toSafeJson.spec.ts +0 -28
- package/src/toSafeJson/toSafeJson.ts +0 -56
- package/tsconfig.build.json +0 -10
- package/tsconfig.json +0 -22
- package/vitest.config.ts +0 -11
|
@@ -1,785 +0,0 @@
|
|
|
1
|
-
import SelectBuilder from './SelectBuilder';
|
|
2
|
-
|
|
3
|
-
const trim = s => s.replace(/\s+/g, ' ').trim();
|
|
4
|
-
|
|
5
|
-
describe('class', () => {
|
|
6
|
-
it('should be instantiable', () => {
|
|
7
|
-
const query = new SelectBuilder();
|
|
8
|
-
expect(query).toBeInstanceOf(SelectBuilder);
|
|
9
|
-
});
|
|
10
|
-
});
|
|
11
|
-
describe('where() with arguments', () => {
|
|
12
|
-
it('should parse simple queries', () => {
|
|
13
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
14
|
-
const { sql, bindings } = query.compile();
|
|
15
|
-
expect(trim(sql)).toBe('SELECT * FROM users');
|
|
16
|
-
expect(bindings).toEqual([]);
|
|
17
|
-
});
|
|
18
|
-
it('should accept bindings', () => {
|
|
19
|
-
const query = new SelectBuilder('SELECT * FROM users WHERE id = :id', {
|
|
20
|
-
id: 123,
|
|
21
|
-
});
|
|
22
|
-
const { sql, bindings } = query.compile();
|
|
23
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE id = ?');
|
|
24
|
-
expect(bindings).toEqual([123]);
|
|
25
|
-
});
|
|
26
|
-
it('should allow pg-style placeholders', () => {
|
|
27
|
-
const query = new SelectBuilder(
|
|
28
|
-
'SELECT * FROM users WHERE id = :id AND age >= :age',
|
|
29
|
-
{
|
|
30
|
-
age: 18,
|
|
31
|
-
id: 123,
|
|
32
|
-
}
|
|
33
|
-
);
|
|
34
|
-
const { sql, bindings } = query.compile({ engine: 'pg' });
|
|
35
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE id = $1 AND age >= $2');
|
|
36
|
-
expect(bindings).toEqual([123, 18]);
|
|
37
|
-
});
|
|
38
|
-
it('should handle expressions', () => {
|
|
39
|
-
const query = new SelectBuilder();
|
|
40
|
-
query.column('mycol');
|
|
41
|
-
query.from('mytable');
|
|
42
|
-
query.where('mycol = LOWER(mycol2)');
|
|
43
|
-
const { sql, bindings } = query.compile();
|
|
44
|
-
expect(trim(sql)).toBe(
|
|
45
|
-
'SELECT mycol FROM mytable WHERE mycol = LOWER(mycol2)'
|
|
46
|
-
);
|
|
47
|
-
expect(bindings).toEqual([]);
|
|
48
|
-
});
|
|
49
|
-
it('should handle equals', () => {
|
|
50
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
51
|
-
query.where('id', 123);
|
|
52
|
-
const { sql, bindings } = query.compile();
|
|
53
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE id = ?');
|
|
54
|
-
expect(bindings).toEqual([123]);
|
|
55
|
-
});
|
|
56
|
-
it('should keep binding order', () => {
|
|
57
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
58
|
-
query.where('id', 123);
|
|
59
|
-
const { sql, bindings } = query.compile();
|
|
60
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE id = ?');
|
|
61
|
-
expect(bindings).toEqual([123]);
|
|
62
|
-
});
|
|
63
|
-
it('should handle IN', () => {
|
|
64
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
65
|
-
query.where('id', 'IN', [1, 2]);
|
|
66
|
-
const { sql, bindings } = query.compile();
|
|
67
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE id IN(?, ?)');
|
|
68
|
-
expect(bindings).toEqual([1, 2]);
|
|
69
|
-
});
|
|
70
|
-
it('should handle equals as IN', () => {
|
|
71
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
72
|
-
query.where('id', '=', [1, 2]);
|
|
73
|
-
const { sql, bindings } = query.compile();
|
|
74
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE id IN(?, ?)');
|
|
75
|
-
expect(bindings).toEqual([1, 2]);
|
|
76
|
-
});
|
|
77
|
-
it('should handle automatic IN', () => {
|
|
78
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
79
|
-
query.where('id', [1, 2]);
|
|
80
|
-
const { sql, bindings } = query.compile();
|
|
81
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE id IN(?, ?)');
|
|
82
|
-
expect(bindings).toEqual([1, 2]);
|
|
83
|
-
});
|
|
84
|
-
it('should handle NOT IN', () => {
|
|
85
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
86
|
-
query.where('id', 'NOT IN', [1, 2]);
|
|
87
|
-
const { sql, bindings } = query.compile();
|
|
88
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE id NOT IN(?, ?)');
|
|
89
|
-
expect(bindings).toEqual([1, 2]);
|
|
90
|
-
});
|
|
91
|
-
it('should handle != as NOT IN', () => {
|
|
92
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
93
|
-
query.where('id', '!=', [1, 2]);
|
|
94
|
-
const { sql, bindings } = query.compile();
|
|
95
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE id NOT IN(?, ?)');
|
|
96
|
-
expect(bindings).toEqual([1, 2]);
|
|
97
|
-
});
|
|
98
|
-
it('should handle <> as NOT IN', () => {
|
|
99
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
100
|
-
query.where('id', '<>', [1, 2]);
|
|
101
|
-
const { sql, bindings } = query.compile();
|
|
102
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE id NOT IN(?, ?)');
|
|
103
|
-
expect(bindings).toEqual([1, 2]);
|
|
104
|
-
});
|
|
105
|
-
it('should handle explicit IN (not an array)', () => {
|
|
106
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
107
|
-
query.where('id', 'NOT IN', 456);
|
|
108
|
-
const { sql, bindings } = query.compile();
|
|
109
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE id NOT IN(?)');
|
|
110
|
-
expect(bindings).toEqual([456]);
|
|
111
|
-
});
|
|
112
|
-
it('should handle BETWEEN', () => {
|
|
113
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
114
|
-
query.where('age', 'BETWEEN', [18, 35]);
|
|
115
|
-
const { sql, bindings } = query.compile();
|
|
116
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE age BETWEEN ? AND ?');
|
|
117
|
-
expect(bindings).toEqual([18, 35]);
|
|
118
|
-
});
|
|
119
|
-
it('should handle comparison operators', () => {
|
|
120
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
121
|
-
query.where('age', '>=', 18);
|
|
122
|
-
const { sql, bindings } = query.compile();
|
|
123
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE age >= ?');
|
|
124
|
-
expect(bindings).toEqual([18]);
|
|
125
|
-
});
|
|
126
|
-
it('should handle null', () => {
|
|
127
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
128
|
-
query.where('deleted_at', null);
|
|
129
|
-
const { sql, bindings } = query.compile();
|
|
130
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE deleted_at IS NULL');
|
|
131
|
-
expect(bindings).toEqual([]);
|
|
132
|
-
});
|
|
133
|
-
it('should handle equals null', () => {
|
|
134
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
135
|
-
query.where('deleted_at', '=', null);
|
|
136
|
-
const { sql, bindings } = query.compile();
|
|
137
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE deleted_at IS NULL');
|
|
138
|
-
expect(bindings).toEqual([]);
|
|
139
|
-
});
|
|
140
|
-
it('should handle not null', () => {
|
|
141
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
142
|
-
query.where('deleted_at', 'not', null);
|
|
143
|
-
const { sql, bindings } = query.compile();
|
|
144
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE deleted_at IS NOT NULL');
|
|
145
|
-
expect(bindings).toEqual([]);
|
|
146
|
-
});
|
|
147
|
-
it('should handle != null', () => {
|
|
148
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
149
|
-
query.where('deleted_at', '!=', null);
|
|
150
|
-
const { sql, bindings } = query.compile();
|
|
151
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE deleted_at IS NOT NULL');
|
|
152
|
-
expect(bindings).toEqual([]);
|
|
153
|
-
});
|
|
154
|
-
it('should handle LIKE with no infix', () => {
|
|
155
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
156
|
-
query.where('fname', 'like', 'John');
|
|
157
|
-
const { sql, bindings } = query.compile();
|
|
158
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE fname LIKE ?');
|
|
159
|
-
expect(bindings).toEqual(['John']);
|
|
160
|
-
});
|
|
161
|
-
it('should handle LIKE with array', () => {
|
|
162
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
163
|
-
query.where('fname', 'LIKE', ['Chip', 'John']);
|
|
164
|
-
const { sql, bindings } = query.compile();
|
|
165
|
-
expect(trim(sql)).toBe(
|
|
166
|
-
'SELECT * FROM users WHERE (fname LIKE ? OR fname LIKE ?)'
|
|
167
|
-
);
|
|
168
|
-
expect(bindings).toEqual(['Chip', 'John']);
|
|
169
|
-
});
|
|
170
|
-
it('should handle LIKE with ?% infix', () => {
|
|
171
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
172
|
-
query.where('fname', 'LIKE ?%', 'Tim');
|
|
173
|
-
const { sql, bindings } = query.compile();
|
|
174
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE fname LIKE ?');
|
|
175
|
-
expect(bindings).toEqual(['Tim%']);
|
|
176
|
-
});
|
|
177
|
-
it('should handle LIKE with %? infix', () => {
|
|
178
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
179
|
-
query.where('lname', 'LIKE %?', 'son');
|
|
180
|
-
const { sql, bindings } = query.compile();
|
|
181
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE lname LIKE ?');
|
|
182
|
-
expect(bindings).toEqual(['%son']);
|
|
183
|
-
});
|
|
184
|
-
it('should handle LIKE with %?% infix', () => {
|
|
185
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
186
|
-
query.where('lname', 'LIKE %?%', 'son');
|
|
187
|
-
const { sql, bindings } = query.compile();
|
|
188
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE lname LIKE ?');
|
|
189
|
-
expect(bindings).toEqual(['%son%']);
|
|
190
|
-
});
|
|
191
|
-
it('should handle explicit question marks (2 args)', () => {
|
|
192
|
-
const query = new SelectBuilder();
|
|
193
|
-
query.table('users');
|
|
194
|
-
query.where('SUBSTR(prefs, ?, ?) = role', [1, 4]);
|
|
195
|
-
const { sql, bindings } = query.compile();
|
|
196
|
-
expect(trim(sql)).toBe(
|
|
197
|
-
'SELECT * FROM users WHERE SUBSTR(prefs, ?, ?) = role'
|
|
198
|
-
);
|
|
199
|
-
expect(bindings).toEqual([1, 4]);
|
|
200
|
-
});
|
|
201
|
-
it('should handle where with objects', () => {
|
|
202
|
-
const query = new SelectBuilder();
|
|
203
|
-
query.table('users');
|
|
204
|
-
query.where({ age: 18 });
|
|
205
|
-
const { sql, bindings } = query.compile();
|
|
206
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE age = ?');
|
|
207
|
-
expect(bindings).toEqual([18]);
|
|
208
|
-
});
|
|
209
|
-
it('should handle where with objects with >=', () => {
|
|
210
|
-
const query = new SelectBuilder();
|
|
211
|
-
query.table('users');
|
|
212
|
-
query.where({ 'age >=': 18 });
|
|
213
|
-
const { sql, bindings } = query.compile();
|
|
214
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE age >= ?');
|
|
215
|
-
expect(bindings).toEqual([18]);
|
|
216
|
-
});
|
|
217
|
-
it('should handle where with objects with BETWEEN', () => {
|
|
218
|
-
const query = new SelectBuilder();
|
|
219
|
-
query.table('users');
|
|
220
|
-
query.where({ 'age BETWEEN': [18, 35] });
|
|
221
|
-
const { sql, bindings } = query.compile();
|
|
222
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE age BETWEEN ? AND ?');
|
|
223
|
-
expect(bindings).toEqual([18, 35]);
|
|
224
|
-
});
|
|
225
|
-
it('should handle where with objects with LIKE', () => {
|
|
226
|
-
const query = new SelectBuilder();
|
|
227
|
-
query.table('users');
|
|
228
|
-
query.where({ 'name LIKE ?%': 'Tim' });
|
|
229
|
-
const { sql, bindings } = query.compile();
|
|
230
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE name LIKE ?');
|
|
231
|
-
expect(bindings).toEqual(['Tim%']);
|
|
232
|
-
});
|
|
233
|
-
it('should handle where with objects with IN', () => {
|
|
234
|
-
const query = new SelectBuilder();
|
|
235
|
-
query.table('users');
|
|
236
|
-
query.where({ 'abilities IN': ['view', 'edit'] });
|
|
237
|
-
const { sql, bindings } = query.compile();
|
|
238
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE abilities IN(?, ?)');
|
|
239
|
-
expect(bindings).toEqual(['view', 'edit']);
|
|
240
|
-
});
|
|
241
|
-
it('should handle where with objects with implicit IN', () => {
|
|
242
|
-
const query = new SelectBuilder();
|
|
243
|
-
query.table('users');
|
|
244
|
-
query.where({ abilities: ['view', 'edit'] });
|
|
245
|
-
const { sql, bindings } = query.compile();
|
|
246
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE abilities IN(?, ?)');
|
|
247
|
-
expect(bindings).toEqual(['view', 'edit']);
|
|
248
|
-
});
|
|
249
|
-
});
|
|
250
|
-
describe('orWhere()', () => {
|
|
251
|
-
it('should handle arrays', () => {
|
|
252
|
-
const query = new SelectBuilder();
|
|
253
|
-
query.table('users');
|
|
254
|
-
query.orWhere([
|
|
255
|
-
['a', '>', 1],
|
|
256
|
-
['b', 2],
|
|
257
|
-
]);
|
|
258
|
-
const { sql, bindings } = query.compile();
|
|
259
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE (a > ? OR b = ?)');
|
|
260
|
-
expect(bindings).toEqual([1, 2]);
|
|
261
|
-
});
|
|
262
|
-
it('should handle array of objects', () => {
|
|
263
|
-
const query = new SelectBuilder();
|
|
264
|
-
query.table('users');
|
|
265
|
-
query.orWhere([{ 'a >': 1 }, { b: 2 }]);
|
|
266
|
-
const { sql, bindings } = query.compile();
|
|
267
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE (a > ? OR b = ?)');
|
|
268
|
-
expect(bindings).toEqual([1, 2]);
|
|
269
|
-
});
|
|
270
|
-
it('should handle an object', () => {
|
|
271
|
-
const query = new SelectBuilder();
|
|
272
|
-
query.table('users');
|
|
273
|
-
query.orWhere({ 'a >': 1, b: 2 });
|
|
274
|
-
const { sql, bindings } = query.compile();
|
|
275
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE (a > ? OR b = ?)');
|
|
276
|
-
expect(bindings).toEqual([1, 2]);
|
|
277
|
-
});
|
|
278
|
-
});
|
|
279
|
-
describe('having()', () => {
|
|
280
|
-
it('should handle expression', () => {
|
|
281
|
-
const query = new SelectBuilder(
|
|
282
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id'
|
|
283
|
-
);
|
|
284
|
-
query.having('SUM(size) > 1024 * 1024');
|
|
285
|
-
const { sql, bindings } = query.compile();
|
|
286
|
-
expect(trim(sql)).toBe(
|
|
287
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id HAVING SUM(size) > 1024 * 1024'
|
|
288
|
-
);
|
|
289
|
-
expect(bindings).toEqual([]);
|
|
290
|
-
});
|
|
291
|
-
it('should handle binding with operator', () => {
|
|
292
|
-
const query = new SelectBuilder(
|
|
293
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id'
|
|
294
|
-
);
|
|
295
|
-
query.having('SUM(size)', '>', 1024 * 1024);
|
|
296
|
-
const { sql, bindings } = query.compile();
|
|
297
|
-
expect(trim(sql)).toBe(
|
|
298
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id HAVING SUM(size) > ?'
|
|
299
|
-
);
|
|
300
|
-
expect(bindings).toEqual([1024 * 1024]);
|
|
301
|
-
});
|
|
302
|
-
it('should handle binding', () => {
|
|
303
|
-
const query = new SelectBuilder(
|
|
304
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id'
|
|
305
|
-
);
|
|
306
|
-
query.having('SUM(size) >', 1024 * 1024);
|
|
307
|
-
const { sql, bindings } = query.compile();
|
|
308
|
-
expect(trim(sql)).toBe(
|
|
309
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id HAVING SUM(size) > ?'
|
|
310
|
-
);
|
|
311
|
-
expect(bindings).toEqual([1024 * 1024]);
|
|
312
|
-
});
|
|
313
|
-
it('should handle binding with implicit operator', () => {
|
|
314
|
-
const query = new SelectBuilder(
|
|
315
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id'
|
|
316
|
-
);
|
|
317
|
-
query.having('SUM(size)', 1024 * 1024);
|
|
318
|
-
const { sql, bindings } = query.compile();
|
|
319
|
-
expect(trim(sql)).toBe(
|
|
320
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id HAVING SUM(size) = ?'
|
|
321
|
-
);
|
|
322
|
-
expect(bindings).toEqual([1024 * 1024]);
|
|
323
|
-
});
|
|
324
|
-
it('should handle object binding', () => {
|
|
325
|
-
const query = new SelectBuilder(
|
|
326
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id'
|
|
327
|
-
);
|
|
328
|
-
query.having({ 'SUM(size) >': 1024 * 1024 });
|
|
329
|
-
const { sql, bindings } = query.compile();
|
|
330
|
-
expect(trim(sql)).toBe(
|
|
331
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id HAVING SUM(size) > ?'
|
|
332
|
-
);
|
|
333
|
-
expect(bindings).toEqual([1024 * 1024]);
|
|
334
|
-
});
|
|
335
|
-
it('should handle 2 args with implicit equals', () => {
|
|
336
|
-
const query = new SelectBuilder(
|
|
337
|
-
`
|
|
338
|
-
SELECT
|
|
339
|
-
user_id,
|
|
340
|
-
COUNT(*)
|
|
341
|
-
FROM media
|
|
342
|
-
LEFT JOIN posts ON posts.user_id = media.user_id
|
|
343
|
-
GROUP BY user_id
|
|
344
|
-
`
|
|
345
|
-
);
|
|
346
|
-
query.having('COUNT(*)', 0);
|
|
347
|
-
const { sql, bindings } = query.compile();
|
|
348
|
-
expect(sql).toBe(
|
|
349
|
-
`
|
|
350
|
-
SELECT
|
|
351
|
-
user_id,
|
|
352
|
-
COUNT(*)
|
|
353
|
-
FROM media
|
|
354
|
-
LEFT JOIN posts ON posts.user_id = media.user_id
|
|
355
|
-
GROUP BY user_id
|
|
356
|
-
HAVING COUNT(*) = ?`.trim()
|
|
357
|
-
);
|
|
358
|
-
expect(bindings).toEqual([0]);
|
|
359
|
-
});
|
|
360
|
-
it('should handle 2 args with operator', () => {
|
|
361
|
-
const query = new SelectBuilder(
|
|
362
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id'
|
|
363
|
-
);
|
|
364
|
-
query.having('SUM(size) <=', 1024 * 1024);
|
|
365
|
-
const { sql, bindings } = query.compile();
|
|
366
|
-
expect(trim(sql)).toBe(
|
|
367
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id HAVING SUM(size) <= ?'
|
|
368
|
-
);
|
|
369
|
-
expect(bindings).toEqual([1024 * 1024]);
|
|
370
|
-
});
|
|
371
|
-
it('should handle 3 args', () => {
|
|
372
|
-
const query = new SelectBuilder(
|
|
373
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id'
|
|
374
|
-
);
|
|
375
|
-
query.having('SUM(size)', '<=', 1024 * 1024);
|
|
376
|
-
const { sql, bindings } = query.compile();
|
|
377
|
-
expect(trim(sql)).toBe(
|
|
378
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id HAVING SUM(size) <= ?'
|
|
379
|
-
);
|
|
380
|
-
expect(bindings).toEqual([1024 * 1024]);
|
|
381
|
-
});
|
|
382
|
-
it('should handle an object', () => {
|
|
383
|
-
const query = new SelectBuilder(
|
|
384
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id'
|
|
385
|
-
);
|
|
386
|
-
query.having({ 'SUM(size) <=': 1024 * 1024 });
|
|
387
|
-
const { sql, bindings } = query.compile();
|
|
388
|
-
expect(trim(sql)).toBe(
|
|
389
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id HAVING SUM(size) <= ?'
|
|
390
|
-
);
|
|
391
|
-
expect(bindings).toEqual([1024 * 1024]);
|
|
392
|
-
});
|
|
393
|
-
});
|
|
394
|
-
describe('orHaving()', () => {
|
|
395
|
-
it('should handle strings', () => {
|
|
396
|
-
const query = new SelectBuilder(
|
|
397
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id'
|
|
398
|
-
);
|
|
399
|
-
query.orHaving([['SUM(size) > 1024'], ['SUM(size) < 4096']]);
|
|
400
|
-
const { sql, bindings } = query.compile();
|
|
401
|
-
expect(trim(sql)).toBe(
|
|
402
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id HAVING (SUM(size) > 1024 OR SUM(size) < 4096)'
|
|
403
|
-
);
|
|
404
|
-
expect(bindings).toEqual([]);
|
|
405
|
-
});
|
|
406
|
-
it('should handle objects', () => {
|
|
407
|
-
const query = new SelectBuilder(
|
|
408
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id'
|
|
409
|
-
);
|
|
410
|
-
query.orHaving([{ 'SUM(size) >': 1024 }, { 'SUM(size) <': 4096 }]);
|
|
411
|
-
const { sql, bindings } = query.compile();
|
|
412
|
-
expect(trim(sql)).toBe(
|
|
413
|
-
'SELECT user_id, SUM(size) FROM media GROUP BY user_id HAVING (SUM(size) > ? OR SUM(size) < ?)'
|
|
414
|
-
);
|
|
415
|
-
expect(bindings).toEqual([1024, 4096]);
|
|
416
|
-
});
|
|
417
|
-
});
|
|
418
|
-
describe('whereBetween()', () => {
|
|
419
|
-
it('should handle whereBetween', () => {
|
|
420
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
421
|
-
query.whereBetween('age', [18, 35]);
|
|
422
|
-
const { sql, bindings } = query.compile();
|
|
423
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE age BETWEEN ? AND ?');
|
|
424
|
-
expect(bindings).toEqual([18, 35]);
|
|
425
|
-
});
|
|
426
|
-
it('should handle whereBetween with left value only', () => {
|
|
427
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
428
|
-
query.whereBetween('age', [18, null]);
|
|
429
|
-
const { sql, bindings } = query.compile();
|
|
430
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE age >= ?');
|
|
431
|
-
expect(bindings).toEqual([18]);
|
|
432
|
-
});
|
|
433
|
-
it('should handle whereBetween with right value only', () => {
|
|
434
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
435
|
-
query.whereBetween('age', [null, 35]);
|
|
436
|
-
const { sql, bindings } = query.compile();
|
|
437
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE age <= ?');
|
|
438
|
-
expect(bindings).toEqual([35]);
|
|
439
|
-
});
|
|
440
|
-
it('should omit expression if whereBetween has no values', () => {
|
|
441
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
442
|
-
query.whereBetween('age', [null, null]);
|
|
443
|
-
const { sql, bindings } = query.compile();
|
|
444
|
-
expect(trim(sql)).toBe('SELECT * FROM users');
|
|
445
|
-
expect(bindings).toEqual([]);
|
|
446
|
-
});
|
|
447
|
-
});
|
|
448
|
-
describe('sortField()', () => {
|
|
449
|
-
it('should handle simple columns', () => {
|
|
450
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
451
|
-
query.sortField('posts.created_at');
|
|
452
|
-
const { sql, bindings } = query.compile();
|
|
453
|
-
expect(trim(sql)).toBe('SELECT * FROM posts ORDER BY posts.created_at ASC');
|
|
454
|
-
expect(bindings).toEqual([]);
|
|
455
|
-
});
|
|
456
|
-
it('should handle minus signs', () => {
|
|
457
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
458
|
-
query.sortField('-posts.created_at');
|
|
459
|
-
const { sql, bindings } = query.compile();
|
|
460
|
-
expect(trim(sql)).toBe(
|
|
461
|
-
'SELECT * FROM posts ORDER BY posts.created_at DESC'
|
|
462
|
-
);
|
|
463
|
-
expect(bindings).toEqual([]);
|
|
464
|
-
});
|
|
465
|
-
it('should handle mapping', () => {
|
|
466
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
467
|
-
query.sortField('-created_at', {
|
|
468
|
-
created_at: 'posts.created_timestamp',
|
|
469
|
-
});
|
|
470
|
-
const { sql, bindings } = query.compile();
|
|
471
|
-
expect(trim(sql)).toBe(
|
|
472
|
-
'SELECT * FROM posts ORDER BY posts.created_timestamp DESC'
|
|
473
|
-
);
|
|
474
|
-
expect(bindings).toEqual([]);
|
|
475
|
-
});
|
|
476
|
-
});
|
|
477
|
-
describe('orderBy()', () => {
|
|
478
|
-
it('should handle simple columns', () => {
|
|
479
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
480
|
-
query.orderBy('posts.created_at');
|
|
481
|
-
const { sql, bindings } = query.compile();
|
|
482
|
-
expect(trim(sql)).toBe('SELECT * FROM posts ORDER BY posts.created_at');
|
|
483
|
-
expect(bindings).toEqual([]);
|
|
484
|
-
});
|
|
485
|
-
it('should handle simple columns with DESC', () => {
|
|
486
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
487
|
-
query.orderBy('posts.created_at', 'DESC');
|
|
488
|
-
const { sql, bindings } = query.compile();
|
|
489
|
-
expect(trim(sql)).toBe(
|
|
490
|
-
'SELECT * FROM posts ORDER BY posts.created_at DESC'
|
|
491
|
-
);
|
|
492
|
-
expect(bindings).toEqual([]);
|
|
493
|
-
});
|
|
494
|
-
it('should handle minus signs', () => {
|
|
495
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
496
|
-
query.orderBy('-posts.created_at');
|
|
497
|
-
const { sql, bindings } = query.compile();
|
|
498
|
-
expect(trim(sql)).toBe(
|
|
499
|
-
'SELECT * FROM posts ORDER BY posts.created_at DESC'
|
|
500
|
-
);
|
|
501
|
-
expect(bindings).toEqual([]);
|
|
502
|
-
});
|
|
503
|
-
it('should handle expressions', () => {
|
|
504
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
505
|
-
query.orderBy('COUNT(*)');
|
|
506
|
-
const { sql, bindings } = query.compile();
|
|
507
|
-
expect(trim(sql)).toBe('SELECT * FROM posts ORDER BY COUNT(*)');
|
|
508
|
-
expect(bindings).toEqual([]);
|
|
509
|
-
});
|
|
510
|
-
it('should handle expressions DESC', () => {
|
|
511
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
512
|
-
query.orderBy('COUNT(*) DESC');
|
|
513
|
-
const { sql, bindings } = query.compile();
|
|
514
|
-
expect(trim(sql)).toBe('SELECT * FROM posts ORDER BY COUNT(*) DESC');
|
|
515
|
-
expect(bindings).toEqual([]);
|
|
516
|
-
});
|
|
517
|
-
});
|
|
518
|
-
describe('LIMIT and OFFSET', () => {
|
|
519
|
-
it('should add both', () => {
|
|
520
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
521
|
-
query.limit(2);
|
|
522
|
-
query.offset(4);
|
|
523
|
-
const { sql, bindings } = query.compile();
|
|
524
|
-
expect(trim(sql)).toBe('SELECT * FROM posts OFFSET 4 LIMIT 2');
|
|
525
|
-
expect(bindings).toEqual([]);
|
|
526
|
-
});
|
|
527
|
-
it('should add both for mssql', () => {
|
|
528
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
529
|
-
query.limit(2);
|
|
530
|
-
query.offset(4);
|
|
531
|
-
const { sql, bindings } = query.compile({ engine: 'mssql' });
|
|
532
|
-
expect(trim(sql)).toBe(
|
|
533
|
-
'SELECT * FROM posts OFFSET 4 ROWS FETCH NEXT 2 ROWS ONLY'
|
|
534
|
-
);
|
|
535
|
-
expect(bindings).toEqual([]);
|
|
536
|
-
});
|
|
537
|
-
it('should add only limit', () => {
|
|
538
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
539
|
-
query.limit(2);
|
|
540
|
-
const { sql, bindings } = query.compile();
|
|
541
|
-
expect(trim(sql)).toBe('SELECT * FROM posts LIMIT 2');
|
|
542
|
-
expect(bindings).toEqual([]);
|
|
543
|
-
});
|
|
544
|
-
it('should add only offset', () => {
|
|
545
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
546
|
-
query.offset(4);
|
|
547
|
-
const { sql, bindings } = query.compile();
|
|
548
|
-
expect(trim(sql)).toBe('SELECT * FROM posts OFFSET 4');
|
|
549
|
-
expect(bindings).toEqual([]);
|
|
550
|
-
});
|
|
551
|
-
it('should add only offset as string', () => {
|
|
552
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
553
|
-
query.offset('4');
|
|
554
|
-
const { sql, bindings } = query.compile();
|
|
555
|
-
expect(trim(sql)).toBe('SELECT * FROM posts OFFSET 4');
|
|
556
|
-
expect(bindings).toEqual([]);
|
|
557
|
-
});
|
|
558
|
-
it('should error on offset NaN', () => {
|
|
559
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
560
|
-
const tryer = () => query.offset(NaN);
|
|
561
|
-
expect(tryer).toThrow();
|
|
562
|
-
});
|
|
563
|
-
it('should error on limit integer', () => {
|
|
564
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
565
|
-
const tryer = () => query.limit(3.5);
|
|
566
|
-
expect(tryer).toThrow();
|
|
567
|
-
});
|
|
568
|
-
});
|
|
569
|
-
describe('page()', () => {
|
|
570
|
-
it('should allow number', () => {
|
|
571
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
572
|
-
query.limit(10);
|
|
573
|
-
query.page(3);
|
|
574
|
-
const { sql, bindings } = query.compile();
|
|
575
|
-
expect(trim(sql)).toBe('SELECT * FROM posts OFFSET 20 LIMIT 10');
|
|
576
|
-
expect(bindings).toEqual([]);
|
|
577
|
-
});
|
|
578
|
-
it('should allow string digits', () => {
|
|
579
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
580
|
-
query.limit('10');
|
|
581
|
-
query.page('3');
|
|
582
|
-
const { sql, bindings } = query.compile();
|
|
583
|
-
expect(trim(sql)).toBe('SELECT * FROM posts OFFSET 20 LIMIT 10');
|
|
584
|
-
expect(bindings).toEqual([]);
|
|
585
|
-
});
|
|
586
|
-
it('should error on 0', () => {
|
|
587
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
588
|
-
const tryer = () => query.page(0);
|
|
589
|
-
expect(tryer).toThrow();
|
|
590
|
-
});
|
|
591
|
-
it('should error on -1', () => {
|
|
592
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
593
|
-
const tryer = () => query.page(0);
|
|
594
|
-
expect(tryer).toThrow();
|
|
595
|
-
});
|
|
596
|
-
it('should error on non-number', () => {
|
|
597
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
598
|
-
const tryer = () => query.page('foobar');
|
|
599
|
-
expect(tryer).toThrow();
|
|
600
|
-
});
|
|
601
|
-
});
|
|
602
|
-
describe('compileCount()', () => {
|
|
603
|
-
it('should handle a simple query', () => {
|
|
604
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
605
|
-
const { sql, bindings } = query.compileCount();
|
|
606
|
-
expect(trim(sql)).toBe('SELECT COUNT(*) AS found_rows FROM posts');
|
|
607
|
-
expect(bindings).toEqual([]);
|
|
608
|
-
});
|
|
609
|
-
it('should handle a distinct', () => {
|
|
610
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
611
|
-
const { sql, bindings } = query.compileCount({
|
|
612
|
-
countExpr: 'DISTINCT group_id',
|
|
613
|
-
engine: 'mysql',
|
|
614
|
-
});
|
|
615
|
-
expect(trim(sql)).toBe(
|
|
616
|
-
'SELECT COUNT(DISTINCT group_id) AS found_rows FROM posts'
|
|
617
|
-
);
|
|
618
|
-
expect(bindings).toEqual([]);
|
|
619
|
-
});
|
|
620
|
-
it('should work with WHERE', () => {
|
|
621
|
-
const query = new SelectBuilder('SELECT * FROM posts');
|
|
622
|
-
query.where('group_id', 123);
|
|
623
|
-
const { sql, bindings } = query.compileCount();
|
|
624
|
-
expect(trim(sql)).toBe(
|
|
625
|
-
'SELECT COUNT(*) AS found_rows FROM posts WHERE group_id = ?'
|
|
626
|
-
);
|
|
627
|
-
expect(bindings).toEqual([123]);
|
|
628
|
-
});
|
|
629
|
-
it('should work with HAVING', () => {
|
|
630
|
-
const origSql =
|
|
631
|
-
'SELECT category, COUNT(*) FROM posts GROUP BY category HAVING COUNT(*) > 1';
|
|
632
|
-
const query = new SelectBuilder(origSql);
|
|
633
|
-
const { sql, bindings } = query.compileCount();
|
|
634
|
-
expect(trim(sql)).toBe(
|
|
635
|
-
`SELECT COUNT(*) AS found_rows FROM ( ${origSql} ) AS subquery_results`
|
|
636
|
-
);
|
|
637
|
-
expect(bindings).toEqual([]);
|
|
638
|
-
});
|
|
639
|
-
});
|
|
640
|
-
|
|
641
|
-
describe('compileUnion()', () => {
|
|
642
|
-
it('should error on non-number', () => {
|
|
643
|
-
const query1 = new SelectBuilder(
|
|
644
|
-
'SELECT first, last, email FROM users WHERE org = :org AND group = :group',
|
|
645
|
-
{ org: 'ACME', group: 2 }
|
|
646
|
-
);
|
|
647
|
-
const query2 = new SelectBuilder(
|
|
648
|
-
'SELECT first, last, email FROM contacts WHERE org = :org AND group = :group',
|
|
649
|
-
{ org: 'ACME', group: 2 }
|
|
650
|
-
);
|
|
651
|
-
const { sql, bindings } = query1.compileUnion(query2, { engine: 'pg' });
|
|
652
|
-
expect(trim(sql)).toBe(
|
|
653
|
-
`(SELECT first, last, email FROM users WHERE org = $1 AND group = $2) UNION (SELECT first, last, email FROM contacts WHERE org = $3 AND group = $4)`
|
|
654
|
-
);
|
|
655
|
-
expect(bindings).toEqual(['ACME', 2, 'ACME', 2]);
|
|
656
|
-
});
|
|
657
|
-
});
|
|
658
|
-
describe('reset()', () => {
|
|
659
|
-
it('should reset all', () => {
|
|
660
|
-
const query = new SelectBuilder('SELECT id FROM a');
|
|
661
|
-
query.reset();
|
|
662
|
-
query.from('b');
|
|
663
|
-
const { sql, bindings } = query.compile();
|
|
664
|
-
expect(trim(sql)).toBe('SELECT * FROM b');
|
|
665
|
-
expect(bindings).toEqual([]);
|
|
666
|
-
});
|
|
667
|
-
it('should reset single field', () => {
|
|
668
|
-
const query = new SelectBuilder('SELECT id FROM a');
|
|
669
|
-
query.reset('table');
|
|
670
|
-
query.from('b');
|
|
671
|
-
const { sql, bindings } = query.compile();
|
|
672
|
-
expect(trim(sql)).toBe('SELECT id FROM b');
|
|
673
|
-
expect(bindings).toEqual([]);
|
|
674
|
-
});
|
|
675
|
-
it('should reset multiple fields', () => {
|
|
676
|
-
const query = new SelectBuilder('SELECT id FROM a');
|
|
677
|
-
query.reset(['table', 'column']);
|
|
678
|
-
query.from('b');
|
|
679
|
-
const { sql, bindings } = query.compile();
|
|
680
|
-
expect(trim(sql)).toBe('SELECT * FROM b');
|
|
681
|
-
expect(bindings).toEqual([]);
|
|
682
|
-
});
|
|
683
|
-
});
|
|
684
|
-
|
|
685
|
-
describe('join()', () => {
|
|
686
|
-
it('should allow generic join', () => {
|
|
687
|
-
const query = new SelectBuilder();
|
|
688
|
-
query.table('users u');
|
|
689
|
-
query.join('avatars a ON a.user_id = u.id');
|
|
690
|
-
const { sql, bindings } = query.compile();
|
|
691
|
-
expect(trim(sql)).toBe(
|
|
692
|
-
'SELECT * FROM users u JOIN avatars a ON a.user_id = u.id'
|
|
693
|
-
);
|
|
694
|
-
expect(bindings).toEqual([]);
|
|
695
|
-
});
|
|
696
|
-
it('should allow join with bindings', () => {
|
|
697
|
-
const query = new SelectBuilder();
|
|
698
|
-
query.table('users u');
|
|
699
|
-
query.leftJoin('avatars a ON a.user_id = u.id AND a.size = ?', [128]);
|
|
700
|
-
const { sql, bindings } = query.compile();
|
|
701
|
-
expect(trim(sql)).toBe(
|
|
702
|
-
'SELECT * FROM users u LEFT JOIN avatars a ON a.user_id = u.id AND a.size = ?'
|
|
703
|
-
);
|
|
704
|
-
expect(bindings).toEqual([128]);
|
|
705
|
-
});
|
|
706
|
-
it('should allow unjoin', () => {
|
|
707
|
-
const query = new SelectBuilder();
|
|
708
|
-
query.table('users u');
|
|
709
|
-
query.join('avatars a ON a.user_id = u.id');
|
|
710
|
-
query.join('permissions p ON p.user_id = u.id');
|
|
711
|
-
query.unjoin('permissions p');
|
|
712
|
-
const { sql, bindings } = query.compile();
|
|
713
|
-
expect(trim(sql)).toBe(
|
|
714
|
-
'SELECT * FROM users u JOIN avatars a ON a.user_id = u.id'
|
|
715
|
-
);
|
|
716
|
-
expect(bindings).toEqual([]);
|
|
717
|
-
});
|
|
718
|
-
it('should allow unjoin with array', () => {
|
|
719
|
-
const query = new SelectBuilder();
|
|
720
|
-
query.table('users u');
|
|
721
|
-
query.join('avatars a ON a.user_id = u.id');
|
|
722
|
-
query.join('permissions p ON p.user_id = u.id');
|
|
723
|
-
query.unjoin(['avatars', 'permissions p']);
|
|
724
|
-
const { sql, bindings } = query.compile();
|
|
725
|
-
expect(trim(sql)).toBe('SELECT * FROM users u');
|
|
726
|
-
expect(bindings).toEqual([]);
|
|
727
|
-
});
|
|
728
|
-
});
|
|
729
|
-
describe('options()', () => {
|
|
730
|
-
it('should add SQL_CALC_FOUND_ROWS', () => {
|
|
731
|
-
const query = new SelectBuilder();
|
|
732
|
-
query.table('users');
|
|
733
|
-
query.columns(['a', 'b']);
|
|
734
|
-
query.limit(10);
|
|
735
|
-
query.option('SQL_CALC_FOUND_ROWS');
|
|
736
|
-
const { sql, bindings } = query.compile();
|
|
737
|
-
expect(trim(sql)).toBe(
|
|
738
|
-
'SELECT SQL_CALC_FOUND_ROWS a, b FROM users LIMIT 10'
|
|
739
|
-
);
|
|
740
|
-
expect(bindings).toEqual([]);
|
|
741
|
-
});
|
|
742
|
-
});
|
|
743
|
-
describe('columns()', () => {
|
|
744
|
-
it('should allow 2', () => {
|
|
745
|
-
const query = new SelectBuilder();
|
|
746
|
-
query.table('users');
|
|
747
|
-
query.columns(['a', 'b']);
|
|
748
|
-
const { sql, bindings } = query.compile();
|
|
749
|
-
expect(trim(sql)).toBe('SELECT a, b FROM users');
|
|
750
|
-
expect(bindings).toEqual([]);
|
|
751
|
-
});
|
|
752
|
-
it('should have alias select()', () => {
|
|
753
|
-
const query = new SelectBuilder();
|
|
754
|
-
query.table('users');
|
|
755
|
-
query.select(['a', 'b']);
|
|
756
|
-
const { sql, bindings } = query.compile();
|
|
757
|
-
expect(trim(sql)).toBe('SELECT a, b FROM users');
|
|
758
|
-
expect(bindings).toEqual([]);
|
|
759
|
-
});
|
|
760
|
-
});
|
|
761
|
-
describe('tables()', () => {
|
|
762
|
-
it('should allow 2', () => {
|
|
763
|
-
const query = new SelectBuilder();
|
|
764
|
-
query.tables(['users', 'groups']);
|
|
765
|
-
const { sql, bindings } = query.compile();
|
|
766
|
-
expect(trim(sql)).toBe('SELECT * FROM users, groups');
|
|
767
|
-
expect(bindings).toEqual([]);
|
|
768
|
-
});
|
|
769
|
-
});
|
|
770
|
-
describe('setDefaultEngine()', () => {
|
|
771
|
-
it('should set ok', () => {
|
|
772
|
-
SelectBuilder.setDefaultEngine('pg');
|
|
773
|
-
const query = new SelectBuilder('SELECT * FROM users');
|
|
774
|
-
query.where('id', 123);
|
|
775
|
-
const { sql, bindings } = query.compile();
|
|
776
|
-
expect(trim(sql)).toBe('SELECT * FROM users WHERE id = $1');
|
|
777
|
-
expect(bindings).toEqual([123]);
|
|
778
|
-
|
|
779
|
-
// and set engine to something else then compile again
|
|
780
|
-
SelectBuilder.setDefaultEngine('oracle');
|
|
781
|
-
const compiled = query.compile();
|
|
782
|
-
expect(trim(compiled.sql)).toBe('SELECT * FROM users WHERE id = ?');
|
|
783
|
-
expect(compiled.bindings).toEqual([123]);
|
|
784
|
-
});
|
|
785
|
-
});
|