kysely 0.19.8 → 0.19.9
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/README.md +11 -6
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +5 -2
- package/dist/cjs/operation-node/operation-node-transformer.js +131 -122
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/select-modifier-node.d.ts +16 -0
- package/dist/cjs/operation-node/select-modifier-node.js +24 -0
- package/dist/cjs/operation-node/select-query-node.d.ts +5 -5
- package/dist/cjs/operation-node/select-query-node.js +11 -9
- package/dist/cjs/query-builder/select-query-builder.d.ts +50 -6
- package/dist/cjs/query-builder/select-query-builder.js +68 -13
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +14 -7
- package/dist/cjs/util/require-all-props.d.ts +43 -0
- package/dist/cjs/util/require-all-props.js +40 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +5 -2
- package/dist/esm/operation-node/operation-node-transformer.js +131 -122
- package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-visitor.js +1 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/select-modifier-node.d.ts +16 -0
- package/dist/esm/operation-node/select-modifier-node.js +22 -0
- package/dist/esm/operation-node/select-query-node.d.ts +5 -5
- package/dist/esm/operation-node/select-query-node.js +11 -9
- package/dist/esm/query-builder/select-query-builder.d.ts +50 -6
- package/dist/esm/query-builder/select-query-builder.js +68 -13
- package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/esm/query-compiler/default-query-compiler.js +14 -7
- package/dist/esm/util/require-all-props.d.ts +43 -0
- package/dist/esm/util/require-all-props.js +37 -0
- package/package.json +1 -1
|
@@ -65,6 +65,7 @@ import { GeneratedNode } from './generated-node.js';
|
|
|
65
65
|
import { DefaultValueNode } from './default-value-node.js';
|
|
66
66
|
import { OnNode } from './on-node.js';
|
|
67
67
|
import { ValuesNode } from './values-node.js';
|
|
68
|
+
import { SelectModifierNode } from './select-modifier-node.js';
|
|
68
69
|
export declare abstract class OperationNodeVisitor {
|
|
69
70
|
#private;
|
|
70
71
|
protected readonly nodeStack: OperationNode[];
|
|
@@ -136,4 +137,5 @@ export declare abstract class OperationNodeVisitor {
|
|
|
136
137
|
protected abstract visitDefaultValue(node: DefaultValueNode): void;
|
|
137
138
|
protected abstract visitOn(node: OnNode): void;
|
|
138
139
|
protected abstract visitValues(node: ValuesNode): void;
|
|
140
|
+
protected abstract visitSelectModifier(node: SelectModifierNode): void;
|
|
139
141
|
}
|
|
@@ -74,6 +74,7 @@ class OperationNodeVisitor {
|
|
|
74
74
|
DefaultValueNode: this.visitDefaultValue.bind(this),
|
|
75
75
|
OnNode: this.visitOn.bind(this),
|
|
76
76
|
ValuesNode: this.visitValues.bind(this),
|
|
77
|
+
SelectModifierNode: this.visitSelectModifier.bind(this),
|
|
77
78
|
});
|
|
78
79
|
visitNode = (node) => {
|
|
79
80
|
this.nodeStack.push(node);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare type OperationNodeKind = 'IdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode';
|
|
1
|
+
export declare type OperationNodeKind = 'IdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode';
|
|
2
2
|
export interface OperationNode {
|
|
3
3
|
readonly kind: OperationNodeKind;
|
|
4
4
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
import { RawNode } from './raw-node.js';
|
|
3
|
+
export declare type SelectModifier = 'ForUpdate' | 'ForNoKeyUpdate' | 'ForShare' | 'ForKeyShare' | 'NoWait' | 'SkipLocked' | 'Distinct';
|
|
4
|
+
export interface SelectModifierNode extends OperationNode {
|
|
5
|
+
readonly kind: 'SelectModifierNode';
|
|
6
|
+
readonly modifier?: SelectModifier;
|
|
7
|
+
readonly rawModifier?: RawNode;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare const SelectModifierNode: Readonly<{
|
|
13
|
+
is(node: OperationNode): node is SelectModifierNode;
|
|
14
|
+
create(modifier: SelectModifier): SelectModifierNode;
|
|
15
|
+
createWithRaw(modifier: RawNode): SelectModifierNode;
|
|
16
|
+
}>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SelectModifierNode = void 0;
|
|
4
|
+
const object_utils_js_1 = require("../util/object-utils.js");
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
exports.SelectModifierNode = (0, object_utils_js_1.freeze)({
|
|
9
|
+
is(node) {
|
|
10
|
+
return node.kind === 'SelectModifierNode';
|
|
11
|
+
},
|
|
12
|
+
create(modifier) {
|
|
13
|
+
return (0, object_utils_js_1.freeze)({
|
|
14
|
+
kind: 'SelectModifierNode',
|
|
15
|
+
modifier,
|
|
16
|
+
});
|
|
17
|
+
},
|
|
18
|
+
createWithRaw(modifier) {
|
|
19
|
+
return (0, object_utils_js_1.freeze)({
|
|
20
|
+
kind: 'SelectModifierNode',
|
|
21
|
+
rawModifier: modifier,
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
});
|
|
@@ -13,18 +13,18 @@ import { SelectionNode } from './selection-node.js';
|
|
|
13
13
|
import { WhereNode } from './where-node.js';
|
|
14
14
|
import { WithNode } from './with-node.js';
|
|
15
15
|
import { UnionNode } from './union-node.js';
|
|
16
|
-
|
|
16
|
+
import { SelectModifierNode } from './select-modifier-node.js';
|
|
17
17
|
export interface SelectQueryNode extends OperationNode {
|
|
18
18
|
readonly kind: 'SelectQueryNode';
|
|
19
19
|
readonly from: FromNode;
|
|
20
20
|
readonly selections?: ReadonlyArray<SelectionNode>;
|
|
21
21
|
readonly distinctOnSelections?: ReadonlyArray<SelectionNode>;
|
|
22
|
-
readonly distinct?: boolean;
|
|
23
22
|
readonly joins?: ReadonlyArray<JoinNode>;
|
|
24
23
|
readonly groupBy?: GroupByNode;
|
|
25
24
|
readonly orderBy?: OrderByNode;
|
|
26
25
|
readonly where?: WhereNode;
|
|
27
|
-
readonly
|
|
26
|
+
readonly frontModifiers?: ReadonlyArray<SelectModifierNode>;
|
|
27
|
+
readonly endModifiers?: ReadonlyArray<SelectModifierNode>;
|
|
28
28
|
readonly limit?: LimitNode;
|
|
29
29
|
readonly offset?: OffsetNode;
|
|
30
30
|
readonly with?: WithNode;
|
|
@@ -39,13 +39,13 @@ export declare const SelectQueryNode: Readonly<{
|
|
|
39
39
|
create(fromItems: ReadonlyArray<TableExpressionNode>, withNode?: WithNode): SelectQueryNode;
|
|
40
40
|
cloneWithSelections(select: SelectQueryNode, selections: ReadonlyArray<SelectionNode>): SelectQueryNode;
|
|
41
41
|
cloneWithDistinctOnSelections(select: SelectQueryNode, selections: ReadonlyArray<SelectionNode>): SelectQueryNode;
|
|
42
|
-
|
|
42
|
+
cloneWithFrontModifier(select: SelectQueryNode, modifier: SelectModifierNode): SelectQueryNode;
|
|
43
|
+
cloneWithEndModifier(select: SelectQueryNode, modifier: SelectModifierNode): SelectQueryNode;
|
|
43
44
|
cloneWithOrderByItem(selectNode: SelectQueryNode, item: OrderByItemNode): SelectQueryNode;
|
|
44
45
|
cloneWithGroupByItems(selectNode: SelectQueryNode, items: ReadonlyArray<GroupByItemNode>): SelectQueryNode;
|
|
45
46
|
cloneWithLimit(selectNode: SelectQueryNode, limit: LimitNode): SelectQueryNode;
|
|
46
47
|
cloneWithOffset(selectNode: SelectQueryNode, offset: OffsetNode): SelectQueryNode;
|
|
47
48
|
cloneWithHaving(selectNode: SelectQueryNode, filter: FilterExpressionNode): SelectQueryNode;
|
|
48
49
|
cloneWithOrHaving(selectNode: SelectQueryNode, filter: FilterExpressionNode): SelectQueryNode;
|
|
49
|
-
cloneWithDistinct(selectNode: SelectQueryNode): SelectQueryNode;
|
|
50
50
|
cloneWithUnion(selectNode: SelectQueryNode, union: UnionNode): SelectQueryNode;
|
|
51
51
|
}>;
|
|
@@ -36,11 +36,19 @@ exports.SelectQueryNode = (0, object_utils_js_1.freeze)({
|
|
|
36
36
|
: (0, object_utils_js_1.freeze)(selections),
|
|
37
37
|
});
|
|
38
38
|
},
|
|
39
|
-
|
|
39
|
+
cloneWithFrontModifier(select, modifier) {
|
|
40
40
|
return (0, object_utils_js_1.freeze)({
|
|
41
41
|
...select,
|
|
42
|
-
|
|
43
|
-
? (0, object_utils_js_1.freeze)([...select.
|
|
42
|
+
frontModifiers: select.frontModifiers
|
|
43
|
+
? (0, object_utils_js_1.freeze)([...select.frontModifiers, modifier])
|
|
44
|
+
: (0, object_utils_js_1.freeze)([modifier]),
|
|
45
|
+
});
|
|
46
|
+
},
|
|
47
|
+
cloneWithEndModifier(select, modifier) {
|
|
48
|
+
return (0, object_utils_js_1.freeze)({
|
|
49
|
+
...select,
|
|
50
|
+
endModifiers: select.endModifiers
|
|
51
|
+
? (0, object_utils_js_1.freeze)([...select.endModifiers, modifier])
|
|
44
52
|
: (0, object_utils_js_1.freeze)([modifier]),
|
|
45
53
|
});
|
|
46
54
|
},
|
|
@@ -88,12 +96,6 @@ exports.SelectQueryNode = (0, object_utils_js_1.freeze)({
|
|
|
88
96
|
: having_node_js_1.HavingNode.create(filter),
|
|
89
97
|
});
|
|
90
98
|
},
|
|
91
|
-
cloneWithDistinct(selectNode) {
|
|
92
|
-
return (0, object_utils_js_1.freeze)({
|
|
93
|
-
...selectNode,
|
|
94
|
-
distinct: true,
|
|
95
|
-
});
|
|
96
|
-
},
|
|
97
99
|
cloneWithUnion(selectNode, union) {
|
|
98
100
|
return (0, object_utils_js_1.freeze)({
|
|
99
101
|
...selectNode,
|
|
@@ -653,6 +653,50 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
653
653
|
*/
|
|
654
654
|
distinctOn<SE extends SelectExpression<DB, TB>>(selections: ReadonlyArray<SE>): SelectQueryBuilder<DB, TB, O>;
|
|
655
655
|
distinctOn<SE extends SelectExpression<DB, TB>>(selection: SE): SelectQueryBuilder<DB, TB, O>;
|
|
656
|
+
/**
|
|
657
|
+
* This can be used to add any additional SQL to the front of the query __after__ the `select` keyword.
|
|
658
|
+
*
|
|
659
|
+
* ### Examples
|
|
660
|
+
*
|
|
661
|
+
* ```ts
|
|
662
|
+
* db.selectFrom('person')
|
|
663
|
+
* .modifyFront(sql`sql_no_cache`)
|
|
664
|
+
* .select('first_name')
|
|
665
|
+
* .execute()
|
|
666
|
+
* ```
|
|
667
|
+
*
|
|
668
|
+
* The generated SQL (MySQL):
|
|
669
|
+
*
|
|
670
|
+
* ```sql
|
|
671
|
+
* select sql_no_cache `first_name`
|
|
672
|
+
* from `person`
|
|
673
|
+
* ```
|
|
674
|
+
*/
|
|
675
|
+
modifyFront(modifier: AnyRawBuilder): SelectQueryBuilder<DB, TB, O>;
|
|
676
|
+
/**
|
|
677
|
+
* This can be used to add any additional SQL to the end of the query.
|
|
678
|
+
*
|
|
679
|
+
* Also see {@link forUpdate}, {@link forShare}, {@link forKeyShare}, {@link forNoKeyUpdate}
|
|
680
|
+
* {@link skipLocked} and {@link noWait}.
|
|
681
|
+
*
|
|
682
|
+
* ### Examples
|
|
683
|
+
*
|
|
684
|
+
* ```ts
|
|
685
|
+
* db.selectFrom('person')
|
|
686
|
+
* .select('first_name')
|
|
687
|
+
* .modifyEnd(sql`for update`)
|
|
688
|
+
* .execute()
|
|
689
|
+
* ```
|
|
690
|
+
*
|
|
691
|
+
* The generated SQL (PostgreSQL):
|
|
692
|
+
*
|
|
693
|
+
* ```sql
|
|
694
|
+
* select "first_name"
|
|
695
|
+
* from "person"
|
|
696
|
+
* for update
|
|
697
|
+
* ```
|
|
698
|
+
*/
|
|
699
|
+
modifyEnd(modifier: AnyRawBuilder): SelectQueryBuilder<DB, TB, O>;
|
|
656
700
|
/**
|
|
657
701
|
* Makes the selection distinct.
|
|
658
702
|
*
|
|
@@ -673,27 +717,27 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
673
717
|
*/
|
|
674
718
|
distinct(): SelectQueryBuilder<DB, TB, O>;
|
|
675
719
|
/**
|
|
676
|
-
* Adds the `for update`
|
|
720
|
+
* Adds the `for update` modifier to a select query on supported databases.
|
|
677
721
|
*/
|
|
678
722
|
forUpdate(): SelectQueryBuilder<DB, TB, O>;
|
|
679
723
|
/**
|
|
680
|
-
* Adds the `for share`
|
|
724
|
+
* Adds the `for share` modifier to a select query on supported databases.
|
|
681
725
|
*/
|
|
682
726
|
forShare(): SelectQueryBuilder<DB, TB, O>;
|
|
683
727
|
/**
|
|
684
|
-
* Adds the `for key share`
|
|
728
|
+
* Adds the `for key share` modifier to a select query on supported databases.
|
|
685
729
|
*/
|
|
686
730
|
forKeyShare(): SelectQueryBuilder<DB, TB, O>;
|
|
687
731
|
/**
|
|
688
|
-
* Adds the `for no key update`
|
|
732
|
+
* Adds the `for no key update` modifier to a select query on supported databases.
|
|
689
733
|
*/
|
|
690
734
|
forNoKeyUpdate(): SelectQueryBuilder<DB, TB, O>;
|
|
691
735
|
/**
|
|
692
|
-
* Adds the `skip locked`
|
|
736
|
+
* Adds the `skip locked` modifier to a select query on supported databases.
|
|
693
737
|
*/
|
|
694
738
|
skipLocked(): SelectQueryBuilder<DB, TB, O>;
|
|
695
739
|
/**
|
|
696
|
-
* Adds the `nowait`
|
|
740
|
+
* Adds the `nowait` modifier to a select query on supported databases.
|
|
697
741
|
*/
|
|
698
742
|
noWait(): SelectQueryBuilder<DB, TB, O>;
|
|
699
743
|
/**
|
|
@@ -16,6 +16,7 @@ const group_by_parser_js_1 = require("../parser/group-by-parser.js");
|
|
|
16
16
|
const union_parser_js_1 = require("../parser/union-parser.js");
|
|
17
17
|
const no_result_error_js_1 = require("./no-result-error.js");
|
|
18
18
|
const identifier_node_js_1 = require("../operation-node/identifier-node.js");
|
|
19
|
+
const select_modifier_node_js_1 = require("../operation-node/select-modifier-node.js");
|
|
19
20
|
class SelectQueryBuilder {
|
|
20
21
|
#props;
|
|
21
22
|
constructor(props) {
|
|
@@ -129,6 +130,60 @@ class SelectQueryBuilder {
|
|
|
129
130
|
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithDistinctOnSelections(this.#props.queryNode, (0, select_parser_js_1.parseSelectExpressionOrList)(selection)),
|
|
130
131
|
});
|
|
131
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* This can be used to add any additional SQL to the front of the query __after__ the `select` keyword.
|
|
135
|
+
*
|
|
136
|
+
* ### Examples
|
|
137
|
+
*
|
|
138
|
+
* ```ts
|
|
139
|
+
* db.selectFrom('person')
|
|
140
|
+
* .modifyFront(sql`sql_no_cache`)
|
|
141
|
+
* .select('first_name')
|
|
142
|
+
* .execute()
|
|
143
|
+
* ```
|
|
144
|
+
*
|
|
145
|
+
* The generated SQL (MySQL):
|
|
146
|
+
*
|
|
147
|
+
* ```sql
|
|
148
|
+
* select sql_no_cache `first_name`
|
|
149
|
+
* from `person`
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
modifyFront(modifier) {
|
|
153
|
+
return new SelectQueryBuilder({
|
|
154
|
+
...this.#props,
|
|
155
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithFrontModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.createWithRaw(modifier.toOperationNode())),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* This can be used to add any additional SQL to the end of the query.
|
|
160
|
+
*
|
|
161
|
+
* Also see {@link forUpdate}, {@link forShare}, {@link forKeyShare}, {@link forNoKeyUpdate}
|
|
162
|
+
* {@link skipLocked} and {@link noWait}.
|
|
163
|
+
*
|
|
164
|
+
* ### Examples
|
|
165
|
+
*
|
|
166
|
+
* ```ts
|
|
167
|
+
* db.selectFrom('person')
|
|
168
|
+
* .select('first_name')
|
|
169
|
+
* .modifyEnd(sql`for update`)
|
|
170
|
+
* .execute()
|
|
171
|
+
* ```
|
|
172
|
+
*
|
|
173
|
+
* The generated SQL (PostgreSQL):
|
|
174
|
+
*
|
|
175
|
+
* ```sql
|
|
176
|
+
* select "first_name"
|
|
177
|
+
* from "person"
|
|
178
|
+
* for update
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
modifyEnd(modifier) {
|
|
182
|
+
return new SelectQueryBuilder({
|
|
183
|
+
...this.#props,
|
|
184
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.createWithRaw(modifier.toOperationNode())),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
132
187
|
/**
|
|
133
188
|
* Makes the selection distinct.
|
|
134
189
|
*
|
|
@@ -150,61 +205,61 @@ class SelectQueryBuilder {
|
|
|
150
205
|
distinct() {
|
|
151
206
|
return new SelectQueryBuilder({
|
|
152
207
|
...this.#props,
|
|
153
|
-
queryNode: select_query_node_js_1.SelectQueryNode.
|
|
208
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithFrontModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('Distinct')),
|
|
154
209
|
});
|
|
155
210
|
}
|
|
156
211
|
/**
|
|
157
|
-
* Adds the `for update`
|
|
212
|
+
* Adds the `for update` modifier to a select query on supported databases.
|
|
158
213
|
*/
|
|
159
214
|
forUpdate() {
|
|
160
215
|
return new SelectQueryBuilder({
|
|
161
216
|
...this.#props,
|
|
162
|
-
queryNode: select_query_node_js_1.SelectQueryNode.
|
|
217
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('ForUpdate')),
|
|
163
218
|
});
|
|
164
219
|
}
|
|
165
220
|
/**
|
|
166
|
-
* Adds the `for share`
|
|
221
|
+
* Adds the `for share` modifier to a select query on supported databases.
|
|
167
222
|
*/
|
|
168
223
|
forShare() {
|
|
169
224
|
return new SelectQueryBuilder({
|
|
170
225
|
...this.#props,
|
|
171
|
-
queryNode: select_query_node_js_1.SelectQueryNode.
|
|
226
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('ForShare')),
|
|
172
227
|
});
|
|
173
228
|
}
|
|
174
229
|
/**
|
|
175
|
-
* Adds the `for key share`
|
|
230
|
+
* Adds the `for key share` modifier to a select query on supported databases.
|
|
176
231
|
*/
|
|
177
232
|
forKeyShare() {
|
|
178
233
|
return new SelectQueryBuilder({
|
|
179
234
|
...this.#props,
|
|
180
|
-
queryNode: select_query_node_js_1.SelectQueryNode.
|
|
235
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('ForKeyShare')),
|
|
181
236
|
});
|
|
182
237
|
}
|
|
183
238
|
/**
|
|
184
|
-
* Adds the `for no key update`
|
|
239
|
+
* Adds the `for no key update` modifier to a select query on supported databases.
|
|
185
240
|
*/
|
|
186
241
|
forNoKeyUpdate() {
|
|
187
242
|
return new SelectQueryBuilder({
|
|
188
243
|
...this.#props,
|
|
189
|
-
queryNode: select_query_node_js_1.SelectQueryNode.
|
|
244
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('ForNoKeyUpdate')),
|
|
190
245
|
});
|
|
191
246
|
}
|
|
192
247
|
/**
|
|
193
|
-
* Adds the `skip locked`
|
|
248
|
+
* Adds the `skip locked` modifier to a select query on supported databases.
|
|
194
249
|
*/
|
|
195
250
|
skipLocked() {
|
|
196
251
|
return new SelectQueryBuilder({
|
|
197
252
|
...this.#props,
|
|
198
|
-
queryNode: select_query_node_js_1.SelectQueryNode.
|
|
253
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('SkipLocked')),
|
|
199
254
|
});
|
|
200
255
|
}
|
|
201
256
|
/**
|
|
202
|
-
* Adds the `nowait`
|
|
257
|
+
* Adds the `nowait` modifier to a select query on supported databases.
|
|
203
258
|
*/
|
|
204
259
|
noWait() {
|
|
205
260
|
return new SelectQueryBuilder({
|
|
206
261
|
...this.#props,
|
|
207
|
-
queryNode: select_query_node_js_1.SelectQueryNode.
|
|
262
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, select_modifier_node_js_1.SelectModifierNode.create('NoWait')),
|
|
208
263
|
});
|
|
209
264
|
}
|
|
210
265
|
selectAll(table) {
|
|
@@ -68,6 +68,7 @@ import { DefaultValueNode } from '../operation-node/default-value-node.js';
|
|
|
68
68
|
import { OnNode } from '../operation-node/on-node.js';
|
|
69
69
|
import { ValuesNode } from '../operation-node/values-node.js';
|
|
70
70
|
import { CommonTableExpressionNameNode } from '../operation-node/common-table-expression-name-node.js';
|
|
71
|
+
import { SelectModifierNode } from '../operation-node/select-modifier-node.js';
|
|
71
72
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
72
73
|
#private;
|
|
73
74
|
protected get numParameters(): number;
|
|
@@ -143,6 +144,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
143
144
|
protected visitDropView(node: DropViewNode): void;
|
|
144
145
|
protected visitGenerated(node: GeneratedNode): void;
|
|
145
146
|
protected visitDefaultValue(node: DefaultValueNode): void;
|
|
147
|
+
protected visitSelectModifier(node: SelectModifierNode): void;
|
|
146
148
|
protected append(str: string): void;
|
|
147
149
|
protected appendValue(parameter: unknown): void;
|
|
148
150
|
protected getLeftIdentifierWrapper(): string;
|
|
@@ -44,8 +44,8 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
44
44
|
this.compileDistinctOn(node.distinctOnSelections);
|
|
45
45
|
this.append(' ');
|
|
46
46
|
}
|
|
47
|
-
if (node.
|
|
48
|
-
this.
|
|
47
|
+
if (node.frontModifiers && node.frontModifiers.length > 0) {
|
|
48
|
+
this.compileList(node.frontModifiers, ' ');
|
|
49
49
|
this.append(' ');
|
|
50
50
|
}
|
|
51
51
|
if (node.selections) {
|
|
@@ -85,11 +85,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
85
85
|
this.append(' ');
|
|
86
86
|
this.visitNode(node.offset);
|
|
87
87
|
}
|
|
88
|
-
if (node.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
this.append(SELECT_MODIFIER_SQL[modifier]);
|
|
92
|
-
});
|
|
88
|
+
if (node.endModifiers && node.endModifiers.length > 0) {
|
|
89
|
+
this.append(' ');
|
|
90
|
+
this.compileList(node.endModifiers, ' ');
|
|
93
91
|
}
|
|
94
92
|
if (wrapInParens) {
|
|
95
93
|
this.append(')');
|
|
@@ -785,6 +783,14 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
785
783
|
this.append('default ');
|
|
786
784
|
this.visitNode(node.defaultValue);
|
|
787
785
|
}
|
|
786
|
+
visitSelectModifier(node) {
|
|
787
|
+
if (node.rawModifier) {
|
|
788
|
+
this.visitNode(node.rawModifier);
|
|
789
|
+
}
|
|
790
|
+
else {
|
|
791
|
+
this.append(SELECT_MODIFIER_SQL[node.modifier]);
|
|
792
|
+
}
|
|
793
|
+
}
|
|
788
794
|
append(str) {
|
|
789
795
|
this.#sql += str;
|
|
790
796
|
}
|
|
@@ -833,6 +839,7 @@ const SELECT_MODIFIER_SQL = (0, object_utils_js_1.freeze)({
|
|
|
833
839
|
ForShare: 'for share',
|
|
834
840
|
NoWait: 'nowait',
|
|
835
841
|
SkipLocked: 'skip locked',
|
|
842
|
+
Distinct: 'distinct',
|
|
836
843
|
});
|
|
837
844
|
const JOIN_TYPE_SQL = (0, object_utils_js_1.freeze)({
|
|
838
845
|
InnerJoin: 'inner join',
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility type to force use of all properties of T.
|
|
3
|
+
*
|
|
4
|
+
* Similar to Required<T> build-in type, but allows `undefined` values.
|
|
5
|
+
*/
|
|
6
|
+
declare type AllProps<T> = T & {
|
|
7
|
+
[P in keyof T]-?: unknown;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Helper function to check listed properties according to given type. Check if all properties has been used when object is initialised.
|
|
11
|
+
*
|
|
12
|
+
* Example use:
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* type SomeType = { propA: string; propB?: number; }
|
|
16
|
+
*
|
|
17
|
+
* // propB has to be mentioned even it is optional. It still should be initialized with undefined.
|
|
18
|
+
* const a: SomeType = requireAllProps<SomeType>({ propA: "value A", propB: undefined });
|
|
19
|
+
*
|
|
20
|
+
* // checked type is implicit for variable.
|
|
21
|
+
* const b = requireAllProps<SomeType>({ propA: "value A", propB: undefined });
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* Wrong use of this helper:
|
|
25
|
+
*
|
|
26
|
+
* 1. Omit checked type - all checked properties will be expect as of type never
|
|
27
|
+
*
|
|
28
|
+
* ```ts
|
|
29
|
+
* const z: SomeType = requireAllProps({ propC: "no type will work" });
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* 2. Apply to spreaded object - there is no way how to check in compile time if spreaded object contains all properties
|
|
33
|
+
*
|
|
34
|
+
* ```ts
|
|
35
|
+
* const y: SomeType = { propA: "" }; // valid object according to SomeType declaration
|
|
36
|
+
* const x = requireAllProps<SomeType>( { ... y } );
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @param obj object to check if all properties has been used
|
|
40
|
+
* @returns untouched obj parameter is returned
|
|
41
|
+
*/
|
|
42
|
+
export declare function requireAllProps<T>(obj: AllProps<T>): T;
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requireAllProps = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Helper function to check listed properties according to given type. Check if all properties has been used when object is initialised.
|
|
6
|
+
*
|
|
7
|
+
* Example use:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* type SomeType = { propA: string; propB?: number; }
|
|
11
|
+
*
|
|
12
|
+
* // propB has to be mentioned even it is optional. It still should be initialized with undefined.
|
|
13
|
+
* const a: SomeType = requireAllProps<SomeType>({ propA: "value A", propB: undefined });
|
|
14
|
+
*
|
|
15
|
+
* // checked type is implicit for variable.
|
|
16
|
+
* const b = requireAllProps<SomeType>({ propA: "value A", propB: undefined });
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Wrong use of this helper:
|
|
20
|
+
*
|
|
21
|
+
* 1. Omit checked type - all checked properties will be expect as of type never
|
|
22
|
+
*
|
|
23
|
+
* ```ts
|
|
24
|
+
* const z: SomeType = requireAllProps({ propC: "no type will work" });
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* 2. Apply to spreaded object - there is no way how to check in compile time if spreaded object contains all properties
|
|
28
|
+
*
|
|
29
|
+
* ```ts
|
|
30
|
+
* const y: SomeType = { propA: "" }; // valid object according to SomeType declaration
|
|
31
|
+
* const x = requireAllProps<SomeType>( { ... y } );
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @param obj object to check if all properties has been used
|
|
35
|
+
* @returns untouched obj parameter is returned
|
|
36
|
+
*/
|
|
37
|
+
function requireAllProps(obj) {
|
|
38
|
+
return obj;
|
|
39
|
+
}
|
|
40
|
+
exports.requireAllProps = requireAllProps;
|
|
@@ -65,6 +65,7 @@ import { GeneratedNode } from './generated-node.js';
|
|
|
65
65
|
import { DefaultValueNode } from './default-value-node.js';
|
|
66
66
|
import { OnNode } from './on-node.js';
|
|
67
67
|
import { ValuesNode } from './values-node.js';
|
|
68
|
+
import { SelectModifierNode } from './select-modifier-node.js';
|
|
68
69
|
/**
|
|
69
70
|
* Transforms an operation node tree into another one.
|
|
70
71
|
*
|
|
@@ -97,8 +98,9 @@ import { ValuesNode } from './values-node.js';
|
|
|
97
98
|
export declare class OperationNodeTransformer {
|
|
98
99
|
#private;
|
|
99
100
|
protected readonly nodeStack: OperationNode[];
|
|
100
|
-
readonly transformNode: <T extends OperationNode | undefined>(node:
|
|
101
|
-
protected transformNodeList<T extends OperationNode>(list: readonly
|
|
101
|
+
readonly transformNode: <T extends OperationNode | undefined, U extends T | undefined = T>(node: U) => T;
|
|
102
|
+
protected transformNodeList<T extends OperationNode, U extends T = T>(list: readonly U[]): readonly T[];
|
|
103
|
+
protected transformNodeList<T extends OperationNode, U extends T = T>(list: readonly U[] | undefined): readonly T[] | undefined;
|
|
102
104
|
protected transformSelectQuery(node: SelectQueryNode): SelectQueryNode;
|
|
103
105
|
protected transformSelection(node: SelectionNode): SelectionNode;
|
|
104
106
|
protected transformColumn(node: ColumnNode): ColumnNode;
|
|
@@ -159,6 +161,7 @@ export declare class OperationNodeTransformer {
|
|
|
159
161
|
protected transformGenerated(node: GeneratedNode): GeneratedNode;
|
|
160
162
|
protected transformDefaultValue(node: DefaultValueNode): DefaultValueNode;
|
|
161
163
|
protected transformOn(node: OnNode): OnNode;
|
|
164
|
+
protected transformSelectModifier(node: SelectModifierNode): SelectModifierNode;
|
|
162
165
|
protected transformDataType(node: DataTypeNode): DataTypeNode;
|
|
163
166
|
protected transformSelectAll(node: SelectAllNode): SelectAllNode;
|
|
164
167
|
protected transformIdentifier(node: IdentifierNode): IdentifierNode;
|