Skip to content

Commit f09cbe9

Browse files
authored
feat: download dump with all info (#1862)
1 parent df5e07b commit f09cbe9

File tree

11 files changed

+337
-153
lines changed

11 files changed

+337
-153
lines changed

src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx

+7-1
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ export default function QueryEditor(props: QueryEditorProps) {
103103
const [lastUsedQueryAction, setLastUsedQueryAction] = useSetting<QueryAction>(
104104
LAST_USED_QUERY_ACTION_KEY,
105105
);
106+
const [lastExecutedQueryText, setLastExecutedQueryText] = React.useState<string>('');
106107

107108
const [sendQuery] = queryApi.useUseSendQueryMutation();
108109

@@ -140,6 +141,7 @@ export default function QueryEditor(props: QueryEditorProps) {
140141
const query = text ?? input;
141142

142143
setLastUsedQueryAction(QUERY_ACTIONS.execute);
144+
setLastExecutedQueryText(query);
143145
if (!isEqual(lastQueryExecutionSettings, querySettings)) {
144146
resetBanner();
145147
setLastQueryExecutionSettings(querySettings);
@@ -172,7 +174,7 @@ export default function QueryEditor(props: QueryEditorProps) {
172174

173175
const handleGetExplainQueryClick = useEventHandler(() => {
174176
setLastUsedQueryAction(QUERY_ACTIONS.explain);
175-
177+
setLastExecutedQueryText(input);
176178
if (!isEqual(lastQueryExecutionSettings, querySettings)) {
177179
resetBanner();
178180
setLastQueryExecutionSettings(querySettings);
@@ -368,6 +370,7 @@ export default function QueryEditor(props: QueryEditorProps) {
368370
tenantName={tenantName}
369371
path={path}
370372
showPreview={showPreview}
373+
queryText={lastExecutedQueryText}
371374
/>
372375
</div>
373376
</SplitPane>
@@ -386,6 +389,7 @@ interface ResultProps {
386389
tenantName: string;
387390
path: string;
388391
showPreview?: boolean;
392+
queryText: string;
389393
}
390394
function Result({
391395
resultVisibilityState,
@@ -397,6 +401,7 @@ function Result({
397401
tenantName,
398402
path,
399403
showPreview,
404+
queryText,
400405
}: ResultProps) {
401406
if (showPreview) {
402407
return <Preview database={tenantName} path={path} type={type} />;
@@ -412,6 +417,7 @@ function Result({
412417
isResultsCollapsed={resultVisibilityState.collapsed}
413418
onExpandResults={onExpandResultHandler}
414419
onCollapseResults={onCollapseResultHandler}
420+
queryText={queryText}
415421
/>
416422
);
417423
}

src/containers/Tenant/Query/QueryResult/QueryResultViewer.tsx

+24-4
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import {isQueryCancelledError} from '../utils/isQueryCancelledError';
2727

2828
import {Ast} from './components/Ast/Ast';
2929
import {Graph} from './components/Graph/Graph';
30-
import {PlanToSvgButton} from './components/PlanToSvgButton/PlanToSvgButton';
30+
import {QueryInfoDropdown} from './components/QueryInfoDropdown/QueryInfoDropdown';
3131
import {QueryJSONViewer} from './components/QueryJSONViewer/QueryJSONViewer';
3232
import {QueryResultError} from './components/QueryResultError/QueryResultError';
3333
import {ResultSetsViewer} from './components/ResultSetsViewer/ResultSetsViewer';
@@ -83,6 +83,7 @@ interface ExecuteResultProps {
8383
tenantName: string;
8484
onCollapseResults: VoidFunction;
8585
onExpandResults: VoidFunction;
86+
queryText?: string;
8687
}
8788

8889
export function QueryResultViewer({
@@ -91,6 +92,7 @@ export function QueryResultViewer({
9192
isResultsCollapsed,
9293
theme,
9394
tenantName,
95+
queryText,
9496
onCollapseResults,
9597
onExpandResults,
9698
}: ExecuteResultProps) {
@@ -180,6 +182,26 @@ export function QueryResultViewer({
180182
);
181183
};
182184

185+
const renderQueryInfoDropdown = () => {
186+
if (isLoading || isQueryCancelledError(error)) {
187+
return null;
188+
}
189+
190+
return (
191+
<QueryInfoDropdown
192+
queryResultsInfo={{
193+
queryText,
194+
ast: data.ast,
195+
stats: data.stats,
196+
plan: data.plan,
197+
}}
198+
error={error}
199+
database={tenantName}
200+
hasPlanToSvg={Boolean(data?.plan && useShowPlanToSvg && isExecute)}
201+
/>
202+
);
203+
};
204+
183205
const renderStubMessage = () => {
184206
return (
185207
<StubMessage
@@ -268,16 +290,14 @@ export function QueryResultViewer({
268290
{data?.traceId && isExecute ? (
269291
<TraceButton traceId={data.traceId} isTraceReady={result.isTraceReady} />
270292
) : null}
271-
{data?.plan && useShowPlanToSvg && isExecute ? (
272-
<PlanToSvgButton plan={data?.plan} database={tenantName} />
273-
) : null}
274293
</div>
275294
);
276295
};
277296

278297
const renderRightControls = () => {
279298
return (
280299
<div className={b('controls-right')}>
300+
{renderQueryInfoDropdown()}
281301
{renderClipboardButton()}
282302
<EnableFullscreenButton />
283303
<PaneVisibilityToggleButtons

src/containers/Tenant/Query/QueryResult/components/PlanToSvgButton/PlanToSvgButton.tsx

-112
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
.query-info-dropdown {
2+
&__menu-item {
3+
align-items: start;
4+
}
5+
6+
&__menu-item-content {
7+
display: flex;
8+
flex-direction: column;
9+
10+
padding: var(--g-spacing-1) 0;
11+
}
12+
13+
&__icon {
14+
margin-top: var(--g-spacing-2);
15+
margin-right: var(--g-spacing-2);
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import {Ellipsis} from '@gravity-ui/icons';
2+
import type {ButtonProps} from '@gravity-ui/uikit';
3+
import {ActionTooltip, Button, DropdownMenu} from '@gravity-ui/uikit';
4+
5+
import i18n from '../../i18n';
6+
7+
import {b} from './shared';
8+
import type {QueryResultsInfo} from './useQueryInfoMenuItems';
9+
import {useQueryInfoMenuItems} from './useQueryInfoMenuItems';
10+
11+
import './QueryInfoDropdown.scss';
12+
13+
export interface QueryInfoDropdownProps {
14+
queryResultsInfo: QueryResultsInfo;
15+
database: string;
16+
hasPlanToSvg: boolean;
17+
error?: unknown;
18+
}
19+
20+
export function QueryInfoDropdown({
21+
queryResultsInfo,
22+
database,
23+
hasPlanToSvg,
24+
error,
25+
}: QueryInfoDropdownProps) {
26+
const {isLoading, items} = useQueryInfoMenuItems({
27+
queryResultsInfo,
28+
database,
29+
hasPlanToSvg,
30+
error,
31+
});
32+
33+
const renderSwitcher = (props: ButtonProps) => {
34+
return (
35+
<ActionTooltip title={i18n('tooltip_actions')}>
36+
<Button view="flat-secondary" loading={isLoading} disabled={isLoading} {...props}>
37+
<Button.Icon>
38+
<Ellipsis />
39+
</Button.Icon>
40+
</Button>
41+
</ActionTooltip>
42+
);
43+
};
44+
45+
if (!items.length) {
46+
return null;
47+
}
48+
49+
return (
50+
<DropdownMenu
51+
popupProps={{
52+
placement: ['bottom-end', 'left'],
53+
}}
54+
switcherWrapperClassName={b('query-info-switcher-wrapper')}
55+
renderSwitcher={renderSwitcher}
56+
items={items}
57+
size="xl"
58+
/>
59+
);
60+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import {cn} from '../../../../../../utils/cn';
2+
export const b = cn('query-info-dropdown');

0 commit comments

Comments
 (0)