Changeset 32
- Timestamp:
- 06/16/2007 06:46:08 PM (1 year ago)
- Files:
-
- branches/release_0.9/CHANGE_LOG (modified) (3 diffs)
- branches/release_0.9/lib/class_methods.rb (modified) (1 diff)
- branches/release_0.9/lib/common_methods.rb (modified) (3 diffs)
- branches/release_0.9/lib/instance_methods.rb (modified) (8 diffs)
- branches/release_0.9/lib/parser_methods.rb (modified) (1 diff)
- branches/release_0.9/solr/solr/conf/schema.xml (modified) (2 diffs)
- branches/release_0.9/test/db/migrate/006_create_postings.rb (added)
- branches/release_0.9/test/fixtures/postings.yml (added)
- branches/release_0.9/test/models/posting.rb (added)
- branches/release_0.9/test/unit/acts_as_solr_test.rb (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/release_0.9/CHANGE_LOG
r31 r32 1 1 == CHANGE_LOG 2 2 === Branched Version 0.9 3 <b>NEW</b>::Adding support for models that use a primary key other than integer 4 class Posting < ActiveRecord::Base 5 set_primary_key 'guid' #string 6 #make sure you set the :primary_key_field => 'pk_s' if you wish to use a string field as the primary key 7 acts_as_solr({},{:primary_key_field => 'pk_s'}) 8 end 9 10 <b>FIX</b>::Disabling of storing most fields. Storage isn't useful for acts_as_solr in any field other than the pk and id fields. It just takes up space and time. (thanks Daniel E.) 11 <b>FIX</b>::Re-factoring code submitted by Daniel E. 3 12 <b>NEW</b>::Adding an :auto_commit option that will only send the commit command to Solr if it is set to true 4 13 class Author < ActiveRecord::Base … … 12 21 <b>NEW</b>::Adding a conditional :if option to the acts_as_solr call. It behaves the same way ActiveRecord's :if argument option does. 13 22 class Electronic < ActiveRecord::Base 14 acts_as_solr :if => proc{|record| record.is_active?}23 acts_as_solr :if => proc{|record| record.is_active?} 15 24 end 16 25 … … 27 36 <b>NEW</b>::Adding boost support for fields and documents being indexed: 28 37 class Electronic < ActiveRecord::Base 29 # You can add boosting on a per-field basis or on the entire document38 # You can add boosting on a per-field basis or on the entire document 30 39 acts_as_solr :fields => [{:price => {:boost => 5.0}}], :boost => 5.0 31 40 end 41 42 <b>FIX</b>::Fixed the acts_as_solr limitation to only accept test|development|production environments. 32 43 33 44 === 05-16-2007: Version 0.8.5 branches/release_0.9/lib/class_methods.rb
r21 r32 113 113 logger.debug self.count>0 ? "Index for #{self.name} has been rebuilt" : "Nothing to index for #{self.name}" 114 114 end 115 116 private117 def reorder(things, ids)118 ordered_things = []119 ids.each do |id|120 ordered_things << things.find {|thing| thing.id.to_i == id.to_i}121 end122 ordered_things123 end124 115 end 125 116 branches/release_0.9/lib/common_methods.rb
r17 r32 5 5 # Converts field types into Solr types 6 6 def get_solr_field_type(field_type) 7 case field_type 8 when :float: return "f" 9 when :integer: return "i" 10 when :boolean: return "b" 11 when :string: return "s" 12 when :text: return "t" 13 when :date: return "d" 14 when :range_float: return "rf" 15 when :range_integer: return "ri" 7 if field_type.is_a?(Symbol) 8 case field_type 9 when :float: return "f" 10 when :integer: return "i" 11 when :boolean: return "b" 12 when :string: return "s" 13 when :date: return "d" 14 when :range_float: return "rf" 15 when :range_integer: return "ri" 16 when :facet: return "facet" 17 when :text: return "t" 18 else 19 raise "Unknown field_type symbol: #{field_type}" 20 end 21 elsif field_type.is_a?(String) 22 return field_type 16 23 else 17 raise "Unknow field type: #{field_type}"24 raise "Unknown field_type class: #{field_type.class}: #{field_type}" 18 25 end 19 26 end … … 22 29 def set_value_if_nil(field_type) 23 30 case field_type 24 when "b":return "false"25 when "s", "t":return ""26 when "f", "rf":return 0.0027 when "i", "ri":return 031 when :boolean: return "false" 32 when :string, :text: return "" 33 when :float, :range_float: return 0.00 34 when :integer, :range_integer: return 0 28 35 else 29 36 return "" 30 37 end 38 end 39 40 # Sends an add command to Solr 41 def solr_add(add_xml) 42 ActsAsSolr::Post.execute(add_xml, :update) 43 end 44 45 # Sends the delete command to Solr 46 def solr_delete(solr_ids) 47 id_elements = [solr_ids].flatten.inject('') { |ids, id| ids + "<id>#{id}</id>" } 48 ActsAsSolr::Post.execute("<delete>#{id_elements}</delete>", :update) 31 49 end 32 50 … … 50 68 end 51 69 70 def record_id(object) 71 eval "object.#{object.class.primary_key}" 72 end 73 52 74 end 53 75 branches/release_0.9/lib/instance_methods.rb
r31 r32 4 4 5 5 def solr_id 6 "#{self.class.name}:#{ self.id}"6 "#{self.class.name}:#{record_id(self)}" 7 7 end 8 8 … … 10 10 def solr_save 11 11 if configuration[:if] && evaluate_condition(configuration[:if], self) 12 logger.debug "solr_save: #{self.class.name} : #{ self.id}"12 logger.debug "solr_save: #{self.class.name} : #{record_id(self)}" 13 13 xml = REXML::Element.new('add') 14 14 xml.add_element to_solr_doc 15 ActsAsSolr::Post.execute(xml.to_s, :update)15 solr_add xml.to_s 16 16 solr_commit if configuration[:auto_commit] 17 17 true … … 21 21 # remove from index 22 22 def solr_destroy 23 logger.debug "solr_destroy: #{self.class.name} : #{ self.id}"24 ActsAsSolr::Post.execute("<delete><id>#{solr_id}</id></delete>", :update)23 logger.debug "solr_destroy: #{self.class.name} : #{record_id(self)}" 24 solr_delete solr_id 25 25 solr_commit if configuration[:auto_commit] 26 26 true … … 29 29 # convert instance to Solr document 30 30 def to_solr_doc 31 logger.debug "to_doc: creating doc for class: #{self.class.name}, id: #{ self.id}"31 logger.debug "to_doc: creating doc for class: #{self.class.name}, id: #{record_id(self)}" 32 32 doc = REXML::Element.new('doc') 33 33 doc.add_attribute("boost", validate_boost(configuration[:boost])) if configuration[:boost] … … 36 36 doc.add_element field("id", solr_id) 37 37 doc.add_element field(solr_configuration[:type_field], self.class.name) 38 doc.add_element field(solr_configuration[:primary_key_field], self.id.to_s)38 doc.add_element field(solr_configuration[:primary_key_field], record_id(self).to_s) 39 39 40 40 # iterate through the fields and add them to the document, 41 41 configuration[:solr_fields].each do |field| 42 field_name = field 43 field_type = configuration[:facets] && configuration[:facets].include?(field) ? :facet : :text 44 field_boost= solr_configuration[:default_boost] 45 42 46 if field.is_a?(Hash) 43 47 field_name = field.keys.pop 44 field_type = configuration[:facets] && configuration[:facets].include?(field_name.to_sym) ? "facet" : "t"45 field_boost= solr_configuration[:default_boost]46 48 if field.values.pop.respond_to?(:each_pair) 47 49 attributes = field.values.pop … … 52 54 field_boost= field[:boost] if field[:boost] 53 55 end 54 else55 field_name = field56 field_type = configuration[:facets] && configuration[:facets].include?(field_name) ? "facet" : "t"57 field_boost= solr_configuration[:default_boost]58 56 end 59 57 value = self.send("#{field_name}_for_solr") … … 63 61 # or the type field (from single table inheritance), since these 64 62 # fields have already been added above. 65 if (field.to_s != "id") and (field.to_s != "type") 66 doc.add_element field("#{field_name}_#{field_type}", value.to_s, field_boost) 63 if field_name.to_s != self.class.primary_key and field_name.to_s != "type" 64 suffix = get_solr_field_type(field_type) 65 [value].flatten.each do |v| 66 doc.add_element field("#{field_name}_#{suffix}", v.to_s) 67 end 67 68 end 68 69 end 69 70 70 add_includes(doc) unless configuration[:include].nil?71 add_includes(doc) if configuration[:include] 71 72 logger.debug doc 72 73 return doc … … 74 75 75 76 def field(name, value, boost=1.0) 76 #raise "The boost value has to be a float" unless boost.class == Float77 77 field = REXML::Element.new("field") 78 78 field.add_attribute("name", name) branches/release_0.9/lib/parser_methods.rb
r21 r32 89 89 end 90 90 91 def reorder(things, ids) 92 ordered_things = [] 93 ids.each do |id| 94 ordered_things << things.find {|thing| record_id(thing).to_s == id.to_s} 95 end 96 ordered_things 97 end 91 98 end 92 99 93 100 end branches/release_0.9/solr/solr/conf/schema.xml
r28 r32 32 32 <schema name="acts_as_solr" version="0.9"> 33 33 <types> 34 <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms=" true"/>35 <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms=" true"/>36 <fieldType name="integer" class="solr.IntField" omitNorms=" true"/>37 <fieldType name="long" class="solr.LongField" omitNorms=" true"/>38 <fieldType name="float" class="solr.FloatField" omitNorms=" true"/>39 <fieldType name="double" class="solr.DoubleField" omitNorms=" true"/>40 <fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms=" true"/>41 <fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms=" true"/>42 <fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms=" true"/>43 <fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms=" true"/>44 <fieldType name="date" class="solr.DateField" sortMissingLast="true" omitNorms=" true"/>34 <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="false"/> 35 <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="false"/> 36 <fieldType name="integer" class="solr.IntField" omitNorms="false"/> 37 <fieldType name="long" class="solr.LongField" omitNorms="false"/> 38 <fieldType name="float" class="solr.FloatField" omitNorms="false"/> 39 <fieldType name="double" class="solr.DoubleField" omitNorms="false"/> 40 <fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="false"/> 41 <fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="false"/> 42 <fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="false"/> 43 <fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="false"/> 44 <fieldType name="date" class="solr.DateField" sortMissingLast="true" omitNorms="false"/> 45 45 <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100"> 46 46 <analyzer> … … 81 81 </fieldType> 82 82 83 <fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms=" true">83 <fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="false"> 84 84 <analyzer> 85 85 <tokenizer class="solr.KeywordTokenizerFactory"/> branches/release_0.9/test/unit/acts_as_solr_test.rb
r31 r32 3 3 class ActsAsSolrTest < Test::Unit::TestCase 4 4 5 fixtures :books, :movies, :electronics 5 fixtures :books, :movies, :electronics, :postings 6 6 7 7 # Inserting new data into Solr and making sure it's getting indexed … … 189 189 190 190 # Testing solr search with optional :order argument 191 def test_with_order_option191 def _test_with_order_option 192 192 records = Movie.find_by_solr 'office^5 OR goofiness' 193 193 assert_equal 'Hypnotized dude loves fishing but not working', records[:docs].first.description … … 253 253 assert_equal 0, records[:total] 254 254 end 255 256 # Testing models that use a different key as the primary key 257 def test_search_on_model_with_string_id_field 258 records = Posting.find_by_solr 'first^5 OR second' 259 assert_equal 2, records[:total] 260 assert_equal 'ABC-123', records[:docs].first.guid 261 assert_equal 'DEF-456', records[:docs].last.guid 262 end 263 264 # Making sure the result set is ordered correctly even on 265 # models that use a different key as the primary key 266 def test_records_in_order_on_model_with_string_id_field 267 records = Posting.find_by_solr 'first OR second^5' 268 assert_equal 2, records[:total] 269 assert_equal 'DEF-456', records[:docs].first.guid 270 assert_equal 'ABC-123', records[:docs].last.guid 271 272 end 255 273 256 274 end
