Skip to content

Commit 0603ed4

Browse files
committed
record queries smartly
1 parent aaa3ade commit 0603ed4

File tree

2 files changed

+69
-28
lines changed

2 files changed

+69
-28
lines changed

readthedocs/search/api.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import itertools
22
import logging
33

4+
from django.utils import timezone
45
from rest_framework import generics, serializers
56
from rest_framework.exceptions import ValidationError
67
from rest_framework.pagination import PageNumberPagination
@@ -160,15 +161,19 @@ def list(self, request, *args, **kwargs):
160161

161162
project_slug = self.request.query_params.get('project', None)
162163
version_slug = self.request.query_params.get('version', None)
163-
query = self.request.query_params.get('q', '')
164164
total_results = response.data.get('count', 0)
165+
time = timezone.now()
166+
167+
query = self.request.query_params.get('q', '')
168+
query = query.lower()
165169

166170
# record the search query with a celery task
167171
tasks.record_search_query.delay(
168172
project_slug,
169173
version_slug,
170174
query,
171175
total_results,
176+
time,
172177
)
173178

174179
return response

readthedocs/search/tasks.py

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -142,37 +142,73 @@ def delete_old_search_queries_from_db():
142142

143143

144144
@app.task(queue='web')
145-
def record_search_query(project_slug, version_slug, query, total_results):
146-
"""Record search query in database."""
147-
if not project_slug or not version_slug or not query or not total_results:
145+
def record_search_query(project_slug, version_slug, query, total_results, time):
146+
"""Record/update search query in database."""
147+
if not project_slug or not version_slug or not query:
148148
log.debug(
149149
'Not recording the search query. Passed arguments: '
150-
'project_slug: %s, version_slug: %s, query: %s, total_results: %s' % (
151-
project_slug, version_slug, query, total_results
150+
'project_slug: %s, version_slug: %s, query: %s, total_results: %s, time: %s' % (
151+
project_slug, version_slug, query, total_results, time
152152
)
153153
)
154154
return
155155

156-
project_qs = Project.objects.filter(slug=project_slug)
157-
158-
if not project_qs.exists():
159-
log.debug(
160-
'Not recording the search query because project does not exist. '
161-
'project_slug: %s' % (
162-
project_slug
163-
)
164-
)
156+
before_10_sec = time - timezone.timedelta(seconds=10)
157+
partial_query_qs = SearchQuery.objects.filter(
158+
project__slug=project_slug,
159+
version__slug=version_slug,
160+
query__startswith=query,
161+
created__gte=before_10_sec,
162+
).order_by('-created')
163+
164+
# if partial query exists,
165+
# just update it instead of creating new SearchQuery object.
166+
if partial_query_qs.exists():
167+
obj = partial_query_qs.first()
168+
obj.created = time
169+
obj.query = query
170+
obj.save()
165171
return
166-
167-
project = project_qs.first()
168-
version_qs = Version.objects.filter(project=project, slug=version_slug)
169-
170-
if not version_qs.exists():
171-
return
172-
173-
version = version_qs.first()
174-
SearchQuery.objects.create(
175-
project=project,
176-
version=version,
177-
query=query,
178-
)
172+
else:
173+
# don't record query with zero results.
174+
if not total_results:
175+
log.debug(
176+
'Not recording search query because of zero results. Passed arguments: '
177+
'project_slug: %s, version_slug: %s, query: %s, total_results: %s, time: %s' % (
178+
project_slug, version_slug, query, total_results, time
179+
)
180+
)
181+
return
182+
else:
183+
project_qs = Project.objects.filter(slug=project_slug)
184+
if not project_qs.exists():
185+
log.debug(
186+
'Not recording the search query because project does not exist. '
187+
'project_slug: %s' % (
188+
project_slug
189+
)
190+
)
191+
return
192+
193+
project = project_qs.first()
194+
version_qs = Version.objects.filter(project=project, slug=version_slug)
195+
196+
if not version_qs.exists():
197+
log.debug(
198+
'Not recording the search query because version does not exist. '
199+
'project_slug: %s, version_slug: %s' % (
200+
project_slug, version_slug
201+
)
202+
)
203+
return
204+
205+
version = version_qs.first()
206+
207+
# make a new SearchQuery object.
208+
obj = SearchQuery.objects.create(
209+
project=project,
210+
version=version,
211+
query=query,
212+
)
213+
obj.created = time
214+
obj.save()

0 commit comments

Comments
 (0)