Skip to content

Commit 691a8fd

Browse files
authored
Save trend scores as doubles (dart-lang#8757)
1 parent 29bd04d commit 691a8fd

File tree

5 files changed

+45
-41
lines changed

5 files changed

+45
-41
lines changed

app/lib/fake/backend/fake_download_counts.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ Future<void> generateFake30DaysTotals(Map<String, int> totals) async {
4949
downloadCounts30DaysTotalsFileName, jsonUtf8Encoder.convert(totals));
5050
}
5151

52-
Future<void> generateFakeTrendScores(Map<String, int> totals) async {
52+
Future<void> generateFakeTrendScores(Map<String, double> trends) async {
5353
await storageService
5454
.bucket(activeConfiguration.reportsBucketName!)
55-
.writeBytesWithRetry(trendScoreFileName, jsonUtf8Encoder.convert(totals));
55+
.writeBytesWithRetry(trendScoreFileName, jsonUtf8Encoder.convert(trends));
5656
}

app/lib/search/search_service.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class PackageDocument {
7979
/// The normalized score between [0.0-1.0] (1.0 being the most downloaded package).
8080
double? downloadScore;
8181

82-
final int trendScore;
82+
final double trendScore;
8383

8484
final int likeCount;
8585

@@ -112,7 +112,7 @@ class PackageDocument {
112112
List<String>? tags,
113113
int? downloadCount,
114114
this.downloadScore,
115-
int? trendScore,
115+
double? trendScore,
116116
int? likeCount,
117117
this.likeScore,
118118
int? grantedPoints,

app/lib/search/search_service.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/lib/service/download_counts/backend.dart

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -31,42 +31,44 @@ class DownloadCountsBackend {
3131
late CachedValue<Map<String, int>> _thirtyDaysTotals;
3232
var _lastDownloadsData = (data: <String, int>{}, etag: '');
3333

34-
late CachedValue<Map<String, int>> _trendScores;
35-
var _lastTrendData = (data: <String, int>{}, etag: '');
34+
late CachedValue<Map<String, double>> _trendScores;
35+
var _lastTrendData = (data: <String, double>{}, etag: '');
3636

3737
DownloadCountsBackend(this._db) {
38-
_thirtyDaysTotals = CachedValue(
38+
_thirtyDaysTotals = CachedValue<Map<String, int>>(
3939
name: 'thirtyDaysTotalDownloadCounts',
4040
maxAge: Duration(days: 14),
4141
interval: Duration(minutes: 30),
4242
updateFn: _updateThirtyDaysTotals);
43-
_trendScores = CachedValue(
43+
_trendScores = CachedValue<Map<String, double>>(
4444
name: 'trendScores',
4545
maxAge: Duration(days: 14),
4646
interval: Duration(minutes: 30),
4747
updateFn: _updateTrendScores);
4848
}
4949

5050
Future<Map<String, int>> _updateThirtyDaysTotals() async {
51-
return _fetchAndUpdateCachedData(
52-
fileName: downloadCounts30DaysTotalsFileName,
53-
currentCachedData: _lastDownloadsData,
54-
updateCache: (data) => _lastDownloadsData = data,
55-
errorContext: '30-days total download counts');
51+
return _fetchAndUpdateCachedData<int>(
52+
fileName: downloadCounts30DaysTotalsFileName,
53+
currentCachedData: _lastDownloadsData,
54+
updateCache: (data) => _lastDownloadsData = data,
55+
errorContext: '30-days total download counts',
56+
);
5657
}
5758

58-
Future<Map<String, int>> _updateTrendScores() async {
59-
return _fetchAndUpdateCachedData(
60-
fileName: trendScoreFileName,
61-
currentCachedData: _lastTrendData,
62-
updateCache: (data) => _lastTrendData = data,
63-
errorContext: 'trend scores');
59+
Future<Map<String, double>> _updateTrendScores() async {
60+
return _fetchAndUpdateCachedData<double>(
61+
fileName: trendScoreFileName,
62+
currentCachedData: _lastTrendData,
63+
updateCache: (data) => _lastTrendData = data,
64+
errorContext: 'trend scores',
65+
);
6466
}
6567

66-
Future<Map<String, int>> _fetchAndUpdateCachedData({
68+
Future<Map<String, V>> _fetchAndUpdateCachedData<V>({
6769
required String fileName,
68-
required ({Map<String, int> data, String etag}) currentCachedData,
69-
required void Function(({Map<String, int> data, String etag}) newData)
70+
required ({Map<String, V> data, String etag}) currentCachedData,
71+
required void Function(({Map<String, V> data, String etag}) newData)
7072
updateCache,
7173
required String errorContext,
7274
}) async {
@@ -89,7 +91,7 @@ class DownloadCountsBackend {
8991
.single,
9092
);
9193

92-
final data = _parseJsonToMapStringInt(rawData, fileName);
94+
final data = _parseJsonToMapStringV<V>(rawData, fileName);
9395

9496
final newData = (data: data, etag: info.etag);
9597
updateCache(newData);
@@ -109,23 +111,25 @@ class DownloadCountsBackend {
109111
}
110112
}
111113

112-
Map<String, int> _parseJsonToMapStringInt(dynamic rawJson, String fileName) {
114+
Map<String, V> _parseJsonToMapStringV<V>(dynamic rawJson, String fileName) {
113115
if (rawJson is! Map) {
114-
throw FormatException(
115-
'Expected JSON for $fileName to be a Map, but got ${rawJson.runtimeType}');
116+
throw FormatException('Expected JSON for $fileName to be a Map, but got'
117+
' ${rawJson.runtimeType}');
116118
}
117119

118-
final Map<String, int> result = {};
120+
final Map<String, V> result = {};
119121
for (final entry in rawJson.entries) {
120122
if (entry.key is! String) {
121123
throw FormatException(
122-
'Expected map keys for $fileName to be String, but found ${entry.key.runtimeType}');
124+
'Expected map keys for $fileName to be String, but found'
125+
' ${entry.key.runtimeType}');
123126
}
124-
if (entry.value is! int) {
127+
if (entry.value is! V) {
125128
throw FormatException(
126-
'Expected map value for key "${entry.key}" in $fileName to be int, but got ${entry.value.runtimeType}');
129+
'Expected map value for key "${entry.key}" in $fileName to be'
130+
' ${V.runtimeType}, but got ${entry.value.runtimeType}');
127131
}
128-
result[entry.key as String] = entry.value as int;
132+
result[entry.key as String] = entry.value as V;
129133
}
130134
return result;
131135
}
@@ -143,7 +147,7 @@ class DownloadCountsBackend {
143147
int? lookup30DaysTotalCounts(String package) =>
144148
_thirtyDaysTotals.isAvailable ? _thirtyDaysTotals.value![package] : null;
145149

146-
int? lookupTrendScore(String package) =>
150+
double? lookupTrendScore(String package) =>
147151
_trendScores.isAvailable ? _trendScores.value![package] : null;
148152

149153
Future<CountData?> lookupDownloadCountData(String pkg) async {

app/test/service/download_counts/computations_test.dart

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -339,22 +339,22 @@ void main() {
339339
});
340340

341341
testWithProfile('cache package trend scores', fn: () async {
342-
await generateFakeTrendScores({'foo': 3, 'bar': 1, 'baz': 2});
342+
await generateFakeTrendScores({'foo': 3.0, 'bar': 1.0, 'baz': 2.0});
343343
expect(downloadCountsBackend.lookupTrendScore('foo'), isNull);
344344
expect(downloadCountsBackend.lookupTrendScore('bar'), isNull);
345345
expect(downloadCountsBackend.lookupTrendScore('baz'), isNull);
346346

347347
await downloadCountsBackend.start();
348-
expect(downloadCountsBackend.lookupTrendScore('foo'), 3);
349-
expect(downloadCountsBackend.lookupTrendScore('bar'), 1);
350-
expect(downloadCountsBackend.lookupTrendScore('baz'), 2);
348+
expect(downloadCountsBackend.lookupTrendScore('foo'), 3.0);
349+
expect(downloadCountsBackend.lookupTrendScore('bar'), 1.0);
350+
expect(downloadCountsBackend.lookupTrendScore('baz'), 2.0);
351351
expect(downloadCountsBackend.lookupTrendScore('bax'), isNull);
352352

353-
await generateFakeTrendScores({'foo': 9, 'bar': 2, 'baz': 5});
353+
await generateFakeTrendScores({'foo': 9.0, 'bar': 2.0, 'baz': 5.0});
354354
await downloadCountsBackend.start();
355-
expect(downloadCountsBackend.lookupTrendScore('foo'), 9);
356-
expect(downloadCountsBackend.lookupTrendScore('bar'), 2);
357-
expect(downloadCountsBackend.lookupTrendScore('baz'), 5);
355+
expect(downloadCountsBackend.lookupTrendScore('foo'), 9.0);
356+
expect(downloadCountsBackend.lookupTrendScore('bar'), 2.0);
357+
expect(downloadCountsBackend.lookupTrendScore('baz'), 5.0);
358358
expect(downloadCountsBackend.lookupTrendScore('bax'), isNull);
359359
});
360360
}

0 commit comments

Comments
 (0)