Skip to content

Commit ca1e6b4

Browse files
committed
controllers/version: Load Crate and Version in single query
Instead of loading them individually, this gets both in one query. I think that in most cases, the request to query for `Crate` and `Version` will have valid input, so this seems like a better approach, even though it might only give a small performance boost.
1 parent 3e6af81 commit ca1e6b4

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

src/controllers/version.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ pub mod update;
77
pub mod yank;
88

99
use axum::extract::{FromRequestParts, Path};
10-
use diesel_async::AsyncPgConnection;
10+
use diesel::prelude::*;
11+
use diesel_async::{AsyncPgConnection, RunQueryDsl};
1112
use serde::de::Error;
1213
use serde::{Deserialize, Deserializer};
1314
use utoipa::IntoParams;
1415

15-
use crate::controllers::krate::load_crate;
1616
use crate::models::{Crate, Version};
17-
use crate::util::errors::{version_not_found, AppResult};
17+
use crate::schema::{crates, versions};
18+
use crate::util::errors::{crate_not_found, version_not_found, AppResult};
1819

1920
#[derive(Deserialize, FromRequestParts, IntoParams)]
2021
#[into_params(parameter_in = Path)]
@@ -46,12 +47,19 @@ async fn version_and_crate(
4647
crate_name: &str,
4748
semver: &str,
4849
) -> AppResult<(Version, Crate)> {
49-
let krate = load_crate(conn, crate_name).await?;
50-
let version = krate
51-
.find_version(conn, semver)
52-
.await?
53-
.ok_or_else(|| version_not_found(crate_name, semver))?;
50+
let (krate, version) = Crate::by_name(crate_name)
51+
.left_join(
52+
versions::table.on(crates::id
53+
.eq(versions::crate_id)
54+
.and(versions::num.eq(semver))),
55+
)
56+
.select(<(Crate, Option<Version>)>::as_select())
57+
.first(conn)
58+
.await
59+
.optional()?
60+
.ok_or_else(|| crate_not_found(crate_name))?;
5461

62+
let version = version.ok_or_else(|| version_not_found(crate_name, semver))?;
5563
Ok((version, krate))
5664
}
5765

0 commit comments

Comments
 (0)