@soulcraft/brainy 0.47.0 → 0.49.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.
- package/README.md +268 -554
- package/dist/brainyData.d.ts +83 -2
- package/dist/brainyData.js +536 -66
- package/dist/brainyData.js.map +1 -1
- package/dist/coreTypes.d.ts +74 -12
- package/dist/distributed/configManager.d.ts +9 -0
- package/dist/distributed/configManager.js +129 -10
- package/dist/distributed/configManager.js.map +1 -1
- package/dist/hnsw/hnswIndex.d.ts +2 -2
- package/dist/hnsw/hnswIndex.js +48 -29
- package/dist/hnsw/hnswIndex.js.map +1 -1
- package/dist/hnsw/optimizedHNSWIndex.d.ts +1 -1
- package/dist/hnsw/optimizedHNSWIndex.js +3 -3
- package/dist/hnsw/optimizedHNSWIndex.js.map +1 -1
- package/dist/storage/adapters/baseStorageAdapter.d.ts +18 -2
- package/dist/storage/adapters/baseStorageAdapter.js +69 -4
- package/dist/storage/adapters/baseStorageAdapter.js.map +1 -1
- package/dist/storage/adapters/fileSystemStorage.d.ts +14 -8
- package/dist/storage/adapters/fileSystemStorage.js +90 -22
- package/dist/storage/adapters/fileSystemStorage.js.map +1 -1
- package/dist/storage/adapters/memoryStorage.d.ts +0 -8
- package/dist/storage/adapters/memoryStorage.js +26 -45
- package/dist/storage/adapters/memoryStorage.js.map +1 -1
- package/dist/storage/adapters/opfsStorage.d.ts +40 -8
- package/dist/storage/adapters/opfsStorage.js +195 -44
- package/dist/storage/adapters/opfsStorage.js.map +1 -1
- package/dist/storage/adapters/optimizedS3Search.js +4 -3
- package/dist/storage/adapters/optimizedS3Search.js.map +1 -1
- package/dist/storage/adapters/s3CompatibleStorage.d.ts +3 -10
- package/dist/storage/adapters/s3CompatibleStorage.js +41 -44
- package/dist/storage/adapters/s3CompatibleStorage.js.map +1 -1
- package/dist/storage/backwardCompatibility.d.ts +84 -0
- package/dist/storage/backwardCompatibility.js +141 -0
- package/dist/storage/backwardCompatibility.js.map +1 -0
- package/dist/storage/baseStorage.d.ts +33 -19
- package/dist/storage/baseStorage.js +116 -195
- package/dist/storage/baseStorage.js.map +1 -1
- package/dist/utils/distance.d.ts +4 -4
- package/dist/utils/distance.js +4 -4
- package/dist/utils/embedding.d.ts +10 -0
- package/dist/utils/embedding.js +81 -9
- package/dist/utils/embedding.js.map +1 -1
- package/dist/utils/metadataFilter.d.ts +79 -0
- package/dist/utils/metadataFilter.js +229 -0
- package/dist/utils/metadataFilter.js.map +1 -0
- package/dist/utils/metadataIndex.d.ts +148 -0
- package/dist/utils/metadataIndex.js +639 -0
- package/dist/utils/metadataIndex.js.map +1 -0
- package/dist/utils/metadataIndexCache.d.ts +60 -0
- package/dist/utils/metadataIndexCache.js +119 -0
- package/dist/utils/metadataIndexCache.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata Index System
|
|
3
|
+
* Maintains inverted indexes for fast metadata filtering
|
|
4
|
+
* Automatically updates indexes when data changes
|
|
5
|
+
*/
|
|
6
|
+
import { MetadataIndexCache } from './metadataIndexCache.js';
|
|
7
|
+
/**
|
|
8
|
+
* Manages metadata indexes for fast filtering
|
|
9
|
+
* Maintains inverted indexes: field+value -> list of IDs
|
|
10
|
+
*/
|
|
11
|
+
export class MetadataIndexManager {
|
|
12
|
+
constructor(storage, config = {}) {
|
|
13
|
+
this.indexCache = new Map();
|
|
14
|
+
this.dirtyEntries = new Set();
|
|
15
|
+
this.isRebuilding = false;
|
|
16
|
+
this.fieldIndexes = new Map();
|
|
17
|
+
this.dirtyFields = new Set();
|
|
18
|
+
this.lastFlushTime = Date.now();
|
|
19
|
+
this.autoFlushThreshold = 50; // Start with 50, will adapt based on usage
|
|
20
|
+
this.storage = storage;
|
|
21
|
+
this.config = {
|
|
22
|
+
maxIndexSize: config.maxIndexSize ?? 10000,
|
|
23
|
+
rebuildThreshold: config.rebuildThreshold ?? 0.1,
|
|
24
|
+
autoOptimize: config.autoOptimize ?? true,
|
|
25
|
+
indexedFields: config.indexedFields ?? [],
|
|
26
|
+
excludeFields: config.excludeFields ?? ['id', 'createdAt', 'updatedAt', 'embedding', 'vector', 'embeddings', 'vectors']
|
|
27
|
+
};
|
|
28
|
+
// Initialize metadata cache with similar config to search cache
|
|
29
|
+
this.metadataCache = new MetadataIndexCache({
|
|
30
|
+
maxAge: 5 * 60 * 1000, // 5 minutes
|
|
31
|
+
maxSize: 500, // 500 entries (field indexes + value chunks)
|
|
32
|
+
enabled: true
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get index key for field and value
|
|
37
|
+
*/
|
|
38
|
+
getIndexKey(field, value) {
|
|
39
|
+
const normalizedValue = this.normalizeValue(value);
|
|
40
|
+
return `${field}:${normalizedValue}`;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Generate field index filename for filter discovery
|
|
44
|
+
*/
|
|
45
|
+
getFieldIndexFilename(field) {
|
|
46
|
+
return `field_${field}`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Generate value chunk filename for scalable storage
|
|
50
|
+
*/
|
|
51
|
+
getValueChunkFilename(field, value, chunkIndex = 0) {
|
|
52
|
+
const normalizedValue = this.normalizeValue(value);
|
|
53
|
+
const safeValue = this.makeSafeFilename(normalizedValue);
|
|
54
|
+
return `${field}_${safeValue}_chunk${chunkIndex}`;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Make a value safe for use in filenames
|
|
58
|
+
*/
|
|
59
|
+
makeSafeFilename(value) {
|
|
60
|
+
// Replace unsafe characters and limit length
|
|
61
|
+
return value
|
|
62
|
+
.replace(/[^a-zA-Z0-9-_]/g, '_')
|
|
63
|
+
.substring(0, 50)
|
|
64
|
+
.toLowerCase();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Normalize value for consistent indexing
|
|
68
|
+
*/
|
|
69
|
+
normalizeValue(value) {
|
|
70
|
+
if (value === null || value === undefined)
|
|
71
|
+
return '__NULL__';
|
|
72
|
+
if (typeof value === 'boolean')
|
|
73
|
+
return value ? '__TRUE__' : '__FALSE__';
|
|
74
|
+
if (typeof value === 'number')
|
|
75
|
+
return value.toString();
|
|
76
|
+
if (Array.isArray(value)) {
|
|
77
|
+
const joined = value.map(v => this.normalizeValue(v)).join(',');
|
|
78
|
+
// Hash very long array values to avoid filesystem limits
|
|
79
|
+
if (joined.length > 100) {
|
|
80
|
+
return this.hashValue(joined);
|
|
81
|
+
}
|
|
82
|
+
return joined;
|
|
83
|
+
}
|
|
84
|
+
const stringValue = String(value).toLowerCase().trim();
|
|
85
|
+
// Hash very long string values to avoid filesystem limits
|
|
86
|
+
if (stringValue.length > 100) {
|
|
87
|
+
return this.hashValue(stringValue);
|
|
88
|
+
}
|
|
89
|
+
return stringValue;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a short hash for long values to avoid filesystem filename limits
|
|
93
|
+
*/
|
|
94
|
+
hashValue(value) {
|
|
95
|
+
// Simple hash function to create shorter keys
|
|
96
|
+
let hash = 0;
|
|
97
|
+
for (let i = 0; i < value.length; i++) {
|
|
98
|
+
const char = value.charCodeAt(i);
|
|
99
|
+
hash = ((hash << 5) - hash) + char;
|
|
100
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
101
|
+
}
|
|
102
|
+
return `__HASH_${Math.abs(hash).toString(36)}`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check if field should be indexed
|
|
106
|
+
*/
|
|
107
|
+
shouldIndexField(field) {
|
|
108
|
+
if (this.config.excludeFields.includes(field))
|
|
109
|
+
return false;
|
|
110
|
+
if (this.config.indexedFields.length > 0) {
|
|
111
|
+
return this.config.indexedFields.includes(field);
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Extract indexable field-value pairs from metadata
|
|
117
|
+
*/
|
|
118
|
+
extractIndexableFields(metadata) {
|
|
119
|
+
const fields = [];
|
|
120
|
+
const extract = (obj, prefix = '') => {
|
|
121
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
122
|
+
const fullKey = prefix ? `${prefix}.${key}` : key;
|
|
123
|
+
if (!this.shouldIndexField(fullKey))
|
|
124
|
+
continue;
|
|
125
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
126
|
+
// Recurse into nested objects
|
|
127
|
+
extract(value, fullKey);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// Index this field
|
|
131
|
+
fields.push({ field: fullKey, value });
|
|
132
|
+
// If it's an array, also index each element
|
|
133
|
+
if (Array.isArray(value)) {
|
|
134
|
+
for (const item of value) {
|
|
135
|
+
fields.push({ field: fullKey, value: item });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
if (metadata && typeof metadata === 'object') {
|
|
142
|
+
extract(metadata);
|
|
143
|
+
}
|
|
144
|
+
return fields;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Add item to metadata indexes
|
|
148
|
+
*/
|
|
149
|
+
async addToIndex(id, metadata, skipFlush = false) {
|
|
150
|
+
const fields = this.extractIndexableFields(metadata);
|
|
151
|
+
for (const { field, value } of fields) {
|
|
152
|
+
const key = this.getIndexKey(field, value);
|
|
153
|
+
// Get or create index entry
|
|
154
|
+
let entry = this.indexCache.get(key);
|
|
155
|
+
if (!entry) {
|
|
156
|
+
const loadedEntry = await this.loadIndexEntry(key);
|
|
157
|
+
entry = loadedEntry ?? {
|
|
158
|
+
field,
|
|
159
|
+
value: this.normalizeValue(value),
|
|
160
|
+
ids: new Set(),
|
|
161
|
+
lastUpdated: Date.now()
|
|
162
|
+
};
|
|
163
|
+
this.indexCache.set(key, entry);
|
|
164
|
+
}
|
|
165
|
+
// Add ID to entry
|
|
166
|
+
entry.ids.add(id);
|
|
167
|
+
entry.lastUpdated = Date.now();
|
|
168
|
+
this.dirtyEntries.add(key);
|
|
169
|
+
// Update field index
|
|
170
|
+
await this.updateFieldIndex(field, value, 1);
|
|
171
|
+
}
|
|
172
|
+
// Adaptive auto-flush based on usage patterns
|
|
173
|
+
if (!skipFlush) {
|
|
174
|
+
const timeSinceLastFlush = Date.now() - this.lastFlushTime;
|
|
175
|
+
const shouldAutoFlush = this.dirtyEntries.size >= this.autoFlushThreshold || // Size threshold
|
|
176
|
+
(this.dirtyEntries.size > 10 && timeSinceLastFlush > 5000); // Time threshold (5 seconds)
|
|
177
|
+
if (shouldAutoFlush) {
|
|
178
|
+
const startTime = Date.now();
|
|
179
|
+
await this.flush();
|
|
180
|
+
const flushTime = Date.now() - startTime;
|
|
181
|
+
// Adapt threshold based on flush performance
|
|
182
|
+
if (flushTime < 50) {
|
|
183
|
+
// Fast flush, can handle more entries
|
|
184
|
+
this.autoFlushThreshold = Math.min(200, this.autoFlushThreshold * 1.2);
|
|
185
|
+
}
|
|
186
|
+
else if (flushTime > 200) {
|
|
187
|
+
// Slow flush, reduce batch size
|
|
188
|
+
this.autoFlushThreshold = Math.max(20, this.autoFlushThreshold * 0.8);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Invalidate cache for these fields
|
|
193
|
+
for (const { field } of fields) {
|
|
194
|
+
this.metadataCache.invalidatePattern(`field_values_${field}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Update field index with value count
|
|
199
|
+
*/
|
|
200
|
+
async updateFieldIndex(field, value, delta) {
|
|
201
|
+
let fieldIndex = this.fieldIndexes.get(field);
|
|
202
|
+
if (!fieldIndex) {
|
|
203
|
+
// Load from storage if not in memory
|
|
204
|
+
fieldIndex = await this.loadFieldIndex(field) ?? {
|
|
205
|
+
values: {},
|
|
206
|
+
lastUpdated: Date.now()
|
|
207
|
+
};
|
|
208
|
+
this.fieldIndexes.set(field, fieldIndex);
|
|
209
|
+
}
|
|
210
|
+
const normalizedValue = this.normalizeValue(value);
|
|
211
|
+
fieldIndex.values[normalizedValue] = (fieldIndex.values[normalizedValue] || 0) + delta;
|
|
212
|
+
// Remove if count drops to 0
|
|
213
|
+
if (fieldIndex.values[normalizedValue] <= 0) {
|
|
214
|
+
delete fieldIndex.values[normalizedValue];
|
|
215
|
+
}
|
|
216
|
+
fieldIndex.lastUpdated = Date.now();
|
|
217
|
+
this.dirtyFields.add(field);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Remove item from metadata indexes
|
|
221
|
+
*/
|
|
222
|
+
async removeFromIndex(id, metadata) {
|
|
223
|
+
if (metadata) {
|
|
224
|
+
// Remove from specific field indexes
|
|
225
|
+
const fields = this.extractIndexableFields(metadata);
|
|
226
|
+
for (const { field, value } of fields) {
|
|
227
|
+
const key = this.getIndexKey(field, value);
|
|
228
|
+
let entry = this.indexCache.get(key);
|
|
229
|
+
if (!entry) {
|
|
230
|
+
const loadedEntry = await this.loadIndexEntry(key);
|
|
231
|
+
entry = loadedEntry ?? undefined;
|
|
232
|
+
}
|
|
233
|
+
if (entry) {
|
|
234
|
+
entry.ids.delete(id);
|
|
235
|
+
entry.lastUpdated = Date.now();
|
|
236
|
+
this.dirtyEntries.add(key);
|
|
237
|
+
// Update field index
|
|
238
|
+
await this.updateFieldIndex(field, value, -1);
|
|
239
|
+
// If no IDs left, mark for cleanup
|
|
240
|
+
if (entry.ids.size === 0) {
|
|
241
|
+
this.indexCache.delete(key);
|
|
242
|
+
await this.deleteIndexEntry(key);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Invalidate cache
|
|
246
|
+
this.metadataCache.invalidatePattern(`field_values_${field}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
// Remove from all indexes (slower, requires scanning)
|
|
251
|
+
for (const [key, entry] of this.indexCache.entries()) {
|
|
252
|
+
if (entry.ids.has(id)) {
|
|
253
|
+
entry.ids.delete(id);
|
|
254
|
+
entry.lastUpdated = Date.now();
|
|
255
|
+
this.dirtyEntries.add(key);
|
|
256
|
+
if (entry.ids.size === 0) {
|
|
257
|
+
this.indexCache.delete(key);
|
|
258
|
+
await this.deleteIndexEntry(key);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get IDs for a specific field-value combination with caching
|
|
266
|
+
*/
|
|
267
|
+
async getIds(field, value) {
|
|
268
|
+
const key = this.getIndexKey(field, value);
|
|
269
|
+
// Check metadata cache first
|
|
270
|
+
const cacheKey = `ids_${key}`;
|
|
271
|
+
const cachedIds = this.metadataCache.get(cacheKey);
|
|
272
|
+
if (cachedIds) {
|
|
273
|
+
return cachedIds;
|
|
274
|
+
}
|
|
275
|
+
// Try in-memory cache
|
|
276
|
+
let entry = this.indexCache.get(key);
|
|
277
|
+
// Load from storage if not cached
|
|
278
|
+
if (!entry) {
|
|
279
|
+
const loadedEntry = await this.loadIndexEntry(key);
|
|
280
|
+
if (loadedEntry) {
|
|
281
|
+
entry = loadedEntry;
|
|
282
|
+
this.indexCache.set(key, entry);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const ids = entry ? Array.from(entry.ids) : [];
|
|
286
|
+
// Cache the result
|
|
287
|
+
this.metadataCache.set(cacheKey, ids);
|
|
288
|
+
return ids;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Get all available values for a field (for filter discovery)
|
|
292
|
+
*/
|
|
293
|
+
async getFilterValues(field) {
|
|
294
|
+
// Check cache first
|
|
295
|
+
const cacheKey = `field_values_${field}`;
|
|
296
|
+
const cachedValues = this.metadataCache.get(cacheKey);
|
|
297
|
+
if (cachedValues) {
|
|
298
|
+
return cachedValues;
|
|
299
|
+
}
|
|
300
|
+
// Check in-memory field indexes first
|
|
301
|
+
let fieldIndex = this.fieldIndexes.get(field);
|
|
302
|
+
// If not in memory, load from storage
|
|
303
|
+
if (!fieldIndex) {
|
|
304
|
+
const loaded = await this.loadFieldIndex(field);
|
|
305
|
+
if (loaded) {
|
|
306
|
+
fieldIndex = loaded;
|
|
307
|
+
this.fieldIndexes.set(field, loaded);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (!fieldIndex) {
|
|
311
|
+
return [];
|
|
312
|
+
}
|
|
313
|
+
const values = Object.keys(fieldIndex.values);
|
|
314
|
+
// Cache the result
|
|
315
|
+
this.metadataCache.set(cacheKey, values);
|
|
316
|
+
return values;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get all indexed fields (for filter discovery)
|
|
320
|
+
*/
|
|
321
|
+
async getFilterFields() {
|
|
322
|
+
// Check cache first
|
|
323
|
+
const cacheKey = 'all_filter_fields';
|
|
324
|
+
const cachedFields = this.metadataCache.get(cacheKey);
|
|
325
|
+
if (cachedFields) {
|
|
326
|
+
return cachedFields;
|
|
327
|
+
}
|
|
328
|
+
// Get fields from in-memory indexes and storage
|
|
329
|
+
const fields = new Set(this.fieldIndexes.keys());
|
|
330
|
+
// Also scan storage for persisted field indexes (in case not loaded)
|
|
331
|
+
// This would require a new storage method to list field indexes
|
|
332
|
+
// For now, just use in-memory fields
|
|
333
|
+
const fieldsArray = Array.from(fields);
|
|
334
|
+
// Cache the result
|
|
335
|
+
this.metadataCache.set(cacheKey, fieldsArray);
|
|
336
|
+
return fieldsArray;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Convert MongoDB-style filter to simple field-value criteria for indexing
|
|
340
|
+
*/
|
|
341
|
+
convertFilterToCriteria(filter) {
|
|
342
|
+
const criteria = [];
|
|
343
|
+
if (!filter || typeof filter !== 'object') {
|
|
344
|
+
return criteria;
|
|
345
|
+
}
|
|
346
|
+
for (const [key, value] of Object.entries(filter)) {
|
|
347
|
+
// Skip logical operators for now - handle them separately
|
|
348
|
+
if (key.startsWith('$'))
|
|
349
|
+
continue;
|
|
350
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
351
|
+
// Handle MongoDB operators
|
|
352
|
+
for (const [op, operand] of Object.entries(value)) {
|
|
353
|
+
switch (op) {
|
|
354
|
+
case '$in':
|
|
355
|
+
if (Array.isArray(operand)) {
|
|
356
|
+
criteria.push({ field: key, values: operand });
|
|
357
|
+
}
|
|
358
|
+
break;
|
|
359
|
+
case '$eq':
|
|
360
|
+
criteria.push({ field: key, values: [operand] });
|
|
361
|
+
break;
|
|
362
|
+
case '$includes':
|
|
363
|
+
// For $includes, the operand is the value we're looking for in an array field
|
|
364
|
+
criteria.push({ field: key, values: [operand] });
|
|
365
|
+
break;
|
|
366
|
+
// For other operators, we can't use index efficiently, skip for now
|
|
367
|
+
default:
|
|
368
|
+
break;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
// Direct value or array
|
|
374
|
+
const values = Array.isArray(value) ? value : [value];
|
|
375
|
+
criteria.push({ field: key, values });
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return criteria;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Get IDs matching MongoDB-style metadata filter using indexes where possible
|
|
382
|
+
*/
|
|
383
|
+
async getIdsForFilter(filter) {
|
|
384
|
+
if (!filter || Object.keys(filter).length === 0) {
|
|
385
|
+
return [];
|
|
386
|
+
}
|
|
387
|
+
// Handle logical operators
|
|
388
|
+
if (filter.$and && Array.isArray(filter.$and)) {
|
|
389
|
+
// For $and, we need intersection of all sub-filters
|
|
390
|
+
const allIds = [];
|
|
391
|
+
for (const subFilter of filter.$and) {
|
|
392
|
+
const subIds = await this.getIdsForFilter(subFilter);
|
|
393
|
+
allIds.push(subIds);
|
|
394
|
+
}
|
|
395
|
+
if (allIds.length === 0)
|
|
396
|
+
return [];
|
|
397
|
+
if (allIds.length === 1)
|
|
398
|
+
return allIds[0];
|
|
399
|
+
// Intersection of all sets
|
|
400
|
+
return allIds.reduce((intersection, currentSet) => intersection.filter(id => currentSet.includes(id)));
|
|
401
|
+
}
|
|
402
|
+
if (filter.$or && Array.isArray(filter.$or)) {
|
|
403
|
+
// For $or, we need union of all sub-filters
|
|
404
|
+
const unionIds = new Set();
|
|
405
|
+
for (const subFilter of filter.$or) {
|
|
406
|
+
const subIds = await this.getIdsForFilter(subFilter);
|
|
407
|
+
subIds.forEach(id => unionIds.add(id));
|
|
408
|
+
}
|
|
409
|
+
return Array.from(unionIds);
|
|
410
|
+
}
|
|
411
|
+
// Handle regular field filters
|
|
412
|
+
const criteria = this.convertFilterToCriteria(filter);
|
|
413
|
+
const idSets = [];
|
|
414
|
+
for (const { field, values } of criteria) {
|
|
415
|
+
const unionIds = new Set();
|
|
416
|
+
for (const value of values) {
|
|
417
|
+
const ids = await this.getIds(field, value);
|
|
418
|
+
ids.forEach(id => unionIds.add(id));
|
|
419
|
+
}
|
|
420
|
+
idSets.push(Array.from(unionIds));
|
|
421
|
+
}
|
|
422
|
+
if (idSets.length === 0)
|
|
423
|
+
return [];
|
|
424
|
+
if (idSets.length === 1)
|
|
425
|
+
return idSets[0];
|
|
426
|
+
// Intersection of all field criteria (implicit $and)
|
|
427
|
+
return idSets.reduce((intersection, currentSet) => intersection.filter(id => currentSet.includes(id)));
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Get IDs matching multiple criteria (intersection) - LEGACY METHOD
|
|
431
|
+
* @deprecated Use getIdsForFilter instead
|
|
432
|
+
*/
|
|
433
|
+
async getIdsForCriteria(criteria) {
|
|
434
|
+
return this.getIdsForFilter(criteria);
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Flush dirty entries to storage
|
|
438
|
+
*/
|
|
439
|
+
async flush() {
|
|
440
|
+
if (this.dirtyEntries.size === 0 && this.dirtyFields.size === 0) {
|
|
441
|
+
return; // Nothing to flush
|
|
442
|
+
}
|
|
443
|
+
const promises = [];
|
|
444
|
+
// Flush value entries
|
|
445
|
+
for (const key of this.dirtyEntries) {
|
|
446
|
+
const entry = this.indexCache.get(key);
|
|
447
|
+
if (entry) {
|
|
448
|
+
promises.push(this.saveIndexEntry(key, entry));
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// Flush field indexes
|
|
452
|
+
for (const field of this.dirtyFields) {
|
|
453
|
+
const fieldIndex = this.fieldIndexes.get(field);
|
|
454
|
+
if (fieldIndex) {
|
|
455
|
+
promises.push(this.saveFieldIndex(field, fieldIndex));
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
await Promise.all(promises);
|
|
459
|
+
this.dirtyEntries.clear();
|
|
460
|
+
this.dirtyFields.clear();
|
|
461
|
+
this.lastFlushTime = Date.now();
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Load field index from storage
|
|
465
|
+
*/
|
|
466
|
+
async loadFieldIndex(field) {
|
|
467
|
+
try {
|
|
468
|
+
const filename = this.getFieldIndexFilename(field);
|
|
469
|
+
const cacheKey = `field_index_${filename}`;
|
|
470
|
+
// Check cache first
|
|
471
|
+
const cached = this.metadataCache.get(cacheKey);
|
|
472
|
+
if (cached) {
|
|
473
|
+
return cached;
|
|
474
|
+
}
|
|
475
|
+
// Load from storage
|
|
476
|
+
const indexId = `__metadata_field_index__${filename}`;
|
|
477
|
+
const data = await this.storage.getMetadata(indexId);
|
|
478
|
+
if (data) {
|
|
479
|
+
const fieldIndex = {
|
|
480
|
+
values: data.values || {},
|
|
481
|
+
lastUpdated: data.lastUpdated || Date.now()
|
|
482
|
+
};
|
|
483
|
+
// Cache it
|
|
484
|
+
this.metadataCache.set(cacheKey, fieldIndex);
|
|
485
|
+
return fieldIndex;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
catch (error) {
|
|
489
|
+
// Field index doesn't exist yet
|
|
490
|
+
}
|
|
491
|
+
return null;
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Save field index to storage
|
|
495
|
+
*/
|
|
496
|
+
async saveFieldIndex(field, fieldIndex) {
|
|
497
|
+
const filename = this.getFieldIndexFilename(field);
|
|
498
|
+
const indexId = `__metadata_field_index__${filename}`;
|
|
499
|
+
await this.storage.saveMetadata(indexId, {
|
|
500
|
+
values: fieldIndex.values,
|
|
501
|
+
lastUpdated: fieldIndex.lastUpdated
|
|
502
|
+
});
|
|
503
|
+
// Invalidate cache
|
|
504
|
+
this.metadataCache.invalidatePattern(`field_index_${filename}`);
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Get index statistics
|
|
508
|
+
*/
|
|
509
|
+
async getStats() {
|
|
510
|
+
const fields = new Set();
|
|
511
|
+
let totalEntries = 0;
|
|
512
|
+
let totalIds = 0;
|
|
513
|
+
for (const entry of this.indexCache.values()) {
|
|
514
|
+
fields.add(entry.field);
|
|
515
|
+
totalEntries++;
|
|
516
|
+
totalIds += entry.ids.size;
|
|
517
|
+
}
|
|
518
|
+
return {
|
|
519
|
+
totalEntries,
|
|
520
|
+
totalIds,
|
|
521
|
+
fieldsIndexed: Array.from(fields),
|
|
522
|
+
lastRebuild: 0, // TODO: track rebuild timestamp
|
|
523
|
+
indexSize: totalEntries * 100 // rough estimate
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Rebuild entire index from scratch using pagination
|
|
528
|
+
*/
|
|
529
|
+
async rebuild() {
|
|
530
|
+
if (this.isRebuilding)
|
|
531
|
+
return;
|
|
532
|
+
this.isRebuilding = true;
|
|
533
|
+
try {
|
|
534
|
+
// Clear existing indexes
|
|
535
|
+
this.indexCache.clear();
|
|
536
|
+
this.dirtyEntries.clear();
|
|
537
|
+
this.fieldIndexes.clear();
|
|
538
|
+
this.dirtyFields.clear();
|
|
539
|
+
// Rebuild noun metadata indexes using pagination
|
|
540
|
+
let nounOffset = 0;
|
|
541
|
+
const nounLimit = 100;
|
|
542
|
+
let hasMoreNouns = true;
|
|
543
|
+
while (hasMoreNouns) {
|
|
544
|
+
const result = await this.storage.getNouns({
|
|
545
|
+
pagination: { offset: nounOffset, limit: nounLimit }
|
|
546
|
+
});
|
|
547
|
+
for (const noun of result.items) {
|
|
548
|
+
const metadata = await this.storage.getMetadata(noun.id);
|
|
549
|
+
if (metadata) {
|
|
550
|
+
// Skip flush during rebuild for performance
|
|
551
|
+
await this.addToIndex(noun.id, metadata, true);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
hasMoreNouns = result.hasMore;
|
|
555
|
+
nounOffset += nounLimit;
|
|
556
|
+
}
|
|
557
|
+
// Rebuild verb metadata indexes using pagination
|
|
558
|
+
let verbOffset = 0;
|
|
559
|
+
const verbLimit = 100;
|
|
560
|
+
let hasMoreVerbs = true;
|
|
561
|
+
while (hasMoreVerbs) {
|
|
562
|
+
const result = await this.storage.getVerbs({
|
|
563
|
+
pagination: { offset: verbOffset, limit: verbLimit }
|
|
564
|
+
});
|
|
565
|
+
for (const verb of result.items) {
|
|
566
|
+
const metadata = await this.storage.getVerbMetadata(verb.id);
|
|
567
|
+
if (metadata) {
|
|
568
|
+
// Skip flush during rebuild for performance
|
|
569
|
+
await this.addToIndex(verb.id, metadata, true);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
hasMoreVerbs = result.hasMore;
|
|
573
|
+
verbOffset += verbLimit;
|
|
574
|
+
}
|
|
575
|
+
// Flush to storage
|
|
576
|
+
await this.flush();
|
|
577
|
+
}
|
|
578
|
+
finally {
|
|
579
|
+
this.isRebuilding = false;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Load index entry from storage using safe filenames
|
|
584
|
+
*/
|
|
585
|
+
async loadIndexEntry(key) {
|
|
586
|
+
try {
|
|
587
|
+
// Extract field and value from key
|
|
588
|
+
const [field, value] = key.split(':', 2);
|
|
589
|
+
const filename = this.getValueChunkFilename(field, value);
|
|
590
|
+
// Load from metadata indexes directory with safe filename
|
|
591
|
+
const indexId = `__metadata_index__${filename}`;
|
|
592
|
+
const data = await this.storage.getMetadata(indexId);
|
|
593
|
+
if (data) {
|
|
594
|
+
return {
|
|
595
|
+
field: data.field,
|
|
596
|
+
value: data.value,
|
|
597
|
+
ids: new Set(data.ids || []),
|
|
598
|
+
lastUpdated: data.lastUpdated || Date.now()
|
|
599
|
+
};
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
catch (error) {
|
|
603
|
+
// Index entry doesn't exist yet
|
|
604
|
+
}
|
|
605
|
+
return null;
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* Save index entry to storage using safe filenames
|
|
609
|
+
*/
|
|
610
|
+
async saveIndexEntry(key, entry) {
|
|
611
|
+
const data = {
|
|
612
|
+
field: entry.field,
|
|
613
|
+
value: entry.value,
|
|
614
|
+
ids: Array.from(entry.ids),
|
|
615
|
+
lastUpdated: entry.lastUpdated
|
|
616
|
+
};
|
|
617
|
+
// Extract field and value from key for safe filename generation
|
|
618
|
+
const [field, value] = key.split(':', 2);
|
|
619
|
+
const filename = this.getValueChunkFilename(field, value);
|
|
620
|
+
// Store metadata indexes with safe filename
|
|
621
|
+
const indexId = `__metadata_index__${filename}`;
|
|
622
|
+
await this.storage.saveMetadata(indexId, data);
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Delete index entry from storage using safe filenames
|
|
626
|
+
*/
|
|
627
|
+
async deleteIndexEntry(key) {
|
|
628
|
+
try {
|
|
629
|
+
const [field, value] = key.split(':', 2);
|
|
630
|
+
const filename = this.getValueChunkFilename(field, value);
|
|
631
|
+
const indexId = `__metadata_index__${filename}`;
|
|
632
|
+
await this.storage.saveMetadata(indexId, null);
|
|
633
|
+
}
|
|
634
|
+
catch (error) {
|
|
635
|
+
// Entry might not exist
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
//# sourceMappingURL=metadataIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadataIndex.js","sourceRoot":"","sources":["../../src/utils/metadataIndex.ts"],"names":[],"mappings":"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"}
|