FIX: ensures timeline_lookup includes last tuple (#11829)

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)
This commit is contained in:
Joffrey JAFFEUX 2021-01-25 11:30:59 +01:00 committed by GitHub
parent aa1138ff71
commit 8edd2b38cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 1 deletions

View File

@ -12,7 +12,10 @@ module TimelineLookup
last_days_ago = -1
tuples.each_with_index do |t, idx|
return result unless t.is_a?(Array)
if idx != tuples.size - 1
next unless (idx % every) === 0
end
days_ago = t[1]

View File

@ -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