Skip to content

Commit 2cf5b39

Browse files
Merge pull request #1432 from github/charisk-elena/result-count-on-history-labels
Add result count to remote queries in Query History
2 parents 651a6fb + 13921bf commit 2cf5b39

File tree

14 files changed

+89
-59
lines changed

14 files changed

+89
-59
lines changed

extensions/ql-vscode/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@
224224
},
225225
"codeQL.queryHistory.format": {
226226
"type": "string",
227-
"default": "%q on %d - %s, %r [%t]",
227+
"default": "%q on %d - %s %r [%t]",
228228
"markdownDescription": "Default string for how to label query history items.\n* %t is the time of the query\n* %q is the human-readable query name\n* %f is the query file name\n* %d is the database name\n* %r is the number of results\n* %s is a status string"
229229
},
230230
"codeQL.queryHistory.ttl": {

extensions/ql-vscode/src/helpers.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,3 +581,11 @@ export async function* walkDirectory(dir: string): AsyncIterableIterator<string>
581581
}
582582
}
583583
}
584+
585+
/**
586+
* Pluralizes a word.
587+
* Example: Returns "N repository" if N is one, "N repositories" otherwise.
588+
*/
589+
export function pluralize(numItems: number | undefined, singular: string, plural: string): string {
590+
return numItems ? `${numItems} ${numItems === 1 ? singular : plural}` : '';
591+
}

extensions/ql-vscode/src/history-item-label-provider.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import * as path from 'path';
33
import { QueryHistoryConfig } from './config';
44
import { LocalQueryInfo, QueryHistoryInfo } from './query-results';
55
import { RemoteQueryHistoryItem } from './remote-queries/remote-query-history-item';
6+
import { pluralize } from './helpers';
67

78
interface InterpolateReplacements {
89
t: string; // Start time
@@ -57,25 +58,30 @@ export class HistoryItemLabelProvider {
5758
t: item.startTime,
5859
q: item.getQueryName(),
5960
d: item.initialInfo.databaseInfo.name,
60-
r: `${resultCount} results`,
61+
r: `(${resultCount} results)`,
6162
s: statusString,
6263
f: item.getQueryFileName(),
6364
'%': '%',
6465
};
6566
}
6667

