@balena/abstract-sql-compiler 11.0.0-build-11-x-db9cd30f6ec498e5293df9e060f5531cd960b1cc-1 → 11.0.0-build-11-x-1d6801364e84c467215b1a2bd54345172071bdc2-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/.versionbot/CHANGELOG.yml +134 -4
- package/CHANGELOG.md +33 -2
- package/out/{AbstractSQLCompiler.d.ts → abstract-sql-compiler.d.ts} +55 -13
- package/out/{AbstractSQLCompiler.js → abstract-sql-compiler.js} +37 -19
- package/out/abstract-sql-compiler.js.map +1 -0
- package/out/abstract-sql-optimizer.d.ts +2 -0
- package/out/{AbstractSQLOptimiser.js → abstract-sql-optimizer.js} +35 -13
- package/out/abstract-sql-optimizer.js.map +1 -0
- package/out/{AbstractSQLRules2SQL.d.ts → abstract-sql-rules-to-sql.d.ts} +2 -2
- package/out/{AbstractSQLRules2SQL.js → abstract-sql-rules-to-sql.js} +74 -45
- package/out/abstract-sql-rules-to-sql.js.map +1 -0
- package/out/{AbstractSQLSchemaOptimiser.d.ts → abstract-sql-schema-optimizer.d.ts} +5 -3
- package/out/{AbstractSQLSchemaOptimiser.js → abstract-sql-schema-optimizer.js} +11 -9
- package/out/abstract-sql-schema-optimizer.js.map +1 -0
- package/out/referenced-fields.d.ts +1 -1
- package/out/referenced-fields.js +53 -4
- package/out/referenced-fields.js.map +1 -1
- package/package.json +14 -14
- package/src/{AbstractSQLCompiler.ts → abstract-sql-compiler.ts} +29 -38
- package/src/{AbstractSQLOptimiser.ts → abstract-sql-optimizer.ts} +21 -22
- package/src/{AbstractSQLRules2SQL.ts → abstract-sql-rules-to-sql.ts} +12 -6
- package/src/{AbstractSQLSchemaOptimiser.ts → abstract-sql-schema-optimizer.ts} +10 -18
- package/src/referenced-fields.ts +5 -5
- package/test/abstract-sql/case-when-else.ts +1 -1
- package/test/abstract-sql/dates.ts +23 -0
- package/test/abstract-sql/empty-query-optimisations.ts +1 -1
- package/test/abstract-sql/get-referenced-fields.ts +1 -1
- package/test/abstract-sql/get-rule-referenced-fields.ts +1 -1
- package/test/abstract-sql/schema-checks.ts +1 -1
- package/test/abstract-sql/schema-informative-reference.ts +19 -19
- package/test/abstract-sql/schema-rule-optimization.ts +2 -2
- package/test/abstract-sql/schema-rule-to-check.ts +6 -6
- package/test/abstract-sql/schema-views.ts +1 -1
- package/test/abstract-sql/test.ts +1 -1
- package/test/odata/filterby.ts +12 -12
- package/test/odata/{resource_parsing.ts → resource-parsing.ts} +3 -3
- package/test/odata/test.ts +1 -1
- package/test/sbvr/pilots.ts +12 -12
- package/test/sbvr/reference-type.ts +16 -16
- package/test/sbvr/test.ts +1 -1
- package/tsconfig.json +0 -1
- package/out/AbstractSQLCompiler.js.map +0 -1
- package/out/AbstractSQLOptimiser.d.ts +0 -2
- package/out/AbstractSQLOptimiser.js.map +0 -1
- package/out/AbstractSQLRules2SQL.js.map +0 -1
- package/out/AbstractSQLSchemaOptimiser.js.map +0 -1
- /package/test/abstract-sql/{functions_wrapper.ts → functions-wrapper.ts} +0 -0
@@ -4,18 +4,17 @@ export const enum Engines {
|
|
4
4
|
websql = 'websql',
|
5
5
|
}
|
6
6
|
|
7
|
-
import {
|
8
|
-
export { Binding, SqlResult } from './
|
7
|
+
import { AbstractSQLOptimizer } from './abstract-sql-optimizer.js';
|
8
|
+
export { Binding, SqlResult } from './abstract-sql-rules-to-sql.js';
|
9
9
|
import $sbvrTypes from '@balena/sbvr-types';
|
10
10
|
const { default: sbvrTypes } = $sbvrTypes;
|
11
11
|
import type {
|
12
12
|
AbstractSqlModel,
|
13
|
-
AbstractSqlQuery,
|
14
13
|
AbstractSqlType,
|
15
14
|
BooleanTypeNodes,
|
16
15
|
WhereNode,
|
17
|
-
} from './
|
18
|
-
import { isFromNode, isSelectQueryNode } from './
|
16
|
+
} from './abstract-sql-compiler.js';
|
17
|
+
import { isFromNode, isSelectQueryNode } from './abstract-sql-compiler.js';
|
19
18
|
|
20
19
|
const countFroms = (n: AbstractSqlType[]) => {
|
21
20
|
let count = 0;
|
@@ -44,26 +43,19 @@ export const generateRuleSlug = (
|
|
44
43
|
|
45
44
|
export const optimizeSchema = (
|
46
45
|
abstractSqlModel: AbstractSqlModel,
|
47
|
-
createCheckConstraints = true,
|
46
|
+
{ createCheckConstraints = true } = {},
|
48
47
|
): AbstractSqlModel => {
|
49
48
|
abstractSqlModel.rules = abstractSqlModel.rules
|
50
|
-
.map((rule)
|
51
|
-
const ruleBodyNode = rule
|
52
|
-
|
53
|
-
AbstractSqlQuery,
|
54
|
-
];
|
55
|
-
if (ruleBodyNode == null || typeof ruleBodyNode === 'string') {
|
49
|
+
.map((rule) => {
|
50
|
+
const [, ruleBodyNode, ruleSENode] = rule;
|
51
|
+
if (ruleBodyNode == null || ruleBodyNode[0] !== 'Body') {
|
56
52
|
throw new Error('Invalid rule');
|
57
53
|
}
|
58
54
|
let ruleBody = ruleBodyNode[1];
|
59
55
|
if (typeof ruleBody === 'string') {
|
60
56
|
throw new Error('Invalid rule');
|
61
57
|
}
|
62
|
-
|
63
|
-
'StructuredEnglish',
|
64
|
-
string,
|
65
|
-
];
|
66
|
-
if (ruleSENode == null) {
|
58
|
+
if (ruleSENode == null || ruleSENode[0] !== 'StructuredEnglish') {
|
67
59
|
throw new Error('Invalid structured English');
|
68
60
|
}
|
69
61
|
const ruleSE = ruleSENode[1];
|
@@ -72,7 +64,7 @@ export const optimizeSchema = (
|
|
72
64
|
}
|
73
65
|
|
74
66
|
// Optimize the rule body, this also normalizes it making the check constraint check easier
|
75
|
-
ruleBodyNode[1] = ruleBody =
|
67
|
+
ruleBodyNode[1] = ruleBody = AbstractSQLOptimizer(ruleBody, true);
|
76
68
|
|
77
69
|
const count = countFroms(ruleBody);
|
78
70
|
if (
|
package/src/referenced-fields.ts
CHANGED
@@ -48,7 +48,7 @@ import type {
|
|
48
48
|
ToJSONNode,
|
49
49
|
UnionQueryNode,
|
50
50
|
WhereNode,
|
51
|
-
} from './
|
51
|
+
} from './abstract-sql-compiler.js';
|
52
52
|
import {
|
53
53
|
isAliasNode,
|
54
54
|
isFromNode,
|
@@ -56,9 +56,9 @@ import {
|
|
56
56
|
isSelectQueryNode,
|
57
57
|
isTableNode,
|
58
58
|
isWhereNode,
|
59
|
-
} from './
|
60
|
-
import {
|
61
|
-
import { isAbstractSqlQuery } from './
|
59
|
+
} from './abstract-sql-compiler.js';
|
60
|
+
import { AbstractSQLOptimizer } from './abstract-sql-optimizer.js';
|
61
|
+
import { isAbstractSqlQuery } from './abstract-sql-rules-to-sql.js';
|
62
62
|
|
63
63
|
export interface ReferencedFields {
|
64
64
|
[alias: string]: string[];
|
@@ -266,7 +266,7 @@ const $getRuleReferencedFields = (
|
|
266
266
|
};
|
267
267
|
export const getRuleReferencedFields: EngineInstance['getRuleReferencedFields'] =
|
268
268
|
(ruleBody) => {
|
269
|
-
ruleBody =
|
269
|
+
ruleBody = AbstractSQLOptimizer(ruleBody);
|
270
270
|
const referencedFields: RuleReferencedFields = {};
|
271
271
|
if (
|
272
272
|
ruleBody[0] === 'Equals' &&
|
@@ -127,6 +127,29 @@ describe('DateTrunc', () => {
|
|
127
127
|
});
|
128
128
|
},
|
129
129
|
);
|
130
|
+
|
131
|
+
test(
|
132
|
+
[
|
133
|
+
'SelectQuery',
|
134
|
+
[
|
135
|
+
'Select',
|
136
|
+
[
|
137
|
+
[
|
138
|
+
'DateTrunc',
|
139
|
+
['EmbeddedText', 'year'],
|
140
|
+
['Date', '2022-10-10'],
|
141
|
+
['EmbeddedText', 'UTC'],
|
142
|
+
],
|
143
|
+
],
|
144
|
+
],
|
145
|
+
],
|
146
|
+
[['Date', '2022-10-10']],
|
147
|
+
(result, sqlEquals) => {
|
148
|
+
it('should produce a valid DateTrunc statement', () => {
|
149
|
+
sqlEquals(result, `SELECT DATE_TRUNC('year', $1, 'UTC')`);
|
150
|
+
});
|
151
|
+
},
|
152
|
+
);
|
130
153
|
});
|
131
154
|
|
132
155
|
describe('ToTime', () => {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { expect } from 'chai';
|
2
|
-
import * as AbstractSqlCompiler from '../../out/
|
2
|
+
import * as AbstractSqlCompiler from '../../out/abstract-sql-compiler.js';
|
3
3
|
|
4
4
|
describe('getReferencedFields', () => {
|
5
5
|
it('should work with selected fields', () => {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { expect } from 'chai';
|
2
|
-
import * as AbstractSqlCompiler from '../../out/
|
2
|
+
import * as AbstractSqlCompiler from '../../out/abstract-sql-compiler.js';
|
3
3
|
|
4
4
|
describe('getRuleReferencedFields', () => {
|
5
5
|
it('should work with single table NOT EXISTS', () => {
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import * as AbstractSQLCompiler from '../../out/
|
1
|
+
import * as AbstractSQLCompiler from '../../out/abstract-sql-compiler.js';
|
2
2
|
import { expect } from 'chai';
|
3
3
|
|
4
4
|
describe('generate informative reference schema', () => {
|
@@ -81,14 +81,14 @@ describe('generate informative reference schema', () => {
|
|
81
81
|
.that.deep.equals([
|
82
82
|
`\
|
83
83
|
CREATE TABLE IF NOT EXISTS "term" (
|
84
|
-
"created at"
|
85
|
-
, "modified at"
|
84
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
85
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
86
86
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
87
87
|
);`,
|
88
88
|
`\
|
89
89
|
CREATE TABLE IF NOT EXISTS "term history" (
|
90
|
-
"created at"
|
91
|
-
, "modified at"
|
90
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
91
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
92
92
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
93
93
|
, "references-term" INTEGER NOT NULL
|
94
94
|
);`,
|
@@ -210,20 +210,20 @@ CREATE TABLE IF NOT EXISTS "term history" (
|
|
210
210
|
.that.deep.equals([
|
211
211
|
`\
|
212
212
|
CREATE TABLE IF NOT EXISTS "term" (
|
213
|
-
"created at"
|
214
|
-
, "modified at"
|
213
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
214
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
215
215
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
216
216
|
);`,
|
217
217
|
`\
|
218
218
|
CREATE TABLE IF NOT EXISTS "termterm" (
|
219
|
-
"created at"
|
220
|
-
, "modified at"
|
219
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
220
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
221
221
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
222
222
|
);`,
|
223
223
|
`\
|
224
224
|
CREATE TABLE IF NOT EXISTS "term history" (
|
225
|
-
"created at"
|
226
|
-
, "modified at"
|
225
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
226
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
227
227
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
228
228
|
, "references-term" INTEGER NOT NULL
|
229
229
|
, "references-termterm" INTEGER NOT NULL
|
@@ -310,14 +310,14 @@ CREATE TABLE IF NOT EXISTS "term history" (
|
|
310
310
|
.that.deep.equals([
|
311
311
|
`\
|
312
312
|
CREATE TABLE IF NOT EXISTS "term" (
|
313
|
-
"created at"
|
314
|
-
, "modified at"
|
313
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
314
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
315
315
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
316
316
|
);`,
|
317
317
|
`\
|
318
318
|
CREATE TABLE IF NOT EXISTS "term history" (
|
319
|
-
"created at"
|
320
|
-
, "modified at"
|
319
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
320
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
321
321
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
322
322
|
, "references-term" INTEGER NOT NULL
|
323
323
|
, FOREIGN KEY ("references-term") REFERENCES "term" ("id")
|
@@ -403,14 +403,14 @@ CREATE TABLE IF NOT EXISTS "term history" (
|
|
403
403
|
.that.deep.equals([
|
404
404
|
`\
|
405
405
|
CREATE TABLE IF NOT EXISTS "term" (
|
406
|
-
"created at"
|
407
|
-
, "modified at"
|
406
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
407
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
408
408
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
409
409
|
);`,
|
410
410
|
`\
|
411
411
|
CREATE TABLE IF NOT EXISTS "term history" (
|
412
|
-
"created at"
|
413
|
-
, "modified at"
|
412
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
413
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
414
414
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
415
415
|
, "references-term" INTEGER NOT NULL
|
416
416
|
, FOREIGN KEY ("references-term") REFERENCES "term" ("id")
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import * as AbstractSQLCompiler from '../../out/
|
1
|
+
import * as AbstractSQLCompiler from '../../out/abstract-sql-compiler.js';
|
2
2
|
import { expect } from 'chai';
|
3
3
|
|
4
4
|
const generateSchema = (
|
@@ -70,7 +70,7 @@ it('should convert a basic rule to a check', () => {
|
|
70
70
|
],
|
71
71
|
],
|
72
72
|
],
|
73
|
-
]
|
73
|
+
],
|
74
74
|
['StructuredEnglish', 'Test rule abstract sql optimization'],
|
75
75
|
],
|
76
76
|
],
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import * as AbstractSQLCompiler from '../../out/
|
1
|
+
import * as AbstractSQLCompiler from '../../out/abstract-sql-compiler.js';
|
2
2
|
import { expect } from 'chai';
|
3
3
|
|
4
4
|
const generateSchema = (
|
@@ -60,7 +60,7 @@ it('should convert a basic rule to a check using NOT EXISTS', () => {
|
|
60
60
|
],
|
61
61
|
],
|
62
62
|
],
|
63
|
-
]
|
63
|
+
],
|
64
64
|
[
|
65
65
|
'StructuredEnglish',
|
66
66
|
'It is necessary that each test has an id that is greater than 0.',
|
@@ -132,7 +132,7 @@ it('should convert a basic rule to a check using COUNT(*) = 0', () => {
|
|
132
132
|
],
|
133
133
|
['Number', 0],
|
134
134
|
],
|
135
|
-
]
|
135
|
+
],
|
136
136
|
[
|
137
137
|
'StructuredEnglish',
|
138
138
|
'It is necessary that each test has an id that is greater than 0.',
|
@@ -224,7 +224,7 @@ it('should correctly shorten a converted check rule with a long name', () => {
|
|
224
224
|
],
|
225
225
|
],
|
226
226
|
],
|
227
|
-
]
|
227
|
+
],
|
228
228
|
[
|
229
229
|
'StructuredEnglish',
|
230
230
|
'It is necessary that each test_table_with_very_very_long_name has an id that is greater than 0.',
|
@@ -298,7 +298,7 @@ it('should work with differing table/resource names using NOT EXISTS', () => {
|
|
298
298
|
],
|
299
299
|
],
|
300
300
|
],
|
301
|
-
]
|
301
|
+
],
|
302
302
|
[
|
303
303
|
'StructuredEnglish',
|
304
304
|
'It is necessary that each test has an id that is greater than 0.',
|
@@ -370,7 +370,7 @@ it('should work with differing table/resource names using COUNT(*) = 0', () => {
|
|
370
370
|
],
|
371
371
|
['Number', 0],
|
372
372
|
],
|
373
|
-
]
|
373
|
+
],
|
374
374
|
[
|
375
375
|
'StructuredEnglish',
|
376
376
|
'It is necessary that each test has an id that is greater than 0.',
|
package/test/odata/filterby.ts
CHANGED
@@ -17,7 +17,7 @@ import type {
|
|
17
17
|
Binding,
|
18
18
|
DurationNode,
|
19
19
|
SqlResult,
|
20
|
-
} from '../../out/
|
20
|
+
} from '../../out/abstract-sql-compiler.js';
|
21
21
|
|
22
22
|
const pilotFieldsStr = pilotFields.join(', ');
|
23
23
|
const aliasPilotCanFlyPlaneFieldsStr = aliasPilotCanFlyPlaneFields.join(', ');
|
@@ -318,25 +318,25 @@ const createMethodCall = function (method: string, ...args: Operand[]) {
|
|
318
318
|
case 'HOUR':
|
319
319
|
case 'MINUTE':
|
320
320
|
return {
|
321
|
-
sql: `EXTRACT('${method}' FROM DATE_TRUNC('milliseconds', ${parsedArgs[0].sql}))`,
|
321
|
+
sql: `EXTRACT('${method}' FROM DATE_TRUNC('milliseconds', ${parsedArgs[0].sql}, 'UTC'))`,
|
322
322
|
bindings: parsedArgs[0].bindings,
|
323
323
|
odata,
|
324
324
|
};
|
325
325
|
case 'SECOND':
|
326
326
|
return {
|
327
|
-
sql: `FLOOR(EXTRACT('${method}' FROM DATE_TRUNC('milliseconds', ${parsedArgs[0].sql})))`,
|
327
|
+
sql: `FLOOR(EXTRACT('${method}' FROM DATE_TRUNC('milliseconds', ${parsedArgs[0].sql}, 'UTC')))`,
|
328
328
|
bindings: parsedArgs[0].bindings,
|
329
329
|
odata,
|
330
330
|
};
|
331
331
|
case 'FRACTIONALSECONDS':
|
332
332
|
return {
|
333
|
-
sql: `EXTRACT('SECOND' FROM DATE_TRUNC('milliseconds', ${parsedArgs[0].sql})) - FLOOR(EXTRACT('SECOND' FROM DATE_TRUNC('milliseconds', ${parsedArgs[0].sql})))`,
|
333
|
+
sql: `EXTRACT('SECOND' FROM DATE_TRUNC('milliseconds', ${parsedArgs[0].sql}, 'UTC')) - FLOOR(EXTRACT('SECOND' FROM DATE_TRUNC('milliseconds', ${parsedArgs[0].sql}, 'UTC')))`,
|
334
334
|
bindings: parsedArgs[0].bindings,
|
335
335
|
odata,
|
336
336
|
};
|
337
337
|
case 'TIME':
|
338
338
|
return {
|
339
|
-
sql: `CAST(DATE_TRUNC('milliseconds', ${parsedArgs[0].sql}) AS ${method})`,
|
339
|
+
sql: `CAST(DATE_TRUNC('milliseconds', ${parsedArgs[0].sql}, 'UTC') AS ${method})`,
|
340
340
|
bindings: parsedArgs[0].bindings,
|
341
341
|
odata,
|
342
342
|
};
|
@@ -348,7 +348,7 @@ const createMethodCall = function (method: string, ...args: Operand[]) {
|
|
348
348
|
};
|
349
349
|
case 'DATE':
|
350
350
|
return {
|
351
|
-
sql: `DATE(DATE_TRUNC('milliseconds', ${parsedArgs[0].sql}))`,
|
351
|
+
sql: `DATE(DATE_TRUNC('milliseconds', ${parsedArgs[0].sql}, 'UTC'))`,
|
352
352
|
bindings: parsedArgs[0].bindings,
|
353
353
|
odata,
|
354
354
|
};
|
@@ -637,7 +637,7 @@ run(function () {
|
|
637
637
|
INSERT INTO "pilot" ("name")
|
638
638
|
SELECT "$insert"."name"
|
639
639
|
FROM (
|
640
|
-
SELECT CAST(NULL AS
|
640
|
+
SELECT CAST(NULL AS TIMESTAMPTZ) AS "created at", CAST(NULL AS TIMESTAMPTZ) AS "modified at", CAST(NULL AS INTEGER) AS "id", CAST(NULL AS INTEGER) AS "person", CAST(NULL AS BOOLEAN) AS "is experienced", CAST(? AS VARCHAR(255)) AS "name", CAST(NULL AS INTEGER) AS "age", CAST(NULL AS INTEGER) AS "favourite colour", CAST(NULL AS INTEGER) AS "is on-team", CAST(NULL AS INTEGER) AS "licence", CAST(NULL AS TIMESTAMPTZ) AS "hire date", CAST(NULL AS INTEGER) AS "was trained by-pilot"
|
641
641
|
) AS "$insert"
|
642
642
|
WHERE EXISTS (
|
643
643
|
SELECT 1
|
@@ -778,7 +778,7 @@ run(function () {
|
|
778
778
|
INSERT INTO "pilot" ("name")
|
779
779
|
SELECT "$insert"."name"
|
780
780
|
FROM (
|
781
|
-
SELECT CAST(NULL AS
|
781
|
+
SELECT CAST(NULL AS TIMESTAMPTZ) AS "created at", CAST(NULL AS TIMESTAMPTZ) AS "modified at", CAST(NULL AS INTEGER) AS "id", CAST(NULL AS INTEGER) AS "person", CAST(NULL AS BOOLEAN) AS "is experienced", CAST(? AS VARCHAR(255)) AS "name", CAST(NULL AS INTEGER) AS "age", CAST(NULL AS INTEGER) AS "favourite colour", CAST(NULL AS INTEGER) AS "is on-team", CAST(NULL AS INTEGER) AS "licence", CAST(NULL AS TIMESTAMPTZ) AS "hire date", CAST(NULL AS INTEGER) AS "was trained by-pilot"
|
782
782
|
) AS "$insert"
|
783
783
|
WHERE EXISTS (
|
784
784
|
SELECT 1
|
@@ -853,7 +853,7 @@ AND "pilot"."id" IN ((
|
|
853
853
|
INSERT INTO "pilot" ("id", "name")
|
854
854
|
SELECT "$insert"."id", "$insert"."name"
|
855
855
|
FROM (
|
856
|
-
SELECT CAST(NULL AS
|
856
|
+
SELECT CAST(NULL AS TIMESTAMPTZ) AS "created at", CAST(NULL AS TIMESTAMPTZ) AS "modified at", CAST(? AS INTEGER) AS "id", CAST(NULL AS INTEGER) AS "person", CAST(NULL AS BOOLEAN) AS "is experienced", CAST(? AS VARCHAR(255)) AS "name", CAST(NULL AS INTEGER) AS "age", CAST(NULL AS INTEGER) AS "favourite colour", CAST(NULL AS INTEGER) AS "is on-team", CAST(NULL AS INTEGER) AS "licence", CAST(NULL AS TIMESTAMPTZ) AS "hire date", CAST(NULL AS INTEGER) AS "was trained by-pilot"
|
857
857
|
) AS "$insert"
|
858
858
|
WHERE EXISTS (
|
859
859
|
SELECT 1
|
@@ -1420,7 +1420,7 @@ run(function () {
|
|
1420
1420
|
INSERT INTO "team" ("favourite colour")
|
1421
1421
|
SELECT "$insert"."favourite colour"
|
1422
1422
|
FROM (
|
1423
|
-
SELECT CAST(NULL AS
|
1423
|
+
SELECT CAST(NULL AS TIMESTAMPTZ) AS "created at", CAST(NULL AS TIMESTAMPTZ) AS "modified at", CAST(? AS INTEGER) AS "favourite colour"
|
1424
1424
|
) AS "$insert"
|
1425
1425
|
WHERE EXISTS (
|
1426
1426
|
SELECT 1
|
@@ -1466,7 +1466,7 @@ run(function () {
|
|
1466
1466
|
`\
|
1467
1467
|
SELECT ${pilotFieldsStr}
|
1468
1468
|
FROM "pilot"
|
1469
|
-
WHERE CURRENT_TIMESTAMP - DATE_TRUNC('milliseconds', "pilot"."created at") < INTERVAL '1 0:0:0.0'`,
|
1469
|
+
WHERE CURRENT_TIMESTAMP - DATE_TRUNC('milliseconds', "pilot"."created at", 'UTC') < INTERVAL '1 0:0:0.0'`,
|
1470
1470
|
);
|
1471
1471
|
});
|
1472
1472
|
});
|
@@ -1495,7 +1495,7 @@ run(function () {
|
|
1495
1495
|
`\
|
1496
1496
|
SELECT ${pilotFieldsStr}
|
1497
1497
|
FROM "pilot"
|
1498
|
-
WHERE DATE_TRUNC('milliseconds', "pilot"."created at") + INTERVAL '1 0:0:0.0' > CURRENT_TIMESTAMP`,
|
1498
|
+
WHERE DATE_TRUNC('milliseconds', "pilot"."created at", 'UTC') + INTERVAL '1 0:0:0.0' > CURRENT_TIMESTAMP`,
|
1499
1499
|
);
|
1500
1500
|
});
|
1501
1501
|
});
|
@@ -10,7 +10,7 @@ import {
|
|
10
10
|
aliasPilotLicenceFields,
|
11
11
|
aliasLicenceFields,
|
12
12
|
} from './fields.js';
|
13
|
-
import type { SqlResult } from '../../out/
|
13
|
+
import type { SqlResult } from '../../out/abstract-sql-compiler.js';
|
14
14
|
const aliasPilotFields = aliasFields(
|
15
15
|
'plane.pilot-can fly-plane.pilot',
|
16
16
|
pilotFields,
|
@@ -158,7 +158,7 @@ test(
|
|
158
158
|
INSERT INTO "pilot" ("id")
|
159
159
|
SELECT "$insert"."id"
|
160
160
|
FROM (
|
161
|
-
SELECT CAST(NULL AS
|
161
|
+
SELECT CAST(NULL AS TIMESTAMPTZ) AS "created at", CAST(NULL AS TIMESTAMPTZ) AS "modified at", CAST(? AS INTEGER) AS "id", CAST(NULL AS INTEGER) AS "person", CAST(NULL AS BOOLEAN) AS "is experienced", CAST(NULL AS VARCHAR(255)) AS "name", CAST(NULL AS INTEGER) AS "age", CAST(NULL AS INTEGER) AS "favourite colour", CAST(NULL AS INTEGER) AS "is on-team", CAST(NULL AS INTEGER) AS "licence", CAST(NULL AS TIMESTAMPTZ) AS "hire date", CAST(NULL AS INTEGER) AS "was trained by-pilot"
|
162
162
|
) AS "$insert"
|
163
163
|
WHERE EXISTS (
|
164
164
|
SELECT 1
|
@@ -272,7 +272,7 @@ test(
|
|
272
272
|
INSERT INTO "pilot-can fly-plane" ("id")
|
273
273
|
SELECT "$insert"."id"
|
274
274
|
FROM (
|
275
|
-
SELECT CAST(NULL AS
|
275
|
+
SELECT CAST(NULL AS TIMESTAMPTZ) AS "created at", CAST(NULL AS TIMESTAMPTZ) AS "modified at", CAST(NULL AS INTEGER) AS "pilot", CAST(NULL AS INTEGER) AS "can fly-plane", CAST(? AS INTEGER) AS "id"
|
276
276
|
) AS "$insert"
|
277
277
|
WHERE EXISTS (
|
278
278
|
SELECT 1
|
package/test/odata/test.ts
CHANGED
@@ -17,7 +17,7 @@ const typeVocab = await fs.promises.readFile(
|
|
17
17
|
'utf8',
|
18
18
|
);
|
19
19
|
|
20
|
-
import * as AbstractSQLCompiler from '../../out/
|
20
|
+
import * as AbstractSQLCompiler from '../../out/abstract-sql-compiler.js';
|
21
21
|
|
22
22
|
import { expect } from 'chai';
|
23
23
|
import _ from 'lodash';
|
package/test/sbvr/pilots.ts
CHANGED
@@ -73,38 +73,38 @@ END;
|
|
73
73
|
$$;`,
|
74
74
|
`\
|
75
75
|
CREATE TABLE IF NOT EXISTS "person" (
|
76
|
-
"created at"
|
77
|
-
, "modified at"
|
76
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
77
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
78
78
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
79
79
|
);`,
|
80
80
|
modifiedAtTrigger('person'),
|
81
81
|
`\
|
82
82
|
CREATE TABLE IF NOT EXISTS "plane" (
|
83
|
-
"created at"
|
84
|
-
, "modified at"
|
83
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
84
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
85
85
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
86
86
|
, "name" VARCHAR(255) NOT NULL CHECK ("name" IN ('planeA', 'planeB', 'planeC'))
|
87
87
|
);`,
|
88
88
|
modifiedAtTrigger('plane'),
|
89
89
|
`\
|
90
90
|
CREATE TABLE IF NOT EXISTS "veteran pilot" (
|
91
|
-
"created at"
|
92
|
-
, "modified at"
|
91
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
92
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
93
93
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
94
94
|
);`,
|
95
95
|
modifiedAtTrigger('veteran pilot'),
|
96
96
|
`\
|
97
97
|
CREATE TABLE IF NOT EXISTS "licence" (
|
98
|
-
"created at"
|
99
|
-
, "modified at"
|
98
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
99
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
100
100
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
101
101
|
, "was granted by-pilot" INTEGER NOT NULL
|
102
102
|
);`,
|
103
103
|
modifiedAtTrigger('licence'),
|
104
104
|
`\
|
105
105
|
CREATE TABLE IF NOT EXISTS "pilot" (
|
106
|
-
"created at"
|
107
|
-
, "modified at"
|
106
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
107
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
108
108
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
109
109
|
, "person" INTEGER NOT NULL
|
110
110
|
, "name" VARCHAR(255) NOT NULL
|
@@ -117,8 +117,8 @@ CREATE TABLE IF NOT EXISTS "pilot" (
|
|
117
117
|
modifiedAtTrigger('pilot'),
|
118
118
|
`\
|
119
119
|
CREATE TABLE IF NOT EXISTS "pilot-can fly-plane" (
|
120
|
-
"created at"
|
121
|
-
, "modified at"
|
120
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
121
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
122
122
|
, "pilot" INTEGER NOT NULL
|
123
123
|
, "can fly-plane" INTEGER NOT NULL
|
124
124
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
@@ -58,15 +58,15 @@ $$;`,
|
|
58
58
|
|
59
59
|
`\
|
60
60
|
CREATE TABLE IF NOT EXISTS "term" (
|
61
|
-
"created at"
|
62
|
-
, "modified at"
|
61
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
62
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
63
63
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
64
64
|
);`,
|
65
65
|
modifiedAtTrigger('term'),
|
66
66
|
`\
|
67
67
|
CREATE TABLE IF NOT EXISTS "term history" (
|
68
|
-
"created at"
|
69
|
-
, "modified at"
|
68
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
69
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
70
70
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
71
71
|
, "references-term" INTEGER NOT NULL
|
72
72
|
);`,
|
@@ -103,15 +103,15 @@ $$;`,
|
|
103
103
|
|
104
104
|
`\
|
105
105
|
CREATE TABLE IF NOT EXISTS "term" (
|
106
|
-
"created at"
|
107
|
-
, "modified at"
|
106
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
107
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
108
108
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
109
109
|
);`,
|
110
110
|
modifiedAtTrigger('term'),
|
111
111
|
`\
|
112
112
|
CREATE TABLE IF NOT EXISTS "term history" (
|
113
|
-
"created at"
|
114
|
-
, "modified at"
|
113
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
114
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
115
115
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
116
116
|
, "references-term" INTEGER NOT NULL
|
117
117
|
);`,
|
@@ -147,15 +147,15 @@ $$;`,
|
|
147
147
|
|
148
148
|
`\
|
149
149
|
CREATE TABLE IF NOT EXISTS "term" (
|
150
|
-
"created at"
|
151
|
-
, "modified at"
|
150
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
151
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
152
152
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
153
153
|
);`,
|
154
154
|
modifiedAtTrigger('term'),
|
155
155
|
`\
|
156
156
|
CREATE TABLE IF NOT EXISTS "term history" (
|
157
|
-
"created at"
|
158
|
-
, "modified at"
|
157
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
158
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
159
159
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
160
160
|
, "references-term" INTEGER NOT NULL
|
161
161
|
, FOREIGN KEY ("references-term") REFERENCES "term" ("id")
|
@@ -191,15 +191,15 @@ $$;`,
|
|
191
191
|
|
192
192
|
`\
|
193
193
|
CREATE TABLE IF NOT EXISTS "term" (
|
194
|
-
"created at"
|
195
|
-
, "modified at"
|
194
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
195
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
196
196
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
197
197
|
);`,
|
198
198
|
modifiedAtTrigger('term'),
|
199
199
|
`\
|
200
200
|
CREATE TABLE IF NOT EXISTS "term history" (
|
201
|
-
"created at"
|
202
|
-
, "modified at"
|
201
|
+
"created at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
202
|
+
, "modified at" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL
|
203
203
|
, "id" SERIAL NOT NULL PRIMARY KEY
|
204
204
|
, "references-term" INTEGER NOT NULL
|
205
205
|
, FOREIGN KEY ("references-term") REFERENCES "term" ("id")
|
package/test/sbvr/test.ts
CHANGED
@@ -7,7 +7,7 @@ import { SBVRParser } from '@balena/sbvr-parser';
|
|
7
7
|
import LF2AbstractSQL from '@balena/lf-to-abstract-sql';
|
8
8
|
|
9
9
|
import { expect } from 'chai';
|
10
|
-
import * as AbstractSQLCompiler from '../../out/
|
10
|
+
import * as AbstractSQLCompiler from '../../out/abstract-sql-compiler.js';
|
11
11
|
|
12
12
|
export function getTestHelpers(builtInVocab: string | boolean = false) {
|
13
13
|
const sbvrParser = SBVRParser.createInstance();
|