diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2010-09-10 09:47:50 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2010-09-10 09:47:50 -0700 |
commit | ac2bdd1dd31c8b89578ae7f490a898838b9ef6e0 (patch) | |
tree | eaa458133ed06fc90532a4bdc0872ac09e05b65e | |
parent | 9efae8f92de2361d50dc3ee9b674b2da1e782575 (diff) | |
download | rails-ac2bdd1dd31c8b89578ae7f490a898838b9ef6e0.tar.gz rails-ac2bdd1dd31c8b89578ae7f490a898838b9ef6e0.tar.bz2 rails-ac2bdd1dd31c8b89578ae7f490a898838b9ef6e0.zip |
adding an offset node
-rw-r--r-- | lib/arel/nodes.rb | 1 | ||||
-rw-r--r-- | lib/arel/nodes/offset.rb | 11 | ||||
-rw-r--r-- | lib/arel/nodes/select_statement.rb | 3 | ||||
-rw-r--r-- | lib/arel/select_manager.rb | 5 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 5 | ||||
-rw-r--r-- | spec/arel/select_manager_spec.rb | 15 |
6 files changed, 39 insertions, 1 deletions
diff --git a/lib/arel/nodes.rb b/lib/arel/nodes.rb index 2894deab57..89e28f138c 100644 --- a/lib/arel/nodes.rb +++ b/lib/arel/nodes.rb @@ -8,6 +8,7 @@ require 'arel/nodes/lock' require 'arel/nodes/function' require 'arel/nodes/count' require 'arel/nodes/values' +require 'arel/nodes/offset' require 'arel/nodes/sum' require 'arel/nodes/max' require 'arel/nodes/avg' diff --git a/lib/arel/nodes/offset.rb b/lib/arel/nodes/offset.rb new file mode 100644 index 0000000000..baa4068d93 --- /dev/null +++ b/lib/arel/nodes/offset.rb @@ -0,0 +1,11 @@ +module Arel + module Nodes + class Offset + attr_accessor :value + + def initialize value + @value = value + end + end + end +end diff --git a/lib/arel/nodes/select_statement.rb b/lib/arel/nodes/select_statement.rb index a96c02a545..6272fd126d 100644 --- a/lib/arel/nodes/select_statement.rb +++ b/lib/arel/nodes/select_statement.rb @@ -2,13 +2,14 @@ module Arel module Nodes class SelectStatement attr_reader :cores - attr_accessor :limit, :orders, :lock + attr_accessor :limit, :orders, :lock, :offset def initialize cores = [SelectCore.new] @cores = cores @orders = [] @limit = nil @lock = nil + @offset = nil end def initialize_copy other diff --git a/lib/arel/select_manager.rb b/lib/arel/select_manager.rb index 569b631c7f..ce749c4977 100644 --- a/lib/arel/select_manager.rb +++ b/lib/arel/select_manager.rb @@ -12,6 +12,11 @@ module Arel @head.limit end + def skip amount + @head.offset = Nodes::Offset.new(amount) + self + end + def where_clauses warn "where_clauses is deprecated" if $VERBOSE to_sql = Visitors::ToSql.new @engine diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index 25b7f005ea..d45253abd5 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -52,6 +52,7 @@ module Arel o.cores.map { |x| visit x }.join, ("ORDER BY #{o.orders.map { |x| visit x }.join(', ')}" unless o.orders.empty?), ("LIMIT #{o.limit}" if o.limit), + (visit(o.offset) if o.offset), (visit(o.lock) if o.lock), ].compact.join ' ' end @@ -70,6 +71,10 @@ module Arel "HAVING #{visit o.expr}" end + def visit_Arel_Nodes_Offset o + "OFFSET #{visit o.value}" + end + # FIXME: this does nothing on SQLLite3, but should do things on other # databases. def visit_Arel_Nodes_Lock o diff --git a/spec/arel/select_manager_spec.rb b/spec/arel/select_manager_spec.rb index 5e4059084f..9a2b14f920 100644 --- a/spec/arel/select_manager_spec.rb +++ b/spec/arel/select_manager_spec.rb @@ -26,6 +26,21 @@ module Arel end describe 'select manager' do + describe 'skip' do + it 'should add an offset' do + table = Table.new :users + mgr = table.from table + mgr.skip 10 + mgr.to_sql.should be_like %{ SELECT FROM "users" OFFSET 10 } + end + + it 'should chain' do + table = Table.new :users + mgr = table.from table + mgr.skip(10).to_sql.should be_like %{ SELECT FROM "users" OFFSET 10 } + end + end + describe 'taken' do it 'should return limit' do table = Table.new :users |