Class: Sunspot::DSL::Scope
- Inherits:
-
Object
- Object
- Sunspot::DSL::Scope
- Defined in:
- lib/sunspot/dsl/scope.rb
Overview
This DSL presents methods for constructing restrictions and other query elements that are specific to fields. As well as being a superclass of Sunspot::DSL::StandardQuery, which presents the main query block, this DSL class is also used directly inside the #dynamic() block, which only allows operations on specific fields.
Direct Known Subclasses
Instance Method Summary collapse
-
#all_of(&block) ⇒ Object
Create a conjunction, scoping the results to documents that match all of the enclosed restrictions.
-
#any_of(&block) ⇒ Object
Create a disjunction, scoping the results to documents that match any of the enclosed restrictions.
-
#dynamic(base_name, &block) ⇒ Object
Apply restrictions, facets, and ordering to dynamic field instances.
-
#initialize(scope, setup) ⇒ Scope
constructor
:nodoc:.
-
#text_fields(&block) ⇒ Object
Apply scope-type restrictions on fulltext fields.
-
#with(*args) ⇒ Object
Build a positive restriction.
-
#without(*args) ⇒ Object
Build a negative restriction (exclusion).
Constructor Details
#initialize(scope, setup) ⇒ Scope
:nodoc:
11 12 13 |
# File 'lib/sunspot/dsl/scope.rb', line 11 def initialize(scope, setup) #:nodoc: @scope, @setup = scope, setup end |
Instance Method Details
#all_of(&block) ⇒ Object
Create a conjunction, scoping the results to documents that match all of the enclosed restrictions. When called from the top level of a search block, this has no effect, but can be useful for grouping a conjunction inside a disjunction.
Example
Sunspot.search(Post) do
any_of do
with(:blog_id, 1)
all_of do
with(:blog_id, 2)
with(:category_ids, 3)
end
end
end
130 131 132 133 134 |
# File 'lib/sunspot/dsl/scope.rb', line 130 def all_of(&block) conjunction = @scope.add_conjunction Util.instance_eval_or_call(Scope.new(conjunction, @setup), &block) conjunction end |
#any_of(&block) ⇒ Object
Create a disjunction, scoping the results to documents that match any of the enclosed restrictions.
Example
Sunspot.search(Post) do
any_of do
with(:expired_at).greater_than Time.now
with :expired_at, nil
end
end
This will return all documents who either have an expiration time in the future, or who do not have any expiration time at all.
106 107 108 109 110 |
# File 'lib/sunspot/dsl/scope.rb', line 106 def any_of(&block) disjunction = @scope.add_disjunction Util.instance_eval_or_call(Scope.new(disjunction, @setup), &block) disjunction end |
#dynamic(base_name, &block) ⇒ Object
Apply restrictions, facets, and ordering to dynamic field instances. The block API is implemented by Sunspot::DSL::FieldQuery, which is a superclass of the Query DSL (thus providing a subset of the API, in particular only methods that refer to particular fields).
Parameters
- base_name<Symbol>
-
The base name for the dynamic field definition
Example
Sunspot.search Post do
dynamic :custom do
with :cuisine, 'Pizza'
facet :atmosphere
order_by :chef_name
end
end
156 157 158 159 160 161 |
# File 'lib/sunspot/dsl/scope.rb', line 156 def dynamic(base_name, &block) Sunspot::Util.instance_eval_or_call( Scope.new(@scope, @setup.dynamic_field_factory(base_name)), &block ) end |
#text_fields(&block) ⇒ Object
Apply scope-type restrictions on fulltext fields. In certain situations, it may be desirable to place logical restrictions on text fields. Remember that text fields are tokenized; your mileage may very.
The block works exactly like a normal scope, except that the field names refer to text fields instead of attribute fields.
Example
Sunspot.search(Post) do
text_fields do
with :body, nil
end
end
This will return all documents that do not have a body.
181 182 183 184 185 186 |
# File 'lib/sunspot/dsl/scope.rb', line 181 def text_fields(&block) Sunspot::Util.instance_eval_or_call( Scope.new(@scope, TextFieldSetup.new(@setup)), &block ) end |
#with(*args) ⇒ Object
Build a positive restriction. This method can take three forms: equality restriction, restriction by another restriction, or identity restriction. In the first two forms, the first argument is a field name. If only a field name is specified, this method returns another DSL object which presents methods for attaching various restriction types. With two arguments, this creates a shorthand restriction: if the second argument is a scalar, an equality restriction is created; if it is a Range, a between restriction will be created; and if it is an Array, an any_of restriction will be created. The third from restricts the search results to a specific instance.
Parameters (restriction by field value)
- field_name<Symbol>
-
Name of the field on which to place the restriction
- value<Object,Range,Array>
-
If passed, creates an equality, range, or any-of restriction based on the type of value passed.
Parameters (restriction by identity)
- args<Object>…
-
One or more instances that should be included in the results
Returns
- Sunspot::DSL::Restriction
-
Restriction DSL object (if only one argument is passed which is a field name)
Examples
An equality restriction:
Sunspot.search do
with(:blog_id, 1)
end
Restrict by range:
Sunspot.search do
with(:average_rating, 3.0..5.0)
end
Restrict by a set of allowed values:
Sunspot.search do
with(:category_ids, [1, 5, 9])
end
Other restriction types:
Sunspot.search(Post) do
with(:average_rating).greater_than(3.0)
end
Restriction by identity:
Sunspot.search(Post) do
with(some_post_instance)
end
78 79 80 |
# File 'lib/sunspot/dsl/scope.rb', line 78 def with(*args) add_restriction(false, *args) end |
#without(*args) ⇒ Object
Build a negative restriction (exclusion). This method works the same way asthe #with method.
86 87 88 |
# File 'lib/sunspot/dsl/scope.rb', line 86 def without(*args) add_restriction(true, *args) end |