@push.rocks/smartdb 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.smartconfig.json +38 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/index.d.ts +5 -0
- package/dist_ts/index.js +8 -0
- package/dist_ts/ts_local/classes.localsmartdb.d.ts +78 -0
- package/dist_ts/ts_local/classes.localsmartdb.js +115 -0
- package/dist_ts/ts_local/index.d.ts +2 -0
- package/dist_ts/ts_local/index.js +2 -0
- package/dist_ts/ts_local/plugins.d.ts +2 -0
- package/dist_ts/ts_local/plugins.js +3 -0
- package/dist_ts/ts_smartdb/engine/AggregationEngine.d.ts +66 -0
- package/dist_ts/ts_smartdb/engine/AggregationEngine.js +189 -0
- package/dist_ts/ts_smartdb/engine/IndexEngine.d.ts +97 -0
- package/dist_ts/ts_smartdb/engine/IndexEngine.js +678 -0
- package/dist_ts/ts_smartdb/engine/QueryEngine.d.ts +54 -0
- package/dist_ts/ts_smartdb/engine/QueryEngine.js +271 -0
- package/dist_ts/ts_smartdb/engine/QueryPlanner.d.ts +64 -0
- package/dist_ts/ts_smartdb/engine/QueryPlanner.js +308 -0
- package/dist_ts/ts_smartdb/engine/SessionEngine.d.ts +117 -0
- package/dist_ts/ts_smartdb/engine/SessionEngine.js +232 -0
- package/dist_ts/ts_smartdb/engine/TransactionEngine.d.ts +85 -0
- package/dist_ts/ts_smartdb/engine/TransactionEngine.js +287 -0
- package/dist_ts/ts_smartdb/engine/UpdateEngine.d.ts +47 -0
- package/dist_ts/ts_smartdb/engine/UpdateEngine.js +461 -0
- package/dist_ts/ts_smartdb/errors/SmartdbErrors.d.ts +100 -0
- package/dist_ts/ts_smartdb/errors/SmartdbErrors.js +155 -0
- package/dist_ts/ts_smartdb/index.d.ts +26 -0
- package/dist_ts/ts_smartdb/index.js +31 -0
- package/dist_ts/ts_smartdb/plugins.d.ts +10 -0
- package/dist_ts/ts_smartdb/plugins.js +14 -0
- package/dist_ts/ts_smartdb/server/CommandRouter.d.ts +87 -0
- package/dist_ts/ts_smartdb/server/CommandRouter.js +222 -0
- package/dist_ts/ts_smartdb/server/SmartdbServer.d.ts +102 -0
- package/dist_ts/ts_smartdb/server/SmartdbServer.js +279 -0
- package/dist_ts/ts_smartdb/server/WireProtocol.d.ts +117 -0
- package/dist_ts/ts_smartdb/server/WireProtocol.js +298 -0
- package/dist_ts/ts_smartdb/server/handlers/AdminHandler.d.ts +100 -0
- package/dist_ts/ts_smartdb/server/handlers/AdminHandler.js +668 -0
- package/dist_ts/ts_smartdb/server/handlers/AggregateHandler.d.ts +31 -0
- package/dist_ts/ts_smartdb/server/handlers/AggregateHandler.js +277 -0
- package/dist_ts/ts_smartdb/server/handlers/DeleteHandler.d.ts +8 -0
- package/dist_ts/ts_smartdb/server/handlers/DeleteHandler.js +95 -0
- package/dist_ts/ts_smartdb/server/handlers/FindHandler.d.ts +31 -0
- package/dist_ts/ts_smartdb/server/handlers/FindHandler.js +291 -0
- package/dist_ts/ts_smartdb/server/handlers/HelloHandler.d.ts +11 -0
- package/dist_ts/ts_smartdb/server/handlers/HelloHandler.js +62 -0
- package/dist_ts/ts_smartdb/server/handlers/IndexHandler.d.ts +20 -0
- package/dist_ts/ts_smartdb/server/handlers/IndexHandler.js +183 -0
- package/dist_ts/ts_smartdb/server/handlers/InsertHandler.d.ts +8 -0
- package/dist_ts/ts_smartdb/server/handlers/InsertHandler.js +79 -0
- package/dist_ts/ts_smartdb/server/handlers/UpdateHandler.d.ts +24 -0
- package/dist_ts/ts_smartdb/server/handlers/UpdateHandler.js +296 -0
- package/dist_ts/ts_smartdb/server/handlers/index.d.ts +8 -0
- package/dist_ts/ts_smartdb/server/handlers/index.js +10 -0
- package/dist_ts/ts_smartdb/server/index.d.ts +6 -0
- package/dist_ts/ts_smartdb/server/index.js +7 -0
- package/dist_ts/ts_smartdb/storage/FileStorageAdapter.d.ts +85 -0
- package/dist_ts/ts_smartdb/storage/FileStorageAdapter.js +465 -0
- package/dist_ts/ts_smartdb/storage/IStorageAdapter.d.ts +145 -0
- package/dist_ts/ts_smartdb/storage/IStorageAdapter.js +2 -0
- package/dist_ts/ts_smartdb/storage/MemoryStorageAdapter.d.ts +67 -0
- package/dist_ts/ts_smartdb/storage/MemoryStorageAdapter.js +378 -0
- package/dist_ts/ts_smartdb/storage/OpLog.d.ts +93 -0
- package/dist_ts/ts_smartdb/storage/OpLog.js +221 -0
- package/dist_ts/ts_smartdb/storage/WAL.d.ts +117 -0
- package/dist_ts/ts_smartdb/storage/WAL.js +286 -0
- package/dist_ts/ts_smartdb/types/interfaces.d.ts +363 -0
- package/dist_ts/ts_smartdb/types/interfaces.js +2 -0
- package/dist_ts/ts_smartdb/utils/checksum.d.ts +30 -0
- package/dist_ts/ts_smartdb/utils/checksum.js +77 -0
- package/dist_ts/ts_smartdb/utils/index.d.ts +1 -0
- package/dist_ts/ts_smartdb/utils/index.js +2 -0
- package/license +19 -0
- package/package.json +69 -0
- package/readme.md +529 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/index.ts +11 -0
- package/ts/ts_local/classes.localsmartdb.ts +143 -0
- package/ts/ts_local/index.ts +2 -0
- package/ts/ts_local/plugins.ts +3 -0
- package/ts/ts_smartdb/engine/AggregationEngine.ts +283 -0
- package/ts/ts_smartdb/engine/IndexEngine.ts +798 -0
- package/ts/ts_smartdb/engine/QueryEngine.ts +301 -0
- package/ts/ts_smartdb/engine/QueryPlanner.ts +393 -0
- package/ts/ts_smartdb/engine/SessionEngine.ts +292 -0
- package/ts/ts_smartdb/engine/TransactionEngine.ts +351 -0
- package/ts/ts_smartdb/engine/UpdateEngine.ts +506 -0
- package/ts/ts_smartdb/errors/SmartdbErrors.ts +181 -0
- package/ts/ts_smartdb/index.ts +46 -0
- package/ts/ts_smartdb/plugins.ts +17 -0
- package/ts/ts_smartdb/server/CommandRouter.ts +289 -0
- package/ts/ts_smartdb/server/SmartdbServer.ts +354 -0
- package/ts/ts_smartdb/server/WireProtocol.ts +416 -0
- package/ts/ts_smartdb/server/handlers/AdminHandler.ts +719 -0
- package/ts/ts_smartdb/server/handlers/AggregateHandler.ts +342 -0
- package/ts/ts_smartdb/server/handlers/DeleteHandler.ts +115 -0
- package/ts/ts_smartdb/server/handlers/FindHandler.ts +330 -0
- package/ts/ts_smartdb/server/handlers/HelloHandler.ts +78 -0
- package/ts/ts_smartdb/server/handlers/IndexHandler.ts +207 -0
- package/ts/ts_smartdb/server/handlers/InsertHandler.ts +97 -0
- package/ts/ts_smartdb/server/handlers/UpdateHandler.ts +344 -0
- package/ts/ts_smartdb/server/handlers/index.ts +10 -0
- package/ts/ts_smartdb/server/index.ts +10 -0
- package/ts/ts_smartdb/storage/FileStorageAdapter.ts +562 -0
- package/ts/ts_smartdb/storage/IStorageAdapter.ts +208 -0
- package/ts/ts_smartdb/storage/MemoryStorageAdapter.ts +455 -0
- package/ts/ts_smartdb/storage/OpLog.ts +282 -0
- package/ts/ts_smartdb/storage/WAL.ts +375 -0
- package/ts/ts_smartdb/types/interfaces.ts +433 -0
- package/ts/ts_smartdb/utils/checksum.ts +88 -0
- package/ts/ts_smartdb/utils/index.ts +1 -0
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { QueryEngine } from './QueryEngine.js';
|
|
3
|
+
/**
|
|
4
|
+
* Update engine for MongoDB-compatible update operations
|
|
5
|
+
*/
|
|
6
|
+
export class UpdateEngine {
|
|
7
|
+
/**
|
|
8
|
+
* Apply an update specification to a document
|
|
9
|
+
* Returns the updated document or null if no update was applied
|
|
10
|
+
*/
|
|
11
|
+
static applyUpdate(document, update, arrayFilters) {
|
|
12
|
+
// Check if this is an aggregation pipeline update
|
|
13
|
+
if (Array.isArray(update)) {
|
|
14
|
+
// Aggregation pipeline updates are not yet supported
|
|
15
|
+
throw new Error('Aggregation pipeline updates are not yet supported');
|
|
16
|
+
}
|
|
17
|
+
// Check if this is a replacement (no $ operators at top level)
|
|
18
|
+
const hasOperators = Object.keys(update).some(k => k.startsWith('$'));
|
|
19
|
+
if (!hasOperators) {
|
|
20
|
+
// This is a replacement - preserve _id
|
|
21
|
+
return {
|
|
22
|
+
_id: document._id,
|
|
23
|
+
...update,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Apply update operators
|
|
27
|
+
const result = this.deepClone(document);
|
|
28
|
+
for (const [operator, operand] of Object.entries(update)) {
|
|
29
|
+
switch (operator) {
|
|
30
|
+
case '$set':
|
|
31
|
+
this.applySet(result, operand);
|
|
32
|
+
break;
|
|
33
|
+
case '$unset':
|
|
34
|
+
this.applyUnset(result, operand);
|
|
35
|
+
break;
|
|
36
|
+
case '$inc':
|
|
37
|
+
this.applyInc(result, operand);
|
|
38
|
+
break;
|
|
39
|
+
case '$mul':
|
|
40
|
+
this.applyMul(result, operand);
|
|
41
|
+
break;
|
|
42
|
+
case '$min':
|
|
43
|
+
this.applyMin(result, operand);
|
|
44
|
+
break;
|
|
45
|
+
case '$max':
|
|
46
|
+
this.applyMax(result, operand);
|
|
47
|
+
break;
|
|
48
|
+
case '$rename':
|
|
49
|
+
this.applyRename(result, operand);
|
|
50
|
+
break;
|
|
51
|
+
case '$currentDate':
|
|
52
|
+
this.applyCurrentDate(result, operand);
|
|
53
|
+
break;
|
|
54
|
+
case '$setOnInsert':
|
|
55
|
+
// Only applied during upsert insert, handled elsewhere
|
|
56
|
+
break;
|
|
57
|
+
case '$push':
|
|
58
|
+
this.applyPush(result, operand, arrayFilters);
|
|
59
|
+
break;
|
|
60
|
+
case '$pop':
|
|
61
|
+
this.applyPop(result, operand);
|
|
62
|
+
break;
|
|
63
|
+
case '$pull':
|
|
64
|
+
this.applyPull(result, operand, arrayFilters);
|
|
65
|
+
break;
|
|
66
|
+
case '$pullAll':
|
|
67
|
+
this.applyPullAll(result, operand);
|
|
68
|
+
break;
|
|
69
|
+
case '$addToSet':
|
|
70
|
+
this.applyAddToSet(result, operand);
|
|
71
|
+
break;
|
|
72
|
+
case '$bit':
|
|
73
|
+
this.applyBit(result, operand);
|
|
74
|
+
break;
|
|
75
|
+
default:
|
|
76
|
+
throw new Error(`Unknown update operator: ${operator}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Apply $setOnInsert for upsert operations
|
|
83
|
+
*/
|
|
84
|
+
static applySetOnInsert(document, setOnInsert) {
|
|
85
|
+
const result = this.deepClone(document);
|
|
86
|
+
this.applySet(result, setOnInsert);
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Deep clone a document
|
|
91
|
+
*/
|
|
92
|
+
static deepClone(obj) {
|
|
93
|
+
if (obj === null || typeof obj !== 'object') {
|
|
94
|
+
return obj;
|
|
95
|
+
}
|
|
96
|
+
if (obj instanceof plugins.bson.ObjectId) {
|
|
97
|
+
return new plugins.bson.ObjectId(obj.toHexString());
|
|
98
|
+
}
|
|
99
|
+
if (obj instanceof Date) {
|
|
100
|
+
return new Date(obj.getTime());
|
|
101
|
+
}
|
|
102
|
+
if (obj instanceof plugins.bson.Timestamp) {
|
|
103
|
+
return new plugins.bson.Timestamp({ t: obj.high, i: obj.low });
|
|
104
|
+
}
|
|
105
|
+
if (Array.isArray(obj)) {
|
|
106
|
+
return obj.map(item => this.deepClone(item));
|
|
107
|
+
}
|
|
108
|
+
const cloned = {};
|
|
109
|
+
for (const key of Object.keys(obj)) {
|
|
110
|
+
cloned[key] = this.deepClone(obj[key]);
|
|
111
|
+
}
|
|
112
|
+
return cloned;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Set a nested value
|
|
116
|
+
*/
|
|
117
|
+
static setNestedValue(obj, path, value) {
|
|
118
|
+
const parts = path.split('.');
|
|
119
|
+
let current = obj;
|
|
120
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
121
|
+
const part = parts[i];
|
|
122
|
+
// Handle array index notation
|
|
123
|
+
const arrayMatch = part.match(/^(\w+)\[(\d+)\]$/);
|
|
124
|
+
if (arrayMatch) {
|
|
125
|
+
const [, fieldName, indexStr] = arrayMatch;
|
|
126
|
+
const index = parseInt(indexStr, 10);
|
|
127
|
+
if (!(fieldName in current)) {
|
|
128
|
+
current[fieldName] = [];
|
|
129
|
+
}
|
|
130
|
+
if (!current[fieldName][index]) {
|
|
131
|
+
current[fieldName][index] = {};
|
|
132
|
+
}
|
|
133
|
+
current = current[fieldName][index];
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
// Handle numeric index (array positional)
|
|
137
|
+
const numIndex = parseInt(part, 10);
|
|
138
|
+
if (!isNaN(numIndex) && Array.isArray(current)) {
|
|
139
|
+
if (!current[numIndex]) {
|
|
140
|
+
current[numIndex] = {};
|
|
141
|
+
}
|
|
142
|
+
current = current[numIndex];
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (!(part in current) || current[part] === null) {
|
|
146
|
+
current[part] = {};
|
|
147
|
+
}
|
|
148
|
+
current = current[part];
|
|
149
|
+
}
|
|
150
|
+
const lastPart = parts[parts.length - 1];
|
|
151
|
+
const numIndex = parseInt(lastPart, 10);
|
|
152
|
+
if (!isNaN(numIndex) && Array.isArray(current)) {
|
|
153
|
+
current[numIndex] = value;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
current[lastPart] = value;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get a nested value
|
|
161
|
+
*/
|
|
162
|
+
static getNestedValue(obj, path) {
|
|
163
|
+
return QueryEngine.getNestedValue(obj, path);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Delete a nested value
|
|
167
|
+
*/
|
|
168
|
+
static deleteNestedValue(obj, path) {
|
|
169
|
+
const parts = path.split('.');
|
|
170
|
+
let current = obj;
|
|
171
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
172
|
+
const part = parts[i];
|
|
173
|
+
if (!(part in current)) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
current = current[part];
|
|
177
|
+
}
|
|
178
|
+
delete current[parts[parts.length - 1]];
|
|
179
|
+
}
|
|
180
|
+
// ============================================================================
|
|
181
|
+
// Field Update Operators
|
|
182
|
+
// ============================================================================
|
|
183
|
+
static applySet(doc, fields) {
|
|
184
|
+
for (const [path, value] of Object.entries(fields)) {
|
|
185
|
+
this.setNestedValue(doc, path, this.deepClone(value));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
static applyUnset(doc, fields) {
|
|
189
|
+
for (const path of Object.keys(fields)) {
|
|
190
|
+
this.deleteNestedValue(doc, path);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
static applyInc(doc, fields) {
|
|
194
|
+
for (const [path, value] of Object.entries(fields)) {
|
|
195
|
+
const current = this.getNestedValue(doc, path) || 0;
|
|
196
|
+
if (typeof current !== 'number') {
|
|
197
|
+
throw new Error(`Cannot apply $inc to non-numeric field: ${path}`);
|
|
198
|
+
}
|
|
199
|
+
this.setNestedValue(doc, path, current + value);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
static applyMul(doc, fields) {
|
|
203
|
+
for (const [path, value] of Object.entries(fields)) {
|
|
204
|
+
const current = this.getNestedValue(doc, path) || 0;
|
|
205
|
+
if (typeof current !== 'number') {
|
|
206
|
+
throw new Error(`Cannot apply $mul to non-numeric field: ${path}`);
|
|
207
|
+
}
|
|
208
|
+
this.setNestedValue(doc, path, current * value);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
static applyMin(doc, fields) {
|
|
212
|
+
for (const [path, value] of Object.entries(fields)) {
|
|
213
|
+
const current = this.getNestedValue(doc, path);
|
|
214
|
+
if (current === undefined || this.compareValues(value, current) < 0) {
|
|
215
|
+
this.setNestedValue(doc, path, this.deepClone(value));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
static applyMax(doc, fields) {
|
|
220
|
+
for (const [path, value] of Object.entries(fields)) {
|
|
221
|
+
const current = this.getNestedValue(doc, path);
|
|
222
|
+
if (current === undefined || this.compareValues(value, current) > 0) {
|
|
223
|
+
this.setNestedValue(doc, path, this.deepClone(value));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
static applyRename(doc, fields) {
|
|
228
|
+
for (const [oldPath, newPath] of Object.entries(fields)) {
|
|
229
|
+
const value = this.getNestedValue(doc, oldPath);
|
|
230
|
+
if (value !== undefined) {
|
|
231
|
+
this.deleteNestedValue(doc, oldPath);
|
|
232
|
+
this.setNestedValue(doc, newPath, value);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
static applyCurrentDate(doc, fields) {
|
|
237
|
+
for (const [path, spec] of Object.entries(fields)) {
|
|
238
|
+
if (spec === true) {
|
|
239
|
+
this.setNestedValue(doc, path, new Date());
|
|
240
|
+
}
|
|
241
|
+
else if (typeof spec === 'object' && spec.$type === 'date') {
|
|
242
|
+
this.setNestedValue(doc, path, new Date());
|
|
243
|
+
}
|
|
244
|
+
else if (typeof spec === 'object' && spec.$type === 'timestamp') {
|
|
245
|
+
this.setNestedValue(doc, path, new plugins.bson.Timestamp({ t: Math.floor(Date.now() / 1000), i: 0 }));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// ============================================================================
|
|
250
|
+
// Array Update Operators
|
|
251
|
+
// ============================================================================
|
|
252
|
+
static applyPush(doc, fields, arrayFilters) {
|
|
253
|
+
for (const [path, spec] of Object.entries(fields)) {
|
|
254
|
+
let arr = this.getNestedValue(doc, path);
|
|
255
|
+
if (arr === undefined) {
|
|
256
|
+
arr = [];
|
|
257
|
+
this.setNestedValue(doc, path, arr);
|
|
258
|
+
}
|
|
259
|
+
if (!Array.isArray(arr)) {
|
|
260
|
+
throw new Error(`Cannot apply $push to non-array field: ${path}`);
|
|
261
|
+
}
|
|
262
|
+
if (spec && typeof spec === 'object' && '$each' in spec) {
|
|
263
|
+
// $push with modifiers
|
|
264
|
+
let elements = spec.$each.map(e => this.deepClone(e));
|
|
265
|
+
const position = spec.$position;
|
|
266
|
+
const slice = spec.$slice;
|
|
267
|
+
const sortSpec = spec.$sort;
|
|
268
|
+
if (position !== undefined) {
|
|
269
|
+
arr.splice(position, 0, ...elements);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
arr.push(...elements);
|
|
273
|
+
}
|
|
274
|
+
if (sortSpec !== undefined) {
|
|
275
|
+
if (typeof sortSpec === 'number') {
|
|
276
|
+
arr.sort((a, b) => (a - b) * sortSpec);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
// Sort by field(s)
|
|
280
|
+
const entries = Object.entries(sortSpec);
|
|
281
|
+
arr.sort((a, b) => {
|
|
282
|
+
for (const [field, dir] of entries) {
|
|
283
|
+
const av = this.getNestedValue(a, field);
|
|
284
|
+
const bv = this.getNestedValue(b, field);
|
|
285
|
+
const cmp = this.compareValues(av, bv) * dir;
|
|
286
|
+
if (cmp !== 0)
|
|
287
|
+
return cmp;
|
|
288
|
+
}
|
|
289
|
+
return 0;
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (slice !== undefined) {
|
|
294
|
+
if (slice >= 0) {
|
|
295
|
+
arr.splice(slice);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
arr.splice(0, arr.length + slice);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
// Simple push
|
|
304
|
+
arr.push(this.deepClone(spec));
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
static applyPop(doc, fields) {
|
|
309
|
+
for (const [path, direction] of Object.entries(fields)) {
|
|
310
|
+
const arr = this.getNestedValue(doc, path);
|
|
311
|
+
if (!Array.isArray(arr)) {
|
|
312
|
+
throw new Error(`Cannot apply $pop to non-array field: ${path}`);
|
|
313
|
+
}
|
|
314
|
+
if (direction === 1) {
|
|
315
|
+
arr.pop();
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
arr.shift();
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
static applyPull(doc, fields, arrayFilters) {
|
|
323
|
+
for (const [path, condition] of Object.entries(fields)) {
|
|
324
|
+
const arr = this.getNestedValue(doc, path);
|
|
325
|
+
if (!Array.isArray(arr)) {
|
|
326
|
+
continue; // Skip if not an array
|
|
327
|
+
}
|
|
328
|
+
if (typeof condition === 'object' && condition !== null && !Array.isArray(condition)) {
|
|
329
|
+
// Condition is a query filter
|
|
330
|
+
const hasOperators = Object.keys(condition).some(k => k.startsWith('$'));
|
|
331
|
+
if (hasOperators) {
|
|
332
|
+
// Filter using query operators
|
|
333
|
+
const remaining = arr.filter(item => !QueryEngine.matches(item, condition));
|
|
334
|
+
arr.length = 0;
|
|
335
|
+
arr.push(...remaining);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
// Match documents with all specified fields
|
|
339
|
+
const remaining = arr.filter(item => {
|
|
340
|
+
if (typeof item !== 'object' || item === null) {
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
return !Object.entries(condition).every(([k, v]) => {
|
|
344
|
+
const itemVal = this.getNestedValue(item, k);
|
|
345
|
+
return this.valuesEqual(itemVal, v);
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
arr.length = 0;
|
|
349
|
+
arr.push(...remaining);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
// Direct value match
|
|
354
|
+
const remaining = arr.filter(item => !this.valuesEqual(item, condition));
|
|
355
|
+
arr.length = 0;
|
|
356
|
+
arr.push(...remaining);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
static applyPullAll(doc, fields) {
|
|
361
|
+
for (const [path, values] of Object.entries(fields)) {
|
|
362
|
+
const arr = this.getNestedValue(doc, path);
|
|
363
|
+
if (!Array.isArray(arr)) {
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
if (!Array.isArray(values)) {
|
|
367
|
+
throw new Error(`$pullAll requires an array argument`);
|
|
368
|
+
}
|
|
369
|
+
const valueSet = new Set(values.map(v => JSON.stringify(v)));
|
|
370
|
+
const remaining = arr.filter(item => !valueSet.has(JSON.stringify(item)));
|
|
371
|
+
arr.length = 0;
|
|
372
|
+
arr.push(...remaining);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
static applyAddToSet(doc, fields) {
|
|
376
|
+
for (const [path, spec] of Object.entries(fields)) {
|
|
377
|
+
let arr = this.getNestedValue(doc, path);
|
|
378
|
+
if (arr === undefined) {
|
|
379
|
+
arr = [];
|
|
380
|
+
this.setNestedValue(doc, path, arr);
|
|
381
|
+
}
|
|
382
|
+
if (!Array.isArray(arr)) {
|
|
383
|
+
throw new Error(`Cannot apply $addToSet to non-array field: ${path}`);
|
|
384
|
+
}
|
|
385
|
+
const existingSet = new Set(arr.map(v => JSON.stringify(v)));
|
|
386
|
+
if (spec && typeof spec === 'object' && '$each' in spec) {
|
|
387
|
+
for (const item of spec.$each) {
|
|
388
|
+
const key = JSON.stringify(item);
|
|
389
|
+
if (!existingSet.has(key)) {
|
|
390
|
+
arr.push(this.deepClone(item));
|
|
391
|
+
existingSet.add(key);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
const key = JSON.stringify(spec);
|
|
397
|
+
if (!existingSet.has(key)) {
|
|
398
|
+
arr.push(this.deepClone(spec));
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
static applyBit(doc, fields) {
|
|
404
|
+
for (const [path, operations] of Object.entries(fields)) {
|
|
405
|
+
let current = this.getNestedValue(doc, path) || 0;
|
|
406
|
+
if (typeof current !== 'number') {
|
|
407
|
+
throw new Error(`Cannot apply $bit to non-numeric field: ${path}`);
|
|
408
|
+
}
|
|
409
|
+
for (const [op, value] of Object.entries(operations)) {
|
|
410
|
+
switch (op) {
|
|
411
|
+
case 'and':
|
|
412
|
+
current = current & value;
|
|
413
|
+
break;
|
|
414
|
+
case 'or':
|
|
415
|
+
current = current | value;
|
|
416
|
+
break;
|
|
417
|
+
case 'xor':
|
|
418
|
+
current = current ^ value;
|
|
419
|
+
break;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
this.setNestedValue(doc, path, current);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// ============================================================================
|
|
426
|
+
// Helper Methods
|
|
427
|
+
// ============================================================================
|
|
428
|
+
static compareValues(a, b) {
|
|
429
|
+
if (a === b)
|
|
430
|
+
return 0;
|
|
431
|
+
if (a === null || a === undefined)
|
|
432
|
+
return -1;
|
|
433
|
+
if (b === null || b === undefined)
|
|
434
|
+
return 1;
|
|
435
|
+
if (typeof a === 'number' && typeof b === 'number') {
|
|
436
|
+
return a - b;
|
|
437
|
+
}
|
|
438
|
+
if (a instanceof Date && b instanceof Date) {
|
|
439
|
+
return a.getTime() - b.getTime();
|
|
440
|
+
}
|
|
441
|
+
if (typeof a === 'string' && typeof b === 'string') {
|
|
442
|
+
return a.localeCompare(b);
|
|
443
|
+
}
|
|
444
|
+
return String(a).localeCompare(String(b));
|
|
445
|
+
}
|
|
446
|
+
static valuesEqual(a, b) {
|
|
447
|
+
if (a === b)
|
|
448
|
+
return true;
|
|
449
|
+
if (a instanceof plugins.bson.ObjectId && b instanceof plugins.bson.ObjectId) {
|
|
450
|
+
return a.equals(b);
|
|
451
|
+
}
|
|
452
|
+
if (a instanceof Date && b instanceof Date) {
|
|
453
|
+
return a.getTime() === b.getTime();
|
|
454
|
+
}
|
|
455
|
+
if (typeof a === 'object' && typeof b === 'object' && a !== null && b !== null) {
|
|
456
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
457
|
+
}
|
|
458
|
+
return false;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRlRW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvdHNfc21hcnRkYi9lbmdpbmUvVXBkYXRlRW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQzs7R0FFRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBQ3ZCOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBeUIsRUFBRSxNQUFnQixFQUFFLFlBQXlCO1FBQ3ZGLGtEQUFrRDtRQUNsRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQixxREFBcUQ7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCwrREFBK0Q7UUFDL0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFdEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xCLHVDQUF1QztZQUN2QyxPQUFPO2dCQUNMLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRztnQkFDakIsR0FBRyxNQUFNO2FBQ1YsQ0FBQztRQUNKLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV4QyxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3pELFFBQVEsUUFBUSxFQUFFLENBQUM7Z0JBQ2pCLEtBQUssTUFB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
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for all SmartDB errors
|
|
3
|
+
* Mirrors MongoDB driver error hierarchy
|
|
4
|
+
*/
|
|
5
|
+
export declare class SmartdbError extends Error {
|
|
6
|
+
code?: number;
|
|
7
|
+
codeName?: string;
|
|
8
|
+
constructor(message: string, code?: number, codeName?: string);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Error thrown during connection issues
|
|
12
|
+
*/
|
|
13
|
+
export declare class SmartdbConnectionError extends SmartdbError {
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Error thrown when an operation times out
|
|
18
|
+
*/
|
|
19
|
+
export declare class SmartdbTimeoutError extends SmartdbError {
|
|
20
|
+
constructor(message: string);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Error thrown during write operations
|
|
24
|
+
*/
|
|
25
|
+
export declare class SmartdbWriteError extends SmartdbError {
|
|
26
|
+
writeErrors?: IWriteError[];
|
|
27
|
+
result?: any;
|
|
28
|
+
constructor(message: string, code?: number, writeErrors?: IWriteError[]);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Error thrown for duplicate key violations
|
|
32
|
+
*/
|
|
33
|
+
export declare class SmartdbDuplicateKeyError extends SmartdbWriteError {
|
|
34
|
+
keyPattern?: Record<string, 1>;
|
|
35
|
+
keyValue?: Record<string, any>;
|
|
36
|
+
constructor(message: string, keyPattern?: Record<string, 1>, keyValue?: Record<string, any>);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Error thrown for bulk write failures
|
|
40
|
+
*/
|
|
41
|
+
export declare class SmartdbBulkWriteError extends SmartdbError {
|
|
42
|
+
writeErrors: IWriteError[];
|
|
43
|
+
result: any;
|
|
44
|
+
constructor(message: string, writeErrors: IWriteError[], result: any);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Error thrown during transaction operations
|
|
48
|
+
*/
|
|
49
|
+
export declare class SmartdbTransactionError extends SmartdbError {
|
|
50
|
+
constructor(message: string, code?: number);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Error thrown when a transaction is aborted due to conflict
|
|
54
|
+
*/
|
|
55
|
+
export declare class SmartdbWriteConflictError extends SmartdbTransactionError {
|
|
56
|
+
constructor(message?: string);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Error thrown for invalid arguments
|
|
60
|
+
*/
|
|
61
|
+
export declare class SmartdbArgumentError extends SmartdbError {
|
|
62
|
+
constructor(message: string);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Error thrown when an operation is not supported
|
|
66
|
+
*/
|
|
67
|
+
export declare class SmartdbNotSupportedError extends SmartdbError {
|
|
68
|
+
constructor(message: string);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Error thrown when cursor is exhausted or closed
|
|
72
|
+
*/
|
|
73
|
+
export declare class SmartdbCursorError extends SmartdbError {
|
|
74
|
+
constructor(message: string);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Error thrown when a namespace (database.collection) is invalid
|
|
78
|
+
*/
|
|
79
|
+
export declare class SmartdbNamespaceError extends SmartdbError {
|
|
80
|
+
constructor(message: string);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Error thrown when an index operation fails
|
|
84
|
+
*/
|
|
85
|
+
export declare class SmartdbIndexError extends SmartdbError {
|
|
86
|
+
constructor(message: string, code?: number);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Write error detail for bulk operations
|
|
90
|
+
*/
|
|
91
|
+
export interface IWriteError {
|
|
92
|
+
index: number;
|
|
93
|
+
code: number;
|
|
94
|
+
errmsg: string;
|
|
95
|
+
op: any;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Convert any error to a SmartdbError
|
|
99
|
+
*/
|
|
100
|
+
export declare function toSmartdbError(error: any): SmartdbError;
|