@nahisaho/yata-scale 1.8.5
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/README.md +66 -0
- package/dist/CacheManager.d.ts +107 -0
- package/dist/CacheManager.d.ts.map +1 -0
- package/dist/CacheManager.js +343 -0
- package/dist/CacheManager.js.map +1 -0
- package/dist/IndexManager.d.ts +103 -0
- package/dist/IndexManager.d.ts.map +1 -0
- package/dist/IndexManager.js +385 -0
- package/dist/IndexManager.js.map +1 -0
- package/dist/MigrationHelper.d.ts +91 -0
- package/dist/MigrationHelper.d.ts.map +1 -0
- package/dist/MigrationHelper.js +220 -0
- package/dist/MigrationHelper.js.map +1 -0
- package/dist/QueryCoordinator.d.ts +76 -0
- package/dist/QueryCoordinator.d.ts.map +1 -0
- package/dist/QueryCoordinator.js +298 -0
- package/dist/QueryCoordinator.js.map +1 -0
- package/dist/ShardManager.d.ts +48 -0
- package/dist/ShardManager.d.ts.map +1 -0
- package/dist/ShardManager.js +193 -0
- package/dist/ShardManager.js.map +1 -0
- package/dist/SyncController.d.ts +102 -0
- package/dist/SyncController.d.ts.map +1 -0
- package/dist/SyncController.js +286 -0
- package/dist/SyncController.js.map +1 -0
- package/dist/YataScaleManager.d.ts +75 -0
- package/dist/YataScaleManager.d.ts.map +1 -0
- package/dist/YataScaleManager.js +265 -0
- package/dist/YataScaleManager.js.map +1 -0
- package/dist/cache/CacheManager.d.ts +116 -0
- package/dist/cache/CacheManager.d.ts.map +1 -0
- package/dist/cache/CacheManager.js +286 -0
- package/dist/cache/CacheManager.js.map +1 -0
- package/dist/cache/InvalidationManager.d.ts +91 -0
- package/dist/cache/InvalidationManager.d.ts.map +1 -0
- package/dist/cache/InvalidationManager.js +155 -0
- package/dist/cache/InvalidationManager.js.map +1 -0
- package/dist/cache/L1Cache.d.ts +97 -0
- package/dist/cache/L1Cache.d.ts.map +1 -0
- package/dist/cache/L1Cache.js +225 -0
- package/dist/cache/L1Cache.js.map +1 -0
- package/dist/cache/L2Cache.d.ts +93 -0
- package/dist/cache/L2Cache.d.ts.map +1 -0
- package/dist/cache/L2Cache.js +248 -0
- package/dist/cache/L2Cache.js.map +1 -0
- package/dist/cache/L3Cache.d.ts +101 -0
- package/dist/cache/L3Cache.d.ts.map +1 -0
- package/dist/cache/L3Cache.js +229 -0
- package/dist/cache/L3Cache.js.map +1 -0
- package/dist/cache/index.d.ts +12 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +11 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/errors.d.ts +255 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +515 -0
- package/dist/errors.js.map +1 -0
- package/dist/index/BPlusTreeIndex.d.ts +101 -0
- package/dist/index/BPlusTreeIndex.d.ts.map +1 -0
- package/dist/index/BPlusTreeIndex.js +310 -0
- package/dist/index/BPlusTreeIndex.js.map +1 -0
- package/dist/index/BloomFilter.d.ts +85 -0
- package/dist/index/BloomFilter.d.ts.map +1 -0
- package/dist/index/BloomFilter.js +215 -0
- package/dist/index/BloomFilter.js.map +1 -0
- package/dist/index/FullTextIndex.d.ts +87 -0
- package/dist/index/FullTextIndex.d.ts.map +1 -0
- package/dist/index/FullTextIndex.js +213 -0
- package/dist/index/FullTextIndex.js.map +1 -0
- package/dist/index/GraphIndex.d.ts +116 -0
- package/dist/index/GraphIndex.d.ts.map +1 -0
- package/dist/index/GraphIndex.js +308 -0
- package/dist/index/GraphIndex.js.map +1 -0
- package/dist/index/IndexManager.d.ts +105 -0
- package/dist/index/IndexManager.d.ts.map +1 -0
- package/dist/index/IndexManager.js +287 -0
- package/dist/index/IndexManager.js.map +1 -0
- package/dist/index/index.d.ts +12 -0
- package/dist/index/index.d.ts.map +1 -0
- package/dist/index/index.js +11 -0
- package/dist/index/index.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/query/DistributedExecutor.d.ts +78 -0
- package/dist/query/DistributedExecutor.d.ts.map +1 -0
- package/dist/query/DistributedExecutor.js +232 -0
- package/dist/query/DistributedExecutor.js.map +1 -0
- package/dist/query/QueryCoordinator.d.ts +98 -0
- package/dist/query/QueryCoordinator.d.ts.map +1 -0
- package/dist/query/QueryCoordinator.js +246 -0
- package/dist/query/QueryCoordinator.js.map +1 -0
- package/dist/query/QueryPlanner.d.ts +88 -0
- package/dist/query/QueryPlanner.d.ts.map +1 -0
- package/dist/query/QueryPlanner.js +235 -0
- package/dist/query/QueryPlanner.js.map +1 -0
- package/dist/query/WorkerPool.d.ts +108 -0
- package/dist/query/WorkerPool.d.ts.map +1 -0
- package/dist/query/WorkerPool.js +195 -0
- package/dist/query/WorkerPool.js.map +1 -0
- package/dist/query/index.d.ts +11 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +10 -0
- package/dist/query/index.js.map +1 -0
- package/dist/shard/GraphPartitionStrategy.d.ts +65 -0
- package/dist/shard/GraphPartitionStrategy.d.ts.map +1 -0
- package/dist/shard/GraphPartitionStrategy.js +208 -0
- package/dist/shard/GraphPartitionStrategy.js.map +1 -0
- package/dist/shard/HashPartitionStrategy.d.ts +56 -0
- package/dist/shard/HashPartitionStrategy.d.ts.map +1 -0
- package/dist/shard/HashPartitionStrategy.js +169 -0
- package/dist/shard/HashPartitionStrategy.js.map +1 -0
- package/dist/shard/RangePartitionStrategy.d.ts +63 -0
- package/dist/shard/RangePartitionStrategy.d.ts.map +1 -0
- package/dist/shard/RangePartitionStrategy.js +157 -0
- package/dist/shard/RangePartitionStrategy.js.map +1 -0
- package/dist/shard/Rebalancer.d.ts +70 -0
- package/dist/shard/Rebalancer.d.ts.map +1 -0
- package/dist/shard/Rebalancer.js +184 -0
- package/dist/shard/Rebalancer.js.map +1 -0
- package/dist/shard/ShardManager.d.ts +123 -0
- package/dist/shard/ShardManager.d.ts.map +1 -0
- package/dist/shard/ShardManager.js +353 -0
- package/dist/shard/ShardManager.js.map +1 -0
- package/dist/shard/ShardRouter.d.ts +102 -0
- package/dist/shard/ShardRouter.d.ts.map +1 -0
- package/dist/shard/ShardRouter.js +181 -0
- package/dist/shard/ShardRouter.js.map +1 -0
- package/dist/shard/index.d.ts +13 -0
- package/dist/shard/index.d.ts.map +1 -0
- package/dist/shard/index.js +12 -0
- package/dist/shard/index.js.map +1 -0
- package/dist/sync/ConflictResolver.d.ts +71 -0
- package/dist/sync/ConflictResolver.d.ts.map +1 -0
- package/dist/sync/ConflictResolver.js +214 -0
- package/dist/sync/ConflictResolver.js.map +1 -0
- package/dist/sync/SyncController.d.ts +150 -0
- package/dist/sync/SyncController.d.ts.map +1 -0
- package/dist/sync/SyncController.js +304 -0
- package/dist/sync/SyncController.js.map +1 -0
- package/dist/sync/VectorClock.d.ts +102 -0
- package/dist/sync/VectorClock.d.ts.map +1 -0
- package/dist/sync/VectorClock.js +189 -0
- package/dist/sync/VectorClock.js.map +1 -0
- package/dist/sync/WALManager.d.ts +120 -0
- package/dist/sync/WALManager.d.ts.map +1 -0
- package/dist/sync/WALManager.js +240 -0
- package/dist/sync/WALManager.js.map +1 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +10 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/types.d.ts +323 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - L1 Cache (Hot)
|
|
3
|
+
*
|
|
4
|
+
* In-memory LRU cache for frequently accessed data
|
|
5
|
+
*/
|
|
6
|
+
import { LRUCache } from 'lru-cache';
|
|
7
|
+
/**
|
|
8
|
+
* L1 Cache - Hot tier, in-memory LRU
|
|
9
|
+
*/
|
|
10
|
+
export class L1Cache {
|
|
11
|
+
entityCache;
|
|
12
|
+
relationshipCache;
|
|
13
|
+
hits = 0;
|
|
14
|
+
misses = 0;
|
|
15
|
+
constructor(maxEntries = 10000) {
|
|
16
|
+
const options = {
|
|
17
|
+
max: maxEntries,
|
|
18
|
+
updateAgeOnGet: true,
|
|
19
|
+
updateAgeOnHas: true,
|
|
20
|
+
};
|
|
21
|
+
this.entityCache = new LRUCache(options);
|
|
22
|
+
this.relationshipCache = new LRUCache(options);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get entity from cache
|
|
26
|
+
*/
|
|
27
|
+
getEntity(id) {
|
|
28
|
+
const entry = this.entityCache.get(id);
|
|
29
|
+
if (entry) {
|
|
30
|
+
this.hits++;
|
|
31
|
+
entry.accessCount++;
|
|
32
|
+
entry.lastAccess = new Date();
|
|
33
|
+
return entry.value;
|
|
34
|
+
}
|
|
35
|
+
this.misses++;
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Set entity in cache
|
|
40
|
+
*/
|
|
41
|
+
setEntity(entity) {
|
|
42
|
+
this.entityCache.set(entity.id, {
|
|
43
|
+
value: entity,
|
|
44
|
+
accessCount: 1,
|
|
45
|
+
lastAccess: new Date(),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Delete entity from cache
|
|
50
|
+
*/
|
|
51
|
+
deleteEntity(id) {
|
|
52
|
+
return this.entityCache.delete(id);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get relationship from cache
|
|
56
|
+
*/
|
|
57
|
+
getRelationship(id) {
|
|
58
|
+
const entry = this.relationshipCache.get(id);
|
|
59
|
+
if (entry) {
|
|
60
|
+
this.hits++;
|
|
61
|
+
entry.accessCount++;
|
|
62
|
+
entry.lastAccess = new Date();
|
|
63
|
+
return entry.value;
|
|
64
|
+
}
|
|
65
|
+
this.misses++;
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Set relationship in cache
|
|
70
|
+
*/
|
|
71
|
+
setRelationship(relationship) {
|
|
72
|
+
this.relationshipCache.set(relationship.id, {
|
|
73
|
+
value: relationship,
|
|
74
|
+
accessCount: 1,
|
|
75
|
+
lastAccess: new Date(),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Delete relationship from cache
|
|
80
|
+
*/
|
|
81
|
+
deleteRelationship(id) {
|
|
82
|
+
return this.relationshipCache.delete(id);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check if entity exists in cache
|
|
86
|
+
*/
|
|
87
|
+
hasEntity(id) {
|
|
88
|
+
return this.entityCache.has(id);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check if relationship exists in cache
|
|
92
|
+
*/
|
|
93
|
+
hasRelationship(id) {
|
|
94
|
+
return this.relationshipCache.has(id);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get multiple entities
|
|
98
|
+
*/
|
|
99
|
+
getEntities(ids) {
|
|
100
|
+
const result = new Map();
|
|
101
|
+
for (const id of ids) {
|
|
102
|
+
const entity = this.getEntity(id);
|
|
103
|
+
if (entity) {
|
|
104
|
+
result.set(id, entity);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Set multiple entities
|
|
111
|
+
*/
|
|
112
|
+
setEntities(entities) {
|
|
113
|
+
for (const entity of entities) {
|
|
114
|
+
this.setEntity(entity);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Clear all caches
|
|
119
|
+
*/
|
|
120
|
+
clear() {
|
|
121
|
+
this.entityCache.clear();
|
|
122
|
+
this.relationshipCache.clear();
|
|
123
|
+
this.hits = 0;
|
|
124
|
+
this.misses = 0;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get hot keys (most accessed)
|
|
128
|
+
*/
|
|
129
|
+
getHotKeys(limit = 10) {
|
|
130
|
+
const entries = [];
|
|
131
|
+
for (const [key, entry] of this.entityCache.entries()) {
|
|
132
|
+
entries.push({ key, accessCount: entry.accessCount });
|
|
133
|
+
}
|
|
134
|
+
for (const [key, entry] of this.relationshipCache.entries()) {
|
|
135
|
+
entries.push({ key, accessCount: entry.accessCount });
|
|
136
|
+
}
|
|
137
|
+
return entries
|
|
138
|
+
.sort((a, b) => b.accessCount - a.accessCount)
|
|
139
|
+
.slice(0, limit)
|
|
140
|
+
.map((e) => e.key);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Prewarm cache with entities
|
|
144
|
+
*/
|
|
145
|
+
prewarm(entities) {
|
|
146
|
+
for (const entity of entities) {
|
|
147
|
+
this.setEntity(entity);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get cache statistics
|
|
152
|
+
*/
|
|
153
|
+
getStats() {
|
|
154
|
+
const total = this.hits + this.misses;
|
|
155
|
+
return {
|
|
156
|
+
tier: 'L1',
|
|
157
|
+
hitCount: this.hits,
|
|
158
|
+
missCount: this.misses,
|
|
159
|
+
hitRate: total > 0 ? this.hits / total : 0,
|
|
160
|
+
entryCount: this.entityCache.size + this.relationshipCache.size,
|
|
161
|
+
sizeBytes: this.estimateSize(),
|
|
162
|
+
evictionCount: 0, // LRU cache doesn't expose this directly
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Estimate memory size
|
|
167
|
+
*/
|
|
168
|
+
estimateSize() {
|
|
169
|
+
let size = 0;
|
|
170
|
+
for (const [, entry] of this.entityCache.entries()) {
|
|
171
|
+
size += this.estimateEntitySize(entry.value);
|
|
172
|
+
}
|
|
173
|
+
for (const [, entry] of this.relationshipCache.entries()) {
|
|
174
|
+
size += this.estimateRelationshipSize(entry.value);
|
|
175
|
+
}
|
|
176
|
+
return size;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Estimate entity size in bytes
|
|
180
|
+
*/
|
|
181
|
+
estimateEntitySize(entity) {
|
|
182
|
+
// Rough estimate based on string lengths and object overhead
|
|
183
|
+
let size = 100; // Base overhead
|
|
184
|
+
size += entity.id.length * 2;
|
|
185
|
+
size += entity.name.length * 2;
|
|
186
|
+
size += entity.type.length * 2;
|
|
187
|
+
size += (entity.namespace?.length ?? 0) * 2;
|
|
188
|
+
// Attributes
|
|
189
|
+
for (const [key, value] of Object.entries(entity.attributes)) {
|
|
190
|
+
size += key.length * 2;
|
|
191
|
+
size += String(value).length * 2;
|
|
192
|
+
}
|
|
193
|
+
return size;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Estimate relationship size in bytes
|
|
197
|
+
*/
|
|
198
|
+
estimateRelationshipSize(rel) {
|
|
199
|
+
let size = 100;
|
|
200
|
+
size += rel.id.length * 2;
|
|
201
|
+
size += rel.sourceId.length * 2;
|
|
202
|
+
size += rel.targetId.length * 2;
|
|
203
|
+
size += rel.type.length * 2;
|
|
204
|
+
return size;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get entity count
|
|
208
|
+
*/
|
|
209
|
+
get entityCount() {
|
|
210
|
+
return this.entityCache.size;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get relationship count
|
|
214
|
+
*/
|
|
215
|
+
get relationshipCount() {
|
|
216
|
+
return this.relationshipCache.size;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get total entry count
|
|
220
|
+
*/
|
|
221
|
+
get size() {
|
|
222
|
+
return this.entityCache.size + this.relationshipCache.size;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=L1Cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"L1Cache.js","sourceRoot":"","sources":["../../src/cache/L1Cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - L2 Cache (Warm)
|
|
3
|
+
*
|
|
4
|
+
* Compressed in-memory cache for warm data
|
|
5
|
+
*/
|
|
6
|
+
import type { CacheStats, Entity, Relationship } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* L2 Cache - Warm tier with compression
|
|
9
|
+
*/
|
|
10
|
+
export declare class L2Cache {
|
|
11
|
+
private readonly entities;
|
|
12
|
+
private readonly relationships;
|
|
13
|
+
private readonly maxSize;
|
|
14
|
+
private currentSize;
|
|
15
|
+
private hits;
|
|
16
|
+
private misses;
|
|
17
|
+
private evictions;
|
|
18
|
+
constructor(maxSizeBytes?: number);
|
|
19
|
+
/**
|
|
20
|
+
* Get entity from cache
|
|
21
|
+
*/
|
|
22
|
+
getEntity(id: string): Entity | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Set entity in cache
|
|
25
|
+
*/
|
|
26
|
+
setEntity(entity: Entity): void;
|
|
27
|
+
/**
|
|
28
|
+
* Delete entity from cache
|
|
29
|
+
*/
|
|
30
|
+
deleteEntity(id: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Get relationship from cache
|
|
33
|
+
*/
|
|
34
|
+
getRelationship(id: string): Relationship | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Set relationship in cache
|
|
37
|
+
*/
|
|
38
|
+
setRelationship(relationship: Relationship): void;
|
|
39
|
+
/**
|
|
40
|
+
* Delete relationship from cache
|
|
41
|
+
*/
|
|
42
|
+
deleteRelationship(id: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Compress data (simple JSON + text encoding)
|
|
45
|
+
* In production, would use zstd, lz4, or similar
|
|
46
|
+
*/
|
|
47
|
+
private compress;
|
|
48
|
+
/**
|
|
49
|
+
* Decompress data
|
|
50
|
+
*/
|
|
51
|
+
private decompress;
|
|
52
|
+
/**
|
|
53
|
+
* Evict least recently used entry
|
|
54
|
+
*/
|
|
55
|
+
private evictOne;
|
|
56
|
+
/**
|
|
57
|
+
* Promote entity to L1 (returns it for L1 to cache)
|
|
58
|
+
*/
|
|
59
|
+
promoteEntity(id: string): Entity | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* Demote entity from L1 (accepts and caches it)
|
|
62
|
+
*/
|
|
63
|
+
demoteEntity(entity: Entity): void;
|
|
64
|
+
/**
|
|
65
|
+
* Clear all caches
|
|
66
|
+
*/
|
|
67
|
+
clear(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Get compression ratio
|
|
70
|
+
*/
|
|
71
|
+
getCompressionRatio(): number;
|
|
72
|
+
/**
|
|
73
|
+
* Get cache statistics
|
|
74
|
+
*/
|
|
75
|
+
getStats(): CacheStats;
|
|
76
|
+
/**
|
|
77
|
+
* Get entity count
|
|
78
|
+
*/
|
|
79
|
+
get entityCount(): number;
|
|
80
|
+
/**
|
|
81
|
+
* Get relationship count
|
|
82
|
+
*/
|
|
83
|
+
get relationshipCount(): number;
|
|
84
|
+
/**
|
|
85
|
+
* Get total entry count
|
|
86
|
+
*/
|
|
87
|
+
get size(): number;
|
|
88
|
+
/**
|
|
89
|
+
* Get current size in bytes
|
|
90
|
+
*/
|
|
91
|
+
get sizeBytes(): number;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=L2Cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"L2Cache.d.ts","sourceRoot":"","sources":["../../src/cache/L2Cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAmB,MAAM,aAAa,CAAC;AAYrF;;GAEG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2C;IACzE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAa;gBAElB,YAAY,GAAE,MAA0B;IAKpD;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAYzC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAwB/B;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAUjC;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAYrD;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAyBjD;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAUvC;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAKhB;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAiChB;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQ7C;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAiB7B;;OAEG;IACH,QAAQ,IAAI,UAAU;IAatB;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;OAEG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;CACF"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - L2 Cache (Warm)
|
|
3
|
+
*
|
|
4
|
+
* Compressed in-memory cache for warm data
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* L2 Cache - Warm tier with compression
|
|
8
|
+
*/
|
|
9
|
+
export class L2Cache {
|
|
10
|
+
entities = new Map();
|
|
11
|
+
relationships = new Map();
|
|
12
|
+
maxSize;
|
|
13
|
+
currentSize = 0;
|
|
14
|
+
hits = 0;
|
|
15
|
+
misses = 0;
|
|
16
|
+
evictions = 0;
|
|
17
|
+
constructor(maxSizeBytes = 100 * 1024 * 1024) {
|
|
18
|
+
// Default 100MB
|
|
19
|
+
this.maxSize = maxSizeBytes;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get entity from cache
|
|
23
|
+
*/
|
|
24
|
+
getEntity(id) {
|
|
25
|
+
const entry = this.entities.get(id);
|
|
26
|
+
if (entry) {
|
|
27
|
+
this.hits++;
|
|
28
|
+
entry.accessCount++;
|
|
29
|
+
entry.lastAccess = new Date();
|
|
30
|
+
return this.decompress(entry.compressed);
|
|
31
|
+
}
|
|
32
|
+
this.misses++;
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Set entity in cache
|
|
37
|
+
*/
|
|
38
|
+
setEntity(entity) {
|
|
39
|
+
const compressed = this.compress(entity);
|
|
40
|
+
const entry = {
|
|
41
|
+
compressed,
|
|
42
|
+
originalSize: JSON.stringify(entity).length,
|
|
43
|
+
accessCount: 1,
|
|
44
|
+
lastAccess: new Date(),
|
|
45
|
+
};
|
|
46
|
+
// Evict if necessary
|
|
47
|
+
while (this.currentSize + compressed.length > this.maxSize && this.entities.size > 0) {
|
|
48
|
+
this.evictOne();
|
|
49
|
+
}
|
|
50
|
+
// Remove existing entry size if updating
|
|
51
|
+
const existing = this.entities.get(entity.id);
|
|
52
|
+
if (existing) {
|
|
53
|
+
this.currentSize -= existing.compressed.length;
|
|
54
|
+
}
|
|
55
|
+
this.entities.set(entity.id, entry);
|
|
56
|
+
this.currentSize += compressed.length;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Delete entity from cache
|
|
60
|
+
*/
|
|
61
|
+
deleteEntity(id) {
|
|
62
|
+
const entry = this.entities.get(id);
|
|
63
|
+
if (entry) {
|
|
64
|
+
this.currentSize -= entry.compressed.length;
|
|
65
|
+
this.entities.delete(id);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get relationship from cache
|
|
72
|
+
*/
|
|
73
|
+
getRelationship(id) {
|
|
74
|
+
const entry = this.relationships.get(id);
|
|
75
|
+
if (entry) {
|
|
76
|
+
this.hits++;
|
|
77
|
+
entry.accessCount++;
|
|
78
|
+
entry.lastAccess = new Date();
|
|
79
|
+
return this.decompress(entry.compressed);
|
|
80
|
+
}
|
|
81
|
+
this.misses++;
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Set relationship in cache
|
|
86
|
+
*/
|
|
87
|
+
setRelationship(relationship) {
|
|
88
|
+
const compressed = this.compress(relationship);
|
|
89
|
+
const entry = {
|
|
90
|
+
compressed,
|
|
91
|
+
originalSize: JSON.stringify(relationship).length,
|
|
92
|
+
accessCount: 1,
|
|
93
|
+
lastAccess: new Date(),
|
|
94
|
+
};
|
|
95
|
+
while (this.currentSize + compressed.length > this.maxSize &&
|
|
96
|
+
this.relationships.size > 0) {
|
|
97
|
+
this.evictOne();
|
|
98
|
+
}
|
|
99
|
+
const existing = this.relationships.get(relationship.id);
|
|
100
|
+
if (existing) {
|
|
101
|
+
this.currentSize -= existing.compressed.length;
|
|
102
|
+
}
|
|
103
|
+
this.relationships.set(relationship.id, entry);
|
|
104
|
+
this.currentSize += compressed.length;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Delete relationship from cache
|
|
108
|
+
*/
|
|
109
|
+
deleteRelationship(id) {
|
|
110
|
+
const entry = this.relationships.get(id);
|
|
111
|
+
if (entry) {
|
|
112
|
+
this.currentSize -= entry.compressed.length;
|
|
113
|
+
this.relationships.delete(id);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Compress data (simple JSON + text encoding)
|
|
120
|
+
* In production, would use zstd, lz4, or similar
|
|
121
|
+
*/
|
|
122
|
+
compress(data) {
|
|
123
|
+
const json = JSON.stringify(data);
|
|
124
|
+
return new TextEncoder().encode(json);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Decompress data
|
|
128
|
+
*/
|
|
129
|
+
decompress(compressed) {
|
|
130
|
+
const json = new TextDecoder().decode(compressed);
|
|
131
|
+
return JSON.parse(json);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Evict least recently used entry
|
|
135
|
+
*/
|
|
136
|
+
evictOne() {
|
|
137
|
+
let oldestKey = null;
|
|
138
|
+
let oldestTime = Infinity;
|
|
139
|
+
let oldestMap = null;
|
|
140
|
+
// Find oldest in entities
|
|
141
|
+
for (const [key, entry] of this.entities) {
|
|
142
|
+
const time = entry.lastAccess.getTime();
|
|
143
|
+
if (time < oldestTime) {
|
|
144
|
+
oldestTime = time;
|
|
145
|
+
oldestKey = key;
|
|
146
|
+
oldestMap = this.entities;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Find oldest in relationships
|
|
150
|
+
for (const [key, entry] of this.relationships) {
|
|
151
|
+
const time = entry.lastAccess.getTime();
|
|
152
|
+
if (time < oldestTime) {
|
|
153
|
+
oldestTime = time;
|
|
154
|
+
oldestKey = key;
|
|
155
|
+
oldestMap = this.relationships;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (oldestKey && oldestMap) {
|
|
159
|
+
const entry = oldestMap.get(oldestKey);
|
|
160
|
+
this.currentSize -= entry.compressed.length;
|
|
161
|
+
oldestMap.delete(oldestKey);
|
|
162
|
+
this.evictions++;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Promote entity to L1 (returns it for L1 to cache)
|
|
167
|
+
*/
|
|
168
|
+
promoteEntity(id) {
|
|
169
|
+
const entity = this.getEntity(id);
|
|
170
|
+
if (entity) {
|
|
171
|
+
this.deleteEntity(id);
|
|
172
|
+
}
|
|
173
|
+
return entity;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Demote entity from L1 (accepts and caches it)
|
|
177
|
+
*/
|
|
178
|
+
demoteEntity(entity) {
|
|
179
|
+
this.setEntity(entity);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Clear all caches
|
|
183
|
+
*/
|
|
184
|
+
clear() {
|
|
185
|
+
this.entities.clear();
|
|
186
|
+
this.relationships.clear();
|
|
187
|
+
this.currentSize = 0;
|
|
188
|
+
this.hits = 0;
|
|
189
|
+
this.misses = 0;
|
|
190
|
+
this.evictions = 0;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get compression ratio
|
|
194
|
+
*/
|
|
195
|
+
getCompressionRatio() {
|
|
196
|
+
let originalTotal = 0;
|
|
197
|
+
let compressedTotal = 0;
|
|
198
|
+
for (const entry of this.entities.values()) {
|
|
199
|
+
originalTotal += entry.originalSize;
|
|
200
|
+
compressedTotal += entry.compressed.length;
|
|
201
|
+
}
|
|
202
|
+
for (const entry of this.relationships.values()) {
|
|
203
|
+
originalTotal += entry.originalSize;
|
|
204
|
+
compressedTotal += entry.compressed.length;
|
|
205
|
+
}
|
|
206
|
+
return originalTotal > 0 ? compressedTotal / originalTotal : 1;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Get cache statistics
|
|
210
|
+
*/
|
|
211
|
+
getStats() {
|
|
212
|
+
const total = this.hits + this.misses;
|
|
213
|
+
return {
|
|
214
|
+
tier: 'L2',
|
|
215
|
+
hitCount: this.hits,
|
|
216
|
+
missCount: this.misses,
|
|
217
|
+
hitRate: total > 0 ? this.hits / total : 0,
|
|
218
|
+
entryCount: this.entities.size + this.relationships.size,
|
|
219
|
+
sizeBytes: this.currentSize,
|
|
220
|
+
evictionCount: this.evictions,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get entity count
|
|
225
|
+
*/
|
|
226
|
+
get entityCount() {
|
|
227
|
+
return this.entities.size;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get relationship count
|
|
231
|
+
*/
|
|
232
|
+
get relationshipCount() {
|
|
233
|
+
return this.relationships.size;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get total entry count
|
|
237
|
+
*/
|
|
238
|
+
get size() {
|
|
239
|
+
return this.entities.size + this.relationships.size;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Get current size in bytes
|
|
243
|
+
*/
|
|
244
|
+
get sizeBytes() {
|
|
245
|
+
return this.currentSize;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=L2Cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"L2Cache.js","sourceRoot":"","sources":["../../src/cache/L2Cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH;;GAEG;AACH,MAAM,OAAO,OAAO;IACD,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAC;IACnD,aAAa,GAAiC,IAAI,GAAG,EAAE,CAAC;IACxD,OAAO,CAAS;IACzB,WAAW,GAAW,CAAC,CAAC;IACxB,IAAI,GAAW,CAAC,CAAC;IACjB,MAAM,GAAW,CAAC,CAAC;IACnB,SAAS,GAAW,CAAC,CAAC;IAE9B,YAAY,eAAuB,GAAG,GAAG,IAAI,GAAG,IAAI;QAClD,gBAAgB;QAChB,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,EAAU;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,KAAK,CAAC,WAAW,EAAE,CAAC;YACpB,KAAK,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,UAAU,CAAS,KAAK,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAc;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,KAAK,GAAoB;YAC7B,UAAU;YACV,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM;YAC3C,WAAW,EAAE,CAAC;YACd,UAAU,EAAE,IAAI,IAAI,EAAE;SACvB,CAAC;QAEF,qBAAqB;QACrB,OAAO,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACrF,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;QAED,yCAAyC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,MAAM,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,EAAU;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;YAC5C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,EAAU;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,KAAK,CAAC,WAAW,EAAE,CAAC;YACpB,KAAK,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,UAAU,CAAe,KAAK,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,YAA0B;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAoB;YAC7B,UAAU;YACV,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM;YACjD,WAAW,EAAE,CAAC;YACd,UAAU,EAAE,IAAI,IAAI,EAAE;SACvB,CAAC;QAEF,OACE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO;YACnD,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,EAC3B,CAAC;YACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,MAAM,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,EAAU;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;YAC5C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACK,QAAQ,CAAI,IAAO;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACK,UAAU,CAAI,UAAsB;QAC1C,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;IAED;;OAEG;IACK,QAAQ;QACd,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,UAAU,GAAG,QAAQ,CAAC;QAC1B,IAAI,SAAS,GAAwC,IAAI,CAAC;QAE1D,0BAA0B;QAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,IAAI,GAAG,UAAU,EAAE,CAAC;gBACtB,UAAU,GAAG,IAAI,CAAC;gBAClB,SAAS,GAAG,GAAG,CAAC;gBAChB,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,IAAI,GAAG,UAAU,EAAE,CAAC;gBACtB,UAAU,GAAG,IAAI,CAAC;gBAClB,SAAS,GAAG,GAAG,CAAC;gBAChB,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;YACjC,CAAC;QACH,CAAC;QAED,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YACxC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;YAC5C,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,EAAU;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAc;QACzB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,aAAa,IAAI,KAAK,CAAC,YAAY,CAAC;YACpC,eAAe,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAC7C,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YAChD,aAAa,IAAI,KAAK,CAAC,YAAY,CAAC;YACpC,eAAe,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAC7C,CAAC;QAED,OAAO,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACtC,OAAO;YACL,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,SAAS,EAAE,IAAI,CAAC,MAAM;YACtB,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1C,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI;YACxD,SAAS,EAAE,IAAI,CAAC,WAAW;YAC3B,aAAa,EAAE,IAAI,CAAC,SAAS;SAC9B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - L3 Cache (Cold)
|
|
3
|
+
*
|
|
4
|
+
* Disk-based cache for cold data using LMDB
|
|
5
|
+
*/
|
|
6
|
+
import type { CacheStats, Entity, Relationship } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* L3 Cache - Cold tier, disk-based
|
|
9
|
+
* Note: This is a simplified in-memory simulation.
|
|
10
|
+
* In production, would use LMDB or similar.
|
|
11
|
+
*/
|
|
12
|
+
export declare class L3Cache {
|
|
13
|
+
private readonly entities;
|
|
14
|
+
private readonly relationships;
|
|
15
|
+
private readonly maxEntries;
|
|
16
|
+
private hits;
|
|
17
|
+
private misses;
|
|
18
|
+
private evictions;
|
|
19
|
+
constructor(maxEntries?: number);
|
|
20
|
+
/**
|
|
21
|
+
* Get entity from cache
|
|
22
|
+
*/
|
|
23
|
+
getEntity(id: string): Promise<Entity | undefined>;
|
|
24
|
+
/**
|
|
25
|
+
* Set entity in cache
|
|
26
|
+
*/
|
|
27
|
+
setEntity(entity: Entity): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Delete entity from cache
|
|
30
|
+
*/
|
|
31
|
+
deleteEntity(id: string): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Get relationship from cache
|
|
34
|
+
*/
|
|
35
|
+
getRelationship(id: string): Promise<Relationship | undefined>;
|
|
36
|
+
/**
|
|
37
|
+
* Set relationship in cache
|
|
38
|
+
*/
|
|
39
|
+
setRelationship(relationship: Relationship): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Delete relationship from cache
|
|
42
|
+
*/
|
|
43
|
+
deleteRelationship(id: string): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Batch get entities
|
|
46
|
+
*/
|
|
47
|
+
getEntities(ids: string[]): Promise<Map<string, Entity>>;
|
|
48
|
+
/**
|
|
49
|
+
* Batch set entities
|
|
50
|
+
*/
|
|
51
|
+
setEntities(entities: Entity[]): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Evict oldest entity
|
|
54
|
+
*/
|
|
55
|
+
private evictOldestEntity;
|
|
56
|
+
/**
|
|
57
|
+
* Evict oldest relationship
|
|
58
|
+
*/
|
|
59
|
+
private evictOldestRelationship;
|
|
60
|
+
/**
|
|
61
|
+
* Promote entity to L2 (returns it for L2 to cache)
|
|
62
|
+
*/
|
|
63
|
+
promoteEntity(id: string): Promise<Entity | undefined>;
|
|
64
|
+
/**
|
|
65
|
+
* Demote entity from L2 (accepts and caches it)
|
|
66
|
+
*/
|
|
67
|
+
demoteEntity(entity: Entity): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Clear all caches
|
|
70
|
+
*/
|
|
71
|
+
clear(): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Sync to disk (no-op in this simulation)
|
|
74
|
+
*/
|
|
75
|
+
sync(): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Close the cache
|
|
78
|
+
*/
|
|
79
|
+
close(): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Get cache statistics
|
|
82
|
+
*/
|
|
83
|
+
getStats(): CacheStats;
|
|
84
|
+
/**
|
|
85
|
+
* Estimate size in bytes
|
|
86
|
+
*/
|
|
87
|
+
private estimateSize;
|
|
88
|
+
/**
|
|
89
|
+
* Get entity count
|
|
90
|
+
*/
|
|
91
|
+
get entityCount(): number;
|
|
92
|
+
/**
|
|
93
|
+
* Get relationship count
|
|
94
|
+
*/
|
|
95
|
+
get relationshipCount(): number;
|
|
96
|
+
/**
|
|
97
|
+
* Get total entry count
|
|
98
|
+
*/
|
|
99
|
+
get size(): number;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=L3Cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"L3Cache.d.ts","sourceRoot":"","sources":["../../src/cache/L3Cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAWpE;;;;GAIG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IACjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAa;gBAElB,UAAU,GAAE,MAAgB;IAIxC;;OAEG;IACG,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAYxD;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9C;;OAEG;IACG,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhD;;OAEG;IACG,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAYpE;;OAEG;IACG,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAehE;;OAEG;IACG,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItD;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAW9D;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAiB/B;;OAEG;IACG,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAQ5D;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,QAAQ,IAAI,UAAU;IAatB;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;OAEG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|