@stamhoofd/sql 2.1.1 → 2.2.0

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.
Files changed (48) hide show
  1. package/LICENSE +661 -0
  2. package/dist/index.d.ts +9 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +12 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/SQL.d.ts +56 -0
  7. package/dist/src/SQL.d.ts.map +1 -0
  8. package/dist/src/SQL.js +47 -0
  9. package/dist/src/SQL.js.map +1 -0
  10. package/dist/src/SQLExpression.d.ts +15 -0
  11. package/dist/src/SQLExpression.d.ts.map +1 -0
  12. package/dist/src/SQLExpression.js +23 -0
  13. package/dist/src/SQLExpression.js.map +1 -0
  14. package/dist/src/SQLExpressions.d.ts +88 -0
  15. package/dist/src/SQLExpressions.d.ts.map +1 -0
  16. package/dist/src/SQLExpressions.js +222 -0
  17. package/dist/src/SQLExpressions.js.map +1 -0
  18. package/dist/src/SQLJoin.d.ts +29 -0
  19. package/dist/src/SQLJoin.d.ts.map +1 -0
  20. package/dist/src/SQLJoin.js +40 -0
  21. package/dist/src/SQLJoin.js.map +1 -0
  22. package/dist/src/SQLJsonExpressions.d.ts +41 -0
  23. package/dist/src/SQLJsonExpressions.d.ts.map +1 -0
  24. package/dist/src/SQLJsonExpressions.js +95 -0
  25. package/dist/src/SQLJsonExpressions.js.map +1 -0
  26. package/dist/src/SQLOrderBy.d.ts +28 -0
  27. package/dist/src/SQLOrderBy.d.ts.map +1 -0
  28. package/dist/src/SQLOrderBy.js +50 -0
  29. package/dist/src/SQLOrderBy.js.map +1 -0
  30. package/dist/src/SQLSelect.d.ts +44 -0
  31. package/dist/src/SQLSelect.d.ts.map +1 -0
  32. package/dist/src/SQLSelect.js +124 -0
  33. package/dist/src/SQLSelect.js.map +1 -0
  34. package/dist/src/SQLWhere.d.ts +92 -0
  35. package/dist/src/SQLWhere.d.ts.map +1 -0
  36. package/dist/src/SQLWhere.js +269 -0
  37. package/dist/src/SQLWhere.js.map +1 -0
  38. package/dist/src/filters/SQLFilter.d.ts +17 -0
  39. package/dist/src/filters/SQLFilter.d.ts.map +1 -0
  40. package/dist/src/filters/SQLFilter.js +196 -0
  41. package/dist/src/filters/SQLFilter.js.map +1 -0
  42. package/dist/src/filters/SQLSorter.d.ts +9 -0
  43. package/dist/src/filters/SQLSorter.d.ts.map +1 -0
  44. package/dist/src/filters/SQLSorter.js +20 -0
  45. package/dist/src/filters/SQLSorter.js.map +1 -0
  46. package/package.json +5 -3
  47. package/src/SQLExpressions.ts +27 -0
  48. package/src/filters/SQLFilter.ts +9 -0
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SQLWhereNot = exports.SQLWhereOr = exports.SQLWhereAnd = exports.SQLWhereExists = exports.SQLWhereLike = exports.SQLWhereEqual = exports.SQLWhereSign = exports.SQLWhere = exports.addWhereHelpers = void 0;
4
+ const SQLExpression_1 = require("./SQLExpression");
5
+ const SQLExpressions_1 = require("./SQLExpressions");
6
+ function addWhereHelpers(Base) {
7
+ return class extends Base {
8
+ parseWhere(...[whereOrColumn, signOrValue, value]) {
9
+ if (signOrValue === undefined) {
10
+ return whereOrColumn;
11
+ }
12
+ if (value !== undefined) {
13
+ return new SQLWhereEqual(whereOrColumn, signOrValue, (0, SQLExpressions_1.readDynamicSQLExpression)(value));
14
+ }
15
+ return new SQLWhereEqual(whereOrColumn, SQLWhereSign.Equal, (0, SQLExpressions_1.readDynamicSQLExpression)(signOrValue));
16
+ }
17
+ where(...args) {
18
+ const w = this.parseWhere(...args);
19
+ if (!this._where) {
20
+ this._where = w;
21
+ return this;
22
+ }
23
+ this._where = this._where.and(w);
24
+ return this;
25
+ }
26
+ andWhere(...args) {
27
+ return this.where(...args);
28
+ }
29
+ orWhere(...args) {
30
+ const w = this.parseWhere(...args);
31
+ if (!this._where) {
32
+ this._where = w;
33
+ return this;
34
+ }
35
+ this._where = this._where.or(w);
36
+ return this;
37
+ }
38
+ whereNot(...args) {
39
+ const w = new SQLWhereNot(this.parseWhere(...args));
40
+ if (!this._where) {
41
+ this._where = w;
42
+ return this;
43
+ }
44
+ this._where = this._where.and(w);
45
+ return this;
46
+ }
47
+ andWhereNot(...args) {
48
+ return this.whereNot(...args);
49
+ }
50
+ orWhereNot(...args) {
51
+ const w = new SQLWhereNot(this.parseWhere(...args));
52
+ if (!this._where) {
53
+ this._where = w;
54
+ return this;
55
+ }
56
+ this._where = this._where.or(w);
57
+ return this;
58
+ }
59
+ };
60
+ }
61
+ exports.addWhereHelpers = addWhereHelpers;
62
+ class SQLWhere {
63
+ and(...where) {
64
+ return new SQLWhereAnd([this, ...where]);
65
+ }
66
+ or(...where) {
67
+ return new SQLWhereOr([this, ...where]);
68
+ }
69
+ get isSingle() {
70
+ return false;
71
+ }
72
+ }
73
+ exports.SQLWhere = SQLWhere;
74
+ var SQLWhereSign;
75
+ (function (SQLWhereSign) {
76
+ SQLWhereSign["Equal"] = "=";
77
+ SQLWhereSign["Greater"] = ">";
78
+ SQLWhereSign["Less"] = "<";
79
+ SQLWhereSign["NotEqual"] = "!=";
80
+ })(SQLWhereSign || (exports.SQLWhereSign = SQLWhereSign = {}));
81
+ class SQLWhereEqual extends SQLWhere {
82
+ constructor(column, signOrValue, value) {
83
+ super();
84
+ this.sign = SQLWhereSign.Equal;
85
+ this.column = column;
86
+ if (value !== undefined) {
87
+ this.value = value;
88
+ this.sign = signOrValue;
89
+ }
90
+ else {
91
+ this.value = signOrValue;
92
+ }
93
+ }
94
+ clone() {
95
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
96
+ const c = (new this.constructor(this.column, this.sign, this.value));
97
+ Object.assign(c, this);
98
+ return c;
99
+ }
100
+ get isSingle() {
101
+ return true;
102
+ }
103
+ inverted() {
104
+ return this.clone().invert();
105
+ }
106
+ invert() {
107
+ switch (this.sign) {
108
+ case SQLWhereSign.Equal:
109
+ this.sign = SQLWhereSign.NotEqual;
110
+ break;
111
+ case SQLWhereSign.NotEqual:
112
+ this.sign = SQLWhereSign.Equal;
113
+ break;
114
+ case SQLWhereSign.Greater:
115
+ this.sign = SQLWhereSign.Less;
116
+ break;
117
+ case SQLWhereSign.Less:
118
+ this.sign = SQLWhereSign.Greater;
119
+ break;
120
+ }
121
+ return this;
122
+ }
123
+ getSQL(options) {
124
+ if (this.value instanceof SQLExpressions_1.SQLArray) {
125
+ if (this.sign !== SQLWhereSign.Equal && this.sign !== SQLWhereSign.NotEqual) {
126
+ throw new Error('Unsupported sign for array: ' + this.sign);
127
+ }
128
+ return (0, SQLExpression_1.joinSQLQuery)([
129
+ this.column.getSQL(options),
130
+ ` ${(this.sign === SQLWhereSign.NotEqual) ? 'NOT IN' : 'IN'} `,
131
+ this.value.getSQL(options)
132
+ ]);
133
+ }
134
+ if (this.value instanceof SQLExpressions_1.SQLNull) {
135
+ if (this.sign !== SQLWhereSign.Equal && this.sign !== SQLWhereSign.NotEqual) {
136
+ throw new Error('Unsupported sign for NULL: ' + this.sign);
137
+ }
138
+ return (0, SQLExpression_1.joinSQLQuery)([
139
+ this.column.getSQL(options),
140
+ ` IS ${(this.sign === SQLWhereSign.NotEqual) ? 'NOT ' : ''} `,
141
+ this.value.getSQL(options)
142
+ ]);
143
+ }
144
+ return (0, SQLExpression_1.joinSQLQuery)([
145
+ this.column.getSQL(options),
146
+ ` ${this.sign} `,
147
+ this.value.getSQL(options)
148
+ ]);
149
+ }
150
+ }
151
+ exports.SQLWhereEqual = SQLWhereEqual;
152
+ class SQLWhereLike extends SQLWhere {
153
+ constructor(column, value) {
154
+ super();
155
+ this.notLike = false;
156
+ this.column = column;
157
+ this.value = value;
158
+ }
159
+ static escape(str) {
160
+ return str.replace(/([%_])/g, '\\$1');
161
+ }
162
+ clone() {
163
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
164
+ const c = (new this.constructor(this.column, this.value));
165
+ Object.assign(c, this);
166
+ return c;
167
+ }
168
+ get isSingle() {
169
+ return true;
170
+ }
171
+ inverted() {
172
+ return this.clone().invert();
173
+ }
174
+ invert() {
175
+ this.notLike = !this.notLike;
176
+ return this;
177
+ }
178
+ getSQL(options) {
179
+ return (0, SQLExpression_1.joinSQLQuery)([
180
+ this.column.getSQL(options),
181
+ ` ${this.notLike ? 'NOT LIKE' : 'LIKE'} `,
182
+ this.value.getSQL(options)
183
+ ]);
184
+ }
185
+ }
186
+ exports.SQLWhereLike = SQLWhereLike;
187
+ class SQLWhereExists extends SQLWhere {
188
+ constructor(subquery) {
189
+ super();
190
+ this.notExists = false;
191
+ this.subquery = subquery;
192
+ }
193
+ clone() {
194
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
195
+ const c = (new this.constructor(this.subquery));
196
+ Object.assign(c, this);
197
+ return c;
198
+ }
199
+ get isSingle() {
200
+ return true;
201
+ }
202
+ inverted() {
203
+ return this.clone().invert();
204
+ }
205
+ invert() {
206
+ this.notExists = !this.notExists;
207
+ return this;
208
+ }
209
+ getSQL(options) {
210
+ return (0, SQLExpression_1.joinSQLQuery)([
211
+ `${this.notExists ? 'NOT EXISTS' : 'EXISTS'} (`,
212
+ this.subquery.getSQL({ ...options }),
213
+ `)`,
214
+ ]);
215
+ }
216
+ }
217
+ exports.SQLWhereExists = SQLWhereExists;
218
+ class SQLWhereAnd extends SQLWhere {
219
+ constructor(children) {
220
+ super();
221
+ this.children = children;
222
+ }
223
+ getSQL(options) {
224
+ return (0, SQLExpression_1.joinSQLQuery)(this.children.map(c => {
225
+ if (c.isSingle) {
226
+ return c.getSQL(options);
227
+ }
228
+ return (0, SQLExpression_1.joinSQLQuery)(['(', c.getSQL(options), ')']);
229
+ }), ' AND ');
230
+ }
231
+ }
232
+ exports.SQLWhereAnd = SQLWhereAnd;
233
+ class SQLWhereOr extends SQLWhere {
234
+ constructor(children) {
235
+ super();
236
+ this.children = children;
237
+ }
238
+ getSQL(options) {
239
+ return (0, SQLExpression_1.joinSQLQuery)(this.children.map(c => {
240
+ if (c.isSingle) {
241
+ return c.getSQL(options);
242
+ }
243
+ return (0, SQLExpression_1.joinSQLQuery)(['(', c.getSQL(options), ')']);
244
+ }), ' OR ');
245
+ }
246
+ }
247
+ exports.SQLWhereOr = SQLWhereOr;
248
+ class SQLWhereNot extends SQLWhere {
249
+ constructor(a) {
250
+ super();
251
+ this.a = a;
252
+ }
253
+ get isSingle() {
254
+ return this.a.isSingle;
255
+ }
256
+ getSQL(options) {
257
+ // Optimize query
258
+ if (this.a instanceof SQLWhereEqual) {
259
+ return this.a.inverted().getSQL(options);
260
+ }
261
+ const sqlA = (0, SQLExpression_1.normalizeSQLQuery)(this.a.getSQL(options));
262
+ return {
263
+ query: `NOT (${sqlA.query})`,
264
+ params: sqlA.params
265
+ };
266
+ }
267
+ }
268
+ exports.SQLWhereNot = SQLWhereNot;
269
+ //# sourceMappingURL=SQLWhere.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLWhere.js","sourceRoot":"","sources":["../../src/SQLWhere.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { StamhoofdFilter } from "@stamhoofd/structures";
2
+ import { SQLExpression } from "../SQLExpression";
3
+ import { SQLColumnExpression, SQLScalarValue } from "../SQLExpressions";
4
+ import { SQLSelect } from "../SQLSelect";
5
+ import { SQLWhere } from "../SQLWhere";
6
+ export type SQLFilterCompiler = (filter: StamhoofdFilter, filters: SQLFilterDefinitions) => SQLWhere | null;
7
+ export type SQLFilterDefinitions = Record<string, SQLFilterCompiler>;
8
+ export declare function andSQLFilterCompiler(filter: StamhoofdFilter, filters: SQLFilterDefinitions): SQLWhere;
9
+ export declare function orSQLFilterCompiler(filter: StamhoofdFilter, filters: SQLFilterDefinitions): SQLWhere;
10
+ export declare function notSQLFilterCompiler(filter: StamhoofdFilter, filters: SQLFilterDefinitions): SQLWhere;
11
+ export declare function createSQLRelationFilterCompiler(baseSelect: InstanceType<typeof SQLSelect> & SQLExpression, definitions: SQLFilterDefinitions): SQLFilterCompiler;
12
+ export declare function createSQLFilterNamespace(definitions: SQLFilterDefinitions): SQLFilterCompiler;
13
+ export declare function createSQLExpressionFilterCompiler(sqlExpression: SQLExpression, normalizeValue?: (v: SQLScalarValue | null) => SQLScalarValue | null, isJSONValue?: boolean, isJSONObject?: boolean): SQLFilterCompiler;
14
+ export declare function createSQLColumnFilterCompiler(name: string | SQLColumnExpression, normalizeValue?: (v: SQLScalarValue | null) => SQLScalarValue | null): SQLFilterCompiler;
15
+ export declare const baseSQLFilterCompilers: SQLFilterDefinitions;
16
+ export declare const compileToSQLFilter: typeof andSQLFilterCompiler;
17
+ //# sourceMappingURL=SQLFilter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLFilter.d.ts","sourceRoot":"","sources":["../../../src/filters/SQLFilter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAA2B,MAAM,uBAAuB,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAY,mBAAmB,EAAyB,cAAc,EAAoD,MAAM,mBAAmB,CAAC;AAE3J,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAmG,MAAM,aAAa,CAAC;AAExI,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,oBAAoB,KAAK,QAAQ,GAAC,IAAI,CAAC;AAC1G,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;AAEpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,oBAAoB,GAAG,QAAQ,CAGrG;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,oBAAoB,GAAG,QAAQ,CAGpG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,oBAAoB,GAAG,QAAQ,CAGrG;AAqBD,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,aAAa,EAAE,WAAW,EAAE,oBAAoB,GAAG,iBAAiB,CAYhK;AAGD,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,oBAAoB,GAAG,iBAAiB,CAI7F;AAED,wBAAgB,iCAAiC,CAAC,aAAa,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,GAAC,IAAI,KAAK,cAAc,GAAC,IAAI,EAAE,WAAW,UAAQ,EAAE,YAAY,UAAQ,GAAG,iBAAiB,CA2J9M;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,GAAC,IAAI,KAAK,cAAc,GAAC,IAAI,GAAG,iBAAiB,CAGrK;AAED,eAAO,MAAM,sBAAsB,EAAE,oBAIpC,CAAA;AAuCD,eAAO,MAAM,kBAAkB,6BAAuB,CAAA"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compileToSQLFilter = exports.baseSQLFilterCompilers = exports.createSQLColumnFilterCompiler = exports.createSQLExpressionFilterCompiler = exports.createSQLFilterNamespace = exports.createSQLRelationFilterCompiler = exports.notSQLFilterCompiler = exports.orSQLFilterCompiler = exports.andSQLFilterCompiler = void 0;
4
+ const simple_errors_1 = require("@simonbackx/simple-errors");
5
+ const SQL_1 = require("../SQL");
6
+ const SQLExpressions_1 = require("../SQLExpressions");
7
+ const SQLJsonExpressions_1 = require("../SQLJsonExpressions");
8
+ const SQLWhere_1 = require("../SQLWhere");
9
+ function andSQLFilterCompiler(filter, filters) {
10
+ const runners = compileSQLFilter(filter, filters);
11
+ return new SQLWhere_1.SQLWhereAnd(runners);
12
+ }
13
+ exports.andSQLFilterCompiler = andSQLFilterCompiler;
14
+ function orSQLFilterCompiler(filter, filters) {
15
+ const runners = compileSQLFilter(filter, filters);
16
+ return new SQLWhere_1.SQLWhereOr(runners);
17
+ }
18
+ exports.orSQLFilterCompiler = orSQLFilterCompiler;
19
+ function notSQLFilterCompiler(filter, filters) {
20
+ const andRunner = andSQLFilterCompiler(filter, filters);
21
+ return new SQLWhere_1.SQLWhereNot(andRunner);
22
+ }
23
+ exports.notSQLFilterCompiler = notSQLFilterCompiler;
24
+ function guardScalar(s) {
25
+ if (typeof s !== 'string' && typeof s !== 'number' && typeof s !== 'boolean' && !(s instanceof Date) && s !== null) {
26
+ throw new Error('Invalid scalar value');
27
+ }
28
+ }
29
+ function guardNotNullScalar(s) {
30
+ if (typeof s !== 'string' && typeof s !== 'number' && typeof s !== 'boolean' && !(s instanceof Date)) {
31
+ throw new Error('Invalid scalar value');
32
+ }
33
+ }
34
+ function guardString(s) {
35
+ if (typeof s !== 'string') {
36
+ throw new Error('Invalid string value');
37
+ }
38
+ }
39
+ function createSQLRelationFilterCompiler(baseSelect, definitions) {
40
+ return (filter) => {
41
+ const f = filter;
42
+ if ('$elemMatch' in f) {
43
+ const w = (0, exports.compileToSQLFilter)(f['$elemMatch'], definitions);
44
+ const q = baseSelect.clone().where(w);
45
+ return new SQLWhere_1.SQLWhereExists(q);
46
+ }
47
+ throw new Error('Invalid filter');
48
+ };
49
+ }
50
+ exports.createSQLRelationFilterCompiler = createSQLRelationFilterCompiler;
51
+ // Already joined, but creates a namespace
52
+ function createSQLFilterNamespace(definitions) {
53
+ return (filter) => {
54
+ return andSQLFilterCompiler(filter, definitions);
55
+ };
56
+ }
57
+ exports.createSQLFilterNamespace = createSQLFilterNamespace;
58
+ function createSQLExpressionFilterCompiler(sqlExpression, normalizeValue, isJSONValue = false, isJSONObject = false) {
59
+ const norm = normalizeValue !== null && normalizeValue !== void 0 ? normalizeValue : ((v) => v);
60
+ const convertToExpression = isJSONValue ? SQLExpressions_1.scalarToSQLJSONExpression : SQLExpressions_1.scalarToSQLExpression;
61
+ return (filter, filters) => {
62
+ if (typeof filter === 'string' || typeof filter === 'number' || typeof filter === 'boolean' || filter === null || filter === undefined) {
63
+ filter = {
64
+ $eq: filter
65
+ };
66
+ }
67
+ if (Array.isArray(filter)) {
68
+ throw new Error('Unexpected array in filter');
69
+ }
70
+ const f = filter;
71
+ if ('$eq' in f) {
72
+ guardScalar(f.$eq);
73
+ if (isJSONObject) {
74
+ const v = norm(f.$eq);
75
+ // if (typeof v === 'string') {
76
+ // return new SQLWhereEqual(
77
+ // new SQLJsonSearch(sqlExpression, 'one', convertToExpression(v)),
78
+ // SQLWhereSign.NotEqual,
79
+ // new SQLNull()
80
+ // );
81
+ // }
82
+ // else
83
+ return new SQLWhere_1.SQLWhereEqual(new SQLJsonExpressions_1.SQLJsonContains(sqlExpression, convertToExpression(JSON.stringify(v))), SQLWhere_1.SQLWhereSign.Equal, new SQLExpressions_1.SQLSafeValue(1));
84
+ }
85
+ return new SQLWhere_1.SQLWhereEqual(sqlExpression, SQLWhere_1.SQLWhereSign.Equal, convertToExpression(norm(f.$eq)));
86
+ }
87
+ if ('$in' in f) {
88
+ if (!Array.isArray(f.$in)) {
89
+ throw new simple_errors_1.SimpleError({
90
+ code: 'invalid_filter',
91
+ message: 'Expected array at $in filter'
92
+ });
93
+ }
94
+ if (f.$in.length === 0) {
95
+ return new SQLWhere_1.SQLWhereEqual(new SQLExpressions_1.SQLSafeValue(1), SQLWhere_1.SQLWhereSign.Equal, new SQLExpressions_1.SQLSafeValue(0));
96
+ }
97
+ const v = f.$in.map(a => norm(a));
98
+ if (isJSONObject) {
99
+ // else
100
+ return new SQLWhere_1.SQLWhereEqual(new SQLJsonExpressions_1.SQLJsonOverlaps(sqlExpression, convertToExpression(JSON.stringify(v))), SQLWhere_1.SQLWhereSign.Equal, new SQLExpressions_1.SQLSafeValue(1));
101
+ }
102
+ return new SQLWhere_1.SQLWhereEqual(sqlExpression, SQLWhere_1.SQLWhereSign.Equal, new SQLExpressions_1.SQLArray(v));
103
+ }
104
+ if ('$neq' in f) {
105
+ guardScalar(f.$neq);
106
+ if (isJSONObject) {
107
+ const v = norm(f.$eq);
108
+ // if (typeof v === 'string') {
109
+ // return new SQLWhereEqual(
110
+ // new SQLJsonSearch(sqlExpression, 'one', convertToExpression(v)),
111
+ // SQLWhereSign.Equal,
112
+ // new SQLNull()
113
+ // );
114
+ // }
115
+ // else
116
+ return new SQLWhere_1.SQLWhereEqual(new SQLJsonExpressions_1.SQLJsonContains(sqlExpression, convertToExpression(JSON.stringify(v))), SQLWhere_1.SQLWhereSign.Equal, new SQLExpressions_1.SQLSafeValue(0));
117
+ }
118
+ return new SQLWhere_1.SQLWhereEqual(sqlExpression, SQLWhere_1.SQLWhereSign.NotEqual, convertToExpression(norm(f.$neq)));
119
+ }
120
+ if ('$gt' in f) {
121
+ guardScalar(f.$gt);
122
+ if (isJSONObject) {
123
+ throw new Error('Greater than is not supported in this place');
124
+ }
125
+ if (f.$gt === null) {
126
+ // > null is same as not equal to null (everything is larger than null in mysql) - to be consistent with order by behaviour
127
+ return new SQLWhere_1.SQLWhereEqual(sqlExpression, SQLWhere_1.SQLWhereSign.NotEqual, convertToExpression(null));
128
+ }
129
+ return new SQLWhere_1.SQLWhereEqual(sqlExpression, SQLWhere_1.SQLWhereSign.Greater, convertToExpression(norm(f.$gt)));
130
+ }
131
+ if ('$lt' in f) {
132
+ guardScalar(f.$lt);
133
+ if (isJSONObject) {
134
+ throw new Error('Less than is not supported in this place');
135
+ }
136
+ if (f.$lt === null) {
137
+ // < null is always nothing, there is nothing smaller than null in MySQL - to be consistent with order by behaviour
138
+ return new SQLWhere_1.SQLWhereEqual(new SQLExpressions_1.SQLSafeValue(1), SQLWhere_1.SQLWhereSign.Equal, new SQLExpressions_1.SQLSafeValue(0));
139
+ }
140
+ return new SQLWhere_1.SQLWhereEqual(sqlExpression, SQLWhere_1.SQLWhereSign.Less, convertToExpression(norm(f.$lt)));
141
+ }
142
+ if ('$contains' in f) {
143
+ guardString(f.$contains);
144
+ if (isJSONObject) {
145
+ return new SQLWhere_1.SQLWhereEqual(new SQLJsonExpressions_1.SQLJsonSearch(sqlExpression, 'one', convertToExpression('%' + SQLWhere_1.SQLWhereLike.escape(f.$contains) + '%')), SQLWhere_1.SQLWhereSign.NotEqual, new SQLExpressions_1.SQLNull());
146
+ }
147
+ return new SQLWhere_1.SQLWhereLike(sqlExpression, convertToExpression('%' + SQLWhere_1.SQLWhereLike.escape(f.$contains) + '%'));
148
+ }
149
+ throw new Error('Invalid filter ' + JSON.stringify(f));
150
+ };
151
+ }
152
+ exports.createSQLExpressionFilterCompiler = createSQLExpressionFilterCompiler;
153
+ function createSQLColumnFilterCompiler(name, normalizeValue) {
154
+ const column = name instanceof SQLExpressions_1.SQLColumnExpression ? name : SQL_1.SQL.column(name);
155
+ return createSQLExpressionFilterCompiler(column, normalizeValue);
156
+ }
157
+ exports.createSQLColumnFilterCompiler = createSQLColumnFilterCompiler;
158
+ exports.baseSQLFilterCompilers = {
159
+ '$and': andSQLFilterCompiler,
160
+ '$or': orSQLFilterCompiler,
161
+ '$not': notSQLFilterCompiler,
162
+ };
163
+ function compileSQLFilter(filter, definitions) {
164
+ if (filter === undefined) {
165
+ return [];
166
+ }
167
+ const runners = [];
168
+ for (const f of (Array.isArray(filter) ? filter : [filter])) {
169
+ if (!f) {
170
+ continue;
171
+ }
172
+ if (Object.keys(f).length > 1) {
173
+ // Multiple keys in the same object should always be combined with AND
174
+ const splitted = [];
175
+ for (const key of Object.keys(f)) {
176
+ splitted.push({ [key]: f[key] });
177
+ }
178
+ runners.push(andSQLFilterCompiler(splitted, definitions));
179
+ continue;
180
+ }
181
+ for (const key of Object.keys(f)) {
182
+ const filter = definitions[key];
183
+ if (!filter) {
184
+ throw new Error('Unsupported filter ' + key);
185
+ }
186
+ const s = filter(f[key], definitions);
187
+ if (s === undefined || s === null) {
188
+ throw new Error('Unsupported filter value for ' + key);
189
+ }
190
+ runners.push(s);
191
+ }
192
+ }
193
+ return runners;
194
+ }
195
+ exports.compileToSQLFilter = andSQLFilterCompiler;
196
+ //# sourceMappingURL=SQLFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLFilter.js","sourceRoot":"","sources":["../../../src/filters/SQLFilter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { PlainObject } from "@simonbackx/simple-encoding";
2
+ import { SortDefinition, SortList } from "@stamhoofd/structures";
3
+ import { SQLOrderBy, SQLOrderByDirection } from "../SQLOrderBy";
4
+ export type SQLSortDefinition<T, B extends PlainObject = PlainObject> = SortDefinition<T, B> & {
5
+ toSQL(direction: SQLOrderByDirection): SQLOrderBy;
6
+ };
7
+ export type SQLSortDefinitions<T = any> = Record<string, SQLSortDefinition<T>>;
8
+ export declare function compileToSQLSorter(sortBy: SortList, definitions: SQLSortDefinitions): SQLOrderBy;
9
+ //# sourceMappingURL=SQLSorter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLSorter.d.ts","sourceRoot":"","sources":["../../../src/filters/SQLSorter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEhE,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IAC3F,KAAK,CAAC,SAAS,EAAE,mBAAmB,GAAG,UAAU,CAAA;CACpD,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;AAE9E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,GAAG,UAAU,CAiBhG"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compileToSQLSorter = void 0;
4
+ const SQLOrderBy_1 = require("../SQLOrderBy");
5
+ function compileToSQLSorter(sortBy, definitions) {
6
+ const sorters = [];
7
+ for (const s of sortBy) {
8
+ const d = definitions[s.key];
9
+ if (!d) {
10
+ throw new Error('Unknown sort key ' + s.key);
11
+ }
12
+ sorters.push(d.toSQL(s.order));
13
+ }
14
+ if (sorters.length === 0) {
15
+ throw new Error('No sortBy passed');
16
+ }
17
+ return SQLOrderBy_1.SQLOrderBy.combine(sorters);
18
+ }
19
+ exports.compileToSQLSorter = compileToSQLSorter;
20
+ //# sourceMappingURL=SQLSorter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLSorter.js","sourceRoot":"","sources":["../../../src/filters/SQLSorter.ts"],"names":[],"mappings":";;;AAGA,8CAAgE;AAQhE,SAAgB,kBAAkB,CAAC,MAAgB,EAAE,WAA+B;IAChF,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QAChD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACvC,CAAC;IAED,OAAO,uBAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC;AAjBD,gDAiBC"}
package/package.json CHANGED
@@ -1,15 +1,17 @@
1
1
  {
2
2
  "name": "@stamhoofd/sql",
3
- "version": "2.1.1",
3
+ "version": "2.2.0",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "license": "UNLICENCED",
7
7
  "sideEffects": false,
8
8
  "files": [
9
- "src"
9
+ "src",
10
+ "dist"
10
11
  ],
11
12
  "scripts": {
12
13
  "build": "tsc -b",
13
14
  "build:full": "rm -rf ./dist && yarn build"
14
- }
15
+ },
16
+ "gitHead": "d67b2ac7c63880195902d29df682a2f2a709b82b"
15
17
  }
