Skip to content

Commit 6af7d25

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 2ba8181 commit 6af7d25

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
@@ -440,6 +440,14 @@ fn migrations() -> Vec<Migration> {
440440
ON crates (lower(name))", &[]));
441441
Ok(())
442442
}),
443+
Migration::new(20150320174400, |tx| {
444+
try!(tx.execute("CREATE INDEX index_keywords_lower_keyword ON (lower(keyword))",
445+
&[]));
446+
Ok(())
447+
}, |tx| {
448+
try!(tx.execute("DROP INDEX index_keywords_lower_keyword", &[]));
449+
Ok(())
450+
}),
443451
];
444452
// NOTE: Generate a new id via `date +"%Y%m%d%H%M%S"`
445453

src/krate.rs

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

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)