xapian-fu 1.3.1 → 1.3.2
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/CHANGELOG.rdoc +4 -0
- data/lib/xapian_fu/query_parser.rb +9 -0
- data/lib/xapian_fu/version.rb +3 -0
- data/lib/xapian_fu/xapian_db.rb +4 -1
- data/lib/xapian_fu/xapian_doc_value_accessor.rb +9 -3
- data/spec/xapian_db_spec.rb +24 -0
- data/spec/xapian_doc_value_accessor_spec.rb +2 -2
- metadata +38 -11
- data/spec/spec.opts +0 -5
data/CHANGELOG.rdoc
CHANGED
@@ -96,6 +96,15 @@ module XapianFu #:nodoc:
|
|
96
96
|
fields.each do |name, type|
|
97
97
|
qp.add_prefix(name.to_s.downcase, "X" + name.to_s.upcase)
|
98
98
|
end
|
99
|
+
|
100
|
+
database.sortable_fields.each do |field, opts|
|
101
|
+
if opts[:range_prefix]
|
102
|
+
qp.add_valuerangeprocessor(Xapian::NumberValueRangeProcessor.new(XapianDocValueAccessor.value_key(field), opts[:range_prefix], true))
|
103
|
+
else
|
104
|
+
qp.add_valuerangeprocessor(Xapian::NumberValueRangeProcessor.new(XapianDocValueAccessor.value_key(field), opts[:range_postfix], false))
|
105
|
+
end
|
106
|
+
end if database
|
107
|
+
|
99
108
|
@query_parser = qp
|
100
109
|
end
|
101
110
|
end
|
data/lib/xapian_fu/xapian_db.rb
CHANGED
@@ -114,6 +114,7 @@ module XapianFu #:nodoc:
|
|
114
114
|
attr_reader :unindexed_fields
|
115
115
|
# Whether this db will generate a spelling dictionary during indexing
|
116
116
|
attr_reader :spelling
|
117
|
+
attr_reader :sortable_fields
|
117
118
|
|
118
119
|
def initialize( options = { } )
|
119
120
|
@options = { :index_positions => true, :spelling => true }.merge(options)
|
@@ -315,8 +316,9 @@ module XapianFu #:nodoc:
|
|
315
316
|
@fields = { }
|
316
317
|
@unindexed_fields = []
|
317
318
|
@store_values = []
|
319
|
+
@sortable_fields = {}
|
318
320
|
return nil if field_options.nil?
|
319
|
-
default_opts = {
|
321
|
+
default_opts = {
|
320
322
|
:store => true,
|
321
323
|
:index => true,
|
322
324
|
:type => String
|
@@ -332,6 +334,7 @@ module XapianFu #:nodoc:
|
|
332
334
|
opts = { :type => opts } unless opts.is_a? Hash
|
333
335
|
opts = default_opts.merge(opts)
|
334
336
|
@store_values << name if opts[:store]
|
337
|
+
@sortable_fields[name] = {:range_prefix => opts[:range_prefix], :range_postfix => opts[:range_postfix]} if opts[:sortable]
|
335
338
|
@unindexed_fields << name if opts[:index] == false
|
336
339
|
@fields[name] = opts[:type]
|
337
340
|
end
|
@@ -85,11 +85,17 @@ module XapianFu #:nodoc:
|
|
85
85
|
# <tt>from_xapian_fu_storage_value</tt> class method on retrieval.
|
86
86
|
def store(key, value, type = nil)
|
87
87
|
type = @doc.db.fields[key] if type.nil? and @doc.db
|
88
|
-
|
89
|
-
|
88
|
+
|
89
|
+
if @doc.db && @doc.db.sortable_fields.include?(key)
|
90
|
+
converted_value = Xapian.sortable_serialise(value)
|
90
91
|
else
|
91
|
-
|
92
|
+
if type and type.respond_to?(:to_xapian_fu_storage_value)
|
93
|
+
converted_value = type.to_xapian_fu_storage_value(value)
|
94
|
+
else
|
95
|
+
converted_value = value.to_s
|
96
|
+
end
|
92
97
|
end
|
98
|
+
|
93
99
|
@doc.xapian_document.add_value(XapianDocValueAccessor.value_key(key), converted_value)
|
94
100
|
value
|
95
101
|
end
|
data/spec/xapian_db_spec.rb
CHANGED
@@ -444,6 +444,30 @@ describe XapianDb do
|
|
444
444
|
doc.values.fetch(:age).should == "32"
|
445
445
|
end
|
446
446
|
|
447
|
+
it "should allow range searches on sortable values with prefixes" do
|
448
|
+
xdb = XapianDb.new(:fields => { :price => { :type => Integer, :sortable => true, :range_prefix => "$" } })
|
449
|
+
|
450
|
+
xdb << XapianDoc.new(:price => 10)
|
451
|
+
xdb << XapianDoc.new(:price => 20)
|
452
|
+
xdb << XapianDoc.new(:price => 15)
|
453
|
+
|
454
|
+
docs = xdb.search("$10..15")
|
455
|
+
|
456
|
+
docs.map { |d| d.id }.should == [1, 3]
|
457
|
+
end
|
458
|
+
|
459
|
+
it "should allow range searches on sortable values with postfixes" do
|
460
|
+
xdb = XapianDb.new(:fields => { :age => { :type => Integer, :sortable => true, :range_postfix => "y" } })
|
461
|
+
|
462
|
+
xdb << XapianDoc.new(:age => 32)
|
463
|
+
xdb << XapianDoc.new(:age => 40)
|
464
|
+
xdb << XapianDoc.new(:age => 35)
|
465
|
+
|
466
|
+
docs = xdb.search("32..35y")
|
467
|
+
|
468
|
+
docs.map { |d| d.id }.should == [1, 3]
|
469
|
+
end
|
470
|
+
|
447
471
|
it "should store values declared as to be collapsible" do
|
448
472
|
xdb = XapianDb.new(:collapsible => :group_id)
|
449
473
|
xdb << XapianDoc.new(:group_id => "666", :author => "Jim Jones")
|
@@ -72,7 +72,7 @@ describe XapianDocValueAccessor do
|
|
72
72
|
time = Time.now
|
73
73
|
doc = xdb.documents.new(:created_at => time)
|
74
74
|
doc.values.store(:created_at, time).should == time
|
75
|
-
doc.values.fetch(:created_at).should
|
75
|
+
doc.values.fetch(:created_at).should be_within(0.0001).of(time) # ignore milliseconds
|
76
76
|
doc.to_xapian_document.values.first.value.should == [time.utc.to_f].pack("G")
|
77
77
|
end
|
78
78
|
|
@@ -81,7 +81,7 @@ describe XapianDocValueAccessor do
|
|
81
81
|
datetime = DateTime.now
|
82
82
|
doc = xdb.documents.new(:created_at => datetime)
|
83
83
|
doc.values.store(:created_at, datetime).should == datetime
|
84
|
-
doc.values.fetch(:created_at).should
|
84
|
+
doc.values.fetch(:created_at).should be_within(0.0001).of(datetime) # miliseconds are not stored
|
85
85
|
doc.to_xapian_document.values.first.value.should == datetime.to_s
|
86
86
|
end
|
87
87
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xapian-fu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 1.3.
|
9
|
+
- 2
|
10
|
+
version: 1.3.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Leach
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-12-04 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rspec
|
@@ -23,16 +23,44 @@ dependencies:
|
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - ~>
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
hash:
|
28
|
+
hash: 19
|
29
29
|
segments:
|
30
|
-
-
|
31
|
-
-
|
30
|
+
- 2
|
31
|
+
- 7
|
32
32
|
- 0
|
33
|
-
version:
|
33
|
+
version: 2.7.0
|
34
34
|
type: :development
|
35
35
|
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rake
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
version: "0"
|
48
|
+
type: :development
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: rdoc
|
52
|
+
prerelease: false
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 3
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
type: :development
|
63
|
+
version_requirements: *id003
|
36
64
|
description: A library to provide a more Ruby-like interface to the Xapian search engine.
|
37
65
|
email: john@johnleach.co.uk
|
38
66
|
executables: []
|
@@ -47,6 +75,7 @@ files:
|
|
47
75
|
- lib/xapian_fu.rb
|
48
76
|
- lib/xapian_fu/xapian_doc_value_accessor.rb
|
49
77
|
- lib/xapian_fu/query_parser.rb
|
78
|
+
- lib/xapian_fu/version.rb
|
50
79
|
- lib/xapian_fu/xapian_db.rb
|
51
80
|
- lib/xapian_fu/xapian_documents_accessor.rb
|
52
81
|
- lib/xapian_fu/xapian_doc.rb
|
@@ -133,7 +162,6 @@ files:
|
|
133
162
|
- spec/xapian_doc_value_accessor_spec.rb
|
134
163
|
- spec/build_db_for_value_testing.rb
|
135
164
|
- spec/query_parser_spec.rb
|
136
|
-
- spec/spec.opts
|
137
165
|
homepage: http://github.com/johnl/xapian-fu
|
138
166
|
licenses: []
|
139
167
|
|
@@ -230,4 +258,3 @@ test_files:
|
|
230
258
|
- spec/xapian_doc_value_accessor_spec.rb
|
231
259
|
- spec/build_db_for_value_testing.rb
|
232
260
|
- spec/query_parser_spec.rb
|
233
|
-
- spec/spec.opts
|