Skip to content

Commit 1886c0c

Browse files
committed
Add a setting to control page size
Also, set a max and min value on the input control of the page. This prevents going to a negative page, or a page after the last one.
1 parent f48176b commit 1886c0c

File tree

7 files changed

+29
-24
lines changed

7 files changed

+29
-24
lines changed

extensions/ql-vscode/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
- Add more structured output for tests. [#626](https://github.com/github/vscode-codeql/pull/626)
1010
- Whenever the extension restarts, orphaned databases will be cleaned up. These are databases whose files are located inside of the extension's storage area, but are not imported into the workspace.
1111
- After renaming a database, the database list is re-sorted. [#685](https://github.com/github/vscode-codeql/pull/685)
12+
- Add a `codeQl.resultsDisplay.pageSize` setting to configure the number of results displayed in a single results view page. Increase the default page size from 100 to 200. [#686](https://github.com/github/vscode-codeql/pull/686)
1213

1314
## 1.3.6 - 4 November 2020
1415

extensions/ql-vscode/package.json

+5
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,11 @@
157157
"default": 20,
158158
"description": "Max number of simultaneous queries to run using the 'CodeQL: Run Queries' command."
159159
},
160+
"codeQL.resultsDisplay.pageSize": {
161+
"type": "integer",
162+
"default": 200,
163+
"description": "Number of queries displayed per page of the results view."
164+
},
160165
"codeQL.queryHistory.format": {
161166
"type": "string",
162167
"default": "[%t] %q on %d - %s",

extensions/ql-vscode/src/config.ts

+2
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,12 @@ const TIMEOUT_SETTING = new Setting('timeout', RUNNING_QUERIES_SETTING);
6868
const MEMORY_SETTING = new Setting('memory', RUNNING_QUERIES_SETTING);
6969
const DEBUG_SETTING = new Setting('debug', RUNNING_QUERIES_SETTING);
7070
const RUNNING_TESTS_SETTING = new Setting('runningTests', ROOT_SETTING);
71+
const RESULTS_DISPLAY_SETTING = new Setting('resultsDisplay', ROOT_SETTING);
7172

7273
export const NUMBER_OF_TEST_THREADS_SETTING = new Setting('numberOfThreads', RUNNING_TESTS_SETTING);
7374
export const MAX_QUERIES = new Setting('maxQueries', RUNNING_QUERIES_SETTING);
7475
export const AUTOSAVE_SETTING = new Setting('autoSave', RUNNING_QUERIES_SETTING);
76+
export const PAGE_SIZE = new Setting('pageSize', RESULTS_DISPLAY_SETTING);
7577

7678
/** When these settings change, the running query server should be restarted. */
7779
const QUERY_SERVER_RESTARTING_SETTINGS = [NUMBER_OF_THREADS_SETTING, MEMORY_SETTING, DEBUG_SETTING];

extensions/ql-vscode/src/interface.ts

+13-10
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ import {
2626
SortedResultsMap,
2727
InterpretedResultsSortState,
2828
SortDirection,
29-
RAW_RESULTS_PAGE_SIZE,
30-
INTERPRETED_RESULTS_PAGE_SIZE,
3129
ALERTS_TABLE_NAME,
3230
RawResultsSortState,
3331
} from './pure/interface-types';
@@ -48,6 +46,7 @@ import {
4846
} from './interface-utils';
4947
import { getDefaultResultSetName, ParsedResultSets } from './pure/interface-types';
5048
import { RawResultSet, transformBqrsResultSet, ResultSetSchema } from './pure/bqrs-cli-types';
49+
import { PAGE_SIZE } from './config';
5150

5251
/**
5352
* interface.ts
@@ -89,11 +88,11 @@ function sortInterpretedResults(
8988
}
9089

9190
function numPagesOfResultSet(resultSet: RawResultSet): number {
92-
return Math.ceil(resultSet.schema.rows / RAW_RESULTS_PAGE_SIZE);
91+
return Math.ceil(resultSet.schema.rows / PAGE_SIZE.getValue<number>());
9392
}
9493

9594
function numInterpretedPages(interpretation: Interpretation | undefined): number {
96-
return Math.ceil((interpretation?.sarif.runs[0].results?.length || 0) / INTERPRETED_RESULTS_PAGE_SIZE);
95+
return Math.ceil((interpretation?.sarif.runs[0].results?.length || 0) / PAGE_SIZE.getValue<number>());
9796
}
9897

9998
export class InterfaceManager extends DisposableObject {
@@ -378,7 +377,7 @@ export class InterfaceManager extends DisposableObject {
378377
// Use sorted results path if it exists. This may happen if we are
379378
// reloading the results view after it has been sorted in the past.
380379
const resultsPath = results.getResultsPath(selectedTable);
381-
380+
const pageSize = PAGE_SIZE.getValue<number>();
382381
const chunk = await this.cliServer.bqrsDecode(
383382
resultsPath,
384383
schema.name,
@@ -388,12 +387,13 @@ export class InterfaceManager extends DisposableObject {
388387
// if there are interpreted results, but speculatively
389388
// send anyway.
390389
offset: schema.pagination?.offsets[0],
391-
pageSize: RAW_RESULTS_PAGE_SIZE
390+
pageSize
392391
}
393392
);
394393
const resultSet = transformBqrsResultSet(schema, chunk);
395394
const parsedResultSets: ParsedResultSets = {
396395
pageNumber: 0,
396+
pageSize,
397397
numPages: numPagesOfResultSet(resultSet),
398398
numInterpretedPages: numInterpretedPages(this._interpretation),
399399
resultSet: { ...resultSet, t: 'RawResultSet' },
@@ -442,6 +442,7 @@ export class InterfaceManager extends DisposableObject {
442442
metadata: this._displayedQuery.query.metadata,
443443
pageNumber,
444444
resultSetNames,
445+
pageSize: PAGE_SIZE.getValue(),
445446
numPages: numInterpretedPages(this._interpretation),
446447
});
447448
}
@@ -450,7 +451,7 @@ export class InterfaceManager extends DisposableObject {
450451
const resultsPath = results.getResultsPath(selectedTable);
451452
const schemas = await this.cliServer.bqrsInfo(
452453
resultsPath,
453-
RAW_RESULTS_PAGE_SIZE
454+
PAGE_SIZE.getValue()
454455
);
455456
return schemas['result-sets'];
456457
}
@@ -483,18 +484,20 @@ export class InterfaceManager extends DisposableObject {
483484
if (schema === undefined)
484485
throw new Error(`Query result set '${selectedTable}' not found.`);
485486

487+
const pageSize = PAGE_SIZE.getValue<number>();
486488
const chunk = await this.cliServer.bqrsDecode(
487489
results.getResultsPath(selectedTable, sorted),
488490
schema.name,
489491
{
490492
offset: schema.pagination?.offsets[pageNumber],
491-
pageSize: RAW_RESULTS_PAGE_SIZE
493+
pageSize
492494
}
493495
);
494496
const resultSet = transformBqrsResultSet(schema, chunk);
495497

496498
const parsedResultSets: ParsedResultSets = {
497499
pageNumber,
500+
pageSize,
498501
resultSet: { t: 'RawResultSet', ...resultSet },
499502
numPages: numPagesOfResultSet(resultSet),
500503
numInterpretedPages: numInterpretedPages(this._interpretation),
@@ -559,8 +562,8 @@ export class InterfaceManager extends DisposableObject {
559562
function getPageOfRun(run: Sarif.Run): Sarif.Run {
560563
return {
561564
...run, results: run.results?.slice(
562-
INTERPRETED_RESULTS_PAGE_SIZE * pageNumber,
563-
INTERPRETED_RESULTS_PAGE_SIZE * (pageNumber + 1)
565+
PAGE_SIZE.getValue<number>() * pageNumber,
566+
PAGE_SIZE.getValue<number>() * (pageNumber + 1)
564567
)
565568
};
566569
}

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

+2-10
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,6 @@ export type ResultSet = RawTableResultSet | PathTableResultSet;
2323
*/
2424
export const RAW_RESULTS_LIMIT = 10000;
2525

26-
/**
27-
* Show this many rows in a raw result table at a time.
28-
*/
29-
export const RAW_RESULTS_PAGE_SIZE = 100;
30-
31-
/**
32-
* Show this many rows in an interpreted results table at a time.
33-
*/
34-
export const INTERPRETED_RESULTS_PAGE_SIZE = 100;
35-
3626
export interface DatabaseInfo {
3727
name: string;
3828
databaseUri: string;
@@ -124,6 +114,7 @@ export interface ShowInterpretedPageMsg {
124114
metadata?: QueryMetadata;
125115
pageNumber: number;
126116
numPages: number;
117+
pageSize: number;
127118
resultSetNames: string[];
128119
}
129120

@@ -352,6 +343,7 @@ export function getDefaultResultSetName(
352343

353344
export interface ParsedResultSets {
354345
pageNumber: number;
346+
pageSize: number;
355347
numPages: number;
356348
numInterpretedPages: number;
357349
selectedTable?: string; // when undefined, means 'show default table'

extensions/ql-vscode/src/view/result-tables.tsx

+5-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
QueryMetadata,
77
ResultsPaths,
88
InterpretedResultsSortState,
9-
RAW_RESULTS_PAGE_SIZE,
109
ResultSet,
1110
ALERTS_TABLE_NAME,
1211
SELECT_TABLE_NAME,
@@ -100,7 +99,7 @@ export class ResultTables
10099
return resultSets;
101100
}
102101

103-
private getResultSetNames(resultSets: ResultSet[]): string[] {
102+
private getResultSetNames(): string[] {
104103
return this.props.parsedResultSets.resultSetNames.concat([ALERTS_TABLE_NAME]);
105104
}
106105

@@ -169,7 +168,7 @@ export class ResultTables
169168

170169
getOffset(): number {
171170
const { parsedResultSets } = this.props;
172-
return parsedResultSets.pageNumber * RAW_RESULTS_PAGE_SIZE;
171+
return parsedResultSets.pageNumber * parsedResultSets.pageSize;
173172
}
174173

175174
renderPageButtons(): JSX.Element {
@@ -220,6 +219,8 @@ export class ResultTables
220219
type="number"
221220
size={3}
222221
value={this.state.selectedPage}
222+
min="1"
223+
max={numPages}
223224
onChange={onChange}
224225
onBlur={e => choosePage(e.target.value)}
225226
onKeyDown={e => {
@@ -239,7 +240,7 @@ export class ResultTables
239240
render(): React.ReactNode {
240241
const { selectedTable } = this.state;
241242
const resultSets = this.getResultSets();
242-
const resultSetNames = this.getResultSetNames(resultSets);
243+
const resultSetNames = this.getResultSetNames();
243244

244245
const resultSet = resultSets.find(resultSet => resultSet.schema.name == selectedTable);
245246
const nonemptyRawResults = resultSets.some(resultSet => resultSet.t == 'RawResultSet' && resultSet.rows.length > 0);

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

+1
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ class App extends React.Component<{}, ResultsViewState> {
105105
resultsPath: '', // FIXME: Not used for interpreted, refactor so this is not needed
106106
parsedResultSets: {
107107
numPages: msg.numPages,
108+
pageSize: msg.pageSize,
108109
numInterpretedPages: msg.numPages,
109110
resultSetNames: msg.resultSetNames,
110111
pageNumber: msg.pageNumber,

0 commit comments

Comments
 (0)