Commit 9a9fdf733d67a2a4e90c968d09656ce1a0d33dbc
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 | ... | ... |