Skip to content

Commit 5af73bd

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 5af73bd

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed

src/bin/migrate.rs

100644100755
+8
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+
}, |tx| {
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

+1-1
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

+7-3
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 mut krate2 = ::krate("BAR");
72+
krate2.keywords.push("KW1".to_string());
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);
@@ -77,7 +79,7 @@ fn index_queries() {
7779
let mut response = ok_resp!(middle.call(req.with_query("q=foo")));
7880
assert_eq!(::json::<CrateList>(&mut response).meta.total, 1);
7981
let mut response = ok_resp!(middle.call(req.with_query("q=kw1")));
80-
assert_eq!(::json::<CrateList>(&mut response).meta.total, 1);
82+
assert_eq!(::json::<CrateList>(&mut response).meta.total, 2);
8183
let mut response = ok_resp!(middle.call(req.with_query("q=readme")));
8284
assert_eq!(::json::<CrateList>(&mut response).meta.total, 1);
8385
let mut response = ok_resp!(middle.call(req.with_query("q=description")));
@@ -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)