Skip to content

Commit 0434410

Browse files
authored
feat: in query results show when it was truncated (#1309)
1 parent 206dfdb commit 0434410

File tree

6 files changed

+35
-16
lines changed

6 files changed

+35
-16
lines changed

src/containers/Tenant/Query/ExecuteResult/ExecuteResult.scss

+8
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@
1515
}
1616
}
1717

18+
&__row-count {
19+
margin-left: var(--g-spacing-1);
20+
}
21+
22+
&__result-head {
23+
margin-top: var(--g-spacing-4);
24+
}
25+
1826
&__result-wrapper {
1927
display: flex;
2028
flex-direction: column;

src/containers/Tenant/Query/ExecuteResult/ExecuteResult.tsx

+20-14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react';
22

33
import type {ControlGroupOption} from '@gravity-ui/uikit';
4-
import {RadioButton, Tabs} from '@gravity-ui/uikit';
4+
import {RadioButton, Tabs, Text} from '@gravity-ui/uikit';
55
import JSONTree from 'react-json-inspector';
66

77
import {ClipboardButton} from '../../../../components/ClipboardButton';
@@ -14,7 +14,7 @@ import {LoaderWrapper} from '../../../../components/LoaderWrapper/LoaderWrapper'
1414
import {QueryExecutionStatus} from '../../../../components/QueryExecutionStatus';
1515
import {QueryResultTable} from '../../../../components/QueryResultTable/QueryResultTable';
1616
import {disableFullscreen} from '../../../../store/reducers/fullscreen';
17-
import type {ColumnType, KeyValueRow, TKqpStatsQuery} from '../../../../types/api/query';
17+
import type {TKqpStatsQuery} from '../../../../types/api/query';
1818
import type {ValueOf} from '../../../../types/common';
1919
import type {ExecuteQueryResult} from '../../../../types/store/executeQuery';
2020
import {getArray} from '../../../../utils';
@@ -74,8 +74,7 @@ export function ExecuteResult({
7474
const stats: TKqpStatsQuery | undefined = data?.stats;
7575
const resultsSetsCount = data?.resultSets?.length;
7676
const isMulti = resultsSetsCount && resultsSetsCount > 0;
77-
const currentResult = isMulti ? data?.resultSets?.[selectedResultSet].result : data?.result;
78-
const currentColumns = isMulti ? data?.resultSets?.[selectedResultSet].columns : data?.columns;
77+
const currentResult = isMulti ? data?.resultSets?.[selectedResultSet] : data;
7978
const {plan, simplifiedPlan} = React.useMemo(() => getPlan(data), [data]);
8079

8180
const resultOptions: ControlGroupOption<SectionID>[] = [
@@ -104,13 +103,6 @@ export function ExecuteResult({
104103
setActiveSection(value);
105104
};
106105

107-
const renderResultTable = (
108-
resultSet: KeyValueRow[] | undefined,
109-
columns: ColumnType[] | undefined,
110-
) => {
111-
return <QueryResultTable data={resultSet} columns={columns} settings={{sortable: false}} />;
112-
};
113-
114106
const renderResult = () => {
115107
return (
116108
<div className={b('result-wrapper')}>
@@ -121,15 +113,29 @@ export function ExecuteResult({
121113
size="l"
122114
items={getArray(resultsSetsCount).map((item) => ({
123115
id: String(item),
124-
title: `Result #${item + 1}`,
116+
title: `Result #${item + 1}${data?.resultSets?.[item]?.truncated ? ' (T)' : ''}`,
125117
}))}
126118
activeTab={String(selectedResultSet)}
127119
onSelectTab={(tabId) => setSelectedResultSet(Number(tabId))}
128120
/>
129121
</div>
130122
)}
131123
<div className={b('result')}>
132-
{renderResultTable(currentResult, currentColumns)}
124+
{currentResult?.truncated ? (
125+
<div className={b('result-head')}>
126+
<Text variant="subheader-3">{i18n('truncated')}</Text>
127+
<Text
128+
color="secondary"
129+
variant="body-2"
130+
className={b('row-count')}
131+
>{`(${currentResult?.result?.length})`}</Text>
132+
</div>
133+
) : null}
134+
<QueryResultTable
135+
data={currentResult?.result}
136+
columns={currentResult?.columns}
137+
settings={{sortable: false}}
138+
/>
133139
</div>
134140
</div>
135141
);
@@ -138,7 +144,7 @@ export function ExecuteResult({
138144
const getStatsToCopy = () => {
139145
switch (activeSection) {
140146
case resultOptionsIds.result: {
141-
const textResults = getPreparedResult(currentResult);
147+
const textResults = getPreparedResult(currentResult?.result);
142148
return textResults;
143149
}
144150
case resultOptionsIds.stats:

src/containers/Tenant/Query/ExecuteResult/i18n/en.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
"action.schema": "Schema",
66
"action.explain-plan": "Explain Plan",
77
"action.copy": "Copy {{activeSection}}",
8-
"trace": "Trace"
8+
"trace": "Trace",
9+
"truncated": "Truncated"
910
}

src/types/api/query.ts

+1
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ interface MultiSchemaResult {
285285
result?: {
286286
rows?: ArrayRow[] | null;
287287
columns?: ColumnType[];
288+
truncated?: boolean;
288289
}[];
289290
}
290291
interface DefaultSchemaResult {

src/types/store/query.ts

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import type {ValueOf} from '../common';
2020
export interface ParsedResultSet {
2121
columns?: ColumnType[];
2222
result?: KeyValueRow[];
23+
truncated?: boolean;
2324
}
2425

2526
export interface IQueryResult {
@@ -30,6 +31,7 @@ export interface IQueryResult {
3031
plan?: ScriptPlan | QueryPlan;
3132
ast?: string;
3233
traceId?: string;
34+
truncated?: boolean;
3335
}
3436

3537
export interface QueryRequestParams {

src/utils/query.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ const parseExecuteMultiResponse = (data: ExecuteMultiResponse): IQueryResult =>
157157
const {result, ...restData} = data;
158158

159159
const parsedResult = result?.map((resultSet) => {
160-
const {rows, columns} = resultSet;
160+
const {rows, columns, truncated} = resultSet;
161161

162162
let parsedRows: KeyValueRow[] | undefined;
163163

@@ -173,6 +173,7 @@ const parseExecuteMultiResponse = (data: ExecuteMultiResponse): IQueryResult =>
173173
return {
174174
columns: columns,
175175
result: parsedRows,
176+
truncated,
176177
};
177178
});
178179

0 commit comments

Comments
 (0)