Class: Sunspot::Setup

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

Overview

This class encapsulates the search/indexing setup for a given class. Its contents are built using the Sunspot.setup method.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(clazz) ⇒ Setup

:nodoc:



7
8
9
10
11
12
13
14
15
16
# File 'lib/sunspot/setup.rb', line 7

def initialize(clazz)
  @clazz = clazz
  @class_name = clazz.name
  @field_factories, @text_field_factories, @dynamic_field_factories,
    @field_factories_cache, @text_field_factories_cache,
    @dynamic_field_factories_cache = *Array.new(6) { Hash.new }
  @stored_field_factories_cache = Hash.new { |h, k| h[k] = [] }
  @dsl = DSL::Fields.new(self)
  add_field_factory(:class, Type::ClassType)
end

Class Method Details

.for(clazz) ⇒ Object

Retrieve the setup instance for the given class, or for the nearest ancestor that has a setup, if any.

Parameters

clazz<Class>

Class for which to retrieve a setup

Returns

Sunspot::Setup

Setup instance associated with the given class or its nearest ancestor



283
284
285
286
287
288
289
290
291
# File 'lib/sunspot/setup.rb', line 283

def for(clazz) #:nodoc:
  class_name =
    if clazz.respond_to?(:name)
      clazz.name
    else
      clazz
    end
  setups[class_name.to_sym] || self.for(clazz.superclass) if clazz
end

.setup(clazz, &block) ⇒ Object

Retrieve or create the Setup instance for the given class, evaluating the given block to add to the setup’s configuration



266
267
268
# File 'lib/sunspot/setup.rb', line 266

def setup(clazz, &block) #:nodoc:
  self.for!(clazz).setup(&block)
end

Instance Method Details

#add_document_boost(attr_name, &block) ⇒ Object

Add a document boost to documents at index time. Document boost can be static (the same for all documents of this class), or extracted on a per- document basis using either attribute or block extraction as per usual.



79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/sunspot/setup.rb', line 79

def add_document_boost(attr_name, &block)
  @document_boost_extractor =
    if attr_name
      if attr_name.respond_to?(:to_f)
        DataExtractor::Constant.new(attr_name)
      else
        DataExtractor::AttributeExtractor.new(attr_name)
      end
    else
      DataExtractor::BlockExtractor.new(&block)
    end
end

#add_dynamic_field_factory(name, type, options = {}, &block) ⇒ Object

Add dynamic field_factories

Parameters

field_factories<Array>

Array of dynamic field objects



59
60
61
62
63
# File 'lib/sunspot/setup.rb', line 59

def add_dynamic_field_factory(name, type, options = {}, &block)
  field_factory = FieldFactory::Dynamic.new(name, type, options, &block)
  @dynamic_field_factories[field_factory.signature] = field_factory
  @dynamic_field_factories_cache[field_factory.name] = field_factory
end

#add_field_factory(name, type, options = {}, &block) ⇒ Object

Add field factory for scope/ordering



25
26
27
28
29
30
31
32
33
# File 'lib/sunspot/setup.rb', line 25

def add_field_factory(name, type, options = {}, &block)
  stored = options[:stored]
  field_factory = FieldFactory::Static.new(name, type, options, &block)
  @field_factories[field_factory.signature] = field_factory
  @field_factories_cache[field_factory.name] = field_factory
  if stored
    @stored_field_factories_cache[field_factory.name] << field_factory
  end
end

#add_text_field_factory(name, options = {}, &block) ⇒ Object

Add field_factories for fulltext search

Parameters

field_factories<Array>

Array of Sunspot::Field objects



42
43
44
45
46
47
48
49
50
# File 'lib/sunspot/setup.rb', line 42

def add_text_field_factory(name, options = {}, &block)
  stored = options[:stored]
  field_factory = FieldFactory::Static.new(name, Type::TextType, options, &block)
  @text_field_factories[name] = field_factory
  @text_field_factories_cache[field_factory.name] = field_factory
  if stored
    @stored_field_factories_cache[field_factory.name] << field_factory
  end
end

#all_field_factoriesObject

Get all static, dynamic, and text field_factories associated with this setup as well as all inherited field_factories

Returns

Array

Collection of all text and scope field_factories associated with this setup



196
197
198
199
200
201
# File 'lib/sunspot/setup.rb', line 196

