@@ -46,42 +46,89 @@ Future<void> upload30DaysTotal(Map<String, int> counts) async {
4646 jsonUtf8Encoder.convert (counts));
4747}
4848
49- Future <WeeklyDownloadCounts ?> getWeeklyDownloads (String package) async {
49+ Future <WeeklyDownloadCounts ?> getWeeklyTotalDownloads (String package) async {
5050 return (await cache.weeklyDownloadCounts (package).get (() async {
51- final wdc = await computeWeeklyDownloads (package);
52- if (wdc.newestDate == null ) {
53- return null ;
54- }
55- return WeeklyDownloadCounts (
56- weeklyDownloads: wdc.weeklyDownloads, newestDate: wdc.newestDate! );
51+ return computeWeeklyTotalDownloads (package);
52+ }));
53+ }
54+
55+ Future <WeeklyVersionsDownloadCounts ?> getWeeklyVersionsDownloads (
56+ String package) async {
57+ return (await cache.weeklyVersionsDownloadCounts (package).get (() async {
58+ return computeWeeklyVersionsDownloads (package);
5759 }));
5860}
5961
60- /// Computes `weeklyDownloads` starting from `newestDate` for [package] .
62+ /// Computes weekly downloads starting from `newestDate` for [package] and 52
63+ /// weeks back.
6164///
62- /// Each number in ` weeklyDownloads` is the total number of downloads for
65+ /// Each number in weeklyDownloads` is the total number of downloads for
6366/// a given 7 day period starting from the newest date with download counts
6467/// data available.
65- Future <({List <int > weeklyDownloads, DateTime ? newestDate})>
66- computeWeeklyDownloads (String package) async {
67- final weeklyDownloads = List .filled (52 , 0 );
68+ Future <WeeklyDownloadCounts ?> computeWeeklyTotalDownloads (
69+ String package) async {
6870 final countData =
6971 await downloadCountsBackend.lookupDownloadCountData (package);
7072 if (countData == null ) {
71- return (weeklyDownloads : < int > [], newestDate : null ) ;
73+ return null ;
7274 }
7375
74- final totals = countData.totalCounts;
76+ return WeeklyDownloadCounts (
77+ weeklyDownloads: _computeWeeklyCounts (countData.totalCounts),
78+ newestDate: countData.newestDate! );
79+ }
7580
81+ /// Computes weekly downloads starting from `newestDate` for [package] and 52
82+ /// weeks back for all stored major, minor, and patch version ranges and total
83+ /// downloads.
84+ Future <WeeklyVersionsDownloadCounts ?> computeWeeklyVersionsDownloads (
85+ String package) async {
86+ final countData =
87+ await downloadCountsBackend.lookupDownloadCountData (package);
88+ if (countData == null ) return null ;
89+
90+ final majorRangeWeeklyCounts = < VersionRangeCount > [];
91+ countData.majorRangeCounts.forEach ((vrc) {
92+ majorRangeWeeklyCounts.add ((
93+ counts: _computeWeeklyCounts (vrc.counts),
94+ versionRange: vrc.versionRange
95+ ));
96+ });
97+ final minorRangeWeeklyCounts = < VersionRangeCount > [];
98+ countData.minorRangeCounts.forEach ((vrc) {
99+ minorRangeWeeklyCounts.add ((
100+ counts: _computeWeeklyCounts (vrc.counts),
101+ versionRange: vrc.versionRange
102+ ));
103+ });
104+ final patchRangeWeeklyCounts = < VersionRangeCount > [];
105+ countData.patchRangeCounts.forEach ((vrc) {
106+ patchRangeWeeklyCounts.add ((
107+ counts: _computeWeeklyCounts (vrc.counts),
108+ versionRange: vrc.versionRange
109+ ));
110+ });
111+
112+ final weeklyTotalCounts = _computeWeeklyCounts (countData.totalCounts);
113+
114+ return WeeklyVersionsDownloadCounts (
115+ newestDate: countData.newestDate! ,
116+ majorRangeWeeklyDownloads: majorRangeWeeklyCounts,
117+ minorRangeWeeklyDownloads: minorRangeWeeklyCounts,
118+ patchRangeWeeklyDownloads: patchRangeWeeklyCounts,
119+ totalWeeklyDownloads: weeklyTotalCounts);
120+ }
121+
122+ List <int > _computeWeeklyCounts (List <int > dailyCounts) {
123+ final weeklyCounts = List .filled (52 , 0 );
76124 for (int w = 0 ; w < 52 ; w++ ) {
77125 var sum = 0 ;
78126 for (int d = 0 ; d < 7 ; d++ ) {
79- if (totals [w * 7 + d] > 0 ) {
80- sum += totals [w * 7 + d];
127+ if (dailyCounts [w * 7 + d] > 0 ) {
128+ sum += dailyCounts [w * 7 + d];
81129 }
82130 }
83- weeklyDownloads [w] = sum;
131+ weeklyCounts [w] = sum;
84132 }
85-
86- return (weeklyDownloads: weeklyDownloads, newestDate: countData.newestDate! );
133+ return weeklyCounts;
87134}
0 commit comments