@itwin/core-backend 5.15.1 → 5.16.0-dev.11

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.
Files changed (90) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/lib/cjs/ConcurrentQuery.d.ts +4 -0
  3. package/lib/cjs/ConcurrentQuery.d.ts.map +1 -1
  4. package/lib/cjs/ConcurrentQuery.js +28 -1
  5. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  6. package/lib/cjs/ECDb.d.ts.map +1 -1
  7. package/lib/cjs/ECDb.js +5 -10
  8. package/lib/cjs/ECDb.js.map +1 -1
  9. package/lib/cjs/ECSqlRowExecutor.d.ts +39 -55
  10. package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -1
  11. package/lib/cjs/ECSqlRowExecutor.js +118 -140
  12. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  13. package/lib/cjs/ECSqlSyncReader.d.ts +21 -8
  14. package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -1
  15. package/lib/cjs/ECSqlSyncReader.js +67 -25
  16. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  17. package/lib/cjs/IModelDb.d.ts.map +1 -1
  18. package/lib/cjs/IModelDb.js +5 -10
  19. package/lib/cjs/IModelDb.js.map +1 -1
  20. package/lib/cjs/IModelHost.d.ts +7 -0
  21. package/lib/cjs/IModelHost.d.ts.map +1 -1
  22. package/lib/cjs/IModelHost.js +1 -0
  23. package/lib/cjs/IModelHost.js.map +1 -1
  24. package/lib/cjs/TxnManager.d.ts.map +1 -1
  25. package/lib/cjs/TxnManager.js +11 -6
  26. package/lib/cjs/TxnManager.js.map +1 -1
  27. package/lib/cjs/internal/ChangesetConflictArgs.d.ts +4 -0
  28. package/lib/cjs/internal/ChangesetConflictArgs.d.ts.map +1 -1
  29. package/lib/cjs/internal/ChangesetConflictArgs.js +1 -0
  30. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  31. package/lib/cjs/internal/QueryMetadataCache.d.ts +8 -0
  32. package/lib/cjs/internal/QueryMetadataCache.d.ts.map +1 -1
  33. package/lib/cjs/internal/QueryMetadataCache.js +23 -0
  34. package/lib/cjs/internal/QueryMetadataCache.js.map +1 -1
  35. package/lib/esm/ConcurrentQuery.d.ts +4 -0
  36. package/lib/esm/ConcurrentQuery.d.ts.map +1 -1
  37. package/lib/esm/ConcurrentQuery.js +29 -2
  38. package/lib/esm/ConcurrentQuery.js.map +1 -1
  39. package/lib/esm/ECDb.d.ts.map +1 -1
  40. package/lib/esm/ECDb.js +6 -11
  41. package/lib/esm/ECDb.js.map +1 -1
  42. package/lib/esm/ECSqlRowExecutor.d.ts +39 -55
  43. package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -1
  44. package/lib/esm/ECSqlRowExecutor.js +119 -140
  45. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  46. package/lib/esm/ECSqlSyncReader.d.ts +21 -8
  47. package/lib/esm/ECSqlSyncReader.d.ts.map +1 -1
  48. package/lib/esm/ECSqlSyncReader.js +68 -26
  49. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  50. package/lib/esm/IModelDb.d.ts.map +1 -1
  51. package/lib/esm/IModelDb.js +6 -11
  52. package/lib/esm/IModelDb.js.map +1 -1
  53. package/lib/esm/IModelHost.d.ts +7 -0
  54. package/lib/esm/IModelHost.d.ts.map +1 -1
  55. package/lib/esm/IModelHost.js +1 -0
  56. package/lib/esm/IModelHost.js.map +1 -1
  57. package/lib/esm/TxnManager.d.ts.map +1 -1
  58. package/lib/esm/TxnManager.js +12 -7
  59. package/lib/esm/TxnManager.js.map +1 -1
  60. package/lib/esm/internal/ChangesetConflictArgs.d.ts +4 -0
  61. package/lib/esm/internal/ChangesetConflictArgs.d.ts.map +1 -1
  62. package/lib/esm/internal/ChangesetConflictArgs.js +1 -0
  63. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  64. package/lib/esm/internal/QueryMetadataCache.d.ts +8 -0
  65. package/lib/esm/internal/QueryMetadataCache.d.ts.map +1 -1
  66. package/lib/esm/internal/QueryMetadataCache.js +23 -0
  67. package/lib/esm/internal/QueryMetadataCache.js.map +1 -1
  68. package/lib/esm/test/IModelHost.test.js +103 -2
  69. package/lib/esm/test/IModelHost.test.js.map +1 -1
  70. package/lib/esm/test/ecdb/CTE.test.js +21 -0
  71. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  72. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +72 -0
  73. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  74. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +51 -9
  75. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  76. package/lib/esm/test/ecdb/ECSqlQuery.test.js +2 -1
  77. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  78. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +338 -84
  79. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  80. package/lib/esm/test/ecdb/QueryMetadataCache.test.js +40 -4
  81. package/lib/esm/test/ecdb/QueryMetadataCache.test.js.map +1 -1
  82. package/lib/esm/test/ecdb/QueryReaders.test.js +14 -7
  83. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  84. package/lib/esm/test/standalone/ChangeMerge.test.js +71 -1
  85. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  86. package/lib/esm/test/standalone/IModelWrite.test.js +6 -2
  87. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  88. package/lib/esm/test/standalone/MergeConflict.test.js +15 -0
  89. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  90. package/package.json +16 -16
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- import { DbConflictResolution, Guid } from "@itwin/core-bentley";
5
+ import { DbConflictResolution, DbValueType, Guid } from "@itwin/core-bentley";
6
6
  import { EditTxn } from "../../EditTxn";
7
7
  import { IModel, SubCategoryAppearance } from "@itwin/core-common";
8
8
  import * as chai from "chai";
@@ -444,5 +444,75 @@ describe("Change merge method", () => {
444
444
  b1.close();
445
445
  b2.close();
446
446
  });
