def build_rank(arel, rank_window_options)
unless arel.projections.count == 1 && Arel::Nodes::Count === arel.projections.first
rank_window = case rank_window_options
when :order
arel.orders
when Symbol
table[rank_window_options].asc
when Hash
rank_window_options.map { |field, dir| table[field].send(dir) }
else
Arel::Nodes::SqlLiteral.new "(#{rank_window_options})"
end
unless rank_window.blank?
rank_node = Arel::Nodes::SqlLiteral.new 'rank()'
window = Arel::Nodes::Window.new
if String === rank_window
window = window.frame rank_window
else
window = window.order(rank_window)
end
over_node = Arel::Nodes::Over.new rank_node, window
arel.project(over_node)
end
end
end