@itwin/core-backend 4.4.0-dev.8 → 4.5.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts +8 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +77 -19
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/Material.d.ts +4 -1
- package/lib/cjs/Material.d.ts.map +1 -1
- package/lib/cjs/Material.js +13 -0
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts +13 -5
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +10 -5
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/package.json +14 -14
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
# Change Log - @itwin/core-backend
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Wed, 03 Jan 2024 19:29:41 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 4.3.3
|
|
6
|
+
Wed, 03 Jan 2024 19:28:38 GMT
|
|
7
|
+
|
|
8
|
+
### Updates
|
|
9
|
+
|
|
10
|
+
- Update ChangesetReader API and fix bug.
|
|
4
11
|
|
|
5
12
|
## 4.3.2
|
|
6
13
|
Thu, 14 Dec 2023 20:23:02 GMT
|
|
@@ -11,7 +11,7 @@ export interface ChangeMetaData {
|
|
|
11
11
|
/** list of tables making up this EC change */
|
|
12
12
|
tables: string[];
|
|
13
13
|
/** full name of the class of this EC change */
|
|
14
|
-
|
|
14
|
+
classFullName?: string;
|
|
15
15
|
/** sqlite operation that caused the change */
|
|
16
16
|
op: SqliteChangeOp;
|
|
17
17
|
/** version of the value read from sqlite change */
|
|
@@ -40,6 +40,13 @@ export interface ChangedECInstance {
|
|
|
40
40
|
export declare class PartialECChangeUnifier {
|
|
41
41
|
private _cache;
|
|
42
42
|
private _readonly;
|
|
43
|
+
/**
|
|
44
|
+
* Get root class id for a given class
|
|
45
|
+
* @param classId given class id
|
|
46
|
+
* @param db use to find root class
|
|
47
|
+
* @returns return root class id
|
|
48
|
+
*/
|
|
49
|
+
private static getRootClassId;
|
|
43
50
|
/**
|
|
44
51
|
* Combine partial instance with instance with same key if already exists.
|
|
45
52
|
* @param rhs partial instance
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangesetECAdaptor.d.ts","sourceRoot":"","sources":["../../src/ChangesetECAdaptor.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,OAAO,EAAwB,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAuB,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AA+UvH;;;KAGK;AACL,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+CAA+C;IAC/C,
|
|
1
|
+
{"version":3,"file":"ChangesetECAdaptor.d.ts","sourceRoot":"","sources":["../../src/ChangesetECAdaptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -90,7 +90,7 @@ class ECDbMap {
|
|
|
90
90
|
SELECT
|
|
91
91
|
JSON_OBJECT(
|
|
92
92
|
'id', format('0x%x', cs.id),
|
|
93
|
-
'name', format('%s
|
|
93
|
+
'name', format('%s:%s', ss.Name, cs.Name),
|
|
94
94
|
'mapStrategy',
|
|
95
95
|
(
|
|
96
96
|
CASE cm.MapStrategy
|
|
@@ -160,7 +160,7 @@ class ECDbMap {
|
|
|
160
160
|
SELECT
|
|
161
161
|
JSON_OBJECT(
|
|
162
162
|
'classId', format('0x%x', nc.Id),
|
|
163
|
-
'
|
|
163
|
+
'classFullName', format('%s:%s', ns.Name, nc.Name)
|
|
164
164
|
)
|
|
165
165
|
FROM ec_Class nc
|
|
166
166
|
JOIN ec_Schema ns ON ns.Id = nc.SchemaId
|
|
@@ -172,7 +172,7 @@ class ECDbMap {
|
|
|
172
172
|
SELECT
|
|
173
173
|
JSON_OBJECT(
|
|
174
174
|
'classId', format('0x%x', nc.Id),
|
|
175
|
-
'
|
|
175
|
+
'classFullName', format('%s:%s', ns.Name, nc.Name)
|
|
176
176
|
)
|
|
177
177
|
FROM ec_Class nc
|
|
178
178
|
JOIN ec_Schema ns ON ns.Id = nc.SchemaId
|
|
@@ -326,15 +326,52 @@ class PartialECChangeUnifier {
|
|
|
326
326
|
this._cache = new Map();
|
|
327
327
|
this._readonly = false;
|
|
328
328
|
}
|
|
329
|
+
/**
|
|
330
|
+
* Get root class id for a given class
|
|
331
|
+
* @param classId given class id
|
|
332
|
+
* @param db use to find root class
|
|
333
|
+
* @returns return root class id
|
|
334
|
+
*/
|
|
335
|
+
static getRootClassId(classId, db) {
|
|
336
|
+
const sql = `
|
|
337
|
+
WITH
|
|
338
|
+
[base_class]([classId], [baseClassId], [Level]) AS(
|
|
339
|
+
SELECT [ch].[ClassId], [ch].[BaseClassId], 0
|
|
340
|
+
FROM [ec_ClassHasBaseClasses] [ch] WHERE [ch].[ClassId] = ?
|
|
341
|
+
UNION ALL
|
|
342
|
+
SELECT [ch].[ClassId], [ch].[BaseClassId], [Level] + 1
|
|
343
|
+
FROM [ec_ClassHasBaseClasses] [ch], [base_class] [bc] WHERE [bc].[BaseClassId] = [ch].[ClassId]
|
|
344
|
+
|
|
345
|
+
)
|
|
346
|
+
SELECT FORMAT('0x%x', [bc].[BaseClassId]) rootClass
|
|
347
|
+
FROM [base_class] [bc]
|
|
348
|
+
WHERE [bc].[ClassId] <> [bc].[BaseClassId]
|
|
349
|
+
AND [bc].[BaseClassId] NOT IN (SELECT [ca].[ContainerId]
|
|
350
|
+
FROM [ec_CustomAttribute] [ca]
|
|
351
|
+
WHERE [ca].[ContainerType] = 30
|
|
352
|
+
AND [ca].[ClassId] IN (SELECT [cc].[Id]
|
|
353
|
+
FROM [ec_Class] [cc]
|
|
354
|
+
JOIN [ec_Schema] [ss] ON [ss].[Id] = [cc].[SchemaId]
|
|
355
|
+
WHERE [cc].[Name] = 'IsMixIn'
|
|
356
|
+
AND [ss].[Name] = 'CoreCustomAttributes'))
|
|
357
|
+
ORDER BY [Level] DESC`;
|
|
358
|
+
return db.withSqliteStatement(sql, (stmt) => {
|
|
359
|
+
stmt.bindId(1, classId);
|
|
360
|
+
if (stmt.step() === core_bentley_1.DbResult.BE_SQLITE_ROW && !stmt.isValueNull(0)) {
|
|
361
|
+
return stmt.getValueString(0);
|
|
362
|
+
}
|
|
363
|
+
return classId;
|
|
364
|
+
});
|
|
365
|
+
}
|
|
329
366
|
/**
|
|
330
367
|
* Combine partial instance with instance with same key if already exists.
|
|
331
368
|
* @param rhs partial instance
|
|
332
369
|
*/
|
|
333
|
-
combine(rhs) {
|
|
370
|
+
combine(rhs, db) {
|
|
334
371
|
if (!rhs.$meta) {
|
|
335
372
|
throw new Error("PartialECChange being combine must have '$meta' property");
|
|
336
373
|
}
|
|
337
|
-
const key = PartialECChangeUnifier.buildKey(rhs);
|
|
374
|
+
const key = PartialECChangeUnifier.buildKey(rhs, db);
|
|
338
375
|
const lhs = this._cache.get(key);
|
|
339
376
|
if (lhs) {
|
|
340
377
|
const { $meta: _, ...restOfRhs } = rhs;
|
|
@@ -342,6 +379,21 @@ class PartialECChangeUnifier {
|
|
|
342
379
|
if (lhs.$meta && rhs.$meta) {
|
|
343
380
|
lhs.$meta.tables = [...rhs.$meta?.tables, ...lhs.$meta?.tables];
|
|
344
381
|
lhs.$meta.changeIndexes = [...rhs.$meta?.changeIndexes, ...lhs.$meta?.changeIndexes];
|
|
382
|
+
// we preserve child class name & id when merging instance.
|
|
383
|
+
if (rhs.$meta.fallbackClassId && lhs.$meta.fallbackClassId && db && rhs.$meta.fallbackClassId !== lhs.$meta.fallbackClassId) {
|
|
384
|
+
const lhsClassId = lhs.$meta.fallbackClassId;
|
|
385
|
+
const rhsClassId = rhs.$meta.fallbackClassId;
|
|
386
|
+
const isRhsIsSubClassOfLhs = db.withPreparedStatement("SELECT ec_instanceof(?,?)", (stmt) => {
|
|
387
|
+
stmt.bindId(1, rhsClassId);
|
|
388
|
+
stmt.bindId(2, lhsClassId);
|
|
389
|
+
stmt.step();
|
|
390
|
+
return stmt.getValue(0).getInteger() === 1;
|
|
391
|
+
});
|
|
392
|
+
if (isRhsIsSubClassOfLhs) {
|
|
393
|
+
lhs.$meta.fallbackClassId = rhs.$meta.fallbackClassId;
|
|
394
|
+
lhs.$meta.classFullName = rhs.$meta.classFullName;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
345
397
|
}
|
|
346
398
|
}
|
|
347
399
|
else {
|
|
@@ -353,8 +405,17 @@ class PartialECChangeUnifier {
|
|
|
353
405
|
* @param change EC change
|
|
354
406
|
* @returns key created from EC change.
|
|
355
407
|
*/
|
|
356
|
-
static buildKey(change) {
|
|
357
|
-
|
|
408
|
+
static buildKey(change, db) {
|
|
409
|
+
let classId = change.ECClassId;
|
|
410
|
+
if (typeof classId === "undefined") {
|
|
411
|
+
if (db && change.$meta?.fallbackClassId) {
|
|
412
|
+
classId = this.getRootClassId(change.$meta.fallbackClassId, db);
|
|
413
|
+
}
|
|
414
|
+
if (typeof classId === "undefined") {
|
|
415
|
+
throw new Error(`unable to resolve ECClassId to root class id.`);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return `${change.ECInstanceId}-${classId}-${change.$meta?.stage}`.toLowerCase();
|
|
358
419
|
}
|
|
359
420
|
/**
|
|
360
421
|
* Append partial changes which will be combine using there instance key.
|
|
@@ -371,14 +432,14 @@ class PartialECChangeUnifier {
|
|
|
371
432
|
throw new Error("this instance is marked as readonly.");
|
|
372
433
|
}
|
|
373
434
|
if (adaptor.op === "Updated" && adaptor.inserted && adaptor.deleted) {
|
|
374
|
-
this.combine(adaptor.inserted);
|
|
375
|
-
this.combine(adaptor.deleted);
|
|
435
|
+
this.combine(adaptor.inserted, adaptor.reader.db);
|
|
436
|
+
this.combine(adaptor.deleted, adaptor.reader.db);
|
|
376
437
|
}
|
|
377
438
|
else if (adaptor.op === "Inserted" && adaptor.inserted) {
|
|
378
|
-
this.combine(adaptor.inserted);
|
|
439
|
+
this.combine(adaptor.inserted, adaptor.reader.db);
|
|
379
440
|
}
|
|
380
441
|
else if (adaptor.op === "Deleted" && adaptor.deleted) {
|
|
381
|
-
this.combine(adaptor.deleted);
|
|
442
|
+
this.combine(adaptor.deleted, adaptor.reader.db);
|
|
382
443
|
}
|
|
383
444
|
}
|
|
384
445
|
/**
|
|
@@ -591,7 +652,7 @@ class ChangesetECAdaptor {
|
|
|
591
652
|
throw new Error(`unable to get change from changeset reader`);
|
|
592
653
|
}
|
|
593
654
|
let ecClassId = this.reader.op === "Inserted" ? change.inserted?.ECClassId : change.deleted?.ECClassId;
|
|
594
|
-
const
|
|
655
|
+
const classIdPresentInChange = typeof ecClassId !== "undefined";
|
|
595
656
|
let classMap;
|
|
596
657
|
let fallbackClassId;
|
|
597
658
|
if (table.isClassIdVirtual) {
|
|
@@ -604,12 +665,9 @@ class ChangesetECAdaptor {
|
|
|
604
665
|
if (primaryKeys.length === 1) {
|
|
605
666
|
ecClassId = this.getClassIdFromDb(this.reader.tableName, this.reader.primaryKeyValues[0]);
|
|
606
667
|
}
|
|
607
|
-
// this is update and does not include ECClassId and it was also not found from db
|
|
608
|
-
// so its unrecoverable error. Call can skip updates to ignore this error.
|
|
609
|
-
if (!ecClassId)
|
|
610
|
-
throw new Error(`change arg must contain 'ECClassId' property.`);
|
|
611
668
|
}
|
|
612
|
-
|
|
669
|
+
if (ecClassId)
|
|
670
|
+
classMap = this._mapCache.getClassMap(ecClassId);
|
|
613
671
|
if (!classMap) {
|
|
614
672
|
// fallback to root map for table.
|
|
615
673
|
classMap = this._mapCache.getClassMap(table.exclusiveRootClassId);
|
|
@@ -619,7 +677,7 @@ class ChangesetECAdaptor {
|
|
|
619
677
|
}
|
|
620
678
|
if (!classMap)
|
|
621
679
|
throw new Error(`unable to load class map`);
|
|
622
|
-
if (!
|
|
680
|
+
if (!classIdPresentInChange && !ecClassId && !fallbackClassId)
|
|
623
681
|
ecClassId = classMap.id;
|
|
624
682
|
if (this._allowedClasses.size !== 0) {
|
|
625
683
|
if (!this._allowedClasses.has(classMap.id))
|
|
@@ -628,7 +686,7 @@ class ChangesetECAdaptor {
|
|
|
628
686
|
const $meta = {
|
|
629
687
|
tables: [this.reader.tableName],
|
|
630
688
|
op: this.reader.op,
|
|
631
|
-
|
|
689
|
+
classFullName: classMap.name,
|
|
632
690
|
fallbackClassId,
|
|
633
691
|
changeIndexes: [this.reader.changeIndex],
|
|
634
692
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangesetECAdaptor.js","sourceRoot":"","sources":["../../src/ChangesetECAdaptor.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ECDb\n */\nimport { DbResult, GuidString, Id64String, IDisposable } from \"@itwin/core-bentley\";\nimport { AnyDb, SqliteChange, SqliteChangeOp, SqliteChangesetReader, SqliteValueStage } from \"./SqliteChangesetReader\";\n\ninterface IClassRef {\n classId: Id64String;\n className: string;\n}\n\ninterface IClassMap {\n readonly id: Id64String;\n readonly name: string;\n readonly mapStrategy: \"NotMapped\" | \"OwnTable\" | \"TablePerHierarchy\" | \"ExistingTable\" | \"ForeignKeyInTargetTable\" | \"ForeignKeyInSourceTable\";\n readonly type: \"Entity\" | \"Relationship\" | \"Struct\" | \"CustomAttribute\";\n readonly modifier: \"None\" | \"Abstract\" | \"Sealed\";\n readonly properties: IProperty[];\n}\n\ninterface IDateTimeInfo {\n readonly dateTimeKind?: \"Utc\" | \"Local\" | \"Unspecified\";\n readonly dateTimeComponent?: \"DateTime\" | \"Date\" | \"TimeOfDay\";\n}\n\ninterface IProperty {\n readonly id: Id64String;\n readonly name: string;\n readonly kind: \"Primitive\" | \"Struct\" | \"PrimitiveArray\" | \"StructArray\" | \"Navigation\";\n readonly primitiveType?: \"Binary\" | \"Boolean\" | \"DateTime\" | \"Double\" | \"Integer\" | \"Long\" | \"Point2d\" | \"Point3d\" | \"String\" | \"IGeometry\";\n readonly extendedTypeName?: string;\n readonly navigationRelationship?: IClassRef;\n readonly structClass?: IClassRef;\n readonly dateTimeInfo?: IDateTimeInfo;\n readonly columns: IColumn[];\n\n}\n\ninterface IColumn {\n readonly table: string;\n readonly column: string;\n readonly type: \"Any\" | \"Boolean\" | \"Blob\" | \"Timestamp\" | \"Real\" | \"Integer\" | \"Text\";\n readonly columnKind: \"Default\" | \"Id\" | \"ClassId\" | \"Shared\";\n readonly accessString: string;\n readonly isVirtual: boolean;\n}\n\ninterface ITable {\n readonly id: Id64String;\n readonly name: string;\n readonly type: \"Primary\" | \"Joined\" | \"Existing\" | \"Overflow\" | \"Virtual\";\n readonly exclusiveRootClassId: Id64String;\n readonly isClassIdVirtual: boolean;\n}\n\nclass ECDbMap {\n private _cachedClassMaps = new Map<Id64String, IClassMap>();\n private _cacheTables = new Map<string, ITable>();\n public constructor(public readonly db: AnyDb) { }\n public getAllDerivedClasses(classFullName: string) {\n const sql = `\n SELECT format('0x%x', ch.ClassId)\n FROM [ec_cache_ClassHierarchy] [ch]\n JOIN [ec_Class] [cs] ON [cs].[Id] = [ch].[BaseClassId]\n JOIN [ec_Schema] [sc] ON [sc].[Id] = [cs].[SchemaId]\n WHERE (([sc].[Alias] = :schemaNameOrAlias\n OR [sc].[Name] = :schemaNameOrAlias)\n AND ([cs].[Name] = :className))\n `;\n return this.db.withPreparedSqliteStatement(sql, (stmt) => {\n const parts = classFullName.indexOf(\".\") !== -1 ? classFullName.split(\".\") : classFullName.split(\":\");\n stmt.bindString(\":schemaNameOrAlias\", parts[0]);\n stmt.bindString(\":className\", parts[1]);\n const classIds = [];\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\n classIds.push(stmt.getValueString(0));\n return classIds;\n });\n }\n public getTable(tableName: string): ITable | undefined {\n if (this._cacheTables.has(tableName))\n return this._cacheTables.get(tableName);\n\n const sql = `\n SELECT\n JSON_OBJECT (\n 'id', FORMAT ('0x%x', [t].[id]),\n 'name', [t].[Name],\n 'type', (\n CASE\n [t].[type]\n WHEN 0 THEN 'Primary'\n WHEN 1 THEN 'Joined'\n WHEN 2 THEN 'Existing'\n WHEN 3 THEN 'Overflow'\n WHEN 4 THEN 'Virtual'\n END\n ),\n 'exclusiveRootClassId', FORMAT ('0x%x', [t].[ExclusiveRootClassId]),\n 'isClassIdVirtual', (\n SELECT\n [c].[IsVirtual]\n FROM\n [ec_Column] [c]\n WHERE\n [c].[Name] = 'ECClassId' AND [c].[TableId] = [t].[Id]\n )\n )\n FROM [ec_Table] [t]\n WHERE\n [t].[Name] = ?;\n `;\n\n return this.db.withPreparedSqliteStatement(sql, (stmt) => {\n stmt.bindString(1, tableName);\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\n const table = JSON.parse(stmt.getValueString(0), (key, value) => {\n if (value === null)\n return undefined;\n\n if (key === \"isClassIdVirtual\")\n return value === 0 ? false : true;\n\n return value;\n }) as ITable;\n\n this._cacheTables.set(tableName, table);\n return table;\n }\n return undefined;\n });\n }\n public getClassMap(classId: Id64String): IClassMap | undefined {\n if (this._cachedClassMaps.has(classId))\n return this._cachedClassMaps.get(classId);\n\n const sql = `\n SELECT\n JSON_OBJECT(\n 'id', format('0x%x', cs.id),\n 'name', format('%s.%s', ss.Name, cs.Name),\n 'mapStrategy',\n (\n CASE cm.MapStrategy\n WHEN 0 THEN 'NotMapped'\n WHEN 1 THEN 'OwnTable'\n WHEN 2 THEN 'TablePerHierarchy'\n WHEN 3 THEN 'ExistingTable'\n WHEN 10 THEN 'ForeignKeyInTargetTable'\n WHEN 11 THEN 'ForeignKeyInSourceTable'\n END\n ),\n 'type',\n (\n CASE cs.Type\n WHEN 0 THEN 'Entity'\n WHEN 1 THEN 'Relationship'\n WHEN 2 THEN 'Struct'\n WHEN 3 THEN 'CustomAttribute'\n END\n ),\n 'modifier',\n (\n CASE cs.Modifier\n WHEN 0 THEN 'None'\n WHEN 1 THEN 'Abstract'\n WHEN 2 THEN 'Sealed'\n END\n ),\n 'properties',\n (\n SELECT\n JSON_GROUP_ARRAY(JSON(propJson))\n FROM\n (\n SELECT\n JSON_OBJECT(\n 'id', format('0x%x', pt.id),\n 'name', pt.Name,\n 'kind',\n (\n CASE pt.Kind\n WHEN 0 THEN 'Primitive'\n WHEN 1 THEN 'Struct'\n WHEN 2 THEN 'PrimitiveArray'\n WHEN 3 THEN 'StructArray'\n WHEN 4 THEN 'Navigation'\n END\n ),\n 'primitiveType',\n (\n CASE pt.PrimitiveType\n WHEN 0x101 THEN 'Binary'\n WHEN 0x201 THEN 'Boolean'\n WHEN 0x301 THEN 'DateTime'\n WHEN 0x401 THEN 'Double'\n WHEN 0x501 THEN 'Integer'\n WHEN 0x601 THEN 'Long'\n WHEN 0x701 THEN 'Point2d'\n WHEN 0x801 THEN 'Point3d'\n WHEN 0x901 THEN 'String'\n WHEN 0xa01 THEN 'IGeometry'\n END\n ),\n 'extendedTypeName', ExtendedTypeName,\n 'navigationRelationship',\n (\n SELECT\n JSON_OBJECT(\n 'classId', format('0x%x', nc.Id),\n 'className', format('%s.%s', ns.Name, nc.Name)\n )\n FROM ec_Class nc\n JOIN ec_Schema ns ON ns.Id = nc.SchemaId\n WHERE\n nc.Id = pt.NavigationRelationshipClassId\n ),\n 'structClass',\n (\n SELECT\n JSON_OBJECT(\n 'classId', format('0x%x', nc.Id),\n 'className', format('%s.%s', ns.Name, nc.Name)\n )\n FROM ec_Class nc\n JOIN ec_Schema ns ON ns.Id = nc.SchemaId\n WHERE\n nc.Id = pt.StructClassId\n ),\n 'dateTimeInfo', (\n SELECT\n JSON_OBJECT (\n 'dateTimeKind', (\n CASE\n WHEN [ca].[Instance] LIKE '%<DateTimeKind>Utc</DateTimeKind>%' COLLATE [NoCase] THEN 'Utc'\n WHEN [ca].[Instance] LIKE '%<DateTimeKind>Local</DateTimeKind>%' COLLATE [NoCase] THEN 'Local'\n ELSE 'Unspecified'\n END\n ),\n 'dateTimeComponent', (\n CASE\n WHEN [ca].[Instance] LIKE '%<DateTimeComponent>DateTime</DateTimeComponent>%' COLLATE [NoCase] THEN 'DateTime'\n WHEN [ca].[Instance] LIKE '%<DateTimeComponent>Date</DateTimeComponent>%' COLLATE [NoCase] THEN 'Date'\n WHEN [ca].[Instance] LIKE '%<DateTimeComponent>TimeOfDay</DateTimeComponent>%' COLLATE [NoCase] THEN 'TimeOfDay'\n ELSE 'DateTime'\n END\n )\n )\n FROM\n [ec_CustomAttribute] [ca]\n JOIN [ec_Class] [cl] ON [cl].[Id] = [ca].[ClassId]\n JOIN [ec_Schema] [sc] ON [sc].[Id] = [cl].[SchemaId]\n WHERE\n [ca].[ContainerType] = 992\n AND [cl].[Name] = 'DateTimeInfo'\n AND [sc].[Name] = 'CoreCustomAttributes'\n AND [ca].[ContainerId] = [pt].[Id]\n ),\n 'columns',\n (\n SELECT\n JSON_GROUP_ARRAY(JSON(columnJson))\n FROM\n (\n SELECT\n JSON_OBJECT(\n 'table', tb.Name,\n 'column', cc.Name,\n 'type',\n (\n CASE cc.Type\n WHEN 0 THEN 'Any'\n WHEN 1 THEN 'Boolean'\n WHEN 2 THEN 'Blob'\n WHEN 3 THEN 'Timestamp'\n WHEN 4 THEN 'Real'\n WHEN 5 THEN 'Integer'\n WHEN 6 THEN 'Text'\n END\n ),\n 'columnKind',\n (\n CASE cc.ColumnKind\n WHEN 0 THEN 'Default'\n WHEN 1 THEN 'Id'\n WHEN 2 THEN 'ClassId'\n WHEN 4 THEN 'SharedData'\n END\n ),\n 'accessString', pp0.AccessString,\n 'isVirtual', cc.IsVirtual OR tb.Type = 4\n ) columnJson\n FROM [ec_PropertyMap] [pm0]\n JOIN [ec_Column] [cc] ON [cc].[Id] = [pm0].[ColumnId]\n JOIN [ec_Table] [tb] ON [tb].[Id] = [cc].[TableId]\n JOIN [ec_PropertyPath] [pp0] ON [pp0].[Id] = [pm0].[PropertyPathId]\n WHERE\n [pp0].[RootPropertyId] = pt.Id AND pm0.ClassId = cs.Id\n )\n )\n ) propJson\n FROM [ec_PropertyMap] [pm]\n JOIN [ec_PropertyPath] [pp] ON [pp].[Id] = [pm].[PropertyPathId]\n JOIN [ec_Property] [pt] ON [pt].[Id] = [pp].[RootPropertyId]\n WHERE\n pm.ClassId = cs.Id\n GROUP BY\n pt.Id\n )\n )\n ) classDef\n FROM [ec_Class] [cs]\n JOIN [ec_ClassMap] [cm] ON [cm].[ClassId] = [cs].[Id]\n JOIN [ec_Schema] [ss] ON [ss].[Id] = [cs].[SchemaId]\n WHERE\n [cs].[Id] = ?\n `;\n\n return this.db.withPreparedSqliteStatement(sql, (stmt) => {\n stmt.bindId(1, classId);\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\n const classMap = JSON.parse(stmt.getValueString(0), (key, value) => {\n if (value === null) {\n return undefined;\n }\n if (key === \"isVirtual\") {\n return value === 0 ? false : true;\n }\n return value;\n }) as IClassMap;\n\n this._cachedClassMaps.set(classId, classMap);\n return classMap;\n }\n return undefined;\n });\n }\n}\n\n/**\n * Record meta data for the change.\n * @beta\n * */\nexport interface ChangeMetaData {\n /** list of tables making up this EC change */\n tables: string[];\n /** full name of the class of this EC change */\n className?: string;\n /** sqlite operation that caused the change */\n op: SqliteChangeOp;\n /** version of the value read from sqlite change */\n stage: SqliteValueStage;\n /** if classId for the change was not found in db then fallback class for the table */\n fallbackClassId?: Id64String;\n /** list of change index making up this change (one per table) */\n changeIndexes: number[];\n}\n\n/**\n * Represent EC change derived from low level sqlite change\n * @beta\n */\nexport interface ChangedECInstance {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECInstanceId: Id64String;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECClassId?: Id64String;\n $meta?: ChangeMetaData;\n [key: string]: any;\n}\n\n/**\n * Helper function to convert between JS DateTime & SQLite JulianDay values.\n * @beta\n * */\nnamespace DateTime {\n /**\n * Convert JS date to JulianDay value.\n * @param dt JS Date object.\n * @param convertToUtc convert the input value to UTC.\n * @returns julian day value\n */\n export function toJulianDay(dt: Date, convertToUtc = true): number {\n const utcOffset = convertToUtc ? dt.getTimezoneOffset() / 1440 : 0;\n return (dt.valueOf() / 86400000) - utcOffset + 2440587.5;\n }\n /**\n * Convert Julian day to JS Date object\n * @param jd JulianDay value for date/time\n * @param isLocalTime if julian day is local time or UTC\n * @returns JS Date object.\n */\n export function fromJulianDay(jd: number, isLocalTime: boolean): Date {\n const utcOffset = isLocalTime ? 0 : new Date().getTimezoneOffset() / 1440;\n return new Date((jd - 2440587.5 + utcOffset) * 86400000);\n }\n}\n/**\n * Combine partial changed instance into single instance.\n * Partial changes is per table and a single instance can\n * span multiple tables.\n * @beta\n */\nexport class PartialECChangeUnifier {\n private _cache = new Map<string, ChangedECInstance>();\n private _readonly = false;\n /**\n * Combine partial instance with instance with same key if already exists.\n * @param rhs partial instance\n */\n private combine(rhs: ChangedECInstance): void {\n if (!rhs.$meta) {\n throw new Error(\"PartialECChange being combine must have '$meta' property\");\n }\n const key = PartialECChangeUnifier.buildKey(rhs);\n const lhs = this._cache.get(key);\n if (lhs) {\n const { $meta: _, ...restOfRhs } = rhs;\n Object.assign(lhs, restOfRhs);\n if (lhs.$meta && rhs.$meta) {\n lhs.$meta.tables = [...rhs.$meta?.tables, ...lhs.$meta?.tables];\n lhs.$meta.changeIndexes = [...rhs.$meta?.changeIndexes, ...lhs.$meta?.changeIndexes];\n }\n } else {\n this._cache.set(key, rhs);\n }\n }\n /**\n * Build key from EC change.\n * @param change EC change\n * @returns key created from EC change.\n */\n private static buildKey(change: ChangedECInstance): string {\n return `${change.ECClassId}-${change.ECInstanceId}-${change.$meta?.stage}`.toLowerCase();\n }\n /**\n * Append partial changes which will be combine using there instance key.\n * @note $meta property must be present on partial change as information\n * in it is used to combine partial instances.\n * @param adaptor changeset adaptor is use to read the partial EC change.\n * @beta\n */\n public appendFrom(adaptor: ChangesetECAdaptor): void {\n if (adaptor.disableMetaData) {\n throw new Error(\"change adaptor property 'disableMetaData' must be set to 'false'\");\n }\n if (this._readonly) {\n throw new Error(\"this instance is marked as readonly.\");\n }\n if (adaptor.op === \"Updated\" && adaptor.inserted && adaptor.deleted) {\n this.combine(adaptor.inserted);\n this.combine(adaptor.deleted);\n } else if (adaptor.op === \"Inserted\" && adaptor.inserted) {\n this.combine(adaptor.inserted);\n } else if (adaptor.op === \"Deleted\" && adaptor.deleted) {\n this.combine(adaptor.deleted);\n }\n }\n /**\n * Delete $meta from all the instances.\n */\n public stripMetaData(): void {\n for (const inst of this._cache.values()) {\n if (\"$meta\" in inst) {\n delete inst.$meta;\n }\n }\n this._readonly = true;\n }\n /**\n * Returns complete EC change instances.\n * @beta\n */\n public get instances(): IterableIterator<ChangedECInstance> { return this._cache.values(); }\n}\n\n/**\n * Transform sqlite change to ec change. EC change is partial change as\n * it is per table while a single instance can span multiple table.\n * @note PrimitiveArray and StructArray are not supported types.\n * @beta\n *\n*/\nexport class ChangesetECAdaptor implements IDisposable {\n private readonly _mapCache: ECDbMap;\n private readonly _tableFilter = new Set<string>();\n private readonly _opFilter = new Set<SqliteChangeOp>();\n private readonly _classFilter = new Set<string>();\n private _allowedClasses = new Set<string>();\n /**\n * set debug flags\n */\n public readonly debugFlags = {\n replaceBlobWithEllipsis: false, // replace bolb with ... for debugging\n replaceGeomWithEllipsis: false, // replace geom with ... for debugging\n replaceGuidWithEllipsis: false, // replace geom with ... for debugging\n };\n /**\n * Return partial inserted instance\n * For updates inserted represent new version of instance after update.\n */\n public inserted?: ChangedECInstance;\n /**\n * Return partial deleted instance.\n * For updates deleted represent old version of instance before update.\n */\n public deleted?: ChangedECInstance;\n\n /**\n * Setup filter that will result in change enumeration restricted to\n * list of tables added by acceptTable().\n * @param table Name of the table\n * @returns Fluent reference to ChangesetAdaptor.\n */\n public acceptTable(table: string): ChangesetECAdaptor {\n if (!this._tableFilter.has(table))\n this._tableFilter.add(table);\n return this;\n }\n /**\n * Setup filter that will result in change enumeration restricted to\n * list of op added by acceptOp().\n * @param op\n * @returns Fluent reference to ChangesetAdaptor.\n */\n public acceptOp(op: SqliteChangeOp): ChangesetECAdaptor {\n if (!this._opFilter.has(op))\n this._opFilter.add(op);\n return this;\n }\n /**\n * Setup filter that will result in change enumeration restricted to\n * list of class and its derived classes added by acceptClass().\n * @param classFullName\n * @returns\n */\n public acceptClass(classFullName: string): ChangesetECAdaptor {\n if (!this._classFilter.has(classFullName))\n this._classFilter.add(classFullName);\n\n this._allowedClasses.clear();\n return this;\n }\n private buildClassFilter() {\n if (this._allowedClasses.size !== 0 || this._classFilter.size === 0)\n return;\n\n this._classFilter.forEach((className) => {\n this._mapCache.getAllDerivedClasses(className).forEach((classId) => {\n this._allowedClasses.add(classId);\n });\n });\n }\n /**\n * Construct adaptor with a initialized reader.\n * @note the changeset reader must have disableSchemaCheck\n * set to false and db must also be set.\n * @param reader wrap changeset reader.\n */\n public constructor(public readonly reader: SqliteChangesetReader, public readonly disableMetaData = false) {\n if (!reader.db)\n throw new Error(\"SqliteChangesetReader, 'db' param must be set to a valid IModelDb or ECDb.\");\n\n if (!reader.disableSchemaCheck)\n throw new Error(\"SqliteChangesetReader, 'disableSchemaCheck' param must be set to false.\");\n\n this._mapCache = new ECDbMap(reader.db);\n }\n /**\n * dispose current instance and it will also dispose the changeset reader.\n */\n public dispose(): void {\n this.close();\n }\n /**\n * close current instance and it will also close the changeset reader.\n */\n public close(): void {\n this.reader.close();\n }\n /**\n * Convert binary GUID into string GUID.\n * @param binaryGUID binary version of guid.\n * @returns GUID string.\n */\n private static convertBinaryToGuid(binaryGUID: Uint8Array): GuidString {\n // Check if the array has 16 elements\n if (binaryGUID.length !== 16) {\n throw new Error(\"Invalid array length for Guid\");\n }\n // Convert each element to a two-digit hexadecimal string\n const hex = Array.from(binaryGUID, (byte) => byte.toString(16).padStart(2, \"0\"));\n // Join the hexadecimal strings and insert hyphens\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n\n }\n /**\n * Set value use access string in a JS object.\n * @param targetObj object that will be updated.\n * @param accessString access string token separated by '.'.\n */\n private static setValue(targetObj: any, accessString: string, value: any): void {\n let cursor = targetObj;\n const propPath = accessString.split(\".\");\n propPath.forEach((propertyName) => {\n if (propertyName === \"__proto__\")\n throw new Error(\"access string cannot container __proto__\");\n });\n\n const leafProp = propPath.splice(-1).shift();\n if (!leafProp)\n throw new Error(\"not access string was specified.\");\n\n for (const elem of propPath) {\n if (typeof cursor[elem] === \"undefined\")\n cursor[elem] = {};\n cursor = cursor[elem];\n }\n cursor[leafProp] = value;\n }\n\n /**\n * Check if sqlite change table is a EC data table\n * @param tableName name of the table.\n * @returns true if table has EC data.\n */\n public isECTable(tableName: string) {\n return typeof this._mapCache.getTable(tableName) !== \"undefined\";\n }\n /**\n * Attempt find ECClassId from ECInstanceId for a change of type 'updated'.\n * @param tableName name of the table to find ECClassId from given ECInstanceId\n * @param instanceId instance id for which we need ECClassId for.\n * @returns if successful returns ECClassId else return undefined.\n */\n private getClassIdFromDb(tableName: string, instanceId: Id64String): Id64String | undefined {\n try {\n return this.reader.db?.withPreparedSqliteStatement(`SELECT [ECClassId] FROM [${tableName}] WHERE [rowId]=?`, (stmt) => {\n stmt.bindId(1, instanceId);\n return stmt.step() === DbResult.BE_SQLITE_ROW ? stmt.getValueId(0) : undefined;\n });\n } catch {\n return undefined;\n }\n }\n /** helper method around reader.op */\n public get op() { return this.reader.op; }\n /** Return true if current change is of type \"Inserted\" */\n public get isInserted() { return this.op === \"Inserted\"; }\n /** Return true if current change is of type \"Deleted\" */\n public get isDeleted() { return this.op === \"Deleted\"; }\n /** Return true if current change is of type \"Updated\" */\n public get isUpdated() { return this.op === \"Updated\"; }\n\n /**\n * Advance reader to next change or a change that meets the filter set in the current adaptor\n * @returns return false if no more changes to read.\n */\n public step(): boolean {\n this.inserted = undefined;\n this.deleted = undefined;\n this.buildClassFilter();\n while (this.reader.step()) {\n if (!this.isECTable(this.reader.tableName))\n continue;\n\n if (this._tableFilter.size > 0) {\n if (!this._tableFilter.has(this.reader.tableName))\n continue;\n }\n\n if (this._opFilter.size > 0) {\n if (!this._opFilter.has(this.reader.op))\n continue;\n }\n\n if (this.reader.hasRow) {\n const table = this._mapCache.getTable(this.reader.tableName);\n if (!table || table.type === \"Virtual\") {\n throw new Error(`table in changeset not found or is virtual ${this.reader.tableName}`);\n }\n\n const change = {\n inserted: this.reader.getChangeValuesObject(\"New\", { includePrimaryKeyInUpdateNew: true }),\n deleted: this.reader.getChangeValuesObject(\"Old\", { includePrimaryKeyInUpdateNew: true }),\n };\n\n if (!change.inserted && !change.deleted) {\n throw new Error(`unable to get change from changeset reader`);\n }\n\n let ecClassId: Id64String | undefined = this.reader.op === \"Inserted\" ? change.inserted?.ECClassId : change.deleted?.ECClassId;\n const classIdPresetInChange = !ecClassId;\n let classMap: IClassMap | undefined;\n let fallbackClassId: Id64String | undefined;\n if (table.isClassIdVirtual) {\n classMap = this._mapCache.getClassMap(table.exclusiveRootClassId);\n } else {\n if (!ecClassId) {\n // attempt to find ECClassId against row from the db.\n const primaryKeys = this.reader.primaryKeyValues;\n if (primaryKeys.length === 1) {\n ecClassId = this.getClassIdFromDb(this.reader.tableName, this.reader.primaryKeyValues[0] as Id64String);\n }\n // this is update and does not include ECClassId and it was also not found from db\n // so its unrecoverable error. Call can skip updates to ignore this error.\n if (!ecClassId)\n throw new Error(`change arg must contain 'ECClassId' property.`);\n }\n classMap = this._mapCache.getClassMap(ecClassId);\n if (!classMap) {\n // fallback to root map for table.\n classMap = this._mapCache.getClassMap(table.exclusiveRootClassId);\n if (classMap)\n fallbackClassId = table.exclusiveRootClassId;\n }\n }\n\n if (!classMap)\n throw new Error(`unable to load class map`);\n\n if (!classIdPresetInChange && !ecClassId)\n ecClassId = classMap.id;\n\n if (this._allowedClasses.size !== 0) {\n if (!this._allowedClasses.has(classMap.id))\n continue;\n }\n\n const $meta = {\n tables: [this.reader.tableName],\n op: this.reader.op,\n className: classMap.name,\n fallbackClassId,\n changeIndexes: [this.reader.changeIndex],\n };\n\n if (this.reader.op === \"Inserted\" && change.inserted) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.inserted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.inserted.$meta = { ...$meta, stage: \"New\" };\n this.transform(classMap, change.inserted, table, this.inserted);\n } else if (this.reader.op === \"Deleted\" && change.deleted) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.deleted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.deleted.$meta = { ...$meta, stage: \"Old\" };\n this.transform(classMap, change.deleted, table, this.deleted);\n } else if (change.inserted && change.deleted) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.inserted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.inserted.$meta = { ...$meta, stage: \"New\" };\n this.transform(classMap, change.inserted, table, this.inserted);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.deleted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.deleted.$meta = { ...$meta, stage: \"Old\" };\n this.transform(classMap, change.deleted, table, this.deleted);\n } else {\n throw new Error(\"unable to read EC changes\");\n }\n break;\n }\n }\n return this.reader.hasRow;\n }\n /**\n * Transform nav change column into navigation EC property\n * @param prop navigation property definition.\n * @param change sqlite change.\n * @param out ec instance that will be updated with navigation property.\n */\n private transformNavigationProperty(prop: IProperty, change: SqliteChange, out: ChangedECInstance): void {\n const idCol = prop.columns.filter(($) => $.accessString.endsWith(\".Id\")).at(0);\n if (!idCol) {\n throw new Error(\"invalid map for nav property\");\n }\n\n const idValue = change[idCol.column];\n if (typeof idValue === \"undefined\")\n return;\n\n ChangesetECAdaptor.setValue(out, idCol.accessString, idValue);\n\n const relClassIdCol = prop.columns.filter(($) => $.accessString.endsWith(\".RelECClassId\")).at(0);\n if (!relClassIdCol) {\n throw new Error(\"invalid map for nav property\");\n }\n\n const relClassIdValue = relClassIdCol.isVirtual ? prop.navigationRelationship?.classId : change[relClassIdCol.column];\n if (typeof relClassIdValue === \"undefined\")\n return;\n\n ChangesetECAdaptor.setValue(out, relClassIdCol.accessString, relClassIdValue);\n }\n /**\n * Transform sqlite change into EC change.\n * @param classMap classMap use to deserialize sqlite change into EC change.\n * @param change sqlite change from changeset.\n * @param table table definition of sqlite change provided.\n * @param out EC changeset that will be updated with properties.\n */\n private transform(classMap: IClassMap, change: SqliteChange, table: ITable, out: ChangedECInstance): void {\n // transform change row to instance\n for (const prop of classMap.properties) {\n if (prop.kind === \"PrimitiveArray\" || prop.kind === \"StructArray\") {\n // Arrays not supported\n continue;\n }\n if (prop.columns.filter((_) => _.isVirtual).length === prop.columns.length) {\n continue;\n }\n if (prop.kind === \"Navigation\") {\n this.transformNavigationProperty(prop, change, out);\n } else {\n for (const col of prop.columns) {\n if (col.table !== table.name)\n continue;\n\n const columnValue = change[col.column];\n if (typeof columnValue === \"undefined\")\n continue;\n\n if (columnValue !== null) {\n if (prop.primitiveType === \"DateTime\") {\n const dt = DateTime.fromJulianDay(columnValue, prop.dateTimeInfo?.dateTimeKind === \"Local\");\n ChangesetECAdaptor.setValue(out, col.accessString, dt.toISOString());\n continue;\n }\n if (prop.extendedTypeName === \"BeGuid\") {\n ChangesetECAdaptor.setValue(out, col.accessString, this.debugFlags.replaceGuidWithEllipsis ? \"...\" : ChangesetECAdaptor.convertBinaryToGuid(columnValue));\n continue;\n }\n if (prop.extendedTypeName === \"GeometryStream\") {\n ChangesetECAdaptor.setValue(out, col.accessString, this.debugFlags.replaceGeomWithEllipsis ? \"...\" : columnValue);\n continue;\n }\n if (prop.primitiveType === \"Binary\") {\n ChangesetECAdaptor.setValue(out, col.accessString, this.debugFlags.replaceBlobWithEllipsis ? \"...\" : columnValue);\n continue;\n }\n }\n ChangesetECAdaptor.setValue(out, col.accessString, columnValue);\n }\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ChangesetECAdaptor.js","sourceRoot":"","sources":["../../src/ChangesetECAdaptor.ts"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAC/F;;GAEG;AACH,sDAAoF;AAoDpF,MAAM,OAAO;IAGX,YAAmC,EAAS;QAAT,OAAE,GAAF,EAAE,CAAO;QAFpC,qBAAgB,GAAG,IAAI,GAAG,EAAyB,CAAC;QACpD,iBAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IACD,CAAC;IAC1C,oBAAoB,CAAC,aAAqB;QAC/C,MAAM,GAAG,GAAG;;;;;;;;KAQX,CAAC;QACF,OAAO,IAAI,CAAC,EAAE,CAAC,2BAA2B,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YACvD,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtG,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,uBAAQ,CAAC,aAAa;gBAC3C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IACM,QAAQ,CAAC,SAAiB;QAC/B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;YAClC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE1C,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BX,CAAC;QAEF,OAAO,IAAI,CAAC,EAAE,CAAC,2BAA2B,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YACvD,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,uBAAQ,CAAC,aAAa,EAAE;gBAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;oBAC9D,IAAI,KAAK,KAAK,IAAI;wBAChB,OAAO,SAAS,CAAC;oBAEnB,IAAI,GAAG,KAAK,kBAAkB;wBAC5B,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;oBAEpC,OAAO,KAAK,CAAC;gBACf,CAAC,CAAW,CAAC;gBAEb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBACxC,OAAO,KAAK,CAAC;aACd;YACD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IACM,WAAW,CAAC,OAAmB;QACpC,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;YACpC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE5C,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoLX,CAAC;QAEF,OAAO,IAAI,CAAC,EAAE,CAAC,2BAA2B,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YACvD,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACxB,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,uBAAQ,CAAC,aAAa,EAAE;gBAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;oBACjE,IAAI,KAAK,KAAK,IAAI,EAAE;wBAClB,OAAO,SAAS,CAAC;qBAClB;oBACD,IAAI,GAAG,KAAK,WAAW,EAAE;wBACvB,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;qBACnC;oBACD,OAAO,KAAK,CAAC;gBACf,CAAC,CAAc,CAAC;gBAEhB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAC7C,OAAO,QAAQ,CAAC;aACjB;YACD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAkCD;;;KAGK;AACL,IAAU,QAAQ,CAqBjB;AArBD,WAAU,QAAQ;IAChB;;;;;OAKG;IACH,SAAgB,WAAW,CAAC,EAAQ,EAAE,YAAY,GAAG,IAAI;QACvD,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3D,CAAC;IAHe,oBAAW,cAG1B,CAAA;IACD;;;;;OAKG;IACH,SAAgB,aAAa,CAAC,EAAU,EAAE,WAAoB;QAC5D,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC;QAC1E,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,GAAG,SAAS,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAHe,sBAAa,gBAG5B,CAAA;AACH,CAAC,EArBS,QAAQ,KAAR,QAAQ,QAqBjB;AACD;;;;;GAKG;AACH,MAAa,sBAAsB;IAAnC;QACU,WAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;QAC9C,cAAS,GAAG,KAAK,CAAC;IAqI5B,CAAC;IApIC;;;;;OAKG;IACK,MAAM,CAAC,cAAc,CAAC,OAAmB,EAAE,EAAS;QAC1D,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;4BAqBY,CAAC;QAEzB,OAAO,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1C,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACxB,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,uBAAQ,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;gBAClE,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;aAC/B;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IACD;;;OAGG;IACK,OAAO,CAAC,GAAsB,EAAE,EAAU;QAChD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;SAC7E;QACD,MAAM,GAAG,GAAG,sBAAsB,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,GAAG,EAAE;YACP,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,GAAG,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC9B,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE;gBAC1B,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAChE,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;gBAErF,2DAA2D;gBAC3D,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,KAAK,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE;oBAC3H,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC;oBAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC;oBAC7C,MAAM,oBAAoB,GAAG,EAAE,CAAC,qBAAqB,CAAC,2BAA2B,EAAE,CAAC,IAAI,EAAE,EAAE;wBAC1F,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;wBAC3B,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;wBAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;wBACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;oBAC7C,CAAC,CAAC,CAAC;oBACH,IAAI,oBAAoB,EAAE;wBACxB,GAAG,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC;wBACtD,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC;qBACnD;iBACF;aACF;SACF;aAAM;YACL,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;SAC3B;IACH,CAAC;IACD;;;;OAIG;IACK,MAAM,CAAC,QAAQ,CAAC,MAAyB,EAAE,EAAU;QAC3D,IAAI,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;QAC/B,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;YAClC,IAAI,EAAE,IAAI,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE;gBACvC,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;aACjE;YACD,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;gBAClC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;aAClE;SACF;QACD,OAAO,GAAG,MAAM,CAAC,YAAY,IAAI,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC;IAClF,CAAC;IACD;;;;;;OAMG;IACI,UAAU,CAAC,OAA2B;QAC3C,IAAI,OAAO,CAAC,eAAe,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;SACrF;QACD,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;SACzD;QAED,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE;YACnE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAClD;aAAM,IAAI,OAAO,CAAC,EAAE,KAAK,UAAU,IAAI,OAAO,CAAC,QAAQ,EAAE;YACxD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACnD;aAAM,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE;YACtD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAClD;IACH,CAAC;IACD;;OAEG;IACI,aAAa;QAClB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE;YACvC,IAAI,OAAO,IAAI,IAAI,EAAE;gBACnB,OAAO,IAAI,CAAC,KAAK,CAAC;aACnB;SACF;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IACD;;;OAGG;IACH,IAAW,SAAS,KAA0C,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;CAC7F;AAvID,wDAuIC;AAED;;;;;;EAME;AACF,MAAa,kBAAkB;IAyB7B;;;;;OAKG;IACI,WAAW,CAAC,KAAa;QAC9B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;;;OAKG;IACI,QAAQ,CAAC,EAAkB;QAChC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD;;;;;OAKG;IACI,WAAW,CAAC,aAAqB;QACtC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC;YACvC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAEvC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACO,gBAAgB;QACtB,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC;YACjE,OAAO;QAET,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YACtC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACjE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IACD;;;;;OAKG;IACH,YAAmC,MAA6B,EAAkB,kBAAkB,KAAK;QAAtE,WAAM,GAAN,MAAM,CAAuB;QAAkB,oBAAe,GAAf,eAAe,CAAQ;QA1ExF,iBAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,cAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QACtC,iBAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QAC1C,oBAAe,GAAG,IAAI,GAAG,EAAU,CAAC;QAC5C;;WAEG;QACa,eAAU,GAAG;YAC3B,uBAAuB,EAAE,KAAK;YAC9B,uBAAuB,EAAE,KAAK;YAC9B,uBAAuB,EAAE,KAAK,EAAE,sCAAsC;SACvE,CAAC;QAgEA,IAAI,CAAC,MAAM,CAAC,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAEhG,IAAI,CAAC,MAAM,CAAC,kBAAkB;YAC5B,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAE7F,IAAI,CAAC,SAAS,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD;;OAEG;IACI,OAAO;QACZ,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IACD;;OAEG;IACI,KAAK;QACV,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IACD;;;;OAIG;IACK,MAAM,CAAC,mBAAmB,CAAC,UAAsB;QACvD,qCAAqC;QACrC,IAAI,UAAU,CAAC,MAAM,KAAK,EAAE,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QACD,yDAAyD;QACzD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACjF,kDAAkD;QAClD,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IAE1J,CAAC;IACD;;;;OAIG;IACK,MAAM,CAAC,QAAQ,CAAC,SAAc,EAAE,YAAoB,EAAE,KAAU;QACtE,IAAI,MAAM,GAAG,SAAS,CAAC;QACvB,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzC,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;YAChC,IAAI,YAAY,KAAK,WAAW;gBAC9B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7C,IAAI,CAAC,QAAQ;YACX,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAEtD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;YAC3B,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,WAAW;gBACrC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACpB,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;SACvB;QACD,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACI,SAAS,CAAC,SAAiB;QAChC,OAAO,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,WAAW,CAAC;IACnE,CAAC;IACD;;;;;OAKG;IACK,gBAAgB,CAAC,SAAiB,EAAE,UAAsB;QAChE,IAAI;YACF,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,2BAA2B,CAAC,4BAA4B,SAAS,mBAAmB,EAAE,CAAC,IAAI,EAAE,EAAE;gBACpH,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;gBAC3B,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,uBAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACjF,CAAC,CAAC,CAAC;SACJ;QAAC,MAAM;YACN,OAAO,SAAS,CAAC;SAClB;IACH,CAAC;IACD,qCAAqC;IACrC,IAAW,EAAE,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,0DAA0D;IAC1D,IAAW,UAAU,KAAK,OAAO,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC;IAC1D,yDAAyD;IACzD,IAAW,SAAS,KAAK,OAAO,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC;IACxD,yDAAyD;IACzD,IAAW,SAAS,KAAK,OAAO,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC;IAExD;;;OAGG;IACI,IAAI;QACT,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;gBACxC,SAAS;YAEX,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE;gBAC9B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;oBAC/C,SAAS;aACZ;YAED,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE;gBAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBACrC,SAAS;aACZ;YAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC7D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE;oBACtC,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;iBACxF;gBAED,MAAM,MAAM,GAAG;oBACb,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE,CAAC;oBAC1F,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE,CAAC;iBAC1F,CAAC;gBAEF,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;oBACvC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;iBAC/D;gBAED,IAAI,SAAS,GAA2B,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC;gBAC/H,MAAM,sBAAsB,GAAG,OAAO,SAAS,KAAK,WAAW,CAAC;gBAChE,IAAI,QAA+B,CAAC;gBACpC,IAAI,eAAuC,CAAC;gBAC5C,IAAI,KAAK,CAAC,gBAAgB,EAAE;oBAC1B,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;iBACnE;qBAAM;oBACL,IAAI,CAAC,SAAS,EAAE;wBACd,qDAAqD;wBACrD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;wBACjD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;4BAC5B,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAe,CAAC,CAAC;yBACzG;qBACF;oBACD,IAAI,SAAS;wBACX,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;oBACnD,IAAI,CAAC,QAAQ,EAAE;wBACb,kCAAkC;wBAClC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;wBAClE,IAAI,QAAQ;4BACV,eAAe,GAAG,KAAK,CAAC,oBAAoB,CAAC;qBAChD;iBACF;gBAED,IAAI,CAAC,QAAQ;oBACX,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAE9C,IAAI,CAAC,sBAAsB,IAAI,CAAC,SAAS,IAAI,CAAC,eAAe;oBAC3D,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC;gBAE1B,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,EAAE;oBACnC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACxC,SAAS;iBACZ;gBAED,MAAM,KAAK,GAAG;oBACZ,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;oBAC/B,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;oBAClB,aAAa,EAAE,QAAQ,CAAC,IAAI;oBAC5B,eAAe;oBACf,aAAa,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;iBACzC,CAAC;gBAEF,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE;oBACpD,gEAAgE;oBAChE,IAAI,CAAC,QAAQ,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;oBAC3D,IAAI,CAAC,IAAI,CAAC,eAAe;wBACvB,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;oBACnD,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACjE;qBAAM,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE;oBACzD,gEAAgE;oBAChE,IAAI,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;oBAC1D,IAAI,CAAC,IAAI,CAAC,eAAe;wBACvB,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;oBAClD,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;iBAC/D;qBAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE;oBAC5C,gEAAgE;oBAChE,IAAI,CAAC,QAAQ,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;oBAC3D,IAAI,CAAC,IAAI,CAAC,eAAe;wBACvB,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;oBACnD,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAChE,gEAAgE;oBAChE,IAAI,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;oBAC1D,IAAI,CAAC,IAAI,CAAC,eAAe;wBACvB,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;oBAClD,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;iBAC/D;qBAAM;oBACL,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;iBAC9C;gBACD,MAAM;aACP;SACF;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IACD;;;;;OAKG;IACK,2BAA2B,CAAC,IAAe,EAAE,MAAoB,EAAE,GAAsB;QAC/F,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;SACjD;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,OAAO,OAAO,KAAK,WAAW;YAChC,OAAO;QAET,kBAAkB,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAE9D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjG,IAAI,CAAC,aAAa,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;SACjD;QAED,MAAM,eAAe,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACtH,IAAI,OAAO,eAAe,KAAK,WAAW;YACxC,OAAO;QAET,kBAAkB,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAChF,CAAC;IACD;;;;;;OAMG;IACK,SAAS,CAAC,QAAmB,EAAE,MAAoB,EAAE,KAAa,EAAE,GAAsB;QAChG,mCAAmC;QACnC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,UAAU,EAAE;YACtC,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE;gBACjE,uBAAuB;gBACvB,SAAS;aACV;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBAC1E,SAAS;aACV;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE;gBAC9B,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;aACrD;iBAAM;gBACL,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE;oBAC9B,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI;wBAC1B,SAAS;oBAEX,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACvC,IAAI,OAAO,WAAW,KAAK,WAAW;wBACpC,SAAS;oBAEX,IAAI,WAAW,KAAK,IAAI,EAAE;wBACxB,IAAI,IAAI,CAAC,aAAa,KAAK,UAAU,EAAE;4BACrC,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC;4BAC5F,kBAAkB,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;4BACrE,SAAS;yBACV;wBACD,IAAI,IAAI,CAAC,gBAAgB,KAAK,QAAQ,EAAE;4BACtC,kBAAkB,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC;4BAC1J,SAAS;yBACV;wBACD,IAAI,IAAI,CAAC,gBAAgB,KAAK,gBAAgB,EAAE;4BAC9C,kBAAkB,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;4BAClH,SAAS;yBACV;wBACD,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ,EAAE;4BACnC,kBAAkB,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;4BAClH,SAAS;yBACV;qBACF;oBACD,kBAAkB,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;iBACjE;aACF;SACF;IACH,CAAC;CACF;AA3WD,gDA2WC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ECDb\n */\nimport { DbResult, GuidString, Id64String, IDisposable } from \"@itwin/core-bentley\";\nimport { AnyDb, SqliteChange, SqliteChangeOp, SqliteChangesetReader, SqliteValueStage } from \"./SqliteChangesetReader\";\n\ninterface IClassRef {\n classId: Id64String;\n classFullName: string;\n}\n\ninterface IClassMap {\n readonly id: Id64String;\n readonly name: string;\n readonly mapStrategy: \"NotMapped\" | \"OwnTable\" | \"TablePerHierarchy\" | \"ExistingTable\" | \"ForeignKeyInTargetTable\" | \"ForeignKeyInSourceTable\";\n readonly type: \"Entity\" | \"Relationship\" | \"Struct\" | \"CustomAttribute\";\n readonly modifier: \"None\" | \"Abstract\" | \"Sealed\";\n readonly properties: IProperty[];\n}\n\ninterface IDateTimeInfo {\n readonly dateTimeKind?: \"Utc\" | \"Local\" | \"Unspecified\";\n readonly dateTimeComponent?: \"DateTime\" | \"Date\" | \"TimeOfDay\";\n}\n\ninterface IProperty {\n readonly id: Id64String;\n readonly name: string;\n readonly kind: \"Primitive\" | \"Struct\" | \"PrimitiveArray\" | \"StructArray\" | \"Navigation\";\n readonly primitiveType?: \"Binary\" | \"Boolean\" | \"DateTime\" | \"Double\" | \"Integer\" | \"Long\" | \"Point2d\" | \"Point3d\" | \"String\" | \"IGeometry\";\n readonly extendedTypeName?: string;\n readonly navigationRelationship?: IClassRef;\n readonly structClass?: IClassRef;\n readonly dateTimeInfo?: IDateTimeInfo;\n readonly columns: IColumn[];\n\n}\n\ninterface IColumn {\n readonly table: string;\n readonly column: string;\n readonly type: \"Any\" | \"Boolean\" | \"Blob\" | \"Timestamp\" | \"Real\" | \"Integer\" | \"Text\";\n readonly columnKind: \"Default\" | \"Id\" | \"ClassId\" | \"Shared\";\n readonly accessString: string;\n readonly isVirtual: boolean;\n}\n\ninterface ITable {\n readonly id: Id64String;\n readonly name: string;\n readonly type: \"Primary\" | \"Joined\" | \"Existing\" | \"Overflow\" | \"Virtual\";\n readonly exclusiveRootClassId: Id64String;\n readonly isClassIdVirtual: boolean;\n}\n\nclass ECDbMap {\n private _cachedClassMaps = new Map<Id64String, IClassMap>();\n private _cacheTables = new Map<string, ITable>();\n public constructor(public readonly db: AnyDb) { }\n public getAllDerivedClasses(classFullName: string) {\n const sql = `\n SELECT format('0x%x', ch.ClassId)\n FROM [ec_cache_ClassHierarchy] [ch]\n JOIN [ec_Class] [cs] ON [cs].[Id] = [ch].[BaseClassId]\n JOIN [ec_Schema] [sc] ON [sc].[Id] = [cs].[SchemaId]\n WHERE (([sc].[Alias] = :schemaNameOrAlias\n OR [sc].[Name] = :schemaNameOrAlias)\n AND ([cs].[Name] = :className))\n `;\n return this.db.withPreparedSqliteStatement(sql, (stmt) => {\n const parts = classFullName.indexOf(\".\") !== -1 ? classFullName.split(\".\") : classFullName.split(\":\");\n stmt.bindString(\":schemaNameOrAlias\", parts[0]);\n stmt.bindString(\":className\", parts[1]);\n const classIds = [];\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\n classIds.push(stmt.getValueString(0));\n return classIds;\n });\n }\n public getTable(tableName: string): ITable | undefined {\n if (this._cacheTables.has(tableName))\n return this._cacheTables.get(tableName);\n\n const sql = `\n SELECT\n JSON_OBJECT (\n 'id', FORMAT ('0x%x', [t].[id]),\n 'name', [t].[Name],\n 'type', (\n CASE\n [t].[type]\n WHEN 0 THEN 'Primary'\n WHEN 1 THEN 'Joined'\n WHEN 2 THEN 'Existing'\n WHEN 3 THEN 'Overflow'\n WHEN 4 THEN 'Virtual'\n END\n ),\n 'exclusiveRootClassId', FORMAT ('0x%x', [t].[ExclusiveRootClassId]),\n 'isClassIdVirtual', (\n SELECT\n [c].[IsVirtual]\n FROM\n [ec_Column] [c]\n WHERE\n [c].[Name] = 'ECClassId' AND [c].[TableId] = [t].[Id]\n )\n )\n FROM [ec_Table] [t]\n WHERE\n [t].[Name] = ?;\n `;\n\n return this.db.withPreparedSqliteStatement(sql, (stmt) => {\n stmt.bindString(1, tableName);\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\n const table = JSON.parse(stmt.getValueString(0), (key, value) => {\n if (value === null)\n return undefined;\n\n if (key === \"isClassIdVirtual\")\n return value === 0 ? false : true;\n\n return value;\n }) as ITable;\n\n this._cacheTables.set(tableName, table);\n return table;\n }\n return undefined;\n });\n }\n public getClassMap(classId: Id64String): IClassMap | undefined {\n if (this._cachedClassMaps.has(classId))\n return this._cachedClassMaps.get(classId);\n\n const sql = `\n SELECT\n JSON_OBJECT(\n 'id', format('0x%x', cs.id),\n 'name', format('%s:%s', ss.Name, cs.Name),\n 'mapStrategy',\n (\n CASE cm.MapStrategy\n WHEN 0 THEN 'NotMapped'\n WHEN 1 THEN 'OwnTable'\n WHEN 2 THEN 'TablePerHierarchy'\n WHEN 3 THEN 'ExistingTable'\n WHEN 10 THEN 'ForeignKeyInTargetTable'\n WHEN 11 THEN 'ForeignKeyInSourceTable'\n END\n ),\n 'type',\n (\n CASE cs.Type\n WHEN 0 THEN 'Entity'\n WHEN 1 THEN 'Relationship'\n WHEN 2 THEN 'Struct'\n WHEN 3 THEN 'CustomAttribute'\n END\n ),\n 'modifier',\n (\n CASE cs.Modifier\n WHEN 0 THEN 'None'\n WHEN 1 THEN 'Abstract'\n WHEN 2 THEN 'Sealed'\n END\n ),\n 'properties',\n (\n SELECT\n JSON_GROUP_ARRAY(JSON(propJson))\n FROM\n (\n SELECT\n JSON_OBJECT(\n 'id', format('0x%x', pt.id),\n 'name', pt.Name,\n 'kind',\n (\n CASE pt.Kind\n WHEN 0 THEN 'Primitive'\n WHEN 1 THEN 'Struct'\n WHEN 2 THEN 'PrimitiveArray'\n WHEN 3 THEN 'StructArray'\n WHEN 4 THEN 'Navigation'\n END\n ),\n 'primitiveType',\n (\n CASE pt.PrimitiveType\n WHEN 0x101 THEN 'Binary'\n WHEN 0x201 THEN 'Boolean'\n WHEN 0x301 THEN 'DateTime'\n WHEN 0x401 THEN 'Double'\n WHEN 0x501 THEN 'Integer'\n WHEN 0x601 THEN 'Long'\n WHEN 0x701 THEN 'Point2d'\n WHEN 0x801 THEN 'Point3d'\n WHEN 0x901 THEN 'String'\n WHEN 0xa01 THEN 'IGeometry'\n END\n ),\n 'extendedTypeName', ExtendedTypeName,\n 'navigationRelationship',\n (\n SELECT\n JSON_OBJECT(\n 'classId', format('0x%x', nc.Id),\n 'classFullName', format('%s:%s', ns.Name, nc.Name)\n )\n FROM ec_Class nc\n JOIN ec_Schema ns ON ns.Id = nc.SchemaId\n WHERE\n nc.Id = pt.NavigationRelationshipClassId\n ),\n 'structClass',\n (\n SELECT\n JSON_OBJECT(\n 'classId', format('0x%x', nc.Id),\n 'classFullName', format('%s:%s', ns.Name, nc.Name)\n )\n FROM ec_Class nc\n JOIN ec_Schema ns ON ns.Id = nc.SchemaId\n WHERE\n nc.Id = pt.StructClassId\n ),\n 'dateTimeInfo', (\n SELECT\n JSON_OBJECT (\n 'dateTimeKind', (\n CASE\n WHEN [ca].[Instance] LIKE '%<DateTimeKind>Utc</DateTimeKind>%' COLLATE [NoCase] THEN 'Utc'\n WHEN [ca].[Instance] LIKE '%<DateTimeKind>Local</DateTimeKind>%' COLLATE [NoCase] THEN 'Local'\n ELSE 'Unspecified'\n END\n ),\n 'dateTimeComponent', (\n CASE\n WHEN [ca].[Instance] LIKE '%<DateTimeComponent>DateTime</DateTimeComponent>%' COLLATE [NoCase] THEN 'DateTime'\n WHEN [ca].[Instance] LIKE '%<DateTimeComponent>Date</DateTimeComponent>%' COLLATE [NoCase] THEN 'Date'\n WHEN [ca].[Instance] LIKE '%<DateTimeComponent>TimeOfDay</DateTimeComponent>%' COLLATE [NoCase] THEN 'TimeOfDay'\n ELSE 'DateTime'\n END\n )\n )\n FROM\n [ec_CustomAttribute] [ca]\n JOIN [ec_Class] [cl] ON [cl].[Id] = [ca].[ClassId]\n JOIN [ec_Schema] [sc] ON [sc].[Id] = [cl].[SchemaId]\n WHERE\n [ca].[ContainerType] = 992\n AND [cl].[Name] = 'DateTimeInfo'\n AND [sc].[Name] = 'CoreCustomAttributes'\n AND [ca].[ContainerId] = [pt].[Id]\n ),\n 'columns',\n (\n SELECT\n JSON_GROUP_ARRAY(JSON(columnJson))\n FROM\n (\n SELECT\n JSON_OBJECT(\n 'table', tb.Name,\n 'column', cc.Name,\n 'type',\n (\n CASE cc.Type\n WHEN 0 THEN 'Any'\n WHEN 1 THEN 'Boolean'\n WHEN 2 THEN 'Blob'\n WHEN 3 THEN 'Timestamp'\n WHEN 4 THEN 'Real'\n WHEN 5 THEN 'Integer'\n WHEN 6 THEN 'Text'\n END\n ),\n 'columnKind',\n (\n CASE cc.ColumnKind\n WHEN 0 THEN 'Default'\n WHEN 1 THEN 'Id'\n WHEN 2 THEN 'ClassId'\n WHEN 4 THEN 'SharedData'\n END\n ),\n 'accessString', pp0.AccessString,\n 'isVirtual', cc.IsVirtual OR tb.Type = 4\n ) columnJson\n FROM [ec_PropertyMap] [pm0]\n JOIN [ec_Column] [cc] ON [cc].[Id] = [pm0].[ColumnId]\n JOIN [ec_Table] [tb] ON [tb].[Id] = [cc].[TableId]\n JOIN [ec_PropertyPath] [pp0] ON [pp0].[Id] = [pm0].[PropertyPathId]\n WHERE\n [pp0].[RootPropertyId] = pt.Id AND pm0.ClassId = cs.Id\n )\n )\n ) propJson\n FROM [ec_PropertyMap] [pm]\n JOIN [ec_PropertyPath] [pp] ON [pp].[Id] = [pm].[PropertyPathId]\n JOIN [ec_Property] [pt] ON [pt].[Id] = [pp].[RootPropertyId]\n WHERE\n pm.ClassId = cs.Id\n GROUP BY\n pt.Id\n )\n )\n ) classDef\n FROM [ec_Class] [cs]\n JOIN [ec_ClassMap] [cm] ON [cm].[ClassId] = [cs].[Id]\n JOIN [ec_Schema] [ss] ON [ss].[Id] = [cs].[SchemaId]\n WHERE\n [cs].[Id] = ?\n `;\n\n return this.db.withPreparedSqliteStatement(sql, (stmt) => {\n stmt.bindId(1, classId);\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\n const classMap = JSON.parse(stmt.getValueString(0), (key, value) => {\n if (value === null) {\n return undefined;\n }\n if (key === \"isVirtual\") {\n return value === 0 ? false : true;\n }\n return value;\n }) as IClassMap;\n\n this._cachedClassMaps.set(classId, classMap);\n return classMap;\n }\n return undefined;\n });\n }\n}\n\n/**\n * Record meta data for the change.\n * @beta\n * */\nexport interface ChangeMetaData {\n /** list of tables making up this EC change */\n tables: string[];\n /** full name of the class of this EC change */\n classFullName?: string;\n /** sqlite operation that caused the change */\n op: SqliteChangeOp;\n /** version of the value read from sqlite change */\n stage: SqliteValueStage;\n /** if classId for the change was not found in db then fallback class for the table */\n fallbackClassId?: Id64String;\n /** list of change index making up this change (one per table) */\n changeIndexes: number[];\n}\n\n/**\n * Represent EC change derived from low level sqlite change\n * @beta\n */\nexport interface ChangedECInstance {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECInstanceId: Id64String;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECClassId?: Id64String;\n $meta?: ChangeMetaData;\n [key: string]: any;\n}\n\n/**\n * Helper function to convert between JS DateTime & SQLite JulianDay values.\n * @beta\n * */\nnamespace DateTime {\n /**\n * Convert JS date to JulianDay value.\n * @param dt JS Date object.\n * @param convertToUtc convert the input value to UTC.\n * @returns julian day value\n */\n export function toJulianDay(dt: Date, convertToUtc = true): number {\n const utcOffset = convertToUtc ? dt.getTimezoneOffset() / 1440 : 0;\n return (dt.valueOf() / 86400000) - utcOffset + 2440587.5;\n }\n /**\n * Convert Julian day to JS Date object\n * @param jd JulianDay value for date/time\n * @param isLocalTime if julian day is local time or UTC\n * @returns JS Date object.\n */\n export function fromJulianDay(jd: number, isLocalTime: boolean): Date {\n const utcOffset = isLocalTime ? 0 : new Date().getTimezoneOffset() / 1440;\n return new Date((jd - 2440587.5 + utcOffset) * 86400000);\n }\n}\n/**\n * Combine partial changed instance into single instance.\n * Partial changes is per table and a single instance can\n * span multiple tables.\n * @beta\n */\nexport class PartialECChangeUnifier {\n private _cache = new Map<string, ChangedECInstance>();\n private _readonly = false;\n /**\n * Get root class id for a given class\n * @param classId given class id\n * @param db use to find root class\n * @returns return root class id\n */\n private static getRootClassId(classId: Id64String, db: AnyDb): Id64String | undefined {\n const sql = `\n WITH\n [base_class]([classId], [baseClassId], [Level]) AS(\n SELECT [ch].[ClassId], [ch].[BaseClassId], 0\n FROM [ec_ClassHasBaseClasses] [ch] WHERE [ch].[ClassId] = ?\n UNION ALL\n SELECT [ch].[ClassId], [ch].[BaseClassId], [Level] + 1\n FROM [ec_ClassHasBaseClasses] [ch], [base_class] [bc] WHERE [bc].[BaseClassId] = [ch].[ClassId]\n\n )\n SELECT FORMAT('0x%x', [bc].[BaseClassId]) rootClass\n FROM [base_class] [bc]\n WHERE [bc].[ClassId] <> [bc].[BaseClassId]\n AND [bc].[BaseClassId] NOT IN (SELECT [ca].[ContainerId]\n FROM [ec_CustomAttribute] [ca]\n WHERE [ca].[ContainerType] = 30\n AND [ca].[ClassId] IN (SELECT [cc].[Id]\n FROM [ec_Class] [cc]\n JOIN [ec_Schema] [ss] ON [ss].[Id] = [cc].[SchemaId]\n WHERE [cc].[Name] = 'IsMixIn'\n AND [ss].[Name] = 'CoreCustomAttributes'))\n ORDER BY [Level] DESC`;\n\n return db.withSqliteStatement(sql, (stmt) => {\n stmt.bindId(1, classId);\n if (stmt.step() === DbResult.BE_SQLITE_ROW && !stmt.isValueNull(0)) {\n return stmt.getValueString(0);\n }\n return classId;\n });\n }\n /**\n * Combine partial instance with instance with same key if already exists.\n * @param rhs partial instance\n */\n private combine(rhs: ChangedECInstance, db?: AnyDb): void {\n if (!rhs.$meta) {\n throw new Error(\"PartialECChange being combine must have '$meta' property\");\n }\n const key = PartialECChangeUnifier.buildKey(rhs, db);\n const lhs = this._cache.get(key);\n if (lhs) {\n const { $meta: _, ...restOfRhs } = rhs;\n Object.assign(lhs, restOfRhs);\n if (lhs.$meta && rhs.$meta) {\n lhs.$meta.tables = [...rhs.$meta?.tables, ...lhs.$meta?.tables];\n lhs.$meta.changeIndexes = [...rhs.$meta?.changeIndexes, ...lhs.$meta?.changeIndexes];\n\n // we preserve child class name & id when merging instance.\n if (rhs.$meta.fallbackClassId && lhs.$meta.fallbackClassId && db && rhs.$meta.fallbackClassId !== lhs.$meta.fallbackClassId) {\n const lhsClassId = lhs.$meta.fallbackClassId;\n const rhsClassId = rhs.$meta.fallbackClassId;\n const isRhsIsSubClassOfLhs = db.withPreparedStatement(\"SELECT ec_instanceof(?,?)\", (stmt) => {\n stmt.bindId(1, rhsClassId);\n stmt.bindId(2, lhsClassId);\n stmt.step();\n return stmt.getValue(0).getInteger() === 1;\n });\n if (isRhsIsSubClassOfLhs) {\n lhs.$meta.fallbackClassId = rhs.$meta.fallbackClassId;\n lhs.$meta.classFullName = rhs.$meta.classFullName;\n }\n }\n }\n } else {\n this._cache.set(key, rhs);\n }\n }\n /**\n * Build key from EC change.\n * @param change EC change\n * @returns key created from EC change.\n */\n private static buildKey(change: ChangedECInstance, db?: AnyDb): string {\n let classId = change.ECClassId;\n if (typeof classId === \"undefined\") {\n if (db && change.$meta?.fallbackClassId) {\n classId = this.getRootClassId(change.$meta.fallbackClassId, db);\n }\n if (typeof classId === \"undefined\") {\n throw new Error(`unable to resolve ECClassId to root class id.`);\n }\n }\n return `${change.ECInstanceId}-${classId}-${change.$meta?.stage}`.toLowerCase();\n }\n /**\n * Append partial changes which will be combine using there instance key.\n * @note $meta property must be present on partial change as information\n * in it is used to combine partial instances.\n * @param adaptor changeset adaptor is use to read the partial EC change.\n * @beta\n */\n public appendFrom(adaptor: ChangesetECAdaptor): void {\n if (adaptor.disableMetaData) {\n throw new Error(\"change adaptor property 'disableMetaData' must be set to 'false'\");\n }\n if (this._readonly) {\n throw new Error(\"this instance is marked as readonly.\");\n }\n\n if (adaptor.op === \"Updated\" && adaptor.inserted && adaptor.deleted) {\n this.combine(adaptor.inserted, adaptor.reader.db);\n this.combine(adaptor.deleted, adaptor.reader.db);\n } else if (adaptor.op === \"Inserted\" && adaptor.inserted) {\n this.combine(adaptor.inserted, adaptor.reader.db);\n } else if (adaptor.op === \"Deleted\" && adaptor.deleted) {\n this.combine(adaptor.deleted, adaptor.reader.db);\n }\n }\n /**\n * Delete $meta from all the instances.\n */\n public stripMetaData(): void {\n for (const inst of this._cache.values()) {\n if (\"$meta\" in inst) {\n delete inst.$meta;\n }\n }\n this._readonly = true;\n }\n /**\n * Returns complete EC change instances.\n * @beta\n */\n public get instances(): IterableIterator<ChangedECInstance> { return this._cache.values(); }\n}\n\n/**\n * Transform sqlite change to ec change. EC change is partial change as\n * it is per table while a single instance can span multiple table.\n * @note PrimitiveArray and StructArray are not supported types.\n * @beta\n *\n*/\nexport class ChangesetECAdaptor implements IDisposable {\n private readonly _mapCache: ECDbMap;\n private readonly _tableFilter = new Set<string>();\n private readonly _opFilter = new Set<SqliteChangeOp>();\n private readonly _classFilter = new Set<string>();\n private _allowedClasses = new Set<string>();\n /**\n * set debug flags\n */\n public readonly debugFlags = {\n replaceBlobWithEllipsis: false, // replace bolb with ... for debugging\n replaceGeomWithEllipsis: false, // replace geom with ... for debugging\n replaceGuidWithEllipsis: false, // replace geom with ... for debugging\n };\n /**\n * Return partial inserted instance\n * For updates inserted represent new version of instance after update.\n */\n public inserted?: ChangedECInstance;\n /**\n * Return partial deleted instance.\n * For updates deleted represent old version of instance before update.\n */\n public deleted?: ChangedECInstance;\n\n /**\n * Setup filter that will result in change enumeration restricted to\n * list of tables added by acceptTable().\n * @param table Name of the table\n * @returns Fluent reference to ChangesetAdaptor.\n */\n public acceptTable(table: string): ChangesetECAdaptor {\n if (!this._tableFilter.has(table))\n this._tableFilter.add(table);\n return this;\n }\n /**\n * Setup filter that will result in change enumeration restricted to\n * list of op added by acceptOp().\n * @param op\n * @returns Fluent reference to ChangesetAdaptor.\n */\n public acceptOp(op: SqliteChangeOp): ChangesetECAdaptor {\n if (!this._opFilter.has(op))\n this._opFilter.add(op);\n return this;\n }\n /**\n * Setup filter that will result in change enumeration restricted to\n * list of class and its derived classes added by acceptClass().\n * @param classFullName\n * @returns\n */\n public acceptClass(classFullName: string): ChangesetECAdaptor {\n if (!this._classFilter.has(classFullName))\n this._classFilter.add(classFullName);\n\n this._allowedClasses.clear();\n return this;\n }\n private buildClassFilter() {\n if (this._allowedClasses.size !== 0 || this._classFilter.size === 0)\n return;\n\n this._classFilter.forEach((className) => {\n this._mapCache.getAllDerivedClasses(className).forEach((classId) => {\n this._allowedClasses.add(classId);\n });\n });\n }\n /**\n * Construct adaptor with a initialized reader.\n * @note the changeset reader must have disableSchemaCheck\n * set to false and db must also be set.\n * @param reader wrap changeset reader.\n */\n public constructor(public readonly reader: SqliteChangesetReader, public readonly disableMetaData = false) {\n if (!reader.db)\n throw new Error(\"SqliteChangesetReader, 'db' param must be set to a valid IModelDb or ECDb.\");\n\n if (!reader.disableSchemaCheck)\n throw new Error(\"SqliteChangesetReader, 'disableSchemaCheck' param must be set to false.\");\n\n this._mapCache = new ECDbMap(reader.db);\n }\n /**\n * dispose current instance and it will also dispose the changeset reader.\n */\n public dispose(): void {\n this.close();\n }\n /**\n * close current instance and it will also close the changeset reader.\n */\n public close(): void {\n this.reader.close();\n }\n /**\n * Convert binary GUID into string GUID.\n * @param binaryGUID binary version of guid.\n * @returns GUID string.\n */\n private static convertBinaryToGuid(binaryGUID: Uint8Array): GuidString {\n // Check if the array has 16 elements\n if (binaryGUID.length !== 16) {\n throw new Error(\"Invalid array length for Guid\");\n }\n // Convert each element to a two-digit hexadecimal string\n const hex = Array.from(binaryGUID, (byte) => byte.toString(16).padStart(2, \"0\"));\n // Join the hexadecimal strings and insert hyphens\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n\n }\n /**\n * Set value use access string in a JS object.\n * @param targetObj object that will be updated.\n * @param accessString access string token separated by '.'.\n */\n private static setValue(targetObj: any, accessString: string, value: any): void {\n let cursor = targetObj;\n const propPath = accessString.split(\".\");\n propPath.forEach((propertyName) => {\n if (propertyName === \"__proto__\")\n throw new Error(\"access string cannot container __proto__\");\n });\n\n const leafProp = propPath.splice(-1).shift();\n if (!leafProp)\n throw new Error(\"not access string was specified.\");\n\n for (const elem of propPath) {\n if (typeof cursor[elem] === \"undefined\")\n cursor[elem] = {};\n cursor = cursor[elem];\n }\n cursor[leafProp] = value;\n }\n\n /**\n * Check if sqlite change table is a EC data table\n * @param tableName name of the table.\n * @returns true if table has EC data.\n */\n public isECTable(tableName: string) {\n return typeof this._mapCache.getTable(tableName) !== \"undefined\";\n }\n /**\n * Attempt find ECClassId from ECInstanceId for a change of type 'updated'.\n * @param tableName name of the table to find ECClassId from given ECInstanceId\n * @param instanceId instance id for which we need ECClassId for.\n * @returns if successful returns ECClassId else return undefined.\n */\n private getClassIdFromDb(tableName: string, instanceId: Id64String): Id64String | undefined {\n try {\n return this.reader.db?.withPreparedSqliteStatement(`SELECT [ECClassId] FROM [${tableName}] WHERE [rowId]=?`, (stmt) => {\n stmt.bindId(1, instanceId);\n return stmt.step() === DbResult.BE_SQLITE_ROW ? stmt.getValueId(0) : undefined;\n });\n } catch {\n return undefined;\n }\n }\n /** helper method around reader.op */\n public get op() { return this.reader.op; }\n /** Return true if current change is of type \"Inserted\" */\n public get isInserted() { return this.op === \"Inserted\"; }\n /** Return true if current change is of type \"Deleted\" */\n public get isDeleted() { return this.op === \"Deleted\"; }\n /** Return true if current change is of type \"Updated\" */\n public get isUpdated() { return this.op === \"Updated\"; }\n\n /**\n * Advance reader to next change or a change that meets the filter set in the current adaptor\n * @returns return false if no more changes to read.\n */\n public step(): boolean {\n this.inserted = undefined;\n this.deleted = undefined;\n this.buildClassFilter();\n while (this.reader.step()) {\n if (!this.isECTable(this.reader.tableName))\n continue;\n\n if (this._tableFilter.size > 0) {\n if (!this._tableFilter.has(this.reader.tableName))\n continue;\n }\n\n if (this._opFilter.size > 0) {\n if (!this._opFilter.has(this.reader.op))\n continue;\n }\n\n if (this.reader.hasRow) {\n const table = this._mapCache.getTable(this.reader.tableName);\n if (!table || table.type === \"Virtual\") {\n throw new Error(`table in changeset not found or is virtual ${this.reader.tableName}`);\n }\n\n const change = {\n inserted: this.reader.getChangeValuesObject(\"New\", { includePrimaryKeyInUpdateNew: true }),\n deleted: this.reader.getChangeValuesObject(\"Old\", { includePrimaryKeyInUpdateNew: true }),\n };\n\n if (!change.inserted && !change.deleted) {\n throw new Error(`unable to get change from changeset reader`);\n }\n\n let ecClassId: Id64String | undefined = this.reader.op === \"Inserted\" ? change.inserted?.ECClassId : change.deleted?.ECClassId;\n const classIdPresentInChange = typeof ecClassId !== \"undefined\";\n let classMap: IClassMap | undefined;\n let fallbackClassId: Id64String | undefined;\n if (table.isClassIdVirtual) {\n classMap = this._mapCache.getClassMap(table.exclusiveRootClassId);\n } else {\n if (!ecClassId) {\n // attempt to find ECClassId against row from the db.\n const primaryKeys = this.reader.primaryKeyValues;\n if (primaryKeys.length === 1) {\n ecClassId = this.getClassIdFromDb(this.reader.tableName, this.reader.primaryKeyValues[0] as Id64String);\n }\n }\n if (ecClassId)\n classMap = this._mapCache.getClassMap(ecClassId);\n if (!classMap) {\n // fallback to root map for table.\n classMap = this._mapCache.getClassMap(table.exclusiveRootClassId);\n if (classMap)\n fallbackClassId = table.exclusiveRootClassId;\n }\n }\n\n if (!classMap)\n throw new Error(`unable to load class map`);\n\n if (!classIdPresentInChange && !ecClassId && !fallbackClassId)\n ecClassId = classMap.id;\n\n if (this._allowedClasses.size !== 0) {\n if (!this._allowedClasses.has(classMap.id))\n continue;\n }\n\n const $meta = {\n tables: [this.reader.tableName],\n op: this.reader.op,\n classFullName: classMap.name,\n fallbackClassId,\n changeIndexes: [this.reader.changeIndex],\n };\n\n if (this.reader.op === \"Inserted\" && change.inserted) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.inserted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.inserted.$meta = { ...$meta, stage: \"New\" };\n this.transform(classMap, change.inserted, table, this.inserted);\n } else if (this.reader.op === \"Deleted\" && change.deleted) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.deleted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.deleted.$meta = { ...$meta, stage: \"Old\" };\n this.transform(classMap, change.deleted, table, this.deleted);\n } else if (change.inserted && change.deleted) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.inserted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.inserted.$meta = { ...$meta, stage: \"New\" };\n this.transform(classMap, change.inserted, table, this.inserted);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.deleted = { ECClassId: ecClassId, ECInstanceId: \"\" };\n if (!this.disableMetaData)\n this.deleted.$meta = { ...$meta, stage: \"Old\" };\n this.transform(classMap, change.deleted, table, this.deleted);\n } else {\n throw new Error(\"unable to read EC changes\");\n }\n break;\n }\n }\n return this.reader.hasRow;\n }\n /**\n * Transform nav change column into navigation EC property\n * @param prop navigation property definition.\n * @param change sqlite change.\n * @param out ec instance that will be updated with navigation property.\n */\n private transformNavigationProperty(prop: IProperty, change: SqliteChange, out: ChangedECInstance): void {\n const idCol = prop.columns.filter(($) => $.accessString.endsWith(\".Id\")).at(0);\n if (!idCol) {\n throw new Error(\"invalid map for nav property\");\n }\n\n const idValue = change[idCol.column];\n if (typeof idValue === \"undefined\")\n return;\n\n ChangesetECAdaptor.setValue(out, idCol.accessString, idValue);\n\n const relClassIdCol = prop.columns.filter(($) => $.accessString.endsWith(\".RelECClassId\")).at(0);\n if (!relClassIdCol) {\n throw new Error(\"invalid map for nav property\");\n }\n\n const relClassIdValue = relClassIdCol.isVirtual ? prop.navigationRelationship?.classId : change[relClassIdCol.column];\n if (typeof relClassIdValue === \"undefined\")\n return;\n\n ChangesetECAdaptor.setValue(out, relClassIdCol.accessString, relClassIdValue);\n }\n /**\n * Transform sqlite change into EC change.\n * @param classMap classMap use to deserialize sqlite change into EC change.\n * @param change sqlite change from changeset.\n * @param table table definition of sqlite change provided.\n * @param out EC changeset that will be updated with properties.\n */\n private transform(classMap: IClassMap, change: SqliteChange, table: ITable, out: ChangedECInstance): void {\n // transform change row to instance\n for (const prop of classMap.properties) {\n if (prop.kind === \"PrimitiveArray\" || prop.kind === \"StructArray\") {\n // Arrays not supported\n continue;\n }\n if (prop.columns.filter((_) => _.isVirtual).length === prop.columns.length) {\n continue;\n }\n if (prop.kind === \"Navigation\") {\n this.transformNavigationProperty(prop, change, out);\n } else {\n for (const col of prop.columns) {\n if (col.table !== table.name)\n continue;\n\n const columnValue = change[col.column];\n if (typeof columnValue === \"undefined\")\n continue;\n\n if (columnValue !== null) {\n if (prop.primitiveType === \"DateTime\") {\n const dt = DateTime.fromJulianDay(columnValue, prop.dateTimeInfo?.dateTimeKind === \"Local\");\n ChangesetECAdaptor.setValue(out, col.accessString, dt.toISOString());\n continue;\n }\n if (prop.extendedTypeName === \"BeGuid\") {\n ChangesetECAdaptor.setValue(out, col.accessString, this.debugFlags.replaceGuidWithEllipsis ? \"...\" : ChangesetECAdaptor.convertBinaryToGuid(columnValue));\n continue;\n }\n if (prop.extendedTypeName === \"GeometryStream\") {\n ChangesetECAdaptor.setValue(out, col.accessString, this.debugFlags.replaceGeomWithEllipsis ? \"...\" : columnValue);\n continue;\n }\n if (prop.primitiveType === \"Binary\") {\n ChangesetECAdaptor.setValue(out, col.accessString, this.debugFlags.replaceBlobWithEllipsis ? \"...\" : columnValue);\n continue;\n }\n }\n ChangesetECAdaptor.setValue(out, col.accessString, columnValue);\n }\n }\n }\n }\n}\n"]}
|
package/lib/cjs/Material.d.ts
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
* @module Elements
|
|
3
3
|
*/
|
|
4
4
|
import { Id64String } from "@itwin/core-bentley";
|
|
5
|
-
import { Code, CodeScopeProps, NormalMapProps, RenderMaterialProps, RgbFactorProps, TextureMapProps } from "@itwin/core-common";
|
|
5
|
+
import { Code, CodeScopeProps, ElementProps, NormalMapProps, RenderMaterialProps, RgbFactorProps, TextureMapProps } from "@itwin/core-common";
|
|
6
6
|
import { DefinitionElement } from "./Element";
|
|
7
7
|
import { IModelDb } from "./IModelDb";
|
|
8
|
+
import { IModelElementCloneContext } from "./IModelElementCloneContext";
|
|
8
9
|
/** A PhysicalMaterial defines the matter that makes up physical elements.
|
|
9
10
|
* @note See [[RenderMaterialElement]] for the DefinitionElement used to define rendering characteristics.
|
|
10
11
|
* @public
|
|
@@ -67,6 +68,8 @@ export declare class RenderMaterialElement extends DefinitionElement {
|
|
|
67
68
|
* @throws [[IModelError]] if unable to insert the element.
|
|
68
69
|
*/
|
|
69
70
|
static insert(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): Id64String;
|
|
71
|
+
/** @internal */
|
|
72
|
+
protected static onCloned(context: IModelElementCloneContext, sourceProps: ElementProps, targetProps: ElementProps): void;
|
|
70
73
|
}
|
|
71
74
|
/** @public */
|
|
72
75
|
export declare namespace RenderMaterialElement {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Material.d.ts","sourceRoot":"","sources":["../../src/Material.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"Material.d.ts","sourceRoot":"","sources":["../../src/Material.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/Material.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.RenderMaterialElement = exports.PhysicalMaterial = void 0;
|
|
11
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
11
12
|
const core_common_1 = require("@itwin/core-common");
|
|
12
13
|
const Element_1 = require("./Element");
|
|
13
14
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
@@ -165,6 +166,18 @@ class RenderMaterialElement extends Element_1.DefinitionElement {
|
|
|
165
166
|
const renderMaterial = this.create(iModelDb, definitionModelId, materialName, params);
|
|
166
167
|
return iModelDb.elements.insertElement(renderMaterial.toJSON());
|
|
167
168
|
}
|
|
169
|
+
/** @internal */
|
|
170
|
+
static onCloned(context, sourceProps, targetProps) {
|
|
171
|
+
super.onCloned(context, sourceProps, targetProps);
|
|
172
|
+
for (const mapName in sourceProps.jsonProperties?.materialAssets?.renderMaterial?.Map ?? {}) {
|
|
173
|
+
if (typeof mapName !== "string")
|
|
174
|
+
continue;
|
|
175
|
+
const sourceMap = sourceProps.jsonProperties.materialAssets.renderMaterial.Map[mapName];
|
|
176
|
+
if (!core_bentley_1.Id64.isValid(sourceMap.TextureId) || sourceMap.TextureId === undefined)
|
|
177
|
+
continue;
|
|
178
|
+
targetProps.jsonProperties.materialAssets.renderMaterial.Map[mapName].TextureId = context.findTargetElementId(sourceMap.TextureId ?? core_bentley_1.Id64.invalid);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
168
181
|
}
|
|
169
182
|
exports.RenderMaterialElement = RenderMaterialElement;
|
|
170
183
|
/** @public */
|
package/lib/cjs/Material.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Material.js","sourceRoot":"","sources":["../../src/Material.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Elements\n */\n\nimport { Id64String } from \"@itwin/core-bentley\";\nimport {\n BisCodeSpec, Code, CodeScopeProps, CodeSpec, DefinitionElementProps, NormalMapProps, RenderMaterialAssetMapsProps, RenderMaterialProps, RgbFactorProps, TextureMapProps,\n} from \"@itwin/core-common\";\nimport { DefinitionElement } from \"./Element\";\nimport { IModelDb } from \"./IModelDb\";\n\n/* eslint-disable @typescript-eslint/naming-convention */\n\n/** A PhysicalMaterial defines the matter that makes up physical elements.\n * @note See [[RenderMaterialElement]] for the DefinitionElement used to define rendering characteristics.\n * @public\n */\nexport abstract class PhysicalMaterial extends DefinitionElement {\n /** @internal */\n public static override get className(): string { return \"PhysicalMaterial\"; }\n /** Create a Code for a PhysicalMaterial given a name that is meant to be unique within the scope of the specified DefinitionModel.\n * @param iModel The IModelDb\n * @param definitionModelId The Id of the DefinitionModel that will contain the PhysicalMaterial and provide the scope for its name.\n * @param name The name (codeValue) of the PhysicalMaterial\n */\n public static createCode(iModel: IModelDb, definitionModelId: CodeScopeProps, name: string): Code {\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.physicalMaterial);\n return new Code({ spec: codeSpec.id, scope: definitionModelId, value: name });\n }\n /** Create a PhysicalMaterial\n * @param iModelDb The IModelDb\n * @param definitionModelId The Id of the DefinitionModel that will contain the PhysicalMaterial and provide the scope for its name.\n * @param name The name (codeValue) of the PhysicalMaterial\n * @returns The newly constructed PhysicalMaterial\n * @throws [[IModelError]] if there is a problem creating the PhysicalMaterial\n */\n public static create<T extends PhysicalMaterial>(iModelDb: IModelDb, definitionModelId: CodeScopeProps, name: string): T {\n const elementProps: DefinitionElementProps = {\n classFullName: this.classFullName,\n model: definitionModelId,\n code: this.createCode(iModelDb, definitionModelId, name),\n };\n return iModelDb.elements.createElement(elementProps);\n }\n}\n\n/** Defines a rendering material.\n * @note See [[PhysicalMaterial]] for the DefinitionElement used to define the matter that makes up physical elements.\n * @public\n */\nexport class RenderMaterialElement extends DefinitionElement {\n /** @internal */\n public static override get className(): string { return \"RenderMaterial\"; }\n\n /** The name of a palette that can be used to categorize multiple materials. */\n public paletteName: string;\n /** An optional description of the material. */\n public description?: string;\n /** @internal */\n constructor(props: RenderMaterialProps, iModel: IModelDb) {\n super(props, iModel);\n this.paletteName = props.paletteName;\n this.description = props.description;\n }\n\n public override toJSON(): RenderMaterialProps {\n const val = super.toJSON() as RenderMaterialProps;\n val.paletteName = this.paletteName;\n val.description = this.description;\n return val;\n }\n /** Create a Code for a RenderMaterial given a name that is meant to be unique within the scope of the specified DefinitionModel.\n * @param iModel The IModelDb\n * @param scopeModelId The Id of the DefinitionModel that contains the RenderMaterial and provides the scope for its name.\n * @param name The RenderMaterial name\n */\n public static createCode(iModel: IModelDb, scopeModelId: CodeScopeProps, name: string): Code {\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.renderMaterial);\n return 0 === name.length ? Code.createEmpty() : new Code({ spec: codeSpec.id, scope: scopeModelId, value: name });\n }\n /**\n * Create a RenderMaterial with given parameters.\n * @param iModelDb The iModel\n * @param definitionModelId The [[DefinitionModel]]\n * @param materialName The name/CodeValue of the RenderMaterial\n * @param params Parameters object which describes how to construct the RenderMaterial\n * @returns The newly constructed RenderMaterial element.\n * @throws [[IModelError]] if unable to create the element.\n */\n public static create(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): RenderMaterialElement {\n let maps: RenderMaterialAssetMapsProps | undefined;\n const pbr_normal = params.normalMap?.scale;\n if (params.patternMap || params.normalMap) {\n // If both normal and pattern map are present, their texture mapping modes, angles, scales, etc are expected to match.\n type TexMap = Omit<TextureMapProps, \"TextureId\">;\n function choose<K extends keyof TexMap>(obj: TexMap, key: K): void {\n const pat = params.patternMap;\n if (pat && undefined !== pat[key])\n obj[key] = pat[key];\n else if (params.normalMap && undefined !== params.normalMap[key])\n obj[key] = params.normalMap[key];\n }\n\n const baseProps: TexMap = {};\n choose(baseProps, \"pattern_angle\");\n choose(baseProps, \"pattern_u_flip\");\n choose(baseProps, \"pattern_flip\");\n choose(baseProps, \"pattern_scale\");\n choose(baseProps, \"pattern_offset\");\n choose(baseProps, \"pattern_scalemode\");\n choose(baseProps, \"pattern_mapping\");\n choose(baseProps, \"pattern_weight\");\n choose(baseProps, \"pattern_useConstantLod\");\n choose(baseProps, \"pattern_constantlod_repetitions\");\n choose(baseProps, \"pattern_constantlod_offset\");\n choose(baseProps, \"pattern_constantlod_mindistanceclamp\");\n choose(baseProps, \"pattern_constantlod_maxdistanceclamp\");\n\n maps = {};\n if (params.patternMap)\n maps.Pattern = { ...params.patternMap, ...baseProps };\n\n if (params.normalMap) {\n maps.Normal = {\n ...params.normalMap,\n ...baseProps,\n };\n\n delete (maps.Normal as any).scale;\n }\n }\n\n // const map = undefined !== params.patternMap ? { Pattern: params.patternMap } : undefined;\n const renderMaterialProps: RenderMaterialProps = {\n classFullName: this.classFullName,\n code: this.createCode(iModelDb, definitionModelId, materialName),\n paletteName: params.paletteName,\n description: params.description,\n jsonProperties: {\n materialAssets: {\n renderMaterial: {\n HasBaseColor: params.color !== undefined,\n color: params.color,\n HasSpecularColor: params.specularColor !== undefined,\n specular_color: params.specularColor,\n HasFinish: params.finish !== undefined,\n finish: params.finish,\n HasTransmit: params.transmit !== undefined,\n transmit: params.transmit,\n HasDiffuse: params.diffuse !== undefined,\n diffuse: params.diffuse,\n HasSpecular: params.specular !== undefined,\n specular: params.specular,\n HasReflect: params.reflect !== undefined,\n reflect: params.reflect,\n HasReflectColor: params.reflectColor !== undefined,\n reflect_color: params.reflectColor,\n Map: maps,\n pbr_normal,\n },\n },\n },\n model: definitionModelId,\n isPrivate: false,\n };\n\n return new RenderMaterialElement(renderMaterialProps, iModelDb);\n }\n\n /**\n * Insert a new RenderMaterial into a model.\n * @param iModelDb Insert into this iModel\n * @param definitionModelId Insert the new Texture into this DefinitionModel\n * @param materialName The name/CodeValue of the RenderMaterial\n * @param params Parameters object which describes how to construct the RenderMaterial\n * @returns The Id of the newly inserted RenderMaterial element.\n * @throws [[IModelError]] if unable to insert the element.\n */\n public static insert(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): Id64String {\n const renderMaterial = this.create(iModelDb, definitionModelId, materialName, params);\n return iModelDb.elements.insertElement(renderMaterial.toJSON());\n }\n}\n\n/** @public */\nexport namespace RenderMaterialElement { // eslint-disable-line no-redeclare\n /** Parameters used to construct a [[RenderMaterial]].\n * The persistent JSON representation - [RenderMaterialAssetProps]($common) - is quite verbose and unwieldy. This representation simplifies it somewhat.\n * @see [[RenderMaterialElement.create]] and [[RenderMaterialElement.insert]] to create a [[RenderMaterial]] from parameters of this type.\n * @deprecated in 3.6 because it is not useful to use a `class` - just use [[RenderMaterialElementParams]] directly instead.\n */\n export class Params {\n /** A required palette name that categorizes this RenderMaterial */\n public paletteName: string;\n /** An optional description of this RenderMaterial */\n public description?: string;\n /** If defined, the color to use for surface fill or diffuse illumination, overriding the surface's own color. */\n public color?: RgbFactorProps;\n /** The color to use for specular illumination. Default: black. */\n public specularColor?: RgbFactorProps;\n /** The specular exponent describing the surface's shininess, in the range 0 through 128.\n * Default: 0.\n */\n public finish?: number;\n /** A transparency to be applied to the surface, ranging from 0 (fully opaque) to 1 (fully transparent).\n * The surface's own transparency will be multiplied by `(1 - transmit)`. permitting the material to increase but not decrease the surface transparency.\n * Default: 13.5.\n */\n public transmit?: number;\n /** The surface's diffuse reflectivity from 0.0 to 1.0. Default: 0.6. */\n public diffuse?: number;\n /** The surface's specular reflectivity from 0.0 to 1.0. Default: 0.0. */\n public specular?: number;\n /** Currently unused. */\n public reflect?: number;\n /** Currently unused. */\n public reflectColor?: number[];\n /** Specifies a texture image to map onto the surface, replacing or mixing with the surface's own color and transparency.\n * @note With the exception of `TextureId`, the [TextureMapProps]($common) of [[patternMap]] and [[normalMap]] are expected to be identical. If a property is defined in both\n * [[patternMap]]] and [[normalMap]], the value in [[patternMap]] takes precedence.\n */\n public patternMap?: TextureMapProps;\n /** Specifies a [normal map](https://en.wikipedia.org/wiki/Normal_mapping) to apply to the surface to simulate more surface detail than is present in the\n * surface's geometry.\n * @note With the exception of `TextureId`, the [TextureMapProps]($common) of [[patternMap]] and [[normalMap]] are expected to be identical. If a property is defined in both\n * [[patternMap]]] and [[normalMap]], the value in [[patternMap]] takes precedence.\n */\n public normalMap?: NormalMapProps & {\n /** A factor by which to multiply the components of the normal vectors read from the texture.\n * Default: 1.\n */\n scale?: number;\n };\n\n /** Construct a new RenderMaterial.Params object with the specified paletteName. Alter the public members on that object to specify settings. */\n public constructor(paletteName: string) {\n this.paletteName = paletteName;\n }\n }\n}\n\n/** Parameters used to create a [[RenderMaterial]] element.\n * The persistent JSON representation - [RenderMaterialAssetProps]($common) - is quite verbose and unwieldy. This representation simplifies it somewhat.\n * @see [[RenderMaterialElement.create]] and [[RenderMaterialElement.insert]] to create a [[RenderMaterial]] from parameters of this type.\n * @public\n */\nexport interface RenderMaterialElementParams extends RenderMaterialElement.Params { // eslint-disable-line deprecation/deprecation, @typescript-eslint/no-empty-interface\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Material.js","sourceRoot":"","sources":["../../src/Material.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sDAAuD;AACvD,oDAE4B;AAC5B,uCAA8C;AAI9C,yDAAyD;AAEzD;;;GAGG;AACH,MAAsB,gBAAiB,SAAQ,2BAAiB;IAC9D,gBAAgB;IACT,MAAM,KAAc,SAAS,KAAa,OAAO,kBAAkB,CAAC,CAAC,CAAC;IAC7E;;;;OAIG;IACI,MAAM,CAAC,UAAU,CAAC,MAAgB,EAAE,iBAAiC,EAAE,IAAY;QACxF,MAAM,QAAQ,GAAa,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,yBAAW,CAAC,gBAAgB,CAAC,CAAC;QACpF,OAAO,IAAI,kBAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,MAAM,CAA6B,QAAkB,EAAE,iBAAiC,EAAE,IAAY;QAClH,MAAM,YAAY,GAA2B;YAC3C,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,CAAC;SACzD,CAAC;QACF,OAAO,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;CACF;AA3BD,4CA2BC;AAED;;;GAGG;AACH,MAAa,qBAAsB,SAAQ,2BAAiB;IAC1D,gBAAgB;IACT,MAAM,KAAc,SAAS,KAAa,OAAO,gBAAgB,CAAC,CAAC,CAAC;IAM3E,gBAAgB;IAChB,YAAY,KAA0B,EAAE,MAAgB;QACtD,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACvC,CAAC;IAEe,MAAM;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAyB,CAAC;QAClD,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACnC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,UAAU,CAAC,MAAgB,EAAE,YAA4B,EAAE,IAAY;QACnF,MAAM,QAAQ,GAAa,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,yBAAW,CAAC,cAAc,CAAC,CAAC;QAClF,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,kBAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpH,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,MAAM,CAAC,QAAkB,EAAE,iBAA6B,EAAE,YAAoB,EAAE,MAAmC;QAC/H,IAAI,IAA8C,CAAC;QACnD,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;QAC3C,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,SAAS,EAAE;YAGzC,SAAS,MAAM,CAAyB,GAAW,EAAE,GAAM;gBACzD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC;gBAC9B,IAAI,GAAG,IAAI,SAAS,KAAK,GAAG,CAAC,GAAG,CAAC;oBAC/B,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;qBACjB,IAAI,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;oBAC9D,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;YAED,MAAM,SAAS,GAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YACnC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YACpC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAClC,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YACnC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YACpC,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;YACvC,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;YACrC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YACpC,MAAM,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;YAC5C,MAAM,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;YACrD,MAAM,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;YAChD,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC,CAAC;YAC1D,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC,CAAC;YAE1D,IAAI,GAAG,EAAE,CAAC;YACV,IAAI,MAAM,CAAC,UAAU;gBACnB,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,GAAG,SAAS,EAAE,CAAC;YAExD,IAAI,MAAM,CAAC,SAAS,EAAE;gBACpB,IAAI,CAAC,MAAM,GAAG;oBACZ,GAAG,MAAM,CAAC,SAAS;oBACnB,GAAG,SAAS;iBACb,CAAC;gBAEF,OAAQ,IAAI,CAAC,MAAc,CAAC,KAAK,CAAC;aACnC;SACF;QAED,4FAA4F;QAC5F,MAAM,mBAAmB,GAAwB;YAC/C,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,iBAAiB,EAAE,YAAY,CAAC;YAChE,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,cAAc,EAAE;gBACd,cAAc,EAAE;oBACd,cAAc,EAAE;wBACd,YAAY,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS;wBACxC,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,gBAAgB,EAAE,MAAM,CAAC,aAAa,KAAK,SAAS;wBACpD,cAAc,EAAE,MAAM,CAAC,aAAa;wBACpC,SAAS,EAAE,MAAM,CAAC,MAAM,KAAK,SAAS;wBACtC,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,WAAW,EAAE,MAAM,CAAC,QAAQ,KAAK,SAAS;wBAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,UAAU,EAAE,MAAM,CAAC,OAAO,KAAK,SAAS;wBACxC,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,WAAW,EAAE,MAAM,CAAC,QAAQ,KAAK,SAAS;wBAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,UAAU,EAAE,MAAM,CAAC,OAAO,KAAK,SAAS;wBACxC,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,eAAe,EAAE,MAAM,CAAC,YAAY,KAAK,SAAS;wBAClD,aAAa,EAAE,MAAM,CAAC,YAAY;wBAClC,GAAG,EAAE,IAAI;wBACT,UAAU;qBACX;iBACF;aACF;YACD,KAAK,EAAE,iBAAiB;YACxB,SAAS,EAAE,KAAK;SACjB,CAAC;QAEF,OAAO,IAAI,qBAAqB,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED;;;;;;;;OAQG;IACI,MAAM,CAAC,MAAM,CAAC,QAAkB,EAAE,iBAA6B,EAAE,YAAoB,EAAE,MAAmC;QAC/H,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QACtF,OAAO,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,gBAAgB;IACN,MAAM,CAAU,QAAQ,CAAC,OAAkC,EAAE,WAAyB,EAAE,WAAyB;QACzH,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAClD,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,EAAE;YAC3F,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAC7B,SAAS;YACX,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxF,IAAI,CAAC,mBAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS;gBACzE,SAAS;YACX,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,GAAG,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,SAAS,IAAI,mBAAI,CAAC,OAAO,CAAC,CAAC;SACpJ;IACH,CAAC;CACF;AAjJD,sDAiJC;AAED,cAAc;AACd,WAAiB,qBAAqB;IACpC;;;;OAIG;IACH,MAAa,MAAM;QA2CjB,gJAAgJ;QAChJ,YAAmB,WAAmB;YACpC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QACjC,CAAC;KACF;IA/CY,4BAAM,SA+ClB,CAAA;AACH,CAAC,EAtDgB,qBAAqB,GAArB,6BAAqB,KAArB,6BAAqB,QAsDrC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Elements\n */\n\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\nimport {\n BisCodeSpec, Code, CodeScopeProps, CodeSpec, DefinitionElementProps, ElementProps, NormalMapProps, RenderMaterialAssetMapsProps, RenderMaterialProps, RgbFactorProps, TextureMapProps,\n} from \"@itwin/core-common\";\nimport { DefinitionElement } from \"./Element\";\nimport { IModelDb } from \"./IModelDb\";\nimport { IModelElementCloneContext } from \"./IModelElementCloneContext\";\n\n/* eslint-disable @typescript-eslint/naming-convention */\n\n/** A PhysicalMaterial defines the matter that makes up physical elements.\n * @note See [[RenderMaterialElement]] for the DefinitionElement used to define rendering characteristics.\n * @public\n */\nexport abstract class PhysicalMaterial extends DefinitionElement {\n /** @internal */\n public static override get className(): string { return \"PhysicalMaterial\"; }\n /** Create a Code for a PhysicalMaterial given a name that is meant to be unique within the scope of the specified DefinitionModel.\n * @param iModel The IModelDb\n * @param definitionModelId The Id of the DefinitionModel that will contain the PhysicalMaterial and provide the scope for its name.\n * @param name The name (codeValue) of the PhysicalMaterial\n */\n public static createCode(iModel: IModelDb, definitionModelId: CodeScopeProps, name: string): Code {\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.physicalMaterial);\n return new Code({ spec: codeSpec.id, scope: definitionModelId, value: name });\n }\n /** Create a PhysicalMaterial\n * @param iModelDb The IModelDb\n * @param definitionModelId The Id of the DefinitionModel that will contain the PhysicalMaterial and provide the scope for its name.\n * @param name The name (codeValue) of the PhysicalMaterial\n * @returns The newly constructed PhysicalMaterial\n * @throws [[IModelError]] if there is a problem creating the PhysicalMaterial\n */\n public static create<T extends PhysicalMaterial>(iModelDb: IModelDb, definitionModelId: CodeScopeProps, name: string): T {\n const elementProps: DefinitionElementProps = {\n classFullName: this.classFullName,\n model: definitionModelId,\n code: this.createCode(iModelDb, definitionModelId, name),\n };\n return iModelDb.elements.createElement(elementProps);\n }\n}\n\n/** Defines a rendering material.\n * @note See [[PhysicalMaterial]] for the DefinitionElement used to define the matter that makes up physical elements.\n * @public\n */\nexport class RenderMaterialElement extends DefinitionElement {\n /** @internal */\n public static override get className(): string { return \"RenderMaterial\"; }\n\n /** The name of a palette that can be used to categorize multiple materials. */\n public paletteName: string;\n /** An optional description of the material. */\n public description?: string;\n /** @internal */\n constructor(props: RenderMaterialProps, iModel: IModelDb) {\n super(props, iModel);\n this.paletteName = props.paletteName;\n this.description = props.description;\n }\n\n public override toJSON(): RenderMaterialProps {\n const val = super.toJSON() as RenderMaterialProps;\n val.paletteName = this.paletteName;\n val.description = this.description;\n return val;\n }\n /** Create a Code for a RenderMaterial given a name that is meant to be unique within the scope of the specified DefinitionModel.\n * @param iModel The IModelDb\n * @param scopeModelId The Id of the DefinitionModel that contains the RenderMaterial and provides the scope for its name.\n * @param name The RenderMaterial name\n */\n public static createCode(iModel: IModelDb, scopeModelId: CodeScopeProps, name: string): Code {\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.renderMaterial);\n return 0 === name.length ? Code.createEmpty() : new Code({ spec: codeSpec.id, scope: scopeModelId, value: name });\n }\n /**\n * Create a RenderMaterial with given parameters.\n * @param iModelDb The iModel\n * @param definitionModelId The [[DefinitionModel]]\n * @param materialName The name/CodeValue of the RenderMaterial\n * @param params Parameters object which describes how to construct the RenderMaterial\n * @returns The newly constructed RenderMaterial element.\n * @throws [[IModelError]] if unable to create the element.\n */\n public static create(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): RenderMaterialElement {\n let maps: RenderMaterialAssetMapsProps | undefined;\n const pbr_normal = params.normalMap?.scale;\n if (params.patternMap || params.normalMap) {\n // If both normal and pattern map are present, their texture mapping modes, angles, scales, etc are expected to match.\n type TexMap = Omit<TextureMapProps, \"TextureId\">;\n function choose<K extends keyof TexMap>(obj: TexMap, key: K): void {\n const pat = params.patternMap;\n if (pat && undefined !== pat[key])\n obj[key] = pat[key];\n else if (params.normalMap && undefined !== params.normalMap[key])\n obj[key] = params.normalMap[key];\n }\n\n const baseProps: TexMap = {};\n choose(baseProps, \"pattern_angle\");\n choose(baseProps, \"pattern_u_flip\");\n choose(baseProps, \"pattern_flip\");\n choose(baseProps, \"pattern_scale\");\n choose(baseProps, \"pattern_offset\");\n choose(baseProps, \"pattern_scalemode\");\n choose(baseProps, \"pattern_mapping\");\n choose(baseProps, \"pattern_weight\");\n choose(baseProps, \"pattern_useConstantLod\");\n choose(baseProps, \"pattern_constantlod_repetitions\");\n choose(baseProps, \"pattern_constantlod_offset\");\n choose(baseProps, \"pattern_constantlod_mindistanceclamp\");\n choose(baseProps, \"pattern_constantlod_maxdistanceclamp\");\n\n maps = {};\n if (params.patternMap)\n maps.Pattern = { ...params.patternMap, ...baseProps };\n\n if (params.normalMap) {\n maps.Normal = {\n ...params.normalMap,\n ...baseProps,\n };\n\n delete (maps.Normal as any).scale;\n }\n }\n\n // const map = undefined !== params.patternMap ? { Pattern: params.patternMap } : undefined;\n const renderMaterialProps: RenderMaterialProps = {\n classFullName: this.classFullName,\n code: this.createCode(iModelDb, definitionModelId, materialName),\n paletteName: params.paletteName,\n description: params.description,\n jsonProperties: {\n materialAssets: {\n renderMaterial: {\n HasBaseColor: params.color !== undefined,\n color: params.color,\n HasSpecularColor: params.specularColor !== undefined,\n specular_color: params.specularColor,\n HasFinish: params.finish !== undefined,\n finish: params.finish,\n HasTransmit: params.transmit !== undefined,\n transmit: params.transmit,\n HasDiffuse: params.diffuse !== undefined,\n diffuse: params.diffuse,\n HasSpecular: params.specular !== undefined,\n specular: params.specular,\n HasReflect: params.reflect !== undefined,\n reflect: params.reflect,\n HasReflectColor: params.reflectColor !== undefined,\n reflect_color: params.reflectColor,\n Map: maps,\n pbr_normal,\n },\n },\n },\n model: definitionModelId,\n isPrivate: false,\n };\n\n return new RenderMaterialElement(renderMaterialProps, iModelDb);\n }\n\n /**\n * Insert a new RenderMaterial into a model.\n * @param iModelDb Insert into this iModel\n * @param definitionModelId Insert the new Texture into this DefinitionModel\n * @param materialName The name/CodeValue of the RenderMaterial\n * @param params Parameters object which describes how to construct the RenderMaterial\n * @returns The Id of the newly inserted RenderMaterial element.\n * @throws [[IModelError]] if unable to insert the element.\n */\n public static insert(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): Id64String {\n const renderMaterial = this.create(iModelDb, definitionModelId, materialName, params);\n return iModelDb.elements.insertElement(renderMaterial.toJSON());\n }\n\n /** @internal */\n protected static override onCloned(context: IModelElementCloneContext, sourceProps: ElementProps, targetProps: ElementProps) {\n super.onCloned(context, sourceProps, targetProps);\n for (const mapName in sourceProps.jsonProperties?.materialAssets?.renderMaterial?.Map ?? {}) {\n if (typeof mapName !== \"string\")\n continue;\n const sourceMap = sourceProps.jsonProperties.materialAssets.renderMaterial.Map[mapName];\n if (!Id64.isValid(sourceMap.TextureId) || sourceMap.TextureId === undefined)\n continue;\n targetProps.jsonProperties.materialAssets.renderMaterial.Map[mapName].TextureId = context.findTargetElementId(sourceMap.TextureId ?? Id64.invalid);\n }\n }\n}\n\n/** @public */\nexport namespace RenderMaterialElement { // eslint-disable-line no-redeclare\n /** Parameters used to construct a [[RenderMaterial]].\n * The persistent JSON representation - [RenderMaterialAssetProps]($common) - is quite verbose and unwieldy. This representation simplifies it somewhat.\n * @see [[RenderMaterialElement.create]] and [[RenderMaterialElement.insert]] to create a [[RenderMaterial]] from parameters of this type.\n * @deprecated in 3.6 because it is not useful to use a `class` - just use [[RenderMaterialElementParams]] directly instead.\n */\n export class Params {\n /** A required palette name that categorizes this RenderMaterial */\n public paletteName: string;\n /** An optional description of this RenderMaterial */\n public description?: string;\n /** If defined, the color to use for surface fill or diffuse illumination, overriding the surface's own color. */\n public color?: RgbFactorProps;\n /** The color to use for specular illumination. Default: black. */\n public specularColor?: RgbFactorProps;\n /** The specular exponent describing the surface's shininess, in the range 0 through 128.\n * Default: 0.\n */\n public finish?: number;\n /** A transparency to be applied to the surface, ranging from 0 (fully opaque) to 1 (fully transparent).\n * The surface's own transparency will be multiplied by `(1 - transmit)`. permitting the material to increase but not decrease the surface transparency.\n * Default: 13.5.\n */\n public transmit?: number;\n /** The surface's diffuse reflectivity from 0.0 to 1.0. Default: 0.6. */\n public diffuse?: number;\n /** The surface's specular reflectivity from 0.0 to 1.0. Default: 0.0. */\n public specular?: number;\n /** Currently unused. */\n public reflect?: number;\n /** Currently unused. */\n public reflectColor?: number[];\n /** Specifies a texture image to map onto the surface, replacing or mixing with the surface's own color and transparency.\n * @note With the exception of `TextureId`, the [TextureMapProps]($common) of [[patternMap]] and [[normalMap]] are expected to be identical. If a property is defined in both\n * [[patternMap]]] and [[normalMap]], the value in [[patternMap]] takes precedence.\n */\n public patternMap?: TextureMapProps;\n /** Specifies a [normal map](https://en.wikipedia.org/wiki/Normal_mapping) to apply to the surface to simulate more surface detail than is present in the\n * surface's geometry.\n * @note With the exception of `TextureId`, the [TextureMapProps]($common) of [[patternMap]] and [[normalMap]] are expected to be identical. If a property is defined in both\n * [[patternMap]]] and [[normalMap]], the value in [[patternMap]] takes precedence.\n */\n public normalMap?: NormalMapProps & {\n /** A factor by which to multiply the components of the normal vectors read from the texture.\n * Default: 1.\n */\n scale?: number;\n };\n\n /** Construct a new RenderMaterial.Params object with the specified paletteName. Alter the public members on that object to specify settings. */\n public constructor(paletteName: string) {\n this.paletteName = paletteName;\n }\n }\n}\n\n/** Parameters used to create a [[RenderMaterial]] element.\n * The persistent JSON representation - [RenderMaterialAssetProps]($common) - is quite verbose and unwieldy. This representation simplifies it somewhat.\n * @see [[RenderMaterialElement.create]] and [[RenderMaterialElement.insert]] to create a [[RenderMaterial]] from parameters of this type.\n * @public\n */\nexport interface RenderMaterialElementParams extends RenderMaterialElement.Params { // eslint-disable-line deprecation/deprecation, @typescript-eslint/no-empty-interface\n}\n"]}
|
|
@@ -19,7 +19,7 @@ export interface DownloadAndOpenArgs {
|
|
|
19
19
|
*/
|
|
20
20
|
export declare class RpcBriefcaseUtility {
|
|
21
21
|
private static downloadAndOpen;
|
|
22
|
-
private static
|
|
22
|
+
private static _briefcasePromises;
|
|
23
23
|
private static openBriefcase;
|
|
24
24
|
/** find a previously opened iModel for RPC.
|
|
25
25
|
* @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request
|
|
@@ -27,11 +27,19 @@ export declare class RpcBriefcaseUtility {
|
|
|
27
27
|
* @param the IModelRpcProps to locate the opened iModel.
|
|
28
28
|
*/
|
|
29
29
|
static findOpenIModel(accessToken: AccessToken, iModel: IModelRpcProps): Promise<IModelDb>;
|
|
30
|
+
static open(args: DownloadAndOpenArgs & {
|
|
31
|
+
syncMode: SyncMode.FixedVersion;
|
|
32
|
+
}): Promise<IModelDb>;
|
|
30
33
|
/**
|
|
31
|
-
*
|
|
32
|
-
* a RpcPendingResponse exception is thrown
|
|
34
|
+
* @deprecated in 4.4.0 - only `SyncMode.FixedVersion` should be used in RPC backends
|
|
33
35
|
*/
|
|
34
|
-
static open(args: DownloadAndOpenArgs
|
|
35
|
-
|
|
36
|
+
static open(args: DownloadAndOpenArgs & {
|
|
37
|
+
syncMode: Exclude<SyncMode, "FixedVersion">;
|
|
38
|
+
}): Promise<IModelDb>;
|
|
39
|
+
static openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode.FixedVersion, timeout?: number): Promise<IModelConnectionProps>;
|
|
40
|
+
/**
|
|
41
|
+
* @deprecated in 4.4.0 - only `SyncMode.FixedVersion` should be used in RPC backends
|
|
42
|
+
*/
|
|
43
|
+
static openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: Exclude<SyncMode, "FixedVersion">, timeout?: number): Promise<IModelConnectionProps>;
|
|
36
44
|
}
|
|
37
45
|
//# sourceMappingURL=RpcBriefcaseUtility.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcBriefcaseUtility.d.ts","sourceRoot":"","sources":["../../../src/rpc-impl/RpcBriefcaseUtility.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAA0D,MAAM,qBAAqB,CAAC;AAC1G,OAAO,EACL,cAAc,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,cAAc,EAAiB,WAAW,EAAsB,QAAQ,EACpI,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAe,QAAQ,EAAc,MAAM,aAAa,CAAC;AAMhE,gBAAgB;AAChB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,KAAK,MAAM,CAAC,EAAE,CAAC;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AACD;;;GAGG;AACH,qBAAa,mBAAmB;mBAET,eAAe;IA2DpC,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"RpcBriefcaseUtility.d.ts","sourceRoot":"","sources":["../../../src/rpc-impl/RpcBriefcaseUtility.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAA0D,MAAM,qBAAqB,CAAC;AAC1G,OAAO,EACL,cAAc,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,cAAc,EAAiB,WAAW,EAAsB,QAAQ,EACpI,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAe,QAAQ,EAAc,MAAM,aAAa,CAAC;AAMhE,gBAAgB;AAChB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,KAAK,MAAM,CAAC,EAAE,CAAC;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AACD;;;GAGG;AACH,qBAAa,mBAAmB;mBAET,eAAe;IA2DpC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAgD;mBAC5D,aAAa;IAelC;;;;OAIG;WACiB,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc;WAQ/D,IAAI,CAAC,IAAI,EAAE,mBAAmB,GAAG;QAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC3G;;OAEG;WAEiB,IAAI,CAAC,IAAI,EAAE,mBAAmB,GAAG;QAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;WAkEnG,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAC7K;;OAEG;WAEiB,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAQ1L"}
|
|
@@ -78,14 +78,17 @@ class RpcBriefcaseUtility {
|
|
|
78
78
|
return IModelDb_1.BriefcaseDb.open(props);
|
|
79
79
|
}
|
|
80
80
|
static async openBriefcase(args) {
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
const key = `${args.tokenProps.iModelId}:${args.tokenProps.changeset?.id}:${args.tokenProps.changeset?.index}:${args.syncMode}`;
|
|
82
|
+
const cachedPromise = this._briefcasePromises.get(key);
|
|
83
|
+
if (cachedPromise)
|
|
84
|
+
return cachedPromise;
|
|
83
85
|
try {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
+
const briefcasePromise = this.downloadAndOpen(args); // save the fact that we're working on downloading so if we timeout, we'll reuse this request.
|
|
87
|
+
this._briefcasePromises.set(key, briefcasePromise);
|
|
88
|
+
return await briefcasePromise;
|
|
86
89
|
}
|
|
87
90
|
finally {
|
|
88
|
-
this.
|
|
91
|
+
this._briefcasePromises.delete(key); // the download and open is now done
|
|
89
92
|
}
|
|
90
93
|
}
|
|
91
94
|
/** find a previously opened iModel for RPC.
|
|
@@ -158,8 +161,10 @@ class RpcBriefcaseUtility {
|
|
|
158
161
|
static async openWithTimeout(activity, tokenProps, syncMode, timeout = 1000) {
|
|
159
162
|
if (tokenProps.iModelId)
|
|
160
163
|
await IModelHost_1.IModelHost.tileStorage?.initialize(tokenProps.iModelId);
|
|
164
|
+
// eslint-disable-next-line deprecation/deprecation
|
|
161
165
|
return (await this.open({ activity, tokenProps, syncMode, timeout })).toJSON();
|
|
162
166
|
}
|
|
163
167
|
}
|
|
168
|
+
RpcBriefcaseUtility._briefcasePromises = new Map();
|
|
164
169
|
exports.RpcBriefcaseUtility = RpcBriefcaseUtility;
|
|
165
170
|
//# sourceMappingURL=RpcBriefcaseUtility.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcBriefcaseUtility.js","sourceRoot":"","sources":["../../../src/rpc-impl/RpcBriefcaseUtility.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module RpcInterface\n */\n\nimport { AccessToken, assert, BeDuration, BentleyError, IModelStatus, Logger } from \"@itwin/core-bentley\";\nimport {\n BriefcaseProps, IModelConnectionProps, IModelRpcOpenProps, IModelRpcProps, IModelVersion, RpcActivity, RpcPendingResponse, SyncMode,\n} from \"@itwin/core-common\";\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\nimport { BriefcaseManager, RequestNewBriefcaseArg } from \"../BriefcaseManager\";\nimport { CheckpointManager, CheckpointProps, V1CheckpointManager } from \"../CheckpointManager\";\nimport { BriefcaseDb, IModelDb, SnapshotDb } from \"../IModelDb\";\nimport { IModelHost } from \"../IModelHost\";\nimport { IModelJsFs } from \"../IModelJsFs\";\n\nconst loggerCategory: string = BackendLoggerCategory.IModelDb;\n\n/** @internal */\nexport interface DownloadAndOpenArgs {\n activity: RpcActivity; // eslint-disable-line deprecation/deprecation\n tokenProps: IModelRpcOpenProps;\n syncMode: SyncMode;\n fileNameResolvers?: ((arg: BriefcaseProps) => string)[];\n timeout?: number;\n forceDownload?: boolean;\n}\n/**\n * Utility to open the iModel for RPC interfaces\n * @internal\n */\nexport class RpcBriefcaseUtility {\n\n private static async downloadAndOpen(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\n const { activity, tokenProps } = args;\n const accessToken = activity.accessToken;\n assert(undefined !== tokenProps.iModelId);\n\n const iModelId = tokenProps.iModelId;\n let myBriefcaseIds: number[];\n if (args.syncMode === SyncMode.PullOnly) {\n myBriefcaseIds = [0]; // PullOnly means briefcaseId 0\n } else {\n // check with iModelHub and see if we already have acquired any briefcaseIds\n myBriefcaseIds = await IModelHost.hubAccess.getMyBriefcaseIds({ accessToken, iModelId });\n }\n\n const resolvers = args.fileNameResolvers ?? [(arg) => BriefcaseManager.getFileName(arg)];\n\n // see if we can open any of the briefcaseIds we already acquired from iModelHub\n if (resolvers) {\n for (const resolver of resolvers) {\n for (const briefcaseId of myBriefcaseIds) {\n const fileName = resolver({ briefcaseId, iModelId });\n if (IModelJsFs.existsSync(fileName)) {\n const briefcaseDb = BriefcaseDb.findByFilename(fileName);\n if (briefcaseDb !== undefined)\n return briefcaseDb as BriefcaseDb;\n try {\n if (args.forceDownload)\n throw new Error(); // causes delete below\n const db = await BriefcaseDb.open({ fileName });\n if (db.changeset.id !== tokenProps.changeset?.id) {\n assert(undefined !== tokenProps.changeset);\n const toIndex = tokenProps.changeset?.index ??\n (await IModelHost.hubAccess.getChangesetFromVersion({ accessToken, iModelId, version: IModelVersion.asOfChangeSet(tokenProps.changeset.id) })).index;\n await BriefcaseManager.pullAndApplyChangesets(db, { accessToken, toIndex });\n }\n return db;\n } catch (error: any) {\n if (!(error.errorNumber === IModelStatus.AlreadyOpen))\n // somehow we have this briefcaseId and the file exists, but we can't open it. Delete it.\n await BriefcaseManager.deleteBriefcaseFiles(fileName, accessToken);\n }\n }\n }\n }\n }\n\n // no local briefcase available. Download one and open it.\n assert(undefined !== tokenProps.iTwinId);\n const request: RequestNewBriefcaseArg = {\n accessToken,\n iTwinId: tokenProps.iTwinId,\n iModelId,\n briefcaseId: args.syncMode === SyncMode.PullOnly ? 0 : undefined, // if briefcaseId is undefined, we'll acquire a new one.\n };\n\n const props = await BriefcaseManager.downloadBriefcase(request);\n return BriefcaseDb.open(props);\n }\n\n private static _briefcasePromise: Promise<BriefcaseDb> | undefined;\n private static async openBriefcase(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\n if (this._briefcasePromise)\n return this._briefcasePromise;\n\n try {\n this._briefcasePromise = this.downloadAndOpen(args); // save the fact that we're working on downloading so if we timeout, we'll reuse this request.\n return await this._briefcasePromise;\n } finally {\n this._briefcasePromise = undefined; // the download and open is now done\n }\n }\n\n /** find a previously opened iModel for RPC.\n * @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request\n * to refresh the daemon, even though it will be used for all authorized users.\n * @param the IModelRpcProps to locate the opened iModel.\n */\n public static async findOpenIModel(accessToken: AccessToken, iModel: IModelRpcProps) {\n const iModelDb = IModelDb.findByKey(iModel.key);\n\n // call refreshContainer, just in case this is a V2 checkpoint whose sasToken is about to expire, or its default transaction is about to be restarted.\n await iModelDb.refreshContainer(accessToken);\n return iModelDb;\n }\n\n /**\n * Download and open a checkpoint or briefcase, ensuring the operation completes within a default timeout. If the time to open exceeds the timeout period,\n * a RpcPendingResponse exception is thrown\n */\n public static async open(args: DownloadAndOpenArgs): Promise<IModelDb> {\n const { activity, tokenProps, syncMode } = args;\n Logger.logTrace(loggerCategory, \"RpcBriefcaseUtility.open\", () => ({ ...tokenProps }));\n\n const timeout = args.timeout ?? 1000;\n if (syncMode === SyncMode.PullOnly || syncMode === SyncMode.PullAndPush) {\n const briefcaseDb = await BeDuration.race(timeout, this.openBriefcase(args));\n\n if (briefcaseDb === undefined) {\n Logger.logTrace(loggerCategory, \"Open briefcase - pending\", () => ({ ...tokenProps }));\n throw new RpcPendingResponse(); // eslint-disable-line deprecation/deprecation\n }\n // note: usage is logged in the function BriefcaseManager.downloadNewBriefcaseAndOpen\n return briefcaseDb;\n }\n\n assert(undefined !== tokenProps.iModelId);\n assert(undefined !== tokenProps.iTwinId);\n assert(undefined !== tokenProps.changeset);\n\n const checkpoint: CheckpointProps = {\n iModelId: tokenProps.iModelId,\n iTwinId: tokenProps.iTwinId,\n changeset: tokenProps.changeset,\n accessToken: activity.accessToken,\n };\n\n // opening a checkpoint, readonly.\n let db: SnapshotDb | void;\n // first check if it's already open\n db = SnapshotDb.tryFindByKey(CheckpointManager.getKey(checkpoint));\n if (db) {\n Logger.logTrace(loggerCategory, \"Checkpoint was already open\", () => ({ ...tokenProps }));\n return db;\n }\n\n try {\n // now try V2 checkpoint\n db = await SnapshotDb.openCheckpointV2(checkpoint);\n Logger.logTrace(loggerCategory, \"using V2 checkpoint briefcase\", () => ({ ...tokenProps }));\n } catch (e) {\n Logger.logTrace(loggerCategory, \"unable to open V2 checkpoint - falling back to V1 checkpoint\", () => ({ error: BentleyError.getErrorProps(e), ...tokenProps }));\n\n // this isn't a v2 checkpoint. Set up a race between the specified timeout period and the open. Throw an RpcPendingResponse exception if the timeout happens first.\n const request = {\n checkpoint,\n localFile: V1CheckpointManager.getFileName(checkpoint),\n aliasFiles: [],\n };\n db = await BeDuration.race(timeout, V1CheckpointManager.getCheckpointDb(request));\n\n if (db === undefined) {\n Logger.logTrace(loggerCategory, \"Open V1 checkpoint - pending\", () => ({ ...tokenProps }));\n throw new RpcPendingResponse(); // eslint-disable-line deprecation/deprecation\n }\n Logger.logTrace(loggerCategory, \"Opened V1 checkpoint\", () => ({ ...tokenProps }));\n }\n\n return db;\n }\n\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode, timeout: number = 1000): Promise<IModelConnectionProps> { // eslint-disable-line deprecation/deprecation\n if (tokenProps.iModelId)\n await IModelHost.tileStorage?.initialize(tokenProps.iModelId);\n return (await this.open({ activity, tokenProps, syncMode, timeout })).toJSON();\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RpcBriefcaseUtility.js","sourceRoot":"","sources":["../../../src/rpc-impl/RpcBriefcaseUtility.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module RpcInterface\n */\n\nimport { AccessToken, assert, BeDuration, BentleyError, IModelStatus, Logger } from \"@itwin/core-bentley\";\nimport {\n BriefcaseProps, IModelConnectionProps, IModelRpcOpenProps, IModelRpcProps, IModelVersion, RpcActivity, RpcPendingResponse, SyncMode,\n} from \"@itwin/core-common\";\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\nimport { BriefcaseManager, RequestNewBriefcaseArg } from \"../BriefcaseManager\";\nimport { CheckpointManager, CheckpointProps, V1CheckpointManager } from \"../CheckpointManager\";\nimport { BriefcaseDb, IModelDb, SnapshotDb } from \"../IModelDb\";\nimport { IModelHost } from \"../IModelHost\";\nimport { IModelJsFs } from \"../IModelJsFs\";\n\nconst loggerCategory: string = BackendLoggerCategory.IModelDb;\n\n/** @internal */\nexport interface DownloadAndOpenArgs {\n activity: RpcActivity; // eslint-disable-line deprecation/deprecation\n tokenProps: IModelRpcOpenProps;\n syncMode: SyncMode;\n fileNameResolvers?: ((arg: BriefcaseProps) => string)[];\n timeout?: number;\n forceDownload?: boolean;\n}\n/**\n * Utility to open the iModel for RPC interfaces\n * @internal\n */\nexport class RpcBriefcaseUtility {\n\n private static async downloadAndOpen(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\n const { activity, tokenProps } = args;\n const accessToken = activity.accessToken;\n assert(undefined !== tokenProps.iModelId);\n\n const iModelId = tokenProps.iModelId;\n let myBriefcaseIds: number[];\n if (args.syncMode === SyncMode.PullOnly) {\n myBriefcaseIds = [0]; // PullOnly means briefcaseId 0\n } else {\n // check with iModelHub and see if we already have acquired any briefcaseIds\n myBriefcaseIds = await IModelHost.hubAccess.getMyBriefcaseIds({ accessToken, iModelId });\n }\n\n const resolvers = args.fileNameResolvers ?? [(arg) => BriefcaseManager.getFileName(arg)];\n\n // see if we can open any of the briefcaseIds we already acquired from iModelHub\n if (resolvers) {\n for (const resolver of resolvers) {\n for (const briefcaseId of myBriefcaseIds) {\n const fileName = resolver({ briefcaseId, iModelId });\n if (IModelJsFs.existsSync(fileName)) {\n const briefcaseDb = BriefcaseDb.findByFilename(fileName);\n if (briefcaseDb !== undefined)\n return briefcaseDb as BriefcaseDb;\n try {\n if (args.forceDownload)\n throw new Error(); // causes delete below\n const db = await BriefcaseDb.open({ fileName });\n if (db.changeset.id !== tokenProps.changeset?.id) {\n assert(undefined !== tokenProps.changeset);\n const toIndex = tokenProps.changeset?.index ??\n (await IModelHost.hubAccess.getChangesetFromVersion({ accessToken, iModelId, version: IModelVersion.asOfChangeSet(tokenProps.changeset.id) })).index;\n await BriefcaseManager.pullAndApplyChangesets(db, { accessToken, toIndex });\n }\n return db;\n } catch (error: any) {\n if (!(error.errorNumber === IModelStatus.AlreadyOpen))\n // somehow we have this briefcaseId and the file exists, but we can't open it. Delete it.\n await BriefcaseManager.deleteBriefcaseFiles(fileName, accessToken);\n }\n }\n }\n }\n }\n\n // no local briefcase available. Download one and open it.\n assert(undefined !== tokenProps.iTwinId);\n const request: RequestNewBriefcaseArg = {\n accessToken,\n iTwinId: tokenProps.iTwinId,\n iModelId,\n briefcaseId: args.syncMode === SyncMode.PullOnly ? 0 : undefined, // if briefcaseId is undefined, we'll acquire a new one.\n };\n\n const props = await BriefcaseManager.downloadBriefcase(request);\n return BriefcaseDb.open(props);\n }\n\n private static _briefcasePromises: Map<string, Promise<BriefcaseDb>> = new Map();\n private static async openBriefcase(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\n const key = `${args.tokenProps.iModelId}:${args.tokenProps.changeset?.id}:${args.tokenProps.changeset?.index}:${args.syncMode}`;\n const cachedPromise = this._briefcasePromises.get(key);\n if (cachedPromise)\n return cachedPromise;\n\n try {\n const briefcasePromise = this.downloadAndOpen(args); // save the fact that we're working on downloading so if we timeout, we'll reuse this request.\n this._briefcasePromises.set(key, briefcasePromise);\n return await briefcasePromise;\n } finally {\n this._briefcasePromises.delete(key); // the download and open is now done\n }\n }\n\n /** find a previously opened iModel for RPC.\n * @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request\n * to refresh the daemon, even though it will be used for all authorized users.\n * @param the IModelRpcProps to locate the opened iModel.\n */\n public static async findOpenIModel(accessToken: AccessToken, iModel: IModelRpcProps) {\n const iModelDb = IModelDb.findByKey(iModel.key);\n\n // call refreshContainer, just in case this is a V2 checkpoint whose sasToken is about to expire, or its default transaction is about to be restarted.\n await iModelDb.refreshContainer(accessToken);\n return iModelDb;\n }\n\n public static async open(args: DownloadAndOpenArgs & {syncMode: SyncMode.FixedVersion }): Promise<IModelDb>;\n /**\n * @deprecated in 4.4.0 - only `SyncMode.FixedVersion` should be used in RPC backends\n */\n // eslint-disable-next-line @typescript-eslint/unified-signatures -- these are separate to explicitly deprecate some SyncMode members.\n public static async open(args: DownloadAndOpenArgs & {syncMode: Exclude<SyncMode, \"FixedVersion\"> }): Promise<IModelDb>;\n /**\n * Download and open a checkpoint or briefcase, ensuring the operation completes within a default timeout. If the time to open exceeds the timeout period,\n * a RpcPendingResponse exception is thrown\n */\n public static async open(args: DownloadAndOpenArgs): Promise<IModelDb> {\n const { activity, tokenProps, syncMode } = args;\n Logger.logTrace(loggerCategory, \"RpcBriefcaseUtility.open\", () => ({ ...tokenProps }));\n\n const timeout = args.timeout ?? 1000;\n if (syncMode === SyncMode.PullOnly || syncMode === SyncMode.PullAndPush) {\n const briefcaseDb = await BeDuration.race(timeout, this.openBriefcase(args));\n\n if (briefcaseDb === undefined) {\n Logger.logTrace(loggerCategory, \"Open briefcase - pending\", () => ({ ...tokenProps }));\n throw new RpcPendingResponse(); // eslint-disable-line deprecation/deprecation\n }\n // note: usage is logged in the function BriefcaseManager.downloadNewBriefcaseAndOpen\n return briefcaseDb;\n }\n\n assert(undefined !== tokenProps.iModelId);\n assert(undefined !== tokenProps.iTwinId);\n assert(undefined !== tokenProps.changeset);\n\n const checkpoint: CheckpointProps = {\n iModelId: tokenProps.iModelId,\n iTwinId: tokenProps.iTwinId,\n changeset: tokenProps.changeset,\n accessToken: activity.accessToken,\n };\n\n // opening a checkpoint, readonly.\n let db: SnapshotDb | void;\n // first check if it's already open\n db = SnapshotDb.tryFindByKey(CheckpointManager.getKey(checkpoint));\n if (db) {\n Logger.logTrace(loggerCategory, \"Checkpoint was already open\", () => ({ ...tokenProps }));\n return db;\n }\n\n try {\n // now try V2 checkpoint\n db = await SnapshotDb.openCheckpointV2(checkpoint);\n Logger.logTrace(loggerCategory, \"using V2 checkpoint briefcase\", () => ({ ...tokenProps }));\n } catch (e) {\n Logger.logTrace(loggerCategory, \"unable to open V2 checkpoint - falling back to V1 checkpoint\", () => ({ error: BentleyError.getErrorProps(e), ...tokenProps }));\n\n // this isn't a v2 checkpoint. Set up a race between the specified timeout period and the open. Throw an RpcPendingResponse exception if the timeout happens first.\n const request = {\n checkpoint,\n localFile: V1CheckpointManager.getFileName(checkpoint),\n aliasFiles: [],\n };\n db = await BeDuration.race(timeout, V1CheckpointManager.getCheckpointDb(request));\n\n if (db === undefined) {\n Logger.logTrace(loggerCategory, \"Open V1 checkpoint - pending\", () => ({ ...tokenProps }));\n throw new RpcPendingResponse(); // eslint-disable-line deprecation/deprecation\n }\n Logger.logTrace(loggerCategory, \"Opened V1 checkpoint\", () => ({ ...tokenProps }));\n }\n\n return db;\n }\n\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode.FixedVersion, timeout?: number): Promise<IModelConnectionProps>;\n /**\n * @deprecated in 4.4.0 - only `SyncMode.FixedVersion` should be used in RPC backends\n */\n // eslint-disable-next-line @typescript-eslint/unified-signatures -- these are separate to explicitly deprecate some SyncMode members.\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: Exclude<SyncMode, \"FixedVersion\">, timeout?: number): Promise<IModelConnectionProps>;\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode, timeout: number = 1000): Promise<IModelConnectionProps> { // eslint-disable-line deprecation/deprecation\n if (tokenProps.iModelId)\n await IModelHost.tileStorage?.initialize(tokenProps.iModelId);\n // eslint-disable-next-line deprecation/deprecation\n return (await this.open({ activity, tokenProps, syncMode, timeout })).toJSON();\n }\n\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/core-backend",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0-dev.0",
|
|
4
4
|
"description": "iTwin.js backend components",
|
|
5
5
|
"main": "lib/cjs/core-backend.js",
|
|
6
6
|
"typings": "lib/cjs/core-backend",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"url": "http://www.bentley.com"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"@itwin/core-bentley": "^4.
|
|
29
|
-
"@itwin/core-common": "^4.
|
|
30
|
-
"@itwin/core-geometry": "^4.
|
|
28
|
+
"@itwin/core-bentley": "^4.5.0-dev.0",
|
|
29
|
+
"@itwin/core-common": "^4.5.0-dev.0",
|
|
30
|
+
"@itwin/core-geometry": "^4.5.0-dev.0",
|
|
31
31
|
"@opentelemetry/api": "^1.0.4"
|
|
32
32
|
},
|
|
33
33
|
"peerDependenciesMeta": {
|
|
@@ -69,19 +69,19 @@
|
|
|
69
69
|
"ts-node": "^10.8.2",
|
|
70
70
|
"typescript": "~5.0.2",
|
|
71
71
|
"webpack": "^5.76.0",
|
|
72
|
-
"@itwin/core-bentley": "4.
|
|
73
|
-
"@itwin/
|
|
74
|
-
"@itwin/
|
|
75
|
-
"@itwin/core-geometry": "4.
|
|
76
|
-
"@itwin/core-webpack-tools": "4.
|
|
77
|
-
"@itwin/ecsql-common": "4.
|
|
72
|
+
"@itwin/core-bentley": "4.5.0-dev.0",
|
|
73
|
+
"@itwin/build-tools": "4.5.0-dev.0",
|
|
74
|
+
"@itwin/core-common": "4.5.0-dev.0",
|
|
75
|
+
"@itwin/core-geometry": "4.5.0-dev.0",
|
|
76
|
+
"@itwin/core-webpack-tools": "4.5.0-dev.0",
|
|
77
|
+
"@itwin/ecsql-common": "4.5.0-dev.0",
|
|
78
78
|
"internal-tools": "3.0.0-dev.69"
|
|
79
79
|
},
|
|
80
80
|
"dependencies": {
|
|
81
|
-
"@bentley/imodeljs-native": "4.
|
|
81
|
+
"@bentley/imodeljs-native": "4.4.1",
|
|
82
82
|
"@itwin/cloud-agnostic-core": "^2.1.0",
|
|
83
|
-
"@itwin/object-storage-azure": "^2.
|
|
84
|
-
"@itwin/object-storage-core": "^2.
|
|
83
|
+
"@itwin/object-storage-azure": "^2.2.2",
|
|
84
|
+
"@itwin/object-storage-core": "^2.2.2",
|
|
85
85
|
"form-data": "^2.5.1",
|
|
86
86
|
"fs-extra": "^8.1.0",
|
|
87
87
|
"inversify": "~6.0.1",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"semver": "^7.3.5",
|
|
92
92
|
"touch": "^3.1.0",
|
|
93
93
|
"ws": "^7.5.3",
|
|
94
|
-
"@itwin/core-telemetry": "4.
|
|
94
|
+
"@itwin/core-telemetry": "4.5.0-dev.0"
|
|
95
95
|
},
|
|
96
96
|
"nyc": {
|
|
97
97
|
"extends": "./node_modules/@itwin/build-tools/.nycrc"
|