@@ -355,16 +355,6 @@ function Chevron({ expanded }: { expanded: boolean }) {
355355 return < Codicon name = { expanded ? "chevron-down" : "chevron-right" } /> ;
356356}
357357
358- function withToggledValue < T > ( set : Set < T > , value : T ) {
359- const result = new Set ( set ) ;
360- if ( result . has ( value ) ) {
361- result . delete ( value ) ;
362- } else {
363- result . add ( value ) ;
364- }
365- return result ;
366- }
367-
368358function union < T > ( a : Set < T > | T [ ] , b : Set < T > | T [ ] ) {
369359 const result = new Set ( a ) ;
370360 for ( const x of b ) {
@@ -407,10 +397,6 @@ function ComparePerformanceWithData(props: {
407397
408398 const comparison = data ?. comparison ;
409399
410- const [ expandedPredicates , setExpandedPredicates ] = useState < Set < string > > (
411- ( ) => new Set < string > ( ) ,
412- ) ;
413-
414400 const [ hideCacheHits , setHideCacheHits ] = useState ( false ) ;
415401
416402 const [ sortOrder , setSortOrder ] = useState < "delta" | "absDelta" > ( "absDelta" ) ;
@@ -526,78 +512,13 @@ function ComparePerformanceWithData(props: {
526512 </ thead >
527513 </ Table >
528514 { rows . map ( ( row , rowIndex ) => (
529- < Table
530- key = { row . name }
531- className = { expandedPredicates . has ( row . name ) ? "expanded" : "" }
532- >
533- < tbody >
534- < PredicateTR
535- className = { expandedPredicates . has ( row . name ) ? "expanded" : "" }
536- key = { "main" }
537- onClick = { ( ) =>
538- setExpandedPredicates (
539- withToggledValue ( expandedPredicates , row . name ) ,
540- )
541- }
542- >
543- < ChevronCell >
544- < Chevron expanded = { expandedPredicates . has ( row . name ) } />
545- </ ChevronCell >
546- { comparison && renderPredicateMetric ( row . before , metric ) }
547- { renderPredicateMetric ( row . after , metric ) }
548- { comparison && renderDelta ( row . diff , metric . unit ) }
549- < NameCell > { rowNames [ rowIndex ] } </ NameCell >
550- </ PredicateTR >
551- { expandedPredicates . has ( row . name ) && (
552- < >
553- < HighLevelStats
554- before = { row . before }
555- after = { row . after }
556- comparison = { comparison }
557- />
558- { collatePipelines (
559- isPresent ( row . before ) ? row . before . pipelines : { } ,
560- isPresent ( row . after ) ? row . after . pipelines : { } ,
561- ) . map ( ( { name, first, second } , pipelineIndex ) => (
562- < Fragment key = { pipelineIndex } >
563- < HeaderTR >
564- < td > </ td >
565- { comparison && (
566- < NumberHeader > { first != null && "Before" } </ NumberHeader >
567- ) }
568- < NumberHeader > { second != null && "After" } </ NumberHeader >
569- { comparison && (
570- < NumberHeader >
571- { first != null && second != null && "Delta" }
572- </ NumberHeader >
573- ) }
574- < NameHeader >
575- Tuple counts for '{ name } ' pipeline
576- { comparison &&
577- ( first == null
578- ? " (after)"
579- : second == null
580- ? " (before)"
581- : "" ) }
582- </ NameHeader >
583- </ HeaderTR >
584- { abbreviateRASteps ( first ?. steps ?? second ! . steps ) . map (
585- ( step , index ) => (
586- < PipelineStep
587- key = { index }
588- before = { first ?. counts [ index ] }
589- after = { second ?. counts [ index ] }
590- comparison = { comparison }
591- step = { step }
592- />
593- ) ,
594- ) }
595- </ Fragment >
596- ) ) }
597- </ >
598- ) }
599- </ tbody >
600- </ Table >
515+ < PredicateRow
516+ key = { rowIndex }
517+ renderedName = { rowNames [ rowIndex ] }
518+ row = { row }
519+ comparison = { comparison }
520+ metric = { metric }
521+ />
601522 ) ) }
602523 < Table >
603524 < tfoot >
@@ -619,6 +540,85 @@ function ComparePerformanceWithData(props: {
619540 ) ;
620541}
621542
543+ interface PredicateRowProps {
544+ renderedName : React . ReactNode ;
545+ row : TRow ;
546+ comparison : boolean ;
547+ metric : Metric ;
548+ }
549+
550+ function PredicateRow ( props : PredicateRowProps ) {
551+ const [ isExpanded , setExpanded ] = useState ( false ) ;
552+ const { renderedName, row, comparison, metric } = props ;
553+ return (
554+ < Table className = { isExpanded ? "expanded" : "" } >
555+ < tbody >
556+ < PredicateTR
557+ className = { isExpanded ? "expanded" : "" }
558+ key = { "main" }
559+ onClick = { ( ) => setExpanded ( ! isExpanded ) }
560+ >
561+ < ChevronCell >
562+ < Chevron expanded = { isExpanded } />
563+ </ ChevronCell >
564+ { comparison && renderPredicateMetric ( row . before , metric ) }
565+ { renderPredicateMetric ( row . after , metric ) }
566+ { comparison && renderDelta ( row . diff , metric . unit ) }
567+ < NameCell > { renderedName } </ NameCell >
568+ </ PredicateTR >
569+ { isExpanded && (
570+ < >
571+ < HighLevelStats
572+ before = { row . before }
573+ after = { row . after }
574+ comparison = { comparison }
575+ />
576+ { collatePipelines (
577+ isPresent ( row . before ) ? row . before . pipelines : { } ,
578+ isPresent ( row . after ) ? row . after . pipelines : { } ,
579+ ) . map ( ( { name, first, second } , pipelineIndex ) => (
580+ < Fragment key = { pipelineIndex } >
581+ < HeaderTR >
582+ < td > </ td >
583+ { comparison && (
584+ < NumberHeader > { first != null && "Before" } </ NumberHeader >
585+ ) }
586+ < NumberHeader > { second != null && "After" } </ NumberHeader >
587+ { comparison && (
588+ < NumberHeader >
589+ { first != null && second != null && "Delta" }
590+ </ NumberHeader >
591+ ) }
592+ < NameHeader >
593+ Tuple counts for '{ name } ' pipeline
594+ { comparison &&
595+ ( first == null
596+ ? " (after)"
597+ : second == null
598+ ? " (before)"
599+ : "" ) }
600+ </ NameHeader >
601+ </ HeaderTR >
602+ { abbreviateRASteps ( first ?. steps ?? second ! . steps ) . map (
603+ ( step , index ) => (
604+ < PipelineStep
605+ key = { index }
606+ before = { first ?. counts [ index ] }
607+ after = { second ?. counts [ index ] }
608+ comparison = { comparison }
609+ step = { step }
610+ />
611+ ) ,
612+ ) }
613+ </ Fragment >
614+ ) ) }
615+ </ >
616+ ) }
617+ </ tbody >
618+ </ Table >
619+ ) ;
620+ }
621+
622622interface PipelinePair {
623623 name : string ;
624624 first : PipelineSummary | undefined ;
0 commit comments