Skip to content
Snippets Groups Projects
Commit b7a3844f authored by Tanner Prestegard's avatar Tanner Prestegard Committed by GraceDB
Browse files

Optimization for searches

Adding some optimization in search forms by using select_related
and prefetch_related.  Some of this is on the Superevent model
within the get_internal_events and get_external_events methods.
parent 93b4adf9
No related branches found
No related tags found
No related merge requests found
......@@ -17,6 +17,7 @@ logger = logging.getLogger(__name__)
htmlEntityStar = "★"
errorMarker = '<span style="color:red;">'+htmlEntityStar+'</span>'
class MainSearchForm(forms.Form):
QUERY_TYPE_CHOICES = (
('E', 'Event'),
......@@ -31,7 +32,7 @@ class MainSearchForm(forms.Form):
query = forms.CharField(required=False, widget=forms.TextInput(
attrs={'size': 60}))
query_type = forms.ChoiceField(required=True,
choices=QUERY_TYPE_CHOICES, label="Search for", initial='S')
choices=QUERY_TYPE_CHOICES, label="Search for", initial='E')
get_neighbors = forms.BooleanField(required=False,
help_text="(Events only)")
results_format = forms.ChoiceField(required=False, initial='S',
......@@ -47,19 +48,28 @@ class MainSearchForm(forms.Form):
query_string = self.cleaned_data.get('query')
query_type = self.cleaned_data.get('query_type')
# Set attributes based on object type
# Add fields to use with select_related and prefetch_related
# for optimization
if query_type == 'S':
model = Superevent
parse_func = parseSupereventQuery
s_rel = ['preferred_event__group', 'submitter']
p_rel = ['labelling_set__label', 'labelling_set__creator']
elif query_type == 'E':
model = Event
parse_func = parseQuery
s_rel = ['group', 'pipeline', 'search', 'submitter']
p_rel = ['labelling_set__label', 'labelling_set__creator']
# Don't need to check anything else here, can expect data to be good
# thanks to base class clean
# Parse query and get resulting objects
try:
qs = model.objects.filter(parse_func(query_string))
qs = filter_for_labels(qs,query_string).distinct()
qs = model.objects.filter(parse_func(query_string)) \
.select_related(*s_rel).prefetch_related(*p_rel)
qs = filter_for_labels(qs, query_string).distinct()
cleaned_data['query'] = qs
return cleaned_data
except ParseException as e:
......
......@@ -304,16 +304,17 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel):
letter_suffix
# Custom methods ----------------------------------------------------------
# TODO: may want to add select or prefetch here to speed up access to group
# names, since that is used in calculating the graceid as well
def get_external_events(self):
def get_external_events(self, related_fields=['group']):
"""Returns a queryset of external events"""
return self.events.filter(group__name=settings.EXTERNAL_ANALYSIS_GROUP)
return self.events.filter(
group__name=settings.EXTERNAL_ANALYSIS_GROUP) \
.select_related(*related_fields)
def get_internal_events(self):
def get_internal_events(self, related_fields=['group']):
"""Returns a queryset of internal events"""
return self.events.exclude(group__name=
settings.EXTERNAL_ANALYSIS_GROUP)
return self.events.exclude(
group__name=settings.EXTERNAL_ANALYSIS_GROUP) \
.select_related(*related_fields)
def get_web_url(self):
return reverse('superevents:view', args=[self.superevent_id])
......@@ -329,6 +330,7 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel):
# To be raised when an attempt is made to remove the preferred event.
pass
class Log(CleanSaveModel, LogBase, AutoIncrementModel):
"""
Log message object attached to a Superevent. Uses the AutoIncrementModel
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment