@@ -298,27 +298,33 @@ public function get_idea_count()
298298 }
299299
300300 /**
301- * Get total ideas statistics
301+ * Get statistics - counts of total ideas and of each status type
302302 *
303303 * @return array
304304 */
305305 public function get_statistics ()
306306 {
307- $ sql = 'SELECT idea_status FROM ' . $ this ->table_ideas ;
307+ // the CASE/WHEN SQL approach is better for performance than processing in PHP
308+ $ sql = 'SELECT
309+ COUNT(*) as total,
310+ SUM(CASE WHEN idea_status = ' . (int ) ext::$ statuses ['IMPLEMENTED ' ] . ' THEN 1 ELSE 0 END) as implemented,
311+ SUM(CASE WHEN idea_status = ' . (int ) ext::$ statuses ['IN_PROGRESS ' ] . ' THEN 1 ELSE 0 END) as in_progress,
312+ SUM(CASE WHEN idea_status = ' . (int ) ext::$ statuses ['DUPLICATE ' ] . ' THEN 1 ELSE 0 END) as duplicate,
313+ SUM(CASE WHEN idea_status = ' . (int ) ext::$ statuses ['INVALID ' ] . ' THEN 1 ELSE 0 END) as invalid,
314+ SUM(CASE WHEN idea_status = ' . (int ) ext::$ statuses ['NEW ' ] . ' THEN 1 ELSE 0 END) as new
315+ FROM ' . $ this ->table_ideas ;
316+
308317 $ result = $ this ->db ->sql_query ($ sql );
309- $ rows = $ this ->db ->sql_fetchrowset ($ result );
318+ $ row = $ this ->db ->sql_fetchrow ($ result );
310319 $ this ->db ->sql_freeresult ($ result );
311320
312- $ total = count ($ rows );
313- $ status_counts = $ total ? array_count_values (array_column ($ rows , 'idea_status ' )) : [];
314-
315321 return [
316- 'total ' => $ total ,
317- 'implemented ' => $ status_counts [ext:: $ statuses [ ' IMPLEMENTED ' ]] ?? 0 ,
318- 'in_progress ' => $ status_counts [ext:: $ statuses [ ' IN_PROGRESS ' ]] ?? 0 ,
319- 'duplicate ' => $ status_counts [ext:: $ statuses [ ' DUPLICATE ' ]] ?? 0 ,
320- 'invalid ' => $ status_counts [ext:: $ statuses [ ' INVALID ' ]] ?? 0 ,
321- 'new ' => $ status_counts [ext:: $ statuses [ ' NEW ' ]] ?? 0 ,
322+ 'total ' => ( int ) $ row [ ' total ' ] ,
323+ 'implemented ' => ( int ) $ row [ ' implemented ' ] ,
324+ 'in_progress ' => ( int ) $ row [ ' in_progress ' ] ,
325+ 'duplicate ' => ( int ) $ row [ ' duplicate ' ] ,
326+ 'invalid ' => ( int ) $ row [ ' invalid ' ] ,
327+ 'new ' => ( int ) $ row [ ' new ' ] ,
322328 ];
323329 }
324330}
0 commit comments