Skip to content

Commit 56aa080

Browse files
committed
Normalise keywords to lowercase when searching for crates.
Currently keyword search is case-sensitive, but this is often unhelpful, as they are heuristic classification tools, not hard guarantees. It's not particularly helpful to search for ["fft"](https://crates.io/keywords/fft) and not get the crates tagged ["FFT"](https://crates.io/keywords/FFT). Closes #100.
1 parent 0e82004 commit 56aa080

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

src/bin/migrate.rs

100644100755
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,14 @@ fn migrations() -> Vec<Migration> {
418418
crate_owners_unique_user_per_crate", &[]));
419419
Ok(())
420420
}),
421+
Migration::new(20150320174400, |tx| {
422+
try!(tx.execute("CREATE INDEX index_keywords_lower_keyword ON (lower(keyword))",
423+
&[]));
424+
Ok(())
425+
}, |_| {
426+
try!(tx.execute("DROP INDEX index_keywords_lower_keyword", &[]));
427+
Ok(())
428+
}),
421429
];
422430
// NOTE: Generate a new id via `date +"%Y%m%d%H%M%S"`
423431

src/krate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
460460
ON crates.id = crates_keywords.crate_id
461461
INNER JOIN keywords
462462
ON crates_keywords.keyword_id = keywords.id
463-
WHERE keywords.keyword = $1";
463+
WHERE lower(keywords.keyword) = lower($1)";
464464
(format!("SELECT crates.* {} {} LIMIT $2 OFFSET $3", base, sort_sql),
465465
format!("SELECT COUNT(crates.*) {}", base))
466466
})

src/tests/krate.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ fn index_queries() {
6868
krate.readme = Some("readme".to_string());
6969
krate.description = Some("description".to_string());
7070
::mock_crate(&mut req, krate);
71-
::mock_crate(&mut req, ::krate("BAR"));
71+
let krate2 = ::krate("BAR");
72+
krate2.keywords.push("KW1");
73+
::mock_crate(&mut req, krate2);
7274

7375
let mut response = ok_resp!(middle.call(req.with_query("q=baz")));
7476
assert_eq!(::json::<CrateList>(&mut response).meta.total, 0);
@@ -99,7 +101,9 @@ fn index_queries() {
99101
assert_eq!(::json::<CrateList>(&mut response).crates.len(), 0);
100102

101103
let mut response = ok_resp!(middle.call(req.with_query("keyword=kw1")));
102-
assert_eq!(::json::<CrateList>(&mut response).crates.len(), 1);
104+
assert_eq!(::json::<CrateList>(&mut response).crates.len(), 2);
105+
let mut response = ok_resp!(middle.call(req.with_query("keyword=KW1")));
106+
assert_eq!(::json::<CrateList>(&mut response).crates.len(), 2);
103107
let mut response = ok_resp!(middle.call(req.with_query("keyword=kw2")));
104108
assert_eq!(::json::<CrateList>(&mut response).crates.len(), 0);
105109
}

0 commit comments

Comments
 (0)