Skip to content

Commit 8b6a935

Browse files
authored
Update model alert processing to track repo results (#3508)
1 parent dea68e9 commit 8b6a935

6 files changed

Lines changed: 80 additions & 33 deletions

File tree

extensions/ql-vscode/src/model-editor/model-alerts/alert-processor.ts

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,58 @@ import type { AnalysisAlert } from "../../variant-analysis/shared/analysis-resul
22
import type { ModeledMethod } from "../modeled-method";
33
import { EndpointType } from "../method";
44
import type { ModelAlerts } from "./model-alerts";
5+
import type {
6+
VariantAnalysis,
7+
VariantAnalysisScannedRepositoryResult,
8+
} from "../../variant-analysis/shared/variant-analysis";
59

610
/**
711
* Calculate which model has contributed to each alert.
812
* @param alerts The alerts to process.
13+
* @param repoResults The analysis results for each repo.
914
* @returns The alerts grouped by modeled method.
1015
*/
11-
export function calculateModelAlerts(alerts: AnalysisAlert[]): ModelAlerts[] {
12-
// Temporary logging to use alerts variable.
13-
console.log(`Processing ${alerts.length} alerts`);
14-
16+
export function calculateModelAlerts(
17+
variantAnalysis: VariantAnalysis,
18+
repoResults: VariantAnalysisScannedRepositoryResult[],
19+
): ModelAlerts[] {
1520
// For now we just return some mock data, but once we have provenance information
1621
// we'll be able to calculate this properly based on the alerts that are passed in
1722
// and potentially some other information.
18-
return [
19-
{
20-
model: createModeledMethod(),
21-
alerts: [createMockAlert()],
22-
},
23-
];
23+
24+
const modelAlerts: ModelAlerts[] = [];
25+
26+
const repoMap = new Map<number, string>();
27+
for (const scannedRepo of variantAnalysis.scannedRepos || []) {
28+
repoMap.set(scannedRepo.repository.id, scannedRepo.repository.fullName);
29+
}
30+
31+
for (const [i, repoResult] of repoResults.entries()) {
32+
modelAlerts.push({
33+
model: createModeledMethod(i.toString()),
34+
alerts: [
35+
{
36+
alert: createMockAlert(),
37+
repository: {
38+
id: repoResult.repositoryId,
39+
fullName: repoMap.get(repoResult.repositoryId) || "",
40+
},
41+
},
42+
],
43+
});
44+
}
45+
46+
return modelAlerts;
2447
}
2548

26-
function createModeledMethod(): ModeledMethod {
49+
function createModeledMethod(suffix: string): ModeledMethod {
2750
return {
2851
libraryVersion: "1.6.0",
29-
signature: "org.sql2o.Connection#createQuery(String)",
52+
signature: `org.sql2o.Connection#createQuery${suffix}(String)`,
3053
endpointType: EndpointType.Method,
3154
packageName: "org.sql2o",
3255
typeName: "Connection",
33-
methodName: "createQuery",
56+
methodName: `createQuery${suffix}`,
3457
methodParameters: "(String)",
3558
type: "sink",
3659
input: "Argument[0]",

extensions/ql-vscode/src/model-editor/model-alerts/model-alerts.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,11 @@ import type { ModeledMethod } from "../modeled-method";
33

44
export interface ModelAlerts {
55
model: ModeledMethod;
6-
alerts: AnalysisAlert[];
6+
alerts: Array<{
7+
alert: AnalysisAlert;
8+
repository: {
9+
id: number;
10+
fullName: string;
11+
};
12+
}>;
713
}

extensions/ql-vscode/src/stories/model-alerts/ModelAlerts.stories.tsx

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { Meta, StoryFn } from "@storybook/react";
22

33
import { ModelAlerts as ModelAlertsComponent } from "../../view/model-alerts/ModelAlerts";
44
import { createMockVariantAnalysis } from "../../../test/factories/variant-analysis/shared/variant-analysis";
5+
import type { VariantAnalysisScannedRepositoryResult } from "../../variant-analysis/shared/variant-analysis";
56

67
export default {
78
title: "Model Alerts/Model Alerts",
@@ -12,19 +13,30 @@ const Template: StoryFn<typeof ModelAlertsComponent> = (args) => (
1213
<ModelAlertsComponent {...args} />
1314
);
1415

16+
const variantAnalysis = createMockVariantAnalysis({
17+
modelPacks: [
18+
{
19+
name: "Model pack 1",
20+
path: "/path/to/model-pack-1",
21+
},
22+
{
23+
name: "Model pack 2",
24+
path: "/path/to/model-pack-2",
25+
},
26+
],
27+
});
28+
29+
const repoResults: VariantAnalysisScannedRepositoryResult[] = (
30+
variantAnalysis.scannedRepos || []
31+
).map((repo) => ({
32+
variantAnalysisId: variantAnalysis.id,
33+
repositoryId: repo.repository.id,
34+
interpretedResults: [],
35+
}));
36+
1537
export const ModelAlerts = Template.bind({});
1638
ModelAlerts.args = {
1739
initialViewState: { title: "codeql/sql2o-models" },
18-
variantAnalysis: createMockVariantAnalysis({
19-
modelPacks: [
20-
{
21-
name: "Model pack 1",
22-
path: "/path/to/model-pack-1",
23-
},
24-
{
25-
name: "Model pack 2",
26-
path: "/path/to/model-pack-2",
27-
},
28-
],
29-
}),
40+
variantAnalysis,
41+
repoResults,
3042
};

extensions/ql-vscode/src/stories/model-alerts/ModelAlertsResults.stories.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ export const ModelAlertsResults = Template.bind({});
1717
ModelAlertsResults.args = {
1818
modelAlerts: {
1919
model: createSinkModeledMethod(),
20-
alerts: [createMockAnalysisAlert()],
20+
alerts: [
21+
{
22+
repository: {
23+
id: 1,
24+
fullName: "expressjs/express",
25+
},
26+
alert: createMockAnalysisAlert(),
27+
},
28+
],
2129
},
2230
};

extensions/ql-vscode/src/view/model-alerts/ModelAlerts.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,12 @@ export function ModelAlerts({
9393
}, []);
9494

9595
const modelAlerts = useMemo(() => {
96-
if (!repoResults) {
96+
if (!repoResults || !variantAnalysis) {
9797
return [];
9898
}
9999

100-
const alerts = repoResults.flatMap((a) => a.interpretedResults ?? []);
101-
102-
return calculateModelAlerts(alerts);
103-
}, [repoResults]);
100+
return calculateModelAlerts(variantAnalysis, repoResults);
101+
}, [variantAnalysis, repoResults]);
104102

105103
if (viewState === undefined || variantAnalysis === undefined) {
106104
return <></>;

extensions/ql-vscode/src/view/model-alerts/ModelAlertsResults.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export const ModelAlertsResults = ({
8080
<AlertsContainer>
8181
{modelAlerts.alerts.map((r, i) => (
8282
<Alert key={i}>
83-
<AnalysisAlertResult alert={r} />
83+
<AnalysisAlertResult alert={r.alert} />
8484
</Alert>
8585
))}
8686
</AlertsContainer>

0 commit comments

Comments
 (0)