Passed
Push — master ( 477c3d...43cf80 )
by Paul
05:05
created

Queries::id()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 1
b 0
f 0
1
<?php
2
3
namespace GeminiLabs\BlackBar\Modules;
4
5
use GeminiLabs\BlackBar\Application;
6
7
class Queries implements Module
8
{
9
    /**
10
     * @var Application
11
     */
12
    protected $app;
13
14
    public function __construct(Application $app)
15
    {
16
        $this->app = $app;
17
    }
18
19
    public function entries(): array
20
    {
21
        global $wpdb;
22
        $entries = [];
23
        $index = 0;
24
        $search = [
25
            'FROM', 'GROUP BY', 'INNER JOIN', 'LEFT JOIN', 'LIMIT',
26
            'ON DUPLICATE KEY UPDATE', 'ORDER BY', 'OFFSET', ' SET', 'WHERE',
27
        ];
28
        $replace = array_map(function ($value) {
29
            return PHP_EOL.$value;
30
        }, $search);
31
        foreach ($wpdb->queries as $query) {
32
            $miliseconds = number_format(round($query[1] * 1000, 4), 4);
33
            $sql = preg_replace('/\s\s+/', ' ', trim($query[0]));
34
            $sql = str_replace(PHP_EOL, ' ', $sql);
35
            $sql = str_replace(['( ',' )',' ,'], ['(',')',','], $sql);
36
            $sql = str_replace($search, $replace, $sql);
37
            $parts = explode(PHP_EOL, $sql);
38
            $sql = array_reduce($parts, function ($carry, $part) {
39
                if (str_starts_with($part, 'SELECT') && strlen($part) > 100) {
40
                    $part = preg_replace('/\s*(,)\s*/', ','.PHP_EOL.'  ', $part);
41
                }
42
                if (str_starts_with($part, 'WHERE')) {
43
                    $part = str_replace('AND', PHP_EOL.'  AND', $part);
44
                }
45
                return $carry.$part.PHP_EOL;
46
            });
47
            $trace = explode(', ', $query[2]);
48
            $entries[] = [
49
                'index' => $index++,
50
                'sql' => $sql,
51
                'time' => $miliseconds,
52
                'trace' => array_reverse($trace, true),
53
            ];
54
        }
55
        uasort($entries, [$this, 'sortByTime']);
56
        return $entries;
57
    }
58
59
    public function hasEntries(): bool
60
    {
61
        global $wpdb;
62
        return !empty($wpdb->queries);
63
    }
64
65
    public function id(): string
66
    {
67
        return 'glbb-queries';
68
    }
69
70
    public function isVisible(): bool
71
    {
72
        return true;
73
    }
74
75
    public function label(): string
76
    {
77
        $label = __('SQL', 'blackbar');
78
        if (!defined('SAVEQUERIES') || !SAVEQUERIES) {
79
            return $label;
80
        }
81
        global $wpdb;
82
        $queryTime = 0;
83
        foreach ($wpdb->queries as $query) {
84
            $queryTime += $query[1];
85
        }
86
        $queryTime = number_format($queryTime * 1000, 2);
87
        $queriesCount = sprintf('<span class="glbb-queries-count">%s</span>', count($wpdb->queries));
88
        $queriesTime = sprintf('<span class="glbb-queries-time">%s</span>', $queryTime);
89
        $info = sprintf('<span class="glbb-link-info">(%s / %s ms)</span>', $queriesCount, $queriesTime);
90
        return sprintf('%s %s', $label, $info);
91
    }
92
93
    public function render(): void
94
    {
95
        $this->app->render('panels/queries', ['queries' => $this]);
96
    }
97
98
    protected function sortByTime(array $a, array $b): int
99
    {
100
        if ($a['time'] !== $b['time']) {
101
            return ($a['time'] > $b['time']) ? -1 : 1;
102
        }
103
        return 0;
104
    }
105
}
106