Class: Groupdate::Magic::Relation

Inherits:
Groupdate::Magic show all
Defined in:
lib/groupdate/magic.rb

Instance Attribute Summary

Attributes inherited from Groupdate::Magic

#group_index, #options, #period

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Groupdate::Magic

#day_start, #series_builder, #time_range, #time_zone, #week_start

Constructor Details

#initialize(**options) ⇒ Relation

Returns a new instance of Relation.



61
62
63
64
# File 'lib/groupdate/magic.rb', line 61

def initialize(**options)
  super(**options.reject { |k, _| [:default_value, :carry_forward, :last, :current].include?(k) })
  @options = options
end

Class Method Details

.generate_relation(relation, field:, **options) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/groupdate/magic.rb', line 103

def self.generate_relation(relation, field:, **options)
  magic = Groupdate::Magic::Relation.new(**options)

  # generate ActiveRecord relation
  relation =
    RelationBuilder.new(
      relation,
      column: field,
      period: magic.period,
      time_zone: magic.time_zone,
      time_range: magic.time_range,
      week_start: magic.week_start,
      day_start: magic.day_start
    ).generate

  # add Groupdate info
  magic.group_index = relation.group_values.size - 1
  (relation.groupdate_values ||= []) << magic

  relation
end

.process_result(relation, result) ⇒ Object



125
126
127
128
129
130
# File 'lib/groupdate/magic.rb', line 125

def self.process_result(relation, result)
  relation.groupdate_values.reverse.each do |gv|
    result = gv.perform(relation, result)
  end
  result
end

Instance Method Details

#cast_methodObject



80
81
82
83
84
85
86
87
88
89
90
# File 'lib/groupdate/magic.rb', line 80

def cast_method
  case period
  when :day_of_week
    lambda { |k| (k.to_i - 1 - week_start) % 7 }
  when :hour_of_day, :day_of_month, :month_of_year, :minute_of_hour
    lambda { |k| k.to_i }
  else
    utc = ActiveSupport::TimeZone["UTC"]
    lambda { |k| (k.is_a?(String) || !k.respond_to?(:to_time) ? utc.parse(k.to_s) : k.to_time).in_time_zone(time_zone) }
  end
end

#cast_result(result, multiple_groups) ⇒ Object



92
93
94
# File 'lib/groupdate/magic.rb', line 92

def cast_result(result, multiple_groups)
  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] }]
end

#check_time_zone_support(result, multiple_groups) ⇒ Object



96
97
98
99
100
101
# File 'lib/groupdate/magic.rb', line 96

def check_time_zone_support(result, multiple_groups)
  missing_time_zone_support = multiple_groups ? (result.keys.first && result.keys.first[group_index].nil?) : result.key?(nil)
  if missing_time_zone_support
    raise Groupdate::Error, "Be sure to install time zone support - https://github.com/ankane/groupdate#for-mysql"
  end
end

#perform(relation, result) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/groupdate/magic.rb', line 66

def perform(relation, result)
  multiple_groups = relation.group_values.size > 1

  check_time_zone_support(result, multiple_groups)
  result = cast_result(result, multiple_groups)

  series_builder.generate(
    result,
    default_value: options.key?(:default_value) ? options[:default_value] : 0,
    multiple_groups: multiple_groups,
    group_index: group_index
  )
end