1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Merge pull request #164 from tpope/infinity-ranges

Support Float::INFINITY in ranges
This commit is contained in:
Rafael Mendonça França 2013-03-04 12:53:15 -08:00
commit da8f6c7af7
2 changed files with 52 additions and 2 deletions

View file

@ -29,7 +29,15 @@ module Arel
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 @@ module Arel
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 file

@ -230,6 +230,23 @@ module Arel
}
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 @@ module Arel
}
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'))