From 8edd2b38cb2959fce7d97626cd17e1d463871662 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Mon, 25 Jan 2021 11:30:59 +0100 Subject: [PATCH] FIX: ensures timeline_lookup includes last tuple (#11829) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A simplified version of the logic used in the function before my fix is as follow: ```ruby result = [] things = [0,1,2,3] max_values = 2 every = (things.size.to_f / max_values).ceil things.each_with_index do |t, index| next unless (t % every) === 0 result << t end p result # [0, 2] # 3 doesn’t get included ``` The problem is that if you get unlucky two times you won't get last tuple(s) and might get a very erroneous date. Double unlucky: - last tuple index % computed every !== 0 and you don't get the last tuple - the last tuple is related to a post with a very different date than the previous tuples (on year difference in our case) --- lib/timeline_lookup.rb | 5 ++++- spec/lib/timeline_lookup_spec.rb | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 spec/lib/timeline_lookup_spec.rb diff --git a/lib/timeline_lookup.rb b/lib/timeline_lookup.rb index 2e6cf57c82b..f477153f947 100644 --- a/lib/timeline_lookup.rb +++ b/lib/timeline_lookup.rb @@ -12,7 +12,10 @@ module TimelineLookup last_days_ago = -1 tuples.each_with_index do |t, idx| return result unless t.is_a?(Array) - next unless (idx % every) === 0 + + if idx != tuples.size - 1 + next unless (idx % every) === 0 + end days_ago = t[1] diff --git a/spec/lib/timeline_lookup_spec.rb b/spec/lib/timeline_lookup_spec.rb new file mode 100644 index 00000000000..517b038c57e --- /dev/null +++ b/spec/lib/timeline_lookup_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe TimelineLookup do + + context '.build' do + it 'keeps the last tuple in the lookup' do + tuples = [ + [7173, 400], [7174, 390], [7175, 380], [7176, 370], [7177, 1] + ] + + expect(TimelineLookup.build(tuples, 2)).to eq([[1, 400], [4, 370], [5, 1]]) + end + end + +end