@objectql/core 4.1.0 → 4.2.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.
Files changed (107) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +42 -0
  3. package/dist/app.d.ts +61 -51
  4. package/dist/app.js +101 -431
  5. package/dist/app.js.map +1 -1
  6. package/dist/index.d.ts +4 -11
  7. package/dist/index.js +13 -9
  8. package/dist/index.js.map +1 -1
  9. package/dist/kernel-factory.d.ts +38 -0
  10. package/dist/kernel-factory.js +38 -0
  11. package/dist/kernel-factory.js.map +1 -0
  12. package/dist/plugin.d.ts +10 -16
  13. package/dist/plugin.js +104 -58
  14. package/dist/plugin.js.map +1 -1
  15. package/dist/repository.d.ts +4 -31
  16. package/dist/repository.js +7 -275
  17. package/dist/repository.js.map +1 -1
  18. package/dist/util.js +4 -2
  19. package/dist/util.js.map +1 -1
  20. package/package.json +19 -11
  21. package/src/app.ts +157 -531
  22. package/src/index.ts +8 -23
  23. package/src/kernel-factory.ts +47 -0
  24. package/src/plugin.ts +116 -94
  25. package/src/repository.ts +4 -313
  26. package/src/util.ts +5 -3
  27. package/test/__mocks__/@objectstack/core.ts +250 -1
  28. package/test/__mocks__/@objectstack/objectql.ts +127 -0
  29. package/test/__mocks__/@objectstack/runtime.ts +14 -5
  30. package/test/introspection.test.ts +1 -1
  31. package/test/mock-driver.ts +5 -5
  32. package/test/optimizations.test.ts +2 -2
  33. package/test/plugin-integration.test.ts +4 -5
  34. package/test/utils.ts +6 -6
  35. package/tsconfig.json +3 -1
  36. package/tsconfig.tsbuildinfo +1 -1
  37. package/dist/gateway.d.ts +0 -36
  38. package/dist/gateway.js +0 -89
  39. package/dist/gateway.js.map +0 -1
  40. package/dist/optimizations/CompiledHookManager.d.ts +0 -55
  41. package/dist/optimizations/CompiledHookManager.js +0 -164
  42. package/dist/optimizations/CompiledHookManager.js.map +0 -1
  43. package/dist/optimizations/DependencyGraph.d.ts +0 -82
  44. package/dist/optimizations/DependencyGraph.js +0 -211
  45. package/dist/optimizations/DependencyGraph.js.map +0 -1
  46. package/dist/optimizations/GlobalConnectionPool.d.ts +0 -89
  47. package/dist/optimizations/GlobalConnectionPool.js +0 -193
  48. package/dist/optimizations/GlobalConnectionPool.js.map +0 -1
  49. package/dist/optimizations/LazyMetadataLoader.d.ts +0 -75
  50. package/dist/optimizations/LazyMetadataLoader.js +0 -149
  51. package/dist/optimizations/LazyMetadataLoader.js.map +0 -1
  52. package/dist/optimizations/OptimizedMetadataRegistry.d.ts +0 -26
  53. package/dist/optimizations/OptimizedMetadataRegistry.js +0 -117
  54. package/dist/optimizations/OptimizedMetadataRegistry.js.map +0 -1
  55. package/dist/optimizations/OptimizedValidationEngine.d.ts +0 -73
  56. package/dist/optimizations/OptimizedValidationEngine.js +0 -141
  57. package/dist/optimizations/OptimizedValidationEngine.js.map +0 -1
  58. package/dist/optimizations/QueryCompiler.d.ts +0 -51
  59. package/dist/optimizations/QueryCompiler.js +0 -216
  60. package/dist/optimizations/QueryCompiler.js.map +0 -1
  61. package/dist/optimizations/SQLQueryOptimizer.d.ts +0 -96
  62. package/dist/optimizations/SQLQueryOptimizer.js +0 -265
  63. package/dist/optimizations/SQLQueryOptimizer.js.map +0 -1
  64. package/dist/optimizations/index.d.ts +0 -32
  65. package/dist/optimizations/index.js +0 -44
  66. package/dist/optimizations/index.js.map +0 -1
  67. package/dist/protocol.d.ts +0 -180
  68. package/dist/protocol.js +0 -260
  69. package/dist/protocol.js.map +0 -1
  70. package/dist/query/filter-translator.d.ts +0 -27
  71. package/dist/query/filter-translator.js +0 -38
  72. package/dist/query/filter-translator.js.map +0 -1
  73. package/dist/query/index.d.ts +0 -22
  74. package/dist/query/index.js +0 -39
  75. package/dist/query/index.js.map +0 -1
  76. package/dist/query/query-analyzer.d.ts +0 -188
  77. package/dist/query/query-analyzer.js +0 -348
  78. package/dist/query/query-analyzer.js.map +0 -1
  79. package/dist/query/query-builder.d.ts +0 -35
  80. package/dist/query/query-builder.js +0 -61
  81. package/dist/query/query-builder.js.map +0 -1
  82. package/dist/query/query-service.d.ts +0 -153
  83. package/dist/query/query-service.js +0 -272
  84. package/dist/query/query-service.js.map +0 -1
  85. package/jest.config.js +0 -29
  86. package/src/gateway.ts +0 -101
  87. package/src/optimizations/CompiledHookManager.ts +0 -185
  88. package/src/optimizations/DependencyGraph.ts +0 -255
  89. package/src/optimizations/GlobalConnectionPool.ts +0 -251
  90. package/src/optimizations/LazyMetadataLoader.ts +0 -180
  91. package/src/optimizations/OptimizedMetadataRegistry.ts +0 -132
  92. package/src/optimizations/OptimizedValidationEngine.ts +0 -172
  93. package/src/optimizations/QueryCompiler.ts +0 -242
  94. package/src/optimizations/SQLQueryOptimizer.ts +0 -329
  95. package/src/optimizations/index.ts +0 -34
  96. package/src/protocol.ts +0 -291
  97. package/src/query/filter-translator.ts +0 -41
  98. package/src/query/index.ts +0 -24
  99. package/src/query/query-analyzer.ts +0 -533
  100. package/src/query/query-builder.ts +0 -64
  101. package/src/query/query-service.ts +0 -398
  102. package/test/app.test.ts +0 -578
  103. package/test/filter-syntax.test.ts +0 -233
  104. package/test/gateway.test.ts +0 -88
  105. package/test/protocol.test.ts +0 -143
  106. package/test/repository-validation.test.ts +0 -351
  107. package/test/repository.test.ts +0 -151
