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



311
312
313
# File 'lib/sunspot/setup.rb', line 311

def for(clazz) #:nodoc:
  setups[clazz.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



294
295
296
# File 'lib/sunspot/setup.rb', line 294

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.



85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/sunspot/setup.rb', line 85

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



225
226
227
228
229
# File 'lib/sunspot/setup.rb', line 225

def all_field_factories
  all_field_factories = []
  all_field_factories.concat(field_factories).concat(text_field_factories).concat(dynamic_field_factories)
  all_field_factories
end

#all_more_like_this_fieldsObject

Return all more_like_this fields



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

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



181
182
183
# File 'lib/sunspot/setup.rb', line 181

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



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

def clazz
  Util.full_const_get(@class_name)
end

#document_boost_for(model) ⇒ Object

Get the document boost for a given model



256
257
258
259
260
# File 'lib/sunspot/setup.rb', line 256

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



238
239
240
# File 'lib/sunspot/setup.rb', line 238

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



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

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



108
109
110
111
112
113
114
115
116
117
# File 'lib/sunspot/setup.rb', line 108

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



201
202
203
# File 'lib/sunspot/setup.rb', line 201

def field_factories
  collection_from_inheritable_hash(:field_factories)
end

#fieldsObject

Return all attribute fields



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

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.



155
156
157
158
159
# File 'lib/sunspot/setup.rb', line 155

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

#setup(&block) ⇒ Object

Builder method for evaluating the setup DSL



101
102
103
# File 'lib/sunspot/setup.rb', line 101

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.



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

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



213
214
215
# File 'lib/sunspot/setup.rb', line 213

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.



124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/sunspot/setup.rb', line 124

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