Class: ReportsKit::Reports::Data::Utils

Inherits:
Object
  • Object
show all
Defined in:
lib/reports_kit/reports/data/utils.rb

Class Method Summary collapse

Class Method Details

.arrays_values_to_nested_hash(arrays_values) ⇒ Object



114
115
116
117
118
119
120
121
# File 'lib/reports_kit/reports/data/utils.rb', line 114

def self.arrays_values_to_nested_hash(arrays_values)
  nested_hash = {}
  arrays_values.each do |(key1, key2), value|
    nested_hash[key1] ||= {}
    nested_hash[key1][key2] ||= value
  end
  nested_hash
end

.dimension_key_to_entity(dimension_key, dimension, dimension_ids_dimension_instances) ⇒ Object



147
148
149
150
151
# File 'lib/reports_kit/reports/data/utils.rb', line 147

def self.dimension_key_to_entity(dimension_key, dimension, dimension_ids_dimension_instances)
  instance = dimension_ids_dimension_instances ? dimension_ids_dimension_instances[dimension_key] : dimension_key
  label = dimension_key_to_label(dimension_key, dimension, dimension_ids_dimension_instances)
  Entity.new(dimension_key, label, instance)
end

.dimension_key_to_label(dimension_instance, dimension, ids_dimension_instances) ⇒ Object



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/reports_kit/reports/data/utils.rb', line 153

def self.dimension_key_to_label(dimension_instance, dimension, ids_dimension_instances)
  label = dimension.key_to_label(dimension_instance)
  return label if label
  return dimension_instance.to_s if dimension.configured_by_column? && dimension.column_type == :integer
  case dimension_instance
  when Time, Date
    Utils.format_display_time(dimension_instance)
  when Fixnum
    raise ArgumentError.new("ids_dimension_instances must be present for Dimension with identifier: #{dimension_instance}") unless ids_dimension_instances
    instance = ids_dimension_instances[dimension_instance.to_i]
    return unless instance
    instance.to_s
  else
    dimension_instance.to_s.gsub(/\.0$/, '')
  end
end

.dimension_to_dimension_ids_dimension_instances(dimension, dimension_ids) ⇒ Object



137
138
139
140
141
142
143
144
145
# File 'lib/reports_kit/reports/data/utils.rb', line 137

def self.dimension_to_dimension_ids_dimension_instances(dimension, dimension_ids)
  return nil unless dimension.instance_class
  primary_key = dimension.instance_class.primary_key
  dimension_instances = dimension.instance_class.where(primary_key => dimension_ids.uniq)
  dimension_ids_dimension_instances = dimension_instances.map do |dimension_instance|
    [dimension_instance.send(primary_key), dimension_instance]
  end
  Hash[dimension_ids_dimension_instances]
end

.format_configuration_time(time) ⇒ Object



5
6
7
# File 'lib/reports_kit/reports/data/utils.rb', line 5

def self.format_configuration_time(time)
  time.strftime('%b %-d, %Y')
end

.format_csv_time(time) ⇒ Object



9
10
11
# File 'lib/reports_kit/reports/data/utils.rb', line 9

def self.format_csv_time(time)
  time.strftime('%Y-%m-%d')
end

.format_date_range(string) ⇒ Object



17
18
19
20
# File 'lib/reports_kit/reports/data/utils.rb', line 17

def self.format_date_range(string)
  start_at, end_at = parse_date_range(string, type: Array)
  [format_display_time(start_at), FilterTypes::Datetime::SEPARATOR, format_display_time(end_at)].join(' ')
end

.format_display_time(time) ⇒ Object



13
14
15
# File 'lib/reports_kit/reports/data/utils.rb', line 13

def self.format_display_time(time)
  time.strftime('%b %-d, \'%y')
end

.format_number(number) ⇒ Object



28
29
30
31
32
# File 'lib/reports_kit/reports/data/utils.rb', line 28

def self.format_number(number)
  number_i = number.to_i
  return number_i if number == number_i
  number.round(Generate::ROUND_PRECISION)
end

.format_time_value(value) ⇒ Object



