Refactor get_recently_added_entries method

This commit is contained in:
Alex Ling 2020-06-09 05:35:27 +00:00
parent 8da4475a74
commit 717d44e029

View File

@ -533,38 +533,39 @@ class Library
}[0..11] }[0..11]
end end
alias RA = NamedTuple(
entry: Entry,
percentage: Float64,
grouped_count: Int32)
def get_recently_added_entries(username) def get_recently_added_entries(username)
entries = [] of Entry # Get all entries added within the last three months
titles.each do |t| entries = titles.map { |t| t.entries }
t.entries.each { |e| entries << e } .flatten
end .select { |e| e.date_added > 3.months.ago }
entries.sort! { |a, b| b.date_added <=> a.date_added }
entries.select! { |e| e.date_added > 3.months.ago }
# Group Entries if neighbour is same Title # Group entries in a Hash by title ID
recently_added = [] of RA grouped_entries = {} of String => Array(Entry)
entries.each do |e| entries.each do |e|
last = recently_added.last? if grouped_entries.has_key? e.title_id
if last && e.title_id == last[:entry].title_id grouped_entries[e.title_id].push e
# A NamedTuple is immutable, so we have to cast it to a Hash first
last_hash = last.to_h
count = last_hash[:grouped_count].as(Int32)
last_hash[:grouped_count] = count + 1
recently_added[recently_added.size - 1] = RA.from last_hash
else else
recently_added << { grouped_entries[e.title_id] = [e]
entry: e,
percentage: e.book.load_percentage(username, e.title),
grouped_count: 1,
}
end end
end end
# Cast the Hash to an Array of Tuples and sort it by date_added
grouped_ary = grouped_entries.to_a.sort do |a, b|
date_added_a = a[1].map { |e| e.date_added }.max
date_added_b = b[1].map { |e| e.date_added }.max
date_added_b <=> date_added_a
end
recently_added = grouped_ary.map do |_, ary|
# Get the most recently added entry in the group
entry = ary.sort { |a, b| a.date_added <=> b.date_added }.last
{
entry: entry,
percentage: entry.book.load_percentage(username, entry.title),
grouped_count: ary.size,
}
end
recently_added[0..11] recently_added[0..11]
end end