kysely 0.7.1 → 0.7.5
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 +24 -19
- package/dist/cjs/dialect/dialect-adapter.d.ts +11 -9
- package/dist/cjs/dialect/mysql/mysql-dialect.d.ts +1 -1
- package/dist/cjs/dialect/mysql/mysql-driver.js +1 -0
- package/dist/cjs/dialect/mysql/mysql-introspector.d.ts +0 -1
- package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -2
- package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +0 -4
- package/dist/cjs/dialect/mysql/mysql-query-compiler.js +0 -18
- package/dist/cjs/dialect/postgres/postgres-introspector.d.ts +0 -1
- package/dist/cjs/dialect/postgres/postgres-introspector.js +2 -2
- package/dist/cjs/driver/database-connection.d.ts +2 -1
- package/dist/cjs/driver/driver.d.ts +1 -1
- package/dist/cjs/driver/single-connection-provider.d.ts +0 -1
- package/dist/cjs/driver/single-connection-provider.js +2 -2
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/kysely.d.ts +7 -6
- package/dist/cjs/kysely.js +8 -6
- package/dist/cjs/migration/migration.js +11 -10
- package/dist/cjs/operation-node/alter-column-node.d.ts +2 -2
- package/dist/cjs/operation-node/alter-column-node.js +2 -2
- package/dist/cjs/operation-node/alter-table-node.d.ts +2 -2
- package/dist/cjs/operation-node/alter-table-node.js +2 -2
- package/dist/cjs/operation-node/column-definition-node.d.ts +2 -2
- package/dist/cjs/operation-node/column-definition-node.js +2 -2
- package/dist/cjs/operation-node/create-index-node.d.ts +2 -2
- package/dist/cjs/operation-node/create-index-node.js +2 -2
- package/dist/cjs/operation-node/create-table-node.d.ts +2 -1
- package/dist/cjs/operation-node/create-table-node.js +1 -5
- package/dist/cjs/operation-node/drop-index-node.d.ts +3 -3
- package/dist/cjs/operation-node/drop-index-node.js +2 -2
- package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +12 -1
- package/dist/cjs/operation-node/foreign-key-constraint-node.js +6 -0
- package/dist/cjs/operation-node/insert-query-node.d.ts +5 -2
- package/dist/cjs/operation-node/insert-query-node.js +2 -9
- package/dist/cjs/operation-node/join-node.d.ts +1 -0
- package/dist/cjs/operation-node/join-node.js +8 -0
- package/dist/cjs/operation-node/on-conflict-node.d.ts +2 -2
- package/dist/cjs/operation-node/on-conflict-node.js +2 -2
- package/dist/cjs/operation-node/on-duplicate-key-node.d.ts +14 -0
- package/dist/cjs/operation-node/on-duplicate-key-node.js +18 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +12 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +4 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/references-node.d.ts +5 -3
- package/dist/cjs/operation-node/references-node.js +6 -0
- package/dist/cjs/operation-node/table-node.js +2 -2
- package/dist/cjs/parser/data-type-parser.d.ts +5 -0
- package/dist/cjs/parser/data-type-parser.js +11 -0
- package/dist/cjs/parser/default-value-parser.d.ts +6 -0
- package/dist/cjs/parser/default-value-parser.js +11 -0
- package/dist/cjs/parser/filter-parser.d.ts +2 -2
- package/dist/cjs/parser/filter-parser.js +34 -36
- package/dist/cjs/parser/join-parser.d.ts +1 -1
- package/dist/cjs/parser/join-parser.js +9 -11
- package/dist/cjs/parser/parse-context.d.ts +34 -7
- package/dist/cjs/parser/parse-context.js +42 -34
- package/dist/cjs/parser/reference-parser.d.ts +2 -2
- package/dist/cjs/parser/reference-parser.js +16 -12
- package/dist/cjs/parser/select-parser.d.ts +1 -2
- package/dist/cjs/parser/select-parser.js +4 -5
- package/dist/cjs/parser/table-parser.js +11 -6
- package/dist/cjs/parser/update-set-parser.js +1 -1
- package/dist/cjs/parser/value-parser.js +1 -1
- package/dist/cjs/query-builder/{sub-query-builder.d.ts → expression-builder.d.ts} +7 -7
- package/dist/cjs/query-builder/{sub-query-builder.js → expression-builder.js} +6 -10
- package/dist/cjs/query-builder/join-builder.d.ts +2 -2
- package/dist/cjs/query-builder/join-builder.js +8 -12
- package/dist/cjs/query-builder/query-builder.d.ts +47 -8
- package/dist/cjs/query-builder/query-builder.js +163 -91
- package/dist/cjs/query-builder/type-utils.d.ts +5 -5
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -1
- package/dist/cjs/query-compiler/default-query-compiler.js +26 -6
- package/dist/cjs/query-creator.d.ts +2 -2
- package/dist/cjs/query-creator.js +8 -12
- package/dist/cjs/schema/alter-table-builder.d.ts +31 -8
- package/dist/cjs/schema/alter-table-builder.js +80 -7
- package/dist/cjs/schema/column-definition-builder.d.ts +10 -4
- package/dist/cjs/schema/column-definition-builder.js +11 -6
- package/dist/cjs/schema/create-index-builder.d.ts +5 -5
- package/dist/cjs/schema/create-index-builder.js +19 -28
- package/dist/cjs/schema/create-schema-builder.d.ts +5 -5
- package/dist/cjs/schema/create-schema-builder.js +9 -13
- package/dist/cjs/schema/create-table-builder.d.ts +22 -10
- package/dist/cjs/schema/create-table-builder.js +41 -34
- package/dist/cjs/schema/drop-index-builder.d.ts +5 -5
- package/dist/cjs/schema/drop-index-builder.js +11 -16
- package/dist/cjs/schema/drop-schema-builder.d.ts +5 -5
- package/dist/cjs/schema/drop-schema-builder.js +9 -13
- package/dist/cjs/schema/drop-table-builder.d.ts +5 -5
- package/dist/cjs/schema/drop-table-builder.js +9 -13
- package/dist/cjs/schema/foreign-key-constraint-builder.d.ts +14 -0
- package/dist/cjs/schema/foreign-key-constraint-builder.js +26 -0
- package/dist/cjs/transformers/with-schema-transformer.d.ts +0 -5
- package/dist/cjs/transformers/with-schema-transformer.js +21 -21
- package/dist/esm/dialect/dialect-adapter.d.ts +11 -9
- package/dist/esm/dialect/mysql/mysql-dialect.d.ts +1 -1
- package/dist/esm/dialect/mysql/mysql-driver.js +1 -0
- package/dist/esm/dialect/mysql/mysql-introspector.d.ts +0 -1
- package/dist/esm/dialect/mysql/mysql-introspector.js +2 -2
- package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +0 -4
- package/dist/esm/dialect/mysql/mysql-query-compiler.js +0 -18
- package/dist/esm/dialect/postgres/postgres-introspector.d.ts +0 -1
- package/dist/esm/dialect/postgres/postgres-introspector.js +2 -2
- package/dist/esm/driver/database-connection.d.ts +2 -1
- package/dist/esm/driver/driver.d.ts +1 -1
- package/dist/esm/driver/single-connection-provider.d.ts +0 -1
- package/dist/esm/driver/single-connection-provider.js +2 -2
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/kysely.d.ts +7 -6
- package/dist/esm/kysely.js +8 -6
- package/dist/esm/migration/migration.js +12 -11
- package/dist/esm/operation-node/alter-column-node.d.ts +2 -2
- package/dist/esm/operation-node/alter-column-node.js +2 -2
- package/dist/esm/operation-node/alter-table-node.d.ts +2 -2
- package/dist/esm/operation-node/alter-table-node.js +2 -2
- package/dist/esm/operation-node/column-definition-node.d.ts +2 -2
- package/dist/esm/operation-node/column-definition-node.js +2 -2
- package/dist/esm/operation-node/create-index-node.d.ts +2 -2
- package/dist/esm/operation-node/create-index-node.js +2 -2
- package/dist/esm/operation-node/create-table-node.d.ts +2 -1
- package/dist/esm/operation-node/create-table-node.js +1 -5
- package/dist/esm/operation-node/drop-index-node.d.ts +3 -3
- package/dist/esm/operation-node/drop-index-node.js +2 -2
- package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +12 -1
- package/dist/esm/operation-node/foreign-key-constraint-node.js +6 -0
- package/dist/esm/operation-node/insert-query-node.d.ts +5 -2
- package/dist/esm/operation-node/insert-query-node.js +2 -9
- package/dist/esm/operation-node/join-node.d.ts +1 -0
- package/dist/esm/operation-node/join-node.js +8 -0
- package/dist/esm/operation-node/on-conflict-node.d.ts +2 -2
- package/dist/esm/operation-node/on-conflict-node.js +2 -2
- package/dist/esm/operation-node/on-duplicate-key-node.d.ts +14 -0
- package/dist/esm/operation-node/on-duplicate-key-node.js +15 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.js +12 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-visitor.js +4 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/references-node.d.ts +5 -3
- package/dist/esm/operation-node/references-node.js +6 -0
- package/dist/esm/operation-node/table-node.js +2 -2
- package/dist/esm/parser/data-type-parser.d.ts +5 -0
- package/dist/esm/parser/data-type-parser.js +7 -0
- package/dist/esm/parser/default-value-parser.d.ts +6 -0
- package/dist/esm/parser/default-value-parser.js +7 -0
- package/dist/esm/parser/filter-parser.d.ts +2 -2
- package/dist/esm/parser/filter-parser.js +31 -33
- package/dist/esm/parser/join-parser.d.ts +1 -1
- package/dist/esm/parser/join-parser.js +7 -9
- package/dist/esm/parser/parse-context.d.ts +34 -7
- package/dist/esm/parser/parse-context.js +40 -32
- package/dist/esm/parser/reference-parser.d.ts +2 -2
- package/dist/esm/parser/reference-parser.js +16 -12
- package/dist/esm/parser/select-parser.d.ts +1 -2
- package/dist/esm/parser/select-parser.js +3 -3
- package/dist/esm/parser/table-parser.js +11 -6
- package/dist/esm/parser/update-set-parser.js +1 -1
- package/dist/esm/parser/value-parser.js +1 -1
- package/dist/esm/query-builder/{sub-query-builder.d.ts → expression-builder.d.ts} +7 -7
- package/dist/esm/query-builder/{sub-query-builder.js → expression-builder.js} +4 -8
- package/dist/esm/query-builder/join-builder.d.ts +2 -2
- package/dist/esm/query-builder/join-builder.js +9 -13
- package/dist/esm/query-builder/query-builder.d.ts +47 -8
- package/dist/esm/query-builder/query-builder.js +165 -93
- package/dist/esm/query-builder/type-utils.d.ts +5 -5
- package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -1
- package/dist/esm/query-compiler/default-query-compiler.js +27 -7
- package/dist/esm/query-creator.d.ts +2 -2
- package/dist/esm/query-creator.js +8 -12
- package/dist/esm/schema/alter-table-builder.d.ts +31 -8
- package/dist/esm/schema/alter-table-builder.js +78 -6
- package/dist/esm/schema/column-definition-builder.d.ts +10 -4
- package/dist/esm/schema/column-definition-builder.js +12 -7
- package/dist/esm/schema/create-index-builder.d.ts +5 -5
- package/dist/esm/schema/create-index-builder.js +19 -28
- package/dist/esm/schema/create-schema-builder.d.ts +5 -5
- package/dist/esm/schema/create-schema-builder.js +9 -13
- package/dist/esm/schema/create-table-builder.d.ts +22 -10
- package/dist/esm/schema/create-table-builder.js +41 -34
- package/dist/esm/schema/drop-index-builder.d.ts +5 -5
- package/dist/esm/schema/drop-index-builder.js +11 -16
- package/dist/esm/schema/drop-schema-builder.d.ts +5 -5
- package/dist/esm/schema/drop-schema-builder.js +9 -13
- package/dist/esm/schema/drop-table-builder.d.ts +5 -5
- package/dist/esm/schema/drop-table-builder.js +9 -13
- package/dist/esm/schema/foreign-key-constraint-builder.d.ts +14 -0
- package/dist/esm/schema/foreign-key-constraint-builder.js +22 -0
- package/dist/esm/transformers/with-schema-transformer.d.ts +0 -5
- package/dist/esm/transformers/with-schema-transformer.js +21 -21
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@ import { ColumnNode } from './column-node.js';
|
|
|
2
2
|
import { ColumnUpdateNode } from './column-update-node.js';
|
|
3
3
|
import { IdentifierNode } from './identifier-node.js';
|
|
4
4
|
import { OperationNode } from './operation-node.js';
|
|
5
|
-
export declare type
|
|
5
|
+
export declare type OnConflictNodeProps = Omit<OnConflictNode, 'kind'>;
|
|
6
6
|
export interface OnConflictNode extends OperationNode {
|
|
7
7
|
readonly kind: 'OnConflictNode';
|
|
8
8
|
readonly columns?: ReadonlyArray<ColumnNode>;
|
|
@@ -15,5 +15,5 @@ export interface OnConflictNode extends OperationNode {
|
|
|
15
15
|
*/
|
|
16
16
|
export declare const OnConflictNode: Readonly<{
|
|
17
17
|
is(node: OperationNode): node is OnConflictNode;
|
|
18
|
-
create(
|
|
18
|
+
create(props: OnConflictNodeProps): OnConflictNode;
|
|
19
19
|
}>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ColumnUpdateNode } from './column-update-node.js';
|
|
2
|
+
import { OperationNode } from './operation-node.js';
|
|
3
|
+
export declare type OnDuplicateKeyNodeProps = Omit<OnDuplicateKeyNode, 'kind'>;
|
|
4
|
+
export interface OnDuplicateKeyNode extends OperationNode {
|
|
5
|
+
readonly kind: 'OnDuplicateKeyNode';
|
|
6
|
+
readonly updates: ReadonlyArray<ColumnUpdateNode>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export declare const OnDuplicateKeyNode: Readonly<{
|
|
12
|
+
is(node: OperationNode): node is OnDuplicateKeyNode;
|
|
13
|
+
create(updates: ReadonlyArray<ColumnUpdateNode>): OnDuplicateKeyNode;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { freeze } from '../util/object-utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export const OnDuplicateKeyNode = freeze({
|
|
6
|
+
is(node) {
|
|
7
|
+
return node.kind === 'OnDuplicateKeyNode';
|
|
8
|
+
},
|
|
9
|
+
create(updates) {
|
|
10
|
+
return freeze({
|
|
11
|
+
kind: 'OnDuplicateKeyNode',
|
|
12
|
+
updates,
|
|
13
|
+
});
|
|
14
|
+
},
|
|
15
|
+
});
|
|
@@ -56,6 +56,7 @@ import { DropConstraintNode } from './drop-constraint-node.js';
|
|
|
56
56
|
import { ForeignKeyConstraintNode } from './foreign-key-constraint-node.js';
|
|
57
57
|
import { ColumnDefinitionNode } from './column-definition-node.js';
|
|
58
58
|
import { ModifyColumnNode } from './modify-column-node.js';
|
|
59
|
+
import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
|
|
59
60
|
/**
|
|
60
61
|
* Transforms an operation node tree into another one.
|
|
61
62
|
*
|
|
@@ -121,6 +122,7 @@ export declare class OperationNodeTransformer {
|
|
|
121
122
|
protected transformLimit(node: LimitNode): LimitNode;
|
|
122
123
|
protected transformOffset(node: OffsetNode): OffsetNode;
|
|
123
124
|
protected transformOnConflict(node: OnConflictNode): OnConflictNode;
|
|
125
|
+
protected transformOnDuplicateKey(node: OnDuplicateKeyNode): OnDuplicateKeyNode;
|
|
124
126
|
protected transformCreateIndex(node: CreateIndexNode): CreateIndexNode;
|
|
125
127
|
protected transformList(node: ListNode): ListNode;
|
|
126
128
|
protected transformDropIndex(node: DropIndexNode): DropIndexNode;
|
|
@@ -68,6 +68,7 @@ export class OperationNodeTransformer {
|
|
|
68
68
|
LimitNode: this.transformLimit.bind(this),
|
|
69
69
|
OffsetNode: this.transformOffset.bind(this),
|
|
70
70
|
OnConflictNode: this.transformOnConflict.bind(this),
|
|
71
|
+
OnDuplicateKeyNode: this.transformOnDuplicateKey.bind(this),
|
|
71
72
|
CreateIndexNode: this.transformCreateIndex.bind(this),
|
|
72
73
|
DropIndexNode: this.transformDropIndex.bind(this),
|
|
73
74
|
ListNode: this.transformList.bind(this),
|
|
@@ -224,7 +225,9 @@ export class OperationNodeTransformer {
|
|
|
224
225
|
values: this.transformNodeList(node.values),
|
|
225
226
|
returning: this.transformNode(node.returning),
|
|
226
227
|
onConflict: this.transformNode(node.onConflict),
|
|
228
|
+
onDuplicateKey: this.transformNode(node.onDuplicateKey),
|
|
227
229
|
with: this.transformNode(node.with),
|
|
230
|
+
ignore: node.ignore,
|
|
228
231
|
};
|
|
229
232
|
}
|
|
230
233
|
transformDeleteQuery(node) {
|
|
@@ -343,6 +346,12 @@ export class OperationNodeTransformer {
|
|
|
343
346
|
doNothing: node.doNothing,
|
|
344
347
|
};
|
|
345
348
|
}
|
|
349
|
+
transformOnDuplicateKey(node) {
|
|
350
|
+
return {
|
|
351
|
+
kind: 'OnDuplicateKeyNode',
|
|
352
|
+
updates: this.transformNodeList(node.updates),
|
|
353
|
+
};
|
|
354
|
+
}
|
|
346
355
|
transformCreateIndex(node) {
|
|
347
356
|
return {
|
|
348
357
|
kind: 'CreateIndexNode',
|
|
@@ -387,6 +396,8 @@ export class OperationNodeTransformer {
|
|
|
387
396
|
columns: this.transformNodeList(node.columns),
|
|
388
397
|
references: this.transformNode(node.references),
|
|
389
398
|
name: this.transformNode(node.name),
|
|
399
|
+
onDelete: node.onDelete,
|
|
400
|
+
onUpdate: node.onUpdate,
|
|
390
401
|
};
|
|
391
402
|
}
|
|
392
403
|
transformReferences(node) {
|
|
@@ -395,6 +406,7 @@ export class OperationNodeTransformer {
|
|
|
395
406
|
table: this.transformNode(node.table),
|
|
396
407
|
columns: this.transformNodeList(node.columns),
|
|
397
408
|
onDelete: node.onDelete,
|
|
409
|
+
onUpdate: node.onUpdate,
|
|
398
410
|
};
|
|
399
411
|
}
|
|
400
412
|
transformCheckConstraint(node) {
|
|
@@ -56,6 +56,7 @@ import { DropConstraintNode } from './drop-constraint-node.js';
|
|
|
56
56
|
import { ForeignKeyConstraintNode } from './foreign-key-constraint-node.js';
|
|
57
57
|
import { ColumnDefinitionNode } from './column-definition-node.js';
|
|
58
58
|
import { ModifyColumnNode } from './modify-column-node.js';
|
|
59
|
+
import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
|
|
59
60
|
export declare class OperationNodeVisitor {
|
|
60
61
|
#private;
|
|
61
62
|
protected readonly nodeStack: OperationNode[];
|
|
@@ -91,6 +92,7 @@ export declare class OperationNodeVisitor {
|
|
|
91
92
|
protected visitLimit(node: LimitNode): void;
|
|
92
93
|
protected visitOffset(node: OffsetNode): void;
|
|
93
94
|
protected visitOnConflict(node: OnConflictNode): void;
|
|
95
|
+
protected visitOnDuplicateKey(node: OnDuplicateKeyNode): void;
|
|
94
96
|
protected visitCreateIndex(node: CreateIndexNode): void;
|
|
95
97
|
protected visitList(node: ListNode): void;
|
|
96
98
|
protected visitDropIndex(node: DropIndexNode): void;
|
|
@@ -38,6 +38,7 @@ export class OperationNodeVisitor {
|
|
|
38
38
|
LimitNode: this.visitLimit.bind(this),
|
|
39
39
|
OffsetNode: this.visitOffset.bind(this),
|
|
40
40
|
OnConflictNode: this.visitOnConflict.bind(this),
|
|
41
|
+
OnDuplicateKeyNode: this.visitOnDuplicateKey.bind(this),
|
|
41
42
|
CreateIndexNode: this.visitCreateIndex.bind(this),
|
|
42
43
|
DropIndexNode: this.visitDropIndex.bind(this),
|
|
43
44
|
ListNode: this.visitList.bind(this),
|
|
@@ -262,6 +263,9 @@ export class OperationNodeVisitor {
|
|
|
262
263
|
node.updates.forEach(this.visitNode);
|
|
263
264
|
}
|
|
264
265
|
}
|
|
266
|
+
visitOnDuplicateKey(node) {
|
|
267
|
+
node.updates.forEach(this.visitNode);
|
|
268
|
+
}
|
|
265
269
|
visitCreateIndex(node) {
|
|
266
270
|
this.visitNode(node.name);
|
|
267
271
|
if (node.table) {
|
|
@@ -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' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode';
|
|
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';
|
|
2
2
|
export interface OperationNode {
|
|
3
3
|
readonly kind: OperationNodeKind;
|
|
4
4
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { OperationNode } from './operation-node.js';
|
|
2
2
|
import { ColumnNode } from './column-node.js';
|
|
3
3
|
import { TableNode } from './table-node.js';
|
|
4
|
-
export declare type
|
|
4
|
+
export declare type OnModifyForeignAction = 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default';
|
|
5
5
|
export interface ReferencesNode extends OperationNode {
|
|
6
6
|
readonly kind: 'ReferencesNode';
|
|
7
7
|
readonly table: TableNode;
|
|
8
8
|
readonly columns: ReadonlyArray<ColumnNode>;
|
|
9
|
-
readonly onDelete?:
|
|
9
|
+
readonly onDelete?: OnModifyForeignAction;
|
|
10
|
+
readonly onUpdate?: OnModifyForeignAction;
|
|
10
11
|
}
|
|
11
12
|
/**
|
|
12
13
|
* @internal
|
|
@@ -14,5 +15,6 @@ export interface ReferencesNode extends OperationNode {
|
|
|
14
15
|
export declare const ReferencesNode: Readonly<{
|
|
15
16
|
is(node: OperationNode): node is ReferencesNode;
|
|
16
17
|
create(table: TableNode, columns: ReadonlyArray<ColumnNode>): ReferencesNode;
|
|
17
|
-
cloneWithOnDelete(references: ReferencesNode, onDelete:
|
|
18
|
+
cloneWithOnDelete(references: ReferencesNode, onDelete: OnModifyForeignAction): ReferencesNode;
|
|
19
|
+
cloneWithOnUpdate(references: ReferencesNode, onUpdate: OnModifyForeignAction): ReferencesNode;
|
|
18
20
|
}>;
|
|
@@ -8,10 +8,10 @@ export const TableNode = freeze({
|
|
|
8
8
|
return node.kind === 'TableNode';
|
|
9
9
|
},
|
|
10
10
|
create(table) {
|
|
11
|
-
return {
|
|
11
|
+
return freeze({
|
|
12
12
|
kind: 'TableNode',
|
|
13
13
|
table: IdentifierNode.create(table),
|
|
14
|
-
};
|
|
14
|
+
});
|
|
15
15
|
},
|
|
16
16
|
createWithSchema(schema, table) {
|
|
17
17
|
return freeze({
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ColumnDataType, DataTypeNode } from '../operation-node/data-type-node.js';
|
|
2
|
+
import { RawNode } from '../operation-node/raw-node.js';
|
|
3
|
+
import { AnyRawBuilder } from '../query-builder/type-utils.js';
|
|
4
|
+
export declare type DataTypeExpression = ColumnDataType | AnyRawBuilder;
|
|
5
|
+
export declare function parseDataTypeExpression(dataType: DataTypeExpression): DataTypeNode | RawNode;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DataTypeNode, } from '../operation-node/data-type-node.js';
|
|
2
|
+
import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
3
|
+
export function parseDataTypeExpression(dataType) {
|
|
4
|
+
return isOperationNodeSource(dataType)
|
|
5
|
+
? dataType.toOperationNode()
|
|
6
|
+
: DataTypeNode.create(dataType);
|
|
7
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { RawNode } from '../operation-node/raw-node.js';
|
|
2
|
+
import { ValueNode } from '../operation-node/value-node.js';
|
|
3
|
+
import { AnyRawBuilder } from '../query-builder/type-utils.js';
|
|
4
|
+
import { PrimitiveValue } from '../util/object-utils.js';
|
|
5
|
+
export declare type DefaultValueExpression = PrimitiveValue | AnyRawBuilder;
|
|
6
|
+
export declare function parseDefaultValueExpression(value: DefaultValueExpression): ValueNode | RawNode;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
2
|
+
import { ValueNode } from '../operation-node/value-node.js';
|
|
3
|
+
export function parseDefaultValueExpression(value) {
|
|
4
|
+
return isOperationNodeSource(value)
|
|
5
|
+
? value.toOperationNode()
|
|
6
|
+
: ValueNode.createImmediate(value);
|
|
7
|
+
}
|
|
@@ -10,5 +10,5 @@ export declare function parseWhereFilter(ctx: ParseContext, args: any[]): Filter
|
|
|
10
10
|
export declare function parseHavingFilter(ctx: ParseContext, args: any[]): FilterExpressionNode;
|
|
11
11
|
export declare function parseOnFilter(ctx: ParseContext, args: any[]): FilterExpressionNode;
|
|
12
12
|
export declare function parseReferenceFilter(ctx: ParseContext, lhs: ReferenceExpression<any, any>, op: FilterOperator, rhs: ReferenceExpression<any, any>): FilterNode;
|
|
13
|
-
export declare function
|
|
14
|
-
export declare function
|
|
13
|
+
export declare function parseExistFilter(ctx: ParseContext, arg: ExistsExpression<any, any>): FilterNode;
|
|
14
|
+
export declare function parseNotExistFilter(ctx: ParseContext, arg: ExistsExpression<any, any>): FilterNode;
|
|
@@ -8,13 +8,12 @@ import { parseReferenceExpression, } from './reference-parser.js';
|
|
|
8
8
|
import { parseValueExpressionOrList, } from './value-parser.js';
|
|
9
9
|
import { SelectQueryNode } from '../operation-node/select-query-node.js';
|
|
10
10
|
import { ValueNode } from '../operation-node/value-node.js';
|
|
11
|
-
import { parseTableExpression } from './table-parser.js';
|
|
12
11
|
export function parseWhereFilter(ctx, args) {
|
|
13
12
|
if (args.length === 3) {
|
|
14
13
|
return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
|
|
15
14
|
}
|
|
16
15
|
else if (args.length === 1 && isFunction(args[0])) {
|
|
17
|
-
return
|
|
16
|
+
return parseWhereGroup(ctx, args[0]);
|
|
18
17
|
}
|
|
19
18
|
else {
|
|
20
19
|
throw new Error(`invalid arguments passed to a where method ${JSON.stringify(args)}`);
|
|
@@ -25,7 +24,7 @@ export function parseHavingFilter(ctx, args) {
|
|
|
25
24
|
return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
|
|
26
25
|
}
|
|
27
26
|
else if (args.length === 1 && isFunction(args[0])) {
|
|
28
|
-
return
|
|
27
|
+
return parseHavingGroup(ctx, args[0]);
|
|
29
28
|
}
|
|
30
29
|
else {
|
|
31
30
|
throw new Error(`invalid arguments passed to a having method ${JSON.stringify(args)}`);
|
|
@@ -36,7 +35,7 @@ export function parseOnFilter(ctx, args) {
|
|
|
36
35
|
return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
|
|
37
36
|
}
|
|
38
37
|
else if (args.length === 1 && isFunction(args[0])) {
|
|
39
|
-
return
|
|
38
|
+
return parseOnGroup(ctx, args[0]);
|
|
40
39
|
}
|
|
41
40
|
else {
|
|
42
41
|
throw new Error(`invalid arguments passed to an on method ${JSON.stringify(args)}`);
|
|
@@ -45,20 +44,11 @@ export function parseOnFilter(ctx, args) {
|
|
|
45
44
|
export function parseReferenceFilter(ctx, lhs, op, rhs) {
|
|
46
45
|
return FilterNode.create(parseReferenceExpression(ctx, lhs), parseFilterOperator(op), parseReferenceExpression(ctx, rhs));
|
|
47
46
|
}
|
|
48
|
-
export function
|
|
49
|
-
return
|
|
47
|
+
export function parseExistFilter(ctx, arg) {
|
|
48
|
+
return parseExistExpression(ctx, 'exists', arg);
|
|
50
49
|
}
|
|
51
|
-
export function
|
|
52
|
-
return
|
|
53
|
-
}
|
|
54
|
-
function doParseExistExpression(ctx, type, arg) {
|
|
55
|
-
const node = isFunction(arg)
|
|
56
|
-
? arg(ctx.createSubQueryBuilder()).toOperationNode()
|
|
57
|
-
: arg.toOperationNode();
|
|
58
|
-
if (!SelectQueryNode.is(node) && !RawNode.is(node)) {
|
|
59
|
-
throw new Error('invalid where exists arg');
|
|
60
|
-
}
|
|
61
|
-
return FilterNode.create(undefined, OperatorNode.create(type), node);
|
|
50
|
+
export function parseNotExistFilter(ctx, arg) {
|
|
51
|
+
return parseExistExpression(ctx, 'not exists', arg);
|
|
62
52
|
}
|
|
63
53
|
function parseThreeArgFilter(ctx, left, op, right) {
|
|
64
54
|
if ((op === 'is' || op === 'is not') && (isNull(right) || isBoolean(right))) {
|
|
@@ -70,38 +60,46 @@ function parseIsFilter(ctx, left, op, right) {
|
|
|
70
60
|
return FilterNode.create(parseReferenceExpression(ctx, left), parseFilterOperator(op), ValueNode.createImmediate(right));
|
|
71
61
|
}
|
|
72
62
|
function parseFilterOperator(op) {
|
|
73
|
-
if (
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
else if (isString(op)) {
|
|
77
|
-
const opString = op.trim().toLowerCase();
|
|
78
|
-
if (OPERATORS.some((it) => it === opString)) {
|
|
79
|
-
return OperatorNode.create(opString);
|
|
63
|
+
if (isString(op)) {
|
|
64
|
+
if (OPERATORS.includes(op)) {
|
|
65
|
+
return OperatorNode.create(op);
|
|
80
66
|
}
|
|
81
67
|
}
|
|
68
|
+
else if (isOperationNodeSource(op)) {
|
|
69
|
+
return op.toOperationNode();
|
|
70
|
+
}
|
|
82
71
|
throw new Error(`invalid comparison operator ${JSON.stringify(op)} passed to a filter method`);
|
|
83
72
|
}
|
|
84
|
-
function
|
|
85
|
-
const query =
|
|
73
|
+
function parseWhereGroup(ctx, callback) {
|
|
74
|
+
const query = callback(ctx.createSelectQueryBuilder([]));
|
|
86
75
|
const queryNode = query.toOperationNode();
|
|
87
76
|
if (!queryNode.where) {
|
|
88
|
-
throw new Error('no where methods called insided a
|
|
77
|
+
throw new Error('no `where*` methods called insided a group callback');
|
|
89
78
|
}
|
|
90
79
|
return ParensNode.create(queryNode.where.where);
|
|
91
80
|
}
|
|
92
|
-
function
|
|
93
|
-
const query =
|
|
81
|
+
function parseHavingGroup(ctx, callback) {
|
|
82
|
+
const query = callback(ctx.createSelectQueryBuilder([]));
|
|
94
83
|
const queryNode = query.toOperationNode();
|
|
95
84
|
if (!queryNode.having) {
|
|
96
|
-
throw new Error('no having methods called insided a
|
|
85
|
+
throw new Error('no `having*` methods called insided a group callback');
|
|
97
86
|
}
|
|
98
87
|
return ParensNode.create(queryNode.having.having);
|
|
99
88
|
}
|
|
100
|
-
function
|
|
101
|
-
const joinBuilder =
|
|
89
|
+
function parseOnGroup(ctx, callback) {
|
|
90
|
+
const joinBuilder = callback(ctx.createJoinBuilder('InnerJoin', 'table'));
|
|
102
91
|
const joinNode = joinBuilder.toOperationNode();
|
|
103
92
|
if (!joinNode.on) {
|
|
104
|
-
throw new Error('no `on
|
|
93
|
+
throw new Error('no `on*` methods called insided a group callback');
|
|
105
94
|
}
|
|
106
95
|
return ParensNode.create(joinNode.on);
|
|
107
96
|
}
|
|
97
|
+
function parseExistExpression(ctx, type, arg) {
|
|
98
|
+
const node = isFunction(arg)
|
|
99
|
+
? arg(ctx.createExpressionBuilder()).toOperationNode()
|
|
100
|
+
: arg.toOperationNode();
|
|
101
|
+
if (!SelectQueryNode.is(node) && !RawNode.is(node)) {
|
|
102
|
+
throw new Error('invalid where exists arg');
|
|
103
|
+
}
|
|
104
|
+
return FilterNode.create(undefined, OperatorNode.create(type), node);
|
|
105
|
+
}
|
|
@@ -5,4 +5,4 @@ import { JoinBuilder } from '../query-builder/join-builder.js';
|
|
|
5
5
|
import { ParseContext } from './parse-context.js';
|
|
6
6
|
export declare type JoinReferenceExpression<DB, TB extends keyof DB, F> = AnyColumn<TableExpressionDatabaseType<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>> | AnyColumnWithTable<TableExpressionDatabaseType<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>;
|
|
7
7
|
export declare type JoinCallbackExpression<DB, TB extends keyof DB, F> = (join: JoinBuilder<TableExpressionDatabaseType<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>) => JoinBuilder<any, any>;
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function parseJoin(ctx: ParseContext, joinType: JoinType, args: any[]): JoinNode;
|
|
@@ -1,23 +1,21 @@
|
|
|
1
1
|
import { JoinNode } from '../operation-node/join-node.js';
|
|
2
2
|
import { parseTableExpression, } from './table-parser.js';
|
|
3
3
|
import { parseReferenceFilter } from './filter-parser.js';
|
|
4
|
-
export function
|
|
5
|
-
if (args.length ===
|
|
6
|
-
return parseCallbackJoin(ctx, joinType, args[0], args[1]);
|
|
7
|
-
}
|
|
8
|
-
else if (args.length === 3) {
|
|
4
|
+
export function parseJoin(ctx, joinType, args) {
|
|
5
|
+
if (args.length === 3) {
|
|
9
6
|
return parseSingleOnJoin(ctx, joinType, args[0], args[1], args[2]);
|
|
10
7
|
}
|
|
8
|
+
else if (args.length === 2) {
|
|
9
|
+
return parseCallbackJoin(ctx, joinType, args[0], args[1]);
|
|
10
|
+
}
|
|
11
11
|
else {
|
|
12
12
|
throw new Error('not implemented');
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
function parseCallbackJoin(ctx, joinType, from, callback) {
|
|
16
|
-
const
|
|
17
|
-
const joinBuilder = callback(ctx.createJoinBuilder(joinType, tableNode));
|
|
16
|
+
const joinBuilder = callback(ctx.createJoinBuilder(joinType, from));
|
|
18
17
|
return joinBuilder.toOperationNode();
|
|
19
18
|
}
|
|
20
19
|
function parseSingleOnJoin(ctx, joinType, from, lhsColumn, rhsColumn) {
|
|
21
|
-
|
|
22
|
-
return JoinNode.cloneWithOn(JoinNode.create(joinType, tableNode), 'And', parseReferenceFilter(ctx, lhsColumn, '=', rhsColumn));
|
|
20
|
+
return JoinNode.createWithOn(joinType, parseTableExpression(ctx, from), parseReferenceFilter(ctx, lhsColumn, '=', rhsColumn));
|
|
23
21
|
}
|
|
@@ -1,14 +1,41 @@
|
|
|
1
|
-
import { DialectAdapter } from '../
|
|
1
|
+
import { DialectAdapter } from '../dialect/dialect-adapter.js';
|
|
2
2
|
import { JoinType } from '../operation-node/join-node.js';
|
|
3
|
-
import { TableExpressionNode } from '../operation-node/operation-node-utils.js';
|
|
4
3
|
import { JoinBuilder } from '../query-builder/join-builder.js';
|
|
5
4
|
import { QueryBuilder } from '../query-builder/query-builder.js';
|
|
6
|
-
import {
|
|
5
|
+
import { ExpressionBuilder } from '../query-builder/expression-builder.js';
|
|
7
6
|
import { QueryCreator } from '../query-creator.js';
|
|
7
|
+
import { TableExpression } from './table-parser.js';
|
|
8
|
+
/**
|
|
9
|
+
* This interface exposes everything the parsers need to be able to parse
|
|
10
|
+
* method calls into {@link OperationNode} trees.
|
|
11
|
+
*/
|
|
8
12
|
export interface ParseContext {
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
readonly adapter: DialectAdapter;
|
|
14
|
+
/**
|
|
15
|
+
* Creates a select query builder with a {@link NoopQueryExecutor}.
|
|
16
|
+
*/
|
|
17
|
+
createSelectQueryBuilder(tables: ReadonlyArray<TableExpression<any, any>>): QueryBuilder<any, any>;
|
|
18
|
+
/**
|
|
19
|
+
* Creates an instance of a join builder.
|
|
20
|
+
*/
|
|
21
|
+
createJoinBuilder(joinType: JoinType, table: TableExpression<any, any>): JoinBuilder<any, any>;
|
|
22
|
+
/**
|
|
23
|
+
* Creates an expression builder for building stuff like subqueries.
|
|
24
|
+
* {@link NoopQueryExecutor} is used as the executor and the queries
|
|
25
|
+
* built using the returned builder can never be executed.
|
|
26
|
+
*/
|
|
27
|
+
createExpressionBuilder(): ExpressionBuilder<any, any>;
|
|
28
|
+
/**
|
|
29
|
+
* Creates a query creator with a {@link NoopQueryExecutor}.
|
|
30
|
+
*/
|
|
31
|
+
createQueryCreator(): QueryCreator<any>;
|
|
32
|
+
}
|
|
33
|
+
export declare class DefaultParseContext implements ParseContext {
|
|
34
|
+
#private;
|
|
35
|
+
constructor(adapter: DialectAdapter);
|
|
36
|
+
get adapter(): DialectAdapter;
|
|
37
|
+
createSelectQueryBuilder(tables: ReadonlyArray<TableExpression<any, any>>): QueryBuilder<any, any>;
|
|
38
|
+
createJoinBuilder(joinType: JoinType, table: TableExpression<any, any>): JoinBuilder<any, any>;
|
|
39
|
+
createExpressionBuilder(): ExpressionBuilder<any, any>;
|
|
11
40
|
createQueryCreator(): QueryCreator<any>;
|
|
12
|
-
createJoinBuilder(joinType: JoinType, tableNode: TableExpressionNode): JoinBuilder<any, any>;
|
|
13
41
|
}
|
|
14
|
-
export declare function createParseContext(adapter: DialectAdapter): ParseContext;
|
|
@@ -1,38 +1,46 @@
|
|
|
1
|
-
import { NoopQueryExecutor, SelectQueryNode } from '../index.js';
|
|
2
1
|
import { JoinNode } from '../operation-node/join-node.js';
|
|
2
|
+
import { SelectQueryNode } from '../operation-node/select-query-node.js';
|
|
3
3
|
import { JoinBuilder } from '../query-builder/join-builder.js';
|
|
4
4
|
import { QueryBuilder } from '../query-builder/query-builder.js';
|
|
5
|
-
import {
|
|
5
|
+
import { ExpressionBuilder } from '../query-builder/expression-builder.js';
|
|
6
6
|
import { QueryCreator } from '../query-creator.js';
|
|
7
|
-
import {
|
|
7
|
+
import { NoopQueryExecutor } from '../query-executor/noop-query-executor.js';
|
|
8
8
|
import { createQueryId } from '../util/query-id.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
9
|
+
import { parseTableExpression, parseTableExpressionOrList, } from './table-parser.js';
|
|
10
|
+
export class DefaultParseContext {
|
|
11
|
+
#adapter;
|
|
12
|
+
#noopExecutor;
|
|
13
|
+
constructor(adapter) {
|
|
14
|
+
this.#adapter = adapter;
|
|
15
|
+
this.#noopExecutor = new NoopQueryExecutor();
|
|
16
|
+
}
|
|
17
|
+
get adapter() {
|
|
18
|
+
return this.#adapter;
|
|
19
|
+
}
|
|
20
|
+
createSelectQueryBuilder(tables) {
|
|
21
|
+
return new QueryBuilder({
|
|
22
|
+
queryId: createQueryId(),
|
|
23
|
+
executor: this.#noopExecutor,
|
|
24
|
+
parseContext: this,
|
|
25
|
+
queryNode: SelectQueryNode.create(parseTableExpressionOrList(this, tables)),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
createJoinBuilder(joinType, table) {
|
|
29
|
+
return new JoinBuilder({
|
|
30
|
+
joinNode: JoinNode.create(joinType, parseTableExpression(this, table)),
|
|
31
|
+
parseContext: this,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
createExpressionBuilder() {
|
|
35
|
+
return new ExpressionBuilder({
|
|
36
|
+
executor: this.#noopExecutor,
|
|
37
|
+
parseContext: this,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
createQueryCreator() {
|
|
41
|
+
return new QueryCreator({
|
|
42
|
+
executor: this.#noopExecutor,
|
|
43
|
+
parseContext: this,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
38
46
|
}
|
|
@@ -14,7 +14,7 @@ export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB,
|
|
|
14
14
|
declare type ExtractTypeFromStringReference<DB, TB extends keyof DB, S extends string, R = RowType<DB, TB>> = S extends `${infer SC}.${infer T}.${infer C}` ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : S extends `${infer T}.${infer C}` ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : S extends keyof R ? R[S] : PrimitiveValue;
|
|
15
15
|
export declare function parseReferenceExpressionOrList(ctx: ParseContext, arg: ReferenceExpressionOrList<any, any>): ReferenceExpressionNode[];
|
|
16
16
|
export declare function parseReferenceExpression(ctx: ParseContext, arg: ReferenceExpression<any, any>): ReferenceExpressionNode;
|
|
17
|
-
export declare function parseStringReference(
|
|
18
|
-
export declare function parseAliasedStringReference(
|
|
17
|
+
export declare function parseStringReference(ref: string): ColumnNode | ReferenceNode;
|
|
18
|
+
export declare function parseAliasedStringReference(ref: string): ColumnNode | ReferenceNode | AliasNode;
|
|
19
19
|
export declare function parseColumnName(column: AnyColumn<any, any>): ColumnNode;
|
|
20
20
|
export {};
|
|
@@ -24,16 +24,17 @@ export function parseReferenceExpression(ctx, arg) {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
else if (isFunction(arg)) {
|
|
27
|
-
const node = arg(ctx.
|
|
27
|
+
const node = arg(ctx.createExpressionBuilder()).toOperationNode();
|
|
28
28
|
if (!QueryNode.isMutating(node)) {
|
|
29
29
|
return node;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
throw new Error(`invalid reference expression ${JSON.stringify(arg)}`);
|
|
33
33
|
}
|
|
34
|
-
export function parseStringReference(
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
export function parseStringReference(ref) {
|
|
35
|
+
const COLUMN_SEPARATOR = '.';
|
|
36
|
+
if (ref.includes(COLUMN_SEPARATOR)) {
|
|
37
|
+
const parts = ref.split(COLUMN_SEPARATOR).map(trim);
|
|
37
38
|
if (parts.length === 3) {
|
|
38
39
|
return parseStringReferenceWithTableAndSchema(parts);
|
|
39
40
|
}
|
|
@@ -41,21 +42,21 @@ export function parseStringReference(str) {
|
|
|
41
42
|
return parseStringReferenceWithTable(parts);
|
|
42
43
|
}
|
|
43
44
|
else {
|
|
44
|
-
throw new Error(`invalid column reference ${
|
|
45
|
+
throw new Error(`invalid column reference ${ref}`);
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
48
|
else {
|
|
48
|
-
return ColumnNode.create(
|
|
49
|
+
return ColumnNode.create(ref);
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
|
-
export function parseAliasedStringReference(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
return AliasNode.create(
|
|
52
|
+
export function parseAliasedStringReference(ref) {
|
|
53
|
+
const ALIAS_SEPARATOR = ' as ';
|
|
54
|
+
if (ref.includes(ALIAS_SEPARATOR)) {
|
|
55
|
+
const [columnRef, alias] = ref.split(ALIAS_SEPARATOR).map(trim);
|
|
56
|
+
return AliasNode.create(parseStringReference(columnRef), alias);
|
|
56
57
|
}
|
|
57
58
|
else {
|
|
58
|
-
return parseStringReference(
|
|
59
|
+
return parseStringReference(ref);
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
export function parseColumnName(column) {
|
|
@@ -69,3 +70,6 @@ function parseStringReferenceWithTable(parts) {
|
|
|
69
70
|
const [table, column] = parts;
|
|
70
71
|
return ReferenceNode.create(TableNode.create(table), ColumnNode.create(column));
|
|
71
72
|
}
|
|
73
|
+
function trim(str) {
|
|
74
|
+
return str.trim();
|
|
75
|
+
}
|
|
@@ -26,6 +26,5 @@ declare type ExtractAliasFromStringSelectExpression<S extends string> = S extend
|
|
|
26
26
|
declare type ExtractTypeFromSelectExpression<DB, TB extends keyof DB, S, A extends keyof any> = S extends string ? ExtractTypeFromStringSelectExpression<DB, TB, S, A> : S extends AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : S extends (qb: any) => AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : S extends AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? ValueType<O> : never : S extends (qb: any) => AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? ValueType<O> : never : S extends DynamicReferenceBuilder<infer RA> ? A extends ExtractAliasFromStringSelectExpression<RA> ? ExtractTypeFromStringSelectExpression<DB, TB, RA, A> | undefined : never : never;
|
|
27
27
|
declare type ExtractTypeFromStringSelectExpression<DB, TB extends keyof DB, S extends string, A extends keyof any, R = RowType<DB, TB>> = S extends `${infer SC}.${infer T}.${infer C} as ${infer RA}` ? RA extends A ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : never : S extends `${infer T}.${infer C} as ${infer RA}` ? RA extends A ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : never : S extends `${infer C} as ${infer RA}` ? RA extends A ? C extends keyof R ? R[C] : never : never : S extends `${infer SC}.${infer T}.${infer C}` ? C extends A ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : never : S extends `${infer T}.${infer C}` ? C extends A ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : never : S extends A ? S extends keyof R ? R[S] : never : never;
|
|
28
28
|
export declare function parseSelectExpressionOrList(ctx: ParseContext, selection: SelectExpressionOrList<any, any>): SelectionNode[];
|
|
29
|
-
export declare function
|
|
30
|
-
export declare function parseSelectAllArg(table: string): SelectionNode;
|
|
29
|
+
export declare function parseSelectAll(table?: string | string[]): SelectionNode[];
|
|
31
30
|
export {};
|