module Predicate::ToSequel::Methods

Public Instance Methods

on_and(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 85
def on_and(sexpr)
  body = sexpr.sexpr_body
  body[1..-1].inject(apply(body.first)){|f,t| f & apply(t) }
end
on_contradiction(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 31
def on_contradiction(sexpr)
  ::Sequel::SQL::BooleanConstant.new(false)
end
on_dyadic_comp(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 45
def on_dyadic_comp(sexpr)
  left, right = apply(sexpr.left), apply(sexpr.right)
  left.send(sexpr.operator_symbol, right)
end
Also aliased as: on_lt, on_lte, on_gt, on_gte
on_eq(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 35
def on_eq(sexpr)
  left, right = apply(sexpr.left), apply(sexpr.right)
  ::Sequel.expr(left => right)
end
on_gt(sexpr)
Alias for: on_dyadic_comp
on_gte(sexpr)
Alias for: on_dyadic_comp
on_identifier(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 7
def on_identifier(sexpr)
  ::Sequel.identifier(sexpr.last)
end
on_in(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 54
def on_in(sexpr)
  left, right = apply(sexpr.identifier), sexpr.right
  if right.literal?
    if right.has_placeholder?
      ::Sequel.expr(left => [on_literal(right)])
    else
      values = Array(right.value).uniq
      if values.include?(nil)
        nonnil = values.compact
        if nonnil.empty?
          ::Sequel.expr(left => nil)
        elsif nonnil.size == 1
          ::Sequel.expr(left => nil) | ::Sequel.expr(left => nonnil.first)
        else
          ::Sequel.expr(left => nil) | ::Sequel.expr(left => nonnil)
        end
      else
        ::Sequel.expr(left => right.value)
      end
    end
  elsif right.opaque?
    ::Sequel.expr(left => apply(right))
  else
    raise Error, "Unable to compile `#{right}` to sequel"
  end
end
on_intersect(sexpr)
Alias for: on_unsupported
on_literal(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 15
def on_literal(sexpr)
  if sexpr.last.nil?
    nil
  elsif sexpr.last.is_a?(Predicate::Placeholder)
    ::Sequel.lit("?", :"$#{sexpr.last.object_id}")
  else
    ::Sequel.expr(sexpr.last)
  end
end
on_lt(sexpr)
Alias for: on_dyadic_comp
on_lte(sexpr)
Alias for: on_dyadic_comp
on_match(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 95
def on_match(sexpr)
  left, right = sexpr.left, sexpr.right
  left  = [ left.first,  "%#{left.last}%"  ] if left.first  == :literal && !left.last.is_a?(Regexp)
  right = [ right.first, "%#{right.last}%" ] if right.first == :literal && !right.last.is_a?(Regexp)
  left, right = apply(left), apply(right)
  if sexpr.case_sentitive?
    left.like(right)
  else
    left.ilike(right)
  end
end
on_native(sexpr)
Alias for: on_unsupported
on_neq(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 40
def on_neq(sexpr)
  left, right = apply(sexpr.left), apply(sexpr.right)
  ~::Sequel.expr(left => right)
end
on_not(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 81
def on_not(sexpr)
  ~apply(sexpr.last)
end
on_opaque(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 107
def on_opaque(sexpr)
  return [sexpr.last] if sexpr.last.respond_to?(:sql_literal)
  raise Error, "Unable to compile #{sexpr} to Sequel"
end
on_or(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 90
def on_or(sexpr)
  body = sexpr.sexpr_body
  body[1..-1].inject(apply(body.first)){|f,t| f | apply(t) }
end
on_qualified_identifier(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 11
def on_qualified_identifier(sexpr)
  ::Sequel.identifier(sexpr.name).qualify(sexpr.qualifier)
end
on_subset(sexpr)
Alias for: on_unsupported
on_superset(sexpr)
Alias for: on_unsupported
on_tautology(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 27
def on_tautology(sexpr)
  ::Sequel::SQL::BooleanConstant.new(true)
end
on_unsupported(sexpr) click to toggle source
# File lib/predicate/sequel/to_sequel.rb, line 112
def on_unsupported(sexpr)
  raise NotSupportedError, "Unsupported predicate #{sexpr}"
end
on_var(sexpr)
Alias for: on_unsupported