kysely 0.7.2 → 0.7.6
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 +9 -5
- package/dist/cjs/dialect/dialect-adapter.d.ts +11 -9
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/kysely.d.ts +2 -2
- package/dist/cjs/kysely.js +9 -7
- 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/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/join-node.d.ts +1 -0
- package/dist/cjs/operation-node/join-node.js +8 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +3 -0
- 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 +33 -6
- package/dist/cjs/parser/parse-context.js +40 -33
- 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} +6 -6
- 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 +2 -2
- package/dist/cjs/query-builder/query-builder.js +34 -36
- package/dist/cjs/query-builder/type-utils.d.ts +5 -5
- package/dist/cjs/query-compiler/default-query-compiler.js +13 -1
- 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 +26 -8
- package/dist/cjs/schema/alter-table-builder.js +75 -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/esm/dialect/dialect-adapter.d.ts +11 -9
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/kysely.d.ts +2 -2
- package/dist/esm/kysely.js +9 -7
- 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/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/join-node.d.ts +1 -0
- package/dist/esm/operation-node/join-node.js +8 -0
- package/dist/esm/operation-node/operation-node-transformer.js +3 -0
- 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 +33 -6
- package/dist/esm/parser/parse-context.js +38 -31
- 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} +6 -6
- 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 +2 -2
- package/dist/esm/query-builder/query-builder.js +37 -39
- package/dist/esm/query-builder/type-utils.d.ts +5 -5
- package/dist/esm/query-compiler/default-query-compiler.js +14 -2
- 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 +26 -8
- package/dist/esm/schema/alter-table-builder.js +73 -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/package.json +1 -1
|
@@ -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
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;
|
|
@@ -2,38 +2,45 @@ import { JoinNode } from '../operation-node/join-node.js';
|
|
|
2
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
7
|
import { NoopQueryExecutor } from '../query-executor/noop-query-executor.js';
|
|
8
|
-
import { freeze } from '../util/object-utils.js';
|
|
9
8
|
import { createQueryId } from '../util/query-id.js';
|
|
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
|
-
|
|
38
|
-
|
|
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
|
+
}
|
|
39
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 {};
|
|
@@ -18,13 +18,13 @@ function parseSelectExpression(ctx, selection) {
|
|
|
18
18
|
return SelectionNode.create(selection.toOperationNode());
|
|
19
19
|
}
|
|
20
20
|
else if (isFunction(selection)) {
|
|
21
|
-
return SelectionNode.create(selection(ctx.
|
|
21
|
+
return SelectionNode.create(selection(ctx.createExpressionBuilder()).toOperationNode());
|
|
22
22
|
}
|
|
23
23
|
else {
|
|
24
24
|
throw new Error(`invalid value passed to select method: ${JSON.stringify(selection)}`);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
export function
|
|
27
|
+
export function parseSelectAll(table) {
|
|
28
28
|
if (!table) {
|
|
29
29
|
return [SelectionNode.createSelectAll()];
|
|
30
30
|
}
|
|
@@ -35,7 +35,7 @@ export function parseSelectAllArgs(table) {
|
|
|
35
35
|
return [parseSelectAllArg(table)];
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
function parseSelectAllArg(table) {
|
|
39
39
|
if (isString(table)) {
|
|
40
40
|
return SelectionNode.createSelectAllFromTable(table);
|
|
41
41
|
}
|
|
@@ -18,27 +18,32 @@ export function parseTableExpression(ctx, table) {
|
|
|
18
18
|
return table.toOperationNode();
|
|
19
19
|
}
|
|
20
20
|
else if (isFunction(table)) {
|
|
21
|
-
return table(ctx.
|
|
21
|
+
return table(ctx.createExpressionBuilder()).toOperationNode();
|
|
22
22
|
}
|
|
23
23
|
else {
|
|
24
24
|
throw new Error(`invalid table expression ${JSON.stringify(table)}`);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
export function parseAliasedTable(from) {
|
|
28
|
-
const
|
|
29
|
-
if (
|
|
28
|
+
const ALIAS_SEPARATOR = ' as ';
|
|
29
|
+
if (from.includes(ALIAS_SEPARATOR)) {
|
|
30
|
+
const [table, alias] = from.split(ALIAS_SEPARATOR).map(trim);
|
|
30
31
|
return AliasNode.create(parseTable(table), alias);
|
|
31
32
|
}
|
|
32
33
|
else {
|
|
33
|
-
return parseTable(
|
|
34
|
+
return parseTable(from);
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
37
|
export function parseTable(from) {
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
const SCHEMA_SEPARATOR = '.';
|
|
39
|
+
if (from.includes(SCHEMA_SEPARATOR)) {
|
|
40
|
+
const [schema, table] = from.split(SCHEMA_SEPARATOR).map(trim);
|
|
39
41
|
return TableNode.createWithSchema(schema, table);
|
|
40
42
|
}
|
|
41
43
|
else {
|
|
42
44
|
return TableNode.create(from);
|
|
43
45
|
}
|
|
44
46
|
}
|
|
47
|
+
function trim(str) {
|
|
48
|
+
return str.trim();
|
|
49
|
+
}
|
|
@@ -20,7 +20,7 @@ export function parseMutationValueExpression(ctx, value) {
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
else if (isFunction(value)) {
|
|
23
|
-
const node = value(ctx.
|
|
23
|
+
const node = value(ctx.createExpressionBuilder()).toOperationNode();
|
|
24
24
|
if (!QueryNode.isMutating(node)) {
|
|
25
25
|
return node;
|
|
26
26
|
}
|
|
@@ -24,7 +24,7 @@ export function parseValueExpression(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
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { TableExpression, QueryBuilderWithTable } from '../parser/table-parser.js';
|
|
2
2
|
import { NoopQueryExecutor } from '../query-executor/noop-query-executor.js';
|
|
3
|
-
import {
|
|
4
|
-
export declare class
|
|
3
|
+
import { ParseContext } from '../parser/parse-context.js';
|
|
4
|
+
export declare class ExpressionBuilder<DB, TB extends keyof DB> {
|
|
5
5
|
#private;
|
|
6
|
-
constructor(props:
|
|
6
|
+
constructor(props: ExpressionBuilderProps);
|
|
7
7
|
/**
|
|
8
8
|
* Creates a subquery.
|
|
9
9
|
*
|
|
@@ -50,9 +50,9 @@ export declare class SubQueryBuilder<DB, TB extends keyof DB> {
|
|
|
50
50
|
/**
|
|
51
51
|
* See {@link QueryCreator.withSchema}
|
|
52
52
|
*/
|
|
53
|
-
withSchema(schema: string):
|
|
53
|
+
withSchema(schema: string): ExpressionBuilder<DB, TB>;
|
|
54
54
|
}
|
|
55
|
-
export interface
|
|
55
|
+
export interface ExpressionBuilderProps {
|
|
56
56
|
readonly executor: NoopQueryExecutor;
|
|
57
|
-
readonly
|
|
57
|
+
readonly parseContext: ParseContext;
|
|
58
58
|
}
|
|
@@ -4,8 +4,7 @@ import { parseTableExpressionOrList, } from '../parser/table-parser.js';
|
|
|
4
4
|
import { WithSchemaPlugin } from '../plugin/with-schema/with-schema-plugin.js';
|
|
5
5
|
import { createQueryId } from '../util/query-id.js';
|
|
6
6
|
import { freeze } from '../util/object-utils.js';
|
|
7
|
-
|
|
8
|
-
export class SubQueryBuilder {
|
|
7
|
+
export class ExpressionBuilder {
|
|
9
8
|
#props;
|
|
10
9
|
constructor(props) {
|
|
11
10
|
this.#props = freeze(props);
|
|
@@ -14,20 +13,17 @@ export class SubQueryBuilder {
|
|
|
14
13
|
return new QueryBuilder({
|
|
15
14
|
queryId: createQueryId(),
|
|
16
15
|
executor: this.#props.executor,
|
|
17
|
-
|
|
18
|
-
queryNode: SelectQueryNode.create(parseTableExpressionOrList(this.#parseContext, table)),
|
|
16
|
+
parseContext: this.#props.parseContext,
|
|
17
|
+
queryNode: SelectQueryNode.create(parseTableExpressionOrList(this.#props.parseContext, table)),
|
|
19
18
|
});
|
|
20
19
|
}
|
|
21
20
|
/**
|
|
22
21
|
* See {@link QueryCreator.withSchema}
|
|
23
22
|
*/
|
|
24
23
|
withSchema(schema) {
|
|
25
|
-
return new
|
|
24
|
+
return new ExpressionBuilder({
|
|
26
25
|
...this.#props,
|
|
27
26
|
executor: this.#props.executor.withPluginAtFront(new WithSchemaPlugin(schema)),
|
|
28
27
|
});
|
|
29
28
|
}
|
|
30
|
-
get #parseContext() {
|
|
31
|
-
return createParseContext(this.#props.adapter);
|
|
32
|
-
}
|
|
33
29
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { DialectAdapter } from '../dialect/dialect-adapter.js';
|
|
2
1
|
import { JoinNode } from '../operation-node/join-node.js';
|
|
3
2
|
import { OperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
4
3
|
import { ExistsExpression, FilterOperator } from '../parser/filter-parser.js';
|
|
4
|
+
import { ParseContext } from '../parser/parse-context.js';
|
|
5
5
|
import { ReferenceExpression } from '../parser/reference-parser.js';
|
|
6
6
|
import { ValueExpressionOrList } from '../parser/value-parser.js';
|
|
7
7
|
export declare class JoinBuilder<DB, TB extends keyof DB> implements OperationNodeSource {
|
|
@@ -69,5 +69,5 @@ export declare class JoinBuilder<DB, TB extends keyof DB> implements OperationNo
|
|
|
69
69
|
}
|
|
70
70
|
export interface JoinBuilderProps {
|
|
71
71
|
readonly joinNode: JoinNode;
|
|
72
|
-
readonly
|
|
72
|
+
readonly parseContext: ParseContext;
|
|
73
73
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { JoinNode } from '../operation-node/join-node.js';
|
|
2
|
-
import {
|
|
3
|
-
import { createParseContext } from '../parser/parse-context.js';
|
|
2
|
+
import { parseExistFilter, parseNotExistFilter, parseOnFilter, parseReferenceFilter, } from '../parser/filter-parser.js';
|
|
4
3
|
import { freeze } from '../util/object-utils.js';
|
|
5
4
|
import { preventAwait } from '../util/prevent-await.js';
|
|
6
5
|
export class JoinBuilder {
|
|
@@ -11,13 +10,13 @@ export class JoinBuilder {
|
|
|
11
10
|
on(...args) {
|
|
12
11
|
return new JoinBuilder({
|
|
13
12
|
...this.#props,
|
|
14
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseOnFilter(this.#parseContext, args)),
|
|
13
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseOnFilter(this.#props.parseContext, args)),
|
|
15
14
|
});
|
|
16
15
|
}
|
|
17
16
|
orOn(...args) {
|
|
18
17
|
return new JoinBuilder({
|
|
19
18
|
...this.#props,
|
|
20
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseOnFilter(this.#parseContext, args)),
|
|
19
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseOnFilter(this.#props.parseContext, args)),
|
|
21
20
|
});
|
|
22
21
|
}
|
|
23
22
|
/**
|
|
@@ -29,7 +28,7 @@ export class JoinBuilder {
|
|
|
29
28
|
onRef(lhs, op, rhs) {
|
|
30
29
|
return new JoinBuilder({
|
|
31
30
|
...this.#props,
|
|
32
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseReferenceFilter(this.#parseContext, lhs, op, rhs)),
|
|
31
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
33
32
|
});
|
|
34
33
|
}
|
|
35
34
|
/**
|
|
@@ -41,7 +40,7 @@ export class JoinBuilder {
|
|
|
41
40
|
orOnRef(lhs, op, rhs) {
|
|
42
41
|
return new JoinBuilder({
|
|
43
42
|
...this.#props,
|
|
44
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseReferenceFilter(this.#parseContext, lhs, op, rhs)),
|
|
43
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
45
44
|
});
|
|
46
45
|
}
|
|
47
46
|
/**
|
|
@@ -53,7 +52,7 @@ export class JoinBuilder {
|
|
|
53
52
|
onExists(arg) {
|
|
54
53
|
return new JoinBuilder({
|
|
55
54
|
...this.#props,
|
|
56
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And',
|
|
55
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseExistFilter(this.#props.parseContext, arg)),
|
|
57
56
|
});
|
|
58
57
|
}
|
|
59
58
|
/**
|
|
@@ -65,7 +64,7 @@ export class JoinBuilder {
|
|
|
65
64
|
onNotExists(arg) {
|
|
66
65
|
return new JoinBuilder({
|
|
67
66
|
...this.#props,
|
|
68
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And',
|
|
67
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseNotExistFilter(this.#props.parseContext, arg)),
|
|
69
68
|
});
|
|
70
69
|
}
|
|
71
70
|
/**
|
|
@@ -77,7 +76,7 @@ export class JoinBuilder {
|
|
|
77
76
|
orOnExists(arg) {
|
|
78
77
|
return new JoinBuilder({
|
|
79
78
|
...this.#props,
|
|
80
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or',
|
|
79
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseExistFilter(this.#props.parseContext, arg)),
|
|
81
80
|
});
|
|
82
81
|
}
|
|
83
82
|
/**
|
|
@@ -89,14 +88,11 @@ export class JoinBuilder {
|
|
|
89
88
|
orOnNotExists(arg) {
|
|
90
89
|
return new JoinBuilder({
|
|
91
90
|
...this.#props,
|
|
92
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or',
|
|
91
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseNotExistFilter(this.#props.parseContext, arg)),
|
|
93
92
|
});
|
|
94
93
|
}
|
|
95
94
|
toOperationNode() {
|
|
96
95
|
return this.#props.joinNode;
|
|
97
96
|
}
|
|
98
|
-
get #parseContext() {
|
|
99
|
-
return createParseContext(this.#props.adapter);
|
|
100
|
-
}
|
|
101
97
|
}
|
|
102
98
|
preventAwait(JoinBuilder, "don't await JoinBuilder instances. They are never executed directly and are always just a part of a query.");
|
|
@@ -18,7 +18,7 @@ import { Compilable } from '../util/compilable.js';
|
|
|
18
18
|
import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
19
19
|
import { QueryId } from '../util/query-id.js';
|
|
20
20
|
import { OnConflictConstraintTarget } from '../parser/on-conflict-parser.js';
|
|
21
|
-
import {
|
|
21
|
+
import { ParseContext } from '../parser/parse-context.js';
|
|
22
22
|
/**
|
|
23
23
|
* The main query builder class.
|
|
24
24
|
*
|
|
@@ -1605,7 +1605,7 @@ export interface QueryBuilderProps {
|
|
|
1605
1605
|
readonly queryId: QueryId;
|
|
1606
1606
|
readonly queryNode: QueryNode;
|
|
1607
1607
|
readonly executor: QueryExecutor;
|
|
1608
|
-
readonly
|
|
1608
|
+
readonly parseContext: ParseContext;
|
|
1609
1609
|
}
|
|
1610
1610
|
/**
|
|
1611
1611
|
* {@link QueryBuilder} with an alias. The result of calling {@link QueryBuilder.as}.
|