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
constrained_search()
click to toggle source
# File lib/cursory/base.rb, line 41 def constrained_search 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()
click to toggle source
# File lib/cursory/base.rb, line 29 def search constrained_search.send(*search_type) 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
uncached_search()
click to toggle source
# File lib/cursory/base.rb, line 49 def uncached_search fail UnimplementedError end