Skip to content

Commit e6e2427

Browse files
committed
Java: Add parameterized module for restricting the number of returned results in telemetry queries.
1 parent e3ecc5a commit e6e2427

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

java/ql/src/Telemetry/ExternalApi.qll

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,36 @@ class ExternalApi extends Callable {
9898

9999
/** DEPRECATED: Alias for ExternalApi */
100100
deprecated class ExternalAPI = ExternalApi;
101+
102+
/**
103+
* A limit for the number of results produced by a telemetry query.
104+
*/
105+
int resultLimit() { result = 1000 }
106+
107+
/**
108+
* A predicate signature for relevant usage counts of an External API `api`.
109+
*/
110+
signature predicate relevantUsagesSig(ExternalApi api, int usages);
111+
112+
/**
113+
* Given a predicate to count relevant API usages, this module provides a predicate
114+
* for restricting the number or returned results based on a certain limit.
115+
*/
116+
module Results<relevantUsagesSig/2 getRelevantUsages> {
117+
private int getOrder(ExternalApi api) {
118+
api =
119+
rank[result](ExternalApi a, int usages |
120+
getRelevantUsages(a, usages)
121+
|
122+
a order by usages desc, a.getApiName()
123+
)
124+
}
125+
126+
/**
127+
* Holds if `api` is being used `usages` times and if it is
128+
* in the top results (guarded by resultLimit).
129+
*/
130+
predicate restrict(ExternalApi api, int usages) {
131+
getRelevantUsages(api, usages) and getOrder(api) <= resultLimit()
132+
}
133+
}

0 commit comments

Comments
 (0)