@itwin/unified-selection 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/README.md +34 -14
  3. package/lib/cjs/unified-selection/CachingHiliteSetProvider.d.ts +3 -7
  4. package/lib/cjs/unified-selection/CachingHiliteSetProvider.d.ts.map +1 -1
  5. package/lib/cjs/unified-selection/CachingHiliteSetProvider.js +14 -17
  6. package/lib/cjs/unified-selection/CachingHiliteSetProvider.js.map +1 -1
  7. package/lib/cjs/unified-selection/EnableUnifiedSelectionSyncWithIModel.d.ts +90 -0
  8. package/lib/cjs/unified-selection/EnableUnifiedSelectionSyncWithIModel.d.ts.map +1 -0
  9. package/lib/cjs/unified-selection/EnableUnifiedSelectionSyncWithIModel.js +205 -0
  10. package/lib/cjs/unified-selection/EnableUnifiedSelectionSyncWithIModel.js.map +1 -0
  11. package/lib/cjs/unified-selection/HiliteSetProvider.d.ts +2 -4
  12. package/lib/cjs/unified-selection/HiliteSetProvider.d.ts.map +1 -1
  13. package/lib/cjs/unified-selection/HiliteSetProvider.js +156 -110
  14. package/lib/cjs/unified-selection/HiliteSetProvider.js.map +1 -1
  15. package/lib/cjs/unified-selection/Selectable.d.ts +0 -3
  16. package/lib/cjs/unified-selection/Selectable.d.ts.map +1 -1
  17. package/lib/cjs/unified-selection/Selectable.js +2 -2
  18. package/lib/cjs/unified-selection/Selectable.js.map +1 -1
  19. package/lib/cjs/unified-selection/SelectionChangeEvent.d.ts +5 -3
  20. package/lib/cjs/unified-selection/SelectionChangeEvent.d.ts.map +1 -1
  21. package/lib/cjs/unified-selection/SelectionChangeEvent.js.map +1 -1
  22. package/lib/cjs/unified-selection/SelectionScope.d.ts +2 -2
  23. package/lib/cjs/unified-selection/SelectionScope.d.ts.map +1 -1
  24. package/lib/cjs/unified-selection/SelectionScope.js +87 -54
  25. package/lib/cjs/unified-selection/SelectionScope.js.map +1 -1
  26. package/lib/cjs/unified-selection/SelectionStorage.d.ts +20 -28
  27. package/lib/cjs/unified-selection/SelectionStorage.d.ts.map +1 -1
  28. package/lib/cjs/unified-selection/SelectionStorage.js +21 -18
  29. package/lib/cjs/unified-selection/SelectionStorage.js.map +1 -1
  30. package/lib/cjs/unified-selection/Utils.d.ts +7 -0
  31. package/lib/cjs/unified-selection/Utils.d.ts.map +1 -0
  32. package/lib/cjs/unified-selection/{queries/ECSqlCore.js → Utils.js} +2 -1
  33. package/lib/cjs/unified-selection/Utils.js.map +1 -0
  34. package/lib/cjs/unified-selection/types/IModel.d.ts +84 -0
  35. package/lib/cjs/unified-selection/types/IModel.d.ts.map +1 -0
  36. package/lib/cjs/unified-selection/types/IModel.js +24 -0
  37. package/lib/cjs/unified-selection/types/IModel.js.map +1 -0
  38. package/lib/cjs/unified-selection.d.ts +1 -6
  39. package/lib/cjs/unified-selection.d.ts.map +1 -1
  40. package/lib/cjs/unified-selection.js +3 -7
  41. package/lib/cjs/unified-selection.js.map +1 -1
  42. package/lib/esm/unified-selection/CachingHiliteSetProvider.d.ts +3 -7
  43. package/lib/esm/unified-selection/CachingHiliteSetProvider.d.ts.map +1 -1
  44. package/lib/esm/unified-selection/CachingHiliteSetProvider.js +14 -17
  45. package/lib/esm/unified-selection/CachingHiliteSetProvider.js.map +1 -1
  46. package/lib/esm/unified-selection/EnableUnifiedSelectionSyncWithIModel.d.ts +90 -0
  47. package/lib/esm/unified-selection/EnableUnifiedSelectionSyncWithIModel.d.ts.map +1 -0
  48. package/lib/esm/unified-selection/EnableUnifiedSelectionSyncWithIModel.js +200 -0
  49. package/lib/esm/unified-selection/EnableUnifiedSelectionSyncWithIModel.js.map +1 -0
  50. package/lib/esm/unified-selection/HiliteSetProvider.d.ts +2 -4
  51. package/lib/esm/unified-selection/HiliteSetProvider.d.ts.map +1 -1
  52. package/lib/esm/unified-selection/HiliteSetProvider.js +155 -109
  53. package/lib/esm/unified-selection/HiliteSetProvider.js.map +1 -1
  54. package/lib/esm/unified-selection/Selectable.d.ts +0 -3
  55. package/lib/esm/unified-selection/Selectable.d.ts.map +1 -1
  56. package/lib/esm/unified-selection/Selectable.js.map +1 -1
  57. package/lib/esm/unified-selection/SelectionChangeEvent.d.ts +5 -3
  58. package/lib/esm/unified-selection/SelectionChangeEvent.d.ts.map +1 -1
  59. package/lib/esm/unified-selection/SelectionChangeEvent.js.map +1 -1
  60. package/lib/esm/unified-selection/SelectionScope.d.ts +2 -2
  61. package/lib/esm/unified-selection/SelectionScope.d.ts.map +1 -1
  62. package/lib/esm/unified-selection/SelectionScope.js +84 -51
  63. package/lib/esm/unified-selection/SelectionScope.js.map +1 -1
  64. package/lib/esm/unified-selection/SelectionStorage.d.ts +20 -28
  65. package/lib/esm/unified-selection/SelectionStorage.d.ts.map +1 -1
  66. package/lib/esm/unified-selection/SelectionStorage.js +21 -18
  67. package/lib/esm/unified-selection/SelectionStorage.js.map +1 -1
  68. package/lib/esm/unified-selection/Utils.d.ts +7 -0
  69. package/lib/esm/unified-selection/Utils.d.ts.map +1 -0
  70. package/lib/esm/unified-selection/{queries/ECSqlCore.js → Utils.js} +2 -1
  71. package/lib/esm/unified-selection/Utils.js.map +1 -0
  72. package/lib/esm/unified-selection/types/IModel.d.ts +84 -0
  73. package/lib/esm/unified-selection/types/IModel.d.ts.map +1 -0
  74. package/lib/esm/unified-selection/types/IModel.js +21 -0
  75. package/lib/esm/unified-selection/types/IModel.js.map +1 -0
  76. package/lib/esm/unified-selection.d.ts +1 -6
  77. package/lib/esm/unified-selection.d.ts.map +1 -1
  78. package/lib/esm/unified-selection.js +1 -6
  79. package/lib/esm/unified-selection.js.map +1 -1
  80. package/package.json +23 -16
  81. package/lib/cjs/unified-selection/queries/ECMetadata.d.ts +0 -44
  82. package/lib/cjs/unified-selection/queries/ECMetadata.d.ts.map +0 -1
  83. package/lib/cjs/unified-selection/queries/ECMetadata.js +0 -17
  84. package/lib/cjs/unified-selection/queries/ECMetadata.js.map +0 -1
  85. package/lib/cjs/unified-selection/queries/ECSqlCore.d.ts +0 -69
  86. package/lib/cjs/unified-selection/queries/ECSqlCore.d.ts.map +0 -1
  87. package/lib/cjs/unified-selection/queries/ECSqlCore.js.map +0 -1
  88. package/lib/esm/unified-selection/queries/ECMetadata.d.ts +0 -44
  89. package/lib/esm/unified-selection/queries/ECMetadata.d.ts.map +0 -1
  90. package/lib/esm/unified-selection/queries/ECMetadata.js +0 -13
  91. package/lib/esm/unified-selection/queries/ECMetadata.js.map +0 -1
  92. package/lib/esm/unified-selection/queries/ECSqlCore.d.ts +0 -69
  93. package/lib/esm/unified-selection/queries/ECSqlCore.d.ts.map +0 -1
  94. package/lib/esm/unified-selection/queries/ECSqlCore.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnableUnifiedSelectionSyncWithIModel.js","sourceRoot":"","sources":["../../../src/unified-selection/EnableUnifiedSelectionSyncWithIModel.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { from, Subject, takeUntil } from \"rxjs\";\nimport { assert, Id64Arg, using } from \"@itwin/core-bentley\";\nimport { ECSchemaProvider, ECSqlQueryExecutor } from \"@itwin/presentation-shared\";\nimport { CachingHiliteSetProvider, createCachingHiliteSetProvider } from \"./CachingHiliteSetProvider\";\nimport { createHiliteSetProvider, HiliteSet, HiliteSetProvider } from \"./HiliteSetProvider\";\nimport { SelectableInstanceKey, Selectables } from \"./Selectable\";\nimport { StorageSelectionChangeEventArgs, StorageSelectionChangeType } from \"./SelectionChangeEvent\";\nimport { computeSelection, ComputeSelectionProps } from \"./SelectionScope\";\nimport { SelectionStorage } from \"./SelectionStorage\";\nimport { CoreIModelHiliteSet, CoreIModelSelectionSet, CoreSelectionSetEventType, CoreSelectionSetEventUnsafe } from \"./types/IModel\";\n\n/**\n * Props for `enableUnifiedSelectionSyncWithIModel`.\n * @internal Not exported through barrel, but used in public API as an argument. May be supplemented with optional attributes any time.\n */\nexport interface EnableUnifiedSelectionSyncWithIModelProps {\n /**\n * Provides access to different iModel's features: query executing, metadata access, selection and hilite sets.\n * It's recommended to use `@itwin/presentation-core-interop` to create `ECSqlQueryExecutor` and `ECSchemaProvider` from\n * [IModelConnection](https://www.itwinjs.org/reference/core-frontend/imodelconnection/imodelconnection/) and map its `key`,\n * `hilited` and `selectionSet` attributes like this:\n *\n * ```ts\n * import { createECSqlQueryExecutor, createECSchemaProvider } from \"@itwin/presentation-core-interop\";\n * import { IModelConnection } from \"@itwin/core-frontend\";\n *\n * const imodel: IModelConnection = ...\n * const imodelAccess = {\n * ...createECSqlQueryExecutor(imodel),\n * ...createECSchemaProvider(MyAppFrontend.getSchemaContext(imodel)),\n * key: imodel.key,\n * hiliteSet: imodel.hilited,\n * selectionSet: imodel.selectionSet,\n * };\n * ```.\n */\n imodelAccess: ECSqlQueryExecutor &\n ECSchemaProvider & {\n /** Key of the iModel. Generally taken from `IModelConnection.key`. */\n readonly key: string;\n /** The set of currently hilited elements taken from `IModelConnection.hilited`. */\n readonly hiliteSet: CoreIModelHiliteSet;\n /** The set of currently selected elements taken from `IModelConnection.selectionSet`. */\n readonly selectionSet: CoreIModelSelectionSet;\n };\n\n /** Selection storage to synchronize IModel's tool selection with. */\n selectionStorage: SelectionStorage;\n\n /** Active scope provider. */\n activeScopeProvider: () => ComputeSelectionProps[\"scope\"];\n\n /**\n * A caching hilite set provider used to retrieve hilite sets for an iModel. If not provided, a new `CachingHiliteSetProvider`\n * will be created for the given iModel using the provided `imodelAccess`.\n * If the consuming application already has a `CachingHiliteSetProvider` defined, it should be provided instead\n * to reuse the cache and avoid creating new providers for each iModel.\n */\n cachingHiliteSetProvider?: CachingHiliteSetProvider;\n}\n\n/**\n * Enables synchronization between iModel selection and unified selection.\n * @returns function for disposing the synchronization.\n * @beta\n */\nexport function enableUnifiedSelectionSyncWithIModel(props: EnableUnifiedSelectionSyncWithIModelProps): () => void {\n const selectionHandler = new IModelSelectionHandler(props);\n return () => selectionHandler.dispose();\n}\n\n/**\n * A handler that syncs selection between unified selection storage\n * (`SelectionStorage`) and an iModel (`iModel.selectionSet`, `iModel.hilited`).\n * @internal\n */\nexport class IModelSelectionHandler {\n private _selectionSourceName = \"Tool\";\n\n private _imodelAccess: EnableUnifiedSelectionSyncWithIModelProps[\"imodelAccess\"];\n private _selectionStorage: SelectionStorage;\n private _hiliteSetProvider: HiliteSetProvider;\n private _cachingHiliteSetProvider: CachingHiliteSetProvider;\n private _activeScopeProvider: () => ComputeSelectionProps[\"scope\"];\n\n private _isSuspended: boolean;\n private _cancelOngoingChanges = new Subject<void>();\n private _unifiedSelectionListenerDisposeFunc: () => void;\n private _imodelListenerDisposeFunc: () => void;\n private _hasCustomCachingHiliteSetProvider: boolean;\n\n public constructor(props: EnableUnifiedSelectionSyncWithIModelProps) {\n this._imodelAccess = props.imodelAccess;\n this._selectionStorage = props.selectionStorage;\n this._activeScopeProvider = props.activeScopeProvider;\n this._isSuspended = false;\n this._hasCustomCachingHiliteSetProvider = !!props.cachingHiliteSetProvider;\n\n this._cachingHiliteSetProvider =\n props.cachingHiliteSetProvider ??\n createCachingHiliteSetProvider({\n selectionStorage: this._selectionStorage,\n imodelProvider: () => this._imodelAccess,\n });\n\n this._hiliteSetProvider = createHiliteSetProvider({ imodelAccess: this._imodelAccess });\n this._imodelListenerDisposeFunc = this._imodelAccess.selectionSet.onChanged.addListener(this.onIModelSelectionChanged);\n this._unifiedSelectionListenerDisposeFunc = this._selectionStorage.selectionChangeEvent.addListener(this.onUnifiedSelectionChanged);\n\n // stop imodel from syncing tool selection with hilited list - we want to override that behavior\n this._imodelAccess.hiliteSet.wantSyncWithSelectionSet = false;\n this.applyCurrentHiliteSet({ activeSelectionAction: \"clearAll\" });\n }\n\n public dispose() {\n this._cancelOngoingChanges.next();\n this._imodelListenerDisposeFunc();\n this._unifiedSelectionListenerDisposeFunc();\n if (!this._hasCustomCachingHiliteSetProvider) {\n this._cachingHiliteSetProvider.dispose();\n }\n }\n\n /** Temporarily suspends tool selection synchronization until the returned `IDisposable` is disposed. */\n public suspendIModelToolSelectionSync() {\n const wasSuspended = this._isSuspended;\n this._isSuspended = true;\n return {\n dispose: () => (this._isSuspended = wasSuspended),\n };\n }\n\n private handleUnifiedSelectionChange(changeType: StorageSelectionChangeType, selectables: Selectables, source: string) {\n if (changeType === \"clear\" || changeType === \"replace\") {\n this.applyCurrentHiliteSet({ activeSelectionAction: changeType === \"replace\" && source === \"Tool\" ? \"clearHilited\" : \"clearAll\" });\n return;\n }\n\n if (changeType === \"add\") {\n from(this._hiliteSetProvider.getHiliteSet({ selectables }))\n .pipe(takeUntil(this._cancelOngoingChanges))\n .subscribe({\n next: (set) => {\n this.addHiliteSet(set);\n },\n });\n return;\n }\n\n from(this._hiliteSetProvider.getHiliteSet({ selectables }))\n .pipe(takeUntil(this._cancelOngoingChanges))\n .subscribe({\n next: (set) => {\n this.removeHiliteSet(set);\n },\n complete: () => {\n this.applyCurrentHiliteSet({ activeSelectionAction: \"keep\" });\n },\n });\n }\n\n private onUnifiedSelectionChanged = (args: StorageSelectionChangeEventArgs) => {\n // iModels are only interested in top-level selection changes\n if (args.imodelKey !== this._imodelAccess.key || args.level !== 0) {\n return;\n }\n\n if (args.changeType === \"replace\" || args.changeType === \"clear\") {\n this._cancelOngoingChanges.next();\n }\n this.handleUnifiedSelectionChange(args.changeType, args.selectables, args.source);\n };\n\n private applyCurrentHiliteSet({ activeSelectionAction }: { activeSelectionAction: \"clearAll\" | \"clearHilited\" | \"keep\" }) {\n if (activeSelectionAction !== \"keep\") {\n using(this.suspendIModelToolSelectionSync(), (_) => {\n this._imodelAccess.hiliteSet.clear();\n if (activeSelectionAction === \"clearAll\") {\n this._imodelAccess.selectionSet.emptyAll();\n }\n });\n }\n\n from(this._cachingHiliteSetProvider.getHiliteSet({ imodelKey: this._imodelAccess.key }))\n .pipe(takeUntil(this._cancelOngoingChanges))\n .subscribe({\n next: (ids) => {\n this.addHiliteSet(ids);\n },\n });\n }\n\n private addHiliteSet(set: HiliteSet) {\n using(this.suspendIModelToolSelectionSync(), (_) => {\n if (set.models && set.models.length) {\n this._imodelAccess.hiliteSet.models.addIds(set.models);\n }\n if (set.subCategories && set.subCategories.length) {\n this._imodelAccess.hiliteSet.subcategories.addIds(set.subCategories);\n }\n if (set.elements && set.elements.length) {\n this._imodelAccess.hiliteSet.elements.addIds(set.elements);\n this._imodelAccess.selectionSet.add(set.elements);\n }\n });\n }\n\n private removeHiliteSet(set: HiliteSet) {\n using(this.suspendIModelToolSelectionSync(), (_) => {\n if (set.models.length) {\n this._imodelAccess.hiliteSet.models.deleteIds(set.models);\n }\n if (set.subCategories.length) {\n this._imodelAccess.hiliteSet.subcategories.deleteIds(set.subCategories);\n }\n if (set.elements.length) {\n this._imodelAccess.hiliteSet.elements.deleteIds(set.elements);\n this._imodelAccess.selectionSet.remove(set.elements);\n }\n });\n }\n\n private onIModelSelectionChanged = async (event?: CoreSelectionSetEventUnsafe): Promise<void> => {\n if (this._isSuspended) {\n return;\n }\n\n if (CoreSelectionSetEventType.Clear === event!.type) {\n this._selectionStorage.clearSelection({ imodelKey: this._imodelAccess.key, source: this._selectionSourceName });\n return;\n }\n\n const elementIds = this.getSelectionSetChangeIds(event!);\n const scopedSelection = computeSelection({ queryExecutor: this._imodelAccess, elementIds, scope: this._activeScopeProvider() });\n await this.handleIModelSelectionChange(event!.type, scopedSelection);\n };\n\n private async handleIModelSelectionChange(type: CoreSelectionSetEventType, iterator: AsyncIterableIterator<SelectableInstanceKey>) {\n if (type === CoreSelectionSetEventType.Remove) {\n for await (const selectable of iterator) {\n this._selectionStorage.removeFromSelection({ imodelKey: this._imodelAccess.key, source: this._selectionSourceName, selectables: [selectable] });\n }\n return;\n }\n\n if (type === CoreSelectionSetEventType.Replace) {\n this._selectionStorage.clearSelection({ imodelKey: this._imodelAccess.key, source: this._selectionSourceName });\n }\n\n for await (const selectable of iterator) {\n this._selectionStorage.addToSelection({ imodelKey: this._imodelAccess.key, source: this._selectionSourceName, selectables: [selectable] });\n }\n }\n\n private getSelectionSetChangeIds(event: CoreSelectionSetEventUnsafe): string[] {\n switch (event.type) {\n case CoreSelectionSetEventType.Add:\n case CoreSelectionSetEventType.Replace:\n assert(!!event.added);\n return this.idArgToIds(event.added);\n default:\n assert(!!event.removed);\n return this.idArgToIds(event.removed);\n }\n }\n\n private idArgToIds(ids: Id64Arg): string[] {\n if (typeof ids === \"string\") {\n return [ids];\n }\n if (ids instanceof Set) {\n return [...ids];\n }\n return ids;\n }\n}\n"]}
