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

supporting ranges for IN statements

This commit is contained in:
Aaron Patterson 2010-09-20 16:23:23 -07:00
parent cd13c3e1da
commit 0e98ef149c
6 changed files with 49 additions and 3 deletions

View file

@ -12,10 +12,20 @@ module Arel
end
def in other
if Arel::SelectManager === other
other = other.to_a.map { |x| x.id }
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
Nodes::In.new self, other
end
def gteq right

View file

@ -1,12 +1,14 @@
require 'arel/nodes/node'
require 'arel/nodes/binary'
require 'arel/nodes/equality'
require 'arel/nodes/between'
require 'arel/nodes/not_equal'
require 'arel/nodes/assignment'
require 'arel/nodes/or'
require 'arel/nodes/and'
require 'arel/nodes/greater_than'
require 'arel/nodes/greater_than_or_equal'
require 'arel/nodes/less_than'
require 'arel/nodes/in'
require 'arel/nodes/lock'

View file

@ -0,0 +1,6 @@
module Arel
module Nodes
class Between < Arel::Nodes::Binary
end
end
end

View file

@ -0,0 +1,6 @@
module Arel
module Nodes
class LessThan < Arel::Nodes::Binary
end
end
end

View file

@ -122,6 +122,10 @@ module Arel
"#{visit o.relation} #{quote_table_name o.name}"
end
def visit_Arel_Nodes_Between o
"#{visit o.left} BETWEEN #{visit o.right}"
end
def visit_Arel_Nodes_GreaterThanOrEqual o
"#{visit o.left} >= #{visit o.right}"
end
@ -130,6 +134,10 @@ module Arel
"#{visit o.left} > #{visit o.right}"
end
def visit_Arel_Nodes_LessThan o
"#{visit o.left} < #{visit o.right}"
end
def visit_Arel_Nodes_StringJoin o
"#{visit o.left} #{visit o.right}"
end

View file

@ -72,6 +72,20 @@ module Arel
"users"."id" IN (NULL)
}
end
it 'can handle two dot ranges' do
node = @attr.in 1..3
@visitor.accept(node).should be_like %{
"users"."id" BETWEEN 1 AND 3
}
end
it 'can handle three dot ranges' do
node = @attr.in 1...3
@visitor.accept(node).should be_like %{
"users"."id" >= 1 AND "users"."id" < 3
}
end
end
describe 'Equality' do