Skip to content

Commit bbaa27a

Browse files
committed
Split filter and sort methods and simplify type checks
1 parent 6aaa7d6 commit bbaa27a

File tree

4 files changed

+72
-15
lines changed

4 files changed

+72
-15
lines changed

extensions/ql-vscode/src/pure/variant-analysis-filter-sort.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,22 +76,26 @@ export function compareWithResults(filterSortState: RepositoriesFilterSortState
7676
};
7777
}
7878

79-
function isFilterOnRepositoryIds(filterSortState: RepositoriesFilterSortState | RepositoriesFilterSortStateWithIds | undefined): filterSortState is RepositoriesFilterSortStateWithIds & Required<Pick<RepositoriesFilterSortStateWithIds, 'repositoryIds'>> {
80-
return !!filterSortState && 'repositoryIds' in filterSortState && filterSortState.repositoryIds !== undefined && filterSortState.repositoryIds.length > 0;
81-
}
79+
export function filterAndSortRepositoriesWithResultsByName<T extends SortableResult>(repositories: T[] | undefined, filterSortState: RepositoriesFilterSortState | undefined): T[] | undefined {
80+
if (!repositories) {
81+
return undefined;
82+
}
8283

83-
// These define the behavior for undefined input values
84-
export function filterAndSortRepositoriesWithResults<T extends SortableResult>(repositories: T[], filterSortState: RepositoriesFilterSortState | RepositoriesFilterSortStateWithIds | undefined): T[];
85-
export function filterAndSortRepositoriesWithResults<T extends SortableResult>(repositories: T[] | undefined, filterSortState: RepositoriesFilterSortState | RepositoriesFilterSortStateWithIds | undefined): T[] | undefined;
84+
return repositories
85+
.filter(repo => matchesFilter(repo.repository, filterSortState))
86+
.sort(compareWithResults(filterSortState));
87+
}
8688

87-
export function filterAndSortRepositoriesWithResults<T extends SortableResult>(repositories: T[] | undefined, filterSortState: RepositoriesFilterSortState | RepositoriesFilterSortStateWithIds | undefined): T[] | undefined {
89+
export function filterAndSortRepositoriesWithResults<T extends SortableResult>(repositories: T[] | undefined, filterSortState: RepositoriesFilterSortStateWithIds | undefined): T[] | undefined {
8890
if (!repositories) {
8991
return undefined;
9092
}
9193

92-
const filteredRepositories = isFilterOnRepositoryIds(filterSortState) ?
93-
repositories.filter(repo => filterSortState.repositoryIds.includes(repo.repository.id)) :
94-
repositories.filter(repo => matchesFilter(repo.repository, filterSortState));
94+
if (filterSortState?.repositoryIds && filterSortState.repositoryIds.length > 0) {
95+
return repositories
96+
.filter(repo => filterSortState.repositoryIds?.includes(repo.repository.id))
97+
.sort(compareWithResults(filterSortState));
98+
}
9599

96-
return filteredRepositories.sort(compareWithResults(filterSortState));
100+
return filterAndSortRepositoriesWithResultsByName(repositories, filterSortState);
97101
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,9 +379,9 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
379379
throw new Error(`No variant analysis with id: ${variantAnalysisId}`);
380380
}
381381

382-
const filteredRepositories = filterAndSortRepositoriesWithResults(variantAnalysis.scannedRepos ?? [], filterSort);
382+
const filteredRepositories = filterAndSortRepositoriesWithResults(variantAnalysis.scannedRepos, filterSort);
383383

384-
const fullNames = filteredRepositories.filter(a => a.resultCount && a.resultCount > 0).map(a => a.repository.fullName);
384+
const fullNames = filteredRepositories?.filter(a => a.resultCount && a.resultCount > 0).map(a => a.repository.fullName);
385385
if (!fullNames || fullNames.length === 0) {
386386
return;
387387
}

extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisAnalyzedRepos.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
VariantAnalysisScannedRepositoryState
99
} from '../../remote-queries/shared/variant-analysis';
1010
import {
11-
filterAndSortRepositoriesWithResults,
11+
filterAndSortRepositoriesWithResultsByName,
1212
RepositoriesFilterSortState,
1313
} from '../../pure/variant-analysis-filter-sort';
1414

@@ -55,7 +55,7 @@ export const VariantAnalysisAnalyzedRepos = ({
5555
}, [repositoryResults]);
5656

5757
const repositories = useMemo(() => {
58-
return filterAndSortRepositoriesWithResults(variantAnalysis.scannedRepos, filterSortState);
58+
return filterAndSortRepositoriesWithResultsByName(variantAnalysis.scannedRepos, filterSortState);
5959
}, [filterSortState, variantAnalysis.scannedRepos]);
6060

6161
const onSelectedChange = useCallback((repositoryId: number, selected: boolean) => {

extensions/ql-vscode/src/view/variant-analysis/__tests__/filterSort.spec.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
compareWithResults,
44
defaultFilterSortState,
55
filterAndSortRepositoriesWithResults,
6+
filterAndSortRepositoriesWithResultsByName,
67
matchesFilter,
78
SortKey,
89
} from '../../../pure/variant-analysis-filter-sort';
@@ -294,6 +295,58 @@ describe(compareWithResults.name, () => {
294295
});
295296
});
296297

298+
describe(filterAndSortRepositoriesWithResultsByName.name, () => {
299+
const repositories = [
300+
{
301+
repository: {
302+
id: 10,
303+
fullName: 'github/galaxy',
304+
},
305+
resultCount: 10,
306+
},
307+
{
308+
repository: {
309+
id: 11,
310+
fullName: 'github/world',
311+
},
312+
resultCount: undefined,
313+
},
314+
{
315+
repository: {
316+
id: 13,
317+
fullName: 'github/planet',
318+
},
319+
resultCount: 500,
320+
},
321+
{
322+
repository: {
323+
id: 783532,
324+
fullName: 'github/stars',
325+
},
326+
resultCount: 8000,
327+
}
328+
];
329+
330+
describe('when sort key is given without filter', () => {
331+
it('returns the correct results', () => {
332+
expect(filterAndSortRepositoriesWithResultsByName(repositories, {
333+
...defaultFilterSortState,
334+
sortKey: SortKey.ResultsCount,
335+
})).toEqual([repositories[3], repositories[2], repositories[0], repositories[1]]);
336+
});
337+
});
338+
339+
describe('when sort key and search filter are given', () => {
340+
it('returns the correct results', () => {
341+
expect(filterAndSortRepositoriesWithResultsByName(repositories, {
342+
...defaultFilterSortState,
343+
sortKey: SortKey.ResultsCount,
344+
searchValue: 'la',
345+
})).toEqual([repositories[2], repositories[0]]);
346+
});
347+
});
348+
});
349+
297350
describe(filterAndSortRepositoriesWithResults.name, () => {
298351
const repositories = [
299352
{

0 commit comments

Comments
 (0)