From 58d82b23a102ca1eb5510b8c49bc097b402a332d Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 24 Sep 2010 10:24:31 -0700 Subject: dealing with limits and offsets --- lib/arel/visitors/oracle.rb | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'lib/arel/visitors/oracle.rb') diff --git a/lib/arel/visitors/oracle.rb b/lib/arel/visitors/oracle.rb index afea683080..c3af68cc36 100644 --- a/lib/arel/visitors/oracle.rb +++ b/lib/arel/visitors/oracle.rb @@ -1,8 +1,10 @@ module Arel module Visitors class Oracle < Arel::Visitors::ToSql + private + def visit_Arel_Nodes_SelectStatement o - if o.limit && o.orders.empty? + if o.limit && o.orders.empty? && !o.offset o.cores.last.wheres.push Nodes::LessThanOrEqual.new( Nodes::SqlLiteral.new('ROWNUM'), o.limit ) @@ -10,6 +12,22 @@ module Arel return super end + if o.limit && o.offset + limit = o.limit.to_i + offset = o.offset + o.limit = nil + o.offset = nil + sql = super + return <<-eosql + SELECT * FROM ( + SELECT raw_sql_.*, rownum raw_rnum_ + FROM (#{sql}) raw_sql_ + WHERE rownum <= #{offset.value.to_i + limit} + ) + WHERE #{visit offset} + eosql + end + if o.limit && !o.orders.empty? limit = o.limit o.limit = nil @@ -18,6 +36,10 @@ module Arel super end + + def visit_Arel_Nodes_Offset o + "raw_rnum_ > #{visit o.value}" + end end end end -- cgit v1.2.3