From f7de29f8f1dbd1ea1430389c07014582c3836456 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Tue, 4 Nov 2025 10:13:37 +0100 Subject: [PATCH] database: Use SQL ordering in `calculate_default_version()` Replace Rust-side sorting with database-level ORDER BY clause to improve performance. Instead of loading all versions and using `max()` on the Rust side, the query now: 1. Orders by `yanked` (non-yanked first) 2. Orders by prerelease status using `jsonb_typeof(semver_ord[3])` 3. Orders by `semver_ord` descending 4. Orders by `id` descending as tiebreaker This matches the existing `Version::ord_tuple()` logic while being more efficient by retrieving only the default version from the database. --- .../src/models/default_versions.rs | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/crates/crates_io_database/src/models/default_versions.rs b/crates/crates_io_database/src/models/default_versions.rs index a52988d8e36..3c2b3aca1aa 100644 --- a/crates/crates_io_database/src/models/default_versions.rs +++ b/crates/crates_io_database/src/models/default_versions.rs @@ -1,5 +1,6 @@ use crate::schema::{default_versions, versions}; use crates_io_diesel_helpers::SemverVersion; +use diesel::dsl::jsonb_typeof; use diesel::prelude::*; use diesel_async::{AsyncPgConnection, RunQueryDsl}; use tracing::{debug, instrument, warn}; @@ -119,17 +120,21 @@ async fn calculate_default_version( crate_id: i32, conn: &mut AsyncPgConnection, ) -> QueryResult { - use diesel::result::Error::NotFound; - - debug!("Loading all versions for the crate…"); - let versions = Version::query() + debug!("Loading default version for the crate…"); + Version::query() .filter(versions::crate_id.eq(crate_id)) - .load(conn) - .await?; - - debug!("Found {} versions", versions.len()); - - versions.into_iter().max().ok_or(NotFound) + .order(( + // 1. Non-yanked first + versions::yanked, + // 2. Non-prerelease first + jsonb_typeof(versions::semver_ord.retrieve_as_object(3)).eq("array"), + // 3. Higher semver first + versions::semver_ord.desc(), + // 4. Higher ID first as tie-breaker + versions::id.desc(), + )) + .first(conn) + .await } #[cfg(test)]