@stamhoofd/sql 2.89.2 → 2.90.1
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/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -10
- package/dist/index.js.map +1 -1
- package/dist/src/SQLJsonExpressions.d.ts +2 -0
- package/dist/src/SQLJsonExpressions.d.ts.map +1 -1
- package/dist/src/SQLJsonExpressions.js +8 -0
- package/dist/src/SQLJsonExpressions.js.map +1 -1
- package/dist/src/SQLSelect.d.ts.map +1 -1
- package/dist/src/SQLSelect.js +7 -0
- package/dist/src/SQLSelect.js.map +1 -1
- package/dist/src/SQLWhere.d.ts +6 -0
- package/dist/src/SQLWhere.d.ts.map +1 -1
- package/dist/src/SQLWhere.js +39 -1
- package/dist/src/SQLWhere.js.map +1 -1
- package/dist/src/filters/SQLFilter.d.ts +61 -25
- package/dist/src/filters/SQLFilter.d.ts.map +1 -1
- package/dist/src/filters/SQLFilter.js +183 -380
- package/dist/src/filters/SQLFilter.js.map +1 -1
- package/dist/src/filters/{modern/compilers → compilers}/contains.d.ts +1 -1
- package/dist/src/filters/compilers/contains.d.ts.map +1 -0
- package/dist/src/filters/{modern/compilers → compilers}/contains.js +6 -6
- package/dist/src/filters/compilers/contains.js.map +1 -0
- package/dist/src/filters/{modern/compilers → compilers}/equals.d.ts +1 -1
- package/dist/src/filters/compilers/equals.d.ts.map +1 -0
- package/dist/src/filters/{modern/compilers → compilers}/equals.js +7 -7
- package/dist/src/filters/compilers/equals.js.map +1 -0
- package/dist/src/filters/{modern/compilers → compilers}/greater.d.ts +1 -1
- package/dist/src/filters/compilers/greater.d.ts.map +1 -0
- package/dist/src/filters/{modern/compilers → compilers}/greater.js +4 -4
- package/dist/src/filters/compilers/greater.js.map +1 -0
- package/dist/src/filters/{modern/compilers → compilers}/in.d.ts +1 -1
- package/dist/src/filters/compilers/in.d.ts.map +1 -0
- package/dist/src/filters/{modern/compilers → compilers}/in.js +7 -7
- package/dist/src/filters/compilers/in.js.map +1 -0
- package/dist/src/filters/compilers/index.d.ts.map +1 -0
- package/dist/src/filters/compilers/index.js.map +1 -0
- package/dist/src/filters/{modern/compilers → compilers}/less.d.ts +1 -1
- package/dist/src/filters/compilers/less.d.ts.map +1 -0
- package/dist/src/filters/{modern/compilers → compilers}/less.js +4 -4
- package/dist/src/filters/compilers/less.js.map +1 -0
- package/dist/src/filters/helpers/isJSONColumn.d.ts +4 -0
- package/dist/src/filters/helpers/isJSONColumn.d.ts.map +1 -0
- package/dist/src/filters/helpers/isJSONColumn.js +16 -0
- package/dist/src/filters/helpers/isJSONColumn.js.map +1 -0
- package/dist/src/filters/{modern/helpers → helpers}/normalizeCompareValue.d.ts +2 -2
- package/dist/src/filters/helpers/normalizeCompareValue.d.ts.map +1 -0
- package/dist/src/filters/{modern/helpers → helpers}/normalizeCompareValue.js +18 -13
- package/dist/src/filters/helpers/normalizeCompareValue.js.map +1 -0
- package/dist/tests/filters/$and.test.js +49 -18
- package/dist/tests/filters/$and.test.js.map +1 -1
- package/dist/tests/filters/$contains.test.js +20 -20
- package/dist/tests/filters/$contains.test.js.map +1 -1
- package/dist/tests/filters/$eq.test.js +59 -53
- package/dist/tests/filters/$eq.test.js.map +1 -1
- package/dist/tests/filters/$gt.test.js +18 -18
- package/dist/tests/filters/$gt.test.js.map +1 -1
- package/dist/tests/filters/$gte.test.js +14 -14
- package/dist/tests/filters/$gte.test.js.map +1 -1
- package/dist/tests/filters/$in.test.js +24 -24
- package/dist/tests/filters/$in.test.js.map +1 -1
- package/dist/tests/filters/$lt.test.js +14 -14
- package/dist/tests/filters/$lt.test.js.map +1 -1
- package/dist/tests/filters/$lte.test.js +14 -14
- package/dist/tests/filters/$lte.test.js.map +1 -1
- package/dist/tests/filters/$neq.test.js +3 -3
- package/dist/tests/filters/$neq.test.js.map +1 -1
- package/dist/tests/filters/$not.test.js +5 -5
- package/dist/tests/filters/$not.test.js.map +1 -1
- package/dist/tests/filters/$or.test.js +16 -16
- package/dist/tests/filters/$or.test.js.map +1 -1
- package/dist/tests/filters/dot-syntax.test.js +10 -10
- package/dist/tests/filters/dot-syntax.test.js.map +1 -1
- package/dist/tests/filters/exists.test.js +16 -16
- package/dist/tests/filters/exists.test.js.map +1 -1
- package/dist/tests/filters/joined-relations.test.js +31 -31
- package/dist/tests/filters/joined-relations.test.js.map +1 -1
- package/dist/tests/filters/special-cases.test.js +11 -11
- package/dist/tests/filters/special-cases.test.js.map +1 -1
- package/dist/tests/filters/wildcard.test.js +8 -8
- package/dist/tests/filters/wildcard.test.js.map +1 -1
- package/dist/tests/utils/index.d.ts +7 -7
- package/dist/tests/utils/index.d.ts.map +1 -1
- package/dist/tests/utils/index.js +6 -6
- package/dist/tests/utils/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/SQLJsonExpressions.ts +10 -0
- package/src/SQLSelect.ts +9 -0
- package/src/SQLWhere.ts +48 -1
- package/src/filters/SQLFilter.ts +203 -485
- package/src/filters/{modern/compilers → compilers}/contains.ts +5 -5
- package/src/filters/{modern/compilers → compilers}/equals.ts +6 -6
- package/src/filters/{modern/compilers → compilers}/greater.ts +3 -3
- package/src/filters/{modern/compilers → compilers}/in.ts +6 -6
- package/src/filters/{modern/compilers → compilers}/less.ts +3 -3
- package/src/filters/helpers/isJSONColumn.ts +13 -0
- package/src/filters/{modern/helpers → helpers}/normalizeCompareValue.ts +20 -14
- package/dist/src/filters/modern/SQLModernFilter.d.ts +0 -73
- package/dist/src/filters/modern/SQLModernFilter.d.ts.map +0 -1
- package/dist/src/filters/modern/SQLModernFilter.js +0 -200
- package/dist/src/filters/modern/SQLModernFilter.js.map +0 -1
- package/dist/src/filters/modern/compilers/contains.d.ts.map +0 -1
- package/dist/src/filters/modern/compilers/contains.js.map +0 -1
- package/dist/src/filters/modern/compilers/equals.d.ts.map +0 -1
- package/dist/src/filters/modern/compilers/equals.js.map +0 -1
- package/dist/src/filters/modern/compilers/greater.d.ts.map +0 -1
- package/dist/src/filters/modern/compilers/greater.js.map +0 -1
- package/dist/src/filters/modern/compilers/in.d.ts.map +0 -1
- package/dist/src/filters/modern/compilers/in.js.map +0 -1
- package/dist/src/filters/modern/compilers/index.d.ts.map +0 -1
- package/dist/src/filters/modern/compilers/index.js.map +0 -1
- package/dist/src/filters/modern/compilers/less.d.ts.map +0 -1
- package/dist/src/filters/modern/compilers/less.js.map +0 -1
- package/dist/src/filters/modern/helpers/isJSONColumn.d.ts +0 -4
- package/dist/src/filters/modern/helpers/isJSONColumn.d.ts.map +0 -1
- package/dist/src/filters/modern/helpers/isJSONColumn.js +0 -16
- package/dist/src/filters/modern/helpers/isJSONColumn.js.map +0 -1
- package/dist/src/filters/modern/helpers/normalizeCompareValue.d.ts.map +0 -1
- package/dist/src/filters/modern/helpers/normalizeCompareValue.js.map +0 -1
- package/src/filters/modern/SQLModernFilter.ts +0 -256
- package/src/filters/modern/helpers/isJSONColumn.ts +0 -13
- /package/dist/src/filters/{modern/compilers → compilers}/index.d.ts +0 -0
- /package/dist/src/filters/{modern/compilers → compilers}/index.js +0 -0
- /package/src/filters/{modern/compilers → compilers}/index.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contains.d.ts","sourceRoot":"","sources":["../../../../src/filters/compilers/contains.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIlF,OAAO,EAAqC,mBAAmB,EAAgB,MAAM,cAAc,CAAC;AAGpG,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,eAAe,GAAG,mBAAmB,CAkCvF"}
|
|
@@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.$containsSQLFilterCompiler = $containsSQLFilterCompiler;
|
|
4
4
|
const simple_errors_1 = require("@simonbackx/simple-errors");
|
|
5
5
|
const structures_1 = require("@stamhoofd/structures");
|
|
6
|
-
const SQLExpressions_1 = require("
|
|
7
|
-
const SQLJsonExpressions_1 = require("
|
|
8
|
-
const SQLWhere_1 = require("
|
|
9
|
-
const
|
|
6
|
+
const SQLExpressions_1 = require("../../SQLExpressions");
|
|
7
|
+
const SQLJsonExpressions_1 = require("../../SQLJsonExpressions");
|
|
8
|
+
const SQLWhere_1 = require("../../SQLWhere");
|
|
9
|
+
const SQLFilter_1 = require("../SQLFilter");
|
|
10
10
|
const normalizeCompareValue_1 = require("../helpers/normalizeCompareValue");
|
|
11
11
|
function $containsSQLFilterCompiler(filter) {
|
|
12
12
|
return (originalColumn) => {
|
|
13
|
-
const column = (0,
|
|
13
|
+
const column = (0, SQLFilter_1.normalizeColumn)(originalColumn);
|
|
14
14
|
const value = (0, normalizeCompareValue_1.normalizeCompareValue)((0, structures_1.assertFilterCompareValue)(filter), column.type);
|
|
15
15
|
if (typeof value !== 'string') {
|
|
16
16
|
throw new simple_errors_1.SimpleError({
|
|
@@ -18,7 +18,7 @@ function $containsSQLFilterCompiler(filter) {
|
|
|
18
18
|
message: 'Expected string at $contains filter',
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
|
-
if (column.type ===
|
|
21
|
+
if (column.type === SQLFilter_1.SQLValueType.JSONArray || column.type === SQLFilter_1.SQLValueType.JSONObject) {
|
|
22
22
|
// For JSON arrays and objects, we use JSON_CONTAINS
|
|
23
23
|
return new SQLWhere_1.SQLWhereEqual(new SQLJsonExpressions_1.SQLJsonSearch(new SQLExpressions_1.SQLLower(column.expression), 'one', (0, SQLExpressions_1.scalarToSQLExpression)('%' + SQLWhere_1.SQLWhereLike.escape(value) + '%')), SQLWhere_1.SQLWhereSign.NotEqual, new SQLExpressions_1.SQLNull());
|
|
24
24
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contains.js","sourceRoot":"","sources":["../../../../src/filters/compilers/contains.ts"],"names":[],"mappings":";;AAQA,gEAkCC;AA1CD,6DAAwD;AACxD,sDAAkF;AAClF,yDAAgF;AAChF,iEAAyD;AACzD,6CAA2E;AAC3E,4CAAoG;AACpG,4EAAyE;AAEzE,SAAgB,0BAA0B,CAAC,MAAuB;IAC9D,OAAO,CAAC,cAAgC,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,IAAA,2BAAe,EAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAA,6CAAqB,EAAC,IAAA,qCAAwB,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAEnF,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,2BAAW,CAAC;gBAClB,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,qCAAqC;aACjD,CAAC,CAAC;QACP,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAY,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAY,CAAC,UAAU,EAAE,CAAC;YACpF,oDAAoD;YACpD,OAAO,IAAI,wBAAa,CACpB,IAAI,kCAAa,CACb,IAAI,yBAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,EAC/B,KAAK,EACL,IAAA,sCAAqB,EACjB,GAAG,GAAG,uBAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CACzC,CACJ,EACD,uBAAY,CAAC,QAAQ,EACrB,IAAI,wBAAO,EAAE,CAChB,CAAC;QACN,CAAC;QAED,OAAO,IAAI,uBAAY,CACnB,MAAM,CAAC,UAAU,EACjB,IAAA,sCAAqB,EACjB,GAAG,GAAG,uBAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CACzC,CACJ,CAAC;IACN,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { StamhoofdFilter } from '@stamhoofd/structures';
|
|
2
|
-
import { SQLSyncFilterRunner } from '../
|
|
2
|
+
import { SQLSyncFilterRunner } from '../SQLFilter';
|
|
3
3
|
export declare function $equalsSQLFilterCompiler(filter: StamhoofdFilter): SQLSyncFilterRunner;
|
|
4
4
|
//# sourceMappingURL=equals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"equals.d.ts","sourceRoot":"","sources":["../../../../src/filters/compilers/equals.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIlF,OAAO,EAAqC,mBAAmB,EAAgB,MAAM,cAAc,CAAC;AAIpG,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,GAAG,mBAAmB,CA+DrF"}
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.$equalsSQLFilterCompiler = $equalsSQLFilterCompiler;
|
|
4
4
|
const structures_1 = require("@stamhoofd/structures");
|
|
5
|
-
const SQLExpressions_1 = require("
|
|
6
|
-
const SQLJsonExpressions_1 = require("
|
|
7
|
-
const SQLWhere_1 = require("
|
|
8
|
-
const
|
|
5
|
+
const SQLExpressions_1 = require("../../SQLExpressions");
|
|
6
|
+
const SQLJsonExpressions_1 = require("../../SQLJsonExpressions");
|
|
7
|
+
const SQLWhere_1 = require("../../SQLWhere");
|
|
8
|
+
const SQLFilter_1 = require("../SQLFilter");
|
|
9
9
|
const isJSONColumn_1 = require("../helpers/isJSONColumn");
|
|
10
10
|
const normalizeCompareValue_1 = require("../helpers/normalizeCompareValue");
|
|
11
11
|
function $equalsSQLFilterCompiler(filter) {
|
|
12
12
|
return (originalColumn) => {
|
|
13
|
-
const column = (0,
|
|
13
|
+
const column = (0, SQLFilter_1.normalizeColumn)(originalColumn);
|
|
14
14
|
const value = (0, normalizeCompareValue_1.normalizeCompareValue)((0, structures_1.assertFilterCompareValue)(filter), column.type);
|
|
15
15
|
/**
|
|
16
16
|
* Special case, checking for equality with a JSON array.
|
|
@@ -18,7 +18,7 @@ function $equalsSQLFilterCompiler(filter) {
|
|
|
18
18
|
*
|
|
19
19
|
* This differs from $contains, which will check for 'LIKE' inside the JSON array.
|
|
20
20
|
*/
|
|
21
|
-
if (column.type ===
|
|
21
|
+
if (column.type === SQLFilter_1.SQLValueType.JSONArray) {
|
|
22
22
|
let where;
|
|
23
23
|
if (typeof value === 'string') {
|
|
24
24
|
where = new SQLWhere_1.SQLWhereEqual(new SQLJsonExpressions_1.SQLJsonSearch(new SQLExpressions_1.SQLLower(column.expression), 'one', (0, SQLExpressions_1.scalarToSQLExpression)(SQLWhere_1.SQLWhereLike.escape(value))), SQLWhere_1.SQLWhereSign.NotEqual, new SQLExpressions_1.SQLNull());
|
|
@@ -40,7 +40,7 @@ function $equalsSQLFilterCompiler(filter) {
|
|
|
40
40
|
return new SQLWhere_1.SQLWhereEqual(new SQLJsonExpressions_1.SQLJsonValue(column.expression), // casts json null to null, including invalid paths
|
|
41
41
|
SQLWhere_1.SQLWhereSign.Equal, new SQLExpressions_1.SQLNull());
|
|
42
42
|
}
|
|
43
|
-
return new SQLWhere_1.SQLWhereEqual(column.expression, SQLWhere_1.SQLWhereSign.Equal, (0, SQLExpressions_1.scalarToSQLExpression)(value));
|
|
43
|
+
return new SQLWhere_1.SQLWhereEqual(column.expression, SQLWhere_1.SQLWhereSign.Equal, (0, SQLExpressions_1.scalarToSQLExpression)(value)).setNullable(column.nullable);
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
46
|
//# sourceMappingURL=equals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"equals.js","sourceRoot":"","sources":["../../../../src/filters/compilers/equals.ts"],"names":[],"mappings":";;AAQA,4DA+DC;AAvED,sDAAkF;AAClF,yDAAgF;AAChF,iEAAwF;AACxF,6CAAiG;AACjG,4CAAoG;AACpG,0DAAuD;AACvD,4EAAyE;AAEzE,SAAgB,wBAAwB,CAAC,MAAuB;IAC5D,OAAO,CAAC,cAAgC,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,IAAA,2BAAe,EAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAA,6CAAqB,EAAC,IAAA,qCAAwB,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACnF;;;;;WAKG;QACH,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAY,CAAC,SAAS,EAAE,CAAC;YACzC,IAAI,KAAe,CAAC;YAEpB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5B,KAAK,GAAG,IAAI,wBAAa,CACrB,IAAI,kCAAa,CACb,IAAI,yBAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,EAC/B,KAAK,EACL,IAAA,sCAAqB,EACjB,uBAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAC7B,CACJ,EACD,uBAAY,CAAC,QAAQ,EACrB,IAAI,wBAAO,EAAE,CAChB,CAAC;YACN,CAAC;iBACI,CAAC;gBACF,KAAK,GAAG,IAAI,oCAAe,CACvB,MAAM,CAAC,UAAU,EACjB,IAAA,sCAAqB,EAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAC/C,CAAC;YACN,CAAC;YAED,0FAA0F;YAC1F,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjB,KAAK,GAAG,IAAI,qBAAU,CAAC;oBACnB,KAAK;oBACL,IAAI,wBAAa,CACb,MAAM,CAAC,UAAU,EACjB,uBAAY,CAAC,KAAK,EAClB,IAAI,wBAAO,EAAE,CAChB;iBACJ,CAAC,CAAC;YACP,CAAC;YAED,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,KAAK,KAAK,IAAI,IAAI,IAAA,2BAAY,EAAC,MAAM,CAAC,EAAE,CAAC;YACzC,6DAA6D;YAC7D,OAAO,IAAI,wBAAa,CACpB,IAAI,iCAAY,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,mDAAmD;YACxF,uBAAY,CAAC,KAAK,EAClB,IAAI,wBAAO,EAAE,CAChB,CAAC;QACN,CAAC;QAED,OAAO,IAAI,wBAAa,CACpB,MAAM,CAAC,UAAU,EACjB,uBAAY,CAAC,KAAK,EAClB,IAAA,sCAAqB,EAAC,KAAK,CAAC,CAC/B,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { StamhoofdFilter } from '@stamhoofd/structures';
|
|
2
|
-
import { SQLSyncFilterRunner } from '../
|
|
2
|
+
import { SQLSyncFilterRunner } from '../SQLFilter';
|
|
3
3
|
export declare function $greaterThanSQLFilterCompiler(filter: StamhoofdFilter): SQLSyncFilterRunner;
|
|
4
4
|
//# sourceMappingURL=greater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"greater.d.ts","sourceRoot":"","sources":["../../../../src/filters/compilers/greater.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGlF,OAAO,EAAqC,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGtF,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,eAAe,GAAG,mBAAmB,CAa1F"}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.$greaterThanSQLFilterCompiler = $greaterThanSQLFilterCompiler;
|
|
4
4
|
const structures_1 = require("@stamhoofd/structures");
|
|
5
|
-
const SQLExpressions_1 = require("
|
|
6
|
-
const SQLWhere_1 = require("
|
|
7
|
-
const
|
|
5
|
+
const SQLExpressions_1 = require("../../SQLExpressions");
|
|
6
|
+
const SQLWhere_1 = require("../../SQLWhere");
|
|
7
|
+
const SQLFilter_1 = require("../SQLFilter");
|
|
8
8
|
const normalizeCompareValue_1 = require("../helpers/normalizeCompareValue");
|
|
9
9
|
function $greaterThanSQLFilterCompiler(filter) {
|
|
10
10
|
return (originalColumn) => {
|
|
11
|
-
const column = (0,
|
|
11
|
+
const column = (0, SQLFilter_1.normalizeColumn)(originalColumn);
|
|
12
12
|
const value = (0, normalizeCompareValue_1.normalizeCompareValue)((0, structures_1.assertFilterCompareValue)(filter), column.type);
|
|
13
13
|
const base = new SQLWhere_1.SQLWhereEqual(column.expression, SQLWhere_1.SQLWhereSign.Greater, (0, SQLExpressions_1.scalarToSQLExpression)(value)).setNullable(column.nullable);
|
|
14
14
|
return base;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"greater.js","sourceRoot":"","sources":["../../../../src/filters/compilers/greater.ts"],"names":[],"mappings":";;AAMA,sEAaC;AAnBD,sDAAkF;AAClF,yDAA6D;AAC7D,6CAA6D;AAC7D,4CAAsF;AACtF,4EAAyE;AAEzE,SAAgB,6BAA6B,CAAC,MAAuB;IACjE,OAAO,CAAC,cAAgC,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,IAAA,2BAAe,EAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAA,6CAAqB,EAAC,IAAA,qCAAwB,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAEnF,MAAM,IAAI,GAAG,IAAI,wBAAa,CAC1B,MAAM,CAAC,UAAU,EACjB,uBAAY,CAAC,OAAO,EACpB,IAAA,sCAAqB,EAAC,KAAK,CAAC,CAC/B,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE/B,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { StamhoofdFilter } from '@stamhoofd/structures';
|
|
2
|
-
import { SQLSyncFilterRunner } from '../
|
|
2
|
+
import { SQLSyncFilterRunner } from '../SQLFilter';
|
|
3
3
|
export declare function $inSQLFilterCompiler(filter: StamhoofdFilter): SQLSyncFilterRunner;
|
|
4
4
|
//# sourceMappingURL=in.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in.d.ts","sourceRoot":"","sources":["../../../../src/filters/compilers/in.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIlF,OAAO,EAAqC,mBAAmB,EAAgB,MAAM,cAAc,CAAC;AAIpG,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,mBAAmB,CAoDjF"}
|
|
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.$inSQLFilterCompiler = $inSQLFilterCompiler;
|
|
4
4
|
const simple_errors_1 = require("@simonbackx/simple-errors");
|
|
5
5
|
const structures_1 = require("@stamhoofd/structures");
|
|
6
|
-
const SQLExpressions_1 = require("
|
|
7
|
-
const SQLJsonExpressions_1 = require("
|
|
8
|
-
const SQLWhere_1 = require("
|
|
9
|
-
const
|
|
6
|
+
const SQLExpressions_1 = require("../../SQLExpressions");
|
|
7
|
+
const SQLJsonExpressions_1 = require("../../SQLJsonExpressions");
|
|
8
|
+
const SQLWhere_1 = require("../../SQLWhere");
|
|
9
|
+
const SQLFilter_1 = require("../SQLFilter");
|
|
10
10
|
const normalizeCompareValue_1 = require("../helpers/normalizeCompareValue");
|
|
11
11
|
const equals_1 = require("./equals");
|
|
12
12
|
function $inSQLFilterCompiler(filter) {
|
|
@@ -23,7 +23,7 @@ function $inSQLFilterCompiler(filter) {
|
|
|
23
23
|
message: 'Too many values in $in filter, maximum is 100',
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
|
-
const column = (0,
|
|
26
|
+
const column = (0, SQLFilter_1.normalizeColumn)(originalColumn);
|
|
27
27
|
const values = filter.map(val => (0, normalizeCompareValue_1.normalizeCompareValue)((0, structures_1.assertFilterCompareValue)(val), column.type));
|
|
28
28
|
if (values.length === 0) {
|
|
29
29
|
// Return always false
|
|
@@ -38,13 +38,13 @@ function $inSQLFilterCompiler(filter) {
|
|
|
38
38
|
$inSQLFilterCompiler(valuesWithoutNulls)(column),
|
|
39
39
|
]);
|
|
40
40
|
}
|
|
41
|
-
if (column.type ===
|
|
41
|
+
if (column.type === SQLFilter_1.SQLValueType.JSONArray) {
|
|
42
42
|
const jsonValues = JSON.stringify(valuesWithoutNulls);
|
|
43
43
|
const valuesExpression = (0, SQLExpressions_1.scalarToSQLExpression)(jsonValues);
|
|
44
44
|
return new SQLJsonExpressions_1.SQLJsonOverlaps(column.expression, valuesExpression);
|
|
45
45
|
}
|
|
46
46
|
const valuesExpression = valuesWithoutNulls.length === 1 ? (0, SQLExpressions_1.scalarToSQLExpression)(valuesWithoutNulls[0]) : new SQLExpressions_1.SQLArray(valuesWithoutNulls);
|
|
47
|
-
return new SQLWhere_1.SQLWhereEqual(column.expression, SQLWhere_1.SQLWhereSign.Equal, valuesExpression);
|
|
47
|
+
return new SQLWhere_1.SQLWhereEqual(column.expression, SQLWhere_1.SQLWhereSign.Equal, valuesExpression).setNullable(column.nullable);
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
//# sourceMappingURL=in.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in.js","sourceRoot":"","sources":["../../../../src/filters/compilers/in.ts"],"names":[],"mappings":";;AASA,oDAoDC;AA7DD,6DAAwD;AACxD,sDAAkF;AAClF,yDAAuE;AACvE,iEAA2D;AAC3D,6CAAyE;AACzE,4CAAoG;AACpG,4EAAyE;AACzE,qCAAoD;AAEpD,SAAgB,oBAAoB,CAAC,MAAuB;IACxD,OAAO,CAAC,cAAgC,EAAE,EAAE;QACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,2BAAW,CAAC;gBAClB,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,8BAA8B;aAC1C,CAAC,CAAC;QACP,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,2BAAW,CAAC;gBAClB,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,+CAA+C;aAC3D,CAAC,CAAC;QACP,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,2BAAe,EAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAA,6CAAqB,EAAC,IAAA,qCAAwB,EAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpG,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,sBAAsB;YACtB,OAAO,IAAI,qBAAU,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,kBAAkB,CAAC,MAAM,CAAC;QAE5D,IAAI,OAAO,EAAE,CAAC;YACV,2IAA2I;YAC3I,OAAO,IAAI,qBAAU,CAAC;gBAClB,IAAA,iCAAwB,EAAC,IAAI,CAAC,CAAC,MAAM,CAAC;gBACtC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC;aACnD,CAAC,CAAC;QACP,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAY,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YACtD,MAAM,gBAAgB,GAAG,IAAA,sCAAqB,EAAC,UAAU,CAAC,CAAC;YAE3D,OAAO,IAAI,oCAAe,CACtB,MAAM,CAAC,UAAU,EACjB,gBAAgB,CACnB,CAAC;QACN,CAAC;QACD,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAA,sCAAqB,EAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,yBAAQ,CAAC,kBAAkB,CAAC,CAAC;QAE3I,OAAO,IAAI,wBAAa,CACpB,MAAM,CAAC,UAAU,EACjB,uBAAY,CAAC,KAAK,EAClB,gBAAgB,CACnB,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/filters/compilers/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/filters/compilers/index.ts"],"names":[],"mappings":";;;AAAA,iDAAuB;AACvB,oDAA0B;AAC1B,mDAAyB;AACzB,+CAAqB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { StamhoofdFilter } from '@stamhoofd/structures';
|
|
2
|
-
import { SQLSyncFilterRunner } from '../
|
|
2
|
+
import { SQLSyncFilterRunner } from '../SQLFilter';
|
|
3
3
|
export declare function $lessThanSQLFilterCompiler(filter: StamhoofdFilter): SQLSyncFilterRunner;
|
|
4
4
|
//# sourceMappingURL=less.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"less.d.ts","sourceRoot":"","sources":["../../../../src/filters/compilers/less.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGlF,OAAO,EAAqC,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGtF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,eAAe,GAAG,mBAAmB,CAYvF"}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.$lessThanSQLFilterCompiler = $lessThanSQLFilterCompiler;
|
|
4
4
|
const structures_1 = require("@stamhoofd/structures");
|
|
5
|
-
const SQLExpressions_1 = require("
|
|
6
|
-
const SQLWhere_1 = require("
|
|
7
|
-
const
|
|
5
|
+
const SQLExpressions_1 = require("../../SQLExpressions");
|
|
6
|
+
const SQLWhere_1 = require("../../SQLWhere");
|
|
7
|
+
const SQLFilter_1 = require("../SQLFilter");
|
|
8
8
|
const normalizeCompareValue_1 = require("../helpers/normalizeCompareValue");
|
|
9
9
|
function $lessThanSQLFilterCompiler(filter) {
|
|
10
10
|
return (originalColumn) => {
|
|
11
|
-
const column = (0,
|
|
11
|
+
const column = (0, SQLFilter_1.normalizeColumn)(originalColumn);
|
|
12
12
|
const value = (0, normalizeCompareValue_1.normalizeCompareValue)((0, structures_1.assertFilterCompareValue)(filter), column.type);
|
|
13
13
|
const base = new SQLWhere_1.SQLWhereEqual(column.expression, SQLWhere_1.SQLWhereSign.Less, (0, SQLExpressions_1.scalarToSQLExpression)(value)).setNullable(column.nullable);
|
|
14
14
|
return base;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"less.js","sourceRoot":"","sources":["../../../../src/filters/compilers/less.ts"],"names":[],"mappings":";;AAMA,gEAYC;AAlBD,sDAAkF;AAClF,yDAA6D;AAC7D,6CAA6D;AAC7D,4CAAsF;AACtF,4EAAyE;AAEzE,SAAgB,0BAA0B,CAAC,MAAuB;IAC9D,OAAO,CAAC,cAAgC,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,IAAA,2BAAe,EAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAA,6CAAqB,EAAC,IAAA,qCAAwB,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAEnF,MAAM,IAAI,GAAG,IAAI,wBAAa,CAC1B,MAAM,CAAC,UAAU,EACjB,uBAAY,CAAC,IAAI,EACjB,IAAA,sCAAqB,EAAC,KAAK,CAAC,CAC/B,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isJSONColumn.d.ts","sourceRoot":"","sources":["../../../../src/filters/helpers/isJSONColumn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE9D,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAEhE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAMtD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isJSONColumn = isJSONColumn;
|
|
4
|
+
exports.isJSONType = isJSONType;
|
|
5
|
+
const SQLFilter_1 = require("../SQLFilter");
|
|
6
|
+
function isJSONColumn({ type }) {
|
|
7
|
+
return isJSONType(type);
|
|
8
|
+
}
|
|
9
|
+
function isJSONType(type) {
|
|
10
|
+
return type === SQLFilter_1.SQLValueType.JSONString
|
|
11
|
+
|| type === SQLFilter_1.SQLValueType.JSONBoolean
|
|
12
|
+
|| type === SQLFilter_1.SQLValueType.JSONNumber
|
|
13
|
+
|| type === SQLFilter_1.SQLValueType.JSONArray
|
|
14
|
+
|| type === SQLFilter_1.SQLValueType.JSONObject;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=isJSONColumn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isJSONColumn.js","sourceRoot":"","sources":["../../../../src/filters/helpers/isJSONColumn.ts"],"names":[],"mappings":";;AAEA,oCAEC;AAED,gCAMC;AAZD,4CAA8D;AAE9D,SAAgB,YAAY,CAAC,EAAE,IAAI,EAAoB;IACnD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAgB,UAAU,CAAC,IAAkB;IACzC,OAAO,IAAI,KAAK,wBAAY,CAAC,UAAU;WAChC,IAAI,KAAK,wBAAY,CAAC,WAAW;WACjC,IAAI,KAAK,wBAAY,CAAC,UAAU;WAChC,IAAI,KAAK,wBAAY,CAAC,SAAS;WAC/B,IAAI,KAAK,wBAAY,CAAC,UAAU,CAAC;AAC5C,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { StamhoofdCompareValue } from '@stamhoofd/structures';
|
|
2
|
-
import {
|
|
2
|
+
import { SQLValueType } from '../SQLFilter';
|
|
3
3
|
/**
|
|
4
4
|
* Prepares a compare value so we can compare it, given a certain column type.
|
|
5
5
|
*
|
|
6
6
|
* E.g. if you pass in true - and we are comparing against a mysql boolean column, convert it to 1.
|
|
7
7
|
*/
|
|
8
|
-
export declare function normalizeCompareValue(val: StamhoofdCompareValue, againstType:
|
|
8
|
+
export declare function normalizeCompareValue(val: StamhoofdCompareValue, againstType: SQLValueType): string | number | Date | null | boolean;
|
|
9
9
|
//# sourceMappingURL=normalizeCompareValue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeCompareValue.d.ts","sourceRoot":"","sources":["../../../../src/filters/helpers/normalizeCompareValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,qBAAqB,EAAE,WAAW,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CA4FpI"}
|
|
@@ -1,65 +1,70 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.normalizeCompareValue = normalizeCompareValue;
|
|
4
|
-
const
|
|
4
|
+
const SQLFilter_1 = require("../SQLFilter");
|
|
5
5
|
/**
|
|
6
6
|
* Prepares a compare value so we can compare it, given a certain column type.
|
|
7
7
|
*
|
|
8
8
|
* E.g. if you pass in true - and we are comparing against a mysql boolean column, convert it to 1.
|
|
9
9
|
*/
|
|
10
10
|
function normalizeCompareValue(val, againstType) {
|
|
11
|
-
if (againstType ===
|
|
11
|
+
if (againstType === SQLFilter_1.SQLValueType.Table) {
|
|
12
12
|
throw new Error('Cannot compare at root level');
|
|
13
13
|
}
|
|
14
|
-
if (againstType ===
|
|
14
|
+
if (againstType === SQLFilter_1.SQLValueType.JSONObject) {
|
|
15
15
|
if (val === null) {
|
|
16
16
|
return null;
|
|
17
17
|
}
|
|
18
18
|
throw new Error('Cannot compare with a JSON object');
|
|
19
19
|
}
|
|
20
20
|
if (val instanceof Date) {
|
|
21
|
-
if (againstType ===
|
|
21
|
+
if (againstType === SQLFilter_1.SQLValueType.Datetime) {
|
|
22
22
|
return val;
|
|
23
23
|
}
|
|
24
24
|
throw new Error('Cannot compare a date with a non-datetime column');
|
|
25
25
|
}
|
|
26
26
|
if (typeof val === 'string') {
|
|
27
|
-
if (againstType ===
|
|
27
|
+
if (againstType === SQLFilter_1.SQLValueType.String || againstType === SQLFilter_1.SQLValueType.JSONString) {
|
|
28
28
|
return val.toLocaleLowerCase();
|
|
29
29
|
}
|
|
30
|
-
if (againstType ===
|
|
30
|
+
if (againstType === SQLFilter_1.SQLValueType.JSONArray) {
|
|
31
31
|
// We'll search inside the array
|
|
32
32
|
return val.toLocaleLowerCase();
|
|
33
33
|
}
|
|
34
|
+
// Allowed to compare strings with dates
|
|
35
|
+
if (againstType === SQLFilter_1.SQLValueType.Datetime) {
|
|
36
|
+
// Note, taht if you ever filter dates by string values, you need to work with UTC timezones
|
|
37
|
+
return val;
|
|
38
|
+
}
|
|
34
39
|
throw new Error('Cannot compare a string with a non-string column');
|
|
35
40
|
}
|
|
36
41
|
if (typeof val === 'boolean') {
|
|
37
|
-
if (againstType ===
|
|
42
|
+
if (againstType === SQLFilter_1.SQLValueType.JSONBoolean) {
|
|
38
43
|
return val;
|
|
39
44
|
}
|
|
40
|
-
if (againstType ===
|
|
45
|
+
if (againstType === SQLFilter_1.SQLValueType.Boolean || againstType === SQLFilter_1.SQLValueType.Number) {
|
|
41
46
|
return val === true ? 1 : 0;
|
|
42
47
|
}
|
|
43
|
-
if (againstType ===
|
|
48
|
+
if (againstType === SQLFilter_1.SQLValueType.JSONArray) {
|
|
44
49
|
// We'll search inside the array
|
|
45
50
|
return val;
|
|
46
51
|
}
|
|
47
52
|
throw new Error('Cannot compare a boolean with a non-boolean column');
|
|
48
53
|
}
|
|
49
54
|
if (typeof val === 'number') {
|
|
50
|
-
if (againstType ===
|
|
55
|
+
if (againstType === SQLFilter_1.SQLValueType.JSONBoolean) {
|
|
51
56
|
return val === 1 ? true : false;
|
|
52
57
|
}
|
|
53
|
-
if (againstType ===
|
|
58
|
+
if (againstType === SQLFilter_1.SQLValueType.Boolean) {
|
|
54
59
|
if (val !== 1 && val !== 0) {
|
|
55
60
|
throw new Error('Cannot compare a number with a boolean column');
|
|
56
61
|
}
|
|
57
62
|
return val;
|
|
58
63
|
}
|
|
59
|
-
if (againstType ===
|
|
64
|
+
if (againstType === SQLFilter_1.SQLValueType.Number || againstType === SQLFilter_1.SQLValueType.JSONNumber) {
|
|
60
65
|
return val;
|
|
61
66
|
}
|
|
62
|
-
if (againstType ===
|
|
67
|
+
if (againstType === SQLFilter_1.SQLValueType.JSONArray) {
|
|
63
68
|
// We'll search inside the array
|
|
64
69
|
return val;
|
|
65
70
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeCompareValue.js","sourceRoot":"","sources":["../../../../src/filters/helpers/normalizeCompareValue.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const SQLFilter_1 = require("../../src/filters/SQLFilter");
|
|
4
4
|
const SQL_1 = require("../../src/SQL");
|
|
5
5
|
const utils_1 = require("../utils");
|
|
6
6
|
describe('$and', () => {
|
|
@@ -12,8 +12,8 @@ describe('$and', () => {
|
|
|
12
12
|
});
|
|
13
13
|
it('If one child is always false, the whole $and is always false', async () => {
|
|
14
14
|
const filters = {
|
|
15
|
-
...
|
|
16
|
-
name: (0,
|
|
15
|
+
...SQLFilter_1.baseSQLFilterCompilers,
|
|
16
|
+
name: (0, SQLFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLFilter_1.SQLValueType.String, nullable: true }),
|
|
17
17
|
};
|
|
18
18
|
await (0, utils_1.test)({
|
|
19
19
|
filter: {
|
|
@@ -31,10 +31,41 @@ describe('$and', () => {
|
|
|
31
31
|
},
|
|
32
32
|
});
|
|
33
33
|
});
|
|
34
|
+
/**
|
|
35
|
+
* Regression:
|
|
36
|
+
* when using $lte on a nullable field, it sometimes didn't group the OR
|
|
37
|
+
* and caused:
|
|
38
|
+
* (birthday >= x) AND birthday <= x OR birthday is null
|
|
39
|
+
* instead of
|
|
40
|
+
* birthday >= x AND (birthday <= x OR birthday is null)
|
|
41
|
+
*
|
|
42
|
+
* This was caused by incorrect WhereNot.isSingle logic ($lte and $gte uses not $gt and not $lt under the hood)
|
|
43
|
+
*/
|
|
44
|
+
it('Grouping nullable $lte and $gte correctly inside $and', async () => {
|
|
45
|
+
const filters = {
|
|
46
|
+
...SQLFilter_1.baseSQLFilterCompilers,
|
|
47
|
+
birthDay: (0, SQLFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('birthDay'), type: SQLFilter_1.SQLValueType.Datetime, nullable: true }),
|
|
48
|
+
};
|
|
49
|
+
await (0, utils_1.test)({
|
|
50
|
+
filter: {
|
|
51
|
+
birthDay: {
|
|
52
|
+
$and: {
|
|
53
|
+
$gte: new Date(200),
|
|
54
|
+
$lte: new Date(500),
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
filters,
|
|
59
|
+
query: {
|
|
60
|
+
query: '`default`.`birthDay` >= ? AND (`default`.`birthDay` <= ? OR `default`.`birthDay` IS NULL)',
|
|
61
|
+
params: [new Date(200), new Date(500)],
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
});
|
|
34
65
|
it('An empty $and is always true', async () => {
|
|
35
66
|
const filters = {
|
|
36
|
-
...
|
|
37
|
-
name: (0,
|
|
67
|
+
...SQLFilter_1.baseSQLFilterCompilers,
|
|
68
|
+
name: (0, SQLFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLFilter_1.SQLValueType.String, nullable: true }),
|
|
38
69
|
};
|
|
39
70
|
await (0, utils_1.test)({
|
|
40
71
|
filter: {
|
|
@@ -49,8 +80,8 @@ describe('$and', () => {
|
|
|
49
80
|
});
|
|
50
81
|
it('If all children are always true, the whole $and is always true', async () => {
|
|
51
82
|
const filters = {
|
|
52
|
-
...
|
|
53
|
-
name: (0,
|
|
83
|
+
...SQLFilter_1.baseSQLFilterCompilers,
|
|
84
|
+
name: (0, SQLFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLFilter_1.SQLValueType.String, nullable: true }),
|
|
54
85
|
};
|
|
55
86
|
await (0, utils_1.test)({
|
|
56
87
|
filter: {
|
|
@@ -74,8 +105,8 @@ describe('$and', () => {
|
|
|
74
105
|
});
|
|
75
106
|
it('Children that are always true are removed from the $and', async () => {
|
|
76
107
|
const filters = {
|
|
77
|
-
...
|
|
78
|
-
name: (0,
|
|
108
|
+
...SQLFilter_1.baseSQLFilterCompilers,
|
|
109
|
+
name: (0, SQLFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLFilter_1.SQLValueType.String, nullable: true }),
|
|
79
110
|
};
|
|
80
111
|
await (0, utils_1.test)({
|
|
81
112
|
filter: {
|
|
@@ -98,8 +129,8 @@ describe('$and', () => {
|
|
|
98
129
|
});
|
|
99
130
|
it('Can be used with direct object child', async () => {
|
|
100
131
|
const filters = {
|
|
101
|
-
...
|
|
102
|
-
name: (0,
|
|
132
|
+
...SQLFilter_1.baseSQLFilterCompilers,
|
|
133
|
+
name: (0, SQLFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLFilter_1.SQLValueType.String, nullable: false }),
|
|
103
134
|
};
|
|
104
135
|
await (0, utils_1.test)({
|
|
105
136
|
filter: {
|
|
@@ -119,9 +150,9 @@ describe('$and', () => {
|
|
|
119
150
|
});
|
|
120
151
|
it('NOT (A AND B) is simplified to (NOT A or not B)', async () => {
|
|
121
152
|
const filters = {
|
|
122
|
-
...
|
|
123
|
-
name: (0,
|
|
124
|
-
createdAt: (0,
|
|
153
|
+
...SQLFilter_1.baseSQLFilterCompilers,
|
|
154
|
+
name: (0, SQLFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLFilter_1.SQLValueType.String, nullable: false }),
|
|
155
|
+
createdAt: (0, SQLFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('createdAt'), type: SQLFilter_1.SQLValueType.Datetime, nullable: false }),
|
|
125
156
|
};
|
|
126
157
|
await (0, utils_1.test)({
|
|
127
158
|
filter: {
|
|
@@ -139,8 +170,8 @@ describe('$and', () => {
|
|
|
139
170
|
});
|
|
140
171
|
it('empty $and branches are removed', async () => {
|
|
141
172
|
const filters = {
|
|
142
|
-
...
|
|
143
|
-
name: (0,
|
|
173
|
+
...SQLFilter_1.baseSQLFilterCompilers,
|
|
174
|
+
name: (0, SQLFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLFilter_1.SQLValueType.String, nullable: false }),
|
|
144
175
|
};
|
|
145
176
|
await (0, utils_1.test)({
|
|
146
177
|
filter: {
|
|
@@ -158,8 +189,8 @@ describe('$and', () => {
|
|
|
158
189
|
});
|
|
159
190
|
it('deep $and branches are cleaned up', async () => {
|
|
160
191
|
const filters = {
|
|
161
|
-
...
|
|
162
|
-
name: (0,
|
|
192
|
+
...SQLFilter_1.baseSQLFilterCompilers,
|
|
193
|
+
name: (0, SQLFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLFilter_1.SQLValueType.String, nullable: false }),
|
|
163
194
|
};
|
|
164
195
|
await (0, utils_1.test)({
|
|
165
196
|
filter: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"$and.test.js","sourceRoot":"","sources":["../../../tests/filters/$and.test.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"$and.test.js","sourceRoot":"","sources":["../../../tests/filters/$and.test.ts"],"names":[],"mappings":"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"}
|