summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-04-22 10:34:46 +0200
committerMatthias Beyer <mail@beyermatthias.de>2021-04-22 10:34:46 +0200
commitdd23d7460c2cf3d223f9f9f1faebc52aa57f690d (patch)
tree888ec71704c69c236c34e0a54ad6f2e1e57bef32
parentd86d6ff045725bb313ca68652f76ec7f1f82714f (diff)
parent0f231979ce6d35e3e9ec4773904cf763a1d9aac4 (diff)
Merge branch 'submits-limit'
-rw-r--r--src/cli.rs8
-rw-r--r--src/commands/db.rs80
2 files changed, 50 insertions, 38 deletions
diff --git a/src/cli.rs b/src/cli.rs
index aeaa2b5..4866ccd 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -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");