class Cursory::Base

Constants

DEFAULT_LIMIT
MAX_LIMIT
OFFSET_KEY

Public Class Methods

new(criteria, params) click to toggle source
# File lib/cursory/base.rb, line 13
def initialize criteria, params
  @criteria = criteria
  @sort = params[SORT_KEY]
  @limit = params[LIMIT_KEY]
  @offset = params[OFFSET_KEY]
  @cursor = params[CURSOR_KEY]
end

Public Instance Methods

clamped_limit() click to toggle source
# File lib/cursory/base.rb, line 99
def clamped_limit
  [1, (limit || DEFAULT_LIMIT).to_i, MAX_LIMIT].sort[1]
end
clamped_offset() click to toggle source
# File lib/cursory/base.rb, line 37
def clamped_offset
  [0, offset.to_i].max
end
clause_for_key(key, direction) click to toggle source
# File lib/cursory/base.rb, line 127
def clause_for_key key, direction
  fail UnimplementedError
end
count() click to toggle source
# File lib/cursory/base.rb, line 67
def count
  @count ||= criteria.count
end
current_cursor() click to toggle source
# File lib/cursory/base.rb, line 53
def current_cursor
  cursor || render_cursor
end
cursor_clause(key, keys=[]) click to toggle source
# File lib/cursory/base.rb, line 117
def cursor_clause(key, keys=[])
  name, direction = key
  Enumerator.new do |y|
    keys.each do |name, direction|
      y.yield clause_for_key(name, 'eq')
    end
    y.yield clause_for_key(name, direction)
  end
end
cursor_clause_set() click to toggle source
# File lib/cursory/base.rb, line 107
def cursor_clause_set
  keys = []
  Enumerator.new do |y|
    order_keys.each do |key|
      y.yield cursor_clause(key, keys).reduce(&:merge)
      keys << key
    end
  end
end
cursor_clauses() click to toggle source
# File lib/cursory/base.rb, line 103
def cursor_clauses
  fail UnimplementedError
end
cursor_data(overrides={}) click to toggle source
# File lib/cursory/base.rb, line 153
def cursor_data(overrides={})
  (parsed_cursor || {}).merge(overrides)
end
cursor_id() click to toggle source
# File lib/cursory/base.rb, line 149
def cursor_id
  cursor_data['id']
end
cursor_object() click to toggle source
# File lib/cursory/base.rb, line 131
def cursor_object
  @cursor_object ||= uncached_cursor_object
end
decompose_order_key(k) click to toggle source
# File lib/cursory/base.rb, line 91
def decompose_order_key(k)
  [ k.gsub(/\A[-+]?/,'').to_sym, k.start_with?('-') ? 'desc' : 'asc' ]
end
model() click to toggle source
# File lib/cursory/base.rb, line 79
def model
  fail UnimplementedError
end
model_sort() click to toggle source
# File lib/cursory/base.rb, line 83
def model_sort
  model.respond_to?(:default_sort_key) && model.default_sort_key
end
next_cursor() click to toggle source
# File lib/cursory/base.rb, line 61
def next_cursor
  if record_for_next_cursor
    render_cursor cursor_data(id: record_for_next_cursor.id.to_s)
  end
end
order_clause() click to toggle source
# File lib/cursory/base.rb, line 95
def order_clause
  fail UnimplementedError
end
order_keys() click to toggle source
# File lib/cursory/base.rb, line 87
def order_keys
  sort_keys.split(',').map{ |k| decompose_order_key(k) } + [[:id, 'asc']]
end
page() click to toggle source
# File lib/cursory/base.rb, line 21
def page
  { total_count: count, items: search_results, self: current_cursor }.tap do |p|
    catch(:no_more_results) do
      p[:next] = next_cursor
    end
  end
end
parsed_cursor() click to toggle source
# File lib/cursory/base.rb, line 143
def parsed_cursor
  JSON.parse(::Base64.urlsafe_decode64(cursor || 'e30='))
rescue ArgumentError, JSON::ParserError
  fail InvalidCursorError
end
record_for_next_cursor() click to toggle source
# File lib/cursory/base.rb, line 57
def record_for_next_cursor
  search_results[clamped_limit-1] or throw(:no_more_results)
end
render_cursor(data={}) click to toggle source
# File lib/cursory/base.rb, line 139
def render_cursor(data={})
  ::Base64.urlsafe_encode64(JSON.dump(data))
end
search_results() click to toggle source
# File lib/cursory/base.rb, line 45
def search_results
  @results ||= uncached_search
end
search_type() click to toggle source
# File lib/cursory/base.rb, line 33
def search_type
  fail UnimplementedError
end
sort_keys() click to toggle source
# File lib/cursory/base.rb, line 75
def sort_keys
  sort || model_sort || ''
end
uncached_count() click to toggle source
# File lib/cursory/base.rb, line 71
def uncached_count
  fail UnimplementedError
end
uncached_cursor_object() click to toggle source
# File lib/cursory/base.rb, line 135
def uncached_cursor_object
  fail UnimplementedError
end