Skip to content
Snippets Groups Projects
Commit f89f232d authored by Grzegorz Bizon's avatar Grzegorz Bizon
Browse files

Simplify pipelines preloader implementation

parent 0b3cca56
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -24,7 +24,7 @@ class Projects::PipelinesController < Projects::ApplicationController
@finished_count = limited_pipelines_count(project, 'finished')
@pipelines_count = limited_pipelines_count(project)
 
Gitlab::Ci::Pipeline::Preloader.new(@pipelines).preload!
Gitlab::Ci::Pipeline::Preloader.preload!(@pipelines)
 
respond_to do |format|
format.html
Loading
Loading
Loading
Loading
@@ -6,46 +6,41 @@ module Gitlab
# Class for preloading data associated with pipelines such as commit
# authors.
class Preloader
def initialize(pipelines)
@pipelines = pipelines
end
def preload!
@pipelines.each do |pipeline|
Pipeline::Preloader::Instance.new(pipeline)
.preload_commits
.preload_pipeline_warnings
.preload_stages_warnings
def self.preload!(pipelines)
pipelines.each do |pipeline|
self.new(pipeline).tap do |preloader|
preloader.preload_commits
preloader.preload_pipeline_warnings
preloader.preload_stages_warnings
end
end
end
 
class Instance
def initialize(pipeline)
@pipeline = pipeline
end
def initialize(pipeline)
@pipeline = pipeline
end
 
def preload_commits
# This ensures that all the pipeline commits are eager loaded before we
# start using them.
#
# This also preloads the author of every commit. We're using "lazy_author"
# here since "author" immediately loads the data on the first call.
tap { @pipeline.commit.try(:lazy_author) }
end
def preload_commits
# This ensures that all the pipeline commits are eager loaded before we
# start using them.
#
# This also preloads the author of every commit. We're using "lazy_author"
# here since "author" immediately loads the data on the first call.
@pipeline.commit.try(:lazy_author)
end
 
def preload_pipeline_warnings
# This preloads the number of warnings for every pipeline, ensuring
# that Ci::Pipeline#has_warnings? doesn't execute any additional
# queries.
tap { @pipeline.number_of_warnings }
end
def preload_pipeline_warnings
# This preloads the number of warnings for every pipeline, ensuring
# that Ci::Pipeline#has_warnings? doesn't execute any additional
# queries.
@pipeline.number_of_warnings
end
 
def preload_stages_warnings
# This preloads the number of warnings for every stage, ensuring
# that Ci::Stage#has_warnings? doesn't execute any additional
# queries.
tap { @pipeline.stages.each { |stage| stage.number_of_warnings } }
end
def preload_stages_warnings
# This preloads the number of warnings for every stage, ensuring
# that Ci::Stage#has_warnings? doesn't execute any additional
# queries.
@pipeline.stages.each { |stage| stage.number_of_warnings }
end
end
end
Loading
Loading
Loading
Loading
@@ -10,13 +10,13 @@ describe Gitlab::Ci::Pipeline::Preloader do
double(:pipeline, commit: commit, stages: [stage])
end
 
describe '#preload!' do
describe '.preload!' do
it 'preloads commit authors and number of warnings' do
expect(commit).to receive(:lazy_author)
expect(pipeline).to receive(:number_of_warnings)
expect(stage).to receive(:number_of_warnings)
 
described_class.new([pipeline]).preload!
described_class.preload!([pipeline])
end
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment