diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2010-09-24 09:41:48 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2010-09-24 09:41:48 -0700 |
commit | 487df1771ded1fb065a53ebe9d1a5a9c119478e3 (patch) | |
tree | dacefa00fca782bcbd86bd5cf2476226253fc674 | |
parent | 7615bd7f928390d0ba9501e5206fd89ce6ce44fc (diff) | |
download | rails-487df1771ded1fb065a53ebe9d1a5a9c119478e3.tar.gz rails-487df1771ded1fb065a53ebe9d1a5a9c119478e3.tar.bz2 rails-487df1771ded1fb065a53ebe9d1a5a9c119478e3.zip |
adding an oracle visitor
-rw-r--r-- | lib/arel/nodes.rb | 1 | ||||
-rw-r--r-- | lib/arel/nodes/less_than_or_equal.rb | 6 | ||||
-rw-r--r-- | lib/arel/visitors.rb | 8 | ||||
-rw-r--r-- | lib/arel/visitors/oracle.rb | 15 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 4 | ||||
-rw-r--r-- | spec/arel/select_manager_spec.rb | 4 | ||||
-rw-r--r-- | spec/arel/visitors/oracle_spec.rb | 22 |
7 files changed, 57 insertions, 3 deletions
diff --git a/lib/arel/nodes.rb b/lib/arel/nodes.rb index fade666ff7..6ed05fb31b 100644 --- a/lib/arel/nodes.rb +++ b/lib/arel/nodes.rb @@ -9,6 +9,7 @@ require 'arel/nodes/and' require 'arel/nodes/greater_than' require 'arel/nodes/greater_than_or_equal' require 'arel/nodes/less_than' +require 'arel/nodes/less_than_or_equal' require 'arel/nodes/in' require 'arel/nodes/lock' diff --git a/lib/arel/nodes/less_than_or_equal.rb b/lib/arel/nodes/less_than_or_equal.rb new file mode 100644 index 0000000000..55449d12f1 --- /dev/null +++ b/lib/arel/nodes/less_than_or_equal.rb @@ -0,0 +1,6 @@ +module Arel + module Nodes + class LessThanOrEqual < Arel::Nodes::Binary + end + end +end diff --git a/lib/arel/visitors.rb b/lib/arel/visitors.rb index 879635575b..deb4a4f991 100644 --- a/lib/arel/visitors.rb +++ b/lib/arel/visitors.rb @@ -1,6 +1,7 @@ require 'arel/visitors/to_sql' require 'arel/visitors/postgresql' require 'arel/visitors/mysql' +require 'arel/visitors/oracle' require 'arel/visitors/join_sql' require 'arel/visitors/order_clauses' require 'arel/visitors/dot' @@ -8,9 +9,10 @@ require 'arel/visitors/dot' module Arel module Visitors VISITORS = { - 'postgresql' => Arel::Visitors::PostgreSQL, - 'mysql' => Arel::Visitors::MySQL, - 'mysql2' => Arel::Visitors::MySQL, + 'postgresql' => Arel::Visitors::PostgreSQL, + 'mysql' => Arel::Visitors::MySQL, + 'mysql2' => Arel::Visitors::MySQL, + 'oracle_enhanced' => Arel::Visitors::Oracle, } ENGINE_VISITORS = Hash.new do |hash, engine| diff --git a/lib/arel/visitors/oracle.rb b/lib/arel/visitors/oracle.rb new file mode 100644 index 0000000000..840a7a9ace --- /dev/null +++ b/lib/arel/visitors/oracle.rb @@ -0,0 +1,15 @@ +module Arel + module Visitors + class Oracle < Arel::Visitors::ToSql + def visit_Arel_Nodes_SelectStatement o + if o.limit + o.cores.last.wheres.push Nodes::LessThanOrEqual.new( + Nodes::SqlLiteral.new('ROWNUM'), o.limit + ) + o.limit = nil + end + super + end + end + end +end diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index 69c7736a4b..5ec811a53a 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -148,6 +148,10 @@ module Arel "#{visit o.left} > #{visit o.right}" end + def visit_Arel_Nodes_LessThanOrEqual o + "#{visit o.left} <= #{visit o.right}" + end + def visit_Arel_Nodes_LessThan o "#{visit o.left} < #{visit o.right}" end diff --git a/spec/arel/select_manager_spec.rb b/spec/arel/select_manager_spec.rb index f301e3afd0..7002d937a2 100644 --- a/spec/arel/select_manager_spec.rb +++ b/spec/arel/select_manager_spec.rb @@ -15,6 +15,10 @@ module Arel @config = { :adapter => 'sqlite3' } end + def with_connection + yield self + end + def connection self end diff --git a/spec/arel/visitors/oracle_spec.rb b/spec/arel/visitors/oracle_spec.rb new file mode 100644 index 0000000000..384725b788 --- /dev/null +++ b/spec/arel/visitors/oracle_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' + +module Arel + module Visitors + describe 'the oracle visitor' do + before do + @visitor = Oracle.new Table.engine + end + + describe 'Nodes::SelectStatement' do + describe 'limit' do + it 'adds a rownum clause' do + stmt = Nodes::SelectStatement.new + stmt.limit = 10 + sql = @visitor.accept stmt + sql.should be_like %{ SELECT WHERE ROWNUM <= 10 } + end + end + end + end + end +end |