@relq/orm 0.1.3 → 0.1.4
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 +4 -3
- package/dist/cjs/addon/mysql2.cjs +21144 -0
- package/dist/cjs/addon/pg.cjs +4 -3
- 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 +52 -25
- 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 +4 -3
- package/dist/esm/addon/mysql2.js +21132 -0
- package/dist/esm/addon/pg.js +4 -3
- 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 +44 -24
- 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 +5 -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
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { RelqConnectionError, RelqQueryError, RelqTimeoutError, RelqConstraintError, RelqSchemaError, RelqDataError, RelqLockError, } from "../../../shared/errors/relq-errors.js";
|
|
2
|
+
export const MYSQL_RECOVERABLE_ERRNOS = new Set([
|
|
3
|
+
2002,
|
|
4
|
+
2003,
|
|
5
|
+
2006,
|
|
6
|
+
2013,
|
|
7
|
+
2026,
|
|
8
|
+
]);
|
|
9
|
+
export const MYSQL_CONNECTION_ERROR_ERRNOS = new Set([
|
|
10
|
+
2002,
|
|
11
|
+
2003,
|
|
12
|
+
2006,
|
|
13
|
+
2013,
|
|
14
|
+
2026,
|
|
15
|
+
]);
|
|
16
|
+
export const MYSQL_NETWORK_ERROR_CODES = new Set([
|
|
17
|
+
'ECONNRESET',
|
|
18
|
+
'ECONNREFUSED',
|
|
19
|
+
'ENOTFOUND',
|
|
20
|
+
'ESERVFAIL',
|
|
21
|
+
'ETIMEDOUT',
|
|
22
|
+
'EPIPE',
|
|
23
|
+
'EAI_AGAIN',
|
|
24
|
+
'EHOSTUNREACH',
|
|
25
|
+
'ECONNABORTED',
|
|
26
|
+
'ENETUNREACH',
|
|
27
|
+
'ENETRESET',
|
|
28
|
+
'PROTOCOL_CONNECTION_LOST',
|
|
29
|
+
]);
|
|
30
|
+
export const MYSQL_TRANSIENT_ERRNOS = new Set([
|
|
31
|
+
1205,
|
|
32
|
+
1213,
|
|
33
|
+
]);
|
|
34
|
+
export function isMysqlConnectionError(error) {
|
|
35
|
+
if (typeof error.errno === 'number' && MYSQL_CONNECTION_ERROR_ERRNOS.has(error.errno)) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (typeof error.code === 'string' && MYSQL_NETWORK_ERROR_CODES.has(error.code)) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
if (typeof error.message === 'string') {
|
|
42
|
+
if (error.message.includes('Connection lost'))
|
|
43
|
+
return true;
|
|
44
|
+
if (error.message.includes('connect ECONNREFUSED'))
|
|
45
|
+
return true;
|
|
46
|
+
if (error.message.includes('Connection closed'))
|
|
47
|
+
return true;
|
|
48
|
+
if (error.message.includes('Cannot enqueue'))
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
export function isMysqlTransientError(error) {
|
|
54
|
+
if (typeof error.errno === 'number' && MYSQL_TRANSIENT_ERRNOS.has(error.errno)) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
export function isMysqlPoolRecoverableError(error) {
|
|
60
|
+
if (typeof error.errno === 'number' && MYSQL_RECOVERABLE_ERRNOS.has(error.errno)) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
if (typeof error.code === 'string' && MYSQL_NETWORK_ERROR_CODES.has(error.code)) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
if (!error.errno && !error.code)
|
|
67
|
+
return true;
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
export function parseMysqlError(error, sql, isBuilder = true) {
|
|
71
|
+
const message = error.sqlMessage || error.message || 'MySQL error';
|
|
72
|
+
const errno = error.errno;
|
|
73
|
+
const code = error.code;
|
|
74
|
+
if (isMysqlConnectionError(error)) {
|
|
75
|
+
return new RelqConnectionError(message, {
|
|
76
|
+
cause: error,
|
|
77
|
+
code: code || String(errno),
|
|
78
|
+
host: error.address,
|
|
79
|
+
port: error.port,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (errno === 1040) {
|
|
83
|
+
return new RelqConnectionError('Too many database connections. The server has reached its connection limit.', { cause: error, code: code || '1040' });
|
|
84
|
+
}
|
|
85
|
+
if (errno === 1045) {
|
|
86
|
+
return new RelqConnectionError('Authentication failed. Check your database username and password.', { cause: error, code: code || '1045' });
|
|
87
|
+
}
|
|
88
|
+
if (errno === 1205) {
|
|
89
|
+
return new RelqLockError('Lock wait timeout exceeded. Another transaction holds the lock. Retry the operation.', 'lock_timeout', { cause: error, sql: sql || error.sql, code: code || '1205' });
|
|
90
|
+
}
|
|
91
|
+
if (message.includes('connect ETIMEDOUT') || message.includes('Connection timeout')) {
|
|
92
|
+
return new RelqTimeoutError('Connection timed out.', error.timeout || 0, 'connection', error);
|
|
93
|
+
}
|
|
94
|
+
if (!isBuilder) {
|
|
95
|
+
return new RelqQueryError(message, {
|
|
96
|
+
cause: error, sql: sql || error.sql, code: code || String(errno),
|
|
97
|
+
detail: error.sqlState ? `SQLSTATE ${error.sqlState}` : undefined,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (errno === 1062 || errno === 1022 || errno === 1169) {
|
|
101
|
+
const dupMatch = message.match(/Duplicate entry '(.+?)' for key '(?:.*\.)?(.+?)'/);
|
|
102
|
+
const val = dupMatch?.[1];
|
|
103
|
+
const constraint = dupMatch?.[2];
|
|
104
|
+
return new RelqConstraintError(`Duplicate value: A record with this value already exists.${val ? ` Value: "${val}".` : ''}${constraint ? ` Constraint: "${constraint}".` : ''}`, 'unique', { cause: error, constraint, value: val, sql: sql || error.sql, code: code || String(errno), detail: message });
|
|
105
|
+
}
|
|
106
|
+
if (errno === 1451 || errno === 1217) {
|
|
107
|
+
const refMatch = message.match(/CONSTRAINT `(.+?)`.*REFERENCES `(.+?)`/);
|
|
108
|
+
return new RelqConstraintError(`Cannot delete: This record is still referenced by another table.${refMatch ? ` Constraint: "${refMatch[1]}", referenced table: "${refMatch[2]}".` : ''}`, 'foreign_key', { cause: error, constraint: refMatch?.[1], sql: sql || error.sql, code: code || String(errno), detail: message });
|
|
109
|
+
}
|
|
110
|
+
if (errno === 1452 || errno === 1216) {
|
|
111
|
+
const refMatch = message.match(/CONSTRAINT `(.+?)`.*REFERENCES `(.+?)`/);
|
|
112
|
+
return new RelqConstraintError(`Referenced record not found: The value references a record that doesn't exist.${refMatch ? ` Constraint: "${refMatch[1]}", referenced table: "${refMatch[2]}".` : ''}`, 'foreign_key', { cause: error, constraint: refMatch?.[1], sql: sql || error.sql, code: code || String(errno), detail: message });
|
|
113
|
+
}
|
|
114
|
+
if (errno === 1048) {
|
|
115
|
+
const colMatch = message.match(/Column '(.+?)'/);
|
|
116
|
+
return new RelqConstraintError(`Required field missing: Column "${colMatch?.[1] || 'unknown'}" cannot be NULL. Provide a value or set a default in your schema.`, 'not_null', { cause: error, column: colMatch?.[1], sql: sql || error.sql, code: code || '1048', detail: message });
|
|
117
|
+
}
|
|
118
|
+
if (errno === 1213) {
|
|
119
|
+
return new RelqLockError('Deadlock detected: Two transactions are waiting for each other. Retry the transaction.', 'deadlock', { cause: error, sql: sql || error.sql, code: code || '1213' });
|
|
120
|
+
}
|
|
121
|
+
if (errno === 1146) {
|
|
122
|
+
const tblMatch = message.match(/Table '(?:.*\.)?(.+?)'/);
|
|
123
|
+
return new RelqSchemaError(`Table "${tblMatch?.[1] || 'unknown'}" does not exist. Check your schema definition or run migrations.`, 'table', { cause: error, objectName: tblMatch?.[1], sql: sql || error.sql, code: code || '1146' });
|
|
124
|
+
}
|
|
125
|
+
if (errno === 1054) {
|
|
126
|
+
const colMatch = message.match(/Unknown column '(.+?)'/);
|
|
127
|
+
return new RelqSchemaError(`Column "${colMatch?.[1] || 'unknown'}" does not exist. Check column name spelling in your schema and query.`, 'column', { cause: error, objectName: colMatch?.[1], sql: sql || error.sql, code: code || '1054' });
|
|
128
|
+
}
|
|
129
|
+
if (errno === 1064 || errno === 1149) {
|
|
130
|
+
return new RelqSchemaError(`SQL syntax error: ${message}. This may indicate a bug in the query builder — please report it.`, 'column', { cause: error, sql: sql || error.sql, code: code || '1064', hint: 'If you are using db.raw(), check your SQL syntax.' });
|
|
131
|
+
}
|
|
132
|
+
if (errno === 1050) {
|
|
133
|
+
const tblMatch = message.match(/Table '(.+?)'/);
|
|
134
|
+
return new RelqSchemaError(`Table "${tblMatch?.[1] || 'unknown'}" already exists.`, 'table', { cause: error, objectName: tblMatch?.[1], sql: sql || error.sql, code: code || '1050' });
|
|
135
|
+
}
|
|
136
|
+
if (errno === 1049) {
|
|
137
|
+
return new RelqSchemaError(`Database does not exist. Check your database name in the connection config.`, 'schema', { cause: error, sql: sql || error.sql, code: code || '1049' });
|
|
138
|
+
}
|
|
139
|
+
if (errno === 1406) {
|
|
140
|
+
const colMatch = message.match(/column '(.+?)'/);
|
|
141
|
+
return new RelqDataError(`Value too long for column "${colMatch?.[1] || 'unknown'}". Shorten the value or increase the column length.`, 'too_long', { cause: error, column: colMatch?.[1], sql: sql || error.sql, code: code || '1406' });
|
|
142
|
+
}
|
|
143
|
+
if (errno === 1264) {
|
|
144
|
+
const colMatch = message.match(/column '(.+?)'/);
|
|
145
|
+
return new RelqDataError(`Numeric value out of range for column "${colMatch?.[1] || 'unknown'}".`, 'out_of_range', { cause: error, column: colMatch?.[1], sql: sql || error.sql, code: code || '1264' });
|
|
146
|
+
}
|
|
147
|
+
if (errno === 1292 || errno === 1366) {
|
|
148
|
+
return new RelqDataError(`Invalid value: ${message}. Check that the value matches the column type.`, 'invalid_type', { cause: error, sql: sql || error.sql, code: code || String(errno) });
|
|
149
|
+
}
|
|
150
|
+
if (errno === 1265) {
|
|
151
|
+
const colMatch = message.match(/column '(.+?)'/);
|
|
152
|
+
return new RelqDataError(`Data truncated for column "${colMatch?.[1] || 'unknown'}". The value doesn't fit the column type.`, 'too_long', { cause: error, column: colMatch?.[1], sql: sql || error.sql, code: code || '1265' });
|
|
153
|
+
}
|
|
154
|
+
if (errno === 1365) {
|
|
155
|
+
return new RelqDataError('Division by zero in query.', 'division_by_zero', { cause: error, sql: sql || error.sql, code: code || '1365' });
|
|
156
|
+
}
|
|
157
|
+
if (errno === 1364) {
|
|
158
|
+
const colMatch = message.match(/Field '(.+?)'/);
|
|
159
|
+
return new RelqConstraintError(`Required field missing: Column "${colMatch?.[1] || 'unknown'}" has no default value. Provide a value or set a default in your schema.`, 'not_null', { cause: error, column: colMatch?.[1], sql: sql || error.sql, code: code || '1364', detail: message });
|
|
160
|
+
}
|
|
161
|
+
if (errno === 1044 || errno === 1142 || errno === 1143 || errno === 1227) {
|
|
162
|
+
return new RelqSchemaError(`Permission denied: ${message}. Check that your database user has the required privileges.`, 'table', { cause: error, sql: sql || error.sql, code: code || String(errno) });
|
|
163
|
+
}
|
|
164
|
+
if (errno === 1052) {
|
|
165
|
+
const colMatch = message.match(/Column '(.+?)'/);
|
|
166
|
+
return new RelqSchemaError(`Ambiguous column "${colMatch?.[1] || 'unknown'}": The column exists in multiple tables. Qualify it with a table name or alias.`, 'column', { cause: error, objectName: colMatch?.[1], sql: sql || error.sql, code: code || '1052' });
|
|
167
|
+
}
|
|
168
|
+
if (errno === 1058 || errno === 1136) {
|
|
169
|
+
return new RelqDataError(`Column count mismatch: The number of columns doesn't match the number of values. ${message}`, 'invalid_type', { cause: error, sql: sql || error.sql, code: code || String(errno) });
|
|
170
|
+
}
|
|
171
|
+
if (errno === 1109) {
|
|
172
|
+
const tblMatch = message.match(/Unknown table '(.+?)'/);
|
|
173
|
+
return new RelqSchemaError(`Table "${tblMatch?.[1] || 'unknown'}" not found. Check table name spelling.`, 'table', { cause: error, objectName: tblMatch?.[1], sql: sql || error.sql, code: code || '1109' });
|
|
174
|
+
}
|
|
175
|
+
if (errno === 1046) {
|
|
176
|
+
return new RelqSchemaError('No database selected. Set the database name in your connection config.', 'schema', { cause: error, sql: sql || error.sql, code: code || '1046' });
|
|
177
|
+
}
|
|
178
|
+
if (errno === 1153) {
|
|
179
|
+
return new RelqQueryError('Packet too large: The query or data exceeds max_allowed_packet. Reduce batch size or increase the limit.', { cause: error, sql: sql || error.sql, code: code || '1153' });
|
|
180
|
+
}
|
|
181
|
+
if (errno === 1179) {
|
|
182
|
+
return new RelqQueryError('This command cannot be executed inside a transaction.', { cause: error, sql: sql || error.sql, code: code || '1179' });
|
|
183
|
+
}
|
|
184
|
+
return new RelqQueryError(message, {
|
|
185
|
+
cause: error, sql: sql || error.sql, code: code || String(errno),
|
|
186
|
+
detail: error.sqlState ? `SQLSTATE ${error.sqlState}` : undefined,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
const MYSQL_RESERVED = new Set([
|
|
2
|
+
'ADD', 'ALL', 'ALTER', 'ANALYZE', 'AND', 'AS', 'ASC', 'BEFORE', 'BETWEEN',
|
|
3
|
+
'BIGINT', 'BINARY', 'BLOB', 'BOTH', 'BY', 'CALL', 'CASCADE', 'CASE', 'CHANGE',
|
|
4
|
+
'CHAR', 'CHARACTER', 'CHECK', 'COLLATE', 'COLUMN', 'CONDITION', 'CONSTRAINT',
|
|
5
|
+
'CONTINUE', 'CONVERT', 'CREATE', 'CROSS', 'CURRENT_DATE', 'CURRENT_TIME',
|
|
6
|
+
'CURRENT_TIMESTAMP', 'CURRENT_USER', 'CURSOR', 'DATABASE', 'DATABASES', 'DAY_HOUR',
|
|
7
|
+
'DAY_MICROSECOND', 'DAY_MINUTE', 'DAY_SECOND', 'DEC', 'DECIMAL', 'DECLARE',
|
|
8
|
+
'DEFAULT', 'DELAYED', 'DELETE', 'DESC', 'DESCRIBE', 'DETERMINISTIC', 'DISTINCT',
|
|
9
|
+
'DISTINCTROW', 'DIV', 'DOUBLE', 'DROP', 'DUAL', 'EACH', 'ELSE', 'ELSEIF',
|
|
10
|
+
'ENCLOSED', 'ESCAPED', 'EXISTS', 'EXIT', 'EXPLAIN', 'FALSE', 'FETCH', 'FLOAT',
|
|
11
|
+
'FLOAT4', 'FLOAT8', 'FOR', 'FORCE', 'FOREIGN', 'FROM', 'FULLTEXT', 'GRANT',
|
|
12
|
+
'GROUP', 'HAVING', 'HIGH_PRIORITY', 'HOUR_MICROSECOND', 'HOUR_MINUTE', 'HOUR_SECOND',
|
|
13
|
+
'IF', 'IGNORE', 'IN', 'INDEX', 'INFILE', 'INNER', 'INOUT', 'INSENSITIVE', 'INSERT',
|
|
14
|
+
'INT', 'INT1', 'INT2', 'INT3', 'INT4', 'INT8', 'INTEGER', 'INTERVAL', 'INTO',
|
|
15
|
+
'IS', 'ITERATE', 'JOIN', 'KEY', 'KEYS', 'KILL', 'LEADING', 'LEAVE', 'LEFT',
|
|
16
|
+
'LIKE', 'LIMIT', 'LINEAR', 'LINES', 'LOAD', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCK',
|
|
17
|
+
'LONG', 'LONGBLOB', 'LONGTEXT', 'LOOP', 'LOW_PRIORITY', 'MATCH', 'MEDIUMBLOB',
|
|
18
|
+
'MEDIUMINT', 'MEDIUMTEXT', 'MIDDLEINT', 'MINUTE_MICROSECOND', 'MINUTE_SECOND', 'MOD',
|
|
19
|
+
'MODIFIES', 'NATURAL', 'NOT', 'NO_WRITE_TO_BINLOG', 'NULL', 'NUMERIC', 'ON',
|
|
20
|
+
'OPTIMIZE', 'OPTION', 'OPTIONALLY', 'OR', 'ORDER', 'OUT', 'OUTER', 'OUTFILE',
|
|
21
|
+
'PRECISION', 'PRIMARY', 'PROCEDURE', 'PURGE', 'RANGE', 'READ', 'READS', 'REAL',
|
|
22
|
+
'REFERENCES', 'REGEXP', 'RELEASE', 'RENAME', 'REPEAT', 'REPLACE', 'REQUIRE',
|
|
23
|
+
'RESTRICT', 'RETURN', 'REVOKE', 'RIGHT', 'RLIKE', 'SCHEMA', 'SCHEMAS',
|
|
24
|
+
'SECOND_MICROSECOND', 'SELECT', 'SENSITIVE', 'SEPARATOR', 'SET', 'SHOW', 'SMALLINT',
|
|
25
|
+
'SPATIAL', 'SPECIFIC', 'SQL', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNING',
|
|
26
|
+
'SQL_BIG_RESULT', 'SQL_CALC_FOUND_ROWS', 'SQL_SMALL_RESULT', 'SSL', 'STARTING',
|
|
27
|
+
'STRAIGHT_JOIN', 'TABLE', 'TERMINATED', 'THEN', 'TINYBLOB', 'TINYINT', 'TINYTEXT',
|
|
28
|
+
'TO', 'TRAILING', 'TRIGGER', 'TRUE', 'UNDO', 'UNION', 'UNIQUE', 'UNLOCK',
|
|
29
|
+
'UNSIGNED', 'UPDATE', 'USAGE', 'USE', 'USING', 'UTC_DATE', 'UTC_TIME',
|
|
30
|
+
'UTC_TIMESTAMP', 'VALUES', 'VARBINARY', 'VARCHAR', 'VARYING', 'WHEN', 'WHERE',
|
|
31
|
+
'WHILE', 'WITH', 'WRITE', 'XOR', 'YEAR_MONTH', 'ZEROFILL',
|
|
32
|
+
'CUME_DIST', 'DENSE_RANK', 'EMPTY', 'EXCEPT', 'FIRST_VALUE', 'GROUPING', 'GROUPS',
|
|
33
|
+
'JSON_TABLE', 'LAG', 'LAST_VALUE', 'LATERAL', 'LEAD', 'NTH_VALUE', 'NTILE',
|
|
34
|
+
'OF', 'OVER', 'PERCENT_RANK', 'RANK', 'RECURSIVE', 'ROW', 'ROWS',
|
|
35
|
+
'ROW_NUMBER', 'SYSTEM', 'WINDOW',
|
|
36
|
+
]);
|
|
37
|
+
function ident(value) {
|
|
38
|
+
if (Array.isArray(value)) {
|
|
39
|
+
return value.map(v => quoteIdentifier(v)).join(', ');
|
|
40
|
+
}
|
|
41
|
+
return quoteIdentifier(value);
|
|
42
|
+
}
|
|
43
|
+
function quoteIdentifier(value) {
|
|
44
|
+
if (value === '*')
|
|
45
|
+
return '*';
|
|
46
|
+
if (value.includes('.')) {
|
|
47
|
+
return value.split('.').map(p => p === '*' ? '*' : `\`${escapeBackticks(p)}\``).join('.');
|
|
48
|
+
}
|
|
49
|
+
return `\`${escapeBackticks(value)}\``;
|
|
50
|
+
}
|
|
51
|
+
function escapeBackticks(value) {
|
|
52
|
+
return value.replace(/`/g, '``');
|
|
53
|
+
}
|
|
54
|
+
function literal(value) {
|
|
55
|
+
if (value === null || value === undefined)
|
|
56
|
+
return 'NULL';
|
|
57
|
+
if (typeof value === 'boolean')
|
|
58
|
+
return value ? 'true' : 'false';
|
|
59
|
+
if (typeof value === 'number')
|
|
60
|
+
return String(value);
|
|
61
|
+
if (value instanceof Date)
|
|
62
|
+
return `'${value.toISOString()}'`;
|
|
63
|
+
if (Array.isArray(value)) {
|
|
64
|
+
return `(${value.map(v => literal(v)).join(', ')})`;
|
|
65
|
+
}
|
|
66
|
+
const str = String(value);
|
|
67
|
+
return `'${str.replace(/'/g, "''").replace(/\\/g, '\\\\')}'`;
|
|
68
|
+
}
|
|
69
|
+
function mysqlFormat(fmt, ...args) {
|
|
70
|
+
let argIdx = 0;
|
|
71
|
+
return fmt.replace(/%([ILs%])/g, (match, type) => {
|
|
72
|
+
if (type === '%')
|
|
73
|
+
return '%';
|
|
74
|
+
if (argIdx >= args.length) {
|
|
75
|
+
throw new Error(`mysqlFormat: missing argument for ${match}`);
|
|
76
|
+
}
|
|
77
|
+
const val = args[argIdx++];
|
|
78
|
+
switch (type) {
|
|
79
|
+
case 'I': return ident(val);
|
|
80
|
+
case 'L': return literal(val);
|
|
81
|
+
case 's': return String(val);
|
|
82
|
+
default: return match;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
mysqlFormat.isReserved = (word) => {
|
|
87
|
+
return MYSQL_RESERVED.has(word.toUpperCase());
|
|
88
|
+
};
|
|
89
|
+
mysqlFormat.ident = ident;
|
|
90
|
+
mysqlFormat.literal = literal;
|
|
91
|
+
export default mysqlFormat;
|
|
92
|
+
export { ident as mysqlIdent, literal as mysqlLiteral };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { deserializeMysqlValue, serializeMysqlValue, deserializeMysqlRow, deserializeMysqlRows, serializeMysqlRow, extractMysqlSchemaColumns, } from "../../utils/type-coercion.js";
|
|
2
|
+
export const mysqlTypeCoercion = {
|
|
3
|
+
deserializeValue: deserializeMysqlValue,
|
|
4
|
+
serializeValue: serializeMysqlValue,
|
|
5
|
+
};
|
|
6
|
+
export { deserializeMysqlValue as mysqlDeserializeValue, serializeMysqlValue as mysqlSerializeValue, deserializeMysqlRow as mysqlDeserializeRow, deserializeMysqlRows as mysqlDeserializeRows, serializeMysqlRow as mysqlSerializeRow, extractMysqlSchemaColumns as mysqlExtractSchemaColumns, };
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import mysqlFormat from "../clients/shared/mysql-format.js";
|
|
2
|
+
import { buildMysqlJsonConditionSQL } from "./json-condition-builder.js";
|
|
3
|
+
import { createMysqlJsonColumnProxy, buildMysqlJsonProxySQL } from "./json-path-proxy.js";
|
|
4
|
+
import { MysqlFulltextConditionCollector, buildMysqlFulltextConditionSQL } from "./fulltext-condition-builder.js";
|
|
5
|
+
export class MysqlConditionCollector {
|
|
6
|
+
conditions = [];
|
|
7
|
+
_tables;
|
|
8
|
+
_tableName;
|
|
9
|
+
_fulltext;
|
|
10
|
+
get json() {
|
|
11
|
+
return createMysqlJsonColumnProxy(this);
|
|
12
|
+
}
|
|
13
|
+
get fulltext() {
|
|
14
|
+
if (!this._fulltext) {
|
|
15
|
+
this._fulltext = new MysqlFulltextConditionCollector(this);
|
|
16
|
+
}
|
|
17
|
+
return this._fulltext;
|
|
18
|
+
}
|
|
19
|
+
equal(column, value) {
|
|
20
|
+
this.conditions.push({ method: 'equal', column, values: value });
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
notEqual(column, value) {
|
|
24
|
+
this.conditions.push({ method: 'notEqual', column, values: value });
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
lessThan(column, value) {
|
|
28
|
+
this.conditions.push({ method: 'lessThan', column, values: value });
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
lessThanEqual(column, value) {
|
|
32
|
+
this.conditions.push({ method: 'lessThanEqual', column, values: value });
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
greaterThan(column, value) {
|
|
36
|
+
this.conditions.push({ method: 'greaterThan', column, values: value });
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
greaterThanEqual(column, value) {
|
|
40
|
+
this.conditions.push({ method: 'greaterThanEqual', column, values: value });
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
isNull(column) {
|
|
44
|
+
this.conditions.push({ method: 'isNull', column });
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
isNotNull(column) {
|
|
48
|
+
this.conditions.push({ method: 'isNotNull', column });
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
between(column, start, end) {
|
|
52
|
+
this.conditions.push({ method: 'between', column, values: [start, end] });
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
notBetween(column, start, end) {
|
|
56
|
+
this.conditions.push({ method: 'notBetween', column, values: [start, end] });
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
startsWith(column, value, caseInsensitive) {
|
|
60
|
+
this.conditions.push({
|
|
61
|
+
method: caseInsensitive ? 'startsWithI' : 'startsWith',
|
|
62
|
+
column,
|
|
63
|
+
values: value
|
|
64
|
+
});
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
notStartsWith(column, value, caseInsensitive) {
|
|
68
|
+
this.conditions.push({
|
|
69
|
+
method: caseInsensitive ? 'notStartsWithI' : 'notStartsWith',
|
|
70
|
+
column,
|
|
71
|
+
values: value
|
|
72
|
+
});
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
endsWith(column, value, caseInsensitive) {
|
|
76
|
+
this.conditions.push({
|
|
77
|
+
method: caseInsensitive ? 'endsWithI' : 'endsWith',
|
|
78
|
+
column,
|
|
79
|
+
values: value
|
|
80
|
+
});
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
notEndsWith(column, value, caseInsensitive) {
|
|
84
|
+
this.conditions.push({
|
|
85
|
+
method: caseInsensitive ? 'notEndsWithI' : 'notEndsWith',
|
|
86
|
+
column,
|
|
87
|
+
values: value
|
|
88
|
+
});
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
contains(column, value, caseInsensitive) {
|
|
92
|
+
this.conditions.push({
|
|
93
|
+
method: caseInsensitive ? 'containsI' : 'contains',
|
|
94
|
+
column,
|
|
95
|
+
values: value
|
|
96
|
+
});
|
|
97
|
+
return this;
|
|
98
|
+
}
|
|
99
|
+
notContains(column, value, caseInsensitive) {
|
|
100
|
+
this.conditions.push({
|
|
101
|
+
method: caseInsensitive ? 'notContainsI' : 'notContains',
|
|
102
|
+
column,
|
|
103
|
+
values: value
|
|
104
|
+
});
|
|
105
|
+
return this;
|
|
106
|
+
}
|
|
107
|
+
like(column, pattern) {
|
|
108
|
+
this.conditions.push({ method: 'like', column, values: pattern });
|
|
109
|
+
return this;
|
|
110
|
+
}
|
|
111
|
+
notLike(column, pattern) {
|
|
112
|
+
this.conditions.push({ method: 'notLike', column, values: pattern });
|
|
113
|
+
return this;
|
|
114
|
+
}
|
|
115
|
+
ilike(column, pattern) {
|
|
116
|
+
this.conditions.push({ method: 'ilike', column, values: pattern });
|
|
117
|
+
return this;
|
|
118
|
+
}
|
|
119
|
+
notIlike(column, pattern) {
|
|
120
|
+
this.conditions.push({ method: 'notIlike', column, values: pattern });
|
|
121
|
+
return this;
|
|
122
|
+
}
|
|
123
|
+
regex(column, pattern) {
|
|
124
|
+
this.conditions.push({ method: 'regex', column, values: pattern });
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
iregex(column, pattern) {
|
|
128
|
+
this.conditions.push({ method: 'iregex', column, values: pattern });
|
|
129
|
+
return this;
|
|
130
|
+
}
|
|
131
|
+
notRegex(column, pattern) {
|
|
132
|
+
this.conditions.push({ method: 'notRegex', column, values: pattern });
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
notIregex(column, pattern) {
|
|
136
|
+
this.conditions.push({ method: 'notIregex', column, values: pattern });
|
|
137
|
+
return this;
|
|
138
|
+
}
|
|
139
|
+
isTrue(column) {
|
|
140
|
+
this.conditions.push({ method: 'isTrue', column });
|
|
141
|
+
return this;
|
|
142
|
+
}
|
|
143
|
+
isFalse(column) {
|
|
144
|
+
this.conditions.push({ method: 'isFalse', column });
|
|
145
|
+
return this;
|
|
146
|
+
}
|
|
147
|
+
nullSafeEqual(column, value) {
|
|
148
|
+
this.conditions.push({ method: 'nullSafeEqual', column, values: value });
|
|
149
|
+
return this;
|
|
150
|
+
}
|
|
151
|
+
nullSafeNotEqual(column, value) {
|
|
152
|
+
this.conditions.push({ method: 'nullSafeNotEqual', column, values: value });
|
|
153
|
+
return this;
|
|
154
|
+
}
|
|
155
|
+
search(column, value) {
|
|
156
|
+
this.conditions.push({ method: 'search', column, values: value });
|
|
157
|
+
return this;
|
|
158
|
+
}
|
|
159
|
+
notSearch(column, value) {
|
|
160
|
+
this.conditions.push({ method: 'notSearch', column, values: value });
|
|
161
|
+
return this;
|
|
162
|
+
}
|
|
163
|
+
greaterThanOrEqual(column, value) {
|
|
164
|
+
return this.greaterThanEqual(column, value);
|
|
165
|
+
}
|
|
166
|
+
lessThanOrEqual(column, value) {
|
|
167
|
+
return this.lessThanEqual(column, value);
|
|
168
|
+
}
|
|
169
|
+
notNull(column) {
|
|
170
|
+
return this.isNotNull(column);
|
|
171
|
+
}
|
|
172
|
+
in(column, values) {
|
|
173
|
+
if (typeof values === 'function') {
|
|
174
|
+
const subquery = values(this._tables);
|
|
175
|
+
this.conditions.push({ method: 'in', column, values: subquery.toString() });
|
|
176
|
+
}
|
|
177
|
+
else if (!Array.isArray(values) && typeof values === 'object' && values !== null && 'toString' in values) {
|
|
178
|
+
this.conditions.push({ method: 'in', column, values: values.toString() });
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
this.conditions.push({ method: 'in', column, values });
|
|
182
|
+
}
|
|
183
|
+
return this;
|
|
184
|
+
}
|
|
185
|
+
notIn(column, values) {
|
|
186
|
+
if (typeof values === 'function') {
|
|
187
|
+
const subquery = values(this._tables);
|
|
188
|
+
this.conditions.push({ method: 'notIn', column, values: subquery.toString() });
|
|
189
|
+
}
|
|
190
|
+
else if (!Array.isArray(values) && typeof values === 'object' && values !== null && 'toString' in values) {
|
|
191
|
+
this.conditions.push({ method: 'notIn', column, values: values.toString() });
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
this.conditions.push({ method: 'notIn', column, values });
|
|
195
|
+
}
|
|
196
|
+
return this;
|
|
197
|
+
}
|
|
198
|
+
exists(subquery) {
|
|
199
|
+
this.conditions.push({ method: 'exists', values: subquery });
|
|
200
|
+
return this;
|
|
201
|
+
}
|
|
202
|
+
notExists(subquery) {
|
|
203
|
+
this.conditions.push({ method: 'notExists', values: subquery });
|
|
204
|
+
return this;
|
|
205
|
+
}
|
|
206
|
+
or(callback) {
|
|
207
|
+
const subBuilder = new MysqlConditionCollector();
|
|
208
|
+
callback(subBuilder);
|
|
209
|
+
this.conditions.push({ method: 'or', values: subBuilder.getConditions() });
|
|
210
|
+
return this;
|
|
211
|
+
}
|
|
212
|
+
and(callback) {
|
|
213
|
+
const subBuilder = new MysqlConditionCollector();
|
|
214
|
+
callback(subBuilder);
|
|
215
|
+
this.conditions.push({ method: 'and', values: subBuilder.getConditions() });
|
|
216
|
+
return this;
|
|
217
|
+
}
|
|
218
|
+
not(callback) {
|
|
219
|
+
const subBuilder = new MysqlConditionCollector();
|
|
220
|
+
callback(subBuilder);
|
|
221
|
+
this.conditions.push({ method: 'not', values: subBuilder.getConditions() });
|
|
222
|
+
return this;
|
|
223
|
+
}
|
|
224
|
+
getConditions() {
|
|
225
|
+
return this.conditions;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function formatColumn(column) {
|
|
229
|
+
if (column.includes('.')) {
|
|
230
|
+
const parts = column.split('.');
|
|
231
|
+
return parts.map(p => mysqlFormat.ident(p)).join('.');
|
|
232
|
+
}
|
|
233
|
+
return mysqlFormat.ident(column);
|
|
234
|
+
}
|
|
235
|
+
export function buildMysqlConditionSQL(condition) {
|
|
236
|
+
const { method, column, values } = condition;
|
|
237
|
+
if (method === 'mysql_json_proxy') {
|
|
238
|
+
return buildMysqlJsonProxySQL(condition);
|
|
239
|
+
}
|
|
240
|
+
if (method.startsWith('json_')) {
|
|
241
|
+
return buildMysqlJsonConditionSQL(condition);
|
|
242
|
+
}
|
|
243
|
+
if (method.startsWith('fulltext_')) {
|
|
244
|
+
return buildMysqlFulltextConditionSQL(condition);
|
|
245
|
+
}
|
|
246
|
+
const col = column ? formatColumn(column) : '';
|
|
247
|
+
switch (method) {
|
|
248
|
+
case 'equal':
|
|
249
|
+
if (Array.isArray(values) && values.length > 1) {
|
|
250
|
+
return `${col} IN ${mysqlFormat.literal(values)}`;
|
|
251
|
+
}
|
|
252
|
+
return `${col} = ${mysqlFormat.literal(Array.isArray(values) ? values[0] : values)}`;
|
|
253
|
+
case 'notEqual':
|
|
254
|
+
if (Array.isArray(values) && values.length > 1) {
|
|
255
|
+
return `${col} NOT IN ${mysqlFormat.literal(values)}`;
|
|
256
|
+
}
|
|
257
|
+
return `${col} != ${mysqlFormat.literal(Array.isArray(values) ? values[0] : values)}`;
|
|
258
|
+
case 'lessThan':
|
|
259
|
+
return `${col} < ${mysqlFormat.literal(Array.isArray(values) ? values[0] : values)}`;
|
|
260
|
+
case 'lessThanEqual':
|
|
261
|
+
return `${col} <= ${mysqlFormat.literal(Array.isArray(values) ? values[0] : values)}`;
|
|
262
|
+
case 'greaterThan':
|
|
263
|
+
return `${col} > ${mysqlFormat.literal(Array.isArray(values) ? values[0] : values)}`;
|
|
264
|
+
case 'greaterThanEqual':
|
|
265
|
+
return `${col} >= ${mysqlFormat.literal(Array.isArray(values) ? values[0] : values)}`;
|
|
266
|
+
case 'isNull':
|
|
267
|
+
return `${col} IS NULL`;
|
|
268
|
+
case 'isNotNull':
|
|
269
|
+
return `${col} IS NOT NULL`;
|
|
270
|
+
case 'between': {
|
|
271
|
+
const [start, end] = values;
|
|
272
|
+
return `${col} BETWEEN ${mysqlFormat.literal(start)} AND ${mysqlFormat.literal(end)}`;
|
|
273
|
+
}
|
|
274
|
+
case 'notBetween': {
|
|
275
|
+
const [notStart, notEnd] = values;
|
|
276
|
+
return `${col} NOT BETWEEN ${mysqlFormat.literal(notStart)} AND ${mysqlFormat.literal(notEnd)}`;
|
|
277
|
+
}
|
|
278
|
+
case 'startsWith':
|
|
279
|
+
return `${col} LIKE ${mysqlFormat.literal(`${values}%`)}`;
|
|
280
|
+
case 'startsWithI':
|
|
281
|
+
return `LOWER(${col}) LIKE LOWER(${mysqlFormat.literal(`${values}%`)})`;
|
|
282
|
+
case 'notStartsWith':
|
|
283
|
+
return `${col} NOT LIKE ${mysqlFormat.literal(`${values}%`)}`;
|
|
284
|
+
case 'notStartsWithI':
|
|
285
|
+
return `LOWER(${col}) NOT LIKE LOWER(${mysqlFormat.literal(`${values}%`)})`;
|
|
286
|
+
case 'endsWith':
|
|
287
|
+
return `${col} LIKE ${mysqlFormat.literal(`%${values}`)}`;
|
|
288
|
+
case 'endsWithI':
|
|
289
|
+
return `LOWER(${col}) LIKE LOWER(${mysqlFormat.literal(`%${values}`)})`;
|
|
290
|
+
case 'notEndsWith':
|
|
291
|
+
return `${col} NOT LIKE ${mysqlFormat.literal(`%${values}`)}`;
|
|
292
|
+
case 'notEndsWithI':
|
|
293
|
+
return `LOWER(${col}) NOT LIKE LOWER(${mysqlFormat.literal(`%${values}`)})`;
|
|
294
|
+
case 'contains':
|
|
295
|
+
return `${col} LIKE ${mysqlFormat.literal(`%${values}%`)}`;
|
|
296
|
+
case 'containsI':
|
|
297
|
+
return `LOWER(${col}) LIKE LOWER(${mysqlFormat.literal(`%${values}%`)})`;
|
|
298
|
+
case 'notContains':
|
|
299
|
+
return `${col} NOT LIKE ${mysqlFormat.literal(`%${values}%`)}`;
|
|
300
|
+
case 'notContainsI':
|
|
301
|
+
return `LOWER(${col}) NOT LIKE LOWER(${mysqlFormat.literal(`%${values}%`)})`;
|
|
302
|
+
case 'like':
|
|
303
|
+
return `${col} LIKE ${mysqlFormat.literal(values)}`;
|
|
304
|
+
case 'notLike':
|
|
305
|
+
return `${col} NOT LIKE ${mysqlFormat.literal(values)}`;
|
|
306
|
+
case 'ilike':
|
|
307
|
+
return `LOWER(${col}) LIKE LOWER(${mysqlFormat.literal(values)})`;
|
|
308
|
+
case 'notIlike':
|
|
309
|
+
return `LOWER(${col}) NOT LIKE LOWER(${mysqlFormat.literal(values)})`;
|
|
310
|
+
case 'regex':
|
|
311
|
+
return `REGEXP_LIKE(${col}, ${mysqlFormat.literal(values)}, 'c')`;
|
|
312
|
+
case 'iregex':
|
|
313
|
+
return `REGEXP_LIKE(${col}, ${mysqlFormat.literal(values)}, 'i')`;
|
|
314
|
+
case 'notRegex':
|
|
315
|
+
return `NOT REGEXP_LIKE(${col}, ${mysqlFormat.literal(values)}, 'c')`;
|
|
316
|
+
case 'notIregex':
|
|
317
|
+
return `NOT REGEXP_LIKE(${col}, ${mysqlFormat.literal(values)}, 'i')`;
|
|
318
|
+
case 'isTrue':
|
|
319
|
+
return `${col} IS TRUE`;
|
|
320
|
+
case 'isFalse':
|
|
321
|
+
return `${col} IS FALSE`;
|
|
322
|
+
case 'nullSafeEqual':
|
|
323
|
+
return `${col} <=> ${mysqlFormat.literal(values)}`;
|
|
324
|
+
case 'nullSafeNotEqual':
|
|
325
|
+
return `NOT (${col} <=> ${mysqlFormat.literal(values)})`;
|
|
326
|
+
case 'search':
|
|
327
|
+
return `MATCH(${col}) AGAINST(${mysqlFormat.literal(values)} IN NATURAL LANGUAGE MODE)`;
|
|
328
|
+
case 'notSearch':
|
|
329
|
+
return `NOT MATCH(${col}) AGAINST(${mysqlFormat.literal(values)} IN NATURAL LANGUAGE MODE)`;
|
|
330
|
+
case 'in': {
|
|
331
|
+
if (typeof values === 'string') {
|
|
332
|
+
return `${col} IN (${values})`;
|
|
333
|
+
}
|
|
334
|
+
const valueList = Array.isArray(values) ? values : [values];
|
|
335
|
+
const formattedValues = valueList.map(v => mysqlFormat.literal(v)).join(', ');
|
|
336
|
+
return `${col} IN (${formattedValues})`;
|
|
337
|
+
}
|
|
338
|
+
case 'notIn': {
|
|
339
|
+
if (typeof values === 'string') {
|
|
340
|
+
return `${col} NOT IN (${values})`;
|
|
341
|
+
}
|
|
342
|
+
const valueList = Array.isArray(values) ? values : [values];
|
|
343
|
+
const formattedValues = valueList.map(v => mysqlFormat.literal(v)).join(', ');
|
|
344
|
+
return `${col} NOT IN (${formattedValues})`;
|
|
345
|
+
}
|
|
346
|
+
case 'exists':
|
|
347
|
+
return `EXISTS (${values})`;
|
|
348
|
+
case 'notExists':
|
|
349
|
+
return `NOT EXISTS (${values})`;
|
|
350
|
+
case 'or': {
|
|
351
|
+
const orConditions = values;
|
|
352
|
+
return `(${orConditions.map(c => buildMysqlConditionSQL(c)).join(' OR ')})`;
|
|
353
|
+
}
|
|
354
|
+
case 'and': {
|
|
355
|
+
const andConditions = values;
|
|
356
|
+
return `(${andConditions.map(c => buildMysqlConditionSQL(c)).join(' AND ')})`;
|
|
357
|
+
}
|
|
358
|
+
case 'not': {
|
|
359
|
+
const notConditions = values;
|
|
360
|
+
return `NOT (${notConditions.map(c => buildMysqlConditionSQL(c)).join(' AND ')})`;
|
|
361
|
+
}
|
|
362
|
+
default:
|
|
363
|
+
return '';
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
export function buildMysqlConditionsSQL(conditions) {
|
|
367
|
+
return conditions.map(condition => buildMysqlConditionSQL(condition)).join(' AND ');
|
|
368
|
+
}
|