Class: Gitlab::Graphql::Loaders::LazyRelationLoader::TopNLoader

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab/graphql/loaders/lazy_relation_loader/top_n_loader.rb

Overview

Loads the top-n records for each given parent record. For example; if you want to load only 5 confidential issues ordered by their updated_at column per project for a list of projects by issuing only a single SQL query then this class can help you. Note that the limit applies per parent record which means that if you apply limit as 5 for 10 projects, this loader will load 50 records in total.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(original_relation, parents) ⇒ TopNLoader

Returns a new instance of TopNLoader.



19
20
21
22
# File 'lib/gitlab/graphql/loaders/lazy_relation_loader/top_n_loader.rb', line 19

def initialize(original_relation, parents)
  @original_relation = original_relation
  @parents = parents
end

Class Method Details

.load(original_relation, parents) ⇒ Object



15
16
17
# File 'lib/gitlab/graphql/loaders/lazy_relation_loader/top_n_loader.rb', line 15

def self.load(original_relation, parents)
  new(original_relation, parents).load
end

Instance Method Details

#loadObject



24
25
26
27
28
29
30
31
32
# File 'lib/gitlab/graphql/loaders/lazy_relation_loader/top_n_loader.rb', line 24

def load
  klass.select(klass.arel_table[Arel.star])
       .from(from)
       .joins("JOIN LATERAL (#{lateral_relation.to_sql}) AS #{klass.arel_table.name} ON true")
       .includes(original_includes)
       .preload(original_preload)
       .eager_load(original_eager_load)
       .load
end