solrizer 3.0.0.pre3 → 3.0.0.pre4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/History.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  h2. 3.0.0
2
2
  suffix changes:
3
- _s -> _si
3
+ _s -> _sim
4
4
  _t -> _tesim
5
5
  _dt -> _dtsi
6
6
  _i -> _isim
@@ -51,7 +51,7 @@ module Solrizer
51
51
  lambda do |type|
52
52
  type = :text_en if [:string, :text].include?(type) # for backwards compatibility with old solr schema
53
53
  vals = [type, :indexed, :stored]
54
- vals << :multivalued unless type == :date
54
+ vals << :multivalued unless [:date, :time].include? type
55
55
  vals
56
56
  end
57
57
  end
@@ -59,7 +59,7 @@ module Solrizer
59
59
  def self.searchable_converter
60
60
  lambda do |type|
61
61
  case type
62
- when :date
62
+ when :date, :time
63
63
  lambda { |val| iso8601_date(val)}
64
64
  end
65
65
  end
@@ -80,7 +80,7 @@ module Solrizer
80
80
 
81
81
  def self.iso8601_date(value)
82
82
  begin
83
- if value.is_a?(Date)
83
+ if value.is_a?(Date) || value.is_a?(Time)
84
84
  DateTime.parse(value.to_s).to_time.utc.iso8601
85
85
  elsif !value.empty?
86
86
  DateTime.parse(value).to_time.utc.iso8601
@@ -33,7 +33,7 @@ module Solrizer
33
33
  index_datatype = evaluated_type.first
34
34
  raise Solrizer::InvalidIndexDescriptor, "Missing datatype for #{evaluated_type}" unless index_datatype
35
35
  type_suffix = config[:type_suffix].call(index_datatype)
36
- raise Solrizer::InvalidIndexDescriptor, "Invalid datatype `#{index_datatype.inspect}'. Must be one of: :date, :text, :text_en, :string, :integer" unless type_suffix
36
+ raise Solrizer::InvalidIndexDescriptor, "Invalid datatype `#{index_datatype.inspect}'. Must be one of: :date, :time, :text, :text_en, :string, :integer" unless type_suffix
37
37
 
38
38
  suffix = [config[:suffix_delimiter], type_suffix, stored_suffix, index_suffix, multivalued_suffix].join
39
39
  end
@@ -54,7 +54,7 @@ module Solrizer
54
54
  't'
55
55
  when :text_en
56
56
  'te'
57
- when :date
57
+ when :date, :time
58
58
  'dt'
59
59
  when :integer
60
60
  'i'
@@ -165,8 +165,7 @@ module Solrizer
165
165
  def solr_names_and_values(field_name, field_value, index_types)
166
166
  return {} unless field_value
167
167
 
168
- # Determine the set of index types, adding defaults and removing not_xyz
169
- index_types ||= []
168
+ # Determine the set of index types
170
169
  index_types.uniq!
171
170
  index_types.dup.each do |index_type|
172
171
  if index_type.to_s =~ /^not_(.*)/
@@ -178,31 +177,36 @@ module Solrizer
178
177
  # Map names and values
179
178
 
180
179
  results = {}
180
+
181
+ # Time seems to extend enumerable, so wrap it so we don't interate over each of its elements.
182
+ field_value = [field_value] if field_value.kind_of? Time
181
183
 
182
184
  index_types.each do |index_type|
183
- # Get mapping for field
184
- name, converter = indexer(index_type).name_and_converter(field_name, type: extract_type(field_value))
185
- #name, converter = solr_name_and_converter(field_name, index_type, field_type)
186
- next unless name
187
-
188
- # Is there a custom converter?
189
- # TODO instead of a custom converter, look for input data type and output data type. Create a few methods that can do that cast.
185
+ Array(field_value).each do |single_value|
186
+ # Get mapping for field
187
+ name, converter = indexer(index_type).name_and_converter(field_name, type: extract_type(single_value))
188
+ #name, converter = solr_name_and_converter(field_name, index_type, field_type)
189
+ next unless name
190
+
191
+ # Is there a custom converter?
192
+ # TODO instead of a custom converter, look for input data type and output data type. Create a few methods that can do that cast.
190
193
 
191
- value = if converter
192
- if converter.arity == 1
193
- converter.call(field_value)
194
+ value = if converter
195
+ if converter.arity == 1
196
+ converter.call(single_value)
197
+ else
198
+ converter.call(single_value, field_name)
199
+ end
194
200
  else
195
- converter.call(field_value, field_name)
201
+ single_value.to_s
196
202
  end
197
- else
198
- field_value.to_s
203
+
204
+ # Add mapped name & value, unless it's a duplicate
205
+ values = (results[name] ||= [])
206
+ values << value unless value.nil? || values.include?(value)
199
207
  end
200
-
201
- # Add mapped name & value, unless it's a duplicate
202
- values = (results[name] ||= [])
203
- values << value unless value.nil? || values.include?(value)
204
208
  end
205
-
209
+
206
210
  results
207
211
  end
208
212
  end
@@ -1,3 +1,3 @@
1
1
  module Solrizer
2
- VERSION = "3.0.0.pre3"
2
+ VERSION = "3.0.0.pre4"
3
3
  end
data/lib/solrizer.rb CHANGED
@@ -22,4 +22,31 @@ module Solrizer
22
22
  def self.default_field_mapper=(field_mapper)
23
23
  @@default_field_mapper = field_mapper
24
24
  end