447
+ it("reads column values of a rebase conflict", async () => {
448
+ const b1 = await ctx.openB1(true /* = noLock */);
449
+ const b1Txn = startTestTxn(b1);
450
+ const b2 = await ctx.openB2(true /* = noLock */);
451
+ const b2Txn = startTestTxn(b2);
452
+ const e1 = await insertPhysicalObject(b1Txn);
453
+ const props = b1.elements.getElementProps(e1);
454
+ props.userLabel = "original";
455
+ props.federationGuid = Guid.createValue();
456
+ b1Txn.updateElement(props);
457
+ b1Txn.saveChanges();
458
+ await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });
459
+ await b2.pullChanges();
460
+ props.userLabel = "changed";
461
+ b1Txn.updateElement(props);
462
+ b1Txn.saveChanges();
463
+ await b1.pushChanges({ description: `updated physical object [id=${e1}]` });
464
+ // The local delete carries the full old row, which no longer matches the updated one.
465
+ b2Txn.deleteElement(e1);
466
+ b2Txn.saveChanges();
467
+ let values;
468
+ b2.txns.rebaser.addConflictHandler({
469
+ id: "read-values", handler: (args) => {
470
+ if (args.tableName !== "bis_Element" || values !== undefined)
471
+ return undefined;
472
+ const columnNames = args.getColumnNames();
473
+ const column = (name) => columnNames.indexOf(name);
474
+ values = {
475
+ opcode: args.opcode,
476
+ columnCountMatchesNames: args.columnCount === columnNames.length,
477
+ primaryKeyColumns: args.getPrimaryKeyColumns(),
478
+ id: args.getValueId(column("Id"), "Old"),
479
+ idType: args.getValueType(column("Id"), "Old"),
480
+ idInteger: args.getValueInteger(column("Id"), "Old"),
481
+ userLabel: args.getValueText(column("UserLabel"), "Old"),
482
+ userLabelIsNull: args.isValueNull(column("UserLabel"), "Old"),
483
+ codeValue: args.getValueText(column("CodeValue"), "Old"),
484
+ codeValueIsNull: args.isValueNull(column("CodeValue"), "Old"),
485
+ lastModType: args.getValueType(column("LastMod"), "Old"),
486
+ lastModIsJulianDay: (args.getValueDouble(column("LastMod"), "Old") ?? 0) > 2400000,
487
+ federationGuidType: args.getValueType(column("FederationGuid"), "Old"),
488
+ federationGuidLength: args.getValueBinary(column("FederationGuid"), "Old")?.length,
489
+ columnOutOfRange: args.getValueText(args.columnCount, "Old"),
490
+ negativeColumn: args.isValueNull(-1, "Old"),
491
+ };
492
+ return undefined;
493
+ },
494
+ });
495
+ await b2.pullChanges();
496
+ chai.expect(values).to.deep.equal({
497
+ opcode: "Deleted",
498
+ columnCountMatchesNames: true,
499
+ primaryKeyColumns: [0],
500
+ id: e1,
501
+ idType: DbValueType.IntegerVal,
502
+ idInteger: Number.parseInt(e1, 16),
503
+ userLabel: "original",
504
+ userLabelIsNull: false,
505
+ codeValue: null,
506
+ codeValueIsNull: true,
507
+ lastModType: DbValueType.FloatVal,
508
+ lastModIsJulianDay: true,
509
+ federationGuidType: DbValueType.BlobVal,
510
+ federationGuidLength: 16,
511
+ columnOutOfRange: undefined,
512
+ negativeColumn: undefined,
513
+ });
514
+ b1.close();
515
+ b2.close();
516
+ });
447
517
  });
