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:
commit
da8f6c7af7
2 changed files with 52 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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'))
|
||||
|
|
Loading…
Reference in a new issue