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