Passed
Push — master ( bcb1ec...700d1f )
by Paul
02:53
created

Queries   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 71
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 13
eloc 47
dl 0
loc 71
rs 10
c 1
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A label() 0 15 4
A sortByTime() 0 6 3
A hasEntries() 0 4 1
A entries() 0 38 5
1
<?php
2
3
namespace GeminiLabs\BlackBar\Modules;
4
5
use GeminiLabs\BlackBar\Application;
6
7
class Queries extends Module
8
{
9
    public function entries(): array
10
    {
11
        global $wpdb;
12
        $entries = [];
13
        $index = 0;
14
        $search = [
15
            'FROM', 'GROUP BY', 'INNER JOIN', 'LEFT JOIN', 'LIMIT',
16
            'ON DUPLICATE KEY UPDATE', 'ORDER BY', 'OFFSET', ' SET', 'WHERE',
17
        ];
18
        $replace = array_map(function ($value) {
19
            return PHP_EOL.$value;
20
        }, $search);
21
        foreach ($wpdb->queries as $query) {
22
            $miliseconds = number_format(round($query[1] * 1000, 4), 4);
23
            $sql = preg_replace('/\s\s+/', ' ', trim($query[0]));
24
            $sql = str_replace(PHP_EOL, ' ', $sql);
25
            $sql = str_replace(['( ',' )',' ,'], ['(',')',','], $sql);
26
            $sql = str_replace($search, $replace, $sql);
27
            $parts = explode(PHP_EOL, $sql);
28
            $sql = array_reduce($parts, function ($carry, $part) {
29
                if (str_starts_with($part, 'SELECT') && strlen($part) > 100) {
30
                    $part = preg_replace('/\s*(,)\s*/', ','.PHP_EOL.'  ', $part);
31
                }
32
                if (str_starts_with($part, 'WHERE')) {
33
                    $part = str_replace('AND', PHP_EOL.'  AND', $part);
34
                }
35
                return $carry.$part.PHP_EOL;
36
            });
37
            $trace = explode(', ', $query[2]);
38
            $entries[] = [
39
                'index' => $index++,
40
                'sql' => $sql,
41
                'time' => $miliseconds,
42
                'trace' => array_reverse($trace, true),
43
            ];
44
        }
45
        uasort($entries, [$this, 'sortByTime']);
46
        return $entries;
47
    }
48
49
    public function hasEntries(): bool
50
    {
51
        global $wpdb;
52
        return !empty($wpdb->queries);
53
    }
54
55
    public function label(): string
56
    {
57
        $label = __('SQL', 'blackbar');
58
        if (!defined('SAVEQUERIES') || !SAVEQUERIES) {
59
            return $label;
60
        }
61
        global $wpdb;
62
        $queryTime = 0;
63
        foreach ($wpdb->queries as $query) {
64
            $queryTime += $query[1];
65
        }
66
        $queryTime = number_format($queryTime * 1000, 2);
67
        $count = sprintf('<span class="glbb-queries-count">%s</span>', count($wpdb->queries));
68
        $time = sprintf('<span class="glbb-queries-time">%s</span>', $queryTime);
69
        return sprintf('%s <span class="glbb-link-info">%s / %s ms</span>', $label, $count, $time);
70
    }
71
72
    protected function sortByTime(array $a, array $b): int
73
    {
74
        if ($a['time'] !== $b['time']) {
75
            return ($a['time'] > $b['time']) ? -1 : 1;
76
        }
77
        return 0;
78
    }
79
}
80