Skip to content

Commit

Permalink
adds explain view
Browse files Browse the repository at this point in the history
adds routes to explain and exec
adds endpoint used to query info cache
  • Loading branch information
mbroersen committed Jun 3, 2019
1 parent 64b458f commit 8eea901
Show file tree
Hide file tree
Showing 6 changed files with 159 additions and 7 deletions.
2 changes: 1 addition & 1 deletion config/config.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
return [
'cache' => [
'key' => env('QUERY_ADVISER_CACHE_KEY', 'query_adviser_recent'),
'ttl' => env('QUERY_ADVISER_CACHE_TTL', 60),
'ttl' => env('QUERY_ADVISER_CACHE_TTL', 3600),
'max_entries' => env('QUERY_ADVISER_CACHE_MAX_ENTRIES', 10000)
]
];
109 changes: 109 additions & 0 deletions resources/views/explain.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Laravel Query Adviser</title>
</head>
<body>
<h1>Query Adviser - EXPLAIN</h1>
<a href="/query-adviser/query">Back</a>

<summary>
<dl>
<dt>sql</dt>
<dd>{{Socialblue\LaravelQueryAdviser\Helper\QueryBuilderHelper::combineQueryAndBindings($query['sql'], $query['bindings'])}}</dd>

<dt>Time</dt>
<dd>{{$query['time']}}</dd>
<dt>Route</dt>
<dd>{{$query['url']}}</dd>
</dl>



</summary>


<section>
<div>
@foreach($queryParts as $queryPart)
<div class="query-group">
{{$queryPart->table}}
</div>
<div class="query">
<dl>
<dt>Select type</dt>
<dd>{{$queryPart->select_type}}</dd>

<dt>Type</dt>
<dd>{{$queryPart->type}}</dd>

<dt>Possible keys</dt>
<dd>{{$queryPart->possible_keys}}</dd>

<dt>Key used</dt>
<dd>{{$queryPart->key}}</dd>

<dt>key len</dt>
<dd>{{$queryPart->key_len}}</dd>

<dt>rows</dt>
<dd>{{$queryPart->rows}}</dd>

<dt>filtered</dt>
<dd>{{$queryPart->filtered}}</dd>
</dl>
</div>
@endforeach

</div>
</section>
<style>
.query-group {
font-family: Consolas;
font-size: 24px;
font-weight: bold;
padding: 10px 4px 4px 10px;
background: rgba(128,128,128, 0.4);
border: 1px solid rgba(128, 128, 128, 0.6);
position: relative;
clear: both;
}
.query {
position: relative;
clear: both;
width: 90%;
border: 1px solid rgba(128, 128, 128, 0.6);
font-family: Consolas;
font-size: 16px;
margin: 4px;
}
.query .text {
position: relative;
width: calc(95% - 100px);
max-height: 40px;
padding: 10px 4px 4px 10px;
overflow-y: scroll;
}
.query .btn {
position: relative;
margin: 10px;
width: 80px;
float: right;
left: 5px;
right: 5px;
font-size: 10px;
text-decoration: underline;
text-transform: uppercase;
}
</style>


</body>
</html>
8 changes: 4 additions & 4 deletions resources/views/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@
</div>

@if(is_array($querys[0]))
@foreach($querys as $query)
@foreach($querys as $key => $query)
<div class="query">
<div class="text">
{{Socialblue\LaravelQueryAdviser\Helper\QueryBuilderHelper::combineQueryAndBindings($query['sql'] ?? $query[0], $query['bindings'] ?? $query[1])}}
{{$query['time']}} | {{$query['url']}} | {{Socialblue\LaravelQueryAdviser\Helper\QueryBuilderHelper::combineQueryAndBindings($query['sql'] ?? $query[0], $query['bindings'] ?? $query[1])}}
</div>
<div class="btn">
EXEC | EXPLAIN
<div class="btn" data-time="{{$time}}}" data-time-key="{{$key}}">
<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>
</div>
</div>
@endforeach
Expand Down
10 changes: 9 additions & 1 deletion routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@

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

Route::get('/query/explain', 'QueryController@explain');


Route::prefix('api')->group(function () {
Route::get('/query/get', 'QueryController@get');
});
});

Route::prefix('api')->group(function () {
Route::get('/query/exec', 'QueryController@exec');
});

29 changes: 29 additions & 0 deletions src/Http/Controllers/QueryController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
use Illuminate\Routing\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Socialblue\LaravelQueryAdviser\Helper\QueryBuilderHelper;

class QueryController extends Controller
{
Expand All @@ -19,4 +21,31 @@ public function get(Request $request)
{
return Cache::get(config('laravel-query-adviser.cache.key'), []);
}

public function exec(Request $request)
{
$data = Cache::get(config('laravel-query-adviser.cache.key'), []);

if (isset($data[$request->get('time')][$request->get('time-key')])) {
$query = $data[$request->get('time')][$request->get('time-key')];
return DB::connection()->select($query['sql'], $query['bindings']);
}

return false;
}


public function explain(Request $request)
{
$data = Cache::get(config('laravel-query-adviser.cache.key'), []);
$queryData = [];
$query = '';
if (isset($data[$request->get('time')][$request->get('time-key')])) {
$query = $data[$request->get('time')][$request->get('time-key')];
$queryData = DB::connection()->select('EXPLAIN EXTENDED '. $query['sql'], $query['bindings']);
}

return view('QueryAdviser::explain', ['queryParts' => $queryData, 'query' => $query]);
}

}
8 changes: 7 additions & 1 deletion src/LaravelQueryAdviserServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,14 @@ public function boot()
}

DB::listen(function($query) {

$url = url()->current();
if (strpos($url, '/query-adviser') === 0) {
return;
}

$data = Cache::get(config('laravel-query-adviser.cache.key'), []);
$data[time()][] = ['sql' => $query->sql, 'bindings' => $query->bindings, 'time' => $query->time];
$data[time()][] = ['sql' => $query->sql, 'bindings' => $query->bindings, 'time' => $query->time, 'url' => $url];

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

0 comments on commit 8eea901

Please sign in to comment.