Skip to content

Commit a833f78

Browse files
committed
Sort libraries by supported and usages
1 parent bbc39b0 commit a833f78

4 files changed

Lines changed: 68 additions & 35 deletions

File tree

extensions/ql-vscode/src/data-extensions-editor/bqrs.ts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,5 @@ export function decodeBqrsToExternalApiUsages(
4747
method.usages.push(usage);
4848
});
4949

50-
const externalApiUsages = Array.from(methodsByApiName.values());
51-
externalApiUsages.sort((a, b) => {
52-
// Sort first by supported, putting unmodeled methods first.
53-
if (a.supported && !b.supported) {
54-
return 1;
55-
}
56-
if (!a.supported && b.supported) {
57-
return -1;
58-
}
59-
// Then sort by number of usages descending
60-
return b.usages.length - a.usages.length;
61-
});
62-
return externalApiUsages;
50+
return Array.from(methodsByApiName.values());
6351
}

extensions/ql-vscode/src/view/data-extensions-editor/ModeledMethodDataGrid.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
import { MethodRow } from "./MethodRow";
88
import { ExternalApiUsage } from "../../data-extensions-editor/external-api-usage";
99
import { ModeledMethod } from "../../data-extensions-editor/modeled-method";
10+
import { useMemo } from "react";
1011

1112
type Props = {
1213
externalApiUsages: ExternalApiUsage[];
@@ -22,6 +23,22 @@ export const ModeledMethodDataGrid = ({
2223
modeledMethods,
2324
onChange,
2425
}: Props) => {
26+
const sortedExternalApiUsages = useMemo(() => {
27+
const sortedExternalApiUsages = [...externalApiUsages];
28+
sortedExternalApiUsages.sort((a, b) => {
29+
// Sort first by supported, putting unmodeled methods first.
30+
if (a.supported && !b.supported) {
31+
return 1;
32+
}
33+
if (!a.supported && b.supported) {
34+
return -1;
35+
}
36+
// Then sort by number of usages descending
37+
return b.usages.length - a.usages.length;
38+
});
39+
return sortedExternalApiUsages;
40+
}, [externalApiUsages]);
41+
2542
return (
2643
<VSCodeDataGrid>
2744
<VSCodeDataGridRow rowType="header">
@@ -47,7 +64,7 @@ export const ModeledMethodDataGrid = ({
4764
Kind
4865
</VSCodeDataGridCell>
4966
</VSCodeDataGridRow>
50-
{externalApiUsages.map((externalApiUsage) => (
67+
{sortedExternalApiUsages.map((externalApiUsage) => (
5168
<MethodRow
5269
key={externalApiUsage.signature}
5370
externalApiUsage={externalApiUsage}

extensions/ql-vscode/src/view/data-extensions-editor/ModeledMethodsList.tsx

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import styled from "styled-components";
44
import { ExternalApiUsage } from "../../data-extensions-editor/external-api-usage";
55
import { ModeledMethod } from "../../data-extensions-editor/modeled-method";
66
import { ModeledMethodDataGrid } from "./ModeledMethodDataGrid";
7+
import { calculateModeledPercentage } from "./modeled";
78

89
const LibraryContainer = styled.div`
910
margin-bottom: 1rem;
@@ -35,7 +36,34 @@ export const ModeledMethodsList = ({
3536
}, [externalApiUsages]);
3637

3738
const sortedLibraryNames = useMemo(() => {
38-
return Object.keys(groupedByLibrary).sort();
39+
return Object.keys(groupedByLibrary).sort((a, b) => {
40+
const supportedPercentageA = calculateModeledPercentage(
41+
groupedByLibrary[a],
42+
);
43+
const supportedPercentageB = calculateModeledPercentage(
44+
groupedByLibrary[b],
45+
);
46+
47+
// Sort first by supported percentage ascending
48+
if (supportedPercentageA > supportedPercentageB) {
49+
return 1;
50+
}
51+
if (supportedPercentageA < supportedPercentageB) {
52+
return -1;
53+
}
54+
55+
const numberOfUsagesA = groupedByLibrary[a].reduce(
56+
(acc, curr) => acc + curr.usages.length,
57+
0,
58+
);
59+
const numberOfUsagesB = groupedByLibrary[b].reduce(
60+
(acc, curr) => acc + curr.usages.length,
61+
0,
62+
);
63+
64+
// Then sort by number of usages descending
65+
return numberOfUsagesB - numberOfUsagesA;
66+
});
3967
}, [groupedByLibrary]);
4068

4169
return (

extensions/ql-vscode/test/unit-tests/data-extensions-editor/bqrs.test.ts

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,26 @@ describe("decodeBqrsToExternalApiUsages", () => {
168168
// - Iterating over a map (as done by .values()) is guaranteed to be in insertion order
169169
// - Sorting the array of usages is guaranteed to be a stable sort
170170
expect(decodeBqrsToExternalApiUsages(chunk)).toEqual([
171+
{
172+
signature: "java.io.PrintStream#println(String)",
173+
packageName: "java.io",
174+
typeName: "PrintStream",
175+
methodName: "println",
176+
methodParameters: "(String)",
177+
supported: true,
178+
usages: [
179+
{
180+
label: "println(...)",
181+
url: {
182+
uri: "file:/home/runner/work/sql2o-example/sql2o-example/src/main/java/org/example/HelloController.java",
183+
startLine: 29,
184+
startColumn: 9,
185+
endLine: 29,
186+
endColumn: 49,
187+
},
188+
},
189+
],
190+
},
171191
{
172192
signature:
173193
"org.springframework.boot.SpringApplication#run(Class,String[])",
@@ -279,26 +299,6 @@ describe("decodeBqrsToExternalApiUsages", () => {
279299
},
280300
],
281301
},
282-
{
283-
signature: "java.io.PrintStream#println(String)",
284-
packageName: "java.io",
285-
typeName: "PrintStream",
286-
methodName: "println",
287-
methodParameters: "(String)",
288-
supported: true,
289-
usages: [
290-
{
291-
label: "println(...)",
292-
url: {
293-
uri: "file:/home/runner/work/sql2o-example/sql2o-example/src/main/java/org/example/HelloController.java",
294-
startLine: 29,
295-
startColumn: 9,
296-
endLine: 29,
297-
endColumn: 49,
298-
},
299-
},
300-
],
301-
},
302302
{
303303
signature: "org.sql2o.Sql2o#Sql2o(String,String,String)",
304304
packageName: "org.sql2o",

0 commit comments

Comments
 (0)