@objectql/core 4.2.0 → 4.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +34 -0
  3. package/README.md +5 -2
  4. package/dist/app.d.ts +61 -52
  5. package/dist/app.js +100 -435
  6. package/dist/app.js.map +1 -1
  7. package/dist/index.d.ts +14 -20
  8. package/dist/index.js +21 -20
  9. package/dist/index.js.map +1 -1
  10. package/dist/kernel-factory.d.ts +38 -0
  11. package/dist/kernel-factory.js +38 -0
  12. package/dist/kernel-factory.js.map +1 -0
  13. package/dist/plugin.d.ts +9 -16
  14. package/dist/plugin.js +71 -48
  15. package/dist/plugin.js.map +1 -1
  16. package/dist/repository.d.ts +4 -31
  17. package/dist/repository.js +7 -283
  18. package/dist/repository.js.map +1 -1
  19. package/dist/util.js +4 -2
  20. package/dist/util.js.map +1 -1
  21. package/package.json +14 -12
  22. package/src/app.ts +156 -539
  23. package/src/index.ts +18 -42
  24. package/src/kernel-factory.ts +47 -0
  25. package/src/plugin.ts +77 -85
  26. package/src/repository.ts +4 -320
  27. package/src/util.ts +5 -3
  28. package/test/__mocks__/@objectstack/core.ts +250 -1
  29. package/test/__mocks__/@objectstack/objectql.ts +273 -0
  30. package/test/__mocks__/@objectstack/runtime.ts +14 -5
  31. package/test/introspection.test.ts +1 -1
  32. package/test/mock-driver.ts +5 -5
  33. package/test/optimizations.test.ts +2 -2
  34. package/test/plugin-integration.test.ts +1 -3
  35. package/test/utils.ts +6 -6
  36. package/tsconfig.json +3 -1
  37. package/tsconfig.tsbuildinfo +1 -1
  38. package/dist/ai/index.d.ts +0 -8
  39. package/dist/ai/index.js +0 -25
  40. package/dist/ai/index.js.map +0 -1
  41. package/dist/ai/registry.d.ts +0 -23
  42. package/dist/ai/registry.js +0 -78
  43. package/dist/ai/registry.js.map +0 -1
  44. package/dist/gateway.d.ts +0 -37
  45. package/dist/gateway.js +0 -93
  46. package/dist/gateway.js.map +0 -1
  47. package/dist/optimizations/CompiledHookManager.d.ts +0 -56
  48. package/dist/optimizations/CompiledHookManager.js +0 -170
  49. package/dist/optimizations/CompiledHookManager.js.map +0 -1
  50. package/dist/optimizations/DependencyGraph.d.ts +0 -82
  51. package/dist/optimizations/DependencyGraph.js +0 -211
  52. package/dist/optimizations/DependencyGraph.js.map +0 -1
  53. package/dist/optimizations/GlobalConnectionPool.d.ts +0 -89
  54. package/dist/optimizations/GlobalConnectionPool.js +0 -193
  55. package/dist/optimizations/GlobalConnectionPool.js.map +0 -1
  56. package/dist/optimizations/LazyMetadataLoader.d.ts +0 -75
  57. package/dist/optimizations/LazyMetadataLoader.js +0 -149
  58. package/dist/optimizations/LazyMetadataLoader.js.map +0 -1
  59. package/dist/optimizations/OptimizedMetadataRegistry.d.ts +0 -26
  60. package/dist/optimizations/OptimizedMetadataRegistry.js +0 -117
  61. package/dist/optimizations/OptimizedMetadataRegistry.js.map +0 -1
  62. package/dist/optimizations/OptimizedValidationEngine.d.ts +0 -73
  63. package/dist/optimizations/OptimizedValidationEngine.js +0 -141
  64. package/dist/optimizations/OptimizedValidationEngine.js.map +0 -1
  65. package/dist/optimizations/QueryCompiler.d.ts +0 -51
  66. package/dist/optimizations/QueryCompiler.js +0 -216
  67. package/dist/optimizations/QueryCompiler.js.map +0 -1
  68. package/dist/optimizations/SQLQueryOptimizer.d.ts +0 -96
  69. package/dist/optimizations/SQLQueryOptimizer.js +0 -265
  70. package/dist/optimizations/SQLQueryOptimizer.js.map +0 -1
  71. package/dist/optimizations/index.d.ts +0 -32
  72. package/dist/optimizations/index.js +0 -44
  73. package/dist/optimizations/index.js.map +0 -1
  74. package/dist/protocol.d.ts +0 -191
  75. package/dist/protocol.js +0 -272
  76. package/dist/protocol.js.map +0 -1
  77. package/dist/query/filter-translator.d.ts +0 -24
  78. package/dist/query/filter-translator.js +0 -38
  79. package/dist/query/filter-translator.js.map +0 -1
  80. package/dist/query/index.d.ts +0 -22
  81. package/dist/query/index.js +0 -39
  82. package/dist/query/index.js.map +0 -1
  83. package/dist/query/query-analyzer.d.ts +0 -186
  84. package/dist/query/query-analyzer.js +0 -348
  85. package/dist/query/query-analyzer.js.map +0 -1
  86. package/dist/query/query-builder.d.ts +0 -27
  87. package/dist/query/query-builder.js +0 -69
  88. package/dist/query/query-builder.js.map +0 -1
  89. package/dist/query/query-service.d.ts +0 -151
  90. package/dist/query/query-service.js +0 -272
  91. package/dist/query/query-service.js.map +0 -1
  92. package/src/ai/index.ts +0 -9
  93. package/src/ai/registry.ts +0 -81
  94. package/src/gateway.ts +0 -105
  95. package/src/optimizations/CompiledHookManager.ts +0 -193
  96. package/src/optimizations/DependencyGraph.ts +0 -255
  97. package/src/optimizations/GlobalConnectionPool.ts +0 -251
  98. package/src/optimizations/LazyMetadataLoader.ts +0 -180
  99. package/src/optimizations/OptimizedMetadataRegistry.ts +0 -132
  100. package/src/optimizations/OptimizedValidationEngine.ts +0 -172
  101. package/src/optimizations/QueryCompiler.ts +0 -242
  102. package/src/optimizations/SQLQueryOptimizer.ts +0 -329
  103. package/src/optimizations/index.ts +0 -34
  104. package/src/protocol.ts +0 -304
  105. package/src/query/filter-translator.ts +0 -41
  106. package/src/query/index.ts +0 -24
  107. package/src/query/query-analyzer.ts +0 -532
  108. package/src/query/query-builder.ts +0 -64
  109. package/src/query/query-service.ts +0 -397
  110. package/test/ai-registry.test.ts +0 -42
  111. package/test/app.test.ts +0 -578
  112. package/test/filter-syntax.test.ts +0 -233
  113. package/test/gateway.test.ts +0 -88
  114. package/test/protocol.test.ts +0 -143
  115. package/test/repository-validation.test.ts +0 -351
  116. package/test/repository.test.ts +0 -151
