import { useEffect, useState, useMemo } from "react"; import axios from "axios"; 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"; export function BenchmarkTable() { const [data, setData] = useState([]); const [selectedDataset, setSelectedDataset] = useState(""); const [availableDatasets, setAvailableDatasets] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { try { setIsLoading(true); setError(null); const response = await axios.get( "https://raw.githubusercontent.com/magland/zia/benchmark-results/benchmark_results/results.json", ); const results = response.data.results; setData(results); // Extract unique dataset names with proper typing const datasets = Array.from( new Set(results.map((result: BenchmarkResult) => result.dataset)), ).sort() as string[]; setAvailableDatasets(datasets); } catch (error) { const message = error instanceof Error ? error.message : "Failed to fetch data"; setError(message); console.error("Error fetching benchmark data:", error); } finally { setIsLoading(false); } }; fetchData(); }, []); // Memoize filtered data to prevent unnecessary recalculations const filteredData = useMemo(() => { if (!selectedDataset) return data; return data.filter((row) => row.dataset === selectedDataset); }, [data, 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 data .filter((row) => row.dataset === selectedDataset) .map((row) => ({ algorithm: row.algorithm, compression_ratio: row.compression_ratio, encode_speed: row.encode_mb_per_sec, decode_speed: row.decode_mb_per_sec, })); }, [data, selectedDataset]); if (isLoading) { return
Loading benchmark data...
; } if (error) { return
Error: {error}
; } 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())}
); }