@push.rocks/smartmongo 2.0.14 → 2.2.0

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 (87) hide show
  1. package/dist_ts/00_commitinfo_data.js +2 -2
  2. package/dist_ts/congodb/congodb.plugins.d.ts +10 -0
  3. package/dist_ts/congodb/congodb.plugins.js +14 -0
  4. package/dist_ts/congodb/engine/AggregationEngine.d.ts +66 -0
  5. package/dist_ts/congodb/engine/AggregationEngine.js +189 -0
  6. package/dist_ts/congodb/engine/IndexEngine.d.ts +77 -0
  7. package/dist_ts/congodb/engine/IndexEngine.js +376 -0
  8. package/dist_ts/congodb/engine/QueryEngine.d.ts +54 -0
  9. package/dist_ts/congodb/engine/QueryEngine.js +271 -0
  10. package/dist_ts/congodb/engine/TransactionEngine.d.ts +85 -0
  11. package/dist_ts/congodb/engine/TransactionEngine.js +287 -0
  12. package/dist_ts/congodb/engine/UpdateEngine.d.ts +47 -0
  13. package/dist_ts/congodb/engine/UpdateEngine.js +461 -0
  14. package/dist_ts/congodb/errors/CongoErrors.d.ts +100 -0
  15. package/dist_ts/congodb/errors/CongoErrors.js +155 -0
  16. package/dist_ts/congodb/index.d.ts +19 -0
  17. package/dist_ts/congodb/index.js +26 -0
  18. package/dist_ts/congodb/server/CommandRouter.d.ts +51 -0
  19. package/dist_ts/congodb/server/CommandRouter.js +132 -0
  20. package/dist_ts/congodb/server/CongoServer.d.ts +95 -0
  21. package/dist_ts/congodb/server/CongoServer.js +227 -0
  22. package/dist_ts/congodb/server/WireProtocol.d.ts +117 -0
  23. package/dist_ts/congodb/server/WireProtocol.js +298 -0
  24. package/dist_ts/congodb/server/handlers/AdminHandler.d.ts +100 -0
  25. package/dist_ts/congodb/server/handlers/AdminHandler.js +568 -0
  26. package/dist_ts/congodb/server/handlers/AggregateHandler.d.ts +31 -0
  27. package/dist_ts/congodb/server/handlers/AggregateHandler.js +277 -0
  28. package/dist_ts/congodb/server/handlers/DeleteHandler.d.ts +8 -0
  29. package/dist_ts/congodb/server/handlers/DeleteHandler.js +83 -0
  30. package/dist_ts/congodb/server/handlers/FindHandler.d.ts +31 -0
  31. package/dist_ts/congodb/server/handlers/FindHandler.js +261 -0
  32. package/dist_ts/congodb/server/handlers/HelloHandler.d.ts +11 -0
  33. package/dist_ts/congodb/server/handlers/HelloHandler.js +62 -0
  34. package/dist_ts/congodb/server/handlers/IndexHandler.d.ts +20 -0
  35. package/dist_ts/congodb/server/handlers/IndexHandler.js +183 -0
  36. package/dist_ts/congodb/server/handlers/InsertHandler.d.ts +8 -0
  37. package/dist_ts/congodb/server/handlers/InsertHandler.js +76 -0
  38. package/dist_ts/congodb/server/handlers/UpdateHandler.d.ts +24 -0
  39. package/dist_ts/congodb/server/handlers/UpdateHandler.js +270 -0
  40. package/dist_ts/congodb/server/handlers/index.d.ts +8 -0
  41. package/dist_ts/congodb/server/handlers/index.js +10 -0
  42. package/dist_ts/congodb/server/index.d.ts +6 -0
  43. package/dist_ts/congodb/server/index.js +7 -0
  44. package/dist_ts/congodb/storage/FileStorageAdapter.d.ts +61 -0
  45. package/dist_ts/congodb/storage/FileStorageAdapter.js +396 -0
  46. package/dist_ts/congodb/storage/IStorageAdapter.d.ts +140 -0
  47. package/dist_ts/congodb/storage/IStorageAdapter.js +2 -0
  48. package/dist_ts/congodb/storage/MemoryStorageAdapter.d.ts +66 -0
  49. package/dist_ts/congodb/storage/MemoryStorageAdapter.js +367 -0
  50. package/dist_ts/congodb/storage/OpLog.d.ts +93 -0
  51. package/dist_ts/congodb/storage/OpLog.js +221 -0
  52. package/dist_ts/congodb/types/interfaces.d.ts +363 -0
  53. package/dist_ts/congodb/types/interfaces.js +2 -0
  54. package/dist_ts/index.d.ts +1 -0
  55. package/dist_ts/index.js +8 -6
  56. package/npmextra.json +17 -7
  57. package/package.json +20 -12
  58. package/readme.hints.md +79 -0
  59. package/readme.md +398 -44
  60. package/ts/00_commitinfo_data.ts +1 -1
  61. package/ts/congodb/congodb.plugins.ts +17 -0
  62. package/ts/congodb/engine/AggregationEngine.ts +283 -0
  63. package/ts/congodb/engine/IndexEngine.ts +479 -0
  64. package/ts/congodb/engine/QueryEngine.ts +301 -0
  65. package/ts/congodb/engine/TransactionEngine.ts +351 -0
  66. package/ts/congodb/engine/UpdateEngine.ts +506 -0
  67. package/ts/congodb/errors/CongoErrors.ts +181 -0
  68. package/ts/congodb/index.ts +37 -0
  69. package/ts/congodb/server/CommandRouter.ts +180 -0
  70. package/ts/congodb/server/CongoServer.ts +298 -0
  71. package/ts/congodb/server/WireProtocol.ts +416 -0
  72. package/ts/congodb/server/handlers/AdminHandler.ts +614 -0
  73. package/ts/congodb/server/handlers/AggregateHandler.ts +342 -0
  74. package/ts/congodb/server/handlers/DeleteHandler.ts +100 -0
  75. package/ts/congodb/server/handlers/FindHandler.ts +301 -0
  76. package/ts/congodb/server/handlers/HelloHandler.ts +78 -0
  77. package/ts/congodb/server/handlers/IndexHandler.ts +207 -0
  78. package/ts/congodb/server/handlers/InsertHandler.ts +91 -0
  79. package/ts/congodb/server/handlers/UpdateHandler.ts +315 -0
  80. package/ts/congodb/server/handlers/index.ts +10 -0
  81. package/ts/congodb/server/index.ts +10 -0
  82. package/ts/congodb/storage/FileStorageAdapter.ts +479 -0
  83. package/ts/congodb/storage/IStorageAdapter.ts +202 -0
  84. package/ts/congodb/storage/MemoryStorageAdapter.ts +443 -0
  85. package/ts/congodb/storage/OpLog.ts +282 -0
  86. package/ts/congodb/types/interfaces.ts +433 -0
  87. package/ts/index.ts +3 -0
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartmongo',
6
- version: '2.0.14',
6
+ version: '2.2.0',
7
7
  description: 'A module for creating and managing a local MongoDB instance for testing purposes.'
