Add trending statuses (#17431)
* Add trending statuses * Fix dangling items with stale scores in localized sets * Various fixes and improvements - Change approve_all/reject_all to approve_accounts/reject_accounts - Change Trends::Query methods to not mutate the original query - Change Trends::Query#skip to offset - Change follow recommendations to be refreshed in a transaction * Add tests for trending statuses filtering behaviour * Fix not applying filtering scope in controller
This commit is contained in:
parent
a29a982eaa
commit
27965ce5ed
71 changed files with 1074 additions and 307 deletions
106
app/models/trends/query.rb
Normal file
106
app/models/trends/query.rb
Normal file
|
@ -0,0 +1,106 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class Trends::Query
|
||||
include Redisable
|
||||
include Enumerable
|
||||
|
||||
attr_reader :prefix, :klass, :loaded
|
||||
|
||||
alias loaded? loaded
|
||||
|
||||
def initialize(prefix, klass)
|
||||
@prefix = prefix
|
||||
@klass = klass
|
||||
@records = []
|
||||
@loaded = false
|
||||
@allowed = false
|
||||
@limit = -1
|
||||
@offset = 0
|
||||
end
|
||||
|
||||
def allowed!
|
||||
@allowed = true
|
||||
self
|
||||
end
|
||||
|
||||
def allowed
|
||||
clone.allowed!
|
||||
end
|
||||
|
||||
def in_locale!(value)
|
||||
@locale = value
|
||||
self
|
||||
end
|
||||
|
||||
def in_locale(value)
|
||||
clone.in_locale!(value)
|
||||
end
|
||||
|
||||
def offset!(value)
|
||||
@offset = value
|
||||
self
|
||||
end
|
||||
|
||||
def offset(value)
|
||||
clone.offset!(value)
|
||||
end
|
||||
|
||||
def limit!(value)
|
||||
@limit = value
|
||||
self
|
||||
end
|
||||
|
||||
def limit(value)
|
||||
clone.limit!(value)
|
||||
end
|
||||
|
||||
def records
|
||||
load
|
||||
@records
|
||||
end
|
||||
|
||||
delegate :each, :empty?, :first, :last, to: :records
|
||||
|
||||
def to_ary
|
||||
records.dup
|
||||
end
|
||||
|
||||
alias to_a to_ary
|
||||
|
||||
def to_arel
|
||||
tmp_ids = ids
|
||||
|
||||
if tmp_ids.empty?
|
||||
klass.none
|
||||
else
|
||||
klass.joins("join unnest(array[#{tmp_ids.join(',')}]) with ordinality as x (id, ordering) on #{klass.table_name}.id = x.id").reorder('x.ordering')
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def key
|
||||
[@prefix, @allowed ? 'allowed' : 'all', @locale].compact.join(':')
|
||||
end
|
||||
|
||||
def load
|
||||
unless loaded?
|
||||
@records = perform_queries
|
||||
@loaded = true
|
||||
end
|
||||
|
||||
self
|
||||
end
|
||||
|
||||
def ids
|
||||
redis.zrevrange(key, @offset, @limit.positive? ? @limit - 1 : @limit).map(&:to_i)
|
||||
end
|
||||
|
||||
def perform_queries
|
||||
apply_scopes(to_arel).to_a
|
||||
end
|
||||
|
||||
def apply_scopes(scope)
|
||||
scope
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue