Skip to content

Commit fe792d3

Browse files
committed
Streamline queries panel and introduce entities panel if Quick is installed
1 parent eb0e8cb commit fe792d3

File tree

8 files changed

+193
-71
lines changed

8 files changed

+193
-71
lines changed

ModuleConfig.cfc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,15 @@ component {
7777
interceptorName = "QBCollector@cbdebugger"
7878
);
7979
}
80+
81+
if ( settings.debugger.showQBPanel && controller.getModuleService().isModuleRegistered( "quick" ) ) {
82+
controller
83+
.getInterceptorService()
84+
.registerInterceptor(
85+
interceptorClass = "#moduleMapping#.interceptors.QuickCollector",
86+
interceptorName = "QuickCollector@cbdebugger"
87+
);
88+
}
8089
}
8190

8291
/**

includes/css/cbox-debugger.css

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@
2727
cursor: pointer;
2828
color: black;
2929
}
30+
.fw_subtitles{
31+
font-size: 10px;
32+
font-weight: bold;
33+
color: black;
34+
border:1px solid #D3D3D3;
35+
background: #D7EBF9;
36+
padding:5px 5px 5px 5px;
37+
margin-bottom: 2px;
38+
-moz-border-radius: 5px;
39+
-webkit-border-radius: 5px;
40+
-khtml-border-radius: 5px;
41+
}
3042
.fw_profilers{
3143
font-size: 10px;
3244
font-weight:bold;
@@ -209,3 +221,30 @@
209221
background-color: #FFF6CC;
210222
border: 1px solid #999999;
211223
}
224+
.fw_badge_light{
225+
display: inline-block;
226+
padding: .25em .4em;
227+
font-weight: 700;
228+
line-height: 1;
229+
text-align: center;
230+
white-space: nowrap;
231+
vertical-align: baseline;
232+
border-radius: .25rem;
233+
color: black;
234+
background: #D7EBF9;
235+
border:1px solid #D3D3D3;
236+
}
237+
238+
.fw_badge_dark{
239+
display: inline-block;
240+
padding: .25em .4em;
241+
font-weight: 700;
242+
line-height: 1;
243+
text-align: center;
244+
white-space: nowrap;
245+
vertical-align: baseline;
246+
border-radius: .25rem;
247+
color: white;
248+
border: 1px solid #2694E8;
249+
background: #3BAAE3;
250+
}

includes/css/cbox-debugger.pack.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

includes/js/cbox-debugger.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,14 @@ function fw_toggleDiv(targetDiv, displayStyle){
6565
else{
6666
target.style.display = displayStyle;
6767
}
68-
}
68+
}
69+
70+
function fw_showGroupedQueries() {
71+
fw_toggleDiv("timelineQueries", "none");
72+
fw_toggleDiv("groupedQueries", "block");
73+
}
74+
75+
function fw_showTimelineQueries() {
76+
fw_toggleDiv("groupedQueries", "none");
77+
fw_toggleDiv("timelineQueries", "block");
78+
}

includes/js/cbox-debugger.pack.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

includes/panels/qbPanel.cfm

Lines changed: 106 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -11,77 +11,119 @@ Date : September 25, 2005
1111
Description :
1212
Debugging template for the application
1313
----------------------------------------------------------------------->
14+
<cfscript>
15+
var isQuickInstalled = getController().getModuleService().isModuleRegistered( "quick" );
16+
var isQBInstalled = getController().getModuleService().isModuleRegistered( "qb" );
17+
var totalQueries = request.cbdebugger.keyExists( "qbQueries" ) ? request.cbdebugger.qbQueries.all.len() : 0;
18+
var totalEntities = request.cbdebugger.keyExists( "quick" ) ? request.cbdebugger.quick.total : 0;
19+
</cfscript>
1420
<cfoutput>
1521
<div class="fw_titles" onClick="fw_toggle('fw_qbPanel')" >
16-
&nbsp;qb
22+
&nbsp;<cfif isQuickInstalled>Quick &##47; </cfif>qb
1723
</div>
1824
<div class="fw_debugContent<cfif instance.debuggerConfig.expandedQBPanel>View</cfif>" id="fw_qbPanel">
19-
<cfif NOT getController().getModuleService().isModuleRegistered( "qb" )>
20-
qb is not installed or registered.
21-
<cfelse>
22-
<cfif NOT request.cbdebugger.keyExists( "qbQueries" ) OR request.cbdebugger.qbQueries.isEmpty()>
23-
No queries executed
25+
<div id="qbQueries">
26+
<cfif NOT isQBInstalled>
27+
qb is not installed or registered.
2428
<cfelse>
25-
<table border="0" align="center" cellpadding="0" cellspacing="1" class="fw_debugTables">
26-
<thead>
27-
<tr>
28-
<th width="5%">Count</th>
29-
<th>Query</th>
30-
</tr>
31-
</thead>
32-
<tbody>
33-
<cfloop array="#request.cbdebugger.qbQueries.keyArray()#" index="sql">
29+
<div class="fw_subtitles">&nbsp;Queries <span class="fw_badge_dark" style="margin-left: 1em;">#totalQueries#</span></div>
30+
<div style="padding: 1em;">
31+
<input type="button" style="font-size:10px" value="Grouped View" onClick="fw_showGroupedQueries()">
32+
<input type="button" style="font-size:10px" value="Timeline View" onClick="fw_showTimelineQueries()">
33+
</div>
34+
<cfif totalQueries EQ 0>
35+
No queries executed
36+
<cfelse>
37+
<div id="groupedQueries">
38+
<table border="0" align="center" cellpadding="0" cellspacing="1" class="fw_debugTables">
39+
<thead>
40+
<tr>
41+
<th width="5%">Count</th>
42+
<th>Query</th>
43+
</tr>
44+
</thead>
45+
<tbody>
46+
<cfloop array="#request.cbdebugger.qbQueries.grouped.keyArray()#" index="sql">
47+
<tr>
48+
<td align="center">#request.cbdebugger.qbQueries.grouped[ sql ].len()#</td>
49+
<td>#sql#</td>
50+
</tr>
51+
<tr style="margin-right: 2em;">
52+
<td></td>
53+
<td style="width: 100%;">
54+
<table border="0" align="center" cellpadding="0" cellspacing="1" class="fw_debugTables">
55+
<thead>
56+
<tr>
57+
<th>Timestamp</th>
58+
<th>Execution Time</th>
59+
<th>Bindings</th>
60+
</tr>
61+
</thead>
62+
<tbody>
63+
<cfloop array="#request.cbdebugger.qbQueries.grouped[ sql ]#" index="q">
64+
<tr>
65+
<td>#TimeFormat(q.timestamp,"hh:MM:SS.l tt")#</td>
66+
<td>#q.executionTime# ms</td>
67+
<td><cfdump var="#q.bindings#" expand="false" /></td>
68+
</tr>
69+
</cfloop>
70+
</tbody>
71+
</table>
72+
</td>
73+
</tr>
74+
</cfloop>
75+
</tbody>
76+
</table>
77+
</div>
78+
<div id="timelineQueries" style="display: none;">
79+
<table border="0" align="center" cellpadding="0" cellspacing="1" class="fw_debugTables">
80+
<thead>
81+
<tr>
82+
<th>Timestamp</th>
83+
<th width="80%">Query</th>
84+
<th align="center">Execution Time</th>
85+
<th>Bindings</th>
86+
</tr>
87+
</thead>
88+
<tbody>
89+
<cfloop array="#request.cbdebugger.qbQueries.all#" index="q">
90+
<tr <cfif debugTimers.currentrow mod 2 eq 0>class="even"</cfif>>
91+
<td>#TimeFormat(q.timestamp,"hh:MM:SS.l tt")#</td>
92+
<td>#q.sql#</td>
93+
<td>#q.executionTime# ms</td>
94+
<td><cfdump var="#q.bindings#" expand="false" /></td>
95+
</tr>
96+
</cfloop>
97+
</tbody>
98+
</table>
99+
</div>
100+
</cfif>
101+
</cfif>
102+
</div>
103+
<cfif isQuickInstalled>
104+
<div id="quickEntities" style="margin-top: 1em;">
105+
<div class="fw_subtitles">&nbsp;Entities <span class="fw_badge_dark" style="margin-left: 1em;">#totalEntities#</span></div>
106+
<cfif totalEntities EQ 0>
107+
No Quick entities loaded.
108+
<cfelse>
109+
<table border="0" align="center" cellpadding="0" cellspacing="1" class="fw_debugTables" style="margin-top: 1em;">
110+
<thead>
34111
<tr>
35-
<td align="center">#request.cbdebugger.qbQueries[ sql ].len()#</td>
36-
<td>#sql#</td>
37-
</tr>
38-
<tr style="margin-right: 2em;">
39-
<td></td>
40-
<td style="width: 100%;">
41-
<table border="0" align="center" cellpadding="0" cellspacing="1" class="fw_debugTables">
42-
<thead>
43-
<tr>
44-
<th>Timestamp</th>
45-
<th>Execution Time</th>
46-
<th>Bindings</th>
47-
</tr>
48-
</thead>
49-
<tbody>
50-
<cfloop array="#request.cbdebugger.qbQueries[ sql ]#" index="q">
51-
<tr>
52-
<td>#TimeFormat(q.timestamp,"hh:MM:SS.l tt")#</td>
53-
<td>#q.executionTime# ms</td>
54-
<td><cfdump var="#q.bindings#" expand="false" /></td>
55-
</tr>
56-
</cfloop>
57-
</tbody>
58-
</table>
59-
</td>
112+
<th width="5%">Count</th>
113+
<th>Mapping</th>
60114
</tr>
61-
</cfloop>
62-
</tbody>
63-
</table>
64-
<!--- <table border="0" align="center" cellpadding="0" cellspacing="1" class="fw_debugTables">
65-
<thead>
66-
<tr>
67-
<th>Timestamp</th>
68-
<th width="80%">Query</th>
69-
<th align="center">Execution Time</th>
70-
<th>Bindings</th>
71-
</tr>
72-
</thead>
73-
<tbody>
74-
<cfloop array="#request.cbdebugger.qbQueries#" index="q">
75-
<tr <cfif debugTimers.currentrow mod 2 eq 0>class="even"</cfif>>
76-
<td>#TimeFormat(q.timestamp,"hh:MM:SS.l tt")#</td>
77-
<td>#q.sql#</td>
78-
<td>#q.executionTime# ms</td>
79-
<td><cfdump var="#q.bindings#" expand="false" /></td>
80-
</tr>
81-
</cfloop>
82-
</tbody>
83-
</table> --->
84-
</cfif>
115+
</thead>
116+
<tbody>
117+
<cfloop collection="#request.cbdebugger.quick.byMapping#" item="mapping">
118+
<tr <cfif debugTimers.currentrow mod 2 eq 0>class="even"</cfif>>
119+
<td>#request.cbdebugger.quick.byMapping[ mapping ]#</td>
120+
<td>#mapping#</td>
121+
</tr>
122+
</cfloop>
123+
</tbody>
124+
</table>
125+
</cfif>
126+
</div>
85127
</cfif>
86128
</div>
87129
</cfoutput>

interceptors/QBCollector.cfc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@ component extends="coldbox.system.Interceptor"{
77
function postQBExecute( event, interceptData, rc, prc ) {
88
param request.cbdebugger = {};
99
param request.cbdebugger.qbQueries = {};
10-
if ( !structKeyExists( request.cbdebugger.qbQueries, arguments.interceptData.sql ) ) {
11-
request.cbdebugger.qbQueries[ arguments.interceptData.sql ] = [];
12-
}
10+
param request.cbdebugger.qbQueries.grouped = {};
11+
param request.cbdebugger.qbQueries.all = [];
1312
arguments.interceptData.timestamp = now();
14-
request.cbdebugger.qbQueries[ arguments.interceptData.sql ].append( arguments.interceptData )
13+
if ( !structKeyExists( request.cbdebugger.qbQueries.grouped, arguments.interceptData.sql ) ) {
14+
request.cbdebugger.qbQueries.grouped[ arguments.interceptData.sql ] = [];
15+
}
16+
request.cbdebugger.qbQueries.grouped[ arguments.interceptData.sql ].append( arguments.interceptData );
17+
request.cbdebugger.qbQueries.all.append( arguments.interceptData );
1518
}
1619

1720
}

interceptors/QuickCollector.cfc

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* QB Collector Interecptor
3+
*/
4+
component extends="coldbox.system.Interceptor"{
5+
6+
// Before we capture.
7+
function quickPostLoad( event, interceptData, rc, prc ) {
8+
param request.cbdebugger = {};
9+
param request.cbdebugger.quick = {};
10+
param request.cbdebugger.quick.total = 0;
11+
param request.cbdebugger.quick.byMapping = {};
12+
if ( !request.cbdebugger.quick.byMapping.keyExists( arguments.interceptData.entity.mappingName() ) ) {
13+
request.cbdebugger.quick.byMapping[ arguments.interceptData.entity.mappingName() ] = 0;
14+
}
15+
request.cbdebugger.quick.byMapping[ arguments.interceptData.entity.mappingName() ] += 1;
16+
request.cbdebugger.quick.total += 1;
17+
}
18+
19+
}

0 commit comments

Comments
 (0)