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 availableDatasets = useMemo(() => { return Array.from(new Set(results.map((result) => result.dataset))).sort(); }, [results]); // Memoize filtered data to prevent unnecessary recalculations const filteredData = useMemo(() => { if (!selectedDataset) return results; return results.filter((row) => row.dataset === selectedDataset); }, [results, selectedDataset]); const table = useReactTable({ data: filteredData || [], columns, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), }); // Prepare data for bar charts when a dataset is selected const chartData = useMemo(() => { if (!selectedDataset) return []; 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, })); }, [results, selectedDataset]); return (
{selectedDataset && chartData.length > 0 && ( )} {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( ))} ))} {table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( ))} ))}
{flexRender( header.column.columnDef.header, header.getContext(), )} {header.column.getIsSorted() && ( {header.column.getIsSorted() === "asc" ? "↑" : "↓"} )}
{flexRender(cell.column.columnDef.cell, cell.getContext())}
); }