diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-04-22 10:34:46 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-04-22 10:34:46 +0200 |
commit | dd23d7460c2cf3d223f9f9f1faebc52aa57f690d (patch) | |
tree | 888ec71704c69c236c34e0a54ad6f2e1e57bef32 | |
parent | d86d6ff045725bb313ca68652f76ec7f1f82714f (diff) | |
parent | 0f231979ce6d35e3e9ec4773904cf763a1d9aac4 (diff) |
Merge branch 'submits-limit'
-rw-r--r-- | src/cli.rs | 8 | ||||
-rw-r--r-- | src/commands/db.rs | 80 |
2 files changed, 50 insertions, 38 deletions
@@ -193,6 +193,14 @@ pub fn cli<'a>() -> App<'a> { .about("Only list submits that had the root package PKG") .conflicts_with("with_pkg") ) + .arg(Arg::new("limit") + .required(false) + .multiple(false) + .long("limit") + .takes_value(true) + .value_name("LIMIT") + .about("Only list LIMIT submits") + ) ) .subcommand(App::new("jobs") diff --git a/src/commands/db.rs b/src/commands/db.rs index 0481ab1..a4f9f3e 100644 --- a/src/commands/db.rs +++ b/src/commands/db.rs @@ -302,9 +302,50 @@ fn submit(conn_cfg: DbConnectionConfig, matches: &ArgMatches) -> Result<()> { fn submits(conn_cfg: DbConnectionConfig, matches: &ArgMatches) -> Result<()> { let csv = matches.is_present("csv"); + let limit = matches.value_of("limit").map(i64::from_str).transpose()?; let hdrs = crate::commands::util::mk_header(vec!["id", "time", "uuid"]); let conn = crate::db::establish_connection(conn_cfg)?; + let query = schema::submits::table + .order_by(schema::submits::id.desc()); // required for the --limit implementation + + let submits = if let Some(pkgname) = matches.value_of("with_pkg").map(String::from) { + // Get all submits which included the package, but were not necessarily made _for_ the package + let query = query + .inner_join(schema::jobs::table) + .inner_join(schema::packages::table.on(schema::jobs::package_id.eq(schema::packages::id))) + .filter(schema::packages::name.eq(&pkgname)) + .into_boxed(); + + if let Some(limit) = limit { + query.limit(limit) + } else { + query + } + .select(schema::submits::all_columns) + .load::<models::Submit>(&conn)? + } else if let Some(pkgname) = matches.value_of("for_pkg") { + // Get all submits _for_ the package + let query = query + .inner_join({ + schema::packages::table.on(schema::submits::requested_package_id.eq(schema::packages::id)) + }) + .filter(schema::packages::dsl::name.eq(&pkgname)) + .into_boxed(); + + if let Some(limit) = limit { + query.limit(limit) + } else { + query + } + .select(schema::submits::all_columns) + .load::<models::Submit>(&conn)? + } else if let Some(limit) = limit { + query.limit(limit).load::<models::Submit>(&conn)? + } else { + query.load::<models::Submit>(&conn)? + }; + // Helper to map Submit -> Vec<String> let submit_to_vec = |submit: models::Submit| { vec![ @@ -314,44 +355,7 @@ fn submits(conn_cfg: DbConnectionConfig, matches: &ArgMatches) -> Result<()> { ] }; - // Helper to get all submits that were made _for_ a package - let submits_for = |pkgname: &str| { - schema::submits::table - .inner_join(schema::packages::table) - .filter(schema::packages::dsl::name.eq(&pkgname)) - .select(schema::submits::all_columns) - .load::<models::Submit>(&conn) - }; - - let data = if let Some(pkgname) = matches.value_of("with_pkg").map(String::from) { - // Get all submits which included the package, but were not made _for_ the package - let submits_with_pkg = schema::packages::table - .filter(schema::packages::name.eq(&pkgname)) - .inner_join(schema::jobs::table.inner_join(schema::submits::table)) - .select(schema::submits::all_columns) - .load::<models::Submit>(&conn)?; - - let submits_for_pkg = submits_for(&pkgname)?; - - submits_with_pkg - .into_iter() - .chain(submits_for_pkg.into_iter()) - .map(submit_to_vec) - .collect::<Vec<_>>() - } else if let Some(pkgname) = matches.value_of("for_pkg") { - // Get all submits _for_ the package - submits_for(pkgname)? - .into_iter() - .map(submit_to_vec) - .collect::<Vec<_>>() - } else { - // default: Get all submits - schema::submits::table - .load::<models::Submit>(&conn)? - .into_iter() - .map(submit_to_vec) - .collect::<Vec<_>>() - }; + let data = submits.into_iter().rev().map(submit_to_vec).collect::<Vec<_>>(); if data.is_empty() { info!("No submits in database"); |