class ActiveRecord::HierarchicalQuery::CTE::QueryBuilder

CTE query builder

Attributes

columns[R]
cycle_detector[R]
options[R]
query[R]

Public Class Methods

new(query, options: {}) click to toggle source

@param [ActiveRecord::HierarchicalQuery::Query] query

# File lib/active_record/hierarchical_query/cte/query_builder.rb, line 20
def initialize(query, options: {})
  @query = query
  @columns = Columns.new(@query)
  @cycle_detector = CycleDetector.new(@query)
  @options = options
end

Public Instance Methods

bind_values() click to toggle source
# File lib/active_record/hierarchical_query/cte/query_builder.rb, line 27
def bind_values
  union_term.bind_values
end
build_arel() click to toggle source

@return [Arel::SelectManager]

# File lib/active_record/hierarchical_query/cte/query_builder.rb, line 32
def build_arel
  build_manager
  build_select
  build_limits
  build_order

  @arel
end

Private Instance Methods

build_limits() click to toggle source
# File lib/active_record/hierarchical_query/cte/query_builder.rb, line 70
def build_limits
  @arel.take(query.limit_value).skip(query.offset_value)
end
build_manager() click to toggle source
# File lib/active_record/hierarchical_query/cte/query_builder.rb, line 42
def build_manager
  @arel = Arel::SelectManager.new(table).
      with(:recursive, with_query).
      from(recursive_table)
end
build_order() click to toggle source
# File lib/active_record/hierarchical_query/cte/query_builder.rb, line 74
def build_order
  @arel.order(order_column.asc) if should_order?
end
build_select() click to toggle source
# File lib/active_record/hierarchical_query/cte/query_builder.rb, line 62
def build_select
  if @query.distinct_value
    @arel.project(recursive_table[Arel.star]).distinct
  else
    @arel.project(recursive_table[Arel.star])
  end
end
order_column() click to toggle source
# File lib/active_record/hierarchical_query/cte/query_builder.rb, line 82
def order_column
  recursive_table[query.ordering_column_name]
end
should_order?() click to toggle source
# File lib/active_record/hierarchical_query/cte/query_builder.rb, line 78
def should_order?
  query.orderings.any? && (query.limit_value || query.offset_value)
end
union_term() click to toggle source
# File lib/active_record/hierarchical_query/cte/query_builder.rb, line 58
def union_term
  @union_term ||= UnionTerm.new(self, @options)
end
with_query() click to toggle source

“categories__recursive” AS (

SELECT ... FROM "categories"
UNION ALL
SELECT ... FROM "categories"
INNER JOIN "categories__recursive" ON ...

)

# File lib/active_record/hierarchical_query/cte/query_builder.rb, line 54
def with_query
  Arel::Nodes::As.new(recursive_table, union_term.arel)
end