@danielsimonjr/memoryjs 1.0.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/LICENSE +22 -0
- package/README.md +266 -0
- package/dist/core/EntityManager.d.ts +268 -0
- package/dist/core/EntityManager.d.ts.map +1 -0
- package/dist/core/EntityManager.js +512 -0
- package/dist/core/EntityManager.js.map +1 -0
- package/dist/core/GraphEventEmitter.d.ts +202 -0
- package/dist/core/GraphEventEmitter.d.ts.map +1 -0
- package/dist/core/GraphEventEmitter.js +347 -0
- package/dist/core/GraphEventEmitter.js.map +1 -0
- package/dist/core/GraphStorage.d.ts +395 -0
- package/dist/core/GraphStorage.d.ts.map +1 -0
- package/dist/core/GraphStorage.js +786 -0
- package/dist/core/GraphStorage.js.map +1 -0
- package/dist/core/GraphTraversal.d.ts +141 -0
- package/dist/core/GraphTraversal.d.ts.map +1 -0
- package/dist/core/GraphTraversal.js +574 -0
- package/dist/core/GraphTraversal.js.map +1 -0
- package/dist/core/HierarchyManager.d.ts +111 -0
- package/dist/core/HierarchyManager.d.ts.map +1 -0
- package/dist/core/HierarchyManager.js +225 -0
- package/dist/core/HierarchyManager.js.map +1 -0
- package/dist/core/ManagerContext.d.ts +76 -0
- package/dist/core/ManagerContext.d.ts.map +1 -0
- package/dist/core/ManagerContext.js +129 -0
- package/dist/core/ManagerContext.js.map +1 -0
- package/dist/core/ObservationManager.d.ts +85 -0
- package/dist/core/ObservationManager.d.ts.map +1 -0
- package/dist/core/ObservationManager.js +124 -0
- package/dist/core/ObservationManager.js.map +1 -0
- package/dist/core/RelationManager.d.ts +131 -0
- package/dist/core/RelationManager.d.ts.map +1 -0
- package/dist/core/RelationManager.js +212 -0
- package/dist/core/RelationManager.js.map +1 -0
- package/dist/core/SQLiteStorage.d.ts +354 -0
- package/dist/core/SQLiteStorage.d.ts.map +1 -0
- package/dist/core/SQLiteStorage.js +919 -0
- package/dist/core/SQLiteStorage.js.map +1 -0
- package/dist/core/StorageFactory.d.ts +45 -0
- package/dist/core/StorageFactory.d.ts.map +1 -0
- package/dist/core/StorageFactory.js +65 -0
- package/dist/core/StorageFactory.js.map +1 -0
- package/dist/core/TransactionManager.d.ts +464 -0
- package/dist/core/TransactionManager.d.ts.map +1 -0
- package/dist/core/TransactionManager.js +869 -0
- package/dist/core/TransactionManager.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +20 -0
- package/dist/core/index.js.map +1 -0
- package/dist/features/AnalyticsManager.d.ts +44 -0
- package/dist/features/AnalyticsManager.d.ts.map +1 -0
- package/dist/features/AnalyticsManager.js +224 -0
- package/dist/features/AnalyticsManager.js.map +1 -0
- package/dist/features/ArchiveManager.d.ts +133 -0
- package/dist/features/ArchiveManager.d.ts.map +1 -0
- package/dist/features/ArchiveManager.js +282 -0
- package/dist/features/ArchiveManager.js.map +1 -0
- package/dist/features/CompressionManager.d.ts +119 -0
- package/dist/features/CompressionManager.d.ts.map +1 -0
- package/dist/features/CompressionManager.js +470 -0
- package/dist/features/CompressionManager.js.map +1 -0
- package/dist/features/IOManager.d.ts +225 -0
- package/dist/features/IOManager.d.ts.map +1 -0
- package/dist/features/IOManager.js +1093 -0
- package/dist/features/IOManager.js.map +1 -0
- package/dist/features/KeywordExtractor.d.ts +61 -0
- package/dist/features/KeywordExtractor.d.ts.map +1 -0
- package/dist/features/KeywordExtractor.js +127 -0
- package/dist/features/KeywordExtractor.js.map +1 -0
- package/dist/features/ObservationNormalizer.d.ts +90 -0
- package/dist/features/ObservationNormalizer.d.ts.map +1 -0
- package/dist/features/ObservationNormalizer.js +194 -0
- package/dist/features/ObservationNormalizer.js.map +1 -0
- package/dist/features/StreamingExporter.d.ts +128 -0
- package/dist/features/StreamingExporter.d.ts.map +1 -0
- package/dist/features/StreamingExporter.js +212 -0
- package/dist/features/StreamingExporter.js.map +1 -0
- package/dist/features/TagManager.d.ts +147 -0
- package/dist/features/TagManager.d.ts.map +1 -0
- package/dist/features/TagManager.js +211 -0
- package/dist/features/TagManager.js.map +1 -0
- package/dist/features/index.d.ts +14 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +15 -0
- package/dist/features/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/search/BM25Search.d.ts +148 -0
- package/dist/search/BM25Search.d.ts.map +1 -0
- package/dist/search/BM25Search.js +340 -0
- package/dist/search/BM25Search.js.map +1 -0
- package/dist/search/BasicSearch.d.ts +51 -0
- package/dist/search/BasicSearch.d.ts.map +1 -0
- package/dist/search/BasicSearch.js +138 -0
- package/dist/search/BasicSearch.js.map +1 -0
- package/dist/search/BooleanSearch.d.ts +98 -0
- package/dist/search/BooleanSearch.d.ts.map +1 -0
- package/dist/search/BooleanSearch.js +431 -0
- package/dist/search/BooleanSearch.js.map +1 -0
- package/dist/search/EarlyTerminationManager.d.ts +140 -0
- package/dist/search/EarlyTerminationManager.d.ts.map +1 -0
- package/dist/search/EarlyTerminationManager.js +280 -0
- package/dist/search/EarlyTerminationManager.js.map +1 -0
- package/dist/search/EmbeddingCache.d.ts +175 -0
- package/dist/search/EmbeddingCache.d.ts.map +1 -0
- package/dist/search/EmbeddingCache.js +247 -0
- package/dist/search/EmbeddingCache.js.map +1 -0
- package/dist/search/EmbeddingService.d.ts +277 -0
- package/dist/search/EmbeddingService.d.ts.map +1 -0
- package/dist/search/EmbeddingService.js +531 -0
- package/dist/search/EmbeddingService.js.map +1 -0
- package/dist/search/FuzzySearch.d.ts +118 -0
- package/dist/search/FuzzySearch.d.ts.map +1 -0
- package/dist/search/FuzzySearch.js +313 -0
- package/dist/search/FuzzySearch.js.map +1 -0
- package/dist/search/HybridScorer.d.ts +181 -0
- package/dist/search/HybridScorer.d.ts.map +1 -0
- package/dist/search/HybridScorer.js +258 -0
- package/dist/search/HybridScorer.js.map +1 -0
- package/dist/search/HybridSearchManager.d.ts +80 -0
- package/dist/search/HybridSearchManager.d.ts.map +1 -0
- package/dist/search/HybridSearchManager.js +188 -0
- package/dist/search/HybridSearchManager.js.map +1 -0
- package/dist/search/IncrementalIndexer.d.ts +201 -0
- package/dist/search/IncrementalIndexer.d.ts.map +1 -0
- package/dist/search/IncrementalIndexer.js +343 -0
- package/dist/search/IncrementalIndexer.js.map +1 -0
- package/dist/search/OptimizedInvertedIndex.d.ts +163 -0
- package/dist/search/OptimizedInvertedIndex.d.ts.map +1 -0
- package/dist/search/OptimizedInvertedIndex.js +359 -0
- package/dist/search/OptimizedInvertedIndex.js.map +1 -0
- package/dist/search/ParallelSearchExecutor.d.ts +172 -0
- package/dist/search/ParallelSearchExecutor.d.ts.map +1 -0
- package/dist/search/ParallelSearchExecutor.js +310 -0
- package/dist/search/ParallelSearchExecutor.js.map +1 -0
- package/dist/search/QuantizedVectorStore.d.ts +171 -0
- package/dist/search/QuantizedVectorStore.d.ts.map +1 -0
- package/dist/search/QuantizedVectorStore.js +308 -0
- package/dist/search/QuantizedVectorStore.js.map +1 -0
- package/dist/search/QueryAnalyzer.d.ts +76 -0
- package/dist/search/QueryAnalyzer.d.ts.map +1 -0
- package/dist/search/QueryAnalyzer.js +228 -0
- package/dist/search/QueryAnalyzer.js.map +1 -0
- package/dist/search/QueryCostEstimator.d.ts +244 -0
- package/dist/search/QueryCostEstimator.d.ts.map +1 -0
- package/dist/search/QueryCostEstimator.js +653 -0
- package/dist/search/QueryCostEstimator.js.map +1 -0
- package/dist/search/QueryPlanCache.d.ts +220 -0
- package/dist/search/QueryPlanCache.d.ts.map +1 -0
- package/dist/search/QueryPlanCache.js +380 -0
- package/dist/search/QueryPlanCache.js.map +1 -0
- package/dist/search/QueryPlanner.d.ts +58 -0
- package/dist/search/QueryPlanner.d.ts.map +1 -0
- package/dist/search/QueryPlanner.js +138 -0
- package/dist/search/QueryPlanner.js.map +1 -0
- package/dist/search/RankedSearch.d.ts +71 -0
- package/dist/search/RankedSearch.d.ts.map +1 -0
- package/dist/search/RankedSearch.js +239 -0
- package/dist/search/RankedSearch.js.map +1 -0
- package/dist/search/ReflectionManager.d.ts +120 -0
- package/dist/search/ReflectionManager.d.ts.map +1 -0
- package/dist/search/ReflectionManager.js +232 -0
- package/dist/search/ReflectionManager.js.map +1 -0
- package/dist/search/SavedSearchManager.d.ts +79 -0
- package/dist/search/SavedSearchManager.d.ts.map +1 -0
- package/dist/search/SavedSearchManager.js +147 -0
- package/dist/search/SavedSearchManager.js.map +1 -0
- package/dist/search/SearchFilterChain.d.ts +120 -0
- package/dist/search/SearchFilterChain.d.ts.map +1 -0
- package/dist/search/SearchFilterChain.js +186 -0
- package/dist/search/SearchFilterChain.js.map +1 -0
- package/dist/search/SearchManager.d.ts +326 -0
- package/dist/search/SearchManager.d.ts.map +1 -0
- package/dist/search/SearchManager.js +454 -0
- package/dist/search/SearchManager.js.map +1 -0
- package/dist/search/SearchSuggestions.d.ts +27 -0
- package/dist/search/SearchSuggestions.d.ts.map +1 -0
- package/dist/search/SearchSuggestions.js +58 -0
- package/dist/search/SearchSuggestions.js.map +1 -0
- package/dist/search/SemanticSearch.d.ts +149 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +324 -0
- package/dist/search/SemanticSearch.js.map +1 -0
- package/dist/search/SymbolicSearch.d.ts +61 -0
- package/dist/search/SymbolicSearch.d.ts.map +1 -0
- package/dist/search/SymbolicSearch.js +164 -0
- package/dist/search/SymbolicSearch.js.map +1 -0
- package/dist/search/TFIDFEventSync.d.ts +85 -0
- package/dist/search/TFIDFEventSync.d.ts.map +1 -0
- package/dist/search/TFIDFEventSync.js +134 -0
- package/dist/search/TFIDFEventSync.js.map +1 -0
- package/dist/search/TFIDFIndexManager.d.ts +151 -0
- package/dist/search/TFIDFIndexManager.d.ts.map +1 -0
- package/dist/search/TFIDFIndexManager.js +433 -0
- package/dist/search/TFIDFIndexManager.js.map +1 -0
- package/dist/search/VectorStore.d.ts +235 -0
- package/dist/search/VectorStore.d.ts.map +1 -0
- package/dist/search/VectorStore.js +312 -0
- package/dist/search/VectorStore.js.map +1 -0
- package/dist/search/index.d.ts +35 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +53 -0
- package/dist/search/index.js.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/types.d.ts +1811 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +10 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils/BatchProcessor.d.ts +271 -0
- package/dist/utils/BatchProcessor.d.ts.map +1 -0
- package/dist/utils/BatchProcessor.js +377 -0
- package/dist/utils/BatchProcessor.js.map +1 -0
- package/dist/utils/MemoryMonitor.d.ts +176 -0
- package/dist/utils/MemoryMonitor.d.ts.map +1 -0
- package/dist/utils/MemoryMonitor.js +306 -0
- package/dist/utils/MemoryMonitor.js.map +1 -0
- package/dist/utils/WorkerPoolManager.d.ts +233 -0
- package/dist/utils/WorkerPoolManager.d.ts.map +1 -0
- package/dist/utils/WorkerPoolManager.js +421 -0
- package/dist/utils/WorkerPoolManager.js.map +1 -0
- package/dist/utils/compressedCache.d.ts +221 -0
- package/dist/utils/compressedCache.d.ts.map +1 -0
- package/dist/utils/compressedCache.js +349 -0
- package/dist/utils/compressedCache.js.map +1 -0
- package/dist/utils/compressionUtil.d.ts +214 -0
- package/dist/utils/compressionUtil.d.ts.map +1 -0
- package/dist/utils/compressionUtil.js +248 -0
- package/dist/utils/compressionUtil.js.map +1 -0
- package/dist/utils/constants.d.ts +245 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +253 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/entityUtils.d.ts +379 -0
- package/dist/utils/entityUtils.d.ts.map +1 -0
- package/dist/utils/entityUtils.js +649 -0
- package/dist/utils/entityUtils.js.map +1 -0
- package/dist/utils/errors.d.ts +95 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +146 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatters.d.ts +145 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +133 -0
- package/dist/utils/formatters.js.map +1 -0
- package/dist/utils/index.d.ts +26 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +88 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/indexes.d.ts +270 -0
- package/dist/utils/indexes.d.ts.map +1 -0
- package/dist/utils/indexes.js +527 -0
- package/dist/utils/indexes.js.map +1 -0
- package/dist/utils/logger.d.ts +31 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +41 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/operationUtils.d.ts +124 -0
- package/dist/utils/operationUtils.d.ts.map +1 -0
- package/dist/utils/operationUtils.js +176 -0
- package/dist/utils/operationUtils.js.map +1 -0
- package/dist/utils/parallelUtils.d.ts +76 -0
- package/dist/utils/parallelUtils.d.ts.map +1 -0
- package/dist/utils/parallelUtils.js +192 -0
- package/dist/utils/parallelUtils.js.map +1 -0
- package/dist/utils/schemas.d.ts +556 -0
- package/dist/utils/schemas.d.ts.map +1 -0
- package/dist/utils/schemas.js +485 -0
- package/dist/utils/schemas.js.map +1 -0
- package/dist/utils/searchAlgorithms.d.ts +99 -0
- package/dist/utils/searchAlgorithms.d.ts.map +1 -0
- package/dist/utils/searchAlgorithms.js +168 -0
- package/dist/utils/searchAlgorithms.js.map +1 -0
- package/dist/utils/searchCache.d.ts +108 -0
- package/dist/utils/searchCache.d.ts.map +1 -0
- package/dist/utils/searchCache.js +210 -0
- package/dist/utils/searchCache.js.map +1 -0
- package/dist/utils/taskScheduler.d.ts +294 -0
- package/dist/utils/taskScheduler.d.ts.map +1 -0
- package/dist/utils/taskScheduler.js +487 -0
- package/dist/utils/taskScheduler.js.map +1 -0
- package/dist/workers/index.d.ts +12 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +10 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/levenshteinWorker.d.ts +60 -0
- package/dist/workers/levenshteinWorker.d.ts.map +1 -0
- package/dist/workers/levenshteinWorker.js +99 -0
- package/dist/workers/levenshteinWorker.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Plan Cache
|
|
3
|
+
*
|
|
4
|
+
* Phase 12 Sprint 4: Caches query analysis and planning results
|
|
5
|
+
* with LRU eviction for improved performance.
|
|
6
|
+
*
|
|
7
|
+
* @module search/QueryPlanCache
|
|
8
|
+
*/
|
|
9
|
+
import type { QueryAnalysis, QueryPlan } from '../types/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Cached query entry with metadata.
|
|
12
|
+
*/
|
|
13
|
+
export interface CachedQueryEntry {
|
|
14
|
+
/** Normalized query string */
|
|
15
|
+
normalizedQuery: string;
|
|
16
|
+
/** Original query string */
|
|
17
|
+
originalQuery: string;
|
|
18
|
+
/** Cached analysis result */
|
|
19
|
+
analysis: QueryAnalysis;
|
|
20
|
+
/** Cached plan result (if available) */
|
|
21
|
+
plan?: QueryPlan;
|
|
22
|
+
/** Cache entry creation time */
|
|
23
|
+
createdAt: number;
|
|
24
|
+
/** Last access time for LRU */
|
|
25
|
+
lastAccessed: number;
|
|
26
|
+
/** Number of times this entry was accessed */
|
|
27
|
+
hitCount: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Cache statistics for monitoring.
|
|
31
|
+
*/
|
|
32
|
+
export interface QueryPlanCacheStats {
|
|
33
|
+
/** Total cache entries */
|
|
34
|
+
size: number;
|
|
35
|
+
/** Maximum cache size */
|
|
36
|
+
maxSize: number;
|
|
37
|
+
/** Total cache hits */
|
|
38
|
+
hits: number;
|
|
39
|
+
/** Total cache misses */
|
|
40
|
+
misses: number;
|
|
41
|
+
/** Hit rate (0-1) */
|
|
42
|
+
hitRate: number;
|
|
43
|
+
/** Total evictions */
|
|
44
|
+
evictions: number;
|
|
45
|
+
/** Average entry age in milliseconds */
|
|
46
|
+
averageEntryAgeMs: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Options for the query plan cache.
|
|
50
|
+
*/
|
|
51
|
+
export interface QueryPlanCacheOptions {
|
|
52
|
+
/** Maximum number of entries (default: 1000) */
|
|
53
|
+
maxSize?: number;
|
|
54
|
+
/** Entry TTL in milliseconds (default: 5 minutes) */
|
|
55
|
+
ttlMs?: number;
|
|
56
|
+
/** Whether to normalize queries for better hit rate (default: true) */
|
|
57
|
+
normalizeQueries?: boolean;
|
|
58
|
+
/** Whether to enable cache statistics (default: true) */
|
|
59
|
+
enableStats?: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Query Plan Cache with LRU eviction.
|
|
63
|
+
*
|
|
64
|
+
* Caches query analysis and planning results to avoid redundant computation.
|
|
65
|
+
* Uses LRU (Least Recently Used) eviction when cache is full.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const cache = new QueryPlanCache({ maxSize: 500 });
|
|
70
|
+
*
|
|
71
|
+
* // Cache an analysis
|
|
72
|
+
* cache.setAnalysis('Find Alice', analysis);
|
|
73
|
+
*
|
|
74
|
+
* // Retrieve cached analysis
|
|
75
|
+
* const cached = cache.getAnalysis('Find Alice');
|
|
76
|
+
* if (cached) {
|
|
77
|
+
* console.log('Cache hit!', cached);
|
|
78
|
+
* }
|
|
79
|
+
*
|
|
80
|
+
* // Get statistics
|
|
81
|
+
* const stats = cache.getStats();
|
|
82
|
+
* console.log(`Hit rate: ${(stats.hitRate * 100).toFixed(1)}%`);
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export declare class QueryPlanCache {
|
|
86
|
+
private cache;
|
|
87
|
+
private options;
|
|
88
|
+
private hits;
|
|
89
|
+
private misses;
|
|
90
|
+
private evictions;
|
|
91
|
+
constructor(options?: QueryPlanCacheOptions);
|
|
92
|
+
/**
|
|
93
|
+
* Get cached analysis for a query.
|
|
94
|
+
*
|
|
95
|
+
* @param query - The search query
|
|
96
|
+
* @returns Cached analysis or undefined if not found
|
|
97
|
+
*/
|
|
98
|
+
getAnalysis(query: string): QueryAnalysis | undefined;
|
|
99
|
+
/**
|
|
100
|
+
* Get cached plan for a query.
|
|
101
|
+
*
|
|
102
|
+
* @param query - The search query
|
|
103
|
+
* @returns Cached plan or undefined if not found
|
|
104
|
+
*/
|
|
105
|
+
getPlan(query: string): QueryPlan | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* Get full cached entry for a query.
|
|
108
|
+
*
|
|
109
|
+
* @param query - The search query
|
|
110
|
+
* @returns Cached entry or undefined if not found
|
|
111
|
+
*/
|
|
112
|
+
getEntry(query: string): CachedQueryEntry | undefined;
|
|
113
|
+
/**
|
|
114
|
+
* Cache analysis results for a query.
|
|
115
|
+
*
|
|
116
|
+
* @param query - The search query
|
|
117
|
+
* @param analysis - The analysis result to cache
|
|
118
|
+
*/
|
|
119
|
+
setAnalysis(query: string, analysis: QueryAnalysis): void;
|
|
120
|
+
/**
|
|
121
|
+
* Cache plan results for a query.
|
|
122
|
+
*
|
|
123
|
+
* @param query - The search query
|
|
124
|
+
* @param analysis - The analysis result to cache
|
|
125
|
+
* @param plan - The plan result to cache
|
|
126
|
+
*/
|
|
127
|
+
setPlan(query: string, analysis: QueryAnalysis, plan: QueryPlan): void;
|
|
128
|
+
/**
|
|
129
|
+
* Check if a query is cached.
|
|
130
|
+
*
|
|
131
|
+
* @param query - The search query
|
|
132
|
+
* @returns True if cached (and not expired)
|
|
133
|
+
*/
|
|
134
|
+
has(query: string): boolean;
|
|
135
|
+
/**
|
|
136
|
+
* Invalidate a specific query from cache.
|
|
137
|
+
*
|
|
138
|
+
* @param query - The search query to invalidate
|
|
139
|
+
* @returns True if entry was found and removed
|
|
140
|
+
*/
|
|
141
|
+
invalidate(query: string): boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Invalidate all entries matching a pattern.
|
|
144
|
+
*
|
|
145
|
+
* @param pattern - Regex pattern to match against queries
|
|
146
|
+
* @returns Number of entries invalidated
|
|
147
|
+
*/
|
|
148
|
+
invalidatePattern(pattern: RegExp): number;
|
|
149
|
+
/**
|
|
150
|
+
* Clear all cache entries.
|
|
151
|
+
*/
|
|
152
|
+
clear(): void;
|
|
153
|
+
/**
|
|
154
|
+
* Get cache statistics.
|
|
155
|
+
*
|
|
156
|
+
* @returns Cache statistics
|
|
157
|
+
*/
|
|
158
|
+
getStats(): QueryPlanCacheStats;
|
|
159
|
+
/**
|
|
160
|
+
* Get the current cache size.
|
|
161
|
+
*/
|
|
162
|
+
get size(): number;
|
|
163
|
+
/**
|
|
164
|
+
* Normalize a query for cache lookup.
|
|
165
|
+
*
|
|
166
|
+
* Normalization helps improve cache hit rate by treating
|
|
167
|
+
* similar queries as equivalent.
|
|
168
|
+
*
|
|
169
|
+
* @param query - The query to normalize
|
|
170
|
+
* @returns Normalized query string
|
|
171
|
+
*/
|
|
172
|
+
normalizeQuery(query: string): string;
|
|
173
|
+
/**
|
|
174
|
+
* Check if an entry has expired.
|
|
175
|
+
* @private
|
|
176
|
+
*/
|
|
177
|
+
private isExpired;
|
|
178
|
+
/**
|
|
179
|
+
* Evict entries if cache is at capacity.
|
|
180
|
+
* Uses LRU (Least Recently Used) eviction.
|
|
181
|
+
* @private
|
|
182
|
+
*/
|
|
183
|
+
private evictIfNeeded;
|
|
184
|
+
/**
|
|
185
|
+
* Clean up expired entries.
|
|
186
|
+
*
|
|
187
|
+
* Call this periodically to remove stale entries.
|
|
188
|
+
*
|
|
189
|
+
* @returns Number of entries removed
|
|
190
|
+
*/
|
|
191
|
+
cleanup(): number;
|
|
192
|
+
/**
|
|
193
|
+
* Get all cache keys (for debugging).
|
|
194
|
+
*/
|
|
195
|
+
keys(): string[];
|
|
196
|
+
/**
|
|
197
|
+
* Preload cache with common queries.
|
|
198
|
+
*
|
|
199
|
+
* @param queries - Array of query-analysis pairs to preload
|
|
200
|
+
*/
|
|
201
|
+
preload(queries: Array<{
|
|
202
|
+
query: string;
|
|
203
|
+
analysis: QueryAnalysis;
|
|
204
|
+
plan?: QueryPlan;
|
|
205
|
+
}>): void;
|
|
206
|
+
/**
|
|
207
|
+
* Export cache entries for persistence.
|
|
208
|
+
*
|
|
209
|
+
* @returns Array of cache entries
|
|
210
|
+
*/
|
|
211
|
+
export(): CachedQueryEntry[];
|
|
212
|
+
/**
|
|
213
|
+
* Import cache entries from persistence.
|
|
214
|
+
*
|
|
215
|
+
* @param entries - Array of cache entries to import
|
|
216
|
+
* @param preserveTimestamps - Whether to preserve original timestamps
|
|
217
|
+
*/
|
|
218
|
+
import(entries: CachedQueryEntry[], preserveTimestamps?: boolean): void;
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=QueryPlanCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryPlanCache.d.ts","sourceRoot":"","sources":["../../src/search/QueryPlanCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Plan Cache
|
|
3
|
+
*
|
|
4
|
+
* Phase 12 Sprint 4: Caches query analysis and planning results
|
|
5
|
+
* with LRU eviction for improved performance.
|
|
6
|
+
*
|
|
7
|
+
* @module search/QueryPlanCache
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default cache options.
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_OPTIONS = {
|
|
13
|
+
maxSize: 1000,
|
|
14
|
+
ttlMs: 5 * 60 * 1000, // 5 minutes
|
|
15
|
+
normalizeQueries: true,
|
|
16
|
+
enableStats: true,
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Query Plan Cache with LRU eviction.
|
|
20
|
+
*
|
|
21
|
+
* Caches query analysis and planning results to avoid redundant computation.
|
|
22
|
+
* Uses LRU (Least Recently Used) eviction when cache is full.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const cache = new QueryPlanCache({ maxSize: 500 });
|
|
27
|
+
*
|
|
28
|
+
* // Cache an analysis
|
|
29
|
+
* cache.setAnalysis('Find Alice', analysis);
|
|
30
|
+
*
|
|
31
|
+
* // Retrieve cached analysis
|
|
32
|
+
* const cached = cache.getAnalysis('Find Alice');
|
|
33
|
+
* if (cached) {
|
|
34
|
+
* console.log('Cache hit!', cached);
|
|
35
|
+
* }
|
|
36
|
+
*
|
|
37
|
+
* // Get statistics
|
|
38
|
+
* const stats = cache.getStats();
|
|
39
|
+
* console.log(`Hit rate: ${(stats.hitRate * 100).toFixed(1)}%`);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export class QueryPlanCache {
|
|
43
|
+
cache;
|
|
44
|
+
options;
|
|
45
|
+
// Statistics
|
|
46
|
+
hits = 0;
|
|
47
|
+
misses = 0;
|
|
48
|
+
evictions = 0;
|
|
49
|
+
constructor(options) {
|
|
50
|
+
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
51
|
+
this.cache = new Map();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get cached analysis for a query.
|
|
55
|
+
*
|
|
56
|
+
* @param query - The search query
|
|
57
|
+
* @returns Cached analysis or undefined if not found
|
|
58
|
+
*/
|
|
59
|
+
getAnalysis(query) {
|
|
60
|
+
const entry = this.getEntry(query);
|
|
61
|
+
return entry?.analysis;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get cached plan for a query.
|
|
65
|
+
*
|
|
66
|
+
* @param query - The search query
|
|
67
|
+
* @returns Cached plan or undefined if not found
|
|
68
|
+
*/
|
|
69
|
+
getPlan(query) {
|
|
70
|
+
const entry = this.getEntry(query);
|
|
71
|
+
return entry?.plan;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get full cached entry for a query.
|
|
75
|
+
*
|
|
76
|
+
* @param query - The search query
|
|
77
|
+
* @returns Cached entry or undefined if not found
|
|
78
|
+
*/
|
|
79
|
+
getEntry(query) {
|
|
80
|
+
const key = this.normalizeQuery(query);
|
|
81
|
+
const entry = this.cache.get(key);
|
|
82
|
+
if (!entry) {
|
|
83
|
+
if (this.options.enableStats)
|
|
84
|
+
this.misses++;
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
// Check TTL
|
|
88
|
+
if (this.isExpired(entry)) {
|
|
89
|
+
this.cache.delete(key);
|
|
90
|
+
if (this.options.enableStats)
|
|
91
|
+
this.misses++;
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
// Update access time and count
|
|
95
|
+
entry.lastAccessed = Date.now();
|
|
96
|
+
entry.hitCount++;
|
|
97
|
+
if (this.options.enableStats)
|
|
98
|
+
this.hits++;
|
|
99
|
+
return entry;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Cache analysis results for a query.
|
|
103
|
+
*
|
|
104
|
+
* @param query - The search query
|
|
105
|
+
* @param analysis - The analysis result to cache
|
|
106
|
+
*/
|
|
107
|
+
setAnalysis(query, analysis) {
|
|
108
|
+
const key = this.normalizeQuery(query);
|
|
109
|
+
const now = Date.now();
|
|
110
|
+
const existing = this.cache.get(key);
|
|
111
|
+
if (existing) {
|
|
112
|
+
// Update existing entry
|
|
113
|
+
existing.analysis = analysis;
|
|
114
|
+
existing.lastAccessed = now;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
// Evict if necessary
|
|
118
|
+
this.evictIfNeeded();
|
|
119
|
+
// Create new entry
|
|
120
|
+
this.cache.set(key, {
|
|
121
|
+
normalizedQuery: key,
|
|
122
|
+
originalQuery: query,
|
|
123
|
+
analysis,
|
|
124
|
+
createdAt: now,
|
|
125
|
+
lastAccessed: now,
|
|
126
|
+
hitCount: 0,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Cache plan results for a query.
|
|
132
|
+
*
|
|
133
|
+
* @param query - The search query
|
|
134
|
+
* @param analysis - The analysis result to cache
|
|
135
|
+
* @param plan - The plan result to cache
|
|
136
|
+
*/
|
|
137
|
+
setPlan(query, analysis, plan) {
|
|
138
|
+
const key = this.normalizeQuery(query);
|
|
139
|
+
const now = Date.now();
|
|
140
|
+
const existing = this.cache.get(key);
|
|
141
|
+
if (existing) {
|
|
142
|
+
// Update existing entry
|
|
143
|
+
existing.analysis = analysis;
|
|
144
|
+
existing.plan = plan;
|
|
145
|
+
existing.lastAccessed = now;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// Evict if necessary
|
|
149
|
+
this.evictIfNeeded();
|
|
150
|
+
// Create new entry
|
|
151
|
+
this.cache.set(key, {
|
|
152
|
+
normalizedQuery: key,
|
|
153
|
+
originalQuery: query,
|
|
154
|
+
analysis,
|
|
155
|
+
plan,
|
|
156
|
+
createdAt: now,
|
|
157
|
+
lastAccessed: now,
|
|
158
|
+
hitCount: 0,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Check if a query is cached.
|
|
164
|
+
*
|
|
165
|
+
* @param query - The search query
|
|
166
|
+
* @returns True if cached (and not expired)
|
|
167
|
+
*/
|
|
168
|
+
has(query) {
|
|
169
|
+
const key = this.normalizeQuery(query);
|
|
170
|
+
const entry = this.cache.get(key);
|
|
171
|
+
if (!entry)
|
|
172
|
+
return false;
|
|
173
|
+
if (this.isExpired(entry)) {
|
|
174
|
+
this.cache.delete(key);
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Invalidate a specific query from cache.
|
|
181
|
+
*
|
|
182
|
+
* @param query - The search query to invalidate
|
|
183
|
+
* @returns True if entry was found and removed
|
|
184
|
+
*/
|
|
185
|
+
invalidate(query) {
|
|
186
|
+
const key = this.normalizeQuery(query);
|
|
187
|
+
return this.cache.delete(key);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Invalidate all entries matching a pattern.
|
|
191
|
+
*
|
|
192
|
+
* @param pattern - Regex pattern to match against queries
|
|
193
|
+
* @returns Number of entries invalidated
|
|
194
|
+
*/
|
|
195
|
+
invalidatePattern(pattern) {
|
|
196
|
+
let count = 0;
|
|
197
|
+
for (const [key, entry] of this.cache) {
|
|
198
|
+
if (pattern.test(entry.originalQuery) || pattern.test(key)) {
|
|
199
|
+
this.cache.delete(key);
|
|
200
|
+
count++;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return count;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Clear all cache entries.
|
|
207
|
+
*/
|
|
208
|
+
clear() {
|
|
209
|
+
this.cache.clear();
|
|
210
|
+
this.hits = 0;
|
|
211
|
+
this.misses = 0;
|
|
212
|
+
this.evictions = 0;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get cache statistics.
|
|
216
|
+
*
|
|
217
|
+
* @returns Cache statistics
|
|
218
|
+
*/
|
|
219
|
+
getStats() {
|
|
220
|
+
const now = Date.now();
|
|
221
|
+
let totalAge = 0;
|
|
222
|
+
for (const entry of this.cache.values()) {
|
|
223
|
+
totalAge += now - entry.createdAt;
|
|
224
|
+
}
|
|
225
|
+
const total = this.hits + this.misses;
|
|
226
|
+
return {
|
|
227
|
+
size: this.cache.size,
|
|
228
|
+
maxSize: this.options.maxSize,
|
|
229
|
+
hits: this.hits,
|
|
230
|
+
misses: this.misses,
|
|
231
|
+
hitRate: total > 0 ? this.hits / total : 0,
|
|
232
|
+
evictions: this.evictions,
|
|
233
|
+
averageEntryAgeMs: this.cache.size > 0 ? totalAge / this.cache.size : 0,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get the current cache size.
|
|
238
|
+
*/
|
|
239
|
+
get size() {
|
|
240
|
+
return this.cache.size;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Normalize a query for cache lookup.
|
|
244
|
+
*
|
|
245
|
+
* Normalization helps improve cache hit rate by treating
|
|
246
|
+
* similar queries as equivalent.
|
|
247
|
+
*
|
|
248
|
+
* @param query - The query to normalize
|
|
249
|
+
* @returns Normalized query string
|
|
250
|
+
*/
|
|
251
|
+
normalizeQuery(query) {
|
|
252
|
+
if (!this.options.normalizeQueries) {
|
|
253
|
+
return query;
|
|
254
|
+
}
|
|
255
|
+
return query
|
|
256
|
+
.toLowerCase()
|
|
257
|
+
.trim()
|
|
258
|
+
// Normalize whitespace
|
|
259
|
+
.replace(/\s+/g, ' ')
|
|
260
|
+
// Remove punctuation that doesn't affect meaning
|
|
261
|
+
.replace(/[.,!?;:]+$/g, '')
|
|
262
|
+
// Sort operators for consistent matching
|
|
263
|
+
.replace(/\b(AND|OR|NOT)\b/gi, match => match.toUpperCase());
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Check if an entry has expired.
|
|
267
|
+
* @private
|
|
268
|
+
*/
|
|
269
|
+
isExpired(entry) {
|
|
270
|
+
return Date.now() - entry.createdAt > this.options.ttlMs;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Evict entries if cache is at capacity.
|
|
274
|
+
* Uses LRU (Least Recently Used) eviction.
|
|
275
|
+
* @private
|
|
276
|
+
*/
|
|
277
|
+
evictIfNeeded() {
|
|
278
|
+
if (this.cache.size < this.options.maxSize) {
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
// Find the least recently used entry
|
|
282
|
+
let oldestKey = null;
|
|
283
|
+
let oldestTime = Infinity;
|
|
284
|
+
for (const [key, entry] of this.cache) {
|
|
285
|
+
// Also check for expired entries during eviction
|
|
286
|
+
if (this.isExpired(entry)) {
|
|
287
|
+
this.cache.delete(key);
|
|
288
|
+
if (this.options.enableStats)
|
|
289
|
+
this.evictions++;
|
|
290
|
+
if (this.cache.size < this.options.maxSize)
|
|
291
|
+
return;
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
if (entry.lastAccessed < oldestTime) {
|
|
295
|
+
oldestTime = entry.lastAccessed;
|
|
296
|
+
oldestKey = key;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Evict the oldest entry
|
|
300
|
+
if (oldestKey) {
|
|
301
|
+
this.cache.delete(oldestKey);
|
|
302
|
+
if (this.options.enableStats)
|
|
303
|
+
this.evictions++;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Clean up expired entries.
|
|
308
|
+
*
|
|
309
|
+
* Call this periodically to remove stale entries.
|
|
310
|
+
*
|
|
311
|
+
* @returns Number of entries removed
|
|
312
|
+
*/
|
|
313
|
+
cleanup() {
|
|
314
|
+
let count = 0;
|
|
315
|
+
for (const [key, entry] of this.cache) {
|
|
316
|
+
if (this.isExpired(entry)) {
|
|
317
|
+
this.cache.delete(key);
|
|
318
|
+
count++;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return count;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Get all cache keys (for debugging).
|
|
325
|
+
*/
|
|
326
|
+
keys() {
|
|
327
|
+
return Array.from(this.cache.keys());
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Preload cache with common queries.
|
|
331
|
+
*
|
|
332
|
+
* @param queries - Array of query-analysis pairs to preload
|
|
333
|
+
*/
|
|
334
|
+
preload(queries) {
|
|
335
|
+
for (const { query, analysis, plan } of queries) {
|
|
336
|
+
if (plan) {
|
|
337
|
+
this.setPlan(query, analysis, plan);
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
this.setAnalysis(query, analysis);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Export cache entries for persistence.
|
|
346
|
+
*
|
|
347
|
+
* @returns Array of cache entries
|
|
348
|
+
*/
|
|
349
|
+
export() {
|
|
350
|
+
const entries = [];
|
|
351
|
+
for (const entry of this.cache.values()) {
|
|
352
|
+
if (!this.isExpired(entry)) {
|
|
353
|
+
entries.push({ ...entry });
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return entries;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Import cache entries from persistence.
|
|
360
|
+
*
|
|
361
|
+
* @param entries - Array of cache entries to import
|
|
362
|
+
* @param preserveTimestamps - Whether to preserve original timestamps
|
|
363
|
+
*/
|
|
364
|
+
import(entries, preserveTimestamps = false) {
|
|
365
|
+
const now = Date.now();
|
|
366
|
+
for (const entry of entries) {
|
|
367
|
+
if (!preserveTimestamps) {
|
|
368
|
+
entry.createdAt = now;
|
|
369
|
+
entry.lastAccessed = now;
|
|
370
|
+
}
|
|
371
|
+
// Skip if expired
|
|
372
|
+
if (this.isExpired(entry))
|
|
373
|
+
continue;
|
|
374
|
+
// Evict if needed
|
|
375
|
+
this.evictIfNeeded();
|
|
376
|
+
this.cache.set(entry.normalizedQuery, entry);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=QueryPlanCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryPlanCache.js","sourceRoot":"","sources":["../../src/search/QueryPlanCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Planner
|
|
3
|
+
*
|
|
4
|
+
* Phase 11: Generates execution plans for queries based on analysis.
|
|
5
|
+
*
|
|
6
|
+
* @module search/QueryPlanner
|
|
7
|
+
*/
|
|
8
|
+
import type { QueryAnalysis, QueryPlan } from '../types/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Query Planner generates execution plans from query analysis.
|
|
11
|
+
*
|
|
12
|
+
* Creates optimized plans that:
|
|
13
|
+
* - Select appropriate search layers
|
|
14
|
+
* - Determine execution strategy (parallel/sequential)
|
|
15
|
+
* - Set up query dependencies
|
|
16
|
+
* - Configure merge strategies
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const analyzer = new QueryAnalyzer();
|
|
21
|
+
* const planner = new QueryPlanner();
|
|
22
|
+
*
|
|
23
|
+
* const analysis = analyzer.analyze('Find projects by Alice');
|
|
24
|
+
* const plan = planner.createPlan('Find projects by Alice', analysis);
|
|
25
|
+
* // { originalQuery: '...', subQueries: [...], executionStrategy: 'iterative', ... }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare class QueryPlanner {
|
|
29
|
+
/**
|
|
30
|
+
* Create an execution plan from query analysis.
|
|
31
|
+
*/
|
|
32
|
+
createPlan(query: string, analysis: QueryAnalysis): QueryPlan;
|
|
33
|
+
/**
|
|
34
|
+
* Create sub-queries from analysis.
|
|
35
|
+
*/
|
|
36
|
+
private createSubQueries;
|
|
37
|
+
/**
|
|
38
|
+
* Select the most appropriate search layer.
|
|
39
|
+
*/
|
|
40
|
+
private selectLayer;
|
|
41
|
+
/**
|
|
42
|
+
* Select execution strategy based on sub-queries.
|
|
43
|
+
*/
|
|
44
|
+
private selectExecutionStrategy;
|
|
45
|
+
/**
|
|
46
|
+
* Select merge strategy based on question type.
|
|
47
|
+
*/
|
|
48
|
+
private selectMergeStrategy;
|
|
49
|
+
/**
|
|
50
|
+
* Build symbolic filters from analysis.
|
|
51
|
+
*/
|
|
52
|
+
private buildFilters;
|
|
53
|
+
/**
|
|
54
|
+
* Calculate plan complexity score.
|
|
55
|
+
*/
|
|
56
|
+
private calculateComplexity;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=QueryPlanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryPlanner.d.ts","sourceRoot":"","sources":["../../src/search/QueryPlanner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAA6B,MAAM,mBAAmB,CAAC;AAE7F;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,SAAS;IAc7D;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAanB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAQ5B"}
|