@@ -42,7 +42,20 @@ export function readDynamicSQLExpression(s: SQLDynamicExpression): SQLExpression
42
42
 
43
43
  return new SQLScalar(s)
44
44
  }
45
+ export class SQLDistinct implements SQLExpression {
46
+ expression: SQLExpression
47
+
48
+ constructor(expression: SQLExpression) {
49
+ this.expression = expression
50
+ }
45
51
 
52
+ getSQL(options?: SQLExpressionOptions): SQLQuery {
53
+ return joinSQLQuery([
54
+ 'DISTINCT',
55
+ this.expression.getSQL(options),
56
+ ])
57
+ }
58
+ }
46
59
  export class SQLCount implements SQLExpression {
47
60
  expression: SQLExpression|null
48
61
 
@@ -58,7 +71,21 @@ export class SQLCount implements SQLExpression {
58
71
  ])
59
72
  }
60
73
  }
74
+ export class SQLSum implements SQLExpression {
75
+ expression: SQLExpression
76
+
77
+ constructor(expression: SQLExpression) {
78
+ this.expression = expression
79
+ }
61
80
 
81
+ getSQL(options?: SQLExpressionOptions): SQLQuery {
82
+ return joinSQLQuery([
83
+ 'SUM(',
84
+ this.expression.getSQL(options),
85
+ ')'
86
+ ])
87
+ }
88
+ }
62
89
  export class SQLSelectAs implements SQLExpression {
63
90
  expression: SQLExpression
64
91
  as: SQLAlias
@@ -244,6 +244,15 @@ function compileSQLFilter(filter: StamhoofdFilter, definitions: SQLFilterDefinit
244
244
  if (!f) {
245
245
  continue;
246
246
  }
247
+ if (Object.keys(f).length > 1) {
248
+ // Multiple keys in the same object should always be combined with AND
249
+ const splitted: StamhoofdFilter[] = [];
250
+ for (const key of Object.keys(f)) {
251
+ splitted.push({ [key]: f[key] })
252
+ }
253
+ runners.push(andSQLFilterCompiler(splitted, definitions));
254
+ continue;
255
+ }
247
256
  for (const key of Object.keys(f)) {
248
257
  const filter = definitions[key];
249
258
  if (!filter) {