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 +1 -1
- data/lib/solrizer/default_descriptors.rb +3 -3
- data/lib/solrizer/descriptor.rb +2 -2
- data/lib/solrizer/field_mapper.rb +24 -20
- data/lib/solrizer/version.rb +1 -1
- data/lib/solrizer.rb +27 -0
- data/spec/units/field_mapper_spec.rb +2 -1
- data/spec/units/solrizer_spec.rb +50 -0
- metadata +4 -2
data/History.txt
CHANGED
@@ -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
|
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
|
data/lib/solrizer/descriptor.rb
CHANGED
@@ -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
|
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
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
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
|
-
|
192
|
-
|
193
|
-
|
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
|
-
|
201
|
+
single_value.to_s
|
196
202
|
end
|
197
|
-
|
198
|
-
|
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
|
data/lib/solrizer/version.rb
CHANGED
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.
|
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-
|
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:
|