@yydb/light-db 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/api/LightDB.d.ts +194 -0
  2. package/dist/api/LightDB.d.ts.map +1 -0
  3. package/dist/api/LightDB.js +299 -0
  4. package/dist/api/LightDB.js.map +1 -0
  5. package/dist/api/Transaction.d.ts +100 -0
  6. package/dist/api/Transaction.d.ts.map +1 -0
  7. package/dist/api/Transaction.js +263 -0
  8. package/dist/api/Transaction.js.map +1 -0
  9. package/dist/api/index.d.ts +24 -0
  10. package/dist/api/index.d.ts.map +1 -0
  11. package/dist/api/index.js +54 -0
  12. package/dist/api/index.js.map +1 -0
  13. package/dist/api/types.d.ts +154 -0
  14. package/dist/api/types.d.ts.map +1 -0
  15. package/dist/api/types.js +7 -0
  16. package/dist/api/types.js.map +1 -0
  17. package/dist/collection/Collection.d.ts +235 -0
  18. package/dist/collection/Collection.d.ts.map +1 -0
  19. package/dist/collection/Collection.js +671 -0
  20. package/dist/collection/Collection.js.map +1 -0
  21. package/dist/collection/QueryBuilder.d.ts +225 -0
  22. package/dist/collection/QueryBuilder.d.ts.map +1 -0
  23. package/dist/collection/QueryBuilder.js +475 -0
  24. package/dist/collection/QueryBuilder.js.map +1 -0
  25. package/dist/collection/QueryParser.d.ts +117 -0
  26. package/dist/collection/QueryParser.d.ts.map +1 -0
  27. package/dist/collection/QueryParser.js +438 -0
  28. package/dist/collection/QueryParser.js.map +1 -0
  29. package/dist/collection/index.d.ts +42 -0
  30. package/dist/collection/index.d.ts.map +1 -0
  31. package/dist/collection/index.js +41 -0
  32. package/dist/collection/index.js.map +1 -0
  33. package/dist/collection/types.d.ts +365 -0
  34. package/dist/collection/types.d.ts.map +1 -0
  35. package/dist/collection/types.js +7 -0
  36. package/dist/collection/types.js.map +1 -0
  37. package/dist/constants/index.d.ts +51 -0
  38. package/dist/constants/index.d.ts.map +1 -0
  39. package/dist/constants/index.js +68 -0
  40. package/dist/constants/index.js.map +1 -0
  41. package/dist/errors/index.d.ts +69 -0
  42. package/dist/errors/index.d.ts.map +1 -0
  43. package/dist/errors/index.js +132 -0
  44. package/dist/errors/index.js.map +1 -0
  45. package/dist/index.d.ts +220 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +729 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/indexes/BPlusTree.d.ts +181 -0
  50. package/dist/indexes/BPlusTree.d.ts.map +1 -0
  51. package/dist/indexes/BPlusTree.js +528 -0
  52. package/dist/indexes/BPlusTree.js.map +1 -0
  53. package/dist/indexes/IndexManager.d.ts +236 -0
  54. package/dist/indexes/IndexManager.d.ts.map +1 -0
  55. package/dist/indexes/IndexManager.js +502 -0
  56. package/dist/indexes/IndexManager.js.map +1 -0
  57. package/dist/indexes/PrimaryIndex.d.ts +240 -0
  58. package/dist/indexes/PrimaryIndex.d.ts.map +1 -0
  59. package/dist/indexes/PrimaryIndex.js +354 -0
  60. package/dist/indexes/PrimaryIndex.js.map +1 -0
  61. package/dist/indexes/SecondaryIndex.d.ts +204 -0
  62. package/dist/indexes/SecondaryIndex.d.ts.map +1 -0
  63. package/dist/indexes/SecondaryIndex.js +480 -0
  64. package/dist/indexes/SecondaryIndex.js.map +1 -0
  65. package/dist/indexes/errors.d.ts +66 -0
  66. package/dist/indexes/errors.d.ts.map +1 -0
  67. package/dist/indexes/errors.js +117 -0
  68. package/dist/indexes/errors.js.map +1 -0
  69. package/dist/indexes/index.d.ts +52 -0
  70. package/dist/indexes/index.d.ts.map +1 -0
  71. package/dist/indexes/index.js +131 -0
  72. package/dist/indexes/index.js.map +1 -0
  73. package/dist/indexes/types.d.ts +246 -0
  74. package/dist/indexes/types.d.ts.map +1 -0
  75. package/dist/indexes/types.js +30 -0
  76. package/dist/indexes/types.js.map +1 -0
  77. package/dist/performance/BatchWALWriter.d.ts +185 -0
  78. package/dist/performance/BatchWALWriter.d.ts.map +1 -0
  79. package/dist/performance/BatchWALWriter.js +490 -0
  80. package/dist/performance/BatchWALWriter.js.map +1 -0
  81. package/dist/performance/ColumnarStorage.d.ts +138 -0
  82. package/dist/performance/ColumnarStorage.d.ts.map +1 -0
  83. package/dist/performance/ColumnarStorage.js +875 -0
  84. package/dist/performance/ColumnarStorage.js.map +1 -0
  85. package/dist/performance/LazyQuery.d.ts +307 -0
  86. package/dist/performance/LazyQuery.d.ts.map +1 -0
  87. package/dist/performance/LazyQuery.js +588 -0
  88. package/dist/performance/LazyQuery.js.map +1 -0
  89. package/dist/performance/OptimizedBuffer.d.ts +375 -0
  90. package/dist/performance/OptimizedBuffer.d.ts.map +1 -0
  91. package/dist/performance/OptimizedBuffer.js +730 -0
  92. package/dist/performance/OptimizedBuffer.js.map +1 -0
  93. package/dist/performance/RWLock.d.ts +260 -0
  94. package/dist/performance/RWLock.d.ts.map +1 -0
  95. package/dist/performance/RWLock.js +570 -0
  96. package/dist/performance/RWLock.js.map +1 -0
  97. package/dist/performance/index.d.ts +41 -0
  98. package/dist/performance/index.d.ts.map +1 -0
  99. package/dist/performance/index.js +162 -0
  100. package/dist/performance/index.js.map +1 -0
  101. package/dist/performance/types.d.ts +247 -0
  102. package/dist/performance/types.d.ts.map +1 -0
  103. package/dist/performance/types.js +26 -0
  104. package/dist/performance/types.js.map +1 -0
  105. package/dist/storage/Checkpoint.d.ts +128 -0
  106. package/dist/storage/Checkpoint.d.ts.map +1 -0
  107. package/dist/storage/Checkpoint.js +251 -0
  108. package/dist/storage/Checkpoint.js.map +1 -0
  109. package/dist/storage/LightFile.d.ts +227 -0
  110. package/dist/storage/LightFile.d.ts.map +1 -0
  111. package/dist/storage/LightFile.js +526 -0
  112. package/dist/storage/LightFile.js.map +1 -0
  113. package/dist/storage/Recovery.d.ts +172 -0
  114. package/dist/storage/Recovery.d.ts.map +1 -0
  115. package/dist/storage/Recovery.js +399 -0
  116. package/dist/storage/Recovery.js.map +1 -0
  117. package/dist/storage/SHMFile.d.ts +243 -0
  118. package/dist/storage/SHMFile.d.ts.map +1 -0
  119. package/dist/storage/SHMFile.js +436 -0
  120. package/dist/storage/SHMFile.js.map +1 -0
  121. package/dist/storage/StorageEngine.d.ts +146 -0
  122. package/dist/storage/StorageEngine.d.ts.map +1 -0
  123. package/dist/storage/StorageEngine.js +353 -0
  124. package/dist/storage/StorageEngine.js.map +1 -0
  125. package/dist/storage/WALFile.d.ts +248 -0
  126. package/dist/storage/WALFile.d.ts.map +1 -0
  127. package/dist/storage/WALFile.js +597 -0
  128. package/dist/storage/WALFile.js.map +1 -0
  129. package/dist/storage/index.d.ts +10 -0
  130. package/dist/storage/index.d.ts.map +1 -0
  131. package/dist/storage/index.js +153 -0
  132. package/dist/storage/index.js.map +1 -0
  133. package/dist/types/index.d.ts +220 -0
  134. package/dist/types/index.d.ts.map +1 -0
  135. package/dist/types/index.js +7 -0
  136. package/dist/types/index.js.map +1 -0
  137. package/dist/utils/binary.d.ts +271 -0
  138. package/dist/utils/binary.d.ts.map +1 -0
  139. package/dist/utils/binary.js +454 -0
  140. package/dist/utils/binary.js.map +1 -0
  141. package/dist/utils/file.d.ts +166 -0
  142. package/dist/utils/file.d.ts.map +1 -0
  143. package/dist/utils/file.js +346 -0
  144. package/dist/utils/file.js.map +1 -0
  145. package/dist/utils/index.d.ts +6 -0
  146. package/dist/utils/index.d.ts.map +1 -0
  147. package/dist/utils/index.js +39 -0
  148. package/dist/utils/index.js.map +1 -0
  149. package/package.json +37 -0
  150. package/readme.md +124 -0
