Skip to content

Commit 11c538a

Browse files
committed
Teach webview to do pagination in interpreted results
1 parent 0e3b7a8 commit 11c538a

File tree

4 files changed

+32
-17
lines changed

4 files changed

+32
-17
lines changed

extensions/ql-vscode/src/adapt.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { DecodedBqrsChunk, ResultSetSchema, ColumnKind, Column, ColumnValue } from './bqrs-cli-types';
22
import { LocationValue, ResultSetSchema as AdaptedSchema, ColumnSchema, ColumnType, LocationStyle } from 'semmle-bqrs';
3+
import { ResultSet } from './interface-types';
34

45
// FIXME: This is a temporary bit of impedance matching to convert
56
// from the types provided by ./bqrs-cli-types, to the types used by
@@ -130,5 +131,5 @@ export interface ExtensionParsedResultSets {
130131
numPages: number;
131132
selectedTable?: string; // when undefined, means 'show default table'
132133
resultSetNames: string[];
133-
resultSet: RawResultSet;
134+
resultSet: ResultSet;
134135
}

extensions/ql-vscode/src/interface.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ export class InterfaceManager extends DisposableObject {
362362
t: 'ExtensionParsed',
363363
pageNumber: 0,
364364
numPages: numPagesOfResultSet(resultSet),
365-
resultSet,
365+
resultSet: { t: 'RawResultSet', ...resultSet },
366366
selectedTable: undefined,
367367
resultSetNames,
368368
};
@@ -456,7 +456,7 @@ export class InterfaceManager extends DisposableObject {
456456
const parsedResultSets: ParsedResultSets = {
457457
t: 'ExtensionParsed',
458458
pageNumber,
459-
resultSet,
459+
resultSet: { t: 'RawResultSet', ...resultSet },
460460
numPages: numPagesOfResultSet(resultSet),
461461
selectedTable: selectedTable,
462462
resultSetNames,

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

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,13 @@ function renderResultCountString(resultSet: ResultSet): JSX.Element {
7070
export class ResultTables
7171
extends React.Component<ResultTablesProps, ResultTablesState> {
7272

73-
private getResultSets(): ResultSet[] {
73+
private static _getResultSetsOfProps(props: ResultTablesProps): ResultSet[] {
7474
const resultSets: ResultSet[] =
7575
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
7676
// @ts-ignore 2783
77-
this.props.rawResultSets.map((rs) => ({ t: 'RawResultSet', ...rs }));
77+
props.rawResultSets.map((rs) => ({ t: 'RawResultSet', ...rs }));
7878

79-
if (this.props.interpretation != undefined) {
79+
if (props.interpretation != undefined) {
8080
resultSets.push({
8181
t: 'SarifResultSet',
8282
// FIXME: The values of version, columns, tupleCount are
@@ -85,12 +85,16 @@ export class ResultTables
8585
// out.
8686
schema: { name: ALERTS_TABLE_NAME, version: 0, columns: [], tupleCount: 1 },
8787
name: ALERTS_TABLE_NAME,
88-
...this.props.interpretation,
88+
...props.interpretation,
8989
});
9090
}
9191
return resultSets;
9292
}
9393

94+
private getResultSets(): ResultSet[] {
95+
return ResultTables._getResultSetsOfProps(this.props);
96+
}
97+
9498
private getResultSetNames(resultSets: ResultSet[]): string[] {
9599
if (this.props.parsedResultSets.t === 'ExtensionParsed') {
96100
return this.props.parsedResultSets.resultSetNames.concat([ALERTS_TABLE_NAME]);
@@ -120,10 +124,14 @@ export class ResultTables
120124

121125
constructor(props: ResultTablesProps) {
122126
super(props);
127+
this.state = ResultTables.getDerivedStateFromProps(props);
128+
}
123129

124-
const selectedTable = props.parsedResultSets.selectedTable || getDefaultResultSet(this.getResultSets());
125-
130+
// Static lifecycle method which is called by react when props change.
131+
static getDerivedStateFromProps(props: Readonly<ResultTablesProps>, _prevState?: ResultTablesState): ResultTablesState {
132+
const selectedTable = props.parsedResultSets.selectedTable || getDefaultResultSet(ResultTables._getResultSetsOfProps(props));
126133
let selectedPage: string;
134+
127135
switch (props.parsedResultSets.t) {
128136
case 'ExtensionParsed':
129137
selectedPage = (props.parsedResultSets.pageNumber + 1) + '';
@@ -132,8 +140,7 @@ export class ResultTables
132140
selectedPage = '';
133141
break;
134142
}
135-
136-
this.state = { selectedTable, selectedPage };
143+
return { selectedTable, selectedPage };
137144
}
138145

139146
private onTableSelectionChange = (event: React.ChangeEvent<HTMLSelectElement>): void => {
@@ -218,7 +225,7 @@ export class ResultTables
218225
};
219226
return <span>
220227
<button onClick={prevPage} >&lt;</button>
221-
<input value={this.state.selectedPage} onChange={onChange}
228+
<input size={3} value={this.state.selectedPage} onChange={onChange}
222229
onBlur={e => choosePage(e.target.value)}
223230
onKeyDown={e => { if (e.keyCode === 13) choosePage((e.target as HTMLInputElement).value); }}
224231
/>

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -197,23 +197,30 @@ class App extends React.Component<{}, ResultsViewState> {
197197
this.loadResults();
198198
break;
199199
case 'showInterpretedPage':
200-
this.updateStateWithNewResultsInfo({
200+
const resultsInfo: ResultsInfo = {
201201
resultsPath: '...', // XXX
202202
parsedResultSets: {
203203
t: 'ExtensionParsed',
204204
numPages: msg.numPages,
205205
resultSetNames: ['alerts'], // XXX get the other result set names from the extension
206206
pageNumber: msg.pageNumber,
207-
resultSet: undefined as any, // XXX this is awkward
207+
resultSet: {
208+
t: 'SarifResultSet',
209+
name: ALERTS_TABLE_NAME,
210+
schema: { name: ALERTS_TABLE_NAME, version: 0, columns: [], tupleCount: 1 },
211+
...msg.interpretation,
212+
},
208213
selectedTable: ALERTS_TABLE_NAME,
209214
},
210215
origResultsPaths: undefined as any,
211-
sortedResultsMap: undefined as any,
216+
sortedResultsMap: new Map(), // XXX ?
212217
database: msg.database,
213218
interpretation: msg.interpretation,
214-
shouldKeepOldResultsWhileRendering: false,
219+
shouldKeepOldResultsWhileRendering: true,
215220
metadata: msg.metadata,
216-
});
221+
};
222+
this.updateStateWithNewResultsInfo(resultsInfo);
223+
this.loadResults();
217224
break;
218225
case 'resultsUpdating':
219226
this.setState({

0 commit comments

Comments
 (0)