68+
// Return the number of repositories queried if available. Otherwise, use the controller repository name.
69+
private buildRepoLabel(item: RemoteQueryHistoryItem): string {
70+
const repositoryCount = item.remoteQuery.repositoryCount;
71+
72+
if (repositoryCount) {
73+
return pluralize(repositoryCount, 'repository', 'repositories');
74+
}
75+
76+
return `${item.remoteQuery.controllerRepository.owner}/${item.remoteQuery.controllerRepository.name}`;
77+
}
78+
6779
private getRemoteInterpolateReplacements(item: RemoteQueryHistoryItem): InterpolateReplacements {
68-
const numRepositoriesQueried = item.remoteQuery.numRepositoriesQueried;
69-
const numRepositoriesLabel = `${numRepositoriesQueried} ${numRepositoriesQueried === 1 ? 'repository' : 'repositories'}`;
7080
return {
7181
t: new Date(item.remoteQuery.executionStartTime).toLocaleString(env.language),
7282
q: `${item.remoteQuery.queryName} (${item.remoteQuery.language})`,
73-
74-
// Return the number of repositories queried if available. Otherwise, use the controller repository name.
75-
d: numRepositoriesQueried ? numRepositoriesLabel : `${item.remoteQuery.controllerRepository.owner}/${item.remoteQuery.controllerRepository.name}`,
76-
77-
// There is no synchronous way to get the results count.
78-
r: '',
83+
d: this.buildRepoLabel(item),
84+
r: `(${pluralize(item.resultCount, 'result', 'results')})`,
7985
s: item.status,
8086
f: path.basename(item.remoteQuery.queryFilePath),
8187
'%': '%'

extensions/ql-vscode/src/query-history.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,13 +205,12 @@ export class HistoryTreeDataProvider extends DisposableObject {
205205
? h2.initialInfo.start.getTime()
206206
: h2.remoteQuery?.executionStartTime;
207207

208-
// result count for remote queries is not available here.
209208
const resultCount1 = h1.t === 'local'
210209
? h1.completedQuery?.resultCount ?? -1
211-
: -1;
210+
: h1.resultCount ?? -1;
212211
const resultCount2 = h2.t === 'local'
213212
? h2.completedQuery?.resultCount ?? -1
214-
: -1;
213+
: h2.resultCount ?? -1;
215214

216215
switch (this.sortOrder) {
217216
case SortOrder.NameAsc:
@@ -574,6 +573,7 @@ export class QueryHistoryManager extends DisposableObject {
574573
const remoteQueryHistoryItem = item as RemoteQueryHistoryItem;
575574
remoteQueryHistoryItem.status = event.status;
576575
remoteQueryHistoryItem.failureReason = event.failureReason;
576+
remoteQueryHistoryItem.resultCount = event.resultCount;
577577
if (event.status === QueryStatus.Completed) {
578578
remoteQueryHistoryItem.completed = true;
579579
}

extensions/ql-vscode/src/remote-queries/export-results.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import * as fs from 'fs-extra';
44
import { window, commands, Uri, ExtensionContext, QuickPickItem, workspace, ViewColumn } from 'vscode';
55
import { Credentials } from '../authentication';
66
import { UserCancellationException } from '../commandRunner';
7-
import { showInformationMessageWithAction } from '../helpers';
7+
import {
8+
showInformationMessageWithAction,
9+
pluralize
10+
} from '../helpers';
811
import { logger } from '../logging';
912
import { QueryHistoryManager } from '../query-history';
1013
import { createGist } from './gh-actions-api-client';
@@ -106,9 +109,9 @@ export async function exportResultsToGist(
106109
*/
107110
const buildGistDescription = (query: RemoteQuery, analysesResults: AnalysisResults[]) => {
108111
const resultCount = sumAnalysesResults(analysesResults);
109-
const repositoryLabel = `${query.numRepositoriesQueried} ${query.numRepositoriesQueried === 1 ? 'repository' : 'repositories'}`;
110-
const repositoryCount = query.numRepositoriesQueried ? repositoryLabel : '';
111-
return `${query.queryName} (${query.language}) ${resultCount} results (${repositoryCount})`;
112+
const resultLabel = pluralize(resultCount, 'result', 'results');
113+
const repositoryLabel = pluralize(query.repositoryCount, 'repository', 'repositories');
114+
return `${query.queryName} (${query.language}) ${resultLabel} (${repositoryLabel})`;
112115
};
113116

114117
/**

extensions/ql-vscode/src/remote-queries/remote-queries-interface.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,16 @@ import {
1818
import { Logger } from '../logging';
1919
import { getHtmlForWebview } from '../interface-utils';
2020
import { assertNever } from '../pure/helpers-pure';
21-
import { AnalysisSummary, RemoteQueryResult } from './remote-query-result';
21+
import {
22+
AnalysisSummary,
23+
RemoteQueryResult,
24+
sumAnalysisSummariesResults
25+
} from './remote-query-result';
2226
import { RemoteQuery } from './remote-query';
23-
import { RemoteQueryResult as RemoteQueryResultViewModel } from './shared/remote-query-result';
24-
import { AnalysisSummary as AnalysisResultViewModel } from './shared/remote-query-result';
27+
import {
28+
AnalysisSummary as AnalysisResultViewModel,
29+
RemoteQueryResult as RemoteQueryResultViewModel
30+
} from './shared/remote-query-result';
2531
import { showAndLogWarningMessage } from '../helpers';
2632
import { URLSearchParams } from 'url';
2733
import { SHOW_QUERY_TEXT_MSG } from '../query-history';
@@ -73,7 +79,7 @@ export class RemoteQueriesInterfaceManager {
7379
*/
7480
private buildViewModel(query: RemoteQuery, queryResult: RemoteQueryResult): RemoteQueryResultViewModel {
7581
const queryFileName = path.basename(query.queryFilePath);
76-
const totalResultCount = queryResult.analysisSummaries.reduce((acc, cur) => acc + cur.resultCount, 0);
82+
const totalResultCount = sumAnalysisSummariesResults(queryResult.analysisSummaries);
7783
const executionDuration = this.getDuration(queryResult.executionEndTime, query.executionStartTime);
7884
const analysisSummaries = this.buildAnalysisSummaries(queryResult.analysisSummaries);
7985
const totalRepositoryCount = queryResult.analysisSummaries.length;

extensions/ql-vscode/src/remote-queries/remote-queries-manager.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { RemoteQuery } from './remote-query';
1515
import { RemoteQueriesMonitor } from './remote-queries-monitor';
1616
import { getRemoteQueryIndex, getRepositoriesMetadata, RepositoriesMetadata } from './gh-actions-api-client';
1717
import { RemoteQueryResultIndex } from './remote-query-result-index';
18-
import { RemoteQueryResult } from './remote-query-result';
18+
import { RemoteQueryResult, sumAnalysisSummariesResults } from './remote-query-result';
1919
import { DownloadLink } from './download-link';
2020
import { AnalysesResultsManager } from './analyses-results-manager';
2121
import { assertNever } from '../pure/helpers-pure';
@@ -41,7 +41,8 @@ export interface UpdatedQueryStatusEvent {
4141
queryId: string;
4242
status: QueryStatus;
4343
failureReason?: string;
44-
numRepositoriesQueried?: number;
44+
repositoryCount?: number;
45+
resultCount?: number;
4546
}
4647

4748
export class RemoteQueriesManager extends DisposableObject {
@@ -249,7 +250,7 @@ export class RemoteQueriesManager extends DisposableObject {
249250
}
250251

251252
private async askToOpenResults(query: RemoteQuery, queryResult: RemoteQueryResult): Promise<void> {
252-
const totalResultCount = queryResult.analysisSummaries.reduce((acc, cur) => acc + cur.resultCount, 0);
253+
const totalResultCount = sumAnalysisSummariesResults(queryResult.analysisSummaries);
253254
const totalRepoCount = queryResult.analysisSummaries.length;
254255
const message = `Query "${query.queryName}" run on ${totalRepoCount} repositories and returned ${totalResultCount} results`;
255256

@@ -317,10 +318,12 @@ export class RemoteQueriesManager extends DisposableObject {
317318
if (resultIndex) {
318319
const metadata = await this.getRepositoriesMetadata(resultIndex, credentials);
319320
const queryResult = this.mapQueryResult(executionEndTime, resultIndex, queryId, metadata);
321+
const resultCount = sumAnalysisSummariesResults(queryResult.analysisSummaries);
320322
this.remoteQueryStatusUpdateEventEmitter.fire({
321323
queryId,
322324
status: QueryStatus.Completed,
323-
numRepositoriesQueried: queryResult.analysisSummaries.length,
325+
repositoryCount: queryResult.analysisSummaries.length,
326+
resultCount
324327
});
325328

326329
await this.storeJsonFile(queryId, 'query-result.json', queryResult);

extensions/ql-vscode/src/remote-queries/remote-query-history-item.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { RemoteQuery } from './remote-query';
77
export interface RemoteQueryHistoryItem {
88
readonly t: 'remote';
99
failureReason?: string;
10+
resultCount?: number;
1011
status: QueryStatus;
1112
completed: boolean;
1213
readonly queryId: string,

extensions/ql-vscode/src/remote-queries/remote-query-result.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,10 @@ export interface AnalysisSummary {
1818
starCount?: number,
1919
lastUpdated?: number,
2020
}
21+
22+
/**
23+
* Sums up the number of results for all repos queried via a remote query.
24+
*/
25+
export const sumAnalysisSummariesResults = (analysisSummaries: AnalysisSummary[]): number => {
26+
return analysisSummaries.reduce((acc, cur) => acc + cur.resultCount, 0);
27+
};

extensions/ql-vscode/src/remote-queries/remote-query.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ export interface RemoteQuery {
88
controllerRepository: Repository;
99
executionStartTime: number; // Use number here since it needs to be serialized and desserialized.
1010
actionsWorkflowRunId: number;
11-
numRepositoriesQueried: number;
11+
repositoryCount: number;
1212
}

0 commit comments

Comments
 (0)