Skip to content

Commit 872df6b

Browse files
committed
Merge pull request #719 from ewjoachim/duplicate_sql
Display the count of SQL duplicates (fixes #27)
2 parents 39b4231 + 0988bd9 commit 872df6b

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

debug_toolbar/panels/sql/panel.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ def disable_instrumentation(self):
139139
def process_response(self, request, response):
140140
colors = contrasting_color_generator()
141141
trace_colors = defaultdict(lambda: next(colors))
142+
query_duplicates = defaultdict(lambda: defaultdict(int))
142143
if self._queries:
143144
width_ratio_tally = 0
144145
factor = int(256.0 / (len(self._databases) * 2.5))
@@ -161,6 +162,8 @@ def process_response(self, request, response):
161162
trans_id = None
162163
i = 0
163164
for alias, query in self._queries:
165+
query_duplicates[alias][query["raw_sql"]] += 1
166+
164167
trans_id = query.get('trans_id')
165168
last_trans_id = trans_ids.get(alias)
166169

@@ -204,6 +207,30 @@ def process_response(self, request, response):
204207
if trans_id:
205208
self._queries[(i - 1)][1]['ends_trans'] = True
206209

210+
# Queries are duplicates only if there's as least 2 of them.
211+
# Also, to hide queries, we need to give all the duplicate groups an id
212+
query_duplicates = dict(
213+
(alias, dict(
214+
(query, duplicate_count)
215+
for query, duplicate_count in queries.items()
216+
if duplicate_count >= 2
217+
))
218+
for alias, queries in query_duplicates.items()
219+
)
220+
221+
for alias, query in self._queries:
222+
try:
223+
duplicates_count = query_duplicates[alias][query["raw_sql"]]
224+
query["duplicate_count"] = duplicates_count
225+
except KeyError:
226+
pass
227+
228+
for alias, alias_info in self._databases.items():
229+
try:
230+
alias_info["duplicate_count"] = sum(e for e in query_duplicates[alias].values())
231+
except KeyError:
232+
pass
233+
207234
self.record_stats({
208235
'databases': sorted(self._databases.items(), key=lambda x: -x[1]['time_spent']),
209236
'queries': [q for a, q in self._queries],

debug_toolbar/templates/debug_toolbar/panels/sql.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
{% for alias, info in databases %}
55
<li>
66
<strong class="djdt-label"><span data-background-color="rgb({{ info.rgb_color|join:", " }})" class="djdt-color">&#160;</span> {{ alias }}</strong>
7-
<span class="djdt-info">{{ info.time_spent|floatformat:"2" }} ms ({% blocktrans count info.num_queries as num %}{{ num }} query{% plural %}{{ num }} queries{% endblocktrans %})</span>
7+
<span class="djdt-info">{{ info.time_spent|floatformat:"2" }} ms ({% blocktrans count info.num_queries as num %}{{ num }} query{% plural %}{{ num }} queries{% endblocktrans %}
8+
{% if info.duplicate_count %}
9+
{% blocktrans with dupes=info.duplicate_count %}including {{ dupes }} duplicates{% endblocktrans %}
10+
{% endif %})</span>
811
</li>
912
{% endfor %}
1013
</ul>
@@ -32,6 +35,10 @@
3235
<div class="djDebugSqlWrap">
3336
<div class="djDebugSql">{{ query.sql|safe }}</div>
3437
</div>
38+
{% if query.duplicate_count %}
39+
<strong>{% blocktrans with dupes=query.duplicate_count %}Duplicated {{ dupes }} times.{% endblocktrans %}
40+
</strong>
41+
{% endif %}
3542
</td>
3643
<td class="timeline">
3744
<div class="djDebugTimeline"><div class="djDebugLineChart{% if query.is_slow %} djDebugLineChartWarning{% endif %}" data-left="{{ query.start_offset|unlocalize }}%"><strong data-width="{{ query.width_ratio_relative|unlocalize }}%" data-background-color"{{ query.trace_color }}">{{ query.width_ratio }}%</strong></div></div>

0 commit comments

Comments
 (0)