xapian_db 0.4.0 → 0.4.1
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.md +9 -0
- data/lib/xapian_db/adapters/base_adapter.rb +4 -0
- data/lib/xapian_db/database.rb +4 -1
- data/lib/xapian_db/query_parser.rb +1 -0
- data/lib/xapian_db/resultset.rb +14 -10
- metadata +3 -3
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
##0.4.1 (December 16th, 2010)
|
2
|
+
|
3
|
+
Bugfixes:
|
4
|
+
|
5
|
+
- fixed the handling of invalid page arguments in resultset.paginate. Invalid page arguments return
|
6
|
+
an empty result set
|
7
|
+
- searches with an empty search expression do not raise an exception anymore and return an empty
|
8
|
+
resultset
|
9
|
+
|
1
10
|
##0.4.0 (December 15th, 2010)
|
2
11
|
|
3
12
|
Features:
|
@@ -23,6 +23,10 @@ module XapianDb
|
|
23
23
|
# - :order (Array<Symbol>) Accepts an array of attribute names for sorting
|
24
24
|
# - :sort_decending (Boolean) Allows to reverse the sorting
|
25
25
|
define_singleton_method(:search) do |expression, options={}|
|
26
|
+
|
27
|
+
# return an empty search if no search expression is given
|
28
|
+
return XapianDb.database.search(nil) if expression.nil? || expression.strip.empty?
|
29
|
+
|
26
30
|
options = {:sort_decending => false}.merge options
|
27
31
|
class_scope = "indexed_class:#{klass.name.downcase}"
|
28
32
|
|
data/lib/xapian_db/database.rb
CHANGED
@@ -61,9 +61,12 @@ module XapianDb
|
|
61
61
|
opts = {:per_page => 10, :sort_decending => false}.merge(options)
|
62
62
|
@query_parser ||= QueryParser.new(self)
|
63
63
|
query = @query_parser.parse(expression)
|
64
|
+
|
65
|
+
# If we do not have a valid query we return an empty result set
|
66
|
+
return Resultset.new(nil, opts) unless query
|
67
|
+
|
64
68
|
enquiry = Xapian::Enquire.new(reader)
|
65
69
|
enquiry.query = query
|
66
|
-
|
67
70
|
if opts[:sort_indices]
|
68
71
|
raise ArgumentError.new("Sorting is available for class scoped searches only") unless expression =~ /^indexed_class:/
|
69
72
|
sorter = Xapian::MultiValueSorter.new
|
@@ -26,6 +26,7 @@ module XapianDb
|
|
26
26
|
# Parse an expression
|
27
27
|
# @return [Xapian::Query] The query object (see http://xapian.org/docs/apidoc/html/classXapian_1_1Query.html)
|
28
28
|
def parse(expression)
|
29
|
+
return nil if expression.nil? || expression.strip.empty?
|
29
30
|
parser = Xapian::QueryParser.new
|
30
31
|
parser.database = @db.reader
|
31
32
|
parser.default_op = Xapian::Query::OP_AND # Could be made configurable
|
data/lib/xapian_db/resultset.rb
CHANGED
@@ -31,26 +31,31 @@ module XapianDb
|
|
31
31
|
attr_accessor :spelling_suggestion
|
32
32
|
|
33
33
|
# Constructor
|
34
|
-
# @param [Xapian::Enquire] enquiry a Xapian query result (see http://xapian.org/docs/apidoc/html/classXapian_1_1Enquire.html)
|
34
|
+
# @param [Xapian::Enquire] enquiry a Xapian query result (see http://xapian.org/docs/apidoc/html/classXapian_1_1Enquire.html).
|
35
|
+
# Pass nil to get an empty result set.
|
35
36
|
# @param [Hash] options
|
36
37
|
# @option options [Integer] :per_page (10) How many docs per page?
|
37
38
|
# @option options [String] :spelling_suggestion (nil) The spelling corrected query (if a language is configured)
|
38
39
|
def initialize(enquiry, options)
|
39
40
|
@enquiry = enquiry
|
40
|
-
|
41
|
-
|
41
|
+
if @enquiry.nil?
|
42
|
+
@size = 0
|
43
|
+
else
|
44
|
+
# To get more accurate results, we pass the doc count to the mset method
|
45
|
+
@size = enquiry.mset(0, options[:db_size]).matches_estimated
|
46
|
+
end
|
42
47
|
@spelling_suggestion = options[:spelling_suggestion]
|
43
48
|
@per_page = options[:per_page]
|
44
|
-
@total_pages = (@size / @per_page.to_f).ceil
|
49
|
+
@total_pages = @size == 0 ? 0 : (@size / @per_page.to_f).ceil
|
45
50
|
@current_page = 1
|
46
51
|
end
|
47
52
|
|
48
53
|
# Paginate the result
|
49
|
-
# @param [Hash]
|
50
|
-
# @option
|
51
|
-
def paginate(
|
52
|
-
|
53
|
-
@current_page
|
54
|
+
# @param [Hash] options Options for the persistent database
|
55
|
+
# @option options [Integer] :page (1) The page to access
|
56
|
+
def paginate(options={})
|
57
|
+
@current_page = options[:page] ? options[:page].to_i : 1
|
58
|
+
return [] if @current_page < 1 || @current_page > @total_pages
|
54
59
|
build_page(@current_page)
|
55
60
|
end
|
56
61
|
|
@@ -71,7 +76,6 @@ module XapianDb
|
|
71
76
|
# Build a page of Xapian documents
|
72
77
|
# @return [Array<Xapian::Document>] An array of xapian documents
|
73
78
|
def build_page(page)
|
74
|
-
page.nil? ? page = 1 : page = page.to_i
|
75
79
|
docs = []
|
76
80
|
offset = (page - 1) * @per_page
|
77
81
|
return [] if offset > @size
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 4
|
8
|
-
-
|
9
|
-
version: 0.4.
|
8
|
+
- 1
|
9
|
+
version: 0.4.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Gernot Kogler
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-16 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|