Commit aea0c47fba27d4216183eccb4eceef3c01110da9

Authored by Braulio Bhavamitra
1 parent dad628a9

Grab fixes to acts_as_solr_reloaded (multivalue problems)

vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/common_methods.rb
@@ -28,22 +28,6 @@ module ActsAsSolr #:nodoc: @@ -28,22 +28,6 @@ module ActsAsSolr #:nodoc:
28 raise "Unknown field_type class: #{field_type.class}: #{field_type}" 28 raise "Unknown field_type class: #{field_type.class}: #{field_type}"
29 end 29 end
30 end 30 end
31 -  
32 - # Sets a default value when value being set is nil.  
33 - def set_value_if_nil(field_type)  
34 - case field_type  
35 - when "b", :boolean  
36 - return "false"  
37 - when "s", "t", "d", :date, :string, :text  
38 - return ""  
39 - when "f", "rf", :float, :range_float, :double, :decimal  
40 - return 0.00  
41 - when "i", "ri", :integer, :range_integer  
42 - return 0  
43 - else  
44 - return ""  
45 - end  
46 - end  
47 31
48 def solr_batch_add(objects) 32 def solr_batch_add(objects)
49 solr_add Array(objects).map{ |a| a.to_solr_doc } 33 solr_add Array(objects).map{ |a| a.to_solr_doc }
vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/instance_methods.rb
@@ -45,32 +45,23 @@ module ActsAsSolr #:nodoc: @@ -45,32 +45,23 @@ module ActsAsSolr #:nodoc:
45 45
46 # iterate through the fields and add them to the document, 46 # iterate through the fields and add them to the document,
47 configuration[:solr_fields].each do |field_name, options| 47 configuration[:solr_fields].each do |field_name, options|
  48 + next if [self.class.primary_key, "type"].include?(field_name.to_s)
  49 +
48 field_boost = options[:boost] || solr_configuration[:default_boost] 50 field_boost = options[:boost] || solr_configuration[:default_boost]
49 field_type = get_solr_field_type(options[:type]) 51 field_type = get_solr_field_type(options[:type])
50 solr_name = options[:as] || field_name 52 solr_name = options[:as] || field_name
51 53
52 value = self.send("#{field_name}_for_solr") 54 value = self.send("#{field_name}_for_solr")
53 - value = set_value_if_nil(field_type) if value.to_s == ""  
54 -  
55 - # add the field to the document, but only if it's not the id field  
56 - # or the type field (from single table inheritance), since these  
57 - # fields have already been added above.  
58 - if field_name.to_s != self.class.primary_key and field_name.to_s != "type"  
59 - suffix = get_solr_field_type(field_type)  
60 - # This next line ensures that e.g. nil dates are excluded from the  
61 - # document, since they choke Solr. Also ignores e.g. empty strings,  
62 - # but these can't be searched for anyway:  
63 - # http://www.mail-archive.com/solr-dev@lucene.apache.org/msg05423.html  
64 - next if value.nil? || value.to_s.strip.empty?  
65 - [value].flatten.each do |v|  
66 - v = set_value_if_nil(suffix) if value.to_s == ""  
67 -  
68 - field = Solr::Field.new(:name => "#{solr_name}_#{suffix}", :value => ERB::Util.html_escape(v.to_s))  
69 - processed_boost = validate_boost(field_boost)  
70 - field.boost = processed_boost if processed_boost != solr_configuration[:default_boost]  
71 - doc << field  
72 - end  
73 - end 55 + next if value.nil?
  56 +
  57 + suffix = get_solr_field_type(field_type)
  58 + value = Array(value).map{ |v| ERB::Util.html_escape(v) } # escape each value
  59 + value = value.first if value.size == 1
  60 +
  61 + field = Solr::Field.new(:name => "#{solr_name}_#{suffix}", :value => value)
  62 + processed_boost = validate_boost(field_boost)
  63 + field.boost = processed_boost if processed_boost != solr_configuration[:default_boost]
  64 + doc << field
