@objectql/core 4.0.2 → 4.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +4 -0
- package/CHANGELOG.md +18 -0
- package/README.md +4 -4
- package/dist/app.d.ts +9 -6
- package/dist/app.js +151 -29
- package/dist/app.js.map +1 -1
- package/dist/index.d.ts +6 -9
- package/dist/index.js +2 -5
- package/dist/index.js.map +1 -1
- package/dist/optimizations/CompiledHookManager.d.ts +55 -0
- package/dist/optimizations/CompiledHookManager.js +164 -0
- package/dist/optimizations/CompiledHookManager.js.map +1 -0
- package/dist/optimizations/DependencyGraph.d.ts +82 -0
- package/dist/optimizations/DependencyGraph.js +211 -0
- package/dist/optimizations/DependencyGraph.js.map +1 -0
- package/dist/optimizations/GlobalConnectionPool.d.ts +89 -0
- package/dist/optimizations/GlobalConnectionPool.js +193 -0
- package/dist/optimizations/GlobalConnectionPool.js.map +1 -0
- package/dist/optimizations/LazyMetadataLoader.d.ts +75 -0
- package/dist/optimizations/LazyMetadataLoader.js +149 -0
- package/dist/optimizations/LazyMetadataLoader.js.map +1 -0
- package/dist/optimizations/OptimizedMetadataRegistry.d.ts +26 -0
- package/dist/optimizations/OptimizedMetadataRegistry.js +117 -0
- package/dist/optimizations/OptimizedMetadataRegistry.js.map +1 -0
- package/dist/optimizations/OptimizedValidationEngine.d.ts +73 -0
- package/dist/optimizations/OptimizedValidationEngine.js +141 -0
- package/dist/optimizations/OptimizedValidationEngine.js.map +1 -0
- package/dist/optimizations/QueryCompiler.d.ts +51 -0
- package/dist/optimizations/QueryCompiler.js +216 -0
- package/dist/optimizations/QueryCompiler.js.map +1 -0
- package/dist/optimizations/SQLQueryOptimizer.d.ts +96 -0
- package/dist/optimizations/SQLQueryOptimizer.js +265 -0
- package/dist/optimizations/SQLQueryOptimizer.js.map +1 -0
- package/dist/optimizations/index.d.ts +32 -0
- package/dist/optimizations/index.js +44 -0
- package/dist/optimizations/index.js.map +1 -0
- package/dist/plugin.d.ts +6 -7
- package/dist/plugin.js +39 -22
- package/dist/plugin.js.map +1 -1
- package/dist/query/query-analyzer.js.map +1 -1
- package/dist/query/query-builder.d.ts +6 -1
- package/dist/query/query-builder.js +21 -5
- package/dist/query/query-builder.js.map +1 -1
- package/dist/query/query-service.js.map +1 -1
- package/dist/repository.d.ts +2 -0
- package/dist/repository.js +15 -9
- package/dist/repository.js.map +1 -1
- package/jest.config.js +3 -3
- package/package.json +8 -5
- package/src/app.ts +173 -47
- package/src/index.ts +8 -9
- package/src/optimizations/CompiledHookManager.ts +185 -0
- package/src/optimizations/DependencyGraph.ts +255 -0
- package/src/optimizations/GlobalConnectionPool.ts +251 -0
- package/src/optimizations/LazyMetadataLoader.ts +180 -0
- package/src/optimizations/OptimizedMetadataRegistry.ts +132 -0
- package/src/optimizations/OptimizedValidationEngine.ts +172 -0
- package/src/optimizations/QueryCompiler.ts +242 -0
- package/src/optimizations/SQLQueryOptimizer.ts +329 -0
- package/src/optimizations/index.ts +34 -0
- package/src/plugin.ts +51 -28
- package/src/query/query-analyzer.ts +1 -1
- package/src/query/query-builder.ts +21 -7
- package/src/query/query-service.ts +1 -1
- package/src/repository.ts +25 -13
- package/test/__mocks__/@objectstack/runtime.ts +8 -8
- package/test/app.test.ts +9 -7
- package/test/optimizations.test.ts +440 -0
- package/test/plugin-integration.test.ts +30 -19
- package/tsconfig.json +4 -6
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/ai-agent.d.ts +0 -176
- package/dist/ai-agent.js +0 -722
- package/dist/ai-agent.js.map +0 -1
- package/dist/formula-engine.d.ts +0 -102
- package/dist/formula-engine.js +0 -433
- package/dist/formula-engine.js.map +0 -1
- package/dist/formula-plugin.d.ts +0 -52
- package/dist/formula-plugin.js +0 -107
- package/dist/formula-plugin.js.map +0 -1
- package/dist/validator-plugin.d.ts +0 -56
- package/dist/validator-plugin.js +0 -106
- package/dist/validator-plugin.js.map +0 -1
- package/dist/validator.d.ts +0 -80
- package/dist/validator.js +0 -625
- package/dist/validator.js.map +0 -1
- package/src/ai-agent.ts +0 -868
- package/src/formula-engine.ts +0 -572
- package/src/formula-plugin.ts +0 -141
- package/src/validator-plugin.ts +0 -140
- package/src/validator.ts +0 -743
- package/test/formula-engine.test.ts +0 -725
- package/test/formula-integration.test.ts +0 -286
- package/test/formula-plugin.test.ts +0 -197
- package/test/formula-spec-compliance.test.ts +0 -258
- package/test/validation-spec-compliance.test.ts +0 -440
- package/test/validator-plugin.test.ts +0 -126
- package/test/validator.test.ts +0 -440
|
@@ -0,0 +1,164 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompiledHookManager.js","sourceRoot":"","sources":["../../src/optimizations/CompiledHookManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DependencyGraph.js","sourceRoot":"","sources":["../../src/optimizations/DependencyGraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
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
|
+
* Connection interface
|
|
10
|
+
*/
|
|
11
|
+
export interface Connection {
|
|
12
|
+
id: string;
|
|
13
|
+
driverName: string;
|
|
14
|
+
inUse: boolean;
|
|
15
|
+
createdAt: number;
|
|
16
|
+
lastUsedAt: number;
|
|
17
|
+
release: () => Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Connection pool limits
|
|
21
|
+
*/
|
|
22
|
+
export interface PoolLimits {
|
|
23
|
+
total: number;
|
|
24
|
+
perDriver: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Global Connection Pool Manager
|
|
28
|
+
*
|
|
29
|
+
* Improvement: Kernel-level connection pool with global limits.
|
|
30
|
+
* Coordinates connection allocation across all drivers.
|
|
31
|
+
*
|
|
32
|
+
* Expected: 5x faster connection acquisition, predictable resource usage
|
|
33
|
+
*/
|
|
34
|
+
export declare class GlobalConnectionPool {
|
|
35
|
+
private limits;
|
|
36
|
+
private allocations;
|
|
37
|
+
private connections;
|
|
38
|
+
private waitQueue;
|
|
39
|
+
constructor(limits?: PoolLimits);
|
|
40
|
+
/**
|
|
41
|
+
* Get total number of active connections across all drivers
|
|
42
|
+
*/
|
|
43
|
+
private totalConnections;
|
|
44
|
+
/**
|
|
45
|
+
* Get number of connections for a specific driver
|
|
46
|
+
*/
|
|
47
|
+
private getDriverConnections;
|
|
48
|
+
/**
|
|
49
|
+
* Try to process the wait queue
|
|
50
|
+
*/
|
|
51
|
+
private processWaitQueue;
|
|
52
|
+
/**
|
|
53
|
+
* Check if we can allocate a connection for a driver
|
|
54
|
+
*/
|
|
55
|
+
private canAllocate;
|
|
56
|
+
/**
|
|
57
|
+
* Actually acquire a connection (internal)
|
|
58
|
+
*/
|
|
59
|
+
private doAcquire;
|
|
60
|
+
/**
|
|
61
|
+
* Acquire a connection from the pool
|
|
62
|
+
*/
|
|
63
|
+
acquire(driverName: string): Promise<Connection>;
|
|
64
|
+
/**
|
|
65
|
+
* Release a connection back to the pool
|
|
66
|
+
*/
|
|
67
|
+
release(connection: Connection): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Close all connections for a driver
|
|
70
|
+
*/
|
|
71
|
+
closeDriver(driverName: string): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Get pool statistics
|
|
74
|
+
*/
|
|
75
|
+
getStats(): {
|
|
76
|
+
totalConnections: number;
|
|
77
|
+
totalLimit: number;
|
|
78
|
+
perDriverLimit: number;
|
|
79
|
+
driverStats: Record<string, {
|
|
80
|
+
active: number;
|
|
81
|
+
idle: number;
|
|
82
|
+
}>;
|
|
83
|
+
waitQueueSize: number;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Update pool limits
|
|
87
|
+
*/
|
|
88
|
+
updateLimits(limits: Partial<PoolLimits>): void;
|
|
89
|
+
}
|