Class: Sunspot::DSL::Fields

Inherits:
Object
  • Object
show all
Defined in:
lib/sunspot/dsl/fields.rb

Overview

The Fields class provides a DSL for specifying field definitions in the Sunspot.setup block. As well as the #text method, which creates fulltext fields, uses #method_missing to allow definition of typed fields. The available methods are determined by the constants defined in Sunspot::Type - in theory (though this is untested), plugin developers should be able to add support for new types simply by creating new implementations in Sunspot::Type

Instance Method Summary collapse

Constructor Details

#initialize(setup) ⇒ Fields

:nodoc:



12
13
14
# File 'lib/sunspot/dsl/fields.rb', line 12

def initialize(setup) #:nodoc:
  @setup = setup
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object

method_missing is used to provide access to typed fields, because developers should be able to add new Sunspot::Type implementations dynamically and have them recognized inside the Fields DSL. Like #text, these methods will create a VirtualField if a block is passed, or an AttributeField if not.

Example

Sunspot.setup(File) do
  time :mtime
end

The call to time will create a field of type Sunspot::Types::TimeType



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/sunspot/dsl/fields.rb', line 88

def method_missing(method, *args, &block)
  options = Util.extract_options_from(args)
  join = method.to_s == 'join'
  type_string = join ? options.delete(:type).to_s : method.to_s
  type_const_name = "#{Util.camel_case(type_string.sub(/^dynamic_/, ''))}Type"
  trie = options.delete(:trie)
  type_const_name = "Trie#{type_const_name}" if trie

  begin
    type_class = Type.const_get(type_const_name)
  rescue NameError
    if trie
      raise ArgumentError, "Trie fields are only valid for numeric and time types"
    else
      super(method, *args, &block)
    end
  end

  type = type_class.instance
  name = args.shift

  if method.to_s =~ /^dynamic_/
    if type.accepts_dynamic?
      @setup.add_dynamic_field_factory(name, type, options, &block)
    else
      super(method, *args, &block)
    end
  elsif join
    @setup.add_join_field_factory(name, type, options.merge(:clazz => @setup.clazz), &block)
  else
    @setup.add_field_factory(name, type, options, &block)
  end
end

Instance Method Details

#boost(attr_name = nil, &block) ⇒ Object

Specify a document-level boost. As with fields, you have the option of passing an attribute name which will be called on each model, or a block to be evaluated in the model’s context. As well as these two options, this method can also take a constant number, meaning that all indexed documents of this class will have the specified boost.

Parameters

attr_name<Symbol,~.to_f>

Attribute name to call or a numeric constant



54
55
56
# File 'lib/sunspot/dsl/fields.rb', line 54

def boost(attr_name = nil, &block)
  @setup.add_document_boost(attr_name, &block)
end

#id_prefix(attr_name = nil, &block) ⇒ Object

If you use the compositeId router for shards, you can send documents with a prefix in the document ID which will be used to calculate the hash Solr uses to determine the shard a document is sent to for indexing. The prefix can be anything you’d like it to be (it doesn’t have to be the shard name, for example), but it must be consistent so Solr behaves consistently.

Parameters

attr_name<Symbol,String>

Attribute name to call or a string constant



70
71
72
# File 'lib/sunspot/dsl/fields.rb', line 70

def id_prefix(attr_name = nil, &block)
  @setup.add_id_prefix(attr_name, &block)
end

#text(*names, &block) ⇒ Object

Add a text field. Text fields are tokenized before indexing and are the only fields searched in fulltext searches. If a block is passed, create a virtual field; otherwise create an attribute field.

If options are passed, they will be applied to all the given fields.

Parameters

names…<Symbol>

One or more field names

Options

:boost<Float>

Index-time boost that should be applied to this field for keyword search

:default_boost<Float>

Default search-time boost to apply to this field during keyword search. Can be overriden with DSL::Fulltext#fields or DSL::Fulltext#boost_fields method.



35
36
37
38
39
40
41
# File 'lib/sunspot/dsl/fields.rb', line 35

def text(*names, &block)
  options = names.last.is_a?(Hash) ? names.pop : {}

  names.each do |name|
    @setup.add_text_field_factory(name, options, &block)
  end
end