74 end 65 end
75 66
76 add_dynamic_attributes(doc) 67 add_dynamic_attributes(doc)
vendor/plugins/acts_as_solr_reloaded/lib/solr/request/dismax.rb
@@ -16,7 +16,7 @@ class Solr::Request::Dismax &lt; Solr::Request::Standard @@ -16,7 +16,7 @@ class Solr::Request::Dismax &lt; Solr::Request::Standard
16 :alternate_query, :boost_query, :boost_functions]) 16 :alternate_query, :boost_query, :boost_functions])
17 17
18 def initialize(params) 18 def initialize(params)
19 - super("search") 19 + super
20 end 20 end
21 21
22 def to_hash 22 def to_hash
vendor/plugins/acts_as_solr_reloaded/lib/solr/request/standard.rb
@@ -17,7 +17,7 @@ class Solr::Request::Standard &lt; Solr::Request::Select @@ -17,7 +17,7 @@ class Solr::Request::Standard &lt; Solr::Request::Select
17 :radius, :latitude, :longitude, :spellcheck] 17 :radius, :latitude, :longitude, :spellcheck]
18 18
19 def initialize(params) 19 def initialize(params)
20 - super('search') 20 + super 'search'
21 21
22 raise "Invalid parameters: #{(params.keys - VALID_PARAMS).join(',')}" unless 22 raise "Invalid parameters: #{(params.keys - VALID_PARAMS).join(',')}" unless
23 (params.keys - VALID_PARAMS).empty? 23 (params.keys - VALID_PARAMS).empty?
vendor/plugins/acts_as_solr_reloaded/solr/solr/conf/schema.xml
@@ -53,45 +53,45 @@ @@ -53,45 +53,45 @@
53 <tokenizer class="solr.StandardTokenizerFactory"/> 53 <tokenizer class="solr.StandardTokenizerFactory"/>
54 <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 54 <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
55 55
56 - <filter class="solr.ASCIIFoldingFilterFactory"/> 56 + <filter class="solr.ASCIIFoldingFilterFactory"/>
57 <filter class="solr.LowerCaseFilterFactory"/> 57 <filter class="solr.LowerCaseFilterFactory"/>
58 58
59 - <filter class="solr.StopFilterFactory" words="stopwords.pt.txt" /> 59 + <filter class="solr.StopFilterFactory" words="stopwords.pt.txt" />
60 60
61 - <!-- stemming  
62 - -->  
63 - <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.pt.txt" />  
64 - <filter class="solr.PortugueseStemFilterFactory" />  
65 - <!-- too slow  
66 - <filter class="solr.HunspellStemFilterFactory" dictionary="en_US.dic" affix="en_US.aff" ignoreCase="true" />  
67 - <filter class="solr.HunspellStemFilterFactory" dictionary="pt_PT.dic" affix="pt_PT.aff" ignoreCase="true" />  
68 - --> 61 + <!-- stemming
  62 + -->
  63 + <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.pt.txt" />
  64 + <filter class="solr.PortugueseStemFilterFactory" />
  65 + <!-- too slow
  66 + <filter class="solr.HunspellStemFilterFactory" dictionary="en_US.dic" affix="en_US.aff" ignoreCase="true" />
  67 + <filter class="solr.HunspellStemFilterFactory" dictionary="pt_PT.dic" affix="pt_PT.aff" ignoreCase="true" />
  68 + -->
69 69
70 - <!-- improvised stemming  
71 - <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20" side="front"/>  
72 - --> 70 + <!-- improvised stemming
  71 + <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20" side="front"/>
  72 + -->
73 </analyzer> 73 </analyzer>
74 <analyzer type="query"> 74 <analyzer type="query">
75 <tokenizer class="solr.StandardTokenizerFactory"/> 75 <tokenizer class="solr.StandardTokenizerFactory"/>
76 <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 76 <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
77 77
78 - <filter class="solr.ASCIIFoldingFilterFactory"/> 78 + <filter class="solr.ASCIIFoldingFilterFactory"/>
79 <filter class="solr.LowerCaseFilterFactory"/> 79 <filter class="solr.LowerCaseFilterFactory"/>
80 80
81 - <filter class="solr.StopFilterFactory" words="stopwords.pt.txt" /> 81 + <filter class="solr.StopFilterFactory" words="stopwords.pt.txt" />
82 82
83 - <!-- stemming  
84 - -->  
85 - <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.pt.txt" />  
86 - <filter class="solr.PortugueseStemFilterFactory" />  
87 - <!-- too slow  
88 - <filter class="solr.HunspellStemFilterFactory" dictionary="en_US.dic" affix="en_US.aff" ignoreCase="true" />  
89 - <filter class="solr.HunspellStemFilterFactory" dictionary="pt_PT.dic" affix="pt_PT.aff" ignoreCase="true" />  
90 - --> 83 + <!-- stemming
  84 + -->
  85 + <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.pt.txt" />
  86 + <filter class="solr.PortugueseStemFilterFactory" />
  87 + <!-- too slow
  88 + <filter class="solr.HunspellStemFilterFactory" dictionary="en_US.dic" affix="en_US.aff" ignoreCase="true" />
  89 + <filter class="solr.HunspellStemFilterFactory" dictionary="pt_PT.dic" affix="pt_PT.aff" ignoreCase="true" />
  90 + -->
