class Perpetuity::Retrieval

Attributes

identity_map[R]
result_cache[RW]
result_limit[RW]
result_offset[RW]
result_page[RW]
sort_attribute[RW]
sort_direction[RW]

Public Class Methods

new(mapper, query, options={}) click to toggle source
# File lib/perpetuity/retrieval.rb, line 10
def initialize mapper, query, options={}
  @mapper = mapper
  @collection_name = mapper.collection_name
  @query = query
  @identity_map = options.fetch(:identity_map) { IdentityMap.new }
  @data_source = mapper.data_source
end

Public Instance Methods

[](index) click to toggle source
# File lib/perpetuity/retrieval.rb, line 95
def [] index
  to_a[index]
end
clear_cache() click to toggle source
# File lib/perpetuity/retrieval.rb, line 120
def clear_cache
  @result_cache = nil
end
count() click to toggle source
# File lib/perpetuity/retrieval.rb, line 72
def count
  @data_source.count(@collection_name, @query)
end
drop(count) click to toggle source
# File lib/perpetuity/retrieval.rb, line 112
def drop count
  retrieval = clone
  retrieval.result_offset = count
  retrieval.clear_cache

  retrieval
end
each(&block) click to toggle source
# File lib/perpetuity/retrieval.rb, line 52
def each &block
  to_a.each(&block)
end
empty?() click to toggle source
# File lib/perpetuity/retrieval.rb, line 99
def empty?
  to_a.empty?
end
first() click to toggle source
# File lib/perpetuity/retrieval.rb, line 76
def first
  limit(1).to_a.first
end
limit(lim) click to toggle source
# File lib/perpetuity/retrieval.rb, line 103
def limit lim
  retrieval = clone
  retrieval.result_limit = lim
  retrieval.clear_cache
  
  retrieval
end
Also aliased as: take
options() click to toggle source
# File lib/perpetuity/retrieval.rb, line 86
def options
  {
    attribute: sort_attribute,
    direction: sort_direction,
    limit: result_limit,
    skip: result_offset
  }
end
page(page) click to toggle source
# File lib/perpetuity/retrieval.rb, line 35
def page page
  retrieval = clone
  retrieval.result_limit ||= 20
  retrieval.result_page = page
  retrieval.result_offset = (page - 1) * retrieval.result_limit
  retrieval.clear_cache
  retrieval
end
per_page(per) click to toggle source
# File lib/perpetuity/retrieval.rb, line 44
def per_page per
  retrieval = clone
  retrieval.result_limit = per
  retrieval.result_offset = (retrieval.result_page - 1) * per
  retrieval.clear_cache
  retrieval
end
reverse() click to toggle source
# File lib/perpetuity/retrieval.rb, line 27
def reverse
  retrieval = clone
  retrieval.sort_direction = retrieval.sort_direction == :descending ? :ascending : :descending
  retrieval.clear_cache

  retrieval
end
sample() click to toggle source
# File lib/perpetuity/retrieval.rb, line 80
def sample
  sample_size = [count, result_limit].compact.max
  result = drop(rand(sample_size)).first
  result
end
sort(attribute=:name) click to toggle source
# File lib/perpetuity/retrieval.rb, line 18
def sort attribute=:name
  retrieval = clone
  retrieval.sort_attribute = attribute
  retrieval.sort_direction = :ascending
  retrieval.clear_cache

  retrieval
end
take(lim)
Alias for: limit
to_a() click to toggle source
# File lib/perpetuity/retrieval.rb, line 56
def to_a
  @result_cache ||= @data_source.unserialize(@data_source.retrieve(@collection_name, @query, options), @mapper)

  @result_cache.map do |result|
    klass = result.class
    id = @mapper.id_for(result)

    if cached_result = identity_map[klass, id]
      cached_result
    else
      identity_map << result
      result
    end
  end
end