import { ArrowRight } from 'lucide-react' import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' interface RowCountIndicatorProps { actualRows?: number estimatedRows?: number rowsRemovedByFilter?: number } function formatRowCount(rows: number | undefined): string { if (rows === undefined) return '-' return rows.toLocaleString() } export function RowCountIndicator({ actualRows, estimatedRows, rowsRemovedByFilter, }: RowCountIndicatorProps) { const hasActualRows = actualRows !== undefined const hasEstimatedRows = estimatedRows !== undefined const hasFilterData = rowsRemovedByFilter !== undefined && hasActualRows const totalRowsScanned = hasFilterData ? actualRows + rowsRemovedByFilter : undefined // Show filter flow: scanned → filtered out → remaining if (hasFilterData && totalRowsScanned !== undefined) { return (
{formatRowCount(totalRowsScanned)} -{formatRowCount(rowsRemovedByFilter)} {formatRowCount(actualRows)} {actualRows === 1 ? 'row' : 'rows'}

Filter applied

{formatRowCount(totalRowsScanned)} rows were scanned,{' '} {formatRowCount(rowsRemovedByFilter)} were filtered out, leaving{' '} {formatRowCount(actualRows)} rows. Consider adding an index to reduce rows scanned.

) } // Simple row count with actual rows if (hasActualRows) { return ( {formatRowCount(actualRows)} {actualRows === 1 ? 'row' : 'rows'}

Rows returned

This operation processed and returned {formatRowCount(actualRows)} rows.

) } // Only estimated rows available (EXPLAIN without ANALYZE) if (hasEstimatedRows) { return ( est. {formatRowCount(estimatedRows)} {estimatedRows === 1 ? 'row' : 'rows'}

Estimated rows

The planner estimates this operation will return {formatRowCount(estimatedRows)} rows. Run with EXPLAIN ANALYZE to see actual row counts.

) } return - }