def series(count, default_value, multiple_groups = false, reverse = false, series_default = true)
reverse = !reverse if options[:reverse]
series =
case field
when :day_of_week
0..6
when :hour_of_day
0..23
when :day_of_month
1..31
when :month_of_year
1..12
else
time_range = self.time_range
time_range =
if time_range.is_a?(Range)
time_range
else
sorted_keys =
if multiple_groups
count.keys.map { |k| k[@group_index] }.sort
else
count.keys.sort
end
sorted_keys.first..sorted_keys.last
end
if time_range.first
series = [round_time(time_range.first)]
if field == :quarter
step = 3.months
else
step = 1.send(field)
end
last_step = series.last
while (next_step = round_time(last_step + step)) && time_range.cover?(next_step)
if next_step == last_step
last_step += step
next
end
series << next_step
last_step = next_step
end
series
else
[]
end
end
series =
if multiple_groups
keys = count.keys.map { |k| k[0...@group_index] + k[(@group_index + 1)..-1] }.uniq
series = series.to_a.reverse if reverse
keys.flat_map do |k|
series.map { |s| k[0...@group_index] + [s] + k[@group_index..-1] }
end
else
series
end
series = series.to_a.reverse if !multiple_groups && reverse
locale = options[:locale] || I18n.locale
use_dates = options.key?(:dates) ? options[:dates] : Groupdate.dates
key_format =
if options[:format]
if options[:format].respond_to?(:call)
options[:format]
else
sunday = time_zone.parse("2014-03-02 00:00:00")
lambda do |key|
case field
when :hour_of_day
key = sunday + key.hours + day_start.seconds
when :day_of_week
key = sunday + key.days
when :day_of_month
key = Date.new(2014, 1, key).to_time
when :month_of_year
key = Date.new(2014, key, 1).to_time
end
I18n.localize(key, format: options[:format], locale: locale)
end
end
elsif [:day, :week, :month, :quarter, :year].include?(field) && use_dates
lambda { |k| k.to_date }
else
lambda { |k| k }
end
use_series = options.key?(:series) ? options[:series] : series_default
if use_series == false
series = series.select { |k| count[k] }
end
value = 0
Hash[series.map do |k|
value = count[k] || (@options[:carry_forward] && value) || default_value
[multiple_groups ? k[0...@group_index] + [key_format.call(k[@group_index])] + k[(@group_index + 1)..-1] : key_format.call(k), value]
end]
end