diff options
-rw-r--r-- | src/cli.rs | 8 | ||||
-rw-r--r-- | src/commands/db.rs | 59 |
2 files changed, 54 insertions, 13 deletions
@@ -255,6 +255,14 @@ pub fn cli<'a>() -> App<'a> { .value_name("HASH") .about("Limit listed submits to one commit hash") ) + .arg(Arg::new("image") + .required(false) + .multiple(false) + .long("image") + .takes_value(true) + .value_name("IMAGE") + .about("Limit listed submits to submits on IMAGE") + ) ) .subcommand(App::new("jobs") diff --git a/src/commands/db.rs b/src/commands/db.rs index f3a6721..28ebb07 100644 --- a/src/commands/db.rs +++ b/src/commands/db.rs @@ -334,13 +334,14 @@ 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!["Time", "UUID"]); + let hdrs = crate::commands::util::mk_header(vec!["Time", "UUID", "For Package", "For Package Version"]); let conn = conn_cfg.establish_connection()?; let commit = matches.value_of("for-commit"); let query = schema::submits::table .order_by(schema::submits::id.desc()) // required for the --limit implementation .inner_join(schema::githashes::table.on(schema::submits::repo_hash_id.eq(schema::githashes::id))) + .inner_join(schema::images::table) .into_boxed(); let query = if let Some(commithash) = commit.as_ref() { @@ -349,20 +350,43 @@ fn submits(conn_cfg: DbConnectionConfig<'_>, matches: &ArgMatches) -> Result<()> query }; + let query = if let Some(image) = matches.value_of("image") { + query.filter(schema::images::name.eq(image)) + } else { + query + }; + let submits = if let Some(pkgname) = matches.value_of("with_pkg").map(String::from) { + // In the case of a with_pkg command, we must execute two queries on the database, as the + // diesel framework does not yet support aliases for queries (see + // https://github.com/diesel-rs/diesel/pull/2254). + // This is due to the fact that we need to join the packages table twice, once to filter + // out all submits that did not include the "with pkg" and once to join the requested + // package for the output. + // 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)); - if let Some(limit) = limit { + let query = if let Some(limit) = limit { query.limit(limit) } else { query - } - .select(schema::submits::all_columns) - .load::<models::Submit>(&conn)? + }; + + // Only load the IDs of the submits, so we can later use them to filter the submits + let submit_ids = query.select(schema::submits::id).load::<i32>(&conn)?; + + schema::submits::table + .order_by(schema::submits::id.desc()) // required for the --limit implementation + .inner_join({ + schema::packages::table.on(schema::submits::requested_package_id.eq(schema::packages::id)) + }) + .filter(schema::submits::id.eq_any(submit_ids)) + .select((schema::submits::all_columns, schema::packages::all_columns)) + .load::<(models::Submit, models::Package)>(&conn)? } else if let Some(pkgname) = matches.value_of("for_pkg") { // Get all submits _for_ the package let query = query @@ -376,22 +400,31 @@ fn submits(conn_cfg: DbConnectionConfig<'_>, matches: &ArgMatches) -> Result<()> } else { query } - .select(schema::submits::all_columns) - .load::<models::Submit>(&conn)? + .select((schema::submits::all_columns, schema::packages::all_columns)) + .load::<(models::Submit, models::Package)>(&conn)? } else if let Some(limit) = limit { - query.select(schema::submits::all_columns) + query + .inner_join({ + schema::packages::table.on(schema::submits::requested_package_id.eq(schema::packages::id)) + }) + .select((schema::submits::all_columns, schema::packages::all_columns)) .limit(limit) - .load::<models::Submit>(&conn)? + .load::<(models::Submit, models::Package)>(&conn)? } else { - query.select(schema::submits::all_columns) - .load::<models::Submit>(&conn)? + query.inner_join({ + schema::packages::table.on(schema::submits::requested_package_id.eq(schema::packages::id)) + }) + .select((schema::submits::all_columns, schema::packages::all_columns)) + .load::<(models::Submit, models::Package)>(&conn)? }; - // Helper to map Submit -> Vec<String> - let submit_to_vec = |submit: models::Submit| { + // Helper to map (Submit, Package) -> Vec<String> + let submit_to_vec = |(submit, package): (models::Submit, models::Package)| { vec![ submit.submit_time.to_string(), submit.uuid.to_string(), + package.name, + package.version, ] }; |