91 91
92 - <!-- improvised stemming  
93 - <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20" side="front"/>  
94 - --> 92 + <!-- improvised stemming
  93 + <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20" side="front"/>
  94 + -->
95 </analyzer> 95 </analyzer>
96 </fieldType> 96 </fieldType>
97 97
@@ -127,26 +127,24 @@ @@ -127,26 +127,24 @@
127 <field name="latlng_0_coordinate" type="sdouble" indexed="true" stored="true" multiValued="false"/> 127 <field name="latlng_0_coordinate" type="sdouble" indexed="true" stored="true" multiValued="false"/>
128 <field name="latlng_1_coordinate" type="sdouble" indexed="true" stored="true" multiValued="false"/> 128 <field name="latlng_1_coordinate" type="sdouble" indexed="true" stored="true" multiValued="false"/>
129 129
130 - <field name="id" type="string" indexed="true" stored="true" required="true" />  
131 - <field name="type_s" type="string" indexed="true" stored="false" />  
132 - <field name="pk_i" type="integer" indexed="true" stored="true"/>  
133 - <field name="pk_s" type="string" indexed="true" stored="true"/>  
134 - <field name="text" type="text" indexed="true" stored="false" multiValued="true"/> 130 + <field name="id" type="string" indexed="true" stored="true" required="true" />
  131 + <field name="pk_i" type="integer" indexed="true" stored="true"/>
  132 + <field name="pk_s" type="string" indexed="true" stored="true"/>
  133 + <field name="text" type="text" indexed="true" stored="false" multiValued="true"/>
135 <field name="spell" type="textSpell" indexed="true" stored="true" multiValued="true"/> 134 <field name="spell" type="textSpell" indexed="true" stored="true" multiValued="true"/>
136 135
137 - <dynamicField name="*_i" type="integer" indexed="true" stored="false"/>  
138 - <dynamicField name="*_t" type="text" indexed="true" stored="true"/>  
139 - <dynamicField name="*_f" type="float" indexed="true" stored="false" multiValued="false"/>  
140 - <dynamicField name="*_do" type="double" indexed="true" stored="false" multiValued="false"/>  
141 - <dynamicField name="*_b" type="boolean" indexed="true" stored="false"/>  
142 - <dynamicField name="*_d" type="date" indexed="true" stored="false" multiValued="false"/>  
143 - <dynamicField name="*_s" type="string" indexed="true" stored="true" multiValued="false"/>  
144 - <dynamicField name="*_ri" type="sint" indexed="true" stored="false"/>  
145 - <dynamicField name="*_rf" type="sfloat" indexed="true" stored="false"/>  
146 - <dynamicField name="*_facet" type="string" indexed="true" stored="false"/>  
147 - <dynamicField name="*_s_mv" type="string" indexed="true" stored="false" multiValued="true"/> 136 + <dynamicField name="*_i" type="integer" indexed="true" stored="false" multiValued="true"/>
  137 + <dynamicField name="*_t" type="text" indexed="true" stored="true" multiValued="true"/>
  138 + <dynamicField name="*_f" type="float" indexed="true" stored="false" multiValued="false"/>
  139 + <dynamicField name="*_do" type="double" indexed="true" stored="false" multiValued="false"/>
  140 + <dynamicField name="*_b" type="boolean" indexed="true" stored="false" multiValued="true"/>
  141 + <dynamicField name="*_s" type="string" indexed="true" stored="true" multiValued="false"/>
  142 + <dynamicField name="*_ri" type="sint" indexed="true" stored="false" multiValued="true"/>
  143 + <dynamicField name="*_rf" type="sfloat" indexed="true" stored="false" multiValued="true"/>
  144 + <dynamicField name="*_facet" type="string" indexed="true" stored="false" multiValued="true"/>
  145 + <dynamicField name="*_s_mv" type="string" indexed="true" stored="false" multiValued="true"/>
