Skip to content

Commit 80bdff1

Browse files
authored
Merge pull request #14 from socialblue/develop
adds explain view
2 parents c929fd0 + 8eea901 commit 80bdff1

File tree

6 files changed

+159
-7
lines changed

6 files changed

+159
-7
lines changed

config/config.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
return [
77
'cache' => [
88
'key' => env('QUERY_ADVISER_CACHE_KEY', 'query_adviser_recent'),
9-
'ttl' => env('QUERY_ADVISER_CACHE_TTL', 60),
9+
'ttl' => env('QUERY_ADVISER_CACHE_TTL', 3600),
1010
'max_entries' => env('QUERY_ADVISER_CACHE_MAX_ENTRIES', 10000)
1111
]
1212
];

resources/views/explain.blade.php

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport"
6+
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
7+
<meta http-equiv="X-UA-Compatible" content="ie=edge">
8+
<title>Laravel Query Adviser</title>
9+
</head>
10+
<body>
11+
<h1>Query Adviser - EXPLAIN</h1>
12+
<a href="/query-adviser/query">Back</a>
13+
14+
<summary>
15+
<dl>
16+
<dt>sql</dt>
17+
<dd>{{Socialblue\LaravelQueryAdviser\Helper\QueryBuilderHelper::combineQueryAndBindings($query['sql'], $query['bindings'])}}</dd>
18+
19+
<dt>Time</dt>
20+
<dd>{{$query['time']}}</dd>
21+
<dt>Route</dt>
22+
<dd>{{$query['url']}}</dd>
23+
</dl>
24+
25+
26+
27+
</summary>
28+
29+
30+
<section>
31+
<div>
32+
@foreach($queryParts as $queryPart)
33+
<div class="query-group">
34+
{{$queryPart->table}}
35+
</div>
36+
<div class="query">
37+
<dl>
38+
<dt>Select type</dt>
39+
<dd>{{$queryPart->select_type}}</dd>
40+
41+
<dt>Type</dt>
42+
<dd>{{$queryPart->type}}</dd>
43+
44+
<dt>Possible keys</dt>
45+
<dd>{{$queryPart->possible_keys}}</dd>
46+
47+
<dt>Key used</dt>
48+
<dd>{{$queryPart->key}}</dd>
49+
50+
<dt>key len</dt>
51+
<dd>{{$queryPart->key_len}}</dd>
52+
53+
<dt>rows</dt>
54+
<dd>{{$queryPart->rows}}</dd>
55+
56+
<dt>filtered</dt>
57+
<dd>{{$queryPart->filtered}}</dd>
58+
</dl>
59+
</div>
60+
@endforeach
61+
62+
</div>
63+
</section>
64+
<style>
65+
.query-group {
66+
font-family: Consolas;
67+
font-size: 24px;
68+
font-weight: bold;
69+
padding: 10px 4px 4px 10px;
70+
background: rgba(128,128,128, 0.4);
71+
border: 1px solid rgba(128, 128, 128, 0.6);
72+
position: relative;
73+
clear: both;
74+
}
75+
76+
.query {
77+
position: relative;
78+
clear: both;
79+
width: 90%;
80+
border: 1px solid rgba(128, 128, 128, 0.6);
81+
font-family: Consolas;
82+
font-size: 16px;
83+
margin: 4px;
84+
}
85+
86+
.query .text {
87+
position: relative;
88+
width: calc(95% - 100px);
89+
max-height: 40px;
90+
padding: 10px 4px 4px 10px;
91+
overflow-y: scroll;
92+
}
93+
94+
.query .btn {
95+
position: relative;
96+
margin: 10px;
97+
width: 80px;
98+
float: right;
99+
left: 5px;
100+
right: 5px;
101+
font-size: 10px;
102+
text-decoration: underline;
103+
text-transform: uppercase;
104+
}
105+
</style>
106+
107+
108+
</body>
109+
</html>

resources/views/index.blade.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
</div>
1818

