summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2018-05-24 16:55:24 +0200
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2018-05-24 16:55:24 +0200
commitf0d7445b88f6598db85198296c076bf59508188a (patch)
tree6da862151641d3eb90ad2256f5db45e68f8ace7d
parentbc9a0e10b50430e0b253a15d1628b6776d0bd9fe (diff)
downloadgitlab-ce-f0d7445b88f6598db85198296c076bf59508188a.tar.gz
Reduce pipeline serialization queries when preloaded
-rw-r--r--app/serializers/pipeline_serializer.rb8
-rw-r--r--spec/serializers/pipeline_serializer_spec.rb7
2 files changed, 9 insertions, 6 deletions
diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index 68325cbffa8..d4b85f5aeb4 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -3,8 +3,11 @@ class PipelineSerializer < BaseSerializer
entity PipelineDetailsEntity
def represent(resource, opts = {})
- if resource.is_a?(ActiveRecord::Relation)
+ if paginated? && !resource.respond_to?(:page)
+ raise Gitlab::Serializer::Pagination::InvalidResourceError
+ end
+ if resource.is_a?(ActiveRecord::Relation)
resource = resource.preload([
:stages,
:retryable_builds,
@@ -18,7 +21,6 @@ class PipelineSerializer < BaseSerializer
end
if opts.delete(:preload)
- resource = @paginator.paginate(resource) if paginated?
resource = Gitlab::Ci::Pipeline::Preloader.preload!(resource)
end
@@ -35,7 +37,7 @@ class PipelineSerializer < BaseSerializer
def represent_stages(resource)
return {} unless resource.present?
- data = represent(resource, { only: [{ details: [:stages] }] })
+ data = represent(resource, { only: [{ details: [:stages] }], preload: true })
data.dig(:details, :stages) || []
end
end
diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb
index 5108eb4deec..9319d29279a 100644
--- a/spec/serializers/pipeline_serializer_spec.rb
+++ b/spec/serializers/pipeline_serializer_spec.rb
@@ -99,7 +99,8 @@ describe PipelineSerializer do
end
end
- context 'number of queries' do
+ describe 'number of queries when preloaded' do
+ subject { serializer.represent(resource, preload: true) }
let(:resource) { Ci::Pipeline.all }
before do
@@ -120,7 +121,7 @@ describe PipelineSerializer do
it 'verifies number of queries', :request_store do
recorded = ActiveRecord::QueryRecorder.new { subject }
- expect(recorded.count).to be_within(1).of(38)
+ expect(recorded.count).to be_within(1).of(31)
expect(recorded.cached_count).to eq(0)
end
end
@@ -139,7 +140,7 @@ describe PipelineSerializer do
# pipeline. With the same ref this check is cached but if refs are
# different then there is an extra query per ref
# https://gitlab.com/gitlab-org/gitlab-ce/issues/46368
- expect(recorded.count).to be_within(1).of(45)
+ expect(recorded.count).to be_within(1).of(38)
expect(recorded.cached_count).to eq(0)
end
end