[experimental] restructure order search query for different performance characteristics

This commit is contained in:
Raphael Michel
2020-07-24 17:48:50 +02:00
parent 1fb861a117
commit 83908fde45
2 changed files with 21 additions and 17 deletions

View File

@@ -12,8 +12,8 @@ from django.utils.translation import gettext_lazy as _, pgettext_lazy
from pretix.base.forms.widgets import DatePickerWidget from pretix.base.forms.widgets import DatePickerWidget
from pretix.base.models import ( from pretix.base.models import (
Checkin, Event, EventMetaProperty, EventMetaValue, Invoice, Item, Order, Checkin, Event, EventMetaProperty, EventMetaValue, Invoice, InvoiceAddress,
OrderPayment, OrderPosition, OrderRefund, Organizer, Question, Item, Order, OrderPayment, OrderPosition, OrderRefund, Organizer, Question,
QuestionAnswer, SubEvent, QuestionAnswer, SubEvent,
) )
from pretix.base.signals import register_payment_providers from pretix.base.signals import register_payment_providers
@@ -139,26 +139,33 @@ class OrderFilterForm(FilterForm):
| Q(invoice_no__iexact=u.zfill(5)) | Q(invoice_no__iexact=u.zfill(5))
| Q(full_invoice_no__iexact=u) | Q(full_invoice_no__iexact=u)
).values_list('order_id', flat=True) ).values_list('order_id', flat=True)
matching_positions = OrderPosition.objects.filter( matching_positions = OrderPosition.objects.filter(
Q(order=OuterRef('pk')) & Q( Q(
Q(attendee_name_cached__icontains=u) | Q(attendee_email__icontains=u) Q(attendee_name_cached__icontains=u) | Q(attendee_email__icontains=u)
| Q(secret__istartswith=u) | Q(voucher__code__icontains=u) | Q(secret__istartswith=u)
) )
).values('id') ).values_list('order_id', flat=True)
matching_invoice_addresses = InvoiceAddress.objects.filter(
mainq = ( Q(
Q(name_cached__icontains=u) | Q(company__icontains=u)
)
).values_list('order_id', flat=True)
matching_orders = Order.objects.filter(
code code
| Q(email__icontains=u) | Q(email__icontains=u)
| Q(invoice_address__name_cached__icontains=u)
| Q(invoice_address__company__icontains=u)
| Q(pk__in=matching_invoices)
| Q(comment__icontains=u) | Q(comment__icontains=u)
| Q(has_pos=True) ).values_list('id', flat=True)
mainq = (
Q(pk__in=matching_orders)
| Q(pk__in=matching_invoices)
| Q(pk__in=matching_positions)
| Q(pk__in=matching_invoice_addresses)
| Q(pk__in=matching_invoices)
) )
for recv, q in order_search_filter_q.send(sender=getattr(self, 'event', None), query=u): for recv, q in order_search_filter_q.send(sender=getattr(self, 'event', None), query=u):
mainq = mainq | q mainq = mainq | q
qs = qs.annotate(has_pos=Exists(matching_positions)).filter( qs = qs.filter(
mainq mainq
) )

View File

@@ -62,10 +62,7 @@ class OrderSearch(PaginationMixin, ListView):
if not self.request.user.has_active_staff_session(self.request.session.session_key): if not self.request.user.has_active_staff_session(self.request.session.session_key):
qs = qs.filter( qs = qs.filter(
Q(event__organizer_id__in=self.request.user.teams.filter( Q(event_id__in=self.request.user.get_events_with_permission('can_view_orders').values_list('id', flat=True))
all_events=True, can_view_orders=True).values_list('organizer', flat=True))
| Q(event_id__in=self.request.user.teams.filter(
can_view_orders=True).values_list('limit_events__id', flat=True))
) )
if self.filter_form.is_valid(): if self.filter_form.is_valid():