Improve queries for composite primary keys

This commit is contained in:
Antonio Scandurra 2022-11-16 11:07:39 +01:00
parent f9567ae116
commit eeb32fa888

View file

@ -1554,20 +1554,20 @@ where
.await?; .await?;
} }
let mut params = "(?, ?),".repeat(worktrees.len()); let mut params = "?,".repeat(worktrees.len());
if !worktrees.is_empty() { if !worktrees.is_empty() {
params.pop(); params.pop();
} }
let query = format!( let query = format!(
" "
DELETE FROM worktrees DELETE FROM worktrees
WHERE (project_id, id) NOT IN ({params}) WHERE project_id = ? AND worktree_id NOT IN ({params})
", ",
); );
let mut query = sqlx::query(&query); let mut query = sqlx::query(&query).bind(project_id);
for worktree in worktrees { for worktree in worktrees {
query = query.bind(project_id).bind(WorktreeId(worktree.id as i32)); query = query.bind(WorktreeId(worktree.id as i32));
} }
query.execute(&mut tx).await?; query.execute(&mut tx).await?;
@ -1685,21 +1685,18 @@ where
} }
if !update.removed_entries.is_empty() { if !update.removed_entries.is_empty() {
let mut params = "(?, ?, ?),".repeat(update.removed_entries.len()); let mut params = "?,".repeat(update.removed_entries.len());
params.pop(); params.pop();
let query = format!( let query = format!(
" "
DELETE FROM worktree_entries DELETE FROM worktree_entries
WHERE (project_id, worktree_id, entry_id) IN ({params}) WHERE project_id = ? AND worktree_id = ? AND entry_id IN ({params})
" "
); );
let mut query = sqlx::query(&query); let mut query = sqlx::query(&query).bind(project_id).bind(worktree_id);
for entry_id in &update.removed_entries { for entry_id in &update.removed_entries {
query = query query = query.bind(*entry_id as i64);
.bind(project_id)
.bind(worktree_id)
.bind(*entry_id as i64);
} }
query.execute(&mut tx).await?; query.execute(&mut tx).await?;
} }
@ -1832,7 +1829,7 @@ where
}) })
.collect::<BTreeMap<_, _>>(); .collect::<BTreeMap<_, _>>();
let mut params = "(?, ?),".repeat(worktrees.len()); let mut params = "?,".repeat(worktrees.len());
if !worktrees.is_empty() { if !worktrees.is_empty() {
params.pop(); params.pop();
} }
@ -1843,12 +1840,12 @@ where
" "
SELECT * SELECT *
FROM worktree_entries FROM worktree_entries
WHERE (project_id, worktree_id) IN ({params}) WHERE project_id = ? AND worktree_id IN ({params})
", ",
); );
let mut entries = sqlx::query_as::<_, WorktreeEntry>(&query); let mut entries = sqlx::query_as::<_, WorktreeEntry>(&query).bind(project_id);
for worktree_id in worktrees.keys() { for worktree_id in worktrees.keys() {
entries = entries.bind(project_id).bind(*worktree_id); entries = entries.bind(*worktree_id);
} }
let mut entries = entries.fetch(&mut tx); let mut entries = entries.fetch(&mut tx);
while let Some(entry) = entries.next().await { while let Some(entry) = entries.next().await {
@ -1876,12 +1873,13 @@ where
" "
SELECT * SELECT *
FROM worktree_diagnostic_summaries FROM worktree_diagnostic_summaries
WHERE (project_id, worktree_id) IN ({params}) WHERE project_id = $1 AND worktree_id IN ({params})
", ",
); );
let mut summaries = sqlx::query_as::<_, WorktreeDiagnosticSummary>(&query); let mut summaries =
sqlx::query_as::<_, WorktreeDiagnosticSummary>(&query).bind(project_id);
for worktree_id in worktrees.keys() { for worktree_id in worktrees.keys() {
summaries = summaries.bind(project_id).bind(*worktree_id); summaries = summaries.bind(*worktree_id);
} }
let mut summaries = summaries.fetch(&mut tx); let mut summaries = summaries.fetch(&mut tx);
while let Some(summary) = summaries.next().await { while let Some(summary) = summaries.next().await {