@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
@@ -1,6 +1,56 @@
|
|
1
1
|
- commits:
|
2
|
+
- subject: Standardize filenames
|
3
|
+
hash: 11f63ab3efbb0fedfafe9eec933f4f4cc45cfbb9
|
4
|
+
body: ""
|
5
|
+
footer:
|
6
|
+
Change-type: major
|
7
|
+
change-type: major
|
8
|
+
author: Pagan Gazzard
|
9
|
+
nested: []
|
10
|
+
- subject: Improve typing of `AbstractSqlField['computed']`
|
11
|
+
hash: d52172c59a9424477d3f96cbee686e02e6796b94
|
12
|
+
body: ""
|
13
|
+
footer:
|
14
|
+
Change-type: major
|
15
|
+
change-type: major
|
16
|
+
author: Pagan Gazzard
|
17
|
+
nested: []
|
18
|
+
- subject: Improve typing of `AbstractSqlModel['rules']`
|
19
|
+
hash: d1a2c50d9d4b9c3bb89030186db0b466fbf4d83d
|
20
|
+
body: ""
|
21
|
+
footer:
|
22
|
+
Change-type: major
|
23
|
+
change-type: major
|
24
|
+
author: Pagan Gazzard
|
25
|
+
nested: []
|
26
|
+
- subject: Remove support for deprecated `['Bind', string, string]` bind node format
|
27
|
+
hash: 9f16483079cd561a9fdaa741cd830c2c5eb2065a
|
28
|
+
body: |
|
29
|
+
Use `['Bind', [string, string]]` instead
|
30
|
+
footer:
|
31
|
+
Change-type: major
|
32
|
+
change-type: major
|
33
|
+
author: Pagan Gazzard
|
34
|
+
nested: []
|
35
|
+
- subject: Remove deprecated `AliasableFromTypeNodes` type, use `FromTypeNodes`
|
36
|
+
instead
|
37
|
+
hash: 1d3108b17cdc662641904c72357157a40ae0cbcb
|
38
|
+
body: ""
|
39
|
+
footer:
|
40
|
+
Change-type: major
|
41
|
+
change-type: major
|
42
|
+
author: Pagan Gazzard
|
43
|
+
nested: []
|
44
|
+
- subject: Use an options object for `optimizeSchema` rather than flags
|
45
|
+
hash: b78df1afd0c566de81efff212629a53dd6bb4219
|
46
|
+
body: ""
|
47
|
+
footer:
|
48
|
+
Change-type: major
|
49
|
+
change-type: major
|
50
|
+
author: Pagan Gazzard
|
51
|
+
nested: []
|
2
52
|
- subject: Convert to ESM
|
3
|
-
hash:
|
53
|
+
hash: 195c2b8d5d4a39ba893113489620ccfa3f0a6afc
|
4
54
|
body: ""
|
5
55
|
footer:
|
6
56
|
Change-type: major
|
@@ -8,7 +58,7 @@
|
|
8
58
|
author: Pagan Gazzard
|
9
59
|
nested: []
|
10
60
|
- subject: Remove support for legacy `Now` nodes in favor of `CurrentTimestamp`
|
11
|
-
hash:
|
61
|
+
hash: 56e66dd939a87649c5d68787366562934daf65fc
|
12
62
|
body: ""
|
13
63
|
footer:
|
14
64
|
Change-type: major
|
@@ -16,7 +66,7 @@
|
|
16
66
|
author: Pagan Gazzard
|
17
67
|
nested: []
|
18
68
|
- subject: Switch to a separate `viewDefinition` property for creating views
|
19
|
-
hash:
|
69
|
+
hash: 0bf2e7ac0bcc3e733e3f712b51f71772666b0853
|
20
70
|
body: |
|
21
71
|
This removes the inference of whether to create a view from based on
|
22
72
|
inspecting the definition and instead makes it a conscious choice to
|
@@ -28,9 +78,89 @@
|
|
28
78
|
change-type: major
|
29
79
|
author: Pagan Gazzard
|
30
80
|
nested: []
|
81
|
+
- subject: "Tests: Update @balena/odata-to-abstract-sql to 8.0.1"
|
82
|
+
hash: 66ee93652310d4add5b0c8c09843dc052d796f5e
|
83
|
+
body: ""
|
84
|
+
footer:
|
85
|
+
Change-type: patch
|
86
|
+
change-type: patch
|
87
|
+
author: Pagan Gazzard
|
88
|
+
nested: []
|
31
89
|
version: 11.0.0
|
32
90
|
title: ""
|
33
|
-
date: 2025-07-
|
91
|
+
date: 2025-07-16T14:26:48.320Z
|
92
|
+
- commits:
|
93
|
+
- subject: Include comments in generated output to preserve jsdoc info
|
94
|
+
hash: 7045c5bd5244459330a7899ad0fbb974a429ca14
|
95
|
+
body: ""
|
96
|
+
footer:
|
97
|
+
Change-type: patch
|
98
|
+
change-type: patch
|
99
|
+
author: Pagan Gazzard
|
100
|
+
nested: []
|
101
|
+
version: 10.6.2
|
102
|
+
title: ""
|
103
|
+
date: 2025-07-16T12:44:51.636Z
|
104
|
+
- commits:
|
105
|
+
- subject: Update dev dependencies
|
106
|
+
hash: 444f515b81454a512eaf3a28f49f7b25938b4b9c
|
107
|
+
body: ""
|
108
|
+
footer:
|
109
|
+
Change-type: patch
|
110
|
+
change-type: patch
|
111
|
+
author: Pagan Gazzard
|
112
|
+
nested: []
|
113
|
+
version: 10.6.1
|
114
|
+
title: ""
|
115
|
+
date: 2025-07-16T11:37:51.776Z
|
116
|
+
- commits:
|
117
|
+
- subject: Export `abstractSqlContainsNode` helper function
|
118
|
+
hash: 92e7d4dd97329fb93e2f1c27b275c9cc38ab74c5
|
119
|
+
body: ""
|
120
|
+
footer:
|
121
|
+
Change-type: minor
|
122
|
+
change-type: minor
|
123
|
+
author: Pagan Gazzard
|
124
|
+
nested: []
|
125
|
+
version: 10.6.0
|
126
|
+
title: ""
|
127
|
+
date: 2025-07-14T23:48:55.689Z
|
128
|
+
- commits:
|
129
|
+
- subject: Allow sbvr-types v11
|
130
|
+
hash: 0b961faffe188162d82968df0e50522b7840eeae
|
131
|
+
body: ""
|
132
|
+
footer:
|
133
|
+
Change-type: patch
|
134
|
+
change-type: patch
|
135
|
+
author: joshbwlng
|
136
|
+
nested: []
|
137
|
+
version: 10.5.1
|
138
|
+
title: ""
|
139
|
+
date: 2025-07-08T14:05:27.340Z
|
140
|
+
- commits:
|
141
|
+
- subject: Add optional time zone argument for DateTrunc
|
142
|
+
hash: 51521852f16d12fdcd22b51d24bf6a2cea3247e3
|
143
|
+
body: ""
|
144
|
+
footer:
|
145
|
+
Change-type: minor
|
146
|
+
change-type: minor
|
147
|
+
author: joshbwlng
|
148
|
+
nested: []
|
149
|
+
version: 10.5.0
|
150
|
+
title: ""
|
151
|
+
date: 2025-07-07T23:20:12.115Z
|
152
|
+
- commits:
|
153
|
+
- subject: Correctly treat `EqualsAnyNode` as the boolean type we know it to be
|
154
|
+
hash: 862d36cf5ade46cc40be2909d6af6bafe16d5409
|
155
|
+
body: ""
|
156
|
+
footer:
|
157
|
+
Change-type: patch
|
158
|
+
change-type: patch
|
159
|
+
author: Pagan Gazzard
|
160
|
+
nested: []
|
161
|
+
version: 10.4.1
|
162
|
+
title: ""
|
163
|
+
date: 2025-07-04T23:10:21.328Z
|
34
164
|
- commits:
|
35
165
|
- subject: Export an `optimizeSchema` variant that is database engine agnostic
|
36
166
|
hash: 9b52888ca68ed9298b469fbda89eb2dbbb861668
|
package/CHANGELOG.md
CHANGED
@@ -4,11 +4,42 @@ All notable changes to this project will be documented in this file
|
|
4
4
|
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
|
5
5
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
6
6
|
|
7
|
-
## 11.0.0 - 2025-07-
|
8
|
-
|
7
|
+
## 11.0.0 - 2025-07-16
|
8
|
+
|
9
|
+
* Standardize filenames [Pagan Gazzard]
|
10
|
+
* Improve typing of `AbstractSqlField['computed']` [Pagan Gazzard]
|
11
|
+
* Improve typing of `AbstractSqlModel['rules']` [Pagan Gazzard]
|
12
|
+
* Remove support for deprecated `['Bind', string, string]` bind node format [Pagan Gazzard]
|
13
|
+
* Remove deprecated `AliasableFromTypeNodes` type, use `FromTypeNodes` instead [Pagan Gazzard]
|
14
|
+
* Use an options object for `optimizeSchema` rather than flags [Pagan Gazzard]
|
9
15
|
* Convert to ESM [Pagan Gazzard]
|
10
16
|
* Remove support for legacy `Now` nodes in favor of `CurrentTimestamp` [Pagan Gazzard]
|
11
17
|
* Switch to a separate `viewDefinition` property for creating views [Pagan Gazzard]
|
18
|
+
* Tests: Update @balena/odata-to-abstract-sql to 8.0.1 [Pagan Gazzard]
|
19
|
+
|
20
|
+
## 10.6.2 - 2025-07-16
|
21
|
+
|
22
|
+
* Include comments in generated output to preserve jsdoc info [Pagan Gazzard]
|
23
|
+
|
24
|
+
## 10.6.1 - 2025-07-16
|
25
|
+
|
26
|
+
* Update dev dependencies [Pagan Gazzard]
|
27
|
+
|
28
|
+
## 10.6.0 - 2025-07-14
|
29
|
+
|
30
|
+
* Export `abstractSqlContainsNode` helper function [Pagan Gazzard]
|
31
|
+
|
32
|
+
## 10.5.1 - 2025-07-08
|
33
|
+
|
34
|
+
* Allow sbvr-types v11 [joshbwlng]
|
35
|
+
|
36
|
+
## 10.5.0 - 2025-07-07
|
37
|
+
|
38
|
+
* Add optional time zone argument for DateTrunc [joshbwlng]
|
39
|
+
|
40
|
+
## 10.4.1 - 2025-07-04
|
41
|
+
|
42
|
+
* Correctly treat `EqualsAnyNode` as the boolean type we know it to be [Pagan Gazzard]
|
12
43
|
|
13
44
|
## 10.4.0 - 2025-06-20
|
14
45
|
|
@@ -3,9 +3,9 @@ export declare const enum Engines {
|
|
3
3
|
mysql = "mysql",
|
4
4
|
websql = "websql"
|
5
5
|
}
|
6
|
-
import type { Binding, SqlResult } from './
|
7
|
-
export { Binding, SqlResult } from './
|
8
|
-
import { optimizeSchema } from './
|
6
|
+
import type { Binding, SqlResult } from './abstract-sql-rules-to-sql.js';
|
7
|
+
export { Binding, SqlResult } from './abstract-sql-rules-to-sql.js';
|
8
|
+
import { optimizeSchema } from './abstract-sql-schema-optimizer.js';
|
9
9
|
import type { ReferencedFields, RuleReferencedFields, ModifiedFields } from './referenced-fields.js';
|
10
10
|
export type { ReferencedFields, RuleReferencedFields, ModifiedFields };
|
11
11
|
export type NullNode = ['Null'];
|
@@ -102,7 +102,7 @@ export type StrictNumberTypeNodes = NumberNode | IntegerNode | RealNode | AddNod
|
|
102
102
|
export type NumberTypeNodes = StrictNumberTypeNodes | UnknownTypeNodes;
|
103
103
|
export type FieldNode = ['Field', string];
|
104
104
|
export type ReferencedFieldNode = ['ReferencedField', string, string];
|
105
|
-
export type DateTruncNode = ['DateTrunc', TextTypeNodes, DateTypeNodes];
|
105
|
+
export type DateTruncNode = ['DateTrunc', TextTypeNodes, DateTypeNodes] | ['DateTrunc', TextTypeNodes, DateTypeNodes, TextTypeNodes];
|
106
106
|
export type ToDateNode = ['ToDate', DateTypeNodes];
|
107
107
|
export type ToTimeNode = ['ToTime', DateTypeNodes];
|
108
108
|
export type CurrentTimestampNode = ['CurrentTimestamp'];
|
@@ -138,8 +138,7 @@ export type AddDateDurationNode = [
|
|
138
138
|
export type WhenNode = ['When', BooleanTypeNodes, AnyTypeNodes];
|
139
139
|
export type ElseNode = ['Else', AnyTypeNodes];
|
140
140
|
export type CaseNode = ['Case', ...WhenNode[]] | ['Case', ...WhenNode[], ElseNode];
|
141
|
-
type
|
142
|
-
export type BindNode = ['Bind', number | string] | ['Bind', [string, string]] | BackCompatBindNode;
|
141
|
+
export type BindNode = ['Bind', number | string] | ['Bind', [string, string]];
|
143
142
|
export type CastNode = ['Cast', AnyTypeNodes, string];
|
144
143
|
export type CoalesceNode = [
|
145
144
|
'Coalesce',
|
@@ -148,7 +147,7 @@ export type CoalesceNode = [
|
|
148
147
|
...AnyTypeNodes[]
|
149
148
|
];
|
150
149
|
export type AnyNode = ['Any', AnyTypeNodes, string];
|
151
|
-
export type UnknownTypeNodes = SelectQueryNode | UnionQueryNode | NullNode | FieldNode | ReferencedFieldNode |
|
150
|
+
export type UnknownTypeNodes = SelectQueryNode | UnionQueryNode | NullNode | FieldNode | ReferencedFieldNode | BindNode | CastNode | CaseNode | CoalesceNode | AnyNode;
|
152
151
|
export type ToJSONNode = ['ToJSON', AnyTypeNodes];
|
153
152
|
export type AggregateJSONNode = [
|
154
153
|
'AggregateJSON',
|
@@ -213,15 +212,25 @@ export type UpdateQueryNode = [
|
|
213
212
|
];
|
214
213
|
export type DeleteQueryNode = ['DeleteQuery', ...Array<FromNode | WhereNode>];
|
215
214
|
export type UpsertQueryNode = ['UpsertQuery', InsertQueryNode, UpdateQueryNode];
|
215
|
+
/**
|
216
|
+
* This interface allows adding to the valid set of FromTypeNodes using interface merging, eg
|
217
|
+
* declare module '@balena/abstract-sql-compiler' {
|
218
|
+
* interface FromTypeNode {
|
219
|
+
* MyNode: MyNode;
|
220
|
+
* }
|
221
|
+
* }
|
222
|
+
*/
|
216
223
|
export interface FromTypeNode {
|
217
224
|
SelectQueryNode: SelectQueryNode;
|
218
225
|
UnionQueryNode: UnionQueryNode;
|
219
226
|
TableNode: TableNode;
|
220
227
|
ResourceNode: ResourceNode;
|
221
228
|
}
|
229
|
+
/**
|
230
|
+
* This is not currently understood by the abstract-sql-compiler but is a placeholder for future support
|
231
|
+
*/
|
222
232
|
export type ResourceNode = ['Resource', string];
|
223
233
|
export type FromTypeNodes = FromTypeNode[keyof FromTypeNode] | AliasNode<FromTypeNode[keyof FromTypeNode]>;
|
224
|
-
export type AliasableFromTypeNodes = FromTypeNodes;
|
225
234
|
export type SelectNode = ['Select', AnyTypeNodes[]];
|
226
235
|
export type FromNode = ['From', FromTypeNodes];
|
227
236
|
export type InnerJoinNode = ['Join', FromTypeNodes, OnNode?];
|
@@ -262,7 +271,7 @@ export interface AbstractSqlField {
|
|
262
271
|
type?: string;
|
263
272
|
};
|
264
273
|
defaultValue?: string;
|
265
|
-
computed?:
|
274
|
+
computed?: AnyTypeNodes;
|
266
275
|
checks?: BooleanTypeNodes[];
|
267
276
|
}
|
268
277
|
export interface Trigger {
|
@@ -275,6 +284,7 @@ export interface Index {
|
|
275
284
|
type: string;
|
276
285
|
fields: string[];
|
277
286
|
name?: string;
|
287
|
+
/** For rules converted to partial unique indexes this holds the actual rule expression */
|
278
288
|
description?: string;
|
279
289
|
distinctNulls?: boolean;
|
280
290
|
predicate?: BooleanTypeNodes;
|
@@ -312,6 +322,19 @@ export interface SqlRule {
|
|
312
322
|
referencedFields?: ReferencedFields | undefined;
|
313
323
|
ruleReferencedFields?: RuleReferencedFields | undefined;
|
314
324
|
}
|
325
|
+
/**
|
326
|
+
* The RelationshipMapping can either describe a relationship to another term, or
|
327
|
+
* a relationship to a local term (since simple terms are also defined and referenced).
|
328
|
+
* A local term basically describes the fields of the term that are available.
|
329
|
+
*
|
330
|
+
* - RelationshipMapping[0] is the local field
|
331
|
+
*
|
332
|
+
* If this relationship points to a foreign term (a different table)
|
333
|
+
*
|
334
|
+
* - RelationshipMapping[1] is the reference to the other resource, that joins this resource
|
335
|
+
* - RelationshipMapping[1][0] is the name of the other resource (or the other table)
|
336
|
+
* - RelationshipMapping[1][1] is the name of the field on the other resource
|
337
|
+
*/
|
315
338
|
export type RelationshipMapping = [string, [string, string]?];
|
316
339
|
export interface RelationshipLeafNode {
|
317
340
|
$: RelationshipMapping;
|
@@ -330,7 +353,11 @@ export interface AbstractSqlModel {
|
|
330
353
|
tables: {
|
331
354
|
[resourceName: string]: AbstractSqlTable;
|
332
355
|
};
|
333
|
-
rules:
|
356
|
+
rules: Array<[
|
357
|
+
'Rule',
|
358
|
+
['Body', AbstractSqlQuery],
|
359
|
+
['StructuredEnglish', string]
|
360
|
+
]>;
|
334
361
|
functions?: Record<string, {
|
335
362
|
type: 'trigger';
|
336
363
|
body: string;
|
@@ -367,6 +394,9 @@ export interface EngineInstance {
|
|
367
394
|
compileRule: (abstractSQL: AbstractSqlQuery) => SqlResult | [SqlResult, SqlResult];
|
368
395
|
dataTypeValidate: (value: any, field: Pick<AbstractSqlField, 'dataType' | 'required'>) => Promise<any>;
|
369
396
|
getReferencedFields: (ruleBody: AbstractSqlQuery) => ReferencedFields;
|
397
|
+
/**
|
398
|
+
* This gets referenced fields for a query that is expected to always return true and only return fields that could change it to false
|
399
|
+
*/
|
370
400
|
getRuleReferencedFields: (ruleBody: AbstractSqlQuery) => RuleReferencedFields;
|
371
401
|
getModifiedFields: (abstractSqlQuery: AbstractSqlQuery) => undefined | ModifiedFields | Array<undefined | ModifiedFields>;
|
372
402
|
}
|
@@ -378,6 +408,12 @@ export declare const isSelectQueryNode: (n: AbstractSqlType) => n is SelectQuery
|
|
378
408
|
export declare const isSelectNode: (n: AbstractSqlType) => n is SelectNode;
|
379
409
|
export declare const isWhereNode: (n: AbstractSqlType) => n is WhereNode;
|
380
410
|
export declare const isFieldTypeNode: (n: AbstractSqlType) => n is FieldNode | ReferencedFieldNode;
|
411
|
+
/**
|
412
|
+
*
|
413
|
+
* @param n The abstract sql to check
|
414
|
+
* @param checkNodeTypeFn A function that checks if a given node is the correct type
|
415
|
+
*/
|
416
|
+
export declare const abstractSqlContainsNode: (n: AnyTypeNodes, checkNodeTypeFn: (n: AnyTypeNodes) => boolean) => boolean;
|
381
417
|
export declare function compileRule(abstractSQL: UpsertQueryNode, engine: Engines, noBinds: true): [string, string];
|
382
418
|
export declare function compileRule(abstractSQL: AbstractSqlQuery, engine: Engines, noBinds: true): string;
|
383
419
|
export declare function compileRule(abstractSQL: UpsertQueryNode, engine: Engines, noBinds?: false): [SqlResult, SqlResult];
|
@@ -386,7 +422,9 @@ export declare function compileRule(abstractSQL: AbstractSqlQuery, engine: Engin
|
|
386
422
|
export declare function compileRule(abstractSQL: AbstractSqlQuery, engine: Engines, noBinds?: boolean): SqlResult | [SqlResult, SqlResult] | string;
|
387
423
|
export { optimizeSchema };
|
388
424
|
export declare const postgres: {
|
389
|
-
optimizeSchema: (abstractSqlModel: AbstractSqlModel, createCheckConstraints?:
|
425
|
+
optimizeSchema: (abstractSqlModel: AbstractSqlModel, { createCheckConstraints }?: {
|
426
|
+
createCheckConstraints?: boolean | undefined;
|
427
|
+
}) => AbstractSqlModel;
|
390
428
|
generateRuleSlug: (tableName: string, ruleBody: AbstractSqlType) => string;
|
391
429
|
compileSchema: (abstractSqlModel: AbstractSqlModel) => SqlModel;
|
392
430
|
compileRule: (abstractSQL: AbstractSqlQuery) => SqlResult | [SqlResult, SqlResult];
|
@@ -396,7 +434,9 @@ export declare const postgres: {
|
|
396
434
|
getModifiedFields: (abstractSqlQuery: AbstractSqlQuery) => undefined | ModifiedFields | Array<undefined | ModifiedFields>;
|
397
435
|
};
|
398
436
|
export declare const mysql: {
|
399
|
-
optimizeSchema: (abstractSqlModel: AbstractSqlModel, createCheckConstraints?:
|
437
|
+
optimizeSchema: (abstractSqlModel: AbstractSqlModel, { createCheckConstraints }?: {
|
438
|
+
createCheckConstraints?: boolean | undefined;
|
439
|
+
}) => AbstractSqlModel;
|
400
440
|
generateRuleSlug: (tableName: string, ruleBody: AbstractSqlType) => string;
|
401
441
|
compileSchema: (abstractSqlModel: AbstractSqlModel) => SqlModel;
|
402
442
|
compileRule: (abstractSQL: AbstractSqlQuery) => SqlResult | [SqlResult, SqlResult];
|
@@ -406,7 +446,9 @@ export declare const mysql: {
|
|
406
446
|
getModifiedFields: (abstractSqlQuery: AbstractSqlQuery) => undefined | ModifiedFields | Array<undefined | ModifiedFields>;
|
407
447
|
};
|
408
448
|
export declare const websql: {
|
409
|
-
optimizeSchema: (abstractSqlModel: AbstractSqlModel, createCheckConstraints?:
|
449
|
+
optimizeSchema: (abstractSqlModel: AbstractSqlModel, { createCheckConstraints }?: {
|
450
|
+
createCheckConstraints?: boolean | undefined;
|
451
|
+
}) => AbstractSqlModel;
|
410
452
|
generateRuleSlug: (tableName: string, ruleBody: AbstractSqlType) => string;
|
411
453
|
compileSchema: (abstractSqlModel: AbstractSqlModel) => SqlModel;
|
412
454
|
compileRule: (abstractSQL: AbstractSqlQuery) => SqlResult | [SqlResult, SqlResult];
|
@@ -1,14 +1,16 @@
|
|
1
1
|
export var Engines;
|
2
2
|
(function (Engines) {
|
3
|
+
/* eslint-disable @typescript-eslint/no-shadow -- this is fine since we only assign plain string values to the enum items */
|
3
4
|
Engines["postgres"] = "postgres";
|
4
5
|
Engines["mysql"] = "mysql";
|
5
6
|
Engines["websql"] = "websql";
|
7
|
+
/* eslint-enable @typescript-eslint/no-shadow */
|
6
8
|
})(Engines || (Engines = {}));
|
7
|
-
import {
|
8
|
-
import { AbstractSQLRules2SQL } from './
|
9
|
+
import { AbstractSQLOptimizer } from './abstract-sql-optimizer.js';
|
10
|
+
import { AbstractSQLRules2SQL } from './abstract-sql-rules-to-sql.js';
|
9
11
|
import $sbvrTypes from '@balena/sbvr-types';
|
10
12
|
const { default: sbvrTypes } = $sbvrTypes;
|
11
|
-
import { optimizeSchema, generateRuleSlug, } from './
|
13
|
+
import { optimizeSchema, generateRuleSlug, } from './abstract-sql-schema-optimizer.js';
|
12
14
|
import { getReferencedFields, getRuleReferencedFields, getModifiedFields, insertAffectedIdsBinds, } from './referenced-fields.js';
|
13
15
|
const validateTypes = (() => {
|
14
16
|
const result = {};
|
@@ -18,7 +20,10 @@ const validateTypes = (() => {
|
|
18
20
|
return result;
|
19
21
|
})();
|
20
22
|
const dataTypeValidate = async (value, field) => {
|
23
|
+
// In case one of the validation types throws an error.
|
21
24
|
const { dataType, required = false } = field;
|
25
|
+
// Without the `: SbvrType['validate']` widening TS complains that
|
26
|
+
// "none of those signatures are compatible with each other".
|
22
27
|
const validateFn = validateTypes[dataType];
|
23
28
|
if (validateFn != null) {
|
24
29
|
return validateFn(value, required);
|
@@ -74,23 +79,31 @@ export const isSelectQueryNode = (n) => n[0] === 'SelectQuery';
|
|
74
79
|
export const isSelectNode = (n) => n[0] === 'Select';
|
75
80
|
export const isWhereNode = (n) => n[0] === 'Where';
|
76
81
|
export const isFieldTypeNode = (n) => n[0] === 'ReferencedField' || n[0] === 'Field';
|
77
|
-
|
82
|
+
/**
|
83
|
+
*
|
84
|
+
* @param n The abstract sql to check
|
85
|
+
* @param checkNodeTypeFn A function that checks if a given node is the correct type
|
86
|
+
*/
|
87
|
+
export const abstractSqlContainsNode = (n, checkNodeTypeFn) => {
|
78
88
|
if (checkNodeTypeFn(n)) {
|
79
89
|
return true;
|
80
90
|
}
|
81
91
|
for (const p of n) {
|
82
|
-
if (Array.isArray(p) &&
|
92
|
+
if (Array.isArray(p) &&
|
93
|
+
abstractSqlContainsNode(p, checkNodeTypeFn)) {
|
83
94
|
return true;
|
84
95
|
}
|
85
96
|
}
|
86
97
|
return false;
|
87
98
|
};
|
88
99
|
export function compileRule(abstractSQL, engine, noBinds = false) {
|
89
|
-
abstractSQL =
|
100
|
+
abstractSQL = AbstractSQLOptimizer(abstractSQL, noBinds);
|
90
101
|
return AbstractSQLRules2SQL(abstractSQL, engine, noBinds);
|
91
102
|
}
|
92
103
|
const compileSchema = (abstractSqlModel, engine, ifNotExists) => {
|
93
|
-
abstractSqlModel = optimizeSchema(abstractSqlModel,
|
104
|
+
abstractSqlModel = optimizeSchema(abstractSqlModel, {
|
105
|
+
createCheckConstraints: false,
|
106
|
+
});
|
94
107
|
let ifNotExistsStr = '';
|
95
108
|
let orReplaceStr = '';
|
96
109
|
if (ifNotExists) {
|
@@ -104,7 +117,7 @@ const compileSchema = (abstractSqlModel, engine, ifNotExists) => {
|
|
104
117
|
if (abstractSqlModel.functions) {
|
105
118
|
for (const fnName of Object.keys(abstractSqlModel.functions)) {
|
106
119
|
const fnDefinition = abstractSqlModel.functions[fnName];
|
107
|
-
if (engine !== "postgres") {
|
120
|
+
if (engine !== "postgres" /* Engines.postgres */) {
|
108
121
|
throw new Error('Functions are only supported on postgres currently');
|
109
122
|
}
|
110
123
|
if (fnDefinition.language !== 'plpgsql') {
|
@@ -148,10 +161,12 @@ $$;`);
|
|
148
161
|
}
|
149
162
|
if (viewDefinition != null) {
|
150
163
|
let definitionAbstractSql = viewDefinition.abstractSql;
|
151
|
-
|
152
|
-
|
164
|
+
// If there are any resource nodes then it's a dynamic definition and cannot become a view
|
165
|
+
if (abstractSqlContainsNode(definitionAbstractSql, isResourceNode)) {
|
166
|
+
throw new Error(`Cannot create a view from a dynamic viewDefinition, found for table resourceName: '${table.resourceName}', name: '${table.name}'`);
|
153
167
|
}
|
154
168
|
if (isTableNode(definitionAbstractSql)) {
|
169
|
+
// If the definition is a table node we need to wrap it in a select query for the view creation
|
155
170
|
definitionAbstractSql = [
|
156
171
|
'SelectQuery',
|
157
172
|
['Select', [['Field', '*']]],
|
@@ -186,9 +201,10 @@ ${compileRule(definitionAbstractSql, engine, true).replace(/^/gm, ' ')}
|
|
186
201
|
const fkDefinition = `FOREIGN KEY ("${fieldName}") REFERENCES "${referencedTable.name}" ("${references.fieldName}")`;
|
187
202
|
const schemaInfo = schemaDependencyMap[references.resourceName];
|
188
203
|
if (schemaInfo?.depends.includes(table.resourceName)) {
|
189
|
-
if (engine !== "postgres") {
|
204
|
+
if (engine !== "postgres" /* Engines.postgres */) {
|
190
205
|
throw new Error('Circular dependencies are only supported on postgres currently');
|
191
206
|
}
|
207
|
+
// It's a simple circular dependency so we switch it to an ALTER TABLE
|
192
208
|
alterSchemaStatements.push(`\
|
193
209
|
DO $$
|
194
210
|
BEGIN
|
@@ -231,6 +247,7 @@ $$;`);
|
|
231
247
|
? ` NULLS NOT DISTINCT`
|
232
248
|
: ` NULLS DISTINCT`;
|
233
249
|
}
|
250
|
+
// Non-partial indexes are added directly to the CREATE TABLE statement
|
234
251
|
if (index.predicate == null) {
|
235
252
|
createSqlElements.push(index.type + nullsSql + '("' + index.fields.join('", "') + '")');
|
236
253
|
continue;
|
@@ -266,6 +283,7 @@ ${comment}${constraintName}CHECK (${sql})`);
|
|
266
283
|
if (!fns[trigger.fnName]) {
|
267
284
|
throw new Error(`No such function '${trigger.fnName}' declared`);
|
268
285
|
}
|
286
|
+
// Trim the trigger name to a max of 63 characters
|
269
287
|
const triggerName = `${table.name}_${trigger.fnName}`.slice(0, 63);
|
270
288
|
createTriggers.push(`\
|
271
289
|
DO
|
@@ -310,6 +328,7 @@ CREATE TABLE ${ifNotExistsStr}"${table.name}" (
|
|
310
328
|
const schemaInfo = schemaDependencyMap[resourceName];
|
311
329
|
let unsolvedDependency = false;
|
312
330
|
for (const dependency of schemaInfo.depends) {
|
331
|
+
// Self-dependencies are ok.
|
313
332
|
if (dependency !== resourceName &&
|
314
333
|
Object.prototype.hasOwnProperty.call(schemaDependencyMap, dependency)) {
|
315
334
|
unsolvedDependency = true;
|
@@ -336,16 +355,15 @@ CREATE TABLE ${ifNotExistsStr}"${table.name}" (
|
|
336
355
|
createSchemaStatements.push(...alterSchemaStatements);
|
337
356
|
dropSchemaStatements = dropSchemaStatements.reverse();
|
338
357
|
const ruleStatements = abstractSqlModel.rules.map((rule) => {
|
339
|
-
const ruleBodyNode = rule
|
340
|
-
if (ruleBodyNode == null ||
|
358
|
+
const [, ruleBodyNode, ruleSENode] = rule;
|
359
|
+
if (ruleBodyNode == null || ruleBodyNode[0] !== 'Body') {
|
341
360
|
throw new Error('Invalid rule');
|
342
361
|
}
|
343
362
|
const ruleBody = ruleBodyNode[1];
|
344
363
|
if (typeof ruleBody === 'string') {
|
345
364
|
throw new Error('Invalid rule');
|
346
365
|
}
|
347
|
-
|
348
|
-
if (ruleSENode == null) {
|
366
|
+
if (ruleSENode == null || ruleSENode[0] !== 'StructuredEnglish') {
|
349
367
|
throw new Error('Invalid structured English');
|
350
368
|
}
|
351
369
|
const ruleSE = ruleSENode[1];
|
@@ -398,7 +416,7 @@ const generateExport = (engine, ifNotExists) => {
|
|
398
416
|
};
|
399
417
|
};
|
400
418
|
export { optimizeSchema };
|
401
|
-
export const postgres = generateExport("postgres"
|
402
|
-
export const mysql = generateExport("mysql"
|
403
|
-
export const websql = generateExport("websql"
|
404
|
-
//# sourceMappingURL=
|
419
|
+
export const postgres = generateExport("postgres" /* Engines.postgres */, true);
|
420
|
+
export const mysql = generateExport("mysql" /* Engines.mysql */, true);
|
421
|
+
export const websql = generateExport("websql" /* Engines.websql */, false);
|
422
|
+
//# sourceMappingURL=abstract-sql-compiler.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"abstract-sql-compiler.js","sourceRoot":"","sources":["../src/abstract-sql-compiler.ts"],"names":[],"mappings":"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"}
|