lib/searchkick/relation.rb in searchkick-5.0.1 vs lib/searchkick/relation.rb in searchkick-5.0.2

- old
+ new

@@ -1,15 +1,22 @@ module Searchkick class Relation + NO_DEFAULT_VALUE = Object.new + # note: modifying body directly is not supported # and has no impact on query after being executed # TODO freeze body object? - delegate :body, :params, to: :@query + delegate :body, :params, to: :query delegate_missing_to :private_execute def initialize(model, term = "*", **options) - @query = Query.new(model, term, **options) + @model = model + @term = term + @options = options + + # generate query to validate options + query end # same as Active Record def inspect entries = results.first(11).map!(&:inspect) @@ -21,16 +28,85 @@ Searchkick.warn("The execute method is no longer needed") private_execute self end + def limit(value) + clone.limit!(value) + end + + def limit!(value) + check_loaded + @options[:limit] = value + self + end + + def offset(value = NO_DEFAULT_VALUE) + # TODO remove in Searchkick 6 + if value == NO_DEFAULT_VALUE + private_execute.offset + else + clone.offset!(value) + end + end + + def offset!(value) + check_loaded + @options[:offset] = value + self + end + + def page(value) + clone.page!(value) + end + + def page!(value) + check_loaded + @options[:page] = value + self + end + + def per_page(value = NO_DEFAULT_VALUE) + # TODO remove in Searchkick 6 + if value == NO_DEFAULT_VALUE + private_execute.per_page + else + clone.per_page!(value) + end + end + + def per_page!(value) + check_loaded + @options[:per_page] = value + self + end + + def only(*keys) + Relation.new(@model, @term, **@options.slice(*keys)) + end + + def except(*keys) + Relation.new(@model, @term, **@options.except(*keys)) + end + + def loaded? + !@execute.nil? + end + private def private_execute - @execute ||= @query.execute + @execute ||= query.execute end def query - @query + @query ||= Query.new(@model, @term, **@options) + end + + def check_loaded + raise Error, "Relation loaded" if loaded? + + # reset query since options will change + @query = nil end end end