@objectql/core 4.0.1 → 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 +32 -0
- package/README.md +14 -12
- 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/filter-translator.d.ts +6 -18
- package/dist/query/filter-translator.js +6 -103
- package/dist/query/filter-translator.js.map +1 -1
- package/dist/query/query-analyzer.js +24 -25
- package/dist/query/query-analyzer.js.map +1 -1
- package/dist/query/query-builder.d.ts +9 -3
- package/dist/query/query-builder.js +25 -35
- package/dist/query/query-builder.js.map +1 -1
- package/dist/query/query-service.d.ts +2 -2
- package/dist/query/query-service.js +5 -5
- package/dist/query/query-service.js.map +1 -1
- package/dist/repository.d.ts +2 -0
- package/dist/repository.js +24 -17
- 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 +7 -8
- 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/filter-translator.ts +8 -115
- package/src/query/query-analyzer.ts +25 -29
- package/src/query/query-builder.ts +26 -43
- package/src/query/query-service.ts +6 -6
- package/src/repository.ts +35 -22
- package/test/__mocks__/@objectstack/runtime.ts +8 -8
- package/test/app.test.ts +11 -8
- 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/validator-plugin.test.ts +0 -126
- package/test/validator.test.ts +0 -440
|
@@ -0,0 +1,141 @@
|
|
|
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.OptimizedValidationEngine = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Optimized Validation Engine
|
|
13
|
+
*
|
|
14
|
+
* Improvement: Compiles validation rules to optimized validators.
|
|
15
|
+
* Validators are compiled once and cached for reuse.
|
|
16
|
+
*
|
|
17
|
+
* Expected: 3x faster validation, lower memory churn
|
|
18
|
+
*/
|
|
19
|
+
class OptimizedValidationEngine {
|
|
20
|
+
constructor() {
|
|
21
|
+
this.validators = new Map();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Compile a validation schema to an optimized validator function
|
|
25
|
+
*/
|
|
26
|
+
compileSchema(schema) {
|
|
27
|
+
// Generate optimized validation function
|
|
28
|
+
return (data) => {
|
|
29
|
+
const errors = [];
|
|
30
|
+
// Type validation
|
|
31
|
+
if (schema.type) {
|
|
32
|
+
const actualType = Array.isArray(data) ? 'array' : typeof data;
|
|
33
|
+
if (actualType !== schema.type && !(schema.type === 'integer' && typeof data === 'number')) {
|
|
34
|
+
errors.push(`Expected type ${schema.type}, got ${actualType}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Required validation
|
|
38
|
+
if (schema.required && (data === null || data === undefined)) {
|
|
39
|
+
errors.push('Value is required');
|
|
40
|
+
}
|
|
41
|
+
// String validations
|
|
42
|
+
if (typeof data === 'string') {
|
|
43
|
+
if (schema.minLength !== undefined && data.length < schema.minLength) {
|
|
44
|
+
errors.push(`String length must be at least ${schema.minLength}`);
|
|
45
|
+
}
|
|
46
|
+
if (schema.maxLength !== undefined && data.length > schema.maxLength) {
|
|
47
|
+
errors.push(`String length must not exceed ${schema.maxLength}`);
|
|
48
|
+
}
|
|
49
|
+
if (schema.pattern) {
|
|
50
|
+
const regex = new RegExp(schema.pattern);
|
|
51
|
+
if (!regex.test(data)) {
|
|
52
|
+
errors.push(`String does not match pattern ${schema.pattern}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Number validations
|
|
57
|
+
if (typeof data === 'number') {
|
|
58
|
+
if (schema.minimum !== undefined && data < schema.minimum) {
|
|
59
|
+
errors.push(`Value must be at least ${schema.minimum}`);
|
|
60
|
+
}
|
|
61
|
+
if (schema.maximum !== undefined && data > schema.maximum) {
|
|
62
|
+
errors.push(`Value must not exceed ${schema.maximum}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Enum validation
|
|
66
|
+
if (schema.enum && !schema.enum.includes(data)) {
|
|
67
|
+
errors.push(`Value must be one of: ${schema.enum.join(', ')}`);
|
|
68
|
+
}
|
|
69
|
+
// Object property validation
|
|
70
|
+
if (schema.properties && typeof data === 'object' && data !== null) {
|
|
71
|
+
for (const [key, propSchema] of Object.entries(schema.properties)) {
|
|
72
|
+
const propValidator = this.compileSchema(propSchema);
|
|
73
|
+
const result = propValidator(data[key]);
|
|
74
|
+
if (typeof result === 'object' && !result.valid) {
|
|
75
|
+
errors.push(...(result.errors || []).map(e => `${key}: ${e}`));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Array item validation
|
|
80
|
+
if (schema.items && Array.isArray(data)) {
|
|
81
|
+
const itemValidator = this.compileSchema(schema.items);
|
|
82
|
+
data.forEach((item, index) => {
|
|
83
|
+
const result = itemValidator(item);
|
|
84
|
+
if (typeof result === 'object' && !result.valid) {
|
|
85
|
+
errors.push(...(result.errors || []).map(e => `[${index}]: ${e}`));
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
valid: errors.length === 0,
|
|
91
|
+
errors: errors.length > 0 ? errors : undefined
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Compile and cache a validator for an object
|
|
97
|
+
*/
|
|
98
|
+
compile(objectName, schema) {
|
|
99
|
+
const validator = this.compileSchema(schema);
|
|
100
|
+
this.validators.set(objectName, validator);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Validate data against a compiled validator
|
|
104
|
+
*/
|
|
105
|
+
validate(objectName, data) {
|
|
106
|
+
const validator = this.validators.get(objectName);
|
|
107
|
+
if (!validator) {
|
|
108
|
+
throw new Error(`No validator compiled for object: ${objectName}`);
|
|
109
|
+
}
|
|
110
|
+
const result = validator(data);
|
|
111
|
+
return typeof result === 'boolean' ? { valid: result } : result;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Check if a validator exists for an object
|
|
115
|
+
*/
|
|
116
|
+
hasValidator(objectName) {
|
|
117
|
+
return this.validators.has(objectName);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Remove a compiled validator
|
|
121
|
+
*/
|
|
122
|
+
removeValidator(objectName) {
|
|
123
|
+
this.validators.delete(objectName);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Clear all compiled validators
|
|
127
|
+
*/
|
|
128
|
+
clearAll() {
|
|
129
|
+
this.validators.clear();
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get statistics about compiled validators
|
|
133
|
+
*/
|
|
134
|
+
getStats() {
|
|
135
|
+
return {
|
|
136
|
+
totalValidators: this.validators.size
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.OptimizedValidationEngine = OptimizedValidationEngine;
|
|
141
|
+
//# sourceMappingURL=OptimizedValidationEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OptimizedValidationEngine.js","sourceRoot":"","sources":["../../src/optimizations/OptimizedValidationEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
* Compiled Query representation
|
|
10
|
+
* Contains optimized execution plan
|
|
11
|
+
*/
|
|
12
|
+
export interface CompiledQuery {
|
|
13
|
+
objectName: string;
|
|
14
|
+
ast: any;
|
|
15
|
+
plan: any;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Query Compiler with LRU Cache
|
|
20
|
+
*
|
|
21
|
+
* Improvement: Compiles Query AST to optimized execution plan and caches results.
|
|
22
|
+
* Expected: 10x faster query planning, 50% lower CPU usage
|
|
23
|
+
*/
|
|
24
|
+
export declare class QueryCompiler {
|
|
25
|
+
private cache;
|
|
26
|
+
constructor(cacheSize?: number);
|
|
27
|
+
/**
|
|
28
|
+
* Hash a Query AST to create a cache key
|
|
29
|
+
*/
|
|
30
|
+
private hashAST;
|
|
31
|
+
/**
|
|
32
|
+
* Compile AST to optimized execution plan
|
|
33
|
+
*/
|
|
34
|
+
private compileAST;
|
|
35
|
+
/**
|
|
36
|
+
* Detect fields that can use indexes
|
|
37
|
+
*/
|
|
38
|
+
private detectIndexableFields;
|
|
39
|
+
/**
|
|
40
|
+
* Determine optimal join strategy
|
|
41
|
+
*/
|
|
42
|
+
private determineJoinStrategy;
|
|
43
|
+
/**
|
|
44
|
+
* Compile and cache query
|
|
45
|
+
*/
|
|
46
|
+
compile(objectName: string, ast: any): CompiledQuery;
|
|
47
|
+
/**
|
|
48
|
+
* Clear the cache (useful for testing or after schema changes)
|
|
49
|
+
*/
|
|
50
|
+
clearCache(): void;
|
|
51
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
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.QueryCompiler = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* LRU Cache implementation
|
|
13
|
+
* Simple doubly-linked list + hash map for O(1) operations
|
|
14
|
+
*/
|
|
15
|
+
class LRUCache {
|
|
16
|
+
constructor(capacity) {
|
|
17
|
+
this.cache = new Map();
|
|
18
|
+
this.head = null;
|
|
19
|
+
this.tail = null;
|
|
20
|
+
this.capacity = capacity;
|
|
21
|
+
}
|
|
22
|
+
get(key) {
|
|
23
|
+
const node = this.cache.get(key);
|
|
24
|
+
if (!node)
|
|
25
|
+
return undefined;
|
|
26
|
+
// Move to front (most recently used)
|
|
27
|
+
this.moveToFront(key);
|
|
28
|
+
return node.value;
|
|
29
|
+
}
|
|
30
|
+
set(key, value) {
|
|
31
|
+
if (this.cache.has(key)) {
|
|
32
|
+
// Update existing
|
|
33
|
+
const node = this.cache.get(key);
|
|
34
|
+
node.value = value;
|
|
35
|
+
this.moveToFront(key);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Add new
|
|
39
|
+
if (this.cache.size >= this.capacity) {
|
|
40
|
+
// Evict least recently used (tail)
|
|
41
|
+
if (this.tail !== null) {
|
|
42
|
+
const oldTail = this.tail;
|
|
43
|
+
const tailNode = this.cache.get(this.tail);
|
|
44
|
+
if (tailNode && tailNode.prev !== null) {
|
|
45
|
+
const prevNode = this.cache.get(tailNode.prev);
|
|
46
|
+
if (prevNode) {
|
|
47
|
+
prevNode.next = null;
|
|
48
|
+
this.tail = tailNode.prev;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this.head = null;
|
|
53
|
+
this.tail = null;
|
|
54
|
+
}
|
|
55
|
+
this.cache.delete(oldTail);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Insert at head
|
|
59
|
+
this.cache.set(key, { value, prev: null, next: this.head });
|
|
60
|
+
if (this.head !== null) {
|
|
61
|
+
const headNode = this.cache.get(this.head);
|
|
62
|
+
if (headNode) {
|
|
63
|
+
headNode.prev = key;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
this.head = key;
|
|
67
|
+
if (this.tail === null) {
|
|
68
|
+
this.tail = key;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
has(key) {
|
|
73
|
+
return this.cache.has(key);
|
|
74
|
+
}
|
|
75
|
+
moveToFront(key) {
|
|
76
|
+
if (key === this.head)
|
|
77
|
+
return; // Already at front
|
|
78
|
+
const node = this.cache.get(key);
|
|
79
|
+
if (!node)
|
|
80
|
+
return;
|
|
81
|
+
// Remove from current position
|
|
82
|
+
if (node.prev !== null) {
|
|
83
|
+
const prevNode = this.cache.get(node.prev);
|
|
84
|
+
if (prevNode) {
|
|
85
|
+
prevNode.next = node.next;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (node.next !== null) {
|
|
89
|
+
const nextNode = this.cache.get(node.next);
|
|
90
|
+
if (nextNode) {
|
|
91
|
+
nextNode.prev = node.prev;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (key === this.tail) {
|
|
95
|
+
this.tail = node.prev;
|
|
96
|
+
}
|
|
97
|
+
// Move to front
|
|
98
|
+
node.prev = null;
|
|
99
|
+
node.next = this.head;
|
|
100
|
+
if (this.head !== null) {
|
|
101
|
+
const headNode = this.cache.get(this.head);
|
|
102
|
+
if (headNode) {
|
|
103
|
+
headNode.prev = key;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
this.head = key;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Query Compiler with LRU Cache
|
|
111
|
+
*
|
|
112
|
+
* Improvement: Compiles Query AST to optimized execution plan and caches results.
|
|
113
|
+
* Expected: 10x faster query planning, 50% lower CPU usage
|
|
114
|
+
*/
|
|
115
|
+
class QueryCompiler {
|
|
116
|
+
constructor(cacheSize = 1000) {
|
|
117
|
+
this.cache = new LRUCache(cacheSize);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Hash a Query AST to create a cache key
|
|
121
|
+
*/
|
|
122
|
+
hashAST(ast) {
|
|
123
|
+
// Simple JSON-based hash for now
|
|
124
|
+
// In production, consider a faster hash function
|
|
125
|
+
try {
|
|
126
|
+
return JSON.stringify(ast);
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
// Fallback for circular references
|
|
130
|
+
return String(Date.now() + Math.random());
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Compile AST to optimized execution plan
|
|
135
|
+
*/
|
|
136
|
+
compileAST(objectName, ast) {
|
|
137
|
+
// Optimization opportunities:
|
|
138
|
+
// 1. Precompute field projections
|
|
139
|
+
// 2. Optimize filter conditions
|
|
140
|
+
// 3. Determine optimal join strategy
|
|
141
|
+
// 4. Index hint detection
|
|
142
|
+
const plan = {
|
|
143
|
+
objectName,
|
|
144
|
+
// Extract and optimize components
|
|
145
|
+
fields: ast.fields || ['*'],
|
|
146
|
+
filters: ast.filters || ast.where,
|
|
147
|
+
sort: ast.sort || ast.orderBy,
|
|
148
|
+
limit: ast.limit || ast.top,
|
|
149
|
+
offset: ast.offset || ast.skip,
|
|
150
|
+
// Add optimization hints
|
|
151
|
+
useIndex: this.detectIndexableFields(ast),
|
|
152
|
+
joinStrategy: this.determineJoinStrategy(ast)
|
|
153
|
+
};
|
|
154
|
+
return {
|
|
155
|
+
objectName,
|
|
156
|
+
ast,
|
|
157
|
+
plan,
|
|
158
|
+
timestamp: Date.now()
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Detect fields that can use indexes
|
|
163
|
+
*/
|
|
164
|
+
detectIndexableFields(ast) {
|
|
165
|
+
const indexable = [];
|
|
166
|
+
if (ast.filters) {
|
|
167
|
+
// Extract fields from filter conditions
|
|
168
|
+
const extractFields = (filters) => {
|
|
169
|
+
if (Array.isArray(filters)) {
|
|
170
|
+
filters.forEach(extractFields);
|
|
171
|
+
}
|
|
172
|
+
else if (filters && typeof filters === 'object') {
|
|
173
|
+
Object.keys(filters).forEach(key => {
|
|
174
|
+
if (!key.startsWith('$')) {
|
|
175
|
+
indexable.push(key);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
extractFields(ast.filters);
|
|
181
|
+
}
|
|
182
|
+
return [...new Set(indexable)]; // Remove duplicates
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Determine optimal join strategy
|
|
186
|
+
*/
|
|
187
|
+
determineJoinStrategy(ast) {
|
|
188
|
+
// Simple heuristic: use hash join for large datasets
|
|
189
|
+
if (ast.limit && ast.limit < 100) {
|
|
190
|
+
return 'nested';
|
|
191
|
+
}
|
|
192
|
+
return 'hash';
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Compile and cache query
|
|
196
|
+
*/
|
|
197
|
+
compile(objectName, ast) {
|
|
198
|
+
const key = this.hashAST(ast);
|
|
199
|
+
if (this.cache.has(key)) {
|
|
200
|
+
// Cache hit ✅
|
|
201
|
+
return this.cache.get(key);
|
|
202
|
+
}
|
|
203
|
+
// Cache miss - compile and store
|
|
204
|
+
const compiled = this.compileAST(objectName, ast);
|
|
205
|
+
this.cache.set(key, compiled);
|
|
206
|
+
return compiled;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Clear the cache (useful for testing or after schema changes)
|
|
210
|
+
*/
|
|
211
|
+
clearCache() {
|
|
212
|
+
this.cache = new LRUCache(1000);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
exports.QueryCompiler = QueryCompiler;
|
|
216
|
+
//# sourceMappingURL=QueryCompiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryCompiler.js","sourceRoot":"","sources":["../../src/optimizations/QueryCompiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
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
|
+
* Index metadata
|
|
10
|
+
*/
|
|
11
|
+
export interface IndexMetadata {
|
|
12
|
+
name: string;
|
|
13
|
+
fields: string[];
|
|
14
|
+
unique: boolean;
|
|
15
|
+
type?: 'btree' | 'hash' | 'fulltext';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Schema with index information
|
|
19
|
+
*/
|
|
20
|
+
export interface SchemaWithIndexes {
|
|
21
|
+
name: string;
|
|
22
|
+
fields: Record<string, any>;
|
|
23
|
+
indexes?: IndexMetadata[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Query AST for optimization
|
|
27
|
+
*/
|
|
28
|
+
export interface OptimizableQueryAST {
|
|
29
|
+
object: string;
|
|
30
|
+
fields?: string[];
|
|
31
|
+
filters?: any;
|
|
32
|
+
sort?: Array<{
|
|
33
|
+
field: string;
|
|
34
|
+
order: 'asc' | 'desc';
|
|
35
|
+
}>;
|
|
36
|
+
joins?: Array<{
|
|
37
|
+
type: 'left' | 'inner';
|
|
38
|
+
table: string;
|
|
39
|
+
on: any;
|
|
40
|
+
}>;
|
|
41
|
+
limit?: number;
|
|
42
|
+
offset?: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* SQL Query Optimizer
|
|
46
|
+
*
|
|
47
|
+
* Improvement: SQL-aware optimization with index hints and join reordering.
|
|
48
|
+
* Analyzes query patterns and schema to generate optimal SQL.
|
|
49
|
+
*
|
|
50
|
+
* Expected: 2-5x faster queries on large datasets
|
|
51
|
+
*/
|
|
52
|
+
export declare class SQLQueryOptimizer {
|
|
53
|
+
private schemas;
|
|
54
|
+
/**
|
|
55
|
+
* Register a schema with index information
|
|
56
|
+
*/
|
|
57
|
+
registerSchema(schema: SchemaWithIndexes): void;
|
|
58
|
+
/**
|
|
59
|
+
* Check if a field has an index
|
|
60
|
+
*/
|
|
61
|
+
private hasIndex;
|
|
62
|
+
/**
|
|
63
|
+
* Get the best index for given filter fields
|
|
64
|
+
*/
|
|
65
|
+
private getBestIndex;
|
|
66
|
+
/**
|
|
67
|
+
* Extract filter fields from filter conditions
|
|
68
|
+
*/
|
|
69
|
+
private extractFilterFields;
|
|
70
|
+
/**
|
|
71
|
+
* Optimize join type based on query characteristics
|
|
72
|
+
*
|
|
73
|
+
* Note: This method expects filter fields in one of two formats:
|
|
74
|
+
* 1. Table-prefixed: "tableName.fieldName" (e.g., "accounts.type")
|
|
75
|
+
* 2. Simple field name: "fieldName" (checked against joined table schema)
|
|
76
|
+
*
|
|
77
|
+
* Multi-level qualification (e.g., "schema.table.field") is not currently supported.
|
|
78
|
+
*/
|
|
79
|
+
private optimizeJoinType;
|
|
80
|
+
/**
|
|
81
|
+
* Optimize a query AST to SQL
|
|
82
|
+
*/
|
|
83
|
+
optimize(ast: OptimizableQueryAST): string;
|
|
84
|
+
/**
|
|
85
|
+
* Convert filter object to SQL WHERE clause
|
|
86
|
+
*/
|
|
87
|
+
private filtersToSQL;
|
|
88
|
+
/**
|
|
89
|
+
* Fallback: generate basic SQL without optimizations
|
|
90
|
+
*/
|
|
91
|
+
private generateBasicSQL;
|
|
92
|
+
/**
|
|
93
|
+
* Clear all registered schemas
|
|
94
|
+
*/
|
|
95
|
+
clearSchemas(): void;
|
|
96
|
+
}
|