Skip to content

Commit c81c950

Browse files
committed
Sum crate count in all subcategories in a better way
And make the top-level query that does this consistent with subcategory queries.
1 parent c75bb56 commit c81c950

File tree

1 file changed

+18
-11
lines changed

1 file changed

+18
-11
lines changed

src/category.rs

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,18 @@ impl Category {
146146

147147
pub fn subcategories(&self, conn: &GenericConnection)
148148
-> CargoResult<Vec<Category>> {
149-
let stmt = try!(conn.prepare("SELECT * FROM categories \
150-
WHERE category ILIKE $1 || '::%'
151-
AND category NOT ILIKE $1 || '::%::%'"));
149+
let stmt = try!(conn.prepare("\
150+
SELECT c.id, c.category, c.slug, c.description, c.created_at, \
151+
COALESCE (( \
152+
SELECT sum(c2.crates_cnt)::int \
153+
FROM categories as c2 \
154+
WHERE c2.slug = c.slug \
155+
OR c2.slug LIKE c.slug || '::%' \
156+
), 0) as crates_cnt \
157+
FROM categories as c \
158+
WHERE c.category ILIKE $1 || '::%' \
159+
AND c.category NOT ILIKE $1 || '::%::%'"));
160+
152161
let rows = try!(stmt.query(&[&self.category]));
153162
Ok(rows.iter().map(|r| Model::from_row(&r)).collect())
154163
}
@@ -183,15 +192,13 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
183192
// the crates in all subcategories
184193
let stmt = try!(conn.prepare(&format!(
185194
"SELECT c.id, c.category, c.slug, c.description, c.created_at, \
186-
counts.sum::int as crates_cnt \
195+
COALESCE (( \
196+
SELECT sum(c2.crates_cnt)::int \
197+
FROM categories as c2 \
198+
WHERE c2.slug = c.slug \
199+
OR c2.slug LIKE c.slug || '::%' \
200+
), 0) as crates_cnt \
187201
FROM categories as c \
188-
LEFT JOIN ( \
189-
SELECT split_part(categories.category, '::', 1), \
190-
sum(categories.crates_cnt) \
191-
FROM categories \
192-
GROUP BY split_part(categories.category, '::', 1) \
193-
) as counts \
194-
ON c.category = counts.split_part \
195202
WHERE c.category NOT LIKE '%::%' {} \
196203
LIMIT $1 OFFSET $2",
197204
sort_sql

0 commit comments

Comments
 (0)