Skip to content

[Tree widget]: use IdSet instead of InVirtualSet on next#1629

Merged
JonasDov merged 12 commits intotree-widget/nextfrom
JonasD/ids-set
Apr 7, 2026
Merged

[Tree widget]: use IdSet instead of InVirtualSet on next#1629
JonasDov merged 12 commits intotree-widget/nextfrom
JonasD/ids-set

Conversation

@JonasDov
Copy link
Copy Markdown
Contributor

closes #1590

@JonasDov JonasDov linked an issue Mar 18, 2026 that may be closed by this pull request
Copy link
Copy Markdown

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tree-Widget Next benchmark

Benchmark suite Current: 9db9edd Previous: 4ea0a87 Deviation Status
categories tree creates initial filtered view for 50k items 8253.25 ms 8042.51 ms 2.62% 〰️
categories tree creates initial filtered view for 50k items (P95 of main thread blocks) 234 ms 208 ms 12.50% 〰️
categories tree changing definition container visibility changes visibility for 50k subCategories 6597.55 ms 5811.16 ms 13.53% 🚨
categories tree changing definition container visibility changes visibility for 50k subCategories (P95 of main thread blocks) 69 ms 60 ms 15% 〰️
categories tree changing definition container visibility changes visibility for 50k categories 15072.25 ms 9915.8 ms 52.00% 🚨
categories tree changing definition container visibility changes visibility for 50k categories (P95 of main thread blocks) 345 ms 382 ms -9.69% 〰️
classifications tree loads initial view for iModel with 50k classifications 35.09 ms 37.08 ms -5.37% 〰️
classifications tree loads initial view for iModel with 50k classifications (P95 of main thread blocks) 0 ms 0 ms 0% 🟰
classifications tree loads first branch for iModel with 50k classifications 841.17 ms 919.38 ms -8.51% 〰️
classifications tree loads first branch for iModel with 50k classifications (P95 of main thread blocks) 57 ms 75 ms -24% 〰️
models tree creates initial filtered view for 50k target items 115820.46 ms 112166.49 ms 3.26% 〰️
models tree creates initial filtered view for 50k target items (P95 of main thread blocks) 103 ms 105 ms -1.90% 〰️
models tree validates categories visibility for imodel with 50k categories 5063.23 ms 4604.84 ms 9.95% 〰️
models tree validates categories visibility for imodel with 50k categories (P95 of main thread blocks) 319 ms 177 ms 80.23% 🚨
models tree changing model visibility changes visibility for 50k elements 2171.62 ms 2033.28 ms 6.80% 〰️
models tree changing model visibility changes visibility for 50k elements (P95 of main thread blocks) 0 ms 0 ms 0% 🟰
models tree changing category visibility changes visibility for 50k elements 2147 ms 2118.86 ms 1.33% 〰️
models tree changing category visibility changes visibility for 50k elements (P95 of main thread blocks) 0 ms 50 ms -100% 〰️
models tree changing per-model-category override changes visibility for 50k elements 2141.75 ms 2010.19 ms 6.54% 〰️
models tree changing per-model-category override changes visibility for 50k elements (P95 of main thread blocks) 0 ms 0 ms 0% 🟰
models tree changing element visibility changes only parent nodes visibility with 50k elements 3086.44 ms 2854.96 ms 8.11% 〰️
models tree changing element visibility changes only parent nodes visibility with 50k elements (P95 of main thread blocks) 346 ms 335 ms 3.28% 〰️
models tree changing element visibility changes only parent nodes visibility with 50k child elements with different categories 3016.83 ms 2841.84 ms 6.16% 〰️
models tree changing element visibility changes only parent nodes visibility with 50k child elements with different categories (P95 of main thread blocks) 234 ms 322 ms -27.33%

This comment was automatically generated by workflow using github-action-benchmark.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR migrates multiple ECSQL queries in the tree-widget (next) implementation from large IN (...) lists / InVirtualSet usage patterns to the IdSet virtual table, aiming to improve query performance and scalability (Issue #1590).

Changes:

  • Replaced many IN (${ids.map(() => "?")...}) patterns with JOIN IdSet(?) ... and consolidated bindings into idset bindings.
  • Added ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES to queries that rely on IdSet.
  • Updated related types/utilities (e.g., removing joinId64Arg, tightening some APIs to accept Id64Array) and bumped dependencies/peer requirements to iTwin 5.7.x.

Reviewed changes

Copilot reviewed 14 out of 15 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
packages/itwin/tree-widget/src/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.ts Uses IdSet joins for subject/model/category/element filtering and updates query bindings accordingly.
packages/itwin/tree-widget/src/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.ts Switches subject/model/category filtering to IdSet joins with idset bindings.
packages/itwin/tree-widget/src/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeDefinition.ts Replaces IN (...) filters with IdSet joins and standardizes class name constant usage.
packages/itwin/tree-widget/src/tree-widget-react/components/trees/common/internal/caches/ElementChildrenCache.ts Uses IdSet for recursive children lookup and supplies idset bindings.
packages/itwin/tree-widget/src/tree-widget-react/components/trees/common/internal/caches/AlwaysAndNeverDrawnElementInfoCache.ts Replaces InVirtualSet filtering with IdSet join for element info expansion.
packages/itwin/tree-widget/src/tree-widget-react/components/trees/common/internal/Utils.ts Removes joinId64Arg helper now that queries use IdSet/bindings.
packages/itwin/tree-widget/src/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.ts Switches filtered element lookups to IdSet and narrows inputs to Id64Array.
packages/itwin/tree-widget/src/tree-widget-react/components/trees/classifications-tree/ClassificationsTreeDefinition.ts Migrates multiple classification-related queries/CTEs to IdSet + idset bindings.
packages/itwin/tree-widget/src/tree-widget-react/components/trees/categories-tree/internal/UseSearchPaths.ts Adjusts call site to pass arrays to updated cache API.
packages/itwin/tree-widget/src/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.ts Uses IdSet for filtered element model lookup and updates API types to Id64Array.
packages/itwin/tree-widget/src/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.ts Migrates several queries to IdSet joins and updates bindings (some membership checks moved to InVirtualSet).
packages/itwin/tree-widget/pnpm-lock.yaml Updates iTwin dependency versions to 5.7.2 and related transitive updates.
packages/itwin/tree-widget/package.json Raises peer/dev dependency ranges to iTwin 5.7.x to support IdSet.
packages/itwin/tree-widget/api/tree-widget-react.api.md API extraction output updated (parameter name normalization).
cspell.json Adds ECSQLOPTIONS (and reorders/adds terms) for spellcheck.
Files not reviewed (1)
  • packages/itwin/tree-widget/pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@JonasDov JonasDov marked this pull request as ready for review April 7, 2026 17:29
@JonasDov JonasDov requested review from a team as code owners April 7, 2026 17:29
@JonasDov JonasDov merged commit e55d441 into tree-widget/next Apr 7, 2026
21 checks passed
@JonasDov JonasDov deleted the JonasD/ids-set branch April 7, 2026 17:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tree widget: Replace usages of InVirtualSet with IdSet virtual table

3 participants