@@ -1,5 +1,4 @@
1
- import { IMetadataProvider } from "./queries/ECMetadata";
2
- import { IECSqlQueryExecutor } from "./queries/ECSqlCore";
1
+ import { ECSchemaProvider, ECSqlQueryExecutor } from "@itwin/presentation-shared";
3
2
  import { Selectables } from "./Selectable";
4
3
  /**
5
4
  * A set of model, subcategory and element ids that can be used for specifying hilite.
@@ -16,8 +15,7 @@ export interface HiliteSet {
16
15
  * @internal Not exported through barrel, but used in public API as an argument. May be supplemented with optional attributes any time.
17
16
  */
18
17
  export interface HiliteSetProviderProps {
19
- queryExecutor: IECSqlQueryExecutor;
20
- metadataProvider: IMetadataProvider;
18
+ imodelAccess: ECSchemaProvider & ECSqlQueryExecutor;
21
19
  }
22
20
  /**
23
21
  * Defines return value of `createHiliteSetProvider`.
@@ -1 +1 @@
1
- {"version":3,"file":"HiliteSetProvider.d.ts","sourceRoot":"","sources":["../../../src/unified-selection/HiliteSetProvider.ts"],"names":[],"mappings":"AAWA,OAAO,EAAW,iBAAiB,EAAsB,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAgC,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAyB,WAAW,EAAE,MAAM,cAAc,CAAC;AAIlE;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,mBAAmB,CAAC;IACnC,gBAAgB,EAAE,iBAAiB,CAAC;CACrC;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,mEAAmE;IACnE,YAAY,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE,WAAW,CAAA;KAAE,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;CACrF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,iBAAiB,CAExF"}
1
+ {"version":3,"file":"HiliteSetProvider.d.ts","sourceRoot":"","sources":["../../../src/unified-selection/HiliteSetProvider.ts"],"names":[],"mappings":"AAOA,OAAO,EAAM,gBAAgB,EAAgB,kBAAkB,EAAsB,MAAM,4BAA4B,CAAC;AACxH,OAAO,EAAyB,WAAW,EAAE,MAAM,cAAc,CAAC;AAKlE;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,gBAAgB,GAAG,kBAAkB,CAAC;CACrD;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,mEAAmE;IACnE,YAAY,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE,WAAW,CAAA;KAAE,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;CACrF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,iBAAiB,CAExF"}
@@ -5,13 +5,10 @@
5
5
  *--------------------------------------------------------------------------------------------*/
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.createHiliteSetProvider = void 0;
8
- /** @packageDocumentation
9
- * @module UnifiedSelection
10
- */
11
8
  const rxjs_1 = require("rxjs");
12
9
  const rxjs_for_await_1 = require("rxjs-for-await");
13
- const ECMetadata_1 = require("./queries/ECMetadata");
14
- const ECSqlCore_1 = require("./queries/ECSqlCore");
10
+ const presentation_shared_1 = require("@itwin/presentation-shared");
11
+ const Utils_1 = require("./Utils");
15
12
  const HILITE_SET_EMIT_FREQUENCY = 20;
16
13
  /**
17
14
  * Creates a hilite set provider that returns a `HiliteSet` for given selectables.
@@ -22,13 +19,11 @@ function createHiliteSetProvider(props) {
22
19
  }
23
20
  exports.createHiliteSetProvider = createHiliteSetProvider;
24
21
  class HiliteSetProviderImpl {
25
- _queryExecutor;
26
- _metadataProvider;
22
+ _imodelAccess;
27
23
  // Map between a class name and its type
28
24
  _classRelationCache;
29
25
  constructor(props) {
30
- this._queryExecutor = props.queryExecutor;
31
- this._metadataProvider = props.metadataProvider;
26
+ this._imodelAccess = props.imodelAccess;
32
27
  this._classRelationCache = new Map();
33
28
  }
34
29
  /**
@@ -130,24 +125,37 @@ class HiliteSetProviderImpl {
130
125
  return rxjs_1.EMPTY;
131
126
  }
132
127
  const bindings = [];
133
- const query = `WITH RECURSIVE
134
- ChildSubjects (ECInstanceId, JsonProperties) AS (
135
- SELECT ECInstanceId, JsonProperties FROM BisCore.Subject WHERE ${(0, ECSqlCore_1.formIdBindings)("ECInstanceId", subjectKeys, bindings)}
136
- UNION ALL
137
- SELECT r.ECInstanceId, r.JsonProperties FROM ChildSubjects s
138
- JOIN BisCore.Subject r ON r.Parent.Id = s.ECInstanceId
139
- ),
140
- Models (ECInstanceId) AS (
141
- SELECT s.ECInstanceId as \`ECInstanceId\` FROM BisCore.Model s
142
- WHERE ${(0, ECSqlCore_1.formIdBindings)("ECInstanceId", modelKeys, bindings)}
143
- )
144
- SELECT r.ECInstanceId as \`ECInstanceId\` FROM ChildSubjects s
145
- JOIN BisCore.PhysicalPartition r
146
- ON r.Parent.Id = s.ECInstanceId
147
- OR json_extract(s.JsonProperties,'$.Subject.Model.TargetPartition') = printf('0x%x', r.ECInstanceId)
148
- UNION
149
- SELECT ECInstanceId FROM Models;`;
150
- return (0, rxjs_1.from)(this._queryExecutor.createQueryReader(query, bindings));
128
+ const ctes = [
129
+ `
130
+ ChildSubjects(ECInstanceId, JsonProperties) AS (
131
+ SELECT ECInstanceId, JsonProperties
132
+ FROM BisCore.Subject
133
+ WHERE ${(0, Utils_1.formIdBindings)("ECInstanceId", subjectKeys, bindings)}
134
+ UNION ALL
135
+ SELECT r.ECInstanceId, r.JsonProperties
136
+ FROM ChildSubjects s
137
+ JOIN BisCore.Subject r ON r.Parent.Id = s.ECInstanceId
138
+ )
139
+ `,
140
+ `
141
+ Models(ECInstanceId) AS (
142
+ SELECT s.ECInstanceId AS ECInstanceId
143
+ FROM BisCore.Model s
144
+ WHERE ${(0, Utils_1.formIdBindings)("ECInstanceId", modelKeys, bindings)}
145
+ )
146
+ `,
147
+ ];
148
+ const ecsql = [
149
+ `
150
+ SELECT r.ECInstanceId AS ECInstanceId
151
+ FROM ChildSubjects s
152
+ JOIN BisCore.PhysicalPartition r ON r.Parent.Id = s.ECInstanceId OR json_extract(s.JsonProperties,'$.Subject.Model.TargetPartition') = printf('0x%x', r.ECInstanceId)
153
+ `,
154
+ `
155
+ SELECT ECInstanceId FROM Models
156
+ `,
157
+ ].join(" UNION ");
158
+ return (0, rxjs_1.from)(this._imodelAccess.createQueryReader({ ctes, ecsql, bindings }));
151
159
  }), (0, rxjs_1.map)((row) => row.ECInstanceId));
152
160
  }
153
161
  getHilitedSubCategories(instancesByType) {
@@ -159,20 +167,25 @@ class HiliteSetProviderImpl {
159
167
  return rxjs_1.EMPTY;
160
168
  }
161
169
  const bindings = [];
162
- const query = `WITH
163
- CategorySubCategories (ECInstanceId) AS (
164
- SELECT r.ECInstanceId as \`ECInstanceId\` FROM BisCore.Category s
165
- JOIN BisCore.SubCategory r ON r.Parent.Id = s.ECInstanceId
166
- WHERE ${(0, ECSqlCore_1.formIdBindings)("s.ECInstanceId", categoryKeys, bindings)}
167
- ),
168
- SubCategories (ECInstanceId) AS (
169
- SELECT s.ECInstanceId as \`ECInstanceId\` FROM BisCore.SubCategory s
170
- WHERE ${(0, ECSqlCore_1.formIdBindings)("s.ECInstanceId", subCategoryKeys, bindings)}
171
- )
172
- SELECT ECInstanceId FROM CategorySubCategories
173
- UNION
174
- SELECT ECInstanceId FROM SubCategories;`;
175
- return (0, rxjs_1.from)(this._queryExecutor.createQueryReader(query, bindings));
170
+ const ctes = [
171
+ `
172
+ CategorySubCategories(ECInstanceId) AS (
173
+ SELECT r.ECInstanceId AS ECInstanceId
174
+ FROM BisCore.Category s
175
+ JOIN BisCore.SubCategory r ON r.Parent.Id = s.ECInstanceId
176
+ WHERE ${(0, Utils_1.formIdBindings)("s.ECInstanceId", categoryKeys, bindings)}
177
+ )
178
+ `,
179
+ `
180
+ SubCategories(ECInstanceId) AS (
181
+ SELECT s.ECInstanceId AS ECInstanceId
182
+ FROM BisCore.SubCategory s
183
+ WHERE ${(0, Utils_1.formIdBindings)("s.ECInstanceId", subCategoryKeys, bindings)}
184
+ )
185
+ `,
186
+ ];
187
+ const ecsql = [`SELECT ECInstanceId FROM CategorySubCategories`, `SELECT ECInstanceId FROM SubCategories`].join(" UNION ");
188
+ return (0, rxjs_1.from)(this._imodelAccess.createQueryReader({ ctes, ecsql, bindings }));
176
189
  }), (0, rxjs_1.map)((row) => row.ECInstanceId));
177
190
  }
178
191
  getHilitedElements(instancesByType) {
@@ -187,80 +200,113 @@ class HiliteSetProviderImpl {
187
200
  return rxjs_1.EMPTY;
188
201
  }
189
202
  const bindings = [];
190
- const query = `WITH RECURSIVE
191
- ${hasFunctionalElements ? this.getHilitedFunctionalElementsQuery(functionalElements, bindings) : ""}
192
- GroupMembers (ECInstanceId, ECClassId) AS (
193
- SELECT TargetECInstanceId, TargetECClassId FROM BisCore.ElementGroupsMembers
194
- WHERE ${(0, ECSqlCore_1.formIdBindings)("SourceECInstanceId", groupInformationElementKeys, bindings)}
195
- ),
196
- GroupGeometricElements (ECInstanceId, ECClassId) AS (
197
- SELECT ECInstanceId, ECClassId FROM GroupMembers
198
- UNION ALL
199
- SELECT r.ECInstanceId, r.ECClassId FROM GroupGeometricElements s
200
- JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId
201
- ),
202
- ElementGeometricElements (ECInstanceId, ECClassId) AS (
203
- SELECT ECInstanceId, ECClassId FROM BisCore.Element WHERE ${(0, ECSqlCore_1.formIdBindings)("ECInstanceId", elementKeys, bindings)}
204
- UNION ALL
205
- SELECT r.ECInstanceId, r.ECClassId FROM ElementGeometricElements s
206
- JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId
207
- ),
208
- GeometricElementGeometricElements (ECInstanceId, ECClassId) AS (
209
- SELECT ECInstanceId, ECClassId FROM BisCore.GeometricElement WHERE ${(0, ECSqlCore_1.formIdBindings)("ECInstanceId", geometricElementKeys, bindings)}
210
- UNION ALL
211
- SELECT r.ECInstanceId, r.ECClassId FROM GeometricElementGeometricElements s
212
- JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId
213
- )
214
- ${hasFunctionalElements
215
- ? `
216
- SELECT ECInstanceId FROM FunctionalElementChildGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)
217
- UNION
218
- `
219
- : ``}
220
- SELECT ECInstanceId FROM GeometricElementGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)
221
- UNION
222
- SELECT ECInstanceId FROM GroupGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)
223
- UNION
224
- SELECT ECInstanceId FROM ElementGeometricElements WHERE ECClassId IS (BisCore.GeometricElement);`;
225
- return (0, rxjs_1.from)(this._queryExecutor.createQueryReader(query, bindings));
226
- }), (0, rxjs_1.map)((row) => row.ECInstanceId));
227
- }
228
- getHilitedFunctionalElementsQuery(functionalElements, bindings) {
229
- return `ChildFunctionalElements (ECInstanceId, ECClassId) AS (
230
- SELECT ECInstanceId, ECClassId FROM Functional.FunctionalElement WHERE ${(0, ECSqlCore_1.formIdBindings)("ECInstanceId", functionalElements, bindings)}
203
+ const ctes = [
204
+ ...(hasFunctionalElements ? this.getHilitedFunctionalElementsQueryCTEs(functionalElements, bindings) : []),
205
+ `
206
+ GroupMembers(ECInstanceId, ECClassId) AS (
207
+ SELECT TargetECInstanceId, TargetECClassId
208
+ FROM BisCore.ElementGroupsMembers
209
+ WHERE ${(0, Utils_1.formIdBindings)("SourceECInstanceId", groupInformationElementKeys, bindings)}
210
+ )
211
+ `,
212
+ `
213
+ GroupGeometricElements(ECInstanceId, ECClassId) AS (
214
+ SELECT ECInstanceId, ECClassId FROM GroupMembers
231
215
  UNION ALL
232
- SELECT r.ECInstanceId, r.ECClassId FROM ChildFunctionalElements s
233
- JOIN Functional.FunctionalElement r ON r.Parent.Id = s.ECInstanceId
234
- ),
235
- PhysicalElements (ECInstanceId, ECClassId) AS (
236
- SELECT r.SourceECInstanceId, r.SourceECClassId FROM ChildFunctionalElements s
237
- JOIN Functional.PhysicalElementFulfillsFunction r ON r.TargetECInstanceId = s.ECInstanceId
238
- ),
239
- DrawingGraphicElements (ECInstanceId, ECClassId) AS (
240
- SELECT r.SourceECInstanceId, r.SourceECClassId FROM ChildFunctionalElements s
241
- JOIN Functional.DrawingGraphicRepresentsFunctionalElement r ON r.TargetECInstanceId = s.ECInstanceId
242
- ),
243
- PhysicalElementGeometricElements (ECInstanceId, ECClassId) AS (
244
- SELECT ECInstanceId, ECClassId FROM PhysicalElements
216
+ SELECT r.ECInstanceId, r.ECClassId
217
+ FROM GroupGeometricElements s
218
+ JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId
219
+ )
220
+ `,
221
+ `
222
+ ElementGeometricElements(ECInstanceId, ECClassId) AS (
223
+ SELECT ECInstanceId, ECClassId
224
+ FROM BisCore.Element
225
+ WHERE ${(0, Utils_1.formIdBindings)("ECInstanceId", elementKeys, bindings)}
245
226
  UNION ALL
246
- SELECT r.ECInstanceId, r.ECClassId FROM PhysicalElementGeometricElements s
247
- JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId
248
- ),
249
- DrawingGraphicElementGeometricElements (ECInstanceId, ECClassId) AS (
250
- SELECT ECInstanceId, ECClassId FROM DrawingGraphicElements
227
+ SELECT r.ECInstanceId, r.ECClassId
228
+ FROM ElementGeometricElements s
229
+ JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId
230
+ )
231
+ `,
232
+ `
233
+ GeometricElementGeometricElements(ECInstanceId, ECClassId) AS (
234
+ SELECT ECInstanceId, ECClassId
235
+ FROM BisCore.GeometricElement
236
+ WHERE ${(0, Utils_1.formIdBindings)("ECInstanceId", geometricElementKeys, bindings)}
251
237
  UNION ALL
252
- SELECT r.ECInstanceId, r.ECClassId FROM DrawingGraphicElementGeometricElements s
253
- JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId
254
- ),
255
- FunctionalElementChildGeometricElements (ECInstanceId, ECClassId) AS (
256
- SELECT ECInstanceId, ECClassId FROM PhysicalElementGeometricElements
257
- UNION
258
- SELECT ECInstanceId, ECClassId FROM DrawingGraphicElementGeometricElements
259
- ),`;
238
+ SELECT r.ECInstanceId, r.ECClassId
239
+ FROM GeometricElementGeometricElements s
240
+ JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId
241
+ )
242
+ `,
243
+ ];
244
+ const ecsql = [
245
+ ...(hasFunctionalElements ? ["SELECT ECInstanceId FROM FunctionalElementChildGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)"] : []),
246
+ "SELECT ECInstanceId FROM GeometricElementGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)",
247
+ "SELECT ECInstanceId FROM GroupGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)",
248
+ "SELECT ECInstanceId FROM ElementGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)",
249
+ ].join(" UNION ");
250
+ return (0, rxjs_1.from)(this._imodelAccess.createQueryReader({ ctes, ecsql, bindings }));
251
+ }), (0, rxjs_1.map)((row) => row.ECInstanceId));
252
+ }
253
+ getHilitedFunctionalElementsQueryCTEs(functionalElements, bindings) {
254
+ return [
255
+ `
256
+ ChildFunctionalElements(ECInstanceId, ECClassId) AS (
257
+ SELECT ECInstanceId, ECClassId
258
+ FROM Functional.FunctionalElement
259
+ WHERE ${(0, Utils_1.formIdBindings)("ECInstanceId", functionalElements, bindings)}
260
+ UNION ALL
261
+ SELECT r.ECInstanceId, r.ECClassId
262
+ FROM ChildFunctionalElements s
263
+ JOIN Functional.FunctionalElement r ON r.Parent.Id = s.ECInstanceId
264
+ )
265
+ `,
266
+ `
267
+ PhysicalElements(ECInstanceId, ECClassId) AS (
268
+ SELECT r.SourceECInstanceId, r.SourceECClassId
269
+ FROM ChildFunctionalElements s
270
+ JOIN Functional.PhysicalElementFulfillsFunction r ON r.TargetECInstanceId = s.ECInstanceId
271
+ )
272
+ `,
273
+ `
274
+ DrawingGraphicElements(ECInstanceId, ECClassId) AS (
275
+ SELECT r.SourceECInstanceId, r.SourceECClassId
276
+ FROM ChildFunctionalElements s
277
+ JOIN Functional.DrawingGraphicRepresentsFunctionalElement r ON r.TargetECInstanceId = s.ECInstanceId
278
+ )
279
+ `,
280
+ `
281
+ PhysicalElementGeometricElements(ECInstanceId, ECClassId) AS (
282
+ SELECT ECInstanceId, ECClassId FROM PhysicalElements
283
+ UNION ALL
284
+ SELECT r.ECInstanceId, r.ECClassId
285
+ FROM PhysicalElementGeometricElements s
286
+ JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId
287
+ )
288
+ `,
289
+ `
290
+ DrawingGraphicElementGeometricElements(ECInstanceId, ECClassId) AS (
291
+ SELECT ECInstanceId, ECClassId FROM DrawingGraphicElements
292
+ UNION ALL
293
+ SELECT r.ECInstanceId, r.ECClassId
294
+ FROM DrawingGraphicElementGeometricElements s
295
+ JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId
296
+ )
297
+ `,
298
+ `
299
+ FunctionalElementChildGeometricElements(ECInstanceId, ECClassId) AS (
300
+ SELECT ECInstanceId, ECClassId FROM PhysicalElementGeometricElements
301
+ UNION
302
+ SELECT ECInstanceId, ECClassId FROM DrawingGraphicElementGeometricElements
303
+ )
304
+ `,
305
+ ];
260
306
  }
261
307
  async getClass(fullClassName) {
262
- const { schemaName, className } = (0, ECMetadata_1.parseFullClassName)(fullClassName);
263
- const schema = await this._metadataProvider.getSchema(schemaName);
308
+ const { schemaName, className } = (0, presentation_shared_1.parseFullClassName)(fullClassName);
309
+ const schema = await this._imodelAccess.getSchema(schemaName);
264
310
  if (!schema) {
265
311
  return undefined;
266
312
  }
@@ -1 +1 @@
1
- {"version":3,"file":"HiliteSetProvider.js","sourceRoot":"","sources":["../../../src/unified-selection/HiliteSetProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module UnifiedSelection\n */\n\nimport { EMPTY, filter, forkJoin, from, map, merge, mergeMap, Observable, scan, shareReplay, Subject, toArray } from \"rxjs\";\nimport { eachValueFrom } from \"rxjs-for-await\";\nimport { ECClass, IMetadataProvider, parseFullClassName } from \"./queries/ECMetadata\";\nimport { ECSqlBinding, formIdBindings, IECSqlQueryExecutor } from \"./queries/ECSqlCore\";\nimport { SelectableInstanceKey, Selectables } from \"./Selectable\";\n\nconst HILITE_SET_EMIT_FREQUENCY = 20;\n\n/**\n * A set of model, subcategory and element ids that can be used for specifying hilite.\n * @see https://www.itwinjs.org/reference/core-frontend/selectionset/hiliteset/\n * @beta\n */\nexport interface HiliteSet {\n models: string[];\n subCategories: string[];\n elements: string[];\n}\n\n/**\n * Props for creating a `HiliteSetProvider` instance.\n * @internal Not exported through barrel, but used in public API as an argument. May be supplemented with optional attributes any time.\n */\nexport interface HiliteSetProviderProps {\n queryExecutor: IECSqlQueryExecutor;\n metadataProvider: IMetadataProvider;\n}\n\n/**\n * Defines return value of `createHiliteSetProvider`.\n *\n * @beta Used in public API as a return value. Not expected to be created / extended by package\n * consumers, may be supplemented with required attributes any time.\n */\nexport interface HiliteSetProvider {\n /** Get the current hilite set iterator for the specified imodel */\n getHiliteSet(props: { selectables: Selectables }): AsyncIterableIterator<HiliteSet>;\n}\n\n/**\n * Creates a hilite set provider that returns a `HiliteSet` for given selectables.\n * @beta\n */\nexport function createHiliteSetProvider(props: HiliteSetProviderProps): HiliteSetProvider {\n return new HiliteSetProviderImpl(props);\n}\n\nclass HiliteSetProviderImpl implements HiliteSetProvider {\n private _queryExecutor: IECSqlQueryExecutor;\n private _metadataProvider: IMetadataProvider;\n // Map between a class name and its type\n private _classRelationCache: Map<string, InstanceIdType | Promise<InstanceIdType>>;\n\n constructor(props: HiliteSetProviderProps) {\n this._queryExecutor = props.queryExecutor;\n this._metadataProvider = props.metadataProvider;\n this._classRelationCache = new Map();\n }\n\n /**\n * Get hilite set iterator for supplied `Selectables`.\n */\n public getHiliteSet(props: { selectables: Selectables }): AsyncIterableIterator<HiliteSet> {\n const obs = this.getHiliteSetObservable(props);\n return eachValueFrom(obs);\n }\n\n /**\n * Returns a \"hot\" observable of hilite sets.\n */\n private getHiliteSetObservable({ selectables }: { selectables: Selectables }): Subject<HiliteSet> {\n const instancesByType = this.getInstancesByType(selectables);\n const observables: { [key in keyof HiliteSet]?: Observable<string> } = {\n models: this.getHilitedModels(instancesByType),\n subCategories: this.getHilitedSubCategories(instancesByType),\n elements: this.getHilitedElements(instancesByType),\n };\n\n let hiliteSet: HiliteSet = { models: [], subCategories: [], elements: [] };\n let lastEmitTime = performance.now();\n const subject = new Subject<HiliteSet>();\n const subscriptions = ([\"models\", \"subCategories\", \"elements\"] as const).map((key) =>\n observables[key]!.subscribe({\n next(val) {\n hiliteSet[key].push(val);\n if (performance.now() - lastEmitTime < HILITE_SET_EMIT_FREQUENCY) {\n return;\n }\n subject.next(hiliteSet);\n hiliteSet = { models: [], subCategories: [], elements: [] };\n lastEmitTime = performance.now();\n },\n complete() {\n observables[key] = undefined;\n if (observables.models || observables.subCategories || observables.elements) {\n return;\n }\n // Emit last batch before completing the observable.\n if (hiliteSet.elements.length || hiliteSet.models.length || hiliteSet.subCategories.length) {\n subject.next(hiliteSet);\n }\n subject.complete();\n },\n error(err) {\n subscriptions.forEach((x) => x.unsubscribe());\n subscriptions.length = 0;\n subject.error(err);\n },\n }),\n );\n\n return subject;\n }\n\n private async getType(key: SelectableInstanceKey): Promise<InstanceIdType> {\n const cachedType = this._classRelationCache.get(key.className.replace(\".\", \":\"));\n if (cachedType) {\n return cachedType;\n }\n\n const promise = this.getTypeImpl(key).then((res) => {\n // Update the cache with the result of the promise.\n this._classRelationCache.set(key.className, res);\n return res;\n });\n\n // Add the promise to cache to prevent `getTypeImpl` being called multiple times.\n this._classRelationCache.set(key.className, promise);\n return promise;\n }\n\n private async getTypeImpl(key: SelectableInstanceKey): Promise<InstanceIdType> {\n const keyClass = await this.getClass(key.className);\n return (\n (keyClass &&\n ((await this.checkType(keyClass, \"BisCore\", \"Subject\", \"subject\")) ??\n (await this.checkType(keyClass, \"BisCore\", \"Model\", \"model\")) ??\n (await this.checkType(keyClass, \"BisCore\", \"Category\", \"category\")) ??\n (await this.checkType(keyClass, \"BisCore\", \"SubCategory\", \"subCategory\")) ??\n (await this.checkType(keyClass, \"Functional\", \"FunctionalElement\", \"functionalElement\")) ??\n (await this.checkType(keyClass, \"BisCore\", \"GroupInformationElement\", \"groupInformationElement\")) ??\n (await this.checkType(keyClass, \"BisCore\", \"GeometricElement\", \"geometricElement\")) ??\n (await this.checkType(keyClass, \"BisCore\", \"Element\", \"element\")))) ??\n \"unknown\"\n );\n }\n\n private async checkType(keyClass: ECClass, schemaName: string, className: string, type: InstanceIdType) {\n return (await keyClass.is(className, schemaName)) ? type : undefined;\n }\n\n private getInstancesByType(selectables: Selectables): InstancesByType {\n const keyTypeObs = merge(\n from(selectables.custom.values()).pipe(mergeMap((selectable) => selectable.loadInstanceKeys())),\n from(selectables.instanceKeys).pipe(mergeMap(([className, idSet]) => from(idSet).pipe(map((id) => ({ className, id }))))),\n ).pipe(\n // Get types for each instance key\n mergeMap((instanceKey) => from(this.getType(instanceKey)).pipe(map((instanceIdType) => ({ instanceId: instanceKey.id, instanceIdType })))),\n // Cache the results\n shareReplay(),\n );\n\n return Object.fromEntries(\n INSTANCE_TYPES.map((type) => [\n type,\n keyTypeObs.pipe(\n filter(({ instanceIdType }) => instanceIdType === type),\n map(({ instanceId }) => instanceId),\n unique(),\n ),\n ]),\n ) as InstancesByType;\n }\n\n private getHilitedModels(instancesByType: InstancesByType): Observable<string> {\n return forkJoin({\n modelKeys: instancesByType.model.pipe(toArray()),\n subjectKeys: instancesByType.subject.pipe(toArray()),\n }).pipe(\n mergeMap(({ modelKeys, subjectKeys }) => {\n if (!modelKeys.length && !subjectKeys.length) {\n return EMPTY;\n }\n\n const bindings: ECSqlBinding[] = [];\n const query = `WITH RECURSIVE\n ChildSubjects (ECInstanceId, JsonProperties) AS (\n SELECT ECInstanceId, JsonProperties FROM BisCore.Subject WHERE ${formIdBindings(\"ECInstanceId\", subjectKeys, bindings)}\n UNION ALL\n SELECT r.ECInstanceId, r.JsonProperties FROM ChildSubjects s\n JOIN BisCore.Subject r ON r.Parent.Id = s.ECInstanceId\n ),\n Models (ECInstanceId) AS (\n SELECT s.ECInstanceId as \\`ECInstanceId\\` FROM BisCore.Model s\n WHERE ${formIdBindings(\"ECInstanceId\", modelKeys, bindings)}\n )\n SELECT r.ECInstanceId as \\`ECInstanceId\\` FROM ChildSubjects s\n JOIN BisCore.PhysicalPartition r\n ON r.Parent.Id = s.ECInstanceId\n OR json_extract(s.JsonProperties,'$.Subject.Model.TargetPartition') = printf('0x%x', r.ECInstanceId)\n UNION\n SELECT ECInstanceId FROM Models;`;\n return from(this._queryExecutor.createQueryReader(query, bindings));\n }),\n map((row) => row.ECInstanceId),\n );\n }\n\n private getHilitedSubCategories(instancesByType: InstancesByType): Observable<string> {\n return forkJoin({\n subCategoryKeys: instancesByType.subCategory.pipe(toArray()),\n categoryKeys: instancesByType.category.pipe(toArray()),\n }).pipe(\n mergeMap(({ subCategoryKeys, categoryKeys }) => {\n if (!subCategoryKeys.length && !categoryKeys.length) {\n return EMPTY;\n }\n\n const bindings: ECSqlBinding[] = [];\n const query = `WITH\n CategorySubCategories (ECInstanceId) AS (\n SELECT r.ECInstanceId as \\`ECInstanceId\\` FROM BisCore.Category s\n JOIN BisCore.SubCategory r ON r.Parent.Id = s.ECInstanceId\n WHERE ${formIdBindings(\"s.ECInstanceId\", categoryKeys, bindings)}\n ),\n SubCategories (ECInstanceId) AS (\n SELECT s.ECInstanceId as \\`ECInstanceId\\` FROM BisCore.SubCategory s\n WHERE ${formIdBindings(\"s.ECInstanceId\", subCategoryKeys, bindings)}\n )\n SELECT ECInstanceId FROM CategorySubCategories\n UNION\n SELECT ECInstanceId FROM SubCategories;`;\n return from(this._queryExecutor.createQueryReader(query, bindings));\n }),\n map((row) => row.ECInstanceId),\n );\n }\n\n private getHilitedElements(instancesByType: InstancesByType): Observable<string> {\n return forkJoin({\n groupInformationElementKeys: instancesByType.groupInformationElement.pipe(toArray()),\n geometricElementKeys: instancesByType.geometricElement.pipe(toArray()),\n functionalElements: instancesByType.functionalElement.pipe(toArray()),\n elementKeys: instancesByType.element.pipe(toArray()),\n }).pipe(\n mergeMap(({ groupInformationElementKeys, geometricElementKeys, functionalElements, elementKeys }) => {\n const hasFunctionalElements = !!functionalElements.length;\n if (!groupInformationElementKeys.length && !geometricElementKeys.length && !elementKeys.length && !hasFunctionalElements) {\n return EMPTY;\n }\n\n const bindings: ECSqlBinding[] = [];\n const query = `WITH RECURSIVE\n ${hasFunctionalElements ? this.getHilitedFunctionalElementsQuery(functionalElements, bindings) : \"\"}\n GroupMembers (ECInstanceId, ECClassId) AS (\n SELECT TargetECInstanceId, TargetECClassId FROM BisCore.ElementGroupsMembers\n WHERE ${formIdBindings(\"SourceECInstanceId\", groupInformationElementKeys, bindings)}\n ),\n GroupGeometricElements (ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId FROM GroupMembers\n UNION ALL\n SELECT r.ECInstanceId, r.ECClassId FROM GroupGeometricElements s\n JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId\n ),\n ElementGeometricElements (ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId FROM BisCore.Element WHERE ${formIdBindings(\"ECInstanceId\", elementKeys, bindings)}\n UNION ALL\n SELECT r.ECInstanceId, r.ECClassId FROM ElementGeometricElements s\n JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId\n ),\n GeometricElementGeometricElements (ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId FROM BisCore.GeometricElement WHERE ${formIdBindings(\"ECInstanceId\", geometricElementKeys, bindings)}\n UNION ALL\n SELECT r.ECInstanceId, r.ECClassId FROM GeometricElementGeometricElements s\n JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId\n )\n ${\n hasFunctionalElements\n ? `\n SELECT ECInstanceId FROM FunctionalElementChildGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)\n UNION\n `\n : ``\n }\n SELECT ECInstanceId FROM GeometricElementGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)\n UNION\n SELECT ECInstanceId FROM GroupGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)\n UNION\n SELECT ECInstanceId FROM ElementGeometricElements WHERE ECClassId IS (BisCore.GeometricElement);`;\n return from(this._queryExecutor.createQueryReader(query, bindings));\n }),\n map((row) => row.ECInstanceId as string),\n );\n }\n\n private getHilitedFunctionalElementsQuery(functionalElements: string[], bindings: ECSqlBinding[]): string {\n return `ChildFunctionalElements (ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId FROM Functional.FunctionalElement WHERE ${formIdBindings(\"ECInstanceId\", functionalElements, bindings)}\n UNION ALL\n SELECT r.ECInstanceId, r.ECClassId FROM ChildFunctionalElements s\n JOIN Functional.FunctionalElement r ON r.Parent.Id = s.ECInstanceId\n ),\n PhysicalElements (ECInstanceId, ECClassId) AS (\n SELECT r.SourceECInstanceId, r.SourceECClassId FROM ChildFunctionalElements s\n JOIN Functional.PhysicalElementFulfillsFunction r ON r.TargetECInstanceId = s.ECInstanceId\n ),\n DrawingGraphicElements (ECInstanceId, ECClassId) AS (\n SELECT r.SourceECInstanceId, r.SourceECClassId FROM ChildFunctionalElements s\n JOIN Functional.DrawingGraphicRepresentsFunctionalElement r ON r.TargetECInstanceId = s.ECInstanceId\n ),\n PhysicalElementGeometricElements (ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId FROM PhysicalElements\n UNION ALL\n SELECT r.ECInstanceId, r.ECClassId FROM PhysicalElementGeometricElements s\n JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId\n ),\n DrawingGraphicElementGeometricElements (ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId FROM DrawingGraphicElements\n UNION ALL\n SELECT r.ECInstanceId, r.ECClassId FROM DrawingGraphicElementGeometricElements s\n JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId\n ),\n FunctionalElementChildGeometricElements (ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId FROM PhysicalElementGeometricElements\n UNION\n SELECT ECInstanceId, ECClassId FROM DrawingGraphicElementGeometricElements\n ),`;\n }\n\n private async getClass(fullClassName: string): Promise<ECClass | undefined> {\n const { schemaName, className } = parseFullClassName(fullClassName);\n const schema = await this._metadataProvider.getSchema(schemaName);\n if (!schema) {\n return undefined;\n }\n const schemaClass = await schema.getClass(className);\n if (!schemaClass) {\n return undefined;\n }\n return schemaClass;\n }\n}\n\nconst INSTANCE_TYPES = [\n \"subject\",\n \"model\",\n \"category\",\n \"subCategory\",\n \"functionalElement\",\n \"groupInformationElement\",\n \"geometricElement\",\n \"element\",\n \"unknown\",\n] as const;\n\ntype InstanceIdType = (typeof INSTANCE_TYPES)[number];\n\ntype InstancesByType = {\n [idType in InstanceIdType]: Observable<string>;\n};\n\nfunction unique<T>() {\n return function (obs: Observable<T>): Observable<T> {\n return obs.pipe(\n scan(\n (acc, val) => {\n if (acc.set.has(val)) {\n delete acc.val;\n return acc;\n }\n\n acc.set.add(val);\n acc.val = val;\n return acc;\n },\n { set: new Set<T>() } as { set: Set<T>; val?: T },\n ),\n map(({ val }) => val),\n filter((x): x is T => !!x),\n );\n };\n}\n"]}
1
+ {"version":3,"file":"HiliteSetProvider.js","sourceRoot":"","sources":["../../../src/unified-selection/HiliteSetProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { EMPTY, filter, forkJoin, from, map, merge, mergeMap, Observable, scan, shareReplay, Subject, toArray } from \"rxjs\";\nimport { eachValueFrom } from \"rxjs-for-await\";\nimport { EC, ECSchemaProvider, ECSqlBinding, ECSqlQueryExecutor, parseFullClassName } from \"@itwin/presentation-shared\";\nimport { SelectableInstanceKey, Selectables } from \"./Selectable\";\nimport { formIdBindings } from \"./Utils\";\n\nconst HILITE_SET_EMIT_FREQUENCY = 20;\n\n/**\n * A set of model, subcategory and element ids that can be used for specifying hilite.\n * @see https://www.itwinjs.org/reference/core-frontend/selectionset/hiliteset/\n * @beta\n */\nexport interface HiliteSet {\n models: string[];\n subCategories: string[];\n elements: string[];\n}\n\n/**\n * Props for creating a `HiliteSetProvider` instance.\n * @internal Not exported through barrel, but used in public API as an argument. May be supplemented with optional attributes any time.\n */\nexport interface HiliteSetProviderProps {\n imodelAccess: ECSchemaProvider & ECSqlQueryExecutor;\n}\n\n/**\n * Defines return value of `createHiliteSetProvider`.\n *\n * @beta Used in public API as a return value. Not expected to be created / extended by package\n * consumers, may be supplemented with required attributes any time.\n */\nexport interface HiliteSetProvider {\n /** Get the current hilite set iterator for the specified imodel */\n getHiliteSet(props: { selectables: Selectables }): AsyncIterableIterator<HiliteSet>;\n}\n\n/**\n * Creates a hilite set provider that returns a `HiliteSet` for given selectables.\n * @beta\n */\nexport function createHiliteSetProvider(props: HiliteSetProviderProps): HiliteSetProvider {\n return new HiliteSetProviderImpl(props);\n}\n\nclass HiliteSetProviderImpl implements HiliteSetProvider {\n private _imodelAccess: ECSchemaProvider & ECSqlQueryExecutor;\n // Map between a class name and its type\n private _classRelationCache: Map<string, InstanceIdType | Promise<InstanceIdType>>;\n\n constructor(props: HiliteSetProviderProps) {\n this._imodelAccess = props.imodelAccess;\n this._classRelationCache = new Map();\n }\n\n /**\n * Get hilite set iterator for supplied `Selectables`.\n */\n public getHiliteSet(props: { selectables: Selectables }): AsyncIterableIterator<HiliteSet> {\n const obs = this.getHiliteSetObservable(props);\n return eachValueFrom(obs);\n }\n\n /**\n * Returns a \"hot\" observable of hilite sets.\n */\n private getHiliteSetObservable({ selectables }: { selectables: Selectables }): Subject<HiliteSet> {\n const instancesByType = this.getInstancesByType(selectables);\n const observables: { [key in keyof HiliteSet]?: Observable<string> } = {\n models: this.getHilitedModels(instancesByType),\n subCategories: this.getHilitedSubCategories(instancesByType),\n elements: this.getHilitedElements(instancesByType),\n };\n\n let hiliteSet: HiliteSet = { models: [], subCategories: [], elements: [] };\n let lastEmitTime = performance.now();\n const subject = new Subject<HiliteSet>();\n const subscriptions = ([\"models\", \"subCategories\", \"elements\"] as const).map((key) =>\n observables[key]!.subscribe({\n next(val) {\n hiliteSet[key].push(val);\n if (performance.now() - lastEmitTime < HILITE_SET_EMIT_FREQUENCY) {\n return;\n }\n subject.next(hiliteSet);\n hiliteSet = { models: [], subCategories: [], elements: [] };\n lastEmitTime = performance.now();\n },\n complete() {\n observables[key] = undefined;\n if (observables.models || observables.subCategories || observables.elements) {\n return;\n }\n // Emit last batch before completing the observable.\n if (hiliteSet.elements.length || hiliteSet.models.length || hiliteSet.subCategories.length) {\n subject.next(hiliteSet);\n }\n subject.complete();\n },\n error(err) {\n subscriptions.forEach((x) => x.unsubscribe());\n subscriptions.length = 0;\n subject.error(err);\n },\n }),\n );\n\n return subject;\n }\n\n private async getType(key: SelectableInstanceKey): Promise<InstanceIdType> {\n const cachedType = this._classRelationCache.get(key.className.replace(\".\", \":\"));\n if (cachedType) {\n return cachedType;\n }\n\n const promise = this.getTypeImpl(key).then((res) => {\n // Update the cache with the result of the promise.\n this._classRelationCache.set(key.className, res);\n return res;\n });\n\n // Add the promise to cache to prevent `getTypeImpl` being called multiple times.\n this._classRelationCache.set(key.className, promise);\n return promise;\n }\n\n private async getTypeImpl(key: SelectableInstanceKey): Promise<InstanceIdType> {\n const keyClass = await this.getClass(key.className);\n return (\n (keyClass &&\n ((await this.checkType(keyClass, \"BisCore\", \"Subject\", \"subject\")) ??\n (await this.checkType(keyClass, \"BisCore\", \"Model\", \"model\")) ??\n (await this.checkType(keyClass, \"BisCore\", \"Category\", \"category\")) ??\n (await this.checkType(keyClass, \"BisCore\", \"SubCategory\", \"subCategory\")) ??\n (await this.checkType(keyClass, \"Functional\", \"FunctionalElement\", \"functionalElement\")) ??\n (await this.checkType(keyClass, \"BisCore\", \"GroupInformationElement\", \"groupInformationElement\")) ??\n (await this.checkType(keyClass, \"BisCore\", \"GeometricElement\", \"geometricElement\")) ??\n (await this.checkType(keyClass, \"BisCore\", \"Element\", \"element\")))) ??\n \"unknown\"\n );\n }\n\n private async checkType(keyClass: EC.Class, schemaName: string, className: string, type: InstanceIdType) {\n return (await keyClass.is(className, schemaName)) ? type : undefined;\n }\n\n private getInstancesByType(selectables: Selectables): InstancesByType {\n const keyTypeObs = merge(\n from(selectables.custom.values()).pipe(mergeMap((selectable) => selectable.loadInstanceKeys())),\n from(selectables.instanceKeys).pipe(mergeMap(([className, idSet]) => from(idSet).pipe(map((id) => ({ className, id }))))),\n ).pipe(\n // Get types for each instance key\n mergeMap((instanceKey) => from(this.getType(instanceKey)).pipe(map((instanceIdType) => ({ instanceId: instanceKey.id, instanceIdType })))),\n // Cache the results\n shareReplay(),\n );\n\n return Object.fromEntries(\n INSTANCE_TYPES.map((type) => [\n type,\n keyTypeObs.pipe(\n filter(({ instanceIdType }) => instanceIdType === type),\n map(({ instanceId }) => instanceId),\n unique(),\n ),\n ]),\n ) as InstancesByType;\n }\n\n private getHilitedModels(instancesByType: InstancesByType): Observable<string> {\n return forkJoin({\n modelKeys: instancesByType.model.pipe(toArray()),\n subjectKeys: instancesByType.subject.pipe(toArray()),\n }).pipe(\n mergeMap(({ modelKeys, subjectKeys }) => {\n if (!modelKeys.length && !subjectKeys.length) {\n return EMPTY;\n }\n\n const bindings: ECSqlBinding[] = [];\n const ctes = [\n `\n ChildSubjects(ECInstanceId, JsonProperties) AS (\n SELECT ECInstanceId, JsonProperties\n FROM BisCore.Subject\n WHERE ${formIdBindings(\"ECInstanceId\", subjectKeys, bindings)}\n UNION ALL\n SELECT r.ECInstanceId, r.JsonProperties\n FROM ChildSubjects s\n JOIN BisCore.Subject r ON r.Parent.Id = s.ECInstanceId\n )\n `,\n `\n Models(ECInstanceId) AS (\n SELECT s.ECInstanceId AS ECInstanceId\n FROM BisCore.Model s\n WHERE ${formIdBindings(\"ECInstanceId\", modelKeys, bindings)}\n )\n `,\n ];\n const ecsql = [\n `\n SELECT r.ECInstanceId AS ECInstanceId\n FROM ChildSubjects s\n JOIN BisCore.PhysicalPartition r ON r.Parent.Id = s.ECInstanceId OR json_extract(s.JsonProperties,'$.Subject.Model.TargetPartition') = printf('0x%x', r.ECInstanceId)\n `,\n `\n SELECT ECInstanceId FROM Models\n `,\n ].join(\" UNION \");\n return from(this._imodelAccess.createQueryReader({ ctes, ecsql, bindings }));\n }),\n map((row) => row.ECInstanceId),\n );\n }\n\n private getHilitedSubCategories(instancesByType: InstancesByType): Observable<string> {\n return forkJoin({\n subCategoryKeys: instancesByType.subCategory.pipe(toArray()),\n categoryKeys: instancesByType.category.pipe(toArray()),\n }).pipe(\n mergeMap(({ subCategoryKeys, categoryKeys }) => {\n if (!subCategoryKeys.length && !categoryKeys.length) {\n return EMPTY;\n }\n\n const bindings: ECSqlBinding[] = [];\n const ctes = [\n `\n CategorySubCategories(ECInstanceId) AS (\n SELECT r.ECInstanceId AS ECInstanceId\n FROM BisCore.Category s\n JOIN BisCore.SubCategory r ON r.Parent.Id = s.ECInstanceId\n WHERE ${formIdBindings(\"s.ECInstanceId\", categoryKeys, bindings)}\n )\n `,\n `\n SubCategories(ECInstanceId) AS (\n SELECT s.ECInstanceId AS ECInstanceId\n FROM BisCore.SubCategory s\n WHERE ${formIdBindings(\"s.ECInstanceId\", subCategoryKeys, bindings)}\n )\n `,\n ];\n const ecsql = [`SELECT ECInstanceId FROM CategorySubCategories`, `SELECT ECInstanceId FROM SubCategories`].join(\" UNION \");\n return from(this._imodelAccess.createQueryReader({ ctes, ecsql, bindings }));\n }),\n map((row) => row.ECInstanceId),\n );\n }\n\n private getHilitedElements(instancesByType: InstancesByType): Observable<string> {\n return forkJoin({\n groupInformationElementKeys: instancesByType.groupInformationElement.pipe(toArray()),\n geometricElementKeys: instancesByType.geometricElement.pipe(toArray()),\n functionalElements: instancesByType.functionalElement.pipe(toArray()),\n elementKeys: instancesByType.element.pipe(toArray()),\n }).pipe(\n mergeMap(({ groupInformationElementKeys, geometricElementKeys, functionalElements, elementKeys }) => {\n const hasFunctionalElements = !!functionalElements.length;\n if (!groupInformationElementKeys.length && !geometricElementKeys.length && !elementKeys.length && !hasFunctionalElements) {\n return EMPTY;\n }\n\n const bindings: ECSqlBinding[] = [];\n const ctes = [\n ...(hasFunctionalElements ? this.getHilitedFunctionalElementsQueryCTEs(functionalElements, bindings) : []),\n `\n GroupMembers(ECInstanceId, ECClassId) AS (\n SELECT TargetECInstanceId, TargetECClassId\n FROM BisCore.ElementGroupsMembers\n WHERE ${formIdBindings(\"SourceECInstanceId\", groupInformationElementKeys, bindings)}\n )\n `,\n `\n GroupGeometricElements(ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId FROM GroupMembers\n UNION ALL\n SELECT r.ECInstanceId, r.ECClassId\n FROM GroupGeometricElements s\n JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId\n )\n `,\n `\n ElementGeometricElements(ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId\n FROM BisCore.Element\n WHERE ${formIdBindings(\"ECInstanceId\", elementKeys, bindings)}\n UNION ALL\n SELECT r.ECInstanceId, r.ECClassId\n FROM ElementGeometricElements s\n JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId\n )\n `,\n `\n GeometricElementGeometricElements(ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId\n FROM BisCore.GeometricElement\n WHERE ${formIdBindings(\"ECInstanceId\", geometricElementKeys, bindings)}\n UNION ALL\n SELECT r.ECInstanceId, r.ECClassId\n FROM GeometricElementGeometricElements s\n JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId\n )\n `,\n ];\n const ecsql = [\n ...(hasFunctionalElements ? [\"SELECT ECInstanceId FROM FunctionalElementChildGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)\"] : []),\n \"SELECT ECInstanceId FROM GeometricElementGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)\",\n \"SELECT ECInstanceId FROM GroupGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)\",\n \"SELECT ECInstanceId FROM ElementGeometricElements WHERE ECClassId IS (BisCore.GeometricElement)\",\n ].join(\" UNION \");\n return from(this._imodelAccess.createQueryReader({ ctes, ecsql, bindings }));\n }),\n map((row) => row.ECInstanceId as string),\n );\n }\n\n private getHilitedFunctionalElementsQueryCTEs(functionalElements: string[], bindings: ECSqlBinding[]): string[] {\n return [\n `\n ChildFunctionalElements(ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId\n FROM Functional.FunctionalElement\n WHERE ${formIdBindings(\"ECInstanceId\", functionalElements, bindings)}\n UNION ALL\n SELECT r.ECInstanceId, r.ECClassId\n FROM ChildFunctionalElements s\n JOIN Functional.FunctionalElement r ON r.Parent.Id = s.ECInstanceId\n )\n `,\n `\n PhysicalElements(ECInstanceId, ECClassId) AS (\n SELECT r.SourceECInstanceId, r.SourceECClassId\n FROM ChildFunctionalElements s\n JOIN Functional.PhysicalElementFulfillsFunction r ON r.TargetECInstanceId = s.ECInstanceId\n )\n `,\n `\n DrawingGraphicElements(ECInstanceId, ECClassId) AS (\n SELECT r.SourceECInstanceId, r.SourceECClassId\n FROM ChildFunctionalElements s\n JOIN Functional.DrawingGraphicRepresentsFunctionalElement r ON r.TargetECInstanceId = s.ECInstanceId\n )\n `,\n `\n PhysicalElementGeometricElements(ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId FROM PhysicalElements\n UNION ALL\n SELECT r.ECInstanceId, r.ECClassId\n FROM PhysicalElementGeometricElements s\n JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId\n )\n `,\n `\n DrawingGraphicElementGeometricElements(ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId FROM DrawingGraphicElements\n UNION ALL\n SELECT r.ECInstanceId, r.ECClassId\n FROM DrawingGraphicElementGeometricElements s\n JOIN BisCore.Element r ON r.Parent.Id = s.ECInstanceId\n )\n `,\n `\n FunctionalElementChildGeometricElements(ECInstanceId, ECClassId) AS (\n SELECT ECInstanceId, ECClassId FROM PhysicalElementGeometricElements\n UNION\n SELECT ECInstanceId, ECClassId FROM DrawingGraphicElementGeometricElements\n )\n `,\n ];\n }\n\n private async getClass(fullClassName: string): Promise<EC.Class | undefined> {\n const { schemaName, className } = parseFullClassName(fullClassName);\n const schema = await this._imodelAccess.getSchema(schemaName);\n if (!schema) {\n return undefined;\n }\n const schemaClass = await schema.getClass(className);\n if (!schemaClass) {\n return undefined;\n }\n return schemaClass;\n }\n}\n\nconst INSTANCE_TYPES = [\n \"subject\",\n \"model\",\n \"category\",\n \"subCategory\",\n \"functionalElement\",\n \"groupInformationElement\",\n \"geometricElement\",\n \"element\",\n \"unknown\",\n] as const;\n\ntype InstanceIdType = (typeof INSTANCE_TYPES)[number];\n\ntype InstancesByType = {\n [idType in InstanceIdType]: Observable<string>;\n};\n\nfunction unique<T>() {\n return function (obs: Observable<T>): Observable<T> {\n return obs.pipe(\n scan(\n (acc, val) => {\n if (acc.set.has(val)) {\n delete acc.val;\n return acc;\n }\n\n acc.set.add(val);\n acc.val = val;\n return acc;\n },\n { set: new Set<T>() } as { set: Set<T>; val?: T },\n ),\n map(({ val }) => val),\n filter((x): x is T => !!x),\n );\n };\n}\n"]}
@@ -1,6 +1,3 @@
1
- /** @packageDocumentation
2
- * @module UnifiedSelection
3
- */
4
1
  /**
5
2
  * ECInstance selectable
6
3
  * @beta
@@ -1 +1 @@
1
- {"version":3,"file":"Selectable.d.ts","sourceRoot":"","sources":["../../../src/unified-selection/Selectable.ts"],"names":[],"mappings":"AAKA;;GAEG;AAEH;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,gBAAgB,EAAE,MAAM,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;IACrE,kDAAkD;IAClD,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,qBAAqB,GAAG,gBAAgB,CAAC;AAElE;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;AAEhG,YAAY;AAEZ,yBAAiB,UAAU,CAAC;IAC1B,oEAAoE;IACpE,SAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,oBAAoB,GAAG,UAAU,IAAI,qBAAqB,CAGhH;IAED,+DAA+D;IAC/D,SAAgB,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,IAAI,gBAAgB,CAE/E;CACF;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC;;OAEG;IACH,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACvC;AAED,YAAY;AAEZ,yBAAiB,WAAW,CAAC;IAC3B;;;;OAIG;IACH,SAAgB,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAOxD;IAED;;;;OAIG;IACH,SAAgB,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAIrD;IAED;;;;OAIG;IACH,SAAgB,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAEzD;IAED;;;;;OAKG;IACH,SAAgB,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAOlF;IAED;;;;;OAKG;IACH,SAAgB,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAUxF;IAED;;;;;OAKG;IACH,SAAgB,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAOxF;IAED;;;;;OAKG;IACH,SAAgB,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAoB3E;IAED;;;;;OAKG;IACH,SAAgB,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAmB9E;IAED;;;;OAIG;IACH,SAAgB,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAOvD;IAED;;;;OAIG;IACH,SAAgB,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,WAc3F;IAED;;;;OAIG;IACH,SAAgB,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,QAQ1G;CAKF"}
1
+ {"version":3,"file":"Selectable.d.ts","sourceRoot":"","sources":["../../../src/unified-selection/Selectable.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,gBAAgB,EAAE,MAAM,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;IACrE,kDAAkD;IAClD,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,qBAAqB,GAAG,gBAAgB,CAAC;AAElE;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;AAEhG,YAAY;AAEZ,yBAAiB,UAAU,CAAC;IAC1B,oEAAoE;IACpE,SAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,oBAAoB,GAAG,UAAU,IAAI,qBAAqB,CAGhH;IAED,+DAA+D;IAC/D,SAAgB,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,IAAI,gBAAgB,CAE/E;CACF;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC;;OAEG;IACH,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACvC;AAED,YAAY;AAEZ,yBAAiB,WAAW,CAAC;IAC3B;;;;OAIG;IACH,SAAgB,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAOxD;IAED;;;;OAIG;IACH,SAAgB,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAIrD;IAED;;;;OAIG;IACH,SAAgB,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAEzD;IAED;;;;;OAKG;IACH,SAAgB,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAOlF;IAED;;;;;OAKG;IACH,SAAgB,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAUxF;IAED;;;;;OAKG;IACH,SAAgB,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAOxF;IAED;;;;;OAKG;IACH,SAAgB,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAoB3E;IAED;;;;;OAKG;IACH,SAAgB,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAmB9E;IAED;;;;OAIG;IACH,SAAgB,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAOvD;IAED;;;;OAIG;IACH,SAAgB,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,WAc3F;IAED;;;;OAIG;IACH,SAAgB,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,QAQ1G;CAKF"}
@@ -20,7 +20,7 @@ var Selectable;
20
20
  return !!selectable.identifier;
21
21
  }
22
22
  Selectable.isCustom = isCustom;
23
- })(Selectable = exports.Selectable || (exports.Selectable = {}));
23
+ })(Selectable || (exports.Selectable = Selectable = {}));
24
24
  /** @beta */
25
25
  // eslint-disable-next-line @typescript-eslint/no-redeclare
26
26
  var Selectables;
@@ -217,5 +217,5 @@ var Selectables;
217
217
  function normalizeClassName(className) {
218
218
  return className.replace(".", ":");
219
219
  }
220
- })(Selectables = exports.Selectables || (exports.Selectables = {}));
220
+ })(Selectables || (exports.Selectables = Selectables = {}));
221
221
  //# sourceMappingURL=Selectable.js.map