@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,653 @@
1
+ /**
2
+ * Query Cost Estimator
3
+ *
4
+ * Phase 10 Sprint 4: Estimates the cost of different search methods
5
+ * and recommends the optimal method based on query characteristics
6
+ * and graph size.
7
+ *
8
+ * Phase 12 Sprint 4: Enhanced with adaptive depth calculation,
9
+ * layer recommendations, and token estimation.
10
+ *
11
+ * @module search/QueryCostEstimator
12
+ */
13
+ /**
14
+ * Default options for the QueryCostEstimator.
15
+ */
16
+ const DEFAULT_OPTIONS = {
17
+ basicTimePerEntity: 0.01,
18
+ rankedTimePerEntity: 0.05,
19
+ booleanTimePerEntity: 0.02,
20
+ fuzzyTimePerEntity: 0.1,
21
+ semanticTimePerEntity: 0.5,
22
+ lowComplexityThreshold: 100,
23
+ highComplexityThreshold: 1000,
24
+ };
25
+ /**
26
+ * Default adaptive depth configuration.
27
+ */
28
+ const DEFAULT_ADAPTIVE_DEPTH = {
29
+ kBase: 10,
30
+ delta: 0.5,
31
+ maxDepth: 100,
32
+ };
33
+ /**
34
+ * Default token estimation options.
35
+ */
36
+ const DEFAULT_TOKEN_ESTIMATION = {
37
+ charsPerToken: 4,
38
+ includeEntityCount: true,
39
+ };
40
+ /**
41
+ * Phase 10 Sprint 4: Estimates search query costs and recommends optimal methods.
42
+ *
43
+ * Analyzes query characteristics and graph size to estimate execution time
44
+ * and recommend the most appropriate search method.
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const estimator = new QueryCostEstimator();
49
+ *
50
+ * // Get estimate for a specific method
51
+ * const estimate = estimator.estimateMethod('ranked', 'test query', 1000);
52
+ *
53
+ * // Get the recommended method for a query
54
+ * const recommendation = estimator.recommendMethod('test query', 1000);
55
+ *
56
+ * // Get estimates for all methods
57
+ * const allEstimates = estimator.estimateAllMethods('test query', 1000);
58
+ * ```
59
+ */
60
+ export class QueryCostEstimator {
61
+ options;
62
+ adaptiveDepthConfig;
63
+ tokenEstimationConfig;
64
+ /**
65
+ * Create a new QueryCostEstimator instance.
66
+ *
67
+ * @param options - Optional configuration overrides
68
+ * @param adaptiveDepthConfig - Optional adaptive depth configuration
69
+ * @param tokenEstimationConfig - Optional token estimation configuration
70
+ */
71
+ constructor(options, adaptiveDepthConfig, tokenEstimationConfig) {
72
+ this.options = { ...DEFAULT_OPTIONS, ...options };
73
+ this.adaptiveDepthConfig = { ...DEFAULT_ADAPTIVE_DEPTH, ...adaptiveDepthConfig };
74
+ this.tokenEstimationConfig = { ...DEFAULT_TOKEN_ESTIMATION, ...tokenEstimationConfig };
75
+ }
76
+ /**
77
+ * Estimate the cost of a specific search method.
78
+ *
79
+ * @param method - The search method to estimate
80
+ * @param query - The search query
81
+ * @param entityCount - Number of entities in the graph
82
+ * @returns Cost estimate for the method
83
+ */
84
+ estimateMethod(method, query, entityCount) {
85
+ // Get the recommended method first to determine isRecommended
86
+ const recommendedMethod = this.getRecommendedMethodOnly(query, entityCount);
87
+ return this.estimateMethodInternal(method, query, entityCount, method === recommendedMethod);
88
+ }
89
+ /**
90
+ * Internal method to estimate without triggering recursion.
91
+ * @private
92
+ */
93
+ estimateMethodInternal(method, query, entityCount, isRecommended) {
94
+ const baseTime = this.getBaseTimeForMethod(method);
95
+ const queryComplexityFactor = this.getQueryComplexityFactor(query, method);
96
+ const estimatedTimeMs = baseTime * entityCount * queryComplexityFactor;
97
+ const complexity = this.getComplexity(entityCount);
98
+ const recommendation = this.getRecommendation(method, query, entityCount, complexity);
99
+ return {
100
+ method,
101
+ estimatedTimeMs: Math.round(estimatedTimeMs * 100) / 100,
102
+ complexity,
103
+ entityCount,
104
+ recommendation,
105
+ isRecommended,
106
+ };
107
+ }
108
+ /**
109
+ * Get just the recommended method without full estimate (avoids recursion).
110
+ * @private
111
+ */
112
+ getRecommendedMethodOnly(query, entityCount, preferredMethods) {
113
+ const methods = preferredMethods ?? ['basic', 'ranked', 'boolean', 'fuzzy', 'semantic'];
114
+ // Score each method and find the best
115
+ let bestMethod = methods[0];
116
+ let bestScore = this.scoreMethod(methods[0], query, entityCount);
117
+ for (let i = 1; i < methods.length; i++) {
118
+ const score = this.scoreMethod(methods[i], query, entityCount);
119
+ if (score > bestScore) {
120
+ bestScore = score;
121
+ bestMethod = methods[i];
122
+ }
123
+ }
124
+ return bestMethod;
125
+ }
126
+ /**
127
+ * Get estimates for all available search methods.
128
+ *
129
+ * @param query - The search query
130
+ * @param entityCount - Number of entities in the graph
131
+ * @returns Array of estimates for all methods
132
+ */
133
+ estimateAllMethods(query, entityCount) {
134
+ const methods = ['basic', 'ranked', 'boolean', 'fuzzy', 'semantic'];
135
+ const recommendedMethod = this.getRecommendedMethodOnly(query, entityCount);
136
+ return methods.map(method => this.estimateMethodInternal(method, query, entityCount, method === recommendedMethod));
137
+ }
138
+ /**
139
+ * Recommend the best search method for a query.
140
+ *
141
+ * @param query - The search query
142
+ * @param entityCount - Number of entities in the graph
143
+ * @param preferredMethods - Optional array of methods to consider (default: all)
144
+ * @returns The recommended method and reason
145
+ */
146
+ recommendMethod(query, entityCount, preferredMethods) {
147
+ const methods = preferredMethods ?? ['basic', 'ranked', 'boolean', 'fuzzy', 'semantic'];
148
+ // Score each method based on query characteristics and cost
149
+ const scores = methods.map(method => ({
150
+ method,
151
+ score: this.scoreMethod(method, query, entityCount),
152
+ estimate: this.estimateMethod(method, query, entityCount),
153
+ }));
154
+ // Sort by score (higher is better)
155
+ scores.sort((a, b) => b.score - a.score);
156
+ const best = scores[0];
157
+ const reason = this.getSelectionReason(best.method, query, entityCount);
158
+ return {
159
+ method: best.method,
160
+ reason,
161
+ estimate: best.estimate,
162
+ };
163
+ }
164
+ /**
165
+ * Get the base time per entity for a search method.
166
+ * @private
167
+ */
168
+ getBaseTimeForMethod(method) {
169
+ switch (method) {
170
+ case 'basic':
171
+ return this.options.basicTimePerEntity;
172
+ case 'ranked':
173
+ return this.options.rankedTimePerEntity;
174
+ case 'boolean':
175
+ return this.options.booleanTimePerEntity;
176
+ case 'fuzzy':
177
+ return this.options.fuzzyTimePerEntity;
178
+ case 'semantic':
179
+ return this.options.semanticTimePerEntity;
180
+ }
181
+ }
182
+ /**
183
+ * Calculate a complexity factor based on query characteristics.
184
+ * @private
185
+ */
186
+ getQueryComplexityFactor(query, method) {
187
+ const words = query.trim().split(/\s+/).length;
188
+ const hasOperators = /\b(AND|OR|NOT)\b/.test(query);
189
+ const hasWildcard = query.includes('*');
190
+ const hasQuotes = query.includes('"');
191
+ let factor = 1.0;
192
+ // More words = slightly more complex
193
+ factor += (words - 1) * 0.1;
194
+ // Boolean operators increase boolean search cost, decrease others
195
+ if (hasOperators) {
196
+ if (method === 'boolean') {
197
+ factor *= 0.8; // Boolean search is optimized for operators
198
+ }
199
+ else {
200
+ factor *= 1.5; // Other methods struggle with operators
201
+ }
202
+ }
203
+ // Wildcards increase fuzzy search efficiency
204
+ if (hasWildcard) {
205
+ if (method === 'fuzzy') {
206
+ factor *= 0.9;
207
+ }
208
+ else {
209
+ factor *= 1.3;
210
+ }
211
+ }
212
+ // Quoted phrases benefit ranked search
213
+ if (hasQuotes) {
214
+ if (method === 'ranked') {
215
+ factor *= 0.9;
216
+ }
217
+ else {
218
+ factor *= 1.1;
219
+ }
220
+ }
221
+ return Math.max(0.5, Math.min(factor, 3.0)); // Clamp between 0.5 and 3.0
222
+ }
223
+ /**
224
+ * Get the complexity level based on entity count.
225
+ * @private
226
+ */
227
+ getComplexity(entityCount) {
228
+ if (entityCount <= this.options.lowComplexityThreshold) {
229
+ return 'low';
230
+ }
231
+ if (entityCount >= this.options.highComplexityThreshold) {
232
+ return 'high';
233
+ }
234
+ return 'medium';
235
+ }
236
+ /**
237
+ * Generate a human-readable recommendation.
238
+ * @private
239
+ */
240
+ getRecommendation(method, _query, _entityCount, complexity) {
241
+ const recommendations = {
242
+ basic: 'Fast substring matching, best for simple queries',
243
+ ranked: 'TF-IDF relevance ranking, best for finding most relevant results',
244
+ boolean: 'Boolean operators (AND/OR/NOT), best for precise filtering',
245
+ fuzzy: 'Tolerant of typos and misspellings, best for uncertain queries',
246
+ semantic: 'Meaning-based search using embeddings, best for conceptual queries',
247
+ };
248
+ let recommendation = recommendations[method];
249
+ if (complexity === 'high' && method === 'semantic') {
250
+ recommendation += ' - may be slow for large graphs';
251
+ }
252
+ if (complexity === 'low') {
253
+ recommendation += ' - fast for small graphs';
254
+ }
255
+ return recommendation;
256
+ }
257
+ /**
258
+ * Score a method based on query characteristics and graph size.
259
+ * Higher score = better fit.
260
+ * @private
261
+ */
262
+ scoreMethod(method, query, entityCount) {
263
+ let score = 50; // Base score
264
+ const hasOperators = /\b(AND|OR|NOT)\b/.test(query);
265
+ const hasWildcard = query.includes('*');
266
+ const hasQuotes = query.includes('"');
267
+ const words = query.trim().split(/\s+/).length;
268
+ const isShortQuery = words <= 2;
269
+ const isLongQuery = words >= 5;
270
+ const complexity = this.getComplexity(entityCount);
271
+ switch (method) {
272
+ case 'basic':
273
+ // Basic is good for simple, short queries on any size graph
274
+ if (isShortQuery && !hasOperators && !hasWildcard) {
275
+ score += 30;
276
+ }
277
+ if (complexity === 'low') {
278
+ score += 20;
279
+ }
280
+ // Basic is fastest, give bonus for speed
281
+ score += 10;
282
+ break;
283
+ case 'ranked':
284
+ // Ranked is good for relevance-focused queries
285
+ if (words >= 2) {
286
+ score += 25; // Better for multi-word queries
287
+ }
288
+ if (hasQuotes) {
289
+ score += 15; // Good for phrase matching
290
+ }
291
+ if (!hasOperators) {
292
+ score += 10; // Not optimized for boolean
293
+ }
294
+ // Good balance of speed and quality
295
+ score += 15;
296
+ break;
297
+ case 'boolean':
298
+ // Boolean is best for queries with operators
299
+ if (hasOperators) {
300
+ score += 40;
301
+ }
302
+ if (!hasOperators) {
303
+ score -= 20; // Not useful without operators
304
+ }
305
+ // Fast for filtering
306
+ score += 10;
307
+ break;
308
+ case 'fuzzy':
309
+ // Fuzzy is good for typo-tolerant search
310
+ if (hasWildcard) {
311
+ score += 25;
312
+ }
313
+ if (isShortQuery) {
314
+ score += 15; // Works best on shorter queries
315
+ }
316
+ if (isLongQuery) {
317
+ score -= 15; // Slow on long queries
318
+ }
319
+ if (complexity === 'high') {
320
+ score -= 20; // Slow on large graphs
321
+ }
322
+ break;
323
+ case 'semantic':
324
+ // Semantic is good for conceptual/meaning-based queries
325
+ if (isLongQuery) {
326
+ score += 30; // Better for longer, more descriptive queries
327
+ }
328
+ if (!hasOperators && !hasWildcard) {
329
+ score += 15; // Natural language queries
330
+ }
331
+ // Penalize for large graphs (slow)
332
+ if (complexity === 'high') {
333
+ score -= 30;
334
+ }
335
+ if (complexity === 'medium') {
336
+ score -= 10;
337
+ }
338
+ break;
339
+ }
340
+ return score;
341
+ }
342
+ /**
343
+ * Get a human-readable reason for why a method was selected.
344
+ * @private
345
+ */
346
+ getSelectionReason(method, query, entityCount) {
347
+ const hasOperators = /\b(AND|OR|NOT)\b/.test(query);
348
+ const hasWildcard = query.includes('*');
349
+ const words = query.trim().split(/\s+/).length;
350
+ const complexity = this.getComplexity(entityCount);
351
+ switch (method) {
352
+ case 'basic':
353
+ if (complexity === 'low') {
354
+ return 'Basic search selected for small graph size - fast and efficient';
355
+ }
356
+ return 'Basic search selected for simple query pattern';
357
+ case 'ranked':
358
+ if (words >= 2) {
359
+ return 'Ranked search selected for multi-word query - provides relevance ordering';
360
+ }
361
+ return 'Ranked search selected for best balance of speed and relevance';
362
+ case 'boolean':
363
+ if (hasOperators) {
364
+ return 'Boolean search selected - query contains logical operators (AND/OR/NOT)';
365
+ }
366
+ return 'Boolean search selected for precise filtering';
367
+ case 'fuzzy':
368
+ if (hasWildcard) {
369
+ return 'Fuzzy search selected - query contains wildcard patterns';
370
+ }
371
+ return 'Fuzzy search selected for typo-tolerant matching';
372
+ case 'semantic':
373
+ if (words >= 5) {
374
+ return 'Semantic search selected - longer natural language query benefits from meaning-based matching';
375
+ }
376
+ return 'Semantic search selected for conceptual/meaning-based matching';
377
+ }
378
+ }
379
+ // ==================== Phase 12 Sprint 4: Enhanced Features ====================
380
+ /**
381
+ * Calculate adaptive depth (k_dyn) based on query complexity.
382
+ *
383
+ * Formula: k_dyn = k_base × (1 + δ × C_q)
384
+ * where:
385
+ * - k_base: base number of results
386
+ * - δ (delta): complexity scaling factor
387
+ * - C_q: query complexity score (0-1)
388
+ *
389
+ * @param query - The search query
390
+ * @param analysis - Optional query analysis for more accurate complexity
391
+ * @returns Adaptive depth value
392
+ */
393
+ calculateAdaptiveDepth(query, analysis) {
394
+ const { kBase, delta, maxDepth } = this.adaptiveDepthConfig;
395
+ // Calculate complexity score (0-1)
396
+ const complexityScore = this.calculateComplexityScore(query, analysis);
397
+ // Apply formula: k_dyn = k_base × (1 + δ × C_q)
398
+ const kDyn = kBase * (1 + delta * complexityScore);
399
+ // Round and cap at maxDepth
400
+ return Math.min(Math.round(kDyn), maxDepth);
401
+ }
402
+ /**
403
+ * Calculate query complexity score (0-1).
404
+ * @private
405
+ */
406
+ calculateComplexityScore(query, analysis) {
407
+ let score = 0;
408
+ // Use analysis if provided
409
+ if (analysis) {
410
+ switch (analysis.complexity) {
411
+ case 'low':
412
+ score = 0.2;
413
+ break;
414
+ case 'medium':
415
+ score = 0.5;
416
+ break;
417
+ case 'high':
418
+ score = 0.8;
419
+ break;
420
+ }
421
+ // Adjust for sub-queries
422
+ if (analysis.subQueries && analysis.subQueries.length > 1) {
423
+ score += 0.1 * (analysis.subQueries.length - 1);
424
+ }
425
+ // Adjust for temporal range (adds complexity)
426
+ if (analysis.temporalRange) {
427
+ score += 0.1;
428
+ }
429
+ // Adjust for entities (more entities = more complex)
430
+ if (analysis.entities.length > 0) {
431
+ score += 0.05 * Math.min(analysis.entities.length, 3);
432
+ }
433
+ }
434
+ else {
435
+ // Fallback to query-based estimation
436
+ const words = query.trim().split(/\s+/).length;
437
+ const hasOperators = /\b(AND|OR|NOT)\b/.test(query);
438
+ const hasMultipleClauses = /[,;]/.test(query);
439
+ const hasConjunctions = /\b(and|or|but|then|therefore)\b/i.test(query);
440
+ score = Math.min(words / 20, 0.5); // Base score from length
441
+ if (hasOperators)
442
+ score += 0.2;
443
+ if (hasMultipleClauses)
444
+ score += 0.15;
445
+ if (hasConjunctions)
446
+ score += 0.1;
447
+ }
448
+ // Clamp to 0-1
449
+ return Math.max(0, Math.min(1, score));
450
+ }
451
+ /**
452
+ * Estimate tokens for query and expected results.
453
+ *
454
+ * @param query - The search query
455
+ * @param entityCount - Number of entities in the graph
456
+ * @param expectedResults - Expected number of results (default: 10)
457
+ * @returns Estimated token count
458
+ */
459
+ estimateTokens(query, entityCount, expectedResults = 10) {
460
+ const { charsPerToken, includeEntityCount } = this.tokenEstimationConfig;
461
+ // Query tokens
462
+ const queryTokens = Math.ceil(query.length / charsPerToken);
463
+ // Result tokens (approximate average entity text size)
464
+ const avgEntityTextSize = 200; // Conservative estimate
465
+ const resultTokens = Math.ceil((avgEntityTextSize * expectedResults) / charsPerToken);
466
+ // Add overhead for entity count if enabled
467
+ let totalTokens = queryTokens + resultTokens;
468
+ if (includeEntityCount) {
469
+ // More entities = slightly more processing/context
470
+ const entityOverhead = Math.ceil(Math.log10(entityCount + 1) * 10);
471
+ totalTokens += entityOverhead;
472
+ }
473
+ return totalTokens;
474
+ }
475
+ /**
476
+ * Recommend search layers based on query characteristics.
477
+ *
478
+ * @param query - The search query
479
+ * @param options - Layer recommendation options
480
+ * @returns Ordered array of recommended layers (fastest first)
481
+ */
482
+ recommendLayers(query, options = {}) {
483
+ const { analysis, semanticAvailable = true, maxLayers = 3, } = options;
484
+ const layers = [];
485
+ // Score lexical layer
486
+ const lexicalScore = this.scoreLexicalLayer(query, analysis);
487
+ layers.push({
488
+ layer: 'lexical',
489
+ score: lexicalScore,
490
+ cost: this.estimateLayerCost('lexical', query),
491
+ });
492
+ // Score symbolic layer
493
+ const symbolicScore = this.scoreSymbolicLayer(query, analysis);
494
+ layers.push({
495
+ layer: 'symbolic',
496
+ score: symbolicScore,
497
+ cost: this.estimateLayerCost('symbolic', query),
498
+ });
499
+ // Score semantic layer (if available)
500
+ if (semanticAvailable) {
501
+ const semanticScore = this.scoreSemanticLayer(query, analysis);
502
+ layers.push({
503
+ layer: 'semantic',
504
+ score: semanticScore,
505
+ cost: this.estimateLayerCost('semantic', query),
506
+ });
507
+ }
508
+ // Sort by score (higher is better), then by cost (lower is better)
509
+ layers.sort((a, b) => {
510
+ if (b.score !== a.score)
511
+ return b.score - a.score;
512
+ return a.cost - b.cost;
513
+ });
514
+ // Return up to maxLayers
515
+ return layers.slice(0, maxLayers).map(l => l.layer);
516
+ }
517
+ /**
518
+ * Estimate cost for a specific layer.
519
+ * @private
520
+ */
521
+ estimateLayerCost(layer, query) {
522
+ const words = query.trim().split(/\s+/).length;
523
+ switch (layer) {
524
+ case 'lexical':
525
+ return 1 + words * 0.1; // Fast, scales with words
526
+ case 'symbolic':
527
+ return 0.5; // Very fast, constant time
528
+ case 'semantic':
529
+ return 5 + words * 0.5; // Slow, embedding computation
530
+ }
531
+ }
532
+ /**
533
+ * Score lexical layer for query.
534
+ * @private
535
+ */
536
+ scoreLexicalLayer(query, analysis) {
537
+ let score = 50;
538
+ const words = query.trim().split(/\s+/).length;
539
+ const hasOperators = /\b(AND|OR|NOT)\b/.test(query);
540
+ // Good for keyword queries
541
+ if (words >= 2 && words <= 5)
542
+ score += 20;
543
+ if (!hasOperators)
544
+ score += 10;
545
+ // Check analysis for factual questions
546
+ if (analysis?.questionType === 'factual')
547
+ score += 15;
548
+ if (analysis?.questionType === 'aggregation')
549
+ score += 10;
550
+ return score;
551
+ }
552
+ /**
553
+ * Score symbolic layer for query.
554
+ * @private
555
+ */
556
+ scoreSymbolicLayer(query, analysis) {
557
+ let score = 40;
558
+ // Good for temporal queries
559
+ if (analysis?.temporalRange)
560
+ score += 30;
561
+ if (analysis?.questionType === 'temporal')
562
+ score += 25;
563
+ // Good for structured filtering
564
+ const hasFilterKeywords = /\b(type|tag|importance|date|created|modified)\b/i.test(query);
565
+ if (hasFilterKeywords)
566
+ score += 20;
567
+ // If analysis detected entities, might benefit from symbolic
568
+ if (analysis?.entities && analysis.entities.length > 0)
569
+ score += 10;
570
+ return score;
571
+ }
572
+ /**
573
+ * Score semantic layer for query.
574
+ * @private
575
+ */
576
+ scoreSemanticLayer(query, analysis) {
577
+ let score = 45;
578
+ const words = query.trim().split(/\s+/).length;
579
+ const hasOperators = /\b(AND|OR|NOT)\b/.test(query);
580
+ // Good for longer, natural language queries
581
+ if (words >= 5)
582
+ score += 25;
583
+ if (!hasOperators)
584
+ score += 10;
585
+ // Good for conceptual questions
586
+ if (analysis?.questionType === 'conceptual')
587
+ score += 30;
588
+ if (analysis?.questionType === 'comparative')
589
+ score += 20;
590
+ // High complexity benefits from semantic understanding
591
+ if (analysis?.complexity === 'high')
592
+ score += 15;
593
+ return score;
594
+ }
595
+ /**
596
+ * Get extended cost estimate with all Phase 12 features.
597
+ *
598
+ * @param method - The search method
599
+ * @param query - The search query
600
+ * @param entityCount - Number of entities in the graph
601
+ * @param analysis - Optional query analysis
602
+ * @returns Extended cost estimate
603
+ */
604
+ estimateExtended(method, query, entityCount, analysis) {
605
+ const base = this.estimateMethod(method, query, entityCount);
606
+ const adaptiveDepth = this.calculateAdaptiveDepth(query, analysis);
607
+ const estimatedTokens = this.estimateTokens(query, entityCount, adaptiveDepth);
608
+ const recommendedLayers = this.recommendLayers(query, {
609
+ analysis,
610
+ semanticAvailable: method === 'semantic' || true, // Assume available
611
+ });
612
+ const layerCosts = {
613
+ semantic: this.estimateLayerCost('semantic', query) * entityCount * 0.001,
614
+ lexical: this.estimateLayerCost('lexical', query) * entityCount * 0.001,
615
+ symbolic: this.estimateLayerCost('symbolic', query) * entityCount * 0.001,
616
+ };
617
+ return {
618
+ ...base,
619
+ recommendedLayers,
620
+ estimatedTokens,
621
+ adaptiveDepth,
622
+ layerCosts,
623
+ };
624
+ }
625
+ /**
626
+ * Get layers sorted by estimated cost (fastest first).
627
+ *
628
+ * @param query - The search query
629
+ * @param entityCount - Number of entities
630
+ * @param semanticAvailable - Whether semantic search is available
631
+ * @returns Layers sorted by cost
632
+ */
633
+ getLayersByCost(query, entityCount, semanticAvailable = true) {
634
+ const layers = [
635
+ {
636
+ layer: 'symbolic',
637
+ estimatedMs: this.estimateLayerCost('symbolic', query) * Math.log10(entityCount + 1),
638
+ },
639
+ {
640
+ layer: 'lexical',
641
+ estimatedMs: this.estimateLayerCost('lexical', query) * Math.sqrt(entityCount),
642
+ },
643
+ ];
644
+ if (semanticAvailable) {
645
+ layers.push({
646
+ layer: 'semantic',
647
+ estimatedMs: this.estimateLayerCost('semantic', query) * entityCount * 0.1,
648
+ });
649
+ }
650
+ return layers.sort((a, b) => a.estimatedMs - b.estimatedMs);
651
+ }
652
+ }
653
+ //# sourceMappingURL=QueryCostEstimator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryCostEstimator.js","sourceRoot":"","sources":["../../src/search/QueryCostEstimator.ts"],"names":[],"mappings":"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"}