25
+
26
+ # @params [Hash] doc the hash to insert the value into
27
+ # @params [String] name the name of the field (without the suffix)
28
+ # @params [String,Date] value the value to be inserted
29
+ # @params [Array,Hash] indexer_args the arguments that find the indexer
30
+ # @returns [Hash] doc the document that was provided with the new field inserted
31
+ def self.insert_field(doc, name, value, *indexer_args)
32
+ # adding defaults indexer
33
+ indexer_args = [:searchable] if indexer_args.empty?
34
+ default_field_mapper.solr_names_and_values(name, value, indexer_args).each do |k, v|
35
+ doc[k] ||= []
36
+ doc[k] += v
37
+ end
38
+ doc
39
+ end
40
+
41
+ # @params [Hash] doc the hash to insert the value into
42
+ # @params [String] name the name of the field (without the suffix)
43
+ # @params [String,Date] value the value to be inserted
44
+ # @params [Array,Hash] indexer_args the arguments that find the indexer
45
+ # @returns [Hash] doc the document that was provided with the new field (replacing any field with the same name)
46
+ def self.set_field(doc, name, value, *indexer_args)
47
+ # adding defaults indexer
48
+ indexer_args = [:searchable] if indexer_args.empty?
49
+ doc.merge! default_field_mapper.solr_names_and_values(name, value, indexer_args)
50
+ doc
51
+ end
25
52
  end
@@ -145,6 +145,7 @@ describe Solrizer::FieldMapper do
145
145
  @mapper.extract_type(7).should == :integer
146
146
  @mapper.extract_type(nil).should == nil
147
147
  @mapper.extract_type(Date.today).should == :date
148
+ @mapper.extract_type(Time.now).should == :time
148
149
  @mapper.extract_type("Hi").should == :string
149
150
  end
150
151
  end
@@ -256,7 +257,7 @@ describe Solrizer::FieldMapper do
256
257
  @mapper.solr_names_and_values('foo', "6 Nov. 2012", [:dateable]).should == { 'foo_dtsi' =>["2012-11-06T00:00:00Z"] }
257
258
  @mapper.solr_names_and_values('foo', '', [:dateable]).should == { 'foo_dtsi' => [] }
258
259
  end
259
-
260
+
260
261
  it "should support displayable, facetable, sortable, unstemmed" do
261
262
  @mapper.solr_names_and_values('foo', 'bar', [:searchable, :displayable, :facetable, :sortable, :unstemmed_searchable]).should == {
262
263
  "foo_tesim" => ["bar"], #searchable
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+ require 'time'
3
+
4
+ describe Solrizer do
5
+ describe ".insert_field" do
6
+ describe "on an empty document" do
7
+ let(:doc) { Hash.new }
8
+ it "should insert a field with the default (searchable) indexer" do
9
+ Solrizer.insert_field(doc, 'foo', 'A name')
10
+ doc.should == {'foo_tesim' => ['A name']}
11
+ end
12
+ it "should insert a field with multiple indexers" do
13
+ Solrizer.insert_field(doc, 'foo', 'A name', :sortable, :facetable)
14
+ doc.should == {'foo_ssi' => ['A name'], 'foo_sim' => ['A name']}
15
+ end
16
+ it "should insert Dates" do
17
+ Solrizer.insert_field(doc, 'foo', Date.parse('2013-01-13'))
18
+ doc.should == {'foo_dtsi' => ["2013-01-13T00:00:00Z"]}
19
+ end
20
+ it "should insert Times" do
21
+ Solrizer.insert_field(doc, 'foo', Time.parse('2013-01-13T22:45:56+06:00'))
22
+ doc.should == {'foo_dtsi' => ["2013-01-13T16:45:56Z"]}
23
+ end
24
+
25
+ it "should insert multiple values" do
26
+ Solrizer.insert_field(doc, 'foo', ['A name', 'B name'], :sortable, :facetable)
27
+ doc.should == {'foo_ssi' => ['A name', 'B name'], 'foo_sim' => ['A name', 'B name']}
28
+ end
29
+ end
30
+
31
+ describe "on a document with values" do
32
+ before{ @doc = {'foo_ssi' => ['A name'], 'foo_sim' => ['A name']}}
33
+
34
+ it "should not overwrite values that exist before" do
35
+ Solrizer.insert_field(@doc, 'foo', 'B name', :sortable, :facetable)
36
+ @doc.should == {'foo_ssi' => ['A name', 'B name'], 'foo_sim' => ['A name', 'B name']}
37
+ end
38
+ end
39
+ end
40
+ describe ".set_field" do
41
+ describe "on a document with values" do
42
+ before{ @doc = {'foo_ssi' => ['A name'], 'foo_sim' => ['A name']}}
43
+
44
+ it "should overwrite values that exist before" do
45
+ Solrizer.set_field(@doc, 'foo', 'B name', :sortable, :facetable)
46
+ @doc.should == {'foo_ssi' => ['B name'], 'foo_sim' => ['B name']}
47
+ end
48
+ end
49
+ end
50
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solrizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.pre3
4
+ version: 3.0.0.pre4
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-25 00:00:00.000000000 Z
12
+ date: 2013-01-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -236,6 +236,7 @@ files:
236
236
  - spec/units/common_spec.rb
237
237
  - spec/units/extractor_spec.rb
238
238
  - spec/units/field_mapper_spec.rb
239
+ - spec/units/solrizer_spec.rb
239
240
  - spec/units/xml_extractor_spec.rb
240
241
  - spec/units/xml_terminology_based_solrizer_spec.rb
241
242
  homepage: http://github.com/projecthydra/solrizer
@@ -276,6 +277,7 @@ test_files:
276
277
  - spec/units/common_spec.rb
277
278
  - spec/units/extractor_spec.rb
278
279
  - spec/units/field_mapper_spec.rb
280
+ - spec/units/solrizer_spec.rb
279
281
  - spec/units/xml_extractor_spec.rb
280
282
  - spec/units/xml_terminology_based_solrizer_spec.rb
281
283
  has_rdoc: