refactor get_recently_added_entries, new_user and empty_library

This commit is contained in:
Jared Turner 2020-06-08 15:23:36 +01:00
parent fa85d9834f
commit cff599f688
2 changed files with 20 additions and 37 deletions

View File

@ -520,49 +520,37 @@ 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 entries = [] of Entry
titles.each do |t| titles.each do |t|
t.entries.each { |e| entries << e } t.entries.each { |e| entries << e }
end end
entries.sort! { |a, b| b.date_added <=> a.date_added } entries.sort! { |a, b| b.date_added <=> a.date_added }
# Only grab entries form the last 3 months
# otherwise we will be grouping neighbours by Title for the entire
# library every time. Is this premature optimisation or reasonable optimisation?
entries.select! { |e| e.date_added > 3.months.ago } entries.select! { |e| e.date_added > 3.months.ago }
i = 0 # Group Entries if neighbour is same Title
recently_added = [] of NamedTuple(entry: Entry, percentage: Float64, grouped_count: Int32) recently_added = [] of RA
while i <= entries.size - 1 entries.each do |e|
grouped_count = neighbouring_title_count(entries, i) last = recently_added.last?
if grouped_count > 1 if last && e.title_id == last[:entry].title_id
# delete grouped entries (except for first) # A NamedTuple is immutable, so we have to cast it to a Hash first
entries.delete_at(i+1..i+grouped_count-1) 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
recently_added << {
entry: e,
percentage: e.book.load_percentage(username, e.title),
grouped_count: 1,
}
end end
recently_added << {
entry: entries[i],
percentage: entries[i].book.load_percentage(username, entries[i].title),
grouped_count: grouped_count
}
i += 1
end end
recently_added[0..11] recently_added[0..11]
end end
private def neighbouring_title_count(entries, index : Int32)
count = 1
book_title = entries[index].book.title
while index < entries.size - 1
if book_title == entries[index+1].book.title # is it ok to compare via book.title?
count += 1
else
break
end
index += 1
end
count
end
private def get_continue_reading_entry(username, title) private def get_continue_reading_entry(username, title)
in_progress_entries = title.entries.select do |e| in_progress_entries = title.entries.select do |e|

View File

@ -68,14 +68,9 @@ class MainRouter < Router
username = get_username env username = get_username env
continue_reading = @context.library.get_continue_reading_entries username continue_reading = @context.library.get_continue_reading_entries username
recently_added = @context.library.get_recently_added_entries username recently_added = @context.library.get_recently_added_entries username
new_user = true
titles = @context.library.titles titles = @context.library.titles
titles.each { |t| new_user = false if t.load_percentage(username) > 0 } new_user = ! titles.any? { |t| t.load_percentage(username) > 0 }
empty_library = titles.size == 0
empty_library = true
empty_library = false if titles.size > 0
layout "home" layout "home"
rescue e rescue e
@context.error e @context.error e