aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel/predications.rb
diff options
context:
space:
mode:
authorErnie Miller <ernie@metautonomo.us>2010-10-27 21:43:20 +0800
committerAaron Patterson <aaron.patterson@gmail.com>2010-10-27 22:34:04 +0800
commit01e7ceef453e3dc976dc0d12002bb6d4a66f1252 (patch)
treee5acf86795ae6d36d2d489aca79ce66f2f142851 /lib/arel/predications.rb
parentf515283f5190096cd3b1cfe0312c723cdeb542c1 (diff)
downloadrails-01e7ceef453e3dc976dc0d12002bb6d4a66f1252.tar.gz
rails-01e7ceef453e3dc976dc0d12002bb6d4a66f1252.tar.bz2
rails-01e7ceef453e3dc976dc0d12002bb6d4a66f1252.zip
Refactor predication methods to be available to SqlLiterals as well.
Diffstat (limited to 'lib/arel/predications.rb')
-rw-r--r--lib/arel/predications.rb177
1 files changed, 177 insertions, 0 deletions
diff --git a/lib/arel/predications.rb b/lib/arel/predications.rb
new file mode 100644
index 0000000000..8a8960f0b1
--- /dev/null
+++ b/lib/arel/predications.rb
@@ -0,0 +1,177 @@
+module Arel
+ module Predications
+ def not_eq other
+ Nodes::NotEqual.new self, other
+ end
+
+ def not_eq_any others
+ grouping_any :not_eq, others
+ end
+
+ def not_eq_all others
+ grouping_all :not_eq, others
+ end
+
+ def eq other
+ Nodes::Equality.new self, other
+ end
+
+ def eq_any others
+ grouping_any :eq, others
+ end
+
+ def eq_all others
+ grouping_all :eq, others
+ end
+
+ def in other
+ case other
+ when Arel::SelectManager
+ Nodes::In.new self, other.to_a.map { |x| x.id }
+ when Range
+ if other.exclude_end?
+ left = Nodes::GreaterThanOrEqual.new(self, other.min)
+ right = Nodes::LessThan.new(self, other.max + 1)
+ Nodes::And.new left, right
+ else
+ Nodes::Between.new(self, Nodes::And.new(other.min, other.max))
+ end
+ else
+ Nodes::In.new self, other
+ end
+ end
+
+ def in_any others
+ grouping_any :in, others
+ end
+
+ def in_all others
+ grouping_all :in, others
+ end
+
+ def not_in other
+ case other
+ when Arel::SelectManager
+ Nodes::NotIn.new self, other.to_a.map { |x| x.id }
+ when Range
+ if other.exclude_end?
+ left = Nodes::LessThan.new(self, other.min)
+ right = Nodes::GreaterThanOrEqual.new(self, other.max)
+ Nodes::Or.new left, right
+ else
+ left = Nodes::LessThan.new(self, other.min)
+ right = Nodes::GreaterThan.new(self, other.max)
+ Nodes::Or.new left, right
+ end
+ else
+ Nodes::NotIn.new self, other
+ end
+ end
+
+ def not_in_any others
+ grouping_any :not_in, others
+ end
+
+ def not_in_all others
+ grouping_all :not_in, others
+ end
+
+ def matches other
+ Nodes::Matches.new self, other
+ end
+
+ def matches_any others
+ grouping_any :matches, others
+ end
+
+ def matches_all others
+ grouping_all :matches, others
+ end
+
+ def does_not_match other
+ Nodes::DoesNotMatch.new self, other
+ end
+
+ def does_not_match_any others
+ grouping_any :does_not_match, others
+ end
+
+ def does_not_match_all others
+ grouping_all :does_not_match, others
+ end
+
+ def gteq right
+ Nodes::GreaterThanOrEqual.new self, right
+ end
+
+ def gteq_any others
+ grouping_any :gteq, others
+ end
+
+ def gteq_all others
+ grouping_all :gteq, others
+ end
+
+ def gt right
+ Nodes::GreaterThan.new self, right
+ end
+
+ def gt_any others
+ grouping_any :gt, others
+ end
+
+ def gt_all others
+ grouping_all :gt, others
+ end
+
+ def lt right
+ Nodes::LessThan.new self, right
+ end
+
+ def lt_any others
+ grouping_any :lt, others
+ end
+
+ def lt_all others
+ grouping_all :lt, others
+ end
+
+ def lteq right
+ Nodes::LessThanOrEqual.new self, right
+ end
+
+ def lteq_any others
+ grouping_any :lteq, others
+ end
+
+ def lteq_all others
+ grouping_all :lteq, others
+ end
+
+ def asc
+ Nodes::Ordering.new self, :asc
+ end
+
+ def desc
+ Nodes::Ordering.new self, :desc
+ end
+
+ private
+
+ def grouping_any method_id, others
+ first = send method_id, others.shift
+
+ Nodes::Grouping.new others.inject(first) { |memo,expr|
+ Nodes::Or.new(memo, send(method_id, expr))
+ }
+ end
+
+ def grouping_all method_id, others
+ first = send method_id, others.shift
+
+ Nodes::Grouping.new others.inject(first) { |memo,expr|
+ Nodes::And.new(memo, send(method_id, expr))
+ }
+ end
+ end
+end \ No newline at end of file