uql-orm 0.15.2 → 0.15.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/README.md +1 -1
- package/dist/bunSql/bunSqlCockroachDialect.d.ts +13 -0
- package/dist/bunSql/bunSqlCockroachDialect.d.ts.map +1 -0
- package/dist/bunSql/bunSqlCockroachDialect.js +22 -0
- package/dist/bunSql/bunSqlCockroachDialect.js.map +1 -0
- package/dist/bunSql/bunSqlQuerierPool.d.ts.map +1 -1
- package/dist/bunSql/bunSqlQuerierPool.js +2 -2
- package/dist/bunSql/bunSqlQuerierPool.js.map +1 -1
- package/dist/cockroachdb/cockroachDialect.d.ts +12 -9
- package/dist/cockroachdb/cockroachDialect.d.ts.map +1 -1
- package/dist/cockroachdb/cockroachDialect.js +19 -8
- package/dist/cockroachdb/cockroachDialect.js.map +1 -1
- package/dist/dialect/pgLikeSqlDialect.d.ts +59 -0
- package/dist/dialect/pgLikeSqlDialect.d.ts.map +1 -0
- package/dist/dialect/pgLikeSqlDialect.js +236 -0
- package/dist/dialect/pgLikeSqlDialect.js.map +1 -0
- package/dist/entity/decorator/index-decorator.js +2 -2
- package/dist/entity/decorator/index-decorator.js.map +1 -1
- package/dist/entity/decorator/index.d.ts +1 -1
- package/dist/entity/decorator/index.d.ts.map +1 -1
- package/dist/entity/decorator/index.js +1 -1
- package/dist/entity/decorator/index.js.map +1 -1
- package/dist/entity/metadata/definition.d.ts +1 -0
- package/dist/entity/metadata/definition.d.ts.map +1 -1
- package/dist/entity/metadata/definition.js +5 -0
- package/dist/entity/metadata/definition.js.map +1 -1
- package/dist/migrate/schemaGenerator.d.ts.map +1 -1
- package/dist/migrate/schemaGenerator.js +13 -6
- package/dist/migrate/schemaGenerator.js.map +1 -1
- package/dist/postgres/postgresDialect.d.ts +8 -40
- package/dist/postgres/postgresDialect.d.ts.map +1 -1
- package/dist/postgres/postgresDialect.js +8 -210
- package/dist/postgres/postgresDialect.js.map +1 -1
- package/dist/postgres/postgresWireDriverCapabilities.d.ts +12 -7
- package/dist/postgres/postgresWireDriverCapabilities.d.ts.map +1 -1
- package/dist/postgres/postgresWireDriverCapabilities.js +12 -7
- package/dist/postgres/postgresWireDriverCapabilities.js.map +1 -1
- package/dist/type/entity.d.ts +1 -1
- package/dist/type/entity.d.ts.map +1 -1
- package/dist/type/query.d.ts +6 -2
- package/dist/type/query.d.ts.map +1 -1
- package/dist/util/sql.util.d.ts.map +1 -1
- package/dist/util/sql.util.js +8 -2
- package/dist/util/sql.util.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file. Please add
|
|
|
4
4
|
|
|
5
5
|
date format is [yyyy-mm-dd]
|
|
6
6
|
|
|
7
|
+
## [0.15.3] - 2026-07-11
|
|
8
|
+
|
|
9
|
+
CockroachDB integration tests added, fixing upsert, ID generation, and `$text` search, and adding full vector search support. Two related Bun SQL driver bugs (CockroachDB JSON updates, MariaDB upsert `created`) are also fixed.
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
- **CockroachDB vector search** - `$sort`/`$vector` uses the same pgvector-compatible distance operators as Postgres (`<=>`/`<->`/`<#>`), and schema generation emits CockroachDB's native `CREATE VECTOR INDEX` syntax.
|
|
14
|
+
|
|
15
|
+
### Fixes
|
|
16
|
+
|
|
17
|
+
- **CockroachDB `upsertOne` / `upsertMany`** - previously errored with `column "xmax" does not exist`; now works, with `created` always `undefined` (CockroachDB has no insert-vs-update signal).
|
|
18
|
+
- **CockroachDB auto-generated IDs** - the default primary key used `SERIAL` (CockroachDB's `unique_rowid()`), producing values beyond `Number.MAX_SAFE_INTEGER` that get corrupted as JS numbers. Now uses a sequential `IDENTITY` column instead.
|
|
19
|
+
- **CockroachDB `$text` search** - now generates `to_tsvector`/`to_tsquery`, which CockroachDB supports.
|
|
20
|
+
- **CockroachDB via Bun SQL** - `$merge`/`$push` on a JSONB column could silently corrupt the value or throw, since it didn't get the same wire-encoding fix Postgres has on the Bun driver. Fixed.
|
|
21
|
+
- **MariaDB via Bun SQL** - upsert's `created` could report `false` on a fresh insert; now correctly `undefined`.
|
|
22
|
+
|
|
7
23
|
## [0.15.2] - 2026-07-10
|
|
8
24
|
|
|
9
25
|
`insertOne` / `insertMany` now return the right IDs on every database (and `undefined` instead of a made-up one when the driver reports none), a batch may mix records with different columns, and oversized batches are split automatically to stay under the driver's bind-parameter limit.
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
[](https://github.com/rogerpadilla/uql/actions/workflows/tests.yml) [](https://coveralls.io/github/rogerpadilla/uql?branch=main) [](https://github.com/rogerpadilla/uql/blob/main/LICENSE) [](https://www.npmjs.com/package/uql-orm)
|
|
9
9
|
|
|
10
|
-
**[UQL](https://uql-orm.dev)** is the
|
|
10
|
+
**[UQL](https://uql-orm.dev)** is the perfectionist ORM: serializable queries, no codegen, and one API across PostgreSQL, MySQL, SQLite, MariaDB, and MongoDB. Define entities once, query everywhere.
|
|
11
11
|
|
|
12
12
|
<!-- DEMO: Record an animated GIF showing IDE autocompletion for $select/$populate/$where and embed here. Example:  -->
|
|
13
13
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CockroachDialect } from '../cockroachdb/cockroachDialect.js';
|
|
2
|
+
import type { DialectOptions } from '../dialect/abstractDialect.js';
|
|
3
|
+
/**
|
|
4
|
+
* CockroachDB Dialect specialization for the `bun:sql` driver, which routes CockroachDB
|
|
5
|
+
* connections through its own Postgres wire-protocol implementation (see
|
|
6
|
+
* `bunSql.util.ts#normalizeBunOpts`), so it needs the identical fix as {@link BunSqlPostgresDialect}:
|
|
7
|
+
* without it, `$merge`/`$push` on a JSONB column silently produce the wrong value or throw
|
|
8
|
+
* (verified directly against a live CockroachDB instance via `bun:sql`).
|
|
9
|
+
*/
|
|
10
|
+
export declare class BunSqlCockroachDialect extends CockroachDialect {
|
|
11
|
+
constructor(options?: DialectOptions);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=bunSqlCockroachDialect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bunSqlCockroachDialect.d.ts","sourceRoot":"","sources":["../../src/bunSql/bunSqlCockroachDialect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAGpE;;;;;;GAMG;AACH,qBAAa,sBAAuB,SAAQ,gBAAgB;IAC1D,YAAY,OAAO,GAAE,cAAmB,EASvC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CockroachDialect } from '../cockroachdb/cockroachDialect.js';
|
|
2
|
+
import { POSTGRES_WIRE_DRIVER_CAPABILITIES } from '../postgres/postgresWireDriverCapabilities.js';
|
|
3
|
+
/**
|
|
4
|
+
* CockroachDB Dialect specialization for the `bun:sql` driver, which routes CockroachDB
|
|
5
|
+
* connections through its own Postgres wire-protocol implementation (see
|
|
6
|
+
* `bunSql.util.ts#normalizeBunOpts`), so it needs the identical fix as {@link BunSqlPostgresDialect}:
|
|
7
|
+
* without it, `$merge`/`$push` on a JSONB column silently produce the wrong value or throw
|
|
8
|
+
* (verified directly against a live CockroachDB instance via `bun:sql`).
|
|
9
|
+
*/
|
|
10
|
+
export class BunSqlCockroachDialect extends CockroachDialect {
|
|
11
|
+
constructor(options = {}) {
|
|
12
|
+
super({
|
|
13
|
+
...options,
|
|
14
|
+
driverCapabilities: {
|
|
15
|
+
...POSTGRES_WIRE_DRIVER_CAPABILITIES,
|
|
16
|
+
explicitJsonCast: true,
|
|
17
|
+
...options.driverCapabilities,
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=bunSqlCockroachDialect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bunSqlCockroachDialect.js","sourceRoot":"","sources":["../../src/bunSql/bunSqlCockroachDialect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,iCAAiC,EAAE,MAAM,+CAA+C,CAAC;AAElG;;;;;;GAMG;AACH,MAAM,OAAO,sBAAuB,SAAQ,gBAAgB;IAC1D,YAAY,OAAO,GAAmB,EAAE;QACtC,KAAK,CAAC;YACJ,GAAG,OAAO;YACV,kBAAkB,EAAE;gBAClB,GAAG,iCAAiC;gBACpC,gBAAgB,EAAE,IAAI;gBACtB,GAAG,OAAO,CAAC,kBAAkB;aAC9B;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bunSqlQuerierPool.d.ts","sourceRoot":"","sources":["../../src/bunSql/bunSqlQuerierPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,GAAG,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"bunSqlQuerierPool.d.ts","sourceRoot":"","sources":["../../src/bunSql/bunSqlQuerierPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,GAAG,EAAE,MAAM,KAAK,CAAC;AAE5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAG3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAYpF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAYnD,qBAAa,iBAAkB,SAAQ,sBAAsB,CAAC,aAAa,EAAE,kBAAkB,CAAC;IAK5F,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO;IAJ9B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IAExC,YACW,MAAM,EAAE,GAAG,CAAC,OAAO,EAC5B,KAAK,CAAC,EAAE,YAAY,EAQrB;IAED;;;OAGG;IACH,IAAI,IAAI,IAAI,aAAa,CAWxB;IAEK,UAAU,2BASf;IAEK,GAAG,kBAER;CACF"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { SQL } from 'bun';
|
|
2
|
-
import { CockroachDialect } from '../cockroachdb/cockroachDialect.js';
|
|
3
2
|
import { MariaDialect } from '../maria/mariaDialect.js';
|
|
4
3
|
import { MySqlDialect } from '../mysql/mysqlDialect.js';
|
|
5
4
|
import { AbstractSqlQuerierPool } from '../querier/index.js';
|
|
6
5
|
import { getAffectedRows, inferDialectName, isPoolableDialect, normalizeBunOpts, normalizeRows, } from './bunSql.util.js';
|
|
6
|
+
import { BunSqlCockroachDialect } from './bunSqlCockroachDialect.js';
|
|
7
7
|
import { BunSqliteDialect } from './bunSqliteDialect.js';
|
|
8
8
|
import { BunSqlPostgresDialect } from './bunSqlPostgresDialect.js';
|
|
9
9
|
import { BunSqlQuerier } from './bunSqlQuerier.js';
|
|
@@ -12,7 +12,7 @@ const DialectMap = {
|
|
|
12
12
|
mysql: MySqlDialect,
|
|
13
13
|
mariadb: MariaDialect,
|
|
14
14
|
sqlite: BunSqliteDialect,
|
|
15
|
-
cockroachdb:
|
|
15
|
+
cockroachdb: BunSqlCockroachDialect,
|
|
16
16
|
};
|
|
17
17
|
export class BunSqlQuerierPool extends AbstractSqlQuerierPool {
|
|
18
18
|
config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bunSqlQuerierPool.js","sourceRoot":"","sources":["../../src/bunSql/bunSqlQuerierPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,GAAG,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"bunSqlQuerierPool.js","sourceRoot":"","sources":["../../src/bunSql/bunSqlQuerierPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,GAAG,EAAE,MAAM,KAAK,CAAC;AAG5C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAEL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,MAAM,UAAU,GAAyD;IACvE,QAAQ,EAAE,qBAAqB;IAC/B,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,gBAAgB;IACxB,WAAW,EAAE,sBAAsB;CACpC,CAAC;AAEF,MAAM,OAAO,iBAAkB,SAAQ,sBAAyD;IAKnF,MAAM;IAJR,GAAG,CAAM;IACT,cAAc,CAAiB;IAExC,YACW,MAAmB,EAC5B,KAAoB;QAEpB,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;sBAJ5E,MAAM;QAKf,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC;QAElC,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAI,IAAI;QACN,OAAO;YACL,KAAK,EAAE,CAAC,IAAY,EAAE,MAAkB,EAAE,EAAE,CAC1C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAe,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACvF,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC;gBACxB,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC;aAC/B,CAAC,CAAC;YACL,EAAE,EAAE,GAAG,EAAE;gBACP,+BAA+B;YACjC,CAAC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;YAC7B,gFAAgF;YAChF,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC5C,OAAO,IAAI,CAAC,GAAkB,CAAC;YACjC,CAAC;YACD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC,CAAC;QACF,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import type { DialectOptions } from '../dialect/abstractDialect.js';
|
|
2
|
+
import { PgLikeSqlDialect } from '../dialect/pgLikeSqlDialect.js';
|
|
3
3
|
/**
|
|
4
4
|
* CockroachDB Dialect.
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Shares AST/quoting/JSONB/full-text-search/vector-search/upsert logic with Postgres via
|
|
6
|
+
* {@link PgLikeSqlDialect} (wire- and SQL-compatible for all of that, including pgvector's
|
|
7
|
+
* `<=>`/`<->`/`<#>` operators, which CockroachDB implements natively). Unlike Postgres, CockroachDB
|
|
8
|
+
* has no `xmax`/`ctid` system columns, so it uses `PgLikeSqlDialect.upsert`'s default as-is (no
|
|
9
|
+
* `created` detection) rather than Postgres's `xmax`-based override; no `vectorExtension` either,
|
|
10
|
+
* since the vector type is native (no `CREATE EXTENSION` needed); and vector indexes use
|
|
11
|
+
* CockroachDB's own `CREATE VECTOR INDEX` syntax (no access-method keyword) rather than pgvector's
|
|
12
|
+
* `CREATE INDEX ... USING ivfflat/hnsw`.
|
|
8
13
|
*/
|
|
9
|
-
export declare class CockroachDialect extends
|
|
14
|
+
export declare class CockroachDialect extends PgLikeSqlDialect {
|
|
10
15
|
readonly dialectName = "cockroachdb";
|
|
11
|
-
|
|
12
|
-
readonly vectorOpsClass: Readonly<Record<VectorDistance, string>> | undefined;
|
|
13
|
-
readonly vectorExtension: string | undefined;
|
|
16
|
+
constructor(options?: DialectOptions);
|
|
14
17
|
}
|
|
15
18
|
//# sourceMappingURL=cockroachDialect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cockroachDialect.d.ts","sourceRoot":"","sources":["../../src/cockroachdb/cockroachDialect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cockroachDialect.d.ts","sourceRoot":"","sources":["../../src/cockroachdb/cockroachDialect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE;;;;;;;;;;GAUG;AACH,qBAAa,gBAAiB,SAAQ,gBAAgB;IACpD,SAAkB,WAAW,iBAAiB;IAE9C,YAAY,OAAO,GAAE,cAAmB,EAQvC;CACF"}
|
|
@@ -1,14 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PgLikeSqlDialect } from '../dialect/pgLikeSqlDialect.js';
|
|
2
2
|
/**
|
|
3
3
|
* CockroachDB Dialect.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Shares AST/quoting/JSONB/full-text-search/vector-search/upsert logic with Postgres via
|
|
5
|
+
* {@link PgLikeSqlDialect} (wire- and SQL-compatible for all of that, including pgvector's
|
|
6
|
+
* `<=>`/`<->`/`<#>` operators, which CockroachDB implements natively). Unlike Postgres, CockroachDB
|
|
7
|
+
* has no `xmax`/`ctid` system columns, so it uses `PgLikeSqlDialect.upsert`'s default as-is (no
|
|
8
|
+
* `created` detection) rather than Postgres's `xmax`-based override; no `vectorExtension` either,
|
|
9
|
+
* since the vector type is native (no `CREATE EXTENSION` needed); and vector indexes use
|
|
10
|
+
* CockroachDB's own `CREATE VECTOR INDEX` syntax (no access-method keyword) rather than pgvector's
|
|
11
|
+
* `CREATE INDEX ... USING ivfflat/hnsw`.
|
|
7
12
|
*/
|
|
8
|
-
export class CockroachDialect extends
|
|
13
|
+
export class CockroachDialect extends PgLikeSqlDialect {
|
|
9
14
|
dialectName = 'cockroachdb';
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
super({
|
|
17
|
+
...options,
|
|
18
|
+
driverCapabilities: {
|
|
19
|
+
vectorIndexStyle: 'native',
|
|
20
|
+
...options.driverCapabilities,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
13
24
|
}
|
|
14
25
|
//# sourceMappingURL=cockroachDialect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cockroachDialect.js","sourceRoot":"","sources":["../../src/cockroachdb/cockroachDialect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cockroachDialect.js","sourceRoot":"","sources":["../../src/cockroachdb/cockroachDialect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE;;;;;;;;;;GAUG;AACH,MAAM,OAAO,gBAAiB,SAAQ,gBAAgB;IAClC,WAAW,GAAG,aAAa,CAAC;IAE9C,YAAY,OAAO,GAAmB,EAAE;QACtC,KAAK,CAAC;YACJ,GAAG,OAAO;YACV,kBAAkB,EAAE;gBAClB,gBAAgB,EAAE,QAAQ;gBAC1B,GAAG,OAAO,CAAC,kBAAkB;aAC9B;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type DialectFeatures, type EntityMeta, type FieldOptions, type JsonUpdateOp, type QueryComparisonOptions, type QueryConflictPaths, type QueryContext, type QueryOptions, type QuerySizeComparisonOps, type QueryVectorSearch, type Type, type VectorDistance } from '../type/index.js';
|
|
2
|
+
import { AbstractSqlDialect } from './abstractSqlDialect.js';
|
|
3
|
+
/**
|
|
4
|
+
* Shared AST/quoting/JSONB/full-text-search/vector-search implementation between Postgres and
|
|
5
|
+
* CockroachDB (wire- and SQL-compatible for everything below, including `to_tsvector`/`to_tsquery`
|
|
6
|
+
* and pgvector's `<=>`/`<->`/`<#>` distance operators, which CockroachDB implements natively).
|
|
7
|
+
* `xmax`-based upsert `created` detection is Postgres-only (CockroachDB has no `xmax`/`ctid`) and
|
|
8
|
+
* stays in {@link PostgresDialect}, along with the `vectorExtension`/`vectorIndexStyle` values that
|
|
9
|
+
* differ (Postgres needs `CREATE EXTENSION vector` and pgvector's `USING ivfflat/hnsw` index
|
|
10
|
+
* syntax; CockroachDB's vector type and `CREATE VECTOR INDEX` syntax are both native).
|
|
11
|
+
*/
|
|
12
|
+
export declare abstract class PgLikeSqlDialect extends AbstractSqlDialect {
|
|
13
|
+
/** Default {@link DialectFeatures} for Postgres-wire dialects. */
|
|
14
|
+
protected readonly featureDefaults: DialectFeatures;
|
|
15
|
+
readonly quoteChar = "\"";
|
|
16
|
+
readonly serialPrimaryKey: string;
|
|
17
|
+
readonly tableOptions = "";
|
|
18
|
+
readonly beginTransactionCommand = "BEGIN";
|
|
19
|
+
readonly commitTransactionCommand = "COMMIT";
|
|
20
|
+
readonly rollbackTransactionCommand = "ROLLBACK";
|
|
21
|
+
readonly alterColumnStrategy = "separate-clauses";
|
|
22
|
+
readonly insertIdSource = "returning";
|
|
23
|
+
readonly maxBindValues: number;
|
|
24
|
+
readonly vectorOpsClass: Readonly<Record<VectorDistance, string>> | undefined;
|
|
25
|
+
normalizeValue(value: unknown): unknown;
|
|
26
|
+
placeholder(index: number): string;
|
|
27
|
+
insert<E>(ctx: QueryContext, entity: Type<E>, payload: E | E[], opts?: QueryOptions): void;
|
|
28
|
+
upsert<E>(ctx: QueryContext, entity: Type<E>, conflictPaths: QueryConflictPaths<E>, payload: E | E[]): void;
|
|
29
|
+
/**
|
|
30
|
+
* Shared `INSERT ... ON CONFLICT (...) DO UPDATE/NOTHING RETURNING ...` builder, mirroring
|
|
31
|
+
* {@link AbstractSqlDialect.onConflictUpsert}'s "assemble everything, don't hand back fragments"
|
|
32
|
+
* shape for the `$N`-placeholder Postgres-wire dialects. `extraReturning` lets {@link PostgresDialect}
|
|
33
|
+
* append `(xmax = 0) AS "_created"` to detect insert-vs-update; CockroachDB has no `xmax`/`ctid`
|
|
34
|
+
* system columns, so it uses the default (empty) and `created` stays `undefined` in the result.
|
|
35
|
+
*/
|
|
36
|
+
protected buildUpsertOnConflict<E>(ctx: QueryContext, entity: Type<E>, conflictPaths: QueryConflictPaths<E>, payload: E | E[], extraReturning?: string): void;
|
|
37
|
+
/** Full-text search: both dialects support `to_tsvector(...) @@ to_tsquery(...)`. */
|
|
38
|
+
compare<E>(ctx: QueryContext, entity: Type<E>, key: string, val: unknown, opts?: QueryComparisonOptions): void;
|
|
39
|
+
protected jsonAll(ctx: QueryContext, jsonField: string, value: unknown): string;
|
|
40
|
+
protected jsonSize(ctx: QueryContext, jsonField: string, value: number | QuerySizeComparisonOps): string;
|
|
41
|
+
protected jsonElemMatch(ctx: QueryContext, jsonField: string, match: Record<string, unknown>): string;
|
|
42
|
+
protected get regexpOp(): string;
|
|
43
|
+
protected ilikeExpr(f: string, ph: string): string;
|
|
44
|
+
protected get neOp(): string;
|
|
45
|
+
protected formatIn(ctx: QueryContext, values: unknown[], negate: boolean): string;
|
|
46
|
+
protected numericCast(expr: string): string;
|
|
47
|
+
protected formatPersistableValue<E>(ctx: QueryContext, field: FieldOptions, value: unknown): void;
|
|
48
|
+
protected formatJsonUpdate<E>(ctx: QueryContext, escapedCol: string, value: JsonUpdateOp<E>): void;
|
|
49
|
+
/**
|
|
50
|
+
* Helper to add a JSON value to context with appropriate stringification and cast.
|
|
51
|
+
*/
|
|
52
|
+
private jsonVal;
|
|
53
|
+
escape(value: unknown): string;
|
|
54
|
+
/** pgvector distance operators (also implemented natively by CockroachDB). */
|
|
55
|
+
private static readonly VECTOR_OPS;
|
|
56
|
+
/** Emit a pgvector-style distance expression: `"col" <op> $N::<vectorType>`. */
|
|
57
|
+
protected appendVectorSort<E>(ctx: QueryContext, meta: EntityMeta<E>, key: string, search: QueryVectorSearch): void;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=pgLikeSqlDialect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgLikeSqlDialect.d.ts","sourceRoot":"","sources":["../../src/dialect/pgLikeSqlDialect.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,YAAY,EAEjB,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,YAAY,EAEjB,KAAK,sBAAsB,EAE3B,KAAK,iBAAiB,EACtB,KAAK,IAAI,EACT,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D;;;;;;;;GAQG;AACH,8BAAsB,gBAAiB,SAAQ,kBAAkB;IAC/D,kEAAkE;IAClE,mBAA4B,eAAe,EAAE,eAAe,CAc1D;IAEF,SAAkB,SAAS,QAAO;IAKlC,SAAkB,gBAAgB,EAAE,MAAM,CAAyD;IACnG,SAAkB,YAAY,MAAM;IACpC,SAAkB,uBAAuB,WAAW;IACpD,SAAkB,wBAAwB,YAAY;IACtD,SAAkB,0BAA0B,cAAc;IAC1D,SAAkB,mBAAmB,sBAAsB;IAC3D,SAAkB,cAAc,eAAe;IAC/C,SAAkB,aAAa,EAAE,MAAM,CAAS;IAEhD,SAAkB,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAMpF;IAEO,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAK/C;IAEQ,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1C;IAEQ,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,CAGlG;IAEQ,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAEnH;IAED;;;;;;OAMG;IACH,SAAS,CAAC,qBAAqB,CAAC,CAAC,EAC/B,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EACf,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC,EACpC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAChB,cAAc,SAAK,GAClB,IAAI,CAON;IAED,qFAAqF;IAC5E,OAAO,CAAC,CAAC,EAChB,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EACf,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,OAAO,EACZ,IAAI,GAAE,sBAA2B,GAChC,IAAI,CAiBN;IAED,UAAmB,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAEvF;IAED,UAAmB,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,sBAAsB,GAAG,MAAM,CAKhH;IAED,UAAmB,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA0B7G;IAED,cAAuB,QAAQ,IAAI,MAAM,CAExC;IAED,UAAmB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE1D;IAED,cAAuB,IAAI,IAAI,MAAM,CAEpC;IAED,UAAmB,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAIzF;IAED,UAAmB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;IAED,UAAmB,sBAAsB,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAezG;IAED,UAAmB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAqB1G;IAED;;OAEG;IACH,OAAO,CAAC,OAAO;IASN,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtC;IAED,8EAA8E;IAC9E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAMhC;IAEF,gFAAgF;IAChF,UAAmB,gBAAgB,CAAC,CAAC,EACnC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EACnB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,iBAAiB,GACxB,IAAI,CAMN;CACF"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { getMeta } from '../entity/index.js';
|
|
2
|
+
import { QueryRaw, } from '../type/index.js';
|
|
3
|
+
import { escapeAnsiSqlLiteral } from '../util/ansiSqlLiteral.js';
|
|
4
|
+
import { hasKeys, isJsonType } from '../util/index.js';
|
|
5
|
+
import { AbstractSqlDialect } from './abstractSqlDialect.js';
|
|
6
|
+
import { buildElemMatchConditions } from './jsonArrayElemMatchUtils.js';
|
|
7
|
+
/**
|
|
8
|
+
* Shared AST/quoting/JSONB/full-text-search/vector-search implementation between Postgres and
|
|
9
|
+
* CockroachDB (wire- and SQL-compatible for everything below, including `to_tsvector`/`to_tsquery`
|
|
10
|
+
* and pgvector's `<=>`/`<->`/`<#>` distance operators, which CockroachDB implements natively).
|
|
11
|
+
* `xmax`-based upsert `created` detection is Postgres-only (CockroachDB has no `xmax`/`ctid`) and
|
|
12
|
+
* stays in {@link PostgresDialect}, along with the `vectorExtension`/`vectorIndexStyle` values that
|
|
13
|
+
* differ (Postgres needs `CREATE EXTENSION vector` and pgvector's `USING ivfflat/hnsw` index
|
|
14
|
+
* syntax; CockroachDB's vector type and `CREATE VECTOR INDEX` syntax are both native).
|
|
15
|
+
*/
|
|
16
|
+
export class PgLikeSqlDialect extends AbstractSqlDialect {
|
|
17
|
+
/** Default {@link DialectFeatures} for Postgres-wire dialects. */
|
|
18
|
+
featureDefaults = {
|
|
19
|
+
explicitJsonCast: false,
|
|
20
|
+
nativeArrays: true,
|
|
21
|
+
supportsJsonb: true,
|
|
22
|
+
ifNotExists: true,
|
|
23
|
+
indexIfNotExists: true,
|
|
24
|
+
dropTableCascade: true,
|
|
25
|
+
renameColumn: true,
|
|
26
|
+
foreignKeyAlter: true,
|
|
27
|
+
columnComment: false,
|
|
28
|
+
vectorIndexStyle: 'create',
|
|
29
|
+
vectorSupportsLength: true,
|
|
30
|
+
supportsTimestamptz: true,
|
|
31
|
+
defaultStringAsText: true,
|
|
32
|
+
};
|
|
33
|
+
quoteChar = '"';
|
|
34
|
+
// Shared default for both dialects. CockroachDB docs flag sequential PKs as a hotspotting risk
|
|
35
|
+
// under heavy concurrent insert load (writes concentrate on one range); this default still beats
|
|
36
|
+
// `SERIAL` (CockroachDB's `unique_rowid()`, a ~64-bit value that overflows JS's safe-integer
|
|
37
|
+
// range). High-throughput CockroachDB users should override this per-entity with a UUID PK.
|
|
38
|
+
serialPrimaryKey = 'BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY';
|
|
39
|
+
tableOptions = '';
|
|
40
|
+
beginTransactionCommand = 'BEGIN';
|
|
41
|
+
commitTransactionCommand = 'COMMIT';
|
|
42
|
+
rollbackTransactionCommand = 'ROLLBACK';
|
|
43
|
+
alterColumnStrategy = 'separate-clauses';
|
|
44
|
+
insertIdSource = 'returning';
|
|
45
|
+
maxBindValues = 65535;
|
|
46
|
+
vectorOpsClass = {
|
|
47
|
+
cosine: 'vector_cosine_ops',
|
|
48
|
+
l2: 'vector_l2_ops',
|
|
49
|
+
inner: 'vector_ip_ops',
|
|
50
|
+
l1: 'vector_l1_ops',
|
|
51
|
+
hamming: 'bit_hamming_ops',
|
|
52
|
+
};
|
|
53
|
+
normalizeValue(value) {
|
|
54
|
+
if (value != null && typeof value === 'object' && Array.isArray(value)) {
|
|
55
|
+
return this.features.nativeArrays ? value : toPgArray(value);
|
|
56
|
+
}
|
|
57
|
+
return super.normalizeValue(value);
|
|
58
|
+
}
|
|
59
|
+
placeholder(index) {
|
|
60
|
+
return `$${index}`;
|
|
61
|
+
}
|
|
62
|
+
insert(ctx, entity, payload, opts) {
|
|
63
|
+
super.insert(ctx, entity, payload, opts);
|
|
64
|
+
ctx.append(' ' + this.returningId(entity));
|
|
65
|
+
}
|
|
66
|
+
upsert(ctx, entity, conflictPaths, payload) {
|
|
67
|
+
this.buildUpsertOnConflict(ctx, entity, conflictPaths, payload);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Shared `INSERT ... ON CONFLICT (...) DO UPDATE/NOTHING RETURNING ...` builder, mirroring
|
|
71
|
+
* {@link AbstractSqlDialect.onConflictUpsert}'s "assemble everything, don't hand back fragments"
|
|
72
|
+
* shape for the `$N`-placeholder Postgres-wire dialects. `extraReturning` lets {@link PostgresDialect}
|
|
73
|
+
* append `(xmax = 0) AS "_created"` to detect insert-vs-update; CockroachDB has no `xmax`/`ctid`
|
|
74
|
+
* system columns, so it uses the default (empty) and `created` stays `undefined` in the result.
|
|
75
|
+
*/
|
|
76
|
+
buildUpsertOnConflict(ctx, entity, conflictPaths, payload, extraReturning = '') {
|
|
77
|
+
const meta = getMeta(entity);
|
|
78
|
+
const update = this.getUpsertUpdateAssignments(ctx, meta, conflictPaths, payload, (name) => `EXCLUDED.${name}`);
|
|
79
|
+
const keysStr = this.getUpsertConflictPathsStr(meta, conflictPaths);
|
|
80
|
+
const onConflict = update ? `DO UPDATE SET ${update}` : 'DO NOTHING';
|
|
81
|
+
super.insert(ctx, entity, payload);
|
|
82
|
+
ctx.append(` ON CONFLICT (${keysStr}) ${onConflict} ${this.returningId(entity)}${extraReturning}`);
|
|
83
|
+
}
|
|
84
|
+
/** Full-text search: both dialects support `to_tsvector(...) @@ to_tsquery(...)`. */
|
|
85
|
+
compare(ctx, entity, key, val, opts = {}) {
|
|
86
|
+
if (key === '$text') {
|
|
87
|
+
const meta = getMeta(entity);
|
|
88
|
+
const search = val;
|
|
89
|
+
const fields = (search.$fields ?? [])
|
|
90
|
+
.map((fKey) => {
|
|
91
|
+
const field = meta.fields[fKey];
|
|
92
|
+
const columnName = this.resolveColumnName(fKey, field);
|
|
93
|
+
return this.escapeId(columnName);
|
|
94
|
+
})
|
|
95
|
+
.join(` || ' ' || `);
|
|
96
|
+
ctx.append(`to_tsvector(${fields}) @@ to_tsquery(`);
|
|
97
|
+
ctx.addValue(search.$value);
|
|
98
|
+
ctx.append(')');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
super.compare(ctx, entity, key, val, opts);
|
|
102
|
+
}
|
|
103
|
+
jsonAll(ctx, jsonField, value) {
|
|
104
|
+
return `${jsonField} @> ${this.jsonVal(ctx, value)}`;
|
|
105
|
+
}
|
|
106
|
+
jsonSize(ctx, jsonField, value) {
|
|
107
|
+
const tmpCtx = this.createContext();
|
|
108
|
+
this.buildSizeComparison(tmpCtx, () => tmpCtx.append(`jsonb_array_length(${jsonField})`), value);
|
|
109
|
+
ctx.pushValue(...tmpCtx.values);
|
|
110
|
+
return tmpCtx.sql;
|
|
111
|
+
}
|
|
112
|
+
jsonElemMatch(ctx, jsonField, match) {
|
|
113
|
+
// Primitive element match: keys are operators (e.g. { $startsWith: 'ad' } on a string[])
|
|
114
|
+
const isPrimitiveElement = Object.keys(match).some((k) => k.startsWith('$'));
|
|
115
|
+
if (isPrimitiveElement) {
|
|
116
|
+
const conditions = Object.entries(match).map(([op, opVal]) => this.buildJsonFieldCondition(ctx, () => 'elem', '', op, opVal));
|
|
117
|
+
return `EXISTS (SELECT 1 FROM jsonb_array_elements_text(${jsonField}) AS elem WHERE ${conditions.join(' AND ')})`;
|
|
118
|
+
}
|
|
119
|
+
const hasOperators = Object.values(match).some((v) => v && typeof v === 'object' && !Array.isArray(v) && Object.keys(v).some((k) => k.startsWith('$')));
|
|
120
|
+
if (!hasOperators) {
|
|
121
|
+
return `${jsonField} @> ${this.jsonVal(ctx, [match])}`;
|
|
122
|
+
}
|
|
123
|
+
const conditions = buildElemMatchConditions(match, (field, op, opVal) => this.buildJsonFieldCondition(ctx, (f) => `elem->>'${this.escapeJsonKey(f)}'`, field, op, opVal), (field, val) => `elem->>'${this.escapeJsonKey(field)}' = ${this.addValue(ctx.values, val)}`);
|
|
124
|
+
return `EXISTS (SELECT 1 FROM jsonb_array_elements(${jsonField}) AS elem WHERE ${conditions.join(' AND ')})`;
|
|
125
|
+
}
|
|
126
|
+
get regexpOp() {
|
|
127
|
+
return '~';
|
|
128
|
+
}
|
|
129
|
+
ilikeExpr(f, ph) {
|
|
130
|
+
return `${f} ILIKE ${ph}`;
|
|
131
|
+
}
|
|
132
|
+
get neOp() {
|
|
133
|
+
return 'IS DISTINCT FROM';
|
|
134
|
+
}
|
|
135
|
+
formatIn(ctx, values, negate) {
|
|
136
|
+
if (values.length === 0)
|
|
137
|
+
return negate ? ' NOT IN (NULL)' : ' IN (NULL)';
|
|
138
|
+
const ph = this.addValue(ctx.values, values);
|
|
139
|
+
return negate ? ` <> ALL(${ph})` : ` = ANY(${ph})`;
|
|
140
|
+
}
|
|
141
|
+
numericCast(expr) {
|
|
142
|
+
return `(${expr})::numeric`;
|
|
143
|
+
}
|
|
144
|
+
formatPersistableValue(ctx, field, value) {
|
|
145
|
+
if (value instanceof QueryRaw) {
|
|
146
|
+
super.formatPersistableValue(ctx, field, value);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (isJsonType(field.type)) {
|
|
150
|
+
ctx.append(this.jsonVal(ctx, value, field.type));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (field.type === 'vector' && Array.isArray(value)) {
|
|
154
|
+
ctx.addValue(`[${value.join(',')}]`);
|
|
155
|
+
ctx.append('::vector');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
super.formatPersistableValue(ctx, field, value);
|
|
159
|
+
}
|
|
160
|
+
formatJsonUpdate(ctx, escapedCol, value) {
|
|
161
|
+
let expr = escapedCol;
|
|
162
|
+
if (hasKeys(value.$merge)) {
|
|
163
|
+
expr = `COALESCE(${escapedCol}, '{}'::jsonb) || ${this.jsonVal(ctx, value.$merge)}`;
|
|
164
|
+
}
|
|
165
|
+
if (hasKeys(value.$push)) {
|
|
166
|
+
const push = value.$push;
|
|
167
|
+
for (const [key, v] of Object.entries(push)) {
|
|
168
|
+
const currentExpr = expr;
|
|
169
|
+
const ph = this.jsonVal(ctx, v);
|
|
170
|
+
expr = `jsonb_set(${currentExpr}, '{${this.escapeJsonKey(key)}}', COALESCE((${currentExpr})->'${this.escapeJsonKey(key)}', '[]'::jsonb) || jsonb_build_array(${ph}))`;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (value.$unset?.length) {
|
|
174
|
+
for (const key of value.$unset) {
|
|
175
|
+
expr = `(${expr}) - '${this.escapeJsonKey(key)}'`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
ctx.append(`${escapedCol} = ${expr}`);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Helper to add a JSON value to context with appropriate stringification and cast.
|
|
182
|
+
*/
|
|
183
|
+
jsonVal(ctx, value, type = 'jsonb') {
|
|
184
|
+
if (value instanceof QueryRaw)
|
|
185
|
+
return this.addValue(ctx.values, value);
|
|
186
|
+
if (value == null)
|
|
187
|
+
return `${this.addValue(ctx.values, null)}::${type}`;
|
|
188
|
+
const json = JSON.stringify(value);
|
|
189
|
+
const ph = this.addValue(ctx.values, json);
|
|
190
|
+
return this.features.explicitJsonCast ? `(${ph}::text)::${type}` : `${ph}::${type}`;
|
|
191
|
+
}
|
|
192
|
+
escape(value) {
|
|
193
|
+
return escapeAnsiSqlLiteral(value);
|
|
194
|
+
}
|
|
195
|
+
/** pgvector distance operators (also implemented natively by CockroachDB). */
|
|
196
|
+
static VECTOR_OPS = {
|
|
197
|
+
cosine: '<=>',
|
|
198
|
+
l2: '<->',
|
|
199
|
+
inner: '<#>',
|
|
200
|
+
l1: '<+>',
|
|
201
|
+
hamming: '<~>',
|
|
202
|
+
};
|
|
203
|
+
/** Emit a pgvector-style distance expression: `"col" <op> $N::<vectorType>`. */
|
|
204
|
+
appendVectorSort(ctx, meta, key, search) {
|
|
205
|
+
const { colName, distance, vectorCast } = this.resolveVectorSortParams(meta, key, search);
|
|
206
|
+
const op = PgLikeSqlDialect.VECTOR_OPS[distance];
|
|
207
|
+
ctx.append(`${this.escapeId(colName)} ${op} `);
|
|
208
|
+
ctx.addValue(`[${search.$vector.join(',')}]`);
|
|
209
|
+
ctx.append(`::${vectorCast}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Converts a JS array to a Postgres array literal string: `{"val1","val2"}`.
|
|
214
|
+
* Safely handles nesting and escaping of special characters.
|
|
215
|
+
*/
|
|
216
|
+
function toPgArray(arr) {
|
|
217
|
+
const elements = arr.map((val) => {
|
|
218
|
+
if (val == null)
|
|
219
|
+
return 'NULL';
|
|
220
|
+
if (Array.isArray(val))
|
|
221
|
+
return toPgArray(val);
|
|
222
|
+
if (typeof val === 'boolean')
|
|
223
|
+
return val ? 'true' : 'false';
|
|
224
|
+
if (val instanceof Uint8Array || (typeof Buffer !== 'undefined' && Buffer.isBuffer(val))) {
|
|
225
|
+
const hex = Array.from(val)
|
|
226
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
227
|
+
.join('');
|
|
228
|
+
return `"\\\\x${hex}"`;
|
|
229
|
+
}
|
|
230
|
+
const str = String(val);
|
|
231
|
+
const escaped = str.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
232
|
+
return `"${escaped}"`;
|
|
233
|
+
});
|
|
234
|
+
return `{${elements.join(',')}}`;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=pgLikeSqlDialect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgLikeSqlDialect.js","sourceRoot":"","sources":["../../src/dialect/pgLikeSqlDialect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { defineIndex } from '../metadata/definition.js';
|
|
2
2
|
/**
|
|
3
3
|
* Define a composite index on an entity class.
|
|
4
4
|
*
|
|
@@ -21,7 +21,7 @@ import { appendEntityIndex, ensureMeta } from '../metadata/definition.js';
|
|
|
21
21
|
*/
|
|
22
22
|
export function Index(columns, options = {}) {
|
|
23
23
|
return (target) => {
|
|
24
|
-
|
|
24
|
+
defineIndex(target, { ...options, columns });
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
27
|
//# sourceMappingURL=index-decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-decorator.js","sourceRoot":"","sources":["../../../src/entity/decorator/index-decorator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index-decorator.js","sourceRoot":"","sources":["../../../src/entity/decorator/index-decorator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAgBxD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,KAAK,CAAI,OAAiB,EAAE,OAAO,GAA0B,EAAE;IAC7E,OAAO,CAAC,MAAe,EAAQ,EAAE;QAC/B,WAAW,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { defineEntity, defineField, defineFilter, defineHook, defineId, defineRelation, getEntities, getMeta, } from '../metadata/definition.js';
|
|
1
|
+
export { defineEntity, defineField, defineFilter, defineHook, defineId, defineIndex, defineRelation, getEntities, getMeta, } from '../metadata/definition.js';
|
|
2
2
|
export * from './entity.js';
|
|
3
3
|
export * from './field.js';
|
|
4
4
|
export * from './filter.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/entity/decorator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,cAAc,EACd,WAAW,EACX,OAAO,GACR,MAAM,2BAA2B,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/entity/decorator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,EACX,cAAc,EACd,WAAW,EACX,OAAO,GACR,MAAM,2BAA2B,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { defineEntity, defineField, defineFilter, defineHook, defineId, defineRelation, getEntities, getMeta, } from '../metadata/definition.js';
|
|
1
|
+
export { defineEntity, defineField, defineFilter, defineHook, defineId, defineIndex, defineRelation, getEntities, getMeta, } from '../metadata/definition.js';
|
|
2
2
|
export * from './entity.js';
|
|
3
3
|
export * from './field.js';
|
|
4
4
|
export * from './filter.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/entity/decorator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,cAAc,EACd,WAAW,EACX,OAAO,GACR,MAAM,2BAA2B,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/entity/decorator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,EACX,cAAc,EACd,WAAW,EACX,OAAO,GACR,MAAM,2BAA2B,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC"}
|
|
@@ -8,6 +8,7 @@ export declare function defineField<E>(entity: Type<E>, key: string, opts?: Fiel
|
|
|
8
8
|
export declare function defineId<E>(entity: Type<E>, key: string, opts: FieldOptions): EntityMeta<E>;
|
|
9
9
|
export declare function defineRelation<E>(entity: Type<E>, key: string, opts: RelationOptions<E>): EntityMeta<E>;
|
|
10
10
|
export declare function defineHook<E>(entity: Type<E>, methodName: string, event: HookEvent): EntityMeta<E>;
|
|
11
|
+
export declare function defineIndex<E>(entity: Type<E>, index: EntityIndexMeta): EntityMeta<E>;
|
|
11
12
|
export declare function defineFilter<E>(entity: Type<E>, name: string, opts: FilterOptions<E>): EntityMeta<E>;
|
|
12
13
|
export declare function defineEntity<E>(entity: Type<E>, opts?: EntityOptions<E>): EntityMeta<E>;
|
|
13
14
|
export declare function getEntities(): Type<unknown>[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../../src/entity/metadata/definition.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,aAAa,EAEb,YAAY,EAEZ,aAAa,EACb,SAAS,EAMT,eAAe,EACf,IAAI,EACL,MAAM,qBAAqB,CAAC;AAe7B;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAGtF;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,UAAU,CAAC,CAAC,CAAC,CAUnG;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAQ3F;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAWvG;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAMlG;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAapG;AAyDD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,GAAE,aAAa,CAAC,CAAC,CAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CA0C3F;AAED,wBAAgB,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAO7C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAQ5D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAUzD;AAsLD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,CAUtE"}
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../../src/entity/metadata/definition.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,aAAa,EAEb,YAAY,EAEZ,aAAa,EACb,SAAS,EAMT,eAAe,EACf,IAAI,EACL,MAAM,qBAAqB,CAAC;AAe7B;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAGtF;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,UAAU,CAAC,CAAC,CAAC,CAUnG;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAQ3F;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAWvG;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAMlG;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,CAIrF;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAapG;AAyDD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,GAAE,aAAa,CAAC,CAAC,CAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CA0C3F;AAED,wBAAgB,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAO7C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAQ5D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAUzD;AAsLD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,CAUtE"}
|
|
@@ -58,6 +58,11 @@ export function defineHook(entity, methodName, event) {
|
|
|
58
58
|
meta.hooks[event].push({ methodName });
|
|
59
59
|
return meta;
|
|
60
60
|
}
|
|
61
|
+
export function defineIndex(entity, index) {
|
|
62
|
+
const meta = ensureMeta(entity);
|
|
63
|
+
appendEntityIndex(meta, index);
|
|
64
|
+
return meta;
|
|
65
|
+
}
|
|
61
66
|
export function defineFilter(entity, name, opts) {
|
|
62
67
|
const meta = ensureMeta(entity);
|
|
63
68
|
if (name === 'softDelete') {
|