package/dist/gateway.d.ts DELETED
@@ -1,36 +0,0 @@
1
- /**
2
- * ObjectQL
3
- * Copyright (c) 2026-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
- import { ApiRequest, ApiResponse, GatewayProtocol } from '@objectql/types';
9
- export type RequestTransformer = (request: ApiRequest) => Promise<ApiRequest>;
10
- export type ResponseTransformer = (response: ApiResponse) => Promise<ApiResponse>;
11
- /**
12
- * Unified API Gateway
13
- * Routtes generic API requests to specific protocol implementations
14
- */
15
- export declare class ObjectGateway {
16
- private protocols;
17
- private requestTransforms;
18
- private responseTransforms;
19
- constructor(protocols?: GatewayProtocol[]);
20
- /**
21
- * Register a new protocol handler
22
- */
23
- registerProtocol(protocol: GatewayProtocol): void;
24
- /**
25
- * Add a request transformer (middleware)
26
- */
27
- addRequestTransform(transformer: RequestTransformer): void;
28
- /**
29
- * Add a response transformer (middleware)
30
- */
31
- addResponseTransform(transformer: ResponseTransformer): void;
32
- /**
33
- * Handle an incoming API request
34
- */
35
- handle(request: ApiRequest): Promise<ApiResponse>;
36
- }
package/dist/gateway.js DELETED
@@ -1,89 +0,0 @@
1
- "use strict";
2
- /**
3
- * ObjectQL
4
- * Copyright (c) 2026-present ObjectStack Inc.
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE file in the root directory of this source tree.
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.ObjectGateway = void 0;
11
- /**
12
- * Unified API Gateway
13
- * Routtes generic API requests to specific protocol implementations
14
- */
15
- class ObjectGateway {
16
- constructor(protocols = []) {
17
- this.protocols = [];
18
- this.requestTransforms = [];
19
- this.responseTransforms = [];
20
- this.protocols = protocols;
21
- }
22
- /**
23
- * Register a new protocol handler
24
- */
25
- registerProtocol(protocol) {
26
- this.protocols.push(protocol);
27
- }
28
- /**
29
- * Add a request transformer (middleware)
30
- */
31
- addRequestTransform(transformer) {
32
- this.requestTransforms.push(transformer);
33
- }
34
- /**
35
- * Add a response transformer (middleware)
36
- */
37
- addResponseTransform(transformer) {
38
- this.responseTransforms.push(transformer);
39
- }
40
- /**
41
- * Handle an incoming API request
42
- */
43
- async handle(request) {
44
- let req = request;
45
- // 1. Apply Request Transforms
46
- for (const transform of this.requestTransforms) {
47
- req = await transform(req);
48
- }
49
- // 2. Find matching protocol
50
- const protocol = this.protocols.find(p => p.route(req));
51
- if (!protocol) {
52
- return {
53
- status: 404,
54
- headers: { 'Content-Type': 'application/json' },
55
- body: {
56
- error: {
57
- code: 'PROTOCOL_NOT_FOUND',
58
- message: `No protocol found to handle path: ${req.path}`
59
- }
60
- }
61
- };
62
- }
63
- let response;
64
- // 3. Delegate to protocol
65
- try {
66
- response = await protocol.handle(req);
67
- }
68
- catch (error) {
69
- console.error(`[ObjectGateway] Error in ${protocol.name}:`, error);
70
- response = {
71
- status: 500,
72
- headers: { 'Content-Type': 'application/json' },
73
- body: {
74
- error: {
75
- code: 'INTERNAL_ERROR',
76
- message: error.message || 'Internal Gateway Error'
77
- }
78
- }
79
- };
80
- }
81
- // 4. Apply Response Transforms
82
- for (const transform of this.responseTransforms) {
83
- response = await transform(response);
84
- }
85
- return response;
86
- }
87
- }
88
- exports.ObjectGateway = ObjectGateway;
89
- //# sourceMappingURL=gateway.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAOH;;;GAGG;AACH,MAAa,aAAa;IAKtB,YAAY,YAA+B,EAAE;QAJrC,cAAS,GAAsB,EAAE,CAAC;QAClC,sBAAiB,GAAyB,EAAE,CAAC;QAC7C,uBAAkB,GAA0B,EAAE,CAAC;QAGnD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAyB;QACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,WAA+B;QAC/C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,WAAgC;QACjD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,OAAmB;QAC5B,IAAI,GAAG,GAAG,OAAO,CAAC;QAElB,8BAA8B;QAC9B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC7C,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAED,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAExD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAO;gBACH,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE;oBACF,KAAK,EAAE;wBACH,IAAI,EAAE,oBAAoB;wBAC1B,OAAO,EAAE,qCAAqC,GAAG,CAAC,IAAI,EAAE;qBAC3D;iBACJ;aACJ,CAAC;QACN,CAAC;QAED,IAAI,QAAqB,CAAC;QAE1B,0BAA0B;QAC1B,IAAI,CAAC;YACD,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,4BAA4B,QAAQ,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;YACnE,QAAQ,GAAG;gBACP,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE;oBACF,KAAK,EAAE;wBACH,IAAI,EAAE,gBAAgB;wBACtB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,wBAAwB;qBACrD;iBACJ;aACJ,CAAC;QACN,CAAC;QAED,+BAA+B;QAC/B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC9C,QAAQ,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AAnFD,sCAmFC"}
@@ -1,55 +0,0 @@
1
- /**
2
- * ObjectQL
3
- * Copyright (c) 2026-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
- /**
9
- * Hook definition
10
- */
11
- export interface Hook {
12
- pattern: string;
13
- handler: (context: any) => Promise<void> | void;
14
- packageName?: string;
15
- priority?: number;
16
- }
17
- /**
18
- * Compiled Hook Manager
19
- *
20
- * Improvement: Pre-compiles hook pipelines by event pattern at registration time.
21
- * No runtime pattern matching required.
22
- *
23
- * Expected: 5x faster hook execution, parallel async support
24
- */
25
- export declare class CompiledHookManager {
26
- private pipelines;
27
- private allHooks;
28
- /**
29
- * Expand a pattern like "before*" to all matching events
30
- */
31
- private expandPattern;
32
- /**
33
- * Register a hook - pre-groups by event pattern
34
- */
35
- registerHook(event: string, objectName: string, handler: any, packageName?: string): void;
36
- /**
37
- * Run hooks for an event - direct lookup, no pattern matching
38
- */
39
- runHooks(event: string, objectName: string, context: any): Promise<void>;
40
- /**
41
- * Remove all hooks from a package
42
- */
43
- removePackage(packageName: string): void;
44
- /**
45
- * Clear all hooks
46
- */
47
- clear(): void;
48
- /**
49
- * Get statistics about registered hooks
50
- */
51
- getStats(): {
52
- totalHooks: number;
53
- totalPipelines: number;
54
- };
55
- }
@@ -1,164 +0,0 @@
1
- "use strict";
2
- /**
3
- * ObjectQL
4
- * Copyright (c) 2026-present ObjectStack Inc.
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE file in the root directory of this source tree.
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.CompiledHookManager = void 0;
11
- /**
12
- * Compiled Hook Manager
13
- *
14
- * Improvement: Pre-compiles hook pipelines by event pattern at registration time.
15
- * No runtime pattern matching required.
16
- *
17
- * Expected: 5x faster hook execution, parallel async support
18
- */
19
- class CompiledHookManager {
20
- constructor() {
21
- // Direct event -> hooks mapping (no pattern matching at runtime)
22
- this.pipelines = new Map();
23
- // Keep track of all registered hooks for management
24
- this.allHooks = new Map();
25
- }
26
- /**
27
- * Expand a pattern like "before*" to all matching events
28
- */
29
- expandPattern(pattern) {
30
- // Common event patterns
31
- const eventTypes = [
32
- 'beforeCreate', 'afterCreate',
33
- 'beforeUpdate', 'afterUpdate',
34
- 'beforeDelete', 'afterDelete',
35
- 'beforeFind', 'afterFind',
36
- 'beforeCount', 'afterCount'
37
- ];
38
- // Handle wildcards
39
- if (pattern === '*') {
40
- return eventTypes;
41
- }
42
- if (pattern.includes('*')) {
43
- // Use global replace to handle all occurrences of *
44
- const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
45
- return eventTypes.filter(event => regex.test(event));
46
- }
47
- // Exact match
48
- return [pattern];
49
- }
50
- /**
51
- * Register a hook - pre-groups by event pattern
52
- */
53
- registerHook(event, objectName, handler, packageName) {
54
- const hook = {
55
- pattern: `${event}:${objectName}`,
56
- handler,
57
- packageName,
58
- priority: 0
59
- };
60
- // Store in all hooks registry
61
- const hookId = `${event}:${objectName}:${Date.now()}`;
62
- this.allHooks.set(hookId, hook);
63
- // Expand event patterns
64
- const events = this.expandPattern(event);
65
- // Handle wildcard object names
66
- if (objectName === '*') {
67
- for (const concreteEvent of events) {
68
- // Register for all potential object names
69
- // Since we don't know all object names upfront, we keep a special '*' pipeline
70
- const wildcardKey = `${concreteEvent}:*`;
71
- if (!this.pipelines.has(wildcardKey)) {
72
- this.pipelines.set(wildcardKey, []);
73
- }
74
- this.pipelines.get(wildcardKey).push(hook);
75
- }
76
- }
77
- else {
78
- // Pre-group hooks by concrete event names (only for non-wildcard objects)
79
- for (const concreteEvent of events) {
80
- const key = `${concreteEvent}:${objectName}`;
81
- if (!this.pipelines.has(key)) {
82
- this.pipelines.set(key, []);
83
- }
84
- this.pipelines.get(key).push(hook);
85
- }
86
- }
87
- }
88
- /**
89
- * Run hooks for an event - direct lookup, no pattern matching
90
- */
91
- async runHooks(event, objectName, context) {
92
- const key = `${event}:${objectName}`;
93
- const wildcardKey = `${event}:*`;
94
- // Collect all applicable hooks
95
- const hooks = [];
96
- // Add object-specific hooks
97
- const objectHooks = this.pipelines.get(key);
98
- if (objectHooks) {
99
- hooks.push(...objectHooks);
100
- }
101
- // Add wildcard hooks
102
- const wildcardHooks = this.pipelines.get(wildcardKey);
103
- if (wildcardHooks) {
104
- hooks.push(...wildcardHooks);
105
- }
106
- if (hooks.length === 0) {
107
- return;
108
- }
109
- // Sort by priority (higher priority first)
110
- hooks.sort((a, b) => (b.priority || 0) - (a.priority || 0));
111
- // Execute hooks in parallel for better performance
112
- // Note: If order matters, change to sequential execution
113
- await Promise.all(hooks.map(hook => {
114
- try {
115
- return Promise.resolve(hook.handler(context));
116
- }
117
- catch (error) {
118
- console.error(`Hook execution failed for ${event}:${objectName}`, error);
119
- return Promise.resolve();
120
- }
121
- }));
122
- }
123
- /**
124
- * Remove all hooks from a package
125
- */
126
- removePackage(packageName) {
127
- // Remove from all hooks registry
128
- const hooksToRemove = [];
129
- for (const [hookId, hook] of this.allHooks.entries()) {
130
- if (hook.packageName === packageName) {
131
- hooksToRemove.push(hookId);
132
- }
133
- }
134
- hooksToRemove.forEach(id => this.allHooks.delete(id));
135
- // Remove from pipelines
136
- for (const [key, hooks] of this.pipelines.entries()) {
137
- const filtered = hooks.filter(h => h.packageName !== packageName);
138
- if (filtered.length === 0) {
139
- this.pipelines.delete(key);
140
- }
141
- else {
142
- this.pipelines.set(key, filtered);
143
- }
144
- }
145
- }
146
- /**
147
- * Clear all hooks
148
- */
149
- clear() {
150
- this.pipelines.clear();
151
- this.allHooks.clear();
152
- }
153
- /**
154
- * Get statistics about registered hooks
155
- */
156
- getStats() {
157
- return {
158
- totalHooks: this.allHooks.size,
159
- totalPipelines: this.pipelines.size
160
- };
161
- }
162
- }
163
- exports.CompiledHookManager = CompiledHookManager;
164
- //# sourceMappingURL=CompiledHookManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CompiledHookManager.js","sourceRoot":"","sources":["../../src/optimizations/CompiledHookManager.ts"],"names":[],"mappings":"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"}
@@ -1,82 +0,0 @@
1
- /**
2
- * ObjectQL
3
- * Copyright (c) 2026-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
- /**
9
- * Dependency type
10
- */
11
- export type DependencyType = 'lookup' | 'master_detail' | 'foreign_key';
12
- /**
13
- * Edge in the dependency graph
14
- */
15
- export interface DependencyEdge {
16
- from: string;
17
- to: string;
18
- type: DependencyType;
19
- fieldName: string;
20
- }
21
- /**
22
- * Smart Dependency Graph
23
- *
24
- * Improvement: DAG-based dependency resolution for cascading operations.
25
- * Automatically handles cascade deletes and updates in correct order.
26
- *
27
- * Expected: Eliminates manual cascade logic, prevents orphaned data
28
- */
29
- export declare class DependencyGraph {
30
- private graph;
31
- private edges;
32
- /**
33
- * Add an object to the graph
34
- */
35
- addObject(objectName: string): void;
36
- /**
37
- * Add a dependency edge
38
- * from -> to means "to depends on from"
39
- */
40
- addDependency(from: string, to: string, type: DependencyType, fieldName: string): void;
41
- /**
42
- * Get all objects that depend on the given object
43
- */
44
- getDependents(objectName: string): string[];
45
- /**
46
- * Topological sort using DFS
47
- */
48
- topologicalSort(objects: string[]): string[];
49
- /**
50
- * Check for circular dependencies
51
- */
52
- hasCircularDependency(): boolean;
53
- /**
54
- * Get cascade delete order for an object
55
- * Returns objects in the order they should be deleted
56
- */
57
- getCascadeDeleteOrder(objectName: string): string[];
58
- /**
59
- * Automatically cascade delete based on dependency graph
60
- *
61
- * @param objectName The object type being deleted
62
- * @param id The ID of the record being deleted
63
- * @param deleteFunc Function to delete a record: (objectName, id) => Promise<void>
64
- */
65
- cascadeDelete(objectName: string, id: string, deleteFunc: (objName: string, recordId: string) => Promise<void>): Promise<void>;
66
- /**
67
- * Get graph statistics
68
- */
69
- getStats(): {
70
- totalObjects: number;
71
- totalDependencies: number;
72
- hasCircularDependency: boolean;
73
- };
74
- /**
75
- * Clear the graph
76
- */
77
- clear(): void;
78
- /**
79
- * Export graph as DOT format for visualization
80
- */
81
- toDot(): string;
82
- }
@@ -1,211 +0,0 @@
1
- "use strict";
2
- /**
3
- * ObjectQL
4
- * Copyright (c) 2026-present ObjectStack Inc.
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE file in the root directory of this source tree.
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.DependencyGraph = void 0;
11
- /**
12
- * Smart Dependency Graph
13
- *
14
- * Improvement: DAG-based dependency resolution for cascading operations.
15
- * Automatically handles cascade deletes and updates in correct order.
16
- *
17
- * Expected: Eliminates manual cascade logic, prevents orphaned data
18
- */
19
- class DependencyGraph {
20
- constructor() {
21
- // Adjacency list: object -> list of dependent objects
22
- this.graph = new Map();
23
- // Store edge metadata
24
- this.edges = new Map();
25
- }
26
- /**
27
- * Add an object to the graph
28
- */
29
- addObject(objectName) {
30
- if (!this.graph.has(objectName)) {
31
- this.graph.set(objectName, new Set());
32
- }
33
- if (!this.edges.has(objectName)) {
34
- this.edges.set(objectName, []);
35
- }
36
- }
37
- /**
38
- * Add a dependency edge
39
- * from -> to means "to depends on from"
40
- */
41
- addDependency(from, to, type, fieldName) {
42
- this.addObject(from);
43
- this.addObject(to);
44
- // Add edge
45
- this.graph.get(from).add(to);
46
- // Store edge metadata
47
- const edge = { from, to, type, fieldName };
48
- const fromEdges = this.edges.get(from) || [];
49
- fromEdges.push(edge);
50
- this.edges.set(from, fromEdges);
51
- }
52
- /**
53
- * Get all objects that depend on the given object
54
- */
55
- getDependents(objectName) {
56
- return Array.from(this.graph.get(objectName) || []);
57
- }
58
- /**
59
- * Topological sort using DFS
60
- */
61
- topologicalSort(objects) {
62
- const visited = new Set();
63
- const stack = [];
64
- const dfs = (node) => {
65
- if (visited.has(node))
66
- return;
67
- visited.add(node);
68
- const dependents = this.graph.get(node);
69
- if (dependents) {
70
- for (const dependent of dependents) {
71
- if (objects.includes(dependent)) {
72
- dfs(dependent);
73
- }
74
- }
75
- }
76
- stack.push(node);
77
- };
78
- for (const obj of objects) {
79
- dfs(obj);
80
- }
81
- return stack;
82
- }
83
- /**
84
- * Check for circular dependencies
85
- */
86
- hasCircularDependency() {
87
- const visited = new Set();
88
- const recursionStack = new Set();
89
- const hasCycle = (node) => {
90
- visited.add(node);
91
- recursionStack.add(node);
92
- const dependents = this.graph.get(node);
93
- if (dependents) {
94
- for (const dependent of dependents) {
95
- if (!visited.has(dependent)) {
96
- if (hasCycle(dependent)) {
97
- return true;
98
- }
99
- }
100
- else if (recursionStack.has(dependent)) {
101
- return true;
102
- }
103
- }
104
- }
105
- recursionStack.delete(node);
106
- return false;
107
- };
108
- for (const node of this.graph.keys()) {
109
- if (!visited.has(node)) {
110
- if (hasCycle(node)) {
111
- return true;
112
- }
113
- }
114
- }
115
- return false;
116
- }
117
- /**
118
- * Get cascade delete order for an object
119
- * Returns objects in the order they should be deleted
120
- */
121
- getCascadeDeleteOrder(objectName) {
122
- const dependents = this.getDependents(objectName);
123
- if (dependents.length === 0) {
124
- return [objectName];
125
- }
126
- // Recursively get all transitive dependents
127
- const allDependents = new Set();
128
- const collectDependents = (obj) => {
129
- const deps = this.getDependents(obj);
130
- for (const dep of deps) {
131
- if (!allDependents.has(dep)) {
132
- allDependents.add(dep);
133
- collectDependents(dep);
134
- }
135
- }
136
- };
137
- collectDependents(objectName);
138
- // Add the original object
139
- allDependents.add(objectName);
140
- // Sort topologically to get correct deletion order
141
- const sorted = this.topologicalSort(Array.from(allDependents));
142
- return sorted;
143
- }
144
- /**
145
- * Automatically cascade delete based on dependency graph
146
- *
147
- * @param objectName The object type being deleted
148
- * @param id The ID of the record being deleted
149
- * @param deleteFunc Function to delete a record: (objectName, id) => Promise<void>
150
- */
151
- async cascadeDelete(objectName, id, deleteFunc) {
152
- const deleteOrder = this.getCascadeDeleteOrder(objectName);
153
- // Delete in correct order based on DAG
154
- for (const objToDelete of deleteOrder) {
155
- if (objToDelete === objectName) {
156
- // Delete the main record
157
- await deleteFunc(objectName, id);
158
- }
159
- else {
160
- // Find and delete dependent records
161
- // This is a simplified version - in production, you'd need to:
162
- // 1. Query for records that reference the deleted record
163
- // 2. Delete them based on cascade rules (CASCADE vs SET NULL vs RESTRICT)
164
- const edgesFromParent = this.edges.get(objectName) || [];
165
- for (const edge of edgesFromParent) {
166
- if (edge.to === objToDelete && edge.type === 'master_detail') {
167
- // For master-detail, cascade delete dependent records
168
- // await deleteFunc(objToDelete, <dependent_id>);
169
- // Implementation would require querying for dependent records
170
- }
171
- }
172
- }
173
- }
174
- }
175
- /**
176
- * Get graph statistics
177
- */
178
- getStats() {
179
- let totalDeps = 0;
180
- for (const deps of this.graph.values()) {
181
- totalDeps += deps.size;
182
- }
183
- return {
184
- totalObjects: this.graph.size,
185
- totalDependencies: totalDeps,
186
- hasCircularDependency: this.hasCircularDependency()
187
- };
188
- }
189
- /**
190
- * Clear the graph
191
- */
192
- clear() {
193
- this.graph.clear();
194
- this.edges.clear();
195
- }
196
- /**
197
- * Export graph as DOT format for visualization
198
- */
199
- toDot() {
200
- let dot = 'digraph Dependencies {\n';
201
- for (const [from, dependents] of this.graph.entries()) {
202
- for (const to of dependents) {
203
- dot += ` "${from}" -> "${to}";\n`;
204
- }
205
- }
206
- dot += '}';
207
- return dot;
208
- }
209
- }
210
- exports.DependencyGraph = DependencyGraph;
211
- //# sourceMappingURL=DependencyGraph.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DependencyGraph.js","sourceRoot":"","sources":["../../src/optimizations/DependencyGraph.ts"],"names":[],"mappings":"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"}