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
19
# 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)
  @document_boost_extractor = nil
  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



318
319
320
# File 'lib/sunspot/setup.rb', line 318

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



301
302
303
# File 'lib/sunspot/setup.rb', line 301

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.



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

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



74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/sunspot/setup.rb', line 74

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



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

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_join_field_factory(name, type, options = {}, &block) ⇒ Object



41
42
43
44
45
# File 'lib/sunspot/setup.rb', line 41

def add_join_field_factory(name, type, options = {}, &block)
  field_factory = FieldFactory::Join.new(name, type, options, &block)
  @field_factories[field_factory.signature] = field_factory
  @field_factories_cache[field_factory.name] = field_factory
end

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

Add field_factories for fulltext search

Parameters

field_factories<Array>

Array of Sunspot::Field objects



54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/sunspot/setup.rb', line 54

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



232
233
234
235
236
# File 'lib/sunspot/setup.rb', line 232

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



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

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



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

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



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

def clazz
  Util.full_const_get(@class_name)
end

#document_boost_for(model) ⇒ Object

Get the document boost for a given model



263
264
265
266
267
# File 'lib/sunspot/setup.rb', line 263

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



245
246
247
# File 'lib/sunspot/setup.rb', line 245

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



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

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



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

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



208
209
210
# File 'lib/sunspot/setup.rb', line 208

def field_factories
  collection_from_inheritable_hash(:field_factories)
end

#fieldsObject

Return all attribute fields



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

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.



162
163
164
165
166
# File 'lib/sunspot/setup.rb', line 162

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



108
109
110
# File 'lib/sunspot/setup.rb', line 108

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.



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

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



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

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.



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

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



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

def type_names
  [@class_name]
end