Skip to content

Commit 68149f9

Browse files
Merge pull request #558 from Eh2406/fix524
Only show crate once, even if search is like several category #524
2 parents 5794409 + 2767f25 commit 68149f9

File tree

3 files changed

+35
-9
lines changed

3 files changed

+35
-9
lines changed

src/krate.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -539,16 +539,16 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
539539
}).or_else(|| {
540540
query.get("category").map(|cat| {
541541
args.insert(0, cat);
542-
let base = "FROM crates \
543-
INNER JOIN crates_categories \
544-
ON crates.id = crates_categories.crate_id \
545-
INNER JOIN categories \
546-
ON crates_categories.category_id = \
547-
categories.id \
548-
WHERE categories.slug = $1 OR \
542+
let base = "FROM crates
543+
INNER JOIN crates_categories
544+
ON crates.id = crates_categories.crate_id
545+
INNER JOIN categories
546+
ON crates_categories.category_id =
547+
categories.id
548+
WHERE categories.slug = $1 OR
549549
categories.slug LIKE $1 || '::%'";
550-
(format!("SELECT crates.* {} ORDER BY {} LIMIT $2 OFFSET $3", base, sort_sql),
551-
format!("SELECT COUNT(crates.*) {}", base))
550+
(format!("SELECT DISTINCT crates.* {} ORDER BY {} LIMIT $2 OFFSET $3", base, sort_sql),
551+
format!("SELECT COUNT(DISTINCT crates.*) {}", base))
552552
})
553553
}).or_else(|| {
554554
query.get("user_id").and_then(|s| s.parse::<i32>().ok()).map(|user_id| {

src/tests/category.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,4 +136,12 @@ fn update_crate() {
136136
assert_eq!(cnt(&mut req, "cat1"), 0);
137137
assert_eq!(cnt(&mut req, "category-2"), 0);
138138

139+
// Add a category and its subcategory
140+
::mock_category(&mut req, "cat1::bar", "cat1::bar");
141+
Category::update_crate(
142+
tx(&req), &krate, &["cat1".to_string(),
143+
"cat1::bar".to_string()]).unwrap();
144+
assert_eq!(cnt(&mut req, "cat1"), 1);
145+
assert_eq!(cnt(&mut req, "cat1::bar"), 1);
146+
assert_eq!(cnt(&mut req, "category-2"), 0);
139147
}

src/tests/krate.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use cargo_registry::krate::{Crate, EncodableCrate};
1717
use cargo_registry::upload as u;
1818
use cargo_registry::user::EncodableUser;
1919
use cargo_registry::version::EncodableVersion;
20+
use cargo_registry::category::Category;
2021

2122
#[derive(RustcDecodable)]
2223
struct CrateList { crates: Vec<EncodableCrate>, meta: CrateMeta }
@@ -130,6 +131,23 @@ fn index_queries() {
130131
assert_eq!(::json::<CrateList>(&mut response).crates.len(), 2);
131132
let mut response = ok_resp!(middle.call(req.with_query("keyword=kw2")));
132133
assert_eq!(::json::<CrateList>(&mut response).crates.len(), 0);
134+
135+
::mock_category(&mut req, "cat1", "cat1");
136+
::mock_category(&mut req, "cat1::bar", "cat1::bar");
137+
Category::update_crate(tx(&req), &krate, &["cat1".to_string(),
138+
"cat1::bar".to_string()]).unwrap();
139+
let mut response = ok_resp!(middle.call(req.with_query("category=cat1")));
140+
let cl = ::json::<CrateList>(&mut response);
141+
assert_eq!(cl.crates.len(), 1);
142+
assert_eq!(cl.meta.total, 1);
143+
let mut response = ok_resp!(middle.call(req.with_query("category=cat1::bar")));
144+
let cl = ::json::<CrateList>(&mut response);
145+
assert_eq!(cl.crates.len(), 1);
146+
assert_eq!(cl.meta.total, 1);
147+
let mut response = ok_resp!(middle.call(req.with_query("keyword=cat2")));
148+
let cl = ::json::<CrateList>(&mut response);
149+
assert_eq!(cl.crates.len(), 0);
150+
assert_eq!(cl.meta.total, 0);
133151
}
134152

135153
#[test]

0 commit comments

Comments
 (0)