Improve reports performance

Add the scoping from the search filters for reports into the logic of building sets like `editable_line_items` before combining them into the query to reduce the number of `line_item` ids in the IN clause.
This commit is contained in:
Matt-Yorkley
2020-03-20 13:48:03 +01:00
parent b1a274ea27
commit 45c204017f
5 changed files with 20 additions and 10 deletions

View File

@@ -2,24 +2,28 @@ require 'open_food_network/permissions'
module Permissions
class Order
def initialize(user)
def initialize(user, search_params = nil)
@user = user
@permissions = OpenFoodNetwork::Permissions.new(@user)
@search_params = search_params
end
# Find orders that the user can see
def visible_orders
Spree::Order.
orders = Spree::Order.
with_line_items_variants_and_products_outer.
where(visible_orders_where_values)
orders = orders.complete.not_state(:canceled).search(search_params).result if search_orders?
orders
end
# Any orders that the user can edit
def editable_orders
Spree::Order.where(
managed_orders_where_values.
or(coordinated_orders_where_values)
)
orders = Spree::Order.
where(managed_orders_where_values.
or(coordinated_orders_where_values))
orders = orders.complete.not_state(:canceled).search(search_params).result if search_orders?
orders
end
def visible_line_items
@@ -35,6 +39,12 @@ module Permissions
private
attr_reader :search_params
def search_orders?
search_params.present?
end
def visible_orders_where_values
# Grouping keeps the 2 where clauses from produced_orders_where_values inside parentheses
# This way it makes the OR work between the 3 types of orders:

View File

@@ -128,7 +128,7 @@ module OpenFoodNetwork
def order_permissions
return @order_permissions unless @order_permissions.nil?
@order_permissions = ::Permissions::Order.new(@user)
@order_permissions = ::Permissions::Order.new(@user, @params[:q])
end
def report_line_items

View File

@@ -5,7 +5,7 @@ module OpenFoodNetwork
@user = user
@render_table = render_table
@permissions = ::Permissions::Order.new(user)
@permissions = ::Permissions::Order.new(user, @params[:q])
end
def header

View File

@@ -83,7 +83,7 @@ module OpenFoodNetwork
def order_permissions
return @order_permissions unless @order_permissions.nil?
@order_permissions = ::Permissions::Order.new(@user)
@order_permissions = ::Permissions::Order.new(@user, options[:q])
end
def report_line_items

View File

@@ -128,7 +128,7 @@ module OpenFoodNetwork
def order_permissions
return @order_permissions unless @order_permissions.nil?
@order_permissions = ::Permissions::Order.new(@user)
@order_permissions = ::Permissions::Order.new(@user, @params[:q])
end
def is_temperature_controlled?(line_item)