1919
@if(is_array($querys[0]))
20-
@foreach($querys as $query)
20+
@foreach($querys as $key => $query)
2121
<div class="query">
2222
<div class="text">
23-
{{Socialblue\LaravelQueryAdviser\Helper\QueryBuilderHelper::combineQueryAndBindings($query['sql'] ?? $query[0], $query['bindings'] ?? $query[1])}}
23+
{{$query['time']}} | {{$query['url']}} | {{Socialblue\LaravelQueryAdviser\Helper\QueryBuilderHelper::combineQueryAndBindings($query['sql'] ?? $query[0], $query['bindings'] ?? $query[1])}}
2424
</div>
25-
<div class="btn">
26-
EXEC | EXPLAIN
25+
<div class="btn" data-time="{{$time}}}" data-time-key="{{$key}}">
26+
<a target="_blank" href="/query-adviser/api/query/exec/?time={{$time}}&time-key={{$key}}">EXEC</a> | <a href="/query-adviser/query/explain/?time={{$time}}&time-key={{$key}}">EXPLAIN</a>
2727
</div>
2828
</div>
2929
@endforeach

routes/web.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33

44
Route::get('/query', 'QueryController@index');
55

6+
Route::get('/query/explain', 'QueryController@explain');
7+
8+
69
Route::prefix('api')->group(function () {
710
Route::get('/query/get', 'QueryController@get');
8-
});
11+
});
12+
13+
Route::prefix('api')->group(function () {
14+
Route::get('/query/exec', 'QueryController@exec');
15+
});
16+

src/Http/Controllers/QueryController.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
use Illuminate\Routing\Controller;
66
use Illuminate\Http\Request;
77
use Illuminate\Support\Facades\Cache;
8+
use Illuminate\Support\Facades\DB;
9+
use Socialblue\LaravelQueryAdviser\Helper\QueryBuilderHelper;
810

911
class QueryController extends Controller
1012
{
@@ -19,4 +21,31 @@ public function get(Request $request)
1921
{
2022
return Cache::get(config('laravel-query-adviser.cache.key'), []);
2123
}
24+
25+
public function exec(Request $request)
26+
{
27+
$data = Cache::get(config('laravel-query-adviser.cache.key'), []);
28+
29+
if (isset($data[$request->get('time')][$request->get('time-key')])) {
30+
$query = $data[$request->get('time')][$request->get('time-key')];
31+
return DB::connection()->select($query['sql'], $query['bindings']);
32+
}
33+
34+
return false;
35+
}
36+
37+
38+
public function explain(Request $request)
39+
{
40+
$data = Cache::get(config('laravel-query-adviser.cache.key'), []);
41+
$queryData = [];
42+
$query = '';
43+
if (isset($data[$request->get('time')][$request->get('time-key')])) {
44+
$query = $data[$request->get('time')][$request->get('time-key')];
45+
$queryData = DB::connection()->select('EXPLAIN EXTENDED '. $query['sql'], $query['bindings']);
46+
}
47+
48+
return view('QueryAdviser::explain', ['queryParts' => $queryData, 'query' => $query]);
49+
}
50+
2251
}

src/LaravelQueryAdviserServiceProvider.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,14 @@ public function boot()
5757
}
5858

5959
DB::listen(function($query) {
60+
61+
$url = url()->current();
62+
if (strpos($url, '/query-adviser') === 0) {
63+
return;
64+
}
65+
6066
$data = Cache::get(config('laravel-query-adviser.cache.key'), []);
61-
$data[time()][] = ['sql' => $query->sql, 'bindings' => $query->bindings, 'time' => $query->time];
67+
$data[time()][] = ['sql' => $query->sql, 'bindings' => $query->bindings, 'time' => $query->time, 'url' => $url];
6268

6369
if (count($data) > config('laravel-query-adviser.cache.max_entries')) {
6470
array_shift($data);

0 commit comments

Comments
 (0)