Skip to content

Commit 7bd678e

Browse files
authored
Merge pull request #7080 from readthedocs/track-total-results
Search: track total results
2 parents 119fe54 + 1782380 commit 7bd678e

File tree

6 files changed

+47
-22
lines changed

6 files changed

+47
-22
lines changed

readthedocs/projects/views/private.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,7 @@ def get_context_data(self, **kwargs):
10131013
qs.values('query')
10141014
.annotate(count=Count('id'))
10151015
.order_by('-count', 'query')
1016-
.values_list('query', 'count')
1016+
.values_list('query', 'count', 'total_results')
10171017
)
10181018

10191019
# only show top 100 queries
@@ -1040,7 +1040,7 @@ def _search_analytics_csv_data(self):
10401040
created__date__lte=now,
10411041
)
10421042
.order_by('-created')
1043-
.values_list('created', 'query')
1043+
.values_list('created', 'query', 'total_results')
10441044
)
10451045

10461046
file_name = '{project_slug}_from_{start}_to_{end}.csv'.format(
@@ -1052,8 +1052,8 @@ def _search_analytics_csv_data(self):
10521052
file_name = '-'.join([text for text in file_name.split() if text])
10531053

10541054
csv_data = (
1055-
[timezone.datetime.strftime(time, '%Y-%m-%d %H:%M:%S'), query]
1056-
for time, query in data
1055+
[timezone.datetime.strftime(time, '%Y-%m-%d %H:%M:%S'), query, total_results]
1056+
for time, query, total_results in data
10571057
)
10581058
pseudo_buffer = Echo()
10591059
writer = csv.writer(pseudo_buffer)

readthedocs/rtd_tests/tests/test_views.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -286,15 +286,15 @@ def test_top_queries(self):
286286
test_time.return_value = self.test_time
287287

288288
expected_result = [
289-
('hello world', 5),
290-
('documentation', 4),
291-
('read the docs', 4),
292-
('advertising', 3),
293-
('elasticsearch', 2),
294-
('sphinx', 2),
295-
('github', 1),
296-
('hello', 1),
297-
('search', 1),
289+
('hello world', 5, 0),
290+
('documentation', 4, 0),
291+
('read the docs', 4, 0),
292+
('advertising', 3, 0),
293+
('elasticsearch', 2, 0),
294+
('sphinx', 2, 0),
295+
('github', 1, 0),
296+
('hello', 1, 0),
297+
('search', 1, 0),
298298
]
299299

300300
resp = self.client.get(self.analyics_page)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 2.2.12 on 2020-05-14 17:29
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('search', '0001_initial'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='searchquery',
15+
name='total_results',
16+
field=models.IntegerField(default=0, null=True, verbose_name='Total results'),
17+
),
18+
]

readthedocs/search/models.py

+6
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ class SearchQuery(TimeStampedModel):
3232
_('Query'),
3333
max_length=4092,
3434
)
35+
total_results = models.IntegerField(
36+
_('Total results'),
37+
default=0,
38+
# TODO: to avoid downtime, remove later.
39+
null=True,
40+
)
3541
objects = RelatedProjectQuerySet.as_manager()
3642

3743
class Meta:

readthedocs/search/tasks.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ def delete_old_search_queries_from_db():
144144

145145
@app.task(queue='web')
146146
def record_search_query(project_slug, version_slug, query, total_results, time_string):
147-
"""Record/update search query in database."""
147+
"""Record/update a search query for analytics."""
148148
if not project_slug or not version_slug or not query:
149149
log.debug(
150150
'Not recording the search query. Passed arguments: '
@@ -162,11 +162,12 @@ def record_search_query(project_slug, version_slug, query, total_results, time_s
162162
modified__gte=before_10_sec,
163163
).order_by('-modified')
164164

165-
# check if partial query exists,
166-
# if yes, then just update the object.
165+
# If a partial query exists,
166+
# then just update that object.
167167
for partial_query in partial_query_qs.iterator():
168168
if query.startswith(partial_query.query):
169169
partial_query.query = query
170+
partial_query.total_results = total_results
170171
partial_query.save()
171172
return
172173

@@ -190,9 +191,9 @@ def record_search_query(project_slug, version_slug, query, total_results, time_s
190191
)
191192
return
192193

193-
version_qs = Version.objects.filter(project=project, slug=version_slug)
194+
version = Version.objects.filter(project=project, slug=version_slug).first()
194195

195-
if not version_qs.exists():
196+
if not version:
196197
log.debug(
197198
'Not recording the search query because version does not exist. '
198199
'project_slug: %s, version_slug: %s' % (
@@ -201,11 +202,10 @@ def record_search_query(project_slug, version_slug, query, total_results, time_s
201202
)
202203
return
203204

204-
version = version_qs.first()
205-
206-
# make a new SearchQuery object.
205+
# Create a new SearchQuery object.
207206
SearchQuery.objects.create(
208207
project=project,
209208
version=version,
210209
query=query,
210+
total_results=total_results,
211211
)

readthedocs/templates/projects/projects_search_analytics.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ <h3>{% trans "Top queries" %}</h3>
1616
<div class="module-list">
1717
<div class="module-list-wrapper">
1818
<ul class="long-list-overflow">
19-
{% for query, count in queries %}
19+
{% for query, count, total_results in queries %}
2020
<li class="module-item">
2121
{{ query }}
22+
({{ total_results }} result{{ total_results|pluralize:"s" }})
2223
<span class="right quiet">
2324
{{ count }} search{{ count|pluralize:"es" }}
2425
</span>

0 commit comments

Comments
 (0)