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,549 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QueryPlanBuilder: converts a `QueryState` into a dialect-agnostic `QueryPlan`.
|
|
3
|
+
*
|
|
4
|
+
* # Where this fits
|
|
5
|
+
*
|
|
6
|
+
* The query pipeline has three layers:
|
|
7
|
+
*
|
|
8
|
+
* 1. **QueryBuilder** (`src/orm/query-builder.ts`) — accumulates user calls
|
|
9
|
+
* (`.where`, `.orderBy`, `.select`, …) into a `QueryState`. The state
|
|
10
|
+
* holds raw IR predicates, the three param bags (where/having/subquery),
|
|
11
|
+
* join hints, etc. — it's the user-facing input.
|
|
12
|
+
* 2. **QueryPlanBuilder** (this file) — takes a `QueryState` and produces
|
|
13
|
+
* a `QueryPlan`: a flat, dialect-agnostic structure where every column
|
|
14
|
+
* reference has been resolved to a (table-alias, column-path) pair,
|
|
15
|
+
* every captured `QueryBuilder` has been inlined as a child plan,
|
|
16
|
+
* relations have been split into joins / fetches / projections, and
|
|
17
|
+
* the EXISTS / SUBQUERY / IN shapes have been pre-resolved.
|
|
18
|
+
* 3. **QueryCompiler** (`src/dbs/<dialect>/query-compiler`) — walks the
|
|
19
|
+
* `QueryPlan`'s `Expr` tree to emit SQL strings + parameter arrays.
|
|
20
|
+
* The dialect never sees IR; the planner is the only IR consumer.
|
|
21
|
+
*
|
|
22
|
+
* # The five planning phases
|
|
23
|
+
*
|
|
24
|
+
* `build()` runs them in order:
|
|
25
|
+
*
|
|
26
|
+
* 1. **Alias scope** (`buildParamToAlias`).
|
|
27
|
+
* Decide which row-param names resolve to which SQL table aliases.
|
|
28
|
+
* Subqueries inherit their parent's mapping plus their own aliases.
|
|
29
|
+
* 2. **Relation detection** (`detectRelations`). Decide which relations
|
|
30
|
+
* get joined into the main SELECT vs. kept for the relation pipeline,
|
|
31
|
+
* and pre-resolve any one-to-many EXISTS predicates. Delegated to
|
|
32
|
+
* relation helper classes for the heavy lifting.
|
|
33
|
+
* 3. **Select classification** (`classifySelect`). Split the IR select
|
|
34
|
+
* into joined columns, fetched relations, and joined projections.
|
|
35
|
+
* Delegated to `SelectClassifier`.
|
|
36
|
+
* 4. **IR → Expr conversion**. Pre-build captured child query plans, then
|
|
37
|
+
* convert where, having, orderBy, groupBy, and the select-list through
|
|
38
|
+
* `ExprBuilder` using only precomputed context.
|
|
39
|
+
* 5. **Plan assembly**. Stamp everything onto a `QueryPlan` value object.
|
|
40
|
+
*
|
|
41
|
+
* # Subqueries
|
|
42
|
+
*
|
|
43
|
+
* Inline subqueries (correlated or otherwise) are planned before IR→Expr
|
|
44
|
+
* conversion. The outer scope (current `paramToAlias` and the chosen
|
|
45
|
+
* sub-alias) is threaded through so correlated column references in the
|
|
46
|
+
* inner plan resolve against the outer table alias
|
|
47
|
+
* — that's how `Author.query().select(a => ({ totalPosts:
|
|
48
|
+
* Post.query().where(p => p.authorId === a.id).select(() => count()) }))`
|
|
49
|
+
* compiles to a SQL subquery referencing `t0.id`.
|
|
50
|
+
*/
|
|
51
|
+
import { RelationJoinBuilder, RelationPathAliasBuilder, OneToManyExistsBuilder, } from "../relations/relation-joins.js";
|
|
52
|
+
import { ExprBuilder } from "./expr-builder.js";
|
|
53
|
+
import { SelectClassifier, EMPTY_CLASSIFIED } from "./select-classifier.js";
|
|
54
|
+
import { QueryIrAnalyzer } from "./query-ir-analyzer.js";
|
|
55
|
+
/** Default name for the row-param when no explicit one is in scope. */
|
|
56
|
+
export const DEFAULT_ROW_PARAM = "u";
|
|
57
|
+
/** Alias of the main table for the top-level plan. Subquery plans pick
|
|
58
|
+
* fresh aliases (`t1`, `t2`, …) during the planner's subquery phase. */
|
|
59
|
+
const TABLE_ALIAS = "t0";
|
|
60
|
+
/** @internal
|
|
61
|
+
* Resolve a `QueryCompiler` from the QueryExecutor on a state. Throws if
|
|
62
|
+
* the dialect isn't registered — used by the query-builder to look up
|
|
63
|
+
* the dialect when it needs to compile SQL outside the planner path
|
|
64
|
+
* (e.g. for `findById` shortcuts).
|
|
65
|
+
*/
|
|
66
|
+
export function getQueryCompilerOrThrow(state) {
|
|
67
|
+
return state.qe.dialect.queryCompiler;
|
|
68
|
+
}
|
|
69
|
+
// ─── public entry point ───────────────────────────────────────────────────────
|
|
70
|
+
/** @internal
|
|
71
|
+
* Plan a query against a `QueryState`. Use the static `build` entry
|
|
72
|
+
* point — the constructor is private because every instance only ever
|
|
73
|
+
* runs once (it holds per-build mutable state).
|
|
74
|
+
*/
|
|
75
|
+
export class QueryPlanBuilder {
|
|
76
|
+
/**
|
|
77
|
+
* Top-level entry point. Plans the given state for the given operation
|
|
78
|
+
* (select / insert / update / delete) and returns a `QueryPlan`. The
|
|
79
|
+
* plan is fully self-contained: no further IR walks happen downstream,
|
|
80
|
+
* just dialect SQL emission and relation-pipeline execution.
|
|
81
|
+
*/
|
|
82
|
+
static build(state, operation) {
|
|
83
|
+
const irAnalyzer = new QueryIrAnalyzer(state, DEFAULT_ROW_PARAM);
|
|
84
|
+
const analysis = irAnalyzer.analyze();
|
|
85
|
+
return new QueryPlanBuilder(state, operation, undefined, analysis, irAnalyzer).build();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Internal entry point used by the planner's subquery phase to build a
|
|
89
|
+
* child plan for an inline subquery. Receives the `OuterScope` so the
|
|
90
|
+
* child plan can:
|
|
91
|
+
* - allocate its main alias from the outer's free-alias pool;
|
|
92
|
+
* - inherit the outer's `paramToAlias` for correlated references.
|
|
93
|
+
*
|
|
94
|
+
* Always built as a SELECT — inline subqueries can't be DML.
|
|
95
|
+
*/
|
|
96
|
+
static buildSubQuery(state, operation, outer, analysis) {
|
|
97
|
+
const irAnalyzer = new QueryIrAnalyzer(state, DEFAULT_ROW_PARAM);
|
|
98
|
+
return new QueryPlanBuilder(state, operation, outer, analysis, irAnalyzer).build();
|
|
99
|
+
}
|
|
100
|
+
state;
|
|
101
|
+
operation;
|
|
102
|
+
outer;
|
|
103
|
+
tableAlias;
|
|
104
|
+
analysis;
|
|
105
|
+
irAnalyzer;
|
|
106
|
+
/** Cached row-param for this state. */
|
|
107
|
+
rootParam;
|
|
108
|
+
constructor(state, operation, outer, analysis, irAnalyzer) {
|
|
109
|
+
this.state = state;
|
|
110
|
+
this.operation = operation;
|
|
111
|
+
this.outer = outer;
|
|
112
|
+
this.tableAlias = outer?.subAlias ?? TABLE_ALIAS;
|
|
113
|
+
this.analysis = analysis;
|
|
114
|
+
this.irAnalyzer = irAnalyzer;
|
|
115
|
+
this.rootParam = analysis.rootParam;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Drive the full planning pipeline for this state and produce a
|
|
119
|
+
* `QueryPlan`. Phase order matters:
|
|
120
|
+
*
|
|
121
|
+
* 1. `buildParamToAlias` — needs to run first because every
|
|
122
|
+
* conversion downstream consults it.
|
|
123
|
+
* 2. `detectRelations` — populates joins and one-to-many EXISTS
|
|
124
|
+
* metadata; the alias map for relation joins comes from
|
|
125
|
+
* `RelationPathAliasBuilder`.
|
|
126
|
+
* 3. `classifySelect` — only relevant for SELECT operations; the
|
|
127
|
+
* `EMPTY_CLASSIFIED` sentinel is used otherwise.
|
|
128
|
+
* 4. `buildSubqueryPlans` — pre-build inline child plans while the
|
|
129
|
+
* current scope is available.
|
|
130
|
+
* 5. Construct an `ExprBuilder` with all the precomputed context.
|
|
131
|
+
* 6. Convert where, having, orderBy, groupBy, selectItems through
|
|
132
|
+
* the ExprBuilder.
|
|
133
|
+
* 7. Assemble the final `QueryPlan` value object.
|
|
134
|
+
*
|
|
135
|
+
* Mutation operations (insert/update/delete) skip the SELECT-only
|
|
136
|
+
* fields (orderBy, groupBy, limit, offset, selectItems) — they're
|
|
137
|
+
* left empty/null in the plan.
|
|
138
|
+
*/
|
|
139
|
+
build() {
|
|
140
|
+
const isSelect = this.operation.kind === "select";
|
|
141
|
+
const hasFilter = this.operation.kind !== "insert" && this.operation.kind !== "insertMany";
|
|
142
|
+
const paramToAlias = this.buildParamToAlias();
|
|
143
|
+
const { joins, oneToManyExists } = this.detectRelations();
|
|
144
|
+
const relationPathToAlias = new RelationPathAliasBuilder(joins, Object.keys(paramToAlias)).build();
|
|
145
|
+
const subqueryPlans = this.buildSubqueryPlans(paramToAlias, relationPathToAlias);
|
|
146
|
+
const classified = isSelect ? this.classifySelect() : EMPTY_CLASSIFIED;
|
|
147
|
+
const cteNames = new Set([
|
|
148
|
+
...(this.state.inScopeRegisteredCteNames ?? []),
|
|
149
|
+
...(this.state.ctes ?? []).map((c) => c.name),
|
|
150
|
+
]);
|
|
151
|
+
const exprBuilder = new ExprBuilder(paramToAlias, relationPathToAlias, oneToManyExists, subqueryPlans, new Set(Object.keys(this.state.relations ?? {})), cteNames);
|
|
152
|
+
const whereExpr = hasFilter && this.state.whereIr ? exprBuilder.convert(this.state.whereIr.node) : null;
|
|
153
|
+
const havingExpr = isSelect && this.state.havingIr ? exprBuilder.convert(this.state.havingIr.node) : null;
|
|
154
|
+
const orderBy = isSelect ? this.buildOrderBy(exprBuilder) : [];
|
|
155
|
+
const groupBy = isSelect ? this.buildGroupBy(exprBuilder) : [];
|
|
156
|
+
const selectItems = isSelect
|
|
157
|
+
? this.buildSelectItems(classified, exprBuilder, this.state.selectIr)
|
|
158
|
+
: [];
|
|
159
|
+
const selectAll = !this.state.selectIr ||
|
|
160
|
+
(this.state.selectIr.paths.length === 0 &&
|
|
161
|
+
!(this.state.selectIr.aggregates?.length ||
|
|
162
|
+
this.state.selectIr.expressions?.length ||
|
|
163
|
+
this.state.selectIr.subqueries?.length));
|
|
164
|
+
const relationJoinSpecs = joins.map(toJoinSpec);
|
|
165
|
+
const entityJoinSpecs = this.buildEntityJoins(paramToAlias, relationPathToAlias, oneToManyExists, subqueryPlans, relationJoinSpecs.length);
|
|
166
|
+
return {
|
|
167
|
+
operation: this.operation,
|
|
168
|
+
tableName: this.state.tableName,
|
|
169
|
+
tableAlias: this.tableAlias,
|
|
170
|
+
columnNames: this.state.columnNames,
|
|
171
|
+
where: whereExpr,
|
|
172
|
+
having: havingExpr,
|
|
173
|
+
orderBy,
|
|
174
|
+
groupBy,
|
|
175
|
+
limitNum: isSelect ? this.state.limitNum : null,
|
|
176
|
+
offsetNum: isSelect ? this.state.offsetNum : null,
|
|
177
|
+
selectItems,
|
|
178
|
+
selectAll: isSelect ? selectAll : false,
|
|
179
|
+
joins: [...relationJoinSpecs, ...entityJoinSpecs],
|
|
180
|
+
relationFetches: classified.relationFetches,
|
|
181
|
+
joinedProjections: classified.joinedProjections,
|
|
182
|
+
skipLoadFor: classified.skipLoadFor,
|
|
183
|
+
whereParams: this.state.whereParams,
|
|
184
|
+
havingParams: this.state.havingParams,
|
|
185
|
+
ctes: this.state.ctes,
|
|
186
|
+
fromSource: this.state.fromSource ?? undefined,
|
|
187
|
+
unionAll: isSelect && this.state.unionAll
|
|
188
|
+
? QueryPlanBuilder.build(this.state.unionAll, { kind: "select" })
|
|
189
|
+
: undefined,
|
|
190
|
+
pkColumns: this.state.pkColumns,
|
|
191
|
+
updateSet: this.buildUpdateSet(exprBuilder),
|
|
192
|
+
inScopeRegisteredCteNames: this.state.inScopeRegisteredCteNames,
|
|
193
|
+
referencedRegisteredCtes: this.irAnalyzer.planReferencedRegisteredCtes(this.analysis),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
buildUpdateSet(exprBuilder) {
|
|
197
|
+
if (this.operation.kind !== "update")
|
|
198
|
+
return undefined;
|
|
199
|
+
const out = {};
|
|
200
|
+
const op = this.operation;
|
|
201
|
+
for (const [key, value] of Object.entries(op.set ?? {})) {
|
|
202
|
+
out[key] = { kind: "const", value };
|
|
203
|
+
}
|
|
204
|
+
for (const [key, ir] of Object.entries(op.setIr ?? {})) {
|
|
205
|
+
out[key] = exprBuilder.convert(ir);
|
|
206
|
+
}
|
|
207
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
208
|
+
}
|
|
209
|
+
buildEntityJoins(paramToAlias, relationPathToAlias, oneToManyExists, subqueryPlans, relationJoinCount) {
|
|
210
|
+
const hints = this.state.entityJoinHints;
|
|
211
|
+
if (!hints?.length)
|
|
212
|
+
return [];
|
|
213
|
+
return hints.map((hint, i) => {
|
|
214
|
+
const alias = `t${relationJoinCount + i + 1}`;
|
|
215
|
+
const joinedParam = hint.onIr.localParamNames?.[0] ?? "a";
|
|
216
|
+
const rowParam = hint.onIr.localParamNames?.[1] ?? this.rootParam;
|
|
217
|
+
const onBuilder = new ExprBuilder({ ...paramToAlias, [joinedParam]: alias, [rowParam]: this.tableAlias }, relationPathToAlias, oneToManyExists, subqueryPlans, new Set(Object.keys(this.state.relations ?? {})), new Set((this.state.ctes ?? []).map((c) => c.name)));
|
|
218
|
+
return {
|
|
219
|
+
relationKey: "",
|
|
220
|
+
alias,
|
|
221
|
+
targetTable: hint.entity.table._table,
|
|
222
|
+
targetPkColumns: [],
|
|
223
|
+
foreignKeys: [],
|
|
224
|
+
relType: "many-to-one",
|
|
225
|
+
joinType: hint.joinType,
|
|
226
|
+
on: onBuilder.convert(hint.onIr.node),
|
|
227
|
+
};
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
// ─── alias / paramToAlias ───────────────────────────────────────────────────
|
|
231
|
+
/**
|
|
232
|
+
* Build the row-param-name → table-alias map for this plan.
|
|
233
|
+
*
|
|
234
|
+
* Two inputs are merged:
|
|
235
|
+
*
|
|
236
|
+
* 1. **Referenced names** — every row-param mentioned in this state's
|
|
237
|
+
* where/orderBy/select, plus any names required by nested correlated
|
|
238
|
+
* subqueries, plus the default row-param so single-row predicates
|
|
239
|
+
* without an explicit param still work.
|
|
240
|
+
* 2. **Outer scope** (only present for subquery builds) — the
|
|
241
|
+
* parent plan's `paramToAlias`. The parent's bindings are kept
|
|
242
|
+
* verbatim so correlated references resolve to the outer table
|
|
243
|
+
* alias.
|
|
244
|
+
*
|
|
245
|
+
* Each referenced name is mapped to *this builder's* table alias. For
|
|
246
|
+
* subquery builds, the `localFilter` set restricts that mapping to
|
|
247
|
+
* names the inner state actually binds locally — anything else stays
|
|
248
|
+
* pointing at the outer alias, which is exactly what correlated
|
|
249
|
+
* subqueries need.
|
|
250
|
+
*/
|
|
251
|
+
buildParamToAlias() {
|
|
252
|
+
const referenced = new Set([DEFAULT_ROW_PARAM]);
|
|
253
|
+
for (const param of this.activeAnalysis().paramNames)
|
|
254
|
+
referenced.add(param);
|
|
255
|
+
for (const param of this.analysis.correlatedParamNames)
|
|
256
|
+
referenced.add(param);
|
|
257
|
+
const paramToAlias = { ...(this.outer?.paramToAlias ?? {}) };
|
|
258
|
+
const localFilter = this.outer ? new Set(this.analysis.localParamNames) : null;
|
|
259
|
+
const hasCteContext = (this.state.inScopeRegisteredCteNames?.length ?? 0) > 0 || (this.state.ctes?.length ?? 0) > 0;
|
|
260
|
+
for (const p of referenced) {
|
|
261
|
+
if (localFilter && !localFilter.has(p))
|
|
262
|
+
continue;
|
|
263
|
+
if (hasCteContext && p !== this.rootParam && this.analysis.localParamNames.includes(p)) {
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
paramToAlias[p] = this.tableAlias;
|
|
267
|
+
}
|
|
268
|
+
return paramToAlias;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Build every inline child query plan this state can reference during
|
|
272
|
+
* expression conversion. `ExprBuilder` receives the finished map and only
|
|
273
|
+
* swaps keys for plans; captured `QueryBuilder` values were already
|
|
274
|
+
* separated into `state.subqueryParams` at the `QueryBuilder` boundary.
|
|
275
|
+
*/
|
|
276
|
+
buildSubqueryPlans(paramToAlias, relationPathToAlias) {
|
|
277
|
+
const plans = new Map();
|
|
278
|
+
const subqueryRefs = this.activeAnalysis().subqueryRefs;
|
|
279
|
+
const keys = Object.keys(subqueryRefs);
|
|
280
|
+
if (keys.length === 0)
|
|
281
|
+
return plans;
|
|
282
|
+
const subAlias = this.pickSubqueryAlias(paramToAlias, relationPathToAlias);
|
|
283
|
+
for (const key of keys) {
|
|
284
|
+
const captured = this.state.subqueryParams[key];
|
|
285
|
+
if (!captured) {
|
|
286
|
+
throw new Error(`[typhex] subqueryRef "${key}" did not resolve to a captured subquery`);
|
|
287
|
+
}
|
|
288
|
+
const analysis = this.analysis.subqueries[key];
|
|
289
|
+
if (!analysis) {
|
|
290
|
+
throw new Error(`[typhex] subqueryRef "${key}" did not resolve to query IR analysis`);
|
|
291
|
+
}
|
|
292
|
+
plans.set(key, QueryPlanBuilder.buildSubQuery(captured.state, { kind: "select" }, {
|
|
293
|
+
subAlias,
|
|
294
|
+
paramToAlias,
|
|
295
|
+
}, analysis));
|
|
296
|
+
}
|
|
297
|
+
return plans;
|
|
298
|
+
}
|
|
299
|
+
activeAnalysis() {
|
|
300
|
+
if (this.operation.kind === "select")
|
|
301
|
+
return this.analysis.all;
|
|
302
|
+
if (this.operation.kind === "insert" || this.operation.kind === "insertMany") {
|
|
303
|
+
return EMPTY_EXPR_IR_ANALYSIS;
|
|
304
|
+
}
|
|
305
|
+
return mergeExprIrAnalysis(this.analysis.where, this.analysis.orderBy);
|
|
306
|
+
}
|
|
307
|
+
pickSubqueryAlias(paramToAlias, relationPathToAlias) {
|
|
308
|
+
const used = new Set([this.tableAlias]);
|
|
309
|
+
for (const alias of Object.values(paramToAlias))
|
|
310
|
+
used.add(alias);
|
|
311
|
+
for (const alias of Object.values(relationPathToAlias))
|
|
312
|
+
used.add(alias);
|
|
313
|
+
return pickFreeAlias(used);
|
|
314
|
+
}
|
|
315
|
+
// ─── relation detection ─────────────────────────────────────────────────────
|
|
316
|
+
/**
|
|
317
|
+
* Detect joins and one-to-many EXISTS info for this state.
|
|
318
|
+
*
|
|
319
|
+
* Three short-circuits lift us out early with the empty result:
|
|
320
|
+
* 1. **Subquery builds** (`this.outer` set) — child plans inherit
|
|
321
|
+
* relation info from the outer plan via the `paramToAlias`
|
|
322
|
+
* mapping; doing detection independently would double-join.
|
|
323
|
+
* 2. **No relations on the entity** — nothing to detect.
|
|
324
|
+
* 3. **Skippable mutation** (`canSkipRelationAnalysis`) — UPDATE/
|
|
325
|
+
* DELETE that don't reference any relation in their where/orderBy/
|
|
326
|
+
* joinHints don't need the analysis.
|
|
327
|
+
*
|
|
328
|
+
* Otherwise it delegates to relation helper classes: one chooses which
|
|
329
|
+
* relations to JOIN, the other pre-resolves EXISTS metadata for `.some()`/
|
|
330
|
+
* `.every()` predicates.
|
|
331
|
+
*/
|
|
332
|
+
detectRelations() {
|
|
333
|
+
if (this.outer)
|
|
334
|
+
return EMPTY_RELATION_DETECTION;
|
|
335
|
+
const { relations, resolveRelationTarget } = this.state;
|
|
336
|
+
if (!relations || Object.keys(relations).length === 0 || !resolveRelationTarget) {
|
|
337
|
+
return EMPTY_RELATION_DETECTION;
|
|
338
|
+
}
|
|
339
|
+
if (this.canSkipRelationAnalysis())
|
|
340
|
+
return EMPTY_RELATION_DETECTION;
|
|
341
|
+
const pkColumns = this.state.pkColumns;
|
|
342
|
+
return {
|
|
343
|
+
joins: new RelationJoinBuilder({
|
|
344
|
+
relations,
|
|
345
|
+
tableName: this.state.tableName,
|
|
346
|
+
columnNames: this.state.columnNames,
|
|
347
|
+
pkColumns,
|
|
348
|
+
resolveTarget: resolveRelationTarget,
|
|
349
|
+
}, this.analysis.joinRelationKeys, this.state.joinHints).build(),
|
|
350
|
+
oneToManyExists: new OneToManyExistsBuilder([...this.analysis.where.existsNodes, ...this.analysis.having.existsNodes], relations, this.rootParam, pkColumns, resolveRelationTarget, this.analysis.localParamNames).build(),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* True for mutations that have no need for relation detection:
|
|
355
|
+
* - SELECT operations always need detection (returns false).
|
|
356
|
+
* - Any explicit `.innerJoin` / `.leftJoin` / etc. forces detection.
|
|
357
|
+
* - Otherwise, we can skip if neither the where predicate nor any
|
|
358
|
+
* orderBy expression references a relation key.
|
|
359
|
+
*/
|
|
360
|
+
canSkipRelationAnalysis() {
|
|
361
|
+
if (this.operation.kind === "select")
|
|
362
|
+
return false;
|
|
363
|
+
if (this.operation.kind === "insert" || this.operation.kind === "insertMany")
|
|
364
|
+
return true;
|
|
365
|
+
if (this.state.joinHints?.length)
|
|
366
|
+
return false;
|
|
367
|
+
if (this.state.entityJoinHints?.length)
|
|
368
|
+
return false;
|
|
369
|
+
const relations = this.state.relations;
|
|
370
|
+
if (!relations)
|
|
371
|
+
return true;
|
|
372
|
+
return this.analysis.joinRelationKeys.size === 0;
|
|
373
|
+
}
|
|
374
|
+
// ─── select classification ──────────────────────────────────────────────────
|
|
375
|
+
/**
|
|
376
|
+
* Classify the SELECT-list against the relation map. Empty fast-path
|
|
377
|
+
* if there's no select IR or no relations to consult. Otherwise:
|
|
378
|
+
*
|
|
379
|
+
* 1. Compute the `reusableJoinKeys` set — relations the planner has
|
|
380
|
+
* decided to JOIN (so their member references stay in the SELECT
|
|
381
|
+
* list rather than triggering a separate fetch).
|
|
382
|
+
* 2. Resolve the parent's PK columns. Used by the
|
|
383
|
+
* classifier for to-many `parentPkColumns` and for the missing-
|
|
384
|
+
* key-column check.
|
|
385
|
+
* 3. Construct a `SelectClassifier` with those inputs and run it.
|
|
386
|
+
*
|
|
387
|
+
* The result drives the rest of the build: `buildSelectItems` reads
|
|
388
|
+
* `columnPaths`/`columnAliases`, the relation pipeline reads
|
|
389
|
+
* `relationFetches`/`joinedProjections`/`skipLoadFor`.
|
|
390
|
+
*/
|
|
391
|
+
classifySelect() {
|
|
392
|
+
const select = this.state.selectIr;
|
|
393
|
+
const relations = this.state.relations;
|
|
394
|
+
if (!select || !relations)
|
|
395
|
+
return EMPTY_CLASSIFIED;
|
|
396
|
+
const pkColumns = this.state.pkColumns;
|
|
397
|
+
return new SelectClassifier(select, relations, pkColumns, this.analysis.reusableJoinKeys).classify();
|
|
398
|
+
}
|
|
399
|
+
// ─── select-list / orderBy / groupBy ────────────────────────────────────────
|
|
400
|
+
/**
|
|
401
|
+
* Build the ordered `SelectItem[]` that the dialect will turn into
|
|
402
|
+
* the SQL `SELECT` list. Four sources, in order:
|
|
403
|
+
*
|
|
404
|
+
* 1. **Column paths** — either the classifier's reshape (if relation
|
|
405
|
+
* analysis ran) or the IR's own `select.paths`. Each is resolved
|
|
406
|
+
* to an `ExprColumn` via `exprBuilder.resolveColumn`. Empty paths
|
|
407
|
+
* (rare — only when relation rewrite consumed the whole path)
|
|
408
|
+
* omit the alias since the column itself is the alias.
|
|
409
|
+
* 2. **Rest spread** — when the user wrote `({ ...u, ... })` in their
|
|
410
|
+
* select body, the IR sets `select.rest` and we need to add every
|
|
411
|
+
* table column not already in the explicit list.
|
|
412
|
+
* 3. **Aggregates** — `select.aggregates` carries IR aggregate nodes
|
|
413
|
+
* (e.g. `count(p.id) as total`); each becomes an `ExprAggregate`.
|
|
414
|
+
* 4. **Subqueries** — `select.subqueries` carries select-list inline
|
|
415
|
+
* `Entity.query()...` chains; each becomes an inline subquery via
|
|
416
|
+
* the pre-built subquery plan map.
|
|
417
|
+
*/
|
|
418
|
+
buildSelectItems(classified, exprBuilder, selectIr) {
|
|
419
|
+
const select = selectIr;
|
|
420
|
+
if (!select)
|
|
421
|
+
return [];
|
|
422
|
+
const items = [];
|
|
423
|
+
const paths = classified.columnPaths ?? select.paths;
|
|
424
|
+
const aliases = classified.columnAliases ?? select.aliases ?? [];
|
|
425
|
+
const rootParam = select.param;
|
|
426
|
+
for (let i = 0; i < paths.length; i++) {
|
|
427
|
+
const path = paths[i];
|
|
428
|
+
const expr = exprBuilder.resolveColumn(rootParam, path);
|
|
429
|
+
items.push(path.length === 0 ? { expr } : { expr, alias: aliases[i] });
|
|
430
|
+
}
|
|
431
|
+
if (select.rest) {
|
|
432
|
+
const explicitCols = new Set(paths.map((p) => p[0]));
|
|
433
|
+
for (const c of this.state.columnNames) {
|
|
434
|
+
if (!explicitCols.has(c)) {
|
|
435
|
+
items.push({ expr: { kind: "column", alias: this.tableAlias, column: [c] } });
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
for (const agg of select.aggregates ?? []) {
|
|
440
|
+
items.push({
|
|
441
|
+
expr: exprBuilder.convertAggregate(agg, undefined, this.state.inlineParams),
|
|
442
|
+
alias: agg.alias,
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
for (const entry of select.subqueries ?? []) {
|
|
446
|
+
items.push({ expr: exprBuilder.convertSubqueryRef(entry.subquery), alias: entry.alias });
|
|
447
|
+
}
|
|
448
|
+
for (const entry of select.expressions ?? []) {
|
|
449
|
+
items.push({
|
|
450
|
+
expr: exprBuilder.convert(entry.expr, undefined, this.state.inlineParams),
|
|
451
|
+
alias: entry.alias,
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
return items;
|
|
455
|
+
}
|
|
456
|
+
buildOrderBy(exprBuilder) {
|
|
457
|
+
return this.state.orderBy.map((o) => ({
|
|
458
|
+
expr: o.expr.kind === "member"
|
|
459
|
+
? exprBuilder.resolveColumn(o.expr.param, o.expr.path)
|
|
460
|
+
: exprBuilder.convert(o.expr, undefined, this.state.inlineParams),
|
|
461
|
+
direction: o.direction,
|
|
462
|
+
}));
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Build the `GroupByItem[]` for the GROUP BY clause. Numeric entries
|
|
466
|
+
* are positional column references (e.g. `GROUP BY 1`); array entries
|
|
467
|
+
* are member paths resolved via `resolveColumn`. Empty path arrays
|
|
468
|
+
* throw — the IR shouldn't produce them, but the check turns a silent
|
|
469
|
+
* "GROUP BY t0." render bug into a loud error.
|
|
470
|
+
*
|
|
471
|
+
* The row-param defaults to the select's own param, falling back to
|
|
472
|
+
* `DEFAULT_ROW_PARAM` for groupBy without a preceding select.
|
|
473
|
+
*/
|
|
474
|
+
buildGroupBy(exprBuilder) {
|
|
475
|
+
const entries = this.state.selectIr?.groupBy ?? [];
|
|
476
|
+
const param = this.state.selectIr?.param ?? DEFAULT_ROW_PARAM;
|
|
477
|
+
return entries.map((entry) => {
|
|
478
|
+
if (typeof entry === "number")
|
|
479
|
+
return { kind: "index", index: entry };
|
|
480
|
+
if (entry.length === 0)
|
|
481
|
+
throw new Error("[typhex] GROUP BY path cannot be empty");
|
|
482
|
+
return exprBuilder.resolveColumn(param, entry);
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
// ─── helpers ──────────────────────────────────────────────────────────────────
|
|
487
|
+
/** Sentinel for `detectRelations` short-circuits. Identity-shared so the
|
|
488
|
+
* three early-return paths don't allocate a fresh object per skip. */
|
|
489
|
+
const EMPTY_RELATION_DETECTION = {
|
|
490
|
+
joins: [],
|
|
491
|
+
oneToManyExists: {},
|
|
492
|
+
};
|
|
493
|
+
const EMPTY_EXPR_IR_ANALYSIS = {
|
|
494
|
+
paramNames: new Set(),
|
|
495
|
+
relationKeys: new Set(),
|
|
496
|
+
subqueryRefs: {},
|
|
497
|
+
existsNodes: [],
|
|
498
|
+
referencedRegisteredCtes: new Set(),
|
|
499
|
+
};
|
|
500
|
+
function mergeExprIrAnalysis(...items) {
|
|
501
|
+
const out = {
|
|
502
|
+
paramNames: new Set(),
|
|
503
|
+
relationKeys: new Set(),
|
|
504
|
+
subqueryRefs: {},
|
|
505
|
+
existsNodes: [],
|
|
506
|
+
referencedRegisteredCtes: new Set(),
|
|
507
|
+
};
|
|
508
|
+
for (const item of items) {
|
|
509
|
+
for (const param of item.paramNames)
|
|
510
|
+
out.paramNames.add(param);
|
|
511
|
+
for (const key of item.relationKeys)
|
|
512
|
+
out.relationKeys.add(key);
|
|
513
|
+
Object.assign(out.subqueryRefs, item.subqueryRefs);
|
|
514
|
+
out.existsNodes.push(...item.existsNodes);
|
|
515
|
+
for (const name of item.referencedRegisteredCtes)
|
|
516
|
+
out.referencedRegisteredCtes.add(name);
|
|
517
|
+
}
|
|
518
|
+
return out;
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Pick the lowest-numbered `tN` alias not already taken. Sibling
|
|
522
|
+
* subqueries can share the same alias because each compiles to an
|
|
523
|
+
* isolated parenthesized SELECT.
|
|
524
|
+
*/
|
|
525
|
+
function pickFreeAlias(used) {
|
|
526
|
+
for (let i = 1;; i++) {
|
|
527
|
+
const candidate = `t${i}`;
|
|
528
|
+
if (!used.has(candidate))
|
|
529
|
+
return candidate;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Project a `RelationJoinMeta` (used internally during relation-detection
|
|
534
|
+
* to carry the planning-time fields) onto the public `JoinSpec` shape
|
|
535
|
+
* that the dialect consumes. The dialect has no business knowing
|
|
536
|
+
* planning-only fields, so this strip-down is the boundary.
|
|
537
|
+
*/
|
|
538
|
+
function toJoinSpec(j) {
|
|
539
|
+
return {
|
|
540
|
+
relationKey: j.relationKey,
|
|
541
|
+
alias: j.alias,
|
|
542
|
+
targetTable: j.targetTable,
|
|
543
|
+
targetPkColumns: j.targetPkColumns,
|
|
544
|
+
foreignKeys: j.foreignKeys,
|
|
545
|
+
relType: j.relType,
|
|
546
|
+
joinType: j.joinType,
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
//# sourceMappingURL=query-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-plan.js","sourceRoot":"","sources":["../../../../src/orm/helpers/query-plan/query-plan.ts"],"names":[],"mappings":"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"}
|