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

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

Returns:

  • (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