Skip to content

Commit

Permalink
blow out sorter
Browse files Browse the repository at this point in the history
  • Loading branch information
defunkt committed Nov 9, 2007
1 parent 8eae500 commit 1c68d2e
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 12 deletions.
28 changes: 24 additions & 4 deletions lib/ambition/adapters/active_record/sort.rb
Expand Up @@ -2,12 +2,32 @@ module Ambition
module Adapters
module ActiveRecord
class Sort < Base
def by(*args)
args.map { |arg| "#{owner.table_name}.#{quote_column_name arg}" }
def sort_by(method)
"#{owner.table_name}.#{quote_column_name method}"
end

def not_by(*args)
args.map { |arg| "#{owner.table_name}.#{quote_column_name arg} DESC" }
def reverse_sort_by(method)
"#{owner.table_name}.#{quote_column_name method} DESC"
end

def chained_sort_by(receiver, method)
if reflection = owner.reflections[receiver]
stash[:include] ||= []
stash[:include] << receiver
"#{reflection.table_name}.#{quote_column_name method}"
else
raise [ receiver, method ].inspect
end
end

def chained_reverse_sort_by(receiver, method)
if reflection = owner.reflections[receiver]
stash[:include] ||= []
stash[:include] << receiver
"#{reflection.table_name}.#{quote_column_name method} DESC"
else
raise [ receiver, method ].inspect
end
end

def to_proc(symbol)
Expand Down
21 changes: 18 additions & 3 deletions lib/ambition/processors/sort.rb
Expand Up @@ -9,17 +9,32 @@ def initialize(context, block)

def process_call(args)
if args.first.last == @receiver
@sorter.by(*args[1..-1])
@sorter.sort_by(*args[1..-1])

# sort_by { |m| -m.age }
# [[:call, [:dvar, :m], :age], :-@]
elsif args.last == :-@
@sorter.not_by(*args.first[2..-1])
elsif args[0][1][-1] == @receiver && args.last == :-@
@sorter.reverse_sort_by(*args.first[2..-1])

# sort_by(&:name).to_s
# [[:call, [:dvar, :args], :shift], :__send__, [:argscat, [:array, [:self]], [:dvar, :args]]]
elsif args[1] == :__send__
@sorter.to_proc(value('to_s'))

# sort_by { |m| m.ideas.title }
# [[:call, [:dvar, :m], :ideas], :title]
elsif args[0][1][-1] == @receiver
first = args.first.last
last = args.last
@sorter.chained_sort_by(first, last)

# sort_by { |m| [ m.ideas.title, -m.invites.email ] }
# [[:call, [:call, [:dvar, :m], :invites], :email], :-@]
elsif args[0][1][1][-1] == @receiver && args.last == :-@
first = args.first[1].last
last = args.first.last
@sorter.chained_reverse_sort_by(first, last)

else
raise args.inspect
end
Expand Down
9 changes: 4 additions & 5 deletions test/adapters/active_record/join_test.rb
Expand Up @@ -34,25 +34,24 @@
}
end

xspecify "complex joins have no to_s" do
specify "complex joins have no to_s" do
sql = User.select { |m| m.account.id > 20 }
should.raise { sql.to_s }
end

specify "non-existant associations" do
sql = User.select { |m| m.liquor.brand == 'Jack' }
should.raise(NoMethodError) { sql.to_hash }
should.raise(NoMethodError) { User.select { |m| m.liquor.brand == 'Jack' } }
end

xspecify "in order" do
specify "in order" do
sql = User.sort_by { |m| m.ideas.title }
sql.to_hash.should == {
:order => "ideas.title",
:include => [:ideas]
}
end

xspecify "in a more complex order" do
specify "in a more complex order" do
sql = User.sort_by { |m| [ m.ideas.title, -m.invites.email ] }
sql.to_hash.should == {
:order => "ideas.title, invites.email DESC",
Expand Down

0 comments on commit 1c68d2e

Please sign in to comment.