Commit 9a9fdf733d67a2a4e90c968d09656ce1a0d33dbc

Authored by Andrew Kane
1 parent cdfacb25
Exists in auto_calculations

Handle order better

Showing 2 changed files with 32 additions and 11 deletions   Show diff stats
lib/groupdate/magic.rb
... ... @@ -7,6 +7,7 @@ module Groupdate
7 7 def initialize(period, options)
8 8 @period = period
9 9 @options = options
  10 + @reverse = false
10 11  
11 12 raise Groupdate::Error, "Unrecognized time zone" unless time_zone
12 13  
... ... @@ -160,23 +161,30 @@ module Groupdate
160 161 # TODO do not change object state
161 162 @group_index = group.group_values.size - 1
162 163  
  164 + # undo reverse since we do not want this to appear in the query
  165 + @reverse = relation.send(:reverse_order_value)
  166 + relation = relation.except(:reverse_order) if @reverse
  167 + relation = relation.reorder(relation.order_values[1..-1]) if process_order(relation.order_values.first)
  168 +
163 169 Groupdate::Series.new(self, relation)
164 170 end
165 171  
166   - def perform(relation, method, *args, &block)
167   - # undo reverse since we do not want this to appear in the query
168   - reverse = relation.send(:reverse_order_value)
169   - relation = relation.except(:reverse_order) if reverse
170   - order = relation.order_values.first
  172 + def process_order(order)
171 173 if order.is_a?(String)
172 174 parts = order.split(" ")
173 175 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")
174 176 if reverse_order
175   - reverse = !reverse
176   - relation = relation.reorder(relation.order_values[1..-1])
  177 + self.reverse_order
  178 + true
177 179 end
178 180 end
  181 + end
179 182  
  183 + def reverse_order
  184 + @reverse = !@reverse
  185 + end
  186 +
  187 + def perform(relation, method, *args, &block)
180 188 result = relation.send(method, *args, &block)
181 189  
182 190 if result.is_a?(Hash)
... ... @@ -196,9 +204,11 @@ module Groupdate
196 204 end
197 205 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] }]
198 206  
199   - series(result, (options.key?(:default_value) ? options[:default_value] : 0), multiple_groups, reverse)
200   - else
  207 + series(result, (options.key?(:default_value) ? options[:default_value] : 0), multiple_groups, @reverse)
  208 + elsif result.is_a?(Groupdate::Series) || result.is_a?(ActiveRecord::Relation)
201 209 Groupdate::Series.new(self, result)
  210 + else
  211 + result
202 212 end
203 213 end
204 214  
... ...
lib/groupdate/series.rb
... ... @@ -28,8 +28,19 @@ module Groupdate
28 28 relation.group_values
29 29 end
30 30  
31   - def reverse_order_value
32   - nil
  31 + def order(value)
  32 + magic.process_order(value)
  33 + self
  34 + end
  35 +
  36 + def reorder(value)
  37 + magic.process_order(value)
  38 + self
  39 + end
  40 +
  41 + def reverse_order
  42 + magic.reverse_order
  43 + self
33 44 end
34 45 end
35 46 end
... ...