Skip to content

Commit 789719a

Browse files
authored
Merge pull request #3115 from github/koesie10/compare-messages
Split compare view messages
2 parents 7b6b303 + 8d71162 commit 789719a

File tree

6 files changed

+112
-62
lines changed

6 files changed

+112
-62
lines changed

extensions/ql-vscode/src/common/interface-types.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -334,13 +334,15 @@ interface ChangeCompareMessage {
334334
newResultSetName: string;
335335
}
336336

337-
export type ToCompareViewMessage = SetComparisonsMessage;
337+
export type ToCompareViewMessage =
338+
| SetComparisonQueryInfoMessage
339+
| SetComparisonsMessage;
338340

339341
/**
340-
* Message to the compare view that specifies the query results to compare.
342+
* Message to the compare view that sets the metadata of the compared queries.
341343
*/
342-
export interface SetComparisonsMessage {
343-
readonly t: "setComparisons";
344+
export interface SetComparisonQueryInfoMessage {
345+
readonly t: "setComparisonQueryInfo";
344346
readonly stats: {
345347
fromQuery?: {
346348
name: string;
@@ -353,11 +355,18 @@ export interface SetComparisonsMessage {
353355
time: string;
354356
};
355357
};
358+
readonly databaseUri: string;
356359
readonly commonResultSetNames: string[];
360+
}
361+
362+
/**
363+
* Message to the compare view that specifies the query results to compare.
364+
*/
365+
export interface SetComparisonsMessage {
366+
readonly t: "setComparisons";
357367
readonly currentResultSetName: string;
358368
readonly result: QueryCompareResult | undefined;
359369
readonly message: string | undefined;
360-
readonly databaseUri: string;
361370
}
362371

363372
type QueryCompareResult = RawQueryCompareResult | InterpretedQueryCompareResult;

extensions/ql-vscode/src/compare/compare-view.ts

Lines changed: 50 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,18 @@ import {
2222
import { telemetryListener } from "../common/vscode/telemetry";
2323
import { redactableError } from "../common/errors";
2424
import { App } from "../common/app";
25-
import { findResultSetNames } from "./result-set-names";
25+
import {
26+
findCommonResultSetNames,
27+
findResultSetNames,
28+
} from "./result-set-names";
2629

2730
interface ComparePair {
2831
from: CompletedLocalQueryInfo;
2932
fromSchemas: BQRSInfo;
3033
to: CompletedLocalQueryInfo;
3134
toSchemas: BQRSInfo;
35+
36+
commonResultSetNames: readonly string[];
3237
}
3338

3439
export class CompareView extends AbstractWebview<
@@ -62,13 +67,44 @@ export class CompareView extends AbstractWebview<
6267
to.completedQuery.query.resultsPaths.resultsPath,
6368
);
6469

70+
const commonResultSetNames = await findCommonResultSetNames(
71+
fromSchemas,
72+
toSchemas,
73+
);
74+
6575
this.comparePair = {
6676
from,
6777
fromSchemas,
6878
to,
6979
toSchemas,
80+
commonResultSetNames,
7081
};
7182

83+
const panel = await this.getPanel();
84+
panel.reveal(undefined, true);
85+
await this.waitForPanelLoaded();
86+
87+
await this.postMessage({
88+
t: "setComparisonQueryInfo",
89+
stats: {
90+
fromQuery: {
91+
// since we split the description into several rows
92+
// only run interpolation if the label is user-defined
93+
// otherwise we will wind up with duplicated rows
94+
name: this.labelProvider.getShortLabel(from),
95+
status: from.completedQuery.statusString,
96+
time: from.startTime,
97+
},
98+
toQuery: {
99+
name: this.labelProvider.getShortLabel(to),
100+
status: to.completedQuery.statusString,
101+
time: to.startTime,
102+
},
103+
},
104+
databaseUri: to.initialInfo.databaseInfo.databaseUri,
105+
commonResultSetNames,
106+
});
107+
72108
await this.showResultsInternal(selectedResultSetName);
73109
}
74110

@@ -77,21 +113,15 @@ export class CompareView extends AbstractWebview<
77113
return;
78114
}
79115

80-
const { from, to } = this.comparePair;
81-
82116
const panel = await this.getPanel();
83117
panel.reveal(undefined, true);
84118

