mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
adding an offset node
This commit is contained in:
parent
9efae8f92d
commit
ac2bdd1dd3
6 changed files with 39 additions and 1 deletions
|
@ -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'
|
||||
|
|
11
lib/arel/nodes/offset.rb
Normal file
11
lib/arel/nodes/offset.rb
Normal file
|
@ -0,0 +1,11 @@
|
|||
module Arel
|
||||
module Nodes
|
||||
class Offset
|
||||
attr_accessor :value
|
||||
|
||||
def initialize value
|
||||
@value = value
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue