Skip to content

Commit 9611c72

Browse files
committed
controllers/krate/metadata: Pipeline multiple queries
1 parent 63e52f1 commit 9611c72

File tree

1 file changed

+24
-34
lines changed

1 file changed

+24
-34
lines changed

src/controllers/krate/metadata.rs

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -99,57 +99,47 @@ pub async fn find_crate(
9999
.optional()?
100100
.ok_or_else(|| crate_not_found(&path.name))?;
101101

102-
let versions_and_publishers =
103-
load_versions_and_publishers(&mut conn, &krate, include.versions).await?;
104-
let mut versions_publishers_and_audit_actions =
105-
if let Some(versions_and_publishers) = versions_and_publishers {
106-
let versions = versions_and_publishers
107-
.iter()
108-
.map(|(v, _)| v)
109-
.collect::<Vec<_>>();
110-
let actions = VersionOwnerAction::for_versions(&mut conn, &versions).await?;
111-
Some(
112-
versions_and_publishers
113-
.into_iter()
114-
.zip(actions)
115-
.map(|((v, pb), aas)| (v, pb, aas))
116-
.collect::<Vec<_>>(),
117-
)
118-
} else {
119-
None
120-
};
121-
let ids = versions_publishers_and_audit_actions
102+
// Since `versions` and `default_version` share the same key (versions), we should only settle
103+
// the `include.default_version` when `include.versions` is not included, and ignore when no
104+
// `default_version` available.
105+
let include_default_version =
106+
include.default_version && !include.versions && default_version.is_some();
107+
let (versions_and_publishers, default_versions_and_publishers, kws, cats, recent_downloads) = tokio::try_join!(
108+
load_versions_and_publishers(&mut conn, &krate, include.versions),
109+
load_default_versions_and_publishers(
110+
&mut conn,
111+
&krate,
112+
default_version.as_deref(),
113+
include_default_version,
114+
),
115+
load_keywords(&mut conn, &krate, include.keywords),
116+
load_categories(&mut conn, &krate, include.categories),
117+
load_recent_downloads(&mut conn, &krate, include.downloads),
118+
)?;
119+
120+
let ids = versions_and_publishers
122121
.as_ref()
123122
.map(|vps| vps.iter().map(|v| v.0.id).collect());
124123

125-
// Since `versions` and `default_version` share the same key (versions), we should only settle
126-
// the `default_version` when `versions` is not included.
127-
if let Some(default_version) = default_version
128-
.as_ref()
129-
.filter(|_| include.default_version && !include.versions)
124+
let versions_publishers_and_audit_actions = if let Some(versions_and_publishers) =
125+
versions_and_publishers.or(default_versions_and_publishers)
130126
{
131-
let versions_and_publishers =
132-
load_default_versions_and_publishers(&mut conn, &krate, Some(default_version), true)
133-
.await?
134-
.expect("default_version should exists");
135127
let versions = versions_and_publishers
136128
.iter()
137129
.map(|(v, _)| v)
138130
.collect::<Vec<_>>();
139131
let actions = VersionOwnerAction::for_versions(&mut conn, &versions).await?;
140-
versions_publishers_and_audit_actions = Some(
132+
Some(
141133
versions_and_publishers
142134
.into_iter()
143135
.zip(actions)
144136
.map(|((v, pb), aas)| (v, pb, aas))
145137
.collect::<Vec<_>>(),
146138
)
139+
} else {
140+
None
147141
};
148142

149-
let kws = load_keywords(&mut conn, &krate, include.keywords).await?;
150-
let cats = load_categories(&mut conn, &krate, include.categories).await?;
151-
let recent_downloads = load_recent_downloads(&mut conn, &krate, include.downloads).await?;
152-
153143
let top_versions = if let Some(versions) = versions_publishers_and_audit_actions
154144
.as_ref()
155145
.filter(|_| include.versions)

0 commit comments

Comments
 (0)