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



89
90
91
92
93
94
95
96
# File 'lib/reports_kit/reports/data/utils.rb', line 89

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



121
122
123
124
125
# File 'lib/reports_kit/reports/data/utils.rb', line 121

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



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/reports_kit/reports/data/utils.rb', line 127

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



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

def self.dimension_to_dimension_ids_dimension_instances(dimension, dimension_ids)
  return nil unless dimension.instance_class
  dimension_instances = dimension.instance_class.where(id: dimension_ids.uniq)
  dimension_ids_dimension_instances = dimension_instances.map do |dimension_instance|
    [dimension_instance.id, 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_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



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

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



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

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



98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/reports_kit/reports/data/utils.rb', line 98

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_string(string) ⇒ Object



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

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

.populate_sparse_hash(hash, dimension:) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/reports_kit/reports/data/utils.rb', line 39

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



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/reports_kit/reports/data/utils.rb', line 66

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

  first_key = first_key.beginning_of_week(ReportsKit.configuration.first_day_of_week) if granularity == 'week'
  keys = keys.sort
  last_key = (dimension.last_key || keys.last).to_date
  last_key = last_key.beginning_of_week(ReportsKit.configuration.first_day_of_week) if granularity == 'week'
  last_key ||= Date.today.beginning_of_week(ReportsKit.configuration.first_day_of_week) if granularity == 'week'

  date = first_key
  populated_keys = []
  interval = granularity == 'week' ? 1.week : 1.day
  loop do
    populated_keys << date
    break if date >= last_key
    date += interval
  end
  populated_keys
end

.quote_column_name(string) ⇒ Object



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

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

.raw_value_to_value(raw_value, value_format_method) ⇒ Object



144
145
146
147
148
# File 'lib/reports_kit/reports/data/utils.rb', line 144

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