kysely 0.23.5 → 0.24.1
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 +46 -24
- 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/postgres/postgres-adapter.js +1 -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/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/mysql.d.ts +140 -0
- package/dist/cjs/helpers/mysql.js +170 -0
- 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 -3
- package/dist/cjs/operation-node/create-index-node.d.ts +2 -0
- package/dist/cjs/operation-node/delete-query-node.d.ts +0 -1
- package/dist/cjs/operation-node/delete-query-node.js +0 -6
- 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 +9 -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 +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 +3 -3
- 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 +5 -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/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 +220 -201
- 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 +40 -12
- package/dist/cjs/query-builder/function-module.js +43 -329
- package/dist/cjs/query-builder/having-interface.d.ts +19 -16
- package/dist/cjs/query-builder/insert-query-builder.d.ts +75 -26
- package/dist/cjs/query-builder/insert-query-builder.js +21 -29
- 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 +148 -237
- package/dist/cjs/query-builder/select-query-builder.js +333 -78
- package/dist/cjs/query-builder/update-query-builder.d.ts +145 -213
- 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 +17 -1
- package/dist/cjs/query-creator.d.ts +9 -2
- package/dist/cjs/query-creator.js +1 -24
- 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 +1 -0
- 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/postgres/postgres-adapter.js +1 -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/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/mysql.d.ts +140 -0
- package/dist/esm/helpers/mysql.js +165 -0
- 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 -3
- package/dist/esm/operation-node/create-index-node.d.ts +2 -0
- package/dist/esm/operation-node/delete-query-node.d.ts +0 -1
- package/dist/esm/operation-node/delete-query-node.js +0 -6
- 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 +9 -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 +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 +3 -3
- 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 +5 -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/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 +220 -201
- 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 +40 -12
- package/dist/esm/query-builder/function-module.js +42 -328
- package/dist/esm/query-builder/having-interface.d.ts +19 -16
- package/dist/esm/query-builder/insert-query-builder.d.ts +75 -26
- package/dist/esm/query-builder/insert-query-builder.js +25 -33
- 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 +148 -237
- package/dist/esm/query-builder/select-query-builder.js +337 -82
- package/dist/esm/query-builder/update-query-builder.d.ts +145 -213
- 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 +17 -1
- package/dist/esm/query-creator.d.ts +9 -2
- package/dist/esm/query-creator.js +1 -24
- 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 +1 -0
- package/helpers/mysql.d.ts +1 -0
- package/helpers/mysql.js +1 -0
- package/helpers/postgres.d.ts +1 -0
- package/helpers/postgres.js +1 -0
- package/package.json +26 -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,140 @@
|
|
|
1
|
+
import { Expression } from '../expression/expression.js';
|
|
2
|
+
import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
|
|
3
|
+
import { RawBuilder } from '../raw-builder/raw-builder.js';
|
|
4
|
+
import { Simplify } from '../util/type-utils.js';
|
|
5
|
+
/**
|
|
6
|
+
* A MySQL helper for aggregating a subquery (or other expression) into a JSON array.
|
|
7
|
+
*
|
|
8
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
|
|
9
|
+
* While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
|
|
10
|
+
* may not parse the nested results into arrays.
|
|
11
|
+
*
|
|
12
|
+
* ### Examples
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* const result = await db
|
|
16
|
+
* .selectFrom('person')
|
|
17
|
+
* .select((eb) => [
|
|
18
|
+
* 'id',
|
|
19
|
+
* jsonArrayFrom(
|
|
20
|
+
* eb.selectFrom('pet')
|
|
21
|
+
* .select(['pet.id as pet_id', 'pet.name'])
|
|
22
|
+
* .where('pet.owner_id', '=', 'person.id')
|
|
23
|
+
* .orderBy('pet.name')
|
|
24
|
+
* ).as('pets')
|
|
25
|
+
* ])
|
|
26
|
+
* .execute()
|
|
27
|
+
*
|
|
28
|
+
* result[0].id
|
|
29
|
+
* result[0].pets[0].pet_id
|
|
30
|
+
* result[0].pets[0].name
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* The generated SQL (MySQL):
|
|
34
|
+
*
|
|
35
|
+
* ```sql
|
|
36
|
+
* select `id`, (
|
|
37
|
+
* select cast(coalesce(json_arrayagg(json_object(
|
|
38
|
+
* 'pet_id', `agg`.`pet_id`,
|
|
39
|
+
* 'name', `agg`.`name`
|
|
40
|
+
* )), '[]') as json) from (
|
|
41
|
+
* select `pet`.`id` as `pet_id`, `pet`.`name`
|
|
42
|
+
* from `pet`
|
|
43
|
+
* where `pet`.`owner_id` = `person`.`id`
|
|
44
|
+
* order by `pet`.`name`
|
|
45
|
+
* ) as `agg`
|
|
46
|
+
* ) as `pets`
|
|
47
|
+
* from `person`
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function jsonArrayFrom<O>(expr: SelectQueryBuilder<any, any, O>): RawBuilder<Simplify<O>[]>;
|
|
51
|
+
/**
|
|
52
|
+
* A MySQL helper for turning a subquery (or other expression) into a JSON object.
|
|
53
|
+
*
|
|
54
|
+
* The subquery must only return one row.
|
|
55
|
+
*
|
|
56
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
|
|
57
|
+
* While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
|
|
58
|
+
* may not parse the nested results into objects.
|
|
59
|
+
*
|
|
60
|
+
* ### Examples
|
|
61
|
+
*
|
|
62
|
+
* ```ts
|
|
63
|
+
* const result = await db
|
|
64
|
+
* .selectFrom('person')
|
|
65
|
+
* .select((eb) => [
|
|
66
|
+
* 'id',
|
|
67
|
+
* jsonObjectFrom(
|
|
68
|
+
* eb.selectFrom('pet')
|
|
69
|
+
* .select(['pet.id as pet_id', 'pet.name'])
|
|
70
|
+
* .where('pet.owner_id', '=', 'person.id')
|
|
71
|
+
* .where('pet.is_favorite', '=', true)
|
|
72
|
+
* ).as('favorite_pet')
|
|
73
|
+
* ])
|
|
74
|
+
* .execute()
|
|
75
|
+
*
|
|
76
|
+
* result[0].id
|
|
77
|
+
* result[0].favorite_pet.pet_id
|
|
78
|
+
* result[0].favorite_pet.name
|
|
79
|
+
* ```
|
|
80
|
+
*
|
|
81
|
+
* The generated SQL (MySQL):
|
|
82
|
+
*
|
|
83
|
+
* ```sql
|
|
84
|
+
* select `id`, (
|
|
85
|
+
* select json_object(
|
|
86
|
+
* 'pet_id', `obj`.`pet_id`,
|
|
87
|
+
* 'name', `obj`.`name`
|
|
88
|
+
* ) from (
|
|
89
|
+
* select `pet`.`id` as `pet_id`, `pet`.`name`
|
|
90
|
+
* from `pet`
|
|
91
|
+
* where `pet`.`owner_id` = `person`.`id`
|
|
92
|
+
* and `pet`.`is_favorite` = ?
|
|
93
|
+
* ) as obj
|
|
94
|
+
* ) as `favorite_pet`
|
|
95
|
+
* from `person`
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export declare function jsonObjectFrom<O>(expr: SelectQueryBuilder<any, any, O>): RawBuilder<Simplify<O>>;
|
|
99
|
+
/**
|
|
100
|
+
* The MySQL `json_object` function.
|
|
101
|
+
*
|
|
102
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
|
|
103
|
+
* While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
|
|
104
|
+
* may not parse the nested results into objects.
|
|
105
|
+
*
|
|
106
|
+
* ### Examples
|
|
107
|
+
*
|
|
108
|
+
* ```ts
|
|
109
|
+
* const result = await db
|
|
110
|
+
* .selectFrom('person')
|
|
111
|
+
* .select((eb) => [
|
|
112
|
+
* 'id',
|
|
113
|
+
* jsonBuildObject({
|
|
114
|
+
* first: eb.ref('first_name'),
|
|
115
|
+
* last: eb.ref('last_name'),
|
|
116
|
+
* full: eb.fn('concat', ['first_name', eb.val(' '), 'last_name'])
|
|
117
|
+
* }).as('name')
|
|
118
|
+
* ])
|
|
119
|
+
* .execute()
|
|
120
|
+
*
|
|
121
|
+
* result[0].id
|
|
122
|
+
* result[0].name.first
|
|
123
|
+
* result[0].name.last
|
|
124
|
+
* result[0].name.full
|
|
125
|
+
* ```
|
|
126
|
+
*
|
|
127
|
+
* The generated SQL (MySQL):
|
|
128
|
+
*
|
|
129
|
+
* ```sql
|
|
130
|
+
* select "id", json_object(
|
|
131
|
+
* 'first', first_name,
|
|
132
|
+
* 'last', last_name,
|
|
133
|
+
* 'full', concat(`first_name`, ?, `last_name`)
|
|
134
|
+
* ) as "name"
|
|
135
|
+
* from "person"
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export declare function jsonBuildObject<O extends Record<string, Expression<unknown>>>(obj: O): RawBuilder<Simplify<{
|
|
139
|
+
[K in keyof O]: O[K] extends Expression<infer V> ? V : never;
|
|
140
|
+
}>>;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/// <reference types="./mysql.d.ts" />
|
|
2
|
+
import { AliasNode } from '../operation-node/alias-node.js';
|
|
3
|
+
import { ColumnNode } from '../operation-node/column-node.js';
|
|
4
|
+
import { IdentifierNode } from '../operation-node/identifier-node.js';
|
|
5
|
+
import { ReferenceNode } from '../operation-node/reference-node.js';
|
|
6
|
+
import { sql } from '../raw-builder/sql.js';
|
|
7
|
+
/**
|
|
8
|
+
* A MySQL helper for aggregating a subquery (or other expression) into a JSON array.
|
|
9
|
+
*
|
|
10
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
|
|
11
|
+
* While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
|
|
12
|
+
* may not parse the nested results into arrays.
|
|
13
|
+
*
|
|
14
|
+
* ### Examples
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* const result = await db
|
|
18
|
+
* .selectFrom('person')
|
|
19
|
+
* .select((eb) => [
|
|
20
|
+
* 'id',
|
|
21
|
+
* jsonArrayFrom(
|
|
22
|
+
* eb.selectFrom('pet')
|
|
23
|
+
* .select(['pet.id as pet_id', 'pet.name'])
|
|
24
|
+
* .where('pet.owner_id', '=', 'person.id')
|
|
25
|
+
* .orderBy('pet.name')
|
|
26
|
+
* ).as('pets')
|
|
27
|
+
* ])
|
|
28
|
+
* .execute()
|
|
29
|
+
*
|
|
30
|
+
* result[0].id
|
|
31
|
+
* result[0].pets[0].pet_id
|
|
32
|
+
* result[0].pets[0].name
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* The generated SQL (MySQL):
|
|
36
|
+
*
|
|
37
|
+
* ```sql
|
|
38
|
+
* select `id`, (
|
|
39
|
+
* select cast(coalesce(json_arrayagg(json_object(
|
|
40
|
+
* 'pet_id', `agg`.`pet_id`,
|
|
41
|
+
* 'name', `agg`.`name`
|
|
42
|
+
* )), '[]') as json) from (
|
|
43
|
+
* select `pet`.`id` as `pet_id`, `pet`.`name`
|
|
44
|
+
* from `pet`
|
|
45
|
+
* where `pet`.`owner_id` = `person`.`id`
|
|
46
|
+
* order by `pet`.`name`
|
|
47
|
+
* ) as `agg`
|
|
48
|
+
* ) as `pets`
|
|
49
|
+
* from `person`
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export function jsonArrayFrom(expr) {
|
|
53
|
+
return sql `(select cast(coalesce(json_arrayagg(json_object(${sql.join(getJsonObjectArgs(expr.toOperationNode(), 'agg'))})), '[]') as json) from ${expr} as agg)`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A MySQL helper for turning a subquery (or other expression) into a JSON object.
|
|
57
|
+
*
|
|
58
|
+
* The subquery must only return one row.
|
|
59
|
+
*
|
|
60
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
|
|
61
|
+
* While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
|
|
62
|
+
* may not parse the nested results into objects.
|
|
63
|
+
*
|
|
64
|
+
* ### Examples
|
|
65
|
+
*
|
|
66
|
+
* ```ts
|
|
67
|
+
* const result = await db
|
|
68
|
+
* .selectFrom('person')
|
|
69
|
+
* .select((eb) => [
|
|
70
|
+
* 'id',
|
|
71
|
+
* jsonObjectFrom(
|
|
72
|
+
* eb.selectFrom('pet')
|
|
73
|
+
* .select(['pet.id as pet_id', 'pet.name'])
|
|
74
|
+
* .where('pet.owner_id', '=', 'person.id')
|
|
75
|
+
* .where('pet.is_favorite', '=', true)
|
|
76
|
+
* ).as('favorite_pet')
|
|
77
|
+
* ])
|
|
78
|
+
* .execute()
|
|
79
|
+
*
|
|
80
|
+
* result[0].id
|
|
81
|
+
* result[0].favorite_pet.pet_id
|
|
82
|
+
* result[0].favorite_pet.name
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* The generated SQL (MySQL):
|
|
86
|
+
*
|
|
87
|
+
* ```sql
|
|
88
|
+
* select `id`, (
|
|
89
|
+
* select json_object(
|
|
90
|
+
* 'pet_id', `obj`.`pet_id`,
|
|
91
|
+
* 'name', `obj`.`name`
|
|
92
|
+
* ) from (
|
|
93
|
+
* select `pet`.`id` as `pet_id`, `pet`.`name`
|
|
94
|
+
* from `pet`
|
|
95
|
+
* where `pet`.`owner_id` = `person`.`id`
|
|
96
|
+
* and `pet`.`is_favorite` = ?
|
|
97
|
+
* ) as obj
|
|
98
|
+
* ) as `favorite_pet`
|
|
99
|
+
* from `person`
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export function jsonObjectFrom(expr) {
|
|
103
|
+
return sql `(select json_object(${sql.join(getJsonObjectArgs(expr.toOperationNode(), 'obj'))}) from ${expr} as obj)`;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The MySQL `json_object` function.
|
|
107
|
+
*
|
|
108
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
|
|
109
|
+
* While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
|
|
110
|
+
* may not parse the nested results into objects.
|
|
111
|
+
*
|
|
112
|
+
* ### Examples
|
|
113
|
+
*
|
|
114
|
+
* ```ts
|
|
115
|
+
* const result = await db
|
|
116
|
+
* .selectFrom('person')
|
|
117
|
+
* .select((eb) => [
|
|
118
|
+
* 'id',
|
|
119
|
+
* jsonBuildObject({
|
|
120
|
+
* first: eb.ref('first_name'),
|
|
121
|
+
* last: eb.ref('last_name'),
|
|
122
|
+
* full: eb.fn('concat', ['first_name', eb.val(' '), 'last_name'])
|
|
123
|
+
* }).as('name')
|
|
124
|
+
* ])
|
|
125
|
+
* .execute()
|
|
126
|
+
*
|
|
127
|
+
* result[0].id
|
|
128
|
+
* result[0].name.first
|
|
129
|
+
* result[0].name.last
|
|
130
|
+
* result[0].name.full
|
|
131
|
+
* ```
|
|
132
|
+
*
|
|
133
|
+
* The generated SQL (MySQL):
|
|
134
|
+
*
|
|
135
|
+
* ```sql
|
|
136
|
+
* select "id", json_object(
|
|
137
|
+
* 'first', first_name,
|
|
138
|
+
* 'last', last_name,
|
|
139
|
+
* 'full', concat(`first_name`, ?, `last_name`)
|
|
140
|
+
* ) as "name"
|
|
141
|
+
* from "person"
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
export function jsonBuildObject(obj) {
|
|
145
|
+
return sql `json_object(${sql.join(Object.keys(obj).flatMap((k) => [sql.lit(k), obj[k]]))})`;
|
|
146
|
+
}
|
|
147
|
+
function getJsonObjectArgs(node, table) {
|
|
148
|
+
return node.selections.flatMap(({ selection: s }) => {
|
|
149
|
+
if (ReferenceNode.is(s) && ColumnNode.is(s.column)) {
|
|
150
|
+
return [
|
|
151
|
+
sql.lit(s.column.column.name),
|
|
152
|
+
sql.id(table, s.column.column.name),
|
|
153
|
+
];
|
|
154
|
+
}
|
|
155
|
+
else if (ColumnNode.is(s)) {
|
|
156
|
+
return [sql.lit(s.column.name), sql.id(table, s.column.name)];
|
|
157
|
+
}
|
|
158
|
+
else if (AliasNode.is(s) && IdentifierNode.is(s.alias)) {
|
|
159
|
+
return [sql.lit(s.alias.name), sql.id(table, s.alias.name)];
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
throw new Error('MySQL jsonArrayFrom and jsonObjectFrom functions can only handle explicit selections due to limitations of the json_object function. selectAll() is not allowed in the subquery.');
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Expression } from '../expression/expression.js';
|
|
2
|
+
import { RawBuilder } from '../raw-builder/raw-builder.js';
|
|
3
|
+
import { Simplify } from '../util/type-utils.js';
|
|
4
|
+
/**
|
|
5
|
+
* A postgres helper for aggregating a subquery (or other expression) into a JSONB array.
|
|
6
|
+
*
|
|
7
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `PostgresDialect`.
|
|
8
|
+
* While the produced SQL is compatibe with all PostgreSQL databases, some 3rd party dialects
|
|
9
|
+
* may not parse the nested results into arrays.
|
|
10
|
+
*
|
|
11
|
+
* ### Examples
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* const result = await db
|
|
15
|
+
* .selectFrom('person')
|
|
16
|
+
* .select((eb) => [
|
|
17
|
+
* 'id',
|
|
18
|
+
* jsonArrayFrom(
|
|
19
|
+
* eb.selectFrom('pet')
|
|
20
|
+
* .select(['pet.id as pet_id', 'pet.name'])
|
|
21
|
+
* .where('pet.owner_id', '=', 'person.id')
|
|
22
|
+
* .orderBy('pet.name')
|
|
23
|
+
* ).as('pets')
|
|
24
|
+
* ])
|
|
25
|
+
* .execute()
|
|
26
|
+
*
|
|
27
|
+
* result[0].id
|
|
28
|
+
* result[0].pets[0].pet_id
|
|
29
|
+
* result[0].pets[0].name
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* The generated SQL (PostgreSQL):
|
|
33
|
+
*
|
|
34
|
+
* ```sql
|
|
35
|
+
* select "id", (
|
|
36
|
+
* select coalesce(json_agg(agg), '[]') from (
|
|
37
|
+
* select "pet"."id" as "pet_id", "pet"."name"
|
|
38
|
+
* from "pet"
|
|
39
|
+
* where "pet"."owner_id" = "person"."id"
|
|
40
|
+
* order by "pet"."name"
|
|
41
|
+
* ) as agg
|
|
42
|
+
* ) as "pets"
|
|
43
|
+
* from "person"
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function jsonArrayFrom<O>(expr: Expression<O>): RawBuilder<Simplify<O>[]>;
|
|
47
|
+
/**
|
|
48
|
+
* A postgres helper for turning a subquery (or other expression) into a JSON object.
|
|
49
|
+
*
|
|
50
|
+
* The subquery must only return one row.
|
|
51
|
+
*
|
|
52
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `PostgresDialect`.
|
|
53
|
+
* While the produced SQL is compatibe with all PostgreSQL databases, some 3rd party dialects
|
|
54
|
+
* may not parse the nested results into objects.
|
|
55
|
+
*
|
|
56
|
+
* ### Examples
|
|
57
|
+
*
|
|
58
|
+
* ```ts
|
|
59
|
+
* const result = await db
|
|
60
|
+
* .selectFrom('person')
|
|
61
|
+
* .select((eb) => [
|
|
62
|
+
* 'id',
|
|
63
|
+
* jsonObjectFrom(
|
|
64
|
+
* eb.selectFrom('pet')
|
|
65
|
+
* .select(['pet.id as pet_id', 'pet.name'])
|
|
66
|
+
* .where('pet.owner_id', '=', 'person.id')
|
|
67
|
+
* .where('pet.is_favorite', '=', true)
|
|
68
|
+
* ).as('favorite_pet')
|
|
69
|
+
* ])
|
|
70
|
+
* .execute()
|
|
71
|
+
*
|
|
72
|
+
* result[0].id
|
|
73
|
+
* result[0].favorite_pet.pet_id
|
|
74
|
+
* result[0].favorite_pet.name
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* The generated SQL (PostgreSQL):
|
|
78
|
+
*
|
|
79
|
+
* ```sql
|
|
80
|
+
* select "id", (
|
|
81
|
+
* select to_json(obj) from (
|
|
82
|
+
* select "pet"."id" as "pet_id", "pet"."name"
|
|
83
|
+
* from "pet"
|
|
84
|
+
* where "pet"."owner_id" = "person"."id"
|
|
85
|
+
* and "pet"."is_favorite" = $1
|
|
86
|
+
* ) as obj
|
|
87
|
+
* ) as "favorite_pet"
|
|
88
|
+
* from "person"
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export declare function jsonObjectFrom<O>(expr: Expression<O>): RawBuilder<Simplify<O>>;
|
|
92
|
+
/**
|
|
93
|
+
* The PostgreSQL `json_build_object` function.
|
|
94
|
+
*
|
|
95
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `PostgresDialect`.
|
|
96
|
+
* While the produced SQL is compatibe with all PostgreSQL databases, some 3rd party dialects
|
|
97
|
+
* may not parse the nested results into objects.
|
|
98
|
+
*
|
|
99
|
+
* ### Examples
|
|
100
|
+
*
|
|
101
|
+
* ```ts
|
|
102
|
+
* const result = await db
|
|
103
|
+
* .selectFrom('person')
|
|
104
|
+
* .select((eb) => [
|
|
105
|
+
* 'id',
|
|
106
|
+
* jsonBuildObject({
|
|
107
|
+
* first: eb.ref('first_name'),
|
|
108
|
+
* last: eb.ref('last_name'),
|
|
109
|
+
* full: sql<string>`first_name || ' ' || last_name`
|
|
110
|
+
* }).as('name')
|
|
111
|
+
* ])
|
|
112
|
+
* .execute()
|
|
113
|
+
*
|
|
114
|
+
* result[0].id
|
|
115
|
+
* result[0].name.first
|
|
116
|
+
* result[0].name.last
|
|
117
|
+
* result[0].name.full
|
|
118
|
+
* ```
|
|
119
|
+
*
|
|
120
|
+
* The generated SQL (PostgreSQL):
|
|
121
|
+
*
|
|
122
|
+
* ```sql
|
|
123
|
+
* select "id", json_build_object(
|
|
124
|
+
* 'first', first_name,
|
|
125
|
+
* 'last', last_name,
|
|
126
|
+
* 'full', first_name || ' ' || last_name
|
|
127
|
+
* ) as "name"
|
|
128
|
+
* from "person"
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export declare function jsonBuildObject<O extends Record<string, Expression<unknown>>>(obj: O): RawBuilder<Simplify<{
|
|
132
|
+
[K in keyof O]: O[K] extends Expression<infer V> ? V : never;
|
|
133
|
+
}>>;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/// <reference types="./postgres.d.ts" />
|
|
2
|
+
import { sql } from '../raw-builder/sql.js';
|
|
3
|
+
/**
|
|
4
|
+
* A postgres helper for aggregating a subquery (or other expression) into a JSONB array.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `PostgresDialect`.
|
|
7
|
+
* While the produced SQL is compatibe with all PostgreSQL databases, some 3rd party dialects
|
|
8
|
+
* may not parse the nested results into arrays.
|
|
9
|
+
*
|
|
10
|
+
* ### Examples
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* const result = await db
|
|
14
|
+
* .selectFrom('person')
|
|
15
|
+
* .select((eb) => [
|
|
16
|
+
* 'id',
|
|
17
|
+
* jsonArrayFrom(
|
|
18
|
+
* eb.selectFrom('pet')
|
|
19
|
+
* .select(['pet.id as pet_id', 'pet.name'])
|
|
20
|
+
* .where('pet.owner_id', '=', 'person.id')
|
|
21
|
+
* .orderBy('pet.name')
|
|
22
|
+
* ).as('pets')
|
|
23
|
+
* ])
|
|
24
|
+
* .execute()
|
|
25
|
+
*
|
|
26
|
+
* result[0].id
|
|
27
|
+
* result[0].pets[0].pet_id
|
|
28
|
+
* result[0].pets[0].name
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* The generated SQL (PostgreSQL):
|
|
32
|
+
*
|
|
33
|
+
* ```sql
|
|
34
|
+
* select "id", (
|
|
35
|
+
* select coalesce(json_agg(agg), '[]') from (
|
|
36
|
+
* select "pet"."id" as "pet_id", "pet"."name"
|
|
37
|
+
* from "pet"
|
|
38
|
+
* where "pet"."owner_id" = "person"."id"
|
|
39
|
+
* order by "pet"."name"
|
|
40
|
+
* ) as agg
|
|
41
|
+
* ) as "pets"
|
|
42
|
+
* from "person"
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export function jsonArrayFrom(expr) {
|
|
46
|
+
return sql `(select coalesce(json_agg(agg), '[]') from ${expr} as agg)`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A postgres helper for turning a subquery (or other expression) into a JSON object.
|
|
50
|
+
*
|
|
51
|
+
* The subquery must only return one row.
|
|
52
|
+
*
|
|
53
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `PostgresDialect`.
|
|
54
|
+
* While the produced SQL is compatibe with all PostgreSQL databases, some 3rd party dialects
|
|
55
|
+
* may not parse the nested results into objects.
|
|
56
|
+
*
|
|
57
|
+
* ### Examples
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* const result = await db
|
|
61
|
+
* .selectFrom('person')
|
|
62
|
+
* .select((eb) => [
|
|
63
|
+
* 'id',
|
|
64
|
+
* jsonObjectFrom(
|
|
65
|
+
* eb.selectFrom('pet')
|
|
66
|
+
* .select(['pet.id as pet_id', 'pet.name'])
|
|
67
|
+
* .where('pet.owner_id', '=', 'person.id')
|
|
68
|
+
* .where('pet.is_favorite', '=', true)
|
|
69
|
+
* ).as('favorite_pet')
|
|
70
|
+
* ])
|
|
71
|
+
* .execute()
|
|
72
|
+
*
|
|
73
|
+
* result[0].id
|
|
74
|
+
* result[0].favorite_pet.pet_id
|
|
75
|
+
* result[0].favorite_pet.name
|
|
76
|
+
* ```
|
|
77
|
+
*
|
|
78
|
+
* The generated SQL (PostgreSQL):
|
|
79
|
+
*
|
|
80
|
+
* ```sql
|
|
81
|
+
* select "id", (
|
|
82
|
+
* select to_json(obj) from (
|
|
83
|
+
* select "pet"."id" as "pet_id", "pet"."name"
|
|
84
|
+
* from "pet"
|
|
85
|
+
* where "pet"."owner_id" = "person"."id"
|
|
86
|
+
* and "pet"."is_favorite" = $1
|
|
87
|
+
* ) as obj
|
|
88
|
+
* ) as "favorite_pet"
|
|
89
|
+
* from "person"
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export function jsonObjectFrom(expr) {
|
|
93
|
+
return sql `(select to_json(obj) from ${expr} as obj)`;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The PostgreSQL `json_build_object` function.
|
|
97
|
+
*
|
|
98
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `PostgresDialect`.
|
|
99
|
+
* While the produced SQL is compatibe with all PostgreSQL databases, some 3rd party dialects
|
|
100
|
+
* may not parse the nested results into objects.
|
|
101
|
+
*
|
|
102
|
+
* ### Examples
|
|
103
|
+
*
|
|
104
|
+
* ```ts
|
|
105
|
+
* const result = await db
|
|
106
|
+
* .selectFrom('person')
|
|
107
|
+
* .select((eb) => [
|
|
108
|
+
* 'id',
|
|
109
|
+
* jsonBuildObject({
|
|
110
|
+
* first: eb.ref('first_name'),
|
|
111
|
+
* last: eb.ref('last_name'),
|
|
112
|
+
* full: sql<string>`first_name || ' ' || last_name`
|
|
113
|
+
* }).as('name')
|
|
114
|
+
* ])
|
|
115
|
+
* .execute()
|
|
116
|
+
*
|
|
117
|
+
* result[0].id
|
|
118
|
+
* result[0].name.first
|
|
119
|
+
* result[0].name.last
|
|
120
|
+
* result[0].name.full
|
|
121
|
+
* ```
|
|
122
|
+
*
|
|
123
|
+
* The generated SQL (PostgreSQL):
|
|
124
|
+
*
|
|
125
|
+
* ```sql
|
|
126
|
+
* select "id", json_build_object(
|
|
127
|
+
* 'first', first_name,
|
|
128
|
+
* 'last', last_name,
|
|
129
|
+
* 'full', first_name || ' ' || last_name
|
|
130
|
+
* ) as "name"
|
|
131
|
+
* from "person"
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
export function jsonBuildObject(obj) {
|
|
135
|
+
return sql `json_build_object(${sql.join(Object.keys(obj).flatMap((k) => [sql.lit(k), obj[k]]))})`;
|
|
136
|
+
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './kysely.js';
|
|
2
2
|
export * from './query-creator.js';
|
|
3
3
|
export * from './expression/expression.js';
|
|
4
|
+
export { ExpressionBuilder, expressionBuilder, } from './expression/expression-builder.js';
|
|
4
5
|
export * from './query-builder/where-interface.js';
|
|
5
6
|
export * from './query-builder/returning-interface.js';
|
|
6
7
|
export * from './query-builder/having-interface.js';
|
|
@@ -10,7 +11,6 @@ export * from './query-builder/update-query-builder.js';
|
|
|
10
11
|
export * from './query-builder/delete-query-builder.js';
|
|
11
12
|
export * from './query-builder/no-result-error.js';
|
|
12
13
|
export * from './query-builder/join-builder.js';
|
|
13
|
-
export * from './query-builder/expression-builder.js';
|
|
14
14
|
export * from './query-builder/function-module.js';
|
|
15
15
|
export * from './query-builder/insert-result.js';
|
|
16
16
|
export * from './query-builder/delete-result.js';
|
|
@@ -163,11 +163,12 @@ export * from './operation-node/using-node.js';
|
|
|
163
163
|
export * from './util/column-type.js';
|
|
164
164
|
export * from './util/compilable.js';
|
|
165
165
|
export * from './util/explainable.js';
|
|
166
|
+
export * from './util/streamable.js';
|
|
166
167
|
export * from './util/log.js';
|
|
167
|
-
export { AnyAliasedColumn, AnyAliasedColumnWithTable, AnyColumn, AnyColumnWithTable, AnySelectQueryBuilder, Equals, UnknownRow, } from './util/type-utils.js';
|
|
168
|
+
export { AnyAliasedColumn, AnyAliasedColumnWithTable, AnyColumn, AnyColumnWithTable, AnySelectQueryBuilder, Equals, UnknownRow, Simplify, SqlBool, } from './util/type-utils.js';
|
|
168
169
|
export * from './util/infer-result.js';
|
|
169
170
|
export { logOnce } from './util/log-once.js';
|
|
170
|
-
export { SelectExpression,
|
|
171
|
+
export { SelectExpression, SelectArg, Selection, } from './parser/select-parser.js';
|
|
171
172
|
export { ReferenceExpression, ReferenceExpressionOrList, SimpleReferenceExpression, StringReference, ExtractTypeFromStringReference, ExtractTypeFromReferenceExpression, } from './parser/reference-parser.js';
|
|
172
173
|
export { ValueExpression, ValueExpressionOrList, } from './parser/value-parser.js';
|
|
173
174
|
export { TableExpression, TableExpressionOrList, } from './parser/table-parser.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
export * from './kysely.js';
|
|
3
3
|
export * from './query-creator.js';
|
|
4
4
|
export * from './expression/expression.js';
|
|
5
|
+
export { expressionBuilder, } from './expression/expression-builder.js';
|
|
5
6
|
export * from './query-builder/where-interface.js';
|
|
6
7
|
export * from './query-builder/returning-interface.js';
|
|
7
8
|
export * from './query-builder/having-interface.js';
|
|
@@ -11,7 +12,6 @@ export * from './query-builder/update-query-builder.js';
|
|
|
11
12
|
export * from './query-builder/delete-query-builder.js';
|
|
12
13
|
export * from './query-builder/no-result-error.js';
|
|
13
14
|
export * from './query-builder/join-builder.js';
|
|
14
|
-
export * from './query-builder/expression-builder.js';
|
|
15
15
|
export * from './query-builder/function-module.js';
|
|
16
16
|
export * from './query-builder/insert-result.js';
|
|
17
17
|
export * from './query-builder/delete-result.js';
|
|
@@ -164,6 +164,7 @@ export * from './operation-node/using-node.js';
|
|
|
164
164
|
export * from './util/column-type.js';
|
|
165
165
|
export * from './util/compilable.js';
|
|
166
166
|
export * from './util/explainable.js';
|
|
167
|
+
export * from './util/streamable.js';
|
|
167
168
|
export * from './util/log.js';
|
|
168
169
|
export * from './util/infer-result.js';
|
|
169
170
|
export { logOnce } from './util/log-once.js';
|
package/dist/esm/kysely.d.ts
CHANGED
|
@@ -9,6 +9,10 @@ import { Driver, IsolationLevel } from './driver/driver.js';
|
|
|
9
9
|
import { FunctionModule } from './query-builder/function-module.js';
|
|
10
10
|
import { LogConfig } from './util/log.js';
|
|
11
11
|
import { QueryExecutorProvider } from './query-executor/query-executor-provider.js';
|
|
12
|
+
import { QueryResult } from './driver/database-connection.js';
|
|
13
|
+
import { CompiledQuery } from './query-compiler/compiled-query.js';
|
|
14
|
+
import { QueryId } from './util/query-id.js';
|
|
15
|
+
import { Compilable } from './util/compilable.js';
|
|
12
16
|
/**
|
|
13
17
|
* The main Kysely class.
|
|
14
18
|
*
|
|
@@ -225,6 +229,12 @@ export declare class Kysely<DB> extends QueryCreator<DB> implements QueryExecuto
|
|
|
225
229
|
* @private
|
|
226
230
|
*/
|
|
227
231
|
getExecutor(): QueryExecutor;
|
|
232
|
+
/**
|
|
233
|
+
* Executes a given compiled query or query builder.
|
|
234
|
+
*
|
|
235
|
+
* See {@link https://github.com/koskimas/kysely/blob/master/site/docs/recipes/splitting-build-compile-and-execute-code.md#execute-compiled-queries splitting build, compile and execute code recipe} for more information.
|
|
236
|
+
*/
|
|
237
|
+
executeQuery<R>(query: CompiledQuery<R> | Compilable<R>, queryId?: QueryId): Promise<QueryResult<R>>;
|
|
228
238
|
}
|
|
229
239
|
export declare class Transaction<DB> extends Kysely<DB> {
|
|
230
240
|
#private;
|
package/dist/esm/kysely.js
CHANGED
|
@@ -9,8 +9,10 @@ import { RuntimeDriver } from './driver/runtime-driver.js';
|
|
|
9
9
|
import { SingleConnectionProvider } from './driver/single-connection-provider.js';
|
|
10
10
|
import { TRANSACTION_ISOLATION_LEVELS, } from './driver/driver.js';
|
|
11
11
|
import { preventAwait } from './util/prevent-await.js';
|
|
12
|
-
import {
|
|
12
|
+
import { createFunctionModule, } from './query-builder/function-module.js';
|
|
13
13
|
import { Log } from './util/log.js';
|
|
14
|
+
import { createQueryId } from './util/query-id.js';
|
|
15
|
+
import { isCompilable } from './util/compilable.js';
|
|
14
16
|
/**
|
|
15
17
|
* The main Kysely class.
|
|
16
18
|
*
|
|
@@ -133,7 +135,7 @@ export class Kysely extends QueryCreator {
|
|
|
133
135
|
* ```
|
|
134
136
|
*/
|
|
135
137
|
get fn() {
|
|
136
|
-
return
|
|
138
|
+
return createFunctionModule();
|
|
137
139
|
}
|
|
138
140
|
/**
|
|
139
141
|
* Creates a {@link TransactionBuilder} that can be used to run queries inside a transaction.
|
|
@@ -282,6 +284,15 @@ export class Kysely extends QueryCreator {
|
|
|
282
284
|
getExecutor() {
|
|
283
285
|
return this.#props.executor;
|
|
284
286
|
}
|
|
287
|
+
/**
|
|
288
|
+
* Executes a given compiled query or query builder.
|
|
289
|
+
*
|
|
290
|
+
* See {@link https://github.com/koskimas/kysely/blob/master/site/docs/recipes/splitting-build-compile-and-execute-code.md#execute-compiled-queries splitting build, compile and execute code recipe} for more information.
|
|
291
|
+
*/
|
|
292
|
+
executeQuery(query, queryId = createQueryId()) {
|
|
293
|
+
const compiledQuery = isCompilable(query) ? query.compile() : query;
|
|
294
|
+
return this.getExecutor().executeQuery(compiledQuery, queryId);
|
|
295
|
+
}
|
|
285
296
|
}
|
|
286
297
|
export class Transaction extends Kysely {
|
|
287
298
|
#props;
|