typhex 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/LICENSE +21 -0
- package/README.md +417 -0
- package/SECURITY.md +32 -0
- package/dist/arrow/aggregates.d.ts +12 -0
- package/dist/arrow/aggregates.d.ts.map +1 -0
- package/dist/arrow/aggregates.js +32 -0
- package/dist/arrow/aggregates.js.map +1 -0
- package/dist/arrow/constants.d.ts +15 -0
- package/dist/arrow/constants.d.ts.map +1 -0
- package/dist/arrow/constants.js +42 -0
- package/dist/arrow/constants.js.map +1 -0
- package/dist/arrow/index.d.ts +7 -0
- package/dist/arrow/index.d.ts.map +1 -0
- package/dist/arrow/index.js +7 -0
- package/dist/arrow/index.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/load-config.d.ts +19 -0
- package/dist/config/load-config.d.ts.map +1 -0
- package/dist/config/load-config.js +84 -0
- package/dist/config/load-config.js.map +1 -0
- package/dist/config/load-env.d.ts +7 -0
- package/dist/config/load-env.d.ts.map +1 -0
- package/dist/config/load-env.js +62 -0
- package/dist/config/load-env.js.map +1 -0
- package/dist/config/types.d.ts +20 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +10 -0
- package/dist/config/types.js.map +1 -0
- package/dist/dbs/base-migrator.d.ts +20 -0
- package/dist/dbs/base-migrator.d.ts.map +1 -0
- package/dist/dbs/base-migrator.js +112 -0
- package/dist/dbs/base-migrator.js.map +1 -0
- package/dist/dbs/index.d.ts +9 -0
- package/dist/dbs/index.d.ts.map +1 -0
- package/dist/dbs/index.js +17 -0
- package/dist/dbs/index.js.map +1 -0
- package/dist/dbs/postgres/dialect.d.ts +8 -0
- package/dist/dbs/postgres/dialect.d.ts.map +1 -0
- package/dist/dbs/postgres/dialect.js +17 -0
- package/dist/dbs/postgres/dialect.js.map +1 -0
- package/dist/dbs/postgres/driver.d.ts +42 -0
- package/dist/dbs/postgres/driver.d.ts.map +1 -0
- package/dist/dbs/postgres/driver.js +111 -0
- package/dist/dbs/postgres/driver.js.map +1 -0
- package/dist/dbs/postgres/index.d.ts +6 -0
- package/dist/dbs/postgres/index.d.ts.map +1 -0
- package/dist/dbs/postgres/index.js +5 -0
- package/dist/dbs/postgres/index.js.map +1 -0
- package/dist/dbs/postgres/migrator.d.ts +13 -0
- package/dist/dbs/postgres/migrator.d.ts.map +1 -0
- package/dist/dbs/postgres/migrator.js +22 -0
- package/dist/dbs/postgres/migrator.js.map +1 -0
- package/dist/dbs/postgres/query-compiler.d.ts +22 -0
- package/dist/dbs/postgres/query-compiler.d.ts.map +1 -0
- package/dist/dbs/postgres/query-compiler.js +140 -0
- package/dist/dbs/postgres/query-compiler.js.map +1 -0
- package/dist/dbs/postgres/trx.d.ts +16 -0
- package/dist/dbs/postgres/trx.d.ts.map +1 -0
- package/dist/dbs/postgres/trx.js +68 -0
- package/dist/dbs/postgres/trx.js.map +1 -0
- package/dist/dbs/query-compiler.d.ts +135 -0
- package/dist/dbs/query-compiler.d.ts.map +1 -0
- package/dist/dbs/query-compiler.js +775 -0
- package/dist/dbs/query-compiler.js.map +1 -0
- package/dist/dbs/sqlite/dialect.d.ts +8 -0
- package/dist/dbs/sqlite/dialect.d.ts.map +1 -0
- package/dist/dbs/sqlite/dialect.js +17 -0
- package/dist/dbs/sqlite/dialect.js.map +1 -0
- package/dist/dbs/sqlite/driver.d.ts +9 -0
- package/dist/dbs/sqlite/driver.d.ts.map +1 -0
- package/dist/dbs/sqlite/driver.js +66 -0
- package/dist/dbs/sqlite/driver.js.map +1 -0
- package/dist/dbs/sqlite/index.d.ts +6 -0
- package/dist/dbs/sqlite/index.d.ts.map +1 -0
- package/dist/dbs/sqlite/index.js +5 -0
- package/dist/dbs/sqlite/index.js.map +1 -0
- package/dist/dbs/sqlite/migrator.d.ts +13 -0
- package/dist/dbs/sqlite/migrator.d.ts.map +1 -0
- package/dist/dbs/sqlite/migrator.js +22 -0
- package/dist/dbs/sqlite/migrator.js.map +1 -0
- package/dist/dbs/sqlite/query-compiler.d.ts +26 -0
- package/dist/dbs/sqlite/query-compiler.d.ts.map +1 -0
- package/dist/dbs/sqlite/query-compiler.js +80 -0
- package/dist/dbs/sqlite/query-compiler.js.map +1 -0
- package/dist/dbs/sqlite/trx.d.ts +13 -0
- package/dist/dbs/sqlite/trx.d.ts.map +1 -0
- package/dist/dbs/sqlite/trx.js +69 -0
- package/dist/dbs/sqlite/trx.js.map +1 -0
- package/dist/dbs/types.d.ts +92 -0
- package/dist/dbs/types.d.ts.map +1 -0
- package/dist/dbs/types.js +26 -0
- package/dist/dbs/types.js.map +1 -0
- package/dist/dialect.d.ts +3 -0
- package/dist/dialect.d.ts.map +1 -0
- package/dist/dialect.js +2 -0
- package/dist/dialect.js.map +1 -0
- package/dist/driver/factory.d.ts +19 -0
- package/dist/driver/factory.d.ts.map +1 -0
- package/dist/driver/factory.js +24 -0
- package/dist/driver/factory.js.map +1 -0
- package/dist/driver/index.d.ts +6 -0
- package/dist/driver/index.d.ts.map +1 -0
- package/dist/driver/index.js +3 -0
- package/dist/driver/index.js.map +1 -0
- package/dist/driver/sqlite.d.ts +15 -0
- package/dist/driver/sqlite.d.ts.map +1 -0
- package/dist/driver/sqlite.js +74 -0
- package/dist/driver/sqlite.js.map +1 -0
- package/dist/driver/types.d.ts +75 -0
- package/dist/driver/types.d.ts.map +1 -0
- package/dist/driver/types.js +2 -0
- package/dist/driver/types.js.map +1 -0
- package/dist/entity/entity.d.ts +67 -0
- package/dist/entity/entity.d.ts.map +1 -0
- package/dist/entity/entity.js +139 -0
- package/dist/entity/entity.js.map +1 -0
- package/dist/entity/global-driver.d.ts +38 -0
- package/dist/entity/global-driver.d.ts.map +1 -0
- package/dist/entity/global-driver.js +109 -0
- package/dist/entity/global-driver.js.map +1 -0
- package/dist/entity/index.d.ts +8 -0
- package/dist/entity/index.d.ts.map +1 -0
- package/dist/entity/index.js +3 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/entity/pk-columns.d.ts +5 -0
- package/dist/entity/pk-columns.d.ts.map +1 -0
- package/dist/entity/pk-columns.js +14 -0
- package/dist/entity/pk-columns.js.map +1 -0
- package/dist/entity/relations.d.ts +134 -0
- package/dist/entity/relations.d.ts.map +1 -0
- package/dist/entity/relations.js +23 -0
- package/dist/entity/relations.js.map +1 -0
- package/dist/entity/schema-inference.d.ts +77 -0
- package/dist/entity/schema-inference.d.ts.map +1 -0
- package/dist/entity/schema-inference.js +6 -0
- package/dist/entity/schema-inference.js.map +1 -0
- package/dist/entity/types.d.ts +30 -0
- package/dist/entity/types.d.ts.map +1 -0
- package/dist/entity/types.js +5 -0
- package/dist/entity/types.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/ir/index.d.ts +2 -0
- package/dist/ir/index.d.ts.map +1 -0
- package/dist/ir/index.js +2 -0
- package/dist/ir/index.js.map +1 -0
- package/dist/ir/types.d.ts +148 -0
- package/dist/ir/types.d.ts.map +1 -0
- package/dist/ir/types.js +97 -0
- package/dist/ir/types.js.map +1 -0
- package/dist/migration/cli.d.ts +18 -0
- package/dist/migration/cli.d.ts.map +1 -0
- package/dist/migration/cli.js +236 -0
- package/dist/migration/cli.js.map +1 -0
- package/dist/migration/diff.d.ts +10 -0
- package/dist/migration/diff.d.ts.map +1 -0
- package/dist/migration/diff.js +10 -0
- package/dist/migration/diff.js.map +1 -0
- package/dist/migration/generator.d.ts +12 -0
- package/dist/migration/generator.d.ts.map +1 -0
- package/dist/migration/generator.js +98 -0
- package/dist/migration/generator.js.map +1 -0
- package/dist/migration/index.d.ts +7 -0
- package/dist/migration/index.d.ts.map +1 -0
- package/dist/migration/index.js +5 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/runner.d.ts +32 -0
- package/dist/migration/runner.d.ts.map +1 -0
- package/dist/migration/runner.js +279 -0
- package/dist/migration/runner.js.map +1 -0
- package/dist/migration/topo-sort.d.ts +12 -0
- package/dist/migration/topo-sort.d.ts.map +1 -0
- package/dist/migration/topo-sort.js +42 -0
- package/dist/migration/topo-sort.js.map +1 -0
- package/dist/migration/types.d.ts +45 -0
- package/dist/migration/types.d.ts.map +1 -0
- package/dist/migration/types.js +2 -0
- package/dist/migration/types.js.map +1 -0
- package/dist/orm/aggregates.d.ts +19 -0
- package/dist/orm/aggregates.d.ts.map +1 -0
- package/dist/orm/aggregates.js +32 -0
- package/dist/orm/aggregates.js.map +1 -0
- package/dist/orm/db.d.ts +105 -0
- package/dist/orm/db.d.ts.map +1 -0
- package/dist/orm/db.js +172 -0
- package/dist/orm/db.js.map +1 -0
- package/dist/orm/expr.d.ts +125 -0
- package/dist/orm/expr.d.ts.map +1 -0
- package/dist/orm/expr.js +10 -0
- package/dist/orm/expr.js.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-batch-executor.d.ts +9 -0
- package/dist/orm/helpers/insert-graph/insert-graph-batch-executor.d.ts.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-batch-executor.js +44 -0
- package/dist/orm/helpers/insert-graph/insert-graph-batch-executor.js.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-executor.d.ts +13 -0
- package/dist/orm/helpers/insert-graph/insert-graph-executor.d.ts.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-executor.js +42 -0
- package/dist/orm/helpers/insert-graph/insert-graph-executor.js.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-planner.d.ts +46 -0
- package/dist/orm/helpers/insert-graph/insert-graph-planner.d.ts.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-planner.js +258 -0
- package/dist/orm/helpers/insert-graph/insert-graph-planner.js.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-sequential-executor.d.ts +7 -0
- package/dist/orm/helpers/insert-graph/insert-graph-sequential-executor.d.ts.map +1 -0
- package/dist/orm/helpers/insert-graph/insert-graph-sequential-executor.js +8 -0
- package/dist/orm/helpers/insert-graph/insert-graph-sequential-executor.js.map +1 -0
- package/dist/orm/helpers/insert-graph/sequence-id-assigner.d.ts +15 -0
- package/dist/orm/helpers/insert-graph/sequence-id-assigner.d.ts.map +1 -0
- package/dist/orm/helpers/insert-graph/sequence-id-assigner.js +48 -0
- package/dist/orm/helpers/insert-graph/sequence-id-assigner.js.map +1 -0
- package/dist/orm/helpers/query-plan/expr-builder.d.ts +155 -0
- package/dist/orm/helpers/query-plan/expr-builder.d.ts.map +1 -0
- package/dist/orm/helpers/query-plan/expr-builder.js +297 -0
- package/dist/orm/helpers/query-plan/expr-builder.js.map +1 -0
- package/dist/orm/helpers/query-plan/query-ir-analyzer.d.ts +48 -0
- package/dist/orm/helpers/query-plan/query-ir-analyzer.d.ts.map +1 -0
- package/dist/orm/helpers/query-plan/query-ir-analyzer.js +262 -0
- package/dist/orm/helpers/query-plan/query-ir-analyzer.js.map +1 -0
- package/dist/orm/helpers/query-plan/query-plan.d.ts +164 -0
- package/dist/orm/helpers/query-plan/query-plan.d.ts.map +1 -0
- package/dist/orm/helpers/query-plan/query-plan.js +549 -0
- package/dist/orm/helpers/query-plan/query-plan.js.map +1 -0
- package/dist/orm/helpers/query-plan/select-classifier.d.ts +161 -0
- package/dist/orm/helpers/query-plan/select-classifier.d.ts.map +1 -0
- package/dist/orm/helpers/query-plan/select-classifier.js +359 -0
- package/dist/orm/helpers/query-plan/select-classifier.js.map +1 -0
- package/dist/orm/helpers/relations/relation-assembler.d.ts +21 -0
- package/dist/orm/helpers/relations/relation-assembler.d.ts.map +1 -0
- package/dist/orm/helpers/relations/relation-assembler.js +60 -0
- package/dist/orm/helpers/relations/relation-assembler.js.map +1 -0
- package/dist/orm/helpers/relations/relation-fetcher.d.ts +30 -0
- package/dist/orm/helpers/relations/relation-fetcher.d.ts.map +1 -0
- package/dist/orm/helpers/relations/relation-fetcher.js +128 -0
- package/dist/orm/helpers/relations/relation-fetcher.js.map +1 -0
- package/dist/orm/helpers/relations/relation-joins.d.ts +74 -0
- package/dist/orm/helpers/relations/relation-joins.d.ts.map +1 -0
- package/dist/orm/helpers/relations/relation-joins.js +138 -0
- package/dist/orm/helpers/relations/relation-joins.js.map +1 -0
- package/dist/orm/helpers/relations/relation-resolver.d.ts +14 -0
- package/dist/orm/helpers/relations/relation-resolver.d.ts.map +1 -0
- package/dist/orm/helpers/relations/relation-resolver.js +25 -0
- package/dist/orm/helpers/relations/relation-resolver.js.map +1 -0
- package/dist/orm/index.d.ts +7 -0
- package/dist/orm/index.d.ts.map +1 -0
- package/dist/orm/index.js +5 -0
- package/dist/orm/index.js.map +1 -0
- package/dist/orm/query-builder.d.ts +136 -0
- package/dist/orm/query-builder.d.ts.map +1 -0
- package/dist/orm/query-builder.js +433 -0
- package/dist/orm/query-builder.js.map +1 -0
- package/dist/orm/query-helpers.d.ts +35 -0
- package/dist/orm/query-helpers.d.ts.map +1 -0
- package/dist/orm/query-helpers.js +83 -0
- package/dist/orm/query-helpers.js.map +1 -0
- package/dist/orm/query-state.d.ts +56 -0
- package/dist/orm/query-state.d.ts.map +1 -0
- package/dist/orm/query-state.js +112 -0
- package/dist/orm/query-state.js.map +1 -0
- package/dist/orm/single-row-query-builder.d.ts +18 -0
- package/dist/orm/single-row-query-builder.d.ts.map +1 -0
- package/dist/orm/single-row-query-builder.js +90 -0
- package/dist/orm/single-row-query-builder.js.map +1 -0
- package/dist/orm/trx.d.ts +40 -0
- package/dist/orm/trx.d.ts.map +1 -0
- package/dist/orm/trx.js +118 -0
- package/dist/orm/trx.js.map +1 -0
- package/dist/parser/acorn-helpers.d.ts +43 -0
- package/dist/parser/acorn-helpers.d.ts.map +1 -0
- package/dist/parser/acorn-helpers.js +104 -0
- package/dist/parser/acorn-helpers.js.map +1 -0
- package/dist/parser/acorn-member.d.ts +16 -0
- package/dist/parser/acorn-member.d.ts.map +1 -0
- package/dist/parser/acorn-member.js +31 -0
- package/dist/parser/acorn-member.js.map +1 -0
- package/dist/parser/acorn-types.d.ts +14 -0
- package/dist/parser/acorn-types.d.ts.map +1 -0
- package/dist/parser/acorn-types.js +6 -0
- package/dist/parser/acorn-types.js.map +1 -0
- package/dist/parser/arrow-source.d.ts +23 -0
- package/dist/parser/arrow-source.d.ts.map +1 -0
- package/dist/parser/arrow-source.js +70 -0
- package/dist/parser/arrow-source.js.map +1 -0
- package/dist/parser/group-by.d.ts +17 -0
- package/dist/parser/group-by.d.ts.map +1 -0
- package/dist/parser/group-by.js +62 -0
- package/dist/parser/group-by.js.map +1 -0
- package/dist/parser/index.d.ts +5 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +3 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/parse-arrow.d.ts +10 -0
- package/dist/parser/parse-arrow.d.ts.map +1 -0
- package/dist/parser/parse-arrow.js +9 -0
- package/dist/parser/parse-arrow.js.map +1 -0
- package/dist/parser/predicate-walk.d.ts +24 -0
- package/dist/parser/predicate-walk.d.ts.map +1 -0
- package/dist/parser/predicate-walk.js +247 -0
- package/dist/parser/predicate-walk.js.map +1 -0
- package/dist/parser/resolve.d.ts +25 -0
- package/dist/parser/resolve.d.ts.map +1 -0
- package/dist/parser/resolve.js +134 -0
- package/dist/parser/resolve.js.map +1 -0
- package/dist/parser/select.d.ts +7 -0
- package/dist/parser/select.d.ts.map +1 -0
- package/dist/parser/select.js +333 -0
- package/dist/parser/select.js.map +1 -0
- package/dist/parser/update.d.ts +7 -0
- package/dist/parser/update.d.ts.map +1 -0
- package/dist/parser/update.js +51 -0
- package/dist/parser/update.js.map +1 -0
- package/dist/postgres/aggregates.d.ts +12 -0
- package/dist/postgres/aggregates.d.ts.map +1 -0
- package/dist/postgres/aggregates.js +19 -0
- package/dist/postgres/aggregates.js.map +1 -0
- package/dist/postgres.d.ts +6 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/postgres.js +6 -0
- package/dist/postgres.js.map +1 -0
- package/dist/schema/index.d.ts +2 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +2 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/types.d.ts +16 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +40 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/sqlite/aggregates.d.ts +8 -0
- package/dist/sqlite/aggregates.d.ts.map +1 -0
- package/dist/sqlite/aggregates.js +11 -0
- package/dist/sqlite/aggregates.js.map +1 -0
- package/dist/sqlite.d.ts +6 -0
- package/dist/sqlite.d.ts.map +1 -0
- package/dist/sqlite.js +6 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/transformer/bindings.d.ts +18 -0
- package/dist/transformer/bindings.d.ts.map +1 -0
- package/dist/transformer/bindings.js +52 -0
- package/dist/transformer/bindings.js.map +1 -0
- package/dist/transformer/index.d.ts +17 -0
- package/dist/transformer/index.d.ts.map +1 -0
- package/dist/transformer/index.js +75 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/ir-emit.d.ts +12 -0
- package/dist/transformer/ir-emit.d.ts.map +1 -0
- package/dist/transformer/ir-emit.js +144 -0
- package/dist/transformer/ir-emit.js.map +1 -0
- package/dist/transformer/join-transformer.d.ts +12 -0
- package/dist/transformer/join-transformer.d.ts.map +1 -0
- package/dist/transformer/join-transformer.js +102 -0
- package/dist/transformer/join-transformer.js.map +1 -0
- package/dist/transformer/orderby-transformer.d.ts +13 -0
- package/dist/transformer/orderby-transformer.d.ts.map +1 -0
- package/dist/transformer/orderby-transformer.js +84 -0
- package/dist/transformer/orderby-transformer.js.map +1 -0
- package/dist/transformer/select-transformer.d.ts +9 -0
- package/dist/transformer/select-transformer.d.ts.map +1 -0
- package/dist/transformer/select-transformer.js +222 -0
- package/dist/transformer/select-transformer.js.map +1 -0
- package/dist/transformer/shared.d.ts +12 -0
- package/dist/transformer/shared.d.ts.map +1 -0
- package/dist/transformer/shared.js +12 -0
- package/dist/transformer/shared.js.map +1 -0
- package/dist/transformer/subquery-transformer.d.ts +15 -0
- package/dist/transformer/subquery-transformer.d.ts.map +1 -0
- package/dist/transformer/subquery-transformer.js +43 -0
- package/dist/transformer/subquery-transformer.js.map +1 -0
- package/dist/transformer/ts-aggregates.d.ts +13 -0
- package/dist/transformer/ts-aggregates.d.ts.map +1 -0
- package/dist/transformer/ts-aggregates.js +83 -0
- package/dist/transformer/ts-aggregates.js.map +1 -0
- package/dist/transformer/ts-binary.d.ts +8 -0
- package/dist/transformer/ts-binary.d.ts.map +1 -0
- package/dist/transformer/ts-binary.js +32 -0
- package/dist/transformer/ts-binary.js.map +1 -0
- package/dist/transformer/ts-member.d.ts +12 -0
- package/dist/transformer/ts-member.d.ts.map +1 -0
- package/dist/transformer/ts-member.js +22 -0
- package/dist/transformer/ts-member.js.map +1 -0
- package/dist/transformer/ts-utils.d.ts +10 -0
- package/dist/transformer/ts-utils.d.ts.map +1 -0
- package/dist/transformer/ts-utils.js +38 -0
- package/dist/transformer/ts-utils.js.map +1 -0
- package/dist/transformer/typhex-type.d.ts +8 -0
- package/dist/transformer/typhex-type.d.ts.map +1 -0
- package/dist/transformer/typhex-type.js +52 -0
- package/dist/transformer/typhex-type.js.map +1 -0
- package/dist/transformer/where-transformer.d.ts +33 -0
- package/dist/transformer/where-transformer.d.ts.map +1 -0
- package/dist/transformer/where-transformer.js +400 -0
- package/dist/transformer/where-transformer.js.map +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +30 -0
- package/dist/utils.js.map +1 -0
- package/docs/drivers/postgres.md +54 -0
- package/docs/drivers/sqlite.md +33 -0
- package/docs/guide/aggregations.md +272 -0
- package/docs/guide/bulk-operations.md +204 -0
- package/docs/guide/cte-and-unions.md +270 -0
- package/docs/guide/entities-relations.md +208 -0
- package/docs/guide/expressions.md +98 -0
- package/docs/guide/filtering-by-relations.md +166 -0
- package/docs/guide/getting-started.md +277 -0
- package/docs/guide/querying-relations.md +133 -0
- package/docs/guide/subqueries.md +152 -0
- package/docs/guide/transactions.md +146 -0
- package/docs/guide/typescript-transformer.md +138 -0
- package/docs/index.md +33 -0
- package/docs/migrations/overview.md +143 -0
- package/docs/public-api.md +133 -0
- package/docs/reference/api.md +665 -0
- package/docs/reference/architecture.md +83 -0
- package/docs/release-checklist.md +55 -0
- package/etc/typhex.api.md +774 -0
- package/package.json +137 -0
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query builder: the single place where all SQL is built and executed.
|
|
3
|
+
* Provides both query (select, count) and mutation (insert, update, delete)
|
|
4
|
+
* methods. All methods that hit the database return Promises
|
|
5
|
+
* (except insert, which is synchronous to support save()).
|
|
6
|
+
*/
|
|
7
|
+
import { isIrOrderBy, } from "../ir/types.js";
|
|
8
|
+
import { resolveWhereIr, resolveHavingIr, resolveJoinOnIr, resolveOrderBy, resolveSelectIr, resolveGroupByPaths, resolveJoinKeys, resolveUpdateSet, } from "../parser/resolve.js";
|
|
9
|
+
import { RelationResolver } from "./helpers/relations/relation-resolver.js";
|
|
10
|
+
import { buildFindByIdIr, pkToRecord } from "./query-helpers.js";
|
|
11
|
+
import { DEFAULT_ROW_PARAM, QueryPlanBuilder, getQueryCompilerOrThrow, } from "./helpers/query-plan/query-plan.js";
|
|
12
|
+
import { InsertGraphPlanner } from "./helpers/insert-graph/insert-graph-planner.js";
|
|
13
|
+
import { QueryState } from "./query-state.js";
|
|
14
|
+
/** C = entity; T = row shape; Ctes = registered CTE names → row types; FromKind = table vs CTE read. */
|
|
15
|
+
export class QueryBuilder {
|
|
16
|
+
/** @internal */
|
|
17
|
+
static isDebugSqlEnabled = (() => {
|
|
18
|
+
const debugFlag = process?.env?.TYPHEX_DEBUG;
|
|
19
|
+
return debugFlag === "1" || debugFlag === "true" || debugFlag === "yes";
|
|
20
|
+
})();
|
|
21
|
+
/** @internal */
|
|
22
|
+
state;
|
|
23
|
+
/** @internal */
|
|
24
|
+
constructor(state) {
|
|
25
|
+
this.state = state instanceof QueryState ? state : new QueryState(state);
|
|
26
|
+
}
|
|
27
|
+
/** Return a shallow copy of this builder with mutable state (params, orderBy) deep-copied,
|
|
28
|
+
* so chained calls do not mutate the original. */
|
|
29
|
+
clone() {
|
|
30
|
+
return new QueryBuilder(this.state.clone());
|
|
31
|
+
}
|
|
32
|
+
/** @internal — Print the SQL and parameters to stdout when TYPHEX_DEBUG is enabled. */
|
|
33
|
+
logSql(sql, params) {
|
|
34
|
+
console.log("[typhex]", sql);
|
|
35
|
+
if (params.length > 0)
|
|
36
|
+
console.log("[typhex] params:", params);
|
|
37
|
+
}
|
|
38
|
+
/** @internal */
|
|
39
|
+
buildPlan(operation) {
|
|
40
|
+
return QueryPlanBuilder.build(this.state, operation);
|
|
41
|
+
}
|
|
42
|
+
requirePkColumns(context) {
|
|
43
|
+
if (this.state.pkColumns.length === 0) {
|
|
44
|
+
throw new Error(`[typhex] ${context}: entity "${this.state.tableName}" has no primary key`);
|
|
45
|
+
}
|
|
46
|
+
return this.state.pkColumns;
|
|
47
|
+
}
|
|
48
|
+
static splitParams(params) {
|
|
49
|
+
const sqlParams = {};
|
|
50
|
+
const subqueryParams = {};
|
|
51
|
+
for (const [key, value] of Object.entries(params ?? {})) {
|
|
52
|
+
if (value instanceof QueryBuilder) {
|
|
53
|
+
subqueryParams[key] = { state: value.state };
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
sqlParams[key] = value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return { sqlParams, subqueryParams };
|
|
60
|
+
}
|
|
61
|
+
where(predicate, params) {
|
|
62
|
+
const { sqlParams, subqueryParams } = QueryBuilder.splitParams(params);
|
|
63
|
+
Object.assign(this.state.whereParams, sqlParams);
|
|
64
|
+
Object.assign(this.state.subqueryParams, subqueryParams);
|
|
65
|
+
this.state.whereIr = resolveWhereIr(predicate, params ? Object.keys(params) : [], Object.keys(subqueryParams));
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
orderBy(colOrIr, second = "asc") {
|
|
69
|
+
if (isIrOrderBy(colOrIr)) {
|
|
70
|
+
return this.addOrderByIr(colOrIr, typeof second === "object" ? second : null);
|
|
71
|
+
}
|
|
72
|
+
const direction = typeof second === "string" ? second : "asc";
|
|
73
|
+
return this.addOrderByInput(colOrIr, direction);
|
|
74
|
+
}
|
|
75
|
+
addOrderByIr(ir, params) {
|
|
76
|
+
this.addInlineParams(params);
|
|
77
|
+
this.state.orderBy.push(ir);
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
addOrderByInput(input, direction) {
|
|
81
|
+
const paramKeys = Object.keys(this.state.inlineParams ?? {});
|
|
82
|
+
this.state.orderBy.push(resolveOrderBy(input, direction, paramKeys));
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
addInlineParams(params) {
|
|
86
|
+
const { sqlParams, subqueryParams: captured } = QueryBuilder.splitParams(params);
|
|
87
|
+
Object.assign(this.state.subqueryParams, captured);
|
|
88
|
+
if (params !== null) {
|
|
89
|
+
this.state.inlineParams = { ...this.state.inlineParams, ...sqlParams };
|
|
90
|
+
}
|
|
91
|
+
return Object.keys(sqlParams);
|
|
92
|
+
}
|
|
93
|
+
innerJoin(keysOrFnOrEntity, onFn) {
|
|
94
|
+
return this.addJoin(keysOrFnOrEntity, onFn, "inner");
|
|
95
|
+
}
|
|
96
|
+
leftJoin(keysOrFnOrEntity, onFn) {
|
|
97
|
+
return this.addJoin(keysOrFnOrEntity, onFn, "left");
|
|
98
|
+
}
|
|
99
|
+
rightJoin(keysOrFnOrEntity, onFn) {
|
|
100
|
+
return this.addJoin(keysOrFnOrEntity, onFn, "right");
|
|
101
|
+
}
|
|
102
|
+
/** Adds a CROSS JOIN for the given relation keys or accessor function. */
|
|
103
|
+
crossJoin(keysOrFn) {
|
|
104
|
+
return this.addJoinHints(keysOrFn, "cross");
|
|
105
|
+
}
|
|
106
|
+
fullJoin(keysOrFnOrEntity, onFn) {
|
|
107
|
+
return this.addJoin(keysOrFnOrEntity, onFn, "full");
|
|
108
|
+
}
|
|
109
|
+
addJoin(keysOrFnOrEntity, onFn, joinType) {
|
|
110
|
+
if (QueryBuilder.isEntityClass(keysOrFnOrEntity)) {
|
|
111
|
+
if (!onFn) {
|
|
112
|
+
throw new Error(`${joinType}Join(entity): ON callback is required`);
|
|
113
|
+
}
|
|
114
|
+
const onIr = resolveJoinOnIr(joinType, onFn);
|
|
115
|
+
this.state.entityJoinHints = [
|
|
116
|
+
...(this.state.entityJoinHints ?? []),
|
|
117
|
+
{ joinType, entity: keysOrFnOrEntity, onIr },
|
|
118
|
+
];
|
|
119
|
+
return this;
|
|
120
|
+
}
|
|
121
|
+
return this.addJoinHints(keysOrFnOrEntity, joinType);
|
|
122
|
+
}
|
|
123
|
+
static isEntityClass(value) {
|
|
124
|
+
if (typeof value !== "function" || value == null)
|
|
125
|
+
return false;
|
|
126
|
+
const cls = value;
|
|
127
|
+
return typeof cls.table?._table === "string";
|
|
128
|
+
}
|
|
129
|
+
addJoinHints(keysOrFn, joinType) {
|
|
130
|
+
const relationKeys = resolveJoinKeys(keysOrFn);
|
|
131
|
+
const newHints = relationKeys.map((k) => ({ relationKey: k, joinType }));
|
|
132
|
+
this.state.joinHints = [...(this.state.joinHints ?? []), ...newHints];
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
/** Set the maximum number of rows to return. */
|
|
136
|
+
limit(n) {
|
|
137
|
+
this.state.limitNum = n;
|
|
138
|
+
return this;
|
|
139
|
+
}
|
|
140
|
+
/** Set the number of rows to skip before returning results. */
|
|
141
|
+
offset(n) {
|
|
142
|
+
this.state.offsetNum = n;
|
|
143
|
+
return this;
|
|
144
|
+
}
|
|
145
|
+
withCte(name, subqueryOrBuild) {
|
|
146
|
+
const next = this.clone();
|
|
147
|
+
const registeredCteNames = (next.state.ctes ?? []).map((c) => c.name);
|
|
148
|
+
const inner = typeof subqueryOrBuild === "function"
|
|
149
|
+
? subqueryOrBuild({})
|
|
150
|
+
: subqueryOrBuild;
|
|
151
|
+
const innerState = inner.state.clone();
|
|
152
|
+
if (typeof subqueryOrBuild === "function") {
|
|
153
|
+
innerState.inScopeRegisteredCteNames = registeredCteNames;
|
|
154
|
+
}
|
|
155
|
+
next.state.ctes = [...(next.state.ctes ?? []), { name, kind: "simple", inner: innerState }];
|
|
156
|
+
return next;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Register a recursive CTE: `WITH RECURSIVE name AS (<anchor> UNION ALL <recursive>)`.
|
|
160
|
+
* The body should use `.unionAll()` for the recursive step and may `.from(name)` for self-reference.
|
|
161
|
+
*/
|
|
162
|
+
withRecursiveCte(name, subquery) {
|
|
163
|
+
const next = this.clone();
|
|
164
|
+
next.state.ctes = [
|
|
165
|
+
...(next.state.ctes ?? []),
|
|
166
|
+
{ name, kind: "recursive", inner: subquery.state.clone() },
|
|
167
|
+
];
|
|
168
|
+
return next;
|
|
169
|
+
}
|
|
170
|
+
/** Append a `UNION ALL` branch to this SELECT (used for recursive CTE bodies). */
|
|
171
|
+
unionAll(other) {
|
|
172
|
+
const next = this.clone();
|
|
173
|
+
next.state.unionAll = other.state.clone();
|
|
174
|
+
return next;
|
|
175
|
+
}
|
|
176
|
+
from(source) {
|
|
177
|
+
const next = this.clone();
|
|
178
|
+
if (source === undefined) {
|
|
179
|
+
next.state.fromSource = { kind: "table" };
|
|
180
|
+
return next;
|
|
181
|
+
}
|
|
182
|
+
if (typeof source === "string") {
|
|
183
|
+
next.state.fromSource = { kind: "cte", name: source };
|
|
184
|
+
return next;
|
|
185
|
+
}
|
|
186
|
+
next.state.fromSource = { kind: "subquery", state: source.state.clone() };
|
|
187
|
+
return next;
|
|
188
|
+
}
|
|
189
|
+
select(columnsOrIr, params = null) {
|
|
190
|
+
const paramKeys = this.addInlineParams(params);
|
|
191
|
+
this.state.selectIr = resolveSelectIr(columnsOrIr, paramKeys);
|
|
192
|
+
return this;
|
|
193
|
+
}
|
|
194
|
+
/** Adds a GROUP BY clause. Accepts column names, index numbers, or an arrow function selecting group-by fields. */
|
|
195
|
+
groupBy(columnOrFn, ...rest) {
|
|
196
|
+
const entries = resolveGroupByPaths(columnOrFn, ...rest);
|
|
197
|
+
const nextSelectIr = this.state.selectIr ?? { param: DEFAULT_ROW_PARAM, paths: [] };
|
|
198
|
+
const memberPaths = entries.filter((e) => Array.isArray(e));
|
|
199
|
+
this.state.selectIr = {
|
|
200
|
+
...nextSelectIr,
|
|
201
|
+
paths: nextSelectIr.paths.length > 0 ? nextSelectIr.paths : memberPaths,
|
|
202
|
+
groupBy: entries,
|
|
203
|
+
};
|
|
204
|
+
return this;
|
|
205
|
+
}
|
|
206
|
+
having(predicate, params) {
|
|
207
|
+
const { sqlParams, subqueryParams } = QueryBuilder.splitParams(params);
|
|
208
|
+
Object.assign(this.state.subqueryParams, subqueryParams);
|
|
209
|
+
this.state.havingIr = resolveHavingIr(predicate, params ? Object.keys(params) : [], Object.keys(subqueryParams));
|
|
210
|
+
this.state.havingParams = sqlParams;
|
|
211
|
+
return this;
|
|
212
|
+
}
|
|
213
|
+
/** Update matching rows with `set`, then re-fetch and return the updated row,
|
|
214
|
+
* or null if no matching row is found after the update. */
|
|
215
|
+
async patch(set) {
|
|
216
|
+
await this.update(set);
|
|
217
|
+
const fresh = new QueryBuilder({
|
|
218
|
+
...this.state,
|
|
219
|
+
orderBy: [],
|
|
220
|
+
limitNum: null,
|
|
221
|
+
offsetNum: null,
|
|
222
|
+
selectIr: null,
|
|
223
|
+
ctes: undefined,
|
|
224
|
+
fromSource: undefined,
|
|
225
|
+
});
|
|
226
|
+
return (await fresh.first()) ?? null;
|
|
227
|
+
}
|
|
228
|
+
/** Insert a single row. Awaitable directly, or chain `.onConflict(cols).doUpdate()` / `.doNothing()`. */
|
|
229
|
+
insert(row) {
|
|
230
|
+
return new InsertBuilder(this.state, row);
|
|
231
|
+
}
|
|
232
|
+
/** Insert multiple rows in one statement. Awaitable directly, or chain `.onConflict(cols).doUpdate()` / `.doNothing()`. */
|
|
233
|
+
insertMany(rows) {
|
|
234
|
+
return new InsertBuilder(this.state, rows);
|
|
235
|
+
}
|
|
236
|
+
async insertGraph(input) {
|
|
237
|
+
return new InsertGraphPlanner(this.state, input).execute();
|
|
238
|
+
}
|
|
239
|
+
/** Select single row by primary key (scalar or composite object). */
|
|
240
|
+
async findById(id) {
|
|
241
|
+
const pkCols = this.requirePkColumns("findById");
|
|
242
|
+
const row = await this.where(buildFindByIdIr(pkCols, pkToRecord(pkCols, id))).first();
|
|
243
|
+
return row ?? null;
|
|
244
|
+
}
|
|
245
|
+
/** Execute the query and return all matching rows, with relations loaded
|
|
246
|
+
* and the hydration function applied if one is set. */
|
|
247
|
+
async toArray() {
|
|
248
|
+
const { hydrate, qe } = this.state;
|
|
249
|
+
const plan = this.buildPlan({ kind: "select" });
|
|
250
|
+
const compiler = getQueryCompilerOrThrow(this.state);
|
|
251
|
+
const { sql, params } = compiler.compilePlan(plan);
|
|
252
|
+
if (QueryBuilder.isDebugSqlEnabled)
|
|
253
|
+
this.logSql(sql, params);
|
|
254
|
+
const rows = (await qe.query(sql, params));
|
|
255
|
+
await new RelationResolver(plan, qe, rows).resolve();
|
|
256
|
+
if (!hydrate)
|
|
257
|
+
return rows;
|
|
258
|
+
return Promise.all(rows.map((r) => hydrate(r)));
|
|
259
|
+
}
|
|
260
|
+
/** Return the first matching row, or undefined if the result set is empty. */
|
|
261
|
+
async first() {
|
|
262
|
+
const arr = await this.limit(1).toArray();
|
|
263
|
+
return arr[0];
|
|
264
|
+
}
|
|
265
|
+
/** Execute a COUNT query and return rows the query would produce without limit/offset/orderBy. */
|
|
266
|
+
async count() {
|
|
267
|
+
const { qe } = this.state;
|
|
268
|
+
const compiler = getQueryCompilerOrThrow(this.state);
|
|
269
|
+
const plan = this.buildPlan({ kind: "select" });
|
|
270
|
+
const { sql, params } = compiler.compileResultSize(plan);
|
|
271
|
+
if (QueryBuilder.isDebugSqlEnabled)
|
|
272
|
+
this.logSql(sql, params);
|
|
273
|
+
const rows = (await qe.query(sql, params));
|
|
274
|
+
return Number(rows[0]?.c ?? 0);
|
|
275
|
+
}
|
|
276
|
+
async update(setOrFn) {
|
|
277
|
+
const resolved = resolveUpdateSet(setOrFn);
|
|
278
|
+
this.state.updateSetIr = resolved.setIr;
|
|
279
|
+
const { qe } = this.state;
|
|
280
|
+
const compiler = getQueryCompilerOrThrow(this.state);
|
|
281
|
+
const { sql, params } = compiler.compilePlan(this.buildPlan({ kind: "update", ...resolved }));
|
|
282
|
+
if (!sql)
|
|
283
|
+
return 0;
|
|
284
|
+
if (QueryBuilder.isDebugSqlEnabled)
|
|
285
|
+
this.logSql(sql, params);
|
|
286
|
+
const result = await qe.run(sql, params);
|
|
287
|
+
return result.changes;
|
|
288
|
+
}
|
|
289
|
+
async updateReturning(setOrFn) {
|
|
290
|
+
const resolved = resolveUpdateSet(setOrFn);
|
|
291
|
+
this.state.updateSetIr = resolved.setIr;
|
|
292
|
+
const { qe, hydrate } = this.state;
|
|
293
|
+
const compiler = getQueryCompilerOrThrow(this.state);
|
|
294
|
+
const { sql, params } = compiler.compilePlan(this.buildPlan({ kind: "update", ...resolved, returning: true }));
|
|
295
|
+
if (!sql)
|
|
296
|
+
return [];
|
|
297
|
+
if (QueryBuilder.isDebugSqlEnabled)
|
|
298
|
+
this.logSql(sql, params);
|
|
299
|
+
const rows = (await qe.query(sql, params));
|
|
300
|
+
if (!hydrate)
|
|
301
|
+
return rows;
|
|
302
|
+
return Promise.all(rows.map((r) => hydrate(r)));
|
|
303
|
+
}
|
|
304
|
+
/** Execute a DELETE for the current WHERE clause and return the number of affected rows. */
|
|
305
|
+
async delete() {
|
|
306
|
+
const { qe } = this.state;
|
|
307
|
+
const compiler = getQueryCompilerOrThrow(this.state);
|
|
308
|
+
const { sql, params } = compiler.compilePlan(this.buildPlan({ kind: "delete" }));
|
|
309
|
+
if (QueryBuilder.isDebugSqlEnabled)
|
|
310
|
+
this.logSql(sql, params);
|
|
311
|
+
const result = await qe.run(sql, params);
|
|
312
|
+
return result.changes;
|
|
313
|
+
}
|
|
314
|
+
/** DELETE ... RETURNING * (when supported). */
|
|
315
|
+
async deleteReturning() {
|
|
316
|
+
const { qe, hydrate } = this.state;
|
|
317
|
+
const compiler = getQueryCompilerOrThrow(this.state);
|
|
318
|
+
const { sql, params } = compiler.compilePlan(this.buildPlan({ kind: "delete", returning: true }));
|
|
319
|
+
if (QueryBuilder.isDebugSqlEnabled)
|
|
320
|
+
this.logSql(sql, params);
|
|
321
|
+
const rows = (await qe.query(sql, params));
|
|
322
|
+
if (!hydrate)
|
|
323
|
+
return rows;
|
|
324
|
+
return Promise.all(rows.map((r) => hydrate(r)));
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Deferred insert returned by `insert()` / `insertMany()`.
|
|
329
|
+
* Extends `QueryBuilder` so it owns its execution logic and has direct access to state.
|
|
330
|
+
* Awaitable directly (no conflict handling) or chain `.onConflict(cols).doUpdate()` / `.doNothing()`.
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* await qb.insert(row);
|
|
334
|
+
* await qb.insert(row).onConflict(["sku"]).doUpdate();
|
|
335
|
+
* await qb.insertMany(rows).onConflict(["sku"]).doNothing();
|
|
336
|
+
*/
|
|
337
|
+
export class InsertBuilder extends QueryBuilder {
|
|
338
|
+
_conflictCols;
|
|
339
|
+
_payload;
|
|
340
|
+
/** @internal */
|
|
341
|
+
constructor(state, payload) {
|
|
342
|
+
super(state);
|
|
343
|
+
this._payload = payload;
|
|
344
|
+
}
|
|
345
|
+
/** Store the conflict target columns; returns `this` for chaining. */
|
|
346
|
+
onConflict(columns) {
|
|
347
|
+
this._conflictCols = columns;
|
|
348
|
+
return this;
|
|
349
|
+
}
|
|
350
|
+
/** `ON CONFLICT (...) DO UPDATE SET ...` — executes the insert. */
|
|
351
|
+
doUpdate(updateColumns) {
|
|
352
|
+
return this._execute({ conflictColumns: this._conflictCols, action: "update", updateColumns });
|
|
353
|
+
}
|
|
354
|
+
/** `ON CONFLICT (...) DO NOTHING` — executes the insert. */
|
|
355
|
+
doNothing() {
|
|
356
|
+
return this._execute({ conflictColumns: this._conflictCols, action: "nothing" });
|
|
357
|
+
}
|
|
358
|
+
/** PromiseLike: allows `await insert(row)` without a conflict clause. */
|
|
359
|
+
then(res, rej) {
|
|
360
|
+
return this._execute().then(res, rej);
|
|
361
|
+
}
|
|
362
|
+
_execute(onConflict) {
|
|
363
|
+
return (Array.isArray(this._payload)
|
|
364
|
+
? this._doInsertMany(this._payload, onConflict)
|
|
365
|
+
: this._doInsert(this._payload, onConflict));
|
|
366
|
+
}
|
|
367
|
+
async _doInsert(row, onConflict) {
|
|
368
|
+
const { columnNames, qe, hydrate } = this.state;
|
|
369
|
+
const compiler = getQueryCompilerOrThrow(this.state);
|
|
370
|
+
const cols = columnNames.filter((c) => row[c] !== undefined);
|
|
371
|
+
const params = cols.map((c) => row[c]);
|
|
372
|
+
const pkCols = this.state.pkColumns;
|
|
373
|
+
this.state.insertIr = undefined;
|
|
374
|
+
const compiled = compiler.compilePlan(this.buildPlan({
|
|
375
|
+
kind: "insert",
|
|
376
|
+
columns: cols,
|
|
377
|
+
values: params,
|
|
378
|
+
pk: pkCols,
|
|
379
|
+
onConflict,
|
|
380
|
+
}));
|
|
381
|
+
if (QueryBuilder.isDebugSqlEnabled)
|
|
382
|
+
this.logSql(compiled.sql, compiled.params);
|
|
383
|
+
if (compiled.returningRow) {
|
|
384
|
+
const rows = (await qe.query(compiled.sql, compiled.params));
|
|
385
|
+
const raw = rows[0];
|
|
386
|
+
if (raw == null)
|
|
387
|
+
throw new Error("insert: RETURNING returned no row");
|
|
388
|
+
if (hydrate)
|
|
389
|
+
return (await hydrate(raw));
|
|
390
|
+
return raw;
|
|
391
|
+
}
|
|
392
|
+
const result = await qe.run(compiled.sql, compiled.params);
|
|
393
|
+
if (pkCols.length === 0)
|
|
394
|
+
return undefined;
|
|
395
|
+
// For single auto-increment PKs use lastID; for composite PKs all values are in `row`.
|
|
396
|
+
const pkRow = pkCols.length === 1 && result.lastID != null ? { ...row, [pkCols[0]]: result.lastID } : row;
|
|
397
|
+
const whereIr = buildFindByIdIr(pkCols, pkRow);
|
|
398
|
+
const inst = await this.clone().where(whereIr).first();
|
|
399
|
+
if (!inst)
|
|
400
|
+
throw new Error("insert: insert succeeded but row not found");
|
|
401
|
+
return inst;
|
|
402
|
+
}
|
|
403
|
+
async _doInsertMany(rows, onConflict) {
|
|
404
|
+
if (rows.length === 0)
|
|
405
|
+
return [];
|
|
406
|
+
const { columnNames, qe, hydrate } = this.state;
|
|
407
|
+
const compiler = getQueryCompilerOrThrow(this.state);
|
|
408
|
+
const pkCols = this.state.pkColumns;
|
|
409
|
+
// Collect columns in entity-defined order, keeping any column present in at least one row.
|
|
410
|
+
const cols = columnNames.filter((c) => rows.some((r) => r[c] !== undefined));
|
|
411
|
+
const paramRows = rows.map((r) => cols.map((c) => r[c] ?? null));
|
|
412
|
+
this.state.insertIr = undefined;
|
|
413
|
+
const compiled = compiler.compilePlan(this.buildPlan({
|
|
414
|
+
kind: "insertMany",
|
|
415
|
+
columns: cols,
|
|
416
|
+
rows: paramRows,
|
|
417
|
+
pk: pkCols,
|
|
418
|
+
onConflict,
|
|
419
|
+
}));
|
|
420
|
+
if (QueryBuilder.isDebugSqlEnabled)
|
|
421
|
+
this.logSql(compiled.sql, compiled.params);
|
|
422
|
+
if (compiled.returningRow) {
|
|
423
|
+
const returned = (await qe.query(compiled.sql, compiled.params));
|
|
424
|
+
const hydratedRows = [];
|
|
425
|
+
for (const raw of returned)
|
|
426
|
+
hydratedRows.push(hydrate ? (await hydrate(raw)) : raw);
|
|
427
|
+
return hydratedRows;
|
|
428
|
+
}
|
|
429
|
+
await qe.run(compiled.sql, compiled.params);
|
|
430
|
+
return [];
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../src/orm/query-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAQL,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AACpF,OAAO,EAAE,UAAU,EAA8C,MAAM,kBAAkB,CAAC;AAsB1F,wGAAwG;AACxG,MAAM,OAAO,YAAY;IAMvB,gBAAgB;IACN,MAAM,CAAU,iBAAiB,GAAG,CAAC,GAAY,EAAE;QAC3D,MAAM,SAAS,GAAG,OAAO,EAAE,GAAG,EAAE,YAAY,CAAC;QAC7C,OAAO,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,KAAK,CAAC;IAC1E,CAAC,CAAC,EAAE,CAAC;IAEL,gBAAgB;IACN,KAAK,CAAgB;IAC/B,gBAAgB;IAChB,YAAY,KAAwC;QAClD,IAAI,CAAC,KAAK,GAAG,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC;IAED;uDACmD;IACnD,KAAK;QACH,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,uFAAuF;IAC7E,MAAM,CAAC,GAAW,EAAE,MAAiB;QAC7C,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,gBAAgB;IACN,SAAS,CAAC,SAAyB;QAC3C,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;IAES,gBAAgB,CAAC,OAAe;QACxC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,aAAa,IAAI,CAAC,KAAK,CAAC,SAAS,sBAAsB,CAAC,CAAC;QAC9F,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAC9B,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,MAAuC;QAChE,MAAM,SAAS,GAA4B,EAAE,CAAC;QAC9C,MAAM,cAAc,GAAqC,EAAE,CAAC;QAE5D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;YACxD,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;IACvC,CAAC;IAaD,KAAK,CACH,SAAwD,EACxD,MAAgC;QAEhC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,cAAc,CACjC,SAAqD,EACrD,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EACjC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAC5B,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAOD,OAAO,CACL,OAAmD,EACnD,SAA0D,KAAK;QAE/D,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9D,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC;IAEO,YAAY,CAAC,EAAa,EAAE,MAAsC;QACxE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,eAAe,CAAC,KAAqC,EAAE,SAAyB;QACtF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CACrB,cAAc,CAAC,KAA6C,EAAE,SAAS,EAAE,SAAS,CAAC,CACpF,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,eAAe,CAAC,MAAsC;QAC5D,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,SAAS,EAAE,CAAC;QACzE,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAQD,SAAS,CACP,gBAAmE,EACnE,IAAuD;QAEvD,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAQD,QAAQ,CACN,gBAAmE,EACnE,IAAuD;QAEvD,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAQD,SAAS,CACP,gBAAmE,EACnE,IAAuD;QAEvD,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,0EAA0E;IAC1E,SAAS,CAAC,QAA0C;QAClD,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAQD,QAAQ,CACN,gBAAmE,EACnE,IAAuD;QAEvD,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAEO,OAAO,CACb,gBAAmE,EACnE,IAAoE,EACpE,QAAkB;QAElB,IAAI,YAAY,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,uCAAuC,CAAC,CAAC;YACtE,CAAC;YACD,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAkD,CAAC,CAAC;YAC3F,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG;gBAC3B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC;gBACrC,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE;aAC7C,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAoD,EAAE,QAAQ,CAAC,CAAC;IAC3F,CAAC;IAEO,MAAM,CAAC,aAAa,CAAC,KAAc;QACzC,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC;QAC/D,MAAM,GAAG,GAAG,KAAkC,CAAC;QAC/C,OAAO,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC;IAC/C,CAAC;IAEO,YAAY,CAAC,QAA0C,EAAE,QAAkB;QACjF,MAAM,YAAY,GAAG,eAAe,CAAC,QAAkD,CAAC,CAAC;QACzF,MAAM,QAAQ,GAAe,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gDAAgD;IAChD,KAAK,CAAC,CAAS;QACb,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+DAA+D;IAC/D,MAAM,CAAC,CAAS;QACd,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAUD,OAAO,CACL,IAAO,EACP,eAEoE;QAEpE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,kBAAkB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,KAAK,GACT,OAAO,eAAe,KAAK,UAAU;YACnC,CAAC,CAAC,eAAe,CAAC,EAA0B,CAAC;YAC7C,CAAC,CAAC,eAAe,CAAC;QACtB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,OAAO,eAAe,KAAK,UAAU,EAAE,CAAC;YAC1C,UAAU,CAAC,yBAAyB,GAAG,kBAAkB,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5F,OAAO,IAA0D,CAAC;IACpE,CAAC;IAED;;;OAGG;IACH,gBAAgB,CACd,IAAO,EACP,QAAwC;QAExC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG;YAChB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAC1B,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE;SAC3D,CAAC;QACF,OAAO,IAA0D,CAAC;IACpE,CAAC;IAED,kFAAkF;IAClF,QAAQ,CACN,KAAqC;QAErC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAUD,IAAI,CACF,MAAwC;QAExC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAC1C,OAAO,IAAyD,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACtD,OAAO,IAAoD,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAC1E,OAAO,IAAsD,CAAC;IAChE,CAAC;IAQD,MAAM,CACJ,WAAmF,EACnF,SAAyC,IAAI;QAE7C,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,eAAe,CACnC,WAAgF,EAChF,SAAS,CACV,CAAC;QACF,OAAO,IAAsC,CAAC;IAChD,CAAC;IAED,mHAAmH;IACnH,OAAO,CACL,UAAyF,EACzF,GAAG,IAAyB;QAE5B,MAAM,OAAO,GAAG,mBAAmB,CACjC,UAAiF,EACjF,GAAG,IAAI,CACR,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACpF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAiB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG;YACpB,GAAG,YAAY;YACf,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW;YACvE,OAAO,EAAE,OAAO;SACjB,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAWD,MAAM,CACJ,SAAyD,EACzD,MAAgC;QAEhC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,eAAe,CACnC,SAAsD,EACtD,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EACjC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAC5B,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;gEAC4D;IAC5D,KAAK,CAAC,KAAK,CAAC,GAA4B;QACtC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,YAAY,CAAO;YACnC,GAAG,IAAI,CAAC,KAAK;YACb,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;IACvC,CAAC;IAED,yGAAyG;IACzG,MAAM,CAAC,GAA4B;QACjC,OAAO,IAAI,aAAa,CACtB,IAAI,CAAC,KAAsC,EAC3C,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,2HAA2H;IAC3H,UAAU,CAAC,IAA+B;QACxC,OAAO,IAAI,aAAa,CACtB,IAAI,CAAC,KAAsC,EAC3C,IAAI,CACL,CAAC;IACJ,CAAC;IAMD,KAAK,CAAC,WAAW,CACf,KAA0D;QAE1D,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAsC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9F,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,QAAQ,CAAC,EAAW;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACtF,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED;4DACwD;IACxD,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,YAAY,CAAC,iBAAiB;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAA8B,CAAC;QACxE,MAAM,IAAI,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACrD,IAAI,CAAC,OAAO;YAAE,OAAO,IAA2B,CAAC;QACjD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAiC,CAAC;IAClF,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,KAAK;QACT,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC1C,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,kGAAkG;IAClG,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,YAAY,CAAC,iBAAiB;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAoB,CAAC;QAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC;IASD,KAAK,CAAC,MAAM,CACV,OAAsF;QAEtF,MAAM,QAAQ,GAAG,gBAAgB,CAC/B,OAAgF,CACjF,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC;QACxC,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC9F,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC;QACnB,IAAI,YAAY,CAAC,iBAAiB;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IASD,KAAK,CAAC,eAAe,CACnB,OAAsF;QAEtF,MAAM,QAAQ,GAAG,gBAAgB,CAC/B,OAAgF,CACjF,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC;QACxC,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,CAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CACjE,CAAC;QACF,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,IAAI,YAAY,CAAC,iBAAiB;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAA8B,CAAC;QACxE,IAAI,CAAC,OAAO;YAAE,OAAO,IAA2B,CAAC;QACjD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAiC,CAAC;IAClF,CAAC;IAED,4FAA4F;IAC5F,KAAK,CAAC,MAAM;QACV,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACjF,IAAI,YAAY,CAAC,iBAAiB;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,eAAe;QACnB,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,CAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CACpD,CAAC;QACF,IAAI,YAAY,CAAC,iBAAiB;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAA8B,CAAC;QACxE,IAAI,CAAC,OAAO;YAAE,OAAO,IAA2B,CAAC;QACjD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAiC,CAAC;IAClF,CAAC;;AAGH;;;;;;;;;GASG;AACH,MAAM,OAAO,aACX,SAAQ,YAAe;IAGf,aAAa,CAAY;IAChB,QAAQ,CAAsD;IAE/E,gBAAgB;IAChB,YACE,KAAoC,EACpC,OAA4D;QAE5D,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,sEAAsE;IACtE,UAAU,CAAC,OAAiB;QAC1B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mEAAmE;IACnE,QAAQ,CAAC,aAAwB;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,aAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,4DAA4D;IAC5D,SAAS;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,aAAc,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,yEAAyE;IACzE,IAAI,CACF,GAA6C,EAC7C,GAAmD;QAEnD,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAEO,QAAQ,CAAC,UAA6B;QAC5C,OAAO,CACL,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;YAC/C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAChC,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,SAAS,CACrB,GAA4B,EAC5B,UAA6B;QAE7B,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAChD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAEhC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CACnC,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,MAAM;YACd,EAAE,EAAE,MAAM;YACV,UAAU;SACX,CAAC,CACH,CAAC;QACF,IAAI,YAAY,CAAC,iBAAiB;YAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE/E,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAA8B,CAAC;YAC1F,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,GAAG,IAAI,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACtE,IAAI,OAAO;gBAAE,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAsB,CAAC;YAC9D,OAAO,GAAwB,CAAC;QAClC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1C,uFAAuF;QACvF,MAAM,KAAK,GACT,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9F,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;QACvD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,IAA+B,EAC/B,UAA6B;QAE7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACjC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAChD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAEpC,2FAA2F;QAC3F,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAEhC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CACnC,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,MAAM;YACV,UAAU;SACX,CAAC,CACH,CAAC;QACF,IAAI,YAAY,CAAC,iBAAiB;YAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE/E,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAA8B,CAAC;YAC9F,MAAM,YAAY,GAAwB,EAAE,CAAC;YAC7C,KAAK,MAAM,GAAG,IAAI,QAAQ;gBACxB,YAAY,CAAC,IAAI,CACf,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAuB,CAAC,CAAC,CAAE,GAAyB,CACnF,CAAC;YACJ,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,MAAM,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal helpers for building IR. Not exported from public API.
|
|
3
|
+
* Used by Entity and other internal modules.
|
|
4
|
+
*/
|
|
5
|
+
import type { IrWhere } from "../ir/types.js";
|
|
6
|
+
/** Build IR for: column === value. Used for PK lookups, etc. */
|
|
7
|
+
export declare function whereColumnEq(column: string, value: unknown, param?: string): IrWhere;
|
|
8
|
+
/** Build IR for: column IN array. Used for batch relation loading. */
|
|
9
|
+
export declare function whereColumnIn(column: string, values: unknown[], param?: string): IrWhere;
|
|
10
|
+
/** Combine two IR nodes with AND. Used when relation has both base filter and user where. */
|
|
11
|
+
export declare function whereAnd(left: IrWhere, right: IrWhere): IrWhere;
|
|
12
|
+
/** Serialize a row's values for the given columns into a stable string key.
|
|
13
|
+
* Used for composite-key grouping/lookup when columns > 1. */
|
|
14
|
+
export declare function makeCompositeKey(row: Record<string, unknown>, cols: string[]): string;
|
|
15
|
+
/**
|
|
16
|
+
* Build a WHERE IR that filters rows by a set of columns using AND-of-INs.
|
|
17
|
+
* Single column: WHERE tgtCol IN (v1, v2, ...)
|
|
18
|
+
* Multiple columns: WHERE tgtCol1 IN (v1a, v1b) AND tgtCol2 IN (v2a, v2b) AND ...
|
|
19
|
+
*
|
|
20
|
+
* Collects distinct non-null values for each srcCol from `rows` and compares
|
|
21
|
+
* them against the corresponding tgtCol in the target query. The result is the
|
|
22
|
+
* cross-product of distinct values per column — a superset of the exact matches.
|
|
23
|
+
* The in-memory grouping step (groupByCompositeKey / indexByCompositeKey)
|
|
24
|
+
* corrects any over-fetch.
|
|
25
|
+
*
|
|
26
|
+
* Returns null when any column produces an empty value set (nothing to fetch).
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildRelationFetchWhereIr(rows: Record<string, unknown>[], srcCols: string[], tgtCols: string[]): IrWhere | null;
|
|
29
|
+
/** Build WHERE IR for a primary key match. Accepts a Record keyed by PK column names
|
|
30
|
+
* (entity instance, composite id object, or the result of `pkToRecord`). */
|
|
31
|
+
export declare function buildFindByIdIr(pkColumns: string[], id: Record<string, unknown>): IrWhere;
|
|
32
|
+
/** Normalise a user-supplied PK value to a Record.
|
|
33
|
+
* Scalar values (e.g. `5`) are wrapped as `{ [col]: value }` for single-column PKs. */
|
|
34
|
+
export declare function pkToRecord(pkColumns: string[], id: unknown): Record<string, unknown>;
|
|
35
|
+
//# sourceMappingURL=query-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-helpers.d.ts","sourceRoot":"","sources":["../../src/orm/query-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAU,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAKtD,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,SAAoB,GAAG,OAAO,CAEhG;AAWD,sEAAsE;AACtE,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EAAE,EACjB,KAAK,SAAoB,GACxB,OAAO,CAET;AAUD,6FAA6F;AAC7F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAK/D;AAED;+DAC+D;AAC/D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAErF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,GAAG,IAAI,CAShB;AAED;6EAC6E;AAC7E,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAMzF;AAMD;wFACwF;AACxF,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEpF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal helpers for building IR. Not exported from public API.
|
|
3
|
+
* Used by Entity and other internal modules.
|
|
4
|
+
*/
|
|
5
|
+
import { isRecord } from "../utils.js";
|
|
6
|
+
const DEFAULT_ROW_PARAM = "u";
|
|
7
|
+
/** Build IR for: column === value. Used for PK lookups, etc. */
|
|
8
|
+
export function whereColumnEq(column, value, param = DEFAULT_ROW_PARAM) {
|
|
9
|
+
return toWhere(columnEqNode(column, value, param), param);
|
|
10
|
+
}
|
|
11
|
+
function columnEqNode(column, value, param = DEFAULT_ROW_PARAM) {
|
|
12
|
+
return {
|
|
13
|
+
kind: "binary",
|
|
14
|
+
op: "===",
|
|
15
|
+
left: { kind: "member", param, path: [column] },
|
|
16
|
+
right: { kind: "const", value },
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Build IR for: column IN array. Used for batch relation loading. */
|
|
20
|
+
export function whereColumnIn(column, values, param = DEFAULT_ROW_PARAM) {
|
|
21
|
+
return toWhere(columnInNode(column, values, param), param);
|
|
22
|
+
}
|
|
23
|
+
function columnInNode(column, values, param = DEFAULT_ROW_PARAM) {
|
|
24
|
+
return {
|
|
25
|
+
kind: "in",
|
|
26
|
+
left: { kind: "member", param, path: [column] },
|
|
27
|
+
right: { kind: "const", value: values },
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** Combine two IR nodes with AND. Used when relation has both base filter and user where. */
|
|
31
|
+
export function whereAnd(left, right) {
|
|
32
|
+
return toWhere({ kind: "binary", op: "&&", left: left.node, right: right.node }, left.rootParam, [
|
|
33
|
+
...(left.localParamNames ?? [left.rootParam]),
|
|
34
|
+
...(right.localParamNames ?? [right.rootParam]),
|
|
35
|
+
]);
|
|
36
|
+
}
|
|
37
|
+
/** Serialize a row's values for the given columns into a stable string key.
|
|
38
|
+
* Used for composite-key grouping/lookup when columns > 1. */
|
|
39
|
+
export function makeCompositeKey(row, cols) {
|
|
40
|
+
return cols.map((c) => JSON.stringify(row[c] ?? null)).join("\x00");
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build a WHERE IR that filters rows by a set of columns using AND-of-INs.
|
|
44
|
+
* Single column: WHERE tgtCol IN (v1, v2, ...)
|
|
45
|
+
* Multiple columns: WHERE tgtCol1 IN (v1a, v1b) AND tgtCol2 IN (v2a, v2b) AND ...
|
|
46
|
+
*
|
|
47
|
+
* Collects distinct non-null values for each srcCol from `rows` and compares
|
|
48
|
+
* them against the corresponding tgtCol in the target query. The result is the
|
|
49
|
+
* cross-product of distinct values per column — a superset of the exact matches.
|
|
50
|
+
* The in-memory grouping step (groupByCompositeKey / indexByCompositeKey)
|
|
51
|
+
* corrects any over-fetch.
|
|
52
|
+
*
|
|
53
|
+
* Returns null when any column produces an empty value set (nothing to fetch).
|
|
54
|
+
*/
|
|
55
|
+
export function buildRelationFetchWhereIr(rows, srcCols, tgtCols) {
|
|
56
|
+
let where = null;
|
|
57
|
+
for (let i = 0; i < tgtCols.length; i++) {
|
|
58
|
+
const vals = [...new Set(rows.map((r) => r[srcCols[i]]).filter((v) => v != null))];
|
|
59
|
+
if (vals.length === 0)
|
|
60
|
+
return null;
|
|
61
|
+
const clause = whereColumnIn(tgtCols[i], vals);
|
|
62
|
+
where = where ? whereAnd(where, clause) : clause;
|
|
63
|
+
}
|
|
64
|
+
return where;
|
|
65
|
+
}
|
|
66
|
+
/** Build WHERE IR for a primary key match. Accepts a Record keyed by PK column names
|
|
67
|
+
* (entity instance, composite id object, or the result of `pkToRecord`). */
|
|
68
|
+
export function buildFindByIdIr(pkColumns, id) {
|
|
69
|
+
let node = whereColumnEq(pkColumns[0], id[pkColumns[0]]);
|
|
70
|
+
for (let i = 1; i < pkColumns.length; i++) {
|
|
71
|
+
node = whereAnd(node, whereColumnEq(pkColumns[i], id[pkColumns[i]]));
|
|
72
|
+
}
|
|
73
|
+
return node;
|
|
74
|
+
}
|
|
75
|
+
function toWhere(node, rootParam, localParamNames = [rootParam]) {
|
|
76
|
+
return { node, rootParam, localParamNames: [...new Set(localParamNames)] };
|
|
77
|
+
}
|
|
78
|
+
/** Normalise a user-supplied PK value to a Record.
|
|
79
|
+
* Scalar values (e.g. `5`) are wrapped as `{ [col]: value }` for single-column PKs. */
|
|
80
|
+
export function pkToRecord(pkColumns, id) {
|
|
81
|
+
return isRecord(id) ? id : { [pkColumns[0]]: id };
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=query-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-helpers.js","sourceRoot":"","sources":["../../src/orm/query-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared query-builder state and cloning helpers.
|
|
3
|
+
*/
|
|
4
|
+
import type { WithClause } from "../dbs/types.js";
|
|
5
|
+
import type { IrHaving, IrNode, IrOrderBy, IrSelect, IrWhere, EntityJoinHint, JoinHint } from "../ir/types.js";
|
|
6
|
+
import type { AnyEntityClass } from "../entity/entity.js";
|
|
7
|
+
import type { RelationsMap, RelationDef } from "../entity/relations.js";
|
|
8
|
+
import type { QueryExecutor } from "./db.js";
|
|
9
|
+
export type FromSource = {
|
|
10
|
+
kind: "table";
|
|
11
|
+
} | {
|
|
12
|
+
kind: "cte";
|
|
13
|
+
name: string;
|
|
14
|
+
} | {
|
|
15
|
+
kind: "subquery";
|
|
16
|
+
state: QueryState<unknown>;
|
|
17
|
+
};
|
|
18
|
+
/** Fields required to construct a {@link QueryState}. */
|
|
19
|
+
export interface QueryStateInit<T = unknown> {
|
|
20
|
+
tableName: string;
|
|
21
|
+
columnNames: string[];
|
|
22
|
+
qe: QueryExecutor;
|
|
23
|
+
pkColumns: string[];
|
|
24
|
+
whereIr: IrWhere | null;
|
|
25
|
+
whereParams: Record<string, unknown>;
|
|
26
|
+
subqueryParams: Record<string, CapturedSubquery>;
|
|
27
|
+
orderBy: IrOrderBy[];
|
|
28
|
+
limitNum: number | null;
|
|
29
|
+
offsetNum: number | null;
|
|
30
|
+
selectIr: IrSelect | null;
|
|
31
|
+
inlineParams?: Record<string, unknown>;
|
|
32
|
+
relations?: RelationsMap;
|
|
33
|
+
hydrate?: (row: Record<string, unknown>) => T | Promise<T>;
|
|
34
|
+
resolveRelationTarget?: (rel: RelationDef) => {
|
|
35
|
+
table: string;
|
|
36
|
+
pk: string[];
|
|
37
|
+
schema: Record<string, string>;
|
|
38
|
+
} | null;
|
|
39
|
+
joinHints?: JoinHint[];
|
|
40
|
+
/** JOIN to entity tables with custom ON (e.g. recursive CTE self-join). */
|
|
41
|
+
entityJoinHints?: EntityJoinHint[];
|
|
42
|
+
havingIr: IrHaving | null;
|
|
43
|
+
havingParams: Record<string, unknown>;
|
|
44
|
+
entity?: AnyEntityClass;
|
|
45
|
+
/** UNION ALL branch appended to this SELECT (anchor.unionAll(recursive)). */
|
|
46
|
+
unionAll?: QueryState<unknown>;
|
|
47
|
+
ctes?: WithClause[];
|
|
48
|
+
/** Registered sibling CTE names in scope (bodies built via `withCte` callback). */
|
|
49
|
+
inScopeRegisteredCteNames?: string[];
|
|
50
|
+
fromSource?: FromSource | null;
|
|
51
|
+
/** Parsed SET column IR for UPDATE (set before plan; not cloned by default). */
|
|
52
|
+
updateSetIr?: Record<string, IrNode>;
|
|
53
|
+
/** Parsed VALUES column IR for INSERT / upsert (reserved; set before plan when supported). */
|
|
54
|
+
insertIr?: Record<string, IrNode>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=query-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-state.d.ts","sourceRoot":"","sources":["../../src/orm/query-state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EACV,QAAQ,EACR,MAAM,EACN,SAAS,EACT,QAAQ,EACR,OAAO,EACP,cAAc,EACd,QAAQ,EACT,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAO7C,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AAErD,yDAAyD;AACzD,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,EAAE,EAAE,aAAa,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACjD,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3D,qBAAqB,CAAC,EAAE,CACtB,GAAG,EAAE,WAAW,KACb;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5E,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;IACpB,mFAAmF;IACnF,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC;IACrC,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC"}
|