@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,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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"}
|