Class: Clicks::ClicksManagement

Inherits:
Object
  • Object
show all
Defined in:
lib/clicks/clicks_management.rb

Instance Method Summary collapse

Constructor Details

#initialize(hash_clicks, options) ⇒ ClicksManagement

Returns a new instance of ClicksManagement.



8
9
10
11
12
13
14
15
16
17
# File 'lib/clicks/clicks_management.rb', line 8

def initialize(hash_clicks,  options)
  @result = []
  @candidates = Array.new
  @limit = if options.present? && options[:limit].present?
             options[:limit].to_i
           else
             10
           end
  perform(hash_clicks)
end

Instance Method Details

#add_to_result(record) ⇒ Object



114
115
116
# File 'lib/clicks/clicks_management.rb', line 114

def add_to_result(record)
  push_to_collection(@result, record) unless compare_dates_diff(@result.last, record)
end

#array_contains?(array, record) ⇒ Boolean

Returns:

  • (Boolean)


126
127
128
129
# File 'lib/clicks/clicks_management.rb', line 126

def array_contains?(array, record)
  array.each { |click| return true if click == record }
  false
end

#candidates_by_amountObject



131
132
133
# File 'lib/clicks/clicks_management.rb', line 131

def candidates_by_amount
  @candidates.sort_by { |hsh| -hsh["amount"] }
end

#clean_massive_clicks_per_ip(clicks) ⇒ Object



39
40
41
# File 'lib/clicks/clicks_management.rb', line 39

def clean_massive_clicks_per_ip(clicks)
  group_by_ip(clicks).delete_if{|k,v| v.size >= @limit}
end

#compare_dates_diff(record_1, record_2) ⇒ Object



118
119
120
# File 'lib/clicks/clicks_management.rb', line 118

def compare_dates_diff(record_1, record_2)
  eligible_diff_time?(record_1["timestamp"], record_2["timestamp"])
end

#eligible_diff_time?(time_end, time_start) ⇒ Boolean

Returns:

  • (Boolean)


135
136
137
138
139
140
141
# File 'lib/clicks/clicks_management.rb', line 135

def eligible_diff_time?(time_end, time_start)
  puts "Hora final"
  puts time_end
  puts "hora comienzo"
  puts time_start
  time_end.to_time&.hour == time_start.to_time&.hour
end

#filter_clicks(clicks) ⇒ Object



28
29
30
31
32
33
34
35
36
37
# File 'lib/clicks/clicks_management.rb', line 28

def filter_clicks(clicks)
  clicks.each do |_k, v|
    if v.size == 1
      @result.push(v.first)
    else
      most_expensive_one_per_group(v)
    end
  end
  @result
end

#group_by_ip(clicks) ⇒ Object



24
25
26
# File 'lib/clicks/clicks_management.rb', line 24

def group_by_ip(clicks)
  clicks.group_by {|record| record['ip']}
end

#manage_candidatesObject



96
97
98
99
100
101
102
103
104
105
# File 'lib/clicks/clicks_management.rb', line 96

def manage_candidates
  duplicated_amount_clicks = select_duplicated_records
  if duplicated_amount_clicks.count == 1
    add_to_result(duplicated_amount_clicks.first)
  else
    winner = most_recent_one(duplicated_amount_clicks)
    push_to_collection(@result, winner)
  end
  @candidates = []
end

#manage_last_click(record) ⇒ Object



70
71
72
73
74
# File 'lib/clicks/clicks_management.rb', line 70

def manage_last_click(record)
  return manage_candidates if array_contains?(@candidates, record)

  push_to_collection(@result, record)
end

#manage_last_sibling(record) ⇒ Object



76
77
78
79
# File 'lib/clicks/clicks_management.rb', line 76

def manage_last_sibling(record)
  push_to_collection(@candidates, record)
  manage_candidates
end

#manage_record_with_no_siblings(record, clicks, index) ⇒ Object



81
82
83
84
85
86
# File 'lib/clicks/clicks_management.rb', line 81

def manage_record_with_no_siblings(record, clicks, index)
  if (!eligible_diff_time?(record["timestamp"], clicks[index-1]["timestamp"]) && !eligible_diff_time?(clicks[index+1]["timestamp"], record["timestamp"])) || index.zero?
    push_to_collection(@result, record)
    return true
  end
end

#most_expensive_one_per_group(clicks_by_ip) ⇒ Object



44
45
46
# File 'lib/clicks/clicks_management.rb', line 44

def most_expensive_one_per_group(clicks_by_ip)
  selected_record_within_one_hour(clicks_by_ip)
end

#most_recent_one(clicks) ⇒ Object



122
123
124
# File 'lib/clicks/clicks_management.rb', line 122

def most_recent_one(clicks)
  clicks.sort_by { |hsh| Time.parse(hsh["timestamp"]) }.reverse!.first
end

#perform(hash_clicks) ⇒ Object



19
20
21
22
# File 'lib/clicks/clicks_management.rb', line 19

def perform(hash_clicks)
  clicks = filter_clicks(group_by_ip(hash_clicks))
  clean_massive_clicks_per_ip(clicks)
end

#push_to_collection(collection, record) ⇒ Object



92
93
94
# File 'lib/clicks/clicks_management.rb', line 92

def push_to_collection(collection, record)
  collection.push(record) unless array_contains?(collection, record)
end

#records_from_different_ips?(record_1, record_2) ⇒ Boolean

Returns:

  • (Boolean)


88
89
90
# File 'lib/clicks/clicks_management.rb', line 88

def records_from_different_ips?(record_1, record_2)
  record_1["ip"] != record_2["ip"]
end

#select_duplicated_recordsObject



107
108
109
110
111
112
# File 'lib/clicks/clicks_management.rb', line 107

def select_duplicated_records
  candidates_ordered_amount = candidates_by_amount
  candidates_ordered_amount.select do |click|
    click["amount"] == candidates_ordered_amount[0]["amount"]
  end
end

#selected_record_within_one_hour(clicks) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/clicks/clicks_management.rb', line 48

def selected_record_within_one_hour(clicks)
  clicks.each_with_index do |record, index|
    (index...clicks.size).each do |comparator_position|
      if comparator_position > index
        if eligible_diff_time?(clicks[comparator_position]["timestamp"], record["timestamp"])
          push_to_collection(@candidates, record)
          push_to_collection(@candidates, clicks[comparator_position])
        else
          if @candidates.blank?
            break if manage_record_with_no_siblings(record, clicks, index)
          else
            manage_last_sibling(record)
            break
          end
        end
      elsif index==clicks.size-1
        manage_last_click(record)
      end
    end
  end
end