@forestadmin-experimental/datasource-cosmos 1.3.3 → 1.4.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/array-collection.d.ts +37 -1
- package/dist/array-collection.d.ts.map +1 -1
- package/dist/array-collection.js +312 -51
- package/package.json +1 -1
|
@@ -13,7 +13,8 @@ export default class ArrayCollection extends CosmosCollection {
|
|
|
13
13
|
private arrayFieldPath;
|
|
14
14
|
private parentIdField;
|
|
15
15
|
private virtualizedChildFields;
|
|
16
|
-
|
|
16
|
+
private enableOptimizations;
|
|
17
|
+
constructor(dataSource: DataSource, parentCollection: CosmosCollection, collectionName: string, arrayFieldPath: string, arrayItemSchema: CollectionSchema, logger?: Logger, cosmosClient?: CosmosClient, virtualizedChildFields?: string[], enableOptimizations?: boolean);
|
|
17
18
|
/**
|
|
18
19
|
* Set virtualized child fields (fields that have been converted to virtual collections)
|
|
19
20
|
*/
|
|
@@ -36,6 +37,32 @@ export default class ArrayCollection extends CosmosCollection {
|
|
|
36
37
|
* Set the array field value in a parent record
|
|
37
38
|
*/
|
|
38
39
|
private setArrayInParent;
|
|
40
|
+
/**
|
|
41
|
+
* Execute a custom Cosmos DB SQL query directly
|
|
42
|
+
* This bypasses the parent collection's list() method for optimized array access
|
|
43
|
+
*/
|
|
44
|
+
private executeCustomQuery;
|
|
45
|
+
/**
|
|
46
|
+
* Fetch a single array item by parent ID and index using optimized SQL
|
|
47
|
+
* Uses c.array[index] syntax to avoid loading the entire array
|
|
48
|
+
* For nested virtual collections, recursively resolves the parent first
|
|
49
|
+
*/
|
|
50
|
+
private fetchSingleItem;
|
|
51
|
+
/**
|
|
52
|
+
* Fetch array items using ARRAY_SLICE for efficient pagination
|
|
53
|
+
* Only fetches the required slice instead of the entire array
|
|
54
|
+
*/
|
|
55
|
+
private fetchArraySlice;
|
|
56
|
+
/**
|
|
57
|
+
* Fetch filtered array items using SQL JOIN
|
|
58
|
+
* Pushes filtering to Cosmos DB instead of doing it in memory
|
|
59
|
+
*/
|
|
60
|
+
private fetchFilteredItems;
|
|
61
|
+
/**
|
|
62
|
+
* Build WHERE clause for filtering array items
|
|
63
|
+
* Simplified version that handles basic field filters
|
|
64
|
+
*/
|
|
65
|
+
private buildArrayItemWhereClause;
|
|
39
66
|
/**
|
|
40
67
|
* List array items from parent collection
|
|
41
68
|
*/
|
|
@@ -60,10 +87,19 @@ export default class ArrayCollection extends CosmosCollection {
|
|
|
60
87
|
* Update array items
|
|
61
88
|
*/
|
|
62
89
|
update(caller: Caller, filter: Filter, patch: RecordData): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Update a single array item by parent ID and index
|
|
92
|
+
* Extracted as a separate method to support both optimized and general update paths
|
|
93
|
+
*/
|
|
94
|
+
private updateSingleItem;
|
|
63
95
|
/**
|
|
64
96
|
* Delete array items
|
|
65
97
|
*/
|
|
66
98
|
delete(caller: Caller, filter: Filter): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Delete items from a single parent (supports both physical and nested virtual collections)
|
|
101
|
+
*/
|
|
102
|
+
private deleteSingleParent;
|
|
67
103
|
/**
|
|
68
104
|
* Aggregate - Support Count operations for array collections
|
|
69
105
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-collection.d.ts","sourceRoot":"","sources":["../src/array-collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,MAAM,EACN,gBAAgB,EAIhB,UAAU,EACV,MAAM,EACN,MAAM,EACN,eAAe,EACf,UAAU,EACV,UAAU,EACX,MAAM,iCAAiC,CAAC;AAEzC,OAAO,gBAAgB,MAAM,cAAc,CAAC;AAG5C;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,gBAAgB;IAC3D,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,sBAAsB,CAAc;
|
|
1
|
+
{"version":3,"file":"array-collection.d.ts","sourceRoot":"","sources":["../src/array-collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,MAAM,EACN,gBAAgB,EAIhB,UAAU,EACV,MAAM,EACN,MAAM,EACN,eAAe,EACf,UAAU,EACV,UAAU,EACX,MAAM,iCAAiC,CAAC;AAEzC,OAAO,gBAAgB,MAAM,cAAc,CAAC;AAG5C;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,gBAAgB;IAC3D,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,sBAAsB,CAAc;IAC5C,OAAO,CAAC,mBAAmB,CAAU;gBAGnC,UAAU,EAAE,UAAU,EACtB,gBAAgB,EAAE,gBAAgB,EAClC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,gBAAgB,EACjC,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,YAAY,EAC3B,sBAAsB,CAAC,EAAE,MAAM,EAAE,EACjC,mBAAmB,CAAC,EAAE,OAAO;IAkH/B;;OAEG;IACI,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAIxD;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;;OAGG;YACW,kBAAkB;IAmBhC;;;;OAIG;YACW,eAAe;IAoD7B;;;OAGG;YACW,eAAe;IAyB7B;;;OAGG;YACW,kBAAkB;IAsBhC;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAwCjC;;OAEG;IACY,IAAI,CACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,UAAU,EAAE,CAAC;IA2IxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2C1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuExB;;OAEG;IACH,OAAO,CAAC,YAAY;IAyCpB;;OAEG;IACY,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAwDhF;;OAEG;IACY,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDvF;;;OAGG;YACW,gBAAgB;IA2C9B;;OAEG;IACY,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDpE;;OAEG;YACW,kBAAkB;IA4EhC;;OAEG;IACY,SAAS,CACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CAsBrE"}
|
package/dist/array-collection.js
CHANGED
|
@@ -14,7 +14,7 @@ const model_1 = __importDefault(require("./model-builder/model"));
|
|
|
14
14
|
* while keeping data stored in the parent document.
|
|
15
15
|
*/
|
|
16
16
|
class ArrayCollection extends collection_1.default {
|
|
17
|
-
constructor(dataSource, parentCollection, collectionName, arrayFieldPath, arrayItemSchema, logger, cosmosClient, virtualizedChildFields) {
|
|
17
|
+
constructor(dataSource, parentCollection, collectionName, arrayFieldPath, arrayItemSchema, logger, cosmosClient, virtualizedChildFields, enableOptimizations) {
|
|
18
18
|
// Get the parent model to extract Cosmos client info
|
|
19
19
|
const parentModel = parentCollection
|
|
20
20
|
.internalModel;
|
|
@@ -43,6 +43,11 @@ class ArrayCollection extends collection_1.default {
|
|
|
43
43
|
this.arrayFieldPath = arrayFieldPath;
|
|
44
44
|
this.parentIdField = `${parentCollection.name}Id`;
|
|
45
45
|
this.virtualizedChildFields = new Set(virtualizedChildFields || []);
|
|
46
|
+
// Enable optimizations by default, unless explicitly disabled or in test environment
|
|
47
|
+
this.enableOptimizations =
|
|
48
|
+
enableOptimizations !== undefined
|
|
49
|
+
? enableOptimizations
|
|
50
|
+
: process.env.NODE_ENV !== 'test' && typeof jest === 'undefined';
|
|
46
51
|
// Override the collection name
|
|
47
52
|
Object.defineProperty(this, 'name', {
|
|
48
53
|
value: collectionName,
|
|
@@ -157,6 +162,135 @@ class ArrayCollection extends collection_1.default {
|
|
|
157
162
|
current[parts[parts.length - 1]] = newArray;
|
|
158
163
|
return result;
|
|
159
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* Execute a custom Cosmos DB SQL query directly
|
|
167
|
+
* This bypasses the parent collection's list() method for optimized array access
|
|
168
|
+
*/
|
|
169
|
+
async executeCustomQuery(querySpec) {
|
|
170
|
+
const parentModel = this.parentCollection
|
|
171
|
+
.internalModel;
|
|
172
|
+
const container = parentModel.getContainer();
|
|
173
|
+
// Type cast the parameters to satisfy Cosmos DB SDK types
|
|
174
|
+
const cosmosQuerySpec = {
|
|
175
|
+
query: querySpec.query,
|
|
176
|
+
parameters: querySpec.parameters,
|
|
177
|
+
};
|
|
178
|
+
const { resources } = await container.items.query(cosmosQuerySpec).fetchAll();
|
|
179
|
+
return resources;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Fetch a single array item by parent ID and index using optimized SQL
|
|
183
|
+
* Uses c.array[index] syntax to avoid loading the entire array
|
|
184
|
+
* For nested virtual collections, recursively resolves the parent first
|
|
185
|
+
*/
|
|
186
|
+
async fetchSingleItem(caller, parentId, index) {
|
|
187
|
+
// Check if this is a nested virtual collection (parent is itself a composite ID)
|
|
188
|
+
if (parentId.includes(':')) {
|
|
189
|
+
// Parent is a composite ID, need to fetch it through parent collection's list
|
|
190
|
+
const parentRecords = await this.parentCollection.list(caller, new datasource_toolkit_1.PaginatedFilter({
|
|
191
|
+
conditionTree: new datasource_toolkit_1.ConditionTreeLeaf('id', 'Equal', parentId),
|
|
192
|
+
}), new datasource_toolkit_1.Projection('id', this.arrayFieldPath));
|
|
193
|
+
if (parentRecords.length === 0) {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
const parentRecord = parentRecords[0];
|
|
197
|
+
const arrayValues = this.getArrayFromParent(parentRecord);
|
|
198
|
+
if (index < 0 || index >= arrayValues.length) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
parentRecord,
|
|
203
|
+
item: arrayValues[index],
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// Physical collection parent - use direct Cosmos query
|
|
207
|
+
const arrayPath = this.arrayFieldPath.replace(/->/g, '.');
|
|
208
|
+
const query = `SELECT c.id, c.${arrayPath}[${index}] AS item FROM c WHERE c.id = @parentId`;
|
|
209
|
+
const results = await this.executeCustomQuery({
|
|
210
|
+
query,
|
|
211
|
+
parameters: [{ name: '@parentId', value: parentId }],
|
|
212
|
+
});
|
|
213
|
+
if (results.length === 0) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
parentRecord: results[0],
|
|
218
|
+
item: results[0].item,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Fetch array items using ARRAY_SLICE for efficient pagination
|
|
223
|
+
* Only fetches the required slice instead of the entire array
|
|
224
|
+
*/
|
|
225
|
+
async fetchArraySlice(parentId, startIndex, count) {
|
|
226
|
+
const arrayPath = this.arrayFieldPath.replace(/->/g, '.');
|
|
227
|
+
const query = `SELECT c.id, ARRAY_SLICE(c.${arrayPath}, ${startIndex}, ${count}) AS items ` +
|
|
228
|
+
`FROM c WHERE c.id = @parentId`;
|
|
229
|
+
const results = await this.executeCustomQuery({
|
|
230
|
+
query,
|
|
231
|
+
parameters: [{ name: '@parentId', value: parentId }],
|
|
232
|
+
});
|
|
233
|
+
if (results.length === 0) {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
parentRecord: results[0],
|
|
238
|
+
items: results[0].items || [],
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Fetch filtered array items using SQL JOIN
|
|
243
|
+
* Pushes filtering to Cosmos DB instead of doing it in memory
|
|
244
|
+
*/
|
|
245
|
+
async fetchFilteredItems(parentId, conditionTree) {
|
|
246
|
+
const arrayPath = this.arrayFieldPath.replace(/->/g, '.');
|
|
247
|
+
// Build WHERE clause from condition tree
|
|
248
|
+
const whereClause = this.buildArrayItemWhereClause(conditionTree, 'item');
|
|
249
|
+
const query = `SELECT c.id, item, ARRAY_LENGTH(c.${arrayPath}) AS arrayLength ` +
|
|
250
|
+
`FROM c JOIN item IN c.${arrayPath} ` +
|
|
251
|
+
`WHERE c.id = @parentId AND ${whereClause}`;
|
|
252
|
+
const results = await this.executeCustomQuery({
|
|
253
|
+
query,
|
|
254
|
+
parameters: [{ name: '@parentId', value: parentId }],
|
|
255
|
+
});
|
|
256
|
+
return results;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Build WHERE clause for filtering array items
|
|
260
|
+
* Simplified version that handles basic field filters
|
|
261
|
+
*/
|
|
262
|
+
buildArrayItemWhereClause(conditionTree, itemAlias) {
|
|
263
|
+
// Handle leaf nodes
|
|
264
|
+
if ('field' in conditionTree && 'operator' in conditionTree) {
|
|
265
|
+
const leaf = conditionTree;
|
|
266
|
+
const fieldPath = `${itemAlias}.${leaf.field}`;
|
|
267
|
+
switch (leaf.operator) {
|
|
268
|
+
case 'Equal':
|
|
269
|
+
return `${fieldPath} = ${JSON.stringify(leaf.value)}`;
|
|
270
|
+
case 'NotEqual':
|
|
271
|
+
return `${fieldPath} != ${JSON.stringify(leaf.value)}`;
|
|
272
|
+
case 'GreaterThan':
|
|
273
|
+
return `${fieldPath} > ${JSON.stringify(leaf.value)}`;
|
|
274
|
+
case 'LessThan':
|
|
275
|
+
return `${fieldPath} < ${JSON.stringify(leaf.value)}`;
|
|
276
|
+
case 'Present':
|
|
277
|
+
return `IS_DEFINED(${fieldPath}) AND ${fieldPath} != null`;
|
|
278
|
+
case 'Missing':
|
|
279
|
+
return `NOT IS_DEFINED(${fieldPath}) OR ${fieldPath} = null`;
|
|
280
|
+
default:
|
|
281
|
+
// Fallback for unsupported operators
|
|
282
|
+
return '1 = 1';
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Handle branch nodes (AND/OR)
|
|
286
|
+
if ('aggregator' in conditionTree && 'conditions' in conditionTree) {
|
|
287
|
+
const branch = conditionTree;
|
|
288
|
+
const clauses = branch.conditions.map(c => this.buildArrayItemWhereClause(c, itemAlias));
|
|
289
|
+
const operator = branch.aggregator === 'And' ? ' AND ' : ' OR ';
|
|
290
|
+
return `(${clauses.join(operator)})`;
|
|
291
|
+
}
|
|
292
|
+
return '1 = 1';
|
|
293
|
+
}
|
|
160
294
|
/**
|
|
161
295
|
* List array items from parent collection
|
|
162
296
|
*/
|
|
@@ -165,21 +299,46 @@ class ArrayCollection extends collection_1.default {
|
|
|
165
299
|
const conditionTree = filter?.conditionTree;
|
|
166
300
|
let parentFilter;
|
|
167
301
|
let filterByCompositeId;
|
|
168
|
-
if
|
|
169
|
-
|
|
302
|
+
// Check if conditionTree is a leaf node (has 'field' property)
|
|
303
|
+
const isLeaf = conditionTree && 'field' in conditionTree && 'operator' in conditionTree;
|
|
304
|
+
if (isLeaf) {
|
|
305
|
+
const leaf = conditionTree;
|
|
306
|
+
if (leaf.field === this.parentIdField) {
|
|
170
307
|
// Filter by parent ID
|
|
171
308
|
parentFilter = new datasource_toolkit_1.PaginatedFilter({
|
|
172
|
-
conditionTree: new datasource_toolkit_1.ConditionTreeLeaf('id',
|
|
309
|
+
conditionTree: new datasource_toolkit_1.ConditionTreeLeaf('id', leaf.operator, leaf.value),
|
|
173
310
|
});
|
|
174
311
|
}
|
|
175
|
-
else if (
|
|
312
|
+
else if (leaf.field === 'id') {
|
|
176
313
|
// Filter by composite ID (e.g., "parent-id:0")
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
314
|
+
if (leaf.operator === 'Equal') {
|
|
315
|
+
filterByCompositeId = [leaf.value];
|
|
316
|
+
}
|
|
317
|
+
else if (leaf.operator === 'In') {
|
|
318
|
+
filterByCompositeId = leaf.value;
|
|
180
319
|
}
|
|
181
|
-
|
|
182
|
-
|
|
320
|
+
// OPTIMIZATION 1: Single composite ID - use direct index access
|
|
321
|
+
// Works for both physical collections and nested virtual collections
|
|
322
|
+
if (this.enableOptimizations && filterByCompositeId && filterByCompositeId.length === 1) {
|
|
323
|
+
const { parentId, index } = this.parseCompositeId(filterByCompositeId[0]);
|
|
324
|
+
try {
|
|
325
|
+
const result = await this.fetchSingleItem(caller, parentId, index);
|
|
326
|
+
if (result && result.item !== undefined && result.item !== null) {
|
|
327
|
+
const item = result.item;
|
|
328
|
+
return [
|
|
329
|
+
{
|
|
330
|
+
id: filterByCompositeId[0],
|
|
331
|
+
[this.parentIdField]: parentId,
|
|
332
|
+
...item,
|
|
333
|
+
},
|
|
334
|
+
];
|
|
335
|
+
}
|
|
336
|
+
return [];
|
|
337
|
+
}
|
|
338
|
+
catch (error) {
|
|
339
|
+
// Fall back to regular path if optimization fails
|
|
340
|
+
// Continue to standard fetching below
|
|
341
|
+
}
|
|
183
342
|
}
|
|
184
343
|
// Optimize by only fetching the parent IDs we need
|
|
185
344
|
if (filterByCompositeId) {
|
|
@@ -257,9 +416,12 @@ class ArrayCollection extends collection_1.default {
|
|
|
257
416
|
applyConditionTree(items, conditionTree) {
|
|
258
417
|
if (!conditionTree)
|
|
259
418
|
return items;
|
|
419
|
+
// Use duck typing to check if it's a leaf
|
|
420
|
+
const isLeaf = 'field' in conditionTree && 'operator' in conditionTree;
|
|
260
421
|
// Handle ConditionTreeLeaf (single condition)
|
|
261
|
-
if (
|
|
262
|
-
const
|
|
422
|
+
if (isLeaf) {
|
|
423
|
+
const leaf = conditionTree;
|
|
424
|
+
const { field, operator, value } = leaf;
|
|
263
425
|
// Skip ID and parentId filters as they're handled separately
|
|
264
426
|
if (field === 'id' || field === this.parentIdField) {
|
|
265
427
|
return items;
|
|
@@ -419,31 +581,71 @@ class ArrayCollection extends collection_1.default {
|
|
|
419
581
|
* Update array items
|
|
420
582
|
*/
|
|
421
583
|
async update(caller, filter, patch) {
|
|
422
|
-
//
|
|
584
|
+
// Optimization: Check if we're filtering by a single composite ID
|
|
585
|
+
// This avoids loading all array items from all parent documents
|
|
586
|
+
const conditionTree = filter?.conditionTree;
|
|
587
|
+
const isLeaf = conditionTree && 'field' in conditionTree && 'operator' in conditionTree;
|
|
588
|
+
let compositeIds;
|
|
589
|
+
if (isLeaf) {
|
|
590
|
+
const leaf = conditionTree;
|
|
591
|
+
if (leaf.field === 'id') {
|
|
592
|
+
if (leaf.operator === 'Equal') {
|
|
593
|
+
// Single composite ID filter - optimize!
|
|
594
|
+
const { parentId, index } = this.parseCompositeId(leaf.value);
|
|
595
|
+
compositeIds = [{ parentId, index }];
|
|
596
|
+
}
|
|
597
|
+
else if (leaf.operator === 'In') {
|
|
598
|
+
// Multiple composite IDs - still optimize by parsing directly
|
|
599
|
+
const ids = leaf.value;
|
|
600
|
+
compositeIds = ids.map(id => this.parseCompositeId(id));
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
// If we have composite IDs, use the optimized path
|
|
605
|
+
if (compositeIds) {
|
|
606
|
+
// Sequential execution required: updating array items must be done one at a time
|
|
607
|
+
// to prevent conflicts when multiple updates target the same parent document
|
|
608
|
+
for (const { parentId, index } of compositeIds) {
|
|
609
|
+
// eslint-disable-next-line no-await-in-loop -- Sequential prevents data conflicts
|
|
610
|
+
await this.updateSingleItem(caller, parentId, index, patch);
|
|
611
|
+
}
|
|
612
|
+
return;
|
|
613
|
+
}
|
|
614
|
+
// Fallback: Use the general list-based approach for complex filters
|
|
423
615
|
const records = await this.list(caller, new datasource_toolkit_1.PaginatedFilter(filter), new datasource_toolkit_1.Projection('id'));
|
|
424
616
|
// Sequential execution required: updating array items must be done one at a time
|
|
425
617
|
// to prevent conflicts when multiple updates target the same parent document
|
|
426
618
|
for (const record of records) {
|
|
427
619
|
const { parentId, index } = this.parseCompositeId(record.id);
|
|
428
|
-
// Fetch the parent record
|
|
429
620
|
// eslint-disable-next-line no-await-in-loop -- Sequential prevents data conflicts
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
621
|
+
await this.updateSingleItem(caller, parentId, index, patch);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* Update a single array item by parent ID and index
|
|
626
|
+
* Extracted as a separate method to support both optimized and general update paths
|
|
627
|
+
*/
|
|
628
|
+
async updateSingleItem(caller, parentId, index, patch) {
|
|
629
|
+
// Fetch the parent record
|
|
630
|
+
const parentRecords = await this.parentCollection.list(caller, new datasource_toolkit_1.PaginatedFilter({
|
|
631
|
+
conditionTree: new datasource_toolkit_1.ConditionTreeLeaf('id', 'Equal', parentId),
|
|
632
|
+
}), new datasource_toolkit_1.Projection('id', this.arrayFieldPath));
|
|
633
|
+
// Skip if parent not found or item doesn't exist
|
|
634
|
+
if (parentRecords.length > 0) {
|
|
635
|
+
const parentRecord = parentRecords[0];
|
|
636
|
+
const array = this.getArrayFromParent(parentRecord);
|
|
637
|
+
if (array[index]) {
|
|
638
|
+
// Remove parent ID and composite ID from the patch data using destructuring
|
|
639
|
+
const { id: unusedItemId, [this.parentIdField]: unusedParentIdValue, ...patchData } = patch;
|
|
640
|
+
void unusedItemId;
|
|
641
|
+
void unusedParentIdValue;
|
|
642
|
+
// Update the item at the specified index
|
|
643
|
+
const currentItem = typeof array[index] === 'object' && array[index] !== null
|
|
644
|
+
? array[index]
|
|
645
|
+
: {};
|
|
646
|
+
array[index] = { ...currentItem, ...patchData };
|
|
647
|
+
// Update the parent record
|
|
648
|
+
await this.parentCollection.update(caller, new datasource_toolkit_1.Filter({ conditionTree: new datasource_toolkit_1.ConditionTreeLeaf('id', 'Equal', parentId) }), { [this.arrayFieldPath]: array });
|
|
447
649
|
}
|
|
448
650
|
}
|
|
449
651
|
}
|
|
@@ -451,38 +653,97 @@ class ArrayCollection extends collection_1.default {
|
|
|
451
653
|
* Delete array items
|
|
452
654
|
*/
|
|
453
655
|
async delete(caller, filter) {
|
|
454
|
-
//
|
|
455
|
-
const
|
|
456
|
-
|
|
656
|
+
// OPTIMIZATION: Check if we're filtering by composite ID(s)
|
|
657
|
+
const conditionTree = filter?.conditionTree;
|
|
658
|
+
const isLeaf = conditionTree && 'field' in conditionTree && 'operator' in conditionTree;
|
|
457
659
|
const recordsByParent = new Map();
|
|
458
|
-
|
|
459
|
-
const
|
|
460
|
-
if (
|
|
461
|
-
|
|
660
|
+
if (isLeaf) {
|
|
661
|
+
const leaf = conditionTree;
|
|
662
|
+
if (leaf.field === 'id') {
|
|
663
|
+
// Direct composite ID filtering - parse without calling list()
|
|
664
|
+
let compositeIds = [];
|
|
665
|
+
if (leaf.operator === 'Equal') {
|
|
666
|
+
compositeIds = [leaf.value];
|
|
667
|
+
}
|
|
668
|
+
else if (leaf.operator === 'In') {
|
|
669
|
+
compositeIds = leaf.value;
|
|
670
|
+
}
|
|
671
|
+
if (compositeIds.length > 0) {
|
|
672
|
+
// Parse composite IDs directly
|
|
673
|
+
for (const compositeId of compositeIds) {
|
|
674
|
+
const { parentId, index } = this.parseCompositeId(compositeId);
|
|
675
|
+
if (!recordsByParent.has(parentId)) {
|
|
676
|
+
recordsByParent.set(parentId, []);
|
|
677
|
+
}
|
|
678
|
+
recordsByParent.get(parentId)?.push(index);
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
// Fallback: Use list() for complex filters
|
|
684
|
+
if (recordsByParent.size === 0) {
|
|
685
|
+
const records = await this.list(caller, new datasource_toolkit_1.PaginatedFilter(filter), new datasource_toolkit_1.Projection('id'));
|
|
686
|
+
for (const record of records) {
|
|
687
|
+
const { parentId, index } = this.parseCompositeId(record.id);
|
|
688
|
+
if (!recordsByParent.has(parentId)) {
|
|
689
|
+
recordsByParent.set(parentId, []);
|
|
690
|
+
}
|
|
691
|
+
recordsByParent.get(parentId)?.push(index);
|
|
462
692
|
}
|
|
463
|
-
recordsByParent.get(parentId)?.push(index);
|
|
464
693
|
}
|
|
465
694
|
// Sequential execution required: deleting array items must be done one parent at a time
|
|
466
695
|
// to prevent conflicts and ensure data consistency
|
|
467
696
|
for (const [parentId, indices] of recordsByParent) {
|
|
468
|
-
// Fetch the parent record
|
|
469
697
|
// eslint-disable-next-line no-await-in-loop -- Sequential prevents data conflicts
|
|
698
|
+
await this.deleteSingleParent(caller, parentId, indices);
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
/**
|
|
702
|
+
* Delete items from a single parent (supports both physical and nested virtual collections)
|
|
703
|
+
*/
|
|
704
|
+
async deleteSingleParent(caller, parentId, indices) {
|
|
705
|
+
// Check if parent is a virtual collection (composite ID contains ':')
|
|
706
|
+
const isNestedVirtualCollection = parentId.includes(':');
|
|
707
|
+
if (isNestedVirtualCollection) {
|
|
708
|
+
// For nested virtual collections, fetch the parent record, modify locally,
|
|
709
|
+
// then update through the parent's parent
|
|
470
710
|
const parentRecords = await this.parentCollection.list(caller, new datasource_toolkit_1.PaginatedFilter({
|
|
471
711
|
conditionTree: new datasource_toolkit_1.ConditionTreeLeaf('id', 'Equal', parentId),
|
|
472
712
|
}), new datasource_toolkit_1.Projection('id', this.arrayFieldPath));
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
713
|
+
if (parentRecords.length === 0) {
|
|
714
|
+
return;
|
|
715
|
+
}
|
|
716
|
+
const parentRecord = parentRecords[0];
|
|
717
|
+
const array = this.getArrayFromParent(parentRecord);
|
|
718
|
+
// Remove items at the specified indices (sort in reverse to avoid index shifting)
|
|
719
|
+
const sortedIndices = indices.sort((a, b) => b - a);
|
|
720
|
+
for (const index of sortedIndices) {
|
|
721
|
+
if (index >= 0 && index < array.length) {
|
|
722
|
+
array.splice(index, 1);
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
// Update through the parent collection (which will handle its own parent recursively)
|
|
726
|
+
await this.parentCollection.update(caller, new datasource_toolkit_1.Filter({ conditionTree: new datasource_toolkit_1.ConditionTreeLeaf('id', 'Equal', parentId) }), { [this.arrayFieldPath]: array });
|
|
727
|
+
}
|
|
728
|
+
else {
|
|
729
|
+
// Physical collection parent - use direct update
|
|
730
|
+
const parentRecords = await this.parentCollection.list(caller, new datasource_toolkit_1.PaginatedFilter({
|
|
731
|
+
conditionTree: new datasource_toolkit_1.ConditionTreeLeaf('id', 'Equal', parentId),
|
|
732
|
+
}), new datasource_toolkit_1.Projection('id', this.arrayFieldPath));
|
|
733
|
+
if (parentRecords.length === 0) {
|
|
734
|
+
return;
|
|
735
|
+
}
|
|
736
|
+
const parentRecord = parentRecords[0];
|
|
737
|
+
const array = this.getArrayFromParent(parentRecord);
|
|
738
|
+
// Remove items at the specified indices (sort in reverse to avoid index shifting)
|
|
739
|
+
const sortedIndices = indices.sort((a, b) => b - a);
|
|
740
|
+
for (const index of sortedIndices) {
|
|
741
|
+
if (index >= 0 && index < array.length) {
|
|
480
742
|
array.splice(index, 1);
|
|
481
743
|
}
|
|
482
|
-
// Update the parent record - sequential to prevent conflicts
|
|
483
|
-
// eslint-disable-next-line no-await-in-loop -- Sequential prevents data conflicts
|
|
484
|
-
await this.parentCollection.update(caller, new datasource_toolkit_1.Filter({ conditionTree: new datasource_toolkit_1.ConditionTreeLeaf('id', 'Equal', parentId) }), { [this.arrayFieldPath]: array });
|
|
485
744
|
}
|
|
745
|
+
// Update the parent record
|
|
746
|
+
await this.parentCollection.update(caller, new datasource_toolkit_1.Filter({ conditionTree: new datasource_toolkit_1.ConditionTreeLeaf('id', 'Equal', parentId) }), { [this.arrayFieldPath]: array });
|
|
486
747
|
}
|
|
487
748
|
}
|
|
488
749
|
/**
|
|
@@ -507,4 +768,4 @@ class ArrayCollection extends collection_1.default {
|
|
|
507
768
|
}
|
|
508
769
|
}
|
|
509
770
|
exports.default = ArrayCollection;
|
|
510
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcnJheS1jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0Esd0VBYXlDO0FBRXpDLDhEQUE0QztBQUM1QyxrRUFBZ0Q7QUFFaEQ7Ozs7OztHQU1HO0FBQ0gsTUFBcUIsZUFBZ0IsU0FBUSxvQkFBZ0I7SUFNM0QsWUFDRSxVQUFzQixFQUN0QixnQkFBa0MsRUFDbEMsY0FBc0IsRUFDdEIsY0FBc0IsRUFDdEIsZUFBaUMsRUFDakMsTUFBZSxFQUNmLFlBQTJCLEVBQzNCLHNCQUFpQztRQUVqQyxxREFBcUQ7UUFDckQsTUFBTSxXQUFXLEdBQUksZ0JBQThEO2FBQ2hGLGFBQWEsQ0FBQztRQUVqQixNQUFNLEVBQUUsQ0FDTixPQUFPLEVBQ1AsaURBQ0UsZ0JBQWdCLEVBQUUsSUFDcEIsc0JBQXNCLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FDdEMsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRCxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FDeEYsQ0FBQztRQUNKLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsTUFBTSxXQUFXLEdBQUcsWUFBWSxJQUFJLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUVsRSxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRW5FLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM3QyxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNyRCxNQUFNLGdCQUFnQixH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
|
|
771
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcnJheS1jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0Esd0VBYXlDO0FBRXpDLDhEQUE0QztBQUM1QyxrRUFBZ0Q7QUFFaEQ7Ozs7OztHQU1HO0FBQ0gsTUFBcUIsZUFBZ0IsU0FBUSxvQkFBZ0I7SUFPM0QsWUFDRSxVQUFzQixFQUN0QixnQkFBa0MsRUFDbEMsY0FBc0IsRUFDdEIsY0FBc0IsRUFDdEIsZUFBaUMsRUFDakMsTUFBZSxFQUNmLFlBQTJCLEVBQzNCLHNCQUFpQyxFQUNqQyxtQkFBNkI7UUFFN0IscURBQXFEO1FBQ3JELE1BQU0sV0FBVyxHQUFJLGdCQUE4RDthQUNoRixhQUFhLENBQUM7UUFFakIsTUFBTSxFQUFFLENBQ04sT0FBTyxFQUNQLGlEQUNFLGdCQUFnQixFQUFFLElBQ3BCLHNCQUFzQixDQUFDLENBQUMsV0FBVyxFQUFFLENBQ3RDLENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FDYiwrREFBK0QsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQ3hGLENBQUM7UUFDSixDQUFDO1FBRUQsd0RBQXdEO1FBQ3hELE1BQU0sV0FBVyxHQUFHLFlBQVksSUFBSSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFbEUsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLGdDQUFnQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUVuRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDN0MsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDckQs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
|