Skip to content

Commit 52a8704

Browse files
authored
Improve auto-modeling in-progress state handling (#2687)
1 parent 209822e commit 52a8704

File tree

8 files changed

+68
-17
lines changed

8 files changed

+68
-17
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,7 @@ interface AddModeledMethodsMessage {
512512

513513
interface SetInProgressMethodsMessage {
514514
t: "setInProgressMethods";
515+
packageName: string;
515516
inProgressMethods: string[];
516517
}
517518

extensions/ql-vscode/src/data-extensions-editor/auto-modeler.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export class AutoModeler {
3232
private readonly queryStorageDir: string,
3333
private readonly databaseItem: DatabaseItem,
3434
private readonly setInProgressMethods: (
35+
packageName: string,
3536
inProgressMethods: string[],
3637
) => Promise<void>,
3738
private readonly addModeledMethods: (
@@ -120,6 +121,7 @@ export class AutoModeler {
120121
const candidatesToProcess = allCandidateMethods.slice(start, end);
121122

122123
await this.setInProgressMethods(
124+
packageName,
123125
candidatesToProcess.map((c) => c.signature),
124126
);
125127

@@ -141,7 +143,7 @@ export class AutoModeler {
141143
}
142144
} finally {
143145
// Clear out in progress methods
144-
await this.setInProgressMethods([]);
146+
await this.setInProgressMethods(packageName, []);
145147
}
146148
});
147149
}

extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,10 @@ export class DataExtensionsEditorView extends AbstractWebview<
8383
queryRunner,
8484
queryStorageDir,
8585
databaseItem,
86-
async (inProgressMethods) => {
86+
async (packageName, inProgressMethods) => {
8787
await this.postMessage({
8888
t: "setInProgressMethods",
89+
packageName,
8990
inProgressMethods,
9091
});
9192
},
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* A class that keeps track of which methods are in progress for each package.
3+
*/
4+
export class InProgressMethods {
5+
// A map of in-progress method signatures for each package.
6+
private readonly methodMap: Map<string, Set<string>>;
7+
8+
constructor() {
9+
this.methodMap = new Map<string, Set<string>>();
10+
}
11+
12+
public setPackageMethods(packageName: string, methods: Set<string>): void {
13+
this.methodMap.set(packageName, methods);
14+
}
15+
16+
public hasMethod(packageName: string, method: string): boolean {
17+
const methods = this.methodMap.get(packageName);
18+
if (methods) {
19+
return methods.has(method);
20+
}
21+
return false;
22+
}
23+
24+
public static fromExisting(methods: InProgressMethods): InProgressMethods {
25+
const newInProgressMethods = new InProgressMethods();
26+
methods.methodMap.forEach((value, key) => {
27+
newInProgressMethods.methodMap.set(key, new Set<string>(value));
28+
});
29+
return newInProgressMethods;
30+
}
31+
}

extensions/ql-vscode/src/view/data-extensions-editor/DataExtensionsEditor.tsx

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { DataExtensionEditorViewState } from "../../data-extensions-editor/share
1717
import { ModeledMethodsList } from "./ModeledMethodsList";
1818
import { percentFormatter } from "./formatters";
1919
import { Mode } from "../../data-extensions-editor/shared/mode";
20+
import { InProgressMethods } from "../../data-extensions-editor/shared/in-progress-methods";
2021
import { getLanguageDisplayName } from "../../common/query-language";
2122

2223
const LoadingContainer = styled.div`
@@ -91,8 +92,8 @@ export function DataExtensionsEditor({
9192
new Set(),
9293
);
9394

94-
const [inProgressSignatures, setInProgressSignatures] = useState<Set<string>>(
95-
new Set(),
95+
const [inProgressMethods, setInProgressMethods] = useState<InProgressMethods>(
96+
new InProgressMethods(),
9697
);
9798

9899
const [hideModeledApis, setHideModeledApis] = useState(true);
@@ -140,7 +141,15 @@ export function DataExtensionsEditor({
140141
);
141142
break;
142143
case "setInProgressMethods":
143-
setInProgressSignatures(new Set(msg.inProgressMethods));
144+
setInProgressMethods((oldInProgressMethods) => {
145+
const methods =
146+
InProgressMethods.fromExisting(oldInProgressMethods);
147+
methods.setPackageMethods(
148+
msg.packageName,
149+
new Set(msg.inProgressMethods),
150+
);
151+
return methods;
152+
});
144153
break;
145154
default:
146155
assertNever(msg);
@@ -346,7 +355,7 @@ export function DataExtensionsEditor({
346355
externalApiUsages={externalApiUsages}
347356
modeledMethods={modeledMethods}
348357
modifiedSignatures={modifiedSignatures}
349-
inProgressSignatures={inProgressSignatures}
358+
inProgressMethods={inProgressMethods}
350359
viewState={viewState}
351360
hideModeledApis={hideModeledApis}
352361
onChange={onChange}

extensions/ql-vscode/src/view/data-extensions-editor/LibraryRow.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
VSCodeTag,
1515
} from "@vscode/webview-ui-toolkit/react";
1616
import { DataExtensionEditorViewState } from "../../data-extensions-editor/shared/view-state";
17+
import { InProgressMethods } from "../../data-extensions-editor/shared/in-progress-methods";
1718

1819
const LibraryContainer = styled.div`
1920
background-color: var(--vscode-peekViewResult-background);
@@ -72,7 +73,7 @@ type Props = {
7273
externalApiUsages: ExternalApiUsage[];
7374
modeledMethods: Record<string, ModeledMethod>;
7475
modifiedSignatures: Set<string>;
75-
inProgressSignatures: Set<string>;
76+
inProgressMethods: InProgressMethods;
7677
viewState: DataExtensionEditorViewState;
7778
hideModeledApis: boolean;
7879
onChange: (
@@ -100,7 +101,7 @@ export const LibraryRow = ({
100101
externalApiUsages,
101102
modeledMethods,
102103
modifiedSignatures,
103-
inProgressSignatures,
104+
inProgressMethods,
104105
viewState,
105106
hideModeledApis,
106107
onChange,
@@ -180,9 +181,9 @@ export const LibraryRow = ({
180181

181182
const canStopAutoModeling = useMemo(() => {
182183
return externalApiUsages.some((externalApiUsage) =>
183-
inProgressSignatures.has(externalApiUsage.signature),
184+
inProgressMethods.hasMethod(title, externalApiUsage.signature),
184185
);
185-
}, [externalApiUsages, inProgressSignatures]);
186+
}, [externalApiUsages, title, inProgressMethods]);
186187

187188
return (
188189
<LibraryContainer>
@@ -232,10 +233,11 @@ export const LibraryRow = ({
232233
<>
233234
<SectionDivider />
234235
<ModeledMethodDataGrid
236+
packageName={title}
235237
externalApiUsages={externalApiUsages}
236238
modeledMethods={modeledMethods}
237239
modifiedSignatures={modifiedSignatures}
238-
inProgressSignatures={inProgressSignatures}
240+
inProgressMethods={inProgressMethods}
239241
mode={viewState.mode}
240242
hideModeledApis={hideModeledApis}
241243
onChange={onChangeWithModelName}

extensions/ql-vscode/src/view/data-extensions-editor/ModeledMethodDataGrid.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ import { ModeledMethod } from "../../data-extensions-editor/modeled-method";
1010
import { useMemo } from "react";
1111
import { Mode } from "../../data-extensions-editor/shared/mode";
1212
import { sortMethods } from "../../data-extensions-editor/shared/sorting";
13+
import { InProgressMethods } from "../../data-extensions-editor/shared/in-progress-methods";
1314

1415
type Props = {
16+
packageName: string;
1517
externalApiUsages: ExternalApiUsage[];
1618
modeledMethods: Record<string, ModeledMethod>;
1719
modifiedSignatures: Set<string>;
18-
inProgressSignatures: Set<string>;
20+
inProgressMethods: InProgressMethods;
1921
mode: Mode;
2022
hideModeledApis: boolean;
2123
onChange: (
@@ -25,10 +27,11 @@ type Props = {
2527
};
2628

2729
export const ModeledMethodDataGrid = ({
30+
packageName,
2831
externalApiUsages,
2932
modeledMethods,
3033
modifiedSignatures,
31-
inProgressSignatures,
34+
inProgressMethods,
3235
mode,
3336
hideModeledApis,
3437
onChange,
@@ -63,7 +66,8 @@ export const ModeledMethodDataGrid = ({
6366
externalApiUsage={externalApiUsage}
6467
modeledMethod={modeledMethods[externalApiUsage.signature]}
6568
methodIsUnsaved={modifiedSignatures.has(externalApiUsage.signature)}
66-
modelingInProgress={inProgressSignatures.has(
69+
modelingInProgress={inProgressMethods.hasMethod(
70+
packageName,
6771
externalApiUsage.signature,
6872
)}
6973
mode={mode}

extensions/ql-vscode/src/view/data-extensions-editor/ModeledMethodsList.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@ import {
99
sortGroupNames,
1010
} from "../../data-extensions-editor/shared/sorting";
1111
import { DataExtensionEditorViewState } from "../../data-extensions-editor/shared/view-state";
12+
import { InProgressMethods } from "../../data-extensions-editor/shared/in-progress-methods";
1213

1314
type Props = {
1415
externalApiUsages: ExternalApiUsage[];
1516
modeledMethods: Record<string, ModeledMethod>;
1617
modifiedSignatures: Set<string>;
17-
inProgressSignatures: Set<string>;
18+
inProgressMethods: InProgressMethods;
1819
viewState: DataExtensionEditorViewState;
1920
hideModeledApis: boolean;
2021
onChange: (
@@ -44,7 +45,7 @@ export const ModeledMethodsList = ({
4445
externalApiUsages,
4546
modeledMethods,
4647
modifiedSignatures,
47-
inProgressSignatures,
48+
inProgressMethods,
4849
viewState,
4950
hideModeledApis,
5051
onChange,
@@ -89,7 +90,7 @@ export const ModeledMethodsList = ({
8990
externalApiUsages={grouped[libraryName]}
9091
modeledMethods={modeledMethods}
9192
modifiedSignatures={modifiedSignatures}
92-
inProgressSignatures={inProgressSignatures}
93+
inProgressMethods={inProgressMethods}
9394
viewState={viewState}
9495
hideModeledApis={hideModeledApis}
9596
onChange={onChange}

0 commit comments

Comments
 (0)