Skip to content

Commit 3cf004c

Browse files
committed
Optimize statistics getting by using SQL over PHP
1 parent 9e34db7 commit 3cf004c

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

factory/ideas.php

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)