API v3: better eager loading and recursion detection for denormalized relations

This commit is contained in:
Konstantin Haase 2015-04-28 18:30:53 +02:00
parent ae31a57541
commit 3730dc74df
3 changed files with 37 additions and 21 deletions

View File

@ -29,8 +29,11 @@ module Travis::API::V3
end
def name
return super unless caller_locations.first.base_label == 'add_constraints'.freeze
@constraint_name ||= super.sub("#{parent}::", ''.freeze)
caller_locations.first.base_label == 'add_constraints'.freeze ? polymorphic_name : super
end
def polymorphic_name
@polymorfic_name ||= name.sub("#{parent}::", ''.freeze)
end
end

View File

@ -10,19 +10,34 @@ module Travis::API::V3
end
def owner
return model.owner if include? 'repository.owner'.freeze
owner_href = Renderer.href(model.owner_type.downcase.to_sym, id: model.owner_id, script_name: script_name)
{
:@type => model.owner_type && model.owner_type.downcase,
:@href => owner_href,
:id => model.owner_id,
:login => model.owner_name
}
return model.owner if include_owner?
owner_href = Renderer.href(owner_type.to_sym, id: model.owner_id, script_name: script_name)
if included_owner? and owner_href
{ :@href => owner_href }
else
result = { :@type => owner_type, :id => model.owner_id, :login => model.owner_name }
result[:@href] = owner_href if owner_href
result
end
end
def include_owner?
return true if include? 'repository.owner'.freeze
return true if include.any? { |i| i.start_with? owner_type or i.start_with? 'owner'.freeze }
end
def included_owner?
included.any? { |i| i.is_a? Model and i.class.polymorphic_name == model.owner_type and i.id == model.owner_id }
end
def owner_type
@owner_type ||= model.owner_type.downcase if model.owner_type
end
def last_build
return nil unless model.last_build_id
return model.last_build if include? 'repository.last_build'.freeze
return model.last_build if include_last_build?
{
:@type => 'build'.freeze,
:@href => Renderer.href(:build, script_name: script_name, id: model.last_build_id),
@ -34,5 +49,11 @@ module Travis::API::V3
:finished_at => model.last_build_finished_at,
}
end
def include_last_build?
return true if include? 'repository.last_build'.freeze
return true if include.any? { |i| i.start_with? 'build.'.freeze }
return true if included.any? { |i| i.is_a? Models::Build and i.id == model.last_build_id }
end
end
end

View File

@ -47,11 +47,7 @@ describe Travis::API::V3::Services::Owner::Find do
"active" => false,
"private" => false,
"last_build" => nil,
"owner" => {
"@type" => "organization",
"@href" => "/v3/org/#{org.id}",
"id" => org.id,
"login" => "example-org"},
"owner" => { "@href"=> "/v3/org/#{org.id}" },
"default_branch" => {
"@type" => "branch",
"@href" => "/v3/repo/#{repo.id}/branch/master",
@ -88,11 +84,7 @@ describe Travis::API::V3::Services::Owner::Find do
"active" => false,
"private" => false,
"last_build" => nil,
"owner" => {
"@type" => "organization",
"@href" => "/v3/org/#{org.id}",
"id" => org.id,
"login" => "example-org"},
"owner" => { "@href"=> "/v3/org/#{org.id}" },
"default_branch" => {
"@type" => "branch",
"@href" => "/v3/repo/#{repo.id}/branch/master",