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.
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_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
:nodoc:.
-
#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) ⇒ 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
: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, = {}, &block) 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 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, = {}, &block) stored = [:stored] 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 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, = {}, &block) stored = [:stored] field_factory = FieldFactory::Static.new(name, Type::TextType, , &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_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
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_fields ⇒ Object
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 |
#clazz ⇒ Object
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_factories ⇒ Object
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_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
172 173 174 |
# File 'lib/sunspot/setup.rb', line 172 def field_factories collection_from_inheritable_hash(:field_factories) end |
#fields ⇒ Object
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_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
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_names ⇒ Object
18 19 20 |
# File 'lib/sunspot/setup.rb', line 18 def type_names [@class_name] end |