aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel/engines
diff options
context:
space:
mode:
Diffstat (limited to 'lib/arel/engines')
-rw-r--r--lib/arel/engines/memory/predicates.rb53
-rw-r--r--lib/arel/engines/sql/predicates.rb6
2 files changed, 53 insertions, 6 deletions
diff --git a/lib/arel/engines/memory/predicates.rb b/lib/arel/engines/memory/predicates.rb
index d0963e2f74..c0ee862626 100644
--- a/lib/arel/engines/memory/predicates.rb
+++ b/lib/arel/engines/memory/predicates.rb
@@ -5,6 +5,49 @@ module Arel
operand1.eval(row).send(operator, operand2.eval(row))
end
end
+
+ class Unary < Predicate
+ def eval(row)
+ operand.eval(row).send(operator)
+ end
+ end
+
+ class Not < Unary
+ def operator; '!' end
+ end
+
+ class CompoundPredicate < Binary
+ def eval(row)
+ eval "operand1.eval(row) #{operator} operand2.eval(row)"
+ end
+ end
+
+ class Or < CompoundPredicate
+ def operator; :or end
+ end
+
+ class And < CompoundPredicate
+ def operator; :and end
+ end
+
+ class GroupedPredicate < Polyadic
+ def eval(row)
+ group = additional_operands.inject([]) do |results, operand|
+ results << operator.new(operand1, operand)
+ end
+ group.send(compounder) do |operation|
+ operation.eval(row)
+ end
+ end
+ end
+
+ class Any < GroupedPredicate
+ def compounder; :any? end
+ end
+
+ class All < GroupedPredicate
+ def compounder; :all? end
+ end
class Equality < Binary
def operator; :== end
@@ -37,16 +80,20 @@ module Arel
end
class NotMatch < Binary
- def operator; :!~ end
+ def eval(row)
+ operand1.eval(row) !~ operand2.eval(row)
+ end
end
class In < Binary
- def operator; :include? end
+ def eval(row)
+ operand2.eval(row).include?(operand1.eval(row))
+ end
end
class NotIn < Binary
def eval(row)
- !(operand1.eval(row).include?(operand2.eval(row)))
+ !(operand2.eval(row).include?(operand1.eval(row)))
end
end
end
diff --git a/lib/arel/engines/sql/predicates.rb b/lib/arel/engines/sql/predicates.rb
index 29bc74c605..b459168620 100644
--- a/lib/arel/engines/sql/predicates.rb
+++ b/lib/arel/engines/sql/predicates.rb
@@ -30,11 +30,11 @@ module Arel
def predicate_sql; "AND" end
end
- class GroupedPredicate < Grouped
+ class GroupedPredicate < Polyadic
def to_sql(formatter = nil)
"(" +
- operands2.inject([]) { |predicates, operand|
- predicates << operator.new(operand1, operand).to_sql
+ additional_operands.inject([]) { |predicates, operand|
+ predicates << operator.new(operand1, operand).to_sql(formatter)
}.join(" #{predicate_sql} ") +
")"
end