Convert Report::LineItems to class and memoize orders so it's only executed once (this improves the report in 3secs for the case I am testing)

This commit is contained in:
luisramos0
2019-11-29 21:51:54 +00:00
parent cc3368704a
commit 0ef4247914
4 changed files with 42 additions and 30 deletions

View File

@@ -46,12 +46,12 @@ module OpenFoodNetwork
end
def search
Reports::LineItems.search_orders(order_permissions, params)
report_line_items.orders
end
def table_items
return [] unless @render_table
Reports::LineItems.list(order_permissions, report_options)
report_line_items.list(line_item_includes)
end
def rules
@@ -121,10 +121,6 @@ module OpenFoodNetwork
private
def report_options
@params.merge(line_item_includes: line_item_includes)
end
def line_item_includes
[{ order: [:bill_address],
variant: [{ option_values: :option_type }, { product: :supplier }] }]
@@ -134,5 +130,9 @@ module OpenFoodNetwork
return @order_permissions unless @order_permissions.nil?
@order_permissions = ::Permissions::Order.new(@user)
end
def report_line_items
@report_line_items ||= Reports::LineItems.new(order_permissions, @params)
end
end
end

View File

@@ -21,14 +21,12 @@ module OpenFoodNetwork
end
def search
Reports::LineItems.search_orders(order_permissions, options)
report_line_items.orders
end
def table_items
return [] unless @render_table
list_options = options.merge(line_item_includes: report.line_item_includes)
Reports::LineItems.list(order_permissions, list_options)
report_line_items.list(report.line_item_includes)
end
private
@@ -87,5 +85,9 @@ module OpenFoodNetwork
return @order_permissions unless @order_permissions.nil?
@order_permissions = ::Permissions::Order.new(@user)
end
def report_line_items
@report_line_items ||= Reports::LineItems.new(order_permissions, options)
end
end
end

View File

@@ -38,12 +38,12 @@ module OpenFoodNetwork
end
def search
Reports::LineItems.search_orders(order_permissions, params)
report_line_items.orders
end
def table_items
return [] unless @render_table
Reports::LineItems.list(order_permissions, report_options)
report_line_items.list(line_item_includes)
end
def rules
@@ -120,10 +120,6 @@ module OpenFoodNetwork
private
def report_options
@params.merge(line_item_includes: line_item_includes)
end
def line_item_includes
[{ order: [:bill_address, :distributor],
variant: [{ option_values: :option_type }, { product: :supplier }] }]
@@ -150,5 +146,9 @@ module OpenFoodNetwork
customer = Customer.where(email: email).first
customer.nil? ? "" : customer.code
end
def report_line_items
@report_line_items ||= Reports::LineItems.new(order_permissions, @params)
end
end
end

View File

@@ -1,27 +1,30 @@
module OpenFoodNetwork
module Reports
# shared code to search and list line items
module LineItems
def self.search_orders(order_permissions, params)
order_permissions.visible_orders.complete.not_state(:canceled).search(params[:q])
class LineItems
def initialize(order_permissions, params)
@order_permissions = order_permissions
@params = params
end
def self.list(order_permissions, params)
orders = search_orders(order_permissions, params).result
def orders
@orders ||= search_orders
end
line_items = order_permissions.
def list(line_item_includes = nil)
line_items = @order_permissions.
visible_line_items.
merge(Spree::LineItem.where(order_id: orders))
merge(Spree::LineItem.where(order_id: orders.result))
if params[:supplier_id_in].present?
line_items = line_items.supplied_by_any(params[:supplier_id_in])
if @params[:supplier_id_in].present?
line_items = line_items.supplied_by_any(@params[:supplier_id_in])
end
if params[:line_item_includes].present?
line_items = line_items.includes(*params[:line_item_includes])
if line_item_includes.present?
line_items = line_items.includes(*line_item_includes)
end
hidden_line_items = line_items_with_hidden_details(order_permissions, line_items)
hidden_line_items = line_items_with_hidden_details(line_items)
line_items.select{ |li|
hidden_line_items.include? li
@@ -38,11 +41,18 @@ module OpenFoodNetwork
city: "", zipcode: "", state: nil)
line_item.order.assign_attributes(email: I18n.t('admin.reports.hidden'))
end
line_items
end
def self.line_items_with_hidden_details(order_permissions, line_items)
editable_line_items = order_permissions.editable_line_items.pluck(:id)
private
def search_orders
@order_permissions.visible_orders.complete.not_state(:canceled).search(@params[:q])
end
def line_items_with_hidden_details(line_items)
editable_line_items = @order_permissions.editable_line_items.pluck(:id)
if editable_line_items.empty?
line_items