Skip to content

Commit 6e61ddb

Browse files
Merge pull request #3398 from github/robertbrignull/sort-in-modeling-store
Move all sorting to the modeling store, and then all views preserve the sorting
2 parents 1da465f + 9a56546 commit 6e61ddb

File tree

9 files changed

+52
-95
lines changed

9 files changed

+52
-95
lines changed

extensions/ql-vscode/src/model-editor/methods-usage/methods-usage-data-provider.ts

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "../shared/hide-modeled-metho
1616
import { getModelingStatus } from "../shared/modeling-status";
1717
import { assertNever } from "../../common/helpers-pure";
1818
import type { ModeledMethod } from "../modeled-method";
19-
import { groupMethods, sortGroupNames, sortMethods } from "../shared/sorting";
19+
import { groupMethods, sortGroupNames } from "../shared/sorting";
2020
import type { Mode } from "../shared/mode";
2121
import { INITIAL_MODE } from "../shared/mode";
2222
import type { UrlValueResolvable } from "../../common/raw-result-types";
@@ -63,7 +63,6 @@ export class MethodsUsageDataProvider
6363
mode: Mode,
6464
modeledMethods: Readonly<Record<string, readonly ModeledMethod[]>>,
6565
modifiedMethodSignatures: ReadonlySet<string>,
66-
processedByAutoModelMethods: ReadonlySet<string>,
6766
): Promise<void> {
6867
if (
6968
this.methods !== methods ||
@@ -74,15 +73,7 @@ export class MethodsUsageDataProvider
7473
this.modifiedMethodSignatures !== modifiedMethodSignatures
7574
) {
7675
this.methods = methods;
77-
this.sortedTreeItems = createTreeItems(
78-
sortMethodsInGroups(
79-
methods,
80-
modeledMethods,
81-
mode,
82-
modifiedMethodSignatures,
83-
processedByAutoModelMethods,
84-
),
85-
);
76+
this.sortedTreeItems = createTreeItems(createGroups(methods, mode));
8677
this.databaseItem = databaseItem;
8778
this.sourceLocationPrefix =
8879
await this.databaseItem.getSourceLocationPrefix(this.cliServer);
@@ -253,27 +244,9 @@ function urlValueResolvablesAreEqual(
253244
return false;
254245
}
255246

256-
function sortMethodsInGroups(
257-
methods: readonly Method[],
258-
modeledMethods: Readonly<Record<string, readonly ModeledMethod[]>>,
259-
mode: Mode,
260-
modifiedMethodSignatures: ReadonlySet<string>,
261-
processedByAutoModelMethods: ReadonlySet<string>,
262-
): Method[] {
247+
function createGroups(methods: readonly Method[], mode: Mode): Method[] {
263248
const grouped = groupMethods(methods, mode);
264-
265-
const sortedGroupNames = sortGroupNames(grouped);
266-
267-
return sortedGroupNames.flatMap((groupName) => {
268-
const group = grouped[groupName];
269-
270-
return sortMethods(
271-
group,
272-
modeledMethods,
273-
modifiedMethodSignatures,
274-
processedByAutoModelMethods,
275-
);
276-
});
249+
return sortGroupNames(grouped).flatMap((groupName) => grouped[groupName]);
277250
}
278251

279252
function createTreeItems(methods: readonly Method[]): MethodTreeViewItem[] {

extensions/ql-vscode/src/model-editor/methods-usage/methods-usage-panel.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ export class MethodsUsagePanel extends DisposableObject {
3939
mode: Mode,
4040
modeledMethods: Readonly<Record<string, readonly ModeledMethod[]>>,
4141
modifiedMethodSignatures: ReadonlySet<string>,
42-
processedByAutoModelMethods: ReadonlySet<string>,
4342
): Promise<void> {
4443
await this.dataProvider.setState(
4544
methods,
@@ -48,7 +47,6 @@ export class MethodsUsagePanel extends DisposableObject {
4847
mode,
4948
modeledMethods,
5049
modifiedMethodSignatures,
51-
processedByAutoModelMethods,
5250
);
5351
const numOfApis = hideModeledMethods
5452
? methods.filter((api) => !api.supported).length
@@ -122,7 +120,6 @@ export class MethodsUsagePanel extends DisposableObject {
122120
activeState.mode,
123121
activeState.modeledMethods,
124122
activeState.modifiedMethodSignatures,
125-
activeState.processedByAutoModelMethods,
126123
);
127124
}
128125
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,8 @@ export class ModelEditorView extends AbstractWebview<
288288
Object.keys(modeledMethods),
289289
);
290290

291+
this.modelingStore.updateMethodSorting(this.databaseItem);
292+
291293
void telemetryListener?.sendUIInteraction(
292294
"model-editor-save-modeled-methods",
293295
);

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

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { ModeledMethod } from "./modeled-method";
66
import type { ModelingEvents } from "./modeling-events";
77
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "./shared/hide-modeled-methods";
88
import type { Mode } from "./shared/mode";
9+
import { sortMethods } from "./shared/sorting";
910

1011
interface InternalDbModelingState {
1112
databaseItem: DatabaseItem;
@@ -155,17 +156,25 @@ export class ModelingStore extends DisposableObject {
155156
}
156157

157158
public setMethods(dbItem: DatabaseItem, methods: Method[]) {
158-
const dbState = this.getState(dbItem);
159-
const dbUri = dbItem.databaseUri.toString();
160-
161-
dbState.methods = [...methods];
159+
this.changeMethods(dbItem, (state) => {
160+
state.methods = sortMethods(
161+
methods,
162+
state.modeledMethods,
163+
state.modifiedMethodSignatures,
164+
state.processedByAutoModelMethods,
165+
);
166+
});
167+
}
162168

163-
this.modelingEvents.fireMethodsChangedEvent(
164-
methods,
165-
dbUri,
166-
dbItem,
167-
dbUri === this.activeDb,
168-
);
169+
public updateMethodSorting(dbItem: DatabaseItem) {
170+
this.changeMethods(dbItem, (state) => {
171+
state.methods = sortMethods(
172+
state.methods,
173+
state.modeledMethods,
174+
state.modifiedMethodSignatures,
175+
state.processedByAutoModelMethods,
176+
);
177+
});
169178
}
170179

171180
public setHideModeledMethods(
@@ -374,6 +383,7 @@ export class ModelingStore extends DisposableObject {
374383
...processedByAutoModelMethods,
375384
]);
376385
});
386+
this.updateMethodSorting(dbItem);
377387
}
378388

379389
public updateModelEvaluationRun(
@@ -421,6 +431,22 @@ export class ModelingStore extends DisposableObject {
421431
return this.state.get(databaseItem.databaseUri.toString())!;
422432
}
423433

434+
private changeMethods(
435+
dbItem: DatabaseItem,
436+
updateState: (state: InternalDbModelingState) => void,
437+
) {
438+
const state = this.getState(dbItem);
439+
440+
updateState(state);
441+
442+
this.modelingEvents.fireMethodsChangedEvent(
443+
state.methods,
444+
dbItem.databaseUri.toString(),
445+
dbItem,
446+
dbItem.databaseUri.toString() === this.activeDb,
447+
);
448+
}
449+
424450
private changeModifiedMethods(
425451
dbItem: DatabaseItem,
426452
updateState: (state: InternalDbModelingState) => void,

extensions/ql-vscode/src/model-editor/shared/auto-model-candidates.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Method, MethodSignature } from "../method";
22
import type { ModeledMethod } from "../modeled-method";
33
import type { Mode } from "./mode";
4-
import { groupMethods, sortGroupNames, sortMethods } from "./sorting";
4+
import { groupMethods, sortGroupNames } from "./sorting";
55

66
/**
77
* Return the candidates that the model should be run on. This includes limiting the number of
@@ -44,10 +44,5 @@ export function getCandidates(
4444

4545
// Sort the same way as the UI so we send the first ones listed in the UI first
4646
const grouped = groupMethods(candidateMethods, mode);
47-
const sortedGroupNames = sortGroupNames(grouped);
48-
return sortedGroupNames.flatMap((name) =>
49-
// We can safely pass empty sets for `modifiedSignatures` and `processedByAutoModelMethods`
50-
// because we've filtered out all methods that are already modeled or have already been processed by auto-model.
51-
sortMethods(grouped[name], modeledMethodsBySignature, new Set(), new Set()),
52-
);
47+
return sortGroupNames(grouped).flatMap((name) => grouped[name]);
5348
}

extensions/ql-vscode/src/model-editor/shared/sorting.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import type { ModeledMethod } from "../modeled-method";
44
import { Mode } from "./mode";
55
import { calculateModeledPercentage } from "./modeled-percentage";
66

7+
/**
8+
* Groups methods by library or package name.
9+
* Does not change the order of methods within a group.
10+
*/
711
export function groupMethods(
812
methods: readonly Method[],
913
mode: Mode,

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

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import type { Method } from "../../model-editor/method";
33
import { canMethodBeModeled } from "../../model-editor/method";
44
import type { ModeledMethod } from "../../model-editor/modeled-method";
55
import { useMemo } from "react";
6-
import { sortMethods } from "../../model-editor/shared/sorting";
76
import { HiddenMethodsRow } from "./HiddenMethodsRow";
87
import type { ModelEditorViewState } from "../../model-editor/shared/view-state";
98
import { ScreenReaderOnly } from "../common/ScreenReaderOnly";
@@ -48,12 +47,7 @@ export const ModeledMethodDataGrid = ({
4847
] = useMemo(() => {
4948
const methodsWithModelability = [];
5049
let numHiddenMethods = 0;
51-
for (const method of sortMethods(
52-
methods,
53-
modeledMethodsMap,
54-
modifiedSignatures,
55-
processedByAutoModelMethods,
56-
)) {
50+
for (const method of methods) {
5751
const modeledMethods = modeledMethodsMap[method.signature] ?? [];
5852
const methodIsUnsaved = modifiedSignatures.has(method.signature);
5953
const methodCanBeModeled = canMethodBeModeled(
@@ -69,13 +63,7 @@ export const ModeledMethodDataGrid = ({
6963
}
7064
}
7165
return [methodsWithModelability, numHiddenMethods];
72-
}, [
73-
hideModeledMethods,
74-
methods,
75-
modeledMethodsMap,
76-
modifiedSignatures,
77-
processedByAutoModelMethods,
78-
]);
66+
}, [hideModeledMethods, methods, modeledMethodsMap, modifiedSignatures]);
7967

8068
const someMethodsAreVisible = methodsWithModelability.length > 0;
8169

0 commit comments

Comments
 (0)