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
  relation = @relation

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

  relation = relation.joins(joined_arel_node)

  return relation unless ActiveRecord.version < Gem::Version.new("5.2")

  relation.bind_values += bind_values

  relation
end

Private Instance Methods

aliased_subquery() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 53
def aliased_subquery
  SubqueryAlias.new(subquery, @alias)
end
bind_values() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 36
def bind_values
  @builder.bind_values
end
constraint() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 65
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 61
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 73
def custom_foreign_key
  @options[:foreign_key]
end
foreign_key() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 77
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 45
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 41
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 85
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 81
def ordered?
  @query.orderings.any?
end
outer_join() click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 49
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 69
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 57
def subquery
  Arel::Nodes::Grouping.new(cte_arel.ast)
end