Class: Sunspot::DSL::Scope

Inherits:
Object
  • Object
show all
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

FieldQuery

Constant Summary

NONE =
Object.new

Instance Method Summary (collapse)

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