Class: Clicks::ClicksManagement
- Inherits:
-
Object
- Object
- Clicks::ClicksManagement
- Defined in:
- lib/clicks/clicks_management.rb
Instance Method Summary collapse
- #add_to_result(record) ⇒ Object
- #array_contains?(array, record) ⇒ Boolean
- #candidates_by_amount ⇒ Object
- #clean_massive_clicks_per_ip(clicks) ⇒ Object
- #compare_dates_diff(record_1, record_2) ⇒ Object
- #eligible_diff_time?(time_end, time_start) ⇒ Boolean
- #filter_clicks(clicks) ⇒ Object
- #group_by_ip(clicks) ⇒ Object
-
#initialize(hash_clicks, options) ⇒ ClicksManagement
constructor
A new instance of ClicksManagement.
- #manage_candidates ⇒ Object
- #manage_last_click(record) ⇒ Object
- #manage_last_sibling(record) ⇒ Object
- #manage_record_with_no_siblings(record, clicks, index) ⇒ Object
- #most_expensive_one_per_group(clicks_by_ip) ⇒ Object
- #most_recent_one(clicks) ⇒ Object
- #perform(hash_clicks) ⇒ Object
- #push_to_collection(collection, record) ⇒ Object
- #records_from_different_ips?(record_1, record_2) ⇒ Boolean
- #select_duplicated_records ⇒ Object
- #selected_record_within_one_hour(clicks) ⇒ Object
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, ) @result = [] @candidates = Array.new @limit = if .present? && [:limit].present? [: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
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_amount ⇒ Object
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
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_candidates ⇒ Object
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
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_records ⇒ Object
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 |