xapian_db 1.3.5.4 → 1.3.7.4
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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +252 -201
- data/README.rdoc +34 -4
- data/lib/type_codec.rb +3 -3
- data/lib/xapian_db.rb +4 -5
- data/lib/xapian_db/adapters/active_record_adapter.rb +7 -6
- data/lib/xapian_db/config.rb +17 -1
- data/lib/xapian_db/database.rb +17 -2
- data/lib/xapian_db/document_blueprint.rb +62 -10
- data/lib/xapian_db/index_writers/beanstalk_worker.rb +2 -3
- data/lib/xapian_db/index_writers/beanstalk_writer.rb +2 -2
- data/lib/xapian_db/index_writers/direct_writer.rb +6 -6
- data/lib/xapian_db/index_writers/no_op_writer.rb +2 -2
- data/lib/xapian_db/index_writers/resque_worker.rb +1 -2
- data/lib/xapian_db/index_writers/resque_writer.rb +2 -3
- data/lib/xapian_db/index_writers/sidekiq_worker.rb +1 -1
- data/lib/xapian_db/index_writers/sidekiq_writer.rb +2 -3
- data/lib/xapian_db/index_writers/transactional_writer.rb +2 -4
- data/lib/xapian_db/indexer.rb +1 -0
- data/lib/xapian_db/query_parser.rb +13 -3
- data/lib/xapian_db/resultset.rb +14 -6
- metadata +28 -14
@@ -22,7 +22,7 @@ module XapianDb
|
|
22
22
|
def index(options)
|
23
23
|
klass = constantize options['class']
|
24
24
|
obj = klass.respond_to?('get') ? klass.get(options['id']) : klass.find(options['id'])
|
25
|
-
DirectWriter.index obj
|
25
|
+
DirectWriter.index obj, true, changed_attrs: options[:changed_attrs]
|
26
26
|
end
|
27
27
|
|
28
28
|
def delete_doc(options)
|
@@ -34,7 +34,6 @@ module XapianDb
|
|
34
34
|
DirectWriter.reindex_class klass, :verbose => false
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
38
37
|
end
|
39
38
|
end
|
40
39
|
end
|
@@ -12,8 +12,8 @@ module XapianDb
|
|
12
12
|
|
13
13
|
# Update an object in the index
|
14
14
|
# @param [Object] obj An instance of a class with a blueprint configuration
|
15
|
-
def index(obj, commit=true)
|
16
|
-
Resque.enqueue worker_class, :index, :class => obj.class.name, :id => obj.id
|
15
|
+
def index(obj, commit=true, changed_attrs: [])
|
16
|
+
Resque.enqueue worker_class, :index, :class => obj.class.name, :id => obj.id, changed_attrs: changed_attrs
|
17
17
|
end
|
18
18
|
|
19
19
|
# Remove an object from the index
|
@@ -33,7 +33,6 @@ module XapianDb
|
|
33
33
|
end
|
34
34
|
private :worker_class
|
35
35
|
end
|
36
|
-
|
37
36
|
end
|
38
37
|
end
|
39
38
|
end
|
@@ -26,7 +26,7 @@ module XapianDb
|
|
26
26
|
def index(options)
|
27
27
|
klass = constantize options['class']
|
28
28
|
obj = klass.respond_to?('get') ? klass.get(options['id']) : klass.find(options['id'])
|
29
|
-
DirectWriter.index obj
|
29
|
+
DirectWriter.index obj, true, changed_attrs: options[:changed_attrs]
|
30
30
|
end
|
31
31
|
|
32
32
|
def delete_doc(options)
|
@@ -16,8 +16,8 @@ module XapianDb
|
|
16
16
|
|
17
17
|
# Update an object in the index
|
18
18
|
# @param [Object] obj An instance of a class with a blueprint configuration
|
19
|
-
def index(obj, commit=true)
|
20
|
-
Sidekiq::Client.enqueue worker_class, :index, :class => obj.class.name, :id => obj.id
|
19
|
+
def index(obj, commit=true, changed_attrs: [])
|
20
|
+
Sidekiq::Client.enqueue worker_class, :index, :class => obj.class.name, :id => obj.id, :changed_attrs => changed_attrs
|
21
21
|
end
|
22
22
|
|
23
23
|
# Remove an object from the index
|
@@ -37,7 +37,6 @@ module XapianDb
|
|
37
37
|
end
|
38
38
|
private :worker_class
|
39
39
|
end
|
40
|
-
|
41
40
|
end
|
42
41
|
end
|
43
42
|
end
|
@@ -20,7 +20,7 @@ module XapianDb
|
|
20
20
|
|
21
21
|
# Update an object in the index
|
22
22
|
# @param [Object] obj An instance of a class with a blueprint configuration
|
23
|
-
def index(obj, commit=false)
|
23
|
+
def index(obj, commit=false, changed_attrs: [])
|
24
24
|
@index_requests << obj
|
25
25
|
end
|
26
26
|
|
@@ -45,8 +45,6 @@ module XapianDb
|
|
45
45
|
@delete_requests.each { |xapian_id| writer.delete_doc_with xapian_id, false }
|
46
46
|
XapianDb.database.commit
|
47
47
|
end
|
48
|
-
|
49
48
|
end
|
50
|
-
|
51
49
|
end
|
52
|
-
end
|
50
|
+
end
|
data/lib/xapian_db/indexer.rb
CHANGED
@@ -86,6 +86,7 @@ module XapianDb
|
|
86
86
|
values = get_values_to_index_from obj
|
87
87
|
values.each do |value|
|
88
88
|
terms = value.to_s.downcase
|
89
|
+
terms = @blueprint.preprocess_terms.call(terms) if @blueprint.preprocess_terms
|
89
90
|
terms = split(terms) if XapianDb::Config.term_splitter_count > 0 && !options.no_split
|
90
91
|
# Add value with field name
|
91
92
|
term_generator.index_text(terms, options.weight, "X#{method.upcase}") if options.prefixed
|
@@ -35,6 +35,10 @@ module XapianDb
|
|
35
35
|
|
36
36
|
# Add the searchable prefixes to allow searches by field
|
37
37
|
# (like "name:Kogler")
|
38
|
+
processors = [] # The reason for having a seemingly useless "processors" array is as follows:
|
39
|
+
# We need to add a reference to the generated Xapian::XYValueRangeProcessor objects to the scope that calls parser.parse_query.
|
40
|
+
# If we don't, the Ruby GC will often garbage collect the generated objects before parser.parse_query can be called,
|
41
|
+
# which would free the memory of the corresponding C++ objects and result in segmentation faults upon calling parse_query.
|
38
42
|
XapianDb::DocumentBlueprint.searchable_prefixes.each do |prefix|
|
39
43
|
parser.add_prefix(prefix.to_s.downcase, "X#{prefix.to_s.upcase}")
|
40
44
|
type_info = XapianDb::DocumentBlueprint.type_info_for(prefix)
|
@@ -42,11 +46,17 @@ module XapianDb
|
|
42
46
|
value_number = XapianDb::DocumentBlueprint.value_number_for(prefix)
|
43
47
|
case type_info
|
44
48
|
when :date
|
45
|
-
|
49
|
+
processor = Xapian::DateValueRangeProcessor.new(value_number, "#{prefix}:")
|
50
|
+
processors << processor
|
51
|
+
parser.add_valuerangeprocessor(processor)
|
46
52
|
when :number
|
47
|
-
|
53
|
+
processor = Xapian::NumberValueRangeProcessor.new(value_number, "#{prefix}:")
|
54
|
+
processors << processor
|
55
|
+
parser.add_valuerangeprocessor(processor)
|
48
56
|
when :string
|
49
|
-
|
57
|
+
processor = Xapian::StringValueRangeProcessor.new(value_number, "#{prefix}:")
|
58
|
+
processors << processor
|
59
|
+
parser.add_valuerangeprocessor(processor)
|
50
60
|
end
|
51
61
|
end
|
52
62
|
query = parser.parse_query(expression, @query_flags)
|
data/lib/xapian_db/resultset.rb
CHANGED
@@ -46,6 +46,7 @@ module XapianDb
|
|
46
46
|
# @param [Hash] options
|
47
47
|
# @option options [Integer] :db_size The current size (nr of docs) of the database
|
48
48
|
# @option options [Integer] :limit The maximum number of documents to retrieve
|
49
|
+
# @option options [Integer] :offset The index of the first result to retrieve
|
49
50
|
# @option options [Integer] :page (1) The page number to retrieve
|
50
51
|
# @option options [Integer] :per_page (10) How many docs per page? Ignored if a limit option is given
|
51
52
|
# @option options [String] :spelling_suggestion (nil) The spelling corrected query (if a language is configured)
|
@@ -56,25 +57,32 @@ module XapianDb
|
|
56
57
|
db_size = params.delete :db_size
|
57
58
|
@spelling_suggestion = params.delete :spelling_suggestion
|
58
59
|
limit = params.delete :limit
|
60
|
+
offset = params.delete :offset
|
59
61
|
page = params.delete :page
|
60
62
|
per_page = params.delete :per_page
|
61
63
|
raise ArgumentError.new "unsupported options for resultset: #{params}" if params.size > 0
|
62
64
|
raise ArgumentError.new "db_size option is required" unless db_size
|
63
65
|
|
66
|
+
unless (page.nil? && per_page.nil?) || (limit.nil? && offset.nil?)
|
67
|
+
raise ArgumentError.new "Impossible combination of parameters. Either pass page and/or per_page, or limit and/or offset."
|
68
|
+
end
|
69
|
+
|
70
|
+
calculated_page = offset.nil? || limit.nil? ? nil : (offset.to_f / limit.to_f) + 1
|
71
|
+
|
64
72
|
limit = limit.nil? ? db_size : limit.to_i
|
65
|
-
per_page = per_page.nil? ? limit : per_page.to_i
|
66
|
-
page = page.nil? ? 1 : page.to_i
|
67
|
-
offset = (page - 1) * per_page
|
68
|
-
count
|
73
|
+
per_page = per_page.nil? ? limit.to_i : per_page.to_i
|
74
|
+
page = page.nil? ? (calculated_page.nil? ? 1 : calculated_page) : page.to_i
|
75
|
+
offset = offset.nil? ? (page - 1) * per_page : offset.to_i
|
76
|
+
count = per_page < limit ? per_page : limit
|
69
77
|
|
78
|
+
return build_empty_resultset if (page - 1) * per_page > db_size
|
70
79
|
result_window = enquiry.mset(offset, count)
|
71
80
|
@hits = result_window.matches_estimated
|
72
81
|
return build_empty_resultset if @hits == 0
|
73
|
-
raise ArgumentError.new "page #{@page} does not exist" if @hits > 0 && offset >= limit
|
74
82
|
|
75
83
|
self.replace result_window.matches.map{|match| decorate(match).document}
|
76
84
|
@total_pages = (@hits / per_page.to_f).ceil
|
77
|
-
@current_page = page
|
85
|
+
@current_page = (page == page.to_i) ? page.to_i : page
|
78
86
|
@limit_value = per_page
|
79
87
|
end
|
80
88
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xapian_db
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.7.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gernot Kogler
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: daemons
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 2.
|
47
|
+
version: 2.99.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 2.
|
54
|
+
version: 2.99.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: simplecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,14 +142,14 @@ dependencies:
|
|
142
142
|
requirements:
|
143
143
|
- - '='
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 1.2.
|
145
|
+
version: 1.2.22
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - '='
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: 1.2.
|
152
|
+
version: 1.2.22
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: pry-rails
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,9 +164,23 @@ dependencies:
|
|
164
164
|
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: descendants_tracker
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
167
181
|
description: XapianDb is a ruby gem that combines features of nosql databases and
|
168
182
|
fulltext indexing. It is based on Xapian, an efficient and powerful indexing library
|
169
|
-
email: gernot
|
183
|
+
email: gernot (at) kogler-informatik (dot) ch
|
170
184
|
executables: []
|
171
185
|
extensions: []
|
172
186
|
extra_rdoc_files: []
|
@@ -221,11 +235,11 @@ files:
|
|
221
235
|
- lib/xapian_db/utilities.rb
|
222
236
|
- tasks/spec.rake
|
223
237
|
- tasks/xapian_rebuild_index.rake
|
224
|
-
homepage: https://github.com/
|
238
|
+
homepage: https://github.com/gernotkogler/xapian_db
|
225
239
|
licenses:
|
226
240
|
- MIT
|
227
241
|
metadata: {}
|
228
|
-
post_install_message:
|
242
|
+
post_install_message:
|
229
243
|
rdoc_options:
|
230
244
|
- "--line-numbers"
|
231
245
|
- "--inline-source"
|
@@ -239,16 +253,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
239
253
|
requirements:
|
240
254
|
- - ">="
|
241
255
|
- !ruby/object:Gem::Version
|
242
|
-
version:
|
256
|
+
version: 2.3.0
|
243
257
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
244
258
|
requirements:
|
245
259
|
- - ">="
|
246
260
|
- !ruby/object:Gem::Version
|
247
261
|
version: 1.3.6
|
248
262
|
requirements: []
|
249
|
-
rubyforge_project:
|
250
|
-
rubygems_version: 2.
|
251
|
-
signing_key:
|
263
|
+
rubyforge_project:
|
264
|
+
rubygems_version: 2.7.6
|
265
|
+
signing_key:
|
252
266
|
specification_version: 4
|
253
267
|
summary: Ruby library to use a Xapian db as a key/value store with high performance
|
254
268
|
fulltext search
|