@peers-app/peers-sdk 0.14.0 → 0.15.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.
- package/dist/context/data-context.d.ts +4 -4
- package/dist/context/data-context.js +1 -1
- package/dist/context/index.d.ts +3 -3
- package/dist/context/index.js +4 -0
- package/dist/context/user-context-singleton.js +13 -14
- package/dist/context/user-context.d.ts +4 -4
- package/dist/context/user-context.js +48 -31
- package/dist/data/assistants.d.ts +1 -1
- package/dist/data/assistants.js +35 -24
- package/dist/data/change-tracking.d.ts +8 -8
- package/dist/data/change-tracking.js +45 -39
- package/dist/data/channels.js +5 -5
- package/dist/data/data-locks.d.ts +2 -2
- package/dist/data/data-locks.js +21 -23
- package/dist/data/data-locks.test.js +73 -75
- package/dist/data/device-sync-info.d.ts +1 -1
- package/dist/data/device-sync-info.js +4 -4
- package/dist/data/devices.d.ts +1 -1
- package/dist/data/devices.js +9 -12
- package/dist/data/embeddings.js +14 -11
- package/dist/data/files/file-read-stream.d.ts +2 -2
- package/dist/data/files/file-read-stream.js +23 -14
- package/dist/data/files/file-write-stream.d.ts +2 -2
- package/dist/data/files/file-write-stream.js +8 -8
- package/dist/data/files/file.types.d.ts +2 -2
- package/dist/data/files/file.types.js +17 -11
- package/dist/data/files/files.d.ts +6 -6
- package/dist/data/files/files.js +17 -19
- package/dist/data/files/files.test.js +213 -214
- package/dist/data/files/index.d.ts +4 -4
- package/dist/data/files/index.js +4 -4
- package/dist/data/group-member-roles.js +2 -2
- package/dist/data/group-members.d.ts +5 -5
- package/dist/data/group-members.js +27 -18
- package/dist/data/group-members.test.js +73 -73
- package/dist/data/group-permissions.d.ts +3 -3
- package/dist/data/group-permissions.js +13 -11
- package/dist/data/group-share.d.ts +2 -2
- package/dist/data/group-share.js +29 -24
- package/dist/data/groups.d.ts +4 -4
- package/dist/data/groups.js +27 -19
- package/dist/data/groups.test.js +44 -44
- package/dist/data/index.d.ts +6 -6
- package/dist/data/index.js +6 -6
- package/dist/data/knowledge/peer-types.js +9 -9
- package/dist/data/messages.d.ts +5 -5
- package/dist/data/messages.js +43 -30
- package/dist/data/orm/client-proxy.data-source.d.ts +4 -4
- package/dist/data/orm/client-proxy.data-source.js +10 -12
- package/dist/data/orm/cursor.d.ts +1 -1
- package/dist/data/orm/cursor.js +2 -2
- package/dist/data/orm/cursor.test.js +92 -93
- package/dist/data/orm/data-query.d.ts +3 -3
- package/dist/data/orm/data-query.js +24 -18
- package/dist/data/orm/data-query.mongo.d.ts +1 -1
- package/dist/data/orm/data-query.mongo.js +49 -51
- package/dist/data/orm/data-query.mongo.test.js +173 -204
- package/dist/data/orm/data-query.sqlite.d.ts +1 -1
- package/dist/data/orm/data-query.sqlite.js +84 -73
- package/dist/data/orm/data-query.sqlite.test.js +164 -176
- package/dist/data/orm/data-query.test.js +216 -224
- package/dist/data/orm/decorators.js +3 -3
- package/dist/data/orm/dependency-injection.test.js +53 -56
- package/dist/data/orm/doc.d.ts +4 -4
- package/dist/data/orm/doc.js +17 -21
- package/dist/data/orm/event-registry.d.ts +1 -1
- package/dist/data/orm/event-registry.test.js +16 -16
- package/dist/data/orm/factory.d.ts +2 -2
- package/dist/data/orm/factory.js +33 -33
- package/dist/data/orm/index.d.ts +10 -10
- package/dist/data/orm/index.js +10 -10
- package/dist/data/orm/multi-cursors.d.ts +1 -1
- package/dist/data/orm/multi-cursors.js +6 -6
- package/dist/data/orm/multi-cursors.test.js +152 -144
- package/dist/data/orm/sql.data-source.d.ts +7 -7
- package/dist/data/orm/sql.data-source.js +88 -93
- package/dist/data/orm/sql.data-source.test.js +109 -101
- package/dist/data/orm/subscribable.data-source.d.ts +4 -4
- package/dist/data/orm/subscribable.data-source.js +5 -5
- package/dist/data/orm/table-container-events.test.js +34 -26
- package/dist/data/orm/table-container.d.ts +6 -6
- package/dist/data/orm/table-container.js +33 -21
- package/dist/data/orm/table-container.test.js +64 -53
- package/dist/data/orm/table-definitions.system.d.ts +3 -3
- package/dist/data/orm/table-definitions.system.js +3 -3
- package/dist/data/orm/table-definitions.type.d.ts +5 -5
- package/dist/data/orm/table-dependencies.d.ts +2 -2
- package/dist/data/orm/table.d.ts +5 -5
- package/dist/data/orm/table.event-source.test.js +105 -115
- package/dist/data/orm/table.js +35 -34
- package/dist/data/orm/types.d.ts +3 -3
- package/dist/data/orm/types.js +26 -25
- package/dist/data/orm/types.test.js +166 -92
- package/dist/data/package-permissions.d.ts +1 -1
- package/dist/data/package-permissions.js +2 -2
- package/dist/data/package-version-permissions.d.ts +1 -1
- package/dist/data/package-version-permissions.js +2 -2
- package/dist/data/package-versions.d.ts +9 -9
- package/dist/data/package-versions.js +47 -33
- package/dist/data/packages.d.ts +2 -2
- package/dist/data/packages.js +36 -18
- package/dist/data/packages.utils.d.ts +2 -2
- package/dist/data/packages.utils.js +4 -4
- package/dist/data/persistent-vars.d.ts +15 -15
- package/dist/data/persistent-vars.js +165 -154
- package/dist/data/table-definitions-table.d.ts +5 -5
- package/dist/data/table-definitions-table.js +13 -12
- package/dist/data/tool-tests.js +6 -6
- package/dist/data/tools.js +29 -19
- package/dist/data/user-permissions.d.ts +1 -1
- package/dist/data/user-permissions.js +5 -5
- package/dist/data/user-permissions.test.js +90 -88
- package/dist/data/user-trust-levels.js +10 -10
- package/dist/data/users.d.ts +4 -4
- package/dist/data/users.js +16 -15
- package/dist/data/voice-messages.d.ts +2 -2
- package/dist/data/voice-messages.js +13 -13
- package/dist/data/welcome-modal.pvar.js +3 -1
- package/dist/data/workflow-logs.js +26 -18
- package/dist/data/workflow-runs.d.ts +6 -6
- package/dist/data/workflow-runs.js +70 -44
- package/dist/data/workflows.d.ts +2 -2
- package/dist/data/workflows.js +7 -9
- package/dist/device/binary-peer-connection-v2.d.ts +7 -7
- package/dist/device/binary-peer-connection-v2.js +32 -28
- package/dist/device/binary-peer-connection-v2.test.js +80 -67
- package/dist/device/binary-peer-connection.d.ts +7 -7
- package/dist/device/binary-peer-connection.js +29 -28
- package/dist/device/binary-peer-connection.test.js +35 -31
- package/dist/device/connection.d.ts +5 -5
- package/dist/device/connection.js +59 -48
- package/dist/device/connection.test.js +74 -68
- package/dist/device/device-election.d.ts +2 -2
- package/dist/device/device-election.js +25 -20
- package/dist/device/device-election.test.js +35 -36
- package/dist/device/device.d.ts +2 -2
- package/dist/device/device.js +10 -4
- package/dist/device/device.test.js +16 -17
- package/dist/device/get-trust-level-fn.d.ts +2 -2
- package/dist/device/get-trust-level-fn.js +22 -11
- package/dist/device/get-trust-level-fn.test.js +58 -58
- package/dist/device/socket-io-binary-peer.d.ts +1 -1
- package/dist/device/socket-io-binary-peer.js +16 -13
- package/dist/device/socket.type.d.ts +2 -2
- package/dist/device/streamed-socket.d.ts +2 -2
- package/dist/device/streamed-socket.js +8 -8
- package/dist/device/streamed-socket.test.js +40 -40
- package/dist/device/tx-encoding.test.js +77 -77
- package/dist/events.d.ts +1 -1
- package/dist/events.js +5 -2
- package/dist/group-invite/group-invite.js +110 -19
- package/dist/group-invite/group-invite.pvars.d.ts +2 -2
- package/dist/group-invite/group-invite.pvars.js +21 -13
- package/dist/group-invite/group-invite.types.d.ts +1 -1
- package/dist/group-invite/index.d.ts +3 -3
- package/dist/group-invite/index.js +1 -1
- package/dist/index.d.ts +25 -24
- package/dist/index.js +30 -25
- package/dist/keys.d.ts +3 -3
- package/dist/keys.js +31 -30
- package/dist/keys.test.js +69 -61
- package/dist/logging/console-logger.d.ts +1 -1
- package/dist/logging/console-logger.js +35 -40
- package/dist/logging/console-logger.test.js +115 -115
- package/dist/logging/console-logs.table.d.ts +3 -3
- package/dist/logging/console-logs.table.js +28 -23
- package/dist/mentions.js +16 -12
- package/dist/observable.d.ts +2 -2
- package/dist/observable.js +15 -9
- package/dist/observable.test.js +47 -47
- package/dist/package-loader/get-require.js +3 -4
- package/dist/package-loader/package-loader.d.ts +2 -2
- package/dist/package-loader/package-loader.js +52 -34
- package/dist/peers-ui/peers-ui.d.ts +2 -2
- package/dist/peers-ui/peers-ui.js +2 -4
- package/dist/peers-ui/peers-ui.types.d.ts +3 -3
- package/dist/peers-ui/peers-ui.types.js +0 -1
- package/dist/rpc-types.d.ts +61 -59
- package/dist/rpc-types.js +61 -55
- package/dist/serial-json.d.ts +1 -1
- package/dist/serial-json.js +50 -43
- package/dist/serial-json.test.js +22 -22
- package/dist/system-ids.js +8 -8
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/tools-factory.d.ts +1 -1
- package/dist/tools/tools-factory.js +2 -2
- package/dist/types/assistant-runner-args.d.ts +3 -3
- package/dist/types/peer-device.d.ts +1 -1
- package/dist/types/peers-package.d.ts +3 -3
- package/dist/types/workflow-logger.d.ts +1 -1
- package/dist/types/workflow-run-context.d.ts +4 -4
- package/dist/types/workflow.d.ts +4 -4
- package/dist/types/workflow.js +27 -14
- package/dist/types/zod-types.d.ts +2 -1
- package/dist/types/zod-types.js +9 -3
- package/dist/user-connect/connection-code.d.ts +1 -1
- package/dist/user-connect/connection-code.js +7 -7
- package/dist/user-connect/connection-code.test.js +106 -106
- package/dist/user-connect/index.d.ts +3 -3
- package/dist/user-connect/index.js +1 -1
- package/dist/user-connect/user-connect.pvars.js +13 -11
- package/dist/user-connect/user-connect.types.d.ts +3 -3
- package/dist/users.query.d.ts +2 -2
- package/dist/users.query.js +40 -30
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +34 -32
- package/dist/utils.test.js +12 -8
- package/dist/workflow-log-formatter.d.ts +1 -1
- package/dist/workflow-log-formatter.js +17 -18
- package/package.json +14 -8
|
@@ -3,68 +3,62 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const data_query_1 = require("./data-query");
|
|
4
4
|
const data_query_sqlite_1 = require("./data-query.sqlite");
|
|
5
5
|
const factory_1 = require("./factory");
|
|
6
|
-
describe(
|
|
6
|
+
describe("dataFilterToSqlWhere (SQLite)", () => {
|
|
7
7
|
it('should return "1=1" when filter is empty', () => {
|
|
8
8
|
const filter = {};
|
|
9
9
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
10
|
-
expect(result).toBe(
|
|
10
|
+
expect(result).toBe("(1=1)");
|
|
11
11
|
});
|
|
12
|
-
it(
|
|
13
|
-
const filter = { name:
|
|
12
|
+
it("should return correct SQL WHERE clause for single field filter", () => {
|
|
13
|
+
const filter = { name: "John" };
|
|
14
14
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
15
15
|
expect(result).toBe(`("name" = 'John')`);
|
|
16
16
|
});
|
|
17
|
-
it(
|
|
18
|
-
const filter = { name:
|
|
17
|
+
it("should return correct SQL WHERE clause for multiple field filter", () => {
|
|
18
|
+
const filter = { name: "John", age: 30 };
|
|
19
19
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
20
20
|
expect(result).toBe(`("name" = 'John' AND "age" = 30)`);
|
|
21
21
|
});
|
|
22
|
-
it(
|
|
23
|
-
const filter = { name: { $in: [
|
|
22
|
+
it("should return correct SQL WHERE clause for $in filter", () => {
|
|
23
|
+
const filter = { name: { $in: ["John", "Jane"] } };
|
|
24
24
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
25
25
|
expect(result).toBe(`("name" IN ('John', 'Jane'))`);
|
|
26
26
|
});
|
|
27
|
-
it(
|
|
27
|
+
it("should handle null and undefined values correctly", () => {
|
|
28
28
|
const filter = { name: null, age: undefined };
|
|
29
29
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
30
30
|
expect(result).toBe(`("name" IS NULL AND "age" IS NULL)`);
|
|
31
31
|
});
|
|
32
|
-
it(
|
|
32
|
+
it("should escape single quotes in strings", () => {
|
|
33
33
|
const filter = { name: "John's" };
|
|
34
34
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
35
35
|
expect(result).toBe(`("name" = 'John''s')`);
|
|
36
36
|
});
|
|
37
|
-
it(
|
|
37
|
+
it("should escape multiple single quotes in strings", () => {
|
|
38
38
|
const filter = { name: "It's John''s" };
|
|
39
39
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
40
40
|
expect(result).toBe(`("name" = 'It''s John''''s')`);
|
|
41
41
|
});
|
|
42
|
-
it(
|
|
42
|
+
it("should escape single quotes in strings when doing $matchText", () => {
|
|
43
43
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)({ name: { $matchWords: "It's John's" } });
|
|
44
44
|
expect(result).toBe(`("name" LIKE '%It''s%' AND "name" LIKE '%John''s%')`);
|
|
45
45
|
});
|
|
46
|
-
it(
|
|
46
|
+
it("should escape and preserver sequences of single quotes when doing $matchText", () => {
|
|
47
47
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)({ name: { $matchWords: "It''s John''s" } });
|
|
48
48
|
expect(result).toBe(`("name" LIKE '%It''''s%' AND "name" LIKE '%John''''s%')`);
|
|
49
49
|
});
|
|
50
|
-
it(
|
|
51
|
-
const filter = [
|
|
52
|
-
{ name: 'John' },
|
|
53
|
-
{ age: 32 },
|
|
54
|
-
];
|
|
50
|
+
it("should convert top level arrays into OR statements", () => {
|
|
51
|
+
const filter = [{ name: "John" }, { age: 32 }];
|
|
55
52
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
56
53
|
expect(result).toBe(`(("name" = 'John') OR ("age" = 32))`);
|
|
57
54
|
});
|
|
58
|
-
it(
|
|
59
|
-
const filter = [
|
|
60
|
-
{ name: 'John' },
|
|
61
|
-
{ age: 32, airport: { $in: ['LAX', 'PSP'] } },
|
|
62
|
-
];
|
|
55
|
+
it("should convert top level arrays into OR statements", () => {
|
|
56
|
+
const filter = [{ name: "John" }, { age: 32, airport: { $in: ["LAX", "PSP"] } }];
|
|
63
57
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
64
58
|
expect(result).toBe(`(("name" = 'John') OR ("age" = 32 AND "airport" IN ('LAX', 'PSP')))`);
|
|
65
59
|
});
|
|
66
|
-
it(
|
|
67
|
-
const filter = { age: { $nin: [29,
|
|
60
|
+
it("should convert $nin to NOT IN", () => {
|
|
61
|
+
const filter = { age: { $nin: [29, "lol"] } };
|
|
68
62
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
69
63
|
expect(result).toBe(`("age" NOT IN (29, 'lol'))`);
|
|
70
64
|
});
|
|
@@ -73,7 +67,7 @@ describe('dataFilterToSqlWhere (SQLite)', () => {
|
|
|
73
67
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
74
68
|
expect(result).toBe(`("age" >= 12)`);
|
|
75
69
|
});
|
|
76
|
-
it(
|
|
70
|
+
it("should convert $gt to >", () => {
|
|
77
71
|
const filter = [{ age: { $gt: 12 } }];
|
|
78
72
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
79
73
|
expect(result).toBe(`(("age" > 12))`);
|
|
@@ -83,217 +77,201 @@ describe('dataFilterToSqlWhere (SQLite)', () => {
|
|
|
83
77
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
84
78
|
expect(result).toBe(`((("age" <> 12 OR "age" IS NULL)))`);
|
|
85
79
|
});
|
|
86
|
-
it(
|
|
80
|
+
it("should escape single quotes for $ne", () => {
|
|
87
81
|
const filter = [{ name: { $ne: "O'Hara" } }];
|
|
88
82
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
89
83
|
expect(result).toBe(`((("name" <> 'O''Hara' OR "name" IS NULL)))`);
|
|
90
84
|
});
|
|
91
|
-
it(
|
|
85
|
+
it("should escape sequences single quotes for $ne", () => {
|
|
92
86
|
const filter = [{ name: { $ne: "O''Hara" } }];
|
|
93
87
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
94
88
|
expect(result).toBe(`((("name" <> 'O''''Hara' OR "name" IS NULL)))`);
|
|
95
89
|
});
|
|
96
|
-
it(
|
|
97
|
-
const filter = [
|
|
98
|
-
{ age: { $exists: true } },
|
|
99
|
-
{ age: { $exists: false } },
|
|
100
|
-
];
|
|
90
|
+
it("should convert $exists to IS or IS NOT NULL", () => {
|
|
91
|
+
const filter = [{ age: { $exists: true } }, { age: { $exists: false } }];
|
|
101
92
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
102
93
|
expect(result).toBe(`(("age" IS NOT NULL) OR ("age" IS NULL))`);
|
|
103
94
|
});
|
|
104
|
-
it(
|
|
105
|
-
const filter = [
|
|
106
|
-
{ age: { $lt: 10 } },
|
|
107
|
-
{ age: { $lte: 10 } },
|
|
108
|
-
{ age: { $ne: 10 } },
|
|
109
|
-
];
|
|
95
|
+
it("should convert $lt, $lte, $ne correctly", () => {
|
|
96
|
+
const filter = [{ age: { $lt: 10 } }, { age: { $lte: 10 } }, { age: { $ne: 10 } }];
|
|
110
97
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
111
98
|
expect(result).toBe(`(("age" < 10) OR ("age" <= 10) OR (("age" <> 10 OR "age" IS NULL)))`);
|
|
112
99
|
});
|
|
113
|
-
it(
|
|
114
|
-
const filter = { name: { $matchWords:
|
|
100
|
+
it("should convert $matchWords to a LIKE for each word", () => {
|
|
101
|
+
const filter = { name: { $matchWords: "John Doe" } };
|
|
115
102
|
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
116
103
|
expect(result).toBe(`("name" LIKE '%John%' AND "name" LIKE '%Doe%')`);
|
|
117
104
|
});
|
|
118
|
-
it(
|
|
119
|
-
let filter = { $and: [{ age: 32 }, { name:
|
|
105
|
+
it("should generate AND clause for $and directive", () => {
|
|
106
|
+
let filter = { $and: [{ age: 32 }, { name: "John" }] };
|
|
120
107
|
let result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
121
108
|
expect(result).toBe(`((("age" = 32) AND ("name" = 'John')))`);
|
|
122
109
|
filter = {
|
|
123
|
-
name: { $ne:
|
|
124
|
-
$and: [
|
|
125
|
-
{ age: { $gte: 30 } },
|
|
126
|
-
{ age: { $lte: 32 } },
|
|
127
|
-
{ name: { $matchWords: 'John Doe' } }
|
|
128
|
-
]
|
|
110
|
+
name: { $ne: "John M. Doe" },
|
|
111
|
+
$and: [{ age: { $gte: 30 } }, { age: { $lte: 32 } }, { name: { $matchWords: "John Doe" } }],
|
|
129
112
|
};
|
|
130
113
|
result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
131
114
|
expect(result).toBe(`(("name" <> 'John M. Doe' OR "name" IS NULL) AND (("age" >= 30) AND ("age" <= 32) AND ("name" LIKE '%John%' AND "name" LIKE '%Doe%')))`);
|
|
132
115
|
});
|
|
133
|
-
it(
|
|
134
|
-
|
|
135
|
-
|
|
116
|
+
it("should allow indicating columns with $ prefix", () => {
|
|
117
|
+
const filter = { id: { $gte: "$col1" } };
|
|
118
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
136
119
|
expect(result).toBe(`("id" >= "col1")`);
|
|
137
120
|
});
|
|
138
|
-
it(
|
|
139
|
-
|
|
140
|
-
|
|
121
|
+
it("should allow escaping $prefix with backslash", () => {
|
|
122
|
+
const filter = { id: { $gte: "\\$col1" } };
|
|
123
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
141
124
|
expect(result).toBe(`("id" >= '$col1')`);
|
|
142
125
|
});
|
|
143
|
-
it(
|
|
144
|
-
|
|
145
|
-
|
|
126
|
+
it("should leave backslash prefix if not followed by $", () => {
|
|
127
|
+
const filter = { id: { $gte: "\\col1" } };
|
|
128
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
146
129
|
expect(result).toBe(`("id" >= '\\col1')`);
|
|
147
130
|
});
|
|
148
|
-
it(
|
|
149
|
-
|
|
150
|
-
|
|
131
|
+
it("should generate substr clause for $substr directive on right hand side", () => {
|
|
132
|
+
const filter = { id: { $gte: { $substr: ["$col1", 2, 4] } } };
|
|
133
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
151
134
|
expect(result).toBe(`("id" >= (substr("col1", 2, 4)))`);
|
|
152
135
|
});
|
|
153
|
-
it(
|
|
154
|
-
|
|
155
|
-
|
|
136
|
+
it("should generate substr clauses for $substr directive on left hand side", () => {
|
|
137
|
+
const filter = { $expr: [{ $substr: ["$id1", -1, 1] }, { $eq: "a" }] };
|
|
138
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
156
139
|
expect(result).toBe(`((substr("id1", -1, 1)) = 'a')`);
|
|
157
140
|
});
|
|
158
|
-
it(
|
|
159
|
-
|
|
160
|
-
|
|
141
|
+
it("should generate substr clauses for $substr directive on left and right hand side", () => {
|
|
142
|
+
const filter = {
|
|
143
|
+
$expr: [{ $substr: ["$id1", -1, 1] }, { $gte: { $substr: ["$col1", 2, 4] } }],
|
|
144
|
+
};
|
|
145
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
161
146
|
expect(result).toBe(`((substr("id1", -1, 1)) >= (substr("col1", 2, 4)))`);
|
|
162
147
|
});
|
|
163
|
-
it(
|
|
164
|
-
|
|
165
|
-
|
|
148
|
+
it("should generate substr clause for $substr directive and correctly escape single quotes in string", () => {
|
|
149
|
+
const filter = { id: { $gte: { $substr: [`$id`, -1, 1] } } };
|
|
150
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
166
151
|
expect(result).toBe(`("id" >= (substr("id", -1, 1)))`);
|
|
167
152
|
});
|
|
168
|
-
it(
|
|
169
|
-
|
|
170
|
-
|
|
153
|
+
it("should generate substr clause for $expr directive and correctly escape single quotes in string", () => {
|
|
154
|
+
const filter = { $expr: [{ $substr: [`I'm a string`, -1, 1] }, { $gte: "a" }] };
|
|
155
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
171
156
|
expect(result).toBe(`((substr('I''m a string', -1, 1)) >= 'a')`);
|
|
172
157
|
});
|
|
173
|
-
it(
|
|
174
|
-
|
|
175
|
-
|
|
158
|
+
it("should generate substr clause for $expr directive and correctly escape double quotes in identifiers", () => {
|
|
159
|
+
const filter = { $expr: [{ $substr: ['$weird"col"name', -1, 1] }, { $gte: "a" }] };
|
|
160
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
176
161
|
expect(result).toBe(`((substr("weird""col""name", -1, 1)) >= 'a')`);
|
|
177
162
|
});
|
|
178
|
-
it(
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
expect(result).toBe(
|
|
163
|
+
it("should handle empty $or arrays without generating empty parentheses", () => {
|
|
164
|
+
const filter = { $or: [] };
|
|
165
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
166
|
+
expect(result).toBe("((1=1))");
|
|
182
167
|
});
|
|
183
|
-
it(
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
expect(result).toBe(
|
|
168
|
+
it("should handle $or arrays with filters that resolve to (1=1)", () => {
|
|
169
|
+
const filter = { $or: [{}] };
|
|
170
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
171
|
+
expect(result).toBe("(((1=1)))");
|
|
187
172
|
});
|
|
188
|
-
it(
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
expect(result).toBe(
|
|
173
|
+
it("should handle empty $and arrays without generating empty parentheses", () => {
|
|
174
|
+
const filter = { $and: [] };
|
|
175
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
176
|
+
expect(result).toBe("((1=1))");
|
|
192
177
|
});
|
|
193
|
-
it(
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
expect(result).toBe(
|
|
178
|
+
it("should handle $and arrays with filters that resolve to (1=1)", () => {
|
|
179
|
+
const filter = { $and: [{}] };
|
|
180
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
181
|
+
expect(result).toBe("(((1=1)))");
|
|
197
182
|
});
|
|
198
|
-
it(
|
|
199
|
-
|
|
200
|
-
$and: [
|
|
201
|
-
{ name: 'John' },
|
|
202
|
-
{ $or: [] }
|
|
203
|
-
]
|
|
183
|
+
it("should handle mixed $or and $and with empty conditions", () => {
|
|
184
|
+
const filter = {
|
|
185
|
+
$and: [{ name: "John" }, { $or: [] }],
|
|
204
186
|
};
|
|
205
|
-
|
|
187
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
206
188
|
expect(result).toBe(`((("name" = 'John') AND ((1=1))))`);
|
|
207
189
|
});
|
|
208
|
-
it(
|
|
209
|
-
|
|
210
|
-
expect(() => (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter)).toThrow(
|
|
190
|
+
it("should throw error for direct array usage", () => {
|
|
191
|
+
const filter = { name: ["John", "Jane"] };
|
|
192
|
+
expect(() => (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter)).toThrow("Invalid filter: Arrays are not allowed as direct field values. Use $in instead: { name: { $in: ['John', 'Jane'] } }");
|
|
211
193
|
});
|
|
212
|
-
it(
|
|
213
|
-
|
|
214
|
-
|
|
194
|
+
it("should handle $in operator correctly", () => {
|
|
195
|
+
const filter = { name: { $in: ["John", "Jane", "Bob"] } };
|
|
196
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
215
197
|
expect(result).toBe(`("name" IN ('John', 'Jane', 'Bob'))`);
|
|
216
198
|
});
|
|
217
|
-
it(
|
|
218
|
-
|
|
219
|
-
expect(() => (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter)).toThrow(
|
|
199
|
+
it("should throw error for $in with non-array value", () => {
|
|
200
|
+
const filter = { name: { $in: "John" } };
|
|
201
|
+
expect(() => (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter)).toThrow("$in value must be an array");
|
|
220
202
|
});
|
|
221
203
|
});
|
|
222
|
-
describe(
|
|
223
|
-
it(
|
|
224
|
-
const sortBy = [
|
|
225
|
-
let filter = { id: { $gte:
|
|
204
|
+
describe("filterToSkipPastValue", () => {
|
|
205
|
+
it("should a filter limited to results after the next item", () => {
|
|
206
|
+
const sortBy = ["id"];
|
|
207
|
+
let filter = { id: { $gte: "$col1" } };
|
|
226
208
|
filter = (0, data_query_1.filterToSkipPastValue)(filter, sortBy, { id: 10 });
|
|
227
209
|
expect(filter).toEqual({
|
|
228
210
|
$and: [
|
|
229
|
-
{ id: { $gte:
|
|
211
|
+
{ id: { $gte: "$col1" } },
|
|
230
212
|
{
|
|
231
|
-
$or: [
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
}
|
|
235
|
-
]
|
|
213
|
+
$or: [{ id: { $gt: 10 } }],
|
|
214
|
+
},
|
|
215
|
+
],
|
|
236
216
|
});
|
|
237
|
-
|
|
217
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
238
218
|
expect(result).toBe(`((("id" >= "col1") AND ((("id" > 10)))))`);
|
|
239
219
|
});
|
|
240
|
-
it(
|
|
241
|
-
const sortBy = [
|
|
242
|
-
let filter = { id: { $gte:
|
|
220
|
+
it("should a work with descending sorts", () => {
|
|
221
|
+
const sortBy = ["-id"];
|
|
222
|
+
let filter = { id: { $gte: "$col1" } };
|
|
243
223
|
filter = (0, data_query_1.filterToSkipPastValue)(filter, sortBy, { id: 10 });
|
|
244
224
|
expect(filter).toEqual({
|
|
245
225
|
$and: [
|
|
246
|
-
{ id: { $gte:
|
|
226
|
+
{ id: { $gte: "$col1" } },
|
|
247
227
|
{
|
|
248
|
-
$or: [
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
252
|
-
]
|
|
228
|
+
$or: [{ id: { $lt: 10 } }],
|
|
229
|
+
},
|
|
230
|
+
],
|
|
253
231
|
});
|
|
254
|
-
|
|
232
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
255
233
|
expect(result).toBe(`((("id" >= "col1") AND ((("id" < 10)))))`);
|
|
256
234
|
});
|
|
257
|
-
it(
|
|
258
|
-
const sortBy = [
|
|
259
|
-
let filter = { id: { $gte:
|
|
260
|
-
filter = (0, data_query_1.filterToSkipPastValue)(filter, sortBy, { id: 10, name:
|
|
235
|
+
it("should work with multiple sorts", () => {
|
|
236
|
+
const sortBy = ["name", "-id", "age"];
|
|
237
|
+
let filter = { id: { $gte: "$col1" } };
|
|
238
|
+
filter = (0, data_query_1.filterToSkipPastValue)(filter, sortBy, { id: 10, name: "test", age: 30 });
|
|
261
239
|
expect(filter).toEqual({
|
|
262
240
|
$and: [
|
|
263
|
-
{ id: { $gte:
|
|
241
|
+
{ id: { $gte: "$col1" } },
|
|
264
242
|
{
|
|
265
243
|
$or: [
|
|
266
|
-
{ name: { $gt:
|
|
267
|
-
{ name: { $eq:
|
|
268
|
-
{ name: { $eq:
|
|
269
|
-
]
|
|
270
|
-
}
|
|
271
|
-
]
|
|
244
|
+
{ name: { $gt: "test" } },
|
|
245
|
+
{ name: { $eq: "test" }, id: { $lt: 10 } },
|
|
246
|
+
{ name: { $eq: "test" }, id: { $eq: 10 }, age: { $gt: 30 } },
|
|
247
|
+
],
|
|
248
|
+
},
|
|
249
|
+
],
|
|
272
250
|
});
|
|
273
|
-
|
|
251
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
274
252
|
expect(result).toBe(`((("id" >= "col1") AND ((("name" > 'test') OR ("id" < 10 AND "name" = 'test') OR ("age" > 30 AND "id" = 10 AND "name" = 'test')))))`);
|
|
275
253
|
});
|
|
276
|
-
it(
|
|
277
|
-
const sortBy = [
|
|
278
|
-
let filter = { id: { $gte:
|
|
254
|
+
it("should correctly handle null values", () => {
|
|
255
|
+
const sortBy = ["name", "-id", "age"];
|
|
256
|
+
let filter = { id: { $gte: "$col1" } };
|
|
279
257
|
filter = (0, data_query_1.filterToSkipPastValue)(filter, sortBy, { id: 10 });
|
|
280
258
|
expect(filter).toEqual({
|
|
281
259
|
$and: [
|
|
282
|
-
{ id: { $gte:
|
|
260
|
+
{ id: { $gte: "$col1" } },
|
|
283
261
|
{
|
|
284
262
|
$or: [
|
|
285
263
|
{ name: { $exists: true } },
|
|
286
264
|
{ name: { $exists: false }, id: { $lt: 10 } },
|
|
287
265
|
{ name: { $exists: false }, id: { $eq: 10 }, age: { $exists: true } },
|
|
288
|
-
]
|
|
289
|
-
}
|
|
290
|
-
]
|
|
266
|
+
],
|
|
267
|
+
},
|
|
268
|
+
],
|
|
291
269
|
});
|
|
292
|
-
|
|
270
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
293
271
|
expect(result).toBe(`((("id" >= "col1") AND ((("name" IS NOT NULL) OR ("id" < 10 AND "name" IS NULL) OR ("age" IS NOT NULL AND "id" = 10 AND "name" IS NULL)))))`);
|
|
294
272
|
});
|
|
295
|
-
it(
|
|
296
|
-
const sortBy = [
|
|
273
|
+
it("should handle empty filter", () => {
|
|
274
|
+
const sortBy = ["name", "-id", "age"];
|
|
297
275
|
let filter = {};
|
|
298
276
|
filter = (0, data_query_1.filterToSkipPastValue)(filter, sortBy, { id: 10 });
|
|
299
277
|
expect(filter).toEqual({
|
|
@@ -304,36 +282,36 @@ describe('filterToSkipPastValue', () => {
|
|
|
304
282
|
{ name: { $exists: true } },
|
|
305
283
|
{ name: { $exists: false }, id: { $lt: 10 } },
|
|
306
284
|
{ name: { $exists: false }, id: { $eq: 10 }, age: { $exists: true } },
|
|
307
|
-
]
|
|
308
|
-
}
|
|
309
|
-
]
|
|
285
|
+
],
|
|
286
|
+
},
|
|
287
|
+
],
|
|
310
288
|
});
|
|
311
|
-
|
|
312
|
-
expect(result).toBe(`(((1=1) AND (((
|
|
289
|
+
const result = (0, data_query_sqlite_1.dataFilterToSqlWhere)(filter);
|
|
290
|
+
expect(result).toBe(`(((1=1) AND ((("name" IS NOT NULL) OR ("id" < 10 AND "name" IS NULL) OR ("age" IS NOT NULL AND "id" = 10 AND "name" IS NULL)))))`);
|
|
313
291
|
});
|
|
314
292
|
});
|
|
315
293
|
const aryTable = (0, factory_1.arrayAsTable)([
|
|
316
|
-
{ id: 1, name:
|
|
317
|
-
{ id: 2, name:
|
|
318
|
-
{ id: 3, name:
|
|
319
|
-
{ id: 4, name:
|
|
320
|
-
{ id: 5, name:
|
|
294
|
+
{ id: 1, name: "John", age: 30 },
|
|
295
|
+
{ id: 2, name: "Jane", age: 32 },
|
|
296
|
+
{ id: 3, name: "Joe", age: 29 },
|
|
297
|
+
{ id: 4, name: "Jeb", age: 50 },
|
|
298
|
+
{ id: 5, name: "Joey", age: 31 },
|
|
321
299
|
], {
|
|
322
|
-
name:
|
|
300
|
+
name: "People",
|
|
323
301
|
});
|
|
324
|
-
describe(
|
|
325
|
-
describe(
|
|
302
|
+
describe("DataQuery", () => {
|
|
303
|
+
describe("cursor", () => {
|
|
326
304
|
const query = new data_query_1.DataQuery(aryTable);
|
|
327
305
|
query.pageSize = 2;
|
|
328
|
-
it(
|
|
329
|
-
|
|
306
|
+
it("should allow async iteration via `for await`", async () => {
|
|
307
|
+
const results = [];
|
|
330
308
|
for await (const item of query.cursor()) {
|
|
331
309
|
results.push(item.id);
|
|
332
310
|
}
|
|
333
311
|
expect(results).toEqual([1, 2, 3, 4, 5]);
|
|
334
312
|
});
|
|
335
|
-
it(
|
|
336
|
-
|
|
313
|
+
it("should allow async iteration via `while await next`", async () => {
|
|
314
|
+
const results = [];
|
|
337
315
|
const cursor = query.cursor();
|
|
338
316
|
while (await cursor.next()) {
|
|
339
317
|
results.push(cursor.value?.id);
|
|
@@ -342,23 +320,23 @@ describe('DataQuery', () => {
|
|
|
342
320
|
});
|
|
343
321
|
});
|
|
344
322
|
});
|
|
345
|
-
describe(
|
|
323
|
+
describe("dataQueryToSqliteQuery", () => {
|
|
346
324
|
const aryTable = (0, factory_1.arrayAsTable)([
|
|
347
|
-
{ id: 1, name:
|
|
348
|
-
{ id: 2, name:
|
|
349
|
-
{ id: 3, name:
|
|
325
|
+
{ id: 1, name: "John", age: 30 },
|
|
326
|
+
{ id: 2, name: "Jane", age: 32 },
|
|
327
|
+
{ id: 3, name: "Joe", age: 29 },
|
|
350
328
|
], {
|
|
351
|
-
name:
|
|
329
|
+
name: "People",
|
|
352
330
|
});
|
|
353
331
|
function fmtSql(sql) {
|
|
354
|
-
return sql.replace(/
|
|
332
|
+
return sql.replace(/ {6}/g, "").trim();
|
|
355
333
|
}
|
|
356
334
|
let query = new data_query_1.DataQuery(aryTable);
|
|
357
335
|
beforeEach(() => {
|
|
358
336
|
query = new data_query_1.DataQuery(aryTable);
|
|
359
337
|
});
|
|
360
|
-
it(
|
|
361
|
-
|
|
338
|
+
it("should return correct SQL query for empty query", () => {
|
|
339
|
+
const sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
362
340
|
expect(sql).toBe(fmtSql(`
|
|
363
341
|
SELECT
|
|
364
342
|
*
|
|
@@ -367,9 +345,9 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
367
345
|
ORDER BY 1
|
|
368
346
|
`));
|
|
369
347
|
});
|
|
370
|
-
it(
|
|
348
|
+
it("should generate single clause for single field filter", () => {
|
|
371
349
|
query.filter = { age: 30 };
|
|
372
|
-
|
|
350
|
+
const sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
373
351
|
expect(sql).toBe(fmtSql(`
|
|
374
352
|
SELECT
|
|
375
353
|
*
|
|
@@ -378,9 +356,9 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
378
356
|
ORDER BY 1
|
|
379
357
|
`));
|
|
380
358
|
});
|
|
381
|
-
it(
|
|
382
|
-
query.filter = { age: 30, name:
|
|
383
|
-
|
|
359
|
+
it("should generate AND clause for multi-field filter", () => {
|
|
360
|
+
query.filter = { age: 30, name: "John" };
|
|
361
|
+
const sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
384
362
|
expect(sql).toBe(fmtSql(`
|
|
385
363
|
SELECT
|
|
386
364
|
*
|
|
@@ -389,10 +367,10 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
389
367
|
ORDER BY 1
|
|
390
368
|
`));
|
|
391
369
|
});
|
|
392
|
-
it(
|
|
370
|
+
it("should generate OR LIKE clauses for all fields for text search", () => {
|
|
393
371
|
query.filter = {};
|
|
394
|
-
query.textSearch =
|
|
395
|
-
|
|
372
|
+
query.textSearch = "John";
|
|
373
|
+
const sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
396
374
|
expect(sql).toBe(fmtSql(`
|
|
397
375
|
SELECT
|
|
398
376
|
*
|
|
@@ -401,10 +379,10 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
401
379
|
ORDER BY 1
|
|
402
380
|
`));
|
|
403
381
|
});
|
|
404
|
-
it(
|
|
382
|
+
it("should handle empty filter and text search with only spaces", () => {
|
|
405
383
|
query.filter = {};
|
|
406
|
-
query.textSearch =
|
|
407
|
-
|
|
384
|
+
query.textSearch = " ";
|
|
385
|
+
const sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
408
386
|
expect(sql).toBe(fmtSql(`
|
|
409
387
|
SELECT
|
|
410
388
|
*
|
|
@@ -413,10 +391,10 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
413
391
|
ORDER BY 1
|
|
414
392
|
`));
|
|
415
393
|
});
|
|
416
|
-
it(
|
|
394
|
+
it("should handle filter and text search with only spaces", () => {
|
|
417
395
|
query.filter = { age: 30 };
|
|
418
|
-
query.textSearch =
|
|
419
|
-
|
|
396
|
+
query.textSearch = " ";
|
|
397
|
+
const sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
420
398
|
expect(sql).toBe(fmtSql(`
|
|
421
399
|
SELECT
|
|
422
400
|
*
|
|
@@ -425,10 +403,10 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
425
403
|
ORDER BY 1
|
|
426
404
|
`));
|
|
427
405
|
});
|
|
428
|
-
it(
|
|
406
|
+
it("should generate OR LIKE clauses for all fields for text search for each word given", () => {
|
|
429
407
|
query.filter = {};
|
|
430
|
-
query.textSearch =
|
|
431
|
-
|
|
408
|
+
query.textSearch = "John Smith";
|
|
409
|
+
const sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
432
410
|
expect(sql).toBe(fmtSql(`
|
|
433
411
|
SELECT
|
|
434
412
|
*
|
|
@@ -437,11 +415,11 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
437
415
|
ORDER BY 1
|
|
438
416
|
`));
|
|
439
417
|
});
|
|
440
|
-
it(
|
|
418
|
+
it("should generate OR LIKE clauses for all fields for exact text when specified", () => {
|
|
441
419
|
query.filter = {};
|
|
442
|
-
query.textSearch =
|
|
420
|
+
query.textSearch = "John Smith";
|
|
443
421
|
query.textSearchExact = true;
|
|
444
|
-
|
|
422
|
+
const sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
445
423
|
expect(sql).toBe(fmtSql(`
|
|
446
424
|
SELECT
|
|
447
425
|
*
|
|
@@ -450,8 +428,8 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
450
428
|
ORDER BY 1
|
|
451
429
|
`));
|
|
452
430
|
});
|
|
453
|
-
it(
|
|
454
|
-
query.filter = { $or: [{ age: 32 }, { name:
|
|
431
|
+
it("should generate OR clause for $or directive", () => {
|
|
432
|
+
query.filter = { $or: [{ age: 32 }, { name: "John" }] };
|
|
455
433
|
let sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
456
434
|
expect(sql).toBe(fmtSql(`
|
|
457
435
|
SELECT
|
|
@@ -460,7 +438,14 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
460
438
|
WHERE ((("age" = 32) OR ("name" = 'John')))
|
|
461
439
|
ORDER BY 1
|
|
462
440
|
`));
|
|
463
|
-
query.filter = {
|
|
441
|
+
query.filter = {
|
|
442
|
+
$or: [
|
|
443
|
+
{ age: 30, name: "John" },
|
|
444
|
+
{ age: 32, name: "Jane" },
|
|
445
|
+
],
|
|
446
|
+
id: { $in: [1, 2, 3] },
|
|
447
|
+
name: { $ne: "Joe" },
|
|
448
|
+
};
|
|
464
449
|
sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
465
450
|
expect(sql).toBe(fmtSql(`
|
|
466
451
|
SELECT
|
|
@@ -470,8 +455,8 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
470
455
|
ORDER BY 1
|
|
471
456
|
`));
|
|
472
457
|
});
|
|
473
|
-
it(
|
|
474
|
-
query.filter = { $and: [{ age: 32 }, { name:
|
|
458
|
+
it("should generate AND clause for $and directive", () => {
|
|
459
|
+
query.filter = { $and: [{ age: 32 }, { name: "John" }] };
|
|
475
460
|
let sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
476
461
|
expect(sql).toBe(fmtSql(`
|
|
477
462
|
SELECT
|
|
@@ -480,7 +465,14 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
480
465
|
WHERE ((("age" = 32) AND ("name" = 'John')))
|
|
481
466
|
ORDER BY 1
|
|
482
467
|
`));
|
|
483
|
-
query.filter = {
|
|
468
|
+
query.filter = {
|
|
469
|
+
$and: [
|
|
470
|
+
{ age: 30, name: "John" },
|
|
471
|
+
{ age: 32, name: "Jane" },
|
|
472
|
+
],
|
|
473
|
+
id: { $in: [1, 2, 3] },
|
|
474
|
+
name: { $ne: "Joe" },
|
|
475
|
+
};
|
|
484
476
|
sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
485
477
|
expect(sql).toBe(fmtSql(`
|
|
486
478
|
SELECT
|
|
@@ -490,10 +482,10 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
490
482
|
ORDER BY 1
|
|
491
483
|
`));
|
|
492
484
|
});
|
|
493
|
-
it(
|
|
494
|
-
query.filter =
|
|
495
|
-
query.textSearch =
|
|
496
|
-
|
|
485
|
+
it("should combine filter and textSearch with AND", () => {
|
|
486
|
+
query.filter = { age: 30 };
|
|
487
|
+
query.textSearch = "John";
|
|
488
|
+
const sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
497
489
|
expect(sql).toBe(fmtSql(`
|
|
498
490
|
SELECT
|
|
499
491
|
*
|
|
@@ -502,11 +494,11 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
502
494
|
ORDER BY 1
|
|
503
495
|
`));
|
|
504
496
|
});
|
|
505
|
-
it(
|
|
506
|
-
query.filter =
|
|
507
|
-
query.textSearch =
|
|
508
|
-
query.pageSize =
|
|
509
|
-
|
|
497
|
+
it("should respond correctly to pageSize changing", () => {
|
|
498
|
+
query.filter = {};
|
|
499
|
+
query.textSearch = "";
|
|
500
|
+
query.pageSize = 10;
|
|
501
|
+
const sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
510
502
|
expect(sql).toBe(fmtSql(`
|
|
511
503
|
SELECT
|
|
512
504
|
*
|
|
@@ -517,12 +509,12 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
517
509
|
OFFSET 0
|
|
518
510
|
`));
|
|
519
511
|
});
|
|
520
|
-
it(
|
|
521
|
-
query.filter =
|
|
522
|
-
query.textSearch =
|
|
523
|
-
query.pageSize =
|
|
524
|
-
query.page =
|
|
525
|
-
|
|
512
|
+
it("should calculate LIMIT and OFFSET from page and pageSize", () => {
|
|
513
|
+
query.filter = {};
|
|
514
|
+
query.textSearch = "";
|
|
515
|
+
query.pageSize = 10;
|
|
516
|
+
query.page = 10;
|
|
517
|
+
const sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
526
518
|
expect(sql).toBe(fmtSql(`
|
|
527
519
|
SELECT
|
|
528
520
|
*
|
|
@@ -533,13 +525,13 @@ describe('dataQueryToSqliteQuery', () => {
|
|
|
533
525
|
OFFSET 90
|
|
534
526
|
`));
|
|
535
527
|
});
|
|
536
|
-
it(
|
|
537
|
-
query.filter =
|
|
538
|
-
query.textSearch =
|
|
539
|
-
query.pageSize =
|
|
540
|
-
query.page =
|
|
541
|
-
query.sortBy =
|
|
542
|
-
|
|
528
|
+
it("should calculate LIMIT and OFFSET from page and pageSize", () => {
|
|
529
|
+
query.filter = {};
|
|
530
|
+
query.textSearch = "";
|
|
531
|
+
query.pageSize = 10;
|
|
532
|
+
query.page = 10;
|
|
533
|
+
query.sortBy = ["name", "-age"];
|
|
534
|
+
const sql = (0, data_query_sqlite_1.dataQueryToSqliteQuery)(query);
|
|
543
535
|
expect(sql).toBe(fmtSql(`
|
|
544
536
|
SELECT
|
|
545
537
|
*
|