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,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IR → Expr conversion.
|
|
3
|
+
*
|
|
4
|
+
* The planner-side IR (`src/ir/types.ts`) is the parser's output: arrow
|
|
5
|
+
* predicates and select bodies turned into a tree of nodes that still
|
|
6
|
+
* reference user-facing names like the row parameter (`u`, `c`, …) and
|
|
7
|
+
* relation keys (`u.author`). The runtime Expr model (`src/orm/expr.ts`)
|
|
8
|
+
* is what the dialect compiles to SQL: every column reference has been
|
|
9
|
+
* resolved to a (table-alias, column-path) pair, every captured
|
|
10
|
+
* `QueryBuilder` has been inlined as a child `QueryPlan`, and every
|
|
11
|
+
* one-to-many `EXISTS` has been pre-resolved to its target table and
|
|
12
|
+
* join keys.
|
|
13
|
+
*
|
|
14
|
+
* `ExprBuilder` performs that conversion. The planner constructs it once
|
|
15
|
+
* per plan with precomputed context: row-param aliases, relation join
|
|
16
|
+
* aliases, one-to-many EXISTS metadata, and already-built child subquery
|
|
17
|
+
* plans. It does not build child plans itself; when conversion reaches a
|
|
18
|
+
* subquery placeholder, it only swaps in the `QueryPlan` the planner
|
|
19
|
+
* prepared earlier.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Converts IR nodes to runtime `Expr` against a precomputed alias context.
|
|
23
|
+
*
|
|
24
|
+
* Constructor inputs:
|
|
25
|
+
* - `paramToAlias` — maps every row-param name in scope (including
|
|
26
|
+
* outer-correlated ones) to its SQL table alias. Built by the planner's
|
|
27
|
+
* `buildParamToAlias` phase.
|
|
28
|
+
* - `relationPathToAlias` — maps `"<param>.<relKey>"` to the join alias
|
|
29
|
+
* the planner allocated for that relation. Drives the column-path
|
|
30
|
+
* rewrite in `resolveColumn` (a member access through a joined relation
|
|
31
|
+
* becomes a column reference on the join's alias).
|
|
32
|
+
* - `oneToManyExists` — pre-resolved EXISTS metadata keyed by
|
|
33
|
+
* `"<rootParam>.<relationKey>"`. Lets `convertExists` emit a fully
|
|
34
|
+
* structured `ExprExists` without redoing the relation lookup.
|
|
35
|
+
* - `subqueryPlans` — child plans keyed by the runtime param/subquery
|
|
36
|
+
* placeholder names that reference captured `QueryBuilder`s.
|
|
37
|
+
*/
|
|
38
|
+
export class ExprBuilder {
|
|
39
|
+
paramToAlias;
|
|
40
|
+
relationPathToAlias;
|
|
41
|
+
oneToManyExists;
|
|
42
|
+
subqueryPlans;
|
|
43
|
+
relationKeys;
|
|
44
|
+
cteNames;
|
|
45
|
+
constructor(paramToAlias, relationPathToAlias, oneToManyExists, subqueryPlans, relationKeys = new Set(), cteNames = new Set()) {
|
|
46
|
+
this.paramToAlias = paramToAlias;
|
|
47
|
+
this.relationPathToAlias = relationPathToAlias;
|
|
48
|
+
this.oneToManyExists = oneToManyExists;
|
|
49
|
+
this.subqueryPlans = subqueryPlans;
|
|
50
|
+
this.relationKeys = relationKeys;
|
|
51
|
+
this.cteNames = cteNames;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Recursively convert any IR node to an `Expr`.
|
|
55
|
+
*
|
|
56
|
+
* `scope` is the row-param-to-table-alias mapping in effect for this
|
|
57
|
+
* conversion. It defaults to the builder's `paramToAlias` (the top-level
|
|
58
|
+
* scope of the plan being built). `convertExists` augments and re-passes
|
|
59
|
+
* it: when an `EXISTS` predicate binds a fresh inner row-param (e.g.
|
|
60
|
+
* `d.employees.some(e => e.name === "Alice")` binds `e`), the recursive
|
|
61
|
+
* call uses `{ ...scope, [innerParam]: innerAlias }` so the inner
|
|
62
|
+
* predicate's `e.name` resolves against the inner-relation table alias
|
|
63
|
+
* rather than the outer row's.
|
|
64
|
+
*
|
|
65
|
+
* Throws on unknown node kinds — the IR types are a closed union, so
|
|
66
|
+
* hitting the default branch means a future-added kind wasn't handled.
|
|
67
|
+
*/
|
|
68
|
+
convert(node, scope = this.paramToAlias, inlineParams) {
|
|
69
|
+
switch (node.kind) {
|
|
70
|
+
case "binary":
|
|
71
|
+
return {
|
|
72
|
+
kind: "binary",
|
|
73
|
+
op: node.op,
|
|
74
|
+
left: this.convert(node.left, scope, inlineParams),
|
|
75
|
+
right: this.convert(node.right, scope, inlineParams),
|
|
76
|
+
};
|
|
77
|
+
case "unary":
|
|
78
|
+
return {
|
|
79
|
+
kind: "unary",
|
|
80
|
+
op: node.op,
|
|
81
|
+
operand: this.convert(node.operand, scope, inlineParams),
|
|
82
|
+
};
|
|
83
|
+
case "member":
|
|
84
|
+
return this.resolveColumn(node.param, node.path, scope);
|
|
85
|
+
case "const":
|
|
86
|
+
return { kind: "const", value: node.value };
|
|
87
|
+
case "param":
|
|
88
|
+
return this.resolveParamRef(node.key, inlineParams);
|
|
89
|
+
case "in":
|
|
90
|
+
return this.convertIn(node, scope, inlineParams);
|
|
91
|
+
case "call":
|
|
92
|
+
return {
|
|
93
|
+
kind: "call",
|
|
94
|
+
method: node.method,
|
|
95
|
+
receiver: this.convert(node.receiver, scope, inlineParams),
|
|
96
|
+
args: node.args.map((a) => this.convert(a, scope, inlineParams)),
|
|
97
|
+
};
|
|
98
|
+
case "exists":
|
|
99
|
+
return this.convertExists(node, scope, inlineParams);
|
|
100
|
+
case "subqueryRef":
|
|
101
|
+
return this.convertSubqueryRef(node);
|
|
102
|
+
case "aggregate":
|
|
103
|
+
return this.convertAggregate(node, scope, inlineParams);
|
|
104
|
+
case "case":
|
|
105
|
+
return {
|
|
106
|
+
kind: "case",
|
|
107
|
+
branches: node.branches.map((b) => ({
|
|
108
|
+
when: this.convert(b.when, scope, inlineParams),
|
|
109
|
+
then: this.convert(b.then, scope, inlineParams),
|
|
110
|
+
})),
|
|
111
|
+
...(node.else !== undefined
|
|
112
|
+
? { else: this.convert(node.else, scope, inlineParams) }
|
|
113
|
+
: {}),
|
|
114
|
+
};
|
|
115
|
+
default:
|
|
116
|
+
throw new Error(`[typhex] Unknown IR node kind: ${node.kind}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Resolve `param.path` (an IR member reference) to a (alias, column-path)
|
|
121
|
+
* pair the dialect can render directly.
|
|
122
|
+
*
|
|
123
|
+
* Resolution proceeds in two steps:
|
|
124
|
+
*
|
|
125
|
+
* 1. **Alias lookup.** The starting alias is `scope[param]`. The planner
|
|
126
|
+
* builds that scope before conversion, including local and correlated
|
|
127
|
+
* row params.
|
|
128
|
+
*
|
|
129
|
+
* 2. **Relation rewrite.** If `path[0]` names a relation that has been
|
|
130
|
+
* joined into the query (`relationPathToAlias` has an entry for
|
|
131
|
+
* `"<param>.<path[0]>"`), the alias is replaced with the join's
|
|
132
|
+
* alias and the leading segment is dropped from the path. Example:
|
|
133
|
+
* `u.author.name` with `relationPathToAlias["u.author"] = "t1"`
|
|
134
|
+
* rewrites to `(alias: "t1", column: ["name"])`.
|
|
135
|
+
*
|
|
136
|
+
* The returned `ExprColumn.column` is a path array: empty means the
|
|
137
|
+
* alias itself (rare — only when relation rewrite consumed the entire
|
|
138
|
+
* path), single element is a leaf column, multiple elements is a
|
|
139
|
+
* dotted path (rare; preserved for forward compatibility).
|
|
140
|
+
*/
|
|
141
|
+
resolveColumn(param, path, scope = this.paramToAlias) {
|
|
142
|
+
this.assertColumnPath(path);
|
|
143
|
+
if (path.length > 0 && this.cteNames.has(path[0])) {
|
|
144
|
+
return { kind: "column", alias: path[0], column: path.slice(1) };
|
|
145
|
+
}
|
|
146
|
+
let alias = scope[param];
|
|
147
|
+
let p = path;
|
|
148
|
+
const relAlias = path.length > 1 ? this.relationPathToAlias[`${param}.${path[0]}`] : undefined;
|
|
149
|
+
if (relAlias) {
|
|
150
|
+
alias = relAlias;
|
|
151
|
+
p = path.slice(1);
|
|
152
|
+
}
|
|
153
|
+
return { kind: "column", alias, column: p };
|
|
154
|
+
}
|
|
155
|
+
assertColumnPath(path) {
|
|
156
|
+
const key = path[0];
|
|
157
|
+
if (!key)
|
|
158
|
+
return;
|
|
159
|
+
if (this.cteNames.has(key)) {
|
|
160
|
+
if (path.length === 1) {
|
|
161
|
+
throw new Error(`[typhex] CTE "${key}" must reference a column`);
|
|
162
|
+
}
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (path.length === 1 && this.relationKeys.has(key)) {
|
|
166
|
+
throw new Error(`[typhex] relation "${key}" must reference a column`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Convert an `IrAggregate` (e.g. `count(u.id)`, `sum(p.price)`) to an
|
|
171
|
+
* `ExprAggregate`. The argument expression — when present — is converted
|
|
172
|
+
* recursively so nested member paths resolve through the same alias
|
|
173
|
+
* scope. `null` arg means `COUNT(*)` style.
|
|
174
|
+
*
|
|
175
|
+
* Public so the planner's `buildSelectItems` can convert select-list
|
|
176
|
+
* aggregates directly without a wrapping `IrNode` that would otherwise
|
|
177
|
+
* route through `convert`.
|
|
178
|
+
*/
|
|
179
|
+
convertAggregate(agg, scope = this.paramToAlias, inlineParams) {
|
|
180
|
+
return {
|
|
181
|
+
kind: "aggregate",
|
|
182
|
+
func: agg.func,
|
|
183
|
+
arg: agg.arg ? this.convert(agg.arg, scope, inlineParams) : null,
|
|
184
|
+
alias: agg.alias,
|
|
185
|
+
distinct: agg.distinct,
|
|
186
|
+
separator: agg.separator,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Convert an `IrSubqueryRef` (a transformer-emitted placeholder pointing
|
|
191
|
+
* at a captured `QueryBuilder` in the param bags) to an `ExprSubquery`
|
|
192
|
+
* by looking up the child plan the planner already built.
|
|
193
|
+
* Public so `buildSelectItems` can use it for select-list subqueries
|
|
194
|
+
* (`Entity.query()....` projected as a column value).
|
|
195
|
+
*/
|
|
196
|
+
convertSubqueryRef(ref) {
|
|
197
|
+
return { kind: "subquery", plan: this.getSubqueryPlan(ref.key) };
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Resolve an `IrParam` (free variable referenced by name from a runtime-
|
|
201
|
+
* parsed predicate). Captured subqueries are represented as
|
|
202
|
+
* `IrSubqueryRef`, so params always stay late-bound.
|
|
203
|
+
*/
|
|
204
|
+
resolveParamRef(key, inlineParams) {
|
|
205
|
+
if (inlineParams === undefined) {
|
|
206
|
+
return { kind: "param", name: key };
|
|
207
|
+
}
|
|
208
|
+
if (key in inlineParams) {
|
|
209
|
+
const value = inlineParams[key];
|
|
210
|
+
if (value !== null &&
|
|
211
|
+
typeof value !== "string" &&
|
|
212
|
+
typeof value !== "number" &&
|
|
213
|
+
typeof value !== "boolean") {
|
|
214
|
+
throw new Error(`[typhex] Cannot inline SQL literal "${key}" of type ${typeof value}`);
|
|
215
|
+
}
|
|
216
|
+
return { kind: "const", value };
|
|
217
|
+
}
|
|
218
|
+
throw new Error(`[typhex] inline param "${key}" not provided`);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Convert `<expr> IN <rhs>` (or `NOT IN`). The right-hand side has three
|
|
222
|
+
* legal IR shapes that map to three different `ExprInRhs` shapes:
|
|
223
|
+
*
|
|
224
|
+
* - `IrConst` array → `{ kind: "values", values }` — inline literal list,
|
|
225
|
+
* compiled to `(?, ?, ?)` placeholders.
|
|
226
|
+
* - `IrParam` → a late-bound param reference. It expands at execution
|
|
227
|
+
* time when the dialect resolves `__param` sentinels.
|
|
228
|
+
* - `IrSubqueryRef` → a pre-built inline subquery plan.
|
|
229
|
+
*
|
|
230
|
+
* Anything else throws — IN's right side is a closed union by spec.
|
|
231
|
+
*/
|
|
232
|
+
convertIn(node, scope, inlineParams) {
|
|
233
|
+
const left = this.convert(node.left, scope, inlineParams);
|
|
234
|
+
const { negated } = node;
|
|
235
|
+
const right = node.right;
|
|
236
|
+
if (right.kind === "const" && Array.isArray(right.value)) {
|
|
237
|
+
return { kind: "in", left, right: { kind: "values", values: right.value }, negated };
|
|
238
|
+
}
|
|
239
|
+
if (right.kind === "param") {
|
|
240
|
+
return { kind: "in", left, right: { kind: "param", name: right.key }, negated };
|
|
241
|
+
}
|
|
242
|
+
if (right.kind === "subqueryRef") {
|
|
243
|
+
return {
|
|
244
|
+
kind: "in",
|
|
245
|
+
left,
|
|
246
|
+
right: { kind: "subquery", plan: this.subqueryPlans.get(right.key) },
|
|
247
|
+
negated,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
throw new Error("[typhex] IN right side must be const array, param, or subqueryRef");
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Convert an `IrExists` (a one-to-many `EXISTS (...)` subquery).
|
|
254
|
+
*
|
|
255
|
+
* The relation lookup was done up-front by the planner's
|
|
256
|
+
* `OneToManyExistsBuilder`, which produced `oneToManyExists` keyed by
|
|
257
|
+
* `"<rootParam>.<relationKey>"`. We just look up the entry and stamp it
|
|
258
|
+
* onto the runtime `ExprExists`.
|
|
259
|
+
*
|
|
260
|
+
* Two scope details worth noting:
|
|
261
|
+
*
|
|
262
|
+
* 1. **outerAlias.** This is the alias the EXISTS predicate joins
|
|
263
|
+
* against (typically the main table). Resolving via
|
|
264
|
+
* `scope[node.rootParam]` is what makes nested EXISTS work: when an
|
|
265
|
+
* EXISTS is itself inside another EXISTS' inner predicate, the
|
|
266
|
+
* inner-most rootParam is actually the parent EXISTS' bound row,
|
|
267
|
+
* and `scope` will have been augmented to map it to the parent's
|
|
268
|
+
* inner alias.
|
|
269
|
+
*
|
|
270
|
+
* 2. **innerScope.** Augmenting with `[innerParam]: info.alias` is what
|
|
271
|
+
* lets the inner predicate's column references (`e.name` in
|
|
272
|
+
* `.some(e => e.name === ...)`) resolve to the inner relation's
|
|
273
|
+
* table alias rather than the outer row's.
|
|
274
|
+
*/
|
|
275
|
+
convertExists(node, scope, inlineParams) {
|
|
276
|
+
const key = `${node.rootParam}.${node.relationKey}`;
|
|
277
|
+
const meta = this.oneToManyExists[key];
|
|
278
|
+
if (!meta) {
|
|
279
|
+
throw new Error(`[typhex] EXISTS predicate for relation "${node.relationKey}" could not be planned`);
|
|
280
|
+
}
|
|
281
|
+
const innerScope = { ...scope, [node.innerParam]: meta.alias };
|
|
282
|
+
return {
|
|
283
|
+
kind: "exists",
|
|
284
|
+
negated: node.negated,
|
|
285
|
+
outerAlias: scope[node.rootParam],
|
|
286
|
+
innerAlias: meta.alias,
|
|
287
|
+
targetTable: meta.targetTable,
|
|
288
|
+
fkColumns: meta.fkColumns,
|
|
289
|
+
mainPk: meta.mainPk,
|
|
290
|
+
predicate: this.convert(node.innerWhere, innerScope, inlineParams),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
getSubqueryPlan(key) {
|
|
294
|
+
return this.subqueryPlans.get(key);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=expr-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expr-builder.js","sourceRoot":"","sources":["../../../../src/orm/helpers/query-plan/expr-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { IrExists, IrSubqueryRef } from "../../../ir/types.js";
|
|
2
|
+
import type { QueryState } from "../../query-state.js";
|
|
3
|
+
export interface ExprIrAnalysis {
|
|
4
|
+
paramNames: Set<string>;
|
|
5
|
+
relationKeys: Set<string>;
|
|
6
|
+
subqueryRefs: Record<string, IrSubqueryRef>;
|
|
7
|
+
existsNodes: IrExists[];
|
|
8
|
+
referencedRegisteredCtes: Set<string>;
|
|
9
|
+
}
|
|
10
|
+
export interface QueryIrAnalysis {
|
|
11
|
+
rootParam: string;
|
|
12
|
+
localParamNames: string[];
|
|
13
|
+
correlatedParamNames: Set<string>;
|
|
14
|
+
subqueries: Record<string, QueryIrAnalysis>;
|
|
15
|
+
where: ExprIrAnalysis;
|
|
16
|
+
having: ExprIrAnalysis;
|
|
17
|
+
orderBy: ExprIrAnalysis;
|
|
18
|
+
select: ExprIrAnalysis;
|
|
19
|
+
all: ExprIrAnalysis;
|
|
20
|
+
joinRelationKeys: Set<string>;
|
|
21
|
+
reusableJoinKeys: Set<string>;
|
|
22
|
+
}
|
|
23
|
+
export declare class QueryIrAnalyzer {
|
|
24
|
+
private readonly state;
|
|
25
|
+
private readonly fallbackParam;
|
|
26
|
+
private readonly relations;
|
|
27
|
+
private readonly registeredCteNames;
|
|
28
|
+
constructor(state: QueryState<unknown>, fallbackParam: string);
|
|
29
|
+
analyze(): QueryIrAnalysis;
|
|
30
|
+
private inferRootParam;
|
|
31
|
+
private getLocalParamNames;
|
|
32
|
+
private analyzeSubqueries;
|
|
33
|
+
private getCorrelatedParamNames;
|
|
34
|
+
private analyzeOrderBy;
|
|
35
|
+
private analyzeSelectIr;
|
|
36
|
+
private analyzeUpsertIr;
|
|
37
|
+
private analyzeExprIr;
|
|
38
|
+
/** Pre-order: accumulate analysis, then recurse. Child edges match ExprBuilder; skips exists.innerWhere. */
|
|
39
|
+
private visitExprIr;
|
|
40
|
+
private relationKeysWithHints;
|
|
41
|
+
private reusableJoinKeys;
|
|
42
|
+
private merge;
|
|
43
|
+
private empty;
|
|
44
|
+
private mergeInto;
|
|
45
|
+
/** Ordered registered CTE names referenced in IR (where/having/select + updateSetIr / insertIr from analyze()). */
|
|
46
|
+
planReferencedRegisteredCtes(analysis: QueryIrAnalysis): string[];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=query-ir-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-ir-analyzer.d.ts","sourceRoot":"","sources":["../../../../src/orm/helpers/query-plan/query-ir-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA+B,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEjG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC5C,WAAW,EAAE,QAAQ,EAAE,CAAC;IACxB,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5C,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,cAAc,CAAC;IACpB,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC/B;AAQD,qBAAa,eAAe;IAKxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IALhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IACrD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAc;gBAG9B,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAC1B,aAAa,EAAE,MAAM;IASxC,OAAO,IAAI,eAAe;IA4B1B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,aAAa;IAWrB,4GAA4G;IAC5G,OAAO,CAAC,WAAW;IAgEnB,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,SAAS;IAUjB,mHAAmH;IACnH,4BAA4B,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,EAAE;CAOlE"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
export class QueryIrAnalyzer {
|
|
2
|
+
state;
|
|
3
|
+
fallbackParam;
|
|
4
|
+
relations;
|
|
5
|
+
registeredCteNames;
|
|
6
|
+
constructor(state, fallbackParam) {
|
|
7
|
+
this.state = state;
|
|
8
|
+
this.fallbackParam = fallbackParam;
|
|
9
|
+
this.relations = state.relations;
|
|
10
|
+
this.registeredCteNames = new Set([
|
|
11
|
+
...(state.inScopeRegisteredCteNames ?? []),
|
|
12
|
+
...(state.ctes ?? []).map((c) => c.name),
|
|
13
|
+
]);
|
|
14
|
+
}
|
|
15
|
+
analyze() {
|
|
16
|
+
const rootParam = this.inferRootParam();
|
|
17
|
+
const where = this.analyzeExprIr(this.state.whereIr?.node, rootParam);
|
|
18
|
+
const having = this.analyzeExprIr(this.state.havingIr?.node, rootParam);
|
|
19
|
+
const orderBy = this.analyzeOrderBy(this.state.orderBy ?? [], rootParam);
|
|
20
|
+
const select = this.analyzeSelectIr(this.state.selectIr);
|
|
21
|
+
const updateSet = this.analyzeUpsertIr(this.state.updateSetIr, rootParam);
|
|
22
|
+
const insertValues = this.analyzeUpsertIr(this.state.insertIr, rootParam);
|
|
23
|
+
const joinSources = this.merge(where, orderBy);
|
|
24
|
+
const joinRelationKeys = this.relationKeysWithHints(joinSources.relationKeys);
|
|
25
|
+
const subqueries = this.analyzeSubqueries();
|
|
26
|
+
const correlatedParamNames = this.getCorrelatedParamNames(subqueries);
|
|
27
|
+
return {
|
|
28
|
+
rootParam,
|
|
29
|
+
localParamNames: this.getLocalParamNames(),
|
|
30
|
+
correlatedParamNames,
|
|
31
|
+
subqueries,
|
|
32
|
+
where,
|
|
33
|
+
having,
|
|
34
|
+
orderBy,
|
|
35
|
+
select,
|
|
36
|
+
all: this.merge(where, having, orderBy, select, updateSet, insertValues),
|
|
37
|
+
joinRelationKeys,
|
|
38
|
+
reusableJoinKeys: this.reusableJoinKeys(where.relationKeys, select.relationKeys),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
inferRootParam() {
|
|
42
|
+
if (this.state.selectIr?.param)
|
|
43
|
+
return this.state.selectIr.param;
|
|
44
|
+
if (this.state.whereIr?.rootParam)
|
|
45
|
+
return this.state.whereIr.rootParam;
|
|
46
|
+
if (this.state.havingIr?.rootParam)
|
|
47
|
+
return this.state.havingIr.rootParam;
|
|
48
|
+
const firstOrder = this.state.orderBy?.[0]?.expr;
|
|
49
|
+
if (firstOrder?.kind === "member")
|
|
50
|
+
return firstOrder.param;
|
|
51
|
+
return this.fallbackParam;
|
|
52
|
+
}
|
|
53
|
+
getLocalParamNames() {
|
|
54
|
+
const names = new Set();
|
|
55
|
+
if (this.state.selectIr?.param)
|
|
56
|
+
names.add(this.state.selectIr.param);
|
|
57
|
+
if (this.state.whereIr) {
|
|
58
|
+
for (const param of this.state.whereIr.localParamNames ?? [this.state.whereIr.rootParam]) {
|
|
59
|
+
names.add(param);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (this.state.havingIr) {
|
|
63
|
+
for (const param of this.state.havingIr.localParamNames ?? [this.state.havingIr.rootParam]) {
|
|
64
|
+
names.add(param);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
for (const order of this.state.orderBy ?? []) {
|
|
68
|
+
if (order.expr.kind === "member")
|
|
69
|
+
names.add(order.expr.param);
|
|
70
|
+
}
|
|
71
|
+
return [...names];
|
|
72
|
+
}
|
|
73
|
+
analyzeSubqueries() {
|
|
74
|
+
const analyses = {};
|
|
75
|
+
for (const [key, captured] of Object.entries(this.state.subqueryParams ?? {})) {
|
|
76
|
+
analyses[key] = new QueryIrAnalyzer(captured.state, this.fallbackParam).analyze();
|
|
77
|
+
}
|
|
78
|
+
return analyses;
|
|
79
|
+
}
|
|
80
|
+
getCorrelatedParamNames(subqueries) {
|
|
81
|
+
const names = new Set();
|
|
82
|
+
for (const analysis of Object.values(subqueries)) {
|
|
83
|
+
const required = new Set([...analysis.all.paramNames, ...analysis.correlatedParamNames]);
|
|
84
|
+
for (const param of analysis.localParamNames)
|
|
85
|
+
required.delete(param);
|
|
86
|
+
for (const param of required)
|
|
87
|
+
names.add(param);
|
|
88
|
+
}
|
|
89
|
+
return names;
|
|
90
|
+
}
|
|
91
|
+
analyzeOrderBy(orderBy, rootParam) {
|
|
92
|
+
const out = this.empty();
|
|
93
|
+
for (const order of orderBy) {
|
|
94
|
+
this.mergeInto(out, this.analyzeExprIr(order.expr, rootParam, 2, false));
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
analyzeSelectIr(select) {
|
|
99
|
+
const out = this.empty();
|
|
100
|
+
if (!select)
|
|
101
|
+
return out;
|
|
102
|
+
out.paramNames.add(select.param);
|
|
103
|
+
for (const path of select.paths) {
|
|
104
|
+
if (path.length > 0 && this.relations?.[path[0]])
|
|
105
|
+
out.relationKeys.add(path[0]);
|
|
106
|
+
}
|
|
107
|
+
for (const relation of select.relations ?? []) {
|
|
108
|
+
if (this.relations?.[relation.name])
|
|
109
|
+
out.relationKeys.add(relation.name);
|
|
110
|
+
if (relation.whereIr) {
|
|
111
|
+
this.mergeInto(out, this.analyzeExprIr(relation.whereIr.node, relation.whereIr.rootParam));
|
|
112
|
+
}
|
|
113
|
+
for (const order of relation.orderBy ?? []) {
|
|
114
|
+
this.mergeInto(out, this.analyzeExprIr(order.expr, select.param, 2));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
for (const aggregate of select.aggregates ?? []) {
|
|
118
|
+
this.mergeInto(out, this.analyzeExprIr(aggregate.arg, select.param));
|
|
119
|
+
}
|
|
120
|
+
for (const entry of select.subqueries ?? []) {
|
|
121
|
+
out.subqueryRefs[entry.subquery.key] = entry.subquery;
|
|
122
|
+
}
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
analyzeUpsertIr(values, rootParam) {
|
|
126
|
+
const out = this.empty();
|
|
127
|
+
for (const node of Object.values(values ?? {})) {
|
|
128
|
+
this.mergeInto(out, this.analyzeExprIr(node, rootParam));
|
|
129
|
+
}
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
analyzeExprIr(node, rootParam, relationMinPathLength = 1, requireRootParamForRelations = true) {
|
|
133
|
+
const out = this.empty();
|
|
134
|
+
this.visitExprIr(node, { rootParam, relationMinPathLength, requireRootParamForRelations }, out);
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
/** Pre-order: accumulate analysis, then recurse. Child edges match ExprBuilder; skips exists.innerWhere. */
|
|
138
|
+
visitExprIr(node, ctx, out) {
|
|
139
|
+
if (!node)
|
|
140
|
+
return;
|
|
141
|
+
switch (node.kind) {
|
|
142
|
+
case "member":
|
|
143
|
+
out.paramNames.add(node.param);
|
|
144
|
+
if (node.path.length > 0 && this.registeredCteNames.has(node.path[0])) {
|
|
145
|
+
out.referencedRegisteredCtes.add(node.path[0]);
|
|
146
|
+
}
|
|
147
|
+
if ((!ctx.requireRootParamForRelations || node.param === ctx.rootParam) &&
|
|
148
|
+
node.path.length >= ctx.relationMinPathLength &&
|
|
149
|
+
this.relations?.[node.path[0]]) {
|
|
150
|
+
out.relationKeys.add(node.path[0]);
|
|
151
|
+
}
|
|
152
|
+
return;
|
|
153
|
+
case "subqueryRef":
|
|
154
|
+
out.subqueryRefs[node.key] = node;
|
|
155
|
+
return;
|
|
156
|
+
case "exists":
|
|
157
|
+
out.paramNames.add(node.rootParam);
|
|
158
|
+
if (node.rootParam === ctx.rootParam)
|
|
159
|
+
out.relationKeys.add(node.relationKey);
|
|
160
|
+
out.existsNodes.push(node);
|
|
161
|
+
return;
|
|
162
|
+
case "binary":
|
|
163
|
+
this.visitExprIr(node.left, ctx, out);
|
|
164
|
+
this.visitExprIr(node.right, ctx, out);
|
|
165
|
+
return;
|
|
166
|
+
case "unary":
|
|
167
|
+
this.visitExprIr(node.operand, ctx, out);
|
|
168
|
+
return;
|
|
169
|
+
case "in":
|
|
170
|
+
this.visitExprIr(node.left, ctx, out);
|
|
171
|
+
this.visitExprIr(node.right, ctx, out);
|
|
172
|
+
return;
|
|
173
|
+
case "call":
|
|
174
|
+
this.visitExprIr(node.receiver, ctx, out);
|
|
175
|
+
for (const arg of node.args)
|
|
176
|
+
this.visitExprIr(arg, ctx, out);
|
|
177
|
+
return;
|
|
178
|
+
case "aggregate":
|
|
179
|
+
this.visitExprIr(node.arg, ctx, out);
|
|
180
|
+
return;
|
|
181
|
+
case "case":
|
|
182
|
+
for (const b of node.branches) {
|
|
183
|
+
this.visitExprIr(b.when, ctx, out);
|
|
184
|
+
this.visitExprIr(b.then, ctx, out);
|
|
185
|
+
}
|
|
186
|
+
if (node.else)
|
|
187
|
+
this.visitExprIr(node.else, ctx, out);
|
|
188
|
+
return;
|
|
189
|
+
case "const":
|
|
190
|
+
case "param":
|
|
191
|
+
return;
|
|
192
|
+
default: {
|
|
193
|
+
const _exhaustive = node;
|
|
194
|
+
return _exhaustive;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
relationKeysWithHints(relationKeys) {
|
|
199
|
+
const out = new Set(relationKeys);
|
|
200
|
+
if (!this.relations || !this.state.joinHints)
|
|
201
|
+
return out;
|
|
202
|
+
for (const hint of this.state.joinHints) {
|
|
203
|
+
if (hint.relationKey in this.relations)
|
|
204
|
+
out.add(hint.relationKey);
|
|
205
|
+
}
|
|
206
|
+
return out;
|
|
207
|
+
}
|
|
208
|
+
reusableJoinKeys(whereKeys, selectKeys) {
|
|
209
|
+
const out = new Set();
|
|
210
|
+
if (!this.relations)
|
|
211
|
+
return out;
|
|
212
|
+
for (const key of whereKeys) {
|
|
213
|
+
if (!selectKeys.has(key))
|
|
214
|
+
continue;
|
|
215
|
+
if (this.relations[key]?._relType === "one-to-many")
|
|
216
|
+
continue;
|
|
217
|
+
out.add(key);
|
|
218
|
+
}
|
|
219
|
+
return out;
|
|
220
|
+
}
|
|
221
|
+
merge(...items) {
|
|
222
|
+
const out = this.empty();
|
|
223
|
+
for (const item of items)
|
|
224
|
+
this.mergeInto(out, item);
|
|
225
|
+
return out;
|
|
226
|
+
}
|
|
227
|
+
empty() {
|
|
228
|
+
return {
|
|
229
|
+
paramNames: new Set(),
|
|
230
|
+
relationKeys: new Set(),
|
|
231
|
+
subqueryRefs: {},
|
|
232
|
+
existsNodes: [],
|
|
233
|
+
referencedRegisteredCtes: new Set(),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
mergeInto(target, source) {
|
|
237
|
+
for (const param of source.paramNames)
|
|
238
|
+
target.paramNames.add(param);
|
|
239
|
+
for (const key of source.relationKeys)
|
|
240
|
+
target.relationKeys.add(key);
|
|
241
|
+
Object.assign(target.subqueryRefs, source.subqueryRefs);
|
|
242
|
+
target.existsNodes.push(...source.existsNodes);
|
|
243
|
+
for (const name of source.referencedRegisteredCtes) {
|
|
244
|
+
target.referencedRegisteredCtes.add(name);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/** Ordered registered CTE names referenced in IR (where/having/select + updateSetIr / insertIr from analyze()). */
|
|
248
|
+
planReferencedRegisteredCtes(analysis) {
|
|
249
|
+
return orderReferencedRegisteredCtes(analysis.all.referencedRegisteredCtes, this.state.inScopeRegisteredCteNames, this.state.ctes?.map((c) => c.name));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function orderReferencedRegisteredCtes(referenced, inScopeRegisteredCteNames, cteNames) {
|
|
253
|
+
const order = [...(inScopeRegisteredCteNames ?? []), ...(cteNames ?? [])];
|
|
254
|
+
const seen = new Set();
|
|
255
|
+
return order.filter((n) => {
|
|
256
|
+
if (!referenced.has(n) || seen.has(n))
|
|
257
|
+
return false;
|
|
258
|
+
seen.add(n);
|
|
259
|
+
return true;
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=query-ir-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-ir-analyzer.js","sourceRoot":"","sources":["../../../../src/orm/helpers/query-plan/query-ir-analyzer.ts"],"names":[],"mappings":"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"}
|