process natures and ev spreads

This commit is contained in:
mehbark 2025-07-28 01:03:50 -04:00
parent e87753361d
commit 9c97c3f3ed

View file

@ -17,7 +17,7 @@ fn main() {
if let Err(e) = run(config) { if let Err(e) = run(config) {
log::error!("{e}"); log::error!("{e}");
process::exit(1); process::exit(1);
}; }
} }
fn run( fn run(
@ -27,7 +27,10 @@ fn run(
}: Config, }: Config,
) -> Result<(), AppError> { ) -> Result<(), AppError> {
if fs::exists(&output_file)? { if fs::exists(&output_file)? {
log::warn!("{output_file:?} already exists: creating the db will probably fail"); log::warn!(
"{} already exists: creating the db will probably fail",
output_file.display()
);
} }
// parsing the stats is slow but doing it first avoids creating empty tables // parsing the stats is slow but doing it first avoids creating empty tables
@ -80,41 +83,47 @@ fn create_tables(conn: &mut Connection) -> rusqlite::Result<()> {
" "
BEGIN; BEGIN;
CREATE TABLE mon ( CREATE TABLE mon (
name STRING NOT NULL, name TEXT NOT NULL,
usage REAL, usage REAL,
viability_ceiling REAL viability_ceiling REAL
); );
CREATE TABLE ability ( CREATE TABLE ability (
mon STRING NOT NULL, mon TEXT NOT NULL,
name STRING NOT NULL, name TEXT NOT NULL,
usage REAL NOT NULL usage REAL NOT NULL
); );
CREATE TABLE move ( CREATE TABLE move (
mon STRING NOT NULL, mon TEXT NOT NULL,
name STRING NOT NULL, name TEXT NOT NULL,
usage REAL NOT NULL usage REAL NOT NULL
); );
CREATE TABLE item ( CREATE TABLE item (
mon STRING NOT NULL, mon TEXT NOT NULL,
name STRING NOT NULL, name TEXT NOT NULL,
usage REAL NOT NULL usage REAL NOT NULL
); );
CREATE TABLE tera ( CREATE TABLE tera (
mon STRING NOT NULL, mon TEXT NOT NULL,
type STRING NOT NULL, type TEXT NOT NULL,
usage REAL NOT NULL usage REAL NOT NULL
); );
CREATE TABLE team ( CREATE TABLE team (
mon STRING NOT NULL, mon TEXT NOT NULL,
mate STRING NOT NULL, mate TEXT NOT NULL,
usage REAL NOT NULL usage REAL NOT NULL
); );
CREATE TABLE cc ( CREATE TABLE cc (
mon STRING NOT NULL, mon TEXT NOT NULL,
opp STRING NOT NULL, opp TEXT NOT NULL,
percentage REAL NOT NULL, percentage REAL NOT NULL,
stddev REAL NOT NULL stddev REAL NOT NULL
); );
CREATE TABLE spread (
mon TEXT NOT NULL,
nature TEXT NOT NULL,
evs TEXT NOT NULL,
usage REAL NOT NULL
);
COMMIT; COMMIT;
", ",
) )
@ -195,6 +204,14 @@ fn insert_stats(conn: &mut Connection, stats: &Stats) -> rusqlite::Result<()> {
(mon, opp, percentage, stddev), (mon, opp, percentage, stddev),
)?; )?;
} }
for (spread, usage) in &data.spreads {
let (nature, evs) = spread.split_once(':').unwrap();
tx.execute(
"INSERT INTO spread VALUES (?1, ?2, ?3, ?4)",
(mon, nature, evs, usage / mon_count),
)?;
}
} }
tx.commit()?; tx.commit()?;
Ok(()) Ok(())
@ -258,4 +275,5 @@ struct Data {
checks_and_counters: HashMap<Box<str>, (f32, f32, f32)>, checks_and_counters: HashMap<Box<str>, (f32, f32, f32)>,
#[serde(rename = "usage")] #[serde(rename = "usage")]
usage: Option<f32>, usage: Option<f32>,
spreads: Counts,
} }