@@ -0,0 +1,502 @@
1
+ "use strict";
2
+ /**
3
+ * LightDB 索引管理器实现
4
+ * 统一管理主键索引和二级索引,提供自动维护功能
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.IndexManager = void 0;
8
+ const PrimaryIndex_1 = require("./PrimaryIndex");
9
+ const SecondaryIndex_1 = require("./SecondaryIndex");
10
+ const errors_1 = require("./errors");
11
+ /**
12
+ * 索引管理器
13
+ * 提供索引的创建、查询、维护等统一管理功能
14
+ */
15
+ class IndexManager {
16
+ /**
17
+ * 创建索引管理器实例
18
+ * @param config 集合配置
19
+ * @param options 索引管理器选项
20
+ */
21
+ constructor(config, options) {
22
+ this.primaryIndex = null;
23
+ this.options = {
24
+ bPlusTreeOrder: options?.bPlusTreeOrder ?? 64,
25
+ autoMaintain: options?.autoMaintain ?? true,
26
+ };
27
+ this.collectionName = config.name;
28
+ this.primaryKeyField = config.primaryKey;
29
+ this.primaryKeyExtractor = config.primaryKeyExtractor;
30
+ this.secondaryIndexes = new Map();
31
+ this.valueExtractors = new Map();
32
+ this.initializePrimaryIndex();
33
+ this.initializeSecondaryIndexes(config.secondaryIndexes ?? []);
34
+ }
35
+ /**
36
+ * 获取集合名称
37
+ */
38
+ get CollectionName() {
39
+ return this.collectionName;
40
+ }
41
+ /**
42
+ * 获取主键字段名
43
+ */
44
+ get PrimaryKeyField() {
45
+ return this.primaryKeyField;
46
+ }
47
+ /**
48
+ * 获取主键索引
49
+ */
50
+ get PrimaryIndex() {
51
+ if (!this.primaryIndex) {
52
+ throw new errors_1.IndexOperationError("Primary index not initialized", "getPrimaryIndex");
53
+ }
54
+ return this.primaryIndex;
55
+ }
56
+ /**
57
+ * 获取记录数量
58
+ */
59
+ get Size() {
60
+ return this.primaryIndex?.Size ?? 0;
61
+ }
62
+ /**
63
+ * 初始化主键索引
64
+ */
65
+ initializePrimaryIndex() {
66
+ const config = {
67
+ name: `${this.collectionName}_pk`,
68
+ fieldName: this.primaryKeyField,
69
+ order: this.options.bPlusTreeOrder,
70
+ };
71
+ this.primaryIndex = new PrimaryIndex_1.PrimaryIndex(config);
72
+ }
73
+ /**
74
+ * 初始化二级索引
75
+ */
76
+ initializeSecondaryIndexes(configs) {
77
+ for (const config of configs) {
78
+ this.createSecondaryIndex(config);
79
+ }
80
+ }
81
+ /**
82
+ * 创建二级索引
83
+ * @param config 索引配置
84
+ */
85
+ createSecondaryIndex(config) {
86
+ if (this.secondaryIndexes.has(config.name)) {
87
+ throw new errors_1.IndexExistsError(config.name);
88
+ }
89
+ const indexConfig = {
90
+ name: config.name,
91
+ fieldName: config.fieldName,
92
+ unique: config.unique ?? false,
93
+ sparse: config.sparse ?? false,
94
+ };
95
+ const index = new SecondaryIndex_1.SecondaryIndex(indexConfig);
96
+ this.secondaryIndexes.set(config.name, index);
97
+ this.valueExtractors.set(config.name, config.valueExtractor);
98
+ return index;
99
+ }
100
+ /**
101
+ * 删除二级索引
102
+ * @param name 索引名称
103
+ */
104
+ dropSecondaryIndex(name) {
105
+ const index = this.secondaryIndexes.get(name);
106
+ if (!index) {
107
+ return false;
108
+ }
109
+ index.clear();
110
+ this.secondaryIndexes.delete(name);
111
+ this.valueExtractors.delete(name);
112
+ return true;
113
+ }
114
+ /**
115
+ * 获取二级索引
116
+ * @param name 索引名称
117
+ */
118
+ getSecondaryIndex(name) {
119
+ const index = this.secondaryIndexes.get(name);
120
+ if (!index) {
121
+ throw new errors_1.IndexNotFoundError(name);
122
+ }
123
+ return index;
124
+ }
125
+ /**
126
+ * 检查二级索引是否存在
127
+ * @param name 索引名称
128
+ */
129
+ hasSecondaryIndex(name) {
130
+ return this.secondaryIndexes.has(name);
131
+ }
132
+ /**
133
+ * 获取所有二级索引名称
134
+ */
135
+ getSecondaryIndexNames() {
136
+ return Array.from(this.secondaryIndexes.keys());
137
+ }
138
+ /**
139
+ * 插入记录
140
+ * @param record 记录
141
+ * @param throwOnDuplicate 如果主键已存在是否抛出异常
142
+ * @returns 是否插入成功
143
+ */
144
+ insert(record, throwOnDuplicate = false) {
145
+ const primaryKey = this.primaryKeyExtractor(record);
146
+ if (!this.primaryIndex.insert(primaryKey, record, throwOnDuplicate)) {
147
+ return false;
148
+ }
149
+ for (const [indexName, index] of this.secondaryIndexes) {
150
+ const extractor = this.valueExtractors.get(indexName);
151
+ if (extractor) {
152
+ const value = extractor(record);
153
+ try {
154
+ index.insert(value, primaryKey, index.IsUnique && throwOnDuplicate);
155
+ } catch (error) {
156
+ this.primaryIndex.delete(primaryKey);
157
+ throw error;
158
+ }
159
+ }
160
+ }
161
+ return true;
162
+ }
163
+ /**
164
+ * 更新记录
165
+ * @param oldRecord 旧记录
166
+ * @param newRecord 新记录
167
+ * @param throwOnMissing 如果主键不存在是否抛出异常
168
+ * @returns 是否更新成功
169
+ */
170
+ update(oldRecord, newRecord, throwOnMissing = false) {
171
+ const oldPrimaryKey = this.primaryKeyExtractor(oldRecord);
172
+ const newPrimaryKey = this.primaryKeyExtractor(newRecord);
173
+ if (!this.primaryIndex.has(oldPrimaryKey)) {
174
+ if (throwOnMissing) {
175
+ throw new errors_1.IndexOperationError(`Record not found with primary key: ${oldPrimaryKey}`, "update");
176
+ }
177
+ return false;
178
+ }
179
+ if (oldPrimaryKey !== newPrimaryKey) {
180
+ this.primaryIndex.delete(oldPrimaryKey);
181
+ this.primaryIndex.insert(newPrimaryKey, newRecord, true);
182
+ for (const [indexName, index] of this.secondaryIndexes) {
183
+ const extractor = this.valueExtractors.get(indexName);
184
+ if (extractor) {
185
+ const oldValue = extractor(oldRecord);
186
+ const newValue = extractor(newRecord);
187
+ index.delete(oldValue, oldPrimaryKey);
188
+ index.insert(newValue, newPrimaryKey, index.IsUnique);
189
+ }
190
+ }
191
+ } else {
192
+ this.primaryIndex.update(oldPrimaryKey, newRecord);
193
+ for (const [indexName, index] of this.secondaryIndexes) {
194
+ const extractor = this.valueExtractors.get(indexName);
195
+ if (extractor) {
196
+ const oldValue = extractor(oldRecord);
197
+ const newValue = extractor(newRecord);
198
+ index.update(oldValue, newValue, oldPrimaryKey, index.IsUnique);
199
+ }
200
+ }
201
+ }
202
+ return true;
203
+ }
204
+ /**
205
+ * 删除记录
206
+ * @param record 要删除的记录
207
+ * @param throwOnMissing 如果主键不存在是否抛出异常
208
+ * @returns 被删除的记录,如果不存在返回 undefined
209
+ */
210
+ delete(record, throwOnMissing = false) {
211
+ const primaryKey = this.primaryKeyExtractor(record);
212
+ const deleted = this.primaryIndex.delete(primaryKey, throwOnMissing);
213
+ if (deleted === undefined) {
214
+ return undefined;
215
+ }
216
+ for (const [indexName, index] of this.secondaryIndexes) {
217
+ const extractor = this.valueExtractors.get(indexName);
218
+ if (extractor) {
219
+ const value = extractor(record);
220
+ index.delete(value, primaryKey);
221
+ }
222
+ }
223
+ return deleted;
224
+ }
225
+ /**
226
+ * 通过主键删除记录
227
+ * @param primaryKey 主键
228
+ * @param throwOnMissing 如果主键不存在是否抛出异常
229
+ * @returns 被删除的记录,如果不存在返回 undefined
230
+ */
231
+ deleteByKey(primaryKey, throwOnMissing = false) {
232
+ const record = this.primaryIndex.find(primaryKey);
233
+ if (record === undefined) {
234
+ if (throwOnMissing) {
235
+ throw new errors_1.IndexOperationError(`Record not found with primary key: ${primaryKey}`, "deleteByKey");
236
+ }
237
+ return undefined;
238
+ }
239
+ return this.delete(record, throwOnMissing);
240
+ }
241
+ /**
242
+ * 通过主键查找记录
243
+ * @param primaryKey 主键
244
+ */
245
+ findByPrimaryKey(primaryKey) {
246
+ return this.primaryIndex.find(primaryKey);
247
+ }
248
+ /**
249
+ * 检查主键是否存在
250
+ * @param primaryKey 主键
251
+ */
252
+ hasByPrimaryKey(primaryKey) {
253
+ return this.primaryIndex.has(primaryKey);
254
+ }
255
+ /**
256
+ * 通过二级索引查找
257
+ * @param indexName 索引名称
258
+ * @param value 索引值
259
+ * @returns 匹配的记录数组
260
+ */
261
+ findBySecondaryIndex(indexName, value) {
262
+ const index = this.getSecondaryIndex(indexName);
263
+ const primaryKeys = index.find(value);
264
+ const results = [];
265
+ for (const key of primaryKeys) {
266
+ const record = this.primaryIndex.find(key);
267
+ if (record !== undefined) {
268
+ results.push(record);
269
+ }
270
+ }
271
+ return results;
272
+ }
273
+ /**
274
+ * 通过二级索引条件查询
275
+ * @param indexName 索引名称
276
+ * @param condition 查询条件
277
+ * @returns 匹配的记录数组
278
+ */
279
+ queryBySecondaryIndex(indexName, condition) {
280
+ const index = this.getSecondaryIndex(indexName);
281
+ const primaryKeys = index.query(condition);
282
+ const results = [];
283
+ for (const key of primaryKeys) {
284
+ const record = this.primaryIndex.find(key);
285
+ if (record !== undefined) {
286
+ results.push(record);
287
+ }
288
+ }
289
+ return results;
290
+ }
291
+ /**
292
+ * 主键范围查询
293
+ * @param start 起始键
294
+ * @param end 结束键
295
+ * @param includeStart 是否包含起始键
296
+ * @param includeEnd 是否包含结束键
297
+ * @returns 匹配的记录数组
298
+ */
299
+ rangeByPrimaryKey(start, end, includeStart = true, includeEnd = true) {
300
+ const entries = this.primaryIndex.range(start, end, {
301
+ includeStart,
302
+ includeEnd,
303
+ });
304
+ return entries.map((entry) => entry.value);
305
+ }
306
+ /**
307
+ * 二级索引范围查询
308
+ * @param indexName 索引名称
309
+ * @param start 起始值
310
+ * @param end 结束值
311
+ * @param includeStart 是否包含起始值
312
+ * @param includeEnd 是否包含结束值
313
+ * @returns 匹配的记录数组
314
+ */
315
+ rangeBySecondaryIndex(indexName, start, end, includeStart = true, includeEnd = true) {
316
+ const index = this.getSecondaryIndex(indexName);
317
+ const primaryKeys = index.range(start, end, includeStart, includeEnd);
318
+ const results = [];
319
+ for (const key of primaryKeys) {
320
+ const record = this.primaryIndex.find(key);
321
+ if (record !== undefined) {
322
+ results.push(record);
323
+ }
324
+ }
325
+ return results;
326
+ }
327
+ /**
328
+ * 获取所有记录
329
+ */
330
+ getAll() {
331
+ return this.primaryIndex.values();
332
+ }
333
+ /**
334
+ * 获取所有主键
335
+ */
336
+ getAllPrimaryKeys() {
337
+ return this.primaryIndex.keys();
338
+ }
339
+ /**
340
+ * 清空所有索引
341
+ */
342
+ clear() {
343
+ this.primaryIndex.clear();
344
+ for (const index of this.secondaryIndexes.values()) {
345
+ index.clear();
346
+ }
347
+ }
348
+ /**
349
+ * 获取所有索引统计信息
350
+ */
351
+ getStats() {
352
+ const stats = [];
353
+ if (this.primaryIndex) {
354
+ stats.push(this.primaryIndex.getStats());
355
+ }
356
+ for (const index of this.secondaryIndexes.values()) {
357
+ stats.push(index.getStats());
358
+ }
359
+ return stats;
360
+ }
361
+ /**
362
+ * 批量插入
363
+ * @param records 记录数组
364
+ * @param throwOnDuplicate 如果主键已存在是否抛出异常
365
+ */
366
+ insertBatch(records, throwOnDuplicate = false) {
367
+ let success = 0;
368
+ let failed = 0;
369
+ const errors = [];
370
+ for (let i = 0; i < records.length; i++) {
371
+ try {
372
+ if (this.insert(records[i], throwOnDuplicate)) {
373
+ success++;
374
+ } else {
375
+ failed++;
376
+ errors.push({ index: i, error: "Duplicate key" });
377
+ }
378
+ } catch (error) {
379
+ failed++;
380
+ errors.push({
381
+ index: i,
382
+ error: error instanceof Error ? error.message : "Unknown error",
383
+ });
384
+ }
385
+ }
386
+ return { success, failed, errors };
387
+ }
388
+ /**
389
+ * 批量删除
390
+ * @param primaryKeys 主键数组
391
+ */
392
+ deleteBatch(primaryKeys) {
393
+ let success = 0;
394
+ let failed = 0;
395
+ for (const key of primaryKeys) {
396
+ if (this.deleteByKey(key) !== undefined) {
397
+ success++;
398
+ } else {
399
+ failed++;
400
+ }
401
+ }
402
+ return { success, failed };
403
+ }
404
+ /**
405
+ * 验证索引一致性
406
+ */
407
+ validate() {
408
+ const results = [];
409
+ let allValid = true;
410
+ if (this.primaryIndex) {
411
+ const primaryValidation = this.primaryIndex.validate();
412
+ if (!primaryValidation.valid) {
413
+ allValid = false;
414
+ results.push({
415
+ index: this.primaryIndex.Name,
416
+ errors: primaryValidation.errors,
417
+ });
418
+ }
419
+ }
420
+ for (const [name, index] of this.secondaryIndexes) {
421
+ const validation = index.validate();
422
+ if (!validation.valid) {
423
+ allValid = false;
424
+ results.push({
425
+ index: name,
426
+ errors: validation.errors,
427
+ });
428
+ }
429
+ }
430
+ for (const [indexName, index] of this.secondaryIndexes) {
431
+ const orphanKeys = [];
432
+ for (const { keys } of index.entries()) {
433
+ for (const key of keys) {
434
+ if (!this.primaryIndex.has(key)) {
435
+ orphanKeys.push(key);
436
+ }
437
+ }
438
+ }
439
+ if (orphanKeys.length > 0) {
440
+ allValid = false;
441
+ results.push({
442
+ index: indexName,
443
+ errors: [`Orphan keys found: ${orphanKeys.slice(0, 10).join(", ")}${orphanKeys.length > 10 ? "..." : ""}`],
444
+ });
445
+ }
446
+ }
447
+ return {
448
+ valid: allValid,
449
+ errors: results,
450
+ };
451
+ }
452
+ /**
453
+ * 重建所有索引
454
+ * @param records 所有记录
455
+ */
456
+ rebuild(records) {
457
+ this.clear();
458
+ for (const record of records) {
459
+ const primaryKey = this.primaryKeyExtractor(record);
460
+ this.primaryIndex.insert(primaryKey, record);
461
+ for (const [indexName, index] of this.secondaryIndexes) {
462
+ const extractor = this.valueExtractors.get(indexName);
463
+ if (extractor) {
464
+ const value = extractor(record);
465
+ index.insert(value, primaryKey);
466
+ }
467
+ }
468
+ }
469
+ }
470
+ /**
471
+ * 重建指定二级索引
472
+ * @param indexName 索引名称
473
+ */
474
+ rebuildSecondaryIndex(indexName) {
475
+ const index = this.getSecondaryIndex(indexName);
476
+ const extractor = this.valueExtractors.get(indexName);
477
+ if (!extractor) {
478
+ throw new errors_1.IndexOperationError(`Value extractor not found for index: ${indexName}`, "rebuildSecondaryIndex");
479
+ }
480
+ index.clear();
481
+ for (const record of this.primaryIndex.values()) {
482
+ const primaryKey = this.primaryKeyExtractor(record);
483
+ const value = extractor(record);
484
+ index.insert(value, primaryKey);
485
+ }
486
+ }
487
+ /**
488
+ * 获取估算的内存使用量
489
+ */
490
+ getMemoryUsage() {
491
+ let total = 0;
492
+ if (this.primaryIndex) {
493
+ total += this.primaryIndex.getStats().memoryUsage;
494
+ }
495
+ for (const index of this.secondaryIndexes.values()) {
496
+ total += index.getStats().memoryUsage;
497
+ }
498
+ return total;
499
+ }
500
+ }
501
+ exports.IndexManager = IndexManager;
502
+ //# sourceMappingURL=IndexManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexManager.js","sourceRoot":"","sources":["../../src/indexes/IndexManager.ts"],"names":[],"mappings":"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"}