123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- # 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 = nil
- @offset = nil
- 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.to_i
- self
- end
- def offset(value)
- clone.offset!(value)
- end
- def limit!(value)
- @limit = value.to_i
- self
- end
- def limit(value)
- clone.limit!(value)
- end
- def records
- load
- @records
- end
- delegate :each, :empty?, :first, :last, :size, 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
- scope = klass.joins("join unnest(array[#{tmp_ids.join(',')}]) with ordinality as x (id, ordering) on #{klass.table_name}.id = x.id").reorder('x.ordering')
- scope = scope.offset(@offset) if @offset.present?
- scope = scope.limit(@limit) if @limit.present?
- scope
- 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, 0, -1).map(&:to_i)
- end
- def perform_queries
- apply_scopes(to_arel).to_a
- end
- def apply_scopes(scope)
- scope
- end
- end
|