@relq/orm 0.1.3 → 0.1.5
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/LICENSE +1 -1
- package/README.md +33 -224
- package/dist/cjs/addon/cursor.cjs +2 -1407
- package/dist/cjs/addon/mysql2.cjs +21143 -0
- package/dist/cjs/addon/pg.cjs +5 -5
- package/dist/cjs/cache/query-cache.cjs +1 -4
- package/dist/cjs/core/cte/cte-accessor.cjs +80 -0
- package/dist/cjs/core/cte/cte-types.cjs +24 -0
- package/dist/cjs/core/cte/native-cte-builder.cjs +254 -0
- package/dist/cjs/core/helpers/index.cjs +14 -14
- package/dist/cjs/core/relq-base.cjs +4 -88
- package/dist/cjs/core/relq-client.cjs +59 -41
- package/dist/cjs/core/shared/column-mapping.cjs +1 -1
- package/dist/cjs/core/shared/table-accessor.cjs +1 -1
- package/dist/cjs/core/shared/where.cjs +15 -0
- package/dist/cjs/index.cjs +40 -5
- package/dist/cjs/mysql/clients/index.cjs +17 -0
- package/dist/cjs/mysql/clients/mariadb-client/capabilities.cjs +31 -0
- package/dist/cjs/mysql/clients/mariadb-client/index.cjs +7 -0
- package/dist/cjs/mysql/clients/mariadb-client/relq-mariadb.cjs +14 -0
- package/dist/cjs/mysql/clients/mysql-client/capabilities.cjs +31 -0
- package/dist/cjs/mysql/clients/mysql-client/index.cjs +7 -0
- package/dist/cjs/mysql/clients/mysql-client/relq-mysql.cjs +14 -0
- package/dist/cjs/mysql/clients/planetscale-client/capabilities.cjs +31 -0
- package/dist/cjs/mysql/clients/planetscale-client/index.cjs +7 -0
- package/dist/cjs/mysql/clients/planetscale-client/relq-planetscale.cjs +32 -0
- package/dist/cjs/mysql/clients/shared/index.cjs +32 -0
- package/dist/cjs/mysql/clients/shared/mysql-base.cjs +362 -0
- package/dist/cjs/mysql/clients/shared/mysql-dialect.cjs +141 -0
- package/dist/cjs/mysql/clients/shared/mysql-error-parser.cjs +195 -0
- package/dist/cjs/mysql/clients/shared/mysql-format.cjs +95 -0
- package/dist/cjs/mysql/clients/shared/mysql-type-coercion.cjs +14 -0
- package/dist/cjs/mysql/condition/condition-collector.cjs +377 -0
- package/dist/cjs/mysql/condition/fulltext-condition-builder.cjs +63 -0
- package/dist/cjs/mysql/condition/index.cjs +16 -0
- package/dist/cjs/mysql/condition/json-condition-builder.cjs +144 -0
- package/dist/cjs/mysql/condition/json-path-proxy.cjs +520 -0
- package/dist/cjs/mysql/count/count-builder.cjs +109 -0
- package/dist/cjs/mysql/count/index.cjs +5 -0
- package/dist/cjs/mysql/delete/delete-builder.cjs +105 -0
- package/dist/cjs/mysql/delete/index.cjs +5 -0
- package/dist/cjs/mysql/explain/explain-builder.cjs +43 -0
- package/dist/cjs/mysql/explain/index.cjs +5 -0
- package/dist/cjs/mysql/helpers/MysqlConnectedAggregateBuilder.cjs +132 -0
- package/dist/cjs/mysql/helpers/MysqlConnectedCountBuilder.cjs +83 -0
- package/dist/cjs/mysql/helpers/MysqlConnectedDeleteBuilder.cjs +91 -0
- package/dist/cjs/mysql/helpers/MysqlConnectedInsertBuilder.cjs +75 -0
- package/dist/cjs/mysql/helpers/MysqlConnectedInsertFromSelectBuilder.cjs +57 -0
- package/dist/cjs/mysql/helpers/MysqlConnectedQueryBuilder.cjs +141 -0
- package/dist/cjs/mysql/helpers/MysqlConnectedRawQueryBuilder.cjs +60 -0
- package/dist/cjs/mysql/helpers/MysqlConnectedSelectBuilder.cjs +398 -0
- package/dist/cjs/mysql/helpers/MysqlConnectedTransactionBuilder.cjs +128 -0
- package/dist/cjs/mysql/helpers/MysqlConnectedUpdateBuilder.cjs +92 -0
- package/dist/cjs/mysql/helpers/MysqlPaginateBuilder.cjs +186 -0
- package/dist/cjs/mysql/helpers/MysqlReturningExecutor.cjs +69 -0
- package/dist/cjs/mysql/helpers/index.cjs +45 -0
- package/dist/cjs/mysql/helpers/query-convenience.cjs +210 -0
- package/dist/cjs/mysql/helpers/select-joins.cjs +465 -0
- package/dist/cjs/mysql/helpers/select-pagination.cjs +190 -0
- package/dist/cjs/mysql/index.cjs +154 -0
- package/dist/cjs/mysql/insert/duplicate-key-builder.cjs +185 -0
- package/dist/cjs/mysql/insert/index.cjs +13 -0
- package/dist/cjs/mysql/insert/insert-builder.cjs +169 -0
- package/dist/cjs/mysql/insert/insert-from-select-builder.cjs +74 -0
- package/dist/cjs/mysql/raw/index.cjs +8 -0
- package/dist/cjs/mysql/raw/raw-query-builder.cjs +27 -0
- package/dist/cjs/mysql/raw/sql-template.cjs +65 -0
- package/dist/cjs/mysql/select/aggregate-builder.cjs +211 -0
- package/dist/cjs/mysql/select/index.cjs +32 -0
- package/dist/cjs/mysql/select/join-builder.cjs +206 -0
- package/dist/cjs/mysql/select/join-condition-builder.cjs +205 -0
- package/dist/cjs/mysql/select/join-internals.cjs +5 -0
- package/dist/cjs/mysql/select/scalar-query-builder.cjs +164 -0
- package/dist/cjs/mysql/select/scalar-select-builder.cjs +78 -0
- package/dist/cjs/mysql/select/select-builder.cjs +414 -0
- package/dist/cjs/mysql/select/sql-expression.cjs +56 -0
- package/dist/cjs/mysql/select/table-proxy.cjs +99 -0
- package/dist/cjs/mysql/shared/mysql-table-accessor.cjs +22 -0
- package/dist/cjs/mysql/transaction/index.cjs +6 -0
- package/dist/cjs/mysql/transaction/transaction-builder.cjs +64 -0
- package/dist/cjs/mysql/update/column-expression-builder.cjs +49 -0
- package/dist/cjs/mysql/update/index.cjs +7 -0
- package/dist/cjs/mysql/update/mysql-json-update-builder.cjs +200 -0
- package/dist/cjs/mysql/update/update-builder.cjs +167 -0
- package/dist/cjs/mysql/utils/addon/mysql/mysql2.cjs +23 -0
- package/dist/cjs/mysql/utils/fk-resolver.cjs +187 -0
- package/dist/cjs/mysql/utils/index.cjs +16 -0
- package/dist/cjs/mysql/utils/type-coercion.cjs +158 -0
- package/dist/cjs/mysql/window/index.cjs +5 -0
- package/dist/cjs/mysql/window/window-builder.cjs +80 -0
- package/dist/cjs/pg/clients/alloydb-client/capabilities.cjs +31 -0
- package/dist/cjs/pg/clients/alloydb-client/index.cjs +7 -0
- package/dist/cjs/pg/clients/alloydb-client/relq-alloydb.cjs +43 -0
- package/dist/cjs/pg/clients/aurora-client/capabilities.cjs +31 -0
- package/dist/cjs/pg/clients/aurora-client/index.cjs +7 -0
- package/dist/cjs/pg/clients/aurora-client/relq-aurora.cjs +43 -0
- package/dist/cjs/pg/clients/citus-client/capabilities.cjs +31 -0
- package/dist/cjs/pg/clients/citus-client/index.cjs +7 -0
- package/dist/cjs/pg/clients/citus-client/relq-citus.cjs +43 -0
- package/dist/cjs/pg/clients/neon-client/capabilities.cjs +31 -0
- package/dist/cjs/pg/clients/neon-client/index.cjs +7 -0
- package/dist/cjs/pg/clients/neon-client/relq-neon.cjs +43 -0
- package/dist/cjs/pg/clients/pg-client/relq-postgres.cjs +56 -0
- package/dist/cjs/{core/pg-family → pg/clients}/shared/pg-base.cjs +64 -7
- package/dist/cjs/{core/pg-family → pg/clients}/shared/pg-type-coercion.cjs +1 -1
- package/dist/cjs/pg/clients/supabase-client/capabilities.cjs +31 -0
- package/dist/cjs/pg/clients/supabase-client/index.cjs +7 -0
- package/dist/cjs/{core/pg-family/pg-client/relq-postgres.cjs → pg/clients/supabase-client/relq-supabase.cjs} +9 -9
- package/dist/cjs/pg/clients/timescale-client/capabilities.cjs +31 -0
- package/dist/cjs/pg/clients/timescale-client/index.cjs +7 -0
- package/dist/cjs/pg/clients/timescale-client/relq-timescale.cjs +43 -0
- package/dist/cjs/pg/clients/yugabytedb-client/capabilities.cjs +31 -0
- package/dist/cjs/pg/clients/yugabytedb-client/index.cjs +7 -0
- package/dist/cjs/pg/clients/yugabytedb-client/relq-yugabytedb.cjs +16 -0
- package/dist/cjs/{condition → pg/condition}/array-condition-builder.cjs +1 -1
- package/dist/cjs/pg/condition/array-path-proxy.cjs +379 -0
- package/dist/cjs/{condition → pg/condition}/condition-collector.cjs +18 -9
- package/dist/cjs/{condition → pg/condition}/fulltext-condition-builder.cjs +1 -1
- package/dist/cjs/{condition → pg/condition}/geometric-condition-builder.cjs +1 -1
- package/dist/cjs/pg/condition/json-path-proxy.cjs +480 -0
- package/dist/cjs/{condition → pg/condition}/jsonb-condition-builder.cjs +1 -1
- package/dist/cjs/{condition → pg/condition}/network-condition-builder.cjs +1 -1
- package/dist/cjs/{condition → pg/condition}/postgis-condition-builder.cjs +1 -1
- package/dist/cjs/{condition → pg/condition}/range-condition-builder.cjs +1 -1
- package/dist/cjs/{count → pg/count}/count-builder.cjs +10 -5
- package/dist/cjs/{delete → pg/delete}/delete-builder.cjs +10 -5
- package/dist/cjs/{core → pg}/helpers/ConnectedAggregateBuilder.cjs +16 -3
- package/dist/cjs/{core → pg}/helpers/ConnectedCountBuilder.cjs +16 -3
- package/dist/cjs/{core → pg}/helpers/ConnectedDeleteBuilder.cjs +27 -7
- package/dist/cjs/{core → pg}/helpers/ConnectedInsertBuilder.cjs +16 -8
- package/dist/cjs/{core → pg}/helpers/ConnectedInsertFromSelectBuilder.cjs +9 -5
- package/dist/cjs/{core → pg}/helpers/ConnectedQueryBuilder.cjs +14 -19
- package/dist/cjs/pg/helpers/ConnectedRawQueryBuilder.cjs +67 -0
- package/dist/cjs/{core → pg}/helpers/ConnectedSelectBuilder.cjs +121 -25
- package/dist/cjs/{core → pg}/helpers/ConnectedTransactionBuilder.cjs +34 -4
- package/dist/cjs/{core → pg}/helpers/ConnectedUpdateBuilder.cjs +27 -7
- package/dist/cjs/{core → pg}/helpers/PaginateBuilder.cjs +3 -3
- package/dist/cjs/{core → pg}/helpers/ReturningExecutor.cjs +3 -3
- package/dist/cjs/{core → pg}/helpers/query-convenience.cjs +11 -12
- package/dist/cjs/{core → pg}/helpers/select-joins.cjs +17 -14
- package/dist/cjs/{core → pg}/helpers/select-pagination.cjs +1 -1
- package/dist/cjs/{insert → pg/insert}/conflict-builder.cjs +2 -2
- package/dist/cjs/{insert → pg/insert}/insert-builder.cjs +8 -5
- package/dist/cjs/{insert → pg/insert}/insert-from-select-builder.cjs +1 -1
- package/dist/cjs/{pubsub → pg/pubsub}/listen-notify-builder.cjs +1 -1
- package/dist/cjs/{pubsub → pg/pubsub}/listener-connection.cjs +2 -2
- package/dist/cjs/{raw → pg/raw}/raw-query-builder.cjs +2 -2
- package/dist/cjs/{raw → pg/raw}/sql-template.cjs +1 -6
- package/dist/cjs/{select → pg/select}/aggregate-builder.cjs +10 -5
- package/dist/cjs/{select → pg/select}/join-builder.cjs +2 -2
- package/dist/cjs/{select → pg/select}/join-condition-builder.cjs +11 -1
- package/dist/cjs/{select → pg/select}/join-many-condition-builder.cjs +3 -4
- package/dist/cjs/{select → pg/select}/scalar-query-builder.cjs +31 -1
- package/dist/cjs/{select → pg/select}/scalar-select-builder.cjs +1 -1
- package/dist/cjs/{select → pg/select}/select-builder.cjs +40 -7
- package/dist/cjs/pg/select/sql-expression.cjs +56 -0
- package/dist/cjs/{transaction → pg/transaction}/transaction-builder.cjs +1 -1
- package/dist/cjs/{update → pg/update}/array-update-builder.cjs +2 -5
- package/dist/cjs/pg/update/column-expression-builder.cjs +49 -0
- package/dist/cjs/{update → pg/update}/jsonb-update-builder.cjs +1 -1
- package/dist/cjs/{update → pg/update}/update-builder.cjs +14 -7
- package/dist/cjs/{utils → pg/utils}/addon/pg/cursor.cjs +1 -1
- package/dist/cjs/{utils → pg/utils}/addon/pg/pg.cjs +2 -2
- package/dist/cjs/{utils → pg/utils}/fk-resolver.cjs +47 -30
- package/dist/cjs/{window → pg/window}/window-builder.cjs +1 -1
- package/dist/cjs/shared/errors/relq-errors.cjs +496 -35
- package/dist/cjs/shared/types/config-types.cjs +2 -2
- package/dist/cjs/utils/env-resolver.cjs +76 -13
- package/dist/cjs/utils/index.cjs +1 -1
- package/dist/esm/addon/cursor.js +1 -1438
- package/dist/esm/addon/mysql2.js +21129 -0
- package/dist/esm/addon/pg.js +5 -5
- package/dist/esm/cache/query-cache.js +1 -4
- package/dist/esm/core/cte/cte-accessor.js +75 -0
- package/dist/esm/core/cte/cte-types.js +20 -0
- package/dist/esm/core/cte/native-cte-builder.js +250 -0
- package/dist/esm/core/helpers/index.js +12 -12
- package/dist/esm/core/relq-base.js +5 -56
- package/dist/esm/core/relq-client.js +54 -32
- package/dist/esm/core/shared/column-mapping.js +1 -1
- package/dist/esm/core/shared/table-accessor.js +1 -1
- package/dist/esm/core/shared/where.js +12 -0
- package/dist/esm/index.js +17 -5
- package/dist/esm/mysql/clients/index.js +5 -0
- package/dist/esm/mysql/clients/mariadb-client/capabilities.js +28 -0
- package/dist/esm/mysql/clients/mariadb-client/index.js +2 -0
- package/dist/esm/mysql/clients/mariadb-client/relq-mariadb.js +10 -0
- package/dist/esm/mysql/clients/mysql-client/capabilities.js +28 -0
- package/dist/esm/mysql/clients/mysql-client/index.js +2 -0
- package/dist/esm/mysql/clients/mysql-client/relq-mysql.js +10 -0
- package/dist/esm/mysql/clients/planetscale-client/capabilities.js +28 -0
- package/dist/esm/mysql/clients/planetscale-client/index.js +2 -0
- package/dist/esm/mysql/clients/planetscale-client/relq-planetscale.js +28 -0
- package/dist/esm/mysql/clients/shared/index.js +7 -0
- package/dist/esm/mysql/clients/shared/mysql-base.js +321 -0
- package/dist/esm/mysql/clients/shared/mysql-dialect.js +136 -0
- package/dist/esm/mysql/clients/shared/mysql-error-parser.js +188 -0
- package/dist/esm/mysql/clients/shared/mysql-format.js +92 -0
- package/dist/esm/mysql/clients/shared/mysql-type-coercion.js +6 -0
- package/dist/esm/mysql/condition/condition-collector.js +368 -0
- package/dist/esm/mysql/condition/fulltext-condition-builder.js +55 -0
- package/dist/esm/mysql/condition/index.js +4 -0
- package/dist/esm/mysql/condition/json-condition-builder.js +136 -0
- package/dist/esm/mysql/condition/json-path-proxy.js +513 -0
- package/dist/esm/mysql/count/count-builder.js +102 -0
- package/dist/esm/mysql/count/index.js +1 -0
- package/dist/esm/mysql/delete/delete-builder.js +98 -0
- package/dist/esm/mysql/delete/index.js +1 -0
- package/dist/esm/mysql/explain/explain-builder.js +39 -0
- package/dist/esm/mysql/explain/index.js +1 -0
- package/dist/esm/mysql/helpers/MysqlConnectedAggregateBuilder.js +128 -0
- package/dist/esm/{core/helpers/ConnectedCountBuilder.js → mysql/helpers/MysqlConnectedCountBuilder.js} +15 -5
- package/dist/esm/mysql/helpers/MysqlConnectedDeleteBuilder.js +87 -0
- package/dist/esm/mysql/helpers/MysqlConnectedInsertBuilder.js +71 -0
- package/dist/esm/mysql/helpers/MysqlConnectedInsertFromSelectBuilder.js +53 -0
- package/dist/esm/mysql/helpers/MysqlConnectedQueryBuilder.js +137 -0
- package/dist/esm/mysql/helpers/MysqlConnectedRawQueryBuilder.js +56 -0
- package/dist/esm/mysql/helpers/MysqlConnectedSelectBuilder.js +391 -0
- package/dist/esm/mysql/helpers/MysqlConnectedTransactionBuilder.js +123 -0
- package/dist/esm/mysql/helpers/MysqlConnectedUpdateBuilder.js +88 -0
- package/dist/esm/mysql/helpers/MysqlPaginateBuilder.js +182 -0
- package/dist/esm/mysql/helpers/MysqlReturningExecutor.js +65 -0
- package/dist/esm/mysql/helpers/index.js +15 -0
- package/dist/esm/mysql/helpers/query-convenience.js +199 -0
- package/dist/esm/mysql/helpers/select-joins.js +455 -0
- package/dist/esm/mysql/helpers/select-pagination.js +186 -0
- package/dist/esm/mysql/index.js +47 -0
- package/dist/esm/mysql/insert/duplicate-key-builder.js +174 -0
- package/dist/esm/mysql/insert/index.js +3 -0
- package/dist/esm/mysql/insert/insert-builder.js +162 -0
- package/dist/esm/mysql/insert/insert-from-select-builder.js +67 -0
- package/dist/esm/mysql/raw/index.js +2 -0
- package/dist/esm/mysql/raw/raw-query-builder.js +20 -0
- package/dist/esm/mysql/raw/sql-template.js +58 -0
- package/dist/esm/mysql/select/aggregate-builder.js +204 -0
- package/dist/esm/mysql/select/index.js +9 -0
- package/dist/esm/mysql/select/join-builder.js +198 -0
- package/dist/esm/mysql/select/join-condition-builder.js +197 -0
- package/dist/esm/mysql/select/join-internals.js +2 -0
- package/dist/esm/mysql/select/scalar-query-builder.js +156 -0
- package/dist/esm/mysql/select/scalar-select-builder.js +70 -0
- package/dist/esm/mysql/select/select-builder.js +407 -0
- package/dist/esm/mysql/select/sql-expression.js +51 -0
- package/dist/esm/mysql/select/table-proxy.js +91 -0
- package/dist/esm/mysql/shared/mysql-table-accessor.js +19 -0
- package/dist/esm/mysql/transaction/index.js +1 -0
- package/dist/esm/mysql/transaction/transaction-builder.js +56 -0
- package/dist/esm/mysql/update/column-expression-builder.js +42 -0
- package/dist/esm/mysql/update/index.js +2 -0
- package/dist/esm/mysql/update/mysql-json-update-builder.js +193 -0
- package/dist/esm/mysql/update/update-builder.js +160 -0
- package/dist/esm/mysql/utils/addon/mysql/mysql2.js +2 -0
- package/dist/esm/mysql/utils/fk-resolver.js +179 -0
- package/dist/esm/mysql/utils/index.js +2 -0
- package/dist/esm/mysql/utils/type-coercion.js +150 -0
- package/dist/esm/mysql/window/index.js +1 -0
- package/dist/esm/mysql/window/window-builder.js +73 -0
- package/dist/esm/pg/clients/alloydb-client/capabilities.js +28 -0
- package/dist/esm/pg/clients/alloydb-client/index.js +2 -0
- package/dist/esm/{core/pg-family/pg-client/relq-postgres.js → pg/clients/alloydb-client/relq-alloydb.js} +8 -8
- package/dist/esm/pg/clients/aurora-client/capabilities.js +28 -0
- package/dist/esm/pg/clients/aurora-client/index.js +2 -0
- package/dist/esm/pg/clients/aurora-client/relq-aurora.js +39 -0
- package/dist/esm/pg/clients/citus-client/capabilities.js +28 -0
- package/dist/esm/pg/clients/citus-client/index.js +2 -0
- package/dist/esm/pg/clients/citus-client/relq-citus.js +39 -0
- package/dist/esm/pg/clients/neon-client/capabilities.js +28 -0
- package/dist/esm/pg/clients/neon-client/index.js +2 -0
- package/dist/esm/pg/clients/neon-client/relq-neon.js +39 -0
- package/dist/esm/pg/clients/pg-client/relq-postgres.js +52 -0
- package/dist/esm/{core/pg-family → pg/clients}/shared/pg-base.js +64 -7
- package/dist/esm/{core/pg-family → pg/clients}/shared/pg-type-coercion.js +1 -1
- package/dist/esm/pg/clients/supabase-client/capabilities.js +28 -0
- package/dist/esm/pg/clients/supabase-client/index.js +2 -0
- package/dist/esm/pg/clients/supabase-client/relq-supabase.js +39 -0
- package/dist/esm/pg/clients/timescale-client/capabilities.js +28 -0
- package/dist/esm/pg/clients/timescale-client/index.js +2 -0
- package/dist/esm/pg/clients/timescale-client/relq-timescale.js +39 -0
- package/dist/esm/pg/clients/yugabytedb-client/capabilities.js +28 -0
- package/dist/esm/pg/clients/yugabytedb-client/index.js +2 -0
- package/dist/esm/pg/clients/yugabytedb-client/relq-yugabytedb.js +12 -0
- package/dist/esm/{condition → pg/condition}/array-condition-builder.js +1 -1
- package/dist/esm/pg/condition/array-path-proxy.js +372 -0
- package/dist/esm/{condition → pg/condition}/condition-collector.js +20 -11
- package/dist/esm/{condition → pg/condition}/fulltext-condition-builder.js +1 -1
- package/dist/esm/{condition → pg/condition}/geometric-condition-builder.js +1 -1
- package/dist/esm/pg/condition/json-path-proxy.js +473 -0
- package/dist/esm/{condition → pg/condition}/jsonb-condition-builder.js +1 -1
- package/dist/esm/{condition → pg/condition}/network-condition-builder.js +1 -1
- package/dist/esm/{condition → pg/condition}/postgis-condition-builder.js +1 -1
- package/dist/esm/{condition → pg/condition}/range-condition-builder.js +1 -1
- package/dist/esm/{count → pg/count}/count-builder.js +10 -5
- package/dist/esm/{delete → pg/delete}/delete-builder.js +10 -5
- package/dist/esm/{core → pg}/helpers/ConnectedAggregateBuilder.js +16 -3
- package/dist/esm/pg/helpers/ConnectedCountBuilder.js +82 -0
- package/dist/esm/{core → pg}/helpers/ConnectedDeleteBuilder.js +27 -7
- package/dist/esm/{core → pg}/helpers/ConnectedInsertBuilder.js +16 -8
- package/dist/esm/{core → pg}/helpers/ConnectedInsertFromSelectBuilder.js +9 -5
- package/dist/esm/{core → pg}/helpers/ConnectedQueryBuilder.js +15 -20
- package/dist/esm/pg/helpers/ConnectedRawQueryBuilder.js +63 -0
- package/dist/esm/{core → pg}/helpers/ConnectedSelectBuilder.js +118 -25
- package/dist/esm/{core → pg}/helpers/ConnectedTransactionBuilder.js +34 -4
- package/dist/esm/{core → pg}/helpers/ConnectedUpdateBuilder.js +27 -7
- package/dist/esm/{core → pg}/helpers/PaginateBuilder.js +3 -3
- package/dist/esm/{core → pg}/helpers/ReturningExecutor.js +3 -3
- package/dist/esm/{core → pg}/helpers/query-convenience.js +11 -12
- package/dist/esm/{core → pg}/helpers/select-joins.js +18 -15
- package/dist/esm/{core → pg}/helpers/select-pagination.js +1 -1
- package/dist/esm/{insert → pg/insert}/conflict-builder.js +2 -2
- package/dist/esm/{insert → pg/insert}/insert-builder.js +8 -5
- package/dist/esm/{insert → pg/insert}/insert-from-select-builder.js +1 -1
- package/dist/esm/{pubsub → pg/pubsub}/listen-notify-builder.js +1 -1
- package/dist/esm/{pubsub → pg/pubsub}/listener-connection.js +2 -2
- package/dist/esm/{raw → pg/raw}/raw-query-builder.js +2 -2
- package/dist/esm/{raw → pg/raw}/sql-template.js +1 -6
- package/dist/esm/{select → pg/select}/aggregate-builder.js +10 -5
- package/dist/esm/{select → pg/select}/join-builder.js +2 -2
- package/dist/esm/{select → pg/select}/join-condition-builder.js +11 -1
- package/dist/esm/{select → pg/select}/join-many-condition-builder.js +3 -4
- package/dist/esm/{select → pg/select}/scalar-query-builder.js +31 -1
- package/dist/esm/{select → pg/select}/scalar-select-builder.js +1 -1
- package/dist/esm/{select → pg/select}/select-builder.js +40 -7
- package/dist/esm/pg/select/sql-expression.js +51 -0
- package/dist/esm/{transaction → pg/transaction}/transaction-builder.js +1 -1
- package/dist/esm/{update → pg/update}/array-update-builder.js +2 -5
- package/dist/esm/pg/update/column-expression-builder.js +42 -0
- package/dist/esm/{update → pg/update}/jsonb-update-builder.js +1 -1
- package/dist/esm/{update → pg/update}/update-builder.js +14 -7
- package/dist/esm/pg/utils/addon/pg/cursor.js +1 -0
- package/dist/esm/pg/utils/addon/pg/pg.js +2 -0
- package/dist/esm/{utils → pg/utils}/fk-resolver.js +47 -30
- package/dist/esm/{window → pg/window}/window-builder.js +1 -1
- package/dist/esm/shared/errors/relq-errors.js +486 -34
- package/dist/esm/shared/types/config-types.js +2 -2
- package/dist/esm/utils/env-resolver.js +74 -13
- package/dist/esm/utils/index.js +1 -1
- package/dist/index.d.ts +9629 -3974
- package/package.json +6 -3
- package/dist/cjs/core/helpers/ConnectedCTEBuilder.cjs +0 -53
- package/dist/cjs/core/helpers/ConnectedRawQueryBuilder.cjs +0 -46
- package/dist/cjs/select/sql-expression.cjs +0 -38
- package/dist/esm/core/helpers/ConnectedCTEBuilder.js +0 -49
- package/dist/esm/core/helpers/ConnectedRawQueryBuilder.js +0 -42
- package/dist/esm/select/sql-expression.js +0 -33
- package/dist/esm/utils/addon/pg/cursor.js +0 -1
- package/dist/esm/utils/addon/pg/pg.js +0 -2
- /package/dist/cjs/{core/pg-family → pg/clients}/cockroachdb-client/capabilities.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/cockroachdb-client/index.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/cockroachdb-client/relq-cockroach.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/dsql-client/capabilities.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/dsql-client/index.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/dsql-client/relq-dsql.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/index.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/nile-client/capabilities.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/nile-client/index.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/nile-client/relq-nile.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/nile-client/tenant-context.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/pg-client/capabilities.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/pg-client/index.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/shared/pg-dialect.cjs +0 -0
- /package/dist/cjs/{core/pg-family → pg/clients}/shared/pg-error-parser.cjs +0 -0
- /package/dist/cjs/{condition → pg/condition}/array-numeric-condition-builder.cjs +0 -0
- /package/dist/cjs/{condition → pg/condition}/array-specialized-condition-builder.cjs +0 -0
- /package/dist/cjs/{condition → pg/condition}/array-string-condition-builder.cjs +0 -0
- /package/dist/cjs/{condition → pg/condition}/index.cjs +0 -0
- /package/dist/cjs/{count → pg/count}/index.cjs +0 -0
- /package/dist/cjs/{delete → pg/delete}/index.cjs +0 -0
- /package/dist/cjs/{explain → pg/explain}/explain-builder.cjs +0 -0
- /package/dist/cjs/{explain → pg/explain}/index.cjs +0 -0
- /package/dist/cjs/{insert → pg/insert}/index.cjs +0 -0
- /package/dist/cjs/{pubsub → pg/pubsub}/index.cjs +0 -0
- /package/dist/cjs/{raw → pg/raw}/index.cjs +0 -0
- /package/dist/cjs/{select → pg/select}/index.cjs +0 -0
- /package/dist/cjs/{select → pg/select}/join-internals.cjs +0 -0
- /package/dist/cjs/{select → pg/select}/table-proxy.cjs +0 -0
- /package/dist/cjs/{transaction → pg/transaction}/index.cjs +0 -0
- /package/dist/cjs/{update → pg/update}/index.cjs +0 -0
- /package/dist/cjs/{utils → pg/utils}/type-coercion.cjs +0 -0
- /package/dist/cjs/{window → pg/window}/index.cjs +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/cockroachdb-client/capabilities.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/cockroachdb-client/index.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/cockroachdb-client/relq-cockroach.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/dsql-client/capabilities.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/dsql-client/index.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/dsql-client/relq-dsql.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/index.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/nile-client/capabilities.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/nile-client/index.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/nile-client/relq-nile.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/nile-client/tenant-context.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/pg-client/capabilities.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/pg-client/index.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/shared/pg-dialect.js +0 -0
- /package/dist/esm/{core/pg-family → pg/clients}/shared/pg-error-parser.js +0 -0
- /package/dist/esm/{condition → pg/condition}/array-numeric-condition-builder.js +0 -0
- /package/dist/esm/{condition → pg/condition}/array-specialized-condition-builder.js +0 -0
- /package/dist/esm/{condition → pg/condition}/array-string-condition-builder.js +0 -0
- /package/dist/esm/{condition → pg/condition}/index.js +0 -0
- /package/dist/esm/{count → pg/count}/index.js +0 -0
- /package/dist/esm/{delete → pg/delete}/index.js +0 -0
- /package/dist/esm/{explain → pg/explain}/explain-builder.js +0 -0
- /package/dist/esm/{explain → pg/explain}/index.js +0 -0
- /package/dist/esm/{insert → pg/insert}/index.js +0 -0
- /package/dist/esm/{pubsub → pg/pubsub}/index.js +0 -0
- /package/dist/esm/{raw → pg/raw}/index.js +0 -0
- /package/dist/esm/{select → pg/select}/index.js +0 -0
- /package/dist/esm/{select → pg/select}/join-internals.js +0 -0
- /package/dist/esm/{select → pg/select}/table-proxy.js +0 -0
- /package/dist/esm/{transaction → pg/transaction}/index.js +0 -0
- /package/dist/esm/{update → pg/update}/index.js +0 -0
- /package/dist/esm/{utils → pg/utils}/type-coercion.js +0 -0
- /package/dist/esm/{window → pg/window}/index.js +0 -0
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ConditionCollector } from "../condition/condition-collector.js";
|
|
2
|
+
import { INTERNAL } from "../../core/helpers/methods.js";
|
|
2
3
|
import { ReturningExecutor } from "./ReturningExecutor.js";
|
|
3
|
-
import { requireCapability } from "
|
|
4
|
-
import { createTableAccessor } from "
|
|
4
|
+
import { requireCapability } from "../../core/helpers/capability-guard.js";
|
|
5
|
+
import { createTableAccessor } from "../../core/shared/table-accessor.js";
|
|
6
|
+
import { RelqBuilderError } from "../../shared/errors/relq-errors.js";
|
|
5
7
|
export class ConnectedDeleteBuilder {
|
|
6
8
|
builder;
|
|
7
9
|
relq;
|
|
@@ -32,7 +34,21 @@ export class ConnectedDeleteBuilder {
|
|
|
32
34
|
return column;
|
|
33
35
|
});
|
|
34
36
|
}
|
|
35
|
-
where(
|
|
37
|
+
where(callbackOrCondition) {
|
|
38
|
+
if (callbackOrCondition instanceof ConditionCollector) {
|
|
39
|
+
const conditionTable = callbackOrCondition._tableName;
|
|
40
|
+
if (conditionTable) {
|
|
41
|
+
const matches = conditionTable === this.schemaKey || conditionTable === this.tableName;
|
|
42
|
+
if (!matches) {
|
|
43
|
+
const queryTable = this.schemaKey || this.tableName;
|
|
44
|
+
throw new RelqBuilderError(`Condition was created for table '${conditionTable}' but is being used on '${queryTable}'. ` +
|
|
45
|
+
`Create the condition with db.where('${queryTable}') instead.`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
this.builder.where(callbackOrCondition);
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
const callback = callbackOrCondition;
|
|
36
52
|
this.builder.where((q) => {
|
|
37
53
|
q._tables = createTableAccessor(this.relq, this.relq.schema);
|
|
38
54
|
return callback(q);
|
|
@@ -50,9 +66,13 @@ export class ConnectedDeleteBuilder {
|
|
|
50
66
|
}
|
|
51
67
|
return result.metadata.rowCount ?? 0;
|
|
52
68
|
}
|
|
53
|
-
returning(
|
|
54
|
-
|
|
55
|
-
|
|
69
|
+
returning(...args) {
|
|
70
|
+
let columns;
|
|
71
|
+
if (args.length === 1) {
|
|
72
|
+
columns = args[0];
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
columns = args;
|
|
56
76
|
}
|
|
57
77
|
requireCapability(this.relq, 'returning', 'RETURNING clause', 'Use a SELECT query after the DELETE to retrieve deleted data');
|
|
58
78
|
this.builder.returning(columns);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ConditionCollector, buildConditionsSQL } from "
|
|
2
|
-
import { debugLog, INTERNAL } from "
|
|
1
|
+
import { ConditionCollector, buildConditionsSQL } from "../condition/condition-collector.js";
|
|
2
|
+
import { debugLog, INTERNAL } from "../../core/helpers/methods.js";
|
|
3
3
|
import { ReturningExecutor } from "./ReturningExecutor.js";
|
|
4
|
-
import { requireCapability } from "
|
|
4
|
+
import { requireCapability } from "../../core/helpers/capability-guard.js";
|
|
5
5
|
export class ConnectedInsertBuilder {
|
|
6
6
|
builder;
|
|
7
7
|
relq;
|
|
@@ -87,8 +87,12 @@ export class ConnectedInsertBuilder {
|
|
|
87
87
|
async run(withMetadata) {
|
|
88
88
|
debugLog(this.relq[INTERNAL]?.config, `ConnectedInsertBuilder.run called for table: ${this.builder.tableName}`);
|
|
89
89
|
const internalRelq = this.relq[INTERNAL];
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
const rows = this.builder.insertData;
|
|
91
|
+
if (rows.length > 0) {
|
|
92
|
+
internalRelq.validateData(this.builder.tableName, rows[0], 'insert');
|
|
93
|
+
if (rows.length > 1) {
|
|
94
|
+
internalRelq.validateData(this.builder.tableName, rows[rows.length - 1], 'insert');
|
|
95
|
+
}
|
|
92
96
|
}
|
|
93
97
|
const sql = this.builder.toString();
|
|
94
98
|
const result = await internalRelq.executeRun(sql);
|
|
@@ -97,9 +101,13 @@ export class ConnectedInsertBuilder {
|
|
|
97
101
|
}
|
|
98
102
|
return result.metadata.rowCount ?? 0;
|
|
99
103
|
}
|
|
100
|
-
returning(
|
|
101
|
-
|
|
102
|
-
|
|
104
|
+
returning(...args) {
|
|
105
|
+
let columns;
|
|
106
|
+
if (args.length === 1) {
|
|
107
|
+
columns = args[0];
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
columns = args;
|
|
103
111
|
}
|
|
104
112
|
requireCapability(this.relq, 'returning', 'RETURNING clause', 'Use a SELECT query after the INSERT to retrieve inserted data');
|
|
105
113
|
this.builder.returning(columns);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { debugLog, INTERNAL } from "
|
|
1
|
+
import { debugLog, INTERNAL } from "../../core/helpers/methods.js";
|
|
2
2
|
import { ReturningExecutor } from "./ReturningExecutor.js";
|
|
3
|
-
import { requireCapability } from "
|
|
3
|
+
import { requireCapability } from "../../core/helpers/capability-guard.js";
|
|
4
4
|
export class ConnectedInsertFromSelectBuilder {
|
|
5
5
|
builder;
|
|
6
6
|
relq;
|
|
@@ -51,9 +51,13 @@ export class ConnectedInsertFromSelectBuilder {
|
|
|
51
51
|
}
|
|
52
52
|
return result.metadata.rowCount ?? 0;
|
|
53
53
|
}
|
|
54
|
-
returning(
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
returning(...args) {
|
|
55
|
+
let columns;
|
|
56
|
+
if (args.length === 1) {
|
|
57
|
+
columns = args[0];
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
columns = args;
|
|
57
61
|
}
|
|
58
62
|
requireCapability(this.relq, 'returning', 'RETURNING clause', 'Use a SELECT query after the INSERT to retrieve inserted data');
|
|
59
63
|
this.builder.returning(columns);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { CountBuilder } from "
|
|
2
|
-
import { DeleteBuilder } from "
|
|
3
|
-
import { InsertBuilder } from "
|
|
4
|
-
import { InsertFromSelectBuilder } from "
|
|
5
|
-
import { AggregateQueryBuilder } from "
|
|
6
|
-
import { SelectBuilder } from "
|
|
7
|
-
import { UpdateBuilder } from "
|
|
1
|
+
import { CountBuilder } from "../count/count-builder.js";
|
|
2
|
+
import { DeleteBuilder } from "../delete/delete-builder.js";
|
|
3
|
+
import { InsertBuilder } from "../insert/insert-builder.js";
|
|
4
|
+
import { InsertFromSelectBuilder } from "../insert/insert-from-select-builder.js";
|
|
5
|
+
import { AggregateQueryBuilder } from "../select/aggregate-builder.js";
|
|
6
|
+
import { SelectBuilder } from "../select/select-builder.js";
|
|
7
|
+
import { UpdateBuilder } from "../update/update-builder.js";
|
|
8
8
|
import { ConnectedAggregateBuilder } from "./ConnectedAggregateBuilder.js";
|
|
9
9
|
import { ConnectedCountBuilder } from "./ConnectedCountBuilder.js";
|
|
10
10
|
import { ConnectedDeleteBuilder } from "./ConnectedDeleteBuilder.js";
|
|
@@ -12,10 +12,11 @@ import { ConnectedInsertBuilder } from "./ConnectedInsertBuilder.js";
|
|
|
12
12
|
import { ConnectedInsertFromSelectBuilder } from "./ConnectedInsertFromSelectBuilder.js";
|
|
13
13
|
import { ConnectedSelectBuilder } from "./ConnectedSelectBuilder.js";
|
|
14
14
|
import { ConnectedUpdateBuilder } from "./ConnectedUpdateBuilder.js";
|
|
15
|
-
import { INTERNAL } from "
|
|
15
|
+
import { INTERNAL } from "../../core/helpers/methods.js";
|
|
16
16
|
import { PaginateBuilder } from "./PaginateBuilder.js";
|
|
17
|
-
import { createTableAccessor } from "
|
|
18
|
-
import {
|
|
17
|
+
import { createTableAccessor } from "../../core/shared/table-accessor.js";
|
|
18
|
+
import { RelqBuilderError } from "../../shared/errors/relq-errors.js";
|
|
19
|
+
import { executeFindById, executeFindOne, executeFindMany, executeExists, executeUpsert, executeCreateWith, getPrimaryKeyColumn } from "./query-convenience.js";
|
|
19
20
|
export class ConnectedQueryBuilder {
|
|
20
21
|
tableName;
|
|
21
22
|
relq;
|
|
@@ -42,12 +43,12 @@ export class ConnectedQueryBuilder {
|
|
|
42
43
|
if (columns !== undefined) {
|
|
43
44
|
if (Array.isArray(columns)) {
|
|
44
45
|
if (columns.length === 0) {
|
|
45
|
-
throw new
|
|
46
|
+
throw new RelqBuilderError('select() requires at least one column', { builder: 'select', hint: 'Use .select() without arguments for SELECT *' });
|
|
46
47
|
}
|
|
47
48
|
}
|
|
48
49
|
else if (typeof columns === 'string') {
|
|
49
50
|
if (columns === '' || columns === '*') {
|
|
50
|
-
throw new
|
|
51
|
+
throw new RelqBuilderError(`Invalid column name: "${columns}"`, { builder: 'select', hint: 'Use .select() without arguments for SELECT *, or pass valid column names' });
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
54
|
}
|
|
@@ -81,8 +82,8 @@ export class ConnectedQueryBuilder {
|
|
|
81
82
|
return new ConnectedInsertBuilder(builder, this.relq, this.tableName, this.schemaKey);
|
|
82
83
|
}
|
|
83
84
|
const builder = new InsertBuilder(this.tableName, rows[0]);
|
|
84
|
-
|
|
85
|
-
builder.
|
|
85
|
+
if (rows.length > 1) {
|
|
86
|
+
builder.addRows(rows.slice(1));
|
|
86
87
|
}
|
|
87
88
|
return new ConnectedInsertBuilder(builder, this.relq, this.tableName, this.schemaKey);
|
|
88
89
|
}
|
|
@@ -133,10 +134,4 @@ export class ConnectedQueryBuilder {
|
|
|
133
134
|
async createWith(options) {
|
|
134
135
|
return executeCreateWith(this.ctx, options.data, options.with);
|
|
135
136
|
}
|
|
136
|
-
async softDelete(filter) {
|
|
137
|
-
return executeSoftDelete(this.ctx, filter);
|
|
138
|
-
}
|
|
139
|
-
async restore(filter) {
|
|
140
|
-
return executeRestore(this.ctx, filter);
|
|
141
|
-
}
|
|
142
137
|
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { RawQueryBuilder } from "../raw/index.js";
|
|
2
|
+
import { INTERNAL } from "../../core/helpers/methods.js";
|
|
3
|
+
export class ConnectedRawQueryBuilder {
|
|
4
|
+
params;
|
|
5
|
+
relq;
|
|
6
|
+
builder;
|
|
7
|
+
constructor(query, params, relq) {
|
|
8
|
+
this.params = params;
|
|
9
|
+
this.relq = relq;
|
|
10
|
+
const convertedQuery = this.convertPlaceholders(query);
|
|
11
|
+
this.builder = new RawQueryBuilder(convertedQuery, this.params);
|
|
12
|
+
}
|
|
13
|
+
convertPlaceholders(query) {
|
|
14
|
+
let index = 0;
|
|
15
|
+
return query.replace(/\?/g, () => `$${++index}`);
|
|
16
|
+
}
|
|
17
|
+
async all() {
|
|
18
|
+
const sql = this.builder.toString();
|
|
19
|
+
const { result, duration } = await this.relq[INTERNAL].executeRawQuery(sql);
|
|
20
|
+
return {
|
|
21
|
+
data: result.rows,
|
|
22
|
+
metadata: { rowCount: result.rowCount, command: result.command, duration, fields: result.fields },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async get() {
|
|
26
|
+
const sql = this.builder.toString();
|
|
27
|
+
const { result, duration } = await this.relq[INTERNAL].executeRawQuery(sql);
|
|
28
|
+
const row = result.rows[0] || null;
|
|
29
|
+
return {
|
|
30
|
+
data: row,
|
|
31
|
+
metadata: { rowCount: result.rowCount, command: result.command, duration, fields: result.fields },
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async getMany(count) {
|
|
35
|
+
const sql = this.builder.toString();
|
|
36
|
+
const limitedSql = sql.toUpperCase().includes('LIMIT')
|
|
37
|
+
? sql
|
|
38
|
+
: `${sql} LIMIT ${count}`;
|
|
39
|
+
const { result, duration } = await this.relq[INTERNAL].executeRawQuery(limitedSql);
|
|
40
|
+
return {
|
|
41
|
+
data: result.rows,
|
|
42
|
+
metadata: { rowCount: result.rowCount, command: result.command, duration, fields: result.fields },
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async run() {
|
|
46
|
+
const sql = this.builder.toString();
|
|
47
|
+
const { result, duration } = await this.relq[INTERNAL].executeRawQuery(sql);
|
|
48
|
+
return {
|
|
49
|
+
success: true,
|
|
50
|
+
metadata: { rowCount: result.rowCount, command: result.command, duration, fields: result.fields },
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async count() {
|
|
54
|
+
const sql = this.builder.toString();
|
|
55
|
+
const { result, duration } = await this.relq[INTERNAL].executeRawQuery(sql);
|
|
56
|
+
const row = result.rows[0];
|
|
57
|
+
const count = row ? Number(Object.values(row)[0]) || 0 : 0;
|
|
58
|
+
return {
|
|
59
|
+
count,
|
|
60
|
+
metadata: { rowCount: result.rowCount, command: result.command, duration, fields: result.fields },
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ConditionCollector } from "../condition/condition-collector.js";
|
|
2
|
+
import { INTERNAL } from "../../core/helpers/methods.js";
|
|
2
3
|
import { executeTypeSafeJoin, executeTypeSafeJoinMany, executeTypeSafeJoinManyThrough } from "./select-joins.js";
|
|
3
4
|
import { executeCursorEach, executePagination } from "./select-pagination.js";
|
|
4
|
-
import { requireCapability } from "
|
|
5
|
-
import { createTableAccessor } from "
|
|
6
|
-
import { AggregateFunctions } from "
|
|
7
|
-
import { createTableProxy } from "
|
|
8
|
-
import { resolveForeignKey } from "
|
|
5
|
+
import { requireCapability } from "../../core/helpers/capability-guard.js";
|
|
6
|
+
import { createTableAccessor } from "../../core/shared/table-accessor.js";
|
|
7
|
+
import { AggregateFunctions } from "../select/sql-expression.js";
|
|
8
|
+
import { createTableProxy } from "../select/table-proxy.js";
|
|
9
|
+
import { resolveForeignKey } from "../utils/fk-resolver.js";
|
|
10
|
+
import { RelqBuilderError } from "../../shared/errors/relq-errors.js";
|
|
11
|
+
import format from "../../shared/pg-format.js";
|
|
9
12
|
export class ConnectedSelectBuilder {
|
|
10
13
|
builder;
|
|
11
14
|
relq;
|
|
12
15
|
tableName;
|
|
13
|
-
columns;
|
|
14
16
|
schemaKey;
|
|
15
|
-
constructor(builder, relq, tableName,
|
|
17
|
+
constructor(builder, relq, tableName, _columns, schemaKey) {
|
|
16
18
|
this.builder = builder;
|
|
17
19
|
this.relq = relq;
|
|
18
20
|
this.tableName = tableName;
|
|
19
|
-
this.columns = columns;
|
|
20
21
|
this.schemaKey = schemaKey;
|
|
21
22
|
this.setupColumnResolver();
|
|
22
23
|
}
|
|
24
|
+
get _sourceTableKey() {
|
|
25
|
+
return this.schemaKey || this.tableName;
|
|
26
|
+
}
|
|
23
27
|
get joinCtx() {
|
|
24
28
|
return { relq: this.relq, builder: this.builder, tableName: this.tableName, schemaKey: this.schemaKey };
|
|
25
29
|
}
|
|
@@ -54,6 +58,24 @@ export class ConnectedSelectBuilder {
|
|
|
54
58
|
const transformed = { ...row };
|
|
55
59
|
for (const join of joins) {
|
|
56
60
|
const alias = join.alias;
|
|
61
|
+
if (join.flat && join.selectColumns) {
|
|
62
|
+
const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
63
|
+
const prefix = join.flat.prefix || alias;
|
|
64
|
+
const joinedTableDef = internal.getTableDef(join.schemaKey || alias) || internal.getTableDef(join.table);
|
|
65
|
+
const tableColumns = joinedTableDef ? (joinedTableDef.$columns || joinedTableDef) : null;
|
|
66
|
+
for (const col of join.selectColumns) {
|
|
67
|
+
const flatKey = `${prefix}${capitalize(col.property)}`;
|
|
68
|
+
if (transformed[flatKey] != null && tableColumns) {
|
|
69
|
+
const colDef = tableColumns[col.property];
|
|
70
|
+
const sqlType = colDef?.$sqlType || (typeof colDef?.$type === 'string' ? colDef.$type : undefined);
|
|
71
|
+
if (sqlType) {
|
|
72
|
+
transformed[flatKey] = this.coerceValue(transformed[flatKey], sqlType.toLowerCase());
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
delete transformed[alias];
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
57
79
|
const nestedData = transformed[alias];
|
|
58
80
|
if (nestedData === null || nestedData === undefined) {
|
|
59
81
|
continue;
|
|
@@ -113,7 +135,21 @@ export class ConnectedSelectBuilder {
|
|
|
113
135
|
return value;
|
|
114
136
|
}
|
|
115
137
|
}
|
|
116
|
-
where(
|
|
138
|
+
where(callbackOrCondition) {
|
|
139
|
+
if (callbackOrCondition instanceof ConditionCollector) {
|
|
140
|
+
const conditionTable = callbackOrCondition._tableName;
|
|
141
|
+
if (conditionTable) {
|
|
142
|
+
const matches = conditionTable === this.schemaKey || conditionTable === this.tableName;
|
|
143
|
+
if (!matches) {
|
|
144
|
+
const queryTable = this.schemaKey || this.tableName;
|
|
145
|
+
throw new RelqBuilderError(`Condition was created for table '${conditionTable}' but is being used on '${queryTable}'. ` +
|
|
146
|
+
`Create the condition with db.where('${queryTable}') instead.`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
this.builder.where(callbackOrCondition);
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
const callback = callbackOrCondition;
|
|
117
153
|
this.builder.where((q) => {
|
|
118
154
|
q._tables = createTableAccessor(this.relq, this.relq.schema);
|
|
119
155
|
return callback(q);
|
|
@@ -157,21 +193,73 @@ export class ConnectedSelectBuilder {
|
|
|
157
193
|
const agg = new AggregateFunctions();
|
|
158
194
|
const internal = this.relq[INTERNAL];
|
|
159
195
|
const schema = internal.getSchema() || {};
|
|
196
|
+
const relations = internal.getRelations();
|
|
160
197
|
const sourceSchemaKey = this.schemaKey || this.tableName;
|
|
161
198
|
const sourceAlias = this.builder.getTableIdentifier();
|
|
199
|
+
const accessedTables = new Set();
|
|
162
200
|
const tableProxies = new Proxy({}, {
|
|
163
201
|
get(_, tableKey) {
|
|
164
202
|
if (typeof tableKey === 'symbol')
|
|
165
203
|
return undefined;
|
|
166
|
-
const
|
|
167
|
-
const
|
|
168
|
-
const
|
|
169
|
-
|
|
204
|
+
const key = tableKey;
|
|
205
|
+
const tableDef = schema[key];
|
|
206
|
+
const tableName = tableDef?.$name || key;
|
|
207
|
+
if (key === sourceSchemaKey) {
|
|
208
|
+
return createTableProxy(tableName, sourceAlias, tableDef);
|
|
209
|
+
}
|
|
210
|
+
accessedTables.add(key);
|
|
211
|
+
return createTableProxy(tableName, key, tableDef);
|
|
170
212
|
}
|
|
171
213
|
});
|
|
172
214
|
const expressions = callback(agg, tableProxies);
|
|
215
|
+
const sourceExprs = [];
|
|
216
|
+
const externalExprs = new Map();
|
|
173
217
|
for (const [alias, expr] of Object.entries(expressions)) {
|
|
174
|
-
|
|
218
|
+
let targetTable = null;
|
|
219
|
+
for (const tableKey of accessedTables) {
|
|
220
|
+
if (expr.sql.includes(`"${tableKey}".`)) {
|
|
221
|
+
targetTable = tableKey;
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (targetTable) {
|
|
226
|
+
if (!externalExprs.has(targetTable)) {
|
|
227
|
+
externalExprs.set(targetTable, []);
|
|
228
|
+
}
|
|
229
|
+
externalExprs.get(targetTable).push({ alias, sql: expr.sql });
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
sourceExprs.push({ alias, sql: expr.sql });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
for (const e of sourceExprs) {
|
|
236
|
+
this.builder.addIncludeExpression(e.alias, e.sql);
|
|
237
|
+
}
|
|
238
|
+
for (const [tableKey, exprs] of externalExprs) {
|
|
239
|
+
const tableDef = schema[tableKey];
|
|
240
|
+
const sqlTableName = tableDef?.$name || tableKey;
|
|
241
|
+
const existingJoins = this.builder.getStructuredJoins();
|
|
242
|
+
const alreadyJoined = existingJoins.some(j => j.table === sqlTableName || j.schemaKey === tableKey || j.alias === tableKey);
|
|
243
|
+
if (alreadyJoined) {
|
|
244
|
+
for (const e of exprs) {
|
|
245
|
+
this.builder.addIncludeExpression(e.alias, e.sql);
|
|
246
|
+
}
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
const fk = resolveForeignKey(relations, schema, sourceSchemaKey, tableKey);
|
|
250
|
+
if (!fk) {
|
|
251
|
+
throw new RelqBuilderError(`include() references table "${tableKey}" but no foreign key relationship exists between "${sourceSchemaKey}" and "${tableKey}". Define the relationship in your relations config.`, { builder: 'include', hint: `Add a relation from "${sourceSchemaKey}" to "${tableKey}" in pgRelations().` });
|
|
252
|
+
}
|
|
253
|
+
const lateralAlias = `${tableKey}_agg`;
|
|
254
|
+
const innerSelects = exprs.map(e => {
|
|
255
|
+
const unqualifiedSql = e.sql.replace(new RegExp(`"${tableKey}"\\.`, 'g'), '');
|
|
256
|
+
return `${unqualifiedSql} AS ${format.ident(e.alias)}`;
|
|
257
|
+
}).join(', ');
|
|
258
|
+
const lateralSql = `LEFT JOIN LATERAL (SELECT ${innerSelects} FROM ${format.ident(sqlTableName)} WHERE ${format.ident(fk.toColumn)} = ${format.ident(sourceAlias)}.${format.ident(fk.fromColumn)}) AS ${format.ident(lateralAlias)} ON true`;
|
|
259
|
+
this.builder.addRawJoin(lateralSql);
|
|
260
|
+
for (const e of exprs) {
|
|
261
|
+
this.builder.addIncludeExpression(e.alias, `(ARRAY_AGG(${format.ident(lateralAlias)}.${format.ident(e.alias)}))[1]`);
|
|
262
|
+
}
|
|
175
263
|
}
|
|
176
264
|
return this;
|
|
177
265
|
}
|
|
@@ -191,6 +279,15 @@ export class ConnectedSelectBuilder {
|
|
|
191
279
|
executeTypeSafeJoin(this.joinCtx, 'INNER JOIN', tableOrAlias, callback);
|
|
192
280
|
return this;
|
|
193
281
|
}
|
|
282
|
+
crossJoin(tableOrAlias) {
|
|
283
|
+
const [tableKey, alias] = Array.isArray(tableOrAlias) ? tableOrAlias : [tableOrAlias, tableOrAlias];
|
|
284
|
+
const internal = this.relq[INTERNAL];
|
|
285
|
+
const tableDef = internal.getTableDef(tableKey);
|
|
286
|
+
const tableSqlName = tableDef?.$name || tableKey;
|
|
287
|
+
this.builder.crossJoin(tableSqlName);
|
|
288
|
+
this.builder.addStructuredJoin({ table: tableSqlName, alias, type: 'CROSS JOIN', schemaKey: tableKey });
|
|
289
|
+
return this;
|
|
290
|
+
}
|
|
194
291
|
joinSubquery(alias, subquery, onClause) {
|
|
195
292
|
const subquerySQL = typeof subquery === 'string' ? subquery : subquery.toString();
|
|
196
293
|
this.builder.addRawJoin(`JOIN (${subquerySQL}) AS "${alias}" ON ${onClause}`);
|
|
@@ -235,14 +332,12 @@ export class ConnectedSelectBuilder {
|
|
|
235
332
|
const schema = internal.getSchema();
|
|
236
333
|
const relations = internal.getRelations();
|
|
237
334
|
if (!schema || !relations) {
|
|
238
|
-
throw new
|
|
239
|
-
`Use .leftJoinMany() with an explicit callback instead.`);
|
|
335
|
+
throw new RelqBuilderError(`Cannot use .withMany('${table}') without schema and relations config. Pass relations when creating Relq: new Relq(schema, dialect, { relations }).`, { builder: 'withMany', hint: `Use .leftJoinMany() with an explicit callback instead.` });
|
|
240
336
|
}
|
|
241
337
|
const sourceKey = this.schemaKey || this.tableName;
|
|
242
338
|
const fk = resolveForeignKey(relations, schema, sourceKey, table);
|
|
243
339
|
if (!fk) {
|
|
244
|
-
throw new
|
|
245
|
-
`Use .leftJoinMany() with explicit join conditions instead.`);
|
|
340
|
+
throw new RelqBuilderError(`No foreign key relationship found between "${sourceKey}" and "${table}". Define the relationship in your relations config.`, { builder: 'withMany', hint: `Use .leftJoinMany() with explicit join conditions instead.` });
|
|
246
341
|
}
|
|
247
342
|
executeTypeSafeJoinMany(this.joinCtx, 'LEFT JOIN', table, (on, right, left) => {
|
|
248
343
|
const rightCol = right[fk.toColumn];
|
|
@@ -285,6 +380,10 @@ export class ConnectedSelectBuilder {
|
|
|
285
380
|
this.builder.forUpdateSkipLocked();
|
|
286
381
|
return this;
|
|
287
382
|
}
|
|
383
|
+
forUpdateNoWait() {
|
|
384
|
+
this.builder.forUpdateNoWait();
|
|
385
|
+
return this;
|
|
386
|
+
}
|
|
288
387
|
forShare() {
|
|
289
388
|
this.builder.forShare();
|
|
290
389
|
return this;
|
|
@@ -311,12 +410,6 @@ export class ConnectedSelectBuilder {
|
|
|
311
410
|
}
|
|
312
411
|
return transformedData;
|
|
313
412
|
}
|
|
314
|
-
async value(column) {
|
|
315
|
-
this.builder.limit(1);
|
|
316
|
-
const sql = this.builder.toString();
|
|
317
|
-
const result = await this.relq[INTERNAL].executeSelectOne(sql, this.tableName);
|
|
318
|
-
return result.data?.[column] ?? null;
|
|
319
|
-
}
|
|
320
413
|
async each(callback, options = {}) {
|
|
321
414
|
requireCapability(this.relq, 'cursors', 'Cursor-based iteration (each)', 'Use pagination() instead of each() for row-by-row processing');
|
|
322
415
|
return executeCursorEach(this.paginationCtx, callback, options);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ConnectedRawQueryBuilder } from "./ConnectedRawQueryBuilder.js";
|
|
2
|
-
import { createTableAccessor } from "
|
|
3
|
-
import { INTERNAL } from "
|
|
2
|
+
import { createTableAccessor } from "../../core/shared/table-accessor.js";
|
|
3
|
+
import { INTERNAL } from "../../core/helpers/methods.js";
|
|
4
4
|
export class TransactionClient {
|
|
5
5
|
client;
|
|
6
6
|
relq;
|
|
@@ -19,6 +19,15 @@ export class TransactionClient {
|
|
|
19
19
|
raw(query, ...params) {
|
|
20
20
|
return new ConnectedRawQueryBuilder(query, params, this);
|
|
21
21
|
}
|
|
22
|
+
async savepoint(name) {
|
|
23
|
+
await this.client.query(`SAVEPOINT "${name}"`);
|
|
24
|
+
}
|
|
25
|
+
async rollbackTo(name) {
|
|
26
|
+
await this.client.query(`ROLLBACK TO SAVEPOINT "${name}"`);
|
|
27
|
+
}
|
|
28
|
+
async releaseSavepoint(name) {
|
|
29
|
+
await this.client.query(`RELEASE SAVEPOINT "${name}"`);
|
|
30
|
+
}
|
|
22
31
|
get [INTERNAL]() {
|
|
23
32
|
const parentInternal = this.relq[INTERNAL];
|
|
24
33
|
const queryViaClient = async (sql) => {
|
|
@@ -66,6 +75,7 @@ export class TransactionClient {
|
|
|
66
75
|
return { success: true, metadata: buildMetadata(result, duration) };
|
|
67
76
|
},
|
|
68
77
|
transformToDbColumns: parentInternal.transformToDbColumns,
|
|
78
|
+
executeRawQuery: queryViaClient,
|
|
69
79
|
transformFromDbColumns: parentInternal.transformFromDbColumns,
|
|
70
80
|
transformResultsFromDb: parentInternal.transformResultsFromDb,
|
|
71
81
|
hasColumnMapping: parentInternal.hasColumnMapping,
|
|
@@ -77,11 +87,31 @@ export class TransactionClient {
|
|
|
77
87
|
};
|
|
78
88
|
}
|
|
79
89
|
}
|
|
80
|
-
export async function executeTransaction(relq, callback) {
|
|
90
|
+
export async function executeTransaction(relq, callback, options) {
|
|
81
91
|
await relq.ensureInitialized();
|
|
82
92
|
const { client, release } = await relq[INTERNAL].getClientForCursor();
|
|
83
93
|
try {
|
|
84
|
-
|
|
94
|
+
let beginSql = 'BEGIN';
|
|
95
|
+
const parts = [];
|
|
96
|
+
if (options?.isolation) {
|
|
97
|
+
parts.push(`ISOLATION LEVEL ${options.isolation}`);
|
|
98
|
+
}
|
|
99
|
+
if (options?.readOnly === true) {
|
|
100
|
+
parts.push('READ ONLY');
|
|
101
|
+
}
|
|
102
|
+
else if (options?.readOnly === false) {
|
|
103
|
+
parts.push('READ WRITE');
|
|
104
|
+
}
|
|
105
|
+
if (options?.deferrable === true) {
|
|
106
|
+
parts.push('DEFERRABLE');
|
|
107
|
+
}
|
|
108
|
+
else if (options?.deferrable === false) {
|
|
109
|
+
parts.push('NOT DEFERRABLE');
|
|
110
|
+
}
|
|
111
|
+
if (parts.length > 0) {
|
|
112
|
+
beginSql += ' ' + parts.join(' ');
|
|
113
|
+
}
|
|
114
|
+
await client.query(beginSql);
|
|
85
115
|
const tx = new TransactionClient(client, relq);
|
|
86
116
|
const result = await callback(tx);
|
|
87
117
|
await client.query('COMMIT');
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ConditionCollector } from "../condition/condition-collector.js";
|
|
2
|
+
import { INTERNAL } from "../../core/helpers/methods.js";
|
|
2
3
|
import { ReturningExecutor } from "./ReturningExecutor.js";
|
|
3
|
-
import { requireCapability } from "
|
|
4
|
-
import { createTableAccessor } from "
|
|
4
|
+
import { requireCapability } from "../../core/helpers/capability-guard.js";
|
|
5
|
+
import { createTableAccessor } from "../../core/shared/table-accessor.js";
|
|
6
|
+
import { RelqBuilderError } from "../../shared/errors/relq-errors.js";
|
|
5
7
|
export class ConnectedUpdateBuilder {
|
|
6
8
|
builder;
|
|
7
9
|
relq;
|
|
@@ -45,7 +47,21 @@ export class ConnectedUpdateBuilder {
|
|
|
45
47
|
return { type: baseType, isArray };
|
|
46
48
|
});
|
|
47
49
|
}
|
|
48
|
-
where(
|
|
50
|
+
where(callbackOrCondition) {
|
|
51
|
+
if (callbackOrCondition instanceof ConditionCollector) {
|
|
52
|
+
const conditionTable = callbackOrCondition._tableName;
|
|
53
|
+
if (conditionTable) {
|
|
54
|
+
const matches = conditionTable === this.schemaKey || conditionTable === this.tableName;
|
|
55
|
+
if (!matches) {
|
|
56
|
+
const queryTable = this.schemaKey || this.tableName;
|
|
57
|
+
throw new RelqBuilderError(`Condition was created for table '${conditionTable}' but is being used on '${queryTable}'. ` +
|
|
58
|
+
`Create the condition with db.where('${queryTable}') instead.`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
this.builder.where(callbackOrCondition);
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
const callback = callbackOrCondition;
|
|
49
65
|
this.builder.where((q) => {
|
|
50
66
|
q._tables = createTableAccessor(this.relq, this.relq.schema);
|
|
51
67
|
return callback(q);
|
|
@@ -64,9 +80,13 @@ export class ConnectedUpdateBuilder {
|
|
|
64
80
|
}
|
|
65
81
|
return result.metadata.rowCount ?? 0;
|
|
66
82
|
}
|
|
67
|
-
returning(
|
|
68
|
-
|
|
69
|
-
|
|
83
|
+
returning(...args) {
|
|
84
|
+
let columns;
|
|
85
|
+
if (args.length === 1) {
|
|
86
|
+
columns = args[0];
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
columns = args;
|
|
70
90
|
}
|
|
71
91
|
requireCapability(this.relq, 'returning', 'RETURNING clause', 'Use a SELECT query after the UPDATE to retrieve modified data');
|
|
72
92
|
this.builder.returning(columns);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { CountBuilder } from "
|
|
1
|
+
import { CountBuilder } from "../count/count-builder.js";
|
|
2
2
|
import { RelqQueryError } from "../../shared/errors/relq-errors.js";
|
|
3
|
-
import { SelectBuilder } from "
|
|
4
|
-
import { INTERNAL } from "
|
|
3
|
+
import { SelectBuilder } from "../select/select-builder.js";
|
|
4
|
+
import { INTERNAL } from "../../core/helpers/methods.js";
|
|
5
5
|
export class PaginateBuilder {
|
|
6
6
|
relq;
|
|
7
7
|
tableName;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { InsertBuilder } from "
|
|
2
|
-
import { UpdateBuilder } from "
|
|
3
|
-
import { INTERNAL } from "
|
|
1
|
+
import { InsertBuilder } from "../insert/insert-builder.js";
|
|
2
|
+
import { UpdateBuilder } from "../update/update-builder.js";
|
|
3
|
+
import { INTERNAL } from "../../core/helpers/methods.js";
|
|
4
4
|
export class ReturningExecutor {
|
|
5
5
|
builder;
|
|
6
6
|
relq;
|