8
8
  };
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLG1GQUFtRjtDQUNqRyxDQUFBIn0=
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLG1GQUFtRjtDQUNqRyxDQUFBIn0=
@@ -0,0 +1,10 @@
1
+ import * as smartfs from '@push.rocks/smartfs';
2
+ import * as smartpath from '@push.rocks/smartpath';
3
+ import * as smartpromise from '@push.rocks/smartpromise';
4
+ import * as smartrx from '@push.rocks/smartrx';
5
+ export { smartfs, smartpath, smartpromise, smartrx };
6
+ import * as bson from 'bson';
7
+ import * as mingo from 'mingo';
8
+ export { bson, mingo };
9
+ export { Query } from 'mingo';
10
+ export { Aggregator } from 'mingo';
@@ -0,0 +1,14 @@
1
+ // @push.rocks scope
2
+ import * as smartfs from '@push.rocks/smartfs';
3
+ import * as smartpath from '@push.rocks/smartpath';
4
+ import * as smartpromise from '@push.rocks/smartpromise';
5
+ import * as smartrx from '@push.rocks/smartrx';
6
+ export { smartfs, smartpath, smartpromise, smartrx };
7
+ // thirdparty
8
+ import * as bson from 'bson';
9
+ import * as mingo from 'mingo';
10
+ export { bson, mingo };
11
+ // Re-export commonly used mingo classes
12
+ export { Query } from 'mingo';
13
+ export { Aggregator } from 'mingo';
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZ29kYi5wbHVnaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY29uZ29kYi9jb25nb2RiLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFFL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBRXJELGFBQWE7QUFDYixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUvQixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBRXZCLHdDQUF3QztBQUN4QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxPQUFPLENBQUMifQ==
@@ -0,0 +1,66 @@
1
+ import type { Document, IStoredDocument, IAggregateOptions } from '../types/interfaces.js';
2
+ /**
3
+ * Aggregation engine using mingo for MongoDB-compatible aggregation pipeline execution
4
+ */
5
+ export declare class AggregationEngine {
6
+ /**
7
+ * Execute an aggregation pipeline on a collection of documents
8
+ */
9
+ static aggregate(documents: IStoredDocument[], pipeline: Document[], options?: IAggregateOptions): Document[];
10
+ /**
11
+ * Execute aggregation and return an iterator for lazy evaluation
12
+ */
13
+ static aggregateIterator(documents: IStoredDocument[], pipeline: Document[], options?: IAggregateOptions): Generator<Document>;
14
+ /**
15
+ * Execute a $lookup stage manually (for cross-collection lookups)
16
+ * This is used when the lookup references another collection in the same database
17
+ */
18
+ static executeLookup(documents: IStoredDocument[], lookupSpec: {
19
+ from: string;
20
+ localField: string;
21
+ foreignField: string;
22
+ as: string;
23
+ }, foreignCollection: IStoredDocument[]): Document[];
24
+ /**
25
+ * Execute a $graphLookup stage manually
26
+ */
27
+ static executeGraphLookup(documents: IStoredDocument[], graphLookupSpec: {
28
+ from: string;
29
+ startWith: string | Document;
30
+ connectFromField: string;
31
+ connectToField: string;
32
+ as: string;
33
+ maxDepth?: number;
34
+ depthField?: string;
35
+ restrictSearchWithMatch?: Document;
36
+ }, foreignCollection: IStoredDocument[]): Document[];
37
+ /**
38
+ * Execute a $facet stage manually
39
+ */
40
+ static executeFacet(documents: IStoredDocument[], facetSpec: Record<string, Document[]>): Document;
41
+ /**
42
+ * Execute a $unionWith stage
43
+ */
44
+ static executeUnionWith(documents: IStoredDocument[], otherDocuments: IStoredDocument[], pipeline?: Document[]): Document[];
45
+ /**
46
+ * Execute a $merge stage (output to another collection)
47
+ * Returns the documents that would be inserted/updated
48
+ */
49
+ static prepareMerge(documents: Document[], mergeSpec: {
50
+ into: string;
51
+ on?: string | string[];
52
+ whenMatched?: 'replace' | 'keepExisting' | 'merge' | 'fail' | Document[];
53
+ whenNotMatched?: 'insert' | 'discard' | 'fail';
54
+ }): {
55
+ toInsert: Document[];
56
+ toUpdate: Array<{
57
+ filter: Document;
58
+ update: Document;
59
+ }>;
60
+ onField: string | string[];
61
+ whenMatched: string | Document[];
62
+ whenNotMatched: string;
63
+ };
64
+ private static getNestedValue;
65
+ private static valuesMatch;
66
+ }
@@ -0,0 +1,189 @@
1
+ import * as plugins from '../congodb.plugins.js';
2
+ // Import mingo Aggregator
3
+ import { Aggregator } from 'mingo';
4
+ /**
5
+ * Aggregation engine using mingo for MongoDB-compatible aggregation pipeline execution
6
+ */
7
+ export class AggregationEngine {
8
+ /**
9
+ * Execute an aggregation pipeline on a collection of documents
10
+ */
11
+ static aggregate(documents, pipeline, options) {
12
+ if (!pipeline || pipeline.length === 0) {
13
+ return documents;
14
+ }
15
+ // Create mingo aggregator with the pipeline
16
+ const aggregator = new Aggregator(pipeline, {
17
+ collation: options?.collation,
18
+ });
19
+ // Run the aggregation
20
+ const result = aggregator.run(documents);
21
+ return Array.isArray(result) ? result : [];
22
+ }
23
+ /**
24
+ * Execute aggregation and return an iterator for lazy evaluation
25
+ */
26
+ static *aggregateIterator(documents, pipeline, options) {
27
+ const aggregator = new Aggregator(pipeline, {
28
+ collation: options?.collation,
29
+ });
30
+ // Get the cursor from mingo
31
+ const cursor = aggregator.stream(documents);
32
+ for (const doc of cursor) {
33
+ yield doc;
34
+ }
35
+ }
36
+ /**
37
+ * Execute a $lookup stage manually (for cross-collection lookups)
38
+ * This is used when the lookup references another collection in the same database
39
+ */
40
+ static executeLookup(documents, lookupSpec, foreignCollection) {
41
+ const { localField, foreignField, as } = lookupSpec;
42
+ return documents.map(doc => {
43
+ const localValue = this.getNestedValue(doc, localField);
44
+ const matches = foreignCollection.filter(foreignDoc => {
45
+ const foreignValue = this.getNestedValue(foreignDoc, foreignField);
46
+ return this.valuesMatch(localValue, foreignValue);
47
+ });
48
+ return {
49
+ ...doc,
50
+ [as]: matches,
51
+ };
52
+ });
53
+ }
54
+ /**
55
+ * Execute a $graphLookup stage manually
56
+ */
57
+ static executeGraphLookup(documents, graphLookupSpec, foreignCollection) {
58
+ const { startWith, connectFromField, connectToField, as, maxDepth = 10, depthField, restrictSearchWithMatch, } = graphLookupSpec;
59
+ return documents.map(doc => {
60
+ const startValue = typeof startWith === 'string' && startWith.startsWith('$')
61
+ ? this.getNestedValue(doc, startWith.slice(1))
62
+ : startWith;
63
+ const results = [];
64
+ const visited = new Set();
65
+ const queue = [];
66
+ // Initialize with start value(s)
67
+ const startValues = Array.isArray(startValue) ? startValue : [startValue];
68
+ for (const val of startValues) {
69
+ queue.push({ value: val, depth: 0 });
70
+ }
71
+ while (queue.length > 0) {
72
+ const { value, depth } = queue.shift();
73
+ if (depth > maxDepth)
74
+ continue;
75
+ const valueKey = JSON.stringify(value);
76
+ if (visited.has(valueKey))
77
+ continue;
78
+ visited.add(valueKey);
79
+ // Find matching documents
80
+ for (const foreignDoc of foreignCollection) {
81
+ const foreignValue = this.getNestedValue(foreignDoc, connectToField);
82
+ if (this.valuesMatch(value, foreignValue)) {
83
+ // Check restrictSearchWithMatch
84
+ if (restrictSearchWithMatch) {
85
+ const matchQuery = new plugins.mingo.Query(restrictSearchWithMatch);
86
+ if (!matchQuery.test(foreignDoc))
87
+ continue;
88
+ }
89
+ const resultDoc = depthField
90
+ ? { ...foreignDoc, [depthField]: depth }
91
+ : { ...foreignDoc };
92
+ // Avoid duplicates in results
93
+ const docKey = foreignDoc._id.toHexString();
94
+ if (!results.some(r => r._id?.toHexString?.() === docKey)) {
95
+ results.push(resultDoc);
96
+ // Add connected values to queue
97
+ const nextValue = this.getNestedValue(foreignDoc, connectFromField);
98
+ if (nextValue !== undefined) {
99
+ const nextValues = Array.isArray(nextValue) ? nextValue : [nextValue];
100
+ for (const nv of nextValues) {
101
+ queue.push({ value: nv, depth: depth + 1 });
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ return {
109
+ ...doc,
110
+ [as]: results,
111
+ };
112
+ });
113
+ }
114
+ /**
115
+ * Execute a $facet stage manually
116
+ */
117
+ static executeFacet(documents, facetSpec) {
118
+ const result = {};
119
+ for (const [facetName, pipeline] of Object.entries(facetSpec)) {
120
+ result[facetName] = this.aggregate(documents, pipeline);
121
+ }
122
+ return result;
123
+ }
124
+ /**
125
+ * Execute a $unionWith stage
126
+ */
127
+ static executeUnionWith(documents, otherDocuments, pipeline) {
128
+ let unionDocs = otherDocuments;
129
+ if (pipeline && pipeline.length > 0) {
130
+ unionDocs = this.aggregate(otherDocuments, pipeline);
131
+ }
132
+ return [...documents, ...unionDocs];
133
+ }
134
+ /**
135
+ * Execute a $merge stage (output to another collection)
136
+ * Returns the documents that would be inserted/updated
137
+ */
138
+ static prepareMerge(documents, mergeSpec) {
139
+ const onField = mergeSpec.on || '_id';
140
+ const whenMatched = mergeSpec.whenMatched || 'merge';
141
+ const whenNotMatched = mergeSpec.whenNotMatched || 'insert';
142
+ return {
143
+ toInsert: [],
144
+ toUpdate: [],
145
+ onField,
146
+ whenMatched,
147
+ whenNotMatched,
148
+ };
149
+ }
150
+ // ============================================================================
151
+ // Helper Methods
152
+ // ============================================================================
153
+ static getNestedValue(obj, path) {
154
+ const parts = path.split('.');
155
+ let current = obj;
156
+ for (const part of parts) {
157
+ if (current === null || current === undefined) {
158
+ return undefined;
159
+ }
160
+ current = current[part];
161
+ }
162
+ return current;
163
+ }
164
+ static valuesMatch(a, b) {
165
+ if (a === b)
166
+ return true;
167
+ // Handle ObjectId comparison
168
+ if (a instanceof plugins.bson.ObjectId && b instanceof plugins.bson.ObjectId) {
169
+ return a.equals(b);
170
+ }
171
+ // Handle array contains check
172
+ if (Array.isArray(a)) {
173
+ return a.some(item => this.valuesMatch(item, b));
174
+ }
175
+ if (Array.isArray(b)) {
176
+ return b.some(item => this.valuesMatch(a, item));
177
+ }
178
+ // Handle Date comparison
179
+ if (a instanceof Date && b instanceof Date) {
180
+ return a.getTime() === b.getTime();
181
+ }
182
+ // Handle object comparison
183
+ if (typeof a === 'object' && typeof b === 'object' && a !== null && b !== null) {
184
+ return JSON.stringify(a) === JSON.stringify(b);
185
+ }
186
+ return false;
187
+ }
188
+ }
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdncmVnYXRpb25FbmdpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb25nb2RiL2VuZ2luZS9BZ2dyZWdhdGlvbkVuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBR2pELDBCQUEwQjtBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRW5DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qjs7T0FFRztJQUNILE1BQU0sQ0FBQyxTQUFTLENBQ2QsU0FBNEIsRUFDNUIsUUFBb0IsRUFDcEIsT0FBMkI7UUFFM0IsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCw0Q0FBNEM7UUFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFO1lBQzFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBZ0I7U0FDckMsQ0FBQyxDQUFDO1FBRUgsc0JBQXNCO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFekMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsQ0FDdkIsU0FBNEIsRUFDNUIsUUFBb0IsRUFDcEIsT0FBMkI7UUFFM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFO1lBQzFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBZ0I7U0FDckMsQ0FBQyxDQUFDO1FBRUgsNEJBQTRCO1FBQzVCLE1BQU0sTUFBTSxHQUFH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
@@ -0,0 +1,77 @@
1
+ import type { IStorageAdapter } from '../storage/IStorageAdapter.js';
2
+ import type { Document, IStoredDocument, IIndexInfo, ICreateIndexOptions } from '../types/interfaces.js';
3
+ /**
4
+ * Index data structure for fast lookups
5
+ */
6
+ interface IIndexData {
7
+ name: string;
8
+ key: Record<string, 1 | -1 | string>;
9
+ unique: boolean;
10
+ sparse: boolean;
11
+ expireAfterSeconds?: number;
12
+ entries: Map<string, Set<string>>;
13
+ }
14
+ /**
15
+ * Index engine for managing indexes and query optimization
16
+ */
17
+ export declare class IndexEngine {
18
+ private dbName;
19
+ private collName;
20
+ private storage;
21
+ private indexes;
22
+ private initialized;
23
+ constructor(dbName: string, collName: string, storage: IStorageAdapter);
24
+ /**
25
+ * Initialize indexes from storage
26
+ */
27
+ initialize(): Promise<void>;
28
+ /**
29
+ * Create a new index
30
+ */
31
+ createIndex(key: Record<string, 1 | -1 | 'text' | '2dsphere'>, options?: ICreateIndexOptions): Promise<string>;
32
+ /**
33
+ * Drop an index
34
+ */
35
+ dropIndex(name: string): Promise<void>;
36
+ /**
37
+ * Drop all indexes except _id
38
+ */
39
+ dropAllIndexes(): Promise<void>;
40
+ /**
41
+ * List all indexes
42
+ */
43
+ listIndexes(): Promise<IIndexInfo[]>;
44
+ /**
45
+ * Check if an index exists
46
+ */
47
+ indexExists(name: string): Promise<boolean>;
48
+ /**
49
+ * Update index entries after document insert
50
+ */
51
+ onInsert(doc: IStoredDocument): Promise<void>;
52
+ /**
53
+ * Update index entries after document update
54
+ */
55
+ onUpdate(oldDoc: IStoredDocument, newDoc: IStoredDocument): Promise<void>;
56
+ /**
57
+ * Update index entries after document delete
58
+ */
59
+ onDelete(doc: IStoredDocument): Promise<void>;
60
+ /**
61
+ * Find the best index for a query
62
+ */
63
+ selectIndex(filter: Document): {
64
+ name: string;
65
+ data: IIndexData;
66
+ } | null;
67
+ /**
68
+ * Use index to find candidate document IDs
69
+ */
70
+ findCandidateIds(filter: Document): Promise<Set<string> | null>;
71
+ private generateIndexName;
72
+ private extractKeyValue;
73
+ private buildKeyValue;
74
+ private getFilterFields;
75
+ private getFilterValue;
76
+ }
77
+ export {};