@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,240 @@
1
+ /**
2
+ * LightDB 主键索引实现
3
+ * 基于 B+ 树的主键索引,提供高效的键值存储和范围查询
4
+ */
5
+ import type { IndexKey, IndexStats, IndexIteratorOptions, Comparator } from "./types";
6
+ import { IndexType } from "./types";
7
+ /**
8
+ * 主键索引配置
9
+ */
10
+ export interface PrimaryIndexConfig {
11
+ /** 索引名称 */
12
+ name: string;
13
+ /** 字段名 */
14
+ fieldName: string;
15
+ /** B+ 树阶数 */
16
+ order?: number;
17
+ /** 自定义比较器 */
18
+ comparator?: Comparator<IndexKey>;
19
+ }
20
+ /**
21
+ * 主键索引
22
+ * 使用 B+ 树实现,支持 O(log n) 的插入、查找、删除和范围查询
23
+ */
24
+ export declare class PrimaryIndex<T = unknown> {
25
+ private readonly tree;
26
+ private readonly config;
27
+ /**
28
+ * 创建主键索引实例
29
+ * @param config 索引配置
30
+ */
31
+ constructor(config: PrimaryIndexConfig);
32
+ /**
33
+ * 获取索引名称
34
+ */
35
+ get Name(): string;
36
+ /**
37
+ * 获取字段名
38
+ */
39
+ get FieldName(): string;
40
+ /**
41
+ * 获取索引类型
42
+ */
43
+ get Type(): IndexType.Primary;
44
+ /**
45
+ * 获取索引中的记录数量
46
+ */
47
+ get Size(): number;
48
+ /**
49
+ * 检查索引是否为空
50
+ */
51
+ isEmpty(): boolean;
52
+ /**
53
+ * 插入键值对
54
+ * @param key 主键
55
+ * @param value 值
56
+ * @param throwOnDuplicate 如果键已存在是否抛出异常
57
+ * @returns 如果键已存在且不抛出异常,返回 false;否则返回 true
58
+ */
59
+ insert(key: IndexKey, value: T, throwOnDuplicate?: boolean): boolean;
60
+ /**
61
+ * 更新键对应的值
62
+ * @param key 主键
63
+ * @param value 新值
64
+ * @param throwOnMissing 如果键不存在是否抛出异常
65
+ * @returns 如果键不存在且不抛出异常,返回 false;否则返回 true
66
+ */
67
+ update(key: IndexKey, value: T, throwOnMissing?: boolean): boolean;
68
+ /**
69
+ * 插入或更新键值对
70
+ * @param key 主键
71
+ * @param value 值
72
+ */
73
+ upsert(key: IndexKey, value: T): void;
74
+ /**
75
+ * 查找键对应的值
76
+ * @param key 主键
77
+ * @returns 值,如果不存在返回 undefined
78
+ */
79
+ find(key: IndexKey): T | undefined;
80
+ /**
81
+ * 检查键是否存在
82
+ * @param key 主键
83
+ */
84
+ has(key: IndexKey): boolean;
85
+ /**
86
+ * 删除键值对
87
+ * @param key 主键
88
+ * @param throwOnMissing 如果键不存在是否抛出异常
89
+ * @returns 被删除的值,如果不存在返回 undefined
90
+ */
91
+ delete(key: IndexKey, throwOnMissing?: boolean): T | undefined;
92
+ /**
93
+ * 范围查询
94
+ * @param start 起始键
95
+ * @param end 结束键
96
+ * @param options 迭代选项
97
+ * @returns 键值对数组
98
+ */
99
+ range(
100
+ start?: IndexKey,
101
+ end?: IndexKey,
102
+ options?: IndexIteratorOptions,
103
+ ): Array<{
104
+ key: IndexKey;
105
+ value: T;
106
+ }>;
107
+ /**
108
+ * 大于指定键的记录
109
+ * @param key 键
110
+ * @param include 是否包含该键
111
+ */
112
+ greaterThan(
113
+ key: IndexKey,
114
+ include?: boolean,
115
+ ): Array<{
116
+ key: IndexKey;
117
+ value: T;
118
+ }>;
119
+ /**
120
+ * 小于指定键的记录
121
+ * @param key 键
122
+ * @param include 是否包含该键
123
+ */
124
+ lessThan(
125
+ key: IndexKey,
126
+ include?: boolean,
127
+ ): Array<{
128
+ key: IndexKey;
129
+ value: T;
130
+ }>;
131
+ /**
132
+ * 获取所有键(有序)
133
+ */
134
+ keys(): IndexKey[];
135
+ /**
136
+ * 获取所有值(按键顺序)
137
+ */
138
+ values(): T[];
139
+ /**
140
+ * 获取所有键值对(有序)
141
+ */
142
+ entries(): Array<{
143
+ key: IndexKey;
144
+ value: T;
145
+ }>;
146
+ /**
147
+ * 获取最小键
148
+ */
149
+ minKey(): IndexKey | undefined;
150
+ /**
151
+ * 获取最大键
152
+ */
153
+ maxKey(): IndexKey | undefined;
154
+ /**
155
+ * 获取第一个键值对
156
+ */
157
+ first():
158
+ | {
159
+ key: IndexKey;
160
+ value: T;
161
+ }
162
+ | undefined;
163
+ /**
164
+ * 获取最后一个键值对
165
+ */
166
+ last():
167
+ | {
168
+ key: IndexKey;
169
+ value: T;
170
+ }
171
+ | undefined;
172
+ /**
173
+ * 清空索引
174
+ */
175
+ clear(): void;
176
+ /**
177
+ * 遍历索引
178
+ * @param callback 回调函数
179
+ */
180
+ forEach(callback: (key: IndexKey, value: T) => void): void;
181
+ /**
182
+ * 创建迭代器
183
+ */
184
+ [Symbol.iterator](): Generator<{
185
+ key: IndexKey;
186
+ value: T;
187
+ }>;
188
+ /**
189
+ * 获取索引统计信息
190
+ */
191
+ getStats(): IndexStats;
192
+ /**
193
+ * 批量插入
194
+ * @param entries 键值对数组
195
+ * @param throwOnDuplicate 如果键已存在是否抛出异常
196
+ */
197
+ insertBatch(
198
+ entries: Array<{
199
+ key: IndexKey;
200
+ value: T;
201
+ }>,
202
+ throwOnDuplicate?: boolean,
203
+ ): {
204
+ success: number;
205
+ failed: number;
206
+ errors: Array<{
207
+ key: IndexKey;
208
+ error: string;
209
+ }>;
210
+ };
211
+ /**
212
+ * 批量删除
213
+ * @param keys 键数组
214
+ * @param throwOnMissing 如果键不存在是否抛出异常
215
+ */
216
+ deleteBatch(
217
+ keys: IndexKey[],
218
+ throwOnMissing?: boolean,
219
+ ): {
220
+ success: number;
221
+ failed: number;
222
+ errors: Array<{
223
+ key: IndexKey;
224
+ error: string;
225
+ }>;
226
+ };
227
+ /**
228
+ * 估算内存使用
229
+ */
230
+ private estimateMemoryUsage;
231
+ /**
232
+ * 验证索引一致性
233
+ * 用于调试和测试
234
+ */
235
+ validate(): {
236
+ valid: boolean;
237
+ errors: string[];
238
+ };
239
+ }
240
+ //# sourceMappingURL=PrimaryIndex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrimaryIndex.d.ts","sourceRoot":"","sources":["../../src/indexes/PrimaryIndex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,354 @@
1
+ "use strict";
2
+ /**
3
+ * LightDB 主键索引实现
4
+ * 基于 B+ 树的主键索引,提供高效的键值存储和范围查询
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PrimaryIndex = void 0;
8
+ const BPlusTree_1 = require("./BPlusTree");
9
+ const types_1 = require("./types");
10
+ const errors_1 = require("./errors");
11
+ /**
12
+ * 主键索引
13
+ * 使用 B+ 树实现,支持 O(log n) 的插入、查找、删除和范围查询
14
+ */
15
+ class PrimaryIndex {
16
+ /**
17
+ * 创建主键索引实例
18
+ * @param config 索引配置
19
+ */
20
+ constructor(config) {
21
+ this.config = {
22
+ name: config.name,
23
+ fieldName: config.fieldName,
24
+ order: config.order ?? 64,
25
+ comparator: config.comparator,
26
+ };
27
+ this.tree = new BPlusTree_1.BPlusTree(this.config.order, this.config.comparator);
28
+ }
29
+ /**
30
+ * 获取索引名称
31
+ */
32
+ get Name() {
33
+ return this.config.name;
34
+ }
35
+ /**
36
+ * 获取字段名
37
+ */
38
+ get FieldName() {
39
+ return this.config.fieldName;
40
+ }
41
+ /**
42
+ * 获取索引类型
43
+ */
44
+ get Type() {
45
+ return types_1.IndexType.Primary;
46
+ }
47
+ /**
48
+ * 获取索引中的记录数量
49
+ */
50
+ get Size() {
51
+ return this.tree.Size;
52
+ }
53
+ /**
54
+ * 检查索引是否为空
55
+ */
56
+ isEmpty() {
57
+ return this.tree.isEmpty();
58
+ }
59
+ /**
60
+ * 插入键值对
61
+ * @param key 主键
62
+ * @param value 值
63
+ * @param throwOnDuplicate 如果键已存在是否抛出异常
64
+ * @returns 如果键已存在且不抛出异常,返回 false;否则返回 true
65
+ */
66
+ insert(key, value, throwOnDuplicate = false) {
67
+ const existing = this.tree.find(key);
68
+ if (existing !== undefined) {
69
+ if (throwOnDuplicate) {
70
+ throw new errors_1.DuplicateKeyError(this.config.name, key);
71
+ }
72
+ return false;
73
+ }
74
+ this.tree.insert(key, value);
75
+ return true;
76
+ }
77
+ /**
78
+ * 更新键对应的值
79
+ * @param key 主键
80
+ * @param value 新值
81
+ * @param throwOnMissing 如果键不存在是否抛出异常
82
+ * @returns 如果键不存在且不抛出异常,返回 false;否则返回 true
83
+ */
84
+ update(key, value, throwOnMissing = false) {
85
+ if (!this.tree.has(key)) {
86
+ if (throwOnMissing) {
87
+ throw new errors_1.KeyNotFoundError(this.config.name, key);
88
+ }
89
+ return false;
90
+ }
91
+ return this.tree.update(key, value);
92
+ }
93
+ /**
94
+ * 插入或更新键值对
95
+ * @param key 主键
96
+ * @param value 值
97
+ */
98
+ upsert(key, value) {
99
+ if (this.tree.has(key)) {
100
+ this.tree.update(key, value);
101
+ } else {
102
+ this.tree.insert(key, value);
103
+ }
104
+ }
105
+ /**
106
+ * 查找键对应的值
107
+ * @param key 主键
108
+ * @returns 值,如果不存在返回 undefined
109
+ */
110
+ find(key) {
111
+ return this.tree.find(key);
112
+ }
113
+ /**
114
+ * 检查键是否存在
115
+ * @param key 主键
116
+ */
117
+ has(key) {
118
+ return this.tree.has(key);
119
+ }
120
+ /**
121
+ * 删除键值对
122
+ * @param key 主键
123
+ * @param throwOnMissing 如果键不存在是否抛出异常
124
+ * @returns 被删除的值,如果不存在返回 undefined
125
+ */
126
+ delete(key, throwOnMissing = false) {
127
+ const value = this.tree.delete(key);
128
+ if (value === undefined && throwOnMissing) {
129
+ throw new errors_1.KeyNotFoundError(this.config.name, key);
130
+ }
131
+ return value;
132
+ }
133
+ /**
134
+ * 范围查询
135
+ * @param start 起始键
136
+ * @param end 结束键
137
+ * @param options 迭代选项
138
+ * @returns 键值对数组
139
+ */
140
+ range(start, end, options) {
141
+ const includeStart = options?.includeStart ?? true;
142
+ const includeEnd = options?.includeEnd ?? true;
143
+ let result = this.tree.range(start, end, includeStart, includeEnd);
144
+ if (options?.reverse) {
145
+ result = result.reverse();
146
+ }
147
+ return result;
148
+ }
149
+ /**
150
+ * 大于指定键的记录
151
+ * @param key 键
152
+ * @param include 是否包含该键
153
+ */
154
+ greaterThan(key, include = false) {
155
+ return this.tree.range(key, undefined, include, true);
156
+ }
157
+ /**
158
+ * 小于指定键的记录
159
+ * @param key 键
160
+ * @param include 是否包含该键
161
+ */
162
+ lessThan(key, include = false) {
163
+ const result = this.tree.range(undefined, key, true, include);
164
+ return result;
165
+ }
166
+ /**
167
+ * 获取所有键(有序)
168
+ */
169
+ keys() {
170
+ return this.tree.keys();
171
+ }
172
+ /**
173
+ * 获取所有值(按键顺序)
174
+ */
175
+ values() {
176
+ return this.tree.values();
177
+ }
178
+ /**
179
+ * 获取所有键值对(有序)
180
+ */
181
+ entries() {
182
+ return this.tree.entries();
183
+ }
184
+ /**
185
+ * 获取最小键
186
+ */
187
+ minKey() {
188
+ return this.tree.minKey();
189
+ }
190
+ /**
191
+ * 获取最大键
192
+ */
193
+ maxKey() {
194
+ return this.tree.maxKey();
195
+ }
196
+ /**
197
+ * 获取第一个键值对
198
+ */
199
+ first() {
200
+ return this.tree.first();
201
+ }
202
+ /**
203
+ * 获取最后一个键值对
204
+ */
205
+ last() {
206
+ return this.tree.last();
207
+ }
208
+ /**
209
+ * 清空索引
210
+ */
211
+ clear() {
212
+ this.tree.clear();
213
+ }
214
+ /**
215
+ * 遍历索引
216
+ * @param callback 回调函数
217
+ */
218
+ forEach(callback) {
219
+ this.tree.forEach(callback);
220
+ }
221
+ /**
222
+ * 创建迭代器
223
+ */
224
+ *[Symbol.iterator]() {
225
+ yield* this.tree;
226
+ }
227
+ /**
228
+ * 获取索引统计信息
229
+ */
230
+ getStats() {
231
+ const keyCount = this.tree.Size;
232
+ const memoryUsage = this.estimateMemoryUsage();
233
+ return {
234
+ name: this.config.name,
235
+ type: types_1.IndexType.Primary,
236
+ fieldName: this.config.fieldName,
237
+ keyCount,
238
+ entryCount: keyCount,
239
+ unique: true,
240
+ memoryUsage,
241
+ };
242
+ }
243
+ /**
244
+ * 批量插入
245
+ * @param entries 键值对数组
246
+ * @param throwOnDuplicate 如果键已存在是否抛出异常
247
+ */
248
+ insertBatch(entries, throwOnDuplicate = false) {
249
+ let success = 0;
250
+ let failed = 0;
251
+ const errors = [];
252
+ for (const { key, value } of entries) {
253
+ try {
254
+ if (this.insert(key, value, throwOnDuplicate)) {
255
+ success++;
256
+ } else {
257
+ failed++;
258
+ errors.push({ key, error: "Duplicate key" });
259
+ }
260
+ } catch (error) {
261
+ failed++;
262
+ errors.push({
263
+ key,
264
+ error: error instanceof Error ? error.message : "Unknown error",
265
+ });
266
+ }
267
+ }
268
+ return { success, failed, errors };
269
+ }
270
+ /**
271
+ * 批量删除
272
+ * @param keys 键数组
273
+ * @param throwOnMissing 如果键不存在是否抛出异常
274
+ */
275
+ deleteBatch(keys, throwOnMissing = false) {
276
+ let success = 0;
277
+ let failed = 0;
278
+ const errors = [];
279
+ for (const key of keys) {
280
+ try {
281
+ if (this.delete(key, throwOnMissing) !== undefined) {
282
+ success++;
283
+ } else {
284
+ failed++;
285
+ errors.push({ key, error: "Key not found" });
286
+ }
287
+ } catch (error) {
288
+ failed++;
289
+ errors.push({
290
+ key,
291
+ error: error instanceof Error ? error.message : "Unknown error",
292
+ });
293
+ }
294
+ }
295
+ return { success, failed, errors };
296
+ }
297
+ /**
298
+ * 估算内存使用
299
+ */
300
+ estimateMemoryUsage() {
301
+ const keyCount = this.tree.Size;
302
+ const avgKeySize = 16;
303
+ const avgValueSize = 64;
304
+ const nodeOverhead = 128;
305
+ const estimatedNodes = Math.ceil(keyCount / (this.config.order * 0.7));
306
+ return keyCount * (avgKeySize + avgValueSize) + estimatedNodes * nodeOverhead;
307
+ }
308
+ /**
309
+ * 验证索引一致性
310
+ * 用于调试和测试
311
+ */
312
+ validate() {
313
+ const errors = [];
314
+ const seenKeys = new Set();
315
+ let prevKey;
316
+ let current = this.tree.first();
317
+ while (current !== undefined) {
318
+ if (seenKeys.has(current.key)) {
319
+ errors.push(`Duplicate key found: ${current.key}`);
320
+ }
321
+ seenKeys.add(current.key);
322
+ if (prevKey !== undefined) {
323
+ const cmp = this.config.comparator ? this.config.comparator(prevKey, current.key) : defaultCompare(prevKey, current.key);
324
+ if (cmp >= 0) {
325
+ errors.push(`Keys not in order: ${prevKey} >= ${current.key}`);
326
+ }
327
+ }
328
+ prevKey = current.key;
329
+ current = this.tree.entries().find((e) => e.key > current.key);
330
+ }
331
+ if (seenKeys.size !== this.tree.Size) {
332
+ errors.push(`Key count mismatch: expected ${this.tree.Size}, found ${seenKeys.size}`);
333
+ }
334
+ return {
335
+ valid: errors.length === 0,
336
+ errors,
337
+ };
338
+ }
339
+ }
340
+ exports.PrimaryIndex = PrimaryIndex;
341
+ /**
342
+ * 默认比较函数
343
+ */
344
+ function defaultCompare(a, b) {
345
+ if (typeof a === "number" && typeof b === "number") {
346
+ return a - b;
347
+ }
348
+ const strA = String(a);
349
+ const strB = String(b);
350
+ if (strA < strB) return -1;
351
+ if (strA > strB) return 1;
352
+ return 0;
353
+ }
354
+ //# sourceMappingURL=PrimaryIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrimaryIndex.js","sourceRoot":"","sources":["../../src/indexes/PrimaryIndex.ts"],"names":[],"mappings":"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"}