From 83168e00609c5c134763cbb654ea88abee903cf3 Mon Sep 17 00:00:00 2001 From: Charis Kyriakou Date: Mon, 16 Oct 2023 11:11:46 +0000 Subject: [PATCH] Simplify modeling in progress state --- .../ql-vscode/src/common/interface-types.ts | 3 +- .../src/model-editor/auto-modeler.ts | 21 ++++-- .../method-modeling-view-provider.ts | 6 +- .../src/model-editor/model-editor-view.ts | 2 +- .../src/model-editor/modeling-store.ts | 64 +++++++++++-------- .../shared/in-progress-methods.ts | 30 --------- .../model-editor/LibraryRow.stories.tsx | 2 +- .../src/view/model-editor/LibraryRow.tsx | 12 +--- .../src/view/model-editor/ModelEditor.tsx | 7 +- .../model-editor/ModeledMethodDataGrid.tsx | 12 +--- .../view/model-editor/ModeledMethodsList.tsx | 3 +- .../__tests__/LibraryRow.spec.tsx | 2 +- .../__tests__/ModeledMethodDataGrid.spec.tsx | 2 +- .../__tests__/ModeledMethodsList.spec.tsx | 2 +- 14 files changed, 68 insertions(+), 100 deletions(-) delete mode 100644 extensions/ql-vscode/src/model-editor/shared/in-progress-methods.ts diff --git a/extensions/ql-vscode/src/common/interface-types.ts b/extensions/ql-vscode/src/common/interface-types.ts index c4630ec23e4..928df86fbfa 100644 --- a/extensions/ql-vscode/src/common/interface-types.ts +++ b/extensions/ql-vscode/src/common/interface-types.ts @@ -25,7 +25,6 @@ import { } from "../model-editor/shared/view-state"; import { Mode } from "../model-editor/shared/mode"; import { QueryLanguage } from "./query-language"; -import { InProgressMethods } from "../model-editor/shared/in-progress-methods"; /** * This module contains types and code that are shared between @@ -518,7 +517,7 @@ interface SetModifiedMethodsMessage { interface SetInProgressMethodsMessage { t: "setInProgressMethods"; - methods: InProgressMethods; + methods: string[]; } interface SwitchModeMessage { diff --git a/extensions/ql-vscode/src/model-editor/auto-modeler.ts b/extensions/ql-vscode/src/model-editor/auto-modeler.ts index 9c24ca4c67f..45612c07c04 100644 --- a/extensions/ql-vscode/src/model-editor/auto-modeler.ts +++ b/extensions/ql-vscode/src/model-editor/auto-modeler.ts @@ -133,12 +133,14 @@ export class AutoModeler { const start = i * candidateBatchSize; const end = start + candidateBatchSize; const candidatesToProcess = allCandidateMethods.slice(start, end); + const candidateSignatures = candidatesToProcess.map( + (c) => c.signature, + ); // Let the UI know which candidates we are modeling - this.modelingStore.setInProgressMethods( + this.modelingStore.addInProgressMethods( this.databaseItem, - packageName, - candidatesToProcess.map((c) => c.signature), + candidateSignatures, ); // Kick off the process to model the slice of candidates @@ -148,13 +150,18 @@ export class AutoModeler { progress, cancellationTokenSource, ); + + // Let the UI know which candidates we are done modeling + this.modelingStore.removeInProgressMethods( + this.databaseItem, + candidateSignatures, + ); } } finally { - // Clear out in progress methods - this.modelingStore.setInProgressMethods( + // Clear out in progress methods in case anything went wrong + this.modelingStore.removeInProgressMethods( this.databaseItem, - packageName, - [], + allCandidateMethods.map((c) => c.signature), ); } }); diff --git a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts index 7581ba8d62f..3dce3ef9e2e 100644 --- a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts +++ b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts @@ -14,7 +14,6 @@ import { assertNever } from "../../common/helpers-pure"; import { ModelEditorViewTracker } from "../model-editor-view-tracker"; import { ModelConfigListener } from "../../config"; import { DatabaseItem } from "../../databases/local-databases"; -import { hasInProgressMethodSignature } from "../shared/in-progress-methods"; export class MethodModelingViewProvider extends AbstractWebviewViewProvider< ToMethodModelingMessage, @@ -225,10 +224,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider< if (this.method && this.databaseItem) { const dbUri = this.databaseItem.databaseUri.toString(); if (e.dbUri === dbUri) { - const inProgress = hasInProgressMethodSignature( - e.methods, - this.method.signature, - ); + const inProgress = e.methods.has(this.method.signature); await this.postMessage({ t: "setInProgress", inProgress, diff --git a/extensions/ql-vscode/src/model-editor/model-editor-view.ts b/extensions/ql-vscode/src/model-editor/model-editor-view.ts index c81f00b4685..fde566225a2 100644 --- a/extensions/ql-vscode/src/model-editor/model-editor-view.ts +++ b/extensions/ql-vscode/src/model-editor/model-editor-view.ts @@ -693,7 +693,7 @@ export class ModelEditorView extends AbstractWebview< if (event.dbUri === this.databaseItem.databaseUri.toString()) { await this.postMessage({ t: "setInProgressMethods", - methods: event.methods, + methods: Array.from(event.methods), }); } }), diff --git a/extensions/ql-vscode/src/model-editor/modeling-store.ts b/extensions/ql-vscode/src/model-editor/modeling-store.ts index fcecba87a3f..eaed59a43b5 100644 --- a/extensions/ql-vscode/src/model-editor/modeling-store.ts +++ b/extensions/ql-vscode/src/model-editor/modeling-store.ts @@ -5,10 +5,6 @@ import { DatabaseItem } from "../databases/local-databases"; import { Method, Usage } from "./method"; import { ModeledMethod } from "./modeled-method"; import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "./shared/hide-modeled-methods"; -import { - InProgressMethods, - hasInProgressMethodSignature, -} from "./shared/in-progress-methods"; import { INITIAL_MODE, Mode } from "./shared/mode"; interface InternalDbModelingState { @@ -18,7 +14,7 @@ interface InternalDbModelingState { mode: Mode; modeledMethods: Record; modifiedMethodSignatures: Set; - inProgressMethods: InProgressMethods; + inProgressMethods: Set; selectedMethod: Method | undefined; selectedUsage: Usage | undefined; } @@ -30,6 +26,7 @@ interface DbModelingState { readonly mode: Mode; readonly modeledMethods: Readonly>; readonly modifiedMethodSignatures: ReadonlySet; + readonly inProgressMethods: ReadonlySet; readonly selectedMethod: Method | undefined; readonly selectedUsage: Usage | undefined; } @@ -82,7 +79,7 @@ interface SelectedMethodChangedEvent { interface InProgressMethodsChangedEvent { readonly dbUri: string; - readonly methods: InProgressMethods; + readonly methods: ReadonlySet; } export class ModelingStore extends DisposableObject { @@ -184,7 +181,7 @@ export class ModelingStore extends DisposableObject { modifiedMethodSignatures: new Set(), selectedMethod: undefined, selectedUsage: undefined, - inProgressMethods: {}, + inProgressMethods: new Set(), }); this.onDbOpenedEventEmitter.fire(dbUri); @@ -425,28 +422,32 @@ export class ModelingStore extends DisposableObject { usage, modeledMethods: dbState.modeledMethods[method.signature] ?? [], isModified: dbState.modifiedMethodSignatures.has(method.signature), - isInProgress: hasInProgressMethodSignature( - dbState.inProgressMethods, - method.signature, - ), + isInProgress: dbState.inProgressMethods.has(method.signature), }); } - public setInProgressMethods( + public addInProgressMethods( dbItem: DatabaseItem, - packageName: string, inProgressMethods: string[], ) { - const dbState = this.getState(dbItem); - - dbState.inProgressMethods = { - ...dbState.inProgressMethods, - [packageName]: inProgressMethods, - }; + this.changeInProgressMethods(dbItem, (state) => { + state.inProgressMethods = new Set([ + ...state.inProgressMethods, + ...inProgressMethods, + ]); + }); + } - this.onInProgressMethodsChangedEventEmitter.fire({ - dbUri: dbItem.databaseUri.toString(), - methods: dbState.inProgressMethods, + public removeInProgressMethods( + dbItem: DatabaseItem, + methodSignatures: string[], + ) { + this.changeInProgressMethods(dbItem, (state) => { + state.inProgressMethods = new Set( + Array.from(state.inProgressMethods).filter( + (s) => !methodSignatures.includes(s), + ), + ); }); } @@ -469,10 +470,7 @@ export class ModelingStore extends DisposableObject { isModified: dbState.modifiedMethodSignatures.has( selectedMethod.signature, ), - isInProgress: hasInProgressMethodSignature( - dbState.inProgressMethods, - selectedMethod.signature, - ), + isInProgress: dbState.inProgressMethods.has(selectedMethod.signature), }; } @@ -515,4 +513,18 @@ export class ModelingStore extends DisposableObject { isActiveDb: dbItem.databaseUri.toString() === this.activeDb, }); } + + private changeInProgressMethods( + dbItem: DatabaseItem, + updateState: (state: InternalDbModelingState) => void, + ) { + const state = this.getState(dbItem); + + updateState(state); + + this.onInProgressMethodsChangedEventEmitter.fire({ + dbUri: dbItem.databaseUri.toString(), + methods: state.inProgressMethods, + }); + } } diff --git a/extensions/ql-vscode/src/model-editor/shared/in-progress-methods.ts b/extensions/ql-vscode/src/model-editor/shared/in-progress-methods.ts deleted file mode 100644 index e85e4a80bda..00000000000 --- a/extensions/ql-vscode/src/model-editor/shared/in-progress-methods.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * An interface to help keep track of which methods are in progress for each package. - */ -export type InProgressMethods = Readonly>; - -export function hasInProgressMethod( - inProgressMethods: InProgressMethods, - packageName: string, - method: string, -): boolean { - const methods = inProgressMethods[packageName]; - if (methods) { - return methods.includes(method); - } - - return false; -} - -export function hasInProgressMethodSignature( - inProgressMethods: InProgressMethods, - signature: string, -): boolean { - for (const methods of Object.values(inProgressMethods)) { - if (methods.includes(signature)) { - return true; - } - } - - return false; -} diff --git a/extensions/ql-vscode/src/stories/model-editor/LibraryRow.stories.tsx b/extensions/ql-vscode/src/stories/model-editor/LibraryRow.stories.tsx index dbb9345acdc..e9af0dddd90 100644 --- a/extensions/ql-vscode/src/stories/model-editor/LibraryRow.stories.tsx +++ b/extensions/ql-vscode/src/stories/model-editor/LibraryRow.stories.tsx @@ -218,7 +218,7 @@ LibraryRow.args = { ], }, modifiedSignatures: new Set(["org.sql2o.Sql2o#Sql2o(String)"]), - inProgressMethods: {}, + inProgressMethods: new Set(), viewState: { extensionPack: createMockExtensionPack(), showFlowGeneration: true, diff --git a/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx b/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx index fbc6cd12268..109cfbb8506 100644 --- a/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx +++ b/extensions/ql-vscode/src/view/model-editor/LibraryRow.tsx @@ -14,10 +14,6 @@ import { VSCodeTag, } from "@vscode/webview-ui-toolkit/react"; import { ModelEditorViewState } from "../../model-editor/shared/view-state"; -import { - InProgressMethods, - hasInProgressMethod, -} from "../../model-editor/shared/in-progress-methods"; const LibraryContainer = styled.div` background-color: var(--vscode-peekViewResult-background); @@ -76,7 +72,7 @@ export type LibraryRowProps = { methods: Method[]; modeledMethodsMap: Record; modifiedSignatures: Set; - inProgressMethods: InProgressMethods; + inProgressMethods: Set; viewState: ModelEditorViewState; hideModeledMethods: boolean; revealedMethodSignature: string | null; @@ -179,10 +175,8 @@ export const LibraryRow = ({ }, [methods, modifiedSignatures]); const canStopAutoModeling = useMemo(() => { - return methods.some((method) => - hasInProgressMethod(inProgressMethods, title, method.signature), - ); - }, [methods, title, inProgressMethods]); + return methods.some((method) => inProgressMethods.has(method.signature)); + }, [methods, inProgressMethods]); return ( diff --git a/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx b/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx index c19c30331e0..30e3d207a7b 100644 --- a/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx +++ b/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx @@ -17,7 +17,6 @@ import { ModelEditorViewState } from "../../model-editor/shared/view-state"; import { ModeledMethodsList } from "./ModeledMethodsList"; import { percentFormatter } from "./formatters"; import { Mode } from "../../model-editor/shared/mode"; -import { InProgressMethods } from "../../model-editor/shared/in-progress-methods"; import { getLanguageDisplayName } from "../../common/query-language"; import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "../../model-editor/shared/hide-modeled-methods"; @@ -93,8 +92,8 @@ export function ModelEditor({ new Set(), ); - const [inProgressMethods, setInProgressMethods] = useState( - {}, + const [inProgressMethods, setInProgressMethods] = useState>( + new Set(), ); const [hideModeledMethods, setHideModeledMethods] = useState( @@ -134,7 +133,7 @@ export function ModelEditor({ setModifiedSignatures(new Set(msg.methodSignatures)); break; case "setInProgressMethods": { - setInProgressMethods(msg.methods); + setInProgressMethods(new Set(msg.methods)); break; } case "revealMethod": diff --git a/extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx b/extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx index 1e838a6bb76..5b511784808 100644 --- a/extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx +++ b/extensions/ql-vscode/src/view/model-editor/ModeledMethodDataGrid.tsx @@ -9,10 +9,6 @@ import { Method, canMethodBeModeled } from "../../model-editor/method"; import { ModeledMethod } from "../../model-editor/modeled-method"; import { useMemo } from "react"; import { sortMethods } from "../../model-editor/shared/sorting"; -import { - InProgressMethods, - hasInProgressMethod, -} from "../../model-editor/shared/in-progress-methods"; import { HiddenMethodsRow } from "./HiddenMethodsRow"; import { ModelEditorViewState } from "../../model-editor/shared/view-state"; import { ScreenReaderOnly } from "../common/ScreenReaderOnly"; @@ -27,7 +23,7 @@ export type ModeledMethodDataGridProps = { methods: Method[]; modeledMethodsMap: Record; modifiedSignatures: Set; - inProgressMethods: InProgressMethods; + inProgressMethods: Set; viewState: ModelEditorViewState; hideModeledMethods: boolean; revealedMethodSignature: string | null; @@ -110,11 +106,7 @@ export const ModeledMethodDataGrid = ({ methodCanBeModeled={methodCanBeModeled} modeledMethods={modeledMethods} methodIsUnsaved={modifiedSignatures.has(method.signature)} - modelingInProgress={hasInProgressMethod( - inProgressMethods, - packageName, - method.signature, - )} + modelingInProgress={inProgressMethods.has(method.signature)} viewState={viewState} revealedMethodSignature={revealedMethodSignature} onChange={onChange} diff --git a/extensions/ql-vscode/src/view/model-editor/ModeledMethodsList.tsx b/extensions/ql-vscode/src/view/model-editor/ModeledMethodsList.tsx index 18a49442bc3..f9eea9e800f 100644 --- a/extensions/ql-vscode/src/view/model-editor/ModeledMethodsList.tsx +++ b/extensions/ql-vscode/src/view/model-editor/ModeledMethodsList.tsx @@ -9,13 +9,12 @@ import { sortGroupNames, } from "../../model-editor/shared/sorting"; import { ModelEditorViewState } from "../../model-editor/shared/view-state"; -import { InProgressMethods } from "../../model-editor/shared/in-progress-methods"; export type ModeledMethodsListProps = { methods: Method[]; modeledMethodsMap: Record; modifiedSignatures: Set; - inProgressMethods: InProgressMethods; + inProgressMethods: Set; revealedMethodSignature: string | null; viewState: ModelEditorViewState; hideModeledMethods: boolean; diff --git a/extensions/ql-vscode/src/view/model-editor/__tests__/LibraryRow.spec.tsx b/extensions/ql-vscode/src/view/model-editor/__tests__/LibraryRow.spec.tsx index dca35b0f6cd..3e72635c3a8 100644 --- a/extensions/ql-vscode/src/view/model-editor/__tests__/LibraryRow.spec.tsx +++ b/extensions/ql-vscode/src/view/model-editor/__tests__/LibraryRow.spec.tsx @@ -43,7 +43,7 @@ describe(LibraryRow.name, () => { ], }} modifiedSignatures={new Set([method.signature])} - inProgressMethods={{}} + inProgressMethods={new Set()} viewState={viewState} hideModeledMethods={false} revealedMethodSignature={null} diff --git a/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodDataGrid.spec.tsx b/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodDataGrid.spec.tsx index 3de68e14828..878e4c82f22 100644 --- a/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodDataGrid.spec.tsx +++ b/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodDataGrid.spec.tsx @@ -69,7 +69,7 @@ describe(ModeledMethodDataGrid.name, () => { ], }} modifiedSignatures={new Set([method1.signature])} - inProgressMethods={{}} + inProgressMethods={new Set()} viewState={viewState} hideModeledMethods={false} revealedMethodSignature={null} diff --git a/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodsList.spec.tsx b/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodsList.spec.tsx index 2841d64c2d7..62b16404fd8 100644 --- a/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodsList.spec.tsx +++ b/extensions/ql-vscode/src/view/model-editor/__tests__/ModeledMethodsList.spec.tsx @@ -69,7 +69,7 @@ describe(ModeledMethodsList.name, () => { ], }} modifiedSignatures={new Set([method1.signature])} - inProgressMethods={{}} + inProgressMethods={new Set()} viewState={viewState} hideModeledMethods={false} revealedMethodSignature={null}