class Clearly::Query::Helper

Utility methods for working with Arel.

Public Class Methods

exists(node) click to toggle source

Construct a SQL EXISTS clause. @param [Arel::Nodes::Node] node @return [Arel::Nodes::Node]

# File lib/clearly/query/helper.rb, line 66
def exists(node)
  Arel::Nodes::Exists.new(node)
end
named_function(name, expression, function_alias = nil) click to toggle source

Construct an Arel representation of a SQL function. @param [String] name @param [String, Arel::Nodes::Node] expression @param [String] function_alias @return [Arel::Nodes::Node]

# File lib/clearly/query/helper.rb, line 75
def named_function(name, expression, function_alias = nil)
  Arel::Nodes::NamedFunction.new(name, expression, function_alias)
end
sql_literal(value) click to toggle source

Construct a SQL literal. This is useful for sql that is too complex for Arel. @param [String] value @return [Arel::Nodes::Node]

# File lib/clearly/query/helper.rb, line 51
def sql_literal(value)
  Arel::Nodes::SqlLiteral.new(value)
end
sql_quoted(value) click to toggle source

Construct a SQL quoted string. This is used for fragments of SQL. @param [String] value @return [Arel::Nodes::Node]

# File lib/clearly/query/helper.rb, line 59
def sql_quoted(value)
  Arel::Nodes.build_quoted(value)
end
string_concat(*args) click to toggle source

Concatenate one or more strings @param [Array<String>] args strings to concatenate @return [Arel::Nodes::Node]

# File lib/clearly/query/helper.rb, line 11
def string_concat(*args)
  adapter = ActiveRecord::Base.connection.adapter_name.underscore.downcase

  case adapter
    when 'mysql'
      named_function('concat', args)
    when 'sqlserver'
      string_concat_infix('+', *args)
    when 'postgres'
    when 'sq_lite'
      string_concat_infix('||', *args)
    else
      fail ArgumentError, "unsupported database adapter '#{adapter}'"
  end
end
string_concat_infix(operator, *args) click to toggle source

Concatenate strings using an operator @param [Object] operator infix operator @param [Array<String>] args strings to concatenate @return [Arel::Nodes::Node]

# File lib/clearly/query/helper.rb, line 31
def string_concat_infix(operator, *args)
  if args.blank? || args.size < 2
    fail ArgumentError, "string concatenation requires operator and two or more arguments, given '#{args.size}'"
  end

  result = Arel::Nodes::InfixOperation.new(operator, args[0], args[1])

  if args.size > 2
    args.drop(2).each do |a|
      result = Arel::Nodes::InfixOperation.new(operator, result, a)
    end
  end

  result
end