diff options
-rw-r--r-- | src/cli.rs | 10 | ||||
-rw-r--r-- | src/commands/db.rs | 28 |
2 files changed, 31 insertions, 7 deletions
@@ -176,6 +176,16 @@ pub fn cli<'a>() -> App<'a> { .value_name("UUID") .about("Only list jobs of a certain submit") ) + + .arg(Arg::new("env_filter") + .required(false) + .multiple(false) + .long("env") + .short('E') + .takes_value(true) + .value_name("KV") + .about("Filter for this \"key=value\" environment variable") + ) ) .subcommand(App::new("job") diff --git a/src/commands/db.rs b/src/commands/db.rs index 38e1de5..7242ee9 100644 --- a/src/commands/db.rs +++ b/src/commands/db.rs @@ -251,26 +251,40 @@ fn jobs(conn_cfg: DbConnectionConfig, matches: &ArgMatches) -> Result<()> { .map(uuid::Uuid::parse_str) .transpose()? .map(|submit_uuid| { - let submit = models::Submit::with_id(&conn, &submit_uuid)?; - - models::Job::belonging_to(&submit) + let sel = schema::jobs::table .inner_join(schema::submits::table) .inner_join(schema::endpoints::table) .inner_join(schema::packages::table) - .load::<(models::Job, models::Submit, models::Endpoint, models::Package)>(&conn) - .map_err(Error::from) + .left_outer_join(schema::job_envs::table.inner_join(schema::envvars::table)) + .filter(schema::submits::uuid.eq(&submit_uuid)); + + if let Some((env_name, env_value)) = matches.value_of("filter_env").map(crate::util::env::parse_to_env).transpose()? { + sel.filter({ + use crate::diesel::BoolExpressionMethods; + + schema::envvars::dsl::name + .eq(env_name.as_ref()) + .and(schema::envvars::dsl::value.eq(env_value)) + }) + .load::<(models::Job, models::Submit, models::Endpoint, models::Package, Option<(models::JobEnv, models::EnvVar)>)>(&conn) + .map_err(Error::from) + } else { + sel.load::<(models::Job, models::Submit, models::Endpoint, models::Package, Option<(models::JobEnv, models::EnvVar)>)>(&conn) + .map_err(Error::from) + } }) .unwrap_or_else(|| { dsl::jobs .inner_join(crate::schema::submits::table) .inner_join(crate::schema::endpoints::table) .inner_join(crate::schema::packages::table) - .load::<(models::Job, models::Submit, models::Endpoint, models::Package)>(&conn) + .left_outer_join(schema::job_envs::table.inner_join(schema::envvars::table)) + .load::<(models::Job, models::Submit, models::Endpoint, models::Package, Option<(models::JobEnv, models::EnvVar)>)>(&conn) .map_err(Error::from) })?; let data = jobs.into_iter() - .map(|(job, submit, ep, package)| { + .map(|(job, submit, ep, package, _)| { let success = crate::log::ParsedLog::build_from(&job.log_text)? .is_successfull() .map(|b| if b { |