85119
await this.waitForPanelLoaded();
86-
const {
87-
commonResultSetNames,
88-
currentResultSetDisplayName,
89-
fromResultSet,
90-
toResultSet,
91-
} = await this.findResultSetsToCompare(
92-
this.comparePair,
93-
selectedResultSetName,
94-
);
120+
const { currentResultSetDisplayName, fromResultSet, toResultSet } =
121+
await this.findResultSetsToCompare(
122+
this.comparePair,
123+
selectedResultSetName,
124+
);
95125
if (currentResultSetDisplayName) {
96126
let result: RawQueryCompareResult | undefined;
97127
let message: string | undefined;
@@ -103,26 +133,9 @@ export class CompareView extends AbstractWebview<
103133

104134
await this.postMessage({
105135
t: "setComparisons",
106-
stats: {
107-
fromQuery: {
108-
// since we split the description into several rows
109-
// only run interpolation if the label is user-defined
110-
// otherwise we will wind up with duplicated rows
111-
name: this.labelProvider.getShortLabel(from),
112-
status: from.completedQuery.statusString,
113-
time: from.startTime,
114-
},
115-
toQuery: {
116-
name: this.labelProvider.getShortLabel(to),
117-
status: to.completedQuery.statusString,
118-
time: to.startTime,
119-
},
120-
},
121136
result,
122-
commonResultSetNames,
123137
currentResultSetName: currentResultSetDisplayName,
124138
message,
125-
databaseUri: to.initialInfo.databaseInfo.databaseUri,
126139
});
127140
}
128141
}
@@ -190,15 +203,16 @@ export class CompareView extends AbstractWebview<
190203
}
191204

