@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.
Files changed (295) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +266 -0
  3. package/dist/core/EntityManager.d.ts +268 -0
  4. package/dist/core/EntityManager.d.ts.map +1 -0
  5. package/dist/core/EntityManager.js +512 -0
  6. package/dist/core/EntityManager.js.map +1 -0
  7. package/dist/core/GraphEventEmitter.d.ts +202 -0
  8. package/dist/core/GraphEventEmitter.d.ts.map +1 -0
  9. package/dist/core/GraphEventEmitter.js +347 -0
  10. package/dist/core/GraphEventEmitter.js.map +1 -0
  11. package/dist/core/GraphStorage.d.ts +395 -0
  12. package/dist/core/GraphStorage.d.ts.map +1 -0
  13. package/dist/core/GraphStorage.js +786 -0
  14. package/dist/core/GraphStorage.js.map +1 -0
  15. package/dist/core/GraphTraversal.d.ts +141 -0
  16. package/dist/core/GraphTraversal.d.ts.map +1 -0
  17. package/dist/core/GraphTraversal.js +574 -0
  18. package/dist/core/GraphTraversal.js.map +1 -0
  19. package/dist/core/HierarchyManager.d.ts +111 -0
  20. package/dist/core/HierarchyManager.d.ts.map +1 -0
  21. package/dist/core/HierarchyManager.js +225 -0
  22. package/dist/core/HierarchyManager.js.map +1 -0
  23. package/dist/core/ManagerContext.d.ts +76 -0
  24. package/dist/core/ManagerContext.d.ts.map +1 -0
  25. package/dist/core/ManagerContext.js +129 -0
  26. package/dist/core/ManagerContext.js.map +1 -0
  27. package/dist/core/ObservationManager.d.ts +85 -0
  28. package/dist/core/ObservationManager.d.ts.map +1 -0
  29. package/dist/core/ObservationManager.js +124 -0
  30. package/dist/core/ObservationManager.js.map +1 -0
  31. package/dist/core/RelationManager.d.ts +131 -0
  32. package/dist/core/RelationManager.d.ts.map +1 -0
  33. package/dist/core/RelationManager.js +212 -0
  34. package/dist/core/RelationManager.js.map +1 -0
  35. package/dist/core/SQLiteStorage.d.ts +354 -0
  36. package/dist/core/SQLiteStorage.d.ts.map +1 -0
  37. package/dist/core/SQLiteStorage.js +919 -0
  38. package/dist/core/SQLiteStorage.js.map +1 -0
  39. package/dist/core/StorageFactory.d.ts +45 -0
  40. package/dist/core/StorageFactory.d.ts.map +1 -0
  41. package/dist/core/StorageFactory.js +65 -0
  42. package/dist/core/StorageFactory.js.map +1 -0
  43. package/dist/core/TransactionManager.d.ts +464 -0
  44. package/dist/core/TransactionManager.d.ts.map +1 -0
  45. package/dist/core/TransactionManager.js +869 -0
  46. package/dist/core/TransactionManager.js.map +1 -0
  47. package/dist/core/index.d.ts +17 -0
  48. package/dist/core/index.d.ts.map +1 -0
  49. package/dist/core/index.js +20 -0
  50. package/dist/core/index.js.map +1 -0
  51. package/dist/features/AnalyticsManager.d.ts +44 -0
  52. package/dist/features/AnalyticsManager.d.ts.map +1 -0
  53. package/dist/features/AnalyticsManager.js +224 -0
  54. package/dist/features/AnalyticsManager.js.map +1 -0
  55. package/dist/features/ArchiveManager.d.ts +133 -0
  56. package/dist/features/ArchiveManager.d.ts.map +1 -0
  57. package/dist/features/ArchiveManager.js +282 -0
  58. package/dist/features/ArchiveManager.js.map +1 -0
  59. package/dist/features/CompressionManager.d.ts +119 -0
  60. package/dist/features/CompressionManager.d.ts.map +1 -0
  61. package/dist/features/CompressionManager.js +470 -0
  62. package/dist/features/CompressionManager.js.map +1 -0
  63. package/dist/features/IOManager.d.ts +225 -0
  64. package/dist/features/IOManager.d.ts.map +1 -0
  65. package/dist/features/IOManager.js +1093 -0
  66. package/dist/features/IOManager.js.map +1 -0
  67. package/dist/features/KeywordExtractor.d.ts +61 -0
  68. package/dist/features/KeywordExtractor.d.ts.map +1 -0
  69. package/dist/features/KeywordExtractor.js +127 -0
  70. package/dist/features/KeywordExtractor.js.map +1 -0
  71. package/dist/features/ObservationNormalizer.d.ts +90 -0
  72. package/dist/features/ObservationNormalizer.d.ts.map +1 -0
  73. package/dist/features/ObservationNormalizer.js +194 -0
  74. package/dist/features/ObservationNormalizer.js.map +1 -0
  75. package/dist/features/StreamingExporter.d.ts +128 -0
  76. package/dist/features/StreamingExporter.d.ts.map +1 -0
  77. package/dist/features/StreamingExporter.js +212 -0
  78. package/dist/features/StreamingExporter.js.map +1 -0
  79. package/dist/features/TagManager.d.ts +147 -0
  80. package/dist/features/TagManager.d.ts.map +1 -0
  81. package/dist/features/TagManager.js +211 -0
  82. package/dist/features/TagManager.js.map +1 -0
  83. package/dist/features/index.d.ts +14 -0
  84. package/dist/features/index.d.ts.map +1 -0
  85. package/dist/features/index.js +15 -0
  86. package/dist/features/index.js.map +1 -0
  87. package/dist/index.d.ts +15 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +20 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/search/BM25Search.d.ts +148 -0
  92. package/dist/search/BM25Search.d.ts.map +1 -0
  93. package/dist/search/BM25Search.js +340 -0
  94. package/dist/search/BM25Search.js.map +1 -0
  95. package/dist/search/BasicSearch.d.ts +51 -0
  96. package/dist/search/BasicSearch.d.ts.map +1 -0
  97. package/dist/search/BasicSearch.js +138 -0
  98. package/dist/search/BasicSearch.js.map +1 -0
  99. package/dist/search/BooleanSearch.d.ts +98 -0
  100. package/dist/search/BooleanSearch.d.ts.map +1 -0
  101. package/dist/search/BooleanSearch.js +431 -0
  102. package/dist/search/BooleanSearch.js.map +1 -0
  103. package/dist/search/EarlyTerminationManager.d.ts +140 -0
  104. package/dist/search/EarlyTerminationManager.d.ts.map +1 -0
  105. package/dist/search/EarlyTerminationManager.js +280 -0
  106. package/dist/search/EarlyTerminationManager.js.map +1 -0
  107. package/dist/search/EmbeddingCache.d.ts +175 -0
  108. package/dist/search/EmbeddingCache.d.ts.map +1 -0
  109. package/dist/search/EmbeddingCache.js +247 -0
  110. package/dist/search/EmbeddingCache.js.map +1 -0
  111. package/dist/search/EmbeddingService.d.ts +277 -0
  112. package/dist/search/EmbeddingService.d.ts.map +1 -0
  113. package/dist/search/EmbeddingService.js +531 -0
  114. package/dist/search/EmbeddingService.js.map +1 -0
  115. package/dist/search/FuzzySearch.d.ts +118 -0
  116. package/dist/search/FuzzySearch.d.ts.map +1 -0
  117. package/dist/search/FuzzySearch.js +313 -0
  118. package/dist/search/FuzzySearch.js.map +1 -0
  119. package/dist/search/HybridScorer.d.ts +181 -0
  120. package/dist/search/HybridScorer.d.ts.map +1 -0
  121. package/dist/search/HybridScorer.js +258 -0
  122. package/dist/search/HybridScorer.js.map +1 -0
  123. package/dist/search/HybridSearchManager.d.ts +80 -0
  124. package/dist/search/HybridSearchManager.d.ts.map +1 -0
  125. package/dist/search/HybridSearchManager.js +188 -0
  126. package/dist/search/HybridSearchManager.js.map +1 -0
  127. package/dist/search/IncrementalIndexer.d.ts +201 -0
  128. package/dist/search/IncrementalIndexer.d.ts.map +1 -0
  129. package/dist/search/IncrementalIndexer.js +343 -0
  130. package/dist/search/IncrementalIndexer.js.map +1 -0
  131. package/dist/search/OptimizedInvertedIndex.d.ts +163 -0
  132. package/dist/search/OptimizedInvertedIndex.d.ts.map +1 -0
  133. package/dist/search/OptimizedInvertedIndex.js +359 -0
  134. package/dist/search/OptimizedInvertedIndex.js.map +1 -0
  135. package/dist/search/ParallelSearchExecutor.d.ts +172 -0
  136. package/dist/search/ParallelSearchExecutor.d.ts.map +1 -0
  137. package/dist/search/ParallelSearchExecutor.js +310 -0
  138. package/dist/search/ParallelSearchExecutor.js.map +1 -0
  139. package/dist/search/QuantizedVectorStore.d.ts +171 -0
  140. package/dist/search/QuantizedVectorStore.d.ts.map +1 -0
  141. package/dist/search/QuantizedVectorStore.js +308 -0
  142. package/dist/search/QuantizedVectorStore.js.map +1 -0
  143. package/dist/search/QueryAnalyzer.d.ts +76 -0
  144. package/dist/search/QueryAnalyzer.d.ts.map +1 -0
  145. package/dist/search/QueryAnalyzer.js +228 -0
  146. package/dist/search/QueryAnalyzer.js.map +1 -0
  147. package/dist/search/QueryCostEstimator.d.ts +244 -0
  148. package/dist/search/QueryCostEstimator.d.ts.map +1 -0
  149. package/dist/search/QueryCostEstimator.js +653 -0
  150. package/dist/search/QueryCostEstimator.js.map +1 -0
  151. package/dist/search/QueryPlanCache.d.ts +220 -0
  152. package/dist/search/QueryPlanCache.d.ts.map +1 -0
  153. package/dist/search/QueryPlanCache.js +380 -0
  154. package/dist/search/QueryPlanCache.js.map +1 -0
  155. package/dist/search/QueryPlanner.d.ts +58 -0
  156. package/dist/search/QueryPlanner.d.ts.map +1 -0
  157. package/dist/search/QueryPlanner.js +138 -0
  158. package/dist/search/QueryPlanner.js.map +1 -0
  159. package/dist/search/RankedSearch.d.ts +71 -0
  160. package/dist/search/RankedSearch.d.ts.map +1 -0
  161. package/dist/search/RankedSearch.js +239 -0
  162. package/dist/search/RankedSearch.js.map +1 -0
  163. package/dist/search/ReflectionManager.d.ts +120 -0
  164. package/dist/search/ReflectionManager.d.ts.map +1 -0
  165. package/dist/search/ReflectionManager.js +232 -0
  166. package/dist/search/ReflectionManager.js.map +1 -0
  167. package/dist/search/SavedSearchManager.d.ts +79 -0
  168. package/dist/search/SavedSearchManager.d.ts.map +1 -0
  169. package/dist/search/SavedSearchManager.js +147 -0
  170. package/dist/search/SavedSearchManager.js.map +1 -0
  171. package/dist/search/SearchFilterChain.d.ts +120 -0
  172. package/dist/search/SearchFilterChain.d.ts.map +1 -0
  173. package/dist/search/SearchFilterChain.js +186 -0
  174. package/dist/search/SearchFilterChain.js.map +1 -0
  175. package/dist/search/SearchManager.d.ts +326 -0
  176. package/dist/search/SearchManager.d.ts.map +1 -0
  177. package/dist/search/SearchManager.js +454 -0
  178. package/dist/search/SearchManager.js.map +1 -0
  179. package/dist/search/SearchSuggestions.d.ts +27 -0
  180. package/dist/search/SearchSuggestions.d.ts.map +1 -0
  181. package/dist/search/SearchSuggestions.js +58 -0
  182. package/dist/search/SearchSuggestions.js.map +1 -0
  183. package/dist/search/SemanticSearch.d.ts +149 -0
  184. package/dist/search/SemanticSearch.d.ts.map +1 -0
  185. package/dist/search/SemanticSearch.js +324 -0
  186. package/dist/search/SemanticSearch.js.map +1 -0
  187. package/dist/search/SymbolicSearch.d.ts +61 -0
  188. package/dist/search/SymbolicSearch.d.ts.map +1 -0
  189. package/dist/search/SymbolicSearch.js +164 -0
  190. package/dist/search/SymbolicSearch.js.map +1 -0
  191. package/dist/search/TFIDFEventSync.d.ts +85 -0
  192. package/dist/search/TFIDFEventSync.d.ts.map +1 -0
  193. package/dist/search/TFIDFEventSync.js +134 -0
  194. package/dist/search/TFIDFEventSync.js.map +1 -0
  195. package/dist/search/TFIDFIndexManager.d.ts +151 -0
  196. package/dist/search/TFIDFIndexManager.d.ts.map +1 -0
  197. package/dist/search/TFIDFIndexManager.js +433 -0
  198. package/dist/search/TFIDFIndexManager.js.map +1 -0
  199. package/dist/search/VectorStore.d.ts +235 -0
  200. package/dist/search/VectorStore.d.ts.map +1 -0
  201. package/dist/search/VectorStore.js +312 -0
  202. package/dist/search/VectorStore.js.map +1 -0
  203. package/dist/search/index.d.ts +35 -0
  204. package/dist/search/index.d.ts.map +1 -0
  205. package/dist/search/index.js +53 -0
  206. package/dist/search/index.js.map +1 -0
  207. package/dist/types/index.d.ts +13 -0
  208. package/dist/types/index.d.ts.map +1 -0
  209. package/dist/types/index.js +13 -0
  210. package/dist/types/index.js.map +1 -0
  211. package/dist/types/types.d.ts +1811 -0
  212. package/dist/types/types.d.ts.map +1 -0
  213. package/dist/types/types.js +10 -0
  214. package/dist/types/types.js.map +1 -0
  215. package/dist/utils/BatchProcessor.d.ts +271 -0
  216. package/dist/utils/BatchProcessor.d.ts.map +1 -0
  217. package/dist/utils/BatchProcessor.js +377 -0
  218. package/dist/utils/BatchProcessor.js.map +1 -0
  219. package/dist/utils/MemoryMonitor.d.ts +176 -0
  220. package/dist/utils/MemoryMonitor.d.ts.map +1 -0
  221. package/dist/utils/MemoryMonitor.js +306 -0
  222. package/dist/utils/MemoryMonitor.js.map +1 -0
  223. package/dist/utils/WorkerPoolManager.d.ts +233 -0
  224. package/dist/utils/WorkerPoolManager.d.ts.map +1 -0
  225. package/dist/utils/WorkerPoolManager.js +421 -0
  226. package/dist/utils/WorkerPoolManager.js.map +1 -0
  227. package/dist/utils/compressedCache.d.ts +221 -0
  228. package/dist/utils/compressedCache.d.ts.map +1 -0
  229. package/dist/utils/compressedCache.js +349 -0
  230. package/dist/utils/compressedCache.js.map +1 -0
  231. package/dist/utils/compressionUtil.d.ts +214 -0
  232. package/dist/utils/compressionUtil.d.ts.map +1 -0
  233. package/dist/utils/compressionUtil.js +248 -0
  234. package/dist/utils/compressionUtil.js.map +1 -0
  235. package/dist/utils/constants.d.ts +245 -0
  236. package/dist/utils/constants.d.ts.map +1 -0
  237. package/dist/utils/constants.js +253 -0
  238. package/dist/utils/constants.js.map +1 -0
  239. package/dist/utils/entityUtils.d.ts +379 -0
  240. package/dist/utils/entityUtils.d.ts.map +1 -0
  241. package/dist/utils/entityUtils.js +649 -0
  242. package/dist/utils/entityUtils.js.map +1 -0
  243. package/dist/utils/errors.d.ts +95 -0
  244. package/dist/utils/errors.d.ts.map +1 -0
  245. package/dist/utils/errors.js +146 -0
  246. package/dist/utils/errors.js.map +1 -0
  247. package/dist/utils/formatters.d.ts +145 -0
  248. package/dist/utils/formatters.d.ts.map +1 -0
  249. package/dist/utils/formatters.js +133 -0
  250. package/dist/utils/formatters.js.map +1 -0
  251. package/dist/utils/index.d.ts +26 -0
  252. package/dist/utils/index.d.ts.map +1 -0
  253. package/dist/utils/index.js +88 -0
  254. package/dist/utils/index.js.map +1 -0
  255. package/dist/utils/indexes.d.ts +270 -0
  256. package/dist/utils/indexes.d.ts.map +1 -0
  257. package/dist/utils/indexes.js +527 -0
  258. package/dist/utils/indexes.js.map +1 -0
  259. package/dist/utils/logger.d.ts +31 -0
  260. package/dist/utils/logger.d.ts.map +1 -0
  261. package/dist/utils/logger.js +41 -0
  262. package/dist/utils/logger.js.map +1 -0
  263. package/dist/utils/operationUtils.d.ts +124 -0
  264. package/dist/utils/operationUtils.d.ts.map +1 -0
  265. package/dist/utils/operationUtils.js +176 -0
  266. package/dist/utils/operationUtils.js.map +1 -0
  267. package/dist/utils/parallelUtils.d.ts +76 -0
  268. package/dist/utils/parallelUtils.d.ts.map +1 -0
  269. package/dist/utils/parallelUtils.js +192 -0
  270. package/dist/utils/parallelUtils.js.map +1 -0
  271. package/dist/utils/schemas.d.ts +556 -0
  272. package/dist/utils/schemas.d.ts.map +1 -0
  273. package/dist/utils/schemas.js +485 -0
  274. package/dist/utils/schemas.js.map +1 -0
  275. package/dist/utils/searchAlgorithms.d.ts +99 -0
  276. package/dist/utils/searchAlgorithms.d.ts.map +1 -0
  277. package/dist/utils/searchAlgorithms.js +168 -0
  278. package/dist/utils/searchAlgorithms.js.map +1 -0
  279. package/dist/utils/searchCache.d.ts +108 -0
  280. package/dist/utils/searchCache.d.ts.map +1 -0
  281. package/dist/utils/searchCache.js +210 -0
  282. package/dist/utils/searchCache.js.map +1 -0
  283. package/dist/utils/taskScheduler.d.ts +294 -0
  284. package/dist/utils/taskScheduler.d.ts.map +1 -0
  285. package/dist/utils/taskScheduler.js +487 -0
  286. package/dist/utils/taskScheduler.js.map +1 -0
  287. package/dist/workers/index.d.ts +12 -0
  288. package/dist/workers/index.d.ts.map +1 -0
  289. package/dist/workers/index.js +10 -0
  290. package/dist/workers/index.js.map +1 -0
  291. package/dist/workers/levenshteinWorker.d.ts +60 -0
  292. package/dist/workers/levenshteinWorker.d.ts.map +1 -0
  293. package/dist/workers/levenshteinWorker.js +99 -0
  294. package/dist/workers/levenshteinWorker.js.map +1 -0
  295. 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"}