Skip to content

Commit b9279dc

Browse files
authored
Simplify modeling in progress state (#2980)
1 parent 688b986 commit b9279dc

File tree

14 files changed

+68
-100
lines changed

14 files changed

+68
-100
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import {
2525
} from "../model-editor/shared/view-state";
2626
import { Mode } from "../model-editor/shared/mode";
2727
import { QueryLanguage } from "./query-language";
28-
import { InProgressMethods } from "../model-editor/shared/in-progress-methods";
2928

3029
/**
3130
* This module contains types and code that are shared between
@@ -518,7 +517,7 @@ interface SetModifiedMethodsMessage {
518517

519518
interface SetInProgressMethodsMessage {
520519
t: "setInProgressMethods";
521-
methods: InProgressMethods;
520+
methods: string[];
522521
}
523522

524523
interface SwitchModeMessage {

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,14 @@ export class AutoModeler {
133133
const start = i * candidateBatchSize;
134134
const end = start + candidateBatchSize;
135135
const candidatesToProcess = allCandidateMethods.slice(start, end);
136+
const candidateSignatures = candidatesToProcess.map(
137+
(c) => c.signature,
138+
);
136139

137140
// Let the UI know which candidates we are modeling
138-
this.modelingStore.setInProgressMethods(
141+
this.modelingStore.addInProgressMethods(
139142
this.databaseItem,
140-
packageName,
141-
candidatesToProcess.map((c) => c.signature),
143+
candidateSignatures,
142144
);
143145

144146
// Kick off the process to model the slice of candidates
@@ -148,13 +150,18 @@ export class AutoModeler {
148150
progress,
149151
cancellationTokenSource,
150152
);
153+
154+
// Let the UI know which candidates we are done modeling
155+
this.modelingStore.removeInProgressMethods(
156+
this.databaseItem,
157+
candidateSignatures,
158+
);
151159
}
152160
} finally {
153-
// Clear out in progress methods
154-
this.modelingStore.setInProgressMethods(
161+
// Clear out in progress methods in case anything went wrong
162+
this.modelingStore.removeInProgressMethods(
155163
this.databaseItem,
156-
packageName,
157-
[],
164+
allCandidateMethods.map((c) => c.signature),
158165
);
159166
}
160167
});

extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import { assertNever } from "../../common/helpers-pure";
1414
import { ModelEditorViewTracker } from "../model-editor-view-tracker";
1515
import { ModelConfigListener } from "../../config";
1616
import { DatabaseItem } from "../../databases/local-databases";
17-
import { hasInProgressMethodSignature } from "../shared/in-progress-methods";
1817

1918
export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
2019
ToMethodModelingMessage,
@@ -225,10 +224,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
225224
if (this.method && this.databaseItem) {
226225
const dbUri = this.databaseItem.databaseUri.toString();
227226
if (e.dbUri === dbUri) {
228-
const inProgress = hasInProgressMethodSignature(
229-
e.methods,
230-
this.method.signature,
231-
);
227+
const inProgress = e.methods.has(this.method.signature);
232228
await this.postMessage({
233229
t: "setInProgress",
234230
inProgress,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,7 @@ export class ModelEditorView extends AbstractWebview<
693693
if (event.dbUri === this.databaseItem.databaseUri.toString()) {
694694
await this.postMessage({
695695
t: "setInProgressMethods",
696-
methods: event.methods,
696+
methods: Array.from(event.methods),
697697
});
698698
}
699699
}),

extensions/ql-vscode/src/model-editor/modeling-store.ts

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@ import { DatabaseItem } from "../databases/local-databases";
55
import { Method, Usage } from "./method";
66
import { ModeledMethod } from "./modeled-method";
77
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "./shared/hide-modeled-methods";
8-
import {
9-
InProgressMethods,
10-
hasInProgressMethodSignature,
11-
} from "./shared/in-progress-methods";
128
import { INITIAL_MODE, Mode } from "./shared/mode";
139

1410
interface InternalDbModelingState {
@@ -18,7 +14,7 @@ interface InternalDbModelingState {
1814
mode: Mode;
1915
modeledMethods: Record<string, ModeledMethod[]>;
2016
modifiedMethodSignatures: Set<string>;
21-
inProgressMethods: InProgressMethods;
17+
inProgressMethods: Set<string>;
2218
selectedMethod: Method | undefined;
2319
selectedUsage: Usage | undefined;
2420
}
@@ -30,6 +26,7 @@ interface DbModelingState {
3026
readonly mode: Mode;
3127
readonly modeledMethods: Readonly<Record<string, readonly ModeledMethod[]>>;
3228
readonly modifiedMethodSignatures: ReadonlySet<string>;
29+
readonly inProgressMethods: ReadonlySet<string>;
3330
readonly selectedMethod: Method | undefined;
3431
readonly selectedUsage: Usage | undefined;
3532
}
@@ -82,7 +79,7 @@ interface SelectedMethodChangedEvent {
8279

8380
interface InProgressMethodsChangedEvent {
8481
readonly dbUri: string;
85-
readonly methods: InProgressMethods;
82+
readonly methods: ReadonlySet<string>;
8683
}
8784

8885
export class ModelingStore extends DisposableObject {
@@ -184,7 +181,7 @@ export class ModelingStore extends DisposableObject {
184181
modifiedMethodSignatures: new Set(),
185182
selectedMethod: undefined,
186183
selectedUsage: undefined,
187-
inProgressMethods: {},
184+
inProgressMethods: new Set(),
188185
});
189186

190187
this.onDbOpenedEventEmitter.fire(dbUri);
@@ -425,28 +422,32 @@ export class ModelingStore extends DisposableObject {
425422
usage,
426423
modeledMethods: dbState.modeledMethods[method.signature] ?? [],
427424
isModified: dbState.modifiedMethodSignatures.has(method.signature),
428-
isInProgress: hasInProgressMethodSignature(
429-
dbState.inProgressMethods,
430-
method.signature,
431-
),
425+
isInProgress: dbState.inProgressMethods.has(method.signature),
432426
});
433427
}
434428

435-
public setInProgressMethods(
429+
public addInProgressMethods(
436430
dbItem: DatabaseItem,
437-
packageName: string,
438431
inProgressMethods: string[],
439432
) {
440-
const dbState = this.getState(dbItem);
441-
442-
dbState.inProgressMethods = {
443-
...dbState.inProgressMethods,
444-
[packageName]: inProgressMethods,
445-
};
433+
this.changeInProgressMethods(dbItem, (state) => {
434+
state.inProgressMethods = new Set([
435+
...state.inProgressMethods,
436+
...inProgressMethods,
437+
]);
438+
});
439+
}
446440

447-
this.onInProgressMethodsChangedEventEmitter.fire({
448-
dbUri: dbItem.databaseUri.toString(),
449-
methods: dbState.inProgressMethods,
441+
public removeInProgressMethods(
442+
dbItem: DatabaseItem,
443+
methodSignatures: string[],
444+
) {
445+
this.changeInProgressMethods(dbItem, (state) => {
446+
state.inProgressMethods = new Set(
447+
Array.from(state.inProgressMethods).filter(
448+
(s) => !methodSignatures.includes(s),
449+
),
450+
);
450451
});
451452
}
452453

@@ -469,10 +470,7 @@ export class ModelingStore extends DisposableObject {
469470
isModified: dbState.modifiedMethodSignatures.has(
470471
selectedMethod.signature,
471472
),
472-
isInProgress: hasInProgressMethodSignature(
473-
dbState.inProgressMethods,
474-
selectedMethod.signature,
475-
),
473+
isInProgress: dbState.inProgressMethods.has(selectedMethod.signature),
476474
};
477475
}
478476

@@ -515,4 +513,18 @@ export class ModelingStore extends DisposableObject {
515513
isActiveDb: dbItem.databaseUri.toString() === this.activeDb,
516514
});
517515
}
516+
517+
private changeInProgressMethods(
518+
dbItem: DatabaseItem,
519+
updateState: (state: InternalDbModelingState) => void,
520+
) {
521+
const state = this.getState(dbItem);
522+
523+
updateState(state);
524+
525+
this.onInProgressMethodsChangedEventEmitter.fire({
526+
dbUri: dbItem.databaseUri.toString(),
527+
methods: state.inProgressMethods,
528+
});
529+
}
518530
}

extensions/ql-vscode/src/model-editor/shared/in-progress-methods.ts

Lines changed: 0 additions & 30 deletions
This file was deleted.

extensions/ql-vscode/src/stories/model-editor/LibraryRow.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ LibraryRow.args = {
218218
],
219219
},
220220
modifiedSignatures: new Set(["org.sql2o.Sql2o#Sql2o(String)"]),
221-
inProgressMethods: {},
221+
inProgressMethods: new Set(),
222222
viewState: {
223223
extensionPack: createMockExtensionPack(),
224224
showFlowGeneration: true,

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

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@ import {
1414
VSCodeTag,
1515
} from "@vscode/webview-ui-toolkit/react";
1616
import { ModelEditorViewState } from "../../model-editor/shared/view-state";
17-
import {
18-
InProgressMethods,
19-
hasInProgressMethod,
20-
} from "../../model-editor/shared/in-progress-methods";
2117

2218
const LibraryContainer = styled.div`
2319
background-color: var(--vscode-peekViewResult-background);
@@ -76,7 +72,7 @@ export type LibraryRowProps = {
7672
methods: Method[];
7773
modeledMethodsMap: Record<string, ModeledMethod[]>;
7874
modifiedSignatures: Set<string>;
79-
inProgressMethods: InProgressMethods;
75+
inProgressMethods: Set<string>;
8076
viewState: ModelEditorViewState;
8177
hideModeledMethods: boolean;
8278
revealedMethodSignature: string | null;
@@ -179,10 +175,8 @@ export const LibraryRow = ({
179175
}, [methods, modifiedSignatures]);
180176

181177
const canStopAutoModeling = useMemo(() => {
182-
return methods.some((method) =>
183-
hasInProgressMethod(inProgressMethods, title, method.signature),
184-
);
185-
}, [methods, title, inProgressMethods]);
178+
return methods.some((method) => inProgressMethods.has(method.signature));
179+
}, [methods, inProgressMethods]);
186180

187181
return (
188182
<LibraryContainer>

extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import { ModelEditorViewState } from "../../model-editor/shared/view-state";
1717
import { ModeledMethodsList } from "./ModeledMethodsList";
1818
import { percentFormatter } from "./formatters";
1919
import { Mode } from "../../model-editor/shared/mode";
20-
import { InProgressMethods } from "../../model-editor/shared/in-progress-methods";
2120
import { getLanguageDisplayName } from "../../common/query-language";
2221
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "../../model-editor/shared/hide-modeled-methods";
2322

@@ -93,8 +92,8 @@ export function ModelEditor({
9392
new Set(),
9493
);
9594

96-
const [inProgressMethods, setInProgressMethods] = useState<InProgressMethods>(
97-
{},
95+
const [inProgressMethods, setInProgressMethods] = useState<Set<string>>(
96+
new Set(),
9897
);
9998

10099
const [hideModeledMethods, setHideModeledMethods] = useState(
@@ -134,7 +133,7 @@ export function ModelEditor({
134133
setModifiedSignatures(new Set(msg.methodSignatures));
135134
break;
136135
case "setInProgressMethods": {
137-
setInProgressMethods(msg.methods);
136+
setInProgressMethods(new Set(msg.methods));
138137
break;
139138
}
140139
case "revealMethod":

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@ import { Method, canMethodBeModeled } from "../../model-editor/method";
99
import { ModeledMethod } from "../../model-editor/modeled-method";
1010
import { useMemo } from "react";
1111
import { sortMethods } from "../../model-editor/shared/sorting";
12-
import {
13-
InProgressMethods,
14-
hasInProgressMethod,
15-
} from "../../model-editor/shared/in-progress-methods";
1612
import { HiddenMethodsRow } from "./HiddenMethodsRow";
1713
import { ModelEditorViewState } from "../../model-editor/shared/view-state";
1814
import { ScreenReaderOnly } from "../common/ScreenReaderOnly";
@@ -27,7 +23,7 @@ export type ModeledMethodDataGridProps = {
2723
methods: Method[];
2824
modeledMethodsMap: Record<string, ModeledMethod[]>;
2925
modifiedSignatures: Set<string>;
30-
inProgressMethods: InProgressMethods;
26+
inProgressMethods: Set<string>;
3127
viewState: ModelEditorViewState;
3228
hideModeledMethods: boolean;
3329
revealedMethodSignature: string | null;
@@ -110,11 +106,7 @@ export const ModeledMethodDataGrid = ({
110106
methodCanBeModeled={methodCanBeModeled}
111107
modeledMethods={modeledMethods}
112108
methodIsUnsaved={modifiedSignatures.has(method.signature)}
113-
modelingInProgress={hasInProgressMethod(
114-
inProgressMethods,
115-
packageName,
116-
method.signature,
117-
)}
109+
modelingInProgress={inProgressMethods.has(method.signature)}
118110
viewState={viewState}
119111
revealedMethodSignature={revealedMethodSignature}
120112
onChange={onChange}

0 commit comments

Comments
 (0)