22
23
24
25
26
# File 'lib/reports_kit/reports/data/utils.rb', line 22

def self.format_time_value(value)
  time = RelativeTime.parse(value, prevent_exceptions: true)
  return value unless time
  Utils.format_configuration_time(time)
end

.nested_hash_to_arrays_values(nested_hash) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/reports_kit/reports/data/utils.rb', line 123

def self.nested_hash_to_arrays_values(nested_hash)
  arrays_values = {}
  nested_hash.each do |key1, key2s_values|
    if key2s_values.blank?
      arrays_values[[key1, nil]] = 0
      next
    end
    key2s_values.each do |key2, value|
      arrays_values[[key1, key2]] = value
    end
  end
  arrays_values
end

.parse_date_range(string, type: nil) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
# File 'lib/reports_kit/reports/data/utils.rb', line 44

def self.parse_date_range(string, type: nil)
  return if string.blank?
  start_string, end_string = string.split(FilterTypes::Datetime::SEPARATOR)
  start_at = parse_date_string(start_string)
  end_at = parse_date_string(end_string)
  if type == Array
    [start_at, end_at]
  else
    (start_at..end_at)
  end
end

.parse_date_string(string) ⇒ Object



38
39
40
41
42
# File 'lib/reports_kit/reports/data/utils.rb', line 38

def self.parse_date_string(string)
  Date.parse(string)
rescue ArgumentError
  RelativeTime.parse(string)
end

.populate_sparse_hash(hash, dimension:) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/reports_kit/reports/data/utils.rb', line 56

def self.populate_sparse_hash(hash, dimension:)
  keys = hash.keys
  is_nested = dimension.series.has_two_dimensions?
  if is_nested
    keys_values = arrays_values_to_nested_hash(hash)
    keys = keys_values.keys
  else
    keys_values = hash
  end

  first_key = dimension.first_key || keys.first
  return hash unless first_key.is_a?(Time) || first_key.is_a?(Date)
  keys_values = keys_values.map do |key, value|
    key = key.to_date if key.is_a?(Time)
    [key, value]
  end.to_h

  keys = populate_sparse_keys(keys, dimension: dimension)
  populated_keys_values = {}
  default_value = is_nested ? {} : 0
  keys.each do |key|
    populated_keys_values[key] = keys_values[key] || default_value
  end
  return nested_hash_to_arrays_values(populated_keys_values) if is_nested
  populated_keys_values
end

.populate_sparse_keys(keys, dimension:) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/reports_kit/reports/data/utils.rb', line 83

def self.populate_sparse_keys(keys, dimension:)
  first_key = dimension.first_key || keys.first
  return keys unless first_key.is_a?(Time) || first_key.is_a?(Date)
  first_key = first_key.to_date
  granularity = dimension.granularity

  keys = keys.sort
  last_key = (dimension.last_key || keys.last).to_date
  if granularity == 'week'
    first_key = first_key.beginning_of_week(ReportsKit.configuration.first_day_of_week)
    last_key = last_key.beginning_of_week(ReportsKit.configuration.first_day_of_week)
  elsif granularity == 'month'
    first_key = first_key.beginning_of_month
    last_key = last_key.beginning_of_month
  end

  date = first_key
  populated_keys = []
  interval = case granularity
             when 'day' then 1.day
             when 'month' then 1.month
             else 1.week
             end
  loop do
    populated_keys << date
    break if date >= last_key
    date += interval
  end
  populated_keys
end

.quote_column_name(string) ⇒ Object



34
35
36
# File 'lib/reports_kit/reports/data/utils.rb', line 34

def self.quote_column_name(string)
  ActiveRecord::Base.connection.quote_column_name(string)
end

.raw_value_to_value(raw_value, value_format_method) ⇒ Object



170
171
172
173
174
# File 'lib/reports_kit/reports/data/utils.rb', line 170

def self.raw_value_to_value(raw_value, value_format_method)
  formatted_value = format_number(raw_value)
  formatted_value = value_format_method.call(raw_value) if value_format_method
  Value.new(raw_value, formatted_value)
end