class Lurch::Query

Public Class Methods

new(store, inflector) click to toggle source
# File lib/lurch/query.rb, line 3
def initialize(store, inflector)
  @store = store
  @inflector = inflector
  @filter = {}
  @include = []
  @fields = Hash.new { [] }
  @sort = []
  @page = {}
end

Public Instance Methods

all() click to toggle source

def link(uri)

# TODO: fail if type already set
# TODO: set uri and merge in query params from provided uri if any
self

end

# File lib/lurch/query.rb, line 50
def all
  raise ArgumentError, "No type specified for query" if @type.nil?
  @store.load_from_url(uri_builder.resources_uri(@type, to_query))
end
delete(resource) click to toggle source
# File lib/lurch/query.rb, line 73
def delete(resource)
  raise ArgumentError, "No type specified for query" if @type.nil?
  raise ArgumentError, "Type mismatch" if @type != resource.type
  @store.delete(resource, to_query)
end
fields(type, fields = nil) click to toggle source
# File lib/lurch/query.rb, line 23
def fields(type, fields = nil)
  type, fields = [@type, type] if type.is_a?(Array) && fields.nil?
  @fields[type] += fields
  self
end
filter(params) click to toggle source
# File lib/lurch/query.rb, line 13
def filter(params)
  @filter.merge!(params)
  self
end
find(id) click to toggle source
# File lib/lurch/query.rb, line 55
def find(id)
  raise ArgumentError, "No type specified for query" if @type.nil?
  raise ArgumentError, "Can't perform find for `nil`" if id.nil?
  @store.peek(@type, id) || @store.load_from_url(uri_builder.resource_uri(@type, id, to_query))
end
include(*relationship_paths) click to toggle source
# File lib/lurch/query.rb, line 18
def include(*relationship_paths)
  @include += relationship_paths
  self
end
insert(changeset) click to toggle source
# File lib/lurch/query.rb, line 67
def insert(changeset)
  raise ArgumentError, "No type specified for query" if @type.nil?
  raise ArgumentError, "Type mismatch" if @type != changeset.type
  @store.insert(changeset, to_query)
end
inspect() click to toggle source
# File lib/lurch/query.rb, line 79
def inspect
  type = @type.nil? ? "" : "[#{Inflector.classify(@type)}]"
  query = to_query
  query = query.empty? ? "" : " #{query.inspect}"
  "#<#{self.class}#{type}#{query}>"
end
page(params) click to toggle source
# File lib/lurch/query.rb, line 34
def page(params)
  @page.merge!(params)
  self
end
save(changeset) click to toggle source
# File lib/lurch/query.rb, line 61
def save(changeset)
  raise ArgumentError, "No type specified for query" if @type.nil?
  raise ArgumentError, "Type mismatch" if @type != changeset.type
  @store.save(changeset, to_query)
end
sort(*sort_keys) click to toggle source
# File lib/lurch/query.rb, line 29
def sort(*sort_keys)
  @sort += sort_keys.map { |sort_key| sort_key.is_a?(Hash) ? sort_key : { sort_key => :asc } }
  self
end
type(type) click to toggle source
# File lib/lurch/query.rb, line 39
def type(type)
  @type = Inflector.decode_type(type)
  self
end

Private Instance Methods

fields_query() click to toggle source
# File lib/lurch/query.rb, line 117
def fields_query
  @inflector.encode_types(@fields) do |fields|
    fields.map { |field| @inflector.encode_key(field) }.compact.uniq.join(",")
  end
end
filter_query() click to toggle source
# File lib/lurch/query.rb, line 109
def filter_query
  @inflector.encode_keys(@filter)
end
include_query() click to toggle source
# File lib/lurch/query.rb, line 113
def include_query
  @include.map { |path| @inflector.encode_key(path) }.compact.uniq.join(",")
end
other_uri_params() click to toggle source
# File lib/lurch/query.rb, line 104
def other_uri_params
  # TODO: existing non-standard uri query params from the provided uri (if any)
  {}
end
page_query() click to toggle source
# File lib/lurch/query.rb, line 139
def page_query
  @page
end
sort_key(key, direction) click to toggle source
# File lib/lurch/query.rb, line 127
def sort_key(key, direction)
  encoded_key = @inflector.encode_key(key)
  case direction
  when :asc
    encoded_key
  when :desc
    "-#{encoded_key}"
  else
    raise ArgumentError, "Invalid sort direction #{direction}"
  end
end
sort_query() click to toggle source
# File lib/lurch/query.rb, line 123
def sort_query
  @sort.flat_map(&:to_a).map { |(key, direction)| sort_key(key, direction) }.join(",")
end
to_query() click to toggle source
# File lib/lurch/query.rb, line 92
def to_query
  QueryBuilder.new(
    {
      filter: filter_query,
      include: include_query,
      fields: fields_query,
      sort: sort_query,
      page: page_query
    }.merge(other_uri_params)
  ).encode
end
uri_builder() click to toggle source
# File lib/lurch/query.rb, line 88
def uri_builder
  @uri_builder ||= URIBuilder.new(@inflector)
end