class StreamRails::Enrich

Attributes

fields[R]

Public Class Methods

new(fields = nil) click to toggle source
# File lib/stream_rails/enrich.rb, line 33
def initialize(fields = nil)
  @fields = fields || %i[actor object target]
end

Public Instance Methods

add_fields(new_fields) click to toggle source
# File lib/stream_rails/enrich.rb, line 37
def add_fields(new_fields)
  new_fields.each { |i| @fields << i }
end
collect_references(activities) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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

Private Instance Methods

create_activity_results(activities) click to toggle source
# File lib/stream_rails/enrich.rb, line 110
def create_activity_results(activities)
  activities.map { |a| ActivityResult.new.from_activity(a) }
end