@warlock.js/cascade 4.0.92 → 4.0.93
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/cjs/contracts/database-driver.contract.d.ts +118 -0
- package/cjs/contracts/database-driver.contract.d.ts.map +1 -1
- package/cjs/contracts/migration-driver.contract.d.ts +14 -0
- package/cjs/contracts/migration-driver.contract.d.ts.map +1 -1
- package/cjs/contracts/query-builder.contract.d.ts +410 -1
- package/cjs/contracts/query-builder.contract.d.ts.map +1 -1
- package/cjs/data-source/data-source-registry.d.ts +4 -0
- package/cjs/data-source/data-source-registry.d.ts.map +1 -1
- package/cjs/data-source/data-source-registry.js +7 -0
- package/cjs/data-source/data-source-registry.js.map +1 -1
- package/cjs/drivers/mongodb/mongodb-blueprint.d.ts.map +1 -0
- package/cjs/drivers/mongodb/mongodb-blueprint.js.map +1 -0
- package/{esm/drivers/mongo → cjs/drivers/mongodb}/mongodb-driver.d.ts +49 -0
- package/cjs/drivers/mongodb/mongodb-driver.d.ts.map +1 -0
- package/cjs/drivers/{mongo → mongodb}/mongodb-driver.js +125 -8
- package/cjs/drivers/mongodb/mongodb-driver.js.map +1 -0
- package/cjs/drivers/{mongo/mongo-id-generator.d.ts → mongodb/mongodb-id-generator.d.ts} +1 -1
- package/cjs/drivers/mongodb/mongodb-id-generator.d.ts.map +1 -0
- package/cjs/drivers/{mongo/mongo-id-generator.js → mongodb/mongodb-id-generator.js} +1 -1
- package/cjs/drivers/mongodb/mongodb-id-generator.js.map +1 -0
- package/cjs/drivers/{mongo/mongo-migration-driver.d.ts → mongodb/mongodb-migration-driver.d.ts} +10 -1
- package/cjs/drivers/mongodb/mongodb-migration-driver.d.ts.map +1 -0
- package/cjs/drivers/{mongo/mongo-migration-driver.js → mongodb/mongodb-migration-driver.js} +18 -1
- package/cjs/drivers/mongodb/mongodb-migration-driver.js.map +1 -0
- package/cjs/drivers/{mongo/mongo-query-builder.d.ts → mongodb/mongodb-query-builder.d.ts} +172 -4
- package/cjs/drivers/mongodb/mongodb-query-builder.d.ts.map +1 -0
- package/cjs/drivers/{mongo/mongo-query-builder.js → mongodb/mongodb-query-builder.js} +220 -14
- package/cjs/drivers/mongodb/mongodb-query-builder.js.map +1 -0
- package/{esm/drivers/mongo/mongo-query-operations.d.ts → cjs/drivers/mongodb/mongodb-query-operations.d.ts} +16 -16
- package/cjs/drivers/mongodb/mongodb-query-operations.d.ts.map +1 -0
- package/cjs/drivers/{mongo/mongo-query-operations.js → mongodb/mongodb-query-operations.js} +22 -22
- package/cjs/drivers/mongodb/mongodb-query-operations.js.map +1 -0
- package/cjs/drivers/{mongo/mongo-query-parser.d.ts → mongodb/mongodb-query-parser.d.ts} +2 -2
- package/cjs/drivers/mongodb/mongodb-query-parser.d.ts.map +1 -0
- package/cjs/drivers/{mongo/mongo-query-parser.js → mongodb/mongodb-query-parser.js} +87 -87
- package/cjs/drivers/mongodb/mongodb-query-parser.js.map +1 -0
- package/cjs/drivers/{mongo/mongo-sync-adapter.d.ts → mongodb/mongodb-sync-adapter.d.ts} +2 -2
- package/cjs/drivers/mongodb/mongodb-sync-adapter.d.ts.map +1 -0
- package/cjs/drivers/{mongo/mongo-sync-adapter.js → mongodb/mongodb-sync-adapter.js} +2 -2
- package/cjs/drivers/mongodb/mongodb-sync-adapter.js.map +1 -0
- package/{esm/drivers/mongo → cjs/drivers/mongodb}/types.d.ts +2 -2
- package/cjs/drivers/mongodb/types.d.ts.map +1 -0
- package/cjs/drivers/postgres/index.d.ts +16 -0
- package/cjs/drivers/postgres/index.d.ts.map +1 -0
- package/cjs/drivers/postgres/postgres-blueprint.d.ts +64 -0
- package/cjs/drivers/postgres/postgres-blueprint.d.ts.map +1 -0
- package/cjs/drivers/postgres/postgres-blueprint.js +121 -0
- package/cjs/drivers/postgres/postgres-blueprint.js.map +1 -0
- package/cjs/drivers/postgres/postgres-dialect.d.ts +135 -0
- package/cjs/drivers/postgres/postgres-dialect.d.ts.map +1 -0
- package/cjs/drivers/postgres/postgres-dialect.js +245 -0
- package/cjs/drivers/postgres/postgres-dialect.js.map +1 -0
- package/cjs/drivers/postgres/postgres-driver.d.ts +360 -0
- package/cjs/drivers/postgres/postgres-driver.d.ts.map +1 -0
- package/cjs/drivers/postgres/postgres-driver.js +763 -0
- package/cjs/drivers/postgres/postgres-driver.js.map +1 -0
- package/cjs/drivers/postgres/postgres-migration-driver.d.ts +297 -0
- package/cjs/drivers/postgres/postgres-migration-driver.d.ts.map +1 -0
- package/cjs/drivers/postgres/postgres-migration-driver.js +578 -0
- package/cjs/drivers/postgres/postgres-migration-driver.js.map +1 -0
- package/cjs/drivers/postgres/postgres-query-builder.d.ts +824 -0
- package/cjs/drivers/postgres/postgres-query-builder.d.ts.map +1 -0
- package/cjs/drivers/postgres/postgres-query-builder.js +1800 -0
- package/cjs/drivers/postgres/postgres-query-builder.js.map +1 -0
- package/cjs/drivers/postgres/postgres-query-parser.d.ts +308 -0
- package/cjs/drivers/postgres/postgres-query-parser.d.ts.map +1 -0
- package/cjs/drivers/postgres/postgres-query-parser.js +706 -0
- package/cjs/drivers/postgres/postgres-query-parser.js.map +1 -0
- package/cjs/drivers/postgres/postgres-sync-adapter.d.ts +83 -0
- package/cjs/drivers/postgres/postgres-sync-adapter.d.ts.map +1 -0
- package/cjs/drivers/postgres/postgres-sync-adapter.js +197 -0
- package/cjs/drivers/postgres/postgres-sync-adapter.js.map +1 -0
- package/cjs/drivers/postgres/types.d.ts +142 -0
- package/cjs/drivers/postgres/types.d.ts.map +1 -0
- package/cjs/drivers/sql/index.d.ts +10 -0
- package/cjs/drivers/sql/index.d.ts.map +1 -0
- package/cjs/drivers/sql/sql-dialect.contract.d.ts +203 -0
- package/cjs/drivers/sql/sql-dialect.contract.d.ts.map +1 -0
- package/cjs/drivers/sql/sql-types.d.ts +202 -0
- package/cjs/drivers/sql/sql-types.d.ts.map +1 -0
- package/cjs/index.d.ts +9 -6
- package/cjs/index.d.ts.map +1 -1
- package/cjs/index.js +1 -1
- package/cjs/migration/migration-runner.d.ts.map +1 -1
- package/cjs/migration/migration-runner.js +3 -0
- package/cjs/migration/migration-runner.js.map +1 -1
- package/cjs/model/model.d.ts +236 -1
- package/cjs/model/model.d.ts.map +1 -1
- package/cjs/model/model.js +203 -4
- package/cjs/model/model.js.map +1 -1
- package/cjs/relations/helpers.d.ts +156 -0
- package/cjs/relations/helpers.d.ts.map +1 -0
- package/cjs/relations/helpers.js +197 -0
- package/cjs/relations/helpers.js.map +1 -0
- package/cjs/relations/index.d.ts +33 -0
- package/cjs/relations/index.d.ts.map +1 -0
- package/cjs/relations/pivot-operations.d.ts +160 -0
- package/cjs/relations/pivot-operations.d.ts.map +1 -0
- package/cjs/relations/pivot-operations.js +293 -0
- package/cjs/relations/pivot-operations.js.map +1 -0
- package/cjs/relations/relation-loader.d.ts +194 -0
- package/cjs/relations/relation-loader.d.ts.map +1 -0
- package/cjs/relations/relation-loader.js +466 -0
- package/cjs/relations/relation-loader.js.map +1 -0
- package/cjs/relations/types.d.ts +280 -0
- package/cjs/relations/types.d.ts.map +1 -0
- package/cjs/sync/model-sync-operation.js +1 -1
- package/cjs/sync/model-sync-operation.js.map +1 -1
- package/cjs/utils/connect-to-database.d.ts.map +1 -1
- package/cjs/utils/connect-to-database.js +15 -3
- package/cjs/utils/connect-to-database.js.map +1 -1
- package/cjs/utils/define-model.d.ts +51 -29
- package/cjs/utils/define-model.d.ts.map +1 -1
- package/cjs/validation/rules/database-model-rule.js +1 -1
- package/cjs/validation/rules/database-model-rule.js.map +1 -1
- package/esm/contracts/database-driver.contract.d.ts +118 -0
- package/esm/contracts/database-driver.contract.d.ts.map +1 -1
- package/esm/contracts/migration-driver.contract.d.ts +14 -0
- package/esm/contracts/migration-driver.contract.d.ts.map +1 -1
- package/esm/contracts/query-builder.contract.d.ts +410 -1
- package/esm/contracts/query-builder.contract.d.ts.map +1 -1
- package/esm/data-source/data-source-registry.d.ts +4 -0
- package/esm/data-source/data-source-registry.d.ts.map +1 -1
- package/esm/data-source/data-source-registry.js +7 -0
- package/esm/data-source/data-source-registry.js.map +1 -1
- package/esm/drivers/mongodb/mongodb-blueprint.d.ts.map +1 -0
- package/esm/drivers/mongodb/mongodb-blueprint.js.map +1 -0
- package/{cjs/drivers/mongo → esm/drivers/mongodb}/mongodb-driver.d.ts +49 -0
- package/esm/drivers/mongodb/mongodb-driver.d.ts.map +1 -0
- package/esm/drivers/{mongo → mongodb}/mongodb-driver.js +121 -4
- package/esm/drivers/mongodb/mongodb-driver.js.map +1 -0
- package/esm/drivers/{mongo/mongo-id-generator.d.ts → mongodb/mongodb-id-generator.d.ts} +1 -1
- package/esm/drivers/mongodb/mongodb-id-generator.d.ts.map +1 -0
- package/esm/drivers/{mongo/mongo-id-generator.js → mongodb/mongodb-id-generator.js} +1 -1
- package/esm/drivers/mongodb/mongodb-id-generator.js.map +1 -0
- package/esm/drivers/{mongo/mongo-migration-driver.d.ts → mongodb/mongodb-migration-driver.d.ts} +10 -1
- package/esm/drivers/mongodb/mongodb-migration-driver.d.ts.map +1 -0
- package/esm/drivers/{mongo/mongo-migration-driver.js → mongodb/mongodb-migration-driver.js} +18 -1
- package/esm/drivers/mongodb/mongodb-migration-driver.js.map +1 -0
- package/esm/drivers/{mongo/mongo-query-builder.d.ts → mongodb/mongodb-query-builder.d.ts} +172 -4
- package/esm/drivers/mongodb/mongodb-query-builder.d.ts.map +1 -0
- package/esm/drivers/{mongo/mongo-query-builder.js → mongodb/mongodb-query-builder.js} +218 -12
- package/esm/drivers/mongodb/mongodb-query-builder.js.map +1 -0
- package/{cjs/drivers/mongo/mongo-query-operations.d.ts → esm/drivers/mongodb/mongodb-query-operations.d.ts} +16 -16
- package/esm/drivers/mongodb/mongodb-query-operations.d.ts.map +1 -0
- package/esm/drivers/{mongo/mongo-query-operations.js → mongodb/mongodb-query-operations.js} +22 -22
- package/esm/drivers/mongodb/mongodb-query-operations.js.map +1 -0
- package/esm/drivers/{mongo/mongo-query-parser.d.ts → mongodb/mongodb-query-parser.d.ts} +2 -2
- package/esm/drivers/mongodb/mongodb-query-parser.d.ts.map +1 -0
- package/esm/drivers/{mongo/mongo-query-parser.js → mongodb/mongodb-query-parser.js} +87 -87
- package/esm/drivers/mongodb/mongodb-query-parser.js.map +1 -0
- package/esm/drivers/{mongo/mongo-sync-adapter.d.ts → mongodb/mongodb-sync-adapter.d.ts} +2 -2
- package/esm/drivers/mongodb/mongodb-sync-adapter.d.ts.map +1 -0
- package/esm/drivers/{mongo/mongo-sync-adapter.js → mongodb/mongodb-sync-adapter.js} +2 -2
- package/esm/drivers/mongodb/mongodb-sync-adapter.js.map +1 -0
- package/{cjs/drivers/mongo → esm/drivers/mongodb}/types.d.ts +2 -2
- package/esm/drivers/mongodb/types.d.ts.map +1 -0
- package/esm/drivers/postgres/index.d.ts +16 -0
- package/esm/drivers/postgres/index.d.ts.map +1 -0
- package/esm/drivers/postgres/postgres-blueprint.d.ts +64 -0
- package/esm/drivers/postgres/postgres-blueprint.d.ts.map +1 -0
- package/esm/drivers/postgres/postgres-blueprint.js +121 -0
- package/esm/drivers/postgres/postgres-blueprint.js.map +1 -0
- package/esm/drivers/postgres/postgres-dialect.d.ts +135 -0
- package/esm/drivers/postgres/postgres-dialect.d.ts.map +1 -0
- package/esm/drivers/postgres/postgres-dialect.js +245 -0
- package/esm/drivers/postgres/postgres-dialect.js.map +1 -0
- package/esm/drivers/postgres/postgres-driver.d.ts +360 -0
- package/esm/drivers/postgres/postgres-driver.d.ts.map +1 -0
- package/esm/drivers/postgres/postgres-driver.js +763 -0
- package/esm/drivers/postgres/postgres-driver.js.map +1 -0
- package/esm/drivers/postgres/postgres-migration-driver.d.ts +297 -0
- package/esm/drivers/postgres/postgres-migration-driver.d.ts.map +1 -0
- package/esm/drivers/postgres/postgres-migration-driver.js +578 -0
- package/esm/drivers/postgres/postgres-migration-driver.js.map +1 -0
- package/esm/drivers/postgres/postgres-query-builder.d.ts +824 -0
- package/esm/drivers/postgres/postgres-query-builder.d.ts.map +1 -0
- package/esm/drivers/postgres/postgres-query-builder.js +1800 -0
- package/esm/drivers/postgres/postgres-query-builder.js.map +1 -0
- package/esm/drivers/postgres/postgres-query-parser.d.ts +308 -0
- package/esm/drivers/postgres/postgres-query-parser.d.ts.map +1 -0
- package/esm/drivers/postgres/postgres-query-parser.js +706 -0
- package/esm/drivers/postgres/postgres-query-parser.js.map +1 -0
- package/esm/drivers/postgres/postgres-sync-adapter.d.ts +83 -0
- package/esm/drivers/postgres/postgres-sync-adapter.d.ts.map +1 -0
- package/esm/drivers/postgres/postgres-sync-adapter.js +197 -0
- package/esm/drivers/postgres/postgres-sync-adapter.js.map +1 -0
- package/esm/drivers/postgres/types.d.ts +142 -0
- package/esm/drivers/postgres/types.d.ts.map +1 -0
- package/esm/drivers/sql/index.d.ts +10 -0
- package/esm/drivers/sql/index.d.ts.map +1 -0
- package/esm/drivers/sql/sql-dialect.contract.d.ts +203 -0
- package/esm/drivers/sql/sql-dialect.contract.d.ts.map +1 -0
- package/esm/drivers/sql/sql-types.d.ts +202 -0
- package/esm/drivers/sql/sql-types.d.ts.map +1 -0
- package/esm/index.d.ts +9 -6
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -1
- package/esm/migration/migration-runner.d.ts.map +1 -1
- package/esm/migration/migration-runner.js +3 -0
- package/esm/migration/migration-runner.js.map +1 -1
- package/esm/model/model.d.ts +236 -1
- package/esm/model/model.d.ts.map +1 -1
- package/esm/model/model.js +203 -4
- package/esm/model/model.js.map +1 -1
- package/esm/relations/helpers.d.ts +156 -0
- package/esm/relations/helpers.d.ts.map +1 -0
- package/esm/relations/helpers.js +197 -0
- package/esm/relations/helpers.js.map +1 -0
- package/esm/relations/index.d.ts +33 -0
- package/esm/relations/index.d.ts.map +1 -0
- package/esm/relations/pivot-operations.d.ts +160 -0
- package/esm/relations/pivot-operations.d.ts.map +1 -0
- package/esm/relations/pivot-operations.js +293 -0
- package/esm/relations/pivot-operations.js.map +1 -0
- package/esm/relations/relation-loader.d.ts +194 -0
- package/esm/relations/relation-loader.d.ts.map +1 -0
- package/esm/relations/relation-loader.js +466 -0
- package/esm/relations/relation-loader.js.map +1 -0
- package/esm/relations/types.d.ts +280 -0
- package/esm/relations/types.d.ts.map +1 -0
- package/esm/sync/model-sync-operation.js +1 -1
- package/esm/sync/model-sync-operation.js.map +1 -1
- package/esm/utils/connect-to-database.d.ts.map +1 -1
- package/esm/utils/connect-to-database.js +15 -3
- package/esm/utils/connect-to-database.js.map +1 -1
- package/esm/utils/define-model.d.ts +51 -29
- package/esm/utils/define-model.d.ts.map +1 -1
- package/esm/validation/rules/database-model-rule.js +1 -1
- package/esm/validation/rules/database-model-rule.js.map +1 -1
- package/package.json +4 -4
- package/cjs/drivers/mongo/mongo-id-generator.d.ts.map +0 -1
- package/cjs/drivers/mongo/mongo-id-generator.js.map +0 -1
- package/cjs/drivers/mongo/mongo-migration-driver.d.ts.map +0 -1
- package/cjs/drivers/mongo/mongo-migration-driver.js.map +0 -1
- package/cjs/drivers/mongo/mongo-query-builder.d.ts.map +0 -1
- package/cjs/drivers/mongo/mongo-query-builder.js.map +0 -1
- package/cjs/drivers/mongo/mongo-query-operations.d.ts.map +0 -1
- package/cjs/drivers/mongo/mongo-query-operations.js.map +0 -1
- package/cjs/drivers/mongo/mongo-query-parser.d.ts.map +0 -1
- package/cjs/drivers/mongo/mongo-query-parser.js.map +0 -1
- package/cjs/drivers/mongo/mongo-sync-adapter.d.ts.map +0 -1
- package/cjs/drivers/mongo/mongo-sync-adapter.js.map +0 -1
- package/cjs/drivers/mongo/mongodb-blueprint.d.ts.map +0 -1
- package/cjs/drivers/mongo/mongodb-blueprint.js.map +0 -1
- package/cjs/drivers/mongo/mongodb-driver.d.ts.map +0 -1
- package/cjs/drivers/mongo/mongodb-driver.js.map +0 -1
- package/cjs/drivers/mongo/types.d.ts.map +0 -1
- package/esm/drivers/mongo/mongo-id-generator.d.ts.map +0 -1
- package/esm/drivers/mongo/mongo-id-generator.js.map +0 -1
- package/esm/drivers/mongo/mongo-migration-driver.d.ts.map +0 -1
- package/esm/drivers/mongo/mongo-migration-driver.js.map +0 -1
- package/esm/drivers/mongo/mongo-query-builder.d.ts.map +0 -1
- package/esm/drivers/mongo/mongo-query-builder.js.map +0 -1
- package/esm/drivers/mongo/mongo-query-operations.d.ts.map +0 -1
- package/esm/drivers/mongo/mongo-query-operations.js.map +0 -1
- package/esm/drivers/mongo/mongo-query-parser.d.ts.map +0 -1
- package/esm/drivers/mongo/mongo-query-parser.js.map +0 -1
- package/esm/drivers/mongo/mongo-sync-adapter.d.ts.map +0 -1
- package/esm/drivers/mongo/mongo-sync-adapter.js.map +0 -1
- package/esm/drivers/mongo/mongodb-blueprint.d.ts.map +0 -1
- package/esm/drivers/mongo/mongodb-blueprint.js.map +0 -1
- package/esm/drivers/mongo/mongodb-driver.d.ts.map +0 -1
- package/esm/drivers/mongo/mongodb-driver.js.map +0 -1
- package/esm/drivers/mongo/types.d.ts.map +0 -1
- /package/cjs/drivers/{mongo → mongodb}/mongodb-blueprint.d.ts +0 -0
- /package/cjs/drivers/{mongo → mongodb}/mongodb-blueprint.js +0 -0
- /package/esm/drivers/{mongo → mongodb}/mongodb-blueprint.d.ts +0 -0
- /package/esm/drivers/{mongo → mongodb}/mongodb-blueprint.js +0 -0
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import {getModelFromRegistry}from'../model/register-model.js';/**
|
|
2
|
+
* @fileoverview Core relation loading logic for the Cascade ORM.
|
|
3
|
+
*
|
|
4
|
+
* The RelationLoader is responsible for efficiently loading related models
|
|
5
|
+
* while preventing N+1 query problems through batch loading strategies.
|
|
6
|
+
*
|
|
7
|
+
* @module @warlock.js/cascade/relations/relation-loader
|
|
8
|
+
*/
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// RELATION LOADER CLASS
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Efficiently loads relationships for one or more model instances.
|
|
14
|
+
*
|
|
15
|
+
* The RelationLoader handles:
|
|
16
|
+
* - Batch loading to prevent N+1 query problems
|
|
17
|
+
* - Nested relation loading via dot notation
|
|
18
|
+
* - Constrained loading with query callbacks
|
|
19
|
+
* - All relation types (hasOne, hasMany, belongsTo, belongsToMany)
|
|
20
|
+
*
|
|
21
|
+
* @template TModel - The type of model being loaded
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const users = await User.query().get();
|
|
26
|
+
* const loader = new RelationLoader(users, User);
|
|
27
|
+
*
|
|
28
|
+
* // Load single relation
|
|
29
|
+
* await loader.load("posts");
|
|
30
|
+
*
|
|
31
|
+
* // Load multiple relations
|
|
32
|
+
* await loader.load(["posts", "organization"]);
|
|
33
|
+
*
|
|
34
|
+
* // Load nested relations
|
|
35
|
+
* await loader.load("posts.comments.author");
|
|
36
|
+
*
|
|
37
|
+
* // Load with constraints
|
|
38
|
+
* await loader.load("posts", {
|
|
39
|
+
* posts: (query) => query.where("isPublished", true),
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
class RelationLoader {
|
|
44
|
+
// ==========================================================================
|
|
45
|
+
// PRIVATE PROPERTIES
|
|
46
|
+
// ==========================================================================
|
|
47
|
+
/**
|
|
48
|
+
* The model instances to load relations for.
|
|
49
|
+
*/
|
|
50
|
+
models;
|
|
51
|
+
/**
|
|
52
|
+
* The model class constructor.
|
|
53
|
+
*/
|
|
54
|
+
modelClass;
|
|
55
|
+
// ==========================================================================
|
|
56
|
+
// CONSTRUCTOR
|
|
57
|
+
// ==========================================================================
|
|
58
|
+
/**
|
|
59
|
+
* Creates a new RelationLoader instance.
|
|
60
|
+
*
|
|
61
|
+
* @param models - The model instances to load relations for
|
|
62
|
+
* @param modelClass - The model class constructor
|
|
63
|
+
*/
|
|
64
|
+
constructor(models, modelClass) {
|
|
65
|
+
this.models = models;
|
|
66
|
+
this.modelClass = modelClass;
|
|
67
|
+
}
|
|
68
|
+
// ==========================================================================
|
|
69
|
+
// PUBLIC METHODS
|
|
70
|
+
// ==========================================================================
|
|
71
|
+
/**
|
|
72
|
+
* Loads one or more relations for all model instances.
|
|
73
|
+
*
|
|
74
|
+
* @param relations - A single relation name, array of names, or constraints object
|
|
75
|
+
* @param constraints - Optional constraints to apply to the loading query
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* // Single relation
|
|
80
|
+
* await loader.load("posts");
|
|
81
|
+
*
|
|
82
|
+
* // Multiple relations
|
|
83
|
+
* await loader.load(["posts", "organization"]);
|
|
84
|
+
*
|
|
85
|
+
* // With constraints
|
|
86
|
+
* await loader.load("posts", {
|
|
87
|
+
* posts: (query) => query.where("status", "active"),
|
|
88
|
+
* });
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
async load(relations, constraints) {
|
|
92
|
+
// If no models, nothing to load
|
|
93
|
+
if (this.models.length === 0) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Normalize to array
|
|
97
|
+
const relationNames = Array.isArray(relations) ? relations : [relations];
|
|
98
|
+
// Load each relation
|
|
99
|
+
for (const relationName of relationNames) {
|
|
100
|
+
const constraint = constraints?.[relationName];
|
|
101
|
+
const callbackConstraint = typeof constraint === "function" ? constraint : undefined;
|
|
102
|
+
await this.loadRelation(relationName, callbackConstraint);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// ==========================================================================
|
|
106
|
+
// PRIVATE METHODS - RELATION LOADING
|
|
107
|
+
// ==========================================================================
|
|
108
|
+
/**
|
|
109
|
+
* Loads a single relation, handling nested relations via dot notation.
|
|
110
|
+
*
|
|
111
|
+
* @param name - The relation name, possibly with dot notation for nesting
|
|
112
|
+
* @param constraint - Optional constraint callback
|
|
113
|
+
*/
|
|
114
|
+
async loadRelation(name, constraint) {
|
|
115
|
+
const path = this.parseNestedRelation(name);
|
|
116
|
+
const rootRelation = path[0];
|
|
117
|
+
// Get the relation definition from the model class
|
|
118
|
+
const definition = this.getRelationDefinition(rootRelation);
|
|
119
|
+
if (!definition) {
|
|
120
|
+
throw new Error(`Relation "${rootRelation}" is not defined on model "${this.modelClass.name}". ` +
|
|
121
|
+
`Make sure to define it in the static 'relations' property.`);
|
|
122
|
+
}
|
|
123
|
+
// Load based on relation type
|
|
124
|
+
switch (definition.type) {
|
|
125
|
+
case "hasMany":
|
|
126
|
+
await this.loadHasMany(rootRelation, definition, constraint);
|
|
127
|
+
break;
|
|
128
|
+
case "hasOne":
|
|
129
|
+
await this.loadHasOne(rootRelation, definition, constraint);
|
|
130
|
+
break;
|
|
131
|
+
case "belongsTo":
|
|
132
|
+
await this.loadBelongsTo(rootRelation, definition, constraint);
|
|
133
|
+
break;
|
|
134
|
+
case "belongsToMany":
|
|
135
|
+
await this.loadBelongsToMany(rootRelation, definition, constraint);
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
// If there are nested relations, load them recursively
|
|
139
|
+
if (path.length > 1) {
|
|
140
|
+
await this.loadNestedRelations(rootRelation, path.slice(1), constraint);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Loads a hasMany relation for all models.
|
|
145
|
+
*
|
|
146
|
+
* @param name - The relation name
|
|
147
|
+
* @param definition - The relation definition
|
|
148
|
+
* @param constraint - Optional constraint callback
|
|
149
|
+
*/
|
|
150
|
+
async loadHasMany(name, definition, constraint) {
|
|
151
|
+
const RelatedModel = this.resolveModelClass(definition.model);
|
|
152
|
+
const localKey = definition.localKey ?? "id";
|
|
153
|
+
const foreignKey = definition.foreignKey ?? this.inferForeignKey(this.modelClass.name);
|
|
154
|
+
// Collect all local key values
|
|
155
|
+
const localKeyValues = this.collectKeyValues(localKey);
|
|
156
|
+
if (localKeyValues.length === 0) {
|
|
157
|
+
// No values to query, set empty arrays
|
|
158
|
+
this.setRelationOnModels(name, () => []);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
// Build and execute query
|
|
162
|
+
const query = RelatedModel.query().whereIn(foreignKey, localKeyValues);
|
|
163
|
+
if (constraint) {
|
|
164
|
+
constraint(query);
|
|
165
|
+
}
|
|
166
|
+
const relatedRecords = await query.get();
|
|
167
|
+
// Group by foreign key and assign to models
|
|
168
|
+
const recordsByForeignKey = this.groupBy(relatedRecords, foreignKey);
|
|
169
|
+
this.setRelationOnModels(name, (model) => {
|
|
170
|
+
const keyValue = model.get(localKey);
|
|
171
|
+
return recordsByForeignKey.get(keyValue) ?? [];
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Loads a hasOne relation for all models.
|
|
176
|
+
*
|
|
177
|
+
* @param name - The relation name
|
|
178
|
+
* @param definition - The relation definition
|
|
179
|
+
* @param constraint - Optional constraint callback
|
|
180
|
+
*/
|
|
181
|
+
async loadHasOne(name, definition, constraint) {
|
|
182
|
+
const RelatedModel = this.resolveModelClass(definition.model);
|
|
183
|
+
const localKey = definition.localKey ?? "id";
|
|
184
|
+
const foreignKey = definition.foreignKey ?? this.inferForeignKey(this.modelClass.name);
|
|
185
|
+
// Collect all local key values
|
|
186
|
+
const localKeyValues = this.collectKeyValues(localKey);
|
|
187
|
+
if (localKeyValues.length === 0) {
|
|
188
|
+
this.setRelationOnModels(name, () => null);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Build and execute query
|
|
192
|
+
const query = RelatedModel.query().whereIn(foreignKey, localKeyValues);
|
|
193
|
+
if (constraint) {
|
|
194
|
+
constraint(query);
|
|
195
|
+
}
|
|
196
|
+
const relatedRecords = await query.get();
|
|
197
|
+
// Index by foreign key
|
|
198
|
+
const recordsByForeignKey = new Map();
|
|
199
|
+
for (const record of relatedRecords) {
|
|
200
|
+
const fkValue = record.get(foreignKey);
|
|
201
|
+
// For hasOne, take the first match only
|
|
202
|
+
if (!recordsByForeignKey.has(fkValue)) {
|
|
203
|
+
recordsByForeignKey.set(fkValue, record);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
this.setRelationOnModels(name, (model) => {
|
|
207
|
+
const keyValue = model.get(localKey);
|
|
208
|
+
return recordsByForeignKey.get(keyValue) ?? null;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Loads a belongsTo relation for all models.
|
|
213
|
+
*
|
|
214
|
+
* @param name - The relation name
|
|
215
|
+
* @param definition - The relation definition
|
|
216
|
+
* @param constraint - Optional constraint callback
|
|
217
|
+
*/
|
|
218
|
+
async loadBelongsTo(name, definition, constraint) {
|
|
219
|
+
const RelatedModel = this.resolveModelClass(definition.model);
|
|
220
|
+
const foreignKey = definition.foreignKey ?? `${name}Id`;
|
|
221
|
+
const ownerKey = definition.localKey ?? "id";
|
|
222
|
+
// Collect all foreign key values from the models
|
|
223
|
+
const foreignKeyValues = this.collectKeyValues(foreignKey);
|
|
224
|
+
if (foreignKeyValues.length === 0) {
|
|
225
|
+
this.setRelationOnModels(name, () => null);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
// Build and execute query
|
|
229
|
+
const query = RelatedModel.query().whereIn(ownerKey, foreignKeyValues);
|
|
230
|
+
if (constraint) {
|
|
231
|
+
constraint(query);
|
|
232
|
+
}
|
|
233
|
+
const relatedRecords = await query.get();
|
|
234
|
+
// Index by owner key
|
|
235
|
+
const recordsByOwnerKey = new Map();
|
|
236
|
+
for (const record of relatedRecords) {
|
|
237
|
+
const keyValue = record.get(ownerKey);
|
|
238
|
+
recordsByOwnerKey.set(keyValue, record);
|
|
239
|
+
}
|
|
240
|
+
this.setRelationOnModels(name, (model) => {
|
|
241
|
+
const fkValue = model.get(foreignKey);
|
|
242
|
+
return recordsByOwnerKey.get(fkValue) ?? null;
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Loads a belongsToMany relation for all models.
|
|
247
|
+
*
|
|
248
|
+
* @param name - The relation name
|
|
249
|
+
* @param definition - The relation definition
|
|
250
|
+
* @param constraint - Optional constraint callback
|
|
251
|
+
*/
|
|
252
|
+
async loadBelongsToMany(name, definition, constraint) {
|
|
253
|
+
if (!definition.pivot) {
|
|
254
|
+
throw new Error(`belongsToMany relation "${name}" requires a pivot table. ` +
|
|
255
|
+
`Make sure to specify the 'pivot' option.`);
|
|
256
|
+
}
|
|
257
|
+
const RelatedModel = this.resolveModelClass(definition.model);
|
|
258
|
+
const pivotTable = definition.pivot;
|
|
259
|
+
const localKey = definition.pivotLocalKey ?? "id";
|
|
260
|
+
const pivotLocalKey = definition.localKey ?? this.inferForeignKey(this.modelClass.name);
|
|
261
|
+
const pivotForeignKey = definition.foreignKey ?? this.inferForeignKey(definition.model);
|
|
262
|
+
const relatedKey = definition.pivotForeignKey ?? "id";
|
|
263
|
+
// Collect all local key values
|
|
264
|
+
const localKeyValues = this.collectKeyValues(localKey);
|
|
265
|
+
if (localKeyValues.length === 0) {
|
|
266
|
+
this.setRelationOnModels(name, () => []);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
// Step 1: Query the pivot table to get the relationships
|
|
270
|
+
const dataSource = this.modelClass.getDataSource();
|
|
271
|
+
const pivotQuery = dataSource.driver
|
|
272
|
+
.queryBuilder(pivotTable)
|
|
273
|
+
.whereIn(pivotLocalKey, localKeyValues);
|
|
274
|
+
const pivotRecords = (await pivotQuery.get());
|
|
275
|
+
if (pivotRecords.length === 0) {
|
|
276
|
+
this.setRelationOnModels(name, () => []);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
// Step 2: Collect related model IDs from pivot
|
|
280
|
+
const relatedIds = [...new Set(pivotRecords.map((p) => p[pivotForeignKey]))];
|
|
281
|
+
// Step 3: Query the related model
|
|
282
|
+
const relatedQuery = RelatedModel.query().whereIn(relatedKey, relatedIds);
|
|
283
|
+
if (constraint) {
|
|
284
|
+
constraint(relatedQuery);
|
|
285
|
+
}
|
|
286
|
+
const relatedRecords = await relatedQuery.get();
|
|
287
|
+
// Step 4: Index related records by their key
|
|
288
|
+
const relatedById = new Map();
|
|
289
|
+
for (const record of relatedRecords) {
|
|
290
|
+
relatedById.set(record.get(relatedKey), record);
|
|
291
|
+
}
|
|
292
|
+
// Step 5: Build the relationship map from pivot data
|
|
293
|
+
const relationshipMap = new Map();
|
|
294
|
+
for (const pivot of pivotRecords) {
|
|
295
|
+
const localValue = pivot[pivotLocalKey];
|
|
296
|
+
const foreignValue = pivot[pivotForeignKey];
|
|
297
|
+
const relatedRecord = relatedById.get(foreignValue);
|
|
298
|
+
if (relatedRecord) {
|
|
299
|
+
if (!relationshipMap.has(localValue)) {
|
|
300
|
+
relationshipMap.set(localValue, []);
|
|
301
|
+
}
|
|
302
|
+
relationshipMap.get(localValue).push(relatedRecord);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
this.setRelationOnModels(name, (model) => {
|
|
306
|
+
const keyValue = model.get(localKey);
|
|
307
|
+
return relationshipMap.get(keyValue) ?? [];
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
// ==========================================================================
|
|
311
|
+
// PRIVATE METHODS - NESTED RELATIONS
|
|
312
|
+
// ==========================================================================
|
|
313
|
+
/**
|
|
314
|
+
* Loads nested relations recursively.
|
|
315
|
+
*
|
|
316
|
+
* @param parentRelation - The name of the parent relation
|
|
317
|
+
* @param remainingPath - The remaining path segments to load
|
|
318
|
+
* @param constraint - Optional constraint callback
|
|
319
|
+
*/
|
|
320
|
+
async loadNestedRelations(parentRelation, remainingPath, constraint) {
|
|
321
|
+
// Collect all loaded related models from the parent relation
|
|
322
|
+
const relatedModels = [];
|
|
323
|
+
for (const model of this.models) {
|
|
324
|
+
const loaded = this.getLoadedRelation(model, parentRelation);
|
|
325
|
+
if (Array.isArray(loaded)) {
|
|
326
|
+
relatedModels.push(...loaded);
|
|
327
|
+
}
|
|
328
|
+
else if (loaded) {
|
|
329
|
+
relatedModels.push(loaded);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (relatedModels.length === 0) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
// Get the related model class
|
|
336
|
+
const parentDefinition = this.getRelationDefinition(parentRelation);
|
|
337
|
+
if (!parentDefinition)
|
|
338
|
+
return;
|
|
339
|
+
const RelatedModelClass = this.resolveModelClass(parentDefinition.model);
|
|
340
|
+
// Create a new loader for the nested relation
|
|
341
|
+
const nestedLoader = new RelationLoader(relatedModels, RelatedModelClass);
|
|
342
|
+
// Load the next level
|
|
343
|
+
const nextRelation = remainingPath.join(".");
|
|
344
|
+
await nestedLoader.load(nextRelation, constraint ? { [nextRelation]: constraint } : undefined);
|
|
345
|
+
}
|
|
346
|
+
// ==========================================================================
|
|
347
|
+
// PRIVATE METHODS - UTILITIES
|
|
348
|
+
// ==========================================================================
|
|
349
|
+
/**
|
|
350
|
+
* Parses a dot-notation relation path into segments.
|
|
351
|
+
*
|
|
352
|
+
* @param path - The relation path (e.g., "posts.comments.author")
|
|
353
|
+
* @returns An array of relation names
|
|
354
|
+
*/
|
|
355
|
+
parseNestedRelation(path) {
|
|
356
|
+
return path.split(".");
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Resolves a model class from the registry by name.
|
|
360
|
+
*
|
|
361
|
+
* @param name - The registered model name
|
|
362
|
+
* @returns The model class constructor
|
|
363
|
+
* @throws Error if the model is not found in the registry
|
|
364
|
+
*/
|
|
365
|
+
resolveModelClass(name) {
|
|
366
|
+
const ModelClass = getModelFromRegistry(name);
|
|
367
|
+
if (!ModelClass) {
|
|
368
|
+
throw new Error(`Model "${name}" not found in registry. ` +
|
|
369
|
+
`Make sure it is decorated with @RegisterModel() and imported.`);
|
|
370
|
+
}
|
|
371
|
+
return ModelClass;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Gets the relation definition from the model class.
|
|
375
|
+
*
|
|
376
|
+
* @param name - The relation name
|
|
377
|
+
* @returns The relation definition or undefined
|
|
378
|
+
*/
|
|
379
|
+
getRelationDefinition(name) {
|
|
380
|
+
const relations = this.modelClass.relations;
|
|
381
|
+
return relations?.[name];
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Collects unique key values from all models.
|
|
385
|
+
*
|
|
386
|
+
* @param key - The key to collect values for
|
|
387
|
+
* @returns An array of unique key values
|
|
388
|
+
*/
|
|
389
|
+
collectKeyValues(key) {
|
|
390
|
+
const values = new Set();
|
|
391
|
+
for (const model of this.models) {
|
|
392
|
+
const value = model.get(key);
|
|
393
|
+
if (value !== undefined && value !== null) {
|
|
394
|
+
values.add(value);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
return [...values];
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Groups records by a key value.
|
|
401
|
+
*
|
|
402
|
+
* @param records - The records to group
|
|
403
|
+
* @param key - The key to group by
|
|
404
|
+
* @returns A map of key values to records
|
|
405
|
+
*/
|
|
406
|
+
groupBy(records, key) {
|
|
407
|
+
const groups = new Map();
|
|
408
|
+
for (const record of records) {
|
|
409
|
+
const keyValue = record.get(key);
|
|
410
|
+
if (!groups.has(keyValue)) {
|
|
411
|
+
groups.set(keyValue, []);
|
|
412
|
+
}
|
|
413
|
+
groups.get(keyValue).push(record);
|
|
414
|
+
}
|
|
415
|
+
return groups;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Infers a foreign key name from a model name.
|
|
419
|
+
*
|
|
420
|
+
* @param modelName - The model class name
|
|
421
|
+
* @returns The inferred foreign key (e.g., "User" -> "userId")
|
|
422
|
+
*/
|
|
423
|
+
inferForeignKey(modelName) {
|
|
424
|
+
return `${modelName.charAt(0).toLowerCase()}${modelName.slice(1)}Id`;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Sets a relation value on all models using a getter function.
|
|
428
|
+
*
|
|
429
|
+
* @param name - The relation name
|
|
430
|
+
* @param getter - Function that returns the relation value for each model
|
|
431
|
+
*/
|
|
432
|
+
setRelationOnModels(name, getter) {
|
|
433
|
+
for (const model of this.models) {
|
|
434
|
+
const value = getter(model);
|
|
435
|
+
this.setLoadedRelation(model, name, value);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Gets a loaded relation from a model instance.
|
|
440
|
+
*
|
|
441
|
+
* @param model - The model instance
|
|
442
|
+
* @param name - The relation name
|
|
443
|
+
* @returns The loaded relation value or undefined
|
|
444
|
+
*/
|
|
445
|
+
getLoadedRelation(model, name) {
|
|
446
|
+
const loadedRelations = model.loadedRelations;
|
|
447
|
+
return loadedRelations?.get(name);
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Sets a loaded relation on a model instance.
|
|
451
|
+
*
|
|
452
|
+
* @param model - The model instance
|
|
453
|
+
* @param name - The relation name
|
|
454
|
+
* @param value - The relation value
|
|
455
|
+
*/
|
|
456
|
+
setLoadedRelation(model, name, value) {
|
|
457
|
+
// Ensure the model has a loadedRelations map
|
|
458
|
+
const modelWithRelations = model;
|
|
459
|
+
if (!modelWithRelations.loadedRelations) {
|
|
460
|
+
modelWithRelations.loadedRelations = new Map();
|
|
461
|
+
}
|
|
462
|
+
modelWithRelations.loadedRelations.set(name, value);
|
|
463
|
+
// Also set as a property for convenient access
|
|
464
|
+
model[name] = value;
|
|
465
|
+
}
|
|
466
|
+
}export{RelationLoader};//# sourceMappingURL=relation-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-loader.js","sources":["../../src/relations/relation-loader.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|