Class: Sunspot::DSL::Scope
- Inherits:
-
Object
- Object
- Sunspot::DSL::Scope
- Defined in:
- sunspot/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
Constant Summary
- NONE =
Object.new
Instance Method Summary (collapse)
-
- (Object) all_of(&block)
Create a conjunction, scoping the results to documents that match all of the enclosed restrictions.
-
- (Object) any_of(&block)
Create a disjunction, scoping the results to documents that match any of the enclosed restrictions.
-
- (Object) dynamic(base_name, &block)
Apply restrictions, facets, and ordering to dynamic field instances.
-
- (Scope) initialize(scope, setup)
constructor
:nodoc:.
-
- (Object) text_fields(&block)
Apply scope-type restrictions on fulltext fields.
-
- (Object) with(*args)
Build a positive restriction.
-
- (Object) without(*args)
Build a negative restriction (exclusion).
Constructor Details
- (Scope) initialize(scope, setup)
:nodoc:
13 14 15 |
# File 'sunspot/lib/sunspot/dsl/scope.rb', line 13 def initialize(scope, setup) #:nodoc: @scope, @setup = scope, setup end |
Instance Method Details
- (Object) all_of(&block)
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
132 133 134 135 136 |
# File 'sunspot/lib/sunspot/dsl/scope.rb', line 132 def all_of(&block) conjunction = @scope.add_conjunction Util.instance_eval_or_call(Scope.new(conjunction, @setup), &block) conjunction end |
- (Object) any_of(&block)
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.
108 109 110 111 112 |
# File 'sunspot/lib/sunspot/dsl/scope.rb', line 108 def any_of(&block) disjunction = @scope.add_disjunction Util.instance_eval_or_call(Scope.new(disjunction, @setup), &block) disjunction end |
- (Object) dynamic(base_name, &block)
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 | 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
158 159 160 161 162 163 |
# File 'sunspot/lib/sunspot/dsl/scope.rb', line 158 def dynamic(base_name, &block) Sunspot::Util.instance_eval_or_call( Scope.new(@scope, @setup.dynamic_field_factory(base_name)), &block ) end |
- (Object) text_fields(&block)
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.
183 184 185 186 187 188 |
# File 'sunspot/lib/sunspot/dsl/scope.rb', line 183 def text_fields(&block) Sunspot::Util.instance_eval_or_call( Scope.new(@scope, TextFieldSetup.new(@setup)), &block ) end |
- (Object) with(*args)
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 | Name of the field on which to place the restriction |
value | If passed, creates an equality, range, or any-of restriction based on the type of value passed. |
Parameters (restriction by identity)
args | 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
80 81 82 |
# File 'sunspot/lib/sunspot/dsl/scope.rb', line 80 def with(*args) add_restriction(false, *args) end |
- (Object) without(*args)
Build a negative restriction (exclusion). This method works the same way asthe #with method.
88 89 90 |
# File 'sunspot/lib/sunspot/dsl/scope.rb', line 88 def without(*args) add_restriction(true, *args) end |