module Card::Query::SqlStatement::Joins

transform joins from Card::Query::Join objects to SQL string clause

Public Instance Methods

join_clause(join) click to toggle source
# File lib/card/query/sql_statement/joins.rb, line 17
def join_clause join
  subclause = subjoins join
  table = join_table join
  on = on_clause join
  join_clause_parts(join, table, subclause, on).compact.join " "
end
join_clause_parts(join, table, subclause, on) click to toggle source
# File lib/card/query/sql_statement/joins.rb, line 24
def join_clause_parts join, table, subclause, on
  parts = ["\n#{leading_space}", join.side, "JOIN"]
  if join.left? && subclause.present?
    parts + ["(#{table} #{subclause})", on]
  else
    parts + [table, on, subclause]
  end
end
join_table(join) click to toggle source
# File lib/card/query/sql_statement/joins.rb, line 39
def join_table join
  to_table = join.to_table
  to_table = "(#{to_table.sql})" if to_table.is_a? CardQuery
  [to_table, join.to_alias].join " "
end
joins(query=nil) click to toggle source
# File lib/card/query/sql_statement/joins.rb, line 6
def joins query=nil
  query ||= @query
  joins_on_query(query).map do |join|
    join_clause join
  end.flatten.join " "
end
joins_on_query(query) click to toggle source
# File lib/card/query/sql_statement/joins.rb, line 13
def joins_on_query query
  query.direct_subqueries.unshift(query).map(&:joins).flatten
end
on_card_conditions(join) click to toggle source
# File lib/card/query/sql_statement/joins.rb, line 54
def on_card_conditions join
  to = join.to
  explicit = to.conditions_on_join == join ? explicit_conditions(to) : nil
  [explicit, implicit_conditions(to)].compact
end
on_clause(join) click to toggle source
# File lib/card/query/sql_statement/joins.rb, line 45
def on_clause join
  on_conditions = join.conditions
  on_conditions.unshift ["#{join.from_alias}.#{join.from_field}",
                         "#{join.to_alias}.#{join.to_field}"].join(" = ")
  on_conditions += on_card_conditions(join) if join.to.is_a? CardQuery
  on_conditions.reject!(&:blank?)
  "ON #{basic_conditions(on_conditions) * ' AND '}"
end
subjoins(join) click to toggle source
# File lib/card/query/sql_statement/joins.rb, line 33
def subjoins join
  return unless join.to.is_a? AbstractQuery

  joins join.to
end