Skip to content

Commit 679b2c6

Browse files
committed
Add state and messages for file-filtered results
Just adds the state and messages, and invalidation logic. No actual filtering happens yet
1 parent 3730d2a commit 679b2c6

File tree

3 files changed

+82
-1
lines changed

3 files changed

+82
-1
lines changed

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

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,28 @@ interface SetEditorSelectionMsg {
241241
wasFromUserInteraction?: boolean;
242242
}
243243

244+
/**
245+
* Results pre-filtered by file URI, sent from the extension when the
246+
* selection filter is active and the editor's file changes.
247+
* This bypasses pagination so the webview can apply line-range filtering
248+
* on the complete set of results for the file.
249+
*/
250+
export interface FileFilteredResults {
251+
/** The file URI these results were filtered for. */
252+
fileUri: string;
253+
/** The result set table these results were filtered for. */
254+
selectedTable: string;
255+
/** Raw result rows from the current result set that reference this file. */
256+
rawRows?: Row[];
257+
/** SARIF results that reference this file. */
258+
sarifResults?: Result[];
259+
}
260+
261+
interface SetFileFilteredResultsMsg {
262+
t: "setFileFilteredResults";
263+
results: FileFilteredResults;
264+
}
265+
244266
/**
245267
* A message sent into the results view.
246268
*/
@@ -251,6 +273,7 @@ export type IntoResultsViewMsg =
251273
| ShowInterpretedPageMsg
252274
| NavigateMsg
253275
| UntoggleShowProblemsMsg
276+
| SetFileFilteredResultsMsg
254277
| SetEditorSelectionMsg;
255278

256279
/**
@@ -263,7 +286,20 @@ export type FromResultsViewMsg =
263286
| ChangeRawResultsSortMsg
264287
| ChangeInterpretedResultsSortMsg
265288
| ChangePage
266-
| OpenFileMsg;
289+
| OpenFileMsg
290+
| RequestFileFilteredResultsMsg;
291+
292+
/**
293+
* Message from the results view to request pre-filtered results for
294+
* a specific (file, table) pair. The extension loads all results from
295+
* the given table that reference the given file and sends them back
296+
* via setFileFilteredResults.
297+
*/
298+
interface RequestFileFilteredResultsMsg {
299+
t: "requestFileFilteredResults";
300+
fileUri: string;
301+
selectedTable: string;
302+
}
267303

268304
/**
269305
* Message from the results view to open a source

extensions/ql-vscode/src/local-queries/results-view.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,8 @@ export class ResultsView extends AbstractWebview<
348348
case "openFile":
349349
await this.openFile(msg.filePath);
350350
break;
351+
case "requestFileFilteredResults":
352+
break;
351353
case "telemetry":
352354
telemetryListener?.sendUIInteraction(msg.action);
353355
break;

extensions/ql-vscode/src/view/results/ResultsApp.tsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { assertNever, getErrorMessage } from "../../common/helpers-pure";
22
import type {
33
DatabaseInfo,
44
EditorSelection,
5+
FileFilteredResults,
56
Interpretation,
67
IntoResultsViewMsg,
78
SortedResultSetInfo,
@@ -69,6 +70,7 @@ interface ResultsViewState {
6970
selectionFilterEnabled: boolean;
7071
editorSelection: EditorSelection | undefined;
7172
selectedTable: string | undefined;
73+
fileFilteredResults: FileFilteredResults | undefined;
7274
}
7375

7476
/**
@@ -86,12 +88,33 @@ export function ResultsApp() {
8688
selectionFilterEnabled: false,
8789
editorSelection: undefined,
8890
selectedTable: undefined,
91+
fileFilteredResults: undefined,
8992
});
9093

9194
const [userSettings, setUserSettings] = useState<UserSettings>(
9295
DEFAULT_USER_SETTINGS,
9396
);
9497

98+
useEffect(() => {
99+
if (
100+
state.selectionFilterEnabled &&
101+
state.editorSelection?.fileUri != null &&
102+
state.selectedTable != null &&
103+
state.fileFilteredResults == null
104+
) {
105+
vscode.postMessage({
106+
t: "requestFileFilteredResults",
107+
fileUri: state.editorSelection.fileUri,
108+
selectedTable: state.selectedTable,
109+
});
110+
}
111+
}, [
112+
state.selectionFilterEnabled,
113+
state.editorSelection?.fileUri,
114+
state.selectedTable,
115+
state.fileFilteredResults,
116+
]);
117+
95118
const [problemsViewSelected, setProblemsViewSelected] = useState(false);
96119

97120
const onSelectedTableChange = useCallback((tableName: string) => {
@@ -100,6 +123,7 @@ export function ResultsApp() {
100123
return {
101124
...prev,
102125
selectedTable: tableName,
126+
fileFilteredResults: undefined, // Discard stale results (they are from another table)
103127
};
104128
});
105129
}, []);
@@ -238,11 +262,30 @@ export function ResultsApp() {
238262
return {
239263
...prev,
240264
editorSelection: selection,
265+
fileFilteredResults:
266+
selection.fileUri === prev.editorSelection?.fileUri
267+
? prev.fileFilteredResults
268+
: undefined, // Discard stale results (they are from another file)
241269
};
242270
});
243271
}
244272
break;
245273

274+
case "setFileFilteredResults": {
275+
const results = msg.results;
276+
setState((prev) => {
277+
if (
278+
results.fileUri === prev.editorSelection?.fileUri &&
279+
results.selectedTable === prev.selectedTable &&
280+
prev.fileFilteredResults === undefined
281+
) {
282+
return { ...prev, fileFilteredResults: results };
283+
}
284+
return prev;
285+
});
286+
break;
287+
}
288+
246289
default:
247290
assertNever(msg);
248291
}

0 commit comments

Comments
 (0)