diff options
author | Bryan Newbold <bnewbold@robocracy.org> | 2018-09-09 10:05:20 -0700 |
---|---|---|
committer | Bryan Newbold <bnewbold@robocracy.org> | 2018-09-09 10:05:20 -0700 |
commit | 109f82169ef2a141b5d859e23d3ba052cec99fcb (patch) | |
tree | 5518b9aa4be19e3bd1065d191a393d81d0e0f9db | |
parent | 7354899493f6448bed5698ad6ade1dbebcf39379 (diff) | |
download | fatcat-109f82169ef2a141b5d859e23d3ba052cec99fcb.tar.gz fatcat-109f82169ef2a141b5d859e23d3ba052cec99fcb.zip |
parallelize abstracts insertion
-rw-r--r-- | rust/src/database_entity_crud.rs | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/rust/src/database_entity_crud.rs b/rust/src/database_entity_crud.rs index 9a47c2de..88c89e84 100644 --- a/rust/src/database_entity_crud.rs +++ b/rust/src/database_entity_crud.rs @@ -40,7 +40,8 @@ pub trait EntityCrud where Self: Sized, { - // TODO: could these be generic structs? Or do they need to be bound to a specific table? + // TODO: could EditRow and IdentRow be generic structs? Or do they need to be bound to a + // specific table? type EditRow; // EntityEditRow type EditNewRow; type IdentRow; // EntityIdentRow @@ -85,7 +86,7 @@ where fn db_insert_revs(conn: &DbConn, models: &[&Self]) -> Result<Vec<Uuid>>; } -// TODO: this could be a separate trait on all entities? +// TODO: this could be a separate trait on all entities macro_rules! generic_parse_editgroup_id{ () => { fn parse_editgroup_id(&self) -> Result<Option<FatCatId>> { @@ -832,6 +833,8 @@ impl EntityCrud for ReleaseEntity { let mut release_ref_rows: Vec<ReleaseRefNewRow> = vec![]; let mut release_contrib_rows: Vec<ReleaseContribNewRow> = vec![]; + let mut abstract_rows: Vec<AbstractsRow> = vec![]; + let mut release_abstract_rows: Vec<ReleaseRevAbstractNewRow> = vec![]; for (model, rev_id) in models.iter().zip(rev_ids.iter()) { match &model.refs { @@ -883,7 +886,6 @@ impl EntityCrud for ReleaseEntity { } }; - // TODO: this part still isn't parallelized if let Some(abstract_list) = &model.abstracts { // For rows that specify content, we need to insert the abstract if it doesn't exist // already @@ -895,15 +897,8 @@ impl EntityCrud for ReleaseEntity { content: c.content.clone().unwrap(), }) .collect(); - if !new_abstracts.is_empty() { - // Sort of an "upsert"; only inserts new abstract rows if they don't already exist - insert_into(abstracts::table) - .values(&new_abstracts) - .on_conflict(abstracts::sha1) - .do_nothing() - .execute(conn)?; - } - let release_abstract_rows: Vec<ReleaseRevAbstractNewRow> = abstract_list + abstract_rows.extend(new_abstracts); + let new_release_abstract_rows: Vec<ReleaseRevAbstractNewRow> = abstract_list .into_iter() .map(|c| { Ok(ReleaseRevAbstractNewRow { @@ -920,9 +915,7 @@ impl EntityCrud for ReleaseEntity { }) }) .collect::<Result<Vec<ReleaseRevAbstractNewRow>>>()?; - insert_into(release_rev_abstract::table) - .values(release_abstract_rows) - .execute(conn)?; + release_abstract_rows.extend(new_release_abstract_rows); } } @@ -938,6 +931,18 @@ impl EntityCrud for ReleaseEntity { .execute(conn)?; } + if !abstract_rows.is_empty() { + // Sort of an "upsert"; only inserts new abstract rows if they don't already exist + insert_into(abstracts::table) + .values(&abstract_rows) + .on_conflict(abstracts::sha1) + .do_nothing() + .execute(conn)?; + insert_into(release_rev_abstract::table) + .values(release_abstract_rows) + .execute(conn)?; + } + Ok(rev_ids) } } |