def all_field_factories
  all_field_factories = []
  all_field_factories.concat(field_factories).concat(text_field_factories).concat(dynamic_field_factories)
  all_field_factories << @coordinates_field_factory if @coordinates_field_factory
  all_field_factories
end

#all_text_fieldsObject

Return all text fields



161
162
163
# File 'lib/sunspot/setup.rb', line 161

def all_text_fields
  text_field_factories.map { |text_field_factory| text_field_factory.build }
end

#clazzObject

Return the class associated with this setup.

Returns

clazz<Class>

Class setup is configured for



221
222
223
# File 'lib/sunspot/setup.rb', line 221

def clazz
  Util.full_const_get(@class_name)
end

#document_boost_for(model) ⇒ Object

Get the document boost for a given model



228
229
230
231
232
# File 'lib/sunspot/setup.rb', line 228

def document_boost_for(model)
  if @document_boost_extractor
    @document_boost_extractor.value_for(model)
  end
end

#dynamic_field_factoriesObject

Get all dynamic field_factories for this and parent setups

Returns

Array

Dynamic field_factories



210
211
212
# File 'lib/sunspot/setup.rb', line 210

def dynamic_field_factories
  collection_from_inheritable_hash(:dynamic_field_factories)
end

#dynamic_field_factory(field_name) ⇒ Object

Return the DynamicFieldFactory with the given base name



144
145
146
147
148
149
# File 'lib/sunspot/setup.rb', line 144

def dynamic_field_factory(field_name)
  @dynamic_field_factories_cache[field_name.to_sym] || raise(
    UnrecognizedFieldError,
    "No dynamic field configured for #{@clazz.name} with name '#{field_name}'"
  )
end

#field(field_name) ⇒ Object

Return the Field with the given (public-facing) name



102
103
104
105
106
107
108
109
110
111
# File 'lib/sunspot/setup.rb', line 102

def field(field_name)
  if field_factory = @field_factories_cache[field_name.to_sym]
    field_factory.build
  else
    raise(
      UnrecognizedFieldError,
      "No field configured for #{@clazz.name} with name '#{field_name}'"
    )
  end
end

#field_factoriesObject

Get the field_factories associated with this setup as well as all inherited field_factories

Returns

Array

Collection of all field_factories associated with this setup



172
173
174
# File 'lib/sunspot/setup.rb', line 172

def field_factories
  collection_from_inheritable_hash(:field_factories)
end

#fieldsObject

Return all attribute fields



154
155
156
# File 'lib/sunspot/setup.rb', line 154

def fields
  field_factories.map { |field_factory| field_factory.build }
end

#set_coordinates_field(name = nil, &block) ⇒ Object

The coordinates field factory is used for populating the coordinate fields of documents during index, but does not actually generate fields (since the field names used in search are static).



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

def set_coordinates_field(name = nil, &block)
  @coordinates_field_factory = FieldFactory::Coordinates.new(name, &block)
end

#setup(&block) ⇒ Object

Builder method for evaluating the setup DSL



95
96
97
# File 'lib/sunspot/setup.rb', line 95

def setup(&block)
  @dsl.instance_eval(&block)
end

#stored_fields(field_name) ⇒ Object

Return one or more stored fields (can be either attribute or text fields) for the given name.



135
136
137
138
139
# File 'lib/sunspot/setup.rb', line 135

def stored_fields(field_name)
  @stored_field_factories_cache[field_name.to_sym].map do |field_factory|
    field_factory.build
  end
end

#text_field_factoriesObject

Get the text field_factories associated with this setup as well as all inherited text field_factories

Returns

Array

Collection of all text field_factories associated with this setup



184
185
186
# File 'lib/sunspot/setup.rb', line 184

def text_field_factories
  collection_from_inheritable_hash(:text_field_factories)
end

#text_fields(field_name) ⇒ Object

Return one or more text fields with the given public-facing name. This implementation will always return a single field (in an array), but CompositeSetup objects might return more than one.



118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/sunspot/setup.rb', line 118

def text_fields(field_name)
  text_field = 
    if field_factory = @text_field_factories_cache[field_name.to_sym]
      field_factory.build
    else
      raise(
        UnrecognizedFieldError,
        "No text field configured for #{@clazz.name} with name '#{field_name}'"
      )
    end
  [text_field]
end

#type_namesObject



18
19
20
# File 'lib/sunspot/setup.rb', line 18

def type_names
  [@class_name]
end