Class: StreamRails::Enrich

Inherits:
Object
  • Object
show all
Defined in:
lib/stream_rails/enrich.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(fields = nil) ⇒ Enrich

Returns a new instance of Enrich.



33
34
35
# File 'lib/stream_rails/enrich.rb', line 33

def initialize(fields = nil)
  @fields = fields || %i[actor object target]
end

Instance Attribute Details

#fieldsObject (readonly)

Returns the value of attribute fields.



31
32
33
# File 'lib/stream_rails/enrich.rb', line 31

def fields
  @fields
end

Instance Method Details

#add_fields(new_fields) ⇒ Object



37
38
39
# File 'lib/stream_rails/enrich.rb', line 37

def add_fields(new_fields)
  new_fields.each { |i| @fields << i }
end

#collect_references(activities) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/stream_rails/enrich.rb', line 75

def collect_references(activities)
  model_refs = Hash.new { |h, k| h[k] = {} }
  activities.each do |activity|
    activity.select { |k, _v| @fields.include? k.to_sym }.each do |_field, value|
      next unless model_field?(value)

      model, _, id = value.rpartition(':')
      model_refs[model][id] = 0
    end
  end
  model_refs
end

#enrich_activities(activities) ⇒ Object



56
57
58
59
60
# File 'lib/stream_rails/enrich.rb', line 56

def enrich_activities(activities)
  references = collect_references(activities)
  objects = retrieve_objects(references)
  inject_objects(activities, objects)
end

#enrich_aggregated_activities(aggregated_activities) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/stream_rails/enrich.rb', line 62

def enrich_aggregated_activities(aggregated_activities)
  references = {}
  aggregated_activities.each do |aggregated|
    refs = collect_references(aggregated['activities'])
    references = references.merge(refs) { |_key, v1, v2| v1.merge(v2) }
  end
  objects = retrieve_objects(references)
  aggregated_activities.each do |aggregated|
    aggregated['activities'] = inject_objects(aggregated['activities'], objects)
  end
  create_activity_results(aggregated_activities)
end

#inject_objects(activities, objects) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
# File 'lib/stream_rails/enrich.rb', line 96

def inject_objects(activities, objects)
  create_activity_results(activities).each do |activity|
    activity.select { |k, _v| @fields.include? k.to_sym }.each do |field, value|
      next unless model_field?(value)

      model, _, id = value.rpartition(':')
      activity[field] = objects[model][id] || value
      activity.track_not_enriched_field(field, value) if objects[model][id].nil?
    end
  end
end

#model_field?(field_value) ⇒ Boolean

Returns:

  • (Boolean)


41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/stream_rails/enrich.rb', line 41

def model_field?(field_value)
  return false unless field_value.respond_to?('split')

  model, _, id = field_value.rpartition(':')
  return false unless model.present? && id.present?

  begin
    model.classify.constantize
  rescue NameError
    false
  else
    true
  end
end

#retrieve_objects(references) ⇒ Object



88
89
90
91
92
93
94
# File 'lib/stream_rails/enrich.rb', line 88

def retrieve_objects(references)
  references.map do |model, ids|
    [model, model.classify.constantize.where(model.classify.constantize.primary_key => ids.keys).map do |i|
      [i.id.to_s, i]
    end.to_h]
  end.to_h
end