From d4635bd7cbc70aab7b15112a426de237384d2f7b Mon Sep 17 00:00:00 2001 From: Pau Perez Date: Tue, 18 Dec 2018 18:16:49 +0100 Subject: [PATCH] Fetch Property instead of ProducerProps from query By not having to treat producer properties differently we can filter and fetch all properties from DB without having to process it with Ruby and with a single query. --- .../api/cached_enterprise_serializer.rb | 25 ++++++++++++++++--- .../api/cached_enterprise_serializer_spec.rb | 18 ++++++++++++- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/app/serializers/api/cached_enterprise_serializer.rb b/app/serializers/api/cached_enterprise_serializer.rb index 6198e28a6c..8da705a1b0 100644 --- a/app/serializers/api/cached_enterprise_serializer.rb +++ b/app/serializers/api/cached_enterprise_serializer.rb @@ -85,17 +85,34 @@ module Api def distributed_properties if active product_properties = Spree::Property.currently_sold_by(enterprise) - producer_properties = ProducerProperty.currently_sold_by(enterprise) else - product_properties = Spree::Property.ever_sold_by(enterprise) - producer_properties = ProducerProperty.ever_sold_by(enterprise) + product_properties = Spree::Property + .joins(products: { variants: { exchanges: :order_cycle } }) + .merge(Exchange.outgoing) + .merge(Exchange.to_enterprise(enterprise)) + .select('DISTINCT spree_properties.*') end - (product_properties + producer_properties).uniq do |property_object| + (product_properties + distributed_producer_properties).uniq do |property_object| property_object.property.presentation end end + def distributed_producer_properties + properties = Spree::Property + .joins( + producer_properties: { + producer: { supplied_products: { variants: { exchanges: :order_cycle } } } + } + ) + .merge(Exchange.outgoing) + .merge(Exchange.to_enterprise(enterprise)) + .select('DISTINCT spree_properties.*') + + return properties.merge(OrderCycle.active) if active + properties + end + def active data.active_distributors.andand.include? enterprise end diff --git a/spec/serializers/api/cached_enterprise_serializer_spec.rb b/spec/serializers/api/cached_enterprise_serializer_spec.rb index 39c3a5fde1..0d3cd642bf 100644 --- a/spec/serializers/api/cached_enterprise_serializer_spec.rb +++ b/spec/serializers/api/cached_enterprise_serializer_spec.rb @@ -33,10 +33,10 @@ describe Api::CachedEnterpriseSerializer do let(:property) { create(:property, presentation: 'One') } let(:duplicate_property) { create(:property, presentation: 'One') } + let(:producer) { create(:supplier_enterprise, properties: [duplicate_property]) } before do product = create(:product, properties: [property]) - producer = create(:supplier_enterprise, properties: [duplicate_property]) producer.supplied_products << product create( @@ -57,6 +57,14 @@ describe Api::CachedEnterpriseSerializer do properties = cached_enterprise_serializer.distributed_properties expect(properties).to eq([property]) end + + it 'fetches producer properties' do + distributed_producer_properties = cached_enterprise_serializer + .distributed_producer_properties + + expect(distributed_producer_properties) + .to eq(producer.producer_properties.map(&:property)) + end end context 'when the enterprise is an active distributor' do @@ -68,6 +76,14 @@ describe Api::CachedEnterpriseSerializer do properties = cached_enterprise_serializer.distributed_properties expect(properties).to eq([property]) end + + it 'fetches producer properties' do + distributed_producer_properties = cached_enterprise_serializer + .distributed_producer_properties + + expect(distributed_producer_properties) + .to eq(producer.producer_properties.map(&:property)) + end end end end