Class: Sunspot::Setup
- Inherits:
-
Object
- Object
- Sunspot::Setup
- 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_object_id ⇒ Object
readonly
:nodoc:.
Class Method Summary collapse
-
.for(clazz) ⇒ Object
Retrieve the setup instance for the given class, or for the nearest ancestor that has a setup, if any.
-
.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.
Instance Method Summary collapse
-
#add_document_boost(attr_name, &block) ⇒ Object
Add a document boost to documents at index time.
-
#add_dynamic_field_factory(name, type, options = {}, &block) ⇒ Object
Add dynamic field_factories.
-
#add_field_factory(name, type, options = {}, &block) ⇒ Object
Add field factory for scope/ordering.
-
#add_text_field_factory(name, options = {}, &block) ⇒ Object
Add field_factories for fulltext search.
-
#all_field_factories ⇒ Object
Get all static, dynamic, and text field_factories associated with this setup as well as all inherited field_factories.
-
#all_more_like_this_fields ⇒ Object
Return all more_like_this fields.
-
#all_text_fields ⇒ Object
Return all text fields.
-
#clazz ⇒ Object
Return the class associated with this setup.
-
#document_boost_for(model) ⇒ Object
Get the document boost for a given model.
-
#dynamic_field_factories ⇒ Object
Get all dynamic field_factories for this and parent setups.
-
#dynamic_field_factory(field_name) ⇒ Object
Return the DynamicFieldFactory with the given base name.
-
#field(field_name) ⇒ Object
Return the Field with the given (public-facing) name.
-
#field_factories ⇒ Object
Get the field_factories associated with this setup as well as all inherited field_factories.
-
#fields ⇒ Object
Return all attribute fields.
-
#initialize(clazz) ⇒ Setup
constructor
A new instance of Setup.
-
#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.
-
#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).
-
#setup(&block) ⇒ Object
Builder method for evaluating the setup DSL.
-
#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.
-
#text_field_factories ⇒ Object
Get the text field_factories associated with this setup as well as all inherited text field_factories.
-
#text_fields(field_name) ⇒ Object
Return one or more text fields with the given public-facing name.
- #type_names ⇒ Object
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_id ⇒ Object (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, = {}, &block) stored, more_like_this = [:stored], [:more_like_this] field_factory = FieldFactory::Dynamic.new(name, type, , &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, = {}, &block) stored, more_like_this = [:stored], [:more_like_this] field_factory = FieldFactory::Static.new(name, type, , &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, = {}, &block) stored, more_like_this = [:stored], [:more_like_this] field_factory = FieldFactory::Static.new(name, Type::TextType.instance, , &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_factories ⇒ Object
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_fields ⇒ Object
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_fields ⇒ Object
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 |
#clazz ⇒ Object
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_factories ⇒ Object
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_factories ⇒ Object
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 |
#fields ⇒ Object
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_factories ⇒ Object
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_names ⇒ Object
20 21 22 |
# File 'lib/sunspot/setup.rb', line 20 def type_names [@class_name] end |