import { Lightbulb } from 'lucide-react' import { useEffect, useState } from 'react' import dynamic from 'next/dynamic' import { formatSql } from 'lib/formatSql' import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button, cn } from 'ui' import { QueryPanelContainer, QueryPanelSection } from './QueryPanel' import { QUERY_PERFORMANCE_COLUMNS, QUERY_PERFORMANCE_REPORT_TYPES, } from './QueryPerformance.constants' interface QueryDetailProps { reportType: QUERY_PERFORMANCE_REPORT_TYPES selectedRow: any onClickViewSuggestion: () => void } // Load SqlMonacoBlock (monaco editor) client-side only (does not behave well server-side) const SqlMonacoBlock = dynamic( () => import('./SqlMonacoBlock').then(({ SqlMonacoBlock }) => SqlMonacoBlock), { ssr: false, } ) export const QueryDetail = ({ selectedRow, onClickViewSuggestion }: QueryDetailProps) => { // [Joshen] TODO implement this logic once the linter rules are in const isLinterWarning = false const report = QUERY_PERFORMANCE_COLUMNS const [query, setQuery] = useState(selectedRow?.['query']) useEffect(() => { if (selectedRow !== undefined) { const formattedQuery = formatSql(selectedRow['query']) setQuery(formattedQuery) } }, [selectedRow]) return (

Query pattern

{isLinterWarning && ( Suggested optimization: Add an index Adding an index will help this query execute faster )}
{report .filter((x) => x.id !== 'query') .map((x) => { const rawValue = selectedRow?.[x.id] const isTime = x.name.includes('time') const formattedValue = isTime ? typeof rawValue === 'number' && !isNaN(rawValue) && isFinite(rawValue) ? `${rawValue.toFixed(2)}ms` : 'N/A' : rawValue != null ? String(rawValue) : 'N/A' return (

{x.name}

{formattedValue}

) })}
) }