Skip to content

Commit

Permalink
Merge pull request #3629 from sap-contributions/single-sql-stmt-in-de…
Browse files Browse the repository at this point in the history
…corators

Use single SQL statement to fetch additional data in decorators
  • Loading branch information
philippthun authored Feb 9, 2024
2 parents 947e469 + 30634ae commit cef490c
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 12 deletions.
15 changes: 11 additions & 4 deletions app/decorators/field_service_instance_broker_decorator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,18 @@ def decorate(hash, service_instances)
managed_service_instances = service_instances.select(&:managed_instance?)
return hash if managed_service_instances.empty?

hash[:included] ||= {}
plans = managed_service_instances.map(&:service_plan).uniq
brokers = plans.map(&:service_broker).uniq
brokers = ServiceBroker.
join(:services, service_broker_id: :service_brokers__id).
join(:service_plans, service_id: :services__id).
join(:service_instances, service_plan_id: :service_plans__id).
where(service_instances__id: managed_service_instances.map(&:id)).
distinct.
order_by(:service_brokers__created_at).
select(:service_brokers__name, :service_brokers__guid, :service_brokers__created_at).
all

hash[:included][:service_brokers] = brokers.sort_by(&:created_at).map do |broker|
hash[:included] ||= {}
hash[:included][:service_brokers] = brokers.map do |broker|
broker_view = {}
broker_view[:name] = broker.name if @fields.include?('name')
broker_view[:guid] = broker.guid if @fields.include?('guid')
Expand Down
16 changes: 10 additions & 6 deletions app/decorators/field_service_instance_offering_decorator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,21 @@ def initialize(fields)
@fields = fields[:'service_plan.service_offering'].to_set.intersection(self.class.allowed)
end

# rubocop:todo Metrics/CyclomaticComplexity
def decorate(hash, service_instances)
managed_service_instances = service_instances.select(&:managed_instance?)
return hash if managed_service_instances.empty?

hash[:included] ||= {}
plans = managed_service_instances.map(&:service_plan).uniq
offerings = plans.map(&:service).uniq
offerings = Service.
join(:service_plans, service_id: :services__id).
join(:service_instances, service_plan_id: :service_plans__id).
where(service_instances__id: managed_service_instances.map(&:id)).
distinct.
order_by(:services__created_at).
select(:services__label, :services__guid, :services__description, :services__tags, :services__extra, :services__service_broker_id, :services__created_at).
all

hash[:included][:service_offerings] = offerings.sort_by(&:created_at).map do |offering|
hash[:included] ||= {}
hash[:included][:service_offerings] = offerings.map do |offering|
offering_view = {}
offering_view[:name] = offering.name if @fields.include?('name')
offering_view[:guid] = offering.guid if @fields.include?('guid')
Expand All @@ -43,7 +48,6 @@ def decorate(hash, service_instances)

hash
end
# rubocop:enable Metrics/CyclomaticComplexity

private

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
module VCAP::CloudController
RSpec.describe FieldServiceInstanceOfferingDecorator do
describe '.decorate' do
let(:offering1) { Service.make(extra: '{"documentationUrl": "https://offering1.com"}', tags: %w[foo bar]) }
let(:offering2) { Service.make(extra: '{"documentationUrl": "https://offering2.com"}', tags: %w[baz]) }
let(:offering1) { Service.make(extra: '{"documentationUrl": "https://offering1.com"}', tags: %w[foo bar], created_at: Time.now.utc - 1.second) }
let(:offering2) { Service.make(extra: '{"documentationUrl": "https://offering2.com"}', tags: %w[baz], created_at: Time.now.utc) }

let(:plan1) { ServicePlan.make(service: offering1) }
let(:plan2) { ServicePlan.make(service: offering2) }
Expand Down

0 comments on commit cef490c

Please sign in to comment.