@@ -175,8 +175,44 @@ public static class PlanIconMapper
175175 [ "Language Construct Catch All" ] = "language_construct_catch_all" ,
176176 } ;
177177
178- public static string GetIconName ( string physicalOp )
178+ public static string GetIconName ( string physicalOp , string ? storageType = null , string ? logicalOp = null )
179179 {
180+ // Parallelism subtypes: PhysicalOp="Parallelism" + LogicalOp identifies which.
181+ if ( string . Equals ( physicalOp , "Parallelism" , StringComparison . Ordinal ) && logicalOp != null )
182+ {
183+ switch ( logicalOp )
184+ {
185+ case "Repartition Streams" : return "parallelism_repartition_streams" ;
186+ case "Distribute Streams" : return "parallelism_distribute_streams" ;
187+ case "Gather Streams" : return "parallelism_gather_streams" ;
188+ }
189+ }
190+
191+ // Columnstore scans surface as PhysicalOp="Clustered Index Scan" / "Index Scan"
192+ // with Storage="ColumnStore" on the Object element. Route to the columnstore icon.
193+ if ( string . Equals ( storageType , "ColumnStore" , StringComparison . OrdinalIgnoreCase ) )
194+ {
195+ switch ( physicalOp )
196+ {
197+ case "Clustered Index Scan" :
198+ case "Index Scan" :
199+ case "Columnstore Index Scan" :
200+ return "columnstore_index_scan" ;
201+ case "Clustered Index Delete" :
202+ case "Index Delete" :
203+ return "columnstore_index_delete" ;
204+ case "Clustered Index Insert" :
205+ case "Index Insert" :
206+ return "columnstore_index_insert" ;
207+ case "Clustered Index Update" :
208+ case "Index Update" :
209+ return "columnstore_index_update" ;
210+ case "Clustered Index Merge" :
211+ case "Index Merge" :
212+ return "columnstore_index_merge" ;
213+ }
214+ }
215+
180216 if ( IconMap . TryGetValue ( physicalOp , out var iconName ) )
181217 return iconName ;
182218
0 commit comments