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 28 raise "Unknown field_type class: #{field_type.class}: #{field_type}"
29 29 end
30 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 32 def solr_batch_add(objects)
49 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 45  
46 46 # iterate through the fields and add them to the document,
47 47 configuration[:solr_fields].each do |field_name, options|
  48 + next if [self.class.primary_key, "type"].include?(field_name.to_s)
  49 +
48 50 field_boost = options[:boost] || solr_configuration[:default_boost]
49 51 field_type = get_solr_field_type(options[:type])
50 52 solr_name = options[:as] || field_name
51 53  
52 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 65 end
75 66  
76 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 16 :alternate_query, :boost_query, :boost_functions])
17 17  
18 18 def initialize(params)
19   - super("search")
  19 + super
20 20 end
21 21  
22 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 17 :radius, :latitude, :longitude, :spellcheck]
18 18  
19 19 def initialize(params)
20   - super('search')
  20 + super 'search'
21 21  
22 22 raise "Invalid parameters: #{(params.keys - VALID_PARAMS).join(',')}" unless
23 23 (params.keys - VALID_PARAMS).empty?
... ...
vendor/plugins/acts_as_solr_reloaded/solr/solr/conf/schema.xml
... ... @@ -53,45 +53,45 @@
53 53 <tokenizer class="solr.StandardTokenizerFactory"/>
54 54 <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
55 55  
56   - <filter class="solr.ASCIIFoldingFilterFactory"/>
  56 + <filter class="solr.ASCIIFoldingFilterFactory"/>
57 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 73 </analyzer>
74 74 <analyzer type="query">
75 75 <tokenizer class="solr.StandardTokenizerFactory"/>
76 76 <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
77 77  
78   - <filter class="solr.ASCIIFoldingFilterFactory"/>
  78 + <filter class="solr.ASCIIFoldingFilterFactory"/>
79 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 95 </analyzer>
96 96 </fieldType>
97 97  
... ... @@ -127,26 +127,24 @@
127 127 <field name="latlng_0_coordinate" type="sdouble" indexed="true" stored="true" multiValued="false"/>
128 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 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 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 149 <field name="lat" type="sdouble" indexed="true" stored="true"/><!-- must match the latField in solrconfig.xml -->
152 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 76 end
77 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 79 context "when determining the record id" do
117 80 context "on ActiveRecord" do
118 81 should "return the primary key value" do
... ... @@ -125,4 +88,4 @@ class CommonMethodsTest &lt; Test::Unit::TestCase
125 88 end
126 89 end
127 90 end
128   -end
129 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 225 assert_not_equal "bogus", doc[:id]
226 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 228 should "escape the contents" do
241 229 @instance.name = "<script>malicious()</script>"
242 230 assert_equal "&lt;script&gt;malicious()&lt;/script&gt;", @instance.to_solr_doc[:name_s]
... ...