From 0e98ef149cd44dc04d40a8553e1743c5cb6d4a7c Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Mon, 20 Sep 2010 16:23:23 -0700 Subject: supporting ranges for IN statements --- lib/arel/attributes/attribute.rb | 16 +++++++++++++--- lib/arel/nodes.rb | 2 ++ lib/arel/nodes/between.rb | 6 ++++++ lib/arel/nodes/less_than.rb | 6 ++++++ lib/arel/visitors/to_sql.rb | 8 ++++++++ 5 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 lib/arel/nodes/between.rb create mode 100644 lib/arel/nodes/less_than.rb (limited to 'lib') diff --git a/lib/arel/attributes/attribute.rb b/lib/arel/attributes/attribute.rb index 6bb880d211..e1f7fd81d2 100644 --- a/lib/arel/attributes/attribute.rb +++ b/lib/arel/attributes/attribute.rb @@ -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 diff --git a/lib/arel/nodes.rb b/lib/arel/nodes.rb index ac4bba57c2..fade666ff7 100644 --- a/lib/arel/nodes.rb +++ b/lib/arel/nodes.rb @@ -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' diff --git a/lib/arel/nodes/between.rb b/lib/arel/nodes/between.rb new file mode 100644 index 0000000000..2e7596cdae --- /dev/null +++ b/lib/arel/nodes/between.rb @@ -0,0 +1,6 @@ +module Arel + module Nodes + class Between < Arel::Nodes::Binary + end + end +end diff --git a/lib/arel/nodes/less_than.rb b/lib/arel/nodes/less_than.rb new file mode 100644 index 0000000000..cfaf716c42 --- /dev/null +++ b/lib/arel/nodes/less_than.rb @@ -0,0 +1,6 @@ +module Arel + module Nodes + class LessThan < Arel::Nodes::Binary + end + end +end diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index 5a92e27149..d6a9a3697f 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -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 -- cgit v1.2.3