Skip to content

Commit a6f3064

Browse files
committed
Started exact match from the database
1 parent d421c5f commit a6f3064

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

src/krate.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -654,15 +654,15 @@ impl Model for Crate {
654654
#[allow(trivial_casts)]
655655
pub fn index(req: &mut Request) -> CargoResult<Response> {
656656
use diesel::expression::dsl::sql;
657-
use diesel::types::BigInt;
657+
use diesel::types::{BigInt, Bool};
658658

659659
let conn = req.db_conn()?;
660660
let (offset, limit) = req.pagination(10, 100)?;
661661
let params = req.query();
662662
let sort = params.get("sort").map(|s| &**s).unwrap_or("alpha");
663663

664664
let mut query = crates::table
665-
.select((ALL_COLUMNS, sql::<BigInt>("COUNT(*) OVER ()")))
665+
.select((ALL_COLUMNS, sql::<BigInt>("COUNT(*) OVER ()"), sql::<Bool>("false")))
666666
.limit(limit)
667667
.offset(offset)
668668
.into_boxed();
@@ -677,6 +677,7 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
677677
let q = plainto_tsquery(q_string);
678678
query = query.filter(q.matches(crates::textsearchable_index_col));
679679

680+
query = query.select((ALL_COLUMNS, sql::<BigInt>("COUNT(*) OVER()"), crates::name.eq(q_string)));
680681
let perfect_match = crates::name.eq(q_string).desc();
681682
if sort == "downloads" {
682683
query = query.order((perfect_match, crates::downloads.desc()));
@@ -714,22 +715,23 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
714715
));
715716
}
716717

717-
let data = query.load::<(Crate, i64)>(&*conn)?;
718-
let total = data.get(0).map(|&(_, t)| t).unwrap_or(0);
719-
let crates = data.into_iter().map(|(c, _)| c).collect::<Vec<_>>();
718+
let data = query.load::<(Crate, i64, bool)>(&*conn)?;
719+
let total = data.get(0).map(|&(_, t, _)| t).unwrap_or(0);
720+
let crates = data.into_iter().map(|(c, _, _)| c).collect::<Vec<_>>();
721+
let perfect_matches = data.into_iter().map(|(_, _, b)| b).collect::<Vec<_>>();
720722

721723
let versions = Version::belonging_to(&crates)
722724
.load::<Version>(&*conn)?
723725
.grouped_by(&crates)
724726
.into_iter()
725727
.map(|versions| Version::max(versions.into_iter().map(|v| v.num)));
726728

727-
let crates = versions.zip(crates).map(|(max_version, krate)| {
729+
let crates = versions.zip(crates).zip(perfect_matches).map(|((max_version, krate), perfect_match)| {
728730
// FIXME: If we add crate_id to the Badge enum we can eliminate
729731
// this N+1
730732
let badges = badges::table.filter(badges::crate_id.eq(krate.id))
731733
.load::<Badge>(&*conn)?;
732-
Ok(krate.minimal_encodable(max_version, Some(badges), false))
734+
Ok(krate.minimal_encodable(max_version, Some(badges), perfect_match))
733735
}).collect::<Result<_, ::diesel::result::Error>>()?;
734736

735737
#[derive(RustcEncodable)]

0 commit comments

Comments
 (0)