192205
private async findResultSetsToCompare(
193-
{ from, fromSchemas, to, toSchemas }: ComparePair,
206+
{ from, fromSchemas, to, toSchemas, commonResultSetNames }: ComparePair,
194207
selectedResultSetName: string | undefined,
195208
) {
196-
const {
197-
commonResultSetNames,
198-
currentResultSetDisplayName,
199-
fromResultSetName,
200-
toResultSetName,
201-
} = await findResultSetNames(fromSchemas, toSchemas, selectedResultSetName);
209+
const { currentResultSetDisplayName, fromResultSetName, toResultSetName } =
210+
await findResultSetNames(
211+
fromSchemas,
212+
toSchemas,
213+
commonResultSetNames,
214+
selectedResultSetName,
215+
);
202216

203217
const fromResultSet = await this.getResultSet(
204218
fromSchemas,
@@ -211,7 +225,6 @@ export class CompareView extends AbstractWebview<
211225
to.completedQuery.query.resultsPaths.resultsPath,
212226
);
213227
return {
214-
commonResultSetNames,
215228
currentResultSetDisplayName,
216229
fromResultSet,
217230
toResultSet,

extensions/ql-vscode/src/compare/result-set-names.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
11
import { BQRSInfo } from "../common/bqrs-cli-types";
22
import { getDefaultResultSetName } from "../common/interface-types";
33

4+
export async function findCommonResultSetNames(
5+
fromSchemas: BQRSInfo,
6+
toSchemas: BQRSInfo,
7+
): Promise<string[]> {
8+
const fromSchemaNames = fromSchemas["result-sets"].map(
9+
(schema) => schema.name,
10+
);
11+
const toSchemaNames = toSchemas["result-sets"].map((schema) => schema.name);
12+
13+
return fromSchemaNames.filter((name) => toSchemaNames.includes(name));
14+
}
15+
416
export async function findResultSetNames(
517
fromSchemas: BQRSInfo,
618
toSchemas: BQRSInfo,
19+
commonResultSetNames: readonly string[],
720
selectedResultSetName: string | undefined,
821
) {
922
const fromSchemaNames = fromSchemas["result-sets"].map(
1023
(schema) => schema.name,
1124
);
1225
const toSchemaNames = toSchemas["result-sets"].map((schema) => schema.name);
13-
const commonResultSetNames = fromSchemaNames.filter((name) =>
14-
toSchemaNames.includes(name),
15-
);
1626

1727
// Fall back on the default result set names if there are no common ones.
1828
const defaultFromResultSetName = fromSchemaNames.find((name) =>
@@ -37,7 +47,6 @@ export async function findResultSetNames(
3747
const toResultSetName = currentResultSetName || defaultToResultSetName!;
3848

3949
return {
40-
commonResultSetNames,
4150
currentResultSetDisplayName:
4251
currentResultSetName ||
4352
`${defaultFromResultSetName} <-> ${defaultToResultSetName}`,

extensions/ql-vscode/src/stories/compare/CompareTable.stories.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ const Template: StoryFn<typeof CompareTableComponent> = (args) => (
1717

1818
export const CompareTable = Template.bind({});
1919
CompareTable.args = {
20-
comparison: {
21-
t: "setComparisons",
20+
queryInfo: {
21+
t: "setComparisonQueryInfo",
2222
stats: {
2323
fromQuery: {
2424
name: "Query built from user-controlled sources",
@@ -31,7 +31,11 @@ CompareTable.args = {
3131
time: "8/16/2023, 3:07:21 PM",
3232
},
3333
},
34+
databaseUri: "file:///java",
3435
commonResultSetNames: ["edges", "nodes", "subpaths", "#select"],
36+
},
37+
comparison: {
38+
t: "setComparisons",
3539
currentResultSetName: "edges",
3640
result: {
3741
kind: "raw",
@@ -66,6 +70,5 @@ CompareTable.args = {
6670
],
6771
},
6872
message: undefined,
69-
databaseUri: "file:///java",
7073
},
7174
};

extensions/ql-vscode/src/view/compare/Compare.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ import { styled } from "styled-components";
55
import {
66
ToCompareViewMessage,
77
SetComparisonsMessage,
8+
SetComparisonQueryInfoMessage,
89
} from "../../common/interface-types";
910
import CompareSelector from "./CompareSelector";
1011
import { vscode } from "../vscode-api";
1112
import CompareTable from "./CompareTable";
1213

1314
import "../results/resultsView.css";
15+
import { assertNever } from "../../common/helpers-pure";
1416

1517
const Header = styled.div`
1618
display: flex;
@@ -25,6 +27,8 @@ const Message = styled.div`
2527
`;
2628

2729
export function Compare(_: Record<string, never>): JSX.Element {
30+
const [queryInfo, setQueryInfo] =
31+
useState<SetComparisonQueryInfoMessage | null>(null);
2832
const [comparison, setComparison] = useState<SetComparisonsMessage | null>(
2933
null,
3034
);
@@ -39,8 +43,14 @@ export function Compare(_: Record<string, never>): JSX.Element {
3943
if (evt.origin === window.origin) {
4044
const msg: ToCompareViewMessage = evt.data;
4145
switch (msg.t) {
46+
case "setComparisonQueryInfo":
47+
setQueryInfo(msg);
48+
break;
4249
case "setComparisons":
4350
setComparison(msg);
51+
break;
52+
default:
53+
assertNever(msg);
4454
}
4555
} else {
4656
// sanitize origin
@@ -55,7 +65,7 @@ export function Compare(_: Record<string, never>): JSX.Element {
5565
};
5666
}, []);
5767

58-
if (!comparison) {
68+
if (!queryInfo || !comparison) {
5969
return <div>Waiting for results to load.</div>;
6070
}
6171

@@ -65,15 +75,18 @@ export function Compare(_: Record<string, never>): JSX.Element {
6575
<Header>
6676
<HeaderTitle>Comparing:</HeaderTitle>
6777
<CompareSelector
68-
availableResultSets={comparison.commonResultSetNames}
78+
availableResultSets={queryInfo.commonResultSetNames}
6979
currentResultSetName={comparison.currentResultSetName}
7080
updateResultSet={(newResultSetName: string) =>
7181
vscode.postMessage({ t: "changeCompare", newResultSetName })
7282
}
7383
/>
7484
</Header>
7585
{hasRows ? (
76-
<CompareTable comparison={comparison}></CompareTable>
86+
<CompareTable
87+
queryInfo={queryInfo}
88+
comparison={comparison}
89+
></CompareTable>
7790
) : (
7891
<Message>{message}</Message>
7992
)}

0 commit comments

Comments
 (0)