@@ -114,19 +114,28 @@ class ExternalApi extends DotNet::Callable {
114114int resultLimit ( ) { result = 1000 }
115115
116116/**
117- * Holds if the relevant usage count of api with `apiInfo` is `usages `.
117+ * Holds if it is relevant to count usages of `api `.
118118 */
119- signature predicate relevantUsagesSig ( string apiInfo , int usages ) ;
119+ signature predicate relevantApi ( ExternalApi api ) ;
120120
121121/**
122122 * Given a predicate to count relevant API usages, this module provides a predicate
123123 * for restricting the number or returned results based on a certain limit.
124124 */
125- module Results< relevantUsagesSig / 2 getRelevantUsages> {
125+ module Results< relevantApi / 1 getRelevantUsages> {
126+ private int getUsages ( string apiInfo ) {
127+ result =
128+ strictcount ( DispatchCall c , ExternalApi api |
129+ c = api .getACall ( ) and
130+ apiInfo = api .getInfo ( ) and
131+ getRelevantUsages ( api )
132+ )
133+ }
134+
126135 private int getOrder ( string apiInfo ) {
127136 apiInfo =
128137 rank [ result ] ( string info , int usages |
129- getRelevantUsages ( info , usages )
138+ usages = getUsages ( info )
130139 |
131140 info order by usages desc , info
132141 )
@@ -137,6 +146,7 @@ module Results<relevantUsagesSig/2 getRelevantUsages> {
137146 * and if it is in the top results (guarded by resultLimit).
138147 */
139148 predicate restrict ( string apiInfo , int usages ) {
140- getRelevantUsages ( apiInfo , usages ) and getOrder ( apiInfo ) <= resultLimit ( )
149+ usages = getUsages ( apiInfo ) and
150+ getOrder ( apiInfo ) <= resultLimit ( )
141151 }
142152}
0 commit comments