import { ArrowUp, Eye, Code, HelpCircle } from 'lucide-react' import { useFlag } from 'common' import { AiIconAnimation, Button } from 'ui' import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { buildExplainPrompt } from './ExplainVisualizer.ai' import type { QueryPlanRow } from './ExplainVisualizer.types' import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' export interface ExplainSummary { totalTime: number hasSeqScan: boolean hasIndexScan: boolean } export interface ExplainHeaderProps { mode: 'visual' | 'raw' onToggleMode: () => void summary?: ExplainSummary id?: string rows?: readonly QueryPlanRow[] } export function ExplainHeader({ mode, onToggleMode, summary, id, rows }: ExplainHeaderProps) { const isVisual = mode === 'visual' const snapV2 = useSqlEditorV2StateSnapshot() const { openSidebar } = useSidebarManagerSnapshot() const aiSnap = useAiAssistantStateSnapshot() const handleExplainWithAI = () => { if (!id) return const snippet = snapV2.snippets[id]?.snippet if (!snippet?.content?.sql) return const { query, prompt } = buildExplainPrompt({ sql: snippet.content.sql, explainPlanRows: (rows as QueryPlanRow[]) ?? [], }) openSidebar(SIDEBAR_KEYS.AI_ASSISTANT) aiSnap.newChat({ sqlSnippets: [ { label: 'Query', content: query, }, ], initialMessage: prompt, }) } const hasSummaryStats = isVisual && summary && (summary.totalTime > 0 || (summary.hasSeqScan && !summary.hasIndexScan)) return (
{/* Title row */}

Query Execution Plan

How to read

Start at the bottom where data is read from tables, then follow upward as each step processes the results.

{isVisual && ( <>

Key

Seq Scan (slow)
Index Scan (fast)
)}
{/* Summary stats - only show in visual mode when we have the data */} {hasSummaryStats && (
{summary.totalTime > 0 && (
/ Total time {summary.totalTime.toFixed(2)}ms
)}
)}
{id && rows && ( )}
) }