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,258 @@
|
|
|
1
|
+
import { getPkColumnsFromSchema, } from "../../../entity/entity.js";
|
|
2
|
+
import { getEntityByTableName } from "../../../entity/global-driver.js";
|
|
3
|
+
import { isRecord, toArray } from "../../../utils.js";
|
|
4
|
+
import { InsertGraphBatchExecutor } from "./insert-graph-batch-executor.js";
|
|
5
|
+
import { InsertGraphSequentialExecutor } from "./insert-graph-sequential-executor.js";
|
|
6
|
+
export class InsertGraphPlanner {
|
|
7
|
+
state;
|
|
8
|
+
input;
|
|
9
|
+
constructor(state, input) {
|
|
10
|
+
this.state = state;
|
|
11
|
+
this.input = input;
|
|
12
|
+
}
|
|
13
|
+
async execute() {
|
|
14
|
+
const graphs = toArray(this.input);
|
|
15
|
+
if (graphs.length === 0)
|
|
16
|
+
return [];
|
|
17
|
+
const capabilities = this.state.qe.dialect.insertCapabilities;
|
|
18
|
+
const plan = this.buildInsertGraphPlan(graphs, capabilities);
|
|
19
|
+
await selectExecutor(plan).execute();
|
|
20
|
+
const roots = await this.materializeRootRows(plan);
|
|
21
|
+
return Array.isArray(this.input)
|
|
22
|
+
? roots
|
|
23
|
+
: roots[0];
|
|
24
|
+
}
|
|
25
|
+
buildInsertGraphPlan(graphs, capabilities) {
|
|
26
|
+
const plan = {
|
|
27
|
+
qe: this.state.qe,
|
|
28
|
+
nodes: [],
|
|
29
|
+
rootNodeIds: [],
|
|
30
|
+
};
|
|
31
|
+
const rootInfo = createEntityInfo(this.state.entity);
|
|
32
|
+
for (const graph of graphs) {
|
|
33
|
+
const rootNode = this.planGraphNode(plan, capabilities, rootInfo, graph);
|
|
34
|
+
plan.rootNodeIds.push(rootNode.id);
|
|
35
|
+
}
|
|
36
|
+
return plan;
|
|
37
|
+
}
|
|
38
|
+
planGraphNode(plan, capabilities, entityInfo, graph) {
|
|
39
|
+
const { scalarData, relationData } = splitGraphPayload(entityInfo, graph);
|
|
40
|
+
const node = registerPlannedNode(plan, {
|
|
41
|
+
tableName: entityInfo.tableName,
|
|
42
|
+
entity: entityInfo.entity,
|
|
43
|
+
scalarData,
|
|
44
|
+
pkColumns: entityInfo.pkColumns,
|
|
45
|
+
idResolution: resolveIdResolution(scalarData, entityInfo.pkColumns, capabilities),
|
|
46
|
+
});
|
|
47
|
+
for (const [relKey, relValue] of Object.entries(relationData)) {
|
|
48
|
+
const relDef = assertKnownRelation(relKey, entityInfo);
|
|
49
|
+
switch (relDef._relType) {
|
|
50
|
+
case "one-to-one":
|
|
51
|
+
case "many-to-one":
|
|
52
|
+
assertRelationIsRecord(relKey, relDef._relType, relValue);
|
|
53
|
+
this.planOwningToOneRelation(plan, capabilities, node, relDef, relValue);
|
|
54
|
+
break;
|
|
55
|
+
case "one-to-many":
|
|
56
|
+
assertRelationIsArray(relKey, relDef._relType, relValue);
|
|
57
|
+
this.planOneToManyChildren(plan, capabilities, node, relKey, relDef, relValue);
|
|
58
|
+
break;
|
|
59
|
+
case "many-to-many":
|
|
60
|
+
assertRelationIsArray(relKey, relDef._relType, relValue);
|
|
61
|
+
this.planManyToManyRelations(plan, capabilities, node, relKey, relDef, relValue);
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return node;
|
|
66
|
+
}
|
|
67
|
+
planOwningToOneRelation(plan, capabilities, node, relDef, relValue) {
|
|
68
|
+
const options = relDef._options;
|
|
69
|
+
const info = resolveTargetInfo(relDef);
|
|
70
|
+
const parentNode = this.planGraphNode(plan, capabilities, info, relValue);
|
|
71
|
+
addDependency(node, parentNode.id, getReferenceColumns(info, options), toArray(options.foreignKey));
|
|
72
|
+
}
|
|
73
|
+
planOneToManyChildren(plan, capabilities, node, relKey, relDef, relValue) {
|
|
74
|
+
const options = relDef._options;
|
|
75
|
+
const info = resolveTargetInfo(relDef);
|
|
76
|
+
const fkColumns = toArray(options.foreignKey);
|
|
77
|
+
for (const item of relValue) {
|
|
78
|
+
assertChildIsRecord(relKey, item);
|
|
79
|
+
const childNode = this.planGraphNode(plan, capabilities, info, item);
|
|
80
|
+
addDependency(childNode, node.id, node.pkColumns, fkColumns);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
planManyToManyRelations(plan, capabilities, node, relKey, relDef, relValue) {
|
|
84
|
+
const info = resolveTargetInfo(relDef);
|
|
85
|
+
const junction = resolveJunctionInfo(relDef);
|
|
86
|
+
for (const item of relValue) {
|
|
87
|
+
assertChildIsRecord(relKey, item);
|
|
88
|
+
const relatedNode = this.resolveManyToManyTargetNode(plan, capabilities, info, relKey, item);
|
|
89
|
+
const junctionNode = this.createJunctionNode(plan, junction);
|
|
90
|
+
addDependency(junctionNode, node.id, node.pkColumns, junction.fkColumns);
|
|
91
|
+
addDependency(junctionNode, relatedNode.id, info.pkColumns, junction.refColumns);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
resolveManyToManyTargetNode(plan, capabilities, info, relKey, item) {
|
|
95
|
+
const referenceRow = parseManyToManyReference(relKey, info.pkColumns, item);
|
|
96
|
+
if (referenceRow) {
|
|
97
|
+
return this.createReferenceNode(plan, info.entity, info.pkColumns, referenceRow);
|
|
98
|
+
}
|
|
99
|
+
return this.planGraphNode(plan, capabilities, info, item);
|
|
100
|
+
}
|
|
101
|
+
createJunctionNode(plan, junction) {
|
|
102
|
+
return registerPlannedNode(plan, {
|
|
103
|
+
tableName: junction.table,
|
|
104
|
+
entity: junction.entity,
|
|
105
|
+
scalarData: {},
|
|
106
|
+
pkColumns: [],
|
|
107
|
+
idResolution: "provided",
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
createReferenceNode(plan, targetEntity, pkColumns, referenceRow) {
|
|
111
|
+
return registerPlannedNode(plan, {
|
|
112
|
+
tableName: targetEntity.table._table,
|
|
113
|
+
entity: targetEntity,
|
|
114
|
+
scalarData: { ...referenceRow },
|
|
115
|
+
pkColumns,
|
|
116
|
+
idResolution: "provided",
|
|
117
|
+
insertedRow: { ...referenceRow },
|
|
118
|
+
materializedRow: { ...referenceRow },
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
async materializeRootRows(plan) {
|
|
122
|
+
const roots = [];
|
|
123
|
+
for (const nodeId of plan.rootNodeIds) {
|
|
124
|
+
roots.push(await materializeRoot(plan, plan.nodes[nodeId]));
|
|
125
|
+
}
|
|
126
|
+
return roots;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async function materializeRoot(plan, node) {
|
|
130
|
+
if (node.materializedRow)
|
|
131
|
+
return node.materializedRow;
|
|
132
|
+
if (!node.insertedRow) {
|
|
133
|
+
throw new Error("insertGraph: root row was not inserted");
|
|
134
|
+
}
|
|
135
|
+
const refetched = await node.entity.query(plan.qe).findById(node.insertedRow);
|
|
136
|
+
if (refetched == null) {
|
|
137
|
+
throw new Error("insertGraph: insert succeeded but root row could not be fetched back");
|
|
138
|
+
}
|
|
139
|
+
node.materializedRow = refetched;
|
|
140
|
+
return node.materializedRow;
|
|
141
|
+
}
|
|
142
|
+
function selectExecutor(plan) {
|
|
143
|
+
const canBatch = plan.nodes.every((node) => node.idResolution !== "unresolvableInBatch");
|
|
144
|
+
return canBatch ? new InsertGraphBatchExecutor(plan) : new InsertGraphSequentialExecutor(plan);
|
|
145
|
+
}
|
|
146
|
+
function createEntityInfo(entity) {
|
|
147
|
+
return {
|
|
148
|
+
tableName: entity.table._table,
|
|
149
|
+
columnSet: new Set(Object.keys(entity.table._schema)),
|
|
150
|
+
rels: entity.table._relations,
|
|
151
|
+
pkColumns: getPkColumnsFromSchema(entity.table._schema),
|
|
152
|
+
entity,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function assertKnownRelation(relKey, entityInfo) {
|
|
156
|
+
const relDef = entityInfo.rels?.[relKey];
|
|
157
|
+
if (!relDef) {
|
|
158
|
+
throw new Error(`insertGraph: unknown relation "${relKey}" on entity "${entityInfo.tableName}"`);
|
|
159
|
+
}
|
|
160
|
+
return relDef;
|
|
161
|
+
}
|
|
162
|
+
function assertRelationIsRecord(relKey, relType, value) {
|
|
163
|
+
if (!isRecord(value)) {
|
|
164
|
+
throw new Error(`insertGraph: relation "${relKey}" (${relType}) expects an object`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function assertRelationIsArray(relKey, relType, value) {
|
|
168
|
+
if (!Array.isArray(value)) {
|
|
169
|
+
throw new Error(`insertGraph: relation "${relKey}" (${relType}) expects an array`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function assertChildIsRecord(relKey, item) {
|
|
173
|
+
if (!isRecord(item)) {
|
|
174
|
+
throw new Error(`insertGraph: relation "${relKey}" array items must be objects`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function splitGraphPayload(entityInfo, graph) {
|
|
178
|
+
const scalarData = {};
|
|
179
|
+
const relationData = {};
|
|
180
|
+
const { columnSet, rels, tableName } = entityInfo;
|
|
181
|
+
for (const [key, value] of Object.entries(graph)) {
|
|
182
|
+
if (value === undefined)
|
|
183
|
+
continue;
|
|
184
|
+
if (rels && key in rels) {
|
|
185
|
+
relationData[key] = value;
|
|
186
|
+
}
|
|
187
|
+
else if (columnSet.has(key)) {
|
|
188
|
+
scalarData[key] = value;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
throw new Error(`insertGraph: unknown key "${key}" on entity "${tableName}"`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return { scalarData, relationData };
|
|
195
|
+
}
|
|
196
|
+
function resolveIdResolution(scalarData, pkColumns, capabilities) {
|
|
197
|
+
if (pkColumns.every((column) => scalarData[column] !== undefined))
|
|
198
|
+
return "provided";
|
|
199
|
+
if (capabilities.supportsReturning)
|
|
200
|
+
return "needsReturning";
|
|
201
|
+
if (capabilities.supportsSequences && pkColumns.length === 1)
|
|
202
|
+
return "needsSequence";
|
|
203
|
+
return "unresolvableInBatch";
|
|
204
|
+
}
|
|
205
|
+
function parseManyToManyReference(relKey, targetPkColumns, data) {
|
|
206
|
+
const pkSet = new Set(targetPkColumns);
|
|
207
|
+
const pkKeys = [];
|
|
208
|
+
const extraKeys = [];
|
|
209
|
+
for (const key of Object.keys(data)) {
|
|
210
|
+
if (data[key] === undefined)
|
|
211
|
+
continue;
|
|
212
|
+
if (pkSet.has(key))
|
|
213
|
+
pkKeys.push(key);
|
|
214
|
+
else
|
|
215
|
+
extraKeys.push(key);
|
|
216
|
+
}
|
|
217
|
+
if (pkKeys.length === 0)
|
|
218
|
+
return null;
|
|
219
|
+
if (pkKeys.length < targetPkColumns.length) {
|
|
220
|
+
throw new Error(`insertGraph: relation "${relKey}" expects either all target primary key fields or none`);
|
|
221
|
+
}
|
|
222
|
+
if (extraKeys.length > 0) {
|
|
223
|
+
throw new Error(`insertGraph: relation "${relKey}" reference objects may only contain primary key fields`);
|
|
224
|
+
}
|
|
225
|
+
return data;
|
|
226
|
+
}
|
|
227
|
+
function getReferenceColumns(info, options) {
|
|
228
|
+
if (options.references == null)
|
|
229
|
+
return info.pkColumns;
|
|
230
|
+
return toArray(options.references);
|
|
231
|
+
}
|
|
232
|
+
function resolveTargetInfo(relDef) {
|
|
233
|
+
return createEntityInfo(relDef._target());
|
|
234
|
+
}
|
|
235
|
+
function resolveJunctionInfo(relDef) {
|
|
236
|
+
const options = relDef._options;
|
|
237
|
+
return {
|
|
238
|
+
table: options.junction,
|
|
239
|
+
entity: getEntityByTableName(options.junction),
|
|
240
|
+
fkColumns: toArray(options.foreignKey),
|
|
241
|
+
refColumns: toArray(options.referenceKey),
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function addDependency(node, sourceNodeId, sourceColumns, targetColumns) {
|
|
245
|
+
node.dependencyIds.push(sourceNodeId);
|
|
246
|
+
node.pendingCopies.push({ sourceNodeId, sourceColumns, targetColumns });
|
|
247
|
+
}
|
|
248
|
+
function registerPlannedNode(plan, fields) {
|
|
249
|
+
const node = {
|
|
250
|
+
id: plan.nodes.length,
|
|
251
|
+
dependencyIds: [],
|
|
252
|
+
pendingCopies: [],
|
|
253
|
+
...fields,
|
|
254
|
+
};
|
|
255
|
+
plan.nodes.push(node);
|
|
256
|
+
return node;
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=insert-graph-planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-graph-planner.js","sourceRoot":"","sources":["../../../../src/orm/helpers/insert-graph/insert-graph-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { QueryExecutor } from "../../db.js";
|
|
2
|
+
import { InsertGraphExecutor } from "./insert-graph-executor.js";
|
|
3
|
+
import type { PlannedNode } from "./insert-graph-planner.js";
|
|
4
|
+
export declare class InsertGraphSequentialExecutor extends InsertGraphExecutor {
|
|
5
|
+
protected insertReadyNodes(qe: QueryExecutor, nodes: PlannedNode[]): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=insert-graph-sequential-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-graph-sequential-executor.d.ts","sourceRoot":"","sources":["../../../../src/orm/helpers/insert-graph/insert-graph-sequential-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,qBAAa,6BAA8B,SAAQ,mBAAmB;cACpD,gBAAgB,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { InsertGraphExecutor } from "./insert-graph-executor.js";
|
|
2
|
+
export class InsertGraphSequentialExecutor extends InsertGraphExecutor {
|
|
3
|
+
async insertReadyNodes(qe, nodes) {
|
|
4
|
+
for (const node of nodes)
|
|
5
|
+
await this.insertSingleNode(qe, node);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=insert-graph-sequential-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-graph-sequential-executor.js","sourceRoot":"","sources":["../../../../src/orm/helpers/insert-graph/insert-graph-sequential-executor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,MAAM,OAAO,6BAA8B,SAAQ,mBAAmB;IAC1D,KAAK,CAAC,gBAAgB,CAAC,EAAiB,EAAE,KAAoB;QACtE,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { QueryCompiler } from "../../../dbs/types.js";
|
|
2
|
+
import type { QueryExecutor } from "../../db.js";
|
|
3
|
+
import type { PlannedNode } from "./insert-graph-planner.js";
|
|
4
|
+
export declare class SequenceIdAssigner {
|
|
5
|
+
private readonly compiler;
|
|
6
|
+
private readonly qe;
|
|
7
|
+
private readonly tableName;
|
|
8
|
+
private readonly nodes;
|
|
9
|
+
constructor(compiler: QueryCompiler, qe: QueryExecutor, tableName: string, nodes: PlannedNode[]);
|
|
10
|
+
assign(): Promise<void>;
|
|
11
|
+
private requireSinglePkColumn;
|
|
12
|
+
private allocateValues;
|
|
13
|
+
private extractValues;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=sequence-id-assigner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence-id-assigner.d.ts","sourceRoot":"","sources":["../../../../src/orm/helpers/insert-graph/sequence-id-assigner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAHL,QAAQ,EAAE,aAAa,EACvB,EAAE,EAAE,aAAa,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,WAAW,EAAE;IAGjC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAY7B,OAAO,CAAC,qBAAqB;YASf,cAAc;IAM5B,OAAO,CAAC,aAAa;CActB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export class SequenceIdAssigner {
|
|
2
|
+
compiler;
|
|
3
|
+
qe;
|
|
4
|
+
tableName;
|
|
5
|
+
nodes;
|
|
6
|
+
constructor(compiler, qe, tableName, nodes) {
|
|
7
|
+
this.compiler = compiler;
|
|
8
|
+
this.qe = qe;
|
|
9
|
+
this.tableName = tableName;
|
|
10
|
+
this.nodes = nodes;
|
|
11
|
+
}
|
|
12
|
+
async assign() {
|
|
13
|
+
const sequenceNodes = this.nodes.filter((node) => node.idResolution === "needsSequence");
|
|
14
|
+
if (sequenceNodes.length === 0)
|
|
15
|
+
return;
|
|
16
|
+
const pkColumn = this.requireSinglePkColumn(sequenceNodes[0].pkColumns);
|
|
17
|
+
const values = await this.allocateValues(pkColumn, sequenceNodes.length);
|
|
18
|
+
for (const [index, node] of sequenceNodes.entries()) {
|
|
19
|
+
node.scalarData[pkColumn] = values[index];
|
|
20
|
+
node.idResolution = "provided";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
requireSinglePkColumn(pkColumns) {
|
|
24
|
+
if (pkColumns.length !== 1) {
|
|
25
|
+
throw new Error("insertGraph: sequence-backed batch inserts require a single primary key column");
|
|
26
|
+
}
|
|
27
|
+
return pkColumns[0];
|
|
28
|
+
}
|
|
29
|
+
async allocateValues(pkColumn, count) {
|
|
30
|
+
const compiled = this.compiler.compileNextSequenceValues(this.tableName, pkColumn, count);
|
|
31
|
+
const rows = await this.qe.query(compiled.sql, compiled.params);
|
|
32
|
+
return this.extractValues(rows, count);
|
|
33
|
+
}
|
|
34
|
+
extractValues(rows, expectedCount) {
|
|
35
|
+
if (rows.length !== expectedCount) {
|
|
36
|
+
throw new Error("insertGraph: sequence allocation did not return the expected number of rows");
|
|
37
|
+
}
|
|
38
|
+
return rows.map((row) => {
|
|
39
|
+
if (row != null && typeof row === "object") {
|
|
40
|
+
const values = Object.values(row);
|
|
41
|
+
if (values.length === 1)
|
|
42
|
+
return values[0];
|
|
43
|
+
}
|
|
44
|
+
throw new Error("insertGraph: sequence allocation rows must contain exactly one value");
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=sequence-id-assigner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence-id-assigner.js","sourceRoot":"","sources":["../../../../src/orm/helpers/insert-graph/sequence-id-assigner.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,kBAAkB;IAEV;IACA;IACA;IACA;IAJnB,YACmB,QAAuB,EACvB,EAAiB,EACjB,SAAiB,EACjB,KAAoB;QAHpB,aAAQ,GAAR,QAAQ,CAAe;QACvB,OAAE,GAAF,EAAE,CAAe;QACjB,cAAS,GAAT,SAAS,CAAQ;QACjB,UAAK,GAAL,KAAK,CAAe;IACpC,CAAC;IAEJ,KAAK,CAAC,MAAM;QACV,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,KAAK,eAAe,CAAC,CAAC;QACzF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACzE,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,SAAmB;QAC/C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;QACJ,CAAC;QACD,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,KAAa;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAEO,aAAa,CAAC,IAAe,EAAE,aAAqB;QAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACtB,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAA8B,CAAC,CAAC;gBAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC1F,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,155 @@
|
|
|
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
|
+
import type { IrNode, IrSubqueryRef, IrAggregate } from "../../../ir/types.js";
|
|
22
|
+
import type { Expr, ExprColumn, ExprAggregate } from "../../expr.js";
|
|
23
|
+
import type { OneToManyExistsMeta } from "../relations/relation-joins.js";
|
|
24
|
+
import type { QueryPlan } from "./query-plan.js";
|
|
25
|
+
export type SubqueryPlans = Map<string, QueryPlan>;
|
|
26
|
+
/**
|
|
27
|
+
* Converts IR nodes to runtime `Expr` against a precomputed alias context.
|
|
28
|
+
*
|
|
29
|
+
* Constructor inputs:
|
|
30
|
+
* - `paramToAlias` — maps every row-param name in scope (including
|
|
31
|
+
* outer-correlated ones) to its SQL table alias. Built by the planner's
|
|
32
|
+
* `buildParamToAlias` phase.
|
|
33
|
+
* - `relationPathToAlias` — maps `"<param>.<relKey>"` to the join alias
|
|
34
|
+
* the planner allocated for that relation. Drives the column-path
|
|
35
|
+
* rewrite in `resolveColumn` (a member access through a joined relation
|
|
36
|
+
* becomes a column reference on the join's alias).
|
|
37
|
+
* - `oneToManyExists` — pre-resolved EXISTS metadata keyed by
|
|
38
|
+
* `"<rootParam>.<relationKey>"`. Lets `convertExists` emit a fully
|
|
39
|
+
* structured `ExprExists` without redoing the relation lookup.
|
|
40
|
+
* - `subqueryPlans` — child plans keyed by the runtime param/subquery
|
|
41
|
+
* placeholder names that reference captured `QueryBuilder`s.
|
|
42
|
+
*/
|
|
43
|
+
export declare class ExprBuilder {
|
|
44
|
+
private readonly paramToAlias;
|
|
45
|
+
private readonly relationPathToAlias;
|
|
46
|
+
private readonly oneToManyExists;
|
|
47
|
+
private readonly subqueryPlans;
|
|
48
|
+
private readonly relationKeys;
|
|
49
|
+
private readonly cteNames;
|
|
50
|
+
constructor(paramToAlias: Record<string, string>, relationPathToAlias: Record<string, string>, oneToManyExists: Record<string, OneToManyExistsMeta>, subqueryPlans: SubqueryPlans, relationKeys?: Set<string>, cteNames?: Set<string>);
|
|
51
|
+
/**
|
|
52
|
+
* Recursively convert any IR node to an `Expr`.
|
|
53
|
+
*
|
|
54
|
+
* `scope` is the row-param-to-table-alias mapping in effect for this
|
|
55
|
+
* conversion. It defaults to the builder's `paramToAlias` (the top-level
|
|
56
|
+
* scope of the plan being built). `convertExists` augments and re-passes
|
|
57
|
+
* it: when an `EXISTS` predicate binds a fresh inner row-param (e.g.
|
|
58
|
+
* `d.employees.some(e => e.name === "Alice")` binds `e`), the recursive
|
|
59
|
+
* call uses `{ ...scope, [innerParam]: innerAlias }` so the inner
|
|
60
|
+
* predicate's `e.name` resolves against the inner-relation table alias
|
|
61
|
+
* rather than the outer row's.
|
|
62
|
+
*
|
|
63
|
+
* Throws on unknown node kinds — the IR types are a closed union, so
|
|
64
|
+
* hitting the default branch means a future-added kind wasn't handled.
|
|
65
|
+
*/
|
|
66
|
+
convert(node: IrNode, scope?: Record<string, string>, inlineParams?: Record<string, unknown>): Expr;
|
|
67
|
+
/**
|
|
68
|
+
* Resolve `param.path` (an IR member reference) to a (alias, column-path)
|
|
69
|
+
* pair the dialect can render directly.
|
|
70
|
+
*
|
|
71
|
+
* Resolution proceeds in two steps:
|
|
72
|
+
*
|
|
73
|
+
* 1. **Alias lookup.** The starting alias is `scope[param]`. The planner
|
|
74
|
+
* builds that scope before conversion, including local and correlated
|
|
75
|
+
* row params.
|
|
76
|
+
*
|
|
77
|
+
* 2. **Relation rewrite.** If `path[0]` names a relation that has been
|
|
78
|
+
* joined into the query (`relationPathToAlias` has an entry for
|
|
79
|
+
* `"<param>.<path[0]>"`), the alias is replaced with the join's
|
|
80
|
+
* alias and the leading segment is dropped from the path. Example:
|
|
81
|
+
* `u.author.name` with `relationPathToAlias["u.author"] = "t1"`
|
|
82
|
+
* rewrites to `(alias: "t1", column: ["name"])`.
|
|
83
|
+
*
|
|
84
|
+
* The returned `ExprColumn.column` is a path array: empty means the
|
|
85
|
+
* alias itself (rare — only when relation rewrite consumed the entire
|
|
86
|
+
* path), single element is a leaf column, multiple elements is a
|
|
87
|
+
* dotted path (rare; preserved for forward compatibility).
|
|
88
|
+
*/
|
|
89
|
+
resolveColumn(param: string, path: string[], scope?: Record<string, string>): ExprColumn;
|
|
90
|
+
private assertColumnPath;
|
|
91
|
+
/**
|
|
92
|
+
* Convert an `IrAggregate` (e.g. `count(u.id)`, `sum(p.price)`) to an
|
|
93
|
+
* `ExprAggregate`. The argument expression — when present — is converted
|
|
94
|
+
* recursively so nested member paths resolve through the same alias
|
|
95
|
+
* scope. `null` arg means `COUNT(*)` style.
|
|
96
|
+
*
|
|
97
|
+
* Public so the planner's `buildSelectItems` can convert select-list
|
|
98
|
+
* aggregates directly without a wrapping `IrNode` that would otherwise
|
|
99
|
+
* route through `convert`.
|
|
100
|
+
*/
|
|
101
|
+
convertAggregate(agg: IrAggregate, scope?: Record<string, string>, inlineParams?: Record<string, unknown>): ExprAggregate;
|
|
102
|
+
/**
|
|
103
|
+
* Convert an `IrSubqueryRef` (a transformer-emitted placeholder pointing
|
|
104
|
+
* at a captured `QueryBuilder` in the param bags) to an `ExprSubquery`
|
|
105
|
+
* by looking up the child plan the planner already built.
|
|
106
|
+
* Public so `buildSelectItems` can use it for select-list subqueries
|
|
107
|
+
* (`Entity.query()....` projected as a column value).
|
|
108
|
+
*/
|
|
109
|
+
convertSubqueryRef(ref: IrSubqueryRef): Expr;
|
|
110
|
+
/**
|
|
111
|
+
* Resolve an `IrParam` (free variable referenced by name from a runtime-
|
|
112
|
+
* parsed predicate). Captured subqueries are represented as
|
|
113
|
+
* `IrSubqueryRef`, so params always stay late-bound.
|
|
114
|
+
*/
|
|
115
|
+
private resolveParamRef;
|
|
116
|
+
/**
|
|
117
|
+
* Convert `<expr> IN <rhs>` (or `NOT IN`). The right-hand side has three
|
|
118
|
+
* legal IR shapes that map to three different `ExprInRhs` shapes:
|
|
119
|
+
*
|
|
120
|
+
* - `IrConst` array → `{ kind: "values", values }` — inline literal list,
|
|
121
|
+
* compiled to `(?, ?, ?)` placeholders.
|
|
122
|
+
* - `IrParam` → a late-bound param reference. It expands at execution
|
|
123
|
+
* time when the dialect resolves `__param` sentinels.
|
|
124
|
+
* - `IrSubqueryRef` → a pre-built inline subquery plan.
|
|
125
|
+
*
|
|
126
|
+
* Anything else throws — IN's right side is a closed union by spec.
|
|
127
|
+
*/
|
|
128
|
+
private convertIn;
|
|
129
|
+
/**
|
|
130
|
+
* Convert an `IrExists` (a one-to-many `EXISTS (...)` subquery).
|
|
131
|
+
*
|
|
132
|
+
* The relation lookup was done up-front by the planner's
|
|
133
|
+
* `OneToManyExistsBuilder`, which produced `oneToManyExists` keyed by
|
|
134
|
+
* `"<rootParam>.<relationKey>"`. We just look up the entry and stamp it
|
|
135
|
+
* onto the runtime `ExprExists`.
|
|
136
|
+
*
|
|
137
|
+
* Two scope details worth noting:
|
|
138
|
+
*
|
|
139
|
+
* 1. **outerAlias.** This is the alias the EXISTS predicate joins
|
|
140
|
+
* against (typically the main table). Resolving via
|
|
141
|
+
* `scope[node.rootParam]` is what makes nested EXISTS work: when an
|
|
142
|
+
* EXISTS is itself inside another EXISTS' inner predicate, the
|
|
143
|
+
* inner-most rootParam is actually the parent EXISTS' bound row,
|
|
144
|
+
* and `scope` will have been augmented to map it to the parent's
|
|
145
|
+
* inner alias.
|
|
146
|
+
*
|
|
147
|
+
* 2. **innerScope.** Augmenting with `[innerParam]: info.alias` is what
|
|
148
|
+
* lets the inner predicate's column references (`e.name` in
|
|
149
|
+
* `.some(e => e.name === ...)`) resolve to the inner relation's
|
|
150
|
+
* table alias rather than the outer row's.
|
|
151
|
+
*/
|
|
152
|
+
private convertExists;
|
|
153
|
+
private getSubqueryPlan;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=expr-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expr-builder.d.ts","sourceRoot":"","sources":["../../../../src/orm/helpers/query-plan/expr-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAEnD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBALR,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACpD,aAAa,EAAE,aAAa,EAC5B,YAAY,GAAE,GAAG,CAAC,MAAM,CAAa,EACrC,QAAQ,GAAE,GAAG,CAAC,MAAM,CAAa;IAGpD;;;;;;;;;;;;;;OAcG;IACH,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAqB,EACjD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,IAAI;IAoDP;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,aAAa,CACX,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAqB,GAChD,UAAU;IAiBb,OAAO,CAAC,gBAAgB;IAcxB;;;;;;;;;OASG;IACH,gBAAgB,CACd,GAAG,EAAE,WAAW,EAChB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAqB,EACjD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,aAAa;IAWhB;;;;;;OAMG;IACH,kBAAkB,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAI5C;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAmBvB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,SAAS;IA0BjB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,eAAe;CAGxB"}
|