@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,235 @@
1
+ /**
2
+ * LightDB 集合类
3
+ * 提供类型安全的 CRUD 操作和链式查询 API
4
+ */
5
+ import { QueryBuilder, QueryExecutor } from "./QueryBuilder";
6
+ import type {
7
+ CollectionOptions,
8
+ InsertOptions,
9
+ InsertResult,
10
+ InsertManyResult,
11
+ UpdateOptions,
12
+ UpdateResult,
13
+ DeleteOptions,
14
+ DeleteResult,
15
+ QueryFilter,
16
+ QueryOptions,
17
+ FindResult,
18
+ UpdateOperation,
19
+ PrimaryKeyType,
20
+ CollectionStats,
21
+ CollectionEventListener,
22
+ CollectionEventType,
23
+ IndexConfig,
24
+ } from "./types";
25
+ /**
26
+ * 集合错误类
27
+ */
28
+ export declare class CollectionError extends Error {
29
+ readonly code: string;
30
+ constructor(message: string, code: string);
31
+ }
32
+ /**
33
+ * LightDB 集合
34
+ * 类似数据库表的概念,提供类型安全的 CRUD 操作
35
+ */
36
+ export declare class Collection<T extends Record<string, unknown>> implements QueryExecutor<T> {
37
+ private readonly name;
38
+ private readonly primaryKeyField;
39
+ private readonly indexManager;
40
+ private readonly eventListeners;
41
+ /**
42
+ * 创建集合实例
43
+ * @param options 集合配置选项
44
+ */
45
+ constructor(options: CollectionOptions<T>);
46
+ /**
47
+ * 获取集合名称
48
+ */
49
+ get Name(): string;
50
+ /**
51
+ * 获取主键字段名
52
+ */
53
+ get PrimaryKeyField(): string;
54
+ /**
55
+ * 获取文档数量
56
+ */
57
+ get Size(): number;
58
+ /**
59
+ * 插入单条文档
60
+ * @param doc 要插入的文档
61
+ * @param options 插入选项
62
+ */
63
+ insert(doc: T, options?: InsertOptions): InsertResult<T>;
64
+ /**
65
+ * 批量插入文档
66
+ * @param docs 要插入的文档数组
67
+ * @param options 插入选项
68
+ */
69
+ insertMany(docs: T[], options?: InsertOptions): InsertManyResult<T>;
70
+ /**
71
+ * 查找文档
72
+ * @param options 查询选项
73
+ */
74
+ find(options?: QueryOptions<T>): FindResult<T>;
75
+ /**
76
+ * 查找单条文档
77
+ * @param filter 查询条件
78
+ */
79
+ findOne(filter: QueryFilter<T>): T | null;
80
+ /**
81
+ * 通过主键查找文档
82
+ * @param primaryKey 主键值
83
+ */
84
+ findByPrimaryKey(primaryKey: PrimaryKeyType): T | undefined;
85
+ /**
86
+ * 通过二级索引查找文档
87
+ * @param indexName 索引名称
88
+ * @param value 索引值
89
+ */
90
+ findBySecondaryIndex(indexName: string, value: unknown): T[];
91
+ /**
92
+ * 更新文档
93
+ * @param filter 查询条件
94
+ * @param update 更新操作
95
+ * @param options 更新选项
96
+ */
97
+ update(filter: QueryFilter<T>, update: UpdateOperation<T>, options?: UpdateOptions): UpdateResult;
98
+ /**
99
+ * 更新单条文档
100
+ * @param filter 查询条件
101
+ * @param update 更新操作
102
+ * @param options 更新选项
103
+ */
104
+ updateOne(filter: QueryFilter<T>, update: UpdateOperation<T>, options?: Omit<UpdateOptions, "multi">): UpdateResult;
105
+ /**
106
+ * 更新多条文档
107
+ * @param filter 查询条件
108
+ * @param update 更新操作
109
+ * @param options 更新选项
110
+ */
111
+ updateMany(filter: QueryFilter<T>, update: UpdateOperation<T>, options?: Omit<UpdateOptions, "multi">): UpdateResult;
112
+ /**
113
+ * Upsert 操作
114
+ */
115
+ private upsert;
116
+ /**
117
+ * 删除文档
118
+ * @param filter 查询条件
119
+ * @param options 删除选项
120
+ */
121
+ delete(filter: QueryFilter<T>, options?: DeleteOptions): DeleteResult;
122
+ /**
123
+ * 删除单条文档
124
+ * @param filter 查询条件
125
+ * @param options 删除选项
126
+ */
127
+ deleteOne(filter: QueryFilter<T>, options?: Omit<DeleteOptions, "multi">): DeleteResult;
128
+ /**
129
+ * 删除多条文档
130
+ * @param filter 查询条件
131
+ * @param options 删除选项
132
+ */
133
+ deleteMany(filter: QueryFilter<T>, options?: Omit<DeleteOptions, "multi">): DeleteResult;
134
+ /**
135
+ * 通过主键删除文档
136
+ * @param primaryKey 主键值
137
+ */
138
+ deleteByPrimaryKey(primaryKey: PrimaryKeyType): boolean;
139
+ /**
140
+ * 统计文档数量
141
+ * @param filter 查询条件
142
+ */
143
+ count(filter?: QueryFilter<T>): number;
144
+ /**
145
+ * 检查文档是否存在
146
+ * @param filter 查询条件
147
+ */
148
+ exists(filter: QueryFilter<T>): boolean;
149
+ /**
150
+ * 创建查询构建器
151
+ */
152
+ query(): QueryBuilder<T>;
153
+ /**
154
+ * 清空集合
155
+ */
156
+ clear(): void;
157
+ /**
158
+ * 获取集合统计信息
159
+ */
160
+ getStats(): CollectionStats;
161
+ /**
162
+ * 创建二级索引
163
+ * @param config 索引配置
164
+ */
165
+ createIndex(config: IndexConfig<T>): void;
166
+ /**
167
+ * 删除二级索引
168
+ * @param name 索引名称
169
+ */
170
+ dropIndex(name: string): boolean;
171
+ /**
172
+ * 获取所有索引名称
173
+ */
174
+ getIndexNames(): string[];
175
+ /**
176
+ * 添加事件监听器
177
+ * @param event 事件类型
178
+ * @param listener 监听器函数
179
+ */
180
+ on(event: CollectionEventType, listener: CollectionEventListener<T>): void;
181
+ /**
182
+ * 移除事件监听器
183
+ * @param event 事件类型
184
+ * @param listener 监听器函数
185
+ */
186
+ off(event: CollectionEventType, listener: CollectionEventListener<T>): void;
187
+ /**
188
+ * 触发事件
189
+ */
190
+ private emitEvent;
191
+ /**
192
+ * 提取主键值
193
+ */
194
+ extractPrimaryKey(doc: T): PrimaryKeyType;
195
+ /**
196
+ * 应用更新操作
197
+ */
198
+ private applyUpdate;
199
+ /**
200
+ * 检查是否是更新操作符
201
+ */
202
+ private isUpdateOperators;
203
+ /**
204
+ * 应用更新操作符
205
+ */
206
+ private applyUpdateOperators;
207
+ /**
208
+ * 从更新操作创建文档
209
+ */
210
+ private createDocFromUpdate;
211
+ /**
212
+ * 获取所有文档
213
+ */
214
+ getAll(): T[];
215
+ /**
216
+ * 获取主键字段名(实现 QueryExecutor 接口)
217
+ */
218
+ getPrimaryKeyField(): string;
219
+ /**
220
+ * 获取二级索引字段列表(实现 QueryExecutor 接口)
221
+ */
222
+ getSecondaryIndexFields(): string[];
223
+ /**
224
+ * 验证集合一致性
225
+ */
226
+ validate(): {
227
+ valid: boolean;
228
+ errors: string[];
229
+ };
230
+ /**
231
+ * 重建所有索引
232
+ */
233
+ rebuildIndexes(): void;
234
+ }
235
+ //# sourceMappingURL=Collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Collection.d.ts","sourceRoot":"","sources":["../../src/collection/Collection.ts"],"names":[],"mappings":"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"}