mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Support Attribute#asc and Attribute#desc to create orderings
This commit is contained in:
parent
f5b76c220e
commit
eef61ab909
7 changed files with 78 additions and 0 deletions
|
@ -151,6 +151,14 @@ module Arel
|
|||
grouping_all :lteq, others
|
||||
end
|
||||
|
||||
def asc
|
||||
Nodes::Ordering.new self, :asc
|
||||
end
|
||||
|
||||
def desc
|
||||
Nodes::Ordering.new self, :desc
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def grouping_any method_id, others
|
||||
|
|
|
@ -15,6 +15,7 @@ require 'arel/nodes/does_not_match'
|
|||
|
||||
require 'arel/nodes/in'
|
||||
require 'arel/nodes/not_in'
|
||||
require 'arel/nodes/ordering'
|
||||
require 'arel/nodes/lock'
|
||||
require 'arel/nodes/function'
|
||||
require 'arel/nodes/count'
|
||||
|
|
19
lib/arel/nodes/ordering.rb
Normal file
19
lib/arel/nodes/ordering.rb
Normal file
|
@ -0,0 +1,19 @@
|
|||
module Arel
|
||||
module Nodes
|
||||
class Ordering < Arel::Nodes::Node
|
||||
attr_accessor :expr, :direction
|
||||
|
||||
def initialize expression, direction = :asc
|
||||
@expr, @direction = expression, direction
|
||||
end
|
||||
|
||||
def ascending?
|
||||
direction == :asc
|
||||
end
|
||||
|
||||
def descending?
|
||||
direction == :desc
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -32,6 +32,11 @@ module Arel
|
|||
visit_edge o, "expr"
|
||||
end
|
||||
|
||||
def visit_Arel_Nodes_Ordering o
|
||||
visit_edge o, "expr"
|
||||
visit_edge o, "direction"
|
||||
end
|
||||
|
||||
def visit_Arel_Nodes_TableAlias o
|
||||
visit_edge o, "name"
|
||||
visit_edge o, "relation"
|
||||
|
|
|
@ -107,6 +107,10 @@ module Arel
|
|||
"(#{visit o.expr})"
|
||||
end
|
||||
|
||||
def visit_Arel_Nodes_Ordering o
|
||||
"#{visit o.expr} #{o.descending? ? 'DESC' : 'ASC'}"
|
||||
end
|
||||
|
||||
def visit_Arel_Nodes_Group o
|
||||
visit o.expr
|
||||
end
|
||||
|
|
|
@ -601,6 +601,38 @@ module Arel
|
|||
}
|
||||
end
|
||||
end
|
||||
|
||||
describe '#asc' do
|
||||
it 'should create an Ordering node' do
|
||||
relation = Table.new(:users)
|
||||
relation[:id].asc.should be_kind_of Nodes::Ordering
|
||||
end
|
||||
|
||||
it 'should generate ASC in sql' do
|
||||
relation = Table.new(:users)
|
||||
mgr = relation.project relation[:id]
|
||||
mgr.order relation[:id].asc
|
||||
mgr.to_sql.should be_like %{
|
||||
SELECT "users"."id" FROM "users" ORDER BY "users"."id" ASC
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
describe '#desc' do
|
||||
it 'should create an Ordering node' do
|
||||
relation = Table.new(:users)
|
||||
relation[:id].desc.should be_kind_of Nodes::Ordering
|
||||
end
|
||||
|
||||
it 'should generate DESC in sql' do
|
||||
relation = Table.new(:users)
|
||||
mgr = relation.project relation[:id]
|
||||
mgr.order relation[:id].desc
|
||||
mgr.to_sql.should be_like %{
|
||||
SELECT "users"."id" FROM "users" ORDER BY "users"."id" DESC
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'equality' do
|
||||
|
|
|
@ -66,6 +66,15 @@ module Arel
|
|||
@visitor.accept(test).should be_like %{ "users"."id" = 't' }
|
||||
end
|
||||
|
||||
describe "Nodes::Ordering" do
|
||||
it "should know how to visit" do
|
||||
node = @attr.desc
|
||||
@visitor.accept(node).should be_like %{
|
||||
"users"."id" DESC
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
describe "Nodes::In" do
|
||||
it "should know how to visit" do
|
||||
node = @attr.in [1, 2, 3]
|
||||
|
|
Loading…
Reference in a new issue