Module: Schematic::DataStream::Merge
- Defined in:
- lib/schematic/datastream/merge.rb
Constant Summary collapse
- COMPANY_MAP_FIELDS =
%i[credit_balances keys traits].freeze
- COMPANY_ARRAY_FIELDS =
%i[billing_product_ids entitlements plan_ids plan_version_ids rules].freeze
- USER_MAP_FIELDS =
%i[keys traits].freeze
Class Method Summary collapse
- .deep_copy(obj) ⇒ Object
- .get_metric_field(metric, field) ⇒ Object
- .metrics_match?(left, right) ⇒ Boolean
- .partial_company(existing, partial_data) ⇒ Object
- .partial_user(existing, partial_data) ⇒ Object
- .upsert_metrics(existing, incoming) ⇒ Object
Class Method Details
.deep_copy(obj) ⇒ Object
10 11 12 13 14 |
# File 'lib/schematic/datastream/merge.rb', line 10 def deep_copy(obj) JSON.parse(JSON.generate(obj), symbolize_names: true) rescue StandardError obj.dup end |
.get_metric_field(metric, field) ⇒ Object
90 91 92 |
# File 'lib/schematic/datastream/merge.rb', line 90 def get_metric_field(metric, field) metric[field] || metric[field.to_s] end |
.metrics_match?(left, right) ⇒ Boolean
84 85 86 87 88 |
# File 'lib/schematic/datastream/merge.rb', line 84 def metrics_match?(left, right) get_metric_field(left, :event_subtype) == get_metric_field(right, :event_subtype) && get_metric_field(left, :period) == get_metric_field(right, :period) && get_metric_field(left, :month_reset) == get_metric_field(right, :month_reset) end |
.partial_company(existing, partial_data) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/schematic/datastream/merge.rb', line 19 def partial_company(existing, partial_data) return existing unless partial_data.is_a?(Hash) result = deep_copy(existing) partial_data.each do |key, value| sym_key = key.to_sym if COMPANY_MAP_FIELDS.include?(sym_key) result[sym_key] ||= {} result[sym_key] = result[sym_key].merge(value) if value.is_a?(Hash) elsif COMPANY_ARRAY_FIELDS.include?(sym_key) result[sym_key] = value if value.is_a?(Array) elsif sym_key == :metrics result[sym_key] = upsert_metrics(result[sym_key] || [], value || []) else result[sym_key] = value end end result end |
.partial_user(existing, partial_data) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/schematic/datastream/merge.rb', line 43 def partial_user(existing, partial_data) return existing unless partial_data.is_a?(Hash) result = deep_copy(existing) partial_data.each do |key, value| sym_key = key.to_sym if USER_MAP_FIELDS.include?(sym_key) result[sym_key] ||= {} result[sym_key] = result[sym_key].merge(value) if value.is_a?(Hash) elsif sym_key == :rules result[sym_key] = value if value.is_a?(Array) else result[sym_key] = value end end result end |
.upsert_metrics(existing, incoming) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/schematic/datastream/merge.rb', line 63 def upsert_metrics(existing, incoming) return incoming if existing.nil? || existing.empty? return existing if incoming.nil? || incoming.empty? result = existing.map { |metric| deep_copy(metric) } incoming.each do |inc_metric| match_idx = result.index do |ex| metrics_match?(ex, inc_metric) end if match_idx result[match_idx] = inc_metric else result << inc_metric end end result end |