crate_downloads/crate-downloads.rs
1//! $ cargo run --release --example crate-downloads
2//!
3//! Computes time series of downloads of one specific crate.
4
5use chrono::Utc;
6use db_dump::Date;
7use std::collections::{BTreeMap as Map, BTreeSet as Set};
8
9const CRATE: &str = "syn";
10
11fn main() -> db_dump::Result<()> {
12 let mut crate_id = None;
13 let mut versions = Vec::new();
14 let mut version_downloads = Vec::new();
15 db_dump::Loader::new()
16 .crates(|row| {
17 if row.name == CRATE {
18 crate_id = Some(row.id);
19 }
20 })
21 .versions(|row| versions.push(row))
22 .version_downloads(|row| version_downloads.push(row))
23 .load("./db-dump.tar.gz")?;
24
25 // Crate id of the crate we care about.
26 let crate_id = crate_id.expect("no such crate");
27
28 // Set of all version ids corresponding to that crate.
29 let mut version_ids = Set::new();
30 for version in versions {
31 if version.crate_id == crate_id {
32 version_ids.insert(version.id);
33 }
34 }
35
36 // Add up downloads across all version of the crate by day.
37 let mut downloads = Map::<Date<Utc>, u64>::new();
38 for stat in version_downloads {
39 if version_ids.contains(&stat.version_id) {
40 *downloads.entry(stat.date).or_default() += stat.downloads;
41 }
42 }
43
44 for (date, count) in downloads {
45 println!("{},{}", date, count);
46 }
47
48 Ok(())
49}