mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-01 02:03:22 +00:00
Improve performance in various reports
This commit is contained in:
@@ -247,8 +247,10 @@ module Spree
|
||||
end
|
||||
|
||||
def suppliers_of_products_distributed_by(distributors)
|
||||
distributors.map { |d| Spree::Product.in_distributor(d).includes(:supplier).all }.
|
||||
flatten.map(&:supplier).uniq
|
||||
supplier_ids = Spree::Product.in_distributors(distributors).
|
||||
select('spree_products.supplier_id')
|
||||
|
||||
Enterprise.where(id: supplier_ids)
|
||||
end
|
||||
|
||||
# Load order cycles the current user has access to
|
||||
|
||||
@@ -84,6 +84,12 @@ Spree::Product.class_eval do
|
||||
select('distinct spree_products.*')
|
||||
}
|
||||
|
||||
scope :in_distributors, lambda { |distributors|
|
||||
with_order_cycles_outer.
|
||||
where('(o_exchanges.incoming = ? AND o_exchanges.receiver_id IN (?))', false, distributors).
|
||||
uniq
|
||||
}
|
||||
|
||||
# Products supplied by a given enterprise or distributed via that enterprise through an OC
|
||||
scope :in_supplier_or_distributor, lambda { |enterprise|
|
||||
enterprise = enterprise.respond_to?(:id) ? enterprise.id : enterprise.to_i
|
||||
|
||||
@@ -257,6 +257,37 @@ module Spree
|
||||
end
|
||||
end
|
||||
|
||||
describe "in_distributors" do
|
||||
let!(:distributor1) { create(:distributor_enterprise) }
|
||||
let!(:distributor2) { create(:distributor_enterprise) }
|
||||
let!(:product1) { create(:product) }
|
||||
let!(:product2) { create(:product) }
|
||||
let!(:product3) { create(:product) }
|
||||
let!(:product4) { create(:product) }
|
||||
let!(:order_cycle1) {
|
||||
create(:order_cycle, distributors: [distributor1],
|
||||
variants: [product1.variants.first, product2.variants.first])
|
||||
}
|
||||
let!(:order_cycle2) {
|
||||
create(:order_cycle, distributors: [distributor2],
|
||||
variants: [product3.variants.first])
|
||||
}
|
||||
|
||||
it "returns distributed products for a given Enterprise AR relation" do
|
||||
distributors_relation = Enterprise.where(id: [distributor1.id, distributor2.id])
|
||||
|
||||
expect(Product.in_distributors(distributors_relation)).to include product1, product2, product3
|
||||
expect(Product.in_distributors(distributors_relation)).to_not include product4
|
||||
end
|
||||
|
||||
it "returns distributed products for a given array of enterprise ids" do
|
||||
distributors_ids = [distributor1.id, distributor2.id]
|
||||
|
||||
expect(Product.in_distributors(distributors_ids)).to include product1, product2, product3
|
||||
expect(Product.in_distributors(distributors_ids)).to_not include product4
|
||||
end
|
||||
end
|
||||
|
||||
describe "in_supplier_or_distributor" do
|
||||
it "shows products in supplier" do
|
||||
s1 = create(:supplier_enterprise)
|
||||
|
||||
Reference in New Issue
Block a user