import { Loader2 } from 'lucide-react' import { useState } from 'react' import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' import Results from './Results' import { ExplainVisualizer } from '@/components/interfaces/ExplainVisualizer/ExplainVisualizer' import { ExplainHeader } from '@/components/interfaces/ExplainVisualizer/ExplainVisualizer.Header' import { isExplainQuery, isTextFormatExplain, } from '@/components/interfaces/ExplainVisualizer/ExplainVisualizer.utils' import CopyButton from '@/components/ui/CopyButton' import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export type UtilityTabExplainProps = { id: string isExecuting?: boolean } export function UtilityTabExplain({ id, isExecuting }: UtilityTabExplainProps) { const snapV2 = useSqlEditorV2StateSnapshot() const explainResult = snapV2.explainResults[id] const [mode, setMode] = useState<'visual' | 'raw'>('visual') if (isExecuting) { return (

Running EXPLAIN ANALYZE...

) } if (explainResult?.error) { const formattedError = (explainResult.error?.formattedError?.split('\n') ?? []).filter( (x: string) => x.length > 0 ) return (
{formattedError.length > 0 ? ( formattedError.map((x: string, i: number) => (
                  {x}
                
)) ) : (

Error: {explainResult.error?.message}

)}
{formattedError.length > 0 && ( Copy error )}
) } if (!explainResult || explainResult.rows.length === 0) { return (

No execution plan available. The query will be analyzed when you switch to this tab.

) } const isValidExplain = isExplainQuery(explainResult.rows) const isTextFormat = isTextFormatExplain(explainResult.rows) if (!isValidExplain) { return (

Unable to parse explain results. Please try running the query again.

) } // Handle non-TEXT formats (JSON, YAML, XML) - show raw output only if (!isTextFormat) { return (
Visual execution plan is only available for TEXT format. Showing raw output.
) } const toggleMode = () => setMode(mode === 'visual' ? 'raw' : 'visual') return (
{mode === 'visual' ? ( ) : ( <> )}
) }