@itwin/core-backend 5.9.0-dev.16 → 5.9.0-dev.18

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.
@@ -1,7 +1,7 @@
1
1
  import { assert } from "chai";
2
- import { Id64 } from "@itwin/core-bentley";
2
+ import { DbResult, Id64 } from "@itwin/core-bentley";
3
3
  import { Code, CodeScopeSpec, IModel, SubCategoryAppearance } from "@itwin/core-common";
4
- import { ChannelControl, EditTxn, IModelJsFs, PhysicalModel, SnapshotDb, SpatialCategory, Subject } from "../../core-backend";
4
+ import { BulkDeleteElementsStatus, ChannelControl, EditTxn, IModelJsFs, PhysicalModel, SnapshotDb, SpatialCategory, Subject } from "../../core-backend";
5
5
  import { IModelTestUtils } from "../IModelTestUtils";
6
6
  import { KnownTestLocations } from "../KnownTestLocations";
7
7
  import { withEditTxn } from "../TestEditTxn";
@@ -62,8 +62,12 @@ describe("deleteElements (native bulk delete API)", () => {
62
62
  const assertDeleted = (id, msg) => assert.isUndefined(iModelDb.elements.tryGetElement(id), msg);
63
63
  // Run deleteElements, then verify the returned failed set, check each id in `deleted` is gone and each id in `retained` is still present.
64
64
  const executeTestCase = (label, idsToDelete, deleted, retained, expectedFailed = []) => {
65
- const failed = txn.deleteElements(idsToDelete);
66
- assert.sameMembers(Array.from(failed), expectedFailed, `[${label}] failed set mismatch`);
65
+ const resultStatus = txn.deleteElements(idsToDelete);
66
+ if (expectedFailed.length === 0)
67
+ assert.equal(resultStatus.status, BulkDeleteElementsStatus.Success);
68
+ else
69
+ assert.equal(resultStatus.status, (expectedFailed.length === idsToDelete.length) ? BulkDeleteElementsStatus.DeletionFailed : BulkDeleteElementsStatus.PartialSuccess);
70
+ assert.sameMembers(Array.from(resultStatus.failedIds), expectedFailed, `[${label}] failed set mismatch`);
67
71
  for (const id of deleted)
68
72
  assertDeleted(id, `[${label}] ${id} should have been deleted`);
69
73
  for (const id of retained)
@@ -117,7 +121,7 @@ describe("deleteElements (native bulk delete API)", () => {
117
121
  const rootA = insertElement();
118
122
  const rootB = insertElement();
119
123
  // rootA appears twice - should not throw and should be deleted exactly once.
120
- txn.deleteElements([rootA, rootA, rootB]);
124
+ assert.equal(txn.deleteElements([rootA, rootA, rootB]).status, BulkDeleteElementsStatus.Success);
121
125
  assertDeleted(rootA, "rootA should be deleted");
122
126
  assertDeleted(rootB, "rootB should be deleted");
123
127
  });
@@ -196,6 +200,15 @@ describe("deleteElements (native bulk delete API)", () => {
196
200
  // Only A and D in the delete set. B is external -> A ignored. D's scope (C) is not being deleted -> D is safe.
197
201
  executeTestCase("deep gap chain: A ignored, D deleted", [rootA, rootD], [rootD], [rootA, rootB, rootC], [rootA]);
198
202
  });
203
+ it("scope chain delete with skipping constraint validation should fail", () => {
204
+ const rootA = insertElement();
205
+ const rootB = insertElement({ codeScope: rootA, codeValue: "rootB-code" });
206
+ const rootC = insertElement({ codeScope: rootB, codeValue: "rootC-code" });
207
+ const rootD = insertElement({ codeScope: rootC, codeValue: "rootD-code" });
208
+ const resultStatus = txn.deleteElements([rootA, rootD], { skipFKConstraintValidations: true });
209
+ assert.equal(resultStatus.status, BulkDeleteElementsStatus.DeletionFailed);
210
+ assert.equal(resultStatus.sqlDeleteStatus, DbResult.BE_SQLITE_CONSTRAINT_FOREIGNKEY);
211
+ });
199
212
  it("two elements using the same scope", () => {
200
213
  // A is the code scope for both B and C independently.
201
214
  // A
@@ -384,7 +397,9 @@ describe("deleteElements (native bulk delete API)", () => {
384
397
  const elem1 = insertElementInModel(partitionId);
385
398
  const elem2 = insertElementInModel(partitionId);
386
399
  const unrelated = insertElement();
387
- txn.deleteElements([partitionId]);
400
+ const result = txn.deleteElements([partitionId]);
401
+ assert.equal(result.status, BulkDeleteElementsStatus.Success);
402
+ assert.isEmpty(result.failedIds);
388
403
  assertDeleted(partitionId, "partition element should be deleted");
389
404
  assertModelDeleted(partitionId, "sub-model should be deleted");
390
405
  assertDeleted(elem1, "elem1 inside sub-model should be deleted");
@@ -405,7 +420,8 @@ describe("deleteElements (native bulk delete API)", () => {
405
420
  const elem1 = insertElementInModel(childPartitionId);
406
421
  const unrelated = insertElement();
407
422
  // Deleting subjectA cascades (parent-child) to childPartitionId, which then cascades (modeled-element) into elem1.
408
- txn.deleteElements([subjectA]);
423
+ const result = txn.deleteElements([subjectA]);
424
+ assert.equal(result.status, BulkDeleteElementsStatus.Success);
409
425
  assertDeleted(subjectA, "subject should be deleted");
410
426
  assertDeleted(childPartitionId, "child partition element should be deleted");
411
427
  assertModelDeleted(childPartitionId, "child partition sub-model should be deleted");
@@ -429,7 +445,8 @@ describe("deleteElements (native bulk delete API)", () => {
429
445
  const grandchildOfElem1 = insertElementInModel(partitionId, { parentId: childOfElem1 });
430
446
  const elem2 = insertElementInModel(partitionId);
431
447
  const unrelated = insertElement();
432
- txn.deleteElements([partitionId]);
448
+ const result = txn.deleteElements([partitionId]);
449
+ assert.equal(result.status, BulkDeleteElementsStatus.Success);
433
450
  assertDeleted(partitionId, "partition should be deleted");
434
451
  assertModelDeleted(partitionId, "sub-model should be deleted");
435
452
  assertDeleted(elem1, "elem1 should be deleted");
@@ -455,7 +472,8 @@ describe("deleteElements (native bulk delete API)", () => {
455
472
  const unrelated = insertElement();
456
473
  // `external` is NOT in the delete set and uses scopingElem as its code scope -> the
457
474
  // entire partition subtree (including the sub-model) must be ignored from the delete set.
458
- txn.deleteElements([partitionId, unrelated]);
475
+ const result = txn.deleteElements([partitionId, unrelated]);
476
+ assert.equal(result.status, BulkDeleteElementsStatus.PartialSuccess);
459
477
  assertExists(partitionId, "partition should be ignored (retained)");
460
478
  assertModelExists(partitionId, "sub-model should be retained");
461
479
  assertExists(scopingElem, "scopingElem should be retained");
@@ -485,7 +503,8 @@ describe("deleteElements (native bulk delete API)", () => {
485
503
  code: { spec: codeSpecId, scope: scopingElem, value: "dep-code" },
486
504
  placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },
487
505
  });
488
- txn.deleteElements([p1, p2]);
506
+ const result = txn.deleteElements([p1, p2]);
507
+ assert.equal(result.status, BulkDeleteElementsStatus.Success);
489
508
  assertDeleted(p1, "p1 should be deleted");
490
509
  assertModelDeleted(p1, "sub-model of p1 should be deleted");
491
510
  assertDeleted(scopingElem, "scopingElem should be deleted");
@@ -511,7 +530,8 @@ describe("deleteElements (native bulk delete API)", () => {
511
530
  const innerElem1 = insertElementInModel(grandchildPartitionId);
512
531
  const innerElem2 = insertElementInModel(grandchildPartitionId);
513
532
  const unrelated = insertElement();
514
- txn.deleteElements([grandparentSubjectId]);
533
+ const result = txn.deleteElements([grandparentSubjectId]);
534
+ assert.equal(result.status, BulkDeleteElementsStatus.Success);
515
535
  assertDeleted(grandparentSubjectId, "grandparent subject should be deleted");
516
536
  assertDeleted(childSubjectId, "child subject should be deleted");
517
537
  assertDeleted(grandchildPartitionId, "grandchild partition should be deleted");
@@ -529,7 +549,8 @@ describe("deleteElements (native bulk delete API)", () => {
529
549
  it("delete a modeled element whose sub-model is empty", () => {
530
550
  const partitionId = insertSubModel();
531
551
  const unrelated = insertElement();
532
- txn.deleteElements([partitionId]);
552
+ const result = txn.deleteElements([partitionId]);
553
+ assert.equal(result.status, BulkDeleteElementsStatus.Success);
533
554
  assertDeleted(partitionId, "partition should be deleted");
534
555
  assertModelDeleted(partitionId, "empty sub-model should be deleted");
535
556
  assertExists(unrelated, "unrelated should be retained");
@@ -551,7 +572,8 @@ describe("deleteElements (native bulk delete API)", () => {
551
572
  const subElem1 = insertElementInModel(partitionChild);
552
573
  const subElem2 = insertElementInModel(partitionChild);
553
574
  const unrelated = insertElement();
554
- txn.deleteElements([subjectA]);
575
+ const result = txn.deleteElements([subjectA]);
576
+ assert.equal(result.status, BulkDeleteElementsStatus.Success);
555
577
  assertDeleted(subjectA, "subjectA should be deleted");
556
578
  assertDeleted(partitionChild, "partition child should be deleted");
557
579
  assertModelDeleted(partitionChild, "sub-model of partition child should be deleted");
@@ -576,7 +598,8 @@ describe("deleteElements (native bulk delete API)", () => {
576
598
  const subElem1 = insertElementInModel(partitionId);
577
599
  const subElem2 = insertElementInModel(partitionId);
578
600
  // Only pass subjectP - grandparent must survive, everything below subjectP must go.
579
- txn.deleteElements([subjectP]);
601
+ const result = txn.deleteElements([subjectP]);
602
+ assert.equal(result.status, BulkDeleteElementsStatus.Success);
580
603
  assertExists(subjectGP, "grandparent should survive");
581
604
  assertDeleted(subjectP, "parent should be deleted");
582
605
  assertDeleted(partitionId, "partition should be deleted");
@@ -589,7 +612,8 @@ describe("deleteElements (native bulk delete API)", () => {
589
612
  const partitionId = PhysicalModel.insert(txn, subjectA, `DirectPartPartition-${partitionCounter}`);
590
613
  const subElem1 = insertElementInModel(partitionId);
591
614
  const subElem2 = insertElementInModel(partitionId);
592
- txn.deleteElements([partitionId]);
615
+ const result = txn.deleteElements([partitionId]);
616
+ assert.equal(result.status, BulkDeleteElementsStatus.Success);
593
617
  assertExists(subjectA, "subject (regular parent) should survive");
594
618
  assertDeleted(partitionId, "partition should be deleted");
595
619
  assertModelDeleted(partitionId, "sub-model should be deleted");
@@ -1 +1 @@
1
- {"version":3,"file":"DeleteElements.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/DeleteElements.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert } from \"chai\";\nimport { Id64, Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport { Code, CodeScopeSpec, IModel, PhysicalElementProps, SubCategoryAppearance } from \"@itwin/core-common\";\nimport { ChannelControl, EditTxn, IModelJsFs, PhysicalModel, SnapshotDb, SpatialCategory, Subject } from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { withEditTxn } from \"../TestEditTxn\";\n\ndescribe(\"deleteElements (native bulk delete API)\", () => {\n let seedDb: SnapshotDb;\n let iModelDb: SnapshotDb;\n let modelId: Id64String;\n let categoryId: Id64String;\n let codeSpecId: Id64String;\n let txn: EditTxn;\n\n before(async () => {\n IModelJsFs.recursiveMkDirSync(KnownTestLocations.outputDir);\n const seedFile = IModelTestUtils.prepareOutputFile(\"DeleteElements\", \"seed.bim\");\n seedDb = SnapshotDb.createEmpty(seedFile, { rootSubject: { name: \"DeleteElements\" } });\n\n await withEditTxn(seedDb, \"create elements\", async (editTxn) => {\n modelId = PhysicalModel.insert(editTxn, IModel.rootSubjectId, \"TestModel\");\n categoryId = SpatialCategory.insert(editTxn, IModel.dictionaryId, \"TestCategory\", new SubCategoryAppearance());\n codeSpecId = seedDb.codeSpecs.insert(editTxn, \"TestScopeSpec\", CodeScopeSpec.Type.RelatedElement);\n assert.isNotEmpty(modelId, \"Expected a valid PhysicalModel id\");\n assert.isNotEmpty(categoryId, \"Expected a valid SpatialCategory id\");\n assert.isNotEmpty(codeSpecId, \"Expected a valid CodeSpec id\");\n });\n });\n\n beforeEach(() => {\n iModelDb = SnapshotDb.createFrom(seedDb, IModelTestUtils.prepareOutputFile(\"DeleteElements\", \"DeleteElements.bim\"));\n assert.isTrue(iModelDb.isOpen);\n txn = new EditTxn(iModelDb, \"delete elements\");\n txn.start();\n iModelDb.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n });\n\n afterEach(() => {\n txn.end(\"abandon\");\n if (iModelDb.isOpen) {\n iModelDb.close();\n }\n });\n\n after(() => {\n if (seedDb.isOpen)\n seedDb.close();\n });\n\n const insertElement = (opts: { parentId?: Id64String; codeScope?: Id64String; codeValue?: string } = {}): Id64String => {\n const { parentId, codeScope, codeValue } = opts;\n const props: PhysicalElementProps = {\n classFullName: \"Generic:PhysicalObject\",\n model: modelId,\n category: categoryId,\n code: codeScope && codeValue ? { spec: codeSpecId, scope: codeScope, value: codeValue } : Code.createEmpty(),\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\n ...(parentId ? { parent: { id: parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\n };\n const id = txn.insertElement(props);\n assert.isNotEmpty(id, \"insertElement must return a valid ID\");\n txn.saveChanges();\n return id;\n };\n\n /** Assert that the element with the given id exists or has been deleted. */\n const assertExists = (id: Id64String, msg: string) => assert.isDefined(iModelDb.elements.tryGetElement(id), msg);\n const assertDeleted = (id: Id64String, msg: string) => assert.isUndefined(iModelDb.elements.tryGetElement(id), msg);\n\n // Run deleteElements, then verify the returned failed set, check each id in `deleted` is gone and each id in `retained` is still present.\n const executeTestCase = (label: string, idsToDelete: Id64Array, deleted: Id64Array, retained: Id64Array, expectedFailed: Id64Array = []) => {\n const failed: Id64Set = txn.deleteElements(idsToDelete);\n assert.sameMembers(Array.from(failed), expectedFailed, `[${label}] failed set mismatch`);\n\n for (const id of deleted)\n assertDeleted(id, `[${label}] ${id} should have been deleted`);\n\n for (const id of retained)\n assertExists(id, `[${label}] ${id} should have been retained`);\n\n txn.abandonChanges();\n };\n\n /**\n * Shared hierarchy used throughout the parent-child tests:\n *\n * parentA parentB standalone\n * ├─ childA1 ├─ childB1 └─ childS1\n * │ └─ grandchildA1 └─ childB2\n * ├─ childA2\n * │ └─ grandchildA2\n * └─ childA3\n */\n describe(\"basic tests\", () => {\n let parentA: Id64String, childA1: Id64String, grandchildA1: Id64String;\n let childA2: Id64String, grandchildA2: Id64String, childA3: Id64String;\n let parentB: Id64String, childB1: Id64String, childB2: Id64String;\n let standalone: Id64String, childS1: Id64String;\n let all: Id64Array;\n\n beforeEach(() => {\n parentA = insertElement();\n childA1 = insertElement({ parentId: parentA });\n grandchildA1 = insertElement({ parentId: childA1 });\n childA2 = insertElement({ parentId: parentA });\n grandchildA2 = insertElement({ parentId: childA2 });\n childA3 = insertElement({ parentId: parentA });\n parentB = insertElement();\n childB1 = insertElement({ parentId: parentB });\n childB2 = insertElement({ parentId: parentB });\n standalone = insertElement();\n childS1 = insertElement({ parentId: standalone });\n all = [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3,\n parentB, childB1, childB2, standalone, childS1];\n });\n\n it(\"delete a root element\", () => {\n executeTestCase(\"root cascades\",\n [parentA],\n [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3],\n [parentB, childB1, childB2, standalone, childS1]);\n });\n\n it(\"explicitly delete the whole tree\", () => {\n executeTestCase(\"redundant descendants in input\",\n [parentA, childA1, grandchildA1, childA2],\n [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3],\n [parentB, childB1, childB2, standalone, childS1]);\n });\n\n it(\"deleting all roots removes every element\", () => {\n executeTestCase(\"delete all roots\",\n [parentA, parentB, standalone],\n all,\n []);\n });\n\n it(\"empty input set is a no-op\", () => {\n executeTestCase(\"empty set\",\n [],\n [],\n all);\n });\n\n it(\"duplicate IDs should be handled\", () => {\n const rootA = insertElement();\n const rootB = insertElement();\n\n // rootA appears twice - should not throw and should be deleted exactly once.\n txn.deleteElements([rootA, rootA, rootB]);\n assertDeleted(rootA, \"rootA should be deleted\");\n assertDeleted(rootB, \"rootB should be deleted\");\n });\n\n it(\"invalid IDs in the input throw an exception\", () => {\n const rootA = insertElement();\n\n assert.throws(() => txn.deleteElements([Id64.invalid, rootA]), `Invalid element ids: 0`);\n assert.throws(() => txn.deleteElements([\"not-an-id\", rootA]), `Invalid element ids: not-an-id`);\n\n assertExists(rootA, \"rootA should not have been deleted after a throw\");\n });\n\n it(\"deleting a child removes its subtree but leaves the parent\", () => {\n executeTestCase(\"delete depth-1 child\",\n [childA1],\n [childA1, grandchildA1],\n [parentA, childA2, grandchildA2, childA3, parentB, childB1, childB2, standalone, childS1]);\n });\n\n it(\"deleting two mid-tree siblings leaves their parent and unrelated siblings\", () => {\n executeTestCase(\"delete two depth-1 siblings\",\n [childA1, childA2],\n [childA1, grandchildA1, childA2, grandchildA2],\n [parentA, childA3, parentB, childB1, childB2, standalone, childS1]);\n });\n\n it(\"deleting a child from one tree and a child from another tree\", () => {\n executeTestCase(\"cross-tree mid-tree delete\",\n [childA1, childB2],\n [childA1, grandchildA1, childB2],\n [parentA, childA2, grandchildA2, childA3, parentB, childB1, standalone, childS1]);\n });\n\n it(\"deleting mid-tree nodes mixed with a root\", () => {\n executeTestCase(\"mid-tree + roots mixed\",\n [childA1, childA3, parentB, standalone],\n [childA1, grandchildA1, childA3, parentB, childB1, childB2, standalone, childS1],\n [parentA, childA2, grandchildA2]);\n });\n\n it(\"deleting only grandchildren leaves all ancestors\", () => {\n executeTestCase(\"delete leaves only\",\n [grandchildA1, grandchildA2],\n [grandchildA1, grandchildA2],\n [parentA, childA1, childA2, childA3, parentB, childB1, childB2, standalone, childS1]);\n });\n\n it(\"deleting leaves from different subtrees simultaneously\", () => {\n executeTestCase(\"leaves from multiple subtrees\",\n [grandchildA1, childB1, childS1],\n [grandchildA1, childB1, childS1],\n [parentA, childA1, childA2, grandchildA2, childA3, parentB, childB2, standalone]);\n });\n\n it(\"deleting root, mid-tree and leaf\", () => {\n executeTestCase(\"root + child + grandchild + leaf\",\n [childA1, grandchildA2, parentB, childS1],\n [childA1, grandchildA1, grandchildA2, parentB, childB1, childB2, childS1],\n [parentA, childA2, childA3, standalone]);\n });\n\n it(\"parent and its grandchild\", () => {\n executeTestCase(\"parent + grandchild redundant\",\n [parentA, grandchildA1],\n [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3],\n [parentB, childB1, childB2, standalone, childS1]);\n });\n });\n\n describe(\"intra-set code scope dependency\", () => {\n it(\"child element is the code scope for an unrelated element\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const rootB = insertElement({ codeScope: childA, codeValue: \"rootB-code\" });\n executeTestCase(\"depth-1 child scopes unrelated root - delete child+root directly\",\n [childA, rootB],\n [childA, rootB],\n [rootA]);\n\n executeTestCase(\"depth-1 child scopes unrelated root - delete child only\",\n [childA],\n [],\n [rootA, childA, rootB],\n [childA]);\n\n executeTestCase(\"depth-1 child scopes unrelated root - delete root only\",\n [rootB],\n [rootB],\n [rootA, childA]);\n });\n\n it(\"grandchild is the code scope for an unrelated root\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const grandchildA = insertElement({ parentId: childA });\n const rootB = insertElement({ codeScope: grandchildA, codeValue: \"rootB-code\" });\n executeTestCase(\"depth-2 grandchild scopes unrelated root - delete both roots\",\n [rootA, rootB],\n [rootA, childA, grandchildA, rootB],\n []);\n\n executeTestCase(\"depth-2 grandchild scopes unrelated root - delete grandchild+root directly\",\n [grandchildA, rootB],\n [grandchildA, rootB],\n [rootA, childA]);\n });\n\n it(\"root element scopes a child in another subtree\", () => {\n const rootA = insertElement();\n const rootB = insertElement();\n const childB = insertElement({ parentId: rootB, codeScope: rootA, codeValue: \"childB-code\" });\n executeTestCase(\"root scopes depth-1 child in sibling tree\",\n [rootA, rootB],\n [rootA, rootB, childB],\n []);\n });\n\n it(\"scope chains\", () => {\n // C -> B -> A\n // Test all combinations of inputs\n const rootA = insertElement();\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\n const rootC = insertElement({ codeScope: rootB, codeValue: \"rootC-code\" });\n executeTestCase(\"scope chain single A\", [rootA], [], [rootA, rootB, rootC], [rootA]);\n executeTestCase(\"scope chain single B\", [rootB], [], [rootA, rootB, rootC], [rootB]);\n executeTestCase(\"scope chain single C\", [rootC], [rootC], [rootA, rootB]);\n\n executeTestCase(\"scope chain forward\", [rootA, rootB, rootC], [rootA, rootB, rootC], []);\n executeTestCase(\"scope chain reversed\", [rootC, rootB, rootA], [rootA, rootB, rootC], []);\n executeTestCase(\"scope chain middle-first\", [rootB, rootA, rootC], [rootA, rootB, rootC], []);\n });\n\n it(\"scope chain A -> B -> C -> D where only A and D are in the delete set\", () => {\n const rootA = insertElement();\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\n const rootC = insertElement({ codeScope: rootB, codeValue: \"rootC-code\" });\n const rootD = insertElement({ codeScope: rootC, codeValue: \"rootD-code\" });\n\n // Only A and D in the delete set. B is external -> A ignored. D's scope (C) is not being deleted -> D is safe.\n executeTestCase(\"deep gap chain: A ignored, D deleted\",\n [rootA, rootD],\n [rootD],\n [rootA, rootB, rootC],\n [rootA]);\n });\n\n it(\"two elements using the same scope\", () => {\n // A is the code scope for both B and C independently.\n // A\n // / \\\n // B C (code scope, not parent-child)\n const rootA = insertElement();\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\n const rootC = insertElement({ codeScope: rootA, codeValue: \"rootC-code\" });\n executeTestCase(\"delete all three\",\n [rootA, rootB, rootC],\n [rootA, rootB, rootC],\n []);\n\n executeTestCase(\"delete only B and C\",\n [rootB, rootC],\n [rootB, rootC],\n [rootA]);\n });\n\n it(\"parent is also the code scope of its own child\", () => {\n const rootP = insertElement();\n const childC = insertElement({ parentId: rootP, codeScope: rootP, codeValue: \"childC-code\" });\n executeTestCase(\"parent is code scope of child - delete parent\",\n [rootP],\n [rootP, childC],\n []);\n });\n\n it(\"sibling scopes it's own sibling\", () => {\n // parent\n // ├─ childA (code scope for childB)\n // └─ childB (scoped by childA)\n const parent = insertElement();\n const childA = insertElement({ parentId: parent });\n const childB = insertElement({ parentId: parent, codeScope: childA, codeValue: \"childB-code\" });\n\n // Delete via parent cascade - sibling scope must not block deletion.\n executeTestCase(\"sibling scope - delete via parent\",\n [parent],\n [parent, childA, childB],\n []);\n\n // Delete both siblings directly - intra-set scope, no external violation.\n executeTestCase(\"sibling scope - delete both directly\",\n [childA, childB],\n [childA, childB],\n [parent]);\n\n // Delete only the scoped child - its scope (childA) is not being deleted, safe to delete.\n executeTestCase(\"sibling scope - delete only scoped child\",\n [childB],\n [childB],\n [parent, childA]);\n\n // Delete only the scope element - childB is external -> childA ignored.\n executeTestCase(\"sibling scope - delete only scope element, ignored due to external childB\",\n [childA],\n [],\n [parent, childA, childB],\n [childA]);\n });\n });\n\n describe(\"Code scope violations to test delete set element pruning\", () => {\n it(\"root is code scope for an external element\", () => {\n const rootA = insertElement();\n const external = insertElement({ codeScope: rootA, codeValue: \"ext-code\" });\n const rootB = insertElement();\n executeTestCase(\"external scopes root\",\n [rootA, rootB],\n [rootB],\n [rootA, external],\n [rootA]);\n });\n\n it(\"depth-1 child is code scope for external\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const external = insertElement({ codeScope: childA, codeValue: \"ext-code\" });\n const rootB = insertElement();\n executeTestCase(\"external scopes depth-1 child - parent subtree ignored\",\n [rootA, rootB],\n [rootB],\n [rootA, childA, external],\n [rootA]);\n });\n\n it(\"depth-2 grandchild is code scope for external\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const grandchildA = insertElement({ parentId: childA });\n const external = insertElement({ codeScope: grandchildA, codeValue: \"ext-code\" });\n const rootB = insertElement();\n executeTestCase(\"external scopes depth-2 grandchild - grandparent subtree ignored\",\n [rootA, rootB],\n [rootB],\n [rootA, childA, grandchildA, external],\n [rootA]);\n });\n\n it(\"only the child is passed for deletion\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const external = insertElement({ codeScope: childA, codeValue: \"ext-code\" });\n executeTestCase(\"external scopes requested child\",\n [childA],\n [],\n [rootA, childA, external],\n [childA]);\n });\n\n it(\"root has both an external scope dependent AND an intra-set scope dependent\", () => {\n const rootA = insertElement();\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\n const external = insertElement({ codeScope: rootA, codeValue: \"ext-code\" });\n executeTestCase(\"root ignored due to external; sibling still deleted\",\n [rootA, rootB],\n [rootB],\n [rootA, external],\n [rootA]);\n });\n\n it(\"two independent external scope violations\", () => {\n const rootA = insertElement();\n const rootB = insertElement();\n const extX = insertElement({ codeScope: rootA, codeValue: \"extX\" });\n const extY = insertElement({ codeScope: rootB, codeValue: \"extY\" });\n const rootC = insertElement();\n executeTestCase(\"two independent violations\",\n [rootA, rootB, rootC],\n [rootC],\n [rootA, rootB, extX, extY],\n [rootA, rootB]);\n });\n });\n\n describe(\"mixed element hierarchy and code scope violations\", () => {\n it(\"root scopes another root - delete both roots, all descendants removed\", () => {\n const rootA = insertElement();\n const childA1 = insertElement({ parentId: rootA });\n const childA2 = insertElement({ parentId: rootA });\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\n const childB1 = insertElement({ parentId: rootB });\n executeTestCase(\"root scopes root - delete both roots\",\n [rootA, rootB],\n [rootA, childA1, childA2, rootB, childB1],\n []);\n });\n\n it(\"depth-1 child scopes an unrelated root\", () => {\n const rootA = insertElement();\n const childA1 = insertElement({ parentId: rootA });\n const rootB = insertElement({ codeScope: childA1, codeValue: \"rootB-code\" });\n const childB1 = insertElement({ parentId: rootB });\n executeTestCase(\"depth-1 child scopes root - delete both via parents\",\n [rootA, rootB],\n [rootA, childA1, rootB, childB1],\n []);\n // Reverse input order - result must be identical\n executeTestCase(\"depth-1 child scopes root - reverse input order\",\n [rootB, rootA],\n [rootA, childA1, rootB, childB1],\n []);\n });\n\n it(\"depth-1 child scopes an unrelated root - delete child and root directly (parent survives)\", () => {\n const rootA = insertElement();\n const childA1 = insertElement({ parentId: rootA });\n const rootB = insertElement({ codeScope: childA1, codeValue: \"rootB-code\" });\n const childB1 = insertElement({ parentId: rootB });\n // Only childA1 and rootB - rootA is NOT in the delete set.\n executeTestCase(\"depth-1 child scopes root - delete child + scoped root directly\",\n [childA1, rootB],\n [childA1, rootB, childB1],\n [rootA]);\n });\n\n it(\"depth-1 child scopes an unrelated root - deleting only the child cascades into the scoped root's subtree\", () => {\n // childA1 is the code scope of rootB. When childA1 is deleted, rootB loses its scope\n // element -> rootB (and its children) must also be deleted.\n const rootA = insertElement();\n const childA1 = insertElement({ parentId: rootA });\n const rootB = insertElement({ codeScope: childA1, codeValue: \"rootB-code\" });\n const childB1 = insertElement({ parentId: rootB });\n executeTestCase(\"delete child only - scoped root also removed\",\n [childA1],\n [],\n [rootA, childA1, rootB, childB1],\n [childA1]);\n });\n\n it(\"root scopes a depth-1 child in sibling tree - delete both roots, all descendants removed\", () => {\n const rootA = insertElement();\n const childA1 = insertElement({ parentId: rootA });\n const rootB = insertElement();\n const childB1 = insertElement({ parentId: rootB, codeScope: rootA, codeValue: \"childB1-code\" });\n executeTestCase(\"root scopes depth-1 child - delete both roots\",\n [rootA, rootB],\n [rootA, childA1, rootB, childB1],\n []);\n });\n\n it(\"depth-1 child scopes a depth-1 child in sibling tree - delete both children directly (parents survive)\", () => {\n const rootA = insertElement();\n const childA1 = insertElement({ parentId: rootA });\n const rootB = insertElement();\n const childB1 = insertElement({ parentId: rootB, codeScope: childA1, codeValue: \"childB1-code\" });\n const childB2 = insertElement({ parentId: rootB });\n executeTestCase(\"sibling-child scope - delete both children directly\",\n [childA1, childB1],\n [childA1, childB1],\n [rootA, rootB, childB2]);\n });\n\n it(\"depth-2 grandchild scopes an unrelated root - delete grandparent + scoped root\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const grandchildA = insertElement({ parentId: childA });\n const rootB = insertElement({ codeScope: grandchildA, codeValue: \"rootB-code\" });\n const childB = insertElement({ parentId: rootB });\n executeTestCase(\"depth-2 grandchild scopes root - delete both roots\",\n [rootA, rootB],\n [rootA, childA, grandchildA, rootB, childB],\n []);\n\n // Delete grandchild and scoped root directly (rootA and childA survive)\n executeTestCase(\"depth-2 grandchild scopes root - delete grandchild + root directly\",\n [grandchildA, rootB],\n [grandchildA, rootB, childB],\n [rootA, childA]);\n });\n\n it(\"external element scopes a depth-2 grandchild, mixed with an unrelated deletion\", () => {\n // Unique case: grandchild has an external scope violation, but an unrelated element from\n // another tree (childB) is also requested and has no violation - it should be deleted.\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const grandchildA = insertElement({ parentId: childA });\n const rootB = insertElement();\n const childB = insertElement({ parentId: rootB });\n const external = insertElement({ codeScope: grandchildA, codeValue: \"ext-code\" });\n executeTestCase(\"external scopes depth-2 grandchild, unrelated childB deleted\",\n [grandchildA, rootA, childB],\n [childB],\n [rootA, childA, grandchildA, rootB, external],\n [rootA, grandchildA]);\n });\n\n it(\"two trees: one has external scope violation, other is deleted cleanly\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const gcA = insertElement({ parentId: childA });\n const external = insertElement({ codeScope: childA, codeValue: \"ext-code\" });\n const rootB = insertElement();\n const childB1 = insertElement({ parentId: rootB });\n const childB2 = insertElement({ parentId: rootB });\n const gcB = insertElement({ parentId: childB1 });\n executeTestCase(\"one tree ignored, other fully deleted\",\n [rootA, rootB],\n [rootB, childB1, childB2, gcB],\n [rootA, childA, gcA, external],\n [rootA]);\n });\n });\n\n describe(\"sub-model hierarchy\", () => {\n let partitionCounter = 0;\n\n const insertSubModel = (): Id64String => {\n const name = `SubModelPartition-${++partitionCounter}`;\n return PhysicalModel.insert(txn, IModel.rootSubjectId, name);\n };\n\n const insertElementInModel = (subModelId: Id64String, opts: { parentId?: Id64String } = {}): Id64String => {\n const props: PhysicalElementProps = {\n classFullName: \"Generic:PhysicalObject\",\n model: subModelId,\n category: categoryId,\n code: Code.createEmpty(),\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\n ...(opts.parentId ? { parent: { id: opts.parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\n };\n const id = txn.insertElement(props);\n assert.isNotEmpty(id, \"insertElementInModel must return a valid ID\");\n txn.saveChanges();\n return id;\n };\n\n /** Assert that the sub-model has been deleted. */\n const assertModelDeleted = (id: Id64String, msg: string) =>\n assert.isUndefined(iModelDb.models.tryGetModelProps(id), msg);\n\n /** Assert that the sub-model still exists. */\n const assertModelExists = (id: Id64String, msg: string) =>\n assert.isDefined(iModelDb.models.tryGetModelProps(id), msg);\n\n it(\"delete a modeled element cascades into its sub-model\", () => {\n const partitionId = insertSubModel();\n const elem1 = insertElementInModel(partitionId);\n const elem2 = insertElementInModel(partitionId);\n const unrelated = insertElement();\n\n txn.deleteElements([partitionId]);\n assertDeleted(partitionId, \"partition element should be deleted\");\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\n assertDeleted(elem1, \"elem1 inside sub-model should be deleted\");\n assertDeleted(elem2, \"elem2 inside sub-model should be deleted\");\n assertExists(unrelated, \"unrelated element should be retained\");\n });\n\n /**\n * Scenario: Subject -> partition (parent-child) -> modeled-element.\n *\n * subjectA\n * └─ [P:childPartition]\n * [M:childPartition] -> elem1\n * unrelated\n */\n it(\"delete a parent whose child is a modeled element cascades into the sub-model\", () => {\n const subjectA = Subject.insert(txn, IModel.rootSubjectId, `SubjectA-${++partitionCounter}`);\n const childPartitionId = PhysicalModel.insert(txn, subjectA, `ChildPartition-${partitionCounter}`);\n const elem1 = insertElementInModel(childPartitionId);\n const unrelated = insertElement();\n\n // Deleting subjectA cascades (parent-child) to childPartitionId, which then cascades (modeled-element) into elem1.\n txn.deleteElements([subjectA]);\n assertDeleted(subjectA, \"subject should be deleted\");\n assertDeleted(childPartitionId, \"child partition element should be deleted\");\n assertModelDeleted(childPartitionId, \"child partition sub-model should be deleted\");\n assertDeleted(elem1, \"elem1 inside child partition sub-model should be deleted\");\n assertExists(unrelated, \"unrelated element should be retained\");\n });\n\n /**\n * Scenario: sub-model elements have their own children; all should be removed transitively.\n *\n * [P:partition]\n * [M:partition] -> elem1\n * └─ childOfElem1\n * └─ grandchildOfElem1\n * elem2\n * unrelated element\n */\n it(\"delete a modeled element whose sub-model elements have children\", () => {\n const partitionId = insertSubModel();\n const elem1 = insertElementInModel(partitionId);\n const childOfElem1 = insertElementInModel(partitionId, { parentId: elem1 });\n const grandchildOfElem1 = insertElementInModel(partitionId, { parentId: childOfElem1 });\n const elem2 = insertElementInModel(partitionId);\n const unrelated = insertElement();\n\n txn.deleteElements([partitionId]);\n assertDeleted(partitionId, \"partition should be deleted\");\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\n assertDeleted(elem1, \"elem1 should be deleted\");\n assertDeleted(childOfElem1, \"child of elem1 should be deleted\");\n assertDeleted(grandchildOfElem1, \"grandchild of elem1 should be deleted\");\n assertDeleted(elem2, \"elem2 should be deleted\");\n assertExists(unrelated, \"unrelated should be retained\");\n });\n\n /**\n * Scenario: element inside a sub-model is a code scope for an element outside the delete set. The whole partition subtree must be ignored from the delete set.\n *\n * [P:partition]\n * [M:partition] -> scopingElem <- code scope for `external`\n * otherElem\n * external (not in delete set)\n * unrelated\n */\n it(\"partition ignored when a sub-model element is a code scope for an external element\", () => {\n const partitionId = insertSubModel();\n const scopingElem = insertElementInModel(partitionId);\n const otherElem = insertElementInModel(partitionId);\n const external = insertElement({ codeScope: scopingElem, codeValue: \"ext-code\" });\n const unrelated = insertElement();\n\n // `external` is NOT in the delete set and uses scopingElem as its code scope -> the\n // entire partition subtree (including the sub-model) must be ignored from the delete set.\n txn.deleteElements([partitionId, unrelated]);\n assertExists(partitionId, \"partition should be ignored (retained)\");\n assertModelExists(partitionId, \"sub-model should be retained\");\n assertExists(scopingElem, \"scopingElem should be retained\");\n assertExists(otherElem, \"otherElem should be retained\");\n assertExists(external, \"external should be retained\");\n assertDeleted(unrelated, \"unrelated should still be deleted\");\n });\n\n /**\n * Scenario: the sub-model element of one partition is used as a code scope for an element\n * inside a *different* partition's sub-model that is also in the delete set.\n * Both partitions and all contents should be deleted.\n *\n * [P:p1] [M:p1] -> scopingElem\n * [P:p2] [M:p2] -> dependentElem (codeScope = scopingElem)\n */\n it(\"cross-sub-model intra-set code scope dependency: both partitions deleted cleanly\", () => {\n const p1 = insertSubModel();\n const scopingElem = insertElementInModel(p1);\n const p2 = insertSubModel();\n const dependentElem = insertElementInModel(p2, {});\n // Manually assign the code scope after insertion is not possible through insertElementInModel,\n // so use a dedicated insert call.\n const dependentId = txn.insertElement({\n classFullName: \"Generic:PhysicalObject\",\n model: p2,\n category: categoryId,\n code: { spec: codeSpecId, scope: scopingElem, value: \"dep-code\" },\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\n } as PhysicalElementProps);\n\n txn.deleteElements([p1, p2]);\n assertDeleted(p1, \"p1 should be deleted\");\n assertModelDeleted(p1, \"sub-model of p1 should be deleted\");\n assertDeleted(scopingElem, \"scopingElem should be deleted\");\n assertDeleted(p2, \"p2 should be deleted\");\n assertModelDeleted(p2, \"sub-model of p2 should be deleted\");\n assertDeleted(dependentElem, \"dependentElem should be deleted\");\n assertDeleted(dependentId, \"dependentId should be deleted\");\n });\n\n /**\n * Scenario: three-level Subject cascade: deleting a grandparent Subject removes a child\n * Subject, which removes a partition (parent-child), which cascades into the sub-model.\n *\n * grandparentSubject\n * └─ childSubject\n * └─ [P:grandchildPartition]\n * [M:grandchildPartition] -> innerElem1, innerElem2\n * unrelated\n */\n it(\"deep cascade: grandparent Subject -> child Subject -> partition -> sub-model elements\", () => {\n const grandparentSubjectId = Subject.insert(txn, IModel.rootSubjectId, `GrandparentSubject-${++partitionCounter}`);\n const childSubjectId = Subject.insert(txn, grandparentSubjectId, `ChildSubject-${partitionCounter}`);\n const grandchildPartitionId = PhysicalModel.insert(txn, childSubjectId, `GrandchildPartition-${partitionCounter}`);\n const innerElem1 = insertElementInModel(grandchildPartitionId);\n const innerElem2 = insertElementInModel(grandchildPartitionId);\n const unrelated = insertElement();\n\n txn.deleteElements([grandparentSubjectId]);\n assertDeleted(grandparentSubjectId, \"grandparent subject should be deleted\");\n assertDeleted(childSubjectId, \"child subject should be deleted\");\n assertDeleted(grandchildPartitionId, \"grandchild partition should be deleted\");\n assertModelDeleted(grandchildPartitionId, \"grandchild sub-model should be deleted\");\n assertDeleted(innerElem1, \"innerElem1 should be deleted\");\n assertDeleted(innerElem2, \"innerElem2 should be deleted\");\n assertExists(unrelated, \"unrelated should be retained\");\n });\n\n /**\n * Scenario: empty sub-model: partition with no elements in its sub-model.\n *\n * [P:partition] [M:partition] (empty)\n * unrelated\n */\n it(\"delete a modeled element whose sub-model is empty\", () => {\n const partitionId = insertSubModel();\n const unrelated = insertElement();\n\n txn.deleteElements([partitionId]);\n assertDeleted(partitionId, \"partition should be deleted\");\n assertModelDeleted(partitionId, \"empty sub-model should be deleted\");\n assertExists(unrelated, \"unrelated should be retained\");\n });\n\n /**\n * Scenario: a regular element has two children, one of which is a partition with a\n * sub-model, while the other is an ordinary element. Deleting the regular parent\n * removes both children and all sub-model contents.\n *\n * regularParent (lives in modelId)\n * ├─ ordinaryChild\n * └─ [P:partitionChild]\n * [M:partitionChild] -> subElem1, subElem2\n * unrelated\n */\n it(\"deleting a regular element with a mix of ordinary and partition children cascades correctly\", () => {\n const subjectA = Subject.insert(txn, IModel.rootSubjectId, `MixedChildSubject-${++partitionCounter}`);\n const partitionChild = PhysicalModel.insert(txn, subjectA, `MixedChildPartition-${partitionCounter}`);\n const subElem1 = insertElementInModel(partitionChild);\n const subElem2 = insertElementInModel(partitionChild);\n const unrelated = insertElement();\n\n txn.deleteElements([subjectA]);\n assertDeleted(subjectA, \"subjectA should be deleted\");\n assertDeleted(partitionChild, \"partition child should be deleted\");\n assertModelDeleted(partitionChild, \"sub-model of partition child should be deleted\");\n assertDeleted(subElem1, \"subElem1 should be deleted\");\n assertDeleted(subElem2, \"subElem2 should be deleted\");\n assertExists(unrelated, \"unrelated should be retained\");\n });\n\n /**\n * Scenario: a regular element's grandchild is a partition. Passing the partition's\n * direct parent (not the grandparent root) for deletion cascades into the sub-model while\n * the grandparent survives.\n *\n * grandparent (lives in modelId)\n * └─ parent <- passed for deletion\n * └─ [P:partition]\n * [M:partition] -> subElem1, subElem2\n */\n it(\"deleting a mid-tree regular element whose child is a partition cascades into the sub-model; grandparent survives\", () => {\n const subjectGP = Subject.insert(txn, IModel.rootSubjectId, `MidTreeGP-${++partitionCounter}`);\n const subjectP = Subject.insert(txn, subjectGP, `MidTreeP-${partitionCounter}`);\n const partitionId = PhysicalModel.insert(txn, subjectP, `MidTreePartition-${partitionCounter}`);\n const subElem1 = insertElementInModel(partitionId);\n const subElem2 = insertElementInModel(partitionId);\n\n // Only pass subjectP - grandparent must survive, everything below subjectP must go.\n txn.deleteElements([subjectP]);\n assertExists(subjectGP, \"grandparent should survive\");\n assertDeleted(subjectP, \"parent should be deleted\");\n assertDeleted(partitionId, \"partition should be deleted\");\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\n assertDeleted(subElem1, \"subElem1 should be deleted\");\n assertDeleted(subElem2, \"subElem2 should be deleted\");\n });\n\n it(\"deleting a partition element directly (not via its regular parent) cascades into the sub-model; parent survives\", () => {\n const subjectA = Subject.insert(txn, IModel.rootSubjectId, `DirectPartSubject-${++partitionCounter}`);\n const partitionId = PhysicalModel.insert(txn, subjectA, `DirectPartPartition-${partitionCounter}`);\n const subElem1 = insertElementInModel(partitionId);\n const subElem2 = insertElementInModel(partitionId);\n\n txn.deleteElements([partitionId]);\n assertExists(subjectA, \"subject (regular parent) should survive\");\n assertDeleted(partitionId, \"partition should be deleted\");\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\n assertDeleted(subElem1, \"subElem1 should be deleted\");\n assertDeleted(subElem2, \"subElem2 should be deleted\");\n });\n });\n});"]}
1
+ {"version":3,"file":"DeleteElements.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/DeleteElements.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert } from \"chai\";\nimport { DbResult, Id64, Id64Array, Id64String } from \"@itwin/core-bentley\";\nimport { Code, CodeScopeSpec, IModel, PhysicalElementProps, SubCategoryAppearance } from \"@itwin/core-common\";\nimport { BulkDeleteElementsResult, BulkDeleteElementsStatus, ChannelControl, EditTxn, IModelJsFs, PhysicalModel, SnapshotDb, SpatialCategory, Subject } from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { withEditTxn } from \"../TestEditTxn\";\n\ndescribe(\"deleteElements (native bulk delete API)\", () => {\n let seedDb: SnapshotDb;\n let iModelDb: SnapshotDb;\n let modelId: Id64String;\n let categoryId: Id64String;\n let codeSpecId: Id64String;\n let txn: EditTxn;\n\n before(async () => {\n IModelJsFs.recursiveMkDirSync(KnownTestLocations.outputDir);\n const seedFile = IModelTestUtils.prepareOutputFile(\"DeleteElements\", \"seed.bim\");\n seedDb = SnapshotDb.createEmpty(seedFile, { rootSubject: { name: \"DeleteElements\" } });\n\n await withEditTxn(seedDb, \"create elements\", async (editTxn) => {\n modelId = PhysicalModel.insert(editTxn, IModel.rootSubjectId, \"TestModel\");\n categoryId = SpatialCategory.insert(editTxn, IModel.dictionaryId, \"TestCategory\", new SubCategoryAppearance());\n codeSpecId = seedDb.codeSpecs.insert(editTxn, \"TestScopeSpec\", CodeScopeSpec.Type.RelatedElement);\n assert.isNotEmpty(modelId, \"Expected a valid PhysicalModel id\");\n assert.isNotEmpty(categoryId, \"Expected a valid SpatialCategory id\");\n assert.isNotEmpty(codeSpecId, \"Expected a valid CodeSpec id\");\n });\n });\n\n beforeEach(() => {\n iModelDb = SnapshotDb.createFrom(seedDb, IModelTestUtils.prepareOutputFile(\"DeleteElements\", \"DeleteElements.bim\"));\n assert.isTrue(iModelDb.isOpen);\n txn = new EditTxn(iModelDb, \"delete elements\");\n txn.start();\n iModelDb.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n });\n\n afterEach(() => {\n txn.end(\"abandon\");\n if (iModelDb.isOpen) {\n iModelDb.close();\n }\n });\n\n after(() => {\n if (seedDb.isOpen)\n seedDb.close();\n });\n\n const insertElement = (opts: { parentId?: Id64String; codeScope?: Id64String; codeValue?: string } = {}): Id64String => {\n const { parentId, codeScope, codeValue } = opts;\n const props: PhysicalElementProps = {\n classFullName: \"Generic:PhysicalObject\",\n model: modelId,\n category: categoryId,\n code: codeScope && codeValue ? { spec: codeSpecId, scope: codeScope, value: codeValue } : Code.createEmpty(),\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\n ...(parentId ? { parent: { id: parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\n };\n const id = txn.insertElement(props);\n assert.isNotEmpty(id, \"insertElement must return a valid ID\");\n txn.saveChanges();\n return id;\n };\n\n /** Assert that the element with the given id exists or has been deleted. */\n const assertExists = (id: Id64String, msg: string) => assert.isDefined(iModelDb.elements.tryGetElement(id), msg);\n const assertDeleted = (id: Id64String, msg: string) => assert.isUndefined(iModelDb.elements.tryGetElement(id), msg);\n\n // Run deleteElements, then verify the returned failed set, check each id in `deleted` is gone and each id in `retained` is still present.\n const executeTestCase = (label: string, idsToDelete: Id64Array, deleted: Id64Array, retained: Id64Array, expectedFailed: Id64Array = []) => {\n const resultStatus: BulkDeleteElementsResult = txn.deleteElements(idsToDelete);\n if (expectedFailed.length === 0)\n assert.equal(resultStatus.status, BulkDeleteElementsStatus.Success);\n else\n assert.equal(resultStatus.status, (expectedFailed.length === idsToDelete.length) ? BulkDeleteElementsStatus.DeletionFailed : BulkDeleteElementsStatus.PartialSuccess);\n\n assert.sameMembers(Array.from(resultStatus.failedIds), expectedFailed, `[${label}] failed set mismatch`);\n\n for (const id of deleted)\n assertDeleted(id, `[${label}] ${id} should have been deleted`);\n\n for (const id of retained)\n assertExists(id, `[${label}] ${id} should have been retained`);\n\n txn.abandonChanges();\n };\n\n /**\n * Shared hierarchy used throughout the parent-child tests:\n *\n * parentA parentB standalone\n * ├─ childA1 ├─ childB1 └─ childS1\n * │ └─ grandchildA1 └─ childB2\n * ├─ childA2\n * │ └─ grandchildA2\n * └─ childA3\n */\n describe(\"basic tests\", () => {\n let parentA: Id64String, childA1: Id64String, grandchildA1: Id64String;\n let childA2: Id64String, grandchildA2: Id64String, childA3: Id64String;\n let parentB: Id64String, childB1: Id64String, childB2: Id64String;\n let standalone: Id64String, childS1: Id64String;\n let all: Id64Array;\n\n beforeEach(() => {\n parentA = insertElement();\n childA1 = insertElement({ parentId: parentA });\n grandchildA1 = insertElement({ parentId: childA1 });\n childA2 = insertElement({ parentId: parentA });\n grandchildA2 = insertElement({ parentId: childA2 });\n childA3 = insertElement({ parentId: parentA });\n parentB = insertElement();\n childB1 = insertElement({ parentId: parentB });\n childB2 = insertElement({ parentId: parentB });\n standalone = insertElement();\n childS1 = insertElement({ parentId: standalone });\n all = [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3,\n parentB, childB1, childB2, standalone, childS1];\n });\n\n it(\"delete a root element\", () => {\n executeTestCase(\"root cascades\",\n [parentA],\n [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3],\n [parentB, childB1, childB2, standalone, childS1]);\n });\n\n it(\"explicitly delete the whole tree\", () => {\n executeTestCase(\"redundant descendants in input\",\n [parentA, childA1, grandchildA1, childA2],\n [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3],\n [parentB, childB1, childB2, standalone, childS1]);\n });\n\n it(\"deleting all roots removes every element\", () => {\n executeTestCase(\"delete all roots\",\n [parentA, parentB, standalone],\n all,\n []);\n });\n\n it(\"empty input set is a no-op\", () => {\n executeTestCase(\"empty set\",\n [],\n [],\n all);\n });\n\n it(\"duplicate IDs should be handled\", () => {\n const rootA = insertElement();\n const rootB = insertElement();\n\n // rootA appears twice - should not throw and should be deleted exactly once.\n assert.equal(txn.deleteElements([rootA, rootA, rootB]).status, BulkDeleteElementsStatus.Success);\n assertDeleted(rootA, \"rootA should be deleted\");\n assertDeleted(rootB, \"rootB should be deleted\");\n });\n\n it(\"invalid IDs in the input throw an exception\", () => {\n const rootA = insertElement();\n\n assert.throws(() => txn.deleteElements([Id64.invalid, rootA]), `Invalid element ids: 0`);\n assert.throws(() => txn.deleteElements([\"not-an-id\", rootA]), `Invalid element ids: not-an-id`);\n\n assertExists(rootA, \"rootA should not have been deleted after a throw\");\n });\n\n it(\"deleting a child removes its subtree but leaves the parent\", () => {\n executeTestCase(\"delete depth-1 child\",\n [childA1],\n [childA1, grandchildA1],\n [parentA, childA2, grandchildA2, childA3, parentB, childB1, childB2, standalone, childS1]);\n });\n\n it(\"deleting two mid-tree siblings leaves their parent and unrelated siblings\", () => {\n executeTestCase(\"delete two depth-1 siblings\",\n [childA1, childA2],\n [childA1, grandchildA1, childA2, grandchildA2],\n [parentA, childA3, parentB, childB1, childB2, standalone, childS1]);\n });\n\n it(\"deleting a child from one tree and a child from another tree\", () => {\n executeTestCase(\"cross-tree mid-tree delete\",\n [childA1, childB2],\n [childA1, grandchildA1, childB2],\n [parentA, childA2, grandchildA2, childA3, parentB, childB1, standalone, childS1]);\n });\n\n it(\"deleting mid-tree nodes mixed with a root\", () => {\n executeTestCase(\"mid-tree + roots mixed\",\n [childA1, childA3, parentB, standalone],\n [childA1, grandchildA1, childA3, parentB, childB1, childB2, standalone, childS1],\n [parentA, childA2, grandchildA2]);\n });\n\n it(\"deleting only grandchildren leaves all ancestors\", () => {\n executeTestCase(\"delete leaves only\",\n [grandchildA1, grandchildA2],\n [grandchildA1, grandchildA2],\n [parentA, childA1, childA2, childA3, parentB, childB1, childB2, standalone, childS1]);\n });\n\n it(\"deleting leaves from different subtrees simultaneously\", () => {\n executeTestCase(\"leaves from multiple subtrees\",\n [grandchildA1, childB1, childS1],\n [grandchildA1, childB1, childS1],\n [parentA, childA1, childA2, grandchildA2, childA3, parentB, childB2, standalone]);\n });\n\n it(\"deleting root, mid-tree and leaf\", () => {\n executeTestCase(\"root + child + grandchild + leaf\",\n [childA1, grandchildA2, parentB, childS1],\n [childA1, grandchildA1, grandchildA2, parentB, childB1, childB2, childS1],\n [parentA, childA2, childA3, standalone]);\n });\n\n it(\"parent and its grandchild\", () => {\n executeTestCase(\"parent + grandchild redundant\",\n [parentA, grandchildA1],\n [parentA, childA1, grandchildA1, childA2, grandchildA2, childA3],\n [parentB, childB1, childB2, standalone, childS1]);\n });\n });\n\n describe(\"intra-set code scope dependency\", () => {\n it(\"child element is the code scope for an unrelated element\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const rootB = insertElement({ codeScope: childA, codeValue: \"rootB-code\" });\n executeTestCase(\"depth-1 child scopes unrelated root - delete child+root directly\",\n [childA, rootB],\n [childA, rootB],\n [rootA]);\n\n executeTestCase(\"depth-1 child scopes unrelated root - delete child only\",\n [childA],\n [],\n [rootA, childA, rootB],\n [childA]);\n\n executeTestCase(\"depth-1 child scopes unrelated root - delete root only\",\n [rootB],\n [rootB],\n [rootA, childA]);\n });\n\n it(\"grandchild is the code scope for an unrelated root\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const grandchildA = insertElement({ parentId: childA });\n const rootB = insertElement({ codeScope: grandchildA, codeValue: \"rootB-code\" });\n executeTestCase(\"depth-2 grandchild scopes unrelated root - delete both roots\",\n [rootA, rootB],\n [rootA, childA, grandchildA, rootB],\n []);\n\n executeTestCase(\"depth-2 grandchild scopes unrelated root - delete grandchild+root directly\",\n [grandchildA, rootB],\n [grandchildA, rootB],\n [rootA, childA]);\n });\n\n it(\"root element scopes a child in another subtree\", () => {\n const rootA = insertElement();\n const rootB = insertElement();\n const childB = insertElement({ parentId: rootB, codeScope: rootA, codeValue: \"childB-code\" });\n executeTestCase(\"root scopes depth-1 child in sibling tree\",\n [rootA, rootB],\n [rootA, rootB, childB],\n []);\n });\n\n it(\"scope chains\", () => {\n // C -> B -> A\n // Test all combinations of inputs\n const rootA = insertElement();\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\n const rootC = insertElement({ codeScope: rootB, codeValue: \"rootC-code\" });\n executeTestCase(\"scope chain single A\", [rootA], [], [rootA, rootB, rootC], [rootA]);\n executeTestCase(\"scope chain single B\", [rootB], [], [rootA, rootB, rootC], [rootB]);\n executeTestCase(\"scope chain single C\", [rootC], [rootC], [rootA, rootB]);\n\n executeTestCase(\"scope chain forward\", [rootA, rootB, rootC], [rootA, rootB, rootC], []);\n executeTestCase(\"scope chain reversed\", [rootC, rootB, rootA], [rootA, rootB, rootC], []);\n executeTestCase(\"scope chain middle-first\", [rootB, rootA, rootC], [rootA, rootB, rootC], []);\n });\n\n it(\"scope chain A -> B -> C -> D where only A and D are in the delete set\", () => {\n const rootA = insertElement();\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\n const rootC = insertElement({ codeScope: rootB, codeValue: \"rootC-code\" });\n const rootD = insertElement({ codeScope: rootC, codeValue: \"rootD-code\" });\n\n // Only A and D in the delete set. B is external -> A ignored. D's scope (C) is not being deleted -> D is safe.\n executeTestCase(\"deep gap chain: A ignored, D deleted\",\n [rootA, rootD],\n [rootD],\n [rootA, rootB, rootC],\n [rootA]);\n });\n\n it(\"scope chain delete with skipping constraint validation should fail\", () => {\n const rootA = insertElement();\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\n const rootC = insertElement({ codeScope: rootB, codeValue: \"rootC-code\" });\n const rootD = insertElement({ codeScope: rootC, codeValue: \"rootD-code\" });\n\n const resultStatus: BulkDeleteElementsResult = txn.deleteElements([rootA, rootD], { skipFKConstraintValidations: true });\n assert.equal(resultStatus.status, BulkDeleteElementsStatus.DeletionFailed);\n assert.equal(resultStatus.sqlDeleteStatus, DbResult.BE_SQLITE_CONSTRAINT_FOREIGNKEY);\n });\n\n it(\"two elements using the same scope\", () => {\n // A is the code scope for both B and C independently.\n // A\n // / \\\n // B C (code scope, not parent-child)\n const rootA = insertElement();\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\n const rootC = insertElement({ codeScope: rootA, codeValue: \"rootC-code\" });\n executeTestCase(\"delete all three\",\n [rootA, rootB, rootC],\n [rootA, rootB, rootC],\n []);\n\n executeTestCase(\"delete only B and C\",\n [rootB, rootC],\n [rootB, rootC],\n [rootA]);\n });\n\n it(\"parent is also the code scope of its own child\", () => {\n const rootP = insertElement();\n const childC = insertElement({ parentId: rootP, codeScope: rootP, codeValue: \"childC-code\" });\n executeTestCase(\"parent is code scope of child - delete parent\",\n [rootP],\n [rootP, childC],\n []);\n });\n\n it(\"sibling scopes it's own sibling\", () => {\n // parent\n // ├─ childA (code scope for childB)\n // └─ childB (scoped by childA)\n const parent = insertElement();\n const childA = insertElement({ parentId: parent });\n const childB = insertElement({ parentId: parent, codeScope: childA, codeValue: \"childB-code\" });\n\n // Delete via parent cascade - sibling scope must not block deletion.\n executeTestCase(\"sibling scope - delete via parent\",\n [parent],\n [parent, childA, childB],\n []);\n\n // Delete both siblings directly - intra-set scope, no external violation.\n executeTestCase(\"sibling scope - delete both directly\",\n [childA, childB],\n [childA, childB],\n [parent]);\n\n // Delete only the scoped child - its scope (childA) is not being deleted, safe to delete.\n executeTestCase(\"sibling scope - delete only scoped child\",\n [childB],\n [childB],\n [parent, childA]);\n\n // Delete only the scope element - childB is external -> childA ignored.\n executeTestCase(\"sibling scope - delete only scope element, ignored due to external childB\",\n [childA],\n [],\n [parent, childA, childB],\n [childA]);\n });\n });\n\n describe(\"Code scope violations to test delete set element pruning\", () => {\n it(\"root is code scope for an external element\", () => {\n const rootA = insertElement();\n const external = insertElement({ codeScope: rootA, codeValue: \"ext-code\" });\n const rootB = insertElement();\n executeTestCase(\"external scopes root\",\n [rootA, rootB],\n [rootB],\n [rootA, external],\n [rootA]);\n });\n\n it(\"depth-1 child is code scope for external\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const external = insertElement({ codeScope: childA, codeValue: \"ext-code\" });\n const rootB = insertElement();\n executeTestCase(\"external scopes depth-1 child - parent subtree ignored\",\n [rootA, rootB],\n [rootB],\n [rootA, childA, external],\n [rootA]);\n });\n\n it(\"depth-2 grandchild is code scope for external\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const grandchildA = insertElement({ parentId: childA });\n const external = insertElement({ codeScope: grandchildA, codeValue: \"ext-code\" });\n const rootB = insertElement();\n executeTestCase(\"external scopes depth-2 grandchild - grandparent subtree ignored\",\n [rootA, rootB],\n [rootB],\n [rootA, childA, grandchildA, external],\n [rootA]);\n });\n\n it(\"only the child is passed for deletion\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const external = insertElement({ codeScope: childA, codeValue: \"ext-code\" });\n executeTestCase(\"external scopes requested child\",\n [childA],\n [],\n [rootA, childA, external],\n [childA]);\n });\n\n it(\"root has both an external scope dependent AND an intra-set scope dependent\", () => {\n const rootA = insertElement();\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\n const external = insertElement({ codeScope: rootA, codeValue: \"ext-code\" });\n executeTestCase(\"root ignored due to external; sibling still deleted\",\n [rootA, rootB],\n [rootB],\n [rootA, external],\n [rootA]);\n });\n\n it(\"two independent external scope violations\", () => {\n const rootA = insertElement();\n const rootB = insertElement();\n const extX = insertElement({ codeScope: rootA, codeValue: \"extX\" });\n const extY = insertElement({ codeScope: rootB, codeValue: \"extY\" });\n const rootC = insertElement();\n executeTestCase(\"two independent violations\",\n [rootA, rootB, rootC],\n [rootC],\n [rootA, rootB, extX, extY],\n [rootA, rootB]);\n });\n });\n\n describe(\"mixed element hierarchy and code scope violations\", () => {\n it(\"root scopes another root - delete both roots, all descendants removed\", () => {\n const rootA = insertElement();\n const childA1 = insertElement({ parentId: rootA });\n const childA2 = insertElement({ parentId: rootA });\n const rootB = insertElement({ codeScope: rootA, codeValue: \"rootB-code\" });\n const childB1 = insertElement({ parentId: rootB });\n executeTestCase(\"root scopes root - delete both roots\",\n [rootA, rootB],\n [rootA, childA1, childA2, rootB, childB1],\n []);\n });\n\n it(\"depth-1 child scopes an unrelated root\", () => {\n const rootA = insertElement();\n const childA1 = insertElement({ parentId: rootA });\n const rootB = insertElement({ codeScope: childA1, codeValue: \"rootB-code\" });\n const childB1 = insertElement({ parentId: rootB });\n executeTestCase(\"depth-1 child scopes root - delete both via parents\",\n [rootA, rootB],\n [rootA, childA1, rootB, childB1],\n []);\n // Reverse input order - result must be identical\n executeTestCase(\"depth-1 child scopes root - reverse input order\",\n [rootB, rootA],\n [rootA, childA1, rootB, childB1],\n []);\n });\n\n it(\"depth-1 child scopes an unrelated root - delete child and root directly (parent survives)\", () => {\n const rootA = insertElement();\n const childA1 = insertElement({ parentId: rootA });\n const rootB = insertElement({ codeScope: childA1, codeValue: \"rootB-code\" });\n const childB1 = insertElement({ parentId: rootB });\n // Only childA1 and rootB - rootA is NOT in the delete set.\n executeTestCase(\"depth-1 child scopes root - delete child + scoped root directly\",\n [childA1, rootB],\n [childA1, rootB, childB1],\n [rootA]);\n });\n\n it(\"depth-1 child scopes an unrelated root - deleting only the child cascades into the scoped root's subtree\", () => {\n // childA1 is the code scope of rootB. When childA1 is deleted, rootB loses its scope\n // element -> rootB (and its children) must also be deleted.\n const rootA = insertElement();\n const childA1 = insertElement({ parentId: rootA });\n const rootB = insertElement({ codeScope: childA1, codeValue: \"rootB-code\" });\n const childB1 = insertElement({ parentId: rootB });\n executeTestCase(\"delete child only - scoped root also removed\",\n [childA1],\n [],\n [rootA, childA1, rootB, childB1],\n [childA1]);\n });\n\n it(\"root scopes a depth-1 child in sibling tree - delete both roots, all descendants removed\", () => {\n const rootA = insertElement();\n const childA1 = insertElement({ parentId: rootA });\n const rootB = insertElement();\n const childB1 = insertElement({ parentId: rootB, codeScope: rootA, codeValue: \"childB1-code\" });\n executeTestCase(\"root scopes depth-1 child - delete both roots\",\n [rootA, rootB],\n [rootA, childA1, rootB, childB1],\n []);\n });\n\n it(\"depth-1 child scopes a depth-1 child in sibling tree - delete both children directly (parents survive)\", () => {\n const rootA = insertElement();\n const childA1 = insertElement({ parentId: rootA });\n const rootB = insertElement();\n const childB1 = insertElement({ parentId: rootB, codeScope: childA1, codeValue: \"childB1-code\" });\n const childB2 = insertElement({ parentId: rootB });\n executeTestCase(\"sibling-child scope - delete both children directly\",\n [childA1, childB1],\n [childA1, childB1],\n [rootA, rootB, childB2]);\n });\n\n it(\"depth-2 grandchild scopes an unrelated root - delete grandparent + scoped root\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const grandchildA = insertElement({ parentId: childA });\n const rootB = insertElement({ codeScope: grandchildA, codeValue: \"rootB-code\" });\n const childB = insertElement({ parentId: rootB });\n executeTestCase(\"depth-2 grandchild scopes root - delete both roots\",\n [rootA, rootB],\n [rootA, childA, grandchildA, rootB, childB],\n []);\n\n // Delete grandchild and scoped root directly (rootA and childA survive)\n executeTestCase(\"depth-2 grandchild scopes root - delete grandchild + root directly\",\n [grandchildA, rootB],\n [grandchildA, rootB, childB],\n [rootA, childA]);\n });\n\n it(\"external element scopes a depth-2 grandchild, mixed with an unrelated deletion\", () => {\n // Unique case: grandchild has an external scope violation, but an unrelated element from\n // another tree (childB) is also requested and has no violation - it should be deleted.\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const grandchildA = insertElement({ parentId: childA });\n const rootB = insertElement();\n const childB = insertElement({ parentId: rootB });\n const external = insertElement({ codeScope: grandchildA, codeValue: \"ext-code\" });\n executeTestCase(\"external scopes depth-2 grandchild, unrelated childB deleted\",\n [grandchildA, rootA, childB],\n [childB],\n [rootA, childA, grandchildA, rootB, external],\n [rootA, grandchildA]);\n });\n\n it(\"two trees: one has external scope violation, other is deleted cleanly\", () => {\n const rootA = insertElement();\n const childA = insertElement({ parentId: rootA });\n const gcA = insertElement({ parentId: childA });\n const external = insertElement({ codeScope: childA, codeValue: \"ext-code\" });\n const rootB = insertElement();\n const childB1 = insertElement({ parentId: rootB });\n const childB2 = insertElement({ parentId: rootB });\n const gcB = insertElement({ parentId: childB1 });\n executeTestCase(\"one tree ignored, other fully deleted\",\n [rootA, rootB],\n [rootB, childB1, childB2, gcB],\n [rootA, childA, gcA, external],\n [rootA]);\n });\n });\n\n describe(\"sub-model hierarchy\", () => {\n let partitionCounter = 0;\n\n const insertSubModel = (): Id64String => {\n const name = `SubModelPartition-${++partitionCounter}`;\n return PhysicalModel.insert(txn, IModel.rootSubjectId, name);\n };\n\n const insertElementInModel = (subModelId: Id64String, opts: { parentId?: Id64String } = {}): Id64String => {\n const props: PhysicalElementProps = {\n classFullName: \"Generic:PhysicalObject\",\n model: subModelId,\n category: categoryId,\n code: Code.createEmpty(),\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\n ...(opts.parentId ? { parent: { id: opts.parentId, relClassName: \"BisCore:ElementOwnsChildElements\" } } : {}),\n };\n const id = txn.insertElement(props);\n assert.isNotEmpty(id, \"insertElementInModel must return a valid ID\");\n txn.saveChanges();\n return id;\n };\n\n /** Assert that the sub-model has been deleted. */\n const assertModelDeleted = (id: Id64String, msg: string) =>\n assert.isUndefined(iModelDb.models.tryGetModelProps(id), msg);\n\n /** Assert that the sub-model still exists. */\n const assertModelExists = (id: Id64String, msg: string) =>\n assert.isDefined(iModelDb.models.tryGetModelProps(id), msg);\n\n it(\"delete a modeled element cascades into its sub-model\", () => {\n const partitionId = insertSubModel();\n const elem1 = insertElementInModel(partitionId);\n const elem2 = insertElementInModel(partitionId);\n const unrelated = insertElement();\n\n const result = txn.deleteElements([partitionId]);\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\n assert.isEmpty(result.failedIds);\n assertDeleted(partitionId, \"partition element should be deleted\");\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\n assertDeleted(elem1, \"elem1 inside sub-model should be deleted\");\n assertDeleted(elem2, \"elem2 inside sub-model should be deleted\");\n assertExists(unrelated, \"unrelated element should be retained\");\n });\n\n /**\n * Scenario: Subject -> partition (parent-child) -> modeled-element.\n *\n * subjectA\n * └─ [P:childPartition]\n * [M:childPartition] -> elem1\n * unrelated\n */\n it(\"delete a parent whose child is a modeled element cascades into the sub-model\", () => {\n const subjectA = Subject.insert(txn, IModel.rootSubjectId, `SubjectA-${++partitionCounter}`);\n const childPartitionId = PhysicalModel.insert(txn, subjectA, `ChildPartition-${partitionCounter}`);\n const elem1 = insertElementInModel(childPartitionId);\n const unrelated = insertElement();\n\n // Deleting subjectA cascades (parent-child) to childPartitionId, which then cascades (modeled-element) into elem1.\n const result = txn.deleteElements([subjectA]);\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\n assertDeleted(subjectA, \"subject should be deleted\");\n assertDeleted(childPartitionId, \"child partition element should be deleted\");\n assertModelDeleted(childPartitionId, \"child partition sub-model should be deleted\");\n assertDeleted(elem1, \"elem1 inside child partition sub-model should be deleted\");\n assertExists(unrelated, \"unrelated element should be retained\");\n });\n\n /**\n * Scenario: sub-model elements have their own children; all should be removed transitively.\n *\n * [P:partition]\n * [M:partition] -> elem1\n * └─ childOfElem1\n * └─ grandchildOfElem1\n * elem2\n * unrelated element\n */\n it(\"delete a modeled element whose sub-model elements have children\", () => {\n const partitionId = insertSubModel();\n const elem1 = insertElementInModel(partitionId);\n const childOfElem1 = insertElementInModel(partitionId, { parentId: elem1 });\n const grandchildOfElem1 = insertElementInModel(partitionId, { parentId: childOfElem1 });\n const elem2 = insertElementInModel(partitionId);\n const unrelated = insertElement();\n\n const result = txn.deleteElements([partitionId]);\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\n assertDeleted(partitionId, \"partition should be deleted\");\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\n assertDeleted(elem1, \"elem1 should be deleted\");\n assertDeleted(childOfElem1, \"child of elem1 should be deleted\");\n assertDeleted(grandchildOfElem1, \"grandchild of elem1 should be deleted\");\n assertDeleted(elem2, \"elem2 should be deleted\");\n assertExists(unrelated, \"unrelated should be retained\");\n });\n\n /**\n * Scenario: element inside a sub-model is a code scope for an element outside the delete set. The whole partition subtree must be ignored from the delete set.\n *\n * [P:partition]\n * [M:partition] -> scopingElem <- code scope for `external`\n * otherElem\n * external (not in delete set)\n * unrelated\n */\n it(\"partition ignored when a sub-model element is a code scope for an external element\", () => {\n const partitionId = insertSubModel();\n const scopingElem = insertElementInModel(partitionId);\n const otherElem = insertElementInModel(partitionId);\n const external = insertElement({ codeScope: scopingElem, codeValue: \"ext-code\" });\n const unrelated = insertElement();\n\n // `external` is NOT in the delete set and uses scopingElem as its code scope -> the\n // entire partition subtree (including the sub-model) must be ignored from the delete set.\n const result = txn.deleteElements([partitionId, unrelated]);\n assert.equal(result.status, BulkDeleteElementsStatus.PartialSuccess);\n assertExists(partitionId, \"partition should be ignored (retained)\");\n assertModelExists(partitionId, \"sub-model should be retained\");\n assertExists(scopingElem, \"scopingElem should be retained\");\n assertExists(otherElem, \"otherElem should be retained\");\n assertExists(external, \"external should be retained\");\n assertDeleted(unrelated, \"unrelated should still be deleted\");\n });\n\n /**\n * Scenario: the sub-model element of one partition is used as a code scope for an element\n * inside a *different* partition's sub-model that is also in the delete set.\n * Both partitions and all contents should be deleted.\n *\n * [P:p1] [M:p1] -> scopingElem\n * [P:p2] [M:p2] -> dependentElem (codeScope = scopingElem)\n */\n it(\"cross-sub-model intra-set code scope dependency: both partitions deleted cleanly\", () => {\n const p1 = insertSubModel();\n const scopingElem = insertElementInModel(p1);\n const p2 = insertSubModel();\n const dependentElem = insertElementInModel(p2, {});\n // Manually assign the code scope after insertion is not possible through insertElementInModel,\n // so use a dedicated insert call.\n const dependentId = txn.insertElement({\n classFullName: \"Generic:PhysicalObject\",\n model: p2,\n category: categoryId,\n code: { spec: codeSpecId, scope: scopingElem, value: \"dep-code\" },\n placement: { origin: [0, 0, 0], angles: { yaw: 0, pitch: 0, roll: 0 } },\n } as PhysicalElementProps);\n\n const result = txn.deleteElements([p1, p2]);\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\n assertDeleted(p1, \"p1 should be deleted\");\n assertModelDeleted(p1, \"sub-model of p1 should be deleted\");\n assertDeleted(scopingElem, \"scopingElem should be deleted\");\n assertDeleted(p2, \"p2 should be deleted\");\n assertModelDeleted(p2, \"sub-model of p2 should be deleted\");\n assertDeleted(dependentElem, \"dependentElem should be deleted\");\n assertDeleted(dependentId, \"dependentId should be deleted\");\n });\n\n /**\n * Scenario: three-level Subject cascade: deleting a grandparent Subject removes a child\n * Subject, which removes a partition (parent-child), which cascades into the sub-model.\n *\n * grandparentSubject\n * └─ childSubject\n * └─ [P:grandchildPartition]\n * [M:grandchildPartition] -> innerElem1, innerElem2\n * unrelated\n */\n it(\"deep cascade: grandparent Subject -> child Subject -> partition -> sub-model elements\", () => {\n const grandparentSubjectId = Subject.insert(txn, IModel.rootSubjectId, `GrandparentSubject-${++partitionCounter}`);\n const childSubjectId = Subject.insert(txn, grandparentSubjectId, `ChildSubject-${partitionCounter}`);\n const grandchildPartitionId = PhysicalModel.insert(txn, childSubjectId, `GrandchildPartition-${partitionCounter}`);\n const innerElem1 = insertElementInModel(grandchildPartitionId);\n const innerElem2 = insertElementInModel(grandchildPartitionId);\n const unrelated = insertElement();\n\n const result = txn.deleteElements([grandparentSubjectId]);\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\n assertDeleted(grandparentSubjectId, \"grandparent subject should be deleted\");\n assertDeleted(childSubjectId, \"child subject should be deleted\");\n assertDeleted(grandchildPartitionId, \"grandchild partition should be deleted\");\n assertModelDeleted(grandchildPartitionId, \"grandchild sub-model should be deleted\");\n assertDeleted(innerElem1, \"innerElem1 should be deleted\");\n assertDeleted(innerElem2, \"innerElem2 should be deleted\");\n assertExists(unrelated, \"unrelated should be retained\");\n });\n\n /**\n * Scenario: empty sub-model: partition with no elements in its sub-model.\n *\n * [P:partition] [M:partition] (empty)\n * unrelated\n */\n it(\"delete a modeled element whose sub-model is empty\", () => {\n const partitionId = insertSubModel();\n const unrelated = insertElement();\n\n const result = txn.deleteElements([partitionId]);\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\n assertDeleted(partitionId, \"partition should be deleted\");\n assertModelDeleted(partitionId, \"empty sub-model should be deleted\");\n assertExists(unrelated, \"unrelated should be retained\");\n });\n\n /**\n * Scenario: a regular element has two children, one of which is a partition with a\n * sub-model, while the other is an ordinary element. Deleting the regular parent\n * removes both children and all sub-model contents.\n *\n * regularParent (lives in modelId)\n * ├─ ordinaryChild\n * └─ [P:partitionChild]\n * [M:partitionChild] -> subElem1, subElem2\n * unrelated\n */\n it(\"deleting a regular element with a mix of ordinary and partition children cascades correctly\", () => {\n const subjectA = Subject.insert(txn, IModel.rootSubjectId, `MixedChildSubject-${++partitionCounter}`);\n const partitionChild = PhysicalModel.insert(txn, subjectA, `MixedChildPartition-${partitionCounter}`);\n const subElem1 = insertElementInModel(partitionChild);\n const subElem2 = insertElementInModel(partitionChild);\n const unrelated = insertElement();\n\n const result = txn.deleteElements([subjectA]);\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\n assertDeleted(subjectA, \"subjectA should be deleted\");\n assertDeleted(partitionChild, \"partition child should be deleted\");\n assertModelDeleted(partitionChild, \"sub-model of partition child should be deleted\");\n assertDeleted(subElem1, \"subElem1 should be deleted\");\n assertDeleted(subElem2, \"subElem2 should be deleted\");\n assertExists(unrelated, \"unrelated should be retained\");\n });\n\n /**\n * Scenario: a regular element's grandchild is a partition. Passing the partition's\n * direct parent (not the grandparent root) for deletion cascades into the sub-model while\n * the grandparent survives.\n *\n * grandparent (lives in modelId)\n * └─ parent <- passed for deletion\n * └─ [P:partition]\n * [M:partition] -> subElem1, subElem2\n */\n it(\"deleting a mid-tree regular element whose child is a partition cascades into the sub-model; grandparent survives\", () => {\n const subjectGP = Subject.insert(txn, IModel.rootSubjectId, `MidTreeGP-${++partitionCounter}`);\n const subjectP = Subject.insert(txn, subjectGP, `MidTreeP-${partitionCounter}`);\n const partitionId = PhysicalModel.insert(txn, subjectP, `MidTreePartition-${partitionCounter}`);\n const subElem1 = insertElementInModel(partitionId);\n const subElem2 = insertElementInModel(partitionId);\n\n // Only pass subjectP - grandparent must survive, everything below subjectP must go.\n const result = txn.deleteElements([subjectP]);\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\n assertExists(subjectGP, \"grandparent should survive\");\n assertDeleted(subjectP, \"parent should be deleted\");\n assertDeleted(partitionId, \"partition should be deleted\");\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\n assertDeleted(subElem1, \"subElem1 should be deleted\");\n assertDeleted(subElem2, \"subElem2 should be deleted\");\n });\n\n it(\"deleting a partition element directly (not via its regular parent) cascades into the sub-model; parent survives\", () => {\n const subjectA = Subject.insert(txn, IModel.rootSubjectId, `DirectPartSubject-${++partitionCounter}`);\n const partitionId = PhysicalModel.insert(txn, subjectA, `DirectPartPartition-${partitionCounter}`);\n const subElem1 = insertElementInModel(partitionId);\n const subElem2 = insertElementInModel(partitionId);\n\n const result = txn.deleteElements([partitionId]);\n assert.equal(result.status, BulkDeleteElementsStatus.Success);\n assertExists(subjectA, \"subject (regular parent) should survive\");\n assertDeleted(partitionId, \"partition should be deleted\");\n assertModelDeleted(partitionId, \"sub-model should be deleted\");\n assertDeleted(subElem1, \"subElem1 should be deleted\");\n assertDeleted(subElem2, \"subElem2 should be deleted\");\n });\n });\n});"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-backend",
3
- "version": "5.9.0-dev.16",
3
+ "version": "5.9.0-dev.18",
4
4
  "description": "iTwin.js backend components",
5
5
  "main": "lib/cjs/core-backend.js",
6
6
  "module": "lib/esm/core-backend.js",
@@ -27,10 +27,10 @@
27
27
  },
28
28
  "peerDependencies": {
29
29
  "@opentelemetry/api": "^1.0.4",
30
- "@itwin/core-bentley": "5.9.0-dev.16",
31
- "@itwin/core-geometry": "5.9.0-dev.16",
32
- "@itwin/core-common": "5.9.0-dev.16",
33
- "@itwin/ecschema-metadata": "5.9.0-dev.16"
30
+ "@itwin/core-bentley": "5.9.0-dev.18",
31
+ "@itwin/core-common": "5.9.0-dev.18",
32
+ "@itwin/core-geometry": "5.9.0-dev.18",
33
+ "@itwin/ecschema-metadata": "5.9.0-dev.18"
34
34
  },
35
35
  "peerDependenciesMeta": {
36
36
  "@opentelemetry/api": {
@@ -77,17 +77,17 @@
77
77
  "marked": "^14.1.3",
78
78
  "sql-formatter": "^15.4.6",
79
79
  "webpack": "^5.97.1",
80
- "@itwin/build-tools": "5.9.0-dev.16",
81
- "@itwin/core-bentley": "5.9.0-dev.16",
82
- "@itwin/core-geometry": "5.9.0-dev.16",
83
- "@itwin/ecschema-locaters": "5.9.0-dev.16",
84
- "internal-tools": "3.0.0-dev.69",
85
- "@itwin/ecsql-common": "5.9.0-dev.16",
86
- "@itwin/core-common": "5.9.0-dev.16",
87
- "@itwin/ecschema-metadata": "5.9.0-dev.16"
80
+ "@itwin/build-tools": "5.9.0-dev.18",
81
+ "@itwin/core-geometry": "5.9.0-dev.18",
82
+ "@itwin/ecsql-common": "5.9.0-dev.18",
83
+ "@itwin/core-common": "5.9.0-dev.18",
84
+ "@itwin/ecschema-locaters": "5.9.0-dev.18",
85
+ "@itwin/core-bentley": "5.9.0-dev.18",
86
+ "@itwin/ecschema-metadata": "5.9.0-dev.18",
87
+ "internal-tools": "3.0.0-dev.69"
88
88
  },
89
89
  "dependencies": {
90
- "@bentley/imodeljs-native": "5.9.14",
90
+ "@bentley/imodeljs-native": "5.9.16",
91
91
  "@itwin/object-storage-azure": "^3.0.4",
92
92
  "@azure/storage-blob": "^12.28.0",
93
93
  "form-data": "^4.0.4",