import { useMemo } from "react"; import { useSearchParams } from "react-router-dom"; import { flexRender, getCoreRowModel, useReactTable, getSortedRowModel, } from "@tanstack/react-table"; import { BenchmarkResult } from "../../../types"; import { columns } from "./columns"; import { BenchmarkCharts } from "../charts/BenchmarkCharts"; import { exportToCsv } from "../export/csvExport"; interface BenchmarkTableProps { results: BenchmarkResult[]; } export function BenchmarkTable({ results }: BenchmarkTableProps) { const [searchParams, setSearchParams] = useSearchParams(); const selectedDataset = searchParams.get("dataset") || ""; const selectedAlgorithm = searchParams.get("algorithm") || ""; const availableDatasets = useMemo(() => { return Array.from(new Set(results.map((result) => result.dataset))).sort(); }, [results]); const availableAlgorithms = useMemo(() => { return Array.from( new Set(results.map((result) => result.algorithm)), ).sort(); }, [results]); // Memoize filtered data to prevent unnecessary recalculations const filteredData = useMemo(() => { let filtered = results; if (selectedDataset) { filtered = filtered.filter((row) => row.dataset === selectedDataset); } if (selectedAlgorithm) { filtered = filtered.filter((row) => row.algorithm === selectedAlgorithm); } return filtered; }, [results, selectedDataset, selectedAlgorithm]); const table = useReactTable({ data: filteredData || [], columns, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), }); // Prepare data for bar charts when either dataset or algorithm is selected const chartData = useMemo(() => { if (selectedDataset) { return results .filter((row: BenchmarkResult) => row.dataset === selectedDataset) .map((row: BenchmarkResult) => ({ algorithm: row.algorithm, compression_ratio: row.compression_ratio, encode_speed: row.encode_mb_per_sec, decode_speed: row.decode_mb_per_sec, })); } else if (selectedAlgorithm) { return results .filter((row: BenchmarkResult) => row.algorithm === selectedAlgorithm) .map((row: BenchmarkResult) => ({ algorithm: row.dataset, // Use dataset as the x-axis label when algorithm is selected compression_ratio: row.compression_ratio, encode_speed: row.encode_mb_per_sec, decode_speed: row.decode_mb_per_sec, })); } return []; }, [results, selectedDataset, selectedAlgorithm]); return (
| {flexRender( header.column.columnDef.header, header.getContext(), )} {header.column.getIsSorted() && ( {header.column.getIsSorted() === "asc" ? "↑" : "↓"} )} | ))}
|---|
| {flexRender(cell.column.columnDef.cell, cell.getContext())} | ))}