@push.rocks/smartdb 1.0.1 → 2.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.
- package/.smartconfig.json +7 -4
- package/dist_rust/rustdb_linux_amd64 +0 -0
- package/dist_rust/rustdb_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/ts_local/classes.localsmartdb.d.ts +5 -5
- package/dist_ts/ts_local/classes.localsmartdb.js +5 -6
- package/dist_ts/ts_local/plugins.d.ts +1 -2
- package/dist_ts/ts_local/plugins.js +3 -3
- package/dist_ts/ts_smartdb/index.d.ts +1 -24
- package/dist_ts/ts_smartdb/index.js +4 -29
- package/dist_ts/ts_smartdb/plugins.d.ts +2 -10
- package/dist_ts/ts_smartdb/plugins.js +3 -13
- package/dist_ts/ts_smartdb/rust-db-bridge.d.ts +43 -0
- package/dist_ts/ts_smartdb/rust-db-bridge.js +98 -0
- package/dist_ts/ts_smartdb/server/SmartdbServer.d.ts +8 -37
- package/dist_ts/ts_smartdb/server/SmartdbServer.js +49 -204
- package/dist_ts/ts_smartdb/server/index.d.ts +0 -4
- package/dist_ts/ts_smartdb/server/index.js +1 -5
- package/license +3 -1
- package/package.json +9 -12
- package/readme.md +84 -171
- package/ts/00_commitinfo_data.ts +2 -2
- package/ts/ts_local/classes.localsmartdb.ts +5 -6
- package/ts/ts_local/plugins.ts +1 -3
- package/ts/ts_smartdb/index.ts +3 -41
- package/ts/ts_smartdb/plugins.ts +2 -15
- package/ts/ts_smartdb/rust-db-bridge.ts +138 -0
- package/ts/ts_smartdb/server/SmartdbServer.ts +53 -248
- package/ts/ts_smartdb/server/index.ts +0 -7
- package/dist_ts/ts_smartdb/engine/AggregationEngine.d.ts +0 -66
- package/dist_ts/ts_smartdb/engine/AggregationEngine.js +0 -189
- package/dist_ts/ts_smartdb/engine/IndexEngine.d.ts +0 -97
- package/dist_ts/ts_smartdb/engine/IndexEngine.js +0 -678
- package/dist_ts/ts_smartdb/engine/QueryEngine.d.ts +0 -54
- package/dist_ts/ts_smartdb/engine/QueryEngine.js +0 -271
- package/dist_ts/ts_smartdb/engine/QueryPlanner.d.ts +0 -64
- package/dist_ts/ts_smartdb/engine/QueryPlanner.js +0 -308
- package/dist_ts/ts_smartdb/engine/SessionEngine.d.ts +0 -117
- package/dist_ts/ts_smartdb/engine/SessionEngine.js +0 -232
- package/dist_ts/ts_smartdb/engine/TransactionEngine.d.ts +0 -85
- package/dist_ts/ts_smartdb/engine/TransactionEngine.js +0 -287
- package/dist_ts/ts_smartdb/engine/UpdateEngine.d.ts +0 -47
- package/dist_ts/ts_smartdb/engine/UpdateEngine.js +0 -461
- package/dist_ts/ts_smartdb/errors/SmartdbErrors.d.ts +0 -100
- package/dist_ts/ts_smartdb/errors/SmartdbErrors.js +0 -155
- package/dist_ts/ts_smartdb/server/CommandRouter.d.ts +0 -87
- package/dist_ts/ts_smartdb/server/CommandRouter.js +0 -222
- package/dist_ts/ts_smartdb/server/WireProtocol.d.ts +0 -117
- package/dist_ts/ts_smartdb/server/WireProtocol.js +0 -298
- package/dist_ts/ts_smartdb/server/handlers/AdminHandler.d.ts +0 -100
- package/dist_ts/ts_smartdb/server/handlers/AdminHandler.js +0 -668
- package/dist_ts/ts_smartdb/server/handlers/AggregateHandler.d.ts +0 -31
- package/dist_ts/ts_smartdb/server/handlers/AggregateHandler.js +0 -277
- package/dist_ts/ts_smartdb/server/handlers/DeleteHandler.d.ts +0 -8
- package/dist_ts/ts_smartdb/server/handlers/DeleteHandler.js +0 -95
- package/dist_ts/ts_smartdb/server/handlers/FindHandler.d.ts +0 -31
- package/dist_ts/ts_smartdb/server/handlers/FindHandler.js +0 -291
- package/dist_ts/ts_smartdb/server/handlers/HelloHandler.d.ts +0 -11
- package/dist_ts/ts_smartdb/server/handlers/HelloHandler.js +0 -62
- package/dist_ts/ts_smartdb/server/handlers/IndexHandler.d.ts +0 -20
- package/dist_ts/ts_smartdb/server/handlers/IndexHandler.js +0 -183
- package/dist_ts/ts_smartdb/server/handlers/InsertHandler.d.ts +0 -8
- package/dist_ts/ts_smartdb/server/handlers/InsertHandler.js +0 -79
- package/dist_ts/ts_smartdb/server/handlers/UpdateHandler.d.ts +0 -24
- package/dist_ts/ts_smartdb/server/handlers/UpdateHandler.js +0 -296
- package/dist_ts/ts_smartdb/server/handlers/index.d.ts +0 -8
- package/dist_ts/ts_smartdb/server/handlers/index.js +0 -10
- package/dist_ts/ts_smartdb/storage/FileStorageAdapter.d.ts +0 -85
- package/dist_ts/ts_smartdb/storage/FileStorageAdapter.js +0 -465
- package/dist_ts/ts_smartdb/storage/IStorageAdapter.d.ts +0 -145
- package/dist_ts/ts_smartdb/storage/IStorageAdapter.js +0 -2
- package/dist_ts/ts_smartdb/storage/MemoryStorageAdapter.d.ts +0 -67
- package/dist_ts/ts_smartdb/storage/MemoryStorageAdapter.js +0 -378
- package/dist_ts/ts_smartdb/storage/OpLog.d.ts +0 -93
- package/dist_ts/ts_smartdb/storage/OpLog.js +0 -221
- package/dist_ts/ts_smartdb/storage/WAL.d.ts +0 -117
- package/dist_ts/ts_smartdb/storage/WAL.js +0 -286
- package/dist_ts/ts_smartdb/types/interfaces.d.ts +0 -363
- package/dist_ts/ts_smartdb/types/interfaces.js +0 -2
- package/dist_ts/ts_smartdb/utils/checksum.d.ts +0 -30
- package/dist_ts/ts_smartdb/utils/checksum.js +0 -77
- package/dist_ts/ts_smartdb/utils/index.d.ts +0 -1
- package/dist_ts/ts_smartdb/utils/index.js +0 -2
- package/ts/ts_smartdb/engine/AggregationEngine.ts +0 -283
- package/ts/ts_smartdb/engine/IndexEngine.ts +0 -798
- package/ts/ts_smartdb/engine/QueryEngine.ts +0 -301
- package/ts/ts_smartdb/engine/QueryPlanner.ts +0 -393
- package/ts/ts_smartdb/engine/SessionEngine.ts +0 -292
- package/ts/ts_smartdb/engine/TransactionEngine.ts +0 -351
- package/ts/ts_smartdb/engine/UpdateEngine.ts +0 -506
- package/ts/ts_smartdb/errors/SmartdbErrors.ts +0 -181
- package/ts/ts_smartdb/server/CommandRouter.ts +0 -289
- package/ts/ts_smartdb/server/WireProtocol.ts +0 -416
- package/ts/ts_smartdb/server/handlers/AdminHandler.ts +0 -719
- package/ts/ts_smartdb/server/handlers/AggregateHandler.ts +0 -342
- package/ts/ts_smartdb/server/handlers/DeleteHandler.ts +0 -115
- package/ts/ts_smartdb/server/handlers/FindHandler.ts +0 -330
- package/ts/ts_smartdb/server/handlers/HelloHandler.ts +0 -78
- package/ts/ts_smartdb/server/handlers/IndexHandler.ts +0 -207
- package/ts/ts_smartdb/server/handlers/InsertHandler.ts +0 -97
- package/ts/ts_smartdb/server/handlers/UpdateHandler.ts +0 -344
- package/ts/ts_smartdb/server/handlers/index.ts +0 -10
- package/ts/ts_smartdb/storage/FileStorageAdapter.ts +0 -562
- package/ts/ts_smartdb/storage/IStorageAdapter.ts +0 -208
- package/ts/ts_smartdb/storage/MemoryStorageAdapter.ts +0 -455
- package/ts/ts_smartdb/storage/OpLog.ts +0 -282
- package/ts/ts_smartdb/storage/WAL.ts +0 -375
- package/ts/ts_smartdb/types/interfaces.ts +0 -433
- package/ts/ts_smartdb/utils/checksum.ts +0 -88
- package/ts/ts_smartdb/utils/index.ts +0 -1
|
@@ -1,461 +0,0 @@
|
|
|
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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
|
|
@@ -1,100 +0,0 @@
|
|
|
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;
|