class ActiverecordAnyOf::AlternativeBuilder::Builder

Common methods for both the positive builder and the negative one.

Attributes

queries_joins_values[RW]

Public Class Methods

new(context, *source_queries) click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 29
def initialize(context, *source_queries)
  @context = context
  @source_queries = source_queries
  @queries_joins_values = { includes: [], joins: [], references: [] }
end

Private Instance Methods

add_joins_to(relation) click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 115
def add_joins_to(relation)
  relation = relation.references(uniq_queries_joins_values[:references])
  relation = relation.includes(uniq_queries_joins_values[:includes])
  relation.joins(uniq_queries_joins_values[:joins])
end
append_join_values(query) click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 47
def append_join_values(query)
  { includes_values: :includes, joins_values: :joins, references_values: :references }.each do |q, joins|
    values = query.send(q)
    queries_joins_values[joins].concat(values) if values.any?
  end
end
bind_values() click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 127
def bind_values
  queries_bind_values.tap do |values|
    values.map!(&:value) if IS_RAILS_6
  end
end
map_multiple_bind_values(query) click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 74
def map_multiple_bind_values(query)
  query.children.map do |child|
    next unless child.respond_to?(:right)
    next unless child.right.respond_to?(:value)

    child.right.value
  end
end
method_missing(method_name, *args, &block) click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 107
def method_missing(method_name, *args, &block)
  @context.send(method_name, *args, &block)
end
queries() click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 54
def queries
  @queries ||= @source_queries.map do |query|
    query = query_to_relation(query)
    append_join_values(query)
    query.arel.constraints.reduce(:and)
  end
end
queries_bind_values() click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 97
def queries_bind_values
  queries.map do |query|
    if query.respond_to?(:children)
      query.children.map { |c| values_for(c) }
    else
      values_for(query)
    end
  end.flatten.compact
end
query_to_relation(query) click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 37
def query_to_relation(query)
  if query.is_a?(String) || query.is_a?(Hash)
    query = where(query)
  elsif query.is_a?(Array)
    query = where(*query)
  end

  query
end
respond_to_missing?(method, *) click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 111
def respond_to_missing?(method, *)
  @context.respond_to? method
end
uniq_queries_joins_values() click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 62
def uniq_queries_joins_values
  @uniq_queries_joins_values ||= { includes: [], joins: [], references: [] }.tap do |values|
    queries_joins_values.each do |join_type, statements|
      values[join_type] = if statements.first.respond_to?(:to_sql)
                            statements.uniq(&:to_sql)
                          else
                            statements.uniq
                          end
    end
  end
end
unprepare_query(query) click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 121
def unprepare_query(query)
  query.gsub(/((?<!\\)'.*?(?<!\\)'|(?<!\\)".*?(?<!\\)")|(=\ \$\d+)/) do |match|
    ::Regexp.last_match(2)&.gsub(/=\ \$\d+/, '= ?') or match
  end
end
values_for(query) click to toggle source
# File lib/activerecord_any_of/alternative_builder.rb, line 83
def values_for(query)
  return unless query.respond_to?(:right)

  if query.right.is_a?(Array)
    values = query.right
    values.map!(&:value) unless IS_RAILS_6
    values
  else
    return unless query.right.respond_to?(:value)

    query.right.value
  end
end