diff options
author | Matthias Beyer <matthias.beyer@atos.net> | 2021-09-09 08:05:58 +0200 |
---|---|---|
committer | Matthias Beyer <matthias.beyer@atos.net> | 2021-09-09 08:35:07 +0200 |
commit | dafbc6eec80830d18c7f6f20b3db96edc4fb1b88 (patch) | |
tree | d1bc5132daa7026788dbe05b7a2db92c218d3ca3 /src/commands | |
parent | 910af91c2eb5d58b9fdf0317ba086c4ed687d690 (diff) |
Add package name/version output in "db submits" command
Signed-off-by: Matthias Beyer <matthias.beyer@atos.net>
Tested-by: Matthias Beyer <matthias.beyer@atos.net>
Diffstat (limited to 'src/commands')
-rw-r--r-- | src/commands/db.rs | 52 |
1 files changed, 39 insertions, 13 deletions
diff --git a/src/commands/db.rs b/src/commands/db.rs index f3a6721..6a73750 100644 --- a/src/commands/db.rs +++ b/src/commands/db.rs @@ -334,7 +334,7 @@ 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"); @@ -350,19 +350,36 @@ fn submits(conn_cfg: DbConnectionConfig<'_>, matches: &ArgMatches) -> Result<()> }; 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 +393,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, ] }; |