@@ -146,9 +146,18 @@ impl Category {
146
146
147
147
pub fn subcategories ( & self , conn : & GenericConnection )
148
148
-> 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
+
152
161
let rows = try!( stmt. query ( & [ & self . category ] ) ) ;
153
162
Ok ( rows. iter ( ) . map ( |r| Model :: from_row ( & r) ) . collect ( ) )
154
163
}
@@ -183,15 +192,13 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
183
192
// the crates in all subcategories
184
193
let stmt = try!( conn. prepare ( & format ! (
185
194
"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 \
187
201
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 \
195
202
WHERE c.category NOT LIKE '%::%' {} \
196
203
LIMIT $1 OFFSET $2",
197
204
sort_sql
0 commit comments