@push.rocks/smartmongo 2.2.0 → 4.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +1 -1
- package/dist_ts/index.js +3 -3
- package/dist_ts/tsmdb/engine/AggregationEngine.js +189 -0
- package/dist_ts/{congodb → tsmdb}/engine/IndexEngine.d.ts +23 -3
- package/dist_ts/tsmdb/engine/IndexEngine.js +678 -0
- package/dist_ts/tsmdb/engine/QueryEngine.js +271 -0
- package/dist_ts/tsmdb/engine/QueryPlanner.d.ts +64 -0
- package/dist_ts/tsmdb/engine/QueryPlanner.js +308 -0
- package/dist_ts/tsmdb/engine/SessionEngine.d.ts +117 -0
- package/dist_ts/tsmdb/engine/SessionEngine.js +232 -0
- package/dist_ts/{congodb → tsmdb}/engine/TransactionEngine.d.ts +1 -1
- package/dist_ts/tsmdb/engine/TransactionEngine.js +287 -0
- package/dist_ts/tsmdb/engine/UpdateEngine.js +461 -0
- package/dist_ts/{congodb/errors/CongoErrors.d.ts → tsmdb/errors/TsmdbErrors.d.ts} +16 -16
- package/dist_ts/tsmdb/errors/TsmdbErrors.js +155 -0
- package/dist_ts/{congodb → tsmdb}/index.d.ts +11 -4
- package/dist_ts/tsmdb/index.js +31 -0
- package/dist_ts/tsmdb/server/CommandRouter.d.ts +87 -0
- package/dist_ts/tsmdb/server/CommandRouter.js +222 -0
- package/dist_ts/{congodb/server/CongoServer.d.ts → tsmdb/server/TsmdbServer.d.ts} +6 -6
- package/dist_ts/tsmdb/server/TsmdbServer.js +229 -0
- package/dist_ts/{congodb → tsmdb}/server/WireProtocol.d.ts +1 -1
- package/dist_ts/tsmdb/server/WireProtocol.js +298 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/AdminHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/AdminHandler.js +668 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/AggregateHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/AggregateHandler.js +277 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/DeleteHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/DeleteHandler.js +95 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/FindHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/FindHandler.js +291 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/HelloHandler.d.ts +1 -1
- package/dist_ts/{congodb → tsmdb}/server/handlers/HelloHandler.js +2 -2
- package/dist_ts/{congodb → tsmdb}/server/handlers/IndexHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/IndexHandler.js +183 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/InsertHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/InsertHandler.js +79 -0
- package/dist_ts/{congodb → tsmdb}/server/handlers/UpdateHandler.d.ts +1 -1
- package/dist_ts/tsmdb/server/handlers/UpdateHandler.js +296 -0
- package/dist_ts/tsmdb/server/handlers/index.js +10 -0
- package/dist_ts/{congodb → tsmdb}/server/index.d.ts +2 -2
- package/dist_ts/tsmdb/server/index.js +7 -0
- package/dist_ts/{congodb → tsmdb}/storage/FileStorageAdapter.d.ts +27 -3
- package/dist_ts/tsmdb/storage/FileStorageAdapter.js +465 -0
- package/dist_ts/{congodb → tsmdb}/storage/IStorageAdapter.d.ts +7 -2
- package/dist_ts/{congodb → tsmdb}/storage/IStorageAdapter.js +1 -1
- package/dist_ts/{congodb → tsmdb}/storage/MemoryStorageAdapter.d.ts +3 -2
- package/dist_ts/tsmdb/storage/MemoryStorageAdapter.js +378 -0
- package/dist_ts/{congodb → tsmdb}/storage/OpLog.d.ts +1 -1
- package/dist_ts/tsmdb/storage/OpLog.js +221 -0
- package/dist_ts/tsmdb/storage/WAL.d.ts +117 -0
- package/dist_ts/tsmdb/storage/WAL.js +286 -0
- package/dist_ts/tsmdb/tsmdb.plugins.js +14 -0
- package/dist_ts/{congodb → tsmdb}/types/interfaces.d.ts +3 -3
- package/dist_ts/{congodb → tsmdb}/types/interfaces.js +1 -1
- package/dist_ts/tsmdb/utils/checksum.d.ts +30 -0
- package/dist_ts/tsmdb/utils/checksum.js +77 -0
- package/dist_ts/tsmdb/utils/index.d.ts +1 -0
- package/dist_ts/tsmdb/utils/index.js +2 -0
- package/package.json +1 -1
- package/readme.hints.md +7 -12
- package/readme.md +25 -25
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +2 -2
- package/ts/{congodb → tsmdb}/engine/AggregationEngine.ts +1 -1
- package/ts/tsmdb/engine/IndexEngine.ts +798 -0
- package/ts/{congodb → tsmdb}/engine/QueryEngine.ts +1 -1
- package/ts/tsmdb/engine/QueryPlanner.ts +393 -0
- package/ts/tsmdb/engine/SessionEngine.ts +292 -0
- package/ts/{congodb → tsmdb}/engine/TransactionEngine.ts +12 -12
- package/ts/{congodb → tsmdb}/engine/UpdateEngine.ts +1 -1
- package/ts/{congodb/errors/CongoErrors.ts → tsmdb/errors/TsmdbErrors.ts} +34 -34
- package/ts/{congodb → tsmdb}/index.ts +16 -7
- package/ts/{congodb → tsmdb}/server/CommandRouter.ts +114 -5
- package/ts/{congodb/server/CongoServer.ts → tsmdb/server/TsmdbServer.ts} +11 -8
- package/ts/{congodb → tsmdb}/server/WireProtocol.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/AdminHandler.ts +116 -11
- package/ts/{congodb → tsmdb}/server/handlers/AggregateHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/DeleteHandler.ts +18 -3
- package/ts/{congodb → tsmdb}/server/handlers/FindHandler.ts +43 -14
- package/ts/{congodb → tsmdb}/server/handlers/HelloHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/IndexHandler.ts +1 -1
- package/ts/{congodb → tsmdb}/server/handlers/InsertHandler.ts +7 -1
- package/ts/{congodb → tsmdb}/server/handlers/UpdateHandler.ts +34 -5
- package/ts/{congodb → tsmdb}/server/index.ts +2 -2
- package/ts/{congodb → tsmdb}/storage/FileStorageAdapter.ts +90 -7
- package/ts/{congodb → tsmdb}/storage/IStorageAdapter.ts +8 -2
- package/ts/{congodb → tsmdb}/storage/MemoryStorageAdapter.ts +14 -2
- package/ts/{congodb → tsmdb}/storage/OpLog.ts +1 -1
- package/ts/tsmdb/storage/WAL.ts +375 -0
- package/ts/{congodb → tsmdb}/types/interfaces.ts +3 -3
- package/ts/tsmdb/utils/checksum.ts +88 -0
- package/ts/tsmdb/utils/index.ts +1 -0
- package/dist_ts/congodb/congodb.plugins.js +0 -14
- package/dist_ts/congodb/engine/AggregationEngine.js +0 -189
- package/dist_ts/congodb/engine/IndexEngine.js +0 -376
- package/dist_ts/congodb/engine/QueryEngine.js +0 -271
- package/dist_ts/congodb/engine/TransactionEngine.js +0 -287
- package/dist_ts/congodb/engine/UpdateEngine.js +0 -461
- package/dist_ts/congodb/errors/CongoErrors.js +0 -155
- package/dist_ts/congodb/index.js +0 -26
- package/dist_ts/congodb/server/CommandRouter.d.ts +0 -51
- package/dist_ts/congodb/server/CommandRouter.js +0 -132
- package/dist_ts/congodb/server/CongoServer.js +0 -227
- package/dist_ts/congodb/server/WireProtocol.js +0 -298
- package/dist_ts/congodb/server/handlers/AdminHandler.js +0 -568
- package/dist_ts/congodb/server/handlers/AggregateHandler.js +0 -277
- package/dist_ts/congodb/server/handlers/DeleteHandler.js +0 -83
- package/dist_ts/congodb/server/handlers/FindHandler.js +0 -261
- package/dist_ts/congodb/server/handlers/IndexHandler.js +0 -183
- package/dist_ts/congodb/server/handlers/InsertHandler.js +0 -76
- package/dist_ts/congodb/server/handlers/UpdateHandler.js +0 -270
- package/dist_ts/congodb/server/handlers/index.js +0 -10
- package/dist_ts/congodb/server/index.js +0 -7
- package/dist_ts/congodb/storage/FileStorageAdapter.js +0 -396
- package/dist_ts/congodb/storage/MemoryStorageAdapter.js +0 -367
- package/dist_ts/congodb/storage/OpLog.js +0 -221
- package/ts/congodb/engine/IndexEngine.ts +0 -479
- /package/dist_ts/{congodb → tsmdb}/engine/AggregationEngine.d.ts +0 -0
- /package/dist_ts/{congodb → tsmdb}/engine/QueryEngine.d.ts +0 -0
- /package/dist_ts/{congodb → tsmdb}/engine/UpdateEngine.d.ts +0 -0
- /package/dist_ts/{congodb → tsmdb}/server/handlers/index.d.ts +0 -0
- /package/dist_ts/{congodb/congodb.plugins.d.ts → tsmdb/tsmdb.plugins.d.ts} +0 -0
- /package/ts/{congodb → tsmdb}/server/handlers/index.ts +0 -0
- /package/ts/{congodb/congodb.plugins.ts → tsmdb/tsmdb.plugins.ts} +0 -0
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../congodb.plugins.js';
|
|
2
|
-
import { AggregationEngine } from '../../engine/AggregationEngine.js';
|
|
3
|
-
/**
|
|
4
|
-
* AggregateHandler - Handles aggregate command
|
|
5
|
-
*/
|
|
6
|
-
export class AggregateHandler {
|
|
7
|
-
cursors;
|
|
8
|
-
nextCursorId;
|
|
9
|
-
constructor(cursors, nextCursorId) {
|
|
10
|
-
this.cursors = cursors;
|
|
11
|
-
this.nextCursorId = nextCursorId;
|
|
12
|
-
}
|
|
13
|
-
async handle(context) {
|
|
14
|
-
const { storage, database, command } = context;
|
|
15
|
-
const collection = command.aggregate;
|
|
16
|
-
const pipeline = command.pipeline || [];
|
|
17
|
-
const cursor = command.cursor || {};
|
|
18
|
-
const batchSize = cursor.batchSize || 101;
|
|
19
|
-
// Validate
|
|
20
|
-
if (typeof collection !== 'string' && collection !== 1) {
|
|
21
|
-
return {
|
|
22
|
-
ok: 0,
|
|
23
|
-
errmsg: 'aggregate command requires a collection name or 1',
|
|
24
|
-
code: 2,
|
|
25
|
-
codeName: 'BadValue',
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
if (!Array.isArray(pipeline)) {
|
|
29
|
-
return {
|
|
30
|
-
ok: 0,
|
|
31
|
-
errmsg: 'pipeline must be an array',
|
|
32
|
-
code: 2,
|
|
33
|
-
codeName: 'BadValue',
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
try {
|
|
37
|
-
// Get source documents
|
|
38
|
-
let documents = [];
|
|
39
|
-
if (collection === 1 || collection === '1') {
|
|
40
|
-
// Database-level aggregation (e.g., $listLocalSessions)
|
|
41
|
-
documents = [];
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
// Collection-level aggregation
|
|
45
|
-
const exists = await storage.collectionExists(database, collection);
|
|
46
|
-
if (exists) {
|
|
47
|
-
documents = await storage.findAll(database, collection);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
// Handle $lookup and $graphLookup stages that reference other collections
|
|
51
|
-
const processedPipeline = await this.preprocessPipeline(storage, database, pipeline, documents);
|
|
52
|
-
// Run aggregation
|
|
53
|
-
let results;
|
|
54
|
-
// Check for special stages that we handle manually
|
|
55
|
-
if (this.hasSpecialStages(pipeline)) {
|
|
56
|
-
results = await this.executeWithSpecialStages(storage, database, documents, pipeline);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
results = AggregationEngine.aggregate(documents, processedPipeline);
|
|
60
|
-
}
|
|
61
|
-
// Handle $out and $merge stages
|
|
62
|
-
const lastStage = pipeline[pipeline.length - 1];
|
|
63
|
-
if (lastStage && lastStage.$out) {
|
|
64
|
-
await this.handleOut(storage, database, results, lastStage.$out);
|
|
65
|
-
return { ok: 1, cursor: { id: plugins.bson.Long.fromNumber(0), ns: `${database}.${collection}`, firstBatch: [] } };
|
|
66
|
-
}
|
|
67
|
-
if (lastStage && lastStage.$merge) {
|
|
68
|
-
await this.handleMerge(storage, database, results, lastStage.$merge);
|
|
69
|
-
return { ok: 1, cursor: { id: plugins.bson.Long.fromNumber(0), ns: `${database}.${collection}`, firstBatch: [] } };
|
|
70
|
-
}
|
|
71
|
-
// Build cursor response
|
|
72
|
-
const effectiveBatchSize = Math.min(batchSize, results.length);
|
|
73
|
-
const firstBatch = results.slice(0, effectiveBatchSize);
|
|
74
|
-
const remaining = results.slice(effectiveBatchSize);
|
|
75
|
-
let cursorId = BigInt(0);
|
|
76
|
-
if (remaining.length > 0) {
|
|
77
|
-
cursorId = this.nextCursorId();
|
|
78
|
-
this.cursors.set(cursorId, {
|
|
79
|
-
id: cursorId,
|
|
80
|
-
database,
|
|
81
|
-
collection: typeof collection === 'string' ? collection : '$cmd.aggregate',
|
|
82
|
-
documents: remaining,
|
|
83
|
-
position: 0,
|
|
84
|
-
batchSize,
|
|
85
|
-
createdAt: new Date(),
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
return {
|
|
89
|
-
ok: 1,
|
|
90
|
-
cursor: {
|
|
91
|
-
id: plugins.bson.Long.fromBigInt(cursorId),
|
|
92
|
-
ns: `${database}.${typeof collection === 'string' ? collection : '$cmd.aggregate'}`,
|
|
93
|
-
firstBatch,
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
return {
|
|
99
|
-
ok: 0,
|
|
100
|
-
errmsg: error.message || 'Aggregation failed',
|
|
101
|
-
code: 1,
|
|
102
|
-
codeName: 'InternalError',
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Preprocess pipeline to handle cross-collection lookups
|
|
108
|
-
*/
|
|
109
|
-
async preprocessPipeline(storage, database, pipeline, documents) {
|
|
110
|
-
// For now, return the pipeline as-is
|
|
111
|
-
// Cross-collection lookups are handled in executeWithSpecialStages
|
|
112
|
-
return pipeline;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Check if pipeline has stages that need special handling
|
|
116
|
-
*/
|
|
117
|
-
hasSpecialStages(pipeline) {
|
|
118
|
-
return pipeline.some(stage => stage.$lookup ||
|
|
119
|
-
stage.$graphLookup ||
|
|
120
|
-
stage.$unionWith);
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Execute pipeline with special stage handling
|
|
124
|
-
*/
|
|
125
|
-
async executeWithSpecialStages(storage, database, documents, pipeline) {
|
|
126
|
-
let results = [...documents];
|
|
127
|
-
for (const stage of pipeline) {
|
|
128
|
-
if (stage.$lookup) {
|
|
129
|
-
const lookupSpec = stage.$lookup;
|
|
130
|
-
const fromCollection = lookupSpec.from;
|
|
131
|
-
// Get foreign collection documents
|
|
132
|
-
const foreignExists = await storage.collectionExists(database, fromCollection);
|
|
133
|
-
const foreignDocs = foreignExists
|
|
134
|
-
? await storage.findAll(database, fromCollection)
|
|
135
|
-
: [];
|
|
136
|
-
results = AggregationEngine.executeLookup(results, lookupSpec, foreignDocs);
|
|
137
|
-
}
|
|
138
|
-
else if (stage.$graphLookup) {
|
|
139
|
-
const graphLookupSpec = stage.$graphLookup;
|
|
140
|
-
const fromCollection = graphLookupSpec.from;
|
|
141
|
-
const foreignExists = await storage.collectionExists(database, fromCollection);
|
|
142
|
-
const foreignDocs = foreignExists
|
|
143
|
-
? await storage.findAll(database, fromCollection)
|
|
144
|
-
: [];
|
|
145
|
-
results = AggregationEngine.executeGraphLookup(results, graphLookupSpec, foreignDocs);
|
|
146
|
-
}
|
|
147
|
-
else if (stage.$unionWith) {
|
|
148
|
-
let unionSpec = stage.$unionWith;
|
|
149
|
-
let unionColl;
|
|
150
|
-
let unionPipeline;
|
|
151
|
-
if (typeof unionSpec === 'string') {
|
|
152
|
-
unionColl = unionSpec;
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
unionColl = unionSpec.coll;
|
|
156
|
-
unionPipeline = unionSpec.pipeline;
|
|
157
|
-
}
|
|
158
|
-
const unionExists = await storage.collectionExists(database, unionColl);
|
|
159
|
-
const unionDocs = unionExists
|
|
160
|
-
? await storage.findAll(database, unionColl)
|
|
161
|
-
: [];
|
|
162
|
-
results = AggregationEngine.executeUnionWith(results, unionDocs, unionPipeline);
|
|
163
|
-
}
|
|
164
|
-
else if (stage.$facet) {
|
|
165
|
-
// Execute each facet pipeline separately
|
|
166
|
-
const facetResults = {};
|
|
167
|
-
for (const [facetName, facetPipeline] of Object.entries(stage.$facet)) {
|
|
168
|
-
const facetDocs = await this.executeWithSpecialStages(storage, database, results, facetPipeline);
|
|
169
|
-
facetResults[facetName] = facetDocs;
|
|
170
|
-
}
|
|
171
|
-
results = [facetResults];
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
// Regular stage - pass to mingo
|
|
175
|
-
results = AggregationEngine.aggregate(results, [stage]);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return results;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Handle $out stage - write results to a collection
|
|
182
|
-
*/
|
|
183
|
-
async handleOut(storage, database, results, outSpec) {
|
|
184
|
-
let targetDb = database;
|
|
185
|
-
let targetColl;
|
|
186
|
-
if (typeof outSpec === 'string') {
|
|
187
|
-
targetColl = outSpec;
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
targetDb = outSpec.db || database;
|
|
191
|
-
targetColl = outSpec.coll;
|
|
192
|
-
}
|
|
193
|
-
// Drop existing collection
|
|
194
|
-
await storage.dropCollection(targetDb, targetColl);
|
|
195
|
-
// Create new collection and insert results
|
|
196
|
-
await storage.createCollection(targetDb, targetColl);
|
|
197
|
-
for (const doc of results) {
|
|
198
|
-
if (!doc._id) {
|
|
199
|
-
doc._id = new plugins.bson.ObjectId();
|
|
200
|
-
}
|
|
201
|
-
await storage.insertOne(targetDb, targetColl, doc);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Handle $merge stage - merge results into a collection
|
|
206
|
-
*/
|
|
207
|
-
async handleMerge(storage, database, results, mergeSpec) {
|
|
208
|
-
let targetDb = database;
|
|
209
|
-
let targetColl;
|
|
210
|
-
if (typeof mergeSpec === 'string') {
|
|
211
|
-
targetColl = mergeSpec;
|
|
212
|
-
}
|
|
213
|
-
else if (typeof mergeSpec.into === 'string') {
|
|
214
|
-
targetColl = mergeSpec.into;
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
targetDb = mergeSpec.into.db || database;
|
|
218
|
-
targetColl = mergeSpec.into.coll;
|
|
219
|
-
}
|
|
220
|
-
const on = mergeSpec.on || '_id';
|
|
221
|
-
const whenMatched = mergeSpec.whenMatched || 'merge';
|
|
222
|
-
const whenNotMatched = mergeSpec.whenNotMatched || 'insert';
|
|
223
|
-
// Ensure target collection exists
|
|
224
|
-
await storage.createCollection(targetDb, targetColl);
|
|
225
|
-
for (const doc of results) {
|
|
226
|
-
// Find matching document
|
|
227
|
-
const existingDocs = await storage.findAll(targetDb, targetColl);
|
|
228
|
-
const onFields = Array.isArray(on) ? on : [on];
|
|
229
|
-
let matchingDoc = null;
|
|
230
|
-
for (const existing of existingDocs) {
|
|
231
|
-
let matches = true;
|
|
232
|
-
for (const field of onFields) {
|
|
233
|
-
if (JSON.stringify(existing[field]) !== JSON.stringify(doc[field])) {
|
|
234
|
-
matches = false;
|
|
235
|
-
break;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
if (matches) {
|
|
239
|
-
matchingDoc = existing;
|
|
240
|
-
break;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
if (matchingDoc) {
|
|
244
|
-
// Handle whenMatched
|
|
245
|
-
if (whenMatched === 'replace') {
|
|
246
|
-
await storage.updateById(targetDb, targetColl, matchingDoc._id, doc);
|
|
247
|
-
}
|
|
248
|
-
else if (whenMatched === 'keepExisting') {
|
|
249
|
-
// Do nothing
|
|
250
|
-
}
|
|
251
|
-
else if (whenMatched === 'merge') {
|
|
252
|
-
const merged = { ...matchingDoc, ...doc };
|
|
253
|
-
await storage.updateById(targetDb, targetColl, matchingDoc._id, merged);
|
|
254
|
-
}
|
|
255
|
-
else if (whenMatched === 'fail') {
|
|
256
|
-
throw new Error('Document matched but whenMatched is fail');
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
else {
|
|
260
|
-
// Handle whenNotMatched
|
|
261
|
-
if (whenNotMatched === 'insert') {
|
|
262
|
-
if (!doc._id) {
|
|
263
|
-
doc._id = new plugins.bson.ObjectId();
|
|
264
|
-
}
|
|
265
|
-
await storage.insertOne(targetDb, targetColl, doc);
|
|
266
|
-
}
|
|
267
|
-
else if (whenNotMatched === 'discard') {
|
|
268
|
-
// Do nothing
|
|
269
|
-
}
|
|
270
|
-
else if (whenNotMatched === 'fail') {
|
|
271
|
-
throw new Error('Document not matched but whenNotMatched is fail');
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdncmVnYXRlSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2NvbmdvZGIvc2VydmVyL2hhbmRsZXJzL0FnZ3JlZ2F0ZUhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUV0RTs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDbkIsT0FBTyxDQUE0QjtJQUNuQyxZQUFZLENBQWU7SUFFbkMsWUFDRSxPQUFrQyxFQUNsQyxZQUEwQjtRQUUxQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUF3QjtRQUNuQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFL0MsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUNyQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQztRQUUxQyxXQUFXO1FBQ1gsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksVUFBVSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLENBQUM7Z0JBQ0wsTUFBTSxFQUFFLG1EQUFtRDtnQkFDM0QsSUFBSSxFQUFFLENBQUM7Z0JBQ1AsUUFBUSxFQUFFLFVBQVU7YUFDckIsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJ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
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../congodb.plugins.js';
|
|
2
|
-
import { QueryEngine } from '../../engine/QueryEngine.js';
|
|
3
|
-
/**
|
|
4
|
-
* DeleteHandler - Handles delete commands
|
|
5
|
-
*/
|
|
6
|
-
export class DeleteHandler {
|
|
7
|
-
async handle(context) {
|
|
8
|
-
const { storage, database, command, documentSequences } = context;
|
|
9
|
-
const collection = command.delete;
|
|
10
|
-
if (typeof collection !== 'string') {
|
|
11
|
-
return {
|
|
12
|
-
ok: 0,
|
|
13
|
-
errmsg: 'delete command requires a collection name',
|
|
14
|
-
code: 2,
|
|
15
|
-
codeName: 'BadValue',
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
// Get deletes from command or document sequences
|
|
19
|
-
let deletes = command.deletes || [];
|
|
20
|
-
// Check for OP_MSG document sequences
|
|
21
|
-
if (documentSequences && documentSequences.has('deletes')) {
|
|
22
|
-
deletes = documentSequences.get('deletes');
|
|
23
|
-
}
|
|
24
|
-
if (!Array.isArray(deletes) || deletes.length === 0) {
|
|
25
|
-
return {
|
|
26
|
-
ok: 0,
|
|
27
|
-
errmsg: 'delete command requires deletes array',
|
|
28
|
-
code: 2,
|
|
29
|
-
codeName: 'BadValue',
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
const ordered = command.ordered !== false;
|
|
33
|
-
const writeErrors = [];
|
|
34
|
-
let totalDeleted = 0;
|
|
35
|
-
// Check if collection exists
|
|
36
|
-
const exists = await storage.collectionExists(database, collection);
|
|
37
|
-
if (!exists) {
|
|
38
|
-
// Collection doesn't exist, return success with 0 deleted
|
|
39
|
-
return { ok: 1, n: 0 };
|
|
40
|
-
}
|
|
41
|
-
for (let i = 0; i < deletes.length; i++) {
|
|
42
|
-
const deleteSpec = deletes[i];
|
|
43
|
-
const filter = deleteSpec.q || deleteSpec.filter || {};
|
|
44
|
-
const limit = deleteSpec.limit;
|
|
45
|
-
// limit: 0 means delete all matching, limit: 1 means delete one
|
|
46
|
-
const deleteAll = limit === 0;
|
|
47
|
-
try {
|
|
48
|
-
// Get all documents
|
|
49
|
-
const documents = await storage.findAll(database, collection);
|
|
50
|
-
// Apply filter
|
|
51
|
-
const matchingDocs = QueryEngine.filter(documents, filter);
|
|
52
|
-
if (matchingDocs.length === 0) {
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
// Determine which documents to delete
|
|
56
|
-
const docsToDelete = deleteAll ? matchingDocs : matchingDocs.slice(0, 1);
|
|
57
|
-
// Delete the documents
|
|
58
|
-
const idsToDelete = docsToDelete.map(doc => doc._id);
|
|
59
|
-
const deleted = await storage.deleteByIds(database, collection, idsToDelete);
|
|
60
|
-
totalDeleted += deleted;
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
writeErrors.push({
|
|
64
|
-
index: i,
|
|
65
|
-
code: error.code || 1,
|
|
66
|
-
errmsg: error.message || 'Delete failed',
|
|
67
|
-
});
|
|
68
|
-
if (ordered) {
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
const response = {
|
|
74
|
-
ok: 1,
|
|
75
|
-
n: totalDeleted,
|
|
76
|
-
};
|
|
77
|
-
if (writeErrors.length > 0) {
|
|
78
|
-
response.writeErrors = writeErrors;
|
|
79
|
-
}
|
|
80
|
-
return response;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVsZXRlSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2NvbmdvZGIvc2VydmVyL2hhbmRsZXJzL0RlbGV0ZUhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFMUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQUN4QixLQUFLLENBQUMsTUFBTSxDQUFDLE9BQXdCO1FBQ25DLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUVsRSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ2xDLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbkMsT0FBTztnQkFDTCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxNQUFNLEVBQUUsMkNBQTJDO2dCQUNuRCxJQUFJLEVBQUUsQ0FBQztnQkFDUCxRQUFRLEVBQUUsVUFBVTthQUNyQixDQUFDO1FBQ0osQ0FBQztRQUVELGlEQUFpRDtRQUNqRCxJQUFJLE9BQU8sR0FBNEIsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFFN0Qsc0NBQXNDO1FBQ3RDLElBQUksaUJBQWlCLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDMUQsT0FBTyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUUsQ0FBQztRQUM5QyxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxPQUFPO2dCQUNMLEVBQUUsRUFBRSxDQUFDO2dCQUNMLE1BQU0s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
|
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../congodb.plugins.js';
|
|
2
|
-
import { QueryEngine } from '../../engine/QueryEngine.js';
|
|
3
|
-
/**
|
|
4
|
-
* FindHandler - Handles find, getMore, killCursors, count, distinct commands
|
|
5
|
-
*/
|
|
6
|
-
export class FindHandler {
|
|
7
|
-
cursors;
|
|
8
|
-
nextCursorId;
|
|
9
|
-
constructor(cursors, nextCursorId) {
|
|
10
|
-
this.cursors = cursors;
|
|
11
|
-
this.nextCursorId = nextCursorId;
|
|
12
|
-
}
|
|
13
|
-
async handle(context) {
|
|
14
|
-
const { command } = context;
|
|
15
|
-
// Determine which operation to perform
|
|
16
|
-
if (command.find) {
|
|
17
|
-
return this.handleFind(context);
|
|
18
|
-
}
|
|
19
|
-
else if (command.getMore !== undefined) {
|
|
20
|
-
return this.handleGetMore(context);
|
|
21
|
-
}
|
|
22
|
-
else if (command.killCursors) {
|
|
23
|
-
return this.handleKillCursors(context);
|
|
24
|
-
}
|
|
25
|
-
else if (command.count) {
|
|
26
|
-
return this.handleCount(context);
|
|
27
|
-
}
|
|
28
|
-
else if (command.distinct) {
|
|
29
|
-
return this.handleDistinct(context);
|
|
30
|
-
}
|
|
31
|
-
return {
|
|
32
|
-
ok: 0,
|
|
33
|
-
errmsg: 'Unknown find-related command',
|
|
34
|
-
code: 59,
|
|
35
|
-
codeName: 'CommandNotFound',
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Handle find command
|
|
40
|
-
*/
|
|
41
|
-
async handleFind(context) {
|
|
42
|
-
const { storage, database, command } = context;
|
|
43
|
-
const collection = command.find;
|
|
44
|
-
const filter = command.filter || {};
|
|
45
|
-
const projection = command.projection;
|
|
46
|
-
const sort = command.sort;
|
|
47
|
-
const skip = command.skip || 0;
|
|
48
|
-
const limit = command.limit || 0;
|
|
49
|
-
const batchSize = command.batchSize || 101;
|
|
50
|
-
const singleBatch = command.singleBatch || false;
|
|
51
|
-
// Ensure collection exists
|
|
52
|
-
const exists = await storage.collectionExists(database, collection);
|
|
53
|
-
if (!exists) {
|
|
54
|
-
// Return empty cursor for non-existent collection
|
|
55
|
-
return {
|
|
56
|
-
ok: 1,
|
|
57
|
-
cursor: {
|
|
58
|
-
id: plugins.bson.Long.fromNumber(0),
|
|
59
|
-
ns: `${database}.${collection}`,
|
|
60
|
-
firstBatch: [],
|
|
61
|
-
},
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
// Get all documents
|
|
65
|
-
let documents = await storage.findAll(database, collection);
|
|
66
|
-
// Apply filter
|
|
67
|
-
documents = QueryEngine.filter(documents, filter);
|
|
68
|
-
// Apply sort
|
|
69
|
-
if (sort) {
|
|
70
|
-
documents = QueryEngine.sort(documents, sort);
|
|
71
|
-
}
|
|
72
|
-
// Apply skip
|
|
73
|
-
if (skip > 0) {
|
|
74
|
-
documents = documents.slice(skip);
|
|
75
|
-
}
|
|
76
|
-
// Apply limit
|
|
77
|
-
if (limit > 0) {
|
|
78
|
-
documents = documents.slice(0, limit);
|
|
79
|
-
}
|
|
80
|
-
// Apply projection
|
|
81
|
-
if (projection) {
|
|
82
|
-
documents = QueryEngine.project(documents, projection);
|
|
83
|
-
}
|
|
84
|
-
// Determine how many documents to return in first batch
|
|
85
|
-
const effectiveBatchSize = Math.min(batchSize, documents.length);
|
|
86
|
-
const firstBatch = documents.slice(0, effectiveBatchSize);
|
|
87
|
-
const remaining = documents.slice(effectiveBatchSize);
|
|
88
|
-
// Create cursor if there are more documents
|
|
89
|
-
let cursorId = BigInt(0);
|
|
90
|
-
if (remaining.length > 0 && !singleBatch) {
|
|
91
|
-
cursorId = this.nextCursorId();
|
|
92
|
-
this.cursors.set(cursorId, {
|
|
93
|
-
id: cursorId,
|
|
94
|
-
database,
|
|
95
|
-
collection,
|
|
96
|
-
documents: remaining,
|
|
97
|
-
position: 0,
|
|
98
|
-
batchSize,
|
|
99
|
-
createdAt: new Date(),
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
return {
|
|
103
|
-
ok: 1,
|
|
104
|
-
cursor: {
|
|
105
|
-
id: plugins.bson.Long.fromBigInt(cursorId),
|
|
106
|
-
ns: `${database}.${collection}`,
|
|
107
|
-
firstBatch,
|
|
108
|
-
},
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Handle getMore command
|
|
113
|
-
*/
|
|
114
|
-
async handleGetMore(context) {
|
|
115
|
-
const { database, command } = context;
|
|
116
|
-
const cursorIdInput = command.getMore;
|
|
117
|
-
const collection = command.collection;
|
|
118
|
-
const batchSize = command.batchSize || 101;
|
|
119
|
-
// Convert cursorId to bigint
|
|
120
|
-
let cursorId;
|
|
121
|
-
if (typeof cursorIdInput === 'bigint') {
|
|
122
|
-
cursorId = cursorIdInput;
|
|
123
|
-
}
|
|
124
|
-
else if (cursorIdInput instanceof plugins.bson.Long) {
|
|
125
|
-
cursorId = cursorIdInput.toBigInt();
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
cursorId = BigInt(cursorIdInput);
|
|
129
|
-
}
|
|
130
|
-
const cursor = this.cursors.get(cursorId);
|
|
131
|
-
if (!cursor) {
|
|
132
|
-
return {
|
|
133
|
-
ok: 0,
|
|
134
|
-
errmsg: `cursor id ${cursorId} not found`,
|
|
135
|
-
code: 43,
|
|
136
|
-
codeName: 'CursorNotFound',
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
// Verify namespace
|
|
140
|
-
if (cursor.database !== database || cursor.collection !== collection) {
|
|
141
|
-
return {
|
|
142
|
-
ok: 0,
|
|
143
|
-
errmsg: 'cursor namespace mismatch',
|
|
144
|
-
code: 43,
|
|
145
|
-
codeName: 'CursorNotFound',
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
// Get next batch
|
|
149
|
-
const start = cursor.position;
|
|
150
|
-
const end = Math.min(start + batchSize, cursor.documents.length);
|
|
151
|
-
const nextBatch = cursor.documents.slice(start, end);
|
|
152
|
-
cursor.position = end;
|
|
153
|
-
// Check if cursor is exhausted
|
|
154
|
-
let returnCursorId = cursorId;
|
|
155
|
-
if (cursor.position >= cursor.documents.length) {
|
|
156
|
-
this.cursors.delete(cursorId);
|
|
157
|
-
returnCursorId = BigInt(0);
|
|
158
|
-
}
|
|
159
|
-
return {
|
|
160
|
-
ok: 1,
|
|
161
|
-
cursor: {
|
|
162
|
-
id: plugins.bson.Long.fromBigInt(returnCursorId),
|
|
163
|
-
ns: `${database}.${collection}`,
|
|
164
|
-
nextBatch,
|
|
165
|
-
},
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Handle killCursors command
|
|
170
|
-
*/
|
|
171
|
-
async handleKillCursors(context) {
|
|
172
|
-
const { command } = context;
|
|
173
|
-
const collection = command.killCursors;
|
|
174
|
-
const cursorIds = command.cursors || [];
|
|
175
|
-
const cursorsKilled = [];
|
|
176
|
-
const cursorsNotFound = [];
|
|
177
|
-
const cursorsUnknown = [];
|
|
178
|
-
for (const idInput of cursorIds) {
|
|
179
|
-
let cursorId;
|
|
180
|
-
if (typeof idInput === 'bigint') {
|
|
181
|
-
cursorId = idInput;
|
|
182
|
-
}
|
|
183
|
-
else if (idInput instanceof plugins.bson.Long) {
|
|
184
|
-
cursorId = idInput.toBigInt();
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
cursorId = BigInt(idInput);
|
|
188
|
-
}
|
|
189
|
-
if (this.cursors.has(cursorId)) {
|
|
190
|
-
this.cursors.delete(cursorId);
|
|
191
|
-
cursorsKilled.push(plugins.bson.Long.fromBigInt(cursorId));
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
cursorsNotFound.push(plugins.bson.Long.fromBigInt(cursorId));
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
return {
|
|
198
|
-
ok: 1,
|
|
199
|
-
cursorsKilled,
|
|
200
|
-
cursorsNotFound,
|
|
201
|
-
cursorsUnknown,
|
|
202
|
-
cursorsAlive: [],
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Handle count command
|
|
207
|
-
*/
|
|
208
|
-
async handleCount(context) {
|
|
209
|
-
const { storage, database, command } = context;
|
|
210
|
-
const collection = command.count;
|
|
211
|
-
const query = command.query || {};
|
|
212
|
-
const skip = command.skip || 0;
|
|
213
|
-
const limit = command.limit || 0;
|
|
214
|
-
// Check if collection exists
|
|
215
|
-
const exists = await storage.collectionExists(database, collection);
|
|
216
|
-
if (!exists) {
|
|
217
|
-
return { ok: 1, n: 0 };
|
|
218
|
-
}
|
|
219
|
-
// Get all documents
|
|
220
|
-
let documents = await storage.findAll(database, collection);
|
|
221
|
-
// Apply filter
|
|
222
|
-
documents = QueryEngine.filter(documents, query);
|
|
223
|
-
// Apply skip
|
|
224
|
-
if (skip > 0) {
|
|
225
|
-
documents = documents.slice(skip);
|
|
226
|
-
}
|
|
227
|
-
// Apply limit
|
|
228
|
-
if (limit > 0) {
|
|
229
|
-
documents = documents.slice(0, limit);
|
|
230
|
-
}
|
|
231
|
-
return { ok: 1, n: documents.length };
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Handle distinct command
|
|
235
|
-
*/
|
|
236
|
-
async handleDistinct(context) {
|
|
237
|
-
const { storage, database, command } = context;
|
|
238
|
-
const collection = command.distinct;
|
|
239
|
-
const key = command.key;
|
|
240
|
-
const query = command.query || {};
|
|
241
|
-
if (!key) {
|
|
242
|
-
return {
|
|
243
|
-
ok: 0,
|
|
244
|
-
errmsg: 'distinct requires a key',
|
|
245
|
-
code: 2,
|
|
246
|
-
codeName: 'BadValue',
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
// Check if collection exists
|
|
250
|
-
const exists = await storage.collectionExists(database, collection);
|
|
251
|
-
if (!exists) {
|
|
252
|
-
return { ok: 1, values: [] };
|
|
253
|
-
}
|
|
254
|
-
// Get all documents
|
|
255
|
-
const documents = await storage.findAll(database, collection);
|
|
256
|
-
// Get distinct values
|
|
257
|
-
const values = QueryEngine.distinct(documents, key, query);
|
|
258
|
-
return { ok: 1, values };
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmluZEhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9jb25nb2RiL3NlcnZlci9oYW5kbGVycy9GaW5kSGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLDBCQUEwQixDQUFDO0FBRXBELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUxRDs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBQ2QsT0FBTyxDQUE0QjtJQUNuQyxZQUFZLENBQWU7SUFFbkMsWUFDRSxPQUFrQyxFQUNsQyxZQUEwQjtRQUUxQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUF3QjtRQUNuQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTVCLHVDQUF1QztRQUN2QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFD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
|