Skip to content

Commit 27d4d7b

Browse files
committed
feat: download dump with all info
1 parent e99b217 commit 27d4d7b

File tree

9 files changed

+283
-117
lines changed

9 files changed

+283
-117
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
DEFAULT_IS_QUERY_RESULT_COLLAPSED,
3232
DEFAULT_SIZE_RESULT_PANE_KEY,
3333
LAST_USED_QUERY_ACTION_KEY,
34+
LAST_USED_QUERY_TEXT,
3435
} from '../../../../utils/constants';
3536
import {
3637
useEventHandler,
@@ -104,6 +105,8 @@ export default function QueryEditor(props: QueryEditorProps) {
104105
LAST_USED_QUERY_ACTION_KEY,
105106
);
106107

108+
const [lastUsedQueryText, setLastUsedQueryText] = useSetting<string>(LAST_USED_QUERY_TEXT);
109+
107110
const [sendQuery] = queryApi.useUseSendQueryMutation();
108111

109112
React.useEffect(() => {
@@ -140,6 +143,7 @@ export default function QueryEditor(props: QueryEditorProps) {
140143
const query = text ?? input;
141144

142145
setLastUsedQueryAction(QUERY_ACTIONS.execute);
146+
setLastUsedQueryText(query);
143147
if (!isEqual(lastQueryExecutionSettings, querySettings)) {
144148
resetBanner();
145149
setLastQueryExecutionSettings(querySettings);
@@ -172,7 +176,7 @@ export default function QueryEditor(props: QueryEditorProps) {
172176

173177
const handleGetExplainQueryClick = useEventHandler(() => {
174178
setLastUsedQueryAction(QUERY_ACTIONS.explain);
175-
179+
setLastUsedQueryText(input);
176180
if (!isEqual(lastQueryExecutionSettings, querySettings)) {
177181
resetBanner();
178182
setLastQueryExecutionSettings(querySettings);
@@ -368,6 +372,7 @@ export default function QueryEditor(props: QueryEditorProps) {
368372
tenantName={tenantName}
369373
path={path}
370374
showPreview={showPreview}
375+
queryText={lastUsedQueryText}
371376
/>
372377
</div>
373378
</SplitPane>
@@ -386,6 +391,7 @@ interface ResultProps {
386391
tenantName: string;
387392
path: string;
388393
showPreview?: boolean;
394+
queryText: string;
389395
}
390396
function Result({
391397
resultVisibilityState,
@@ -397,6 +403,7 @@ function Result({
397403
tenantName,
398404
path,
399405
showPreview,
406+
queryText,
400407
}: ResultProps) {
401408
if (showPreview) {
402409
return <Preview database={tenantName} path={path} type={type} />;
@@ -412,6 +419,7 @@ function Result({
412419
isResultsCollapsed={resultVisibilityState.collapsed}
413420
onExpandResults={onExpandResultHandler}
414421
onCollapseResults={onCollapseResultHandler}
422+
queryText={queryText}
415423
/>
416424
);
417425
}

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

Lines changed: 19 additions & 4 deletions
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,21 @@ export function QueryResultViewer({
180182
);
181183
};
182184

185+
const renderQueryInfoDropdown = () => {
186+
return (
187+
<QueryInfoDropdown
188+
queryResultsInfo={{
189+
ast: data.ast,
190+
stats: data.stats,
191+
queryText,
192+
plan: data.plan,
193+
}}
194+
database={tenantName}
195+
hasPlanToSvg={Boolean(data?.plan && useShowPlanToSvg && isExecute)}
196+
/>
197+
);
198+
};
199+
183200
const renderStubMessage = () => {
184201
return (
185202
<StubMessage
@@ -268,16 +285,14 @@ export function QueryResultViewer({
268285
{data?.traceId && isExecute ? (
269286
<TraceButton traceId={data.traceId} isTraceReady={result.isTraceReady} />
270287
) : null}
271-
{data?.plan && useShowPlanToSvg && isExecute ? (
272-
<PlanToSvgButton plan={data?.plan} database={tenantName} />
273-
) : null}
274288
</div>
275289
);
276290
};
277291

278292
const renderRightControls = () => {
279293
return (
280294
<div className={b('controls-right')}>
295+
{renderQueryInfoDropdown()}
281296
{renderClipboardButton()}
282297
<EnableFullscreenButton />
283298
<PaneVisibilityToggleButtons

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

Lines changed: 0 additions & 112 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
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+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import {Ellipsis} from '@gravity-ui/icons';
2+
import type {ButtonProps} from '@gravity-ui/uikit';
3+
import {Button, DropdownMenu, Tooltip} from '@gravity-ui/uikit';
4+
5+
import i18n from '../../i18n';
6+
7+
import type {QueryResultsInfo} from './useQueryInfoMenuItems';
8+
import {useQueryInfoMenuItems} from './useQueryInfoMenuItems';
9+
10+
import './QueryInfoDropdown.scss';
11+
12+
interface QueryInfoDropdownProps {
13+
queryResultsInfo: QueryResultsInfo;
14+
database: string;
15+
hasPlanToSvg: boolean;
16+
}
17+
18+
export function QueryInfoDropdown({
19+
queryResultsInfo,
20+
database,
21+
hasPlanToSvg,
22+
}: QueryInfoDropdownProps) {
23+
const {error, isLoading, items} = useQueryInfoMenuItems({
24+
queryResultsInfo,
25+
database,
26+
hasPlanToSvg,
27+
});
28+
29+
const renderSwitcher = (props: ButtonProps) => {
30+
return (
31+
<Tooltip content={error ? i18n('text_error-plan-svg', {error}) : i18n('text_plan-svg')}>
32+
<Button view="flat-secondary" loading={isLoading} disabled={isLoading} {...props}>
33+
<Button.Icon>
34+
<Ellipsis />
35+
</Button.Icon>
36+
</Button>
37+
</Tooltip>
38+
);
39+
};
40+
41+
if (!items.length) {
42+
return null;
43+
}
44+
45+
return (
46+
<DropdownMenu
47+
popupProps={{
48+
placement: ['bottom-end', 'left'],
49+
}}
50+
renderSwitcher={renderSwitcher}
51+
items={items}
52+
size="xl"
53+
/>
54+
);
55+
}

0 commit comments

Comments
 (0)