Skip to content

Commit f1138d7

Browse files
committed
Merge branch 'allow-multiple-keywords-in-search' of https://github.com/pwoolcoc/crates.io into pwoolcoc-allow-multiple-keywords-in-search
2 parents b20b7b4 + 8b56c60 commit f1138d7

File tree

5 files changed

+25
-8
lines changed

5 files changed

+25
-8
lines changed

Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ scheduled-thread-pool = "0.2.0"
5959
derive_deref = "1.0.0"
6060
reqwest = "0.9.1"
6161
tempdir = "0.3.7"
62+
collecting-hashmap = "0.2"
6263
parking_lot = "0.7.1"
6364
jemallocator = { version = "0.1.8", features = ['unprefixed_malloc_on_supported_platforms', 'profiling'] }
6465
jemalloc-ctl = "0.2.0"

src/controllers.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ mod prelude {
1111
pub use crate::middleware::app::RequestApp;
1212
pub use crate::middleware::current_user::RequestUser;
1313

14+
use collecting_hashmap::CollectingHashMap;
1415
use std::collections::HashMap;
1516
use std::io;
1617

@@ -21,7 +22,7 @@ mod prelude {
2122
fn redirect(&self, url: String) -> Response;
2223

2324
fn json<T: Serialize>(&self, t: &T) -> Response;
24-
fn query(&self) -> HashMap<String, String>;
25+
fn query(&self) -> CollectingHashMap<String, String>;
2526
fn wants_json(&self) -> bool;
2627
fn pagination(&self, default: usize, max: usize) -> CargoResult<(i64, i64)>;
2728
}
@@ -31,7 +32,7 @@ mod prelude {
3132
crate::util::json_response(t)
3233
}
3334

34-
fn query(&self) -> HashMap<String, String> {
35+
fn query(&self) -> CollectingHashMap<String, String> {
3536
url::form_urlencoded::parse(self.query_string().unwrap_or("").as_bytes())
3637
.map(|(a, b)| (a.into_owned(), b.into_owned()))
3738
.collect()

src/controllers/krate/search.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,16 @@ pub fn search(req: &mut dyn Request) -> CargoResult<Response> {
9999
);
100100
}
101101

102-
if let Some(kw) = params.get("keyword") {
102+
if let Some(kws) = params.get_all("keyword") {
103103
has_filter = true;
104+
use diesel::dsl::any;
105+
let names: Vec<_> = kws.iter().map(|name| name.to_lowercase()).collect();
104106
query = query.filter(
105107
crates::id.eq_any(
106108
crates_keywords::table
107109
.select(crates_keywords::crate_id)
108110
.inner_join(keywords::table)
109-
.filter(crate::lower(keywords::keyword).eq(crate::lower(kw))),
111+
.filter(crate::lower(keywords::keyword).eq(any(names))),
110112
),
111113
);
112114
} else if let Some(letter) = params.get("letter") {

src/tests/krate.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -117,28 +117,34 @@ fn index_queries() {
117117
CrateBuilder::new("foo", user.id)
118118
.keyword("kw3")
119119
.expect_build(conn);
120+
121+
CrateBuilder::new("two-keywords", user.id)
122+
.keyword("kw1")
123+
.keyword("kw3")
124+
.expect_build(conn);
120125
(krate, krate2)
121126
});
122127

123128
assert_eq!(anon.search("q=baz").meta.total, 0);
124129

125130
// All of these fields should be indexed/searched by the queries
126131
assert_eq!(anon.search("q=foo").meta.total, 2);
127-
assert_eq!(anon.search("q=kw1").meta.total, 2);
132+
assert_eq!(anon.search("q=kw1").meta.total, 3);
128133
assert_eq!(anon.search("q=readme").meta.total, 1);
129134
assert_eq!(anon.search("q=description").meta.total, 1);
130135

131-
assert_eq!(anon.search_by_user_id(user.id).crates.len(), 3);
136+
assert_eq!(anon.search_by_user_id(user.id).crates.len(), 4);
132137
assert_eq!(anon.search_by_user_id(0).crates.len(), 0);
133138

134139
assert_eq!(anon.search("letter=F").crates.len(), 2);
135140
assert_eq!(anon.search("letter=B").crates.len(), 1);
136141
assert_eq!(anon.search("letter=b").crates.len(), 1);
137142
assert_eq!(anon.search("letter=c").crates.len(), 0);
138143

139-
assert_eq!(anon.search("keyword=kw1").crates.len(), 2);
140-
assert_eq!(anon.search("keyword=KW1").crates.len(), 2);
144+
assert_eq!(anon.search("keyword=kw1").crates.len(), 3);
145+
assert_eq!(anon.search("keyword=KW1").crates.len(), 3);
141146
assert_eq!(anon.search("keyword=kw2").crates.len(), 0);
147+
assert_eq!(anon.search("keyword=kw1&keyword=kw3").crates.len(), 1);
142148

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

0 commit comments

Comments
 (0)