Skip to content

Commit

Permalink
Merge pull request #14 from socialblue/develop
Browse files Browse the repository at this point in the history
adds explain view
  • Loading branch information
mbroersen committed Jun 3, 2019
2 parents c929fd0 + 8eea901 commit 80bdff1
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 80bdff1

Please sign in to comment.