@itwin/imodel-transformer 0.4.1 → 0.4.2-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 CHANGED
@@ -1,12 +1,12 @@
1
1
  # Change Log - @itwin/imodel-transformer
2
2
 
3
- This log was last generated on Wed, 20 Sep 2023 15:34:05 GMT and should not be manually modified.
3
+ This log was last generated on Wed, 20 Sep 2023 15:35:21 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
7
  ## 0.4.1
8
8
 
9
- Wed, 20 Sep 2023 15:34:05 GMT
9
+ Wed, 20 Sep 2023 15:35:21 GMT
10
10
 
11
11
  ### Patches
12
12
 
@@ -1 +1 @@
1
- {"version":3,"file":"DetachedExportElementAspectsStrategy.d.ts","sourceRoot":"","sources":["../../src/DetachedExportElementAspectsStrategy.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAI9E;;;;;;;GAOG;AACH,qBAAa,oCAAqC,SAAQ,4BAA4B;IAC9D,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;YAoChD,iBAAiB;YAUhB,YAAY;IAsCL,8BAA8B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxF"}
1
+ {"version":3,"file":"DetachedExportElementAspectsStrategy.d.ts","sourceRoot":"","sources":["../../src/DetachedExportElementAspectsStrategy.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAI9E;;;;;;;GAOG;AACH,qBAAa,oCAAqC,SAAQ,4BAA4B;IAC9D,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;YAoChD,iBAAiB;YAUhB,YAAY;IAuCL,8BAA8B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxF"}
@@ -60,7 +60,7 @@ class DetachedExportElementAspectsStrategy extends ExportElementAspectsStrategy_
60
60
  async *queryAspects(baseElementAspectClassFullName) {
61
61
  const aspectClassNameIdMap = new Map();
62
62
  const optimizesAspectClassesSql = `
63
- SELECT c.ECInstanceId as classId, (ec_className(c.ECInstanceId, 's:c')) as className
63
+ SELECT c.ECInstanceId as classId, (ec_className(c.ECInstanceId, 's')) as schemaName, (ec_className(c.ECInstanceId, 'c')) as className
64
64
  FROM ECDbMeta.ClassHasAllBaseClasses r
65
65
  JOIN ECDbMeta.ECClassDef c ON c.ECInstanceId = r.SourceECInstanceId
66
66
  WHERE r.TargetECInstanceId = ec_classId(:baseClassName)
@@ -69,18 +69,19 @@ class DetachedExportElementAspectsStrategy extends ExportElementAspectsStrategy_
69
69
  const aspectClassesAsyncQueryReader = (0, ECSqlReaderAsyncIterableIteratorAdapter_1.ensureECSqlReaderIsAsyncIterableIterator)(aspectClassesQueryReader);
70
70
  for await (const rowProxy of aspectClassesAsyncQueryReader) {
71
71
  const row = rowProxy.toRow();
72
- aspectClassNameIdMap.set(row.className, row.classId);
72
+ aspectClassNameIdMap.set(row.classId, { schemaName: row.schemaName, className: row.className });
73
73
  }
74
- for (const [className, classId] of aspectClassNameIdMap) {
75
- if (this.excludedElementAspectClassFullNames.has(className))
74
+ for (const [classId, { schemaName, className }] of aspectClassNameIdMap) {
75
+ const classFullName = `${schemaName}:${className}`;
76
+ if (this.excludedElementAspectClassFullNames.has(classFullName))
76
77
  continue;
77
- const getAspectPropsSql = `SELECT * FROM ${className} WHERE ECClassId = :classId ORDER BY Element.Id`;
78
+ const getAspectPropsSql = `SELECT * FROM [${schemaName}]:[${className}] WHERE ECClassId = :classId ORDER BY Element.Id`;
78
79
  const aspectQueryReader = this.sourceDb.createQueryReader(getAspectPropsSql, new core_common_1.QueryBinder().bindId("classId", classId), { rowFormat: core_common_1.QueryRowFormat.UseJsPropertyNames });
79
80
  const aspectAsyncQueryReader = (0, ECSqlReaderAsyncIterableIteratorAdapter_1.ensureECSqlReaderIsAsyncIterableIterator)(aspectQueryReader);
80
81
  let firstDone = false;
81
82
  for await (const rowProxy of aspectAsyncQueryReader) {
82
83
  const row = rowProxy.toRow();
83
- const aspectProps = { ...row, classFullName: className, className: undefined }; // add in property required by EntityProps
84
+ const aspectProps = { ...row, classFullName, className: undefined }; // add in property required by EntityProps
84
85
  if (!firstDone) {
85
86
  firstDone = true;
86
87
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DetachedExportElementAspectsStrategy.js","sourceRoot":"","sources":["../../src/DetachedExportElementAspectsStrategy.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\nimport { ElementAspect, ElementMultiAspect, ElementUniqueAspect } from \"@itwin/core-backend\";\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { ExportElementAspectsStrategy } from \"./ExportElementAspectsStrategy\";\nimport { ensureECSqlReaderIsAsyncIterableIterator } from \"./ECSqlReaderAsyncIterableIteratorAdapter\";\nimport { ElementAspectProps, QueryBinder, QueryRowFormat } from \"@itwin/core-common\";\n\n/**\n * Detached ElementAspect export strategy for [[IModelExporter]].\n * This strategy exports all ElementAspects separately from the Elements that own them.\n *\n * @note Since aspects are exported separately from elements that own them, this strategy will export aspects of filtered out elements by default and\n * this needs to be handled by ElementAspectHandler\n * @internal\n */\nexport class DetachedExportElementAspectsStrategy extends ExportElementAspectsStrategy {\n public override async exportAllElementAspects(): Promise<void> {\n await this.exportAspectsLoop<ElementUniqueAspect>(ElementUniqueAspect.classFullName, async (uniqueAspect) => {\n const isInsertChange = this.aspectChanges?.insertIds.has(uniqueAspect.id) ?? false;\n const isUpdateChange = this.aspectChanges?.updateIds.has(uniqueAspect.id) ?? false;\n const doExport = this.aspectChanges === undefined || isInsertChange || isUpdateChange;\n if (doExport) {\n const isKnownUpdate = this.aspectChanges ? isUpdateChange : undefined;\n this.handler.onExportElementUniqueAspect(uniqueAspect, isKnownUpdate);\n await this.handler.trackProgress();\n }\n });\n\n let batchedElementMultiAspects: ElementMultiAspect[] = [];\n await this.exportAspectsLoop<ElementMultiAspect>(ElementMultiAspect.classFullName, async (multiAspect) => {\n if (batchedElementMultiAspects.length === 0) {\n batchedElementMultiAspects.push(multiAspect);\n return;\n }\n\n // element id changed so all element's aspects are in the array and can be exported\n if (batchedElementMultiAspects[0].element.id !== multiAspect.element.id) {\n this.handler.onExportElementMultiAspects(batchedElementMultiAspects);\n await this.handler.trackProgress();\n batchedElementMultiAspects = [];\n }\n\n batchedElementMultiAspects.push(multiAspect);\n });\n\n if (batchedElementMultiAspects.length > 0) {\n // aspects that are left in the array have not been exported\n this.handler.onExportElementMultiAspects(batchedElementMultiAspects);\n await this.handler.trackProgress();\n }\n }\n\n private async exportAspectsLoop<T extends ElementAspect>(baseAspectClass: string, exportAspect: (aspect: T) => Promise<void>) {\n for await (const aspect of this.queryAspects<T>(baseAspectClass)) {\n if (!this.shouldExportElementAspect(aspect)) {\n continue;\n }\n\n await exportAspect(aspect);\n }\n }\n\n private async *queryAspects<T extends ElementAspect>(baseElementAspectClassFullName: string) {\n const aspectClassNameIdMap = new Map<string, Id64String>();\n\n const optimizesAspectClassesSql = `\n SELECT c.ECInstanceId as classId, (ec_className(c.ECInstanceId, 's:c')) as className\n FROM ECDbMeta.ClassHasAllBaseClasses r\n JOIN ECDbMeta.ECClassDef c ON c.ECInstanceId = r.SourceECInstanceId\n WHERE r.TargetECInstanceId = ec_classId(:baseClassName)\n `;\n const aspectClassesQueryReader = this.sourceDb.createQueryReader(optimizesAspectClassesSql, new QueryBinder().bindString(\"baseClassName\", baseElementAspectClassFullName));\n const aspectClassesAsyncQueryReader = ensureECSqlReaderIsAsyncIterableIterator(aspectClassesQueryReader);\n for await (const rowProxy of aspectClassesAsyncQueryReader) {\n const row = rowProxy.toRow();\n aspectClassNameIdMap.set(row.className, row.classId);\n }\n\n for (const [className, classId] of aspectClassNameIdMap) {\n if(this.excludedElementAspectClassFullNames.has(className))\n continue;\n\n const getAspectPropsSql = `SELECT * FROM ${className} WHERE ECClassId = :classId ORDER BY Element.Id`;\n const aspectQueryReader = this.sourceDb.createQueryReader(getAspectPropsSql, new QueryBinder().bindId(\"classId\", classId), { rowFormat: QueryRowFormat.UseJsPropertyNames });\n const aspectAsyncQueryReader = ensureECSqlReaderIsAsyncIterableIterator(aspectQueryReader);\n let firstDone = false;\n for await (const rowProxy of aspectAsyncQueryReader) {\n const row = rowProxy.toRow();\n const aspectProps: ElementAspectProps = { ...row, classFullName: className, className: undefined }; // add in property required by EntityProps\n if (!firstDone) {\n firstDone = true;\n }\n delete (aspectProps as any).className; // clear property from SELECT * that we don't want in the final instance\n const aspectEntity = this.sourceDb.constructEntity<T>(aspectProps);\n\n yield aspectEntity;\n }\n }\n }\n\n public override async exportElementAspectsForElement(_elementId: string): Promise<void> {\n // All aspects are exported separately from their elements and don't need to be exported when element is exported.\n }\n}\n"]}
1
+ {"version":3,"file":"DetachedExportElementAspectsStrategy.js","sourceRoot":"","sources":["../../src/DetachedExportElementAspectsStrategy.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\nimport { ElementAspect, ElementMultiAspect, ElementUniqueAspect } from \"@itwin/core-backend\";\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { ExportElementAspectsStrategy } from \"./ExportElementAspectsStrategy\";\nimport { ensureECSqlReaderIsAsyncIterableIterator } from \"./ECSqlReaderAsyncIterableIteratorAdapter\";\nimport { ElementAspectProps, QueryBinder, QueryRowFormat } from \"@itwin/core-common\";\n\n/**\n * Detached ElementAspect export strategy for [[IModelExporter]].\n * This strategy exports all ElementAspects separately from the Elements that own them.\n *\n * @note Since aspects are exported separately from elements that own them, this strategy will export aspects of filtered out elements by default and\n * this needs to be handled by ElementAspectHandler\n * @internal\n */\nexport class DetachedExportElementAspectsStrategy extends ExportElementAspectsStrategy {\n public override async exportAllElementAspects(): Promise<void> {\n await this.exportAspectsLoop<ElementUniqueAspect>(ElementUniqueAspect.classFullName, async (uniqueAspect) => {\n const isInsertChange = this.aspectChanges?.insertIds.has(uniqueAspect.id) ?? false;\n const isUpdateChange = this.aspectChanges?.updateIds.has(uniqueAspect.id) ?? false;\n const doExport = this.aspectChanges === undefined || isInsertChange || isUpdateChange;\n if (doExport) {\n const isKnownUpdate = this.aspectChanges ? isUpdateChange : undefined;\n this.handler.onExportElementUniqueAspect(uniqueAspect, isKnownUpdate);\n await this.handler.trackProgress();\n }\n });\n\n let batchedElementMultiAspects: ElementMultiAspect[] = [];\n await this.exportAspectsLoop<ElementMultiAspect>(ElementMultiAspect.classFullName, async (multiAspect) => {\n if (batchedElementMultiAspects.length === 0) {\n batchedElementMultiAspects.push(multiAspect);\n return;\n }\n\n // element id changed so all element's aspects are in the array and can be exported\n if (batchedElementMultiAspects[0].element.id !== multiAspect.element.id) {\n this.handler.onExportElementMultiAspects(batchedElementMultiAspects);\n await this.handler.trackProgress();\n batchedElementMultiAspects = [];\n }\n\n batchedElementMultiAspects.push(multiAspect);\n });\n\n if (batchedElementMultiAspects.length > 0) {\n // aspects that are left in the array have not been exported\n this.handler.onExportElementMultiAspects(batchedElementMultiAspects);\n await this.handler.trackProgress();\n }\n }\n\n private async exportAspectsLoop<T extends ElementAspect>(baseAspectClass: string, exportAspect: (aspect: T) => Promise<void>) {\n for await (const aspect of this.queryAspects<T>(baseAspectClass)) {\n if (!this.shouldExportElementAspect(aspect)) {\n continue;\n }\n\n await exportAspect(aspect);\n }\n }\n\n private async *queryAspects<T extends ElementAspect>(baseElementAspectClassFullName: string) {\n const aspectClassNameIdMap = new Map<Id64String, { schemaName: string, className: string }>();\n\n const optimizesAspectClassesSql = `\n SELECT c.ECInstanceId as classId, (ec_className(c.ECInstanceId, 's')) as schemaName, (ec_className(c.ECInstanceId, 'c')) as className\n FROM ECDbMeta.ClassHasAllBaseClasses r\n JOIN ECDbMeta.ECClassDef c ON c.ECInstanceId = r.SourceECInstanceId\n WHERE r.TargetECInstanceId = ec_classId(:baseClassName)\n `;\n const aspectClassesQueryReader = this.sourceDb.createQueryReader(optimizesAspectClassesSql, new QueryBinder().bindString(\"baseClassName\", baseElementAspectClassFullName));\n const aspectClassesAsyncQueryReader = ensureECSqlReaderIsAsyncIterableIterator(aspectClassesQueryReader);\n for await (const rowProxy of aspectClassesAsyncQueryReader) {\n const row = rowProxy.toRow();\n aspectClassNameIdMap.set(row.classId, { schemaName: row.schemaName, className: row.className });\n }\n\n for (const [classId, { schemaName, className }] of aspectClassNameIdMap) {\n const classFullName = `${schemaName}:${className}`;\n if(this.excludedElementAspectClassFullNames.has(classFullName))\n continue;\n\n const getAspectPropsSql = `SELECT * FROM [${schemaName}]:[${className}] WHERE ECClassId = :classId ORDER BY Element.Id`;\n const aspectQueryReader = this.sourceDb.createQueryReader(getAspectPropsSql, new QueryBinder().bindId(\"classId\", classId), { rowFormat: QueryRowFormat.UseJsPropertyNames });\n const aspectAsyncQueryReader = ensureECSqlReaderIsAsyncIterableIterator(aspectQueryReader);\n let firstDone = false;\n for await (const rowProxy of aspectAsyncQueryReader) {\n const row = rowProxy.toRow();\n const aspectProps: ElementAspectProps = { ...row, classFullName, className: undefined }; // add in property required by EntityProps\n if (!firstDone) {\n firstDone = true;\n }\n delete (aspectProps as any).className; // clear property from SELECT * that we don't want in the final instance\n const aspectEntity = this.sourceDb.constructEntity<T>(aspectProps);\n\n yield aspectEntity;\n }\n }\n }\n\n public override async exportElementAspectsForElement(_elementId: string): Promise<void> {\n // All aspects are exported separately from their elements and don't need to be exported when element is exported.\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/imodel-transformer",
3
- "version": "0.4.1",
3
+ "version": "0.4.2-dev.0",
4
4
  "description": "API for exporting an iModel's parts and also importing them into another iModel",
5
5
  "main": "lib/cjs/transformer.js",
6
6
  "typings": "lib/cjs/transformer",