Class: ReportsKit::Reports::Data::Utils
- Inherits:
-
Object
- Object
- ReportsKit::Reports::Data::Utils
- Defined in:
- lib/reports_kit/reports/data/utils.rb
Class Method Summary collapse
- .arrays_values_to_nested_hash(arrays_values) ⇒ Object
- .dimension_key_to_entity(dimension_key, dimension, dimension_ids_dimension_instances) ⇒ Object
- .dimension_key_to_label(dimension_instance, dimension, ids_dimension_instances) ⇒ Object
- .dimension_to_dimension_ids_dimension_instances(dimension, dimension_ids) ⇒ Object
- .format_configuration_time(time) ⇒ Object
- .format_csv_time(time) ⇒ Object
- .format_date_range(string) ⇒ Object
- .format_display_time(time) ⇒ Object
- .format_number(number) ⇒ Object
- .format_time_value(value) ⇒ Object
- .nested_hash_to_arrays_values(nested_hash) ⇒ Object
- .parse_date_range(string, type: nil) ⇒ Object
- .parse_date_string(string) ⇒ Object
- .populate_sparse_hash(hash, dimension:) ⇒ Object
- .populate_sparse_keys(keys, dimension:) ⇒ Object
- .quote_column_name(string) ⇒ Object
- .raw_value_to_value(raw_value, value_format_method) ⇒ Object
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 |