From eb88cf6a2a105b099f98237464d1cb6c0aaa6411 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Tue, 10 Mar 2015 15:59:04 +0100 Subject: [PATCH] v3: avoid N+1 queries when eager loading repository relations --- lib/travis/api/v3/queries/repositories.rb | 4 +++- lib/travis/api/v3/query.rb | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/travis/api/v3/queries/repositories.rb b/lib/travis/api/v3/queries/repositories.rb index bc374e7b..7872e8d4 100644 --- a/lib/travis/api/v3/queries/repositories.rb +++ b/lib/travis/api/v3/queries/repositories.rb @@ -11,7 +11,9 @@ module Travis::API::V3 all = Models::Repository all = all.where(active: bool(active)) unless active.nil? all = all.where(private: bool(private)) unless private.nil? - all = all.includes(:default_branch) # TODO: use includes params + all = all.includes(:owner) if includes? 'repository.owner'.freeze + all = all.includes(:last_build) if includes? 'repository.last_build'.freeze + all = all.includes(:default_branch) all end end diff --git a/lib/travis/api/v3/query.rb b/lib/travis/api/v3/query.rb index 52aca622..5e578e6a 100644 --- a/lib/travis/api/v3/query.rb +++ b/lib/travis/api/v3/query.rb @@ -40,6 +40,11 @@ module Travis::API::V3 ::Sidekiq::Client.push('queue'.freeze => queue, 'class'.freeze => class_name, 'args'.freeze => args) end + def includes?(key) + @includes ||= @params['include'.freeze].to_s.split(?,.freeze) + @includes.include? key + end + def bool(value) return false if value == 'false'.freeze !!value