448
518
  //# sourceMappingURL=ChangeMerge.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeMerge.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ChangeMerge.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { DbConflictResolution, Guid } from \"@itwin/core-bentley\";\r\nimport { EditTxn } from \"../../EditTxn\";\r\nimport {\r\n IModel,\r\n PhysicalElementProps,\r\n SubCategoryAppearance,\r\n TxnProps\r\n} from \"@itwin/core-common\";\r\nimport * as chai from \"chai\";\r\nimport { assert } from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { HubWrappers, KnownTestLocations } from \"..\";\r\nimport {\r\n BriefcaseDb,\r\n ChannelControl,\r\n DictionaryModel,\r\n SpatialCategory,\r\n SqliteChangesetReader,\r\n} from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { RebaseChangesetConflictArgs } from \"../../internal/ChangesetConflictArgs\";\r\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\r\nimport { TestUtils } from \"../TestUtils\";\r\nimport { Point3d } from \"@itwin/core-geometry\";\r\n\r\nfunction startTestTxn(briefcase: BriefcaseDb): EditTxn {\r\n const txn = new EditTxn(briefcase, \"change merge\");\r\n txn.start();\r\n return txn;\r\n}\r\n\r\nchai.use(chaiAsPromised);\r\n\r\nasync function assertThrowsAsync<T>(test: () => Promise<T>, msg?: string) {\r\n try {\r\n await test();\r\n } catch (e) {\r\n if (e instanceof Error && msg) {\r\n assert.equal(e.message, msg);\r\n }\r\n return;\r\n }\r\n throw new Error(`Failed to throw error with message: \"${msg}\"`);\r\n}\r\n\r\nasync function updatePhysicalObject(txn: EditTxn, el1: string, federationGuid: string) {\r\n const briefcase = txn.iModel as BriefcaseDb;\r\n await briefcase.locks.acquireLocks({ exclusive: el1 });\r\n const props = briefcase.elements.getElement(el1);\r\n props.federationGuid = federationGuid;\r\n txn.updateElement(props.toJSON());\r\n}\r\n\r\ndescribe(\"Change merge method\", () => {\r\n const ctx = {\r\n accessTokens: {\r\n user1: \"\",\r\n user2: \"\",\r\n user3: \"\",\r\n },\r\n iModelId: \"\",\r\n iTwinId: \"\",\r\n modelId: \"\",\r\n spatialCategoryId: \"\",\r\n iModelName: \"TestIModel\",\r\n rootSubject: \"TestSubject\",\r\n openBriefcase: async (user: \"user1\" | \"user2\" | \"user3\", noLock?: true) => {\r\n const b = await HubWrappers.downloadAndOpenBriefcase({ accessToken: ctx.accessTokens[user], iTwinId: ctx.iTwinId, iModelId: ctx.iModelId, noLock });\r\n b.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n return b;\r\n },\r\n openB1: async (noLock?: true) => { return ctx.openBriefcase(\"user1\", noLock); },\r\n openB2: async (noLock?: true) => { return ctx.openBriefcase(\"user2\", noLock); },\r\n openB3: async (noLock?: true) => { return ctx.openBriefcase(\"user3\", noLock); },\r\n }\r\n\r\n async function insertPhysicalObject(txn: EditTxn) {\r\n const briefcase = txn.iModel as BriefcaseDb;\r\n await briefcase.locks.acquireLocks({ shared: ctx.modelId });\r\n return txn.insertElement(IModelTestUtils.createPhysicalObject(briefcase, ctx.modelId, ctx.spatialCategoryId).toJSON());\r\n }\r\n\r\n before(async () => {\r\n await TestUtils.startBackend();\r\n HubMock.startup(\"PullMergeMethod\", KnownTestLocations.outputDir);\r\n });\r\n\r\n after(async () => {\r\n HubMock.shutdown()\r\n });\r\n\r\n beforeEach(async () => {\r\n ctx.iTwinId = HubMock.iTwinId;\r\n ctx.accessTokens.user1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\r\n ctx.accessTokens.user2 = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n ctx.accessTokens.user3 = await HubWrappers.getAccessToken(TestUserType.Super);\r\n ctx.iModelId = await HubMock.createNewIModel({ accessToken: ctx.accessTokens.user1, iTwinId: ctx.iTwinId, iModelName: ctx.iModelName, description: ctx.rootSubject });\r\n assert.isNotEmpty(ctx.iModelId);\r\n const b1 = await ctx.openB1();\r\n const b1Txn = startTestTxn(b1);\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n [, ctx.modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\r\n b1Txn,\r\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\r\n true);\r\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\r\n ctx.spatialCategoryId = SpatialCategory.insert(\r\n b1Txn,\r\n dictionary.id,\r\n newCategoryCode.value,\r\n new SubCategoryAppearance({ color: 0xff0000 }),\r\n );\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ description: \"\" });\r\n b1.close();\r\n });\r\n\r\n it(\"rebase events (noFastForward:true)\", async () => {\r\n /**\r\n * Fastforward will not trigger rebase events as rebase was not required to merge changes.\r\n * In this test we will test rebase events when noFastForward is set to true. Which mean rebase is required to merge changes.\r\n */\r\n const events = new Map<number, { args: TxnProps, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\r\n\r\n const b1 = await ctx.openB1();\r\n const b1Txn = startTestTxn(b1);\r\n events.set(b1.briefcaseId, []);\r\n b1.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b1.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n const b2 = await ctx.openB2();\r\n const b2Txn = startTestTxn(b2);\r\n events.set(b2.briefcaseId, []);\r\n b2.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b2.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n\r\n const e1 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges(`inserted physical object [id=${e1}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n const e2 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges();\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n assert.isDefined(b1.elements.getElement(e2));\r\n\r\n const e3 = await insertPhysicalObject(b2Txn);\r\n b2Txn.saveChanges(`inserted physical object [id=${e3}]`);\r\n const e4 = await insertPhysicalObject(b2Txn);\r\n b2Txn.saveChanges(`inserted physical object [id=${e4}]`);\r\n\r\n events.set(b2.briefcaseId, []);\r\n // fast-forward has no effect its a deprecated flag\r\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]`, noFastForward: true });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\r\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.props?.description, \"inserted physical object [id=0x40000000001]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.id, \"0x100000001\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.props?.description, \"inserted physical object [id=0x40000000002]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.type, \"Data\");\r\n\r\n\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n\r\n const e5 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges(`inserted physical object [id=${e5}]`);\r\n const e6 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges(`inserted physical object [id=${e6}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\r\n assert.equal(events.get(b1.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.props?.description, \"inserted physical object [id=0x30000000003]\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b1.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.id, \"0x100000001\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.props?.description, \"inserted physical object [id=0x30000000004]\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.type, \"Data\");\r\n\r\n\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.isDefined(b1.elements.getElement(e2));\r\n assert.isDefined(b1.elements.getElement(e3)); // Not found\r\n assert.isDefined(b1.elements.getElement(e4));\r\n assert.isDefined(b1.elements.getElement(e5));\r\n assert.isDefined(b1.elements.getElement(e6));\r\n\r\n events.set(b2.briefcaseId, []);\r\n await b2.pullChanges();\r\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n assert.isDefined(b2.elements.getElement(e5));\r\n assert.isDefined(b2.elements.getElement(e6));\r\n\r\n await updatePhysicalObject(b1Txn, e3, Guid.createValue());\r\n b1Txn.saveChanges(`update physical object [id=${e3}]`);\r\n await updatePhysicalObject(b1Txn, e4, Guid.createValue());\r\n b1Txn.saveChanges(`update physical object [id=${e4}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n await updatePhysicalObject(b2Txn, e1, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e1}]`);\r\n await updatePhysicalObject(b2Txn, e2, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e2}]`);\r\n await updatePhysicalObject(b2Txn, e5, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e5}]`);\r\n await updatePhysicalObject(b2Txn, e6, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e6}]`);\r\n events.set(b2.briefcaseId, []);\r\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]`, noFastForward: true });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 8);\r\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.props?.description, \"update physical object [id=0x30000000001]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[2].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.id, \"0x100000001\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.props?.description, \"update physical object [id=0x30000000002]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[4].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.id, \"0x100000002\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.props?.description, \"update physical object [id=0x30000000003]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[6].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.id, \"0x100000003\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.props?.description, \"update physical object [id=0x30000000004]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.type, \"Data\");\r\n\r\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\r\n\r\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"rebase events (noFastForward:false/default)\", async () => {\r\n const events = new Map<number, { args: TxnProps, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\r\n\r\n const b1 = await ctx.openB1();\r\n const b1Txn = startTestTxn(b1);\r\n events.set(b1.briefcaseId, []);\r\n b1.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b1.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n const b2 = await ctx.openB2();\r\n const b2Txn = startTestTxn(b2);\r\n events.set(b2.briefcaseId, []);\r\n b2.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b2.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n\r\n const e1 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges(`inserted physical object [id=${e1}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n const e2 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges();\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n assert.isDefined(b1.elements.getElement(e2));\r\n\r\n const e3 = await insertPhysicalObject(b2Txn);\r\n b2Txn.saveChanges(`inserted physical object [id=${e3}]`);\r\n const e4 = await insertPhysicalObject(b2Txn);\r\n b2Txn.saveChanges(`inserted physical object [id=${e4}]`);\r\n\r\n events.set(b2.briefcaseId, []);\r\n // fast-forward\r\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\r\n\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n\r\n const e5 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges(`inserted physical object [id=${e5}]`);\r\n const e6 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges(`inserted physical object [id=${e6}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\r\n\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.isDefined(b1.elements.getElement(e2));\r\n assert.isDefined(b1.elements.getElement(e3)); // Not found\r\n assert.isDefined(b1.elements.getElement(e4));\r\n assert.isDefined(b1.elements.getElement(e5));\r\n assert.isDefined(b1.elements.getElement(e6));\r\n\r\n events.set(b2.briefcaseId, []);\r\n await b2.pullChanges();\r\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n assert.isDefined(b2.elements.getElement(e5));\r\n assert.isDefined(b2.elements.getElement(e6));\r\n\r\n await updatePhysicalObject(b1Txn, e3, Guid.createValue());\r\n b1Txn.saveChanges(`update physical object [id=${e3}]`);\r\n await updatePhysicalObject(b1Txn, e4, Guid.createValue());\r\n b1Txn.saveChanges(`update physical object [id=${e4}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n await updatePhysicalObject(b2Txn, e1, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e1}]`);\r\n await updatePhysicalObject(b2Txn, e2, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e2}]`);\r\n await updatePhysicalObject(b2Txn, e5, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e5}]`);\r\n await updatePhysicalObject(b2Txn, e6, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e6}]`);\r\n events.set(b2.briefcaseId, []);\r\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]` });\r\n\r\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\r\n\r\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"rebase with be_props (insert conflict)\", async () => {\r\n const b1 = await ctx.openB1();\r\n const b1Txn = startTestTxn(b1);\r\n const b2 = await ctx.openB2();\r\n const b2Txn = startTestTxn(b2);\r\n\r\n b1Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\r\n b1Txn.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n b2Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\r\n b2Txn.saveChanges(\"test2\");\r\n\r\n await assertThrowsAsync(\r\n async () => b2.pushChanges({ description: \"test2\" }),\r\n \"PRIMARY KEY insert conflict. Aborting rebase.\");\r\n\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1\");\r\n\r\n b2Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\r\n\r\n chai.expect(() => b2Txn.saveChanges(\"test1\")).throws(\"Could not save changes (test1)\");\r\n b2Txn.abandonChanges();\r\n\r\n // set handler to resolve conflict\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.cause === \"Conflict\") {\r\n if (args.tableName === \"be_Prop\") {\r\n if (args.opcode === \"Inserted\") {\r\n chai.expect(args.getColumnNames()).to.be.deep.equal([\"Namespace\", \"Name\", \"Id\", \"SubId\", \"TxnMode\", \"StrData\", \"RawSize\", \"Data\"]);\r\n chai.expect(args.txn.id).to.be.equal(\"0x100000000\");\r\n chai.expect(args.txn.descr).to.be.equal(\"test2\");\r\n chai.expect(args.txn.type).to.be.equal(\"Data\");\r\n const localChangedVal = args.getValueText(5, \"New\");\r\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\r\n b2Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\r\n return DbConflictResolution.Skip; // skip incoming value and continue\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n // resume rebase see if it resolve the conflict\r\n await b2.txns.rebaser.resume();\r\n\r\n // use changeset api to read txn directly\r\n const reader = SqliteChangesetReader.openTxn({ db: b2, txnId: \"0x100000000\" });\r\n chai.expect(reader.step()).to.be.true;\r\n chai.expect(reader.tableName).to.be.equal(\"be_Prop\");\r\n chai.expect(reader.getColumnNames(reader.tableName)[5]).to.be.equal(\"StrData\");\r\n // note the operation changed from insert to update\r\n chai.expect(reader.op).to.be.equal(\"Updated\");\r\n // note this old value is from master branch after changeset was recomputed\r\n chai.expect(reader.getChangeValueText(5, \"Old\")).to.be.equal(\"test1\");\r\n // note this new value is from local branch after merger.\r\n chai.expect(reader.getChangeValueText(5, \"New\")).to.be.equal(\"test1 + test2\");\r\n reader.close();\r\n\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n\r\n\r\n\r\n await b2.pushChanges({ description: \"test2\" });\r\n await b1.pullChanges();\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n\r\n it(\"rebase with be_props (data conflict) \", async () => {\r\n const b1 = await ctx.openB1();\r\n const b1Txn = startTestTxn(b1);\r\n const b2 = await ctx.openB2();\r\n const b2Txn = startTestTxn(b2);\r\n\r\n b1Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\r\n b1Txn.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n await b2.pullChanges();\r\n b2Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\r\n b2Txn.saveChanges(\"test2\");\r\n\r\n b1Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\r\n b1Txn.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n // set handler to resolve conflict\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.cause === \"Data\") {\r\n if (args.tableName === \"be_Prop\") {\r\n if (args.opcode === \"Updated\") {\r\n const localChangedVal = args.getValueText(5, \"New\");\r\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\r\n b2Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\r\n return DbConflictResolution.Skip; // skip incomming value and continue\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n await b2.pushChanges({ description: \"test\" });\r\n await b2.pullChanges();\r\n await b1.pullChanges();\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\r\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"should keep element deleted when local delete conflicts with remote update\", async () => {\r\n const b1 = await ctx.openB1(true /* = noLock */);\r\n const b1Txn = startTestTxn(b1);\r\n const b2 = await ctx.openB2(true /* = noLock */);\r\n const b2Txn = startTestTxn(b2);\r\n\r\n const e1 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n await b2.pullChanges();\r\n\r\n const eb1 = b1.elements.getElementProps<PhysicalElementProps>(e1);\r\n eb1.userLabel = \"test1\";\r\n eb1.placement = { origin: { x: 1, y: 1, z: 1 }, angles: { yaw: 1, pitch: 1, roll: 1 } };\r\n eb1.geom = IModelTestUtils.createBox(Point3d.create(3, 3, 3));\r\n\r\n b1Txn.updateElement(eb1);\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ description: `update physical object [id=${e1}]` });\r\n\r\n b2Txn.deleteElement(e1);\r\n b2Txn.saveChanges();\r\n await b2.pullChanges();\r\n\r\n const eb2 = b2.elements.tryGetElementProps<PhysicalElementProps>(e1);\r\n\r\n // when placement is changed the element is not deleted after pullChanges();\r\n assert.isUndefined(eb2);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"ChangeMerge.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ChangeMerge.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { DbConflictResolution, DbValueType, Guid } from \"@itwin/core-bentley\";\r\nimport { EditTxn } from \"../../EditTxn\";\r\nimport {\r\n IModel,\r\n PhysicalElementProps,\r\n SubCategoryAppearance,\r\n TxnProps\r\n} from \"@itwin/core-common\";\r\nimport * as chai from \"chai\";\r\nimport { assert } from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { HubWrappers, KnownTestLocations } from \"..\";\r\nimport {\r\n BriefcaseDb,\r\n ChannelControl,\r\n DictionaryModel,\r\n SpatialCategory,\r\n SqliteChangesetReader,\r\n} from \"../../core-backend\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { RebaseChangesetConflictArgs } from \"../../internal/ChangesetConflictArgs\";\r\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\r\nimport { TestUtils } from \"../TestUtils\";\r\nimport { Point3d } from \"@itwin/core-geometry\";\r\n\r\nfunction startTestTxn(briefcase: BriefcaseDb): EditTxn {\r\n const txn = new EditTxn(briefcase, \"change merge\");\r\n txn.start();\r\n return txn;\r\n}\r\n\r\nchai.use(chaiAsPromised);\r\n\r\nasync function assertThrowsAsync<T>(test: () => Promise<T>, msg?: string) {\r\n try {\r\n await test();\r\n } catch (e) {\r\n if (e instanceof Error && msg) {\r\n assert.equal(e.message, msg);\r\n }\r\n return;\r\n }\r\n throw new Error(`Failed to throw error with message: \"${msg}\"`);\r\n}\r\n\r\nasync function updatePhysicalObject(txn: EditTxn, el1: string, federationGuid: string) {\r\n const briefcase = txn.iModel as BriefcaseDb;\r\n await briefcase.locks.acquireLocks({ exclusive: el1 });\r\n const props = briefcase.elements.getElement(el1);\r\n props.federationGuid = federationGuid;\r\n txn.updateElement(props.toJSON());\r\n}\r\n\r\ndescribe(\"Change merge method\", () => {\r\n const ctx = {\r\n accessTokens: {\r\n user1: \"\",\r\n user2: \"\",\r\n user3: \"\",\r\n },\r\n iModelId: \"\",\r\n iTwinId: \"\",\r\n modelId: \"\",\r\n spatialCategoryId: \"\",\r\n iModelName: \"TestIModel\",\r\n rootSubject: \"TestSubject\",\r\n openBriefcase: async (user: \"user1\" | \"user2\" | \"user3\", noLock?: true) => {\r\n const b = await HubWrappers.downloadAndOpenBriefcase({ accessToken: ctx.accessTokens[user], iTwinId: ctx.iTwinId, iModelId: ctx.iModelId, noLock });\r\n b.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n return b;\r\n },\r\n openB1: async (noLock?: true) => { return ctx.openBriefcase(\"user1\", noLock); },\r\n openB2: async (noLock?: true) => { return ctx.openBriefcase(\"user2\", noLock); },\r\n openB3: async (noLock?: true) => { return ctx.openBriefcase(\"user3\", noLock); },\r\n }\r\n\r\n async function insertPhysicalObject(txn: EditTxn) {\r\n const briefcase = txn.iModel as BriefcaseDb;\r\n await briefcase.locks.acquireLocks({ shared: ctx.modelId });\r\n return txn.insertElement(IModelTestUtils.createPhysicalObject(briefcase, ctx.modelId, ctx.spatialCategoryId).toJSON());\r\n }\r\n\r\n before(async () => {\r\n await TestUtils.startBackend();\r\n HubMock.startup(\"PullMergeMethod\", KnownTestLocations.outputDir);\r\n });\r\n\r\n after(async () => {\r\n HubMock.shutdown()\r\n });\r\n\r\n beforeEach(async () => {\r\n ctx.iTwinId = HubMock.iTwinId;\r\n ctx.accessTokens.user1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\r\n ctx.accessTokens.user2 = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n ctx.accessTokens.user3 = await HubWrappers.getAccessToken(TestUserType.Super);\r\n ctx.iModelId = await HubMock.createNewIModel({ accessToken: ctx.accessTokens.user1, iTwinId: ctx.iTwinId, iModelName: ctx.iModelName, description: ctx.rootSubject });\r\n assert.isNotEmpty(ctx.iModelId);\r\n const b1 = await ctx.openB1();\r\n const b1Txn = startTestTxn(b1);\r\n await b1.locks.acquireLocks({ shared: IModel.dictionaryId });\r\n [, ctx.modelId] = IModelTestUtils.createAndInsertPhysicalPartitionAndModel(\r\n b1Txn,\r\n IModelTestUtils.getUniqueModelCode(b1, \"newPhysicalModel\"),\r\n true);\r\n const dictionary: DictionaryModel = b1.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\r\n ctx.spatialCategoryId = SpatialCategory.insert(\r\n b1Txn,\r\n dictionary.id,\r\n newCategoryCode.value,\r\n new SubCategoryAppearance({ color: 0xff0000 }),\r\n );\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ description: \"\" });\r\n b1.close();\r\n });\r\n\r\n it(\"rebase events (noFastForward:true)\", async () => {\r\n /**\r\n * Fastforward will not trigger rebase events as rebase was not required to merge changes.\r\n * In this test we will test rebase events when noFastForward is set to true. Which mean rebase is required to merge changes.\r\n */\r\n const events = new Map<number, { args: TxnProps, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\r\n\r\n const b1 = await ctx.openB1();\r\n const b1Txn = startTestTxn(b1);\r\n events.set(b1.briefcaseId, []);\r\n b1.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b1.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n const b2 = await ctx.openB2();\r\n const b2Txn = startTestTxn(b2);\r\n events.set(b2.briefcaseId, []);\r\n b2.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b2.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n\r\n const e1 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges(`inserted physical object [id=${e1}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n const e2 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges();\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n assert.isDefined(b1.elements.getElement(e2));\r\n\r\n const e3 = await insertPhysicalObject(b2Txn);\r\n b2Txn.saveChanges(`inserted physical object [id=${e3}]`);\r\n const e4 = await insertPhysicalObject(b2Txn);\r\n b2Txn.saveChanges(`inserted physical object [id=${e4}]`);\r\n\r\n events.set(b2.briefcaseId, []);\r\n // fast-forward has no effect its a deprecated flag\r\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]`, noFastForward: true });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\r\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.props?.description, \"inserted physical object [id=0x40000000001]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.id, \"0x100000001\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.props?.description, \"inserted physical object [id=0x40000000002]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[3].args.type, \"Data\");\r\n\r\n\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n\r\n const e5 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges(`inserted physical object [id=${e5}]`);\r\n const e6 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges(`inserted physical object [id=${e6}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\r\n assert.equal(events.get(b1.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.props?.description, \"inserted physical object [id=0x30000000003]\");\r\n assert.equal(events.get(b1.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b1.briefcaseId)?.[3].event, \"onRebaseTxnEnd\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.id, \"0x100000001\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.props?.description, \"inserted physical object [id=0x30000000004]\");\r\n assert.equal(events.get(b1.briefcaseId)?.[3].args.type, \"Data\");\r\n\r\n\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.isDefined(b1.elements.getElement(e2));\r\n assert.isDefined(b1.elements.getElement(e3)); // Not found\r\n assert.isDefined(b1.elements.getElement(e4));\r\n assert.isDefined(b1.elements.getElement(e5));\r\n assert.isDefined(b1.elements.getElement(e6));\r\n\r\n events.set(b2.briefcaseId, []);\r\n await b2.pullChanges();\r\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n assert.isDefined(b2.elements.getElement(e5));\r\n assert.isDefined(b2.elements.getElement(e6));\r\n\r\n await updatePhysicalObject(b1Txn, e3, Guid.createValue());\r\n b1Txn.saveChanges(`update physical object [id=${e3}]`);\r\n await updatePhysicalObject(b1Txn, e4, Guid.createValue());\r\n b1Txn.saveChanges(`update physical object [id=${e4}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n await updatePhysicalObject(b2Txn, e1, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e1}]`);\r\n await updatePhysicalObject(b2Txn, e2, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e2}]`);\r\n await updatePhysicalObject(b2Txn, e5, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e5}]`);\r\n await updatePhysicalObject(b2Txn, e6, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e6}]`);\r\n events.set(b2.briefcaseId, []);\r\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]`, noFastForward: true });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 8);\r\n assert.equal(events.get(b2.briefcaseId)?.[0].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.id, \"0x100000000\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.props?.description, \"update physical object [id=0x30000000001]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[0].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[2].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.id, \"0x100000001\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.props?.description, \"update physical object [id=0x30000000002]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[2].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[4].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.id, \"0x100000002\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.props?.description, \"update physical object [id=0x30000000003]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[4].args.type, \"Data\");\r\n\r\n assert.equal(events.get(b2.briefcaseId)?.[6].event, \"onRebaseTxnBegin\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.id, \"0x100000003\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.props?.description, \"update physical object [id=0x30000000004]\");\r\n assert.equal(events.get(b2.briefcaseId)?.[6].args.type, \"Data\");\r\n\r\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\r\n\r\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"rebase events (noFastForward:false/default)\", async () => {\r\n const events = new Map<number, { args: TxnProps, event: \"onRebaseTxnBegin\" | \"onRebaseTxnEnd\" }[]>();\r\n\r\n const b1 = await ctx.openB1();\r\n const b1Txn = startTestTxn(b1);\r\n events.set(b1.briefcaseId, []);\r\n b1.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b1.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b1.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n const b2 = await ctx.openB2();\r\n const b2Txn = startTestTxn(b2);\r\n events.set(b2.briefcaseId, []);\r\n b2.txns.rebaser.onRebaseTxnBegin.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnBegin\" });\r\n });\r\n b2.txns.rebaser.onRebaseTxnEnd.addListener((args) => {\r\n events.get(b2.briefcaseId)?.push({ args, event: \"onRebaseTxnEnd\" });\r\n });\r\n\r\n\r\n const e1 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges(`inserted physical object [id=${e1}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n const e2 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges();\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e2}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n assert.isDefined(b1.elements.getElement(e2));\r\n\r\n const e3 = await insertPhysicalObject(b2Txn);\r\n b2Txn.saveChanges(`inserted physical object [id=${e3}]`);\r\n const e4 = await insertPhysicalObject(b2Txn);\r\n b2Txn.saveChanges(`inserted physical object [id=${e4}]`);\r\n\r\n events.set(b2.briefcaseId, []);\r\n // fast-forward\r\n await b2.pushChanges({ description: `inserted physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b2.briefcaseId)?.length, 4);\r\n\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n\r\n const e5 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges(`inserted physical object [id=${e5}]`);\r\n const e6 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges(`inserted physical object [id=${e6}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `inserted physical object [id=${e5}, ${e6}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 4);\r\n\r\n assert.isDefined(b1.elements.getElement(e1));\r\n assert.isDefined(b1.elements.getElement(e2));\r\n assert.isDefined(b1.elements.getElement(e3)); // Not found\r\n assert.isDefined(b1.elements.getElement(e4));\r\n assert.isDefined(b1.elements.getElement(e5));\r\n assert.isDefined(b1.elements.getElement(e6));\r\n\r\n events.set(b2.briefcaseId, []);\r\n await b2.pullChanges();\r\n assert.equal(events.get(b2.briefcaseId)?.length, 0);\r\n assert.isDefined(b2.elements.getElement(e1));\r\n assert.isDefined(b2.elements.getElement(e2));\r\n assert.isDefined(b2.elements.getElement(e3));\r\n assert.isDefined(b2.elements.getElement(e4));\r\n assert.isDefined(b2.elements.getElement(e5));\r\n assert.isDefined(b2.elements.getElement(e6));\r\n\r\n await updatePhysicalObject(b1Txn, e3, Guid.createValue());\r\n b1Txn.saveChanges(`update physical object [id=${e3}]`);\r\n await updatePhysicalObject(b1Txn, e4, Guid.createValue());\r\n b1Txn.saveChanges(`update physical object [id=${e4}]`);\r\n events.set(b1.briefcaseId, []);\r\n await b1.pushChanges({ description: `update physical object [id=${e3},${e4}]` });\r\n assert.equal(events.get(b1.briefcaseId)?.length, 0);\r\n\r\n await updatePhysicalObject(b2Txn, e1, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e1}]`);\r\n await updatePhysicalObject(b2Txn, e2, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e2}]`);\r\n await updatePhysicalObject(b2Txn, e5, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e5}]`);\r\n await updatePhysicalObject(b2Txn, e6, Guid.createValue());\r\n b2Txn.saveChanges(`update physical object [id=${e6}]`);\r\n events.set(b2.briefcaseId, []);\r\n await b2.pushChanges({ description: `update physical object [id=${e1},${e2},${e5}]` });\r\n\r\n assert.isDefined(b1.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b1.elements.getElement(e6).federationGuid);\r\n\r\n assert.isDefined(b2.elements.getElement(e1).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e2).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e3).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e4).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e5).federationGuid);\r\n assert.isDefined(b2.elements.getElement(e6).federationGuid);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"rebase with be_props (insert conflict)\", async () => {\r\n const b1 = await ctx.openB1();\r\n const b1Txn = startTestTxn(b1);\r\n const b2 = await ctx.openB2();\r\n const b2Txn = startTestTxn(b2);\r\n\r\n b1Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\r\n b1Txn.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n b2Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\r\n b2Txn.saveChanges(\"test2\");\r\n\r\n await assertThrowsAsync(\r\n async () => b2.pushChanges({ description: \"test2\" }),\r\n \"PRIMARY KEY insert conflict. Aborting rebase.\");\r\n\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1\");\r\n\r\n b2Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\r\n\r\n chai.expect(() => b2Txn.saveChanges(\"test1\")).throws(\"Could not save changes (test1)\");\r\n b2Txn.abandonChanges();\r\n\r\n // set handler to resolve conflict\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.cause === \"Conflict\") {\r\n if (args.tableName === \"be_Prop\") {\r\n if (args.opcode === \"Inserted\") {\r\n chai.expect(args.getColumnNames()).to.be.deep.equal([\"Namespace\", \"Name\", \"Id\", \"SubId\", \"TxnMode\", \"StrData\", \"RawSize\", \"Data\"]);\r\n chai.expect(args.txn.id).to.be.equal(\"0x100000000\");\r\n chai.expect(args.txn.descr).to.be.equal(\"test2\");\r\n chai.expect(args.txn.type).to.be.equal(\"Data\");\r\n const localChangedVal = args.getValueText(5, \"New\");\r\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\r\n b2Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\r\n return DbConflictResolution.Skip; // skip incoming value and continue\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n // resume rebase see if it resolve the conflict\r\n await b2.txns.rebaser.resume();\r\n\r\n // use changeset api to read txn directly\r\n const reader = SqliteChangesetReader.openTxn({ db: b2, txnId: \"0x100000000\" });\r\n chai.expect(reader.step()).to.be.true;\r\n chai.expect(reader.tableName).to.be.equal(\"be_Prop\");\r\n chai.expect(reader.getColumnNames(reader.tableName)[5]).to.be.equal(\"StrData\");\r\n // note the operation changed from insert to update\r\n chai.expect(reader.op).to.be.equal(\"Updated\");\r\n // note this old value is from master branch after changeset was recomputed\r\n chai.expect(reader.getChangeValueText(5, \"Old\")).to.be.equal(\"test1\");\r\n // note this new value is from local branch after merger.\r\n chai.expect(reader.getChangeValueText(5, \"New\")).to.be.equal(\"test1 + test2\");\r\n reader.close();\r\n\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n\r\n\r\n\r\n await b2.pushChanges({ description: \"test2\" });\r\n await b1.pullChanges();\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test1 + test2\");\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n\r\n it(\"rebase with be_props (data conflict) \", async () => {\r\n const b1 = await ctx.openB1();\r\n const b1Txn = startTestTxn(b1);\r\n const b2 = await ctx.openB2();\r\n const b2Txn = startTestTxn(b2);\r\n\r\n b1Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test1\");\r\n b1Txn.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n await b2.pullChanges();\r\n b2Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test2\");\r\n b2Txn.saveChanges(\"test2\");\r\n\r\n b1Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"test3\");\r\n b1Txn.saveChanges(\"test\");\r\n await b1.pushChanges({ description: \"test\" });\r\n\r\n // set handler to resolve conflict\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"my\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.cause === \"Data\") {\r\n if (args.tableName === \"be_Prop\") {\r\n if (args.opcode === \"Updated\") {\r\n const localChangedVal = args.getValueText(5, \"New\");\r\n const tipValue = b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" });\r\n b2Txn.saveFileProperty({ namespace: \"test\", name: \"test\" }, `${tipValue} + ${localChangedVal}`);\r\n return DbConflictResolution.Skip; // skip incomming value and continue\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n });\r\n\r\n await b2.pushChanges({ description: \"test\" });\r\n await b2.pullChanges();\r\n await b1.pullChanges();\r\n assert.equal(b2.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\r\n assert.equal(b1.queryFilePropertyString({ namespace: \"test\", name: \"test\" }), \"test3 + test2\");\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n it(\"should keep element deleted when local delete conflicts with remote update\", async () => {\r\n const b1 = await ctx.openB1(true /* = noLock */);\r\n const b1Txn = startTestTxn(b1);\r\n const b2 = await ctx.openB2(true /* = noLock */);\r\n const b2Txn = startTestTxn(b2);\r\n\r\n const e1 = await insertPhysicalObject(b1Txn);\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n await b2.pullChanges();\r\n\r\n const eb1 = b1.elements.getElementProps<PhysicalElementProps>(e1);\r\n eb1.userLabel = \"test1\";\r\n eb1.placement = { origin: { x: 1, y: 1, z: 1 }, angles: { yaw: 1, pitch: 1, roll: 1 } };\r\n eb1.geom = IModelTestUtils.createBox(Point3d.create(3, 3, 3));\r\n\r\n b1Txn.updateElement(eb1);\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ description: `update physical object [id=${e1}]` });\r\n\r\n b2Txn.deleteElement(e1);\r\n b2Txn.saveChanges();\r\n await b2.pullChanges();\r\n\r\n const eb2 = b2.elements.tryGetElementProps<PhysicalElementProps>(e1);\r\n\r\n // when placement is changed the element is not deleted after pullChanges();\r\n assert.isUndefined(eb2);\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n\r\n it(\"reads column values of a rebase conflict\", async () => {\r\n const b1 = await ctx.openB1(true /* = noLock */);\r\n const b1Txn = startTestTxn(b1);\r\n const b2 = await ctx.openB2(true /* = noLock */);\r\n const b2Txn = startTestTxn(b2);\r\n\r\n const e1 = await insertPhysicalObject(b1Txn);\r\n const props = b1.elements.getElementProps<PhysicalElementProps>(e1);\r\n props.userLabel = \"original\";\r\n props.federationGuid = Guid.createValue();\r\n b1Txn.updateElement(props);\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ description: `inserted physical object [id=${e1}]` });\r\n await b2.pullChanges();\r\n\r\n props.userLabel = \"changed\";\r\n b1Txn.updateElement(props);\r\n b1Txn.saveChanges();\r\n await b1.pushChanges({ description: `updated physical object [id=${e1}]` });\r\n\r\n // The local delete carries the full old row, which no longer matches the updated one.\r\n b2Txn.deleteElement(e1);\r\n b2Txn.saveChanges();\r\n\r\n let values: object | undefined;\r\n b2.txns.rebaser.addConflictHandler({\r\n id: \"read-values\", handler: (args: RebaseChangesetConflictArgs) => {\r\n if (args.tableName !== \"bis_Element\" || values !== undefined)\r\n return undefined;\r\n\r\n const columnNames = args.getColumnNames();\r\n const column = (name: string) => columnNames.indexOf(name);\r\n values = {\r\n opcode: args.opcode,\r\n columnCountMatchesNames: args.columnCount === columnNames.length,\r\n primaryKeyColumns: args.getPrimaryKeyColumns(),\r\n id: args.getValueId(column(\"Id\"), \"Old\"),\r\n idType: args.getValueType(column(\"Id\"), \"Old\"),\r\n idInteger: args.getValueInteger(column(\"Id\"), \"Old\"),\r\n userLabel: args.getValueText(column(\"UserLabel\"), \"Old\"),\r\n userLabelIsNull: args.isValueNull(column(\"UserLabel\"), \"Old\"),\r\n codeValue: args.getValueText(column(\"CodeValue\"), \"Old\"),\r\n codeValueIsNull: args.isValueNull(column(\"CodeValue\"), \"Old\"),\r\n lastModType: args.getValueType(column(\"LastMod\"), \"Old\"),\r\n lastModIsJulianDay: (args.getValueDouble(column(\"LastMod\"), \"Old\") ?? 0) > 2400000,\r\n federationGuidType: args.getValueType(column(\"FederationGuid\"), \"Old\"),\r\n federationGuidLength: args.getValueBinary(column(\"FederationGuid\"), \"Old\")?.length,\r\n columnOutOfRange: args.getValueText(args.columnCount, \"Old\"),\r\n negativeColumn: args.isValueNull(-1, \"Old\"),\r\n };\r\n return undefined;\r\n },\r\n });\r\n await b2.pullChanges();\r\n\r\n chai.expect(values).to.deep.equal({\r\n opcode: \"Deleted\",\r\n columnCountMatchesNames: true,\r\n primaryKeyColumns: [0],\r\n id: e1,\r\n idType: DbValueType.IntegerVal,\r\n idInteger: Number.parseInt(e1, 16),\r\n userLabel: \"original\",\r\n userLabelIsNull: false,\r\n codeValue: null,\r\n codeValueIsNull: true,\r\n lastModType: DbValueType.FloatVal,\r\n lastModIsJulianDay: true,\r\n federationGuidType: DbValueType.BlobVal,\r\n federationGuidLength: 16,\r\n columnOutOfRange: undefined,\r\n negativeColumn: undefined,\r\n });\r\n\r\n b1.close();\r\n b2.close();\r\n });\r\n});\r\n"]}
