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}