Skip to content

Commit fea55e9

Browse files
Jami CogswellJami Cogswell
authored andcommitted
Java: move query logic to qll file and add subset restriction for top500 jdk apis
1 parent 2b9daed commit fea55e9

File tree

2 files changed

+91
-63
lines changed

2 files changed

+91
-63
lines changed

java/ql/src/Metrics/Summaries/GeneratedVsManualCoverage.ql

Lines changed: 7 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -7,71 +7,15 @@
77
*/
88

99
import java
10-
import semmle.code.java.dataflow.FlowSummary
11-
import utils.modelgenerator.internal.CaptureModels
12-
13-
/**
14-
* Returns the number of `DataFlowTargetApi`s with Summary MaD models
15-
* for a given package and provenance.
16-
*/
17-
bindingset[package]
18-
private int getNumMadModeledApis(string package, string provenance) {
19-
provenance in ["generated", "manual", "both"] and
20-
result =
21-
count(SummarizedCallable sc |
22-
package = sc.asCallable().getCompilationUnit().getPackage().getName() and
23-
sc.asCallable() instanceof DataFlowTargetApi and
24-
(
25-
// "auto-only"
26-
sc.isAutoGenerated() and
27-
provenance = "generated"
28-
or
29-
sc.isManual() and
30-
(
31-
if sc.hasProvenance(["generated", "ai-generated"])
32-
then
33-
// "both"
34-
provenance = "both"
35-
else
36-
// "manual-only"
37-
provenance = "manual"
38-
)
39-
)
40-
)
41-
}
42-
43-
/** Returns the total number of `DataFlowTargetApi`s for a given package. */
44-
private int getNumApis(string package) {
45-
result =
46-
strictcount(DataFlowTargetApi dataFlowTargApi |
47-
package = dataFlowTargApi.getCompilationUnit().getPackage().getName()
48-
)
49-
}
10+
import GeneratedVsManualCoverageQuery
5011

5112
from
52-
string package, int generatedOnly, int both, int manualOnly, int generated, int manual, int non,
53-
int all, float coverage, float generatedCoverage, float manualCoverage,
54-
float manualCoveredByGenerated, float generatedCoveredByManual, float match
13+
string package, int generatedOnly, int both, int manualOnly, int non, int all, float coverage,
14+
float generatedCoverage, float manualCoverage, float manualCoveredByGenerated,
15+
float generatedCoveredByManual, float match
5516
where
56-
// count the number of APIs with generated-only, both, and manual-only MaD models for each package
57-
generatedOnly = getNumMadModeledApis(package, "generated") and
58-
both = getNumMadModeledApis(package, "both") and
59-
manualOnly = getNumMadModeledApis(package, "manual") and
60-
// calculate the total generated and total manual numbers
61-
generated = generatedOnly + both and
62-
manual = manualOnly + both and
63-
// count the total number of `DataFlowTargetApi`s for each package
64-
all = getNumApis(package) and
65-
non = all - (generatedOnly + both + manualOnly) and
66-
// Proportion of coverage
67-
coverage = (generatedOnly + both + manualOnly).(float) / all and
68-
generatedCoverage = generated.(float) / all and
69-
manualCoverage = manual.(float) / all and
70-
// Proportion of manual models covered by generated ones
71-
manualCoveredByGenerated = both.(float) / (both + manualOnly) and
72-
// Proportion of generated models covered by manual ones
73-
generatedCoveredByManual = both.(float) / (both + generatedOnly) and
74-
// Proportion of data points that match
75-
match = (both.(float) + non) / all
17+
modelCoverageGenVsMan(package, generatedOnly, both, manualOnly, non, all, coverage,
18+
generatedCoverage, manualCoverage, manualCoveredByGenerated, generatedCoveredByManual, match,
19+
"allApis")
7620
select package, generatedOnly, both, manualOnly, non, all, coverage, generatedCoverage,
7721
manualCoverage, manualCoveredByGenerated, generatedCoveredByManual, match order by package
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
private import semmle.code.java.dataflow.FlowSummary
2+
private import utils.modelgenerator.internal.CaptureModels
3+
//java/ql/src/utils/modelgenerator/internal/CaptureModels.qll
4+
private import TopJdkApis
5+
6+
/**
7+
* Returns the number of `DataFlowTargetApi`s with Summary MaD models
8+
* for a given package and provenance.
9+
*/
10+
bindingset[package, apiSubset]
11+
private int getNumMadModeledApis(string package, string provenance, string apiSubset) {
12+
provenance in ["generated", "manual", "both"] and
13+
result =
14+
count(SummarizedCallable sc |
15+
callableSubset(sc.asCallable(), apiSubset) and
16+
package = sc.asCallable().getCompilationUnit().getPackage().getName() and
17+
sc.asCallable() instanceof DataFlowTargetApi and
18+
(
19+
// "auto-only"
20+
sc.isAutoGenerated() and
21+
provenance = "generated"
22+
or
23+
sc.isManual() and
24+
(
25+
if sc.hasProvenance(["generated", "ai-generated"])
26+
then
27+
// "both"
28+
provenance = "both"
29+
else
30+
// "manual-only"
31+
provenance = "manual"
32+
)
33+
)
34+
)
35+
}
36+
37+
/** Returns the total number of `DataFlowTargetApi`s for a given package. */
38+
private int getNumApis(string package, string apiSubset) {
39+
result =
40+
strictcount(DataFlowTargetApi dataFlowTargApi |
41+
callableSubset(dataFlowTargApi, apiSubset) and
42+
package = dataFlowTargApi.getCompilationUnit().getPackage().getName()
43+
)
44+
}
45+
46+
/** TODO */
47+
private predicate callableSubset(Callable callable, string apiSubset) {
48+
apiSubset in ["topJdkApis", "allApis"] and
49+
(
50+
if apiSubset = "topJdkApis"
51+
then exists(TopJdkApi topJdkApi | callable = topJdkApi.asCallable())
52+
else apiSubset = "allApis"
53+
)
54+
}
55+
56+
/** TODO */
57+
predicate modelCoverageGenVsMan(
58+
string package, int generatedOnly, int both, int manualOnly, int non, int all, float coverage,
59+
float generatedCoverage, float manualCoverage, float manualCoveredByGenerated,
60+
float generatedCoveredByManual, float match, string apiSubset
61+
) {
62+
exists(int generated, int manual |
63+
// count the number of APIs with generated-only, both, and manual-only MaD models for each package
64+
generatedOnly = getNumMadModeledApis(package, "generated", apiSubset) and
65+
both = getNumMadModeledApis(package, "both", apiSubset) and
66+
manualOnly = getNumMadModeledApis(package, "manual", apiSubset) and
67+
// calculate the total generated and total manual numbers
68+
generated = generatedOnly + both and
69+
manual = manualOnly + both and
70+
// count the total number of `DataFlowTargetApi`s for each package
71+
all = getNumApis(package, apiSubset) and
72+
non = all - (generatedOnly + both + manualOnly) and
73+
// Proportion of coverage
74+
coverage = (generatedOnly + both + manualOnly).(float) / all and
75+
generatedCoverage = generated.(float) / all and
76+
manualCoverage = manual.(float) / all and
77+
// Proportion of manual models covered by generated ones
78+
manualCoveredByGenerated = both.(float) / (both + manualOnly) and
79+
// Proportion of generated models covered by manual ones
80+
generatedCoveredByManual = both.(float) / (both + generatedOnly) and
81+
// Proportion of data points that match
82+
match = (both.(float) + non) / all
83+
)
84+
}

0 commit comments

Comments
 (0)