class ActiveRecord::HierarchicalQuery::JoinBuilder

Public Class Methods

new(query, join_to, subquery_alias, options = {}) click to toggle source

@param [ActiveRecord::HierarchicalQuery::Query] query @param [ActiveRecord::Relation] join_to @param [#to_s] subquery_alias @param [Hash] options (:outer_join_hierarchical, :union_type)

# File lib/active_record/hierarchical_query/join_builder.rb, line 10
def initialize(query, join_to, subquery_alias, options = {})
  @query = query
  @builder = CTE::QueryBuilder.new(query, options: options)
  @relation = join_to
  @alias = Arel::Table.new(subquery_alias)
  @options = options
end

Public Instance Methods

build() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 18
def build
  if ActiveRecord.gem_version >= Gem::Version.new('5.2.0')
    relation = @relation

    # add ordering by "__order_column"
    relation.order_values += order_columns if ordered?

    relation = relation.joins(joined_arel_node)

    relation
  else
    relation = @relation

    # add ordering by "__order_column"
    relation.order_values += order_columns if ordered?

    relation = relation.joins(joined_arel_node)

    # copy bound variables from inner subquery
    relation.bind_values += bind_values

    relation
  end
end

Private Instance Methods

aliased_subquery() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 56
def aliased_subquery
  SubqueryAlias.new(subquery, @alias)
end
bind_values() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 84
def bind_values
  @builder.bind_values
end
constraint() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 68
def constraint
  Arel::Nodes::On.new(primary_key.eq(foreign_key))
end
cte_arel() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 64
def cte_arel
  @cte_arel ||= @builder.build_arel
end
custom_foreign_key() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 76
def custom_foreign_key
  @options[:foreign_key]
end
foreign_key() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 80
def foreign_key
  custom_foreign_key ? @alias[custom_foreign_key] : @alias[@query.klass.primary_key]
end
inner_join() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 48
def inner_join
  Arel::Nodes::InnerJoin.new(aliased_subquery, constraint)
end
joined_arel_node() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 44
def joined_arel_node
  @options[:outer_join_hierarchical] == true ? outer_join : inner_join
end
order_columns() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 92
def order_columns
  [@query.recursive_table[@query.ordering_column_name].asc]
end
ordered?() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 88
def ordered?
  @query.orderings.any?
end
outer_join() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 52
def outer_join
  Arel::Nodes::OuterJoin.new(aliased_subquery, constraint)
end
primary_key() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 72
def primary_key
  @relation.table[@relation.klass.primary_key]
end
subquery() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 60
def subquery
  Arel::Nodes::Grouping.new(cte_arel.ast)
end