From 9a9fdf733d67a2a4e90c968d09656ce1a0d33dbc Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Tue, 24 Oct 2017 23:27:01 -0700 Subject: [PATCH] Handle order better --- lib/groupdate/magic.rb | 28 +++++++++++++++++++--------- lib/groupdate/series.rb | 15 +++++++++++++-- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/lib/groupdate/magic.rb b/lib/groupdate/magic.rb index 552f47c..8c8e244 100644 --- a/lib/groupdate/magic.rb +++ b/lib/groupdate/magic.rb @@ -7,6 +7,7 @@ module Groupdate def initialize(period, options) @period = period @options = options + @reverse = false raise Groupdate::Error, "Unrecognized time zone" unless time_zone @@ -160,23 +161,30 @@ module Groupdate # TODO do not change object state @group_index = group.group_values.size - 1 + # undo reverse since we do not want this to appear in the query + @reverse = relation.send(:reverse_order_value) + relation = relation.except(:reverse_order) if @reverse + relation = relation.reorder(relation.order_values[1..-1]) if process_order(relation.order_values.first) + Groupdate::Series.new(self, relation) end - def perform(relation, method, *args, &block) - # undo reverse since we do not want this to appear in the query - reverse = relation.send(:reverse_order_value) - relation = relation.except(:reverse_order) if reverse - order = relation.order_values.first + def process_order(order) if order.is_a?(String) parts = order.split(" ") reverse_order = (parts.size == 2 && (parts[0].to_sym == period || (activerecord42? && parts[0] == "#{relation.quoted_table_name}.#{relation.quoted_primary_key}")) && parts[1].to_s.downcase == "desc") if reverse_order - reverse = !reverse - relation = relation.reorder(relation.order_values[1..-1]) + self.reverse_order + true end end + end + def reverse_order + @reverse = !@reverse + end + + def perform(relation, method, *args, &block) result = relation.send(method, *args, &block) if result.is_a?(Hash) @@ -196,9 +204,11 @@ module Groupdate end result = Hash[result.map { |k, v| [multiple_groups ? k[0...@group_index] + [cast_method.call(k[@group_index])] + k[(@group_index + 1)..-1] : cast_method.call(k), v] }] - series(result, (options.key?(:default_value) ? options[:default_value] : 0), multiple_groups, reverse) - else + series(result, (options.key?(:default_value) ? options[:default_value] : 0), multiple_groups, @reverse) + elsif result.is_a?(Groupdate::Series) || result.is_a?(ActiveRecord::Relation) Groupdate::Series.new(self, result) + else + result end end diff --git a/lib/groupdate/series.rb b/lib/groupdate/series.rb index 382740f..15ff89c 100644 --- a/lib/groupdate/series.rb +++ b/lib/groupdate/series.rb @@ -28,8 +28,19 @@ module Groupdate relation.group_values end - def reverse_order_value - nil + def order(value) + magic.process_order(value) + self + end + + def reorder(value) + magic.process_order(value) + self + end + + def reverse_order + magic.reverse_order + self end end end -- libgit2 0.21.0