kysely 0.23.4 → 0.24.0
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 +49 -25
- package/dist/cjs/dialect/database-introspector.d.ts +4 -2
- package/dist/cjs/dialect/mysql/mysql-adapter.js +2 -2
- package/dist/cjs/dialect/mysql/mysql-driver.d.ts +1 -1
- package/dist/cjs/dialect/mysql/mysql-driver.js +1 -1
- package/dist/cjs/dialect/mysql/mysql-introspector.d.ts +1 -1
- package/dist/cjs/dialect/mysql/mysql-introspector.js +19 -13
- package/dist/cjs/dialect/postgres/postgres-adapter.js +1 -1
- package/dist/cjs/dialect/postgres/postgres-introspector.d.ts +1 -1
- package/dist/cjs/dialect/postgres/postgres-introspector.js +3 -1
- package/dist/cjs/dialect/sqlite/sqlite-dialect.d.ts +1 -0
- package/dist/cjs/dialect/sqlite/sqlite-dialect.js +1 -0
- package/dist/cjs/dialect/sqlite/sqlite-introspector.d.ts +1 -1
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +6 -5
- package/dist/cjs/driver/runtime-driver.js +4 -2
- package/dist/cjs/expression/expression-builder.d.ts +386 -0
- package/dist/cjs/expression/expression-builder.js +92 -0
- package/dist/cjs/expression/expression-wrapper.d.ts +92 -0
- package/dist/cjs/expression/expression-wrapper.js +54 -0
- package/dist/cjs/expression/expression.d.ts +1 -1
- package/dist/cjs/helpers/postgres.d.ts +133 -0
- package/dist/cjs/helpers/postgres.js +141 -0
- package/dist/cjs/index.d.ts +4 -3
- package/dist/cjs/index.js +4 -2
- package/dist/cjs/kysely.d.ts +10 -0
- package/dist/cjs/kysely.js +12 -1
- package/dist/cjs/migration/file-migration-provider.d.ts +5 -2
- package/dist/cjs/migration/migrator.d.ts +5 -2
- package/dist/cjs/operation-node/aggregate-function-node.d.ts +3 -2
- package/dist/cjs/operation-node/aggregate-function-node.js +2 -2
- package/dist/cjs/operation-node/create-index-node.d.ts +2 -0
- package/dist/cjs/operation-node/delete-query-node.d.ts +1 -2
- package/dist/cjs/operation-node/delete-query-node.js +2 -8
- package/dist/cjs/operation-node/function-node.d.ts +13 -0
- package/dist/cjs/operation-node/function-node.js +19 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +11 -2
- 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 +13 -2
- package/dist/cjs/operation-node/operator-node.js +38 -3
- package/dist/cjs/operation-node/query-node.d.ts +25 -8
- package/dist/cjs/operation-node/query-node.js +9 -2
- package/dist/cjs/operation-node/select-query-node.d.ts +0 -1
- package/dist/cjs/operation-node/select-query-node.js +0 -6
- package/dist/cjs/operation-node/update-query-node.d.ts +0 -1
- package/dist/cjs/operation-node/update-query-node.js +0 -6
- package/dist/cjs/parser/binary-operation-parser.d.ts +9 -10
- package/dist/cjs/parser/binary-operation-parser.js +89 -39
- package/dist/cjs/parser/coalesce-parser.d.ts +0 -2
- package/dist/cjs/parser/coalesce-parser.js +0 -9
- package/dist/cjs/parser/expression-parser.d.ts +7 -3
- package/dist/cjs/parser/expression-parser.js +4 -4
- package/dist/cjs/parser/group-by-parser.d.ts +3 -2
- package/dist/cjs/parser/group-by-parser.js +3 -0
- package/dist/cjs/parser/insert-values-parser.d.ts +4 -1
- package/dist/cjs/parser/insert-values-parser.js +19 -13
- package/dist/cjs/parser/join-parser.js +1 -1
- package/dist/cjs/parser/parse-utils.d.ts +0 -2
- package/dist/cjs/parser/parse-utils.js +1 -8
- package/dist/cjs/parser/returning-parser.d.ts +2 -1
- package/dist/cjs/parser/select-parser.d.ts +5 -13
- package/dist/cjs/parser/select-parser.js +8 -4
- package/dist/cjs/parser/table-parser.d.ts +6 -3
- package/dist/cjs/parser/unary-operation-parser.d.ts +5 -2
- package/dist/cjs/parser/unary-operation-parser.js +9 -8
- package/dist/cjs/parser/update-set-parser.d.ts +4 -1
- package/dist/cjs/parser/update-set-parser.js +9 -4
- package/dist/cjs/parser/value-parser.d.ts +5 -0
- package/dist/cjs/parser/value-parser.js +1 -3
- package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +7 -0
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +10 -4
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +1 -1
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +40 -113
- package/dist/cjs/query-builder/aggregate-function-builder.js +23 -63
- package/dist/cjs/query-builder/delete-query-builder.d.ts +224 -205
- package/dist/cjs/query-builder/delete-query-builder.js +21 -27
- package/dist/cjs/query-builder/delete-result.js +3 -0
- package/dist/cjs/query-builder/deprecated-having-expression-builder.d.ts +62 -0
- package/dist/cjs/query-builder/deprecated-having-expression-builder.js +2 -0
- package/dist/cjs/query-builder/deprecated-on-expression-builder.d.ts +62 -0
- package/dist/cjs/query-builder/deprecated-on-expression-builder.js +2 -0
- package/dist/cjs/query-builder/deprecated-where-expression-builder.d.ts +62 -0
- package/dist/cjs/query-builder/deprecated-where-expression-builder.js +2 -0
- package/dist/cjs/query-builder/function-module.d.ts +304 -42
- package/dist/cjs/query-builder/function-module.js +44 -208
- package/dist/cjs/query-builder/having-interface.d.ts +19 -16
- package/dist/cjs/query-builder/insert-query-builder.d.ts +78 -30
- package/dist/cjs/query-builder/insert-query-builder.js +21 -30
- package/dist/cjs/query-builder/insert-result.js +3 -0
- package/dist/cjs/query-builder/join-builder.d.ts +23 -26
- package/dist/cjs/query-builder/join-builder.js +17 -22
- package/dist/cjs/query-builder/no-result-error.d.ts +1 -0
- package/dist/cjs/query-builder/no-result-error.js +5 -1
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +158 -276
- package/dist/cjs/query-builder/on-conflict-builder.js +52 -36
- package/dist/cjs/query-builder/over-builder.d.ts +5 -0
- package/dist/cjs/query-builder/over-builder.js +7 -0
- package/dist/cjs/query-builder/returning-interface.d.ts +2 -2
- package/dist/cjs/query-builder/select-query-builder.d.ts +155 -243
- package/dist/cjs/query-builder/select-query-builder.js +333 -78
- package/dist/cjs/query-builder/update-query-builder.d.ts +149 -217
- package/dist/cjs/query-builder/update-query-builder.js +21 -115
- package/dist/cjs/query-builder/update-result.js +3 -0
- package/dist/cjs/query-builder/where-interface.d.ts +71 -184
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +3 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +18 -2
- package/dist/cjs/query-creator.d.ts +38 -2
- package/dist/cjs/query-creator.js +3 -45
- package/dist/cjs/query-executor/query-executor.d.ts +3 -3
- package/dist/cjs/raw-builder/raw-builder.d.ts +5 -3
- package/dist/cjs/raw-builder/raw-builder.js +13 -7
- package/dist/cjs/raw-builder/sql.d.ts +17 -9
- package/dist/cjs/raw-builder/sql.js +8 -2
- package/dist/cjs/schema/alter-column-builder.d.ts +5 -0
- package/dist/cjs/schema/alter-column-builder.js +7 -0
- package/dist/cjs/schema/alter-table-add-foreign-key-constraint-builder.d.ts +5 -0
- package/dist/cjs/schema/alter-table-add-foreign-key-constraint-builder.js +7 -0
- package/dist/cjs/schema/alter-table-drop-constraint-builder.d.ts +5 -0
- package/dist/cjs/schema/alter-table-drop-constraint-builder.js +7 -0
- package/dist/cjs/schema/column-definition-builder.d.ts +6 -1
- package/dist/cjs/schema/column-definition-builder.js +8 -1
- package/dist/cjs/schema/create-index-builder.d.ts +51 -9
- package/dist/cjs/schema/create-index-builder.js +17 -0
- package/dist/cjs/schema/create-schema-builder.d.ts +5 -0
- package/dist/cjs/schema/create-schema-builder.js +7 -0
- package/dist/cjs/schema/create-table-builder.d.ts +3 -1
- package/dist/cjs/schema/create-table-builder.js +3 -1
- package/dist/cjs/schema/create-type-builder.d.ts +5 -0
- package/dist/cjs/schema/create-type-builder.js +7 -0
- package/dist/cjs/schema/create-view-builder.d.ts +5 -0
- package/dist/cjs/schema/create-view-builder.js +7 -0
- package/dist/cjs/schema/drop-index-builder.d.ts +5 -0
- package/dist/cjs/schema/drop-index-builder.js +7 -0
- package/dist/cjs/schema/drop-schema-builder.d.ts +5 -0
- package/dist/cjs/schema/drop-schema-builder.js +7 -0
- package/dist/cjs/schema/drop-table-builder.d.ts +5 -0
- package/dist/cjs/schema/drop-table-builder.js +7 -0
- package/dist/cjs/schema/drop-type-builder.d.ts +5 -0
- package/dist/cjs/schema/drop-type-builder.js +7 -0
- package/dist/cjs/schema/drop-view-builder.d.ts +5 -0
- package/dist/cjs/schema/drop-view-builder.js +7 -0
- package/dist/cjs/schema/foreign-key-constraint-builder.d.ts +5 -0
- package/dist/cjs/schema/foreign-key-constraint-builder.js +7 -0
- package/dist/cjs/util/compilable.d.ts +1 -0
- package/dist/cjs/util/compilable.js +6 -0
- package/dist/cjs/util/explainable.d.ts +35 -0
- package/dist/cjs/util/log.d.ts +2 -0
- package/dist/cjs/util/object-utils.js +1 -1
- package/dist/cjs/util/streamable.d.ts +29 -0
- package/dist/cjs/util/streamable.js +2 -0
- package/dist/cjs/util/type-utils.d.ts +6 -4
- package/dist/esm/dialect/database-introspector.d.ts +4 -2
- package/dist/esm/dialect/mysql/mysql-adapter.js +2 -2
- package/dist/esm/dialect/mysql/mysql-driver.d.ts +1 -1
- package/dist/esm/dialect/mysql/mysql-driver.js +1 -1
- package/dist/esm/dialect/mysql/mysql-introspector.d.ts +1 -1
- package/dist/esm/dialect/mysql/mysql-introspector.js +19 -13
- package/dist/esm/dialect/postgres/postgres-adapter.js +1 -1
- package/dist/esm/dialect/postgres/postgres-introspector.d.ts +1 -1
- package/dist/esm/dialect/postgres/postgres-introspector.js +3 -1
- package/dist/esm/dialect/sqlite/sqlite-dialect.d.ts +1 -0
- package/dist/esm/dialect/sqlite/sqlite-dialect.js +1 -0
- package/dist/esm/dialect/sqlite/sqlite-introspector.d.ts +1 -1
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +6 -5
- package/dist/esm/driver/runtime-driver.js +4 -2
- package/dist/esm/expression/expression-builder.d.ts +386 -0
- package/dist/esm/expression/expression-builder.js +88 -0
- package/dist/esm/expression/expression-wrapper.d.ts +92 -0
- package/dist/esm/expression/expression-wrapper.js +50 -0
- package/dist/esm/expression/expression.d.ts +1 -1
- package/dist/esm/helpers/postgres.d.ts +133 -0
- package/dist/esm/helpers/postgres.js +136 -0
- package/dist/esm/index.d.ts +4 -3
- package/dist/esm/index.js +2 -1
- package/dist/esm/kysely.d.ts +10 -0
- package/dist/esm/kysely.js +13 -2
- package/dist/esm/migration/file-migration-provider.d.ts +5 -2
- package/dist/esm/migration/migrator.d.ts +5 -2
- package/dist/esm/operation-node/aggregate-function-node.d.ts +3 -2
- package/dist/esm/operation-node/aggregate-function-node.js +2 -2
- package/dist/esm/operation-node/create-index-node.d.ts +2 -0
- package/dist/esm/operation-node/delete-query-node.d.ts +1 -2
- package/dist/esm/operation-node/delete-query-node.js +2 -8
- package/dist/esm/operation-node/function-node.d.ts +13 -0
- package/dist/esm/operation-node/function-node.js +17 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.js +11 -2
- 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 +13 -2
- package/dist/esm/operation-node/operator-node.js +34 -3
- package/dist/esm/operation-node/query-node.d.ts +25 -8
- package/dist/esm/operation-node/query-node.js +9 -2
- package/dist/esm/operation-node/select-query-node.d.ts +0 -1
- package/dist/esm/operation-node/select-query-node.js +0 -6
- package/dist/esm/operation-node/update-query-node.d.ts +0 -1
- package/dist/esm/operation-node/update-query-node.js +0 -6
- package/dist/esm/parser/binary-operation-parser.d.ts +9 -10
- package/dist/esm/parser/binary-operation-parser.js +85 -37
- package/dist/esm/parser/coalesce-parser.d.ts +0 -2
- package/dist/esm/parser/coalesce-parser.js +1 -7
- package/dist/esm/parser/expression-parser.d.ts +7 -3
- package/dist/esm/parser/expression-parser.js +5 -5
- package/dist/esm/parser/group-by-parser.d.ts +3 -2
- package/dist/esm/parser/group-by-parser.js +3 -0
- package/dist/esm/parser/insert-values-parser.d.ts +4 -1
- package/dist/esm/parser/insert-values-parser.js +18 -12
- package/dist/esm/parser/join-parser.js +2 -2
- package/dist/esm/parser/parse-utils.d.ts +0 -2
- package/dist/esm/parser/parse-utils.js +0 -6
- package/dist/esm/parser/returning-parser.d.ts +2 -1
- package/dist/esm/parser/select-parser.d.ts +5 -13
- package/dist/esm/parser/select-parser.js +7 -3
- package/dist/esm/parser/table-parser.d.ts +6 -3
- package/dist/esm/parser/unary-operation-parser.d.ts +5 -2
- package/dist/esm/parser/unary-operation-parser.js +8 -8
- package/dist/esm/parser/update-set-parser.d.ts +4 -1
- package/dist/esm/parser/update-set-parser.js +7 -2
- package/dist/esm/parser/value-parser.d.ts +5 -0
- package/dist/esm/parser/value-parser.js +1 -3
- package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +7 -0
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +10 -4
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +1 -1
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +40 -113
- package/dist/esm/query-builder/aggregate-function-builder.js +24 -64
- package/dist/esm/query-builder/delete-query-builder.d.ts +224 -205
- package/dist/esm/query-builder/delete-query-builder.js +24 -30
- package/dist/esm/query-builder/delete-result.js +3 -0
- package/dist/esm/query-builder/deprecated-having-expression-builder.d.ts +62 -0
- package/dist/esm/query-builder/deprecated-having-expression-builder.js +2 -0
- package/dist/esm/query-builder/deprecated-on-expression-builder.d.ts +62 -0
- package/dist/esm/query-builder/deprecated-on-expression-builder.js +2 -0
- package/dist/esm/query-builder/deprecated-where-expression-builder.d.ts +62 -0
- package/dist/esm/query-builder/deprecated-where-expression-builder.js +2 -0
- package/dist/esm/query-builder/function-module.d.ts +304 -42
- package/dist/esm/query-builder/function-module.js +43 -207
- package/dist/esm/query-builder/having-interface.d.ts +19 -16
- package/dist/esm/query-builder/insert-query-builder.d.ts +78 -30
- package/dist/esm/query-builder/insert-query-builder.js +25 -34
- package/dist/esm/query-builder/insert-result.js +3 -0
- package/dist/esm/query-builder/join-builder.d.ts +23 -26
- package/dist/esm/query-builder/join-builder.js +18 -23
- package/dist/esm/query-builder/no-result-error.d.ts +1 -0
- package/dist/esm/query-builder/no-result-error.js +3 -0
- package/dist/esm/query-builder/on-conflict-builder.d.ts +158 -276
- package/dist/esm/query-builder/on-conflict-builder.js +54 -38
- package/dist/esm/query-builder/over-builder.d.ts +5 -0
- package/dist/esm/query-builder/over-builder.js +7 -0
- package/dist/esm/query-builder/returning-interface.d.ts +2 -2
- package/dist/esm/query-builder/select-query-builder.d.ts +155 -243
- package/dist/esm/query-builder/select-query-builder.js +337 -82
- package/dist/esm/query-builder/update-query-builder.d.ts +149 -217
- package/dist/esm/query-builder/update-query-builder.js +25 -119
- package/dist/esm/query-builder/update-result.js +3 -0
- package/dist/esm/query-builder/where-interface.d.ts +71 -184
- package/dist/esm/query-compiler/default-query-compiler.d.ts +3 -0
- package/dist/esm/query-compiler/default-query-compiler.js +18 -2
- package/dist/esm/query-creator.d.ts +38 -2
- package/dist/esm/query-creator.js +3 -45
- package/dist/esm/query-executor/query-executor.d.ts +3 -3
- package/dist/esm/raw-builder/raw-builder.d.ts +5 -3
- package/dist/esm/raw-builder/raw-builder.js +13 -7
- package/dist/esm/raw-builder/sql.d.ts +17 -9
- package/dist/esm/raw-builder/sql.js +8 -2
- package/dist/esm/schema/alter-column-builder.d.ts +5 -0
- package/dist/esm/schema/alter-column-builder.js +7 -0
- package/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.d.ts +5 -0
- package/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.js +7 -0
- package/dist/esm/schema/alter-table-drop-constraint-builder.d.ts +5 -0
- package/dist/esm/schema/alter-table-drop-constraint-builder.js +7 -0
- package/dist/esm/schema/column-definition-builder.d.ts +6 -1
- package/dist/esm/schema/column-definition-builder.js +8 -1
- package/dist/esm/schema/create-index-builder.d.ts +51 -9
- package/dist/esm/schema/create-index-builder.js +17 -0
- package/dist/esm/schema/create-schema-builder.d.ts +5 -0
- package/dist/esm/schema/create-schema-builder.js +7 -0
- package/dist/esm/schema/create-table-builder.d.ts +3 -1
- package/dist/esm/schema/create-table-builder.js +3 -1
- package/dist/esm/schema/create-type-builder.d.ts +5 -0
- package/dist/esm/schema/create-type-builder.js +7 -0
- package/dist/esm/schema/create-view-builder.d.ts +5 -0
- package/dist/esm/schema/create-view-builder.js +7 -0
- package/dist/esm/schema/drop-index-builder.d.ts +5 -0
- package/dist/esm/schema/drop-index-builder.js +7 -0
- package/dist/esm/schema/drop-schema-builder.d.ts +5 -0
- package/dist/esm/schema/drop-schema-builder.js +7 -0
- package/dist/esm/schema/drop-table-builder.d.ts +5 -0
- package/dist/esm/schema/drop-table-builder.js +7 -0
- package/dist/esm/schema/drop-type-builder.d.ts +5 -0
- package/dist/esm/schema/drop-type-builder.js +7 -0
- package/dist/esm/schema/drop-view-builder.d.ts +5 -0
- package/dist/esm/schema/drop-view-builder.js +7 -0
- package/dist/esm/schema/foreign-key-constraint-builder.d.ts +5 -0
- package/dist/esm/schema/foreign-key-constraint-builder.js +7 -0
- package/dist/esm/util/compilable.d.ts +1 -0
- package/dist/esm/util/compilable.js +4 -1
- package/dist/esm/util/explainable.d.ts +35 -0
- package/dist/esm/util/log.d.ts +2 -0
- package/dist/esm/util/object-utils.js +1 -1
- package/dist/esm/util/streamable.d.ts +29 -0
- package/dist/esm/util/streamable.js +2 -0
- package/dist/esm/util/type-utils.d.ts +6 -4
- package/helpers/postgres.d.ts +1 -0
- package/helpers/postgres.js +1 -0
- package/package.json +20 -9
- package/dist/cjs/query-builder/expression-builder.d.ts +0 -126
- package/dist/cjs/query-builder/expression-builder.js +0 -107
- package/dist/esm/query-builder/expression-builder.d.ts +0 -126
- package/dist/esm/query-builder/expression-builder.js +0 -104
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
|
|
2
|
+
import { TableExpression, From, FromTables, ExtractTableAlias, AnyAliasedTable, PickTableWithAlias } from '../parser/table-parser.js';
|
|
3
|
+
import { FunctionModule } from '../query-builder/function-module.js';
|
|
4
|
+
import { ExtractTypeFromReferenceExpression, ReferenceExpression, StringReference } from '../parser/reference-parser.js';
|
|
5
|
+
import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
6
|
+
import { BinaryOperatorExpression, ComparisonOperatorExpression, OperandValueExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
|
|
7
|
+
import { Expression } from './expression.js';
|
|
8
|
+
import { ExpressionWrapper } from './expression-wrapper.js';
|
|
9
|
+
import { ComparisonOperator, UnaryOperator } from '../operation-node/operator-node.js';
|
|
10
|
+
import { SqlBool } from '../util/type-utils.js';
|
|
11
|
+
import { ExtractTypeFromValueExpressionOrList } from '../parser/value-parser.js';
|
|
12
|
+
export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
13
|
+
/**
|
|
14
|
+
* Returns a {@link FunctionModule} that can be used to write type safe function
|
|
15
|
+
* calls.
|
|
16
|
+
*
|
|
17
|
+
* The difference between this and {@link Kysely.fn} is that this one is more
|
|
18
|
+
* type safe. You can only refer to columns visible to the part of the query
|
|
19
|
+
* you are building. {@link Kysely.fn} allows you to refer to columns in any
|
|
20
|
+
* table of the database even if it doesn't produce valid SQL.
|
|
21
|
+
*
|
|
22
|
+
* ```ts
|
|
23
|
+
* await db.selectFrom('person')
|
|
24
|
+
* .innerJoin('pet', 'pet.owner_id', 'person.id')
|
|
25
|
+
* .select((eb) => [
|
|
26
|
+
* 'person.id',
|
|
27
|
+
* eb.fn.count('pet.id').as('pet_count')
|
|
28
|
+
* ])
|
|
29
|
+
* .groupBy('person.id')
|
|
30
|
+
* .having(count('pet.id'), '>', 10)
|
|
31
|
+
* .execute()
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* The generated SQL (PostgreSQL):
|
|
35
|
+
*
|
|
36
|
+
* ```sql
|
|
37
|
+
* select "person"."id", count("pet"."id") as "pet_count"
|
|
38
|
+
* from "person"
|
|
39
|
+
* inner join "pet" on "pet"."owner_id" = "person"."id"
|
|
40
|
+
* group by "person"."id"
|
|
41
|
+
* having count("pet"."id") > $1
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
get fn(): FunctionModule<DB, TB>;
|
|
45
|
+
/**
|
|
46
|
+
* Creates a subquery.
|
|
47
|
+
*
|
|
48
|
+
* The query builder returned by this method is typed in a way that you can refer to
|
|
49
|
+
* all tables of the parent query in addition to the subquery's tables.
|
|
50
|
+
*
|
|
51
|
+
* This method accepts all the same inputs as {@link QueryCreator.selectFrom}.
|
|
52
|
+
*
|
|
53
|
+
* ### Examples
|
|
54
|
+
*
|
|
55
|
+
* This example shows that you can refer to both `pet.owner_id` and `person.id`
|
|
56
|
+
* columns from the subquery. This is needed to be able to create correlated
|
|
57
|
+
* subqueries:
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* const result = await db.selectFrom('pet')
|
|
61
|
+
* .select((eb) => [
|
|
62
|
+
* 'pet.name',
|
|
63
|
+
* eb.selectFrom('person')
|
|
64
|
+
* .whereRef('person.id', '=', 'pet.owner_id')
|
|
65
|
+
* .select('person.first_name')
|
|
66
|
+
* .as('owner_name')
|
|
67
|
+
* ])
|
|
68
|
+
* .execute()
|
|
69
|
+
*
|
|
70
|
+
* console.log(result[0].owner_name)
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* The generated SQL (PostgreSQL):
|
|
74
|
+
*
|
|
75
|
+
* ```sql
|
|
76
|
+
* select
|
|
77
|
+
* "pet"."name",
|
|
78
|
+
* ( select "person"."first_name"
|
|
79
|
+
* from "person"
|
|
80
|
+
* where "person"."id" = "pet"."owner_id"
|
|
81
|
+
* ) as "owner_name"
|
|
82
|
+
* from "pet"
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* You can use a normal query in place of `(qb) => qb.selectFrom(...)` but in
|
|
86
|
+
* that case Kysely typings wouldn't allow you to reference `pet.owner_id`
|
|
87
|
+
* because `pet` is not joined to that query.
|
|
88
|
+
*/
|
|
89
|
+
selectFrom<TE extends keyof DB & string>(from: TE[]): SelectQueryBuilder<DB, TB | ExtractTableAlias<DB, TE>, {}>;
|
|
90
|
+
selectFrom<TE extends TableExpression<DB, TB>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
|
|
91
|
+
selectFrom<TE extends keyof DB & string>(from: TE): SelectQueryBuilder<DB, TB | ExtractTableAlias<DB, TE>, {}>;
|
|
92
|
+
selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, TB | ExtractTableAlias<DB, TE>, {}>;
|
|
93
|
+
selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
|
|
94
|
+
/**
|
|
95
|
+
* This can be used to reference columns.
|
|
96
|
+
*
|
|
97
|
+
* ### Examples
|
|
98
|
+
*
|
|
99
|
+
* By default the third argument of {@link bxp} and {@link cmpr} is a value.
|
|
100
|
+
* This function can be used to pass in a column reference instead:
|
|
101
|
+
*
|
|
102
|
+
* ```ts
|
|
103
|
+
* db.selectFrom('person')
|
|
104
|
+
* .selectAll('person')
|
|
105
|
+
* .where(({ or, cmpr, ref }) => or([
|
|
106
|
+
* cmpr('first_name', '=', ref('last_name')),
|
|
107
|
+
* cmpr('first_name', '=', ref('middle_name'))
|
|
108
|
+
* ]))
|
|
109
|
+
* ```
|
|
110
|
+
*
|
|
111
|
+
* In the next example we use the `ref` method to reference
|
|
112
|
+
* columns of the virtual table `excluded` in a type-safe way
|
|
113
|
+
* to create an upsert operation:
|
|
114
|
+
*
|
|
115
|
+
* ```ts
|
|
116
|
+
* db.insertInto('person')
|
|
117
|
+
* .values(person)
|
|
118
|
+
* .onConflict((oc) => oc
|
|
119
|
+
* .column('id')
|
|
120
|
+
* .doUpdateSet(({ ref }) => ({
|
|
121
|
+
* first_name: ref('excluded.first_name'),
|
|
122
|
+
* last_name: ref('excluded.last_name')
|
|
123
|
+
* }))
|
|
124
|
+
* )
|
|
125
|
+
* ```
|
|
126
|
+
*
|
|
127
|
+
* In the next example we use `ref` in a raw sql expression. Unless you
|
|
128
|
+
* want to be as type-safe as possible, this is probably overkill:
|
|
129
|
+
*
|
|
130
|
+
* ```ts
|
|
131
|
+
* db.update('pet').set((eb) => ({
|
|
132
|
+
* name: sql`concat(${eb.ref('pet.name')}, ${suffix})`
|
|
133
|
+
* }))
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
ref<RE extends StringReference<DB, TB>>(reference: RE): ExpressionWrapper<ExtractTypeFromReferenceExpression<DB, TB, RE>>;
|
|
137
|
+
/**
|
|
138
|
+
* Returns a value expression.
|
|
139
|
+
*
|
|
140
|
+
* This can be used to pass in a value where a reference is taken by default.
|
|
141
|
+
*
|
|
142
|
+
* This function returns an {@link Expression} and can be used pretty much anywhere.
|
|
143
|
+
*
|
|
144
|
+
* ### Examples
|
|
145
|
+
*
|
|
146
|
+
* The {@link cmpr} function takes a reference by default as the first argument. `val` could
|
|
147
|
+
* be used to pass in a value instead:
|
|
148
|
+
*
|
|
149
|
+
* ```ts
|
|
150
|
+
* cmpr(val(38), '=', ref('age'))
|
|
151
|
+
* ```
|
|
152
|
+
*
|
|
153
|
+
* The generated SQL (PostgreSQL):
|
|
154
|
+
*
|
|
155
|
+
* ```sql
|
|
156
|
+
* $1 = "age"
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
val<VE>(value: VE): ExpressionWrapper<ExtractTypeFromValueExpressionOrList<VE>>;
|
|
160
|
+
/**
|
|
161
|
+
* Creates a binary comparison expression.
|
|
162
|
+
*
|
|
163
|
+
* This function returns an {@link Expression} and can be used pretty much anywhere.
|
|
164
|
+
* See the examples for a couple of possible use cases.
|
|
165
|
+
*
|
|
166
|
+
* @see {@link bxp}
|
|
167
|
+
*
|
|
168
|
+
* ### Examples
|
|
169
|
+
*
|
|
170
|
+
* In this example we use `cmpr` and {@link or} to create a `WHERE expr1 OR expr2 OR expr3`
|
|
171
|
+
* statement:
|
|
172
|
+
*
|
|
173
|
+
* ```ts
|
|
174
|
+
* db.selectFrom('person')
|
|
175
|
+
* .selectAll('person')
|
|
176
|
+
* .where(({ or, cmpr }) => or([
|
|
177
|
+
* cmpr('first_name', '=', 'Jennifer'),
|
|
178
|
+
* cmpr('fist_name', '=', 'Arnold'),
|
|
179
|
+
* cmpr('fist_name', '=', 'Sylvester')
|
|
180
|
+
* ]))
|
|
181
|
+
* ```
|
|
182
|
+
*
|
|
183
|
+
* The generated SQL (PostgreSQL):
|
|
184
|
+
*
|
|
185
|
+
* ```sql
|
|
186
|
+
* select "person".*
|
|
187
|
+
* from "person"
|
|
188
|
+
* where "first_name" = $1
|
|
189
|
+
* or "first_name" = $2
|
|
190
|
+
* or "first_name" = $3
|
|
191
|
+
* ```
|
|
192
|
+
*
|
|
193
|
+
* By default the third argument is a value. {@link ref} can be used to
|
|
194
|
+
* pass in a column reference instead:
|
|
195
|
+
*
|
|
196
|
+
* ```ts
|
|
197
|
+
* db.selectFrom('person')
|
|
198
|
+
* .selectAll('person')
|
|
199
|
+
* .where(({ or, cmpr, ref }) => or([
|
|
200
|
+
* cmpr('first_name', '=', ref('last_name')),
|
|
201
|
+
* cmpr('first_name', '=', ref('middle_name'))
|
|
202
|
+
* ]))
|
|
203
|
+
* ```
|
|
204
|
+
*
|
|
205
|
+
* The generated SQL (PostgreSQL):
|
|
206
|
+
*
|
|
207
|
+
* ```sql
|
|
208
|
+
* select "person".*
|
|
209
|
+
* from "person"
|
|
210
|
+
* where "first_name" = "last_name"
|
|
211
|
+
* or "first_name" = "middle_name"
|
|
212
|
+
* ```
|
|
213
|
+
*/
|
|
214
|
+
cmpr<O extends SqlBool = SqlBool, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): ExpressionWrapper<O>;
|
|
215
|
+
/**
|
|
216
|
+
* Creates a binary expression.
|
|
217
|
+
*
|
|
218
|
+
* See {@link cmpr} for creating binary comparison operations.
|
|
219
|
+
*
|
|
220
|
+
* This function returns an {@link Expression} and can be used pretty much anywhere.
|
|
221
|
+
* See the examples for a couple of possible use cases.
|
|
222
|
+
*
|
|
223
|
+
* ### Examples
|
|
224
|
+
*
|
|
225
|
+
* In the following example `bxp` is used to increment an integer column:
|
|
226
|
+
*
|
|
227
|
+
* ```ts
|
|
228
|
+
* db.updateTable('person')
|
|
229
|
+
* .set((eb) => ({
|
|
230
|
+
* age: eb.bxp('age', '+', 1)
|
|
231
|
+
* }))
|
|
232
|
+
* .where('id', '=', id)
|
|
233
|
+
* ```
|
|
234
|
+
*
|
|
235
|
+
* The generated SQL (PostgreSQL):
|
|
236
|
+
*
|
|
237
|
+
* ```sql
|
|
238
|
+
* update "person"
|
|
239
|
+
* set "age" = "age" + $1
|
|
240
|
+
* where "id" = $2
|
|
241
|
+
* ```
|
|
242
|
+
*
|
|
243
|
+
* By default the third argument is a value. {@link ref} can be used to
|
|
244
|
+
* pass in a column reference instead:
|
|
245
|
+
*
|
|
246
|
+
* ```ts
|
|
247
|
+
* db.updateTable('person')
|
|
248
|
+
* .set((eb) => ({
|
|
249
|
+
* age: eb.bxp('age', '+', eb.ref('age'))
|
|
250
|
+
* }))
|
|
251
|
+
* .where('id', '=', id)
|
|
252
|
+
* ```
|
|
253
|
+
*
|
|
254
|
+
* The generated SQL (PostgreSQL):
|
|
255
|
+
*
|
|
256
|
+
* ```sql
|
|
257
|
+
* update "person"
|
|
258
|
+
* set "age" = "age" + "age"
|
|
259
|
+
* where "id" = $1
|
|
260
|
+
* ```
|
|
261
|
+
*/
|
|
262
|
+
bxp<RE extends ReferenceExpression<DB, TB>, OP extends BinaryOperatorExpression>(lhs: RE, op: OP, rhs: OperandValueExpression<DB, TB, RE>): ExpressionWrapper<OP extends ComparisonOperator ? SqlBool : ExtractTypeFromReferenceExpression<DB, TB, RE>>;
|
|
263
|
+
/**
|
|
264
|
+
* Creates an unary expression.
|
|
265
|
+
*
|
|
266
|
+
* This function returns an {@link Expression} and can be used pretty much anywhere.
|
|
267
|
+
* See the examples for a couple of possible use cases.
|
|
268
|
+
*
|
|
269
|
+
* @see {@link not}, {@link exists} and {@link neg}.
|
|
270
|
+
*
|
|
271
|
+
* ### Examples
|
|
272
|
+
*
|
|
273
|
+
* ```ts
|
|
274
|
+
* db.selectFrom('person')
|
|
275
|
+
* .select((eb) => [
|
|
276
|
+
* 'first_name',
|
|
277
|
+
* eb.unary('-', 'age').as('negative_age')
|
|
278
|
+
* ])
|
|
279
|
+
* ```
|
|
280
|
+
*
|
|
281
|
+
* The generated SQL (PostgreSQL):
|
|
282
|
+
*
|
|
283
|
+
* ```sql
|
|
284
|
+
* select "first_name", -"age"
|
|
285
|
+
* from "person"
|
|
286
|
+
* ```
|
|
287
|
+
*/
|
|
288
|
+
unary<RE extends ReferenceExpression<DB, TB>>(op: UnaryOperator, expr: RE): ExpressionWrapper<ExtractTypeFromReferenceExpression<DB, TB, RE>>;
|
|
289
|
+
/**
|
|
290
|
+
* Creates a `not` operation.
|
|
291
|
+
*
|
|
292
|
+
* A shortcut for `unary('not', expr)`.
|
|
293
|
+
*
|
|
294
|
+
* @see {@link unary}
|
|
295
|
+
*/
|
|
296
|
+
not<RE extends ReferenceExpression<DB, TB>>(expr: RE): ExpressionWrapper<ExtractTypeFromReferenceExpression<DB, TB, RE>>;
|
|
297
|
+
/**
|
|
298
|
+
* Creates an `exists` operation.
|
|
299
|
+
*
|
|
300
|
+
* A shortcut for `unary('exists', expr)`.
|
|
301
|
+
*
|
|
302
|
+
* @see {@link unary}
|
|
303
|
+
*/
|
|
304
|
+
exists<RE extends ReferenceExpression<DB, TB>>(expr: RE): ExpressionWrapper<SqlBool>;
|
|
305
|
+
/**
|
|
306
|
+
* Creates a negation operation.
|
|
307
|
+
*
|
|
308
|
+
* A shortcut for `unary('-', expr)`.
|
|
309
|
+
*
|
|
310
|
+
* @see {@link unary}
|
|
311
|
+
*/
|
|
312
|
+
neg<RE extends ReferenceExpression<DB, TB>>(expr: RE): ExpressionWrapper<ExtractTypeFromReferenceExpression<DB, TB, RE>>;
|
|
313
|
+
/**
|
|
314
|
+
* Combines two or more expressions using the logical `and` operator.
|
|
315
|
+
*
|
|
316
|
+
* This function returns an {@link Expression} and can be used pretty much anywhere.
|
|
317
|
+
* See the examples for a couple of possible use cases.
|
|
318
|
+
*
|
|
319
|
+
* ### Examples
|
|
320
|
+
*
|
|
321
|
+
* In this example we use `and` with {@link cmpr} to create a `WHERE expr1 AND expr2 AND expr3`
|
|
322
|
+
* statement:
|
|
323
|
+
*
|
|
324
|
+
* ```ts
|
|
325
|
+
* db.selectFrom('person')
|
|
326
|
+
* .selectAll('person')
|
|
327
|
+
* .where(({ and, cmpr }) => and([
|
|
328
|
+
* cmpr('first_name', '=', 'Jennifer'),
|
|
329
|
+
* cmpr('fist_name', '=', 'Arnold'),
|
|
330
|
+
* cmpr('fist_name', '=', 'Sylvester')
|
|
331
|
+
* ]))
|
|
332
|
+
* ```
|
|
333
|
+
*
|
|
334
|
+
* The generated SQL (PostgreSQL):
|
|
335
|
+
*
|
|
336
|
+
* ```sql
|
|
337
|
+
* select "person".*
|
|
338
|
+
* from "person"
|
|
339
|
+
* where "first_name" = $1
|
|
340
|
+
* and "first_name" = $2
|
|
341
|
+
* and "first_name" = $3
|
|
342
|
+
* ```
|
|
343
|
+
*/
|
|
344
|
+
and(expres: ReadonlyArray<Expression<SqlBool>>): ExpressionWrapper<SqlBool>;
|
|
345
|
+
/**
|
|
346
|
+
* Combines two or more expressions using the logical `or` operator.
|
|
347
|
+
*
|
|
348
|
+
* This function returns an {@link Expression} and can be used pretty much anywhere.
|
|
349
|
+
* See the examples for a couple of possible use cases.
|
|
350
|
+
*
|
|
351
|
+
* ### Examples
|
|
352
|
+
*
|
|
353
|
+
* In this example we use `or` with {@link cmpr} to create a `WHERE expr1 OR expr2 OR expr3`
|
|
354
|
+
* statement:
|
|
355
|
+
*
|
|
356
|
+
* ```ts
|
|
357
|
+
* db.selectFrom('person')
|
|
358
|
+
* .selectAll('person')
|
|
359
|
+
* .where(({ or, cmpr }) => or([
|
|
360
|
+
* cmpr('first_name', '=', 'Jennifer'),
|
|
361
|
+
* cmpr('fist_name', '=', 'Arnold'),
|
|
362
|
+
* cmpr('fist_name', '=', 'Sylvester')
|
|
363
|
+
* ]))
|
|
364
|
+
* ```
|
|
365
|
+
*
|
|
366
|
+
* The generated SQL (PostgreSQL):
|
|
367
|
+
*
|
|
368
|
+
* ```sql
|
|
369
|
+
* select "person".*
|
|
370
|
+
* from "person"
|
|
371
|
+
* where "first_name" = $1
|
|
372
|
+
* or "first_name" = $2
|
|
373
|
+
* or "first_name" = $3
|
|
374
|
+
* ```
|
|
375
|
+
*/
|
|
376
|
+
or(expres: ReadonlyArray<Expression<SqlBool>>): ExpressionWrapper<SqlBool>;
|
|
377
|
+
/**
|
|
378
|
+
* See {@link QueryCreator.withSchema}
|
|
379
|
+
*
|
|
380
|
+
* @deprecated Will be removed in kysely 0.25.0.
|
|
381
|
+
*/
|
|
382
|
+
withSchema(schema: string): ExpressionBuilder<DB, TB>;
|
|
383
|
+
}
|
|
384
|
+
export declare function createExpressionBuilder<DB, TB extends keyof DB>(executor?: QueryExecutor): ExpressionBuilder<DB, TB>;
|
|
385
|
+
export declare function expressionBuilder<DB, TB extends keyof DB>(_: SelectQueryBuilder<DB, TB, any>): ExpressionBuilder<DB, TB>;
|
|
386
|
+
export declare function expressionBuilder<DB, TB extends keyof DB>(): ExpressionBuilder<DB, TB>;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/// <reference types="./expression-builder.d.ts" />
|
|
2
|
+
import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
|
|
3
|
+
import { SelectQueryNode } from '../operation-node/select-query-node.js';
|
|
4
|
+
import { parseTableExpressionOrList, } from '../parser/table-parser.js';
|
|
5
|
+
import { WithSchemaPlugin } from '../plugin/with-schema/with-schema-plugin.js';
|
|
6
|
+
import { createQueryId } from '../util/query-id.js';
|
|
7
|
+
import { createFunctionModule, } from '../query-builder/function-module.js';
|
|
8
|
+
import { parseStringReference, } from '../parser/reference-parser.js';
|
|
9
|
+
import { parseValueBinaryOperation, } from '../parser/binary-operation-parser.js';
|
|
10
|
+
import { AndNode } from '../operation-node/and-node.js';
|
|
11
|
+
import { OrNode } from '../operation-node/or-node.js';
|
|
12
|
+
import { ParensNode } from '../operation-node/parens-node.js';
|
|
13
|
+
import { ExpressionWrapper } from './expression-wrapper.js';
|
|
14
|
+
import { parseUnaryOperation } from '../parser/unary-operation-parser.js';
|
|
15
|
+
import { parseValueExpressionOrList, } from '../parser/value-parser.js';
|
|
16
|
+
import { NOOP_QUERY_EXECUTOR } from '../query-executor/noop-query-executor.js';
|
|
17
|
+
import { ValueNode } from '../operation-node/value-node.js';
|
|
18
|
+
export function createExpressionBuilder(executor = NOOP_QUERY_EXECUTOR) {
|
|
19
|
+
function unary(op, expr) {
|
|
20
|
+
return new ExpressionWrapper(parseUnaryOperation(op, expr));
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
get fn() {
|
|
24
|
+
return createFunctionModule();
|
|
25
|
+
},
|
|
26
|
+
selectFrom(table) {
|
|
27
|
+
return new SelectQueryBuilder({
|
|
28
|
+
queryId: createQueryId(),
|
|
29
|
+
executor: executor,
|
|
30
|
+
queryNode: SelectQueryNode.create(parseTableExpressionOrList(table)),
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
ref(reference) {
|
|
34
|
+
return new ExpressionWrapper(parseStringReference(reference));
|
|
35
|
+
},
|
|
36
|
+
val(value) {
|
|
37
|
+
return new ExpressionWrapper(parseValueExpressionOrList(value));
|
|
38
|
+
},
|
|
39
|
+
cmpr(lhs, op, rhs) {
|
|
40
|
+
return new ExpressionWrapper(parseValueBinaryOperation(lhs, op, rhs));
|
|
41
|
+
},
|
|
42
|
+
bxp(lhs, op, rhs) {
|
|
43
|
+
return new ExpressionWrapper(parseValueBinaryOperation(lhs, op, rhs));
|
|
44
|
+
},
|
|
45
|
+
unary,
|
|
46
|
+
not(expr) {
|
|
47
|
+
return unary('not', expr);
|
|
48
|
+
},
|
|
49
|
+
exists(expr) {
|
|
50
|
+
return unary('exists', expr);
|
|
51
|
+
},
|
|
52
|
+
neg(expr) {
|
|
53
|
+
return unary('-', expr);
|
|
54
|
+
},
|
|
55
|
+
and(exprs) {
|
|
56
|
+
if (exprs.length === 0) {
|
|
57
|
+
return new ExpressionWrapper(ValueNode.createImmediate(true));
|
|
58
|
+
}
|
|
59
|
+
else if (exprs.length === 1) {
|
|
60
|
+
return new ExpressionWrapper(exprs[0].toOperationNode());
|
|
61
|
+
}
|
|
62
|
+
let node = AndNode.create(exprs[0].toOperationNode(), exprs[1].toOperationNode());
|
|
63
|
+
for (let i = 2; i < exprs.length; ++i) {
|
|
64
|
+
node = AndNode.create(node, exprs[i].toOperationNode());
|
|
65
|
+
}
|
|
66
|
+
return new ExpressionWrapper(ParensNode.create(node));
|
|
67
|
+
},
|
|
68
|
+
or(exprs) {
|
|
69
|
+
if (exprs.length === 0) {
|
|
70
|
+
return new ExpressionWrapper(ValueNode.createImmediate(false));
|
|
71
|
+
}
|
|
72
|
+
else if (exprs.length === 1) {
|
|
73
|
+
return new ExpressionWrapper(exprs[0].toOperationNode());
|
|
74
|
+
}
|
|
75
|
+
let node = OrNode.create(exprs[0].toOperationNode(), exprs[1].toOperationNode());
|
|
76
|
+
for (let i = 2; i < exprs.length; ++i) {
|
|
77
|
+
node = OrNode.create(node, exprs[i].toOperationNode());
|
|
78
|
+
}
|
|
79
|
+
return new ExpressionWrapper(ParensNode.create(node));
|
|
80
|
+
},
|
|
81
|
+
withSchema(schema) {
|
|
82
|
+
return createExpressionBuilder(executor.withPluginAtFront(new WithSchemaPlugin(schema)));
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export function expressionBuilder(_) {
|
|
87
|
+
return createExpressionBuilder();
|
|
88
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { AliasNode } from '../operation-node/alias-node.js';
|
|
2
|
+
import { OperationNode } from '../operation-node/operation-node.js';
|
|
3
|
+
import { AliasedExpression, Expression } from './expression.js';
|
|
4
|
+
export declare class ExpressionWrapper<T> implements Expression<T> {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(node: OperationNode);
|
|
7
|
+
/** @private */
|
|
8
|
+
/**
|
|
9
|
+
* All expressions need to have this getter for complicated type-related reasons.
|
|
10
|
+
* Simply add this getter for your expression and always return `undefined` from it:
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* class SomeExpression<T> implements Expression<T> {
|
|
14
|
+
* get expressionType(): T | undefined {
|
|
15
|
+
* return undefined
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* The getter is needed to make the expression assignable to another expression only
|
|
21
|
+
* if the types `T` are assignable. Without this property (or some other property
|
|
22
|
+
* that references `T`), you could assing `Expression<string>` to `Expression<number>`.
|
|
23
|
+
*/
|
|
24
|
+
get expressionType(): T | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Returns an aliased version of the expression.
|
|
27
|
+
*
|
|
28
|
+
* In addition to slapping `as "the_alias"` to the end of the SQL,
|
|
29
|
+
* this method also provides strict typing:
|
|
30
|
+
*
|
|
31
|
+
* ```ts
|
|
32
|
+
* const result = await db
|
|
33
|
+
* .selectFrom('person')
|
|
34
|
+
* .select(eb =>
|
|
35
|
+
* eb.cmpr('first_name', '=', 'Jennifer').as('is_jennifer')
|
|
36
|
+
* )
|
|
37
|
+
* .executeTakeFirstOrThrow()
|
|
38
|
+
*
|
|
39
|
+
* // `is_jennifer: SqlBool` field exists in the result type.
|
|
40
|
+
* console.log(result.is_jennifer)
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* The generated SQL (PostgreSQL):
|
|
44
|
+
*
|
|
45
|
+
* ```ts
|
|
46
|
+
* select "first_name" = $1 as "is_jennifer"
|
|
47
|
+
* from "person"
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
as<A extends string>(alias: A): AliasedExpression<T, A>;
|
|
51
|
+
as<A extends string>(alias: Expression<unknown>): AliasedExpression<T, A>;
|
|
52
|
+
/**
|
|
53
|
+
* Change the output type of the raw expression.
|
|
54
|
+
*
|
|
55
|
+
* This method call doesn't change the SQL in any way. This methods simply
|
|
56
|
+
* returns a copy of this `ExpressionWrapper` with a new output type.
|
|
57
|
+
*/
|
|
58
|
+
$castTo<T>(): ExpressionWrapper<T>;
|
|
59
|
+
/**
|
|
60
|
+
* Creates the OperationNode that describes how to compile this expression into SQL.
|
|
61
|
+
*
|
|
62
|
+
* If you are creating a custom expression, it's often easiest to use the {@link sql}
|
|
63
|
+
* template tag to build the node:
|
|
64
|
+
*
|
|
65
|
+
* ```ts
|
|
66
|
+
* class SomeExpression<T> implements Expression<T> {
|
|
67
|
+
* toOperationNode(): OperationNode {
|
|
68
|
+
* return sql`some sql here`.toOperationNode()
|
|
69
|
+
* }
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
toOperationNode(): OperationNode;
|
|
74
|
+
}
|
|
75
|
+
export declare class AliasedExpressionWrapper<T, A extends string> implements AliasedExpression<T, A> {
|
|
76
|
+
#private;
|
|
77
|
+
constructor(expr: Expression<T>, alias: A | Expression<unknown>);
|
|
78
|
+
/** @private */
|
|
79
|
+
/**
|
|
80
|
+
* Returns the aliased expression.
|
|
81
|
+
*/
|
|
82
|
+
get expression(): Expression<T>;
|
|
83
|
+
/** @private */
|
|
84
|
+
/**
|
|
85
|
+
* Returns the alias.
|
|
86
|
+
*/
|
|
87
|
+
get alias(): A | Expression<unknown>;
|
|
88
|
+
/**
|
|
89
|
+
* Creates the OperationNode that describes how to compile this expression into SQL.
|
|
90
|
+
*/
|
|
91
|
+
toOperationNode(): AliasNode;
|
|
92
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/// <reference types="./expression-wrapper.d.ts" />
|
|
2
|
+
import { AliasNode } from '../operation-node/alias-node.js';
|
|
3
|
+
import { IdentifierNode } from '../operation-node/identifier-node.js';
|
|
4
|
+
import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
5
|
+
export class ExpressionWrapper {
|
|
6
|
+
#node;
|
|
7
|
+
constructor(node) {
|
|
8
|
+
this.#node = node;
|
|
9
|
+
}
|
|
10
|
+
/** @private */
|
|
11
|
+
get expressionType() {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
as(alias) {
|
|
15
|
+
return new AliasedExpressionWrapper(this, alias);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Change the output type of the raw expression.
|
|
19
|
+
*
|
|
20
|
+
* This method call doesn't change the SQL in any way. This methods simply
|
|
21
|
+
* returns a copy of this `ExpressionWrapper` with a new output type.
|
|
22
|
+
*/
|
|
23
|
+
$castTo() {
|
|
24
|
+
return new ExpressionWrapper(this.#node);
|
|
25
|
+
}
|
|
26
|
+
toOperationNode() {
|
|
27
|
+
return this.#node;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export class AliasedExpressionWrapper {
|
|
31
|
+
#expr;
|
|
32
|
+
#alias;
|
|
33
|
+
constructor(expr, alias) {
|
|
34
|
+
this.#expr = expr;
|
|
35
|
+
this.#alias = alias;
|
|
36
|
+
}
|
|
37
|
+
/** @private */
|
|
38
|
+
get expression() {
|
|
39
|
+
return this.#expr;
|
|
40
|
+
}
|
|
41
|
+
/** @private */
|
|
42
|
+
get alias() {
|
|
43
|
+
return this.#alias;
|
|
44
|
+
}
|
|
45
|
+
toOperationNode() {
|
|
46
|
+
return AliasNode.create(this.#expr.toOperationNode(), isOperationNodeSource(this.#alias)
|
|
47
|
+
? this.#alias.toOperationNode()
|
|
48
|
+
: IdentifierNode.create(this.#alias));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -90,7 +90,7 @@ export interface AliasedExpression<T, A extends string> extends OperationNodeSou
|
|
|
90
90
|
/**
|
|
91
91
|
* Returns the alias.
|
|
92
92
|
*/
|
|
93
|
-
get alias(): A
|
|
93
|
+
get alias(): A | Expression<unknown>;
|
|
94
94
|
/**
|
|
95
95
|
* Creates the OperationNode that describes how to compile this expression into SQL.
|
|
96
96
|
*/
|