uql-orm 0.19.0 → 0.20.1
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 +66 -0
- package/README.md +1 -1
- package/dist/browser/uql-browser.min.js +2 -2
- package/dist/browser/uql-browser.min.js.map +3 -3
- package/dist/bunSql/bunSqlCockroachDialect.d.ts +1 -1
- package/dist/bunSql/bunSqlCockroachDialect.js +1 -1
- package/dist/dialect/abstractSqlDialect.d.ts +130 -58
- package/dist/dialect/abstractSqlDialect.d.ts.map +1 -1
- package/dist/dialect/abstractSqlDialect.js +226 -178
- package/dist/dialect/abstractSqlDialect.js.map +1 -1
- package/dist/dialect/jsonArrayElemMatchUtils.d.ts +5 -6
- package/dist/dialect/jsonArrayElemMatchUtils.d.ts.map +1 -1
- package/dist/dialect/jsonArrayElemMatchUtils.js +9 -19
- package/dist/dialect/jsonArrayElemMatchUtils.js.map +1 -1
- package/dist/dialect/jsonSql.d.ts +44 -0
- package/dist/dialect/jsonSql.d.ts.map +1 -0
- package/dist/dialect/jsonSql.js +57 -0
- package/dist/dialect/jsonSql.js.map +1 -0
- package/dist/dialect/mysqlLikeSqlDialect.d.ts +42 -2
- package/dist/dialect/mysqlLikeSqlDialect.d.ts.map +1 -1
- package/dist/dialect/mysqlLikeSqlDialect.js +73 -22
- package/dist/dialect/mysqlLikeSqlDialect.js.map +1 -1
- package/dist/dialect/pgLikeSqlDialect.d.ts +28 -10
- package/dist/dialect/pgLikeSqlDialect.d.ts.map +1 -1
- package/dist/dialect/pgLikeSqlDialect.js +56 -49
- package/dist/dialect/pgLikeSqlDialect.js.map +1 -1
- package/dist/dialect/queryContext.d.ts +13 -1
- package/dist/dialect/queryContext.d.ts.map +1 -1
- package/dist/dialect/queryContext.js +17 -2
- package/dist/dialect/queryContext.js.map +1 -1
- package/dist/dialect/vectorSqlDialect.d.ts +54 -0
- package/dist/dialect/vectorSqlDialect.d.ts.map +1 -0
- package/dist/dialect/vectorSqlDialect.js +70 -0
- package/dist/dialect/vectorSqlDialect.js.map +1 -0
- package/dist/entity/decorator/index-decorator.d.ts +6 -13
- package/dist/entity/decorator/index-decorator.d.ts.map +1 -1
- package/dist/entity/decorator/index-decorator.js.map +1 -1
- package/dist/http/handler.d.ts +5 -1
- package/dist/http/handler.d.ts.map +1 -1
- package/dist/http/handler.js.map +1 -1
- package/dist/maria/mariaDialect.d.ts +15 -4
- package/dist/maria/mariaDialect.d.ts.map +1 -1
- package/dist/maria/mariaDialect.js +25 -13
- package/dist/maria/mariaDialect.js.map +1 -1
- package/dist/migrate/generator/mongoSchemaGenerator.d.ts +1 -1
- package/dist/migrate/generator/mongoSchemaGenerator.d.ts.map +1 -1
- package/dist/mongo/mongoDialect.d.ts +27 -6
- package/dist/mongo/mongoDialect.d.ts.map +1 -1
- package/dist/mongo/mongoDialect.js +107 -14
- package/dist/mongo/mongoDialect.js.map +1 -1
- package/dist/mongo/mongodbQuerier.d.ts.map +1 -1
- package/dist/mongo/mongodbQuerier.js +5 -4
- package/dist/mongo/mongodbQuerier.js.map +1 -1
- package/dist/mysql/mysqlDialect.d.ts +0 -1
- package/dist/mysql/mysqlDialect.d.ts.map +1 -1
- package/dist/mysql/mysqlDialect.js +0 -1
- package/dist/mysql/mysqlDialect.js.map +1 -1
- package/dist/postgres/postgresWireDriverCapabilities.d.ts +1 -1
- package/dist/postgres/postgresWireDriverCapabilities.js +1 -1
- package/dist/schema/schemaAST.d.ts.map +1 -1
- package/dist/schema/schemaAST.js +7 -19
- package/dist/schema/schemaAST.js.map +1 -1
- package/dist/schema/types.d.ts +1 -1
- package/dist/sqlite/sqliteDialect.d.ts +28 -8
- package/dist/sqlite/sqliteDialect.d.ts.map +1 -1
- package/dist/sqlite/sqliteDialect.js +65 -80
- package/dist/sqlite/sqliteDialect.js.map +1 -1
- package/dist/type/dialect.d.ts +199 -0
- package/dist/type/dialect.d.ts.map +1 -0
- package/dist/type/dialect.js +2 -0
- package/dist/type/dialect.js.map +1 -0
- package/dist/type/entity.d.ts +64 -43
- package/dist/type/entity.d.ts.map +1 -1
- package/dist/type/entity.js.map +1 -1
- package/dist/type/index.d.ts +5 -0
- package/dist/type/index.d.ts.map +1 -1
- package/dist/type/index.js +5 -0
- package/dist/type/index.js.map +1 -1
- package/dist/type/querier.d.ts +3 -5
- package/dist/type/querier.d.ts.map +1 -1
- package/dist/type/querier.js.map +1 -1
- package/dist/type/query.d.ts +5 -711
- package/dist/type/query.d.ts.map +1 -1
- package/dist/type/query.js +1 -51
- package/dist/type/query.js.map +1 -1
- package/dist/type/queryAggregate.d.ts +191 -0
- package/dist/type/queryAggregate.d.ts.map +1 -0
- package/dist/type/queryAggregate.js +39 -0
- package/dist/type/queryAggregate.js.map +1 -0
- package/dist/type/queryRaw.d.ts +35 -0
- package/dist/type/queryRaw.d.ts.map +1 -0
- package/dist/type/queryRaw.js +11 -0
- package/dist/type/queryRaw.js.map +1 -0
- package/dist/type/queryWhere.d.ts +271 -0
- package/dist/type/queryWhere.d.ts.map +1 -0
- package/dist/type/queryWhere.js +2 -0
- package/dist/type/queryWhere.js.map +1 -0
- package/dist/type/universalQuerier.d.ts +2 -1
- package/dist/type/universalQuerier.d.ts.map +1 -1
- package/dist/type/utility.d.ts +8 -1
- package/dist/type/utility.d.ts.map +1 -1
- package/dist/type/vector.d.ts +55 -0
- package/dist/type/vector.d.ts.map +1 -0
- package/dist/type/vector.js +2 -0
- package/dist/type/vector.js.map +1 -0
- package/dist/util/ansiSqlLiteral.d.ts +2 -0
- package/dist/util/ansiSqlLiteral.d.ts.map +1 -1
- package/dist/util/ansiSqlLiteral.js +5 -1
- package/dist/util/ansiSqlLiteral.js.map +1 -1
- package/dist/util/dialect.util.d.ts +5 -5
- package/dist/util/dialect.util.d.ts.map +1 -1
- package/dist/util/dialect.util.js +15 -10
- package/dist/util/dialect.util.js.map +1 -1
- package/dist/util/object.util.d.ts +12 -1
- package/dist/util/object.util.d.ts.map +1 -1
- package/dist/util/object.util.js +18 -0
- package/dist/util/object.util.js.map +1 -1
- package/dist/util/relationQuery.util.js +1 -1
- package/dist/util/relationQuery.util.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { resolveVectorCast } from '../schema/canonicalType.js';
|
|
2
|
+
import { AbstractDialect } from './abstractDialect.js';
|
|
3
|
+
/**
|
|
4
|
+
* Vector similarity search for SQL dialects: the `ORDER BY <distance>` expression, its projection as
|
|
5
|
+
* a named score, and the index metadata the schema generator reads.
|
|
6
|
+
*
|
|
7
|
+
* A layer of its own because it is nearly self-contained - it needs only `escapeId` from the SQL
|
|
8
|
+
* dialect above it - unlike the JSON operators, which are woven into the generic comparison
|
|
9
|
+
* machinery (`neExpr`, `numericCast`, `formatIn`, ...) and belong with it.
|
|
10
|
+
*
|
|
11
|
+
* Two shapes exist across dialects: an operator (`"col" <=> $1`, Postgres/CockroachDB) or a function
|
|
12
|
+
* call (`VEC_DISTANCE_COSINE(col, ?)`, MariaDB/SQLite). Dialects pick one by either overriding
|
|
13
|
+
* {@link appendVectorSort} or filling {@link vectorDistanceFns}.
|
|
14
|
+
*/
|
|
15
|
+
export class VectorSqlDialect extends AbstractDialect {
|
|
16
|
+
/** Vector index operator classes, keyed by distance metric. Partial: not every dialect supports every metric. */
|
|
17
|
+
vectorOpsClass = undefined;
|
|
18
|
+
vectorExtension = undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Mapping of UQL vector distance metrics to native SQL functions.
|
|
21
|
+
* Override in dialects that use function-call syntax (e.g. SQLite, MariaDB).
|
|
22
|
+
* Dialects with operator-based syntax (e.g. Postgres) leave this empty and override `appendVectorSort` directly.
|
|
23
|
+
*/
|
|
24
|
+
vectorDistanceFns = new Map();
|
|
25
|
+
/**
|
|
26
|
+
* Resolve common parameters for a vector similarity ORDER BY expression.
|
|
27
|
+
* Shared by all dialect overrides of `appendVectorSort`.
|
|
28
|
+
*/
|
|
29
|
+
resolveVectorSortParams(meta, key, search) {
|
|
30
|
+
const field = meta.fields[key];
|
|
31
|
+
const colName = this.resolveColumnName(key, field);
|
|
32
|
+
const distance = search.$distance ?? field?.distance ?? 'cosine';
|
|
33
|
+
const vectorCast = resolveVectorCast(field);
|
|
34
|
+
return { colName, distance, field, vectorCast };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Append a vector similarity function call: `fn(col, ?)`.
|
|
38
|
+
* Used by dialects that express vector distance via SQL functions (SQLite, MariaDB).
|
|
39
|
+
*/
|
|
40
|
+
appendFunctionVectorSort(ctx, meta, key, search) {
|
|
41
|
+
const { colName, distance } = this.resolveVectorSortParams(meta, key, search);
|
|
42
|
+
const fn = this.vectorDistanceFns.get(distance);
|
|
43
|
+
if (!fn) {
|
|
44
|
+
throw Error(`${this.dialectName} does not support vector distance metric: ${distance}`);
|
|
45
|
+
}
|
|
46
|
+
ctx.append(`${fn}(${this.escapeId(colName)}, `);
|
|
47
|
+
ctx.addValue(`[${search.$vector.join(',')}]`);
|
|
48
|
+
ctx.append(')');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Append a vector distance projection.
|
|
52
|
+
* Delegates to `appendVectorSort` so each dialect's distance syntax is written once.
|
|
53
|
+
*/
|
|
54
|
+
appendVectorProjection(ctx, meta, key, search) {
|
|
55
|
+
this.appendVectorSort(ctx, meta, key, search);
|
|
56
|
+
ctx.append(` AS ${this.escapeId(search.$project)}`);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Append a vector similarity expression for `ORDER BY`.
|
|
60
|
+
* Default: auto-delegates to `appendFunctionVectorSort` when `vectorDistanceFns` has entries.
|
|
61
|
+
*/
|
|
62
|
+
appendVectorSort(ctx, meta, key, search) {
|
|
63
|
+
if (this.vectorDistanceFns.size > 0) {
|
|
64
|
+
this.appendFunctionVectorSort(ctx, meta, key, search);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
throw new TypeError('Vector similarity sort is not supported by this dialect. Use raw() for vector queries.');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=vectorSqlDialect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorSqlDialect.js","sourceRoot":"","sources":["../../src/dialect/vectorSqlDialect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAmB,MAAM,4BAA4B,CAAC;AAShF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;;;;;;;GAWG;AACH,MAAM,OAAgB,gBAAiB,SAAQ,eAAe;IAC5D,iHAAiH;IACxG,cAAc,GAAoD,SAAS,CAAC;IAE5E,eAAe,GAAuB,SAAS,CAAC;IAEzD;;;;OAIG;IACgB,iBAAiB,GAAwC,IAAI,GAAG,EAAE,CAAC;IAKtF;;;OAGG;IACO,uBAAuB,CAC/B,IAAmB,EACnB,GAAW,EACX,MAAyB;QAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAkB,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,EAAE,QAAQ,IAAI,QAAQ,CAAC;QACjE,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAClD,CAAC;IAED;;;OAGG;IACO,wBAAwB,CAChC,GAAiB,EACjB,IAAmB,EACnB,GAAW,EACX,MAAyB;QAEzB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC9E,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,WAAW,6CAA6C,QAAQ,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED;;;OAGG;IACO,sBAAsB,CAC9B,GAAiB,EACjB,IAAmB,EACnB,GAAW,EACX,MAAyB;QAEzB,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC9C,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAS,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACO,gBAAgB,CAAI,GAAiB,EAAE,IAAmB,EAAE,GAAW,EAAE,MAAyB;QAC1G,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,wFAAwF,CAAC,CAAC;IAChH,CAAC;CACF"}
|
|
@@ -1,18 +1,11 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { Type, VectorIndexOptions } from '../../type/index.js';
|
|
1
|
+
import type { DistributiveOmit, EntityIndexMeta, Type } from '../../type/index.js';
|
|
3
2
|
/**
|
|
4
|
-
* Options for the @Index decorator
|
|
3
|
+
* Options for the @Index decorator - {@link EntityIndexMeta} minus `columns`, which the decorator
|
|
4
|
+
* takes as its own positional argument. `DistributiveOmit` (not plain `Omit`) keeps `type`/`distance`
|
|
5
|
+
* a discriminated pair - `EntityIndexMeta`'s vector-index invariant, that omitting `distance` on a
|
|
6
|
+
* vector index type is a compile error.
|
|
5
7
|
*/
|
|
6
|
-
export
|
|
7
|
-
/** Custom index name */
|
|
8
|
-
name?: string;
|
|
9
|
-
/** Whether index is unique */
|
|
10
|
-
unique?: boolean;
|
|
11
|
-
/** Index type */
|
|
12
|
-
type?: IndexType;
|
|
13
|
-
/** Partial index WHERE clause */
|
|
14
|
-
where?: string;
|
|
15
|
-
}
|
|
8
|
+
export type IndexDecoratorOptions = DistributiveOmit<EntityIndexMeta, 'columns'>;
|
|
16
9
|
/**
|
|
17
10
|
* Define a composite index on an entity class.
|
|
18
11
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-decorator.d.ts","sourceRoot":"","sources":["../../../src/entity/decorator/index-decorator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"index-decorator.d.ts","sourceRoot":"","sources":["../../../src/entity/decorator/index-decorator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAGnF;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;AAEjF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,qBAA0B,YAC7D,IAAI,CAAC,CAAC,CAAC,KAAG,IAAI,CAG/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-decorator.js","sourceRoot":"","sources":["../../../src/entity/decorator/index-decorator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index-decorator.js","sourceRoot":"","sources":["../../../src/entity/decorator/index-decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAUxD;;;;;;;;;;;;;;;;;;;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"}
|
package/dist/http/handler.d.ts
CHANGED
|
@@ -30,7 +30,11 @@ export type HookContext<E extends object, Ctx = unknown> = {
|
|
|
30
30
|
readonly op: CrudOperation;
|
|
31
31
|
readonly method: HttpMethod;
|
|
32
32
|
/**
|
|
33
|
-
* parsed query - mutate in place or reassign to
|
|
33
|
+
* parsed query - mutate in place or reassign to shape it (e.g. force a `$select`, inject a
|
|
34
|
+
* `$sort`). For actual tenant/row-level scoping, prefer `@Filter(..., { security: true })` on
|
|
35
|
+
* the entity instead: unlike a hook mutation, it is AND-merged (a client `$where` on the same
|
|
36
|
+
* key cannot silently win), fails closed when its context is missing, and applies uniformly
|
|
37
|
+
* across every query path including joined relations.
|
|
34
38
|
*/
|
|
35
39
|
query: Query<E>;
|
|
36
40
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/http/handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EAGV,KAAK,EAEL,IAAI,EAEJ,UAAU,EACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,UAAU,EAEf,KAAK,sBAAsB,EAE5B,MAAM,eAAe,CAAC;AAGvB;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,GAAG,GAAG,OAAO,IAAI;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB,CAAC;AAWF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,GAAG,OAAO,IAAI;IACzD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/http/handler.ts"],"names":[],"mappings":"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"}
|
package/dist/http/handler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/http/handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAW3C,OAAO,EAEL,UAAU,EAEV,UAAU,GAGX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/http/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,14 +3,25 @@ import { MysqlLikeSqlDialect } from '../dialect/mysqlLikeSqlDialect.js';
|
|
|
3
3
|
import type { QueryConflictPaths, QueryContext, QueryOptions, Type, VectorDistance } from '../type/index.js';
|
|
4
4
|
export declare class MariaDialect extends MysqlLikeSqlDialect {
|
|
5
5
|
readonly dialectName = "mariadb";
|
|
6
|
-
readonly serialPrimaryKey = "BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY";
|
|
7
6
|
readonly insertIdSource = "returning";
|
|
8
7
|
constructor(options?: DialectOptions);
|
|
9
8
|
insert<E>(ctx: QueryContext, entity: Type<E>, payload: E | E[], opts?: QueryOptions): void;
|
|
10
9
|
upsert<E>(ctx: QueryContext, entity: Type<E>, conflictPaths: QueryConflictPaths<E>, payload: E | E[]): void;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
/**
|
|
11
|
+
* MariaDB supports neither MySQL's `->`/`->>` shorthand nor the base's chained form. `JSON_VALUE`
|
|
12
|
+
* reads a scalar and `JSON_EXTRACT` the subtree that the array operators need.
|
|
13
|
+
*/
|
|
14
|
+
protected getJsonPathScalarExpr(escapedColumn: string, jsonPathStr: string): string;
|
|
15
|
+
protected getJsonPathJsonbExpr(escapedColumn: string, jsonPathStr: string): string;
|
|
16
|
+
/** MariaDB has no `CAST(val AS JSON)`; `JSON_EXTRACT` at the root reads a value as JSON. */
|
|
17
|
+
protected jsonCast(operand: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* MariaDB stores JSON as text, so JSON_ARRAYAGG would re-quote each element into a string
|
|
20
|
+
* (`["\"a\""]`). JSON_COMPACT marks it back as JSON, keeping element types intact.
|
|
21
|
+
*/
|
|
22
|
+
protected jsonPullElem(alias: string): string;
|
|
23
|
+
/** Text-backed JSON compares as text, so use JSON_EQUALS for key-order-independent equality. */
|
|
24
|
+
protected jsonPullKeep(alias: string, operand: string): string;
|
|
14
25
|
/** MariaDB 11.7+ vector distance functions. */
|
|
15
26
|
protected readonly vectorDistanceFns: ReadonlyMap<VectorDistance, string>;
|
|
16
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mariaDialect.d.ts","sourceRoot":"","sources":["../../src/maria/mariaDialect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"mariaDialect.d.ts","sourceRoot":"","sources":["../../src/maria/mariaDialect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE7G,qBAAa,YAAa,SAAQ,mBAAmB;IACnD,SAAkB,WAAW,aAAa;IAG1C,SAAkB,cAAc,eAAe;IAE/C,YAAY,OAAO,GAAE,cAAmB,EAQvC;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,CAuBnH;IAED;;;OAGG;IACH,UAAmB,qBAAqB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3F;IAED,UAAmB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1F;IAED,4FAA4F;IAC5F,UAAmB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;IAED;;;OAGG;IACH,UAAmB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;IAED,gGAAgG;IAChG,UAAmB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtE;IAED,+CAA+C;IAC/C,mBAA4B,iBAAiB,EAAE,WAAW,CAAC,cAAc,EAAE,MAAM,CAAC,CAG/E;CACJ"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { jsonPath } from '../dialect/jsonSql.js';
|
|
1
2
|
import { MysqlLikeSqlDialect } from '../dialect/mysqlLikeSqlDialect.js';
|
|
2
3
|
import { getMeta } from '../entity/index.js';
|
|
3
4
|
export class MariaDialect extends MysqlLikeSqlDialect {
|
|
4
5
|
dialectName = 'mariadb';
|
|
5
|
-
serialPrimaryKey = 'BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY';
|
|
6
6
|
// MariaDB 10.5+ supports `INSERT ... RETURNING` (see `insert` below), so IDs are exact per row.
|
|
7
7
|
insertIdSource = 'returning';
|
|
8
8
|
constructor(options = {}) {
|
|
@@ -36,18 +36,30 @@ export class MariaDialect extends MysqlLikeSqlDialect {
|
|
|
36
36
|
ctx.pushValue(...insertCtx.values);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
39
|
+
/**
|
|
40
|
+
* MariaDB supports neither MySQL's `->`/`->>` shorthand nor the base's chained form. `JSON_VALUE`
|
|
41
|
+
* reads a scalar and `JSON_EXTRACT` the subtree that the array operators need.
|
|
42
|
+
*/
|
|
43
|
+
getJsonPathScalarExpr(escapedColumn, jsonPathStr) {
|
|
44
|
+
return `JSON_VALUE(${escapedColumn}, ${jsonPath(jsonPathStr)})`;
|
|
45
|
+
}
|
|
46
|
+
getJsonPathJsonbExpr(escapedColumn, jsonPathStr) {
|
|
47
|
+
return `JSON_EXTRACT(${escapedColumn}, ${jsonPath(jsonPathStr)})`;
|
|
48
|
+
}
|
|
49
|
+
/** MariaDB has no `CAST(val AS JSON)`; `JSON_EXTRACT` at the root reads a value as JSON. */
|
|
50
|
+
jsonCast(operand) {
|
|
51
|
+
return `JSON_EXTRACT(${operand}, '$')`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* MariaDB stores JSON as text, so JSON_ARRAYAGG would re-quote each element into a string
|
|
55
|
+
* (`["\"a\""]`). JSON_COMPACT marks it back as JSON, keeping element types intact.
|
|
56
|
+
*/
|
|
57
|
+
jsonPullElem(alias) {
|
|
58
|
+
return `JSON_COMPACT(${alias}.v)`;
|
|
59
|
+
}
|
|
60
|
+
/** Text-backed JSON compares as text, so use JSON_EQUALS for key-order-independent equality. */
|
|
61
|
+
jsonPullKeep(alias, operand) {
|
|
62
|
+
return `NOT JSON_EQUALS(${alias}.v, ${operand})`;
|
|
51
63
|
}
|
|
52
64
|
/** MariaDB 11.7+ vector distance functions. */
|
|
53
65
|
vectorDistanceFns = new Map([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mariaDialect.js","sourceRoot":"","sources":["../../src/maria/mariaDialect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,MAAM,OAAO,YAAa,SAAQ,mBAAmB;IACjC,WAAW,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"mariaDialect.js","sourceRoot":"","sources":["../../src/maria/mariaDialect.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import type { TableDefinition } from '../builder/types.js';
|
|
|
5
5
|
export declare class MongoSchemaGenerator extends AbstractDialect implements SchemaGenerator {
|
|
6
6
|
protected readonly defaultForeignKeyAction?: ForeignKeyAction | undefined;
|
|
7
7
|
readonly dialectName = "mongodb";
|
|
8
|
-
protected readonly featureDefaults: import("../../type/
|
|
8
|
+
protected readonly featureDefaults: import("../../type/dialect.js").DialectFeatures;
|
|
9
9
|
readonly insertIdSource: InsertIdSource;
|
|
10
10
|
constructor(namingStrategy?: NamingStrategy, defaultForeignKeyAction?: ForeignKeyAction | undefined);
|
|
11
11
|
generateCreateTable<E>(entity: Type<E>, _options?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongoSchemaGenerator.d.ts","sourceRoot":"","sources":["../../../src/migrate/generator/mongoSchemaGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,KAAK,EAEV,YAAY,EACZ,WAAW,EACX,cAAc,EACd,cAAc,EACd,UAAU,EACV,eAAe,EACf,IAAI,EACL,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,qBAAa,oBAAqB,SAAQ,eAAgB,YAAW,eAAe;IAShF,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,gBAAgB;IAR/D,QAAQ,CAAC,WAAW,aAAmC;IAEvD,mBAA4B,eAAe,
|
|
1
|
+
{"version":3,"file":"mongoSchemaGenerator.d.ts","sourceRoot":"","sources":["../../../src/migrate/generator/mongoSchemaGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Document, type Filter, ObjectId, type Sort } from 'mongodb';
|
|
1
|
+
import { type Document, type Filter, ObjectId, type Sort, type UpdateFilter } from 'mongodb';
|
|
2
2
|
import { AbstractDialect } from '../dialect/abstractDialect.js';
|
|
3
3
|
import type { DialectFeatures, EntityMeta, FieldValue, Query, QueryAggMap, QueryAggregate, QueryExclude, QueryGroupMap, QueryOptions, QuerySelectValue, QuerySortMap, QueryVectorSearch, QueryWhere, RelationKey, Type } from '../type/index.js';
|
|
4
4
|
import { type CallbackKey, type RelationRequestSummary } from '../util/index.js';
|
|
@@ -14,10 +14,6 @@ export declare class MongoDialect extends AbstractDialect {
|
|
|
14
14
|
where<E extends Document>(entity: Type<E>, where?: QueryWhere<E>, opts?: QueryOptions): Filter<E>;
|
|
15
15
|
/** Renders a `$where` tree without applying entity filters (used for same-scope `$and`/`$or` recursion). */
|
|
16
16
|
private renderFilter;
|
|
17
|
-
/**
|
|
18
|
-
* Check if an object has operator keys (keys starting with $).
|
|
19
|
-
*/
|
|
20
|
-
private hasOperatorKeys;
|
|
21
17
|
protected mapTableNameRow(row: {
|
|
22
18
|
table_name: string;
|
|
23
19
|
}): string;
|
|
@@ -29,6 +25,11 @@ export declare class MongoDialect extends AbstractDialect {
|
|
|
29
25
|
* Transform UQL operators to MongoDB operators.
|
|
30
26
|
*/
|
|
31
27
|
private transformOperators;
|
|
28
|
+
/**
|
|
29
|
+
* Maps the conditions inside `$elemMatch`: an operator map applies to the element itself, anything
|
|
30
|
+
* else is a per-field map whose operator objects each need mapping.
|
|
31
|
+
*/
|
|
32
|
+
private transformElemMatch;
|
|
32
33
|
select<E extends Document>(entity: Type<E>, select?: QuerySelectValue<E>, exclude?: QueryExclude<E>): Record<string, 1>;
|
|
33
34
|
sort<E extends Document>(entity: Type<E>, sort?: QuerySortMap<E>): Sort;
|
|
34
35
|
aggregationPipeline<E extends Document>(entity: Type<E>, q: Query<E>, relationSummary?: RelationRequestSummary<E>, opts?: QueryOptions): MongoAggregationPipelineEntry<E>[];
|
|
@@ -36,6 +37,26 @@ export declare class MongoDialect extends AbstractDialect {
|
|
|
36
37
|
normalizeId<E extends Document>(meta: EntityMeta<E>, doc: E | undefined): E | undefined;
|
|
37
38
|
getIdValue<T extends IdValue>(value: T): T;
|
|
38
39
|
getPersistable<E extends Document>(meta: EntityMeta<E>, payload: E, callbackKey: CallbackKey): Partial<E>;
|
|
40
|
+
/** One MongoDB update document's operators, grouped by kind and keyed by dotted path. */
|
|
41
|
+
private groupUpdateOperators;
|
|
42
|
+
/**
|
|
43
|
+
* Turn a persistable payload into a MongoDB update, mapping UQL's JSON operators onto their native
|
|
44
|
+
* equivalents: `$set` becomes dotted-path assignments, `$unset`/`$push`/`$pull` map one-to-one.
|
|
45
|
+
* Plain field values are assigned with `$set`.
|
|
46
|
+
*/
|
|
47
|
+
getUpdateFilter<E extends Document>(persistable: Partial<E>): UpdateFilter<E> | Document[];
|
|
48
|
+
/**
|
|
49
|
+
* MongoDB rejects two operators targeting one path in a single update document, so any path shared
|
|
50
|
+
* across operator groups is expressed as one aggregation-pipeline update instead.
|
|
51
|
+
*
|
|
52
|
+
* Each path's expression is composed in the same order stated on {@link JsonUpdateOp} (`$pull` ->
|
|
53
|
+
* `$set` -> `$push` -> `$unset`), so every combination yields the identical result: a `$pull`
|
|
54
|
+
* filters the stored array, a `$set` on the same path then replaces it outright, and a `$push`
|
|
55
|
+
* appends to whatever those produced. `$unset` is a later stage, so it wins over a `$set` on the
|
|
56
|
+
* same path - again matching SQL, where it is the outermost wrapper. Values are wrapped in
|
|
57
|
+
* `$literal` so a string starting with `$` stays data rather than becoming a field reference.
|
|
58
|
+
*/
|
|
59
|
+
private getUpdatePipeline;
|
|
39
60
|
getPersistables<E extends Document>(meta: EntityMeta<E>, payload: E | E[], callbackKey: CallbackKey): Partial<E>[];
|
|
40
61
|
/**
|
|
41
62
|
* Build MongoDB aggregation pipeline stages from a QueryAggregate.
|
|
@@ -57,7 +78,7 @@ export declare class MongoDialect extends AbstractDialect {
|
|
|
57
78
|
* Build a `$vectorSearch` aggregation pipeline stage.
|
|
58
79
|
* Merges `$where` into `$vectorSearch.filter` for optimal pre-filtering.
|
|
59
80
|
*/
|
|
60
|
-
buildVectorSearchStage<E extends Document>(entity: Type<E>,
|
|
81
|
+
buildVectorSearchStage<E extends Document>(entity: Type<E>, key: string, search: QueryVectorSearch, where: QueryWhere<E> | undefined, limit: number, opts?: QueryOptions): Record<string, unknown>;
|
|
61
82
|
}
|
|
62
83
|
export type MongoAggregationPipelineEntry<E extends Document> = {
|
|
63
84
|
$lookup?: MongoAggregationLookup<E>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongoDialect.d.ts","sourceRoot":"","sources":["../../src/mongo/mongoDialect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"mongoDialect.d.ts","sourceRoot":"","sources":["../../src/mongo/mongoDialect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ObjectId } from 'mongodb';
|
|
2
2
|
import { AbstractDialect } from '../dialect/abstractDialect.js';
|
|
3
3
|
import { getMeta } from '../entity/index.js';
|
|
4
|
-
import { applyFilters, asSelectMap, buildQueryWhereAsMap, buildSortMap, fillOnFields, filterFieldKeys, getKeys, getRelationRequestSummary, hasKeys, isVectorSearch, normalizeScalarFieldSelection, parseGroupMap,
|
|
4
|
+
import { applyFilters, asSelectMap, buildQueryWhereAsMap, buildSortMap, fillOnFields, filterFieldKeys, getKeys, getRelationRequestSummary, hasKeys, isJsonUpdateOp, isOperatorObject, isVectorSearch, normalizeScalarFieldSelection, parseGroupMap, } from '../util/index.js';
|
|
5
5
|
/** Default {@link DialectFeatures} for MongoDB; shared by {@link MongoDialect} and its schema generator. */
|
|
6
6
|
export const mongoDialectFeatures = {
|
|
7
7
|
explicitJsonCast: false,
|
|
@@ -59,10 +59,7 @@ export class MongoDialect extends AbstractDialect {
|
|
|
59
59
|
else if (field) {
|
|
60
60
|
key = this.resolveColumnName(key, field);
|
|
61
61
|
}
|
|
62
|
-
if (val
|
|
63
|
-
typeof val === 'object' &&
|
|
64
|
-
!Array.isArray(val) &&
|
|
65
|
-
this.hasOperatorKeys(val)) {
|
|
62
|
+
if (isOperatorObject(val)) {
|
|
66
63
|
val = this.transformOperators(val);
|
|
67
64
|
}
|
|
68
65
|
else if (Array.isArray(val)) {
|
|
@@ -73,12 +70,6 @@ export class MongoDialect extends AbstractDialect {
|
|
|
73
70
|
}
|
|
74
71
|
return filter;
|
|
75
72
|
}
|
|
76
|
-
/**
|
|
77
|
-
* Check if an object has operator keys (keys starting with $).
|
|
78
|
-
*/
|
|
79
|
-
hasOperatorKeys(obj) {
|
|
80
|
-
return someKey(obj, (key) => key.startsWith('$'));
|
|
81
|
-
}
|
|
82
73
|
mapTableNameRow(row) {
|
|
83
74
|
return row.table_name;
|
|
84
75
|
}
|
|
@@ -115,6 +106,13 @@ export class MongoDialect extends AbstractDialect {
|
|
|
115
106
|
transformOperators(ops) {
|
|
116
107
|
const result = {};
|
|
117
108
|
for (const [op, val] of Object.entries(ops)) {
|
|
109
|
+
// `$elemMatch`'s value is itself a condition, so the operators inside it need the same
|
|
110
|
+
// mapping - passing it through raw sends UQL-only operators (`$startsWith`, `$between`, ...)
|
|
111
|
+
// straight to the server, which rejects them as unknown.
|
|
112
|
+
if (op === '$elemMatch') {
|
|
113
|
+
result[op] = this.transformElemMatch(val);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
118
116
|
// Native MongoDB operators - pass through directly
|
|
119
117
|
if (MongoDialect.NATIVE_OPS.has(op)) {
|
|
120
118
|
result[op] = val;
|
|
@@ -152,6 +150,16 @@ export class MongoDialect extends AbstractDialect {
|
|
|
152
150
|
}
|
|
153
151
|
return result;
|
|
154
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* Maps the conditions inside `$elemMatch`: an operator map applies to the element itself, anything
|
|
155
|
+
* else is a per-field map whose operator objects each need mapping.
|
|
156
|
+
*/
|
|
157
|
+
transformElemMatch(match) {
|
|
158
|
+
if (isOperatorObject(match)) {
|
|
159
|
+
return this.transformOperators(match);
|
|
160
|
+
}
|
|
161
|
+
return Object.fromEntries(Object.entries(match).map(([field, val]) => [field, isOperatorObject(val) ? this.transformOperators(val) : val]));
|
|
162
|
+
}
|
|
155
163
|
select(entity, select, exclude) {
|
|
156
164
|
const meta = getMeta(entity);
|
|
157
165
|
if (!select && !exclude) {
|
|
@@ -200,6 +208,10 @@ export class MongoDialect extends AbstractDialect {
|
|
|
200
208
|
}
|
|
201
209
|
const relEntity = relOpts.entity();
|
|
202
210
|
const relMeta = getMeta(relEntity);
|
|
211
|
+
// Unconditional, not gated by an explicit relation-level `$where`: the related entity's own
|
|
212
|
+
// filters (in particular `security: true` ones) must apply even to a bare
|
|
213
|
+
// `$populate: { rel: true }`, exactly like the SQL dialects' JOIN ON-clause filters.
|
|
214
|
+
const relationFilter = this.where(relEntity, {}, opts);
|
|
203
215
|
if (relOpts.cardinality === 'm1') {
|
|
204
216
|
const localField = meta.fields[relOpts.references[0].local];
|
|
205
217
|
pipeline.push({
|
|
@@ -207,6 +219,9 @@ export class MongoDialect extends AbstractDialect {
|
|
|
207
219
|
from: this.resolveTableName(relEntity, relMeta),
|
|
208
220
|
localField: this.resolveColumnName(relOpts.references[0].local, localField),
|
|
209
221
|
foreignField: '_id',
|
|
222
|
+
// MongoDB runs `pipeline` after its own localField/foreignField match, so the related
|
|
223
|
+
// entity's filters layer on top of the join condition without a `let`/`$expr` rewrite.
|
|
224
|
+
...(hasKeys(relationFilter) ? { pipeline: [{ $match: relationFilter }] } : {}),
|
|
210
225
|
as: relKey,
|
|
211
226
|
},
|
|
212
227
|
});
|
|
@@ -214,11 +229,10 @@ export class MongoDialect extends AbstractDialect {
|
|
|
214
229
|
else {
|
|
215
230
|
const foreignField = relMeta.fields[relOpts.references[0].foreign];
|
|
216
231
|
const foreignFieldName = this.resolveColumnName(relOpts.references[0].foreign, foreignField);
|
|
217
|
-
const referenceWhere = this.where(relEntity, where);
|
|
218
232
|
const referenceSort = this.sort(relEntity, q.$sort);
|
|
219
233
|
const _id = MongoDialect.ID_KEY;
|
|
220
234
|
const referencePipelineEntry = {
|
|
221
|
-
$match: { [foreignFieldName]:
|
|
235
|
+
$match: { [foreignFieldName]: where[_id], ...relationFilter },
|
|
222
236
|
};
|
|
223
237
|
if (hasKeys(referenceSort)) {
|
|
224
238
|
referencePipelineEntry.$sort = referenceSort;
|
|
@@ -284,6 +298,84 @@ export class MongoDialect extends AbstractDialect {
|
|
|
284
298
|
getPersistable(meta, payload, callbackKey) {
|
|
285
299
|
return this.getPersistables(meta, payload, callbackKey)[0];
|
|
286
300
|
}
|
|
301
|
+
/** One MongoDB update document's operators, grouped by kind and keyed by dotted path. */
|
|
302
|
+
groupUpdateOperators(persistable) {
|
|
303
|
+
const set = {};
|
|
304
|
+
const push = {};
|
|
305
|
+
const pull = {};
|
|
306
|
+
const unset = new Set();
|
|
307
|
+
for (const [key, value] of Object.entries(persistable)) {
|
|
308
|
+
if (!isJsonUpdateOp(value)) {
|
|
309
|
+
set[key] = value;
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
for (const [path, v] of Object.entries(value.$set ?? {})) {
|
|
313
|
+
set[`${key}.${path}`] = v;
|
|
314
|
+
}
|
|
315
|
+
for (const path of value.$unset ?? []) {
|
|
316
|
+
unset.add(`${key}.${path}`);
|
|
317
|
+
}
|
|
318
|
+
for (const [path, v] of Object.entries(value.$push ?? {})) {
|
|
319
|
+
push[`${key}.${path}`] = v;
|
|
320
|
+
}
|
|
321
|
+
for (const [path, v] of Object.entries(value.$pull ?? {})) {
|
|
322
|
+
pull[`${key}.${path}`] = v;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return { set, push, pull, unset };
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Turn a persistable payload into a MongoDB update, mapping UQL's JSON operators onto their native
|
|
329
|
+
* equivalents: `$set` becomes dotted-path assignments, `$unset`/`$push`/`$pull` map one-to-one.
|
|
330
|
+
* Plain field values are assigned with `$set`.
|
|
331
|
+
*/
|
|
332
|
+
getUpdateFilter(persistable) {
|
|
333
|
+
const groups = this.groupUpdateOperators(persistable);
|
|
334
|
+
const { set, push, pull, unset } = groups;
|
|
335
|
+
const exprKeys = [...Object.keys(pull), ...Object.keys(set), ...Object.keys(push)];
|
|
336
|
+
// MongoDB rejects two operators targeting one path in a single update document, so any path
|
|
337
|
+
// reached by more than one operator group forces the pipeline form.
|
|
338
|
+
const allPaths = [...exprKeys, ...unset];
|
|
339
|
+
if (new Set(allPaths).size < allPaths.length) {
|
|
340
|
+
return this.getUpdatePipeline(groups, new Set(exprKeys));
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
...(hasKeys(set) && { $set: set }),
|
|
344
|
+
...(hasKeys(push) && { $push: push }),
|
|
345
|
+
...(hasKeys(pull) && { $pull: pull }),
|
|
346
|
+
...(unset.size > 0 && { $unset: Object.fromEntries([...unset].map((path) => [path, ''])) }),
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* MongoDB rejects two operators targeting one path in a single update document, so any path shared
|
|
351
|
+
* across operator groups is expressed as one aggregation-pipeline update instead.
|
|
352
|
+
*
|
|
353
|
+
* Each path's expression is composed in the same order stated on {@link JsonUpdateOp} (`$pull` ->
|
|
354
|
+
* `$set` -> `$push` -> `$unset`), so every combination yields the identical result: a `$pull`
|
|
355
|
+
* filters the stored array, a `$set` on the same path then replaces it outright, and a `$push`
|
|
356
|
+
* appends to whatever those produced. `$unset` is a later stage, so it wins over a `$set` on the
|
|
357
|
+
* same path - again matching SQL, where it is the outermost wrapper. Values are wrapped in
|
|
358
|
+
* `$literal` so a string starting with `$` stays data rather than becoming a field reference.
|
|
359
|
+
*/
|
|
360
|
+
getUpdatePipeline({ set, push, pull, unset }, exprPaths) {
|
|
361
|
+
const assignments = {};
|
|
362
|
+
for (const path of exprPaths) {
|
|
363
|
+
let expr = { $ifNull: [`$${path}`, []] };
|
|
364
|
+
if (path in pull) {
|
|
365
|
+
expr = { $filter: { input: expr, cond: { $ne: ['$$this', { $literal: pull[path] }] } } };
|
|
366
|
+
}
|
|
367
|
+
if (path in set) {
|
|
368
|
+
expr = { $literal: set[path] };
|
|
369
|
+
}
|
|
370
|
+
if (path in push) {
|
|
371
|
+
expr = { $concatArrays: [expr, [{ $literal: push[path] }]] };
|
|
372
|
+
}
|
|
373
|
+
// Only `$set` and `$push` create a key. A `$pull` alone has to leave an absent one absent, and
|
|
374
|
+
// `$$REMOVE` is how a pipeline `$set` skips a field - without it the filter would store `[]`.
|
|
375
|
+
assignments[path] = path in set || path in push ? expr : { $cond: [{ $isArray: `$${path}` }, expr, '$$REMOVE'] };
|
|
376
|
+
}
|
|
377
|
+
return [{ $set: assignments }, ...(unset.size > 0 ? [{ $unset: [...unset] }] : [])];
|
|
378
|
+
}
|
|
287
379
|
getPersistables(meta, payload, callbackKey) {
|
|
288
380
|
const payloads = fillOnFields(meta, payload, callbackKey);
|
|
289
381
|
// Keys are resolved per document so heterogeneous payloads keep every provided field.
|
|
@@ -422,7 +514,8 @@ export class MongoDialect extends AbstractDialect {
|
|
|
422
514
|
* Build a `$vectorSearch` aggregation pipeline stage.
|
|
423
515
|
* Merges `$where` into `$vectorSearch.filter` for optimal pre-filtering.
|
|
424
516
|
*/
|
|
425
|
-
buildVectorSearchStage(entity,
|
|
517
|
+
buildVectorSearchStage(entity, key, search, where, limit, opts) {
|
|
518
|
+
const meta = getMeta(entity);
|
|
426
519
|
const field = meta.fields[key];
|
|
427
520
|
if (!field) {
|
|
428
521
|
throw new TypeError(`Field '${key}' not found in entity '${meta.name}'`);
|