@@ -413,10 +413,12 @@ describe("IModelWriteTest", () => {
413
413
  }
414
414
  };
415
415
  const str = new Array(1024).join("x");
416
+ // Measure only the size contributed by the element inserts so the test doesn't depend on BisCore table layouts.
417
+ const baselineSize = rwIModel[_nativeDb].getChangesetSize();
416
418
  insertElements(rwTxn, "Test2dElement", 1024, () => {
417
419
  return { s: str };
418
420
  });
419
- assert.equal(1357648, rwIModel[_nativeDb].getChangesetSize());
421
+ assert.equal(1356840, rwIModel[_nativeDb].getChangesetSize() - baselineSize);
420
422
  rwTxn.saveChanges("user 1: data");
421
423
  assert.equal(0, rwIModel[_nativeDb].getChangesetSize());
422
424
  await rwIModel.pushChanges({ description: "schema changeset", accessToken: adminToken });
@@ -549,10 +551,12 @@ describe("IModelWriteTest", () => {
549
551
  assert.isTrue(Id64.isValidId64(id), "insert worked");
550
552
  }
551
553
  };
554
+ // Measure only the size contributed by the element inserts so the test doesn't depend on BisCore table layouts.
555
+ const baselineSize = rwIModel[_nativeDb].getChangesetSize();
552
556
  insertElements(rwTxn, "Test2dElement", 10, (n) => {
553
557
  return { s: `s-${n}` };
554
558
  });
555
- assert.equal(3889, rwIModel[_nativeDb].getChangesetSize());
559
+ assert.equal(3081, rwIModel[_nativeDb].getChangesetSize() - baselineSize);
556
560
  rwTxn.saveChanges("user 1: data changeset");
557
561
  if (true || "push changes") {
558
562
  // Push the changes to the hub