From 5af86685608a744f8ea6acd38e227dd16122d6f4 Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Thu, 30 Mar 2017 12:19:43 +1100 Subject: [PATCH] Rewriting Spree::Taxons.distributed_taxons for better performance --- app/models/spree/taxon_decorator.rb | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/models/spree/taxon_decorator.rb b/app/models/spree/taxon_decorator.rb index 1878a20e49..fcc71a92dc 100644 --- a/app/models/spree/taxon_decorator.rb +++ b/app/models/spree/taxon_decorator.rb @@ -37,13 +37,14 @@ Spree::Taxon.class_eval do # # Format: {enterprise_id => [taxon_id, ...]} def self.distributed_taxons(which_taxons=:all) - # TODO: Why can't we merge(Spree::Product.with_order_cycles_inner) here? - taxons = Spree::Taxon. - joins(products: {variants_including_master: {exchanges: :order_cycle}}). - merge(Exchange.outgoing). - select('spree_taxons.*, exchanges.receiver_id AS enterprise_id') + ents_and_vars = ExchangeVariant.joins(exchange: :order_cycle).merge(Exchange.outgoing) + .select("DISTINCT variant_id, receiver_id AS enterprise_id") - taxons = taxons.merge(OrderCycle.active) if which_taxons == :current + ents_and_vars = ents_and_vars.merge(OrderCycle.active) if which_taxons == :current + + taxons = Spree::Taxon + .select("DISTINCT spree_taxons.id, ents_and_vars.enterprise_id").joins(products: :variants_including_master) + .joins("INNER JOIN (#{ents_and_vars.to_sql}) AS ents_and_vars ON spree_variants.id = ents_and_vars.variant_id") taxons.inject({}) do |ts, t| ts[t.enterprise_id.to_i] ||= Set.new