Skip to content

Commit 9a0699f

Browse files
committed
Refactor predicate row into a separate component
1 parent eec42c5 commit 9a0699f

File tree

1 file changed

+86
-86
lines changed

1 file changed

+86
-86
lines changed

extensions/ql-vscode/src/view/compare-performance/ComparePerformance.tsx

Lines changed: 86 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
368358
function 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 &apos;{name}&apos; 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 &apos;{name}&apos; 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+
622622
interface PipelinePair {
623623
name: string;
624624
first: PipelineSummary | undefined;

0 commit comments

Comments
 (0)