From d96afde5bfc279ce17da727d6488b54ba8e7ac3d Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 9 Aug 2024 12:32:11 -0700 Subject: [PATCH] Avoid `insert ... on conflict` on startup (#16045) These queries advance the id sequence even when there's nothing to insert Release Notes: - N/A Co-authored-by: Marshall --- crates/collab/src/db/queries/notifications.rs | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/crates/collab/src/db/queries/notifications.rs b/crates/collab/src/db/queries/notifications.rs index e0993f0d5685a8cd775fc4bd1110d9d706c88973..9dab91962b5eba9bbfaf13e92675835a9d24f277 100644 --- a/crates/collab/src/db/queries/notifications.rs +++ b/crates/collab/src/db/queries/notifications.rs @@ -5,15 +5,27 @@ use util::ResultExt; impl Database { /// Initializes the different kinds of notifications by upserting records for them. pub async fn initialize_notification_kinds(&mut self) -> Result<()> { - notification_kind::Entity::insert_many(Notification::all_variant_names().iter().map( - |kind| notification_kind::ActiveModel { + let all_kinds = Notification::all_variant_names(); + let existing_kinds = notification_kind::Entity::find().all(&self.pool).await?; + + let kinds_to_create: Vec<_> = all_kinds + .iter() + .filter(|&kind| { + !existing_kinds + .iter() + .any(|existing| existing.name == **kind) + }) + .map(|kind| notification_kind::ActiveModel { name: ActiveValue::Set(kind.to_string()), ..Default::default() - }, - )) - .on_conflict(OnConflict::new().do_nothing().to_owned()) - .exec_without_returning(&self.pool) - .await?; + }) + .collect(); + + if !kinds_to_create.is_empty() { + notification_kind::Entity::insert_many(kinds_to_create) + .exec_without_returning(&self.pool) + .await?; + } let mut rows = notification_kind::Entity::find().stream(&self.pool).await?; while let Some(row) = rows.next().await {