@danceroutine/tango-orm 1.11.0 → 1.11.2
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/dist/Adapter-DKxAaL4l.d.ts +73 -0
- package/dist/DBClient-DuYcXolQ.d.ts +27 -0
- package/dist/{InternalDialect-ClSaUNso.js → InternalDialect-U3mwJjKA.js} +3 -4
- package/dist/InternalDialect-U3mwJjKA.js.map +1 -0
- package/dist/QuerySetState-CjyvAUBs.d.ts +1310 -0
- package/dist/SqliteAdapter-6oyUmoJf.js +279 -0
- package/dist/SqliteAdapter-6oyUmoJf.js.map +1 -0
- package/dist/chunk-8H4AJuhK.js +14 -0
- package/dist/connection/index.d.ts +4 -11
- package/dist/connection/index.js +3 -6
- package/dist/{connection-Dmhgx31M.js → connection-D-E6_Yf1.js} +28 -30
- package/dist/connection-D-E6_Yf1.js.map +1 -0
- package/dist/{defaultRuntime-DzqBQ9Hb.js → defaultRuntime-CdTX8cXm.js} +41 -35
- package/dist/defaultRuntime-CdTX8cXm.js.map +1 -0
- package/dist/index-B-aibguC.d.ts +226 -0
- package/dist/index-D9B6gKez.d.ts +70 -0
- package/dist/index-rjKca3U_.d.ts +31 -0
- package/dist/index-uuG57Y7C.d.ts +97 -0
- package/dist/index.d.ts +9 -22
- package/dist/index.js +9 -12
- package/dist/manager/index.d.ts +4 -12
- package/dist/manager/index.js +3 -9
- package/dist/{manager-DrDTiCAz.js → manager-CiYqAYpn.js} +7 -11
- package/dist/{manager-DrDTiCAz.js.map → manager-CiYqAYpn.js.map} +1 -1
- package/dist/query/index.d.ts +3 -14
- package/dist/query/index.js +2 -4
- package/dist/{query-DUZnBFhf.js → query-CP1UMIX6.js} +163 -121
- package/dist/query-CP1UMIX6.js.map +1 -0
- package/dist/registerModelObjects-C-MliIiM.d.ts +229 -0
- package/dist/{registerModelObjects-Djpt45KK.js → registerModelObjects-DZfZ20fa.js} +150 -69
- package/dist/registerModelObjects-DZfZ20fa.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -15
- package/dist/runtime/index.js +15 -8
- package/dist/runtime/index.js.map +1 -0
- package/dist/transaction/index.d.ts +2 -6
- package/dist/transaction/index.js +2 -7
- package/dist/{transaction-ZhfDf-f8.js → transaction-2_2m7VUo.js} +26 -10
- package/dist/transaction-2_2m7VUo.js.map +1 -0
- package/package.json +8 -8
- package/dist/InternalDialect-ClSaUNso.js.map +0 -1
- package/dist/PostgresAdapter-CXKdKBG-.js +0 -4
- package/dist/PostgresAdapter-DySFW6vy.js +0 -128
- package/dist/PostgresAdapter-DySFW6vy.js.map +0 -1
- package/dist/SqliteAdapter-CDdOjRmW.js +0 -151
- package/dist/SqliteAdapter-CDdOjRmW.js.map +0 -1
- package/dist/SqliteAdapter-mjtXuVTg.js +0 -4
- package/dist/chunk-DLY2FNSh.js +0 -12
- package/dist/connection/adapters/Adapter.d.ts +0 -60
- package/dist/connection/adapters/AdapterRegistry.d.ts +0 -44
- package/dist/connection/adapters/dialects/PostgresAdapter.d.ts +0 -30
- package/dist/connection/adapters/dialects/SqliteAdapter.d.ts +0 -22
- package/dist/connection/adapters/dialects/index.d.ts +0 -5
- package/dist/connection/adapters/index.d.ts +0 -8
- package/dist/connection/clients/DBClient.d.ts +0 -23
- package/dist/connection/clients/dialects/PostgresClient.d.ts +0 -54
- package/dist/connection/clients/dialects/SqliteClient.d.ts +0 -54
- package/dist/connection/clients/dialects/index.d.ts +0 -5
- package/dist/connection/clients/index.d.ts +0 -7
- package/dist/connection-Dmhgx31M.js.map +0 -1
- package/dist/defaultRuntime-DzqBQ9Hb.js.map +0 -1
- package/dist/manager/ManagerLike.d.ts +0 -34
- package/dist/manager/ModelManager.d.ts +0 -97
- package/dist/manager/internal/MutationCompiler.d.ts +0 -23
- package/dist/manager/internal/RuntimeBoundClient.d.ts +0 -20
- package/dist/manager/registerModelObjects.d.ts +0 -5
- package/dist/manager/relations/ManyToManyRelatedManager.d.ts +0 -181
- package/dist/manager/relations/ManyToManyRelatedQuerySet.d.ts +0 -62
- package/dist/manager/relations/MaterializedModelRecord.d.ts +0 -28
- package/dist/manager/relations/index.d.ts +0 -9
- package/dist/manager/relations/internal/ThroughTableManager.d.ts +0 -85
- package/dist/query/ModelQuerySet.d.ts +0 -20
- package/dist/query/QBuilder.d.ts +0 -29
- package/dist/query/QuerySet.d.ts +0 -215
- package/dist/query/compiler/QueryCompiler.d.ts +0 -49
- package/dist/query/compiler/index.d.ts +0 -4
- package/dist/query/domain/CompiledQuery.d.ts +0 -209
- package/dist/query/domain/Dialect.d.ts +0 -2
- package/dist/query/domain/Direction.d.ts +0 -2
- package/dist/query/domain/FilterInput.d.ts +0 -3
- package/dist/query/domain/FilterKey.d.ts +0 -4
- package/dist/query/domain/FilterValue.d.ts +0 -1
- package/dist/query/domain/LookupType.d.ts +0 -2
- package/dist/query/domain/OrderSpec.d.ts +0 -5
- package/dist/query/domain/OrderToken.d.ts +0 -1
- package/dist/query/domain/QNode.d.ts +0 -9
- package/dist/query/domain/QueryResult.d.ts +0 -35
- package/dist/query/domain/QuerySetState.d.ts +0 -13
- package/dist/query/domain/RelationMeta.d.ts +0 -56
- package/dist/query/domain/RelationTyping.d.ts +0 -163
- package/dist/query/domain/TableMeta.d.ts +0 -16
- package/dist/query/domain/TableMetaFactory.d.ts +0 -10
- package/dist/query/domain/WhereClause.d.ts +0 -4
- package/dist/query/domain/index.d.ts +0 -21
- package/dist/query/domain/internal/InternalDialect.d.ts +0 -4
- package/dist/query/domain/internal/InternalDirection.d.ts +0 -4
- package/dist/query/domain/internal/InternalLookupType.d.ts +0 -15
- package/dist/query/domain/internal/InternalPrefetchQueryKind.d.ts +0 -20
- package/dist/query/domain/internal/InternalQNodeType.d.ts +0 -6
- package/dist/query/domain/internal/InternalRelationKind.d.ts +0 -6
- package/dist/query/internal/isQNodeLike.d.ts +0 -3
- package/dist/query/planning/QueryPlanner.d.ts +0 -16
- package/dist/query/planning/domain/QueryHydrationPlan.d.ts +0 -20
- package/dist/query/planning/index.d.ts +0 -2
- package/dist/query-DUZnBFhf.js.map +0 -1
- package/dist/registerModelObjects-Djpt45KK.js.map +0 -1
- package/dist/runtime/TangoRuntime.d.ts +0 -56
- package/dist/runtime/defaultRuntime.d.ts +0 -13
- package/dist/runtime/internal/DBClientProvider.d.ts +0 -12
- package/dist/runtime/internal/PostgresDBClientProvider.d.ts +0 -12
- package/dist/runtime/internal/SqliteDBClientProvider.d.ts +0 -19
- package/dist/runtime/internal/createDBClientProvider.d.ts +0 -5
- package/dist/runtime-1H88J3nN.js +0 -18
- package/dist/runtime-1H88J3nN.js.map +0 -1
- package/dist/transaction/AtomicTransaction.d.ts +0 -32
- package/dist/transaction/UnitOfWork.d.ts +0 -52
- package/dist/transaction/atomic.d.ts +0 -2
- package/dist/transaction/internal/context/AsyncLocalTransactionEngine.d.ts +0 -21
- package/dist/transaction/internal/context/CallbackRecord.d.ts +0 -5
- package/dist/transaction/internal/context/FrameBoundTransaction.d.ts +0 -20
- package/dist/transaction/internal/context/FrameTransactionHandle.d.ts +0 -4
- package/dist/transaction/internal/context/TransactionEngine.d.ts +0 -16
- package/dist/transaction/internal/context/TransactionFrame.d.ts +0 -7
- package/dist/transaction/internal/context/TransactionState.d.ts +0 -10
- package/dist/transaction/internal/context/index.d.ts +0 -1
- package/dist/transaction-ZhfDf-f8.js.map +0 -1
- package/dist/validation/OrmSqlSafetyAdapter.d.ts +0 -22
- package/dist/validation/SQLValidationEngine.d.ts +0 -68
- package/dist/validation/SqlValidationPlan.d.ts +0 -43
- package/dist/validation/index.d.ts +0 -3
- package/dist/validation/internal/InternalSqlValidationPlanKind.d.ts +0 -25
- package/dist/validation/internal/InternalValidatedFilterDescriptorKind.d.ts +0 -4
|
@@ -1,21 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { InternalDialect } from "./InternalDialect-
|
|
1
|
+
import { t as __exportAll } from "./chunk-8H4AJuhK.js";
|
|
2
|
+
import { t as InternalDialect } from "./InternalDialect-U3mwJjKA.js";
|
|
3
3
|
import { MultipleObjectsReturned, NotFoundError, SqlSafetyEngine, getLogger, isError } from "@danceroutine/tango-core";
|
|
4
4
|
import { ModelRegistry } from "@danceroutine/tango-schema";
|
|
5
|
-
|
|
6
5
|
//#region src/query/domain/RelationMeta.ts
|
|
7
6
|
const InternalRelationHydrationLoadMode = {
|
|
8
7
|
JOIN: "join",
|
|
9
8
|
PREFETCH: "prefetch"
|
|
10
9
|
};
|
|
11
|
-
|
|
12
10
|
//#endregion
|
|
13
11
|
//#region src/query/domain/internal/InternalPrefetchQueryKind.ts
|
|
12
|
+
/**
|
|
13
|
+
* Discriminator strings for compiled prefetch hydration: how `QueryCompiler.compilePrefetch`
|
|
14
|
+
* batches related rows for hydration (`CompiledPrefetchQuery`).
|
|
15
|
+
*/
|
|
14
16
|
const InternalPrefetchQueryKind = {
|
|
17
|
+
/**
|
|
18
|
+
* Single-query prefetch against the related table (`SELECT … FROM target WHERE fk IN (...)`).
|
|
19
|
+
* Used when each related row is reachable from one physical table via a foreign key or
|
|
20
|
+
* symmetric join path (belongsTo, hasMany, hasOne, reverse one-to-one).
|
|
21
|
+
*/
|
|
15
22
|
DIRECT: "direct",
|
|
23
|
+
/**
|
|
24
|
+
* Two-phase many-to-many prefetch: first query reads join (through) rows pairing owner ids to
|
|
25
|
+
* target ids (`throughSql`), then target rows load by primary key (`compileManyToManyTargets`).
|
|
26
|
+
* Distinct from relation metadata’s `manyToMany` relation *kind* on an endpoint—this marks the
|
|
27
|
+
* compiled prefetch *strategy*, not the schema edge type.
|
|
28
|
+
*/
|
|
16
29
|
MANY_TO_MANY: "manyToMany"
|
|
17
30
|
};
|
|
18
|
-
|
|
19
31
|
//#endregion
|
|
20
32
|
//#region src/query/domain/internal/InternalQNodeType.ts
|
|
21
33
|
const InternalQNodeType = {
|
|
@@ -24,7 +36,6 @@ const InternalQNodeType = {
|
|
|
24
36
|
OR: "or",
|
|
25
37
|
NOT: "not"
|
|
26
38
|
};
|
|
27
|
-
|
|
28
39
|
//#endregion
|
|
29
40
|
//#region src/query/domain/internal/InternalLookupType.ts
|
|
30
41
|
const InternalLookupType = {
|
|
@@ -42,27 +53,47 @@ const InternalLookupType = {
|
|
|
42
53
|
ENDSWITH: "endswith",
|
|
43
54
|
IENDSWITH: "iendswith"
|
|
44
55
|
};
|
|
45
|
-
|
|
46
56
|
//#endregion
|
|
47
57
|
//#region src/validation/internal/InternalSqlValidationPlanKind.ts
|
|
58
|
+
/**
|
|
59
|
+
* Discriminator strings for {@link SqlValidationPlan} / {@link ValidatedSqlPlan}: which validation
|
|
60
|
+
* branch {@link OrmSqlSafetyAdapter} runs before SQL is assembled or executed.
|
|
61
|
+
*/
|
|
48
62
|
const InternalSqlValidationPlanKind = {
|
|
63
|
+
/**
|
|
64
|
+
* Read/query validation: table metadata, projected columns, `WHERE` filter keys, ordering, and
|
|
65
|
+
* optional relation handles. Used when compiling selects (including M2M through-table selects
|
|
66
|
+
* issued inside prefetch compilation).
|
|
67
|
+
*/
|
|
49
68
|
SELECT: "select",
|
|
69
|
+
/**
|
|
70
|
+
* Insert validation: resolved write columns for `INSERT … VALUES`.
|
|
71
|
+
*/
|
|
50
72
|
INSERT: "insert",
|
|
73
|
+
/**
|
|
74
|
+
* Update validation: resolved write columns for `UPDATE … SET`.
|
|
75
|
+
*/
|
|
51
76
|
UPDATE: "update",
|
|
77
|
+
/**
|
|
78
|
+
* Delete validation: scope delete-by-primary-key against validated table metadata.
|
|
79
|
+
*/
|
|
52
80
|
DELETE: "delete"
|
|
53
81
|
};
|
|
54
|
-
|
|
55
82
|
//#endregion
|
|
56
83
|
//#region src/validation/internal/InternalValidatedFilterDescriptorKind.ts
|
|
57
84
|
const InternalValidatedFilterDescriptorKind = {
|
|
58
85
|
COLUMN: "column",
|
|
59
86
|
RELATION: "relation"
|
|
60
87
|
};
|
|
61
|
-
|
|
62
88
|
//#endregion
|
|
63
89
|
//#region src/validation/OrmSqlSafetyAdapter.ts
|
|
64
90
|
const ALLOWED_LOOKUPS = Object.values(InternalLookupType);
|
|
91
|
+
/**
|
|
92
|
+
* ORM-local adapter that translates query validation plans into the
|
|
93
|
+
* shared Tango SQL safety engine.
|
|
94
|
+
*/
|
|
65
95
|
var OrmSqlSafetyAdapter = class OrmSqlSafetyAdapter {
|
|
96
|
+
engine;
|
|
66
97
|
static BRAND = "tango.orm.orm_sql_safety_adapter";
|
|
67
98
|
__tangoBrand = OrmSqlSafetyAdapter.BRAND;
|
|
68
99
|
constructor(engine = new SqlSafetyEngine()) {
|
|
@@ -205,13 +236,13 @@ var OrmSqlSafetyAdapter = class OrmSqlSafetyAdapter {
|
|
|
205
236
|
allowed: ALLOWED_LOOKUPS
|
|
206
237
|
}] });
|
|
207
238
|
if (pathSegments.length === 1) {
|
|
208
|
-
const field
|
|
239
|
+
const field = pathSegments[0];
|
|
209
240
|
return {
|
|
210
241
|
kind: InternalValidatedFilterDescriptorKind.COLUMN,
|
|
211
242
|
rawKey,
|
|
212
|
-
field
|
|
243
|
+
field,
|
|
213
244
|
lookup: validated.lookupTokens[rawKey].lookup,
|
|
214
|
-
qualifiedColumn: `${meta.table}.${this.resolveColumn(meta, field
|
|
245
|
+
qualifiedColumn: `${meta.table}.${this.resolveColumn(meta, field)}`
|
|
215
246
|
};
|
|
216
247
|
}
|
|
217
248
|
const rootSegment = pathSegments[0];
|
|
@@ -252,17 +283,19 @@ var OrmSqlSafetyAdapter = class OrmSqlSafetyAdapter {
|
|
|
252
283
|
return relation;
|
|
253
284
|
}
|
|
254
285
|
};
|
|
255
|
-
|
|
256
286
|
//#endregion
|
|
257
287
|
//#region src/query/domain/RelationTyping.ts
|
|
258
288
|
const InternalRelationHydrationCardinality = {
|
|
259
289
|
SINGLE: "single",
|
|
260
290
|
MANY: "many"
|
|
261
291
|
};
|
|
262
|
-
|
|
263
292
|
//#endregion
|
|
264
293
|
//#region src/query/planning/QueryPlanner.ts
|
|
294
|
+
/**
|
|
295
|
+
* Parse, validate, normalize, and plan recursive relation hydration paths.
|
|
296
|
+
*/
|
|
265
297
|
var QueryPlanner = class QueryPlanner {
|
|
298
|
+
meta;
|
|
266
299
|
static BRAND = "tango.orm.query_planner";
|
|
267
300
|
__tangoBrand = QueryPlanner.BRAND;
|
|
268
301
|
constructor(meta) {
|
|
@@ -278,7 +311,7 @@ var QueryPlanner = class QueryPlanner {
|
|
|
278
311
|
prefetchNodes: [],
|
|
279
312
|
requestedPaths: []
|
|
280
313
|
};
|
|
281
|
-
const rootChildren = new Map();
|
|
314
|
+
const rootChildren = /* @__PURE__ */ new Map();
|
|
282
315
|
for (const relationPath of new Set(state.selectRelated ?? [])) this.addPath(rootChildren, relationPath, "select");
|
|
283
316
|
for (const relationPath of new Set(state.prefetchRelated ?? [])) this.addPath(rootChildren, relationPath, "prefetch");
|
|
284
317
|
const { joinNodes, prefetchNodes } = this.buildPlannedChildren(rootChildren);
|
|
@@ -307,14 +340,13 @@ var QueryPlanner = class QueryPlanner {
|
|
|
307
340
|
const targetMeta = relation.targetMeta;
|
|
308
341
|
if (!targetMeta) throw new Error(`Relation path '${relationPath}' is missing target metadata.`);
|
|
309
342
|
builtPath = builtPath.length > 0 ? `${builtPath}__${segment}` : segment;
|
|
310
|
-
const
|
|
311
|
-
const nextNode = existing ?? {
|
|
343
|
+
const nextNode = currentChildren.get(segment) ?? {
|
|
312
344
|
segment,
|
|
313
345
|
relationEdge: relation,
|
|
314
346
|
relationPath: builtPath,
|
|
315
347
|
targetMeta,
|
|
316
|
-
provenance: new Set(),
|
|
317
|
-
children: new Map()
|
|
348
|
+
provenance: /* @__PURE__ */ new Set(),
|
|
349
|
+
children: /* @__PURE__ */ new Map()
|
|
318
350
|
};
|
|
319
351
|
nextNode.provenance.add(relationPath);
|
|
320
352
|
currentChildren.set(segment, nextNode);
|
|
@@ -341,7 +373,7 @@ var QueryPlanner = class QueryPlanner {
|
|
|
341
373
|
prefetchChildren
|
|
342
374
|
};
|
|
343
375
|
if (plannedNode.loadMode === InternalRelationHydrationLoadMode.JOIN) joinNodes.push(plannedNode);
|
|
344
|
-
else prefetchNodes.push(plannedNode);
|
|
376
|
+
else prefetchNodes.push(plannedNode);
|
|
345
377
|
}
|
|
346
378
|
return {
|
|
347
379
|
joinNodes,
|
|
@@ -349,11 +381,16 @@ else prefetchNodes.push(plannedNode);
|
|
|
349
381
|
};
|
|
350
382
|
}
|
|
351
383
|
};
|
|
352
|
-
|
|
353
384
|
//#endregion
|
|
354
385
|
//#region src/query/compiler/QueryCompiler.ts
|
|
355
386
|
const sqlSafetyAdapter = new OrmSqlSafetyAdapter();
|
|
387
|
+
/**
|
|
388
|
+
* Compiles immutable `QuerySet` state into parameterized SQL and recursive
|
|
389
|
+
* hydration execution artifacts.
|
|
390
|
+
*/
|
|
356
391
|
var QueryCompiler = class QueryCompiler {
|
|
392
|
+
meta;
|
|
393
|
+
adapter;
|
|
357
394
|
static BRAND = "tango.orm.query_compiler";
|
|
358
395
|
__tangoBrand = QueryCompiler.BRAND;
|
|
359
396
|
placeholders;
|
|
@@ -406,7 +443,7 @@ var QueryCompiler = class QueryCompiler {
|
|
|
406
443
|
ownerMeta: this.meta,
|
|
407
444
|
ownerAlias: table,
|
|
408
445
|
collectRootJoins: true,
|
|
409
|
-
rootSelectedFields: state.select?.map(String) ??
|
|
446
|
+
rootSelectedFields: state.select?.map(String) ?? void 0,
|
|
410
447
|
hiddenRootAliases,
|
|
411
448
|
joinCollection
|
|
412
449
|
}));
|
|
@@ -415,7 +452,7 @@ var QueryCompiler = class QueryCompiler {
|
|
|
415
452
|
ownerMeta: this.meta,
|
|
416
453
|
ownerAlias: table,
|
|
417
454
|
collectRootJoins: false,
|
|
418
|
-
rootSelectedFields: state.select?.map(String) ??
|
|
455
|
+
rootSelectedFields: state.select?.map(String) ?? void 0,
|
|
419
456
|
hiddenRootAliases,
|
|
420
457
|
joinCollection
|
|
421
458
|
}));
|
|
@@ -428,17 +465,15 @@ var QueryCompiler = class QueryCompiler {
|
|
|
428
465
|
const orderSQL = ` ORDER BY ${state.order?.length ? state.order.map((order) => `${validatedPlan.orderFields[String(order.by)]} ${order.dir.toUpperCase()}`).join(", ") : `${table}.${validatedPlan.meta.pk} ASC`}`;
|
|
429
466
|
const limitSQL = state.limit ? ` LIMIT ${state.limit}` : "";
|
|
430
467
|
const offsetSQL = state.offset ? ` OFFSET ${state.offset}` : "";
|
|
431
|
-
const sql = `SELECT ${select} FROM ${table}${joinCollection.joins.length ? ` ${joinCollection.joins.join(" ")}` : ""}${whereSQL}${orderSQL}${limitSQL}${offsetSQL}`;
|
|
432
|
-
const compiledHydrationPlan = compiledJoinNodes.length > 0 || compiledPrefetchNodes.length > 0 ? {
|
|
433
|
-
requestedPaths: hydrationPlan.requestedPaths,
|
|
434
|
-
hiddenRootAliases: [...new Set(hiddenRootAliases)],
|
|
435
|
-
joinNodes: compiledJoinNodes,
|
|
436
|
-
prefetchNodes: compiledPrefetchNodes
|
|
437
|
-
} : undefined;
|
|
438
468
|
return {
|
|
439
|
-
sql
|
|
469
|
+
sql: `SELECT ${select} FROM ${table}${joinCollection.joins.length ? ` ${joinCollection.joins.join(" ")}` : ""}${whereSQL}${orderSQL}${limitSQL}${offsetSQL}`,
|
|
440
470
|
params,
|
|
441
|
-
hydrationPlan:
|
|
471
|
+
hydrationPlan: compiledJoinNodes.length > 0 || compiledPrefetchNodes.length > 0 ? {
|
|
472
|
+
requestedPaths: hydrationPlan.requestedPaths,
|
|
473
|
+
hiddenRootAliases: [...new Set(hiddenRootAliases)],
|
|
474
|
+
joinNodes: compiledJoinNodes,
|
|
475
|
+
prefetchNodes: compiledPrefetchNodes
|
|
476
|
+
} : void 0
|
|
442
477
|
};
|
|
443
478
|
}
|
|
444
479
|
compilePrefetch(node, sourceValues) {
|
|
@@ -469,9 +504,8 @@ var QueryCompiler = class QueryCompiler {
|
|
|
469
504
|
joins: []
|
|
470
505
|
};
|
|
471
506
|
for (const joinChild of node.joinChildren) this.collectNestedJoinSql(joinChild, baseAlias, validatedTarget.columns, joinCollection);
|
|
472
|
-
const baseSelects = Object.keys(validatedTarget.columns).map((column) => `${baseAlias}.${column} AS ${column}`);
|
|
473
507
|
return {
|
|
474
|
-
sql: `SELECT ${[...
|
|
508
|
+
sql: `SELECT ${[...Object.keys(validatedTarget.columns).map((column) => `${baseAlias}.${column} AS ${column}`), ...joinCollection.selects].join(", ")} FROM ${validatedTarget.table} ${baseAlias}${joinCollection.joins.length ? ` ${joinCollection.joins.join(" ")}` : ""} WHERE ${baseAlias}.${validatedTarget.primaryKey} IN (${placeholders}) ORDER BY ${baseAlias}.${validatedTarget.primaryKey} ASC`,
|
|
475
509
|
params: targetIds
|
|
476
510
|
};
|
|
477
511
|
}
|
|
@@ -569,8 +603,7 @@ var QueryCompiler = class QueryCompiler {
|
|
|
569
603
|
}
|
|
570
604
|
buildRootHiddenSelects(nodes, table) {
|
|
571
605
|
return nodes.flatMap((node) => {
|
|
572
|
-
|
|
573
|
-
return [...select, ...this.buildRootHiddenSelects(node.prefetchChildren, table)];
|
|
606
|
+
return [...node.ownerSourceAccessor !== node.sourceKey ? [`${table}.${node.sourceKey} AS ${node.ownerSourceAccessor}`] : [], ...this.buildRootHiddenSelects(node.prefetchChildren, table)];
|
|
574
607
|
});
|
|
575
608
|
}
|
|
576
609
|
validatePrefetchTarget(node) {
|
|
@@ -650,8 +683,7 @@ var QueryCompiler = class QueryCompiler {
|
|
|
650
683
|
}
|
|
651
684
|
}
|
|
652
685
|
compileAtom(where, paramIndex, filterKeys) {
|
|
653
|
-
const
|
|
654
|
-
const { parts, params } = entries.reduce((accumulator, [key, value]) => {
|
|
686
|
+
const { parts, params } = Object.entries(where).filter(([, value]) => value !== void 0).reduce((accumulator, [key, value]) => {
|
|
655
687
|
const descriptor = filterKeys[String(key)];
|
|
656
688
|
const idx = paramIndex + accumulator.params.length;
|
|
657
689
|
const clause = descriptor.kind === InternalValidatedFilterDescriptorKind.COLUMN ? this.lookupToSQL(descriptor.qualifiedColumn, descriptor.lookup, value, idx) : this.compileRelationFilter(descriptor, value, idx);
|
|
@@ -767,9 +799,8 @@ var QueryCompiler = class QueryCompiler {
|
|
|
767
799
|
sql: "1=0",
|
|
768
800
|
params: []
|
|
769
801
|
};
|
|
770
|
-
const placeholders = this.placeholders.listFromOffset(entries.length, paramIndex - 1);
|
|
771
802
|
return {
|
|
772
|
-
sql: `${col} IN (${placeholders})`,
|
|
803
|
+
sql: `${col} IN (${this.placeholders.listFromOffset(entries.length, paramIndex - 1)})`,
|
|
773
804
|
params: entries
|
|
774
805
|
};
|
|
775
806
|
}
|
|
@@ -781,35 +812,26 @@ var QueryCompiler = class QueryCompiler {
|
|
|
781
812
|
sql: `${col} LIKE ${placeholder}`,
|
|
782
813
|
params: [`%${value}%`]
|
|
783
814
|
};
|
|
784
|
-
case InternalLookupType.ICONTAINS: {
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
params: [`%${String(value).toLowerCase()}%`]
|
|
789
|
-
};
|
|
790
|
-
}
|
|
815
|
+
case InternalLookupType.ICONTAINS: return {
|
|
816
|
+
sql: `${this.adapter.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`} LIKE ${placeholder}`,
|
|
817
|
+
params: [`%${String(value).toLowerCase()}%`]
|
|
818
|
+
};
|
|
791
819
|
case InternalLookupType.STARTSWITH: return {
|
|
792
820
|
sql: `${col} LIKE ${placeholder}`,
|
|
793
821
|
params: [`${value}%`]
|
|
794
822
|
};
|
|
795
|
-
case InternalLookupType.ISTARTSWITH: {
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
params: [`${String(value).toLowerCase()}%`]
|
|
800
|
-
};
|
|
801
|
-
}
|
|
823
|
+
case InternalLookupType.ISTARTSWITH: return {
|
|
824
|
+
sql: `${this.adapter.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`} LIKE ${placeholder}`,
|
|
825
|
+
params: [`${String(value).toLowerCase()}%`]
|
|
826
|
+
};
|
|
802
827
|
case InternalLookupType.ENDSWITH: return {
|
|
803
828
|
sql: `${col} LIKE ${placeholder}`,
|
|
804
829
|
params: [`%${value}`]
|
|
805
830
|
};
|
|
806
|
-
case InternalLookupType.IENDSWITH: {
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
params: [`%${String(value).toLowerCase()}`]
|
|
811
|
-
};
|
|
812
|
-
}
|
|
831
|
+
case InternalLookupType.IENDSWITH: return {
|
|
832
|
+
sql: `${this.adapter.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`} LIKE ${placeholder}`,
|
|
833
|
+
params: [`%${String(value).toLowerCase()}`]
|
|
834
|
+
};
|
|
813
835
|
default: throw new Error(`Unknown lookup: ${lookup}`);
|
|
814
836
|
}
|
|
815
837
|
}
|
|
@@ -818,7 +840,7 @@ var QueryCompiler = class QueryCompiler {
|
|
|
818
840
|
return value;
|
|
819
841
|
}
|
|
820
842
|
collectStateFilterKeys(state) {
|
|
821
|
-
const filterKeys = new Set();
|
|
843
|
+
const filterKeys = /* @__PURE__ */ new Set();
|
|
822
844
|
if (state.q) this.collectNodeFilterKeys(state.q, filterKeys);
|
|
823
845
|
state.excludes?.forEach((exclude) => this.collectNodeFilterKeys(exclude, filterKeys));
|
|
824
846
|
return [...filterKeys];
|
|
@@ -829,15 +851,17 @@ var QueryCompiler = class QueryCompiler {
|
|
|
829
851
|
if (node.node) this.collectNodeFilterKeys(node.node, filterKeys);
|
|
830
852
|
}
|
|
831
853
|
};
|
|
832
|
-
|
|
833
854
|
//#endregion
|
|
834
855
|
//#region src/query/compiler/index.ts
|
|
835
|
-
var compiler_exports = {};
|
|
836
|
-
__export(compiler_exports, { QueryCompiler: () => QueryCompiler });
|
|
837
|
-
|
|
856
|
+
var compiler_exports = /* @__PURE__ */ __exportAll({ QueryCompiler: () => QueryCompiler });
|
|
838
857
|
//#endregion
|
|
839
858
|
//#region src/query/domain/QueryResult.ts
|
|
840
859
|
let didWarnDeprecatedResults = false;
|
|
860
|
+
/**
|
|
861
|
+
* Values materialized by {@link QuerySet.fetch}, iterable like an array plus `length`, `map`, `at`, and `toArray`.
|
|
862
|
+
*
|
|
863
|
+
* Prefer iteration or `items` over the deprecated `results` getter, which warns once per process when accessed.
|
|
864
|
+
*/
|
|
841
865
|
var QueryResult = class QueryResult {
|
|
842
866
|
static BRAND = "tango.orm.query_result";
|
|
843
867
|
__tangoBrand = QueryResult.BRAND;
|
|
@@ -884,7 +908,6 @@ var QueryResult = class QueryResult {
|
|
|
884
908
|
return this.items;
|
|
885
909
|
}
|
|
886
910
|
};
|
|
887
|
-
|
|
888
911
|
//#endregion
|
|
889
912
|
//#region src/query/domain/internal/InternalRelationKind.ts
|
|
890
913
|
const InternalRelationKind = {
|
|
@@ -893,13 +916,16 @@ const InternalRelationKind = {
|
|
|
893
916
|
HAS_ONE: "hasOne",
|
|
894
917
|
MANY_TO_MANY: "manyToMany"
|
|
895
918
|
};
|
|
896
|
-
|
|
897
919
|
//#endregion
|
|
898
920
|
//#region src/query/domain/TableMetaFactory.ts
|
|
921
|
+
/**
|
|
922
|
+
* Build registry-backed recursive table metadata for query planning and
|
|
923
|
+
* hydration execution.
|
|
924
|
+
*/
|
|
899
925
|
var TableMetaFactory = class TableMetaFactory {
|
|
900
926
|
static create(model) {
|
|
901
|
-
const owner = model.metadata.key ? ModelRegistry.getOwner(model) :
|
|
902
|
-
const cache = new Map();
|
|
927
|
+
const owner = model.metadata.key ? ModelRegistry.getOwner(model) : void 0;
|
|
928
|
+
const cache = /* @__PURE__ */ new Map();
|
|
903
929
|
return TableMetaFactory.createWithCache(model, owner, cache);
|
|
904
930
|
}
|
|
905
931
|
static createWithCache(model, owner, cache) {
|
|
@@ -965,23 +991,19 @@ var TableMetaFactory = class TableMetaFactory {
|
|
|
965
991
|
return tableMeta;
|
|
966
992
|
}
|
|
967
993
|
};
|
|
968
|
-
|
|
969
994
|
//#endregion
|
|
970
995
|
//#region src/query/domain/index.ts
|
|
971
|
-
var domain_exports = {
|
|
972
|
-
__export(domain_exports, {
|
|
996
|
+
var domain_exports = /* @__PURE__ */ __exportAll({
|
|
973
997
|
InternalRelationHydrationCardinality: () => InternalRelationHydrationCardinality,
|
|
974
998
|
QueryResult: () => QueryResult,
|
|
975
999
|
TableMetaFactory: () => TableMetaFactory
|
|
976
1000
|
});
|
|
977
|
-
|
|
978
1001
|
//#endregion
|
|
979
1002
|
//#region src/query/domain/internal/InternalDirection.ts
|
|
980
1003
|
const InternalDirection = {
|
|
981
1004
|
ASC: "asc",
|
|
982
1005
|
DESC: "desc"
|
|
983
1006
|
};
|
|
984
|
-
|
|
985
1007
|
//#endregion
|
|
986
1008
|
//#region src/query/internal/isQNodeLike.ts
|
|
987
1009
|
function isQNodeLike(value) {
|
|
@@ -994,9 +1016,14 @@ function isQNodeLike(value) {
|
|
|
994
1016
|
default: return false;
|
|
995
1017
|
}
|
|
996
1018
|
}
|
|
997
|
-
|
|
998
1019
|
//#endregion
|
|
999
1020
|
//#region src/query/QBuilder.ts
|
|
1021
|
+
/**
|
|
1022
|
+
* Static builder for composing boolean query expressions.
|
|
1023
|
+
*
|
|
1024
|
+
* This mirrors Django's `Q(...)` composition patterns and is intended
|
|
1025
|
+
* for ergonomic construction of nested `AND`/`OR`/`NOT` trees.
|
|
1026
|
+
*/
|
|
1000
1027
|
var QBuilder = class QBuilder {
|
|
1001
1028
|
static BRAND = "tango.orm.q_builder";
|
|
1002
1029
|
__tangoBrand = QBuilder.BRAND;
|
|
@@ -1041,10 +1068,32 @@ var QBuilder = class QBuilder {
|
|
|
1041
1068
|
};
|
|
1042
1069
|
}
|
|
1043
1070
|
};
|
|
1044
|
-
|
|
1045
1071
|
//#endregion
|
|
1046
1072
|
//#region src/query/QuerySet.ts
|
|
1073
|
+
/**
|
|
1074
|
+
* Django-inspired query builder for constructing and executing database queries.
|
|
1075
|
+
* Provides a fluent API for filtering, ordering, pagination, projection, and
|
|
1076
|
+
* nested relation hydration.
|
|
1077
|
+
*
|
|
1078
|
+
* @template TModel - The full model row type used for query composition
|
|
1079
|
+
* @template TBaseResult - The selected base-row shape returned by execution methods
|
|
1080
|
+
* @template TSourceModel - The source Tango model used for typed relation metadata
|
|
1081
|
+
* @template THydrated - Relation properties accumulated by eager-loading calls
|
|
1082
|
+
*
|
|
1083
|
+
* @example
|
|
1084
|
+
* ```typescript
|
|
1085
|
+
* const users = await TodoModel.objects
|
|
1086
|
+
* .query()
|
|
1087
|
+
* .filter({ active: true })
|
|
1088
|
+
* .filter(Q.or({ role: 'admin' }, { role: 'moderator' }))
|
|
1089
|
+
* .orderBy('-createdAt')
|
|
1090
|
+
* .limit(10)
|
|
1091
|
+
* .fetch();
|
|
1092
|
+
* ```
|
|
1093
|
+
*/
|
|
1047
1094
|
var QuerySet = class QuerySet {
|
|
1095
|
+
executor;
|
|
1096
|
+
state;
|
|
1048
1097
|
static BRAND = "tango.orm.query_set";
|
|
1049
1098
|
__tangoBrand = QuerySet.BRAND;
|
|
1050
1099
|
evaluationCache;
|
|
@@ -1186,8 +1235,7 @@ var QuerySet = class QuerySet {
|
|
|
1186
1235
|
async fetch(shape) {
|
|
1187
1236
|
const baseResult = await this.getOrCreateEvaluationCache();
|
|
1188
1237
|
if (!shape) return baseResult;
|
|
1189
|
-
|
|
1190
|
-
return new QueryResult(results);
|
|
1238
|
+
return new QueryResult(typeof shape === "function" ? baseResult.items.map(shape) : this.normalizeHydratedRowsForParserShape(baseResult.items).map((row) => shape.parse(row)));
|
|
1191
1239
|
}
|
|
1192
1240
|
/**
|
|
1193
1241
|
* Async iterable surface for `for await (... of queryset)`.
|
|
@@ -1211,9 +1259,8 @@ var QuerySet = class QuerySet {
|
|
|
1211
1259
|
return this.fetchOne(shape);
|
|
1212
1260
|
}
|
|
1213
1261
|
async last(shape) {
|
|
1214
|
-
if (this.state.limit !==
|
|
1215
|
-
const
|
|
1216
|
-
const row = page.at(-1);
|
|
1262
|
+
if (this.state.limit !== void 0 || this.state.offset !== void 0) {
|
|
1263
|
+
const row = (await this.fetch()).at(-1);
|
|
1217
1264
|
if (!row) return null;
|
|
1218
1265
|
return this.shapeFetchedRow(row, shape);
|
|
1219
1266
|
}
|
|
@@ -1222,16 +1269,13 @@ var QuerySet = class QuerySet {
|
|
|
1222
1269
|
by: this.executor.meta.pk,
|
|
1223
1270
|
dir: InternalDirection.DESC
|
|
1224
1271
|
}];
|
|
1225
|
-
|
|
1272
|
+
return this.spawn({
|
|
1226
1273
|
...this.state,
|
|
1227
1274
|
order: effectiveOrder
|
|
1228
|
-
});
|
|
1229
|
-
return qs.limit(1).fetchOne(shape);
|
|
1275
|
+
}).limit(1).fetchOne(shape);
|
|
1230
1276
|
}
|
|
1231
1277
|
async get(q, shape) {
|
|
1232
|
-
const
|
|
1233
|
-
const page = await limited.fetch();
|
|
1234
|
-
const rows = page.items;
|
|
1278
|
+
const rows = (await this.filter(q).limit(2).fetch()).items;
|
|
1235
1279
|
if (rows.length === 0) throw new NotFoundError(`${this.executor.meta.table}: no matching record`);
|
|
1236
1280
|
if (rows.length > 1) throw new MultipleObjectsReturned(`${this.executor.meta.table}: more than one matching record`);
|
|
1237
1281
|
return this.shapeFetchedRow(rows[0], shape);
|
|
@@ -1240,8 +1284,7 @@ var QuerySet = class QuerySet {
|
|
|
1240
1284
|
* Execute a `COUNT(*)` query for the current filtered state.
|
|
1241
1285
|
*/
|
|
1242
1286
|
async count() {
|
|
1243
|
-
const
|
|
1244
|
-
const compiled = compiler.compile(this.withoutHydrationState());
|
|
1287
|
+
const compiled = new QueryCompiler(this.executor.meta, this.executor.adapter).compile(this.withoutHydrationState());
|
|
1245
1288
|
const countQuery = `SELECT COUNT(*) as count FROM (${compiled.sql}) AS tango_count_subquery`;
|
|
1246
1289
|
const rows = await this.executor.client.query(countQuery, compiled.params);
|
|
1247
1290
|
return Number(rows.rows[0]?.count ?? 0);
|
|
@@ -1250,8 +1293,7 @@ var QuerySet = class QuerySet {
|
|
|
1250
1293
|
* Return whether at least one row matches the current query state.
|
|
1251
1294
|
*/
|
|
1252
1295
|
async exists() {
|
|
1253
|
-
|
|
1254
|
-
return count > 0;
|
|
1296
|
+
return await this.count() > 0;
|
|
1255
1297
|
}
|
|
1256
1298
|
shapeFetchedRow(row, shape) {
|
|
1257
1299
|
if (!shape) return row;
|
|
@@ -1261,20 +1303,18 @@ var QuerySet = class QuerySet {
|
|
|
1261
1303
|
}
|
|
1262
1304
|
getOrCreateEvaluationCache() {
|
|
1263
1305
|
if (!this.evaluationCache) this.evaluationCache = this.evaluateRows().catch((error) => {
|
|
1264
|
-
this.evaluationCache =
|
|
1306
|
+
this.evaluationCache = void 0;
|
|
1265
1307
|
throw error;
|
|
1266
1308
|
});
|
|
1267
1309
|
return this.evaluationCache;
|
|
1268
1310
|
}
|
|
1269
1311
|
async evaluateRows() {
|
|
1270
|
-
const
|
|
1271
|
-
const compiled = compiler.compile(this.state);
|
|
1312
|
+
const compiled = new QueryCompiler(this.executor.meta, this.executor.adapter).compile(this.state);
|
|
1272
1313
|
const rows = await this.executor.run(compiled);
|
|
1273
1314
|
const normalizedRows = this.normalizeRowsForSchemaParsing(rows);
|
|
1274
1315
|
const hydratedRows = await this.hydrateRows(normalizedRows, compiled);
|
|
1275
1316
|
this.attachRootRecordAccessors(hydratedRows);
|
|
1276
|
-
|
|
1277
|
-
return new QueryResult(projectedRows);
|
|
1317
|
+
return new QueryResult(hydratedRows);
|
|
1278
1318
|
}
|
|
1279
1319
|
normalizeRowsForSchemaParsing(rows) {
|
|
1280
1320
|
if (this.executor.adapter.dialect !== InternalDialect.SQLITE) return [...rows];
|
|
@@ -1292,8 +1332,8 @@ var QuerySet = class QuerySet {
|
|
|
1292
1332
|
if (!compiled.hydrationPlan) return rows;
|
|
1293
1333
|
const hydratedRows = rows.map((row) => ({ ...row }));
|
|
1294
1334
|
this.attachRootRecordAccessors(hydratedRows);
|
|
1295
|
-
const canonicalEntities = new Map();
|
|
1296
|
-
const queuedJoinPrefetchOwners = new Map();
|
|
1335
|
+
const canonicalEntities = /* @__PURE__ */ new Map();
|
|
1336
|
+
const queuedJoinPrefetchOwners = /* @__PURE__ */ new Map();
|
|
1297
1337
|
const compiler = new QueryCompiler(this.executor.meta, this.executor.adapter);
|
|
1298
1338
|
for (const row of hydratedRows) this.hydrateJoinNodesForOwner(row, row, compiled.hydrationPlan.joinNodes, canonicalEntities, queuedJoinPrefetchOwners);
|
|
1299
1339
|
for (const node of compiled.hydrationPlan.prefetchNodes) await this.hydratePrefetchNode(node, hydratedRows, canonicalEntities, compiler);
|
|
@@ -1323,7 +1363,7 @@ var QuerySet = class QuerySet {
|
|
|
1323
1363
|
const value = rawRow[alias];
|
|
1324
1364
|
delete rawRow[alias];
|
|
1325
1365
|
target[column] = this.normalizeColumnValue(node.targetColumns[column], value);
|
|
1326
|
-
if (value !== null && value !==
|
|
1366
|
+
if (value !== null && value !== void 0) hasTargetValue = true;
|
|
1327
1367
|
}
|
|
1328
1368
|
if (!hasTargetValue) {
|
|
1329
1369
|
owner[node.relationName] = null;
|
|
@@ -1346,14 +1386,13 @@ var QuerySet = class QuerySet {
|
|
|
1346
1386
|
if (owners.length === 0) return;
|
|
1347
1387
|
const groupedOwners = this.groupOwnersByAccessor(owners, node.ownerSourceAccessor);
|
|
1348
1388
|
const sourceValues = [...groupedOwners.keys()];
|
|
1349
|
-
const
|
|
1350
|
-
if (!isManyToMany) for (const owner of owners) owner[node.relationName] = node.cardinality === InternalRelationHydrationCardinality.MANY ? [] : null;
|
|
1389
|
+
if (!!!node.throughTable) for (const owner of owners) owner[node.relationName] = node.cardinality === InternalRelationHydrationCardinality.MANY ? [] : null;
|
|
1351
1390
|
if (sourceValues.length === 0) return;
|
|
1352
1391
|
const sourceChunks = this.chunkValues(sourceValues, 500);
|
|
1353
1392
|
const compiledPrefetch = compiler.compilePrefetch(node, sourceChunks[0]);
|
|
1354
1393
|
if (compiledPrefetch.kind === InternalPrefetchQueryKind.MANY_TO_MANY) {
|
|
1355
|
-
const idsByOwner = new Map();
|
|
1356
|
-
const uniqueTargetIds = new Set();
|
|
1394
|
+
const idsByOwner = /* @__PURE__ */ new Map();
|
|
1395
|
+
const uniqueTargetIds = /* @__PURE__ */ new Set();
|
|
1357
1396
|
for (const chunk of sourceChunks) {
|
|
1358
1397
|
const chunkCompiled = compiler.compilePrefetch(node, chunk);
|
|
1359
1398
|
const throughResult = await this.executor.client.query(chunkCompiled.throughSql, chunkCompiled.throughParams);
|
|
@@ -1380,22 +1419,22 @@ var QuerySet = class QuerySet {
|
|
|
1380
1419
|
if (typeof primaryKey === "string" || typeof primaryKey === "number") targets[primaryKey] = canonical;
|
|
1381
1420
|
}
|
|
1382
1421
|
}
|
|
1383
|
-
const canonicalChildren
|
|
1384
|
-
const handledOwners = new Set();
|
|
1422
|
+
const canonicalChildren = /* @__PURE__ */ new Map();
|
|
1423
|
+
const handledOwners = /* @__PURE__ */ new Set();
|
|
1385
1424
|
for (const [ownerId, ids] of idsByOwner.entries()) {
|
|
1386
1425
|
const bucket = ids.map((id) => targets[id]).filter((value) => !!value);
|
|
1387
1426
|
for (const owner of groupedOwners.get(ownerId) ?? []) {
|
|
1388
1427
|
this.primeManyToManyOwnerCache(owner, node.relationName, bucket);
|
|
1389
1428
|
handledOwners.add(owner);
|
|
1390
1429
|
}
|
|
1391
|
-
for (const child of bucket) canonicalChildren
|
|
1430
|
+
for (const child of bucket) canonicalChildren.set(child[node.targetPrimaryKey], child);
|
|
1392
1431
|
}
|
|
1393
1432
|
for (const owner of owners) if (!handledOwners.has(owner)) this.primeManyToManyOwnerCache(owner, node.relationName, []);
|
|
1394
|
-
const childOwners
|
|
1395
|
-
for (const childNode of node.prefetchChildren) await this.hydratePrefetchNode(childNode, childOwners
|
|
1433
|
+
const childOwners = [...canonicalChildren.values()];
|
|
1434
|
+
for (const childNode of node.prefetchChildren) await this.hydratePrefetchNode(childNode, childOwners, canonicalEntities, compiler);
|
|
1396
1435
|
return;
|
|
1397
1436
|
}
|
|
1398
|
-
const canonicalChildren = new Map();
|
|
1437
|
+
const canonicalChildren = /* @__PURE__ */ new Map();
|
|
1399
1438
|
for (const chunk of sourceChunks) {
|
|
1400
1439
|
const chunkCompiled = compiler.compilePrefetch(node, chunk);
|
|
1401
1440
|
const result = await this.executor.client.query(chunkCompiled.sql, chunkCompiled.params);
|
|
@@ -1406,7 +1445,7 @@ var QuerySet = class QuerySet {
|
|
|
1406
1445
|
const key = normalized[chunkCompiled.targetKey];
|
|
1407
1446
|
if (typeof key !== "string" && typeof key !== "number") continue;
|
|
1408
1447
|
for (const owner of groupedOwners.get(key) ?? []) if (node.cardinality === InternalRelationHydrationCardinality.MANY) owner[node.relationName].push(canonical);
|
|
1409
|
-
else if (owner[node.relationName] === null) owner[node.relationName] = canonical;
|
|
1448
|
+
else if (owner[node.relationName] === null) owner[node.relationName] = canonical;
|
|
1410
1449
|
const childPrimaryKey = canonical[node.targetPrimaryKey];
|
|
1411
1450
|
if (typeof childPrimaryKey === "string" || typeof childPrimaryKey === "number") canonicalChildren.set(childPrimaryKey, canonical);
|
|
1412
1451
|
}
|
|
@@ -1422,7 +1461,7 @@ else if (owner[node.relationName] === null) owner[node.relationName] = canonical
|
|
|
1422
1461
|
return chunks;
|
|
1423
1462
|
}
|
|
1424
1463
|
groupOwnersByAccessor(owners, accessor) {
|
|
1425
|
-
const grouped = new Map();
|
|
1464
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
1426
1465
|
for (const owner of owners) {
|
|
1427
1466
|
const key = owner[accessor];
|
|
1428
1467
|
if (typeof key !== "string" && typeof key !== "number") continue;
|
|
@@ -1435,7 +1474,7 @@ else if (owner[node.relationName] === null) owner[node.relationName] = canonical
|
|
|
1435
1474
|
canonicalizeEntity(node, row, canonicalEntities) {
|
|
1436
1475
|
const primaryKeyValue = row[node.targetPrimaryKey];
|
|
1437
1476
|
if (typeof primaryKeyValue !== "string" && typeof primaryKeyValue !== "number") return row;
|
|
1438
|
-
const byModel = canonicalEntities.get(node.targetModelKey) ?? new Map();
|
|
1477
|
+
const byModel = canonicalEntities.get(node.targetModelKey) ?? /* @__PURE__ */ new Map();
|
|
1439
1478
|
const existing = byModel.get(primaryKeyValue);
|
|
1440
1479
|
if (existing) {
|
|
1441
1480
|
Object.assign(existing, row);
|
|
@@ -1481,13 +1520,18 @@ else if (owner[node.relationName] === null) owner[node.relationName] = canonical
|
|
|
1481
1520
|
return normalized ?? row;
|
|
1482
1521
|
}
|
|
1483
1522
|
withoutHydrationState() {
|
|
1484
|
-
const { selectRelated: _selectRelated, prefetchRelated: _prefetchRelated
|
|
1523
|
+
const { selectRelated: _selectRelated, prefetchRelated: _prefetchRelated, ...rest } = this.state;
|
|
1485
1524
|
return rest;
|
|
1486
1525
|
}
|
|
1487
1526
|
};
|
|
1488
|
-
|
|
1489
1527
|
//#endregion
|
|
1490
1528
|
//#region src/query/ModelQuerySet.ts
|
|
1529
|
+
/**
|
|
1530
|
+
* Concrete `QuerySet` implementation returned by `Model.objects.query()`.
|
|
1531
|
+
*
|
|
1532
|
+
* It executes the accumulated queryset state directly against the bound
|
|
1533
|
+
* model executor.
|
|
1534
|
+
*/
|
|
1491
1535
|
var ModelQuerySet = class ModelQuerySet extends QuerySet {
|
|
1492
1536
|
constructor(executor, state = {}) {
|
|
1493
1537
|
super(executor, state);
|
|
@@ -1496,11 +1540,9 @@ var ModelQuerySet = class ModelQuerySet extends QuerySet {
|
|
|
1496
1540
|
return new ModelQuerySet(this.executor, state);
|
|
1497
1541
|
}
|
|
1498
1542
|
};
|
|
1499
|
-
|
|
1500
1543
|
//#endregion
|
|
1501
1544
|
//#region src/query/index.ts
|
|
1502
|
-
var query_exports = {
|
|
1503
|
-
__export(query_exports, {
|
|
1545
|
+
var query_exports = /* @__PURE__ */ __exportAll({
|
|
1504
1546
|
ModelQuerySet: () => ModelQuerySet,
|
|
1505
1547
|
Q: () => QBuilder,
|
|
1506
1548
|
QBuilder: () => QBuilder,
|
|
@@ -1510,7 +1552,7 @@ __export(query_exports, {
|
|
|
1510
1552
|
compiler: () => compiler_exports,
|
|
1511
1553
|
domain: () => domain_exports
|
|
1512
1554
|
});
|
|
1513
|
-
|
|
1514
1555
|
//#endregion
|
|
1515
|
-
export {
|
|
1516
|
-
|
|
1556
|
+
export { isQNodeLike as a, InternalRelationKind as c, QueryCompiler as d, OrmSqlSafetyAdapter as f, QBuilder as i, QueryResult as l, InternalQNodeType as m, ModelQuerySet as n, domain_exports as o, InternalSqlValidationPlanKind as p, QuerySet as r, TableMetaFactory as s, query_exports as t, compiler_exports as u };
|
|
1557
|
+
|
|
1558
|
+
//# sourceMappingURL=query-CP1UMIX6.js.map
|