@itwin/core-backend 5.15.0-dev.9 → 5.16.0-dev.2
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 +11 -1
- package/lib/cjs/BriefcaseManager.d.ts +2 -1
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +39 -9
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/ChangeUnifier.d.ts +82 -0
- package/lib/cjs/ChangeUnifier.d.ts.map +1 -0
- package/lib/cjs/ChangeUnifier.js +163 -0
- package/lib/cjs/ChangeUnifier.js.map +1 -0
- package/lib/cjs/ChangesetReader.d.ts +21 -2
- package/lib/cjs/ChangesetReader.d.ts.map +1 -1
- package/lib/cjs/ChangesetReader.js +37 -1
- package/lib/cjs/ChangesetReader.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +15 -0
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +1 -0
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +4 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/EditTxn.d.ts +5 -0
- package/lib/cjs/EditTxn.d.ts.map +1 -1
- package/lib/cjs/EditTxn.js +30 -10
- package/lib/cjs/EditTxn.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.d.ts +1 -0
- package/lib/cjs/GeoCoordConfig.d.ts.map +1 -1
- package/lib/cjs/GeoCoordConfig.js +12 -8
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +19 -6
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +50 -9
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/NativeHost.d.ts.map +1 -1
- package/lib/cjs/NativeHost.js +5 -1
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/Relationship.d.ts +28 -0
- package/lib/cjs/Relationship.d.ts.map +1 -1
- package/lib/cjs/Relationship.js +78 -0
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/SchemaSync.d.ts.map +1 -1
- package/lib/cjs/SchemaSync.js +1 -0
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +126 -89
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +114 -76
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.d.ts.map +1 -1
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/ViewStore.d.ts.map +1 -1
- package/lib/cjs/ViewStore.js +62 -19
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js +3 -0
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/core-backend.d.ts +1 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +1 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/internal/BriefcaseUtils.d.ts +19 -0
- package/lib/cjs/internal/BriefcaseUtils.d.ts.map +1 -0
- package/lib/cjs/internal/BriefcaseUtils.js +65 -0
- package/lib/cjs/internal/BriefcaseUtils.js.map +1 -0
- package/lib/cjs/internal/QueryMetadataCache.d.ts +44 -0
- package/lib/cjs/internal/QueryMetadataCache.d.ts.map +1 -0
- package/lib/cjs/internal/QueryMetadataCache.js +107 -0
- package/lib/cjs/internal/QueryMetadataCache.js.map +1 -0
- package/lib/cjs/internal/Symbols.d.ts +9 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +10 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +20 -6
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +6 -6
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts +2 -1
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +40 -10
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/ChangeUnifier.d.ts +82 -0
- package/lib/esm/ChangeUnifier.d.ts.map +1 -0
- package/lib/esm/ChangeUnifier.js +159 -0
- package/lib/esm/ChangeUnifier.js.map +1 -0
- package/lib/esm/ChangesetReader.d.ts +21 -2
- package/lib/esm/ChangesetReader.d.ts.map +1 -1
- package/lib/esm/ChangesetReader.js +38 -2
- package/lib/esm/ChangesetReader.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +15 -0
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/ECDb.d.ts +1 -0
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +4 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/EditTxn.d.ts +5 -0
- package/lib/esm/EditTxn.d.ts.map +1 -1
- package/lib/esm/EditTxn.js +32 -12
- package/lib/esm/EditTxn.js.map +1 -1
- package/lib/esm/GeoCoordConfig.d.ts +1 -0
- package/lib/esm/GeoCoordConfig.d.ts.map +1 -1
- package/lib/esm/GeoCoordConfig.js +12 -8
- package/lib/esm/GeoCoordConfig.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +19 -6
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +52 -11
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/NativeHost.d.ts.map +1 -1
- package/lib/esm/NativeHost.js +5 -1
- package/lib/esm/NativeHost.js.map +1 -1
- package/lib/esm/Relationship.d.ts +28 -0
- package/lib/esm/Relationship.d.ts.map +1 -1
- package/lib/esm/Relationship.js +78 -0
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/SchemaSync.d.ts.map +1 -1
- package/lib/esm/SchemaSync.js +1 -0
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +126 -89
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +116 -78
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewStateHydrator.d.ts.map +1 -1
- package/lib/esm/ViewStateHydrator.js.map +1 -1
- package/lib/esm/ViewStore.d.ts.map +1 -1
- package/lib/esm/ViewStore.js +62 -19
- package/lib/esm/ViewStore.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js +3 -0
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/core-backend.d.ts +1 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +1 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/internal/BriefcaseUtils.d.ts +19 -0
- package/lib/esm/internal/BriefcaseUtils.d.ts.map +1 -0
- package/lib/esm/internal/BriefcaseUtils.js +61 -0
- package/lib/esm/internal/BriefcaseUtils.js.map +1 -0
- package/lib/esm/internal/QueryMetadataCache.d.ts +44 -0
- package/lib/esm/internal/QueryMetadataCache.d.ts.map +1 -0
- package/lib/esm/internal/QueryMetadataCache.js +103 -0
- package/lib/esm/internal/QueryMetadataCache.js.map +1 -0
- package/lib/esm/internal/Symbols.d.ts +9 -0
- package/lib/esm/internal/Symbols.d.ts.map +1 -1
- package/lib/esm/internal/Symbols.js +9 -0
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +20 -6
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts +6 -6
- package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js +15 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/ecdb/CTE.test.js +21 -0
- package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +144 -30
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryMetadataCache.test.d.ts +2 -0
- package/lib/esm/test/ecdb/QueryMetadataCache.test.d.ts.map +1 -0
- package/lib/esm/test/ecdb/QueryMetadataCache.test.js +630 -0
- package/lib/esm/test/ecdb/QueryMetadataCache.test.js.map +1 -0
- package/lib/esm/test/element/RelationshipBatchLookup.test.d.ts +2 -0
- package/lib/esm/test/element/RelationshipBatchLookup.test.d.ts.map +1 -0
- package/lib/esm/test/element/RelationshipBatchLookup.test.js +202 -0
- package/lib/esm/test/element/RelationshipBatchLookup.test.js.map +1 -0
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js +187 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.d.ts +2 -0
- package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.d.ts.map +1 -0
- package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.js +142 -0
- package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.js +8 -6
- package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -1
- package/lib/esm/test/imodel/IModelProps.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelProps.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelProps.test.js +411 -0
- package/lib/esm/test/imodel/IModelProps.test.js.map +1 -0
- package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.d.ts +2 -0
- package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.d.ts.map +1 -0
- package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.js +240 -0
- package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.js.map +1 -0
- package/lib/esm/test/schema/SchemaViewValidation.test.js +2 -8
- package/lib/esm/test/schema/SchemaViewValidation.test.js.map +1 -1
- package/lib/esm/test/standalone/BriefcaseManagerDelete.test.d.ts +2 -0
- package/lib/esm/test/standalone/BriefcaseManagerDelete.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/BriefcaseManagerDelete.test.js +159 -0
- package/lib/esm/test/standalone/BriefcaseManagerDelete.test.js.map +1 -0
- package/lib/esm/test/standalone/ChangeUnifier.test.d.ts +2 -0
- package/lib/esm/test/standalone/ChangeUnifier.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/ChangeUnifier.test.js +732 -0
- package/lib/esm/test/standalone/ChangeUnifier.test.js.map +1 -0
- package/lib/esm/test/standalone/EditTxn.test.js +72 -1
- package/lib/esm/test/standalone/EditTxn.test.js.map +1 -1
- package/lib/esm/test/standalone/GeoCoordConfig.test.d.ts +2 -0
- package/lib/esm/test/standalone/GeoCoordConfig.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/GeoCoordConfig.test.js +158 -0
- package/lib/esm/test/standalone/GeoCoordConfig.test.js.map +1 -0
- package/lib/esm/test/standalone/ViewStoreDb.test.js +53 -0
- package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
- package/package.json +18 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModelReadRpcImpl.js","sourceRoot":"","sources":["../../../src/rpc-impl/IModelReadRpcImpl.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EACQ,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAc,IAAI,EAAc,YAAY,EAAE,MAAM,GACtH,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,IAAI,EAGsF,iBAAiB,EAAE,MAAM,EACpD,WAAW,EAAE,sBAAsB,EAEnE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EACrE,QAAQ,EAC9B,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAG/D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAQhD,MAAM,wBAAyB,SAAQ,eAAuC;IAC3D,UAAU,CAAS;IAC5B,MAAM,CAAC,SAAS,CAA4B;IAE7C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAA4B;QACtD,IAAI,CAAC,IAAI,CAAC,SAAS;YACjB,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAwB,EAAE,CAAC;QAElD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED;QACE,MAAM,OAAO,GAAG,KAAK,EAAE,KAA4B,EAAE,EAAE;YACrD,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YACzF,MAAM,WAAW,GAAG,IAAI,wBAAwB,CAAC,EAAE,CAAC,CAAC;YACrD,OAAO,WAAW,CAAC,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,CAAC,KAA4B,EAAE,EAAE;YACjD,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;YAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YACxC,OAAO,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC9F,CAAC,CAAC;QAEF,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,KAA4B;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEjC,sEAAsE;QACtE,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAE5E,IAAI,IAAI,CAAC,SAAS;YAChB,MAAM,IAAI,kBAAkB,EAAE,CAAC,CAAC,0DAA0D;QAE5F,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxB,MAAM,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;CACF;AAED,SAAS,eAAe;IACtB,OAAO,QAAQ,CAAC,qBAAqB,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,UAA0B;IACvD,OAAO,mBAAmB,CAAC,cAAc,CAAC,QAAQ,CAAC,qBAAqB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AACpG,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IAE1C,MAAM,CAAC,QAAQ,KAAK,UAAU,CAAC,YAAY,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAEzF,KAAK,CAAC,kBAAkB,CAAC,UAA8B;QAC5D,OAAO,mBAAmB,CAAC,eAAe,CAAC,eAAe,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACnG,CAAC;IAEM,KAAK,CAAC,wBAAwB,CAAC,UAA0B,EAAE,OAAwC;QACxG,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC,WAAW,CAAC;QAClD,OAAO,wBAAwB,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,UAA0B,EAAE,OAAqC;QAC7F,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACrD,OAAO,YAAY,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAEM,KAAK,CAAC,gCAAgC,CAAC,UAA0B;QACtE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,gCAAgC,EAAE,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,UAA0B,EAAE,qBAAwC;QAClG,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,eAAe,GAAG,iBAAiB,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACjF,OAAO,QAAQ,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACtD,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,UAA0B,EAAE,OAAuB;QACxE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YAC3D,MAAM,CAAC,UAAU,CAAC,qBAAqB,CAAC,QAAQ,EAAE,2GAA2G,EAAE,OAAO,CAAC,CAAC;YACxK,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC;QACjC,CAAC;QACD,OAAO,eAAe,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,UAA0B,EAAE,OAAsB;QACvE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YAC3D,MAAM,CAAC,UAAU,CAAC,qBAAqB,CAAC,QAAQ,EAAE,2GAA2G,EAAE,OAAO,CAAC,CAAC;YACxK,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC;QACjC,CAAC;QACD,OAAO,eAAe,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,UAA0B,EAAE,QAAsB;QAC9E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,OAAO;YACpE,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;QAEzE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACxF,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,UAA0B,EAAE,QAAsB;QAC/E,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,UAA0B,EAAE,YAA0B;QAC/E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,cAAc,GAAiB,EAAE,CAAC;QACxC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBACrD,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;oBACrB,MAAM,KAAK,CAAC,CAAC,mEAAmE;YACpF,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,UAA0B,EAAE,MAAyB;QAChF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,UAA0B,EAAE,cAA4B;QACnF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,YAAY,GAAmB,EAAE,CAAC;QACxC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;oBACvB,MAAM,KAAK,CAAC,CAAC,qEAAqE;YACtF,CAAC;QACH,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,UAA0B,EAAE,UAA+C,EAAE,OAA4B;QACrI,MAAM,KAAK,GAAqB,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;gBACzB,KAAK,CAAC,EAAE,GAAG,UAAU,CAAC;;gBAEtB,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,UAA0B,EAAE,OAAoC;QAC9F,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACjD,OAAO,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,UAA0B,EAAE,MAAyB;QAClF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACvD,OAAO,GAAG,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,UAA0B,EAAE,MAAyB;QAC/E,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,UAA0B,EAAE,aAAqB;QAC9E,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,OAAO,IAAI,EAAE,CAAC;YACZ,4DAA4D;YAC5D,MAAM,aAAa,GAAmB,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;YAC1E,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC/B,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,aAAa,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;gBACtE,MAAM;YAER,aAAa,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,UAA0B;QACrD,MAAM,SAAS,GAAU,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,QAAQ,CAAC,eAAe,CAAC,uEAAuE,EAAE,CAAC,MAAM,EAAE,EAAE;YAC3G,KAAK,MAAM,GAAG,IAAI,MAAM;gBACtB,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACnG,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,UAA0B,EAAE,gBAAwB,EAAE,OAA4B;QAC9G,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,UAA0B;QAClD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,UAA0B,EAAE,SAAiB,EAAE,KAAuB;QAC7F,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,UAA0B,EAAE,SAAiB;QACnE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAAC,UAA0B,EAAE,KAAsC;QACpG,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,UAA0B,EAAE,KAAiC;QAC1F,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,6BAA6B,CAAC,UAA0B,EAAE,KAA6C;QAClH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QAEnD,MAAM,gCAAgC,GAAG,KAAK,EAAE,SAAiB,EAAE,EAAE;YACnE,IAAI,CAAC;gBACH,MAAM,eAAe,GAAkC,EAAE,CAAC;gBAE1D,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;oBAClC,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBACpG,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACvC,CAAC;gBAED,IAAI,qBAAqB,GAA4C,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,uDAAuD;gBAExK,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClE,qBAAqB,CAAC,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC;oBACrD,KAAK,MAAM,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;wBACpF,qBAAqB,GAAG,EAAE,GAAG,qBAAqB,EAAE,GAAG,CAAC,EAAE,CAAC;oBAC7D,CAAC;gBACH,CAAC;gBAED,OAAO,qBAAqB,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;YACpD,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAuD,EAAE,CAAC,CAAC,uDAAuD;QAEhI,KAAK,MAAM,SAAS,IAAI,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACrE,QAAQ,CAAC,IAAI,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,UAA0B,EAAE,EAAU;QACnE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC;IAC1D,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,gBAAgB,CAAC,UAA0B,EAAE,MAAc;QACtE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,MAAM;YACzD,MAAM,IAAI,cAAc,EAAE,CAAC;QAE7B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,4DAA4D;QACrH,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAI,0CAA0C;QAC/N,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,iDAAiD;QAC/E,OAAO,GAAG,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,UAA0B;QACtD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;YACzC,OAAO,IAAI,CAAC,OAAO,CAAC;QAEtB,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACM,KAAK,CAAC,oBAAoB,CAAC,UAA0B,EAAE,YAAoB;QAChF,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,UAAU,GAAoB,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAkB,MAAM,CAAC,YAAY,CAAC,CAAC;QACnG,OAAO,eAAe,CAAC,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACtF,CAAC;IAEM,KAAK,CAAC,sCAAsC,CAAC,UAA0B,EAAE,KAAoC;QAClH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,sCAAsC,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IAEM,KAAK,CAAC,sCAAsC,CAAC,UAA0B,EAAE,KAAiC;QAC/G,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,sCAAsC,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,UAA0B,EAAE,gBAAkC;QAC1F,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAAC,UAA0B,EAAE,KAA8B;QAC3F,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,aAAa,CAAC,UAA0B,EAAE,OAAe,EAAE,QAAiB,EAAE,UAAkB,EAAE,GAAG,IAAW;QAC3H,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAEnD,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/F,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAQ,CAAC;QAErE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QAChC,IAAI,OAAO,IAAI,KAAK,UAAU;YAC5B,MAAM,IAAI,WAAW,CAAC,YAAY,CAAC,gBAAgB,EAAE,+BAA+B,UAAU,GAAG,CAAC,CAAC;QAErG,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IACpC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\nimport {\r\n AccessToken, assert, BeDuration, BentleyStatus, CompressedId64Set, GuidString, Id64, Id64String, IModelStatus, Logger,\r\n} from \"@itwin/core-bentley\";\r\nimport {\r\n Code, CodeProps, CustomViewState3dCreatorOptions, CustomViewState3dProps, DbBlobRequest, DbBlobResponse, DbQueryRequest, DbQueryResponse,\r\n ElementLoadOptions, ElementLoadProps, ElementMeshRequestProps, ElementProps, EntityMetaData, EntityQueryParams, FontMapProps,\r\n GeoCoordinatesRequestProps, GeoCoordinatesResponseProps, GeometryContainmentRequestProps, GeometryContainmentResponseProps,\r\n GeometrySummaryRequestProps, HydrateViewStateRequestProps, HydrateViewStateResponseProps, ImageSourceFormat, IModel, IModelConnectionProps,\r\n IModelCoordinatesRequestProps, IModelCoordinatesResponseProps, IModelError, IModelReadRpcInterface, IModelRpcOpenProps, IModelRpcProps,\r\n MassPropertiesPerCandidateRequestProps, MassPropertiesPerCandidateResponseProps, MassPropertiesRequestProps, MassPropertiesResponseProps,\r\n ModelExtentsProps, ModelProps, NoContentError, RpcInterface, RpcManager, RpcPendingResponse, SnapRequestProps, SnapResponseProps,\r\n SubCategoryResultRow, SyncMode, TextureData, TextureLoadProps, ViewStateLoadProps, ViewStateProps,\r\n ViewStoreRpc,\r\n} from \"@itwin/core-common\";\r\nimport { Range3dProps } from \"@itwin/core-geometry\";\r\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\r\nimport { SpatialCategory } from \"../Category\";\r\nimport { ConcurrentQuery } from \"../ConcurrentQuery\";\r\nimport { CustomViewState3dCreator } from \"../CustomViewState3dCreator\";\r\nimport { generateGeometrySummaries } from \"../GeometrySummary\";\r\nimport { IModelDb } from \"../IModelDb\";\r\nimport { DictionaryModel } from \"../Model\";\r\nimport { PromiseMemoizer } from \"../PromiseMemoizer\";\r\nimport { RpcTrace } from \"../rpc/tracing\";\r\nimport { ViewStateHydrator } from \"../ViewStateHydrator\";\r\nimport { RpcBriefcaseUtility } from \"./RpcBriefcaseUtility\";\r\nimport { _nativeDb } from \"../internal/Symbols\";\r\n\r\ninterface ViewStateRequestProps {\r\n accessToken: AccessToken;\r\n tokenProps: IModelRpcProps;\r\n options: CustomViewState3dCreatorOptions;\r\n}\r\n\r\nclass ViewStateRequestMemoizer extends PromiseMemoizer<CustomViewState3dProps> {\r\n private readonly _timeoutMs: number;\r\n private static _instance?: ViewStateRequestMemoizer;\r\n\r\n public static async perform(props: ViewStateRequestProps): Promise<CustomViewState3dProps> {\r\n if (!this._instance)\r\n this._instance = new ViewStateRequestMemoizer();\r\n\r\n return this._instance.perform(props);\r\n }\r\n\r\n private constructor() {\r\n const memoize = async (props: ViewStateRequestProps) => {\r\n const db = await RpcBriefcaseUtility.findOpenIModel(props.accessToken, props.tokenProps);\r\n const viewCreator = new CustomViewState3dCreator(db);\r\n return viewCreator.getCustomViewState3dData(props.options);\r\n };\r\n\r\n const stringify = (props: ViewStateRequestProps) => {\r\n const token = props.tokenProps;\r\n const modelIds = props.options.modelIds;\r\n return `${token.key}-${token.iTwinId}-${token.iModelId}-${token.changeset?.id}:${modelIds}`;\r\n };\r\n\r\n super(memoize, stringify);\r\n this._timeoutMs = 20 * 1000;\r\n }\r\n\r\n private async perform(props: ViewStateRequestProps): Promise<CustomViewState3dProps> {\r\n const memo = this.memoize(props);\r\n\r\n // Rejections must be caught so that the memoization entry is deleted.\r\n await BeDuration.race(this._timeoutMs, memo.promise).catch(() => undefined);\r\n\r\n if (memo.isPending)\r\n throw new RpcPendingResponse(); // eslint-disable-line @typescript-eslint/only-throw-error\r\n\r\n this.deleteMemoized(props);\r\n\r\n if (memo.isFulfilled) {\r\n assert(undefined !== memo.result);\r\n return memo.result;\r\n }\r\n\r\n assert(memo.isRejected);\r\n throw memo.error;\r\n }\r\n}\r\n\r\nfunction currentActivity() {\r\n return RpcTrace.expectCurrentActivity;\r\n}\r\n\r\nasync function getIModelForRpc(tokenProps: IModelRpcProps): Promise<IModelDb> {\r\n return RpcBriefcaseUtility.findOpenIModel(RpcTrace.expectCurrentActivity.accessToken, tokenProps);\r\n}\r\n\r\n/** The backend implementation of IModelReadRpcInterface.\r\n * @internal\r\n */\r\nexport class IModelReadRpcImpl extends RpcInterface implements IModelReadRpcInterface {\r\n\r\n public static register() { RpcManager.registerImpl(IModelReadRpcInterface, IModelReadRpcImpl); }\r\n\r\n public async getConnectionProps(tokenProps: IModelRpcOpenProps): Promise<IModelConnectionProps> {\r\n return RpcBriefcaseUtility.openWithTimeout(currentActivity(), tokenProps, SyncMode.FixedVersion);\r\n }\r\n\r\n public async getCustomViewState3dData(tokenProps: IModelRpcProps, options: CustomViewState3dCreatorOptions): Promise<CustomViewState3dProps> {\r\n const accessToken = currentActivity().accessToken;\r\n return ViewStateRequestMemoizer.perform({ accessToken, tokenProps, options });\r\n }\r\n\r\n public async hydrateViewState(tokenProps: IModelRpcProps, options: HydrateViewStateRequestProps): Promise<HydrateViewStateResponseProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const viewHydrater = new ViewStateHydrator(iModelDb);\r\n return viewHydrater.getHydrateResponseProps(options);\r\n }\r\n\r\n public async queryAllUsedSpatialSubCategories(tokenProps: IModelRpcProps): Promise<SubCategoryResultRow[]> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.queryAllUsedSpatialSubCategories();\r\n }\r\n\r\n public async querySubCategories(tokenProps: IModelRpcProps, compressedCategoryIds: CompressedId64Set): Promise<SubCategoryResultRow[]> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const decompressedIds = CompressedId64Set.decompressArray(compressedCategoryIds);\r\n return iModelDb.querySubCategories(decompressedIds);\r\n }\r\n\r\n public async queryRows(tokenProps: IModelRpcProps, request: DbQueryRequest): Promise<DbQueryResponse> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n if (iModelDb.isReadonly && request.usePrimaryConn === true) {\r\n Logger.logWarning(BackendLoggerCategory.IModelDb, \"usePrimaryConn is only supported on imodel that is opened in read/write mode. The option will be ignored.\", request);\r\n request.usePrimaryConn = false;\r\n }\r\n return ConcurrentQuery.executeQueryRequest(iModelDb[_nativeDb], request);\r\n }\r\n\r\n public async queryBlob(tokenProps: IModelRpcProps, request: DbBlobRequest): Promise<DbBlobResponse> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n if (iModelDb.isReadonly && request.usePrimaryConn === true) {\r\n Logger.logWarning(BackendLoggerCategory.IModelDb, \"usePrimaryConn is only supported on imodel that is opened in read/write mode. The option will be ignored.\", request);\r\n request.usePrimaryConn = false;\r\n }\r\n return ConcurrentQuery.executeBlobRequest(iModelDb[_nativeDb], request);\r\n }\r\n\r\n public async queryModelRanges(tokenProps: IModelRpcProps, modelIds: Id64String[]): Promise<Range3dProps[]> {\r\n const results = await this.queryModelExtents(tokenProps, modelIds);\r\n if (results.length === 1 && results[0].status !== IModelStatus.Success)\r\n throw new IModelError(results[0].status, \"error querying model range\");\r\n\r\n return results.filter((x) => x.status === IModelStatus.Success).map((x) => x.extents);\r\n }\r\n\r\n public async queryModelExtents(tokenProps: IModelRpcProps, modelIds: Id64String[]): Promise<ModelExtentsProps[]> {\r\n const iModel = await getIModelForRpc(tokenProps);\r\n return iModel.models.queryExtents(modelIds);\r\n }\r\n\r\n public async getModelProps(tokenProps: IModelRpcProps, modelIdsList: Id64String[]): Promise<ModelProps[]> {\r\n const modelIds = new Set(modelIdsList);\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const modelJsonArray: ModelProps[] = [];\r\n for (const id of modelIds) {\r\n try {\r\n const modelProps = iModelDb.models.getModelProps(id);\r\n modelJsonArray.push(modelProps);\r\n } catch (error) {\r\n if (modelIds.size === 1)\r\n throw error; // if they're asking for more than one model, don't throw on error.\r\n }\r\n }\r\n return modelJsonArray;\r\n }\r\n\r\n public async queryModelProps(tokenProps: IModelRpcProps, params: EntityQueryParams): Promise<ModelProps[]> {\r\n const ids = await this.queryEntityIds(tokenProps, params);\r\n return this.getModelProps(tokenProps, [...ids]);\r\n }\r\n\r\n public async getElementProps(tokenProps: IModelRpcProps, elementIdsList: Id64String[]): Promise<ElementProps[]> {\r\n const elementIds = new Set(elementIdsList);\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const elementProps: ElementProps[] = [];\r\n for (const id of elementIds) {\r\n try {\r\n elementProps.push(iModelDb.elements.getElementProps({ id }));\r\n } catch (error) {\r\n if (elementIds.size === 1)\r\n throw error; // if they're asking for more than one element, don't throw on error.\r\n }\r\n }\r\n return elementProps;\r\n }\r\n\r\n public async loadElementProps(tokenProps: IModelRpcProps, identifier: Id64String | GuidString | CodeProps, options?: ElementLoadOptions): Promise<ElementProps | undefined> {\r\n const props: ElementLoadProps = options ? { ...options } : {};\r\n if (typeof identifier === \"string\") {\r\n if (Id64.isId64(identifier))\r\n props.id = identifier;\r\n else\r\n props.federationGuid = identifier;\r\n } else {\r\n props.code = Code.fromJSON(identifier);\r\n }\r\n\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.elements.tryGetElementProps(props);\r\n }\r\n\r\n public async getGeometrySummary(tokenProps: IModelRpcProps, request: GeometrySummaryRequestProps): Promise<string> {\r\n const iModel = await getIModelForRpc(tokenProps);\r\n return generateGeometrySummaries(request, iModel);\r\n }\r\n\r\n public async queryElementProps(tokenProps: IModelRpcProps, params: EntityQueryParams): Promise<ElementProps[]> {\r\n const ids = await this.queryEntityIds(tokenProps, params);\r\n const res = this.getElementProps(tokenProps, [...ids]);\r\n return res;\r\n }\r\n\r\n public async queryEntityIds(tokenProps: IModelRpcProps, params: EntityQueryParams): Promise<Id64String[]> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const res = iModelDb.queryEntityIds(params);\r\n return [...res];\r\n }\r\n\r\n public async getClassHierarchy(tokenProps: IModelRpcProps, classFullName: string): Promise<string[]> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const classArray: string[] = [];\r\n while (true) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const classMetaData: EntityMetaData = iModelDb.getMetaData(classFullName);\r\n classArray.push(classFullName);\r\n if (!classMetaData.baseClasses || classMetaData.baseClasses.length === 0)\r\n break;\r\n\r\n classFullName = classMetaData.baseClasses[0];\r\n }\r\n return classArray;\r\n }\r\n\r\n public async getAllCodeSpecs(tokenProps: IModelRpcProps): Promise<any[]> {\r\n const codeSpecs: any[] = [];\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n iModelDb.withQueryReader(\"SELECT ECInstanceId AS id, name, jsonProperties FROM BisCore.CodeSpec\", (reader) => {\r\n for (const row of reader)\r\n codeSpecs.push({ id: row.id, name: row.name, jsonProperties: JSON.parse(row.jsonProperties) });\r\n });\r\n return codeSpecs;\r\n }\r\n\r\n public async getViewStateData(tokenProps: IModelRpcProps, viewDefinitionId: string, options?: ViewStateLoadProps): Promise<ViewStateProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.views.getViewStateProps(viewDefinitionId, options);\r\n }\r\n\r\n public async readFontJson(tokenProps: IModelRpcProps): Promise<FontMapProps> { // eslint-disable-line @typescript-eslint/no-deprecated\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb[_nativeDb].readFontMap();\r\n }\r\n\r\n public async requestSnap(tokenProps: IModelRpcProps, sessionId: string, props: SnapRequestProps): Promise<SnapResponseProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.requestSnap(sessionId, props);\r\n }\r\n\r\n public async cancelSnap(tokenProps: IModelRpcProps, sessionId: string): Promise<void> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.cancelSnap(sessionId);\r\n }\r\n\r\n public async getGeometryContainment(tokenProps: IModelRpcProps, props: GeometryContainmentRequestProps): Promise<GeometryContainmentResponseProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.getGeometryContainment(props);\r\n }\r\n\r\n public async getMassProperties(tokenProps: IModelRpcProps, props: MassPropertiesRequestProps): Promise<MassPropertiesResponseProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.getMassProperties(props);\r\n }\r\n\r\n public async getMassPropertiesPerCandidate(tokenProps: IModelRpcProps, props: MassPropertiesPerCandidateRequestProps): Promise<MassPropertiesPerCandidateResponseProps[]> { // eslint-disable-line @typescript-eslint/no-deprecated\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n\r\n const getSingleCandidateMassProperties = async (candidate: string) => {\r\n try {\r\n const massPropResults: MassPropertiesResponseProps[] = [];\r\n\r\n for (const op of props.operations) {\r\n const massProperties = await iModelDb.getMassProperties({ operation: op, candidates: [candidate] });\r\n massPropResults.push(massProperties);\r\n }\r\n\r\n let singleCandidateResult: MassPropertiesPerCandidateResponseProps = { status: BentleyStatus.ERROR, candidate }; // eslint-disable-line @typescript-eslint/no-deprecated\r\n\r\n if (massPropResults.some((r) => r.status !== BentleyStatus.ERROR)) {\r\n singleCandidateResult.status = BentleyStatus.SUCCESS;\r\n for (const r of massPropResults.filter((mpr) => mpr.status !== BentleyStatus.ERROR)) {\r\n singleCandidateResult = { ...singleCandidateResult, ...r };\r\n }\r\n }\r\n\r\n return singleCandidateResult;\r\n } catch {\r\n return { status: BentleyStatus.ERROR, candidate };\r\n }\r\n };\r\n\r\n const promises: Promise<MassPropertiesPerCandidateResponseProps>[] = []; // eslint-disable-line @typescript-eslint/no-deprecated\r\n\r\n for (const candidate of CompressedId64Set.iterable(props.candidates)) {\r\n promises.push(getSingleCandidateMassProperties(candidate));\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public async getToolTipMessage(tokenProps: IModelRpcProps, id: string): Promise<string[]> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const el = iModelDb.elements.getElement(id);\r\n return (el === undefined) ? [] : el.getToolTipMessage();\r\n }\r\n\r\n /** Send a view thumbnail to the frontend. This is a binary transfer with the metadata in a 16-byte prefix header.\r\n * @deprecated in 3.6.0 - might be removed in next major version. Use queryViewThumbnail instead\r\n */\r\n public async getViewThumbnail(tokenProps: IModelRpcProps, viewId: string): Promise<Uint8Array> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const thumbnail = iModelDb.views.getThumbnail(viewId);\r\n if (undefined === thumbnail || 0 === thumbnail.image.length)\r\n throw new NoContentError();\r\n\r\n const val = new Uint8Array(thumbnail.image.length + 16); // allocate a new buffer 16 bytes larger than the image size\r\n new Uint32Array(val.buffer, 0, 4).set([thumbnail.image.length, thumbnail.format === \"jpeg\" ? ImageSourceFormat.Jpeg : ImageSourceFormat.Png, thumbnail.width, thumbnail.height]); // Put the metadata in the first 16 bytes.\r\n val.set(thumbnail.image, 16); // put the image data at offset 16 after metadata\r\n return val;\r\n }\r\n\r\n public async getDefaultViewId(tokenProps: IModelRpcProps): Promise<Id64String> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const spec = { namespace: \"dgn_View\", name: \"DefaultView\" };\r\n const blob = iModelDb.queryFilePropertyBlob(spec);\r\n if (undefined === blob || 8 !== blob.length)\r\n return Id64.invalid;\r\n\r\n const view = new Uint32Array(blob.buffer);\r\n return Id64.fromUint32Pair(view[0], view[1]);\r\n }\r\n public async getSpatialCategoryId(tokenProps: IModelRpcProps, categoryName: string): Promise<Id64String | undefined> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const dictionary: DictionaryModel = iModelDb.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n return SpatialCategory.queryCategoryIdByName(iModelDb, dictionary.id, categoryName);\r\n }\r\n\r\n public async getIModelCoordinatesFromGeoCoordinates(tokenProps: IModelRpcProps, props: IModelCoordinatesRequestProps): Promise<IModelCoordinatesResponseProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.getIModelCoordinatesFromGeoCoordinates(props);\r\n }\r\n\r\n public async getGeoCoordinatesFromIModelCoordinates(tokenProps: IModelRpcProps, props: GeoCoordinatesRequestProps): Promise<GeoCoordinatesResponseProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.getGeoCoordinatesFromIModelCoordinates(props);\r\n }\r\n\r\n public async queryTextureData(tokenProps: IModelRpcProps, textureLoadProps: TextureLoadProps): Promise<TextureData | undefined> {\r\n const db = await getIModelForRpc(tokenProps);\r\n return db.queryTextureData(textureLoadProps);\r\n }\r\n\r\n public async generateElementMeshes(tokenProps: IModelRpcProps, props: ElementMeshRequestProps): Promise<Uint8Array> {\r\n const db = await getIModelForRpc(tokenProps);\r\n return db[_nativeDb].generateElementMeshes(props);\r\n }\r\n\r\n /** @internal */\r\n public async callViewStore(tokenProps: IModelRpcProps, version: string, forWrite: boolean, methodName: string, ...args: any[]): Promise<any> {\r\n if (!RpcInterface.isVersionCompatible(ViewStoreRpc.version, version))\r\n throw new Error(\"ViewStoreRpc version mismatch\");\r\n\r\n const db = await getIModelForRpc(tokenProps);\r\n const viewStore = await db.views.accessViewStore({ accessLevel: forWrite ? \"write\" : \"read\" });\r\n const access = viewStore[forWrite ? \"writeLocker\" : \"reader\"] as any;\r\n\r\n const func = access[methodName];\r\n if (typeof func !== \"function\")\r\n throw new IModelError(IModelStatus.FunctionNotFound, `Illegal ViewStore RPC call \"${methodName}\"`);\r\n\r\n return func.call(access, ...args);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"IModelReadRpcImpl.js","sourceRoot":"","sources":["../../../src/rpc-impl/IModelReadRpcImpl.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\nimport {\r\n AccessToken, assert, BeDuration, BentleyStatus, CompressedId64Set, GuidString, Id64, Id64String, IModelStatus, Logger,\r\n} from \"@itwin/core-bentley\";\r\nimport {\r\n Code, CodeProps, CustomViewState3dCreatorOptions, CustomViewState3dProps, DbBlobRequest, DbBlobResponse, DbQueryRequest, DbQueryResponse,\r\n ElementLoadOptions, ElementLoadProps, ElementMeshRequestProps, ElementProps, EntityMetaData, EntityQueryParams, FontMapProps,\r\n GeoCoordinatesRequestProps, GeoCoordinatesResponseProps, GeometryContainmentRequestProps, GeometryContainmentResponseProps,\r\n GeometrySummaryRequestProps, HydrateViewStateRequestProps, HydrateViewStateResponseProps, ImageSourceFormat, IModel, IModelConnectionProps,\r\n IModelCoordinatesRequestProps, IModelCoordinatesResponseProps, IModelError, IModelReadRpcInterface, IModelRpcOpenProps, IModelRpcProps,\r\n MassPropertiesPerCandidateRequestProps, MassPropertiesPerCandidateResponseProps, MassPropertiesRequestProps, MassPropertiesResponseProps,\r\n ModelExtentsProps, ModelProps, NoContentError, Persisted, RpcInterface, RpcManager, RpcPendingResponse, SnapRequestProps, SnapResponseProps,\r\n SubCategoryResultRow, SyncMode, TextureData, TextureLoadProps, ViewStateLoadProps, ViewStateProps,\r\n ViewStoreRpc,\r\n} from \"@itwin/core-common\";\r\nimport { Range3dProps } from \"@itwin/core-geometry\";\r\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\r\nimport { SpatialCategory } from \"../Category\";\r\nimport { ConcurrentQuery } from \"../ConcurrentQuery\";\r\nimport { CustomViewState3dCreator } from \"../CustomViewState3dCreator\";\r\nimport { generateGeometrySummaries } from \"../GeometrySummary\";\r\nimport { IModelDb } from \"../IModelDb\";\r\nimport { DictionaryModel } from \"../Model\";\r\nimport { PromiseMemoizer } from \"../PromiseMemoizer\";\r\nimport { RpcTrace } from \"../rpc/tracing\";\r\nimport { ViewStateHydrator } from \"../ViewStateHydrator\";\r\nimport { RpcBriefcaseUtility } from \"./RpcBriefcaseUtility\";\r\nimport { _nativeDb } from \"../internal/Symbols\";\r\n\r\ninterface ViewStateRequestProps {\r\n accessToken: AccessToken;\r\n tokenProps: IModelRpcProps;\r\n options: CustomViewState3dCreatorOptions;\r\n}\r\n\r\nclass ViewStateRequestMemoizer extends PromiseMemoizer<CustomViewState3dProps> {\r\n private readonly _timeoutMs: number;\r\n private static _instance?: ViewStateRequestMemoizer;\r\n\r\n public static async perform(props: ViewStateRequestProps): Promise<CustomViewState3dProps> {\r\n if (!this._instance)\r\n this._instance = new ViewStateRequestMemoizer();\r\n\r\n return this._instance.perform(props);\r\n }\r\n\r\n private constructor() {\r\n const memoize = async (props: ViewStateRequestProps) => {\r\n const db = await RpcBriefcaseUtility.findOpenIModel(props.accessToken, props.tokenProps);\r\n const viewCreator = new CustomViewState3dCreator(db);\r\n return viewCreator.getCustomViewState3dData(props.options);\r\n };\r\n\r\n const stringify = (props: ViewStateRequestProps) => {\r\n const token = props.tokenProps;\r\n const modelIds = props.options.modelIds;\r\n return `${token.key}-${token.iTwinId}-${token.iModelId}-${token.changeset?.id}:${modelIds}`;\r\n };\r\n\r\n super(memoize, stringify);\r\n this._timeoutMs = 20 * 1000;\r\n }\r\n\r\n private async perform(props: ViewStateRequestProps): Promise<CustomViewState3dProps> {\r\n const memo = this.memoize(props);\r\n\r\n // Rejections must be caught so that the memoization entry is deleted.\r\n await BeDuration.race(this._timeoutMs, memo.promise).catch(() => undefined);\r\n\r\n if (memo.isPending)\r\n throw new RpcPendingResponse(); // eslint-disable-line @typescript-eslint/only-throw-error\r\n\r\n this.deleteMemoized(props);\r\n\r\n if (memo.isFulfilled) {\r\n assert(undefined !== memo.result);\r\n return memo.result;\r\n }\r\n\r\n assert(memo.isRejected);\r\n throw memo.error;\r\n }\r\n}\r\n\r\nfunction currentActivity() {\r\n return RpcTrace.expectCurrentActivity;\r\n}\r\n\r\nasync function getIModelForRpc(tokenProps: IModelRpcProps): Promise<IModelDb> {\r\n return RpcBriefcaseUtility.findOpenIModel(RpcTrace.expectCurrentActivity.accessToken, tokenProps);\r\n}\r\n\r\n/** The backend implementation of IModelReadRpcInterface.\r\n * @internal\r\n */\r\nexport class IModelReadRpcImpl extends RpcInterface implements IModelReadRpcInterface {\r\n\r\n public static register() { RpcManager.registerImpl(IModelReadRpcInterface, IModelReadRpcImpl); }\r\n\r\n public async getConnectionProps(tokenProps: IModelRpcOpenProps): Promise<IModelConnectionProps> {\r\n return RpcBriefcaseUtility.openWithTimeout(currentActivity(), tokenProps, SyncMode.FixedVersion);\r\n }\r\n\r\n public async getCustomViewState3dData(tokenProps: IModelRpcProps, options: CustomViewState3dCreatorOptions): Promise<CustomViewState3dProps> {\r\n const accessToken = currentActivity().accessToken;\r\n return ViewStateRequestMemoizer.perform({ accessToken, tokenProps, options });\r\n }\r\n\r\n public async hydrateViewState(tokenProps: IModelRpcProps, options: HydrateViewStateRequestProps): Promise<HydrateViewStateResponseProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const viewHydrater = new ViewStateHydrator(iModelDb);\r\n return viewHydrater.getHydrateResponseProps(options);\r\n }\r\n\r\n public async queryAllUsedSpatialSubCategories(tokenProps: IModelRpcProps): Promise<SubCategoryResultRow[]> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.queryAllUsedSpatialSubCategories();\r\n }\r\n\r\n public async querySubCategories(tokenProps: IModelRpcProps, compressedCategoryIds: CompressedId64Set): Promise<SubCategoryResultRow[]> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const decompressedIds = CompressedId64Set.decompressArray(compressedCategoryIds);\r\n return iModelDb.querySubCategories(decompressedIds);\r\n }\r\n\r\n public async queryRows(tokenProps: IModelRpcProps, request: DbQueryRequest): Promise<DbQueryResponse> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n if (iModelDb.isReadonly && request.usePrimaryConn === true) {\r\n Logger.logWarning(BackendLoggerCategory.IModelDb, \"usePrimaryConn is only supported on imodel that is opened in read/write mode. The option will be ignored.\", request);\r\n request.usePrimaryConn = false;\r\n }\r\n return ConcurrentQuery.executeQueryRequest(iModelDb[_nativeDb], request);\r\n }\r\n\r\n public async queryBlob(tokenProps: IModelRpcProps, request: DbBlobRequest): Promise<DbBlobResponse> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n if (iModelDb.isReadonly && request.usePrimaryConn === true) {\r\n Logger.logWarning(BackendLoggerCategory.IModelDb, \"usePrimaryConn is only supported on imodel that is opened in read/write mode. The option will be ignored.\", request);\r\n request.usePrimaryConn = false;\r\n }\r\n return ConcurrentQuery.executeBlobRequest(iModelDb[_nativeDb], request);\r\n }\r\n\r\n public async queryModelRanges(tokenProps: IModelRpcProps, modelIds: Id64String[]): Promise<Range3dProps[]> {\r\n const results = await this.queryModelExtents(tokenProps, modelIds);\r\n if (results.length === 1 && results[0].status !== IModelStatus.Success)\r\n throw new IModelError(results[0].status, \"error querying model range\");\r\n\r\n return results.filter((x) => x.status === IModelStatus.Success).map((x) => x.extents);\r\n }\r\n\r\n public async queryModelExtents(tokenProps: IModelRpcProps, modelIds: Id64String[]): Promise<ModelExtentsProps[]> {\r\n const iModel = await getIModelForRpc(tokenProps);\r\n return iModel.models.queryExtents(modelIds);\r\n }\r\n\r\n public async getModelProps(tokenProps: IModelRpcProps, modelIdsList: Id64String[]): Promise<Persisted<ModelProps>[]> {\r\n const modelIds = new Set(modelIdsList);\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const modelJsonArray: Persisted<ModelProps>[] = [];\r\n for (const id of modelIds) {\r\n try {\r\n const modelProps = iModelDb.models.getModelProps(id);\r\n modelJsonArray.push(modelProps);\r\n } catch (error) {\r\n if (modelIds.size === 1)\r\n throw error; // if they're asking for more than one model, don't throw on error.\r\n }\r\n }\r\n return modelJsonArray;\r\n }\r\n\r\n public async queryModelProps(tokenProps: IModelRpcProps, params: EntityQueryParams): Promise<Persisted<ModelProps>[]> {\r\n const ids = await this.queryEntityIds(tokenProps, params);\r\n return this.getModelProps(tokenProps, [...ids]);\r\n }\r\n\r\n public async getElementProps(tokenProps: IModelRpcProps, elementIdsList: Id64String[]): Promise<Persisted<ElementProps>[]> {\r\n const elementIds = new Set(elementIdsList);\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const elementProps: Persisted<ElementProps>[] = [];\r\n for (const id of elementIds) {\r\n try {\r\n elementProps.push(iModelDb.elements.getElementProps({ id }));\r\n } catch (error) {\r\n if (elementIds.size === 1)\r\n throw error; // if they're asking for more than one element, don't throw on error.\r\n }\r\n }\r\n return elementProps;\r\n }\r\n\r\n public async loadElementProps(tokenProps: IModelRpcProps, identifier: Id64String | GuidString | CodeProps, options?: ElementLoadOptions): Promise<Persisted<ElementProps> | undefined> {\r\n const props: ElementLoadProps = options ? { ...options } : {};\r\n if (typeof identifier === \"string\") {\r\n if (Id64.isId64(identifier))\r\n props.id = identifier;\r\n else\r\n props.federationGuid = identifier;\r\n } else {\r\n props.code = Code.fromJSON(identifier);\r\n }\r\n\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.elements.tryGetElementProps(props);\r\n }\r\n\r\n public async getGeometrySummary(tokenProps: IModelRpcProps, request: GeometrySummaryRequestProps): Promise<string> {\r\n const iModel = await getIModelForRpc(tokenProps);\r\n return generateGeometrySummaries(request, iModel);\r\n }\r\n\r\n public async queryElementProps(tokenProps: IModelRpcProps, params: EntityQueryParams): Promise<Persisted<ElementProps>[]> {\r\n const ids = await this.queryEntityIds(tokenProps, params);\r\n const res = this.getElementProps(tokenProps, [...ids]);\r\n return res;\r\n }\r\n\r\n public async queryEntityIds(tokenProps: IModelRpcProps, params: EntityQueryParams): Promise<Id64String[]> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const res = iModelDb.queryEntityIds(params);\r\n return [...res];\r\n }\r\n\r\n public async getClassHierarchy(tokenProps: IModelRpcProps, classFullName: string): Promise<string[]> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const classArray: string[] = [];\r\n while (true) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const classMetaData: EntityMetaData = iModelDb.getMetaData(classFullName);\r\n classArray.push(classFullName);\r\n if (!classMetaData.baseClasses || classMetaData.baseClasses.length === 0)\r\n break;\r\n\r\n classFullName = classMetaData.baseClasses[0];\r\n }\r\n return classArray;\r\n }\r\n\r\n public async getAllCodeSpecs(tokenProps: IModelRpcProps): Promise<any[]> {\r\n const codeSpecs: any[] = [];\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n iModelDb.withQueryReader(\"SELECT ECInstanceId AS id, name, jsonProperties FROM BisCore.CodeSpec\", (reader) => {\r\n for (const row of reader)\r\n codeSpecs.push({ id: row.id, name: row.name, jsonProperties: JSON.parse(row.jsonProperties) });\r\n });\r\n return codeSpecs;\r\n }\r\n\r\n public async getViewStateData(tokenProps: IModelRpcProps, viewDefinitionId: string, options?: ViewStateLoadProps): Promise<ViewStateProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.views.getViewStateProps(viewDefinitionId, options);\r\n }\r\n\r\n public async readFontJson(tokenProps: IModelRpcProps): Promise<FontMapProps> { // eslint-disable-line @typescript-eslint/no-deprecated\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb[_nativeDb].readFontMap();\r\n }\r\n\r\n public async requestSnap(tokenProps: IModelRpcProps, sessionId: string, props: SnapRequestProps): Promise<SnapResponseProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.requestSnap(sessionId, props);\r\n }\r\n\r\n public async cancelSnap(tokenProps: IModelRpcProps, sessionId: string): Promise<void> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.cancelSnap(sessionId);\r\n }\r\n\r\n public async getGeometryContainment(tokenProps: IModelRpcProps, props: GeometryContainmentRequestProps): Promise<GeometryContainmentResponseProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.getGeometryContainment(props);\r\n }\r\n\r\n public async getMassProperties(tokenProps: IModelRpcProps, props: MassPropertiesRequestProps): Promise<MassPropertiesResponseProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.getMassProperties(props);\r\n }\r\n\r\n public async getMassPropertiesPerCandidate(tokenProps: IModelRpcProps, props: MassPropertiesPerCandidateRequestProps): Promise<MassPropertiesPerCandidateResponseProps[]> { // eslint-disable-line @typescript-eslint/no-deprecated\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n\r\n const getSingleCandidateMassProperties = async (candidate: string) => {\r\n try {\r\n const massPropResults: MassPropertiesResponseProps[] = [];\r\n\r\n for (const op of props.operations) {\r\n const massProperties = await iModelDb.getMassProperties({ operation: op, candidates: [candidate] });\r\n massPropResults.push(massProperties);\r\n }\r\n\r\n let singleCandidateResult: MassPropertiesPerCandidateResponseProps = { status: BentleyStatus.ERROR, candidate }; // eslint-disable-line @typescript-eslint/no-deprecated\r\n\r\n if (massPropResults.some((r) => r.status !== BentleyStatus.ERROR)) {\r\n singleCandidateResult.status = BentleyStatus.SUCCESS;\r\n for (const r of massPropResults.filter((mpr) => mpr.status !== BentleyStatus.ERROR)) {\r\n singleCandidateResult = { ...singleCandidateResult, ...r };\r\n }\r\n }\r\n\r\n return singleCandidateResult;\r\n } catch {\r\n return { status: BentleyStatus.ERROR, candidate };\r\n }\r\n };\r\n\r\n const promises: Promise<MassPropertiesPerCandidateResponseProps>[] = []; // eslint-disable-line @typescript-eslint/no-deprecated\r\n\r\n for (const candidate of CompressedId64Set.iterable(props.candidates)) {\r\n promises.push(getSingleCandidateMassProperties(candidate));\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public async getToolTipMessage(tokenProps: IModelRpcProps, id: string): Promise<string[]> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const el = iModelDb.elements.getElement(id);\r\n return (el === undefined) ? [] : el.getToolTipMessage();\r\n }\r\n\r\n /** Send a view thumbnail to the frontend. This is a binary transfer with the metadata in a 16-byte prefix header.\r\n * @deprecated in 3.6.0 - might be removed in next major version. Use queryViewThumbnail instead\r\n */\r\n public async getViewThumbnail(tokenProps: IModelRpcProps, viewId: string): Promise<Uint8Array> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const thumbnail = iModelDb.views.getThumbnail(viewId);\r\n if (undefined === thumbnail || 0 === thumbnail.image.length)\r\n throw new NoContentError();\r\n\r\n const val = new Uint8Array(thumbnail.image.length + 16); // allocate a new buffer 16 bytes larger than the image size\r\n new Uint32Array(val.buffer, 0, 4).set([thumbnail.image.length, thumbnail.format === \"jpeg\" ? ImageSourceFormat.Jpeg : ImageSourceFormat.Png, thumbnail.width, thumbnail.height]); // Put the metadata in the first 16 bytes.\r\n val.set(thumbnail.image, 16); // put the image data at offset 16 after metadata\r\n return val;\r\n }\r\n\r\n public async getDefaultViewId(tokenProps: IModelRpcProps): Promise<Id64String> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const spec = { namespace: \"dgn_View\", name: \"DefaultView\" };\r\n const blob = iModelDb.queryFilePropertyBlob(spec);\r\n if (undefined === blob || 8 !== blob.length)\r\n return Id64.invalid;\r\n\r\n const view = new Uint32Array(blob.buffer);\r\n return Id64.fromUint32Pair(view[0], view[1]);\r\n }\r\n public async getSpatialCategoryId(tokenProps: IModelRpcProps, categoryName: string): Promise<Id64String | undefined> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n const dictionary: DictionaryModel = iModelDb.models.getModel<DictionaryModel>(IModel.dictionaryId);\r\n return SpatialCategory.queryCategoryIdByName(iModelDb, dictionary.id, categoryName);\r\n }\r\n\r\n public async getIModelCoordinatesFromGeoCoordinates(tokenProps: IModelRpcProps, props: IModelCoordinatesRequestProps): Promise<IModelCoordinatesResponseProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.getIModelCoordinatesFromGeoCoordinates(props);\r\n }\r\n\r\n public async getGeoCoordinatesFromIModelCoordinates(tokenProps: IModelRpcProps, props: GeoCoordinatesRequestProps): Promise<GeoCoordinatesResponseProps> {\r\n const iModelDb = await getIModelForRpc(tokenProps);\r\n return iModelDb.getGeoCoordinatesFromIModelCoordinates(props);\r\n }\r\n\r\n public async queryTextureData(tokenProps: IModelRpcProps, textureLoadProps: TextureLoadProps): Promise<TextureData | undefined> {\r\n const db = await getIModelForRpc(tokenProps);\r\n return db.queryTextureData(textureLoadProps);\r\n }\r\n\r\n public async generateElementMeshes(tokenProps: IModelRpcProps, props: ElementMeshRequestProps): Promise<Uint8Array> {\r\n const db = await getIModelForRpc(tokenProps);\r\n return db[_nativeDb].generateElementMeshes(props);\r\n }\r\n\r\n /** @internal */\r\n public async callViewStore(tokenProps: IModelRpcProps, version: string, forWrite: boolean, methodName: string, ...args: any[]): Promise<any> {\r\n if (!RpcInterface.isVersionCompatible(ViewStoreRpc.version, version))\r\n throw new Error(\"ViewStoreRpc version mismatch\");\r\n\r\n const db = await getIModelForRpc(tokenProps);\r\n const viewStore = await db.views.accessViewStore({ accessLevel: forWrite ? \"write\" : \"read\" });\r\n const access = viewStore[forWrite ? \"writeLocker\" : \"reader\"] as any;\r\n\r\n const func = access[methodName];\r\n if (typeof func !== \"function\")\r\n throw new IModelError(IModelStatus.FunctionNotFound, `Illegal ViewStore RPC call \"${methodName}\"`);\r\n\r\n return func.call(access, ...args);\r\n }\r\n}\r\n"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import { expect } from "chai";
|
|
6
|
-
import { ColorDef, GeometryParams, LineBreakRun, targetPointShapes, terminatorShapes, TextAnnotation, TextBlock, TextRun, TextStyleSettings } from "@itwin/core-common";
|
|
6
|
+
import { ColorDef, FillDisplay, GeometryParams, LineBreakRun, targetPointShapes, terminatorShapes, TextAnnotation, TextBlock, TextRun, TextStyleSettings } from "@itwin/core-common";
|
|
7
7
|
import { Arc3d, LineSegment3d, LineString3d, Point3d, Range2d, YawPitchRollAngles } from "@itwin/core-geometry";
|
|
8
8
|
import { appendLeadersToBuilder, computeElbowDirection, computeFrame, computeLeaderAttachmentPoint, TextStyleResolver } from "../../core-backend";
|
|
9
9
|
import { Id64 } from "@itwin/core-bentley";
|
|
@@ -193,6 +193,9 @@ describe("LeaderGeometry", () => {
|
|
|
193
193
|
if (shape.includes("Filled")) {
|
|
194
194
|
expect(builder.geometries.length).to.equal(3); // One entry for geometry query and another for geometryParams for fill
|
|
195
195
|
terminatorGeometry = builder.geometries[2];
|
|
196
|
+
const params = builder.params[builder.params.length - 1];
|
|
197
|
+
expect(params.fillDisplay).to.equal(FillDisplay.Always);
|
|
198
|
+
expect(params.fillColor).to.equal(params.lineColor);
|
|
196
199
|
}
|
|
197
200
|
if (shape.includes("circle")) {
|
|
198
201
|
expect(terminatorGeometry.circularRadius()).to.equal(terminatorHeight / 2);
|
|
@@ -397,6 +400,17 @@ describe("LeaderGeometry", () => {
|
|
|
397
400
|
});
|
|
398
401
|
});
|
|
399
402
|
describe("computeElbowDirection", () => {
|
|
403
|
+
it("should render a leader without an elbow when wantElbow is true and elbowLength is 0", () => {
|
|
404
|
+
const leaders = [{
|
|
405
|
+
startPoint: Point3d.create(10, 0, 0),
|
|
406
|
+
attachment: { mode: "TextPoint", position: "TopLeft" },
|
|
407
|
+
styleOverrides: { leader: { wantElbow: true, elbowLength: 0, terminatorHeightFactor: 2, terminatorWidthFactor: 2 } },
|
|
408
|
+
}];
|
|
409
|
+
const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);
|
|
410
|
+
expect(result).to.be.true;
|
|
411
|
+
const leaderLines = builder.geometries[0];
|
|
412
|
+
expect(leaderLines.points.length).to.equal(2); // start + end, no elbow
|
|
413
|
+
});
|
|
400
414
|
it("should return elbow direction", () => {
|
|
401
415
|
const leaders = [
|
|
402
416
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LeaderGeometry.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/LeaderGeometry.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport { ColorDef, GeometryParams, LineBreakRun, TargetPointShape, targetPointShapes, TerminatorShape, terminatorShapes, TextAnnotation, TextAnnotationLeader, TextBlock, TextFrameStyleProps, TextRun, TextStyleSettings } from \"@itwin/core-common\";\r\nimport { Arc3d, LineSegment3d, LineString3d, Point3d, Range2d, YawPitchRollAngles } from \"@itwin/core-geometry\";\r\nimport { appendLeadersToBuilder, computeElbowDirection, computeFrame, computeLeaderAttachmentPoint, TextStyleResolver } from \"../../core-backend\";\r\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { doLayout, MockBuilder } from \"../AnnotationTestUtils\";\r\n\r\ndescribe(\"LeaderGeometry\", () => {\r\n let builder: MockBuilder;\r\n let defaultParams: GeometryParams;\r\n\r\n const textBlock = TextBlock.create({ styleOverrides: { font: { name: \"Arial\" }, color: ColorDef.black.toJSON(), leader: { wantElbow: false } } });\r\n textBlock.appendRun(TextRun.create({ content: \"Hello\", styleOverrides: { font: { name: \"Arial\" } } }));\r\n textBlock.appendRun(LineBreakRun.create({\r\n styleOverrides: { font: { name: \"Arial\" } },\r\n }));\r\n textBlock.appendRun(TextRun.create({ content: \"World\", styleOverrides: { font: { name: \"Arial\" } } }));\r\n\r\n const frame: TextFrameStyleProps = { borderWeight: 1, shape: \"rectangle\" };\r\n\r\n const annotation = TextAnnotation.fromJSON({\r\n textBlock: textBlock.toJSON(),\r\n anchor: { horizontal: \"left\", vertical: \"top\" },\r\n orientation: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),\r\n offset: { x: 0, y: 0 },\r\n });\r\n\r\n const findTextStyle = (id: Id64String) => TextStyleSettings.fromJSON(id === \"0x34\" ? { lineSpacingFactor: 12, font: { name: \"block\" }, frame } : { lineSpacingFactor: 99, font: { name: \"run\" }, frame });\r\n const textStyleResolver = new TextStyleResolver({\r\n textBlock,\r\n textStyleId: \"0x34\",\r\n iModel: {} as any,\r\n findTextStyle,\r\n });\r\n const layout = doLayout(textBlock, {\r\n textStyleId: \"0x34\",\r\n findTextStyle,\r\n findFontId: () => 0,\r\n });\r\n const scaleFactor = 1;\r\n\r\n\r\n const range = Range2d.fromJSON(layout.range);\r\n const transform = annotation.computeTransform(range);\r\n const frameCurve = computeFrame({ frame: frame.shape === \"none\" ? \"rectangle\" : (frame.shape ?? \"rectangle\"), range: layout.range, transform });\r\n\r\n beforeEach(() => {\r\n builder = new MockBuilder();\r\n defaultParams = new GeometryParams(Id64.invalid);\r\n });\r\n\r\n describe(\"appendLeaderToBuilder\", () => {\r\n it(\"should append a leader to the builder\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"Nearest\" }\r\n }\r\n ]\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const params = builder.params[builder.params.length - 1];\r\n expect(builder.params.length).to.be.equal(1);\r\n expect(params.lineColor).to.be.equal(ColorDef.black); // textBlock color\r\n expect(builder.geometries.length).to.be.equal(2); // One LineString3d for leadersLines and one for terminators\r\n for (const geometryEntry of builder.geometries) {\r\n expect(geometryEntry).to.be.instanceOf(LineString3d);\r\n }\r\n });\r\n\r\n it(\"should append multiple leaders to the builder\", () => {\r\n const leaders: TextAnnotationLeader[] = [{ startPoint: Point3d.create(20, 20, 0), attachment: { mode: \"Nearest\" } },\r\n { startPoint: Point3d.create(10, 0, 0), attachment: { mode: \"Nearest\" } }];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.params.length).to.be.equal(2); // One for each leader\r\n expect(builder.geometries.length).to.be.equal(4); // Two LineString3d for leadersSegments and two for terminators\r\n for (const geometryEntry of builder.geometries) {\r\n expect(geometryEntry).to.be.instanceOf(LineString3d);\r\n }\r\n });\r\n\r\n it(\"should have intermediate points in geometry\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"Nearest\" },\r\n intermediatePoints: [Point3d.create(15, 15, 0), Point3d.create(20, 20, 0)]\r\n }\r\n ];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const geometries = builder.geometries;\r\n const leaderLines = geometries[0] as LineString3d;\r\n expect(leaderLines.points.length).to.be.equal(4); // start + 2 intermediate + end\r\n });\r\n\r\n it(\"should have elbow in the geometry\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5\r\n }\r\n }\r\n }\r\n ];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const geometries = builder.geometries;\r\n const leaderLines = geometries[0] as LineString3d;\r\n expect(leaderLines.points.length).to.be.equal(3); // start + elbowPoint + end\r\n });\r\n\r\n describe(\"should return correct geometry for different attachment modes\", () => {\r\n const leaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" }\r\n }, {\r\n startPoint: Point3d.create(20, 20, 0),\r\n attachment: { mode: \"KeyPoint\", curveIndex: 0, fraction: 0.5 }\r\n }, {\r\n startPoint: Point3d.create(30, 30, 0),\r\n attachment: { mode: \"Nearest\" }\r\n }]\r\n\r\n for (const leader of leaders) {\r\n builder = new MockBuilder();\r\n it(`${leader.attachment.mode}`, () => {\r\n const attachmentPoint = computeLeaderAttachmentPoint(leader, frameCurve, layout, transform);\r\n if (!attachmentPoint) {\r\n expect.fail(\"Attachment point should not be undefined\");\r\n }\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLines = builder.geometries[0] as LineString3d;\r\n // The last point in the geometry is the point on frame where leader is supposed to be attached.\r\n expect(leaderLines.points[leaderLines.points.length - 1].isAlmostEqual(attachmentPoint)).to.be.true;\r\n })\r\n }\r\n })\r\n describe(\"should return correct geometry for different styleOverrides\", () => {\r\n const textHeight = TextStyleSettings.defaultProps.textHeight;\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5,\r\n color: ColorDef.red.toJSON(),\r\n terminatorShape: terminatorShapes[0],\r\n terminatorHeightFactor: 2,\r\n terminatorWidthFactor: 2,\r\n }\r\n }\r\n }\r\n ];\r\n\r\n it(\"should apply color overrides\", () => {\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const params = builder.params[builder.params.length - 1];\r\n expect(params.lineColor).to.equal(ColorDef.red);\r\n });\r\n\r\n it(\"should apply terminator size overrides\", () => {\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const terminatorLines = builder.geometries[1] as LineString3d;\r\n const terminatorLength = LineSegment3d.create(terminatorLines.points[0], terminatorLines.points[1]).curveLength();\r\n const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;\r\n const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;\r\n // terminator length is calculated based on the terminator width and height factors.\r\n const expectedTerminatorLength = Math.sqrt(terminatorWidth * terminatorWidth + ((terminatorHeight / 2) * (terminatorHeight / 2)));\r\n expect(terminatorLength).to.be.closeTo(expectedTerminatorLength, 0.01);\r\n });\r\n\r\n it(\"should apply elbow length overrides\", () => {\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLines = builder.geometries[0] as LineString3d;\r\n // When elbow exists, the last two points in the leaderLines should form the elbow\r\n const elbowLine = LineSegment3d.create(leaderLines.points[leaderLines.points.length - 1], leaderLines.points[leaderLines.points.length - 2]);\r\n const elbowLength = elbowLine.curveLength();\r\n expect(elbowLength).to.be.closeTo((leaders[0].styleOverrides?.leader?.elbowLength ?? 1) * textHeight, 0.01);\r\n });\r\n\r\n it(\"should apply terminator shape overrides\", () => {\r\n const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;\r\n const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;\r\n let firstLeaderLineLengthBeforeTruncation: number;\r\n terminatorShapes.forEach((shape: TerminatorShape) => {\r\n it(`Terminator shape: ${shape}`, () => {\r\n leaders[0].styleOverrides = { ...leaders[0].styleOverrides, leader: { terminatorShape: shape } };\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n if (shape === \"none\") {\r\n expect(builder.geometries.length).to.equal(1); // Only leader line should be present with no terminators\r\n } else {\r\n let terminatorGeometry = builder.geometries[1];\r\n if (shape.includes(\"Filled\")) {\r\n expect(builder.geometries.length).to.equal(3) // One entry for geometry query and another for geometryParams for fill\r\n terminatorGeometry = builder.geometries[2];\r\n }\r\n if (shape.includes(\"circle\")) {\r\n expect((terminatorGeometry as Arc3d).circularRadius()).to.equal(terminatorHeight / 2)\r\n }\r\n\r\n if (shape === \"slash\") {\r\n expect(terminatorGeometry).to.be.instanceOf(LineSegment3d);\r\n expect(terminatorGeometry.curveLength()).to.equal(terminatorHeight);\r\n }\r\n\r\n if (shape === \"closedArrow\") {\r\n // The leaderLine is truncated to accommodate the closed and hollow shape of the terminator\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n const firstLeaderLine = LineSegment3d.create(leaderLine.points[0], leaderLine.points[1]);\r\n const firstLeaderLineLength = firstLeaderLine.curveLength();\r\n expect(firstLeaderLineLength).to.be.closeTo(firstLeaderLineLengthBeforeTruncation - terminatorWidth, 0.01);\r\n } else {\r\n // keep record of first leader line length before truncation for closedArrow test\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n const firstLeaderLineBeforeTruncation = LineSegment3d.create(leaderLine.points[0], leaderLine.points[1]);\r\n firstLeaderLineLengthBeforeTruncation = firstLeaderLineBeforeTruncation.curveLength();\r\n }\r\n }\r\n\r\n });\r\n\r\n });\r\n });\r\n\r\n it(\"should not append any geometry when both showLeaders and showTargetPoint are false\", () => {\r\n const targetLeaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: false, showTargetPoint: false } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(0);\r\n });\r\n\r\n it(\"should not append leader line or terminator when showLeaders is false\", () => {\r\n const targetLeaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: false, showTargetPoint: true, targetPointShape: \"cross\" } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n // Only the target point graphic (a \"cross\" => two line segments) should be present.\r\n expect(builder.geometries.length).to.equal(2);\r\n for (const geometry of builder.geometries)\r\n expect(geometry).to.be.instanceOf(LineSegment3d);\r\n });\r\n\r\n it(\"should append the leader line but no terminator when showTerminators is false\", () => {\r\n const targetLeaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: true, showTerminators: false, showTargetPoint: false } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n // Only the leader line should be present, with no terminator geometry.\r\n expect(builder.geometries.length).to.equal(1);\r\n expect(builder.geometries[0]).to.be.instanceOf(LineString3d);\r\n });\r\n\r\n it(\"should append the target point graphic in addition to the leader line and terminator when showTargetPoint is true\", () => {\r\n const targetLeaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: true, showTerminators: true, showTargetPoint: true, targetPointShape: \"cross\" } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n // leader line (1) + openArrow terminator (1) + cross target point (2) = 4 geometry entries.\r\n expect(builder.geometries.length).to.equal(4);\r\n expect(builder.geometries[0]).to.be.instanceOf(LineString3d); // leader line\r\n expect(builder.geometries[1]).to.be.instanceOf(LineString3d); // openArrow terminator\r\n expect(builder.geometries[2]).to.be.instanceOf(LineSegment3d); // cross segment\r\n expect(builder.geometries[3]).to.be.instanceOf(LineSegment3d); // cross segment\r\n });\r\n\r\n // Disable the leader line so that only the target point graphic is produced, making the assertions unambiguous.\r\n const makeTargetPointLeader = (shape: TargetPointShape): TextAnnotationLeader => ({\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: false, showTargetPoint: true, targetPointShape: shape } },\r\n });\r\n\r\n it(\"should draw a 'cross' target point as two crossed line segments\", () => {\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"cross\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(2);\r\n for (const geometry of builder.geometries)\r\n expect(geometry).to.be.instanceOf(LineSegment3d);\r\n });\r\n\r\n it(\"should draw a 'plus' target point as two orthogonal line segments\", () => {\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"plus\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(2);\r\n for (const geometry of builder.geometries)\r\n expect(geometry).to.be.instanceOf(LineSegment3d);\r\n });\r\n\r\n it(\"should draw a 'circle' target point with a radius of half the terminator height\", () => {\r\n const terminatorHalfHeight = (TextStyleSettings.defaultProps.leader.terminatorHeightFactor ?? 1) * textHeight / 2;\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"circle\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(1);\r\n const circle = builder.geometries[0] as Arc3d;\r\n expect(circle).to.be.instanceOf(Arc3d);\r\n expect(circle.circularRadius()).to.be.closeTo(terminatorHalfHeight, 0.01);\r\n });\r\n\r\n it(\"should draw a 'square' target point as a closed line string with equal width and height\", () => {\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"square\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(1);\r\n const square = builder.geometries[0] as LineString3d;\r\n expect(square).to.be.instanceOf(LineString3d);\r\n expect(square.points.length).to.equal(5); // closed loop\r\n const width = Math.abs(square.points[1].x - square.points[0].x);\r\n const height = Math.abs(square.points[2].y - square.points[1].y);\r\n expect(width).to.be.closeTo(height, 0.01);\r\n });\r\n\r\n it(\"should draw a 'rectangle' target point as a closed line string using configured width and height\", () => {\r\n const terminatorWidth = (TextStyleSettings.defaultProps.leader.terminatorWidthFactor ?? 1) * textHeight;\r\n const terminatorHeight = (TextStyleSettings.defaultProps.leader.terminatorHeightFactor ?? 1) * textHeight;\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"rectangle\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(1);\r\n const rectangle = builder.geometries[0] as LineString3d;\r\n expect(rectangle).to.be.instanceOf(LineString3d);\r\n expect(rectangle.points.length).to.equal(5); // closed loop\r\n const width = Math.abs(rectangle.points[1].x - rectangle.points[0].x);\r\n const height = Math.abs(rectangle.points[2].y - rectangle.points[1].y);\r\n expect(width).to.be.closeTo(terminatorWidth, 0.01);\r\n expect(height).to.be.closeTo(terminatorHeight, 0.01);\r\n });\r\n\r\n it(\"should produce target point geometry for every predefined shape\", () => {\r\n for (const shape of targetPointShapes) {\r\n const localBuilder = new MockBuilder();\r\n const result = appendLeadersToBuilder(localBuilder, [makeTargetPointLeader(shape)], layout, transform, new GeometryParams(Id64.invalid), textStyleResolver, scaleFactor);\r\n expect(result, `shape: ${shape}`).to.be.true;\r\n expect(localBuilder.geometries.length, `shape: ${shape}`).to.be.greaterThan(0);\r\n }\r\n });\r\n\r\n it(\"should not offset the leader start point when targetPointOffsetFactor is 0\", () => {\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showTargetPoint: true, targetPointOffsetFactor: 0 } },\r\n };\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n expect(leaderLine.points[0].isAlmostEqual(leader.startPoint)).to.be.true;\r\n });\r\n\r\n it(\"should offset the leader start point away from the target point when targetPointOffsetFactor is non-zero\", () => {\r\n const offsetFactor = 2;\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showTargetPoint: true, targetPointOffsetFactor: offsetFactor } },\r\n };\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n // The leader line should start away from the original start point by offsetFactor * textHeight.\r\n expect(leaderLine.points[0].isAlmostEqual(leader.startPoint)).to.be.false;\r\n const offsetDistance = leaderLine.points[0].distance(leader.startPoint);\r\n expect(offsetDistance).to.be.closeTo(offsetFactor * textHeight, 0.01);\r\n });\r\n\r\n it(\"should clamp oversized target-point offsets to the first leader segment\", () => {\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n intermediatePoints: [Point3d.create(20, 0, 0)],\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: true, showTargetPoint: true, showTerminators: false, targetPointOffsetFactor: 100 } },\r\n };\r\n\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n const offsetDistance = leaderLine.points[0].distance(leader.startPoint);\r\n expect(offsetDistance).to.be.at.most(leader.startPoint.distance(leader.intermediatePoints![0]));\r\n });\r\n\r\n it(\"should treat negative target-point offsets as zero\", () => {\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n intermediatePoints: [Point3d.create(20, 0, 0)],\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: true, showTargetPoint: true, showTerminators: false, targetPointOffsetFactor: -2 } },\r\n };\r\n\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n expect(leaderLine.points[0].isAlmostEqual(leader.startPoint)).to.be.true;\r\n });\r\n\r\n it(\"should draw the target point graphic at the original start point regardless of the offset\", () => {\r\n const offsetFactor = 2;\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: false, showTargetPoint: true, targetPointShape: \"circle\", targetPointOffsetFactor: offsetFactor } },\r\n };\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const circle = builder.geometries[0] as Arc3d;\r\n expect(circle).to.be.instanceOf(Arc3d);\r\n expect(circle.center.isAlmostEqual(leader.startPoint)).to.be.true;\r\n });\r\n\r\n });\r\n });\r\n\r\n describe(\"computeElbowDirection\", () => {\r\n it(\"should return elbow direction\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5\r\n }\r\n }\r\n }\r\n ];\r\n\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n if (attachmentPoint) {\r\n const elbowDirection = computeElbowDirection(attachmentPoint, frameCurve,\r\n leaders[0].styleOverrides?.leader?.elbowLength ?? 1);\r\n expect(elbowDirection).to.exist;\r\n }\r\n });\r\n\r\n it(\"should return undefined if elbow is tangential\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"Nearest\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5\r\n }\r\n }\r\n }\r\n ];\r\n\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n if (attachmentPoint) {\r\n const elbowDirection = computeElbowDirection(attachmentPoint, frameCurve,\r\n leaders[0].styleOverrides?.leader?.elbowLength ?? 1);\r\n expect(elbowDirection).to.be.undefined;\r\n }\r\n });\r\n })\r\n\r\n describe(\"computeLeaderAttachmentPoint\", () => {\r\n it(\"should return correct attachmentPoint for 'Nearest' mode\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(-20, 0, 0),\r\n attachment: { mode: \"Nearest\" }\r\n }\r\n ];\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n expect(attachmentPoint).to.exist;\r\n expect(attachmentPoint!.isAlmostEqual(Point3d.create(0, 0, 0))).to.be.true;\r\n });\r\n\r\n it(\"should return correct attachmentPoint for 'Keypoint' mode\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(-20, 0, 0),\r\n attachment: { mode: \"KeyPoint\", curveIndex: 0, fraction: 0 }\r\n }\r\n ];\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n expect(attachmentPoint).to.exist;\r\n expect(attachmentPoint?.y).to.be.equal(range.low.y); // expected to be at the bottom of the TextBlock\r\n });\r\n\r\n it(\"should return correct attachmentPoint for 'TextPoint' mode\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(-20, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" }\r\n }\r\n ];\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n expect(attachmentPoint).to.exist;\r\n const topY = range.high.y;\r\n const middleY = (range.low.y + range.high.y) / 2;\r\n expect(attachmentPoint!.y).to.be.within(middleY, topY); // expected to be in the upper half of the TextBlock\r\n });\r\n })\r\n\r\n})\r\n"]}
|
|
1
|
+
{"version":3,"file":"LeaderGeometry.test.js","sourceRoot":"","sources":["../../../../src/test/annotations/LeaderGeometry.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport { ColorDef, FillDisplay, GeometryParams, LineBreakRun, TargetPointShape, targetPointShapes, TerminatorShape, terminatorShapes, TextAnnotation, TextAnnotationLeader, TextBlock, TextFrameStyleProps, TextRun, TextStyleSettings } from \"@itwin/core-common\";\r\nimport { Arc3d, LineSegment3d, LineString3d, Point3d, Range2d, YawPitchRollAngles } from \"@itwin/core-geometry\";\r\nimport { appendLeadersToBuilder, computeElbowDirection, computeFrame, computeLeaderAttachmentPoint, TextStyleResolver } from \"../../core-backend\";\r\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { doLayout, MockBuilder } from \"../AnnotationTestUtils\";\r\n\r\ndescribe(\"LeaderGeometry\", () => {\r\n let builder: MockBuilder;\r\n let defaultParams: GeometryParams;\r\n\r\n const textBlock = TextBlock.create({ styleOverrides: { font: { name: \"Arial\" }, color: ColorDef.black.toJSON(), leader: { wantElbow: false } } });\r\n textBlock.appendRun(TextRun.create({ content: \"Hello\", styleOverrides: { font: { name: \"Arial\" } } }));\r\n textBlock.appendRun(LineBreakRun.create({\r\n styleOverrides: { font: { name: \"Arial\" } },\r\n }));\r\n textBlock.appendRun(TextRun.create({ content: \"World\", styleOverrides: { font: { name: \"Arial\" } } }));\r\n\r\n const frame: TextFrameStyleProps = { borderWeight: 1, shape: \"rectangle\" };\r\n\r\n const annotation = TextAnnotation.fromJSON({\r\n textBlock: textBlock.toJSON(),\r\n anchor: { horizontal: \"left\", vertical: \"top\" },\r\n orientation: YawPitchRollAngles.createDegrees(0, 0, 0).toJSON(),\r\n offset: { x: 0, y: 0 },\r\n });\r\n\r\n const findTextStyle = (id: Id64String) => TextStyleSettings.fromJSON(id === \"0x34\" ? { lineSpacingFactor: 12, font: { name: \"block\" }, frame } : { lineSpacingFactor: 99, font: { name: \"run\" }, frame });\r\n const textStyleResolver = new TextStyleResolver({\r\n textBlock,\r\n textStyleId: \"0x34\",\r\n iModel: {} as any,\r\n findTextStyle,\r\n });\r\n const layout = doLayout(textBlock, {\r\n textStyleId: \"0x34\",\r\n findTextStyle,\r\n findFontId: () => 0,\r\n });\r\n const scaleFactor = 1;\r\n\r\n\r\n const range = Range2d.fromJSON(layout.range);\r\n const transform = annotation.computeTransform(range);\r\n const frameCurve = computeFrame({ frame: frame.shape === \"none\" ? \"rectangle\" : (frame.shape ?? \"rectangle\"), range: layout.range, transform });\r\n\r\n beforeEach(() => {\r\n builder = new MockBuilder();\r\n defaultParams = new GeometryParams(Id64.invalid);\r\n });\r\n\r\n describe(\"appendLeaderToBuilder\", () => {\r\n it(\"should append a leader to the builder\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"Nearest\" }\r\n }\r\n ]\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const params = builder.params[builder.params.length - 1];\r\n expect(builder.params.length).to.be.equal(1);\r\n expect(params.lineColor).to.be.equal(ColorDef.black); // textBlock color\r\n expect(builder.geometries.length).to.be.equal(2); // One LineString3d for leadersLines and one for terminators\r\n for (const geometryEntry of builder.geometries) {\r\n expect(geometryEntry).to.be.instanceOf(LineString3d);\r\n }\r\n });\r\n\r\n it(\"should append multiple leaders to the builder\", () => {\r\n const leaders: TextAnnotationLeader[] = [{ startPoint: Point3d.create(20, 20, 0), attachment: { mode: \"Nearest\" } },\r\n { startPoint: Point3d.create(10, 0, 0), attachment: { mode: \"Nearest\" } }];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.params.length).to.be.equal(2); // One for each leader\r\n expect(builder.geometries.length).to.be.equal(4); // Two LineString3d for leadersSegments and two for terminators\r\n for (const geometryEntry of builder.geometries) {\r\n expect(geometryEntry).to.be.instanceOf(LineString3d);\r\n }\r\n });\r\n\r\n it(\"should have intermediate points in geometry\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"Nearest\" },\r\n intermediatePoints: [Point3d.create(15, 15, 0), Point3d.create(20, 20, 0)]\r\n }\r\n ];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const geometries = builder.geometries;\r\n const leaderLines = geometries[0] as LineString3d;\r\n expect(leaderLines.points.length).to.be.equal(4); // start + 2 intermediate + end\r\n });\r\n\r\n it(\"should have elbow in the geometry\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5\r\n }\r\n }\r\n }\r\n ];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const geometries = builder.geometries;\r\n const leaderLines = geometries[0] as LineString3d;\r\n expect(leaderLines.points.length).to.be.equal(3); // start + elbowPoint + end\r\n });\r\n\r\n describe(\"should return correct geometry for different attachment modes\", () => {\r\n const leaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" }\r\n }, {\r\n startPoint: Point3d.create(20, 20, 0),\r\n attachment: { mode: \"KeyPoint\", curveIndex: 0, fraction: 0.5 }\r\n }, {\r\n startPoint: Point3d.create(30, 30, 0),\r\n attachment: { mode: \"Nearest\" }\r\n }]\r\n\r\n for (const leader of leaders) {\r\n builder = new MockBuilder();\r\n it(`${leader.attachment.mode}`, () => {\r\n const attachmentPoint = computeLeaderAttachmentPoint(leader, frameCurve, layout, transform);\r\n if (!attachmentPoint) {\r\n expect.fail(\"Attachment point should not be undefined\");\r\n }\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLines = builder.geometries[0] as LineString3d;\r\n // The last point in the geometry is the point on frame where leader is supposed to be attached.\r\n expect(leaderLines.points[leaderLines.points.length - 1].isAlmostEqual(attachmentPoint)).to.be.true;\r\n })\r\n }\r\n })\r\n describe(\"should return correct geometry for different styleOverrides\", () => {\r\n const textHeight = TextStyleSettings.defaultProps.textHeight;\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5,\r\n color: ColorDef.red.toJSON(),\r\n terminatorShape: terminatorShapes[0],\r\n terminatorHeightFactor: 2,\r\n terminatorWidthFactor: 2,\r\n }\r\n }\r\n }\r\n ];\r\n\r\n it(\"should apply color overrides\", () => {\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const params = builder.params[builder.params.length - 1];\r\n expect(params.lineColor).to.equal(ColorDef.red);\r\n });\r\n\r\n it(\"should apply terminator size overrides\", () => {\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const terminatorLines = builder.geometries[1] as LineString3d;\r\n const terminatorLength = LineSegment3d.create(terminatorLines.points[0], terminatorLines.points[1]).curveLength();\r\n const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;\r\n const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;\r\n // terminator length is calculated based on the terminator width and height factors.\r\n const expectedTerminatorLength = Math.sqrt(terminatorWidth * terminatorWidth + ((terminatorHeight / 2) * (terminatorHeight / 2)));\r\n expect(terminatorLength).to.be.closeTo(expectedTerminatorLength, 0.01);\r\n });\r\n\r\n it(\"should apply elbow length overrides\", () => {\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLines = builder.geometries[0] as LineString3d;\r\n // When elbow exists, the last two points in the leaderLines should form the elbow\r\n const elbowLine = LineSegment3d.create(leaderLines.points[leaderLines.points.length - 1], leaderLines.points[leaderLines.points.length - 2]);\r\n const elbowLength = elbowLine.curveLength();\r\n expect(elbowLength).to.be.closeTo((leaders[0].styleOverrides?.leader?.elbowLength ?? 1) * textHeight, 0.01);\r\n });\r\n\r\n it(\"should apply terminator shape overrides\", () => {\r\n const terminatorHeight = (leaders[0].styleOverrides?.leader?.terminatorHeightFactor ?? 1) * textHeight;\r\n const terminatorWidth = (leaders[0].styleOverrides?.leader?.terminatorWidthFactor ?? 1) * textHeight;\r\n let firstLeaderLineLengthBeforeTruncation: number;\r\n terminatorShapes.forEach((shape: TerminatorShape) => {\r\n it(`Terminator shape: ${shape}`, () => {\r\n leaders[0].styleOverrides = { ...leaders[0].styleOverrides, leader: { terminatorShape: shape } };\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n if (shape === \"none\") {\r\n expect(builder.geometries.length).to.equal(1); // Only leader line should be present with no terminators\r\n } else {\r\n let terminatorGeometry = builder.geometries[1];\r\n if (shape.includes(\"Filled\")) {\r\n expect(builder.geometries.length).to.equal(3) // One entry for geometry query and another for geometryParams for fill\r\n terminatorGeometry = builder.geometries[2];\r\n\r\n const params = builder.params[builder.params.length - 1];\r\n expect(params.fillDisplay).to.equal(FillDisplay.Always);\r\n expect(params.fillColor).to.equal(params.lineColor);\r\n }\r\n if (shape.includes(\"circle\")) {\r\n expect((terminatorGeometry as Arc3d).circularRadius()).to.equal(terminatorHeight / 2)\r\n }\r\n\r\n if (shape === \"slash\") {\r\n expect(terminatorGeometry).to.be.instanceOf(LineSegment3d);\r\n expect(terminatorGeometry.curveLength()).to.equal(terminatorHeight);\r\n }\r\n\r\n if (shape === \"closedArrow\") {\r\n // The leaderLine is truncated to accommodate the closed and hollow shape of the terminator\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n const firstLeaderLine = LineSegment3d.create(leaderLine.points[0], leaderLine.points[1]);\r\n const firstLeaderLineLength = firstLeaderLine.curveLength();\r\n expect(firstLeaderLineLength).to.be.closeTo(firstLeaderLineLengthBeforeTruncation - terminatorWidth, 0.01);\r\n } else {\r\n // keep record of first leader line length before truncation for closedArrow test\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n const firstLeaderLineBeforeTruncation = LineSegment3d.create(leaderLine.points[0], leaderLine.points[1]);\r\n firstLeaderLineLengthBeforeTruncation = firstLeaderLineBeforeTruncation.curveLength();\r\n }\r\n }\r\n\r\n });\r\n\r\n });\r\n });\r\n\r\n it(\"should not append any geometry when both showLeaders and showTargetPoint are false\", () => {\r\n const targetLeaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: false, showTargetPoint: false } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(0);\r\n });\r\n\r\n it(\"should not append leader line or terminator when showLeaders is false\", () => {\r\n const targetLeaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: false, showTargetPoint: true, targetPointShape: \"cross\" } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n // Only the target point graphic (a \"cross\" => two line segments) should be present.\r\n expect(builder.geometries.length).to.equal(2);\r\n for (const geometry of builder.geometries)\r\n expect(geometry).to.be.instanceOf(LineSegment3d);\r\n });\r\n\r\n it(\"should append the leader line but no terminator when showTerminators is false\", () => {\r\n const targetLeaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: true, showTerminators: false, showTargetPoint: false } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n // Only the leader line should be present, with no terminator geometry.\r\n expect(builder.geometries.length).to.equal(1);\r\n expect(builder.geometries[0]).to.be.instanceOf(LineString3d);\r\n });\r\n\r\n it(\"should append the target point graphic in addition to the leader line and terminator when showTargetPoint is true\", () => {\r\n const targetLeaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: true, showTerminators: true, showTargetPoint: true, targetPointShape: \"cross\" } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, targetLeaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n // leader line (1) + openArrow terminator (1) + cross target point (2) = 4 geometry entries.\r\n expect(builder.geometries.length).to.equal(4);\r\n expect(builder.geometries[0]).to.be.instanceOf(LineString3d); // leader line\r\n expect(builder.geometries[1]).to.be.instanceOf(LineString3d); // openArrow terminator\r\n expect(builder.geometries[2]).to.be.instanceOf(LineSegment3d); // cross segment\r\n expect(builder.geometries[3]).to.be.instanceOf(LineSegment3d); // cross segment\r\n });\r\n\r\n // Disable the leader line so that only the target point graphic is produced, making the assertions unambiguous.\r\n const makeTargetPointLeader = (shape: TargetPointShape): TextAnnotationLeader => ({\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: false, showTargetPoint: true, targetPointShape: shape } },\r\n });\r\n\r\n it(\"should draw a 'cross' target point as two crossed line segments\", () => {\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"cross\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(2);\r\n for (const geometry of builder.geometries)\r\n expect(geometry).to.be.instanceOf(LineSegment3d);\r\n });\r\n\r\n it(\"should draw a 'plus' target point as two orthogonal line segments\", () => {\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"plus\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(2);\r\n for (const geometry of builder.geometries)\r\n expect(geometry).to.be.instanceOf(LineSegment3d);\r\n });\r\n\r\n it(\"should draw a 'circle' target point with a radius of half the terminator height\", () => {\r\n const terminatorHalfHeight = (TextStyleSettings.defaultProps.leader.terminatorHeightFactor ?? 1) * textHeight / 2;\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"circle\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(1);\r\n const circle = builder.geometries[0] as Arc3d;\r\n expect(circle).to.be.instanceOf(Arc3d);\r\n expect(circle.circularRadius()).to.be.closeTo(terminatorHalfHeight, 0.01);\r\n });\r\n\r\n it(\"should draw a 'square' target point as a closed line string with equal width and height\", () => {\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"square\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(1);\r\n const square = builder.geometries[0] as LineString3d;\r\n expect(square).to.be.instanceOf(LineString3d);\r\n expect(square.points.length).to.equal(5); // closed loop\r\n const width = Math.abs(square.points[1].x - square.points[0].x);\r\n const height = Math.abs(square.points[2].y - square.points[1].y);\r\n expect(width).to.be.closeTo(height, 0.01);\r\n });\r\n\r\n it(\"should draw a 'rectangle' target point as a closed line string using configured width and height\", () => {\r\n const terminatorWidth = (TextStyleSettings.defaultProps.leader.terminatorWidthFactor ?? 1) * textHeight;\r\n const terminatorHeight = (TextStyleSettings.defaultProps.leader.terminatorHeightFactor ?? 1) * textHeight;\r\n const result = appendLeadersToBuilder(builder, [makeTargetPointLeader(\"rectangle\")], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n expect(builder.geometries.length).to.equal(1);\r\n const rectangle = builder.geometries[0] as LineString3d;\r\n expect(rectangle).to.be.instanceOf(LineString3d);\r\n expect(rectangle.points.length).to.equal(5); // closed loop\r\n const width = Math.abs(rectangle.points[1].x - rectangle.points[0].x);\r\n const height = Math.abs(rectangle.points[2].y - rectangle.points[1].y);\r\n expect(width).to.be.closeTo(terminatorWidth, 0.01);\r\n expect(height).to.be.closeTo(terminatorHeight, 0.01);\r\n });\r\n\r\n it(\"should produce target point geometry for every predefined shape\", () => {\r\n for (const shape of targetPointShapes) {\r\n const localBuilder = new MockBuilder();\r\n const result = appendLeadersToBuilder(localBuilder, [makeTargetPointLeader(shape)], layout, transform, new GeometryParams(Id64.invalid), textStyleResolver, scaleFactor);\r\n expect(result, `shape: ${shape}`).to.be.true;\r\n expect(localBuilder.geometries.length, `shape: ${shape}`).to.be.greaterThan(0);\r\n }\r\n });\r\n\r\n it(\"should not offset the leader start point when targetPointOffsetFactor is 0\", () => {\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showTargetPoint: true, targetPointOffsetFactor: 0 } },\r\n };\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n expect(leaderLine.points[0].isAlmostEqual(leader.startPoint)).to.be.true;\r\n });\r\n\r\n it(\"should offset the leader start point away from the target point when targetPointOffsetFactor is non-zero\", () => {\r\n const offsetFactor = 2;\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showTargetPoint: true, targetPointOffsetFactor: offsetFactor } },\r\n };\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n // The leader line should start away from the original start point by offsetFactor * textHeight.\r\n expect(leaderLine.points[0].isAlmostEqual(leader.startPoint)).to.be.false;\r\n const offsetDistance = leaderLine.points[0].distance(leader.startPoint);\r\n expect(offsetDistance).to.be.closeTo(offsetFactor * textHeight, 0.01);\r\n });\r\n\r\n it(\"should clamp oversized target-point offsets to the first leader segment\", () => {\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n intermediatePoints: [Point3d.create(20, 0, 0)],\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: true, showTargetPoint: true, showTerminators: false, targetPointOffsetFactor: 100 } },\r\n };\r\n\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n const offsetDistance = leaderLine.points[0].distance(leader.startPoint);\r\n expect(offsetDistance).to.be.at.most(leader.startPoint.distance(leader.intermediatePoints![0]));\r\n });\r\n\r\n it(\"should treat negative target-point offsets as zero\", () => {\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n intermediatePoints: [Point3d.create(20, 0, 0)],\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: true, showTargetPoint: true, showTerminators: false, targetPointOffsetFactor: -2 } },\r\n };\r\n\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n\r\n const leaderLine = builder.geometries[0] as LineString3d;\r\n expect(leaderLine.points[0].isAlmostEqual(leader.startPoint)).to.be.true;\r\n });\r\n\r\n it(\"should draw the target point graphic at the original start point regardless of the offset\", () => {\r\n const offsetFactor = 2;\r\n const leader: TextAnnotationLeader = {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { showLeaders: false, showTargetPoint: true, targetPointShape: \"circle\", targetPointOffsetFactor: offsetFactor } },\r\n };\r\n const result = appendLeadersToBuilder(builder, [leader], layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const circle = builder.geometries[0] as Arc3d;\r\n expect(circle).to.be.instanceOf(Arc3d);\r\n expect(circle.center.isAlmostEqual(leader.startPoint)).to.be.true;\r\n });\r\n\r\n });\r\n });\r\n\r\n describe(\"computeElbowDirection\", () => {\r\n it(\"should render a leader without an elbow when wantElbow is true and elbowLength is 0\", () => {\r\n const leaders: TextAnnotationLeader[] = [{\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: { leader: { wantElbow: true, elbowLength: 0, terminatorHeightFactor: 2, terminatorWidthFactor: 2 } },\r\n }];\r\n const result = appendLeadersToBuilder(builder, leaders, layout, transform, defaultParams, textStyleResolver, scaleFactor);\r\n expect(result).to.be.true;\r\n const leaderLines = builder.geometries[0] as LineString3d;\r\n expect(leaderLines.points.length).to.equal(2); // start + end, no elbow\r\n });\r\n\r\n it(\"should return elbow direction\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5\r\n }\r\n }\r\n }\r\n ];\r\n\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n if (attachmentPoint) {\r\n const elbowDirection = computeElbowDirection(attachmentPoint, frameCurve,\r\n leaders[0].styleOverrides?.leader?.elbowLength ?? 1);\r\n expect(elbowDirection).to.exist;\r\n }\r\n });\r\n\r\n it(\"should return undefined if elbow is tangential\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(10, 0, 0),\r\n attachment: { mode: \"Nearest\" },\r\n styleOverrides: {\r\n leader: {\r\n wantElbow: true,\r\n elbowLength: 5\r\n }\r\n }\r\n }\r\n ];\r\n\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n if (attachmentPoint) {\r\n const elbowDirection = computeElbowDirection(attachmentPoint, frameCurve,\r\n leaders[0].styleOverrides?.leader?.elbowLength ?? 1);\r\n expect(elbowDirection).to.be.undefined;\r\n }\r\n });\r\n })\r\n\r\n describe(\"computeLeaderAttachmentPoint\", () => {\r\n it(\"should return correct attachmentPoint for 'Nearest' mode\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(-20, 0, 0),\r\n attachment: { mode: \"Nearest\" }\r\n }\r\n ];\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n expect(attachmentPoint).to.exist;\r\n expect(attachmentPoint!.isAlmostEqual(Point3d.create(0, 0, 0))).to.be.true;\r\n });\r\n\r\n it(\"should return correct attachmentPoint for 'Keypoint' mode\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(-20, 0, 0),\r\n attachment: { mode: \"KeyPoint\", curveIndex: 0, fraction: 0 }\r\n }\r\n ];\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n expect(attachmentPoint).to.exist;\r\n expect(attachmentPoint?.y).to.be.equal(range.low.y); // expected to be at the bottom of the TextBlock\r\n });\r\n\r\n it(\"should return correct attachmentPoint for 'TextPoint' mode\", () => {\r\n const leaders: TextAnnotationLeader[] = [\r\n {\r\n startPoint: Point3d.create(-20, 0, 0),\r\n attachment: { mode: \"TextPoint\", position: \"TopLeft\" }\r\n }\r\n ];\r\n const attachmentPoint = computeLeaderAttachmentPoint(leaders[0], frameCurve, layout, transform);\r\n expect(attachmentPoint).to.exist;\r\n const topY = range.high.y;\r\n const middleY = (range.low.y + range.high.y) / 2;\r\n expect(attachmentPoint!.y).to.be.within(middleY, topY); // expected to be in the upper half of the TextBlock\r\n });\r\n })\r\n\r\n})\r\n"]}
|
|
@@ -24,6 +24,27 @@ describe("Common table expression support in ECSQL", () => {
|
|
|
24
24
|
after(async () => {
|
|
25
25
|
imodel1.close();
|
|
26
26
|
});
|
|
27
|
+
for (const api of ["createQueryReader", "withQueryReader"]) {
|
|
28
|
+
it(`${api} preserves a zero-valued authoringId in a recursive CTE with UNION`, async () => {
|
|
29
|
+
const query = `
|
|
30
|
+
WITH RECURSIVE tree(authoringId, label, level) AS (
|
|
31
|
+
SELECT e.ECInstanceId authoringId, 'root' label, 0 level
|
|
32
|
+
FROM bis.Element e WHERE e.ECInstanceId = 1
|
|
33
|
+
UNION
|
|
34
|
+
SELECT 0 authoringId, 'child' label, level + 1
|
|
35
|
+
FROM tree WHERE level < 1
|
|
36
|
+
)
|
|
37
|
+
SELECT authoringId, label, level FROM tree ORDER BY level`;
|
|
38
|
+
const options = { rowFormat: QueryRowFormat.UseECSqlPropertyNames };
|
|
39
|
+
const rows = api === "createQueryReader"
|
|
40
|
+
? await imodel1.createQueryReader(query, undefined, options).toArray()
|
|
41
|
+
: imodel1.withQueryReader(query, (reader) => reader.toArray(), undefined, options);
|
|
42
|
+
assert.deepEqual(rows, [
|
|
43
|
+
{ authoringId: "0x1", label: "root", level: 0 },
|
|
44
|
+
{ authoringId: 0, label: "child", level: 1 },
|
|
45
|
+
]);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
27
48
|
it("collect base properties recursively", async () => {
|
|
28
49
|
const query = `
|
|
29
50
|
WITH RECURSIVE
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CTE.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/CTE.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert } from \"chai\";\r\nimport { QueryBinder, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { IModelDb, SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\r\n\r\n// cspell:ignore mirukuru ibim\r\n\r\nasync function executeQuery(iModel: IModelDb, ecsql: string, bindings?: any[] | object, abbreviateBlobs?: boolean): Promise<any[]> {\r\n const rows: any[] = [];\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n for await (const queryRow of iModel.createQueryReader(ecsql, QueryBinder.from(bindings), { rowFormat: QueryRowFormat.UseJsPropertyNames, abbreviateBlobs })) {\r\n rows.push(queryRow.toRow());\r\n }\r\n return rows;\r\n}\r\n\r\ndescribe(\"Common table expression support in ECSQL\", () => {\r\n let imodel1: SnapshotDb;\r\n\r\n before(async () => {\r\n imodel1 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n });\r\n\r\n after(async () => {\r\n imodel1.close();\r\n });\r\n it(\"collect base properties recursively\", async () => {\r\n const query = `\r\n WITH RECURSIVE\r\n base_classes (aId, aParentId, aPath, aDepth) AS (\r\n SELECT c.ECInstanceId, null, c.Name, 0 FROM meta.ECClassDef c WHERE c.Name=?\r\n UNION ALL\r\n SELECT c.ECInstanceId, cbc.TargetECInstanceId, aPath || '/' || c.Name, aDepth + 1\r\n FROM meta.ECClassDef c\r\n JOIN meta.ClassHasBaseClasses cbc ON cbc.SourceECInstanceId = c.ECInstanceId\r\n JOIN base_classes ON aId = cbc.TargetECInstanceId\r\n ORDER BY 1\r\n )\r\n SELECT p.Name prop from base_classes join meta.ECPropertyDef p on p.Class.id = aId GROUP BY p.Name` ;\r\n const rows = await executeQuery(imodel1, query, [\"Element\"]);\r\n const expected = [\"Angle\", \"BaseModel\", \"BBoxHigh\", \"BBoxLow\", \"Border\", \"BorderTemplate\", \"Category\", \"CategorySelector\", \"CodeScope\", \"CodeSpec\", \"CodeValue\", \"Data\", \"Description\", \"DisplayStyle\", \"DrawingModel\", \"Enabled\", \"Extents\", \"EyePoint\", \"FederationGuid\", \"Flags\", \"FocusDistance\", \"Format\", \"GeometryStream\", \"Height\", \"InSpatialIndex\", \"IsCameraOn\", \"IsPrivate\", \"JsonProperties\", \"LastMod\", \"LensAngle\", \"Model\", \"ModelSelector\", \"Name\", \"Origin\", \"PaletteName\", \"Parent\", \"Pitch\", \"Properties\", \"Rank\", \"Recipe\", \"RepositoryGuid\", \"Roll\", \"Rotation\", \"RotationAngle\", \"Scale\", \"SheetTemplate\", \"Type\", \"TypeDefinition\", \"Url\", \"UserLabel\", \"View\", \"ViewAttachment\", \"Width\", \"Yaw\"];\r\n const actual = rows.map((r) => r.prop);\r\n assert.sameOrderedMembers(actual, expected);\r\n });\r\n\r\n it(\"generate mandelbrot set\", async () => {\r\n const rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n [xaxis]([x]) AS(\r\n VALUES (- 2.0)\r\n UNION ALL\r\n SELECT [x] + 0.05\r\n FROM [xaxis]\r\n WHERE [x] < 1.2\r\n ),\r\n [yaxis]([y]) AS(\r\n VALUES (- 1.0)\r\n UNION ALL\r\n SELECT [y] + 0.1\r\n FROM [yaxis]\r\n WHERE [y] < 1.0\r\n ),\r\n [m]([iter], [cx], [cy], [x], [y]) AS(\r\n SELECT\r\n 0,\r\n [x],\r\n [y],\r\n 0.0,\r\n 0.0\r\n FROM [xaxis],\r\n [yaxis]\r\n UNION ALL\r\n SELECT\r\n [iter] + 1,\r\n [cx],\r\n [cy],\r\n [x] * [x] - [y] * [y] + [cx],\r\n 2.0 * [x] * [y] + [cy]\r\n FROM [m]\r\n WHERE ([x] * [x] + [y] * [y]) < 4.0 AND [iter] < 28\r\n ),\r\n [m2]([iter], [cx], [cy]) AS(\r\n SELECT\r\n MAX ([iter]),\r\n [cx],\r\n [cy]\r\n FROM [m]\r\n GROUP BY\r\n [cx],\r\n [cy]\r\n ),\r\n [a]([t]) AS(\r\n SELECT GROUP_CONCAT (SUBSTR (' .+*#', 1 + (CASE WHEN [iter] / 7 > 4 THEN 4 ELSE [iter] / 7 END), 1), '')\r\n FROM [m2]\r\n GROUP BY [cy]\r\n )\r\n SELECT GROUP_CONCAT (RTRIM ([t]), CHAR (0xa)) mandelbrot_set\r\n FROM [a];\r\n `);\r\n\r\n const expected =\r\n \" ....#\\n\" +\r\n \" ..#*..\\n\" +\r\n \" ..+####+.\\n\" +\r\n \" .......+####.... +\\n\" +\r\n \" ..##+*##########+.++++\\n\" +\r\n \" .+.##################+.\\n\" +\r\n \" .............+###################+.+\\n\" +\r\n \" ..++..#.....*#####################+.\\n\" +\r\n \" ...+#######++#######################.\\n\" +\r\n \" ....+*################################.\\n\" +\r\n \" #############################################...\\n\" +\r\n \" ....+*################################.\\n\" +\r\n \" ...+#######++#######################.\\n\" +\r\n \" ..++..#.....*#####################+.\\n\" +\r\n \" .............+###################+.+\\n\" +\r\n \" .+.##################+.\\n\" +\r\n \" ..##+*##########+.++++\\n\" +\r\n \" .......+####.... +\\n\" +\r\n \" ..+####+.\\n\" +\r\n \" ..#*..\\n\" +\r\n \" ....#\\n\" +\r\n \" +.\";\r\n assert(rows[0].mandelbrot_set === expected);\r\n });\r\n\r\n it(\"basic cte test\", async () => {\r\n let rows = [];\r\n rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n cnt (x,y) AS (\r\n SELECT 100, 200\r\n UNION ALL\r\n SELECT x+1, 200 FROM cnt WHERE x<210\r\n )\r\n SELECT * from cnt`);\r\n assert(rows.length === 111);\r\n\r\n rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n cnt (x,y) AS (\r\n SELECT 100, 200\r\n )\r\n SELECT * from cnt`);\r\n\r\n let slm = new SequentialLogMatcher();\r\n // these two are generated by sqlite\r\n slm.append().error().category(\"ECDb\").message(/BE_SQLITE_ERROR duplicate WITH table name/gm);\r\n assert(rows.length === 1);\r\n try {\r\n rows = await executeQuery(imodel1, `\r\n WITH\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400, 300\r\n ),\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400, 300\r\n )\r\n SELECT * from cte_1`);\r\n assert(false);\r\n } catch {\r\n assert(true); // should fail as cte_1 is used for two ct expression.\r\n }\r\n assert.isTrue(slm.finishAndDispose());\r\n slm = new SequentialLogMatcher();\r\n // these two are generated by ECSQL. Its not clear why this message is logged twice.\r\n slm.append().error().category(\"ECDb\").message(/Common table 'cte_1' has 3 values for columns 2/gm);\r\n try {\r\n rows = await executeQuery(imodel1, `\r\n WITH\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400\r\n )\r\n SELECT * from cte_1`);\r\n assert(false);\r\n } catch {\r\n assert(true); // number are to ct expression does not match select\r\n }\r\n assert.isTrue(slm.finishAndDispose());\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"CTE.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/CTE.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert } from \"chai\";\r\nimport { QueryBinder, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { IModelDb, SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\r\n\r\n// cspell:ignore mirukuru ibim\r\n\r\nasync function executeQuery(iModel: IModelDb, ecsql: string, bindings?: any[] | object, abbreviateBlobs?: boolean): Promise<any[]> {\r\n const rows: any[] = [];\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n for await (const queryRow of iModel.createQueryReader(ecsql, QueryBinder.from(bindings), { rowFormat: QueryRowFormat.UseJsPropertyNames, abbreviateBlobs })) {\r\n rows.push(queryRow.toRow());\r\n }\r\n return rows;\r\n}\r\n\r\ndescribe(\"Common table expression support in ECSQL\", () => {\r\n let imodel1: SnapshotDb;\r\n\r\n before(async () => {\r\n imodel1 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n });\r\n\r\n after(async () => {\r\n imodel1.close();\r\n });\r\n\r\n for (const api of [\"createQueryReader\", \"withQueryReader\"]) {\r\n it(`${api} preserves a zero-valued authoringId in a recursive CTE with UNION`, async () => {\r\n const query = `\r\n WITH RECURSIVE tree(authoringId, label, level) AS (\r\n SELECT e.ECInstanceId authoringId, 'root' label, 0 level\r\n FROM bis.Element e WHERE e.ECInstanceId = 1\r\n UNION\r\n SELECT 0 authoringId, 'child' label, level + 1\r\n FROM tree WHERE level < 1\r\n )\r\n SELECT authoringId, label, level FROM tree ORDER BY level`;\r\n\r\n const options = { rowFormat: QueryRowFormat.UseECSqlPropertyNames };\r\n const rows = api === \"createQueryReader\"\r\n ? await imodel1.createQueryReader(query, undefined, options).toArray()\r\n : imodel1.withQueryReader(query, (reader) => reader.toArray(), undefined, options);\r\n\r\n assert.deepEqual(rows, [\r\n { authoringId: \"0x1\", label: \"root\", level: 0 },\r\n { authoringId: 0, label: \"child\", level: 1 },\r\n ]);\r\n });\r\n }\r\n\r\n it(\"collect base properties recursively\", async () => {\r\n const query = `\r\n WITH RECURSIVE\r\n base_classes (aId, aParentId, aPath, aDepth) AS (\r\n SELECT c.ECInstanceId, null, c.Name, 0 FROM meta.ECClassDef c WHERE c.Name=?\r\n UNION ALL\r\n SELECT c.ECInstanceId, cbc.TargetECInstanceId, aPath || '/' || c.Name, aDepth + 1\r\n FROM meta.ECClassDef c\r\n JOIN meta.ClassHasBaseClasses cbc ON cbc.SourceECInstanceId = c.ECInstanceId\r\n JOIN base_classes ON aId = cbc.TargetECInstanceId\r\n ORDER BY 1\r\n )\r\n SELECT p.Name prop from base_classes join meta.ECPropertyDef p on p.Class.id = aId GROUP BY p.Name` ;\r\n const rows = await executeQuery(imodel1, query, [\"Element\"]);\r\n const expected = [\"Angle\", \"BaseModel\", \"BBoxHigh\", \"BBoxLow\", \"Border\", \"BorderTemplate\", \"Category\", \"CategorySelector\", \"CodeScope\", \"CodeSpec\", \"CodeValue\", \"Data\", \"Description\", \"DisplayStyle\", \"DrawingModel\", \"Enabled\", \"Extents\", \"EyePoint\", \"FederationGuid\", \"Flags\", \"FocusDistance\", \"Format\", \"GeometryStream\", \"Height\", \"InSpatialIndex\", \"IsCameraOn\", \"IsPrivate\", \"JsonProperties\", \"LastMod\", \"LensAngle\", \"Model\", \"ModelSelector\", \"Name\", \"Origin\", \"PaletteName\", \"Parent\", \"Pitch\", \"Properties\", \"Rank\", \"Recipe\", \"RepositoryGuid\", \"Roll\", \"Rotation\", \"RotationAngle\", \"Scale\", \"SheetTemplate\", \"Type\", \"TypeDefinition\", \"Url\", \"UserLabel\", \"View\", \"ViewAttachment\", \"Width\", \"Yaw\"];\r\n const actual = rows.map((r) => r.prop);\r\n assert.sameOrderedMembers(actual, expected);\r\n });\r\n\r\n it(\"generate mandelbrot set\", async () => {\r\n const rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n [xaxis]([x]) AS(\r\n VALUES (- 2.0)\r\n UNION ALL\r\n SELECT [x] + 0.05\r\n FROM [xaxis]\r\n WHERE [x] < 1.2\r\n ),\r\n [yaxis]([y]) AS(\r\n VALUES (- 1.0)\r\n UNION ALL\r\n SELECT [y] + 0.1\r\n FROM [yaxis]\r\n WHERE [y] < 1.0\r\n ),\r\n [m]([iter], [cx], [cy], [x], [y]) AS(\r\n SELECT\r\n 0,\r\n [x],\r\n [y],\r\n 0.0,\r\n 0.0\r\n FROM [xaxis],\r\n [yaxis]\r\n UNION ALL\r\n SELECT\r\n [iter] + 1,\r\n [cx],\r\n [cy],\r\n [x] * [x] - [y] * [y] + [cx],\r\n 2.0 * [x] * [y] + [cy]\r\n FROM [m]\r\n WHERE ([x] * [x] + [y] * [y]) < 4.0 AND [iter] < 28\r\n ),\r\n [m2]([iter], [cx], [cy]) AS(\r\n SELECT\r\n MAX ([iter]),\r\n [cx],\r\n [cy]\r\n FROM [m]\r\n GROUP BY\r\n [cx],\r\n [cy]\r\n ),\r\n [a]([t]) AS(\r\n SELECT GROUP_CONCAT (SUBSTR (' .+*#', 1 + (CASE WHEN [iter] / 7 > 4 THEN 4 ELSE [iter] / 7 END), 1), '')\r\n FROM [m2]\r\n GROUP BY [cy]\r\n )\r\n SELECT GROUP_CONCAT (RTRIM ([t]), CHAR (0xa)) mandelbrot_set\r\n FROM [a];\r\n `);\r\n\r\n const expected =\r\n \" ....#\\n\" +\r\n \" ..#*..\\n\" +\r\n \" ..+####+.\\n\" +\r\n \" .......+####.... +\\n\" +\r\n \" ..##+*##########+.++++\\n\" +\r\n \" .+.##################+.\\n\" +\r\n \" .............+###################+.+\\n\" +\r\n \" ..++..#.....*#####################+.\\n\" +\r\n \" ...+#######++#######################.\\n\" +\r\n \" ....+*################################.\\n\" +\r\n \" #############################################...\\n\" +\r\n \" ....+*################################.\\n\" +\r\n \" ...+#######++#######################.\\n\" +\r\n \" ..++..#.....*#####################+.\\n\" +\r\n \" .............+###################+.+\\n\" +\r\n \" .+.##################+.\\n\" +\r\n \" ..##+*##########+.++++\\n\" +\r\n \" .......+####.... +\\n\" +\r\n \" ..+####+.\\n\" +\r\n \" ..#*..\\n\" +\r\n \" ....#\\n\" +\r\n \" +.\";\r\n assert(rows[0].mandelbrot_set === expected);\r\n });\r\n\r\n it(\"basic cte test\", async () => {\r\n let rows = [];\r\n rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n cnt (x,y) AS (\r\n SELECT 100, 200\r\n UNION ALL\r\n SELECT x+1, 200 FROM cnt WHERE x<210\r\n )\r\n SELECT * from cnt`);\r\n assert(rows.length === 111);\r\n\r\n rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n cnt (x,y) AS (\r\n SELECT 100, 200\r\n )\r\n SELECT * from cnt`);\r\n\r\n let slm = new SequentialLogMatcher();\r\n // these two are generated by sqlite\r\n slm.append().error().category(\"ECDb\").message(/BE_SQLITE_ERROR duplicate WITH table name/gm);\r\n assert(rows.length === 1);\r\n try {\r\n rows = await executeQuery(imodel1, `\r\n WITH\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400, 300\r\n ),\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400, 300\r\n )\r\n SELECT * from cte_1`);\r\n assert(false);\r\n } catch {\r\n assert(true); // should fail as cte_1 is used for two ct expression.\r\n }\r\n assert.isTrue(slm.finishAndDispose());\r\n slm = new SequentialLogMatcher();\r\n // these two are generated by ECSQL. Its not clear why this message is logged twice.\r\n slm.append().error().category(\"ECDb\").message(/Common table 'cte_1' has 3 values for columns 2/gm);\r\n try {\r\n rows = await executeQuery(imodel1, `\r\n WITH\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400\r\n )\r\n SELECT * from cte_1`);\r\n assert(false);\r\n } catch {\r\n assert(true); // number are to ct expression does not match select\r\n }\r\n assert.isTrue(slm.finishAndDispose());\r\n });\r\n});\r\n"]}
|