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.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(clazz) ⇒ Setup

Returns a new instance of Setup.



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

def initialize(clazz)
  @class_object_id = clazz.object_id
  @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] = [] }
  @more_like_this_field_factories_cache = Hash.new { |h, k| h[k] = [] }
  @dsl = DSL::Fields.new(self)
  add_field_factory(:class, Type::ClassType.instance)
end

Instance Attribute Details

#class_object_idObject (readonly)

:nodoc:



7
8
9
# File 'lib/sunspot/setup.rb', line 7

def class_object_id
  @class_object_id
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



321
322
323
324
325
326
327
328
329
# File 'lib/sunspot/setup.rb', line 321

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



304
305
306
# File 'lib/sunspot/setup.rb', line 304

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.



94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/sunspot/setup.rb', line 94

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



67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/sunspot/setup.rb', line 67

def add_dynamic_field_factory(name, type, options = {}, &block)
  stored, more_like_this = options[:stored], options[:more_like_this]
  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
  if stored
    @stored_field_factories_cache[field_factory.name] << field_factory
  end
  if more_like_this
    @more_like_this_field_factories_cache[field_factory.name] << field_factory
  end
end

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

Add field factory for scope/ordering



27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/sunspot/setup.rb', line 27

def add_field_factory(name, type, options = {}, &block)
  stored, more_like_this = options[:stored], options[:more_like_this]
  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
  if more_like_this
    @more_like_this_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



47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/sunspot/setup.rb', line 47

def add_text_field_factory(name, options = {}, &block)
  stored, more_like_this = options[:stored], options[:more_like_this]
  field_factory = FieldFactory::Static.new(name, Type::TextType.instance, 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
  if more_like_this
    @more_like_this_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



234
235
236
237
238
239
# File 'lib/sunspot/setup.rb', line 234

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_more_like_this_fieldsObject

Return all more_like_this fields



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

def all_more_like_this_fields
  @more_like_this_field_factories_cache.values.map do |field_factories| 
    field_factories.map { |field_factory| field_factory.build }
  end.flatten
end

#all_text_fieldsObject

Return all text fields



190
191
192
# File 'lib/sunspot/setup.rb', line 190

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



259
260
261
# File 'lib/sunspot/setup.rb', line 259

def clazz
  Util.full_const_get(@class_name)
end

#document_boost_for(model) ⇒ Object

Get the document boost for a given model



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

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



248
249
250
# File 'lib/sunspot/setup.rb', line 248

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



173
174
175
176
177
178
# File 'lib/sunspot/setup.rb', line 173

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

#field(field_name) ⇒ Object

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



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

def field(field_name)
  if field_factory = @field_factories_cache[field_name.to_sym]
    field_factory.build
  else
    raise(
      UnrecognizedFieldError,
      "No field configured for #{@class_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



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

def field_factories
  collection_from_inheritable_hash(:field_factories)
end

#fieldsObject

Return all attribute fields



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

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

#more_like_this_fields(field_name) ⇒ Object

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



164
165
166
167
168
# File 'lib/sunspot/setup.rb', line 164

def more_like_this_fields(field_name)
  @more_like_this_field_factories_cache[field_name.to_sym].map do |field_factory|
    field_factory.build
  end
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).



85
86
87
# File 'lib/sunspot/setup.rb', line 85

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



110
111
112
# File 'lib/sunspot/setup.rb', line 110

def setup(&block)
  Util.instance_eval_or_call(@dsl, &block)
end

#stored_fields(field_name, dynamic_field_name = nil) ⇒ Object

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



150
151
152
153
154
155
156
157
158
# File 'lib/sunspot/setup.rb', line 150

def stored_fields(field_name, dynamic_field_name = nil)
  @stored_field_factories_cache[field_name.to_sym].map do |field_factory|
    if dynamic_field_name
      field_factory.build(dynamic_field_name)
    else
      field_factory.build
    end
  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



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

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.



133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/sunspot/setup.rb', line 133

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 #{@class_name} with name '#{field_name}'"
      )
    end
  [text_field]
end

#type_namesObject



20
21
22
# File 'lib/sunspot/setup.rb', line 20

def type_names
  [@class_name]
end