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
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_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_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_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_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_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