@@ -21,8 +21,8 @@ import {
2121 MultipleQueryResult ,
2222 multipleQuery ,
2323} from "@/components/lib/multiple-query" ;
24- import WindowTabs , { useTabsContext } from "../windows-tab" ;
25- import QueryResult from "../query-result" ;
24+ import WindowTabs , { useTabsContext , WindowTabItemProps } from "../windows-tab" ;
25+ import QueryResult from "../tabs-result/ query-result-tab " ;
2626import { useSchema } from "@/context/schema-provider" ;
2727import SaveDocButton from "../save-doc-button" ;
2828import {
@@ -49,6 +49,8 @@ import {
4949 DropdownMenuSeparator ,
5050 DropdownMenuTrigger ,
5151} from "@/components/ui/dropdown-menu" ;
52+ import { isExplainQueryPlan } from "../query-explanation" ;
53+ import ExplainResultTab from "../tabs-result/explain-result-tab" ;
5254
5355interface QueryWindowProps {
5456 initialCode ?: string ;
@@ -115,14 +117,12 @@ export default function QueryWindow({
115117 explained &&
116118 statement . toLowerCase ( ) . indexOf ( "explain query plan" ) !== 0
117119 ) {
118- if ( databaseDriver . getFlags ( ) . dialect === ' sqlite' ) {
120+ if ( databaseDriver . getFlags ( ) . dialect === " sqlite" ) {
119121 statement = "explain query plan " + statement ;
120- }
121- else if ( databaseDriver . getFlags ( ) . dialect === 'mysql' ) {
122- statement = "explain format=json " + statement
123- }
124- else if ( databaseDriver . getFlags ( ) . dialect === 'postgres' ) {
125- statement = 'explain (format json) ' + statement
122+ } else if ( databaseDriver . getFlags ( ) . dialect === "mysql" ) {
123+ statement = "explain format=json " + statement ;
124+ } else if ( databaseDriver . getFlags ( ) . dialect === "postgres" ) {
125+ statement = "explain (format json) " + statement ;
126126 }
127127 }
128128
@@ -161,7 +161,7 @@ export default function QueryWindow({
161161 } else if (
162162 databaseDriver . getFlags ( ) . supportUseStatement &&
163163 log . sql . trim ( ) . substring ( 0 , "use " . length ) . toLowerCase ( ) ===
164- "use "
164+ "use "
165165 ) {
166166 hasAlterSchema = true ;
167167 break ;
@@ -190,44 +190,57 @@ export default function QueryWindow({
190190 } , [ code , name ] ) ;
191191
192192 const windowTab = useMemo ( ( ) => {
193+ const queryTabs : WindowTabItemProps [ ] = [ ] ;
194+
195+ for ( const queryResult of data ?? [ ] ) {
196+ if (
197+ isExplainQueryPlan ( queryResult . sql , databaseDriver . getFlags ( ) . dialect )
198+ ) {
199+ queryTabs . push ( {
200+ component : < ExplainResultTab data = { queryResult . result } /> ,
201+ key : "explain_" + queryResult . order ,
202+ identifier : "explain_" + queryResult . order ,
203+ title : "Explain (Visual)" ,
204+ icon : LucideMessageSquareWarning ,
205+ } ) ;
206+ }
207+
208+ queryTabs . push ( {
209+ component : < QueryResult result = { queryResult } key = { queryResult . order } /> ,
210+ key : "query_" + queryResult . order ,
211+ identifier : "query_" + queryResult . order ,
212+ title :
213+ `${ getSingleTableName ( queryResult . sql ) ?? "Query " + ( queryResult . order + 1 ) } ` +
214+ ` (${ queryResult . result . rows . length } x${ queryResult . result . headers . length } )` ,
215+ icon : LucideGrid ,
216+ } ) ;
217+ }
218+
219+ if ( progress ) {
220+ queryTabs . push ( {
221+ key : "summary" ,
222+ identifier : "summary" ,
223+ title : "Summary" ,
224+ icon : LucideMessageSquareWarning ,
225+ component : (
226+ < div className = "w-full h-full overflow-y-auto overflow-x-hidden" >
227+ < QueryProgressLog progress = { progress } />
228+ </ div >
229+ ) ,
230+ } ) ;
231+ }
232+
193233 return (
194234 < WindowTabs
195235 key = "main-window-tab"
196236 onSelectChange = { setQueryTabIndex }
197- onTabsChange = { ( ) => { } }
237+ onTabsChange = { ( ) => { } }
198238 hideCloseButton
199239 selected = { queryTabIndex }
200- tabs = { [
201- ...( data ?? [ ] ) . map ( ( queryResult , queryIdx ) => ( {
202- component : (
203- < QueryResult result = { queryResult } key = { queryResult . order } />
204- ) ,
205- key : "query_" + queryResult . order ,
206- identifier : "query_" + queryResult . order ,
207- title :
208- `${ getSingleTableName ( queryResult . sql ) ?? "Query " + ( queryIdx + 1 ) } ` +
209- ` (${ queryResult . result . rows . length } x${ queryResult . result . headers . length } )` ,
210- icon : LucideGrid ,
211- } ) ) ,
212- ...( progress
213- ? [
214- {
215- key : "summary" ,
216- identifier : "summary" ,
217- title : "Summary" ,
218- icon : LucideMessageSquareWarning ,
219- component : (
220- < div className = "w-full h-full overflow-y-auto overflow-x-hidden" >
221- < QueryProgressLog progress = { progress } />
222- </ div >
223- ) ,
224- } ,
225- ]
226- : [ ] ) ,
227- ] }
240+ tabs = { queryTabs }
228241 />
229242 ) ;
230- } , [ progress , queryTabIndex , data ] ) ;
243+ } , [ progress , queryTabIndex , data , databaseDriver ] ) ;
231244
232245 return (
233246 < ResizablePanelGroup direction = "vertical" >
0 commit comments