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:
parent
cd13c3e1da
commit
0e98ef149c
6 changed files with 49 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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'
|
||||
|
|
6
lib/arel/nodes/between.rb
Normal file
6
lib/arel/nodes/between.rb
Normal file
|
@ -0,0 +1,6 @@
|
|||
module Arel
|
||||
module Nodes
|
||||
class Between < Arel::Nodes::Binary
|
||||
end
|
||||
end
|
||||
end
|
6
lib/arel/nodes/less_than.rb
Normal file
6
lib/arel/nodes/less_than.rb
Normal file
|
@ -0,0 +1,6 @@
|
|||
module Arel
|
||||
module Nodes
|
||||
class LessThan < Arel::Nodes::Binary
|
||||
end
|
||||
end
|
||||
end
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue