Permalink
Browse files

Support Float::INFINITY in ranges

  • Loading branch information...
1 parent 80f11e3 commit 0df9ab8442fc4a33b1962a49cebd66a3d1b0faf5 @tpope tpope committed Feb 19, 2013
Showing with 52 additions and 2 deletions.
  1. +18 −2 lib/arel/predications.rb
  2. +34 −0 test/visitors/test_to_sql.rb
View
20 lib/arel/predications.rb
@@ -29,7 +29,15 @@ def in other
when Arel::SelectManager
Arel::Nodes::In.new(self, other.ast)
when Range
- if other.exclude_end?
+ if other.begin == -Float::INFINITY && other.end == Float::INFINITY
+ Nodes::NotIn.new self, []
+ elsif other.end == Float::INFINITY
+ Nodes::GreaterThanOrEqual.new(self, other.begin)
+ elsif other.begin == -Float::INFINITY && other.exclude_end?
+ Nodes::LessThan.new(self, other.end)
+ elsif other.begin == -Float::INFINITY
+ Nodes::LessThanOrEqual.new(self, other.end)
+ elsif other.exclude_end?
left = Nodes::GreaterThanOrEqual.new(self, other.begin)
right = Nodes::LessThan.new(self, other.end)
Nodes::And.new [left, right]
@@ -54,7 +62,15 @@ def not_in other
when Arel::SelectManager
Arel::Nodes::NotIn.new(self, other.ast)
when Range
- if other.exclude_end?
+ if other.begin == -Float::INFINITY && other.end == Float::INFINITY
+ Nodes::In.new self, []
+ elsif other.end == Float::INFINITY
+ Nodes::LessThan.new(self, other.begin)
+ elsif other.begin == -Float::INFINITY && other.exclude_end?
+ Nodes::GreaterThanOrEqual.new(self, other.end)
+ elsif other.begin == -Float::INFINITY
+ Nodes::GreaterThan.new(self, other.end)
+ elsif other.exclude_end?
left = Nodes::LessThan.new(self, other.begin)
right = Nodes::GreaterThanOrEqual.new(self, other.end)
Nodes::Or.new left, right
View
34 test/visitors/test_to_sql.rb
@@ -230,6 +230,23 @@ def dispatch
}
end
+ it 'can handle ranges bounded by infinity' do
+ node = @attr.in 1..Float::INFINITY
+ @visitor.accept(node).must_be_like %{
+ "users"."id" >= 1
+ }
+ node = @attr.in(-Float::INFINITY..3)
+ @visitor.accept(node).must_be_like %{
+ "users"."id" <= 3
+ }
+ node = @attr.in(-Float::INFINITY...3)
+ @visitor.accept(node).must_be_like %{
+ "users"."id" < 3
+ }
+ node = @attr.in(-Float::INFINITY..Float::INFINITY)
+ @visitor.accept(node).must_be_like %{1=1}
+ end
+
it 'can handle subqueries' do
table = Table.new(:users)
subquery = table.project(:id).where(table[:name].eq('Aaron'))
@@ -316,6 +333,23 @@ def quote value, column = nil
}
end
+ it 'can handle ranges bounded by infinity' do
+ node = @attr.not_in 1..Float::INFINITY
+ @visitor.accept(node).must_be_like %{
+ "users"."id" < 1
+ }
+ node = @attr.not_in(-Float::INFINITY..3)
+ @visitor.accept(node).must_be_like %{
+ "users"."id" > 3
+ }
+ node = @attr.not_in(-Float::INFINITY...3)
+ @visitor.accept(node).must_be_like %{
+ "users"."id" >= 3
+ }
+ node = @attr.not_in(-Float::INFINITY..Float::INFINITY)
+ @visitor.accept(node).must_be_like %{1=0}
+ end
+
it 'can handle subqueries' do
table = Table.new(:users)
subquery = table.project(:id).where(table[:name].eq('Aaron'))

0 comments on commit 0df9ab8

Please sign in to comment.