Skip to content

Commit 3a5ac58

Browse files
committed
fix: add plan and schema
1 parent 4be176a commit 3a5ac58

File tree

6 files changed

+95
-69
lines changed

6 files changed

+95
-69
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ export function QueryResultViewer({
107107
});
108108
const [useShowPlanToSvg] = useSetting<boolean>(USE_SHOW_PLAN_SVG_KEY);
109109

110-
const {error, isLoading, queryId, data = {}, streaming} = result;
110+
const {error, isLoading, queryId, data = {}, isStreaming} = result;
111111
const {preparedPlan, simplifiedPlan, stats, resultSets, ast} = data;
112112

113113
React.useEffect(() => {
@@ -321,7 +321,7 @@ export function QueryResultViewer({
321321
{renderRightControls()}
322322
</div>
323323
{isLoading || isQueryCancelledError(error) ? null : <QuerySettingsBanner />}
324-
<LoaderWrapper loading={isLoading && !streaming}>
324+
<LoaderWrapper loading={isLoading && !isStreaming}>
325325
<Fullscreen className={b('result')}>{renderResultSection()}</Fullscreen>
326326
</LoaderWrapper>
327327
</React.Fragment>
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import type {ExplainPlanNodeData, GraphNode, Link} from '@gravity-ui/paranoid';
2+
3+
import type {QueryPlan, ScriptPlan, TKqpStatsQuery} from '../../../types/api/query';
4+
import {preparePlan, prepareSimplifiedPlan} from '../../../utils/prepareQueryExplain';
5+
import {parseQueryExplainPlan} from '../../../utils/query';
6+
7+
import type {PreparedQueryData} from './types';
8+
9+
const explainVersions = {
10+
v2: '0.2',
11+
};
12+
13+
const supportedExplainQueryVersions = Object.values(explainVersions);
14+
15+
export function preparePlanData(
16+
rawPlan?: QueryPlan | ScriptPlan,
17+
stats?: TKqpStatsQuery,
18+
): PreparedQueryData['preparedPlan'] & {
19+
simplifiedPlan?: PreparedQueryData['simplifiedPlan'];
20+
} {
21+
// Handle plan from explain
22+
if (rawPlan) {
23+
const {tables, meta, Plan, SimplifiedPlan} = parseQueryExplainPlan(rawPlan);
24+
25+
if (supportedExplainQueryVersions.indexOf(meta.version) === -1) {
26+
// Do not prepare plan for not supported versions
27+
return {
28+
pristine: rawPlan,
29+
version: meta.version,
30+
};
31+
}
32+
33+
let links: Link[] = [];
34+
let nodes: GraphNode<ExplainPlanNodeData>[] = [];
35+
36+
if (Plan) {
37+
const preparedPlan = preparePlan(Plan);
38+
links = preparedPlan.links;
39+
nodes = preparedPlan.nodes;
40+
}
41+
42+
let preparedSimplifiedPlan;
43+
if (SimplifiedPlan) {
44+
preparedSimplifiedPlan = prepareSimplifiedPlan([SimplifiedPlan]);
45+
}
46+
47+
return {
48+
links,
49+
nodes,
50+
tables,
51+
version: meta.version,
52+
pristine: rawPlan,
53+
simplifiedPlan: SimplifiedPlan
54+
? {
55+
plan: preparedSimplifiedPlan,
56+
pristine: SimplifiedPlan,
57+
}
58+
: undefined,
59+
};
60+
}
61+
62+
// Handle plan from stats
63+
const planFromStats = stats?.Executions?.[0]?.TxPlansWithStats?.[0];
64+
if (planFromStats) {
65+
try {
66+
const planWithStats = JSON.parse(planFromStats);
67+
return {...preparePlan(planWithStats), pristine: planWithStats};
68+
} catch {
69+
return {};
70+
}
71+
}
72+
73+
return {};
74+
}
Lines changed: 8 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,19 @@
1-
import type {ExplainPlanNodeData, GraphNode, Link} from '@gravity-ui/paranoid';
2-
31
import type {ExecuteResponse, ExplainResponse} from '../../../types/api/query';
4-
import {preparePlan, prepareSimplifiedPlan} from '../../../utils/prepareQueryExplain';
5-
import {parseQueryAPIResponse, parseQueryExplainPlan} from '../../../utils/query';
2+
import {parseQueryAPIResponse} from '../../../utils/query';
63

4+
import {preparePlanData} from './preparePlanData';
75
import type {PreparedQueryData} from './types';
86

9-
const explainVersions = {
10-
v2: '0.2',
11-
};
12-
13-
const supportedExplainQueryVersions = Object.values(explainVersions);
14-
157
export function prepareQueryData(
168
response: ExplainResponse | ExecuteResponse | null,
179
): PreparedQueryData {
1810
const result = parseQueryAPIResponse(response);
1911
const {plan: rawPlan, stats} = result;
2012

21-
if (rawPlan) {
22-
const {tables, meta, Plan, SimplifiedPlan} = parseQueryExplainPlan(rawPlan);
23-
24-
if (supportedExplainQueryVersions.indexOf(meta.version) === -1) {
25-
// Do not prepare plan for not supported versions
26-
return {
27-
...result,
28-
preparedPlan: {
29-
pristine: rawPlan,
30-
version: meta.version,
31-
},
32-
};
33-
}
34-
35-
let links: Link[] = [];
36-
let nodes: GraphNode<ExplainPlanNodeData>[] = [];
37-
38-
if (Plan) {
39-
const preparedPlan = preparePlan(Plan);
40-
links = preparedPlan.links;
41-
nodes = preparedPlan.nodes;
42-
}
43-
let preparedSimplifiedPlan;
44-
if (SimplifiedPlan) {
45-
preparedSimplifiedPlan = prepareSimplifiedPlan([SimplifiedPlan]);
46-
}
47-
48-
return {
49-
...result,
50-
preparedPlan: {
51-
links,
52-
nodes,
53-
tables,
54-
version: meta.version,
55-
pristine: rawPlan,
56-
},
57-
simplifiedPlan: {plan: preparedSimplifiedPlan, pristine: SimplifiedPlan},
58-
};
59-
}
60-
61-
const planFromStats = stats?.Executions?.[0]?.TxPlansWithStats?.[0];
62-
if (planFromStats) {
63-
try {
64-
const planWithStats = JSON.parse(planFromStats);
65-
return {
66-
...result,
67-
preparedPlan: {...preparePlan(planWithStats), pristine: planWithStats},
68-
};
69-
} catch {}
70-
}
71-
72-
return result;
13+
const {simplifiedPlan, ...planData} = preparePlanData(rawPlan, stats);
14+
return {
15+
...result,
16+
preparedPlan: Object.keys(planData).length > 0 ? planData : undefined,
17+
simplifiedPlan,
18+
};
7319
}

src/store/reducers/query/query.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {isQueryErrorResponse, parseResult} from '../../../utils/query';
1010
import {isNumeric} from '../../../utils/utils';
1111
import {api} from '../api';
1212

13+
import {preparePlanData} from './preparePlanData';
1314
import {prepareQueryData} from './prepareQueryData';
1415
import type {QueryResult, QueryState} from './types';
1516
import {
@@ -131,14 +132,14 @@ const slice = createSlice({
131132
},
132133
setStreamingState: (state, action: PayloadAction<boolean>) => {
133134
if (state.result) {
134-
state.result.streaming = action.payload;
135+
state.result.isStreaming = action.payload;
135136
if (action.payload) {
136137
state.result.data = prepareQueryData(null);
137138
}
138139
}
139140
},
140141
addStreamingChunk: (state, action: PayloadAction<StreamingChunk>) => {
141-
if (!state.result?.streaming || !state.result.data) {
142+
if (!state.result?.isStreaming || !state.result.data) {
142143
return;
143144
}
144145

@@ -172,9 +173,15 @@ const slice = createSlice({
172173
}
173174
}
174175
} else if (isQueryResponseChunk(chunk)) {
175-
state.result.streaming = false;
176+
state.result.isStreaming = false;
176177
state.result.isLoading = false;
178+
177179
if (state.result.data) {
180+
const {plan: rawPlan, stats} = chunk;
181+
const {simplifiedPlan, ...planData} = preparePlanData(rawPlan, stats);
182+
state.result.data.preparedPlan =
183+
Object.keys(planData).length > 0 ? planData : undefined;
184+
state.result.data.simplifiedPlan = simplifiedPlan;
178185
state.result.data.plan = chunk.plan;
179186
state.result.data.stats = chunk.stats;
180187
}

src/store/reducers/query/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export interface QueryResult {
5555
isTraceReady?: true;
5656
queryId: string;
5757
isLoading: boolean;
58-
streaming?: boolean;
58+
isStreaming?: boolean;
5959
}
6060

6161
export interface QueryState {

src/types/store/query.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ export interface IQueryResult {
3434
ast?: string;
3535
traceId?: string;
3636
truncated?: boolean;
37-
streaming?: boolean;
3837
}
3938

4039
export interface QueryRequestParams {

0 commit comments

Comments
 (0)