kysely 0.26.1 → 0.26.2
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 +6 -6
- package/dist/cjs/dialect/dialect-adapter-base.d.ts +3 -3
- package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +3 -2
- package/dist/cjs/dialect/mysql/mysql-adapter.js +2 -2
- package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +3 -2
- package/dist/cjs/dialect/postgres/postgres-adapter.js +2 -2
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +2 -2
- package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +4 -2
- package/dist/cjs/dialect/sqlite/sqlite-adapter.js +2 -2
- package/dist/cjs/driver/runtime-driver.js +17 -2
- package/dist/cjs/expression/expression-builder.d.ts +298 -27
- package/dist/cjs/expression/expression-builder.js +36 -26
- package/dist/cjs/expression/expression-wrapper.d.ts +177 -8
- package/dist/cjs/expression/expression-wrapper.js +4 -4
- package/dist/cjs/expression/expression.d.ts +64 -1
- package/dist/cjs/helpers/mysql.d.ts +11 -8
- package/dist/cjs/helpers/mysql.js +21 -32
- package/dist/cjs/helpers/postgres.d.ts +8 -5
- package/dist/cjs/helpers/postgres.js +8 -5
- package/dist/cjs/helpers/sqlite.d.ts +164 -0
- package/dist/cjs/helpers/sqlite.js +180 -0
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/kysely.d.ts +4 -3
- package/dist/cjs/kysely.js +1 -1
- package/dist/cjs/operation-node/common-table-expression-node.d.ts +4 -0
- package/dist/cjs/operation-node/common-table-expression-node.js +6 -0
- package/dist/cjs/operation-node/delete-query-node.d.ts +1 -1
- package/dist/cjs/operation-node/delete-query-node.js +3 -3
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +8 -0
- 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/operator-node.d.ts +3 -3
- package/dist/cjs/operation-node/operator-node.js +3 -0
- package/dist/cjs/operation-node/order-by-node.d.ts +2 -2
- package/dist/cjs/operation-node/order-by-node.js +4 -4
- package/dist/cjs/operation-node/over-node.d.ts +1 -1
- package/dist/cjs/operation-node/over-node.js +3 -3
- package/dist/cjs/operation-node/select-query-node.d.ts +5 -4
- package/dist/cjs/operation-node/select-query-node.js +13 -7
- package/dist/cjs/operation-node/tuple-node.d.ts +12 -0
- package/dist/cjs/operation-node/tuple-node.js +18 -0
- package/dist/cjs/parser/binary-operation-parser.d.ts +11 -7
- package/dist/cjs/parser/binary-operation-parser.js +35 -46
- package/dist/cjs/parser/expression-parser.d.ts +9 -4
- package/dist/cjs/parser/join-parser.d.ts +2 -2
- package/dist/cjs/parser/join-parser.js +2 -3
- package/dist/cjs/parser/order-by-parser.d.ts +6 -2
- package/dist/cjs/parser/order-by-parser.js +41 -7
- package/dist/cjs/parser/parse-utils.js +2 -2
- package/dist/cjs/parser/reference-parser.js +1 -1
- package/dist/cjs/parser/select-parser.d.ts +5 -5
- package/dist/cjs/parser/set-operation-parser.d.ts +3 -1
- package/dist/cjs/parser/set-operation-parser.js +13 -4
- package/dist/cjs/parser/tuple-parser.d.ts +47 -0
- package/dist/cjs/parser/tuple-parser.js +2 -0
- package/dist/cjs/parser/value-parser.d.ts +4 -2
- package/dist/cjs/parser/value-parser.js +12 -1
- package/dist/cjs/parser/with-parser.d.ts +3 -2
- package/dist/cjs/parser/with-parser.js +16 -4
- package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +3 -3
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +4 -8
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +13 -0
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +50 -14
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +5 -5
- package/dist/cjs/query-builder/aggregate-function-builder.js +2 -2
- package/dist/cjs/query-builder/case-builder.js +8 -4
- package/dist/cjs/query-builder/cte-builder.d.ts +20 -0
- package/dist/cjs/query-builder/cte-builder.js +39 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +34 -7
- package/dist/cjs/query-builder/delete-query-builder.js +3 -3
- package/dist/cjs/query-builder/function-module.d.ts +41 -6
- package/dist/cjs/query-builder/function-module.js +3 -0
- package/dist/cjs/query-builder/having-interface.d.ts +2 -5
- package/dist/cjs/query-builder/join-builder.d.ts +2 -6
- package/dist/cjs/query-builder/join-builder.js +2 -2
- package/dist/cjs/query-builder/json-path-builder.d.ts +59 -3
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +65 -12
- package/dist/cjs/query-builder/on-conflict-builder.js +4 -4
- package/dist/cjs/query-builder/over-builder.js +1 -1
- package/dist/cjs/query-builder/select-query-builder.d.ts +201 -65
- package/dist/cjs/query-builder/select-query-builder.js +72 -924
- package/dist/cjs/query-builder/update-query-builder.d.ts +34 -7
- package/dist/cjs/query-builder/update-query-builder.js +2 -2
- package/dist/cjs/query-builder/where-interface.d.ts +32 -8
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +3 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +39 -7
- package/dist/cjs/query-creator.d.ts +74 -2
- package/dist/cjs/query-creator.js +83 -6
- package/dist/cjs/raw-builder/raw-builder.d.ts +88 -49
- package/dist/cjs/raw-builder/raw-builder.js +18 -45
- package/dist/cjs/raw-builder/sql.js +8 -8
- package/dist/cjs/schema/alter-table-builder.d.ts +4 -0
- package/dist/cjs/schema/alter-table-builder.js +12 -0
- package/dist/cjs/schema/create-index-builder.d.ts +1 -1
- package/dist/cjs/schema/create-index-builder.js +1 -1
- package/dist/cjs/util/column-type.d.ts +7 -6
- package/dist/cjs/util/json-object-args.d.ts +3 -0
- package/dist/cjs/util/json-object-args.js +35 -0
- package/dist/cjs/util/object-utils.d.ts +1 -0
- package/dist/cjs/util/object-utils.js +9 -1
- package/dist/cjs/util/type-utils.d.ts +10 -10
- package/dist/esm/dialect/dialect-adapter-base.d.ts +3 -3
- package/dist/esm/dialect/mysql/mysql-adapter.d.ts +3 -2
- package/dist/esm/dialect/mysql/mysql-adapter.js +2 -2
- package/dist/esm/dialect/postgres/postgres-adapter.d.ts +3 -2
- package/dist/esm/dialect/postgres/postgres-adapter.js +2 -2
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +2 -2
- package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +4 -2
- package/dist/esm/dialect/sqlite/sqlite-adapter.js +2 -2
- package/dist/esm/driver/runtime-driver.js +17 -2
- package/dist/esm/expression/expression-builder.d.ts +298 -27
- package/dist/esm/expression/expression-builder.js +40 -30
- package/dist/esm/expression/expression-wrapper.d.ts +177 -8
- package/dist/esm/expression/expression-wrapper.js +5 -5
- package/dist/esm/expression/expression.d.ts +64 -1
- package/dist/esm/helpers/mysql.d.ts +11 -8
- package/dist/esm/helpers/mysql.js +21 -32
- package/dist/esm/helpers/postgres.d.ts +8 -5
- package/dist/esm/helpers/postgres.js +8 -5
- package/dist/esm/helpers/sqlite.d.ts +164 -0
- package/dist/esm/helpers/sqlite.js +175 -0
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/kysely.d.ts +4 -3
- package/dist/esm/kysely.js +1 -1
- package/dist/esm/operation-node/common-table-expression-node.d.ts +4 -0
- package/dist/esm/operation-node/common-table-expression-node.js +6 -0
- package/dist/esm/operation-node/delete-query-node.d.ts +1 -1
- package/dist/esm/operation-node/delete-query-node.js +3 -3
- package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.js +8 -0
- 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/operator-node.d.ts +3 -3
- package/dist/esm/operation-node/operator-node.js +3 -0
- package/dist/esm/operation-node/order-by-node.d.ts +2 -2
- package/dist/esm/operation-node/order-by-node.js +4 -4
- package/dist/esm/operation-node/over-node.d.ts +1 -1
- package/dist/esm/operation-node/over-node.js +3 -3
- package/dist/esm/operation-node/select-query-node.d.ts +5 -4
- package/dist/esm/operation-node/select-query-node.js +13 -7
- package/dist/esm/operation-node/tuple-node.d.ts +12 -0
- package/dist/esm/operation-node/tuple-node.js +16 -0
- package/dist/esm/parser/binary-operation-parser.d.ts +11 -7
- package/dist/esm/parser/binary-operation-parser.js +36 -47
- package/dist/esm/parser/expression-parser.d.ts +9 -4
- package/dist/esm/parser/join-parser.d.ts +2 -2
- package/dist/esm/parser/join-parser.js +3 -4
- package/dist/esm/parser/order-by-parser.d.ts +6 -2
- package/dist/esm/parser/order-by-parser.js +40 -7
- package/dist/esm/parser/parse-utils.js +3 -3
- package/dist/esm/parser/reference-parser.js +1 -1
- package/dist/esm/parser/select-parser.d.ts +5 -5
- package/dist/esm/parser/set-operation-parser.d.ts +3 -1
- package/dist/esm/parser/set-operation-parser.js +11 -2
- package/dist/esm/parser/tuple-parser.d.ts +47 -0
- package/dist/esm/parser/tuple-parser.js +2 -0
- package/dist/esm/parser/value-parser.d.ts +4 -2
- package/dist/esm/parser/value-parser.js +10 -1
- package/dist/esm/parser/with-parser.d.ts +3 -2
- package/dist/esm/parser/with-parser.js +16 -4
- package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +3 -3
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +5 -9
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +13 -0
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +51 -15
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +5 -5
- package/dist/esm/query-builder/aggregate-function-builder.js +3 -3
- package/dist/esm/query-builder/case-builder.js +10 -6
- package/dist/esm/query-builder/cte-builder.d.ts +20 -0
- package/dist/esm/query-builder/cte-builder.js +36 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +34 -7
- package/dist/esm/query-builder/delete-query-builder.js +4 -4
- package/dist/esm/query-builder/function-module.d.ts +41 -6
- package/dist/esm/query-builder/function-module.js +3 -0
- package/dist/esm/query-builder/having-interface.d.ts +2 -5
- package/dist/esm/query-builder/join-builder.d.ts +2 -6
- package/dist/esm/query-builder/join-builder.js +3 -3
- package/dist/esm/query-builder/json-path-builder.d.ts +59 -3
- package/dist/esm/query-builder/on-conflict-builder.d.ts +65 -12
- package/dist/esm/query-builder/on-conflict-builder.js +5 -5
- package/dist/esm/query-builder/over-builder.js +1 -1
- package/dist/esm/query-builder/select-query-builder.d.ts +201 -65
- package/dist/esm/query-builder/select-query-builder.js +72 -923
- package/dist/esm/query-builder/update-query-builder.d.ts +34 -7
- package/dist/esm/query-builder/update-query-builder.js +3 -3
- package/dist/esm/query-builder/where-interface.d.ts +32 -8
- package/dist/esm/query-compiler/default-query-compiler.d.ts +3 -0
- package/dist/esm/query-compiler/default-query-compiler.js +39 -7
- package/dist/esm/query-creator.d.ts +74 -2
- package/dist/esm/query-creator.js +84 -7
- package/dist/esm/raw-builder/raw-builder.d.ts +88 -49
- package/dist/esm/raw-builder/raw-builder.js +17 -42
- package/dist/esm/raw-builder/sql.js +9 -9
- package/dist/esm/schema/alter-table-builder.d.ts +4 -0
- package/dist/esm/schema/alter-table-builder.js +12 -0
- package/dist/esm/schema/create-index-builder.d.ts +1 -1
- package/dist/esm/schema/create-index-builder.js +2 -2
- package/dist/esm/util/column-type.d.ts +7 -6
- package/dist/esm/util/json-object-args.d.ts +3 -0
- package/dist/esm/util/json-object-args.js +32 -0
- package/dist/esm/util/object-utils.d.ts +1 -0
- package/dist/esm/util/object-utils.js +7 -0
- package/dist/esm/util/type-utils.d.ts +10 -10
- package/helpers/sqlite.d.ts +1 -0
- package/helpers/sqlite.js +1 -0
- package/package.json +7 -4
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Kysely } from '../../kysely.js';
|
|
2
2
|
import { DialectAdapterBase } from '../dialect-adapter-base.js';
|
|
3
|
+
import { MigrationLockOptions } from '../dialect-adapter.js';
|
|
3
4
|
export declare class PostgresAdapter extends DialectAdapterBase {
|
|
4
5
|
/**
|
|
5
6
|
* Whether or not this dialect supports transactional DDL.
|
|
@@ -57,7 +58,7 @@ export declare class PostgresAdapter extends DialectAdapterBase {
|
|
|
57
58
|
* `db` is a single connection (session) that will be used to execute the
|
|
58
59
|
* migrations.
|
|
59
60
|
*/
|
|
60
|
-
acquireMigrationLock(db: Kysely<any
|
|
61
|
+
acquireMigrationLock(db: Kysely<any>, _opt: MigrationLockOptions): Promise<void>;
|
|
61
62
|
/**
|
|
62
63
|
* Releases the migration lock. See {@link acquireMigrationLock}.
|
|
63
64
|
*
|
|
@@ -66,5 +67,5 @@ export declare class PostgresAdapter extends DialectAdapterBase {
|
|
|
66
67
|
* is a single connection (session) that was used to execute the migrations
|
|
67
68
|
* and the `acquireMigrationLock` call.
|
|
68
69
|
*/
|
|
69
|
-
releaseMigrationLock(): Promise<void>;
|
|
70
|
+
releaseMigrationLock(_db: Kysely<any>, _opt: MigrationLockOptions): Promise<void>;
|
|
70
71
|
}
|
|
@@ -10,11 +10,11 @@ export class PostgresAdapter extends DialectAdapterBase {
|
|
|
10
10
|
get supportsReturning() {
|
|
11
11
|
return true;
|
|
12
12
|
}
|
|
13
|
-
async acquireMigrationLock(db) {
|
|
13
|
+
async acquireMigrationLock(db, _opt) {
|
|
14
14
|
// Acquire a transaction level advisory lock.
|
|
15
15
|
await sql `select pg_advisory_xact_lock(${sql.lit(LOCK_ID)})`.execute(db);
|
|
16
16
|
}
|
|
17
|
-
async releaseMigrationLock() {
|
|
17
|
+
async releaseMigrationLock(_db, _opt) {
|
|
18
18
|
// Nothing to do here. `pg_advisory_xact_lock` is automatically released at the
|
|
19
19
|
// end of the transaction and since `supportsTransactionalDdl` true, we know
|
|
20
20
|
// the `db` instance passed to acquireMigrationLock is actually a transaction.
|
|
@@ -8,7 +8,7 @@ export interface PostgresDialectConfig {
|
|
|
8
8
|
*
|
|
9
9
|
* If a function is provided, it's called once when the first query is executed.
|
|
10
10
|
*
|
|
11
|
-
* https://node-postgres.com/
|
|
11
|
+
* https://node-postgres.com/apis/pool
|
|
12
12
|
*/
|
|
13
13
|
pool: PostgresPool | (() => Promise<PostgresPool>);
|
|
14
14
|
/**
|
|
@@ -35,7 +35,7 @@ export interface PostgresDialectConfig {
|
|
|
35
35
|
*
|
|
36
36
|
* We don't use the type from `pg` here to not have a dependency to it.
|
|
37
37
|
*
|
|
38
|
-
* https://node-postgres.com/
|
|
38
|
+
* https://node-postgres.com/apis/pool
|
|
39
39
|
*/
|
|
40
40
|
export interface PostgresPool {
|
|
41
41
|
connect(): Promise<PostgresPoolClient>;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { Kysely } from '../../kysely.js';
|
|
1
2
|
import { DialectAdapterBase } from '../dialect-adapter-base.js';
|
|
3
|
+
import { MigrationLockOptions } from '../dialect-adapter.js';
|
|
2
4
|
export declare class SqliteAdapter implements DialectAdapterBase {
|
|
3
5
|
/**
|
|
4
6
|
* Whether or not this dialect supports transactional DDL.
|
|
@@ -56,7 +58,7 @@ export declare class SqliteAdapter implements DialectAdapterBase {
|
|
|
56
58
|
* `db` is a single connection (session) that will be used to execute the
|
|
57
59
|
* migrations.
|
|
58
60
|
*/
|
|
59
|
-
acquireMigrationLock(): Promise<void>;
|
|
61
|
+
acquireMigrationLock(_db: Kysely<any>, _opt: MigrationLockOptions): Promise<void>;
|
|
60
62
|
/**
|
|
61
63
|
* Releases the migration lock. See {@link acquireMigrationLock}.
|
|
62
64
|
*
|
|
@@ -65,5 +67,5 @@ export declare class SqliteAdapter implements DialectAdapterBase {
|
|
|
65
67
|
* is a single connection (session) that was used to execute the migrations
|
|
66
68
|
* and the `acquireMigrationLock` call.
|
|
67
69
|
*/
|
|
68
|
-
releaseMigrationLock(): Promise<void>;
|
|
70
|
+
releaseMigrationLock(_db: Kysely<any>, _opt: MigrationLockOptions): Promise<void>;
|
|
69
71
|
}
|
|
@@ -6,12 +6,12 @@ export class SqliteAdapter {
|
|
|
6
6
|
get supportsReturning() {
|
|
7
7
|
return true;
|
|
8
8
|
}
|
|
9
|
-
async acquireMigrationLock() {
|
|
9
|
+
async acquireMigrationLock(_db, _opt) {
|
|
10
10
|
// SQLite only has one connection that's reserved by the migration system
|
|
11
11
|
// for the whole time between acquireMigrationLock and releaseMigrationLock.
|
|
12
12
|
// We don't need to do anything here.
|
|
13
13
|
}
|
|
14
|
-
async releaseMigrationLock() {
|
|
14
|
+
async releaseMigrationLock(_db, _opt) {
|
|
15
15
|
// SQLite only has one connection that's reserved by the migration system
|
|
16
16
|
// for the whole time between acquireMigrationLock and releaseMigrationLock.
|
|
17
17
|
// We don't need to do anything here.
|
|
@@ -9,15 +9,25 @@ export class RuntimeDriver {
|
|
|
9
9
|
#driver;
|
|
10
10
|
#log;
|
|
11
11
|
#initPromise;
|
|
12
|
+
#initDone;
|
|
12
13
|
#destroyPromise;
|
|
13
14
|
#connections = new WeakSet();
|
|
14
15
|
constructor(driver, log) {
|
|
16
|
+
this.#initDone = false;
|
|
15
17
|
this.#driver = driver;
|
|
16
18
|
this.#log = log;
|
|
17
19
|
}
|
|
18
20
|
async init() {
|
|
21
|
+
if (this.#destroyPromise) {
|
|
22
|
+
throw new Error('driver has already been destroyed');
|
|
23
|
+
}
|
|
19
24
|
if (!this.#initPromise) {
|
|
20
|
-
this.#initPromise = this.#driver
|
|
25
|
+
this.#initPromise = this.#driver
|
|
26
|
+
.init()
|
|
27
|
+
.then(() => {
|
|
28
|
+
this.#initDone = true;
|
|
29
|
+
})
|
|
30
|
+
.catch((err) => {
|
|
21
31
|
this.#initPromise = undefined;
|
|
22
32
|
return Promise.reject(err);
|
|
23
33
|
});
|
|
@@ -25,7 +35,12 @@ export class RuntimeDriver {
|
|
|
25
35
|
await this.#initPromise;
|
|
26
36
|
}
|
|
27
37
|
async acquireConnection() {
|
|
28
|
-
|
|
38
|
+
if (this.#destroyPromise) {
|
|
39
|
+
throw new Error('driver has already been destroyed');
|
|
40
|
+
}
|
|
41
|
+
if (!this.#initDone) {
|
|
42
|
+
await this.init();
|
|
43
|
+
}
|
|
29
44
|
const connection = await this.#driver.acquireConnection();
|
|
30
45
|
if (!this.#connections.has(connection)) {
|
|
31
46
|
if (this.#needsLogging()) {
|
|
@@ -3,14 +3,17 @@ import { TableExpression, From, FromTables, ExtractTableAlias, AnyAliasedTable,
|
|
|
3
3
|
import { FunctionModule } from '../query-builder/function-module.js';
|
|
4
4
|
import { ExtractTypeFromReferenceExpression, ReferenceExpression, SimpleReferenceExpression, StringReference } from '../parser/reference-parser.js';
|
|
5
5
|
import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
6
|
-
import { BinaryOperatorExpression, ComparisonOperatorExpression, OperandValueExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
|
|
6
|
+
import { BinaryOperatorExpression, ComparisonOperatorExpression, FilterObject, OperandValueExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
|
|
7
7
|
import { Expression } from './expression.js';
|
|
8
8
|
import { ExpressionWrapper } from './expression-wrapper.js';
|
|
9
9
|
import { ComparisonOperator, JSONOperatorWith$, UnaryOperator } from '../operation-node/operator-node.js';
|
|
10
10
|
import { SqlBool } from '../util/type-utils.js';
|
|
11
|
-
import {
|
|
11
|
+
import { ExtractTypeFromValueExpression } from '../parser/value-parser.js';
|
|
12
12
|
import { CaseBuilder } from '../query-builder/case-builder.js';
|
|
13
13
|
import { JSONPathBuilder } from '../query-builder/json-path-builder.js';
|
|
14
|
+
import { OperandExpression } from '../parser/expression-parser.js';
|
|
15
|
+
import { SelectArg, SelectExpression, Selection } from '../parser/select-parser.js';
|
|
16
|
+
import { RefTuple2, RefTuple3, RefTuple4, RefTuple5, ValTuple2, ValTuple3, ValTuple4, ValTuple5 } from '../parser/tuple-parser.js';
|
|
14
17
|
export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
15
18
|
/**
|
|
16
19
|
* Creates a binary expression.
|
|
@@ -20,31 +23,45 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
20
23
|
*
|
|
21
24
|
* ### Examples
|
|
22
25
|
*
|
|
23
|
-
*
|
|
26
|
+
* A simple comparison:
|
|
24
27
|
*
|
|
25
28
|
* ```ts
|
|
26
|
-
*
|
|
27
|
-
* .
|
|
28
|
-
*
|
|
29
|
-
* }))
|
|
30
|
-
* .where('id', '=', id)
|
|
29
|
+
* eb.selectFrom('person')
|
|
30
|
+
* .selectAll()
|
|
31
|
+
* .where((eb) => eb('first_name', '=', 'Jennifer'))
|
|
31
32
|
* ```
|
|
32
33
|
*
|
|
33
34
|
* The generated SQL (PostgreSQL):
|
|
34
35
|
*
|
|
35
36
|
* ```sql
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* where "
|
|
37
|
+
* select *
|
|
38
|
+
* from "person"
|
|
39
|
+
* where "first_name" = $1
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* By default the third argument is interpreted as a value. To pass in
|
|
43
|
+
* a column reference, you can use {@link ref}:
|
|
44
|
+
*
|
|
45
|
+
* ```ts
|
|
46
|
+
* eb.selectFrom('person')
|
|
47
|
+
* .selectAll()
|
|
48
|
+
* .where((eb) => eb('first_name', '=', eb.ref('last_name')))
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* The generated SQL (PostgreSQL):
|
|
52
|
+
*
|
|
53
|
+
* ```sql
|
|
54
|
+
* select *
|
|
55
|
+
* from "person"
|
|
56
|
+
* where "first_name" = "last_name"
|
|
39
57
|
* ```
|
|
40
58
|
*
|
|
41
|
-
*
|
|
42
|
-
* pass in a column reference instead:
|
|
59
|
+
* In the following example `eb` is used to increment an integer column:
|
|
43
60
|
*
|
|
44
61
|
* ```ts
|
|
45
62
|
* db.updateTable('person')
|
|
46
63
|
* .set((eb) => ({
|
|
47
|
-
* age: eb('age', '+',
|
|
64
|
+
* age: eb('age', '+', 1)
|
|
48
65
|
* }))
|
|
49
66
|
* .where('id', '=', id)
|
|
50
67
|
* ```
|
|
@@ -53,8 +70,23 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
53
70
|
*
|
|
54
71
|
* ```sql
|
|
55
72
|
* update "person"
|
|
56
|
-
* set "age" = "age" +
|
|
57
|
-
* where "id" = $
|
|
73
|
+
* set "age" = "age" + $1
|
|
74
|
+
* where "id" = $2
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* As always, expressions can be nested. Both the first and the third argument
|
|
78
|
+
* can be any expression:
|
|
79
|
+
*
|
|
80
|
+
* ```ts
|
|
81
|
+
* eb.selectFrom('person')
|
|
82
|
+
* .selectAll()
|
|
83
|
+
* .where((eb) => eb(
|
|
84
|
+
* eb.fn('lower', ['first_name']),
|
|
85
|
+
* 'in',
|
|
86
|
+
* eb.selectFrom('pet')
|
|
87
|
+
* .select('pet.name')
|
|
88
|
+
* .where('pet.species', '=', 'cat')
|
|
89
|
+
* ))
|
|
58
90
|
* ```
|
|
59
91
|
*/
|
|
60
92
|
<RE extends ReferenceExpression<DB, TB>, OP extends BinaryOperatorExpression>(lhs: RE, op: OP, rhs: OperandValueExpressionOrList<DB, TB, RE>): ExpressionWrapper<DB, TB, OP extends ComparisonOperator ? SqlBool : ExtractTypeFromReferenceExpression<DB, TB, RE>>;
|
|
@@ -81,7 +113,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
81
113
|
* )
|
|
82
114
|
* ```
|
|
83
115
|
*/
|
|
84
|
-
eb: ExpressionBuilder<DB, TB>;
|
|
116
|
+
get eb(): ExpressionBuilder<DB, TB>;
|
|
85
117
|
/**
|
|
86
118
|
* Returns a {@link FunctionModule} that can be used to write type safe function
|
|
87
119
|
* calls.
|
|
@@ -163,6 +195,16 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
163
195
|
selectFrom<TE extends keyof DB & string>(from: TE): SelectQueryBuilder<DB, TB | ExtractTableAlias<DB, TE>, {}>;
|
|
164
196
|
selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, TB | ExtractTableAlias<DB, TE>, {}>;
|
|
165
197
|
selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
|
|
198
|
+
/**
|
|
199
|
+
* Creates a `select` expression without a `from` clause.
|
|
200
|
+
*
|
|
201
|
+
* If you want to create a `select from` query, use the `selectFrom` method instead.
|
|
202
|
+
* This one can be used to create a plain `select` statement without a `from` clause.
|
|
203
|
+
*
|
|
204
|
+
* This method accepts the same inputs as {@link SelectQueryBuilder.select}. See its
|
|
205
|
+
* documentation for examples.
|
|
206
|
+
*/
|
|
207
|
+
selectNoFrom<SE extends SelectExpression<DB, TB>>(selection: SelectArg<DB, TB, SE>): SelectQueryBuilder<DB, TB, Selection<DB, TB, SE>>;
|
|
166
208
|
/**
|
|
167
209
|
* Creates a `case` statement/operator.
|
|
168
210
|
*
|
|
@@ -322,7 +364,144 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
322
364
|
* $1 = "age"
|
|
323
365
|
* ```
|
|
324
366
|
*/
|
|
325
|
-
val<VE>(value: VE): ExpressionWrapper<DB, TB,
|
|
367
|
+
val<VE>(value: VE): ExpressionWrapper<DB, TB, ExtractTypeFromValueExpression<VE>>;
|
|
368
|
+
/**
|
|
369
|
+
* Creates a tuple expression.
|
|
370
|
+
*
|
|
371
|
+
* This creates a tuple using column references by default. See {@link tuple}
|
|
372
|
+
* if you need to create value tuples.
|
|
373
|
+
*
|
|
374
|
+
* ### Examples
|
|
375
|
+
*
|
|
376
|
+
* ```ts
|
|
377
|
+
* db.selectFrom('person')
|
|
378
|
+
* .selectAll('person')
|
|
379
|
+
* .where(({ eb, refTuple, tuple }) => eb(
|
|
380
|
+
* refTuple('first_name', 'last_name'),
|
|
381
|
+
* 'in',
|
|
382
|
+
* [
|
|
383
|
+
* tuple('Jennifer', 'Aniston'),
|
|
384
|
+
* tuple('Sylvester', 'Stallone')
|
|
385
|
+
* ]
|
|
386
|
+
* ))
|
|
387
|
+
* ```
|
|
388
|
+
*
|
|
389
|
+
* The generated SQL (PostgreSQL):
|
|
390
|
+
*
|
|
391
|
+
* ```sql
|
|
392
|
+
* select
|
|
393
|
+
* "person".*
|
|
394
|
+
* from
|
|
395
|
+
* "person"
|
|
396
|
+
* where
|
|
397
|
+
* ("first_name", "last_name")
|
|
398
|
+
* in
|
|
399
|
+
* (
|
|
400
|
+
* ($1, $2),
|
|
401
|
+
* ($3, $4)
|
|
402
|
+
* )
|
|
403
|
+
* ```
|
|
404
|
+
*
|
|
405
|
+
* In the next example a reference tuple is compared to a subquery. Note that
|
|
406
|
+
* in this case you need to use the {@link @SelectQueryBuilder.$asTuple | $asTuple}
|
|
407
|
+
* function:
|
|
408
|
+
*
|
|
409
|
+
* ```ts
|
|
410
|
+
* db.selectFrom('person')
|
|
411
|
+
* .selectAll('person')
|
|
412
|
+
* .where(({ eb, refTuple, selectFrom }) => eb(
|
|
413
|
+
* refTuple('first_name', 'last_name'),
|
|
414
|
+
* 'in',
|
|
415
|
+
* selectFrom('pet')
|
|
416
|
+
* .select(['name', 'species'])
|
|
417
|
+
* .where('species', '!=', 'cat')
|
|
418
|
+
* .$asTuple('name', 'species')
|
|
419
|
+
* ))
|
|
420
|
+
* ```
|
|
421
|
+
*
|
|
422
|
+
* The generated SQL (PostgreSQL):
|
|
423
|
+
*
|
|
424
|
+
* ```sql
|
|
425
|
+
* select
|
|
426
|
+
* "person".*
|
|
427
|
+
* from
|
|
428
|
+
* "person"
|
|
429
|
+
* where
|
|
430
|
+
* ("first_name", "last_name")
|
|
431
|
+
* in
|
|
432
|
+
* (
|
|
433
|
+
* select "name", "species"
|
|
434
|
+
* from "pet"
|
|
435
|
+
* where "species" != $1
|
|
436
|
+
* )
|
|
437
|
+
* ```
|
|
438
|
+
*/
|
|
439
|
+
refTuple<R1 extends ReferenceExpression<DB, TB>, R2 extends ReferenceExpression<DB, TB>>(value1: R1, value2: R2): ExpressionWrapper<DB, TB, RefTuple2<DB, TB, R1, R2>>;
|
|
440
|
+
refTuple<R1 extends ReferenceExpression<DB, TB>, R2 extends ReferenceExpression<DB, TB>, R3 extends ReferenceExpression<DB, TB>>(value1: R1, value2: R2, value3: R3): ExpressionWrapper<DB, TB, RefTuple3<DB, TB, R1, R2, R3>>;
|
|
441
|
+
refTuple<R1 extends ReferenceExpression<DB, TB>, R2 extends ReferenceExpression<DB, TB>, R3 extends ReferenceExpression<DB, TB>, R4 extends ReferenceExpression<DB, TB>>(value1: R1, value2: R2, value3: R3, value4: R4): ExpressionWrapper<DB, TB, RefTuple4<DB, TB, R1, R2, R3, R4>>;
|
|
442
|
+
refTuple<R1 extends ReferenceExpression<DB, TB>, R2 extends ReferenceExpression<DB, TB>, R3 extends ReferenceExpression<DB, TB>, R4 extends ReferenceExpression<DB, TB>, R5 extends ReferenceExpression<DB, TB>>(value1: R1, value2: R2, value3: R3, value4: R4, value5: R5): ExpressionWrapper<DB, TB, RefTuple5<DB, TB, R1, R2, R3, R4, R5>>;
|
|
443
|
+
/**
|
|
444
|
+
* Creates a value tuple expression.
|
|
445
|
+
*
|
|
446
|
+
* This creates a tuple using values by default. See {@link refTuple} if you need to create
|
|
447
|
+
* tuples using column references.
|
|
448
|
+
*
|
|
449
|
+
* ### Examples
|
|
450
|
+
*
|
|
451
|
+
* ```ts
|
|
452
|
+
* db.selectFrom('person')
|
|
453
|
+
* .selectAll('person')
|
|
454
|
+
* .where(({ eb, refTuple, tuple }) => eb(
|
|
455
|
+
* refTuple('first_name', 'last_name'),
|
|
456
|
+
* 'in',
|
|
457
|
+
* [
|
|
458
|
+
* tuple('Jennifer', 'Aniston'),
|
|
459
|
+
* tuple('Sylvester', 'Stallone')
|
|
460
|
+
* ]
|
|
461
|
+
* ))
|
|
462
|
+
* ```
|
|
463
|
+
*
|
|
464
|
+
* The generated SQL (PostgreSQL):
|
|
465
|
+
*
|
|
466
|
+
* ```sql
|
|
467
|
+
* select
|
|
468
|
+
* "person".*
|
|
469
|
+
* from
|
|
470
|
+
* "person"
|
|
471
|
+
* where
|
|
472
|
+
* ("first_name", "last_name")
|
|
473
|
+
* in
|
|
474
|
+
* (
|
|
475
|
+
* ($1, $2),
|
|
476
|
+
* ($3, $4)
|
|
477
|
+
* )
|
|
478
|
+
* ```
|
|
479
|
+
*/
|
|
480
|
+
tuple<V1, V2>(value1: V1, value2: V2): ExpressionWrapper<DB, TB, ValTuple2<V1, V2>>;
|
|
481
|
+
tuple<V1, V2, V3>(value1: V1, value2: V2, value3: V3): ExpressionWrapper<DB, TB, ValTuple3<V1, V2, V3>>;
|
|
482
|
+
tuple<V1, V2, V3, V4>(value1: V1, value2: V2, value3: V3, value4: V4): ExpressionWrapper<DB, TB, ValTuple4<V1, V2, V3, V4>>;
|
|
483
|
+
tuple<V1, V2, V3, V4, V5>(value1: V1, value2: V2, value3: V3, value4: V4, value5: V5): ExpressionWrapper<DB, TB, ValTuple5<V1, V2, V3, V4, V5>>;
|
|
484
|
+
/**
|
|
485
|
+
* Returns a literal value expression.
|
|
486
|
+
*
|
|
487
|
+
* Just like `val` but creates a literal value that gets merged in the SQL.
|
|
488
|
+
* To prevent SQL injections, only `boolean`, `number` and `null` values
|
|
489
|
+
* are accepted. If you need `string` or other literals, use `sql.lit` instead.
|
|
490
|
+
*
|
|
491
|
+
* ### Examples
|
|
492
|
+
*
|
|
493
|
+
* ```ts
|
|
494
|
+
* db.selectFrom('person')
|
|
495
|
+
* .select((eb) => eb.lit(1).as('one'))
|
|
496
|
+
* ```
|
|
497
|
+
*
|
|
498
|
+
* The generated SQL (PostgreSQL):
|
|
499
|
+
*
|
|
500
|
+
* ```sql
|
|
501
|
+
* select 1 as "one" from "person"
|
|
502
|
+
* ```
|
|
503
|
+
*/
|
|
504
|
+
lit<VE extends number | boolean | null>(literal: VE): ExpressionWrapper<DB, TB, VE>;
|
|
326
505
|
/**
|
|
327
506
|
* @deprecated Use the expression builder as a function instead.
|
|
328
507
|
*
|
|
@@ -423,9 +602,47 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
423
602
|
* @see {@link unary}
|
|
424
603
|
*/
|
|
425
604
|
neg<RE extends ReferenceExpression<DB, TB>>(expr: RE): ExpressionWrapper<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, RE>>;
|
|
605
|
+
/**
|
|
606
|
+
* Creates a `between` expression.
|
|
607
|
+
*
|
|
608
|
+
* ### Examples
|
|
609
|
+
*
|
|
610
|
+
* ```ts
|
|
611
|
+
* db.selectFrom('person')
|
|
612
|
+
* .selectAll()
|
|
613
|
+
* .where((eb) => eb.between('age', 40, 60))
|
|
614
|
+
* ```
|
|
615
|
+
*
|
|
616
|
+
* The generated SQL (PostgreSQL):
|
|
617
|
+
*
|
|
618
|
+
* ```sql
|
|
619
|
+
* select * from "person" where "age" between $1 and $2
|
|
620
|
+
* ```
|
|
621
|
+
*/
|
|
622
|
+
between<RE extends ReferenceExpression<DB, TB>>(expr: RE, start: OperandValueExpression<DB, TB, RE>, end: OperandValueExpression<DB, TB, RE>): ExpressionWrapper<DB, TB, SqlBool>;
|
|
623
|
+
/**
|
|
624
|
+
* Creates a `between symmetric` expression.
|
|
625
|
+
*
|
|
626
|
+
* ### Examples
|
|
627
|
+
*
|
|
628
|
+
* ```ts
|
|
629
|
+
* db.selectFrom('person')
|
|
630
|
+
* .selectAll()
|
|
631
|
+
* .where((eb) => eb.betweenSymmetric('age', 40, 60))
|
|
632
|
+
* ```
|
|
633
|
+
*
|
|
634
|
+
* The generated SQL (PostgreSQL):
|
|
635
|
+
*
|
|
636
|
+
* ```sql
|
|
637
|
+
* select * from "person" where "age" between symmetric $1 and $2
|
|
638
|
+
* ```
|
|
639
|
+
*/
|
|
640
|
+
betweenSymmetric<RE extends ReferenceExpression<DB, TB>>(expr: RE, start: OperandValueExpression<DB, TB, RE>, end: OperandValueExpression<DB, TB, RE>): ExpressionWrapper<DB, TB, SqlBool>;
|
|
426
641
|
/**
|
|
427
642
|
* Combines two or more expressions using the logical `and` operator.
|
|
428
643
|
*
|
|
644
|
+
* An empty array produces a `true` expression.
|
|
645
|
+
*
|
|
429
646
|
* This function returns an {@link Expression} and can be used pretty much anywhere.
|
|
430
647
|
* See the examples for a couple of possible use cases.
|
|
431
648
|
*
|
|
@@ -449,15 +666,43 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
449
666
|
* ```sql
|
|
450
667
|
* select "person".*
|
|
451
668
|
* from "person"
|
|
452
|
-
* where
|
|
453
|
-
*
|
|
454
|
-
*
|
|
669
|
+
* where (
|
|
670
|
+
* "first_name" = $1
|
|
671
|
+
* and "first_name" = $2
|
|
672
|
+
* and "first_name" = $3
|
|
673
|
+
* )
|
|
674
|
+
* ```
|
|
675
|
+
*
|
|
676
|
+
* Optionally you can use the simpler object notation if you only need
|
|
677
|
+
* equality comparisons:
|
|
678
|
+
*
|
|
679
|
+
* ```ts
|
|
680
|
+
* db.selectFrom('person')
|
|
681
|
+
* .selectAll('person')
|
|
682
|
+
* .where((eb) => eb.and({
|
|
683
|
+
* first_name: 'Jennifer',
|
|
684
|
+
* last_name: 'Aniston'
|
|
685
|
+
* }))
|
|
686
|
+
* ```
|
|
687
|
+
*
|
|
688
|
+
* The generated SQL (PostgreSQL):
|
|
689
|
+
*
|
|
690
|
+
* ```sql
|
|
691
|
+
* select "person".*
|
|
692
|
+
* from "person"
|
|
693
|
+
* where (
|
|
694
|
+
* "first_name" = $1
|
|
695
|
+
* and "last_name" = $2
|
|
696
|
+
* )
|
|
455
697
|
* ```
|
|
456
698
|
*/
|
|
457
|
-
and(exprs: ReadonlyArray<
|
|
699
|
+
and(exprs: ReadonlyArray<OperandExpression<SqlBool>>): ExpressionWrapper<DB, TB, SqlBool>;
|
|
700
|
+
and(exprs: Readonly<FilterObject<DB, TB>>): ExpressionWrapper<DB, TB, SqlBool>;
|
|
458
701
|
/**
|
|
459
702
|
* Combines two or more expressions using the logical `or` operator.
|
|
460
703
|
*
|
|
704
|
+
* An empty array produces a `false` expression.
|
|
705
|
+
*
|
|
461
706
|
* This function returns an {@link Expression} and can be used pretty much anywhere.
|
|
462
707
|
* See the examples for a couple of possible use cases.
|
|
463
708
|
*
|
|
@@ -469,7 +714,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
469
714
|
* ```ts
|
|
470
715
|
* db.selectFrom('person')
|
|
471
716
|
* .selectAll('person')
|
|
472
|
-
* .where((eb) => or([
|
|
717
|
+
* .where((eb) => eb.or([
|
|
473
718
|
* eb('first_name', '=', 'Jennifer'),
|
|
474
719
|
* eb('fist_name', '=', 'Arnold'),
|
|
475
720
|
* eb('fist_name', '=', 'Sylvester')
|
|
@@ -481,12 +726,38 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
481
726
|
* ```sql
|
|
482
727
|
* select "person".*
|
|
483
728
|
* from "person"
|
|
484
|
-
* where
|
|
485
|
-
*
|
|
486
|
-
*
|
|
729
|
+
* where (
|
|
730
|
+
* "first_name" = $1
|
|
731
|
+
* or "first_name" = $2
|
|
732
|
+
* or "first_name" = $3
|
|
733
|
+
* )
|
|
734
|
+
* ```
|
|
735
|
+
*
|
|
736
|
+
* Optionally you can use the simpler object notation if you only need
|
|
737
|
+
* equality comparisons:
|
|
738
|
+
*
|
|
739
|
+
* ```ts
|
|
740
|
+
* db.selectFrom('person')
|
|
741
|
+
* .selectAll('person')
|
|
742
|
+
* .where((eb) => eb.or({
|
|
743
|
+
* first_name: 'Jennifer',
|
|
744
|
+
* last_name: 'Aniston'
|
|
745
|
+
* }))
|
|
746
|
+
* ```
|
|
747
|
+
*
|
|
748
|
+
* The generated SQL (PostgreSQL):
|
|
749
|
+
*
|
|
750
|
+
* ```sql
|
|
751
|
+
* select "person".*
|
|
752
|
+
* from "person"
|
|
753
|
+
* where (
|
|
754
|
+
* "first_name" = $1
|
|
755
|
+
* or "last_name" = $2
|
|
756
|
+
* )
|
|
487
757
|
* ```
|
|
488
758
|
*/
|
|
489
|
-
or(exprs: ReadonlyArray<
|
|
759
|
+
or(exprs: ReadonlyArray<OperandExpression<SqlBool>>): ExpressionWrapper<DB, TB, SqlBool>;
|
|
760
|
+
or(exprs: Readonly<FilterObject<DB, TB>>): ExpressionWrapper<DB, TB, SqlBool>;
|
|
490
761
|
/**
|
|
491
762
|
* Wraps the expression in parentheses.
|
|
492
763
|
*
|
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
/// <reference types="./expression-builder.d.ts" />
|
|
2
|
-
import {
|
|
2
|
+
import { createSelectQueryBuilder, } from '../query-builder/select-query-builder.js';
|
|
3
3
|
import { SelectQueryNode } from '../operation-node/select-query-node.js';
|
|
4
4
|
import { parseTableExpressionOrList, } from '../parser/table-parser.js';
|
|
5
5
|
import { WithSchemaPlugin } from '../plugin/with-schema/with-schema-plugin.js';
|
|
6
6
|
import { createQueryId } from '../util/query-id.js';
|
|
7
7
|
import { createFunctionModule, } from '../query-builder/function-module.js';
|
|
8
8
|
import { parseJSONReference, parseReferenceExpression, parseStringReference, } from '../parser/reference-parser.js';
|
|
9
|
-
import { parseValueBinaryOperation, parseValueBinaryOperationOrExpression, } from '../parser/binary-operation-parser.js';
|
|
10
|
-
import { AndNode } from '../operation-node/and-node.js';
|
|
11
|
-
import { OrNode } from '../operation-node/or-node.js';
|
|
9
|
+
import { parseFilterList, parseFilterObject, parseValueBinaryOperation, parseValueBinaryOperationOrExpression, } from '../parser/binary-operation-parser.js';
|
|
12
10
|
import { ParensNode } from '../operation-node/parens-node.js';
|
|
13
11
|
import { ExpressionWrapper } from './expression-wrapper.js';
|
|
12
|
+
import { OperatorNode, } from '../operation-node/operator-node.js';
|
|
14
13
|
import { parseUnaryOperation } from '../parser/unary-operation-parser.js';
|
|
15
|
-
import { parseValueExpressionOrList, } from '../parser/value-parser.js';
|
|
14
|
+
import { parseSafeImmediateValue, parseValueExpression, parseValueExpressionOrList, } from '../parser/value-parser.js';
|
|
16
15
|
import { NOOP_QUERY_EXECUTOR } from '../query-executor/noop-query-executor.js';
|
|
17
|
-
import { ValueNode } from '../operation-node/value-node.js';
|
|
18
16
|
import { CaseBuilder } from '../query-builder/case-builder.js';
|
|
19
17
|
import { CaseNode } from '../operation-node/case-node.js';
|
|
20
|
-
import { isUndefined } from '../util/object-utils.js';
|
|
18
|
+
import { isReadonlyArray, isUndefined } from '../util/object-utils.js';
|
|
21
19
|
import { JSONPathBuilder } from '../query-builder/json-path-builder.js';
|
|
20
|
+
import { BinaryOperationNode } from '../operation-node/binary-operation-node.js';
|
|
21
|
+
import { AndNode } from '../operation-node/and-node.js';
|
|
22
|
+
import { parseSelectArg, } from '../parser/select-parser.js';
|
|
23
|
+
import { TupleNode } from '../operation-node/tuple-node.js';
|
|
22
24
|
export function createExpressionBuilder(executor = NOOP_QUERY_EXECUTOR) {
|
|
23
25
|
function binary(lhs, op, rhs) {
|
|
24
26
|
return new ExpressionWrapper(parseValueBinaryOperation(lhs, op, rhs));
|
|
@@ -30,10 +32,17 @@ export function createExpressionBuilder(executor = NOOP_QUERY_EXECUTOR) {
|
|
|
30
32
|
fn: undefined,
|
|
31
33
|
eb: undefined,
|
|
32
34
|
selectFrom(table) {
|
|
33
|
-
return
|
|
35
|
+
return createSelectQueryBuilder({
|
|
34
36
|
queryId: createQueryId(),
|
|
35
|
-
executor
|
|
36
|
-
queryNode: SelectQueryNode.
|
|
37
|
+
executor,
|
|
38
|
+
queryNode: SelectQueryNode.createFrom(parseTableExpressionOrList(table)),
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
selectNoFrom(selection) {
|
|
42
|
+
return createSelectQueryBuilder({
|
|
43
|
+
queryId: createQueryId(),
|
|
44
|
+
executor,
|
|
45
|
+
queryNode: SelectQueryNode.cloneWithSelections(SelectQueryNode.create(), parseSelectArg(selection)),
|
|
37
46
|
});
|
|
38
47
|
},
|
|
39
48
|
case(reference) {
|
|
@@ -52,6 +61,15 @@ export function createExpressionBuilder(executor = NOOP_QUERY_EXECUTOR) {
|
|
|
52
61
|
val(value) {
|
|
53
62
|
return new ExpressionWrapper(parseValueExpressionOrList(value));
|
|
54
63
|
},
|
|
64
|
+
refTuple(...values) {
|
|
65
|
+
return new ExpressionWrapper(TupleNode.create(values.map(parseReferenceExpression)));
|
|
66
|
+
},
|
|
67
|
+
tuple(...values) {
|
|
68
|
+
return new ExpressionWrapper(TupleNode.create(values.map(parseValueExpression)));
|
|
69
|
+
},
|
|
70
|
+
lit(value) {
|
|
71
|
+
return new ExpressionWrapper(parseSafeImmediateValue(value));
|
|
72
|
+
},
|
|
55
73
|
// @deprecated
|
|
56
74
|
cmpr(lhs, op, rhs) {
|
|
57
75
|
return new ExpressionWrapper(parseValueBinaryOperation(lhs, op, rhs));
|
|
@@ -70,31 +88,23 @@ export function createExpressionBuilder(executor = NOOP_QUERY_EXECUTOR) {
|
|
|
70
88
|
neg(expr) {
|
|
71
89
|
return unary('-', expr);
|
|
72
90
|
},
|
|
91
|
+
between(expr, start, end) {
|
|
92
|
+
return new ExpressionWrapper(BinaryOperationNode.create(parseReferenceExpression(expr), OperatorNode.create('between'), AndNode.create(parseValueExpression(start), parseValueExpression(end))));
|
|
93
|
+
},
|
|
94
|
+
betweenSymmetric(expr, start, end) {
|
|
95
|
+
return new ExpressionWrapper(BinaryOperationNode.create(parseReferenceExpression(expr), OperatorNode.create('between symmetric'), AndNode.create(parseValueExpression(start), parseValueExpression(end))));
|
|
96
|
+
},
|
|
73
97
|
and(exprs) {
|
|
74
|
-
if (exprs
|
|
75
|
-
return new ExpressionWrapper(
|
|
76
|
-
}
|
|
77
|
-
else if (exprs.length === 1) {
|
|
78
|
-
return new ExpressionWrapper(exprs[0].toOperationNode());
|
|
98
|
+
if (isReadonlyArray(exprs)) {
|
|
99
|
+
return new ExpressionWrapper(parseFilterList(exprs, 'and'));
|
|
79
100
|
}
|
|
80
|
-
|
|
81
|
-
for (let i = 2; i < exprs.length; ++i) {
|
|
82
|
-
node = AndNode.create(node, exprs[i].toOperationNode());
|
|
83
|
-
}
|
|
84
|
-
return new ExpressionWrapper(ParensNode.create(node));
|
|
101
|
+
return new ExpressionWrapper(parseFilterObject(exprs, 'and'));
|
|
85
102
|
},
|
|
86
103
|
or(exprs) {
|
|
87
|
-
if (exprs
|
|
88
|
-
return new ExpressionWrapper(
|
|
89
|
-
}
|
|
90
|
-
else if (exprs.length === 1) {
|
|
91
|
-
return new ExpressionWrapper(exprs[0].toOperationNode());
|
|
92
|
-
}
|
|
93
|
-
let node = OrNode.create(exprs[0].toOperationNode(), exprs[1].toOperationNode());
|
|
94
|
-
for (let i = 2; i < exprs.length; ++i) {
|
|
95
|
-
node = OrNode.create(node, exprs[i].toOperationNode());
|
|
104
|
+
if (isReadonlyArray(exprs)) {
|
|
105
|
+
return new ExpressionWrapper(parseFilterList(exprs, 'or'));
|
|
96
106
|
}
|
|
97
|
-
return new ExpressionWrapper(
|
|
107
|
+
return new ExpressionWrapper(parseFilterObject(exprs, 'or'));
|
|
98
108
|
},
|
|
99
109
|
parens(...args) {
|
|
100
110
|
const node = parseValueBinaryOperationOrExpression(args);
|