148 <dynamicField name="*_zh_text" type="text_zh" indexed="true" stored="false" multiValued="true"/> 146 <dynamicField name="*_zh_text" type="text_zh" indexed="true" stored="false" multiValued="true"/>
149 - <dynamicField name="*_display" type="text" indexed="false" stored="true" multiValued="true"/> 147 + <dynamicField name="*_display" type="text" indexed="false" stored="true" multiValued="true"/>
150 148
151 <field name="lat" type="sdouble" indexed="true" stored="true"/><!-- must match the latField in solrconfig.xml --> 149 <field name="lat" type="sdouble" indexed="true" stored="true"/><!-- must match the latField in solrconfig.xml -->
152 <field name="lng" type="sdouble" indexed="true" stored="true"/><!-- must match the lngField in solrconfig.xml --> 150 <field name="lng" type="sdouble" indexed="true" stored="true"/><!-- must match the lngField in solrconfig.xml -->
vendor/plugins/acts_as_solr_reloaded/test/unit/common_methods_shoulda.rb
@@ -76,43 +76,6 @@ class CommonMethodsTest &lt; Test::Unit::TestCase @@ -76,43 +76,6 @@ class CommonMethodsTest &lt; Test::Unit::TestCase
76 end 76 end
77 end 77 end
78 78
79 - context "when determining a default value for a field when it's nil" do  
80 - should "return 0.00 for a float" do  
81 - assert_equal 0.00, set_value_if_nil("f")  
82 - assert_equal 0.00, set_value_if_nil(:float)  
83 - assert_equal 0.00, set_value_if_nil("rf")  
84 - assert_equal 0.00, set_value_if_nil(:range_float)  
85 - end  
86 -  
87 - should "return 0 for an integer" do  
88 - assert_equal 0, set_value_if_nil(:integer)  
89 - assert_equal 0, set_value_if_nil(:range_integer)  
90 - assert_equal 0, set_value_if_nil("i")  
91 - assert_equal 0, set_value_if_nil("ri")  
92 - end  
93 -  
94 - should "return false for a boolean" do  
95 - assert_equal "false", set_value_if_nil(:boolean)  
96 - assert_equal "false", set_value_if_nil("b")  
97 - end  
98 -  
99 - should "return empty string for strings and text" do  
100 - assert_equal "", set_value_if_nil(:string)  
101 - assert_equal "", set_value_if_nil(:text)  
102 - assert_equal "", set_value_if_nil("t")  
103 - assert_equal "", set_value_if_nil("s")  
104 - end  
105 -  
106 - should "return an empty string for a date" do  
107 - assert_equal "", set_value_if_nil(:date)  
108 - assert_equal "", set_value_if_nil("d")  
109 - end  
110 -  
111 - should "return an empty string for everything else" do  
112 - assert_equal "", set_value_if_nil("something")  
113 - end  
114 - end  
115 -  
116 context "when determining the record id" do 79 context "when determining the record id" do
117 context "on ActiveRecord" do 80 context "on ActiveRecord" do
118 should "return the primary key value" do 81 should "return the primary key value" do
@@ -125,4 +88,4 @@ class CommonMethodsTest &lt; Test::Unit::TestCase @@ -125,4 +88,4 @@ class CommonMethodsTest &lt; Test::Unit::TestCase
125 end 88 end
126 end 89 end
127 end 90 end
128 -end  
129 \ No newline at end of file 91 \ No newline at end of file
  92 +end
vendor/plugins/acts_as_solr_reloaded/test/unit/instance_methods_shoulda.rb
@@ -225,18 +225,6 @@ class InstanceMethodsTest &lt; Test::Unit::TestCase @@ -225,18 +225,6 @@ class InstanceMethodsTest &lt; Test::Unit::TestCase
225 assert_not_equal "bogus", doc[:id] 225 assert_not_equal "bogus", doc[:id]
226 end 226 end
227 227
228 - should "set the default value if field value is nil" do  
229 - @instance.name = nil  
230 - @instance.expects(:set_value_if_nil).with('s')  
231 - @instance.to_solr_doc  
232 - end  
233 -  
234 - should "not include nil values" do  
235 - @instance.name = ""  
236 - @instance.stubs(:set_value_if_nil).returns ""  
237 - assert_nil @instance.to_solr_doc[:name_s]  
238 - end  
239 -  
240 should "escape the contents" do 228 should "escape the contents" do
241 @instance.name = "<script>malicious()</script>" 229 @instance.name = "<script>malicious()</script>"
242 assert_equal "&lt;script&gt;malicious()&lt;/script&gt;", @instance.to_solr_doc[:name_s] 230 assert_equal "&lt;script&gt;malicious()&lt;/script&gt;", @instance.to_solr_doc[:name_s]