@soulcraft/brainy 3.0.0 → 3.0.1
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/CHANGELOG.md +53 -3
- package/README.md +353 -110
- package/bin/brainy.js +340 -62
- package/dist/api/ConfigAPI.d.ts +67 -0
- package/dist/api/ConfigAPI.js +166 -0
- package/dist/api/DataAPI.d.ts +123 -0
- package/dist/api/DataAPI.js +391 -0
- package/dist/api/SecurityAPI.d.ts +50 -0
- package/dist/api/SecurityAPI.js +139 -0
- package/dist/api/UniversalImportAPI.d.ts +134 -0
- package/dist/api/UniversalImportAPI.js +615 -0
- package/dist/augmentationManager.js +12 -7
- package/dist/augmentationPipeline.d.ts +0 -61
- package/dist/augmentationPipeline.js +0 -87
- package/dist/augmentationRegistry.d.ts +1 -1
- package/dist/augmentationRegistry.js +1 -1
- package/dist/augmentations/apiServerAugmentation.d.ts +27 -1
- package/dist/augmentations/apiServerAugmentation.js +290 -9
- package/dist/augmentations/auditLogAugmentation.d.ts +109 -0
- package/dist/augmentations/auditLogAugmentation.js +358 -0
- package/dist/augmentations/batchProcessingAugmentation.d.ts +3 -2
- package/dist/augmentations/batchProcessingAugmentation.js +123 -22
- package/dist/augmentations/brainyAugmentation.d.ts +142 -8
- package/dist/augmentations/brainyAugmentation.js +179 -2
- package/dist/augmentations/cacheAugmentation.d.ts +8 -5
- package/dist/augmentations/cacheAugmentation.js +116 -17
- package/dist/augmentations/conduitAugmentations.d.ts +2 -2
- package/dist/augmentations/conduitAugmentations.js +2 -2
- package/dist/augmentations/configResolver.d.ts +122 -0
- package/dist/augmentations/configResolver.js +440 -0
- package/dist/augmentations/connectionPoolAugmentation.d.ts +3 -1
- package/dist/augmentations/connectionPoolAugmentation.js +37 -12
- package/dist/augmentations/defaultAugmentations.d.ts +14 -10
- package/dist/augmentations/defaultAugmentations.js +16 -11
- package/dist/augmentations/discovery/catalogDiscovery.d.ts +142 -0
- package/dist/augmentations/discovery/catalogDiscovery.js +249 -0
- package/dist/augmentations/discovery/localDiscovery.d.ts +84 -0
- package/dist/augmentations/discovery/localDiscovery.js +246 -0
- package/dist/augmentations/discovery/runtimeLoader.d.ts +97 -0
- package/dist/augmentations/discovery/runtimeLoader.js +337 -0
- package/dist/augmentations/discovery.d.ts +152 -0
- package/dist/augmentations/discovery.js +441 -0
- package/dist/augmentations/display/cache.d.ts +130 -0
- package/dist/augmentations/display/cache.js +319 -0
- package/dist/augmentations/display/fieldPatterns.d.ts +52 -0
- package/dist/augmentations/display/fieldPatterns.js +393 -0
- package/dist/augmentations/display/iconMappings.d.ts +57 -0
- package/dist/augmentations/display/iconMappings.js +68 -0
- package/dist/augmentations/display/intelligentComputation.d.ts +109 -0
- package/dist/augmentations/display/intelligentComputation.js +462 -0
- package/dist/augmentations/display/types.d.ts +203 -0
- package/dist/augmentations/display/types.js +7 -0
- package/dist/augmentations/entityRegistryAugmentation.d.ts +3 -1
- package/dist/augmentations/entityRegistryAugmentation.js +5 -1
- package/dist/augmentations/indexAugmentation.d.ts +5 -3
- package/dist/augmentations/indexAugmentation.js +5 -2
- package/dist/augmentations/intelligentVerbScoringAugmentation.d.ts +24 -7
- package/dist/augmentations/intelligentVerbScoringAugmentation.js +111 -27
- package/dist/augmentations/manifest.d.ts +176 -0
- package/dist/augmentations/manifest.js +8 -0
- package/dist/augmentations/marketplace/AugmentationMarketplace.d.ts +168 -0
- package/dist/augmentations/marketplace/AugmentationMarketplace.js +329 -0
- package/dist/augmentations/marketplace/cli.d.ts +47 -0
- package/dist/augmentations/marketplace/cli.js +265 -0
- package/dist/augmentations/metricsAugmentation.d.ts +3 -3
- package/dist/augmentations/metricsAugmentation.js +2 -2
- package/dist/augmentations/monitoringAugmentation.d.ts +3 -3
- package/dist/augmentations/monitoringAugmentation.js +2 -2
- package/dist/augmentations/neuralImport.d.ts +1 -1
- package/dist/augmentations/neuralImport.js +4 -4
- package/dist/augmentations/rateLimitAugmentation.d.ts +82 -0
- package/dist/augmentations/rateLimitAugmentation.js +321 -0
- package/dist/augmentations/requestDeduplicatorAugmentation.d.ts +2 -2
- package/dist/augmentations/requestDeduplicatorAugmentation.js +1 -1
- package/dist/augmentations/storageAugmentation.d.ts +1 -1
- package/dist/augmentations/storageAugmentation.js +2 -2
- package/dist/augmentations/storageAugmentations.d.ts +37 -8
- package/dist/augmentations/storageAugmentations.js +204 -15
- package/dist/augmentations/synapseAugmentation.d.ts +1 -1
- package/dist/augmentations/synapseAugmentation.js +35 -16
- package/dist/augmentations/typeMatching/brainyTypes.d.ts +83 -0
- package/dist/augmentations/typeMatching/brainyTypes.js +425 -0
- package/dist/augmentations/typeMatching/intelligentTypeMatcher.d.ts +39 -59
- package/dist/augmentations/typeMatching/intelligentTypeMatcher.js +103 -389
- package/dist/augmentations/universalDisplayAugmentation.d.ts +191 -0
- package/dist/augmentations/universalDisplayAugmentation.js +371 -0
- package/dist/brainy-unified.d.ts +106 -0
- package/dist/brainy-unified.js +327 -0
- package/dist/brainy.d.ts +273 -0
- package/dist/brainy.js +1181 -0
- package/dist/brainyData.d.ts +56 -111
- package/dist/brainyData.js +912 -756
- package/dist/brainyDataV3.d.ts +186 -0
- package/dist/brainyDataV3.js +337 -0
- package/dist/browserFramework.d.ts +6 -6
- package/dist/browserFramework.js +11 -8
- package/dist/browserFramework.minimal.d.ts +5 -5
- package/dist/browserFramework.minimal.js +11 -8
- package/dist/config/distributedPresets-new.d.ts +118 -0
- package/dist/config/distributedPresets-new.js +318 -0
- package/dist/config/distributedPresets.d.ts +118 -0
- package/dist/config/distributedPresets.js +318 -0
- package/dist/config/extensibleConfig.d.ts +99 -0
- package/dist/config/extensibleConfig.js +268 -0
- package/dist/config/index.d.ts +17 -0
- package/dist/config/index.js +35 -0
- package/dist/config/modelAutoConfig.d.ts +32 -0
- package/dist/config/modelAutoConfig.js +139 -0
- package/dist/config/modelPrecisionManager.d.ts +42 -0
- package/dist/config/modelPrecisionManager.js +98 -0
- package/dist/config/sharedConfigManager.d.ts +67 -0
- package/dist/config/sharedConfigManager.js +215 -0
- package/dist/config/storageAutoConfig.d.ts +41 -0
- package/dist/config/storageAutoConfig.js +328 -0
- package/dist/config/zeroConfig.d.ts +68 -0
- package/dist/config/zeroConfig.js +301 -0
- package/dist/cortex/backupRestore.d.ts +2 -2
- package/dist/cortex/backupRestore.js +85 -27
- package/dist/cortex/healthCheck.d.ts +2 -2
- package/dist/cortex/neuralImport.d.ts +2 -2
- package/dist/cortex/neuralImport.js +18 -13
- package/dist/cortex/performanceMonitor.d.ts +2 -2
- package/dist/critical/model-guardian.d.ts +4 -0
- package/dist/critical/model-guardian.js +31 -11
- package/dist/demo.d.ts +4 -4
- package/dist/demo.js +7 -7
- package/dist/distributed/cacheSync.d.ts +112 -0
- package/dist/distributed/cacheSync.js +265 -0
- package/dist/distributed/coordinator.d.ts +193 -0
- package/dist/distributed/coordinator.js +548 -0
- package/dist/distributed/httpTransport.d.ts +120 -0
- package/dist/distributed/httpTransport.js +446 -0
- package/dist/distributed/index.d.ts +8 -0
- package/dist/distributed/index.js +5 -0
- package/dist/distributed/networkTransport.d.ts +132 -0
- package/dist/distributed/networkTransport.js +633 -0
- package/dist/distributed/queryPlanner.d.ts +104 -0
- package/dist/distributed/queryPlanner.js +327 -0
- package/dist/distributed/readWriteSeparation.d.ts +134 -0
- package/dist/distributed/readWriteSeparation.js +350 -0
- package/dist/distributed/shardManager.d.ts +114 -0
- package/dist/distributed/shardManager.js +357 -0
- package/dist/distributed/shardMigration.d.ts +110 -0
- package/dist/distributed/shardMigration.js +289 -0
- package/dist/distributed/storageDiscovery.d.ts +160 -0
- package/dist/distributed/storageDiscovery.js +551 -0
- package/dist/embeddings/CachedEmbeddings.d.ts +40 -0
- package/dist/embeddings/CachedEmbeddings.js +146 -0
- package/dist/embeddings/EmbeddingManager.d.ts +102 -0
- package/dist/embeddings/EmbeddingManager.js +291 -0
- package/dist/embeddings/SingletonModelManager.d.ts +95 -0
- package/dist/embeddings/SingletonModelManager.js +220 -0
- package/dist/embeddings/index.d.ts +12 -0
- package/dist/embeddings/index.js +16 -0
- package/dist/embeddings/lightweight-embedder.d.ts +0 -1
- package/dist/embeddings/lightweight-embedder.js +4 -12
- package/dist/embeddings/model-manager.d.ts +11 -0
- package/dist/embeddings/model-manager.js +43 -7
- package/dist/embeddings/universal-memory-manager.d.ts +1 -1
- package/dist/embeddings/universal-memory-manager.js +27 -67
- package/dist/embeddings/worker-embedding.js +4 -8
- package/dist/errors/brainyError.d.ts +5 -1
- package/dist/errors/brainyError.js +12 -0
- package/dist/examples/basicUsage.js +7 -4
- package/dist/graph/graphAdjacencyIndex.d.ts +96 -0
- package/dist/graph/graphAdjacencyIndex.js +288 -0
- package/dist/graph/pathfinding.js +4 -2
- package/dist/hnsw/scaledHNSWSystem.js +11 -2
- package/dist/importManager.js +8 -5
- package/dist/index.d.ts +17 -22
- package/dist/index.js +37 -23
- package/dist/mcp/brainyMCPAdapter.d.ts +4 -4
- package/dist/mcp/brainyMCPAdapter.js +5 -5
- package/dist/mcp/brainyMCPService.d.ts +3 -3
- package/dist/mcp/brainyMCPService.js +3 -11
- package/dist/mcp/mcpAugmentationToolset.js +20 -30
- package/dist/neural/embeddedPatterns.d.ts +1 -1
- package/dist/neural/embeddedPatterns.js +2 -2
- package/dist/neural/entityExtractor.d.ts +65 -0
- package/dist/neural/entityExtractor.js +316 -0
- package/dist/neural/improvedNeuralAPI.d.ts +357 -0
- package/dist/neural/improvedNeuralAPI.js +2628 -0
- package/dist/neural/naturalLanguageProcessor.d.ts +155 -10
- package/dist/neural/naturalLanguageProcessor.js +941 -66
- package/dist/neural/naturalLanguageProcessorStatic.d.ts +2 -2
- package/dist/neural/naturalLanguageProcessorStatic.js +3 -3
- package/dist/neural/neuralAPI.js +8 -2
- package/dist/neural/patternLibrary.d.ts +57 -3
- package/dist/neural/patternLibrary.js +348 -13
- package/dist/neural/staticPatternMatcher.d.ts +2 -2
- package/dist/neural/staticPatternMatcher.js +2 -2
- package/dist/neural/types.d.ts +287 -0
- package/dist/neural/types.js +24 -0
- package/dist/shared/default-augmentations.d.ts +3 -3
- package/dist/shared/default-augmentations.js +5 -5
- package/dist/storage/adapters/baseStorageAdapter.d.ts +42 -0
- package/dist/storage/adapters/fileSystemStorage.d.ts +26 -2
- package/dist/storage/adapters/fileSystemStorage.js +218 -15
- package/dist/storage/adapters/memoryStorage.d.ts +4 -4
- package/dist/storage/adapters/memoryStorage.js +17 -12
- package/dist/storage/adapters/opfsStorage.d.ts +2 -2
- package/dist/storage/adapters/opfsStorage.js +2 -2
- package/dist/storage/adapters/s3CompatibleStorage.d.ts +2 -2
- package/dist/storage/adapters/s3CompatibleStorage.js +2 -2
- package/dist/storage/backwardCompatibility.d.ts +10 -78
- package/dist/storage/backwardCompatibility.js +17 -132
- package/dist/storage/baseStorage.d.ts +18 -2
- package/dist/storage/baseStorage.js +74 -3
- package/dist/storage/cacheManager.js +2 -2
- package/dist/storage/readOnlyOptimizations.js +8 -3
- package/dist/streaming/pipeline.d.ts +154 -0
- package/dist/streaming/pipeline.js +551 -0
- package/dist/triple/TripleIntelligence.d.ts +25 -110
- package/dist/triple/TripleIntelligence.js +4 -574
- package/dist/triple/TripleIntelligenceSystem.d.ts +159 -0
- package/dist/triple/TripleIntelligenceSystem.js +519 -0
- package/dist/types/apiTypes.d.ts +278 -0
- package/dist/types/apiTypes.js +33 -0
- package/dist/types/brainy.types.d.ts +308 -0
- package/dist/types/brainy.types.js +8 -0
- package/dist/types/brainyDataInterface.d.ts +5 -8
- package/dist/types/brainyDataInterface.js +2 -2
- package/dist/types/graphTypes.js +2 -2
- package/dist/utils/brainyTypes.d.ts +217 -0
- package/dist/utils/brainyTypes.js +261 -0
- package/dist/utils/cacheAutoConfig.d.ts +3 -3
- package/dist/utils/embedding.d.ts +9 -4
- package/dist/utils/embedding.js +89 -26
- package/dist/utils/enhancedLogger.d.ts +104 -0
- package/dist/utils/enhancedLogger.js +232 -0
- package/dist/utils/hybridModelManager.d.ts +19 -28
- package/dist/utils/hybridModelManager.js +36 -200
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/intelligentTypeMapper.d.ts +60 -0
- package/dist/utils/intelligentTypeMapper.js +349 -0
- package/dist/utils/metadataIndex.d.ts +118 -1
- package/dist/utils/metadataIndex.js +539 -16
- package/dist/utils/nodeVersionCheck.d.ts +24 -0
- package/dist/utils/nodeVersionCheck.js +65 -0
- package/dist/utils/paramValidation.d.ts +39 -0
- package/dist/utils/paramValidation.js +192 -0
- package/dist/utils/rateLimiter.d.ts +160 -0
- package/dist/utils/rateLimiter.js +271 -0
- package/dist/utils/statistics.d.ts +4 -4
- package/dist/utils/statistics.js +3 -3
- package/dist/utils/structuredLogger.d.ts +146 -0
- package/dist/utils/structuredLogger.js +394 -0
- package/dist/utils/textEncoding.js +2 -1
- package/dist/utils/typeValidation.d.ts +59 -0
- package/dist/utils/typeValidation.js +374 -0
- package/dist/utils/version.js +19 -3
- package/package.json +15 -4
- package/scripts/download-models.cjs +94 -20
- package/dist/augmentations/walAugmentation.d.ts +0 -109
- package/dist/augmentations/walAugmentation.js +0 -516
- package/dist/chat/BrainyChat.d.ts +0 -121
- package/dist/chat/BrainyChat.js +0 -396
- package/dist/chat/ChatCLI.d.ts +0 -61
- package/dist/chat/ChatCLI.js +0 -351
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distributed Query Planner for Brainy 3.0
|
|
3
|
+
*
|
|
4
|
+
* Intelligently plans and executes distributed queries across shards
|
|
5
|
+
* Optimizes for data locality, parallelism, and network efficiency
|
|
6
|
+
*/
|
|
7
|
+
import type { StorageAdapter } from '../coreTypes.js';
|
|
8
|
+
import type { DistributedCoordinator } from './coordinator.js';
|
|
9
|
+
import type { ShardManager } from './shardManager.js';
|
|
10
|
+
import type { HTTPTransport } from './httpTransport.js';
|
|
11
|
+
import type { TripleIntelligenceSystem } from '../triple/TripleIntelligenceSystem.js';
|
|
12
|
+
export interface QueryPlan {
|
|
13
|
+
/**
|
|
14
|
+
* Shards that need to be queried
|
|
15
|
+
*/
|
|
16
|
+
shards: string[];
|
|
17
|
+
/**
|
|
18
|
+
* Nodes responsible for each shard
|
|
19
|
+
*/
|
|
20
|
+
nodeAssignments: Map<string, string[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Whether query can be parallelized
|
|
23
|
+
*/
|
|
24
|
+
parallel: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Estimated cost (0-1000)
|
|
27
|
+
*/
|
|
28
|
+
cost: number;
|
|
29
|
+
/**
|
|
30
|
+
* Query strategy
|
|
31
|
+
*/
|
|
32
|
+
strategy: 'broadcast' | 'targeted' | 'scatter-gather' | 'local-only';
|
|
33
|
+
}
|
|
34
|
+
export interface DistributedQueryResult {
|
|
35
|
+
results: any[];
|
|
36
|
+
totalCount: number;
|
|
37
|
+
executionTime: number;
|
|
38
|
+
nodeStats: Map<string, {
|
|
39
|
+
resultsReturned: number;
|
|
40
|
+
executionTime: number;
|
|
41
|
+
errors?: string[];
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
export declare class DistributedQueryPlanner {
|
|
45
|
+
private nodeId;
|
|
46
|
+
private coordinator;
|
|
47
|
+
private shardManager;
|
|
48
|
+
private transport;
|
|
49
|
+
private tripleEngine?;
|
|
50
|
+
private storage;
|
|
51
|
+
constructor(nodeId: string, coordinator: DistributedCoordinator, shardManager: ShardManager, transport: HTTPTransport, storage: StorageAdapter, tripleEngine?: TripleIntelligenceSystem);
|
|
52
|
+
/**
|
|
53
|
+
* Plan a distributed query
|
|
54
|
+
*/
|
|
55
|
+
planQuery(query: any): Promise<QueryPlan>;
|
|
56
|
+
/**
|
|
57
|
+
* Execute a distributed query based on plan
|
|
58
|
+
*/
|
|
59
|
+
executeQuery(query: any, plan: QueryPlan): Promise<DistributedQueryResult>;
|
|
60
|
+
/**
|
|
61
|
+
* Execute query on local shards
|
|
62
|
+
*/
|
|
63
|
+
private executeLocalQuery;
|
|
64
|
+
/**
|
|
65
|
+
* Execute query on remote node
|
|
66
|
+
*/
|
|
67
|
+
private executeRemoteQuery;
|
|
68
|
+
/**
|
|
69
|
+
* Get data from a specific shard
|
|
70
|
+
*/
|
|
71
|
+
private getShardData;
|
|
72
|
+
/**
|
|
73
|
+
* Filter data based on query criteria
|
|
74
|
+
*/
|
|
75
|
+
private filterData;
|
|
76
|
+
/**
|
|
77
|
+
* Check if item matches filter
|
|
78
|
+
*/
|
|
79
|
+
private matchesFilter;
|
|
80
|
+
/**
|
|
81
|
+
* Merge results from multiple nodes using Triple Intelligence
|
|
82
|
+
*/
|
|
83
|
+
private mergeResults;
|
|
84
|
+
/**
|
|
85
|
+
* Simple deduplication of results
|
|
86
|
+
*/
|
|
87
|
+
private deduplicateResults;
|
|
88
|
+
/**
|
|
89
|
+
* Get unique key for result
|
|
90
|
+
*/
|
|
91
|
+
private getResultKey;
|
|
92
|
+
/**
|
|
93
|
+
* Determine query type
|
|
94
|
+
*/
|
|
95
|
+
private getQueryType;
|
|
96
|
+
/**
|
|
97
|
+
* Determine which shards are affected by query
|
|
98
|
+
*/
|
|
99
|
+
private determineAffectedShards;
|
|
100
|
+
/**
|
|
101
|
+
* Optimize query plan based on statistics
|
|
102
|
+
*/
|
|
103
|
+
optimizePlan(plan: QueryPlan): Promise<QueryPlan>;
|
|
104
|
+
}
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distributed Query Planner for Brainy 3.0
|
|
3
|
+
*
|
|
4
|
+
* Intelligently plans and executes distributed queries across shards
|
|
5
|
+
* Optimizes for data locality, parallelism, and network efficiency
|
|
6
|
+
*/
|
|
7
|
+
export class DistributedQueryPlanner {
|
|
8
|
+
constructor(nodeId, coordinator, shardManager, transport, storage, tripleEngine) {
|
|
9
|
+
this.nodeId = nodeId;
|
|
10
|
+
this.coordinator = coordinator;
|
|
11
|
+
this.shardManager = shardManager;
|
|
12
|
+
this.transport = transport;
|
|
13
|
+
this.storage = storage;
|
|
14
|
+
this.tripleEngine = tripleEngine;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Plan a distributed query
|
|
18
|
+
*/
|
|
19
|
+
async planQuery(query) {
|
|
20
|
+
// Determine query type and scope
|
|
21
|
+
const queryType = this.getQueryType(query);
|
|
22
|
+
const affectedShards = await this.determineAffectedShards(query);
|
|
23
|
+
// Get current shard assignments
|
|
24
|
+
const assignments = new Map();
|
|
25
|
+
for (const shardId of affectedShards) {
|
|
26
|
+
const nodes = await this.shardManager.getNodesForShard(shardId);
|
|
27
|
+
assignments.set(shardId, nodes);
|
|
28
|
+
}
|
|
29
|
+
// Determine strategy based on query characteristics
|
|
30
|
+
let strategy = 'scatter-gather';
|
|
31
|
+
let cost = 0;
|
|
32
|
+
if (affectedShards.length === 0) {
|
|
33
|
+
// Local only query
|
|
34
|
+
strategy = 'local-only';
|
|
35
|
+
cost = 1;
|
|
36
|
+
}
|
|
37
|
+
else if (affectedShards.length === this.shardManager.getTotalShards()) {
|
|
38
|
+
// Full table scan
|
|
39
|
+
strategy = 'broadcast';
|
|
40
|
+
cost = 1000;
|
|
41
|
+
}
|
|
42
|
+
else if (affectedShards.length <= 3) {
|
|
43
|
+
// Targeted query
|
|
44
|
+
strategy = 'targeted';
|
|
45
|
+
cost = affectedShards.length * 10;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// Scatter-gather for medium queries
|
|
49
|
+
strategy = 'scatter-gather';
|
|
50
|
+
cost = affectedShards.length * 50;
|
|
51
|
+
}
|
|
52
|
+
// Add network cost
|
|
53
|
+
const remoteShards = affectedShards.filter(shardId => {
|
|
54
|
+
const nodes = assignments.get(shardId) || [];
|
|
55
|
+
return !nodes.includes(this.nodeId);
|
|
56
|
+
});
|
|
57
|
+
cost += remoteShards.length * 20;
|
|
58
|
+
return {
|
|
59
|
+
shards: affectedShards,
|
|
60
|
+
nodeAssignments: assignments,
|
|
61
|
+
parallel: affectedShards.length > 1,
|
|
62
|
+
cost,
|
|
63
|
+
strategy
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Execute a distributed query based on plan
|
|
68
|
+
*/
|
|
69
|
+
async executeQuery(query, plan) {
|
|
70
|
+
const startTime = Date.now();
|
|
71
|
+
const nodeStats = new Map();
|
|
72
|
+
// Group shards by node for efficient batching
|
|
73
|
+
const nodeToShards = new Map();
|
|
74
|
+
for (const [shardId, nodes] of plan.nodeAssignments) {
|
|
75
|
+
// Pick the first available node (could be optimized)
|
|
76
|
+
const targetNode = nodes[0];
|
|
77
|
+
if (!nodeToShards.has(targetNode)) {
|
|
78
|
+
nodeToShards.set(targetNode, []);
|
|
79
|
+
}
|
|
80
|
+
nodeToShards.get(targetNode).push(shardId);
|
|
81
|
+
}
|
|
82
|
+
// Execute queries in parallel
|
|
83
|
+
const promises = [];
|
|
84
|
+
for (const [targetNode, shards] of nodeToShards) {
|
|
85
|
+
if (targetNode === this.nodeId) {
|
|
86
|
+
// Local execution
|
|
87
|
+
promises.push(this.executeLocalQuery(query, shards));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// Remote execution
|
|
91
|
+
promises.push(this.executeRemoteQuery(targetNode, query, shards));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Wait for all results
|
|
95
|
+
const results = await Promise.allSettled(promises);
|
|
96
|
+
// Aggregate results
|
|
97
|
+
const allResults = [];
|
|
98
|
+
let totalCount = 0;
|
|
99
|
+
let nodeIndex = 0;
|
|
100
|
+
for (const [targetNode, shards] of nodeToShards) {
|
|
101
|
+
const result = results[nodeIndex];
|
|
102
|
+
const nodeTime = Date.now() - startTime;
|
|
103
|
+
if (result.status === 'fulfilled') {
|
|
104
|
+
const nodeResult = result.value;
|
|
105
|
+
allResults.push(...(nodeResult.results || []));
|
|
106
|
+
totalCount += nodeResult.count || 0;
|
|
107
|
+
nodeStats.set(targetNode, {
|
|
108
|
+
resultsReturned: nodeResult.count || 0,
|
|
109
|
+
executionTime: nodeTime,
|
|
110
|
+
shards
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
nodeStats.set(targetNode, {
|
|
115
|
+
resultsReturned: 0,
|
|
116
|
+
executionTime: nodeTime,
|
|
117
|
+
errors: [result.reason?.message || 'Unknown error'],
|
|
118
|
+
shards
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
nodeIndex++;
|
|
122
|
+
}
|
|
123
|
+
// Merge and rank results using Triple Intelligence if available
|
|
124
|
+
const mergedResults = await this.mergeResults(allResults, query);
|
|
125
|
+
return {
|
|
126
|
+
results: mergedResults,
|
|
127
|
+
totalCount,
|
|
128
|
+
executionTime: Date.now() - startTime,
|
|
129
|
+
nodeStats
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Execute query on local shards
|
|
134
|
+
*/
|
|
135
|
+
async executeLocalQuery(query, shards) {
|
|
136
|
+
const results = [];
|
|
137
|
+
for (const shardId of shards) {
|
|
138
|
+
// Get data from storage for this shard
|
|
139
|
+
const shardData = await this.getShardData(shardId, query);
|
|
140
|
+
results.push(...shardData);
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
results,
|
|
144
|
+
count: results.length
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Execute query on remote node
|
|
149
|
+
*/
|
|
150
|
+
async executeRemoteQuery(targetNode, query, shards) {
|
|
151
|
+
try {
|
|
152
|
+
const response = await this.transport.call(targetNode, 'query', {
|
|
153
|
+
query,
|
|
154
|
+
shards
|
|
155
|
+
});
|
|
156
|
+
return response || { results: [], count: 0 };
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.error(`Failed to query node ${targetNode}:`, error);
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get data from a specific shard
|
|
165
|
+
*/
|
|
166
|
+
async getShardData(shardId, query) {
|
|
167
|
+
// This would interact with the actual storage adapter
|
|
168
|
+
// For now, return empty array since storage adapters don't have direct shard access
|
|
169
|
+
// In a real implementation, this would use storage-specific methods
|
|
170
|
+
try {
|
|
171
|
+
// Would need to implement shard-aware storage methods
|
|
172
|
+
// For now, return empty to allow compilation
|
|
173
|
+
return [];
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
console.error(`Failed to get shard ${shardId} data:`, error);
|
|
177
|
+
return [];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Filter data based on query criteria
|
|
182
|
+
*/
|
|
183
|
+
filterData(data, query) {
|
|
184
|
+
if (!Array.isArray(data))
|
|
185
|
+
return [];
|
|
186
|
+
// Apply query filters
|
|
187
|
+
let filtered = data;
|
|
188
|
+
if (query.filter) {
|
|
189
|
+
filtered = filtered.filter((item) => {
|
|
190
|
+
// Apply filter logic
|
|
191
|
+
return this.matchesFilter(item, query.filter);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
if (query.limit) {
|
|
195
|
+
filtered = filtered.slice(0, query.limit);
|
|
196
|
+
}
|
|
197
|
+
return filtered;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if item matches filter
|
|
201
|
+
*/
|
|
202
|
+
matchesFilter(item, filter) {
|
|
203
|
+
// Simple filter matching
|
|
204
|
+
for (const [key, value] of Object.entries(filter)) {
|
|
205
|
+
if (item[key] !== value) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Merge results from multiple nodes using Triple Intelligence
|
|
213
|
+
*/
|
|
214
|
+
async mergeResults(results, query) {
|
|
215
|
+
if (!this.tripleEngine) {
|
|
216
|
+
// Simple merge without Triple Intelligence
|
|
217
|
+
return this.deduplicateResults(results);
|
|
218
|
+
}
|
|
219
|
+
// Use Triple Intelligence for intelligent merging
|
|
220
|
+
// Merge results by combining scores and maintaining order
|
|
221
|
+
const mergedMap = new Map();
|
|
222
|
+
for (const result of results) {
|
|
223
|
+
const id = result.id || result.entity?.id;
|
|
224
|
+
if (!id)
|
|
225
|
+
continue;
|
|
226
|
+
if (mergedMap.has(id)) {
|
|
227
|
+
// Merge duplicate results by averaging scores
|
|
228
|
+
const existing = mergedMap.get(id);
|
|
229
|
+
existing.score = (existing.score + (result.score || 0)) / 2;
|
|
230
|
+
// Preserve highest confidence metadata
|
|
231
|
+
if (result.confidence > existing.confidence) {
|
|
232
|
+
existing.metadata = { ...existing.metadata, ...result.metadata };
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
mergedMap.set(id, { ...result });
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Sort by score and return
|
|
240
|
+
return Array.from(mergedMap.values())
|
|
241
|
+
.sort((a, b) => (b.score || 0) - (a.score || 0));
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Simple deduplication of results
|
|
245
|
+
*/
|
|
246
|
+
deduplicateResults(results) {
|
|
247
|
+
const seen = new Set();
|
|
248
|
+
const deduplicated = [];
|
|
249
|
+
for (const result of results) {
|
|
250
|
+
const key = this.getResultKey(result);
|
|
251
|
+
if (!seen.has(key)) {
|
|
252
|
+
seen.add(key);
|
|
253
|
+
deduplicated.push(result);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return deduplicated;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get unique key for result
|
|
260
|
+
*/
|
|
261
|
+
getResultKey(result) {
|
|
262
|
+
if (result.id)
|
|
263
|
+
return result.id;
|
|
264
|
+
if (result.uuid)
|
|
265
|
+
return result.uuid;
|
|
266
|
+
return JSON.stringify(result);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Determine query type
|
|
270
|
+
*/
|
|
271
|
+
getQueryType(query) {
|
|
272
|
+
if (query.vector)
|
|
273
|
+
return 'vector';
|
|
274
|
+
if (query.triple)
|
|
275
|
+
return 'triple';
|
|
276
|
+
if (query.filter)
|
|
277
|
+
return 'filter';
|
|
278
|
+
return 'scan';
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Determine which shards are affected by query
|
|
282
|
+
*/
|
|
283
|
+
async determineAffectedShards(query) {
|
|
284
|
+
const totalShards = this.shardManager.getTotalShards();
|
|
285
|
+
const affectedShards = [];
|
|
286
|
+
// If query has specific entity/key, determine shard
|
|
287
|
+
if (query.entity || query.key) {
|
|
288
|
+
const key = query.entity || query.key;
|
|
289
|
+
const assignment = this.shardManager.getShardForKey(key);
|
|
290
|
+
if (assignment) {
|
|
291
|
+
return [assignment.shardId];
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// If query has partition hint
|
|
295
|
+
if (query.partition) {
|
|
296
|
+
return [query.partition];
|
|
297
|
+
}
|
|
298
|
+
// Otherwise, query all shards (broadcast)
|
|
299
|
+
for (let i = 0; i < totalShards; i++) {
|
|
300
|
+
affectedShards.push(`shard-${i}`);
|
|
301
|
+
}
|
|
302
|
+
return affectedShards;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Optimize query plan based on statistics
|
|
306
|
+
*/
|
|
307
|
+
async optimizePlan(plan) {
|
|
308
|
+
// Get node health and latency stats
|
|
309
|
+
const nodeHealth = await this.coordinator.getHealth();
|
|
310
|
+
// Re-assign shards to healthier nodes if needed
|
|
311
|
+
const optimizedAssignments = new Map();
|
|
312
|
+
for (const [shardId, nodes] of plan.nodeAssignments) {
|
|
313
|
+
// Sort nodes by health score (simple heuristic)
|
|
314
|
+
const sortedNodes = nodes.sort((a, b) => {
|
|
315
|
+
// Higher health score = better node
|
|
316
|
+
// For now, use a simple approach
|
|
317
|
+
return 0;
|
|
318
|
+
});
|
|
319
|
+
optimizedAssignments.set(shardId, sortedNodes);
|
|
320
|
+
}
|
|
321
|
+
return {
|
|
322
|
+
...plan,
|
|
323
|
+
nodeAssignments: optimizedAssignments
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=queryPlanner.js.map
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read/Write Separation for Distributed Scaling
|
|
3
|
+
* Implements primary-replica architecture for scalable reads
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
import { DistributedCoordinator } from './coordinator.js';
|
|
7
|
+
import { ShardManager } from './shardManager.js';
|
|
8
|
+
import { CacheSync } from './cacheSync.js';
|
|
9
|
+
export interface ReplicationConfig {
|
|
10
|
+
nodeId: string;
|
|
11
|
+
role?: 'primary' | 'replica' | 'auto';
|
|
12
|
+
primaryUrl?: string;
|
|
13
|
+
replicaUrls?: string[];
|
|
14
|
+
syncInterval?: number;
|
|
15
|
+
readPreference?: 'primary' | 'replica' | 'nearest';
|
|
16
|
+
consistencyLevel?: 'eventual' | 'strong' | 'bounded';
|
|
17
|
+
maxStaleness?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface WriteOperation {
|
|
20
|
+
id: string;
|
|
21
|
+
type: 'add' | 'update' | 'delete';
|
|
22
|
+
data: any;
|
|
23
|
+
timestamp: number;
|
|
24
|
+
version: number;
|
|
25
|
+
}
|
|
26
|
+
export interface ReplicationLog {
|
|
27
|
+
operations: WriteOperation[];
|
|
28
|
+
lastSequence: number;
|
|
29
|
+
primaryVersion: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Read/Write Separation Manager
|
|
33
|
+
*/
|
|
34
|
+
export declare class ReadWriteSeparation extends EventEmitter {
|
|
35
|
+
private nodeId;
|
|
36
|
+
private role;
|
|
37
|
+
private coordinator;
|
|
38
|
+
private cacheSync;
|
|
39
|
+
private replicationLog;
|
|
40
|
+
private replicas;
|
|
41
|
+
private primaryConnection?;
|
|
42
|
+
private config;
|
|
43
|
+
private syncTimer?;
|
|
44
|
+
private isRunning;
|
|
45
|
+
constructor(config: ReplicationConfig, coordinator: DistributedCoordinator, _shardManager: ShardManager, cacheSync: CacheSync);
|
|
46
|
+
/**
|
|
47
|
+
* Start read/write separation
|
|
48
|
+
*/
|
|
49
|
+
start(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Stop read/write separation
|
|
52
|
+
*/
|
|
53
|
+
stop(): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Execute a write operation (primary only)
|
|
56
|
+
*/
|
|
57
|
+
write(operation: Omit<WriteOperation, 'id' | 'timestamp' | 'version'>): Promise<string>;
|
|
58
|
+
/**
|
|
59
|
+
* Execute a read operation
|
|
60
|
+
*/
|
|
61
|
+
read(key: string, options?: {
|
|
62
|
+
consistency?: 'eventual' | 'strong';
|
|
63
|
+
}): Promise<any>;
|
|
64
|
+
/**
|
|
65
|
+
* Get replication lag (replica only)
|
|
66
|
+
*/
|
|
67
|
+
getReplicationLag(): number;
|
|
68
|
+
/**
|
|
69
|
+
* Setup connections based on role
|
|
70
|
+
*/
|
|
71
|
+
private setupConnections;
|
|
72
|
+
/**
|
|
73
|
+
* Start as primary node
|
|
74
|
+
*/
|
|
75
|
+
private startAsPrimary;
|
|
76
|
+
/**
|
|
77
|
+
* Start as replica node
|
|
78
|
+
*/
|
|
79
|
+
private startAsReplica;
|
|
80
|
+
/**
|
|
81
|
+
* Sync replicas (primary only)
|
|
82
|
+
*/
|
|
83
|
+
private syncReplicas;
|
|
84
|
+
/**
|
|
85
|
+
* Sync from primary (replica only)
|
|
86
|
+
*/
|
|
87
|
+
private syncFromPrimary;
|
|
88
|
+
/**
|
|
89
|
+
* Apply a replicated operation
|
|
90
|
+
*/
|
|
91
|
+
private applyOperation;
|
|
92
|
+
/**
|
|
93
|
+
* Propagate operation to replicas
|
|
94
|
+
*/
|
|
95
|
+
private propagateToReplicas;
|
|
96
|
+
/**
|
|
97
|
+
* Determine role automatically
|
|
98
|
+
*/
|
|
99
|
+
private determineRole;
|
|
100
|
+
/**
|
|
101
|
+
* Read from local storage
|
|
102
|
+
*/
|
|
103
|
+
private readLocal;
|
|
104
|
+
/**
|
|
105
|
+
* Generate unique operation ID
|
|
106
|
+
*/
|
|
107
|
+
private generateOperationId;
|
|
108
|
+
/**
|
|
109
|
+
* Get replication statistics
|
|
110
|
+
*/
|
|
111
|
+
getStats(): {
|
|
112
|
+
role: string;
|
|
113
|
+
replicas: number;
|
|
114
|
+
replicationLag: number;
|
|
115
|
+
operationsInLog: number;
|
|
116
|
+
primaryVersion: number;
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Check if node can accept writes
|
|
120
|
+
*/
|
|
121
|
+
canWrite(): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Check if node can serve reads
|
|
124
|
+
*/
|
|
125
|
+
canRead(): boolean;
|
|
126
|
+
/**
|
|
127
|
+
* Set whether this node is primary (for leader election integration)
|
|
128
|
+
*/
|
|
129
|
+
setPrimary(isPrimary: boolean): void;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Create read/write separation manager
|
|
133
|
+
*/
|
|
134
|
+
export declare function createReadWriteSeparation(config: ReplicationConfig, coordinator: DistributedCoordinator, shardManager: ShardManager, cacheSync: CacheSync): ReadWriteSeparation;
|