@@ -1,348 +0,0 @@
1
- "use strict";
2
- /**
3
- * ObjectQL Query Analyzer
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.QueryAnalyzer = void 0;
11
- /**
12
- * Query Analyzer
13
- *
14
- * Provides query performance analysis and profiling capabilities.
15
- * This class helps developers optimize queries by:
16
- * - Analyzing query plans
17
- * - Profiling execution performance
18
- * - Tracking statistics
19
- * - Providing optimization suggestions
20
- */
21
- class QueryAnalyzer {
22
- constructor(queryService, metadata) {
23
- this.queryService = queryService;
24
- this.metadata = metadata;
25
- this.stats = {
26
- totalQueries: 0,
27
- avgExecutionTime: 0,
28
- slowestQuery: 0,
29
- fastestQuery: Number.MAX_VALUE,
30
- byObject: {},
31
- slowQueries: []
32
- };
33
- this.executionTimes = [];
34
- this.MAX_SLOW_QUERIES = 10;
35
- }
36
- /**
37
- * Analyze a query and generate an execution plan
38
- *
39
- * @param objectName - The object to query
40
- * @param query - The unified query
41
- * @returns Query plan with optimization suggestions
42
- */
43
- async explain(objectName, query) {
44
- const schema = this.getSchema(objectName);
45
- // Build the QueryAST (without executing)
46
- const ast = {
47
- object: objectName,
48
- where: query.where, // FilterCondition format
49
- orderBy: query.orderBy, // Will be converted to SortNode[] format
50
- limit: query.limit,
51
- offset: query.offset,
52
- fields: query.fields
53
- };
54
- // Analyze filters for index usage
55
- const indexes = this.findApplicableIndexes(schema, query);
56
- // Detect potential issues
57
- const warnings = this.analyzeWarnings(schema, query);
58
- // Generate suggestions
59
- const suggestions = this.generateSuggestions(schema, query, indexes);
60
- // Calculate complexity
61
- const complexity = this.calculateComplexity(query);
62
- // Try to estimate rows (basic heuristic)
63
- const estimatedRows = this.estimateRows(schema, query);
64
- return {
65
- ast,
66
- estimatedRows,
67
- indexes,
68
- warnings,
69
- suggestions,
70
- complexity
71
- };
72
- }
73
- /**
74
- * Profile a query execution
75
- *
76
- * @param objectName - The object to query
77
- * @param query - The unified query
78
- * @param options - Query execution options
79
- * @returns Profile result with execution statistics
80
- */
81
- async profile(objectName, query, options = {}) {
82
- var _a, _b;
83
- // Get the query plan first
84
- const plan = await this.explain(objectName, query);
85
- // Execute with profiling enabled
86
- const result = await this.queryService.find(objectName, query, {
87
- ...options,
88
- profile: true
89
- });
90
- const executionTime = ((_a = result.profile) === null || _a === void 0 ? void 0 : _a.executionTime) || 0;
91
- const rowsReturned = result.value.length;
92
- const rowsScanned = ((_b = result.profile) === null || _b === void 0 ? void 0 : _b.rowsScanned) || rowsReturned;
93
- // Calculate efficiency
94
- const efficiency = rowsScanned > 0 ? rowsReturned / rowsScanned : 0;
95
- // Determine if index was used (heuristic)
96
- const indexUsed = plan.indexes.length > 0 && efficiency > 0.5;
97
- // Update statistics
98
- this.recordExecution(objectName, executionTime, query);
99
- return {
100
- executionTime,
101
- rowsScanned,
102
- rowsReturned,
103
- indexUsed,
104
- plan,
105
- efficiency
106
- };
107
- }
108
- /**
109
- * Get aggregated query statistics
110
- *
111
- * @returns Current query statistics
112
- */
113
- getStatistics() {
114
- return { ...this.stats };
115
- }
116
- /**
117
- * Reset statistics
118
- */
119
- resetStatistics() {
120
- this.stats = {
121
- totalQueries: 0,
122
- avgExecutionTime: 0,
123
- slowestQuery: 0,
124
- fastestQuery: Number.MAX_VALUE,
125
- byObject: {},
126
- slowQueries: []
127
- };
128
- this.executionTimes = [];
129
- }
130
- /**
131
- * Get schema for an object
132
- * @private
133
- */
134
- getSchema(objectName) {
135
- const obj = this.metadata.get('object', objectName);
136
- if (!obj) {
137
- throw new Error(`Object '${objectName}' not found`);
138
- }
139
- return obj;
140
- }
141
- /**
142
- * Find indexes that could be used for the query
143
- * @private
144
- */
145
- findApplicableIndexes(schema, query) {
146
- const indexes = [];
147
- if (!schema.indexes || !query.where) {
148
- return indexes;
149
- }
150
- // Extract fields used in filters
151
- const filterFields = new Set();
152
- // FilterCondition is an object-based filter (e.g., { field: value } or { field: { $eq: value } })
153
- // We need to extract field names from the filter object
154
- const extractFieldsFromFilter = (filter) => {
155
- if (!filter || typeof filter !== 'object')
156
- return;
157
- for (const key of Object.keys(filter)) {
158
- // Skip logical operators
159
- if (key.startsWith('$')) {
160
- // Logical operators contain nested filters
161
- if (key === '$and' || key === '$or') {
162
- const nested = filter[key];
163
- if (Array.isArray(nested)) {
164
- nested.forEach(extractFieldsFromFilter);
165
- }
166
- }
167
- continue;
168
- }
169
- // This is a field name
170
- filterFields.add(key);
171
- }
172
- };
173
- extractFieldsFromFilter(query.where);
174
- // Check which indexes could be used
175
- const indexesArray = Array.isArray(schema.indexes) ? schema.indexes : Object.values(schema.indexes || {});
176
- for (const index of indexesArray) {
177
- const indexFields = Array.isArray(index.fields)
178
- ? index.fields
179
- : [index.fields];
180
- // Simple heuristic: index is applicable if first field is in filter
181
- if (indexFields.length > 0 && filterFields.has(indexFields[0])) {
182
- const indexName = index.name || indexFields.join('_');
183
- indexes.push(indexName);
184
- }
185
- }
186
- return indexes;
187
- }
188
- /**
189
- * Analyze query for potential issues
190
- * @private
191
- */
192
- analyzeWarnings(schema, query) {
193
- const warnings = [];
194
- // Warning: No filters (full table scan)
195
- if (!query.where || Object.keys(query.where).length === 0) {
196
- warnings.push('No filters specified - this will scan all records');
197
- }
198
- // Warning: No limit on potentially large dataset
199
- if (!query.limit) {
200
- warnings.push('No limit specified - consider adding pagination');
201
- }
202
- // Warning: Selecting all fields
203
- if (!query.fields || query.fields.length === 0) {
204
- const fieldCount = Object.keys(schema.fields || {}).length;
205
- if (fieldCount > 10) {
206
- warnings.push(`Selecting all ${fieldCount} fields - consider selecting only needed fields`);
207
- }
208
- }
209
- // Warning: Complex filters without indexes
210
- if (query.where && Object.keys(query.where).length > 5) {
211
- const indexes = this.findApplicableIndexes(schema, query);
212
- if (indexes.length === 0) {
213
- warnings.push('Complex filters without matching indexes - consider adding indexes');
214
- }
215
- }
216
- return warnings;
217
- }
218
- /**
219
- * Generate optimization suggestions
220
- * @private
221
- */
222
- generateSuggestions(schema, query, indexes) {
223
- const suggestions = [];
224
- // Suggest adding limit
225
- if (!query.limit) {
226
- suggestions.push('Add a limit clause to restrict result set size');
227
- }
228
- // Suggest adding indexes
229
- if (query.where && Object.keys(query.where).length > 0 && indexes.length === 0) {
230
- const filterFields = Object.keys(query.where).filter(k => !k.startsWith('$'));
231
- if (filterFields.length > 0) {
232
- suggestions.push(`Consider adding an index on: ${filterFields.join(', ')}`);
233
- }
234
- }
235
- // Suggest field selection
236
- if (!query.fields || query.fields.length === 0) {
237
- suggestions.push('Select only required fields to reduce data transfer');
238
- }
239
- // Suggest composite index for multiple filters
240
- if (query.where && Object.keys(query.where).length > 1 && indexes.length < 2) {
241
- const filterFields = Object.keys(query.where)
242
- .filter(k => !k.startsWith('$'))
243
- .slice(0, 3); // Top 3 fields
244
- if (filterFields.length > 1) {
245
- suggestions.push(`Consider a composite index on: (${filterFields.join(', ')})`);
246
- }
247
- }
248
- return suggestions;
249
- }
250
- /**
251
- * Calculate query complexity score (0-100)
252
- * @private
253
- */
254
- calculateComplexity(query) {
255
- let complexity = 0;
256
- // Base complexity
257
- complexity += 10;
258
- // Filters add complexity
259
- if (query.where) {
260
- const filterCount = Object.keys(query.where).length;
261
- complexity += filterCount * 5;
262
- // Nested filters (OR/AND conditions) add more
263
- const hasLogicalOps = query.where.$and || query.where.$or;
264
- if (hasLogicalOps) {
265
- complexity += 15;
266
- }
267
- }
268
- // Sorting adds complexity
269
- if (query.orderBy && query.orderBy.length > 0) {
270
- complexity += query.orderBy.length * 3;
271
- }
272
- // Field selection reduces complexity slightly
273
- if (query.fields && query.fields.length > 0 && query.fields.length < 10) {
274
- complexity -= 5;
275
- }
276
- // Pagination reduces complexity
277
- if (query.limit) {
278
- complexity -= 5;
279
- }
280
- // Cap at 100
281
- return Math.min(Math.max(complexity, 0), 100);
282
- }
283
- /**
284
- * Estimate number of rows (very rough heuristic)
285
- * @private
286
- */
287
- estimateRows(schema, query) {
288
- // This is a placeholder - real implementation would need statistics
289
- // from the database (row count, index selectivity, etc.)
290
- // Default to unknown
291
- if (!query.where || Object.keys(query.where).length === 0) {
292
- return -1; // Unknown, full scan
293
- }
294
- // Very rough estimate based on filter count
295
- const baseEstimate = 1000;
296
- const filterCount = Object.keys(query.where).length;
297
- const filterReduction = Math.pow(0.5, filterCount);
298
- const estimated = Math.floor(baseEstimate * filterReduction);
299
- // Apply limit if present
300
- if (query.limit) {
301
- return Math.min(estimated, query.limit);
302
- }
303
- return estimated;
304
- }
305
- /**
306
- * Record a query execution for statistics
307
- * @private
308
- */
309
- recordExecution(objectName, executionTime, query) {
310
- // Update totals
311
- this.stats.totalQueries++;
312
- this.executionTimes.push(executionTime);
313
- // Update average
314
- this.stats.avgExecutionTime =
315
- this.executionTimes.reduce((sum, t) => sum + t, 0) / this.executionTimes.length;
316
- // Update min/max
317
- this.stats.slowestQuery = Math.max(this.stats.slowestQuery, executionTime);
318
- this.stats.fastestQuery = Math.min(this.stats.fastestQuery, executionTime);
319
- // Update per-object stats
320
- if (!this.stats.byObject[objectName]) {
321
- this.stats.byObject[objectName] = { count: 0, avgTime: 0 };
322
- }
323
- const objStats = this.stats.byObject[objectName];
324
- objStats.count++;
325
- objStats.avgTime = ((objStats.avgTime * (objStats.count - 1)) + executionTime) / objStats.count;
326
- // Track slow queries
327
- if (this.stats.slowQueries.length < this.MAX_SLOW_QUERIES) {
328
- this.stats.slowQueries.push({
329
- objectName,
330
- executionTime,
331
- query,
332
- timestamp: new Date()
333
- });
334
- this.stats.slowQueries.sort((a, b) => b.executionTime - a.executionTime);
335
- }
336
- else if (executionTime > this.stats.slowQueries[this.MAX_SLOW_QUERIES - 1].executionTime) {
337
- this.stats.slowQueries[this.MAX_SLOW_QUERIES - 1] = {
338
- objectName,
339
- executionTime,
340
- query,
341
- timestamp: new Date()
342
- };
343
- this.stats.slowQueries.sort((a, b) => b.executionTime - a.executionTime);
344
- }
345
- }
346
- }
347
- exports.QueryAnalyzer = QueryAnalyzer;
348
- //# sourceMappingURL=query-analyzer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query-analyzer.js","sourceRoot":"","sources":["../../src/query/query-analyzer.ts"],"names":[],"mappings":"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"}
@@ -1,27 +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 type { UnifiedQuery, QueryAST } from '@objectql/types';
9
- /**
10
- * Query Builder
11
- *
12
- * Builds ObjectStack QueryAST from ObjectQL UnifiedQuery.
13
- * Since UnifiedQuery now uses the standard protocol format directly,
14
- * this is now a simple pass-through with object name injection.
15
- */
16
- export declare class QueryBuilder {
17
- private filterTranslator;
18
- constructor();
19
- /**
20
- * Build a QueryAST from a UnifiedQuery
21
- *
22
- * @param objectName - Target object name
23
- * @param query - ObjectQL UnifiedQuery (now in standard QueryAST format)
24
- * @returns ObjectStack QueryAST
25
- */
26
- build(objectName: string, query: UnifiedQuery): QueryAST;
27
- }
@@ -1,69 +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.QueryBuilder = void 0;
11
- // import { QueryAST } from './types'; (Removed)
12
- // Local QueryAST type extension to include all properties we need
13
- // interface QueryAST extends Data.QueryAST {
14
- // top?: number;
15
- // expand?: Record<string, any>;
16
- // aggregations?: any[];
17
- // having?: any;
18
- // }
19
- const filter_translator_1 = require("./filter-translator");
20
- /**
21
- * Query Builder
22
- *
23
- * Builds ObjectStack QueryAST from ObjectQL UnifiedQuery.
24
- * Since UnifiedQuery now uses the standard protocol format directly,
25
- * this is now a simple pass-through with object name injection.
26
- */
27
- class QueryBuilder {
28
- constructor() {
29
- this.filterTranslator = new filter_translator_1.FilterTranslator();
30
- }
31
- /**
32
- * Build a QueryAST from a UnifiedQuery
33
- *
34
- * @param objectName - Target object name
35
- * @param query - ObjectQL UnifiedQuery (now in standard QueryAST format)
36
- * @returns ObjectStack QueryAST
37
- */
38
- build(objectName, query) {
39
- // UnifiedQuery now uses the same format as QueryAST
40
- // Just add the object name and pass through
41
- const ast = {
42
- object: objectName
43
- };
44
- // Map UnifiedQuery properties to QueryAST
45
- if (query.fields)
46
- ast.fields = query.fields;
47
- if (query.where)
48
- ast.where = this.filterTranslator.translate(query.where);
49
- if (query.orderBy)
50
- ast.orderBy = query.orderBy;
51
- if (query.offset !== undefined)
52
- ast.offset = query.offset;
53
- if (query.limit !== undefined)
54
- ast.top = query.limit; // UnifiedQuery uses 'limit', QueryAST uses 'top'
55
- if (query.expand)
56
- ast.expand = query.expand;
57
- if (query.groupBy)
58
- ast.groupBy = query.groupBy;
59
- if (query.aggregations)
60
- ast.aggregations = query.aggregations;
61
- if (query.having)
62
- ast.having = query.having;
63
- if (query.distinct)
64
- ast.distinct = query.distinct;
65
- return ast;
66
- }
67
- }
68
- exports.QueryBuilder = QueryBuilder;
69
- //# sourceMappingURL=query-builder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../src/query/query-builder.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAGH,gDAAgD;AAEhD,kEAAkE;AAClE,6CAA6C;AAC7C,mBAAmB;AACnB,mCAAmC;AACnC,2BAA2B;AAC3B,mBAAmB;AACnB,IAAI;AAEJ,2DAAuD;AAEvD;;;;;;GAMG;AACH,MAAa,YAAY;IAGrB;QACI,IAAI,CAAC,gBAAgB,GAAG,IAAI,oCAAgB,EAAE,CAAC;IACnD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAkB,EAAE,KAAmB;QACzC,oDAAoD;QACpD,4CAA4C;QAC5C,MAAM,GAAG,GAAa;YAClB,MAAM,EAAE,UAAU;SACrB,CAAC;QAEF,0CAA0C;QAC1C,IAAI,KAAK,CAAC,MAAM;YAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5C,IAAI,KAAK,CAAC,KAAK;YAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,OAAO;YAAE,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1D,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,iDAAiD;QACvG,IAAI,KAAK,CAAC,MAAM;YAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5C,IAAI,KAAK,CAAC,OAAO;YAAE,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/C,IAAI,KAAK,CAAC,YAAY;YAAE,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QAC9D,IAAI,KAAK,CAAC,MAAM;YAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5C,IAAI,KAAK,CAAC,QAAQ;YAAE,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAElD,OAAO,GAAG,CAAC;IACf,CAAC;CACJ;AAnCD,oCAmCC"}
@@ -1,151 +0,0 @@
1
- /**
2
- * ObjectQL Query Service
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 type { Driver, UnifiedQuery, Filter, MetadataRegistry } from '@objectql/types';
9
- import { QueryAST } from '@objectql/types';
10
- /**
11
- * Options for query execution
12
- */
13
- export interface QueryOptions {
14
- /**
15
- * Transaction handle for transactional queries
16
- */
17
- transaction?: any;
18
- /**
19
- * Skip validation (for system operations)
20
- */
21
- skipValidation?: boolean;
22
- /**
23
- * Include profiling information
24
- */
25
- profile?: boolean;
26
- /**
27
- * Custom driver options
28
- */
29
- driverOptions?: Record<string, unknown>;
30
- }
31
- /**
32
- * Result of a query execution with optional profiling data
33
- */
34
- export interface QueryResult<T = any> {
35
- /**
36
- * The query results
37
- */
38
- value: T;
39
- /**
40
- * Total count (for paginated queries)
41
- */
42
- count?: number;
43
- /**
44
- * Profiling information (if profile option was enabled)
45
- */
46
- profile?: QueryProfile;
47
- }
48
- /**
49
- * Profiling information for a query
50
- */
51
- export interface QueryProfile {
52
- /**
53
- * Execution time in milliseconds
54
- */
55
- executionTime: number;
56
- /**
57
- * Number of rows scanned
58
- */
59
- rowsScanned?: number;
60
- /**
61
- * Whether an index was used
62
- */
63
- indexUsed?: boolean;
64
- /**
65
- * The generated QueryAST
66
- */
67
- ast?: QueryAST;
68
- }
69
- /**
70
- * Query Service
71
- *
72
- * Handles all query execution logic, separating query concerns from
73
- * the repository pattern. This service is responsible for:
74
- * - Building QueryAST from UnifiedQuery
75
- * - Executing queries via drivers
76
- * - Optional query profiling and analysis
77
- *
78
- * The QueryService is registered as a service in the ObjectQLPlugin
79
- * and can be used by Repository for all read operations.
80
- */
81
- export declare class QueryService {
82
- private datasources;
83
- private metadata;
84
- private queryBuilder;
85
- private queryCompiler;
86
- constructor(datasources: Record<string, Driver>, metadata: MetadataRegistry);
87
- /**
88
- * Get the driver for a specific object
89
- * @private
90
- */
91
- private getDriver;
92
- /**
93
- * Get the schema for an object
94
- * @private
95
- */
96
- private getSchema;
97
- /**
98
- * Build QueryAST from UnifiedQuery
99
- * @private
100
- */
101
- private buildQueryAST;
102
- /**
103
- * Execute a find query
104
- *
105
- * @param objectName - The object to query
106
- * @param query - The unified query
107
- * @param options - Query execution options
108
- * @returns Array of matching records
109
- */
110
- find(objectName: string, query?: UnifiedQuery, options?: QueryOptions): Promise<QueryResult<any[]>>;
111
- /**
112
- * Execute a findOne query by ID
113
- *
114
- * @param objectName - The object to query
115
- * @param id - The record ID
116
- * @param options - Query execution options
117
- * @returns The matching record or undefined
118
- */
119
- findOne(objectName: string, id: string | number, options?: QueryOptions): Promise<QueryResult<any>>;
120
- /**
121
- * Execute a count query
122
- *
123
- * @param objectName - The object to query
124
- * @param where - Optional filter condition
125
- * @param options - Query execution options
126
- * @returns Count of matching records
127
- */
128
- count(objectName: string, where?: Filter, options?: QueryOptions): Promise<QueryResult<number>>;
129
- /**
130
- * Execute an aggregate query
131
- *
132
- * @param objectName - The object to query
133
- * @param query - The aggregation query using UnifiedQuery format
134
- * @param options - Query execution options
135
- * @returns Aggregation results
136
- */
137
- aggregate(objectName: string, query: UnifiedQuery, options?: QueryOptions): Promise<QueryResult<any[]>>;
138
- /**
139
- * Execute a direct SQL/query passthrough
140
- *
141
- * This bypasses ObjectQL's query builder and executes raw queries.
142
- * Use with caution as it bypasses security and validation.
143
- *
144
- * @param objectName - The object (determines which datasource to use)
145
- * @param queryString - Raw query string (SQL, MongoDB query, etc.)
146
- * @param params - Query parameters (for parameterized queries)
147
- * @param options - Query execution options
148
- * @returns Query results
149
- */
150
- directQuery(objectName: string, queryString: string, params?: any[], options?: QueryOptions): Promise<QueryResult<any>>;
151
- }