useQueryInsightsMetrics.ts24 lines · main
| 1 | import { useMemo } from 'react' |
| 2 | |
| 3 | import type { QueryPerformanceRow } from '../../QueryPerformance/QueryPerformance.types' |
| 4 | |
| 5 | export const useQueryInsightsMetrics = (data: QueryPerformanceRow[]) => { |
| 6 | const avgP95 = useMemo(() => { |
| 7 | const rows = data.filter((r) => (r.p95_time ?? 0) > 0) |
| 8 | if (rows.length === 0) return 0 |
| 9 | return Math.round(rows.reduce((sum, r) => sum + (r.p95_time ?? 0), 0) / rows.length) |
| 10 | }, [data]) |
| 11 | |
| 12 | const totalCalls = useMemo(() => data.reduce((sum, r) => sum + r.calls, 0), [data]) |
| 13 | |
| 14 | const totalRowsRead = useMemo(() => data.reduce((sum, r) => sum + r.rows_read, 0), [data]) |
| 15 | |
| 16 | const cacheHitRate = useMemo(() => { |
| 17 | const hits = data.reduce((sum, r) => sum + (r._total_cache_hits ?? 0), 0) |
| 18 | const misses = data.reduce((sum, r) => sum + (r._total_cache_misses ?? 0), 0) |
| 19 | const total = hits + misses |
| 20 | return total > 0 ? ((hits / total) * 100).toFixed(2) + '%' : '–' |
| 21 | }, [data]) |
| 22 | |
| 23 | return { avgP95, totalCalls, totalRowsRead, cacheHitRate } |
| 24 | } |