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,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.expressionBuilder = exports.createExpressionBuilder = void 0;
|
|
4
|
+
const select_query_builder_js_1 = require("../query-builder/select-query-builder.js");
|
|
5
|
+
const select_query_node_js_1 = require("../operation-node/select-query-node.js");
|
|
6
|
+
const table_parser_js_1 = require("../parser/table-parser.js");
|
|
7
|
+
const with_schema_plugin_js_1 = require("../plugin/with-schema/with-schema-plugin.js");
|
|
8
|
+
const query_id_js_1 = require("../util/query-id.js");
|
|
9
|
+
const function_module_js_1 = require("../query-builder/function-module.js");
|
|
10
|
+
const reference_parser_js_1 = require("../parser/reference-parser.js");
|
|
11
|
+
const binary_operation_parser_js_1 = require("../parser/binary-operation-parser.js");
|
|
12
|
+
const and_node_js_1 = require("../operation-node/and-node.js");
|
|
13
|
+
const or_node_js_1 = require("../operation-node/or-node.js");
|
|
14
|
+
const parens_node_js_1 = require("../operation-node/parens-node.js");
|
|
15
|
+
const expression_wrapper_js_1 = require("./expression-wrapper.js");
|
|
16
|
+
const unary_operation_parser_js_1 = require("../parser/unary-operation-parser.js");
|
|
17
|
+
const value_parser_js_1 = require("../parser/value-parser.js");
|
|
18
|
+
const noop_query_executor_js_1 = require("../query-executor/noop-query-executor.js");
|
|
19
|
+
const value_node_js_1 = require("../operation-node/value-node.js");
|
|
20
|
+
function createExpressionBuilder(executor = noop_query_executor_js_1.NOOP_QUERY_EXECUTOR) {
|
|
21
|
+
function unary(op, expr) {
|
|
22
|
+
return new expression_wrapper_js_1.ExpressionWrapper((0, unary_operation_parser_js_1.parseUnaryOperation)(op, expr));
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
get fn() {
|
|
26
|
+
return (0, function_module_js_1.createFunctionModule)();
|
|
27
|
+
},
|
|
28
|
+
selectFrom(table) {
|
|
29
|
+
return new select_query_builder_js_1.SelectQueryBuilder({
|
|
30
|
+
queryId: (0, query_id_js_1.createQueryId)(),
|
|
31
|
+
executor: executor,
|
|
32
|
+
queryNode: select_query_node_js_1.SelectQueryNode.create((0, table_parser_js_1.parseTableExpressionOrList)(table)),
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
ref(reference) {
|
|
36
|
+
return new expression_wrapper_js_1.ExpressionWrapper((0, reference_parser_js_1.parseStringReference)(reference));
|
|
37
|
+
},
|
|
38
|
+
val(value) {
|
|
39
|
+
return new expression_wrapper_js_1.ExpressionWrapper((0, value_parser_js_1.parseValueExpressionOrList)(value));
|
|
40
|
+
},
|
|
41
|
+
cmpr(lhs, op, rhs) {
|
|
42
|
+
return new expression_wrapper_js_1.ExpressionWrapper((0, binary_operation_parser_js_1.parseValueBinaryOperation)(lhs, op, rhs));
|
|
43
|
+
},
|
|
44
|
+
bxp(lhs, op, rhs) {
|
|
45
|
+
return new expression_wrapper_js_1.ExpressionWrapper((0, binary_operation_parser_js_1.parseValueBinaryOperation)(lhs, op, rhs));
|
|
46
|
+
},
|
|
47
|
+
unary,
|
|
48
|
+
not(expr) {
|
|
49
|
+
return unary('not', expr);
|
|
50
|
+
},
|
|
51
|
+
exists(expr) {
|
|
52
|
+
return unary('exists', expr);
|
|
53
|
+
},
|
|
54
|
+
neg(expr) {
|
|
55
|
+
return unary('-', expr);
|
|
56
|
+
},
|
|
57
|
+
and(exprs) {
|
|
58
|
+
if (exprs.length === 0) {
|
|
59
|
+
return new expression_wrapper_js_1.ExpressionWrapper(value_node_js_1.ValueNode.createImmediate(true));
|
|
60
|
+
}
|
|
61
|
+
else if (exprs.length === 1) {
|
|
62
|
+
return new expression_wrapper_js_1.ExpressionWrapper(exprs[0].toOperationNode());
|
|
63
|
+
}
|
|
64
|
+
let node = and_node_js_1.AndNode.create(exprs[0].toOperationNode(), exprs[1].toOperationNode());
|
|
65
|
+
for (let i = 2; i < exprs.length; ++i) {
|
|
66
|
+
node = and_node_js_1.AndNode.create(node, exprs[i].toOperationNode());
|
|
67
|
+
}
|
|
68
|
+
return new expression_wrapper_js_1.ExpressionWrapper(parens_node_js_1.ParensNode.create(node));
|
|
69
|
+
},
|
|
70
|
+
or(exprs) {
|
|
71
|
+
if (exprs.length === 0) {
|
|
72
|
+
return new expression_wrapper_js_1.ExpressionWrapper(value_node_js_1.ValueNode.createImmediate(false));
|
|
73
|
+
}
|
|
74
|
+
else if (exprs.length === 1) {
|
|
75
|
+
return new expression_wrapper_js_1.ExpressionWrapper(exprs[0].toOperationNode());
|
|
76
|
+
}
|
|
77
|
+
let node = or_node_js_1.OrNode.create(exprs[0].toOperationNode(), exprs[1].toOperationNode());
|
|
78
|
+
for (let i = 2; i < exprs.length; ++i) {
|
|
79
|
+
node = or_node_js_1.OrNode.create(node, exprs[i].toOperationNode());
|
|
80
|
+
}
|
|
81
|
+
return new expression_wrapper_js_1.ExpressionWrapper(parens_node_js_1.ParensNode.create(node));
|
|
82
|
+
},
|
|
83
|
+
withSchema(schema) {
|
|
84
|
+
return createExpressionBuilder(executor.withPluginAtFront(new with_schema_plugin_js_1.WithSchemaPlugin(schema)));
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
exports.createExpressionBuilder = createExpressionBuilder;
|
|
89
|
+
function expressionBuilder(_) {
|
|
90
|
+
return createExpressionBuilder();
|
|
91
|
+
}
|
|
92
|
+
exports.expressionBuilder = expressionBuilder;
|
|
@@ -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,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AliasedExpressionWrapper = exports.ExpressionWrapper = void 0;
|
|
4
|
+
const alias_node_js_1 = require("../operation-node/alias-node.js");
|
|
5
|
+
const identifier_node_js_1 = require("../operation-node/identifier-node.js");
|
|
6
|
+
const operation_node_source_js_1 = require("../operation-node/operation-node-source.js");
|
|
7
|
+
class ExpressionWrapper {
|
|
8
|
+
#node;
|
|
9
|
+
constructor(node) {
|
|
10
|
+
this.#node = node;
|
|
11
|
+
}
|
|
12
|
+
/** @private */
|
|
13
|
+
get expressionType() {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
as(alias) {
|
|
17
|
+
return new AliasedExpressionWrapper(this, alias);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Change the output type of the raw expression.
|
|
21
|
+
*
|
|
22
|
+
* This method call doesn't change the SQL in any way. This methods simply
|
|
23
|
+
* returns a copy of this `ExpressionWrapper` with a new output type.
|
|
24
|
+
*/
|
|
25
|
+
$castTo() {
|
|
26
|
+
return new ExpressionWrapper(this.#node);
|
|
27
|
+
}
|
|
28
|
+
toOperationNode() {
|
|
29
|
+
return this.#node;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.ExpressionWrapper = ExpressionWrapper;
|
|
33
|
+
class AliasedExpressionWrapper {
|
|
34
|
+
#expr;
|
|
35
|
+
#alias;
|
|
36
|
+
constructor(expr, alias) {
|
|
37
|
+
this.#expr = expr;
|
|
38
|
+
this.#alias = alias;
|
|
39
|
+
}
|
|
40
|
+
/** @private */
|
|
41
|
+
get expression() {
|
|
42
|
+
return this.#expr;
|
|
43
|
+
}
|
|
44
|
+
/** @private */
|
|
45
|
+
get alias() {
|
|
46
|
+
return this.#alias;
|
|
47
|
+
}
|
|
48
|
+
toOperationNode() {
|
|
49
|
+
return alias_node_js_1.AliasNode.create(this.#expr.toOperationNode(), (0, operation_node_source_js_1.isOperationNodeSource)(this.#alias)
|
|
50
|
+
? this.#alias.toOperationNode()
|
|
51
|
+
: identifier_node_js_1.IdentifierNode.create(this.#alias));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.AliasedExpressionWrapper = AliasedExpressionWrapper;
|
|
@@ -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
|
*/
|
|
@@ -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,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.jsonBuildObject = exports.jsonObjectFrom = exports.jsonArrayFrom = void 0;
|
|
4
|
+
const alias_node_js_1 = require("../operation-node/alias-node.js");
|
|
5
|
+
const column_node_js_1 = require("../operation-node/column-node.js");
|
|
6
|
+
const identifier_node_js_1 = require("../operation-node/identifier-node.js");
|
|
7
|
+
const reference_node_js_1 = require("../operation-node/reference-node.js");
|
|
8
|
+
const sql_js_1 = require("../raw-builder/sql.js");
|
|
9
|
+
/**
|
|
10
|
+
* A MySQL helper for aggregating a subquery (or other expression) into a JSON array.
|
|
11
|
+
*
|
|
12
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
|
|
13
|
+
* While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
|
|
14
|
+
* may not parse the nested results into arrays.
|
|
15
|
+
*
|
|
16
|
+
* ### Examples
|
|
17
|
+
*
|
|
18
|
+
* ```ts
|
|
19
|
+
* const result = await db
|
|
20
|
+
* .selectFrom('person')
|
|
21
|
+
* .select((eb) => [
|
|
22
|
+
* 'id',
|
|
23
|
+
* jsonArrayFrom(
|
|
24
|
+
* eb.selectFrom('pet')
|
|
25
|
+
* .select(['pet.id as pet_id', 'pet.name'])
|
|
26
|
+
* .where('pet.owner_id', '=', 'person.id')
|
|
27
|
+
* .orderBy('pet.name')
|
|
28
|
+
* ).as('pets')
|
|
29
|
+
* ])
|
|
30
|
+
* .execute()
|
|
31
|
+
*
|
|
32
|
+
* result[0].id
|
|
33
|
+
* result[0].pets[0].pet_id
|
|
34
|
+
* result[0].pets[0].name
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* The generated SQL (MySQL):
|
|
38
|
+
*
|
|
39
|
+
* ```sql
|
|
40
|
+
* select `id`, (
|
|
41
|
+
* select cast(coalesce(json_arrayagg(json_object(
|
|
42
|
+
* 'pet_id', `agg`.`pet_id`,
|
|
43
|
+
* 'name', `agg`.`name`
|
|
44
|
+
* )), '[]') as json) from (
|
|
45
|
+
* select `pet`.`id` as `pet_id`, `pet`.`name`
|
|
46
|
+
* from `pet`
|
|
47
|
+
* where `pet`.`owner_id` = `person`.`id`
|
|
48
|
+
* order by `pet`.`name`
|
|
49
|
+
* ) as `agg`
|
|
50
|
+
* ) as `pets`
|
|
51
|
+
* from `person`
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
function jsonArrayFrom(expr) {
|
|
55
|
+
return (0, sql_js_1.sql) `(select cast(coalesce(json_arrayagg(json_object(${sql_js_1.sql.join(getJsonObjectArgs(expr.toOperationNode(), 'agg'))})), '[]') as json) from ${expr} as agg)`;
|
|
56
|
+
}
|
|
57
|
+
exports.jsonArrayFrom = jsonArrayFrom;
|
|
58
|
+
/**
|
|
59
|
+
* A MySQL helper for turning a subquery (or other expression) into a JSON object.
|
|
60
|
+
*
|
|
61
|
+
* The subquery must only return one row.
|
|
62
|
+
*
|
|
63
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
|
|
64
|
+
* While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
|
|
65
|
+
* may not parse the nested results into objects.
|
|
66
|
+
*
|
|
67
|
+
* ### Examples
|
|
68
|
+
*
|
|
69
|
+
* ```ts
|
|
70
|
+
* const result = await db
|
|
71
|
+
* .selectFrom('person')
|
|
72
|
+
* .select((eb) => [
|
|
73
|
+
* 'id',
|
|
74
|
+
* jsonObjectFrom(
|
|
75
|
+
* eb.selectFrom('pet')
|
|
76
|
+
* .select(['pet.id as pet_id', 'pet.name'])
|
|
77
|
+
* .where('pet.owner_id', '=', 'person.id')
|
|
78
|
+
* .where('pet.is_favorite', '=', true)
|
|
79
|
+
* ).as('favorite_pet')
|
|
80
|
+
* ])
|
|
81
|
+
* .execute()
|
|
82
|
+
*
|
|
83
|
+
* result[0].id
|
|
84
|
+
* result[0].favorite_pet.pet_id
|
|
85
|
+
* result[0].favorite_pet.name
|
|
86
|
+
* ```
|
|
87
|
+
*
|
|
88
|
+
* The generated SQL (MySQL):
|
|
89
|
+
*
|
|
90
|
+
* ```sql
|
|
91
|
+
* select `id`, (
|
|
92
|
+
* select json_object(
|
|
93
|
+
* 'pet_id', `obj`.`pet_id`,
|
|
94
|
+
* 'name', `obj`.`name`
|
|
95
|
+
* ) from (
|
|
96
|
+
* select `pet`.`id` as `pet_id`, `pet`.`name`
|
|
97
|
+
* from `pet`
|
|
98
|
+
* where `pet`.`owner_id` = `person`.`id`
|
|
99
|
+
* and `pet`.`is_favorite` = ?
|
|
100
|
+
* ) as obj
|
|
101
|
+
* ) as `favorite_pet`
|
|
102
|
+
* from `person`
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
function jsonObjectFrom(expr) {
|
|
106
|
+
return (0, sql_js_1.sql) `(select json_object(${sql_js_1.sql.join(getJsonObjectArgs(expr.toOperationNode(), 'obj'))}) from ${expr} as obj)`;
|
|
107
|
+
}
|
|
108
|
+
exports.jsonObjectFrom = jsonObjectFrom;
|
|
109
|
+
/**
|
|
110
|
+
* The MySQL `json_object` function.
|
|
111
|
+
*
|
|
112
|
+
* NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
|
|
113
|
+
* While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
|
|
114
|
+
* may not parse the nested results into objects.
|
|
115
|
+
*
|
|
116
|
+
* ### Examples
|
|
117
|
+
*
|
|
118
|
+
* ```ts
|
|
119
|
+
* const result = await db
|
|
120
|
+
* .selectFrom('person')
|
|
121
|
+
* .select((eb) => [
|
|
122
|
+
* 'id',
|
|
123
|
+
* jsonBuildObject({
|
|
124
|
+
* first: eb.ref('first_name'),
|
|
125
|
+
* last: eb.ref('last_name'),
|
|
126
|
+
* full: eb.fn('concat', ['first_name', eb.val(' '), 'last_name'])
|
|
127
|
+
* }).as('name')
|
|
128
|
+
* ])
|
|
129
|
+
* .execute()
|
|
130
|
+
*
|
|
131
|
+
* result[0].id
|
|
132
|
+
* result[0].name.first
|
|
133
|
+
* result[0].name.last
|
|
134
|
+
* result[0].name.full
|
|
135
|
+
* ```
|
|
136
|
+
*
|
|
137
|
+
* The generated SQL (MySQL):
|
|
138
|
+
*
|
|
139
|
+
* ```sql
|
|
140
|
+
* select "id", json_object(
|
|
141
|
+
* 'first', first_name,
|
|
142
|
+
* 'last', last_name,
|
|
143
|
+
* 'full', concat(`first_name`, ?, `last_name`)
|
|
144
|
+
* ) as "name"
|
|
145
|
+
* from "person"
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
function jsonBuildObject(obj) {
|
|
149
|
+
return (0, sql_js_1.sql) `json_object(${sql_js_1.sql.join(Object.keys(obj).flatMap((k) => [sql_js_1.sql.lit(k), obj[k]]))})`;
|
|
150
|
+
}
|
|
151
|
+
exports.jsonBuildObject = jsonBuildObject;
|
|
152
|
+
function getJsonObjectArgs(node, table) {
|
|
153
|
+
return node.selections.flatMap(({ selection: s }) => {
|
|
154
|
+
if (reference_node_js_1.ReferenceNode.is(s) && column_node_js_1.ColumnNode.is(s.column)) {
|
|
155
|
+
return [
|
|
156
|
+
sql_js_1.sql.lit(s.column.column.name),
|
|
157
|
+
sql_js_1.sql.id(table, s.column.column.name),
|
|
158
|
+
];
|
|
159
|
+
}
|
|
160
|
+
else if (column_node_js_1.ColumnNode.is(s)) {
|
|
161
|
+
return [sql_js_1.sql.lit(s.column.name), sql_js_1.sql.id(table, s.column.name)];
|
|
162
|
+
}
|
|
163
|
+
else if (alias_node_js_1.AliasNode.is(s) && identifier_node_js_1.IdentifierNode.is(s.alias)) {
|
|
164
|
+
return [sql_js_1.sql.lit(s.alias.name), sql_js_1.sql.id(table, s.alias.name)];
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
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.');
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
@@ -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
|
+
}>>;
|