Skip to content

Commit 9387835

Browse files
authored
database: Use SQL ordering in calculate_default_version() (#12273)
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.
1 parent f3616f2 commit 9387835

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

crates/crates_io_database/src/models/default_versions.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::schema::{default_versions, versions};
22
use crates_io_diesel_helpers::SemverVersion;
3+
use diesel::dsl::jsonb_typeof;
34
use diesel::prelude::*;
45
use diesel_async::{AsyncPgConnection, RunQueryDsl};
56
use tracing::{debug, instrument, warn};
@@ -119,17 +120,21 @@ async fn calculate_default_version(
119120
crate_id: i32,
120121
conn: &mut AsyncPgConnection,
121122
) -> QueryResult<Version> {
122-
use diesel::result::Error::NotFound;
123-
124-
debug!("Loading all versions for the crate…");
125-
let versions = Version::query()
123+
debug!("Loading default version for the crate…");
124+
Version::query()
126125
.filter(versions::crate_id.eq(crate_id))
127-
.load(conn)
128-
.await?;
129-
130-
debug!("Found {} versions", versions.len());
131-
132-
versions.into_iter().max().ok_or(NotFound)
126+
.order((
127+
// 1. Non-yanked first
128+
versions::yanked,
129+
// 2. Non-prerelease first
130+
jsonb_typeof(versions::semver_ord.retrieve_as_object(3)).eq("array"),
131+
// 3. Higher semver first
132+
versions::semver_ord.desc(),
133+
// 4. Higher ID first as tie-breaker
134+
versions::id.desc(),
135+
))
136+
.first(conn)
137+
.await
133138
}
134139

135140
#[cfg(test)]

0 commit comments

Comments
 (0)