Skip to content

Commit f8f0d01

Browse files
Paul Woolcockcarols10cents
authored andcommitted
Allow multiple keywords in crate search
This commit allows multiple `keyword=` parameters in the querystring to enable searching for all crates under the specified keywords Towards #1461
1 parent be8fc70 commit f8f0d01

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

src/controllers/krate/search.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,18 @@ pub fn search(req: &mut dyn Request) -> CargoResult<Response> {
9595
);
9696
}
9797

98-
if let Some(kw) = params.get("keyword") {
98+
if let Some(kws) = params.get("all_keywords") {
99+
let names: Vec<_> = kws.split_whitespace().map(|name| name.to_lowercase()).collect();
100+
101+
query = query.filter(
102+
crates::id.eq_any(
103+
crates_keywords::table
104+
.select(crates_keywords::crate_id)
105+
.inner_join(keywords::table)
106+
.filter(crate::lower(keywords::keyword).eq(any(names))),
107+
),
108+
);
109+
} else if let Some(kw) = params.get("keyword") {
99110
query = query.filter(
100111
crates::id.eq_any(
101112
crates_keywords::table

src/tests/krate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ fn index_queries() {
139139
assert_eq!(anon.search("keyword=kw1").crates.len(), 2);
140140
assert_eq!(anon.search("keyword=KW1").crates.len(), 2);
141141
assert_eq!(anon.search("keyword=kw2").crates.len(), 0);
142+
assert_eq!(anon.search("keyword=kw1&keyword=kw3").crates.len(), 3);
142143

143144
assert_eq!(anon.search("q=foo&keyword=kw1").crates.len(), 1);
144145
assert_eq!(anon.search("q=foo2&keyword=kw1").crates.len(), 0);

0 commit comments

Comments
 (0)