Skip to content

Commit c02e090

Browse files
committed
controllers/krate/search: Read downloads from crate_downloads table
1 parent 6a7211c commit c02e090

File tree

1 file changed

+39
-31
lines changed

1 file changed

+39
-31
lines changed

src/controllers/krate/search.rs

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ pub async fn search(app: AppState, req: Parts) -> AppResult<Json<Value>> {
7272
let selection = (
7373
ALL_COLUMNS,
7474
false.into_sql::<Bool>(),
75+
crate_downloads::downloads,
7576
recent_crate_downloads::downloads.nullable(),
7677
0_f32.into_sql::<Float>(),
7778
);
@@ -80,6 +81,7 @@ pub async fn search(app: AppState, req: Parts) -> AppResult<Json<Value>> {
8081
let mut seek: Option<Seek> = None;
8182
let mut query = filter_params
8283
.make_query(&req, conn)?
84+
.inner_join(crate_downloads::table)
8385
.left_join(recent_crate_downloads::table)
8486
.select(selection);
8587

@@ -97,6 +99,7 @@ pub async fn search(app: AppState, req: Parts) -> AppResult<Json<Value>> {
9799
query = query.select((
98100
ALL_COLUMNS,
99101
Crate::with_name(q_string),
102+
crate_downloads::downloads,
100103
recent_crate_downloads::downloads.nullable(),
101104
rank.clone(),
102105
));
@@ -106,6 +109,7 @@ pub async fn search(app: AppState, req: Parts) -> AppResult<Json<Value>> {
106109
query = query.select((
107110
ALL_COLUMNS,
108111
Crate::with_name(q_string),
112+
crate_downloads::downloads,
109113
recent_crate_downloads::downloads.nullable(),
110114
0_f32.into_sql::<Float>(),
111115
));
@@ -121,7 +125,7 @@ pub async fn search(app: AppState, req: Parts) -> AppResult<Json<Value>> {
121125
// to ensure predictable pagination behavior.
122126
if sort == Some("downloads") {
123127
seek = Some(Seek::Downloads);
124-
query = query.order((crates::downloads.desc(), crates::id.desc()))
128+
query = query.order((crate_downloads::downloads.desc(), crates::id.desc()))
125129
} else if sort == Some("recent-downloads") {
126130
seek = Some(Seek::RecentDownloads);
127131
query = query.order((
@@ -170,7 +174,7 @@ pub async fn search(app: AppState, req: Parts) -> AppResult<Json<Value>> {
170174
pagination,
171175
filter_params.make_query(&req, conn)?.count(),
172176
);
173-
let data: Paginated<(Crate, bool, Option<i64>, f32)> =
177+
let data: Paginated<(Crate, bool, i64, Option<i64>, f32)> =
174178
info_span!("db.query", message = "SELECT ..., COUNT(*) FROM crates")
175179
.in_scope(|| query.load(conn))?;
176180

@@ -187,7 +191,7 @@ pub async fn search(app: AppState, req: Parts) -> AppResult<Json<Value>> {
187191
pagination,
188192
filter_params.make_query(&req, conn)?.count(),
189193
);
190-
let data: Paginated<(Crate, bool, Option<i64>, f32)> =
194+
let data: Paginated<(Crate, bool, i64, Option<i64>, f32)> =
191195
info_span!("db.query", message = "SELECT ..., COUNT(*) FROM crates")
192196
.in_scope(|| query.load(conn))?;
193197
(
@@ -199,12 +203,15 @@ pub async fn search(app: AppState, req: Parts) -> AppResult<Json<Value>> {
199203
)
200204
};
201205

202-
let perfect_matches = data.iter().map(|&(_, b, _, _)| b).collect::<Vec<_>>();
203-
let recent_downloads = data
206+
let perfect_matches = data.iter().map(|&(_, b, _, _, _)| b).collect::<Vec<_>>();
207+
let downloads = data
204208
.iter()
205-
.map(|&(_, _, s, _)| s.unwrap_or(0))
209+
.map(|&(_, _, total, recent, _)| (total, recent.unwrap_or(0)))
210+
.collect::<Vec<_>>();
211+
let crates = data
212+
.into_iter()
213+
.map(|(c, _, _, _, _)| c)
206214
.collect::<Vec<_>>();
207-
let crates = data.into_iter().map(|(c, _, _, _)| c).collect::<Vec<_>>();
208215

209216
let versions: Vec<Version> = info_span!("db.query", message = "SELECT ... FROM versions")
210217
.in_scope(|| crates.versions().load(conn))?;
@@ -216,20 +223,17 @@ pub async fn search(app: AppState, req: Parts) -> AppResult<Json<Value>> {
216223
let crates = versions
217224
.zip(crates)
218225
.zip(perfect_matches)
219-
.zip(recent_downloads)
220-
.map(
221-
|(((max_version, krate), perfect_match), recent_downloads)| {
222-
let downloads = krate.downloads as i64;
223-
EncodableCrate::from_minimal(
224-
krate,
225-
Some(&max_version),
226-
Some(vec![]),
227-
perfect_match,
228-
downloads,
229-
Some(recent_downloads),
230-
)
231-
},
232-
)
226+
.zip(downloads)
227+
.map(|(((max_version, krate), perfect_match), (total, recent))| {
228+
EncodableCrate::from_minimal(
229+
krate,
230+
Some(&max_version),
231+
Some(vec![]),
232+
perfect_match,
233+
total,
234+
Some(recent),
235+
)
236+
})
233237
.collect::<Vec<_>>();
234238

235239
Ok(Json(json!({
@@ -478,12 +482,12 @@ impl<'a> FilterParams<'a> {
478482
// `WHERE (downloads = downloads' AND id < id') OR downloads < downloads'`
479483
vec![
480484
Box::new(
481-
crates::downloads
485+
crate_downloads::downloads
482486
.eq(downloads)
483487
.and(crates::id.lt(id))
484488
.nullable(),
485489
),
486-
Box::new(crates::downloads.lt(downloads).nullable()),
490+
Box::new(crate_downloads::downloads.lt(downloads).nullable()),
487491
]
488492
}
489493
SeekPayload::Query(Query(exact_match, id)) => {
@@ -553,29 +557,30 @@ mod seek {
553557
New(#[serde(with="ts_microseconds")] chrono::NaiveDateTime, i32)
554558
RecentUpdates(#[serde(with="ts_microseconds")] chrono::NaiveDateTime, i32)
555559
RecentDownloads(Option<i64>, i32)
556-
Downloads(i32, i32)
560+
Downloads(i64, i32)
557561
Query(bool, i32)
558562
Relevance(bool, f32, i32)
559563
}
560564
}
561565

562566
impl Seek {
563-
pub(crate) fn to_payload(&self, record: &(Crate, bool, Option<i64>, f32)) -> SeekPayload {
567+
pub(crate) fn to_payload(
568+
&self,
569+
record: &(Crate, bool, i64, Option<i64>, f32),
570+
) -> SeekPayload {
564571
match *self {
565572
Seek::Name => SeekPayload::Name(Name(record.0.id)),
566573
Seek::New => SeekPayload::New(New(record.0.created_at, record.0.id)),
567574
Seek::RecentUpdates => {
568575
SeekPayload::RecentUpdates(RecentUpdates(record.0.updated_at, record.0.id))
569576
}
570577
Seek::RecentDownloads => {
571-
SeekPayload::RecentDownloads(RecentDownloads(record.2, record.0.id))
572-
}
573-
Seek::Downloads => {
574-
SeekPayload::Downloads(Downloads(record.0.downloads, record.0.id))
578+
SeekPayload::RecentDownloads(RecentDownloads(record.3, record.0.id))
575579
}
580+
Seek::Downloads => SeekPayload::Downloads(Downloads(record.2, record.0.id)),
576581
Seek::Query => SeekPayload::Query(Query(record.1, record.0.id)),
577582
Seek::Relevance => {
578-
SeekPayload::Relevance(Relevance(record.1, record.3, record.0.id))
583+
SeekPayload::Relevance(Relevance(record.1, record.4, record.0.id))
579584
}
580585
}
581586
}
@@ -584,7 +589,10 @@ mod seek {
584589

585590
type BoxedCondition<'a> = Box<
586591
dyn BoxableExpression<
587-
LeftJoinQuerySource<crates::table, recent_crate_downloads::table>,
592+
LeftJoinQuerySource<
593+
InnerJoinQuerySource<crates::table, crate_downloads::table>,
594+
recent_crate_downloads::table,
595+
>,
588596
diesel::pg::Pg,
589597
SqlType = diesel::sql_types::Nullable<Bool>,
590598
> + 'a,

0 commit comments

Comments
 (0)