@balena/abstract-sql-compiler 7.20.3 → 7.20.4
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 +15 -1
- package/CHANGELOG.md +4 -0
- package/out/AbstractSQLCompiler.d.ts +68 -68
- package/out/AbstractSQLRules2SQL.d.ts +1 -1
- package/package.json +2 -2
- package/test/abstract-sql/aggregate.ts +321 -0
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
- commits:
|
|
2
|
+
- subject: "CI: Add several abstract-sql unit tests"
|
|
3
|
+
hash: e0319dd38e6851c5ed3f2b503ecf2ff93d67f0dd
|
|
4
|
+
body: ""
|
|
5
|
+
footer:
|
|
6
|
+
Change-type: patch
|
|
7
|
+
change-type: patch
|
|
8
|
+
Signed-off-by: Josh Bowling <josh@monarci.com>
|
|
9
|
+
signed-off-by: Josh Bowling <josh@monarci.com>
|
|
10
|
+
author: Josh Bowling
|
|
11
|
+
nested: []
|
|
12
|
+
version: 7.20.4
|
|
13
|
+
title: ""
|
|
14
|
+
date: 2022-11-16T03:24:53.502Z
|
|
1
15
|
- commits:
|
|
2
16
|
- subject: Capitalize AggregateJSON SQL
|
|
3
17
|
hash: 73ac2303a5912408c76d21c861891bf3b506a788
|
|
@@ -13,7 +27,7 @@
|
|
|
13
27
|
nested: []
|
|
14
28
|
version: 7.20.3
|
|
15
29
|
title: ""
|
|
16
|
-
date: 2022-11-
|
|
30
|
+
date: 2022-11-15T11:40:34.177Z
|
|
17
31
|
- commits:
|
|
18
32
|
- subject: "Dev: Disable package-lock.json generation"
|
|
19
33
|
hash: 4d769c1a1d2f4f29ed85c6a31dd5b4dd6bced77d
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,10 @@ 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
|
+
## 7.20.4 - 2022-11-16
|
|
8
|
+
|
|
9
|
+
* CI: Add several abstract-sql unit tests [Josh Bowling]
|
|
10
|
+
|
|
7
11
|
## 7.20.3 - 2022-11-15
|
|
8
12
|
|
|
9
13
|
* Capitalize AggregateJSON SQL [Josh Bowling]
|
|
@@ -8,9 +8,9 @@ export { Binding, SqlResult } from './AbstractSQLRules2SQL';
|
|
|
8
8
|
import * as _ from 'lodash';
|
|
9
9
|
import { ReferencedFields, RuleReferencedFields, ModifiedFields } from './referenced-fields';
|
|
10
10
|
export type { ReferencedFields, RuleReferencedFields, ModifiedFields };
|
|
11
|
-
export
|
|
12
|
-
export
|
|
13
|
-
export
|
|
11
|
+
export type NullNode = ['Null'];
|
|
12
|
+
export type DateNode = ['Date', Date];
|
|
13
|
+
export type DurationNode = [
|
|
14
14
|
'Duration',
|
|
15
15
|
{
|
|
16
16
|
negative?: boolean;
|
|
@@ -20,114 +20,114 @@ export declare type DurationNode = [
|
|
|
20
20
|
second?: number;
|
|
21
21
|
}
|
|
22
22
|
];
|
|
23
|
-
export
|
|
24
|
-
export
|
|
25
|
-
export
|
|
26
|
-
export
|
|
27
|
-
export
|
|
23
|
+
export type BooleanNode = ['Boolean', boolean];
|
|
24
|
+
export type EqualsNode = ['Equals', AbstractSqlType, AbstractSqlType];
|
|
25
|
+
export type NotEqualsNode = ['NotEquals', AbstractSqlType, AbstractSqlType];
|
|
26
|
+
export type GreaterThanNode = ['GreaterThan', AbstractSqlType, AbstractSqlType];
|
|
27
|
+
export type GreaterThanOrEqualNode = [
|
|
28
28
|
'GreaterThanOrEqual',
|
|
29
29
|
AbstractSqlType,
|
|
30
30
|
AbstractSqlType
|
|
31
31
|
];
|
|
32
|
-
export
|
|
33
|
-
export
|
|
32
|
+
export type LessThanNode = ['LessThan', AbstractSqlType, AbstractSqlType];
|
|
33
|
+
export type LessThanOrEqualNode = [
|
|
34
34
|
'LessThanOrEqual',
|
|
35
35
|
AbstractSqlType,
|
|
36
36
|
AbstractSqlType
|
|
37
37
|
];
|
|
38
|
-
export
|
|
38
|
+
export type InNode = [
|
|
39
39
|
'In',
|
|
40
40
|
FieldNode | ReferencedFieldNode,
|
|
41
41
|
AbstractSqlType,
|
|
42
42
|
...AbstractSqlType[]
|
|
43
43
|
];
|
|
44
|
-
export
|
|
45
|
-
export
|
|
46
|
-
export
|
|
47
|
-
export
|
|
48
|
-
export
|
|
49
|
-
export
|
|
50
|
-
export
|
|
51
|
-
export
|
|
52
|
-
export
|
|
53
|
-
export
|
|
54
|
-
export
|
|
55
|
-
export
|
|
56
|
-
export
|
|
57
|
-
export
|
|
58
|
-
export
|
|
59
|
-
export
|
|
60
|
-
export
|
|
61
|
-
export
|
|
44
|
+
export type NotExistsNode = ['NotExists', AbstractSqlType];
|
|
45
|
+
export type ExistsNode = ['Exists', AbstractSqlType];
|
|
46
|
+
export type NotNode = ['Not', BooleanTypeNodes];
|
|
47
|
+
export type AndNode = ['And', ...BooleanTypeNodes[]];
|
|
48
|
+
export type OrNode = ['Or', ...BooleanTypeNodes[]];
|
|
49
|
+
export type BooleanTypeNodes = BooleanNode | EqualsNode | NotEqualsNode | GreaterThanNode | GreaterThanOrEqualNode | LessThanNode | LessThanOrEqualNode | InNode | ExistsNode | NotExistsNode | NotNode | AndNode | OrNode | UnknownTypeNodes;
|
|
50
|
+
export type NumberNode = ['Number', number];
|
|
51
|
+
export type CountNode = ['Count', '*'];
|
|
52
|
+
export type AverageNode = ['Average', NumberTypeNodes];
|
|
53
|
+
export type SumNode = ['Sum', NumberTypeNodes];
|
|
54
|
+
export type NumberTypeNodes = NumberNode | CountNode | AverageNode | SumNode | UnknownTypeNodes;
|
|
55
|
+
export type FieldNode = ['Field', string];
|
|
56
|
+
export type ReferencedFieldNode = ['ReferencedField', string, string];
|
|
57
|
+
export type DateTruncNode = ['DateTrunc', TextTypeNodes, DateTypeNodes];
|
|
58
|
+
export type DateTypeNodes = DateNode | DateTruncNode;
|
|
59
|
+
export type BindNode = ['Bind', number | string] | ['Bind', string, string];
|
|
60
|
+
export type CastNode = ['Cast', AbstractSqlType, string];
|
|
61
|
+
export type CoalesceNode = [
|
|
62
62
|
'Cast',
|
|
63
63
|
UnknownTypeNodes,
|
|
64
64
|
UnknownTypeNodes,
|
|
65
65
|
...UnknownTypeNodes[]
|
|
66
66
|
];
|
|
67
|
-
export
|
|
68
|
-
export
|
|
69
|
-
export
|
|
70
|
-
export
|
|
67
|
+
export type UnknownTypeNodes = FieldNode | ReferencedFieldNode | BindNode | CastNode | CoalesceNode | UnknownNode;
|
|
68
|
+
export type TextNode = ['Text', string];
|
|
69
|
+
export type ConcatenateNode = ['Concatenate', ...TextTypeNodes[]];
|
|
70
|
+
export type ConcatenateWithSeparatorNode = [
|
|
71
71
|
'ConcatenateWithSeparator',
|
|
72
72
|
TextTypeNodes,
|
|
73
73
|
...TextTypeNodes[]
|
|
74
74
|
];
|
|
75
|
-
export
|
|
76
|
-
export
|
|
75
|
+
export type LikeNode = ['Like', AbstractSqlType, AbstractSqlType];
|
|
76
|
+
export type ReplaceNode = [
|
|
77
77
|
'Replace',
|
|
78
78
|
TextTypeNodes,
|
|
79
79
|
TextTypeNodes,
|
|
80
80
|
TextTypeNodes
|
|
81
81
|
];
|
|
82
|
-
export
|
|
83
|
-
export
|
|
82
|
+
export type TextTypeNodes = ConcatenateNode | ConcatenateWithSeparatorNode | LikeNode | ReplaceNode | UnknownTypeNodes;
|
|
83
|
+
export type SelectQueryNode = [
|
|
84
84
|
'SelectQuery',
|
|
85
85
|
...Array<SelectNode | FromNode | InnerJoinNode | LeftJoinNode | RightJoinNode | FullJoinNode | CrossJoinNode | WhereNode | GroupByNode | HavingNode | OrderByNode | LimitNode | OffsetNode>
|
|
86
86
|
];
|
|
87
|
-
export
|
|
87
|
+
export type UnionQueryNode = [
|
|
88
88
|
'UnionQuery',
|
|
89
89
|
...(UnionQueryNode | SelectQueryNode)[]
|
|
90
90
|
];
|
|
91
|
-
export
|
|
92
|
-
export
|
|
93
|
-
export
|
|
94
|
-
export
|
|
91
|
+
export type InsertQueryNode = ['InsertQuery', ...AbstractSqlType[]];
|
|
92
|
+
export type UpdateQueryNode = ['UpdateQuery', ...AbstractSqlType[]];
|
|
93
|
+
export type DeleteQueryNode = ['DeleteQuery', ...AbstractSqlType[]];
|
|
94
|
+
export type UpsertQueryNode = ['UpsertQuery', InsertQueryNode, UpdateQueryNode];
|
|
95
95
|
export interface FromTypeNode {
|
|
96
96
|
SelectQueryNode: SelectQueryNode;
|
|
97
97
|
UnionQueryNode: UnionQueryNode;
|
|
98
98
|
TableNode: TableNode;
|
|
99
99
|
ResourceNode: ResourceNode;
|
|
100
100
|
}
|
|
101
|
-
export
|
|
102
|
-
export
|
|
103
|
-
|
|
104
|
-
export
|
|
105
|
-
export
|
|
106
|
-
export
|
|
107
|
-
export
|
|
108
|
-
export
|
|
109
|
-
export
|
|
110
|
-
export
|
|
111
|
-
export
|
|
112
|
-
export
|
|
113
|
-
export
|
|
114
|
-
export
|
|
115
|
-
export
|
|
116
|
-
export
|
|
101
|
+
export type ResourceNode = ['Resource', string];
|
|
102
|
+
export type FromTypeNodes = FromTypeNode[keyof FromTypeNode] | AliasNode<FromTypeNode[keyof FromTypeNode]>;
|
|
103
|
+
type AliasableFromTypeNodes = FromTypeNodes | AliasNode<FromTypeNodes>;
|
|
104
|
+
export type SelectNode = ['Select', AbstractSqlType[]];
|
|
105
|
+
export type FromNode = ['From', AliasableFromTypeNodes];
|
|
106
|
+
export type InnerJoinNode = ['Join', AliasableFromTypeNodes, OnNode?];
|
|
107
|
+
export type LeftJoinNode = ['LeftJoin', AliasableFromTypeNodes, OnNode?];
|
|
108
|
+
export type RightJoinNode = ['RightJoin', AliasableFromTypeNodes, OnNode?];
|
|
109
|
+
export type FullJoinNode = ['FullJoin', AliasableFromTypeNodes, OnNode?];
|
|
110
|
+
export type CrossJoinNode = ['CrossJoin', AliasableFromTypeNodes];
|
|
111
|
+
export type OnNode = ['On', BooleanTypeNodes];
|
|
112
|
+
export type TableNode = ['Table', string];
|
|
113
|
+
export type WhereNode = ['Where', BooleanTypeNodes];
|
|
114
|
+
export type GroupByNode = ['GroupBy', Array<FieldNode | ReferencedFieldNode>];
|
|
115
|
+
export type HavingNode = ['Having', BooleanTypeNodes];
|
|
116
|
+
export type OrderByNode = [
|
|
117
117
|
'OrderBy',
|
|
118
118
|
...Array<['ASC' | 'DESC', FieldNode | ReferencedFieldNode]>
|
|
119
119
|
];
|
|
120
|
-
export
|
|
121
|
-
export
|
|
122
|
-
export
|
|
123
|
-
export
|
|
120
|
+
export type LimitNode = ['Limit', NumberTypeNodes];
|
|
121
|
+
export type OffsetNode = ['Offset', NumberTypeNodes];
|
|
122
|
+
export type FieldsNode = ['Fields', string[]];
|
|
123
|
+
export type ValuesNode = [
|
|
124
124
|
'Values',
|
|
125
125
|
SelectQueryNode | UnionQueryNode | ValuesNodeTypes[]
|
|
126
126
|
];
|
|
127
|
-
export
|
|
128
|
-
export
|
|
129
|
-
export
|
|
130
|
-
export
|
|
127
|
+
export type ValuesNodeTypes = 'Default' | NullNode | BindNode | TextNode | NumberNode;
|
|
128
|
+
export type AliasNode<T> = ['Alias', T, string];
|
|
129
|
+
export type AbstractSqlType = string | NullNode | DateNode | BooleanTypeNodes | NumberTypeNodes | TextTypeNodes | UnknownTypeNodes | DurationNode | SelectQueryNode | InsertQueryNode | UpdateQueryNode | DeleteQueryNode | UpsertQueryNode | SelectNode | ValuesNode | InnerJoinNode | LeftJoinNode | RightJoinNode | FullJoinNode | CrossJoinNode | GroupByNode | HavingNode | UnknownNode;
|
|
130
|
+
export type UnknownNode = AbstractSqlQuery;
|
|
131
131
|
export interface AbstractSqlQuery extends Array<AbstractSqlType> {
|
|
132
132
|
0: string;
|
|
133
133
|
}
|
|
@@ -184,14 +184,14 @@ export interface SqlRule {
|
|
|
184
184
|
referencedFields?: ReferencedFields | undefined;
|
|
185
185
|
ruleReferencedFields?: RuleReferencedFields | undefined;
|
|
186
186
|
}
|
|
187
|
-
export
|
|
187
|
+
export type RelationshipMapping = [string, [string, string]?];
|
|
188
188
|
export interface RelationshipLeafNode {
|
|
189
189
|
$: RelationshipMapping;
|
|
190
190
|
}
|
|
191
191
|
export interface RelationshipInternalNode {
|
|
192
192
|
[resourceName: string]: Relationship;
|
|
193
193
|
}
|
|
194
|
-
export
|
|
194
|
+
export type Relationship = RelationshipLeafNode | RelationshipInternalNode;
|
|
195
195
|
export interface AbstractSqlModel {
|
|
196
196
|
synonyms: {
|
|
197
197
|
[synonym: string]: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AbstractSqlQuery, AbstractSqlType, Engines, InsertQueryNode, SelectQueryNode, UnionQueryNode, UpdateQueryNode, DeleteQueryNode, UpsertQueryNode } from './AbstractSQLCompiler';
|
|
2
|
-
export
|
|
2
|
+
export type Binding = [string, any] | ['Bind', number | string | [string, string]];
|
|
3
3
|
export interface SqlResult {
|
|
4
4
|
query: string;
|
|
5
5
|
bindings: Binding[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@balena/abstract-sql-compiler",
|
|
3
|
-
"version": "7.20.
|
|
3
|
+
"version": "7.20.4",
|
|
4
4
|
"description": "A translator for abstract sql into sql.",
|
|
5
5
|
"main": "out/AbstractSQLCompiler.js",
|
|
6
6
|
"types": "out/AbstractSQLCompiler.d.ts",
|
|
@@ -63,6 +63,6 @@
|
|
|
63
63
|
]
|
|
64
64
|
},
|
|
65
65
|
"versionist": {
|
|
66
|
-
"publishedAt": "2022-11-
|
|
66
|
+
"publishedAt": "2022-11-16T03:24:53.788Z"
|
|
67
67
|
}
|
|
68
68
|
}
|
|
@@ -40,3 +40,324 @@ describe('Sum', () => {
|
|
|
40
40
|
},
|
|
41
41
|
);
|
|
42
42
|
});
|
|
43
|
+
|
|
44
|
+
describe('Add', () => {
|
|
45
|
+
test(
|
|
46
|
+
['SelectQuery', ['Select', [['Add', ['Number', 5], ['Number', 3]]]]],
|
|
47
|
+
(result, sqlEquals) => {
|
|
48
|
+
it('should produce a valid addition statement', () => {
|
|
49
|
+
sqlEquals(result.query, 'SELECT 5 + 3');
|
|
50
|
+
});
|
|
51
|
+
},
|
|
52
|
+
);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe('Subtract', () => {
|
|
56
|
+
test(
|
|
57
|
+
['SelectQuery', ['Select', [['Subtract', ['Number', 5], ['Number', 3]]]]],
|
|
58
|
+
(result, sqlEquals) => {
|
|
59
|
+
it('should produce a valid subtraction statement', () => {
|
|
60
|
+
sqlEquals(result.query, 'SELECT 5 - 3');
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe('Multiply', () => {
|
|
67
|
+
test(
|
|
68
|
+
['SelectQuery', ['Select', [['Multiply', ['Number', 5], ['Number', 3]]]]],
|
|
69
|
+
(result, sqlEquals) => {
|
|
70
|
+
it('should produce a valid multiplication statement', () => {
|
|
71
|
+
sqlEquals(result.query, 'SELECT 5 * 3');
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe('Divide', () => {
|
|
78
|
+
test(
|
|
79
|
+
['SelectQuery', ['Select', [['Divide', ['Number', 10], ['Number', 5]]]]],
|
|
80
|
+
(result, sqlEquals) => {
|
|
81
|
+
it('should produce a valid division statement', () => {
|
|
82
|
+
sqlEquals(result.query, 'SELECT 10 / 5');
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
describe('Year', () => {
|
|
89
|
+
test(
|
|
90
|
+
['SelectQuery', ['Select', [['Year', ['Date', '2022-10-10']]]]],
|
|
91
|
+
[['Date', '2022-10-10']],
|
|
92
|
+
(result, sqlEquals) => {
|
|
93
|
+
it('should produce a valid extract year statement', () => {
|
|
94
|
+
sqlEquals(result.query, `SELECT EXTRACT('YEAR' FROM $1)`);
|
|
95
|
+
});
|
|
96
|
+
},
|
|
97
|
+
);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
describe('Month', () => {
|
|
101
|
+
test(
|
|
102
|
+
['SelectQuery', ['Select', [['Month', ['Date', '2022-10-10']]]]],
|
|
103
|
+
[['Date', '2022-10-10']],
|
|
104
|
+
(result, sqlEquals) => {
|
|
105
|
+
it('should produce a valid extract month statement', () => {
|
|
106
|
+
sqlEquals(result.query, `SELECT EXTRACT('MONTH' FROM $1)`);
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
describe('Day', () => {
|
|
113
|
+
test(
|
|
114
|
+
['SelectQuery', ['Select', [['Day', ['Date', '2022-10-10']]]]],
|
|
115
|
+
[['Date', '2022-10-10']],
|
|
116
|
+
(result, sqlEquals) => {
|
|
117
|
+
it('should produce a valid extract day statement', () => {
|
|
118
|
+
sqlEquals(result.query, `SELECT EXTRACT('DAY' FROM $1)`);
|
|
119
|
+
});
|
|
120
|
+
},
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe('Hour', () => {
|
|
125
|
+
test(
|
|
126
|
+
[
|
|
127
|
+
'SelectQuery',
|
|
128
|
+
['Select', [['Hour', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
129
|
+
],
|
|
130
|
+
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
131
|
+
(result, sqlEquals) => {
|
|
132
|
+
it('should produce a valid extract hour statement', () => {
|
|
133
|
+
sqlEquals(result.query, `SELECT EXTRACT('HOUR' FROM $1)`);
|
|
134
|
+
});
|
|
135
|
+
},
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
describe('Minute', () => {
|
|
140
|
+
test(
|
|
141
|
+
[
|
|
142
|
+
'SelectQuery',
|
|
143
|
+
['Select', [['Minute', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
144
|
+
],
|
|
145
|
+
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
146
|
+
(result, sqlEquals) => {
|
|
147
|
+
it('should produce a valid extract minute statement', () => {
|
|
148
|
+
sqlEquals(result.query, `SELECT EXTRACT('MINUTE' FROM $1)`);
|
|
149
|
+
});
|
|
150
|
+
},
|
|
151
|
+
);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
describe('Second', () => {
|
|
155
|
+
test(
|
|
156
|
+
[
|
|
157
|
+
'SelectQuery',
|
|
158
|
+
['Select', [['Second', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
159
|
+
],
|
|
160
|
+
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
161
|
+
(result, sqlEquals) => {
|
|
162
|
+
it('should produce a valid extract second statement', () => {
|
|
163
|
+
sqlEquals(result.query, `SELECT FLOOR(EXTRACT('SECOND' FROM $1))`);
|
|
164
|
+
});
|
|
165
|
+
},
|
|
166
|
+
);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
describe('Fractionalseconds', () => {
|
|
170
|
+
test(
|
|
171
|
+
[
|
|
172
|
+
'SelectQuery',
|
|
173
|
+
['Select', [['Fractionalseconds', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
174
|
+
],
|
|
175
|
+
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
176
|
+
(result, sqlEquals) => {
|
|
177
|
+
it('should produce a valid extract fractionalseconds statement', () => {
|
|
178
|
+
sqlEquals(
|
|
179
|
+
result.query,
|
|
180
|
+
`SELECT EXTRACT('SECOND' FROM $1) - FLOOR(EXTRACT('SECOND' FROM $1))`,
|
|
181
|
+
);
|
|
182
|
+
});
|
|
183
|
+
},
|
|
184
|
+
);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
describe('Totalseconds', () => {
|
|
188
|
+
test(
|
|
189
|
+
[
|
|
190
|
+
'SelectQuery',
|
|
191
|
+
[
|
|
192
|
+
'Select',
|
|
193
|
+
[
|
|
194
|
+
[
|
|
195
|
+
'Totalseconds',
|
|
196
|
+
[
|
|
197
|
+
'Duration',
|
|
198
|
+
{
|
|
199
|
+
day: 1,
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
],
|
|
203
|
+
],
|
|
204
|
+
],
|
|
205
|
+
],
|
|
206
|
+
(result, sqlEquals) => {
|
|
207
|
+
it('should produce a valid interval statement', () => {
|
|
208
|
+
sqlEquals(
|
|
209
|
+
result.query,
|
|
210
|
+
`SELECT EXTRACT(EPOCH FROM INTERVAL '1 0:0:0.0')`,
|
|
211
|
+
);
|
|
212
|
+
});
|
|
213
|
+
},
|
|
214
|
+
);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
describe('Concatenate', () => {
|
|
218
|
+
test(
|
|
219
|
+
[
|
|
220
|
+
'SelectQuery',
|
|
221
|
+
[
|
|
222
|
+
'Select',
|
|
223
|
+
[['Concatenate', ['EmbeddedText', 'foo'], ['EmbeddedText', 'bar']]],
|
|
224
|
+
],
|
|
225
|
+
],
|
|
226
|
+
(result, sqlEquals) => {
|
|
227
|
+
it('should produce a valid concatenate statement', () => {
|
|
228
|
+
sqlEquals(result.query, `SELECT ('foo' || 'bar')`);
|
|
229
|
+
});
|
|
230
|
+
},
|
|
231
|
+
);
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
describe('ConcatenateWithSeparator', () => {
|
|
235
|
+
test(
|
|
236
|
+
[
|
|
237
|
+
'SelectQuery',
|
|
238
|
+
[
|
|
239
|
+
'Select',
|
|
240
|
+
[
|
|
241
|
+
[
|
|
242
|
+
'ConcatenateWithSeparator',
|
|
243
|
+
['EmbeddedText', '|'],
|
|
244
|
+
['EmbeddedText', 'foo'],
|
|
245
|
+
['EmbeddedText', 'bar'],
|
|
246
|
+
],
|
|
247
|
+
],
|
|
248
|
+
],
|
|
249
|
+
],
|
|
250
|
+
(result, sqlEquals) => {
|
|
251
|
+
it('should produce a valid concatenate with separator statement', () => {
|
|
252
|
+
sqlEquals(result.query, `SELECT CONCAT_WS('|', 'foo', 'bar')`);
|
|
253
|
+
});
|
|
254
|
+
},
|
|
255
|
+
);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
describe('Replace', () => {
|
|
259
|
+
test(
|
|
260
|
+
[
|
|
261
|
+
'SelectQuery',
|
|
262
|
+
[
|
|
263
|
+
'Select',
|
|
264
|
+
[
|
|
265
|
+
[
|
|
266
|
+
'Replace',
|
|
267
|
+
['EmbeddedText', 'foobar'],
|
|
268
|
+
['EmbeddedText', 'bar'],
|
|
269
|
+
['EmbeddedText', 'baz'],
|
|
270
|
+
],
|
|
271
|
+
],
|
|
272
|
+
],
|
|
273
|
+
],
|
|
274
|
+
(result, sqlEquals) => {
|
|
275
|
+
it('should produce a valid replace statement', () => {
|
|
276
|
+
sqlEquals(result.query, `SELECT REPLACE('foobar', 'bar', 'baz')`);
|
|
277
|
+
});
|
|
278
|
+
},
|
|
279
|
+
);
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
describe('CharacterLength', () => {
|
|
283
|
+
test(
|
|
284
|
+
[
|
|
285
|
+
'SelectQuery',
|
|
286
|
+
['Select', [['CharacterLength', ['EmbeddedText', 'foobar']]]],
|
|
287
|
+
],
|
|
288
|
+
(result, sqlEquals) => {
|
|
289
|
+
it('should produce a valid character length statement', () => {
|
|
290
|
+
sqlEquals(result.query, `SELECT LENGTH('foobar')`);
|
|
291
|
+
});
|
|
292
|
+
},
|
|
293
|
+
);
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
describe('StrPos', () => {
|
|
297
|
+
test(
|
|
298
|
+
[
|
|
299
|
+
'SelectQuery',
|
|
300
|
+
[
|
|
301
|
+
'Select',
|
|
302
|
+
[['StrPos', ['EmbeddedText', 'foobar'], ['EmbeddedText', 'b']]],
|
|
303
|
+
],
|
|
304
|
+
],
|
|
305
|
+
(result, sqlEquals) => {
|
|
306
|
+
it('should produce a valid string position statement', () => {
|
|
307
|
+
sqlEquals(result.query, `SELECT STRPOS('foobar', 'b')`);
|
|
308
|
+
});
|
|
309
|
+
},
|
|
310
|
+
);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
describe('Duration', () => {
|
|
314
|
+
test(
|
|
315
|
+
[
|
|
316
|
+
'SelectQuery',
|
|
317
|
+
[
|
|
318
|
+
'Select',
|
|
319
|
+
[
|
|
320
|
+
[
|
|
321
|
+
'Duration',
|
|
322
|
+
{
|
|
323
|
+
negative: false,
|
|
324
|
+
day: 1,
|
|
325
|
+
hour: 2,
|
|
326
|
+
minute: 3,
|
|
327
|
+
second: 4,
|
|
328
|
+
},
|
|
329
|
+
],
|
|
330
|
+
],
|
|
331
|
+
],
|
|
332
|
+
],
|
|
333
|
+
(result, sqlEquals) => {
|
|
334
|
+
it('should produce a valid interval statement', () => {
|
|
335
|
+
sqlEquals(result.query, `SELECT INTERVAL '1 2:3:4.0'`);
|
|
336
|
+
});
|
|
337
|
+
},
|
|
338
|
+
);
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
describe('Substring', () => {
|
|
342
|
+
test(
|
|
343
|
+
[
|
|
344
|
+
'SelectQuery',
|
|
345
|
+
[
|
|
346
|
+
'Select',
|
|
347
|
+
[
|
|
348
|
+
[
|
|
349
|
+
'Substring',
|
|
350
|
+
['EmbeddedText', 'foobar'],
|
|
351
|
+
['Number', 0],
|
|
352
|
+
['Number', 5],
|
|
353
|
+
],
|
|
354
|
+
],
|
|
355
|
+
],
|
|
356
|
+
],
|
|
357
|
+
(result, sqlEquals) => {
|
|
358
|
+
it('should produce a valid substring statement', () => {
|
|
359
|
+
sqlEquals(result.query, `SELECT SUBSTRING('foobar', 0, 5)`);
|
|
360
|
+
});
|
|
361
|
+
},
|
|
362
|
+
);
|
|
363
|
+
});
|