rsolr-ext 0.10.1 → 0.11.0
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/README.rdoc +15 -0
- data/lib/rsolr-ext/request.rb +12 -0
- data/lib/rsolr-ext/response/docs.rb +44 -0
- data/lib/rsolr-ext/response/facets.rb +14 -7
- data/lib/rsolr-ext.rb +1 -1
- data/rsolr-ext.gemspec +4 -3
- data/test/connection_test.rb +3 -1
- data/test/request_test.rb +2 -2
- data/test/response_test.rb +32 -0
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -25,6 +25,13 @@ The #luke method returns a Hash/Mash result of a /admin/luke?numTerms=0 request:
|
|
25
25
|
===#find
|
26
26
|
The #find method listens for certain keys. All other keys are ignored, allowing the ability to mix-and-match special keys with normal Solr param keys. The recognized keys are describe below.
|
27
27
|
|
28
|
+
|
29
|
+
:page - This maps to the Solr "start" param. The current "page" in the results set. RSolr::Ext handles the page-to-rows math for you.
|
30
|
+
|
31
|
+
|
32
|
+
:per_page - This maps to the Solr "rows" param. How many "pages" in the result.
|
33
|
+
|
34
|
+
|
28
35
|
:queries - This key maps to the Solr "q" param. Accepts a string, array or hash. When an array is used, each value is joined by a space. When a hash is used, the keys are used as Solr fields.
|
29
36
|
|
30
37
|
* :queries => 'normal' BECOMES ?q=normal
|
@@ -66,6 +73,8 @@ The #find method listens for certain keys. All other keys are ignored, allowing
|
|
66
73
|
==Request Example
|
67
74
|
solr = RSolr::Ext.connect
|
68
75
|
solr_params = {
|
76
|
+
:page=>2,
|
77
|
+
:per_page=>10,
|
69
78
|
:phrases=>{:name=>'This is a phrase'},
|
70
79
|
:filters=>['test', {:price=>(1..10)}],
|
71
80
|
:phrase_filters=>{:manu=>['Apple']},
|
@@ -85,6 +94,8 @@ RSolr::Ext decorates the normal output hash from RSolr and adds some helpful met
|
|
85
94
|
response.ok?
|
86
95
|
response.params
|
87
96
|
response.docs
|
97
|
+
response.docs.previous_page
|
98
|
+
response.docs.next_page
|
88
99
|
response.facets.each do |facet|
|
89
100
|
puts facet.name
|
90
101
|
facet.items.each do |item|
|
@@ -94,6 +105,10 @@ RSolr::Ext decorates the normal output hash from RSolr and adds some helpful met
|
|
94
105
|
|
95
106
|
You can access values in the response hash using symbols or strings.
|
96
107
|
|
108
|
+
===Documents/Pagination
|
109
|
+
If you wanna paginate, just throw the collection into the WillPaginate view helper.
|
110
|
+
<%= will_paginate response.docs %>
|
111
|
+
|
97
112
|
==The "Model" Module
|
98
113
|
You can create your own <read-only> "models" using RSolr::Ext::Model
|
99
114
|
|
data/lib/rsolr-ext/request.rb
CHANGED
@@ -4,6 +4,18 @@ module RSolr::Ext::Request
|
|
4
4
|
|
5
5
|
def map input
|
6
6
|
output = {}
|
7
|
+
|
8
|
+
if input[:per_page]
|
9
|
+
output[:rows] = input.delete(:per_page).to_i
|
10
|
+
end
|
11
|
+
|
12
|
+
if page = input.delete(:page)
|
13
|
+
raise ':per_page must be set when using :page' unless output[:rows]
|
14
|
+
page = page.to_s.to_i-1
|
15
|
+
page = page < 1 ? 0 : page
|
16
|
+
output[:start] = page * output[:rows]
|
17
|
+
end
|
18
|
+
|
7
19
|
if queries = input.delete(:queries)
|
8
20
|
output[:q] = append_to_param output[:q], build_query(queries, false)
|
9
21
|
end
|
@@ -1,8 +1,52 @@
|
|
1
1
|
module RSolr::Ext::Response::Docs
|
2
2
|
|
3
|
+
module Pageable
|
4
|
+
|
5
|
+
attr_accessor :start, :per_page, :total
|
6
|
+
|
7
|
+
# Returns the current page calculated from 'rows' and 'start'
|
8
|
+
# WillPaginate hook
|
9
|
+
def current_page
|
10
|
+
return 1 if start < 1
|
11
|
+
per_page_normalized = per_page < 1 ? 1 : per_page
|
12
|
+
@current_page ||= (start / per_page_normalized).ceil + 1
|
13
|
+
end
|
14
|
+
|
15
|
+
# Calcuates the total pages from 'numFound' and 'rows'
|
16
|
+
# WillPaginate hook
|
17
|
+
def total_pages
|
18
|
+
@total_pages ||= per_page > 0 ? (total / per_page.to_f).ceil : 1
|
19
|
+
end
|
20
|
+
|
21
|
+
# returns the previous page number or 1
|
22
|
+
# WillPaginate hook
|
23
|
+
def previous_page
|
24
|
+
@previous_page ||= (current_page > 1) ? current_page - 1 : 1
|
25
|
+
end
|
26
|
+
|
27
|
+
# returns the next page number or the last
|
28
|
+
# WillPaginate hook
|
29
|
+
def next_page
|
30
|
+
@next_page ||= (current_page == total_pages) ? total_pages : current_page+1
|
31
|
+
end
|
32
|
+
|
33
|
+
def has_next?
|
34
|
+
current_page < total_pages
|
35
|
+
end
|
36
|
+
|
37
|
+
def has_previous?
|
38
|
+
current_page > 1
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
3
43
|
def self.extended(base)
|
4
44
|
d = base['response']['docs']
|
5
45
|
d.each{|doc| doc.extend RSolr::Ext::Doc }
|
46
|
+
d.extend Pageable
|
47
|
+
d.per_page = base['responseHeader']['params']['rows'].to_s.to_i
|
48
|
+
d.start = base['response']['start'].to_s.to_i
|
49
|
+
d.total = base['response']['numFound'].to_s.to_i
|
6
50
|
end
|
7
51
|
|
8
52
|
def docs
|
@@ -1,11 +1,19 @@
|
|
1
1
|
module RSolr::Ext::Response::Facets
|
2
2
|
|
3
3
|
# represents a facet value; which is a field value and its hit count
|
4
|
-
FacetItem
|
4
|
+
class FacetItem
|
5
|
+
attr_reader :value, :hits
|
6
|
+
def initialize value, hits
|
7
|
+
@value, @hits = value, hits
|
8
|
+
end
|
9
|
+
end
|
5
10
|
|
6
11
|
# represents a facet; which is a field and its values
|
7
|
-
FacetField
|
8
|
-
|
12
|
+
class FacetField
|
13
|
+
attr_reader :name, :items
|
14
|
+
def initialize name, items
|
15
|
+
@name, @items = name, items
|
16
|
+
end
|
9
17
|
end
|
10
18
|
|
11
19
|
# @response.facets.each do |facet|
|
@@ -16,11 +24,10 @@ module RSolr::Ext::Response::Facets
|
|
16
24
|
def facets
|
17
25
|
@facets ||= (
|
18
26
|
facet_fields.map do |(facet_field_name,values_and_hits)|
|
19
|
-
|
20
|
-
|
21
|
-
facet.items << FacetItem.new(values_and_hits[index*2], values_and_hits[index*2+1])
|
27
|
+
items = (values_and_hits.size/2).times.map do |index|
|
28
|
+
FacetItem.new(values_and_hits[index*2], values_and_hits[index*2+1])
|
22
29
|
end
|
23
|
-
|
30
|
+
FacetField.new(facet_field_name, items)
|
24
31
|
end
|
25
32
|
)
|
26
33
|
end
|
data/lib/rsolr-ext.rb
CHANGED
data/rsolr-ext.gemspec
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
|
+
|
2
3
|
s.name = "rsolr-ext"
|
3
|
-
s.version = "0.
|
4
|
-
s.date = "2009-11-
|
4
|
+
s.version = "0.11.0"
|
5
|
+
s.date = "2009-11-17"
|
5
6
|
|
6
7
|
s.summary = "An extension lib for RSolr"
|
7
8
|
s.email = "goodieboy@gmail.com"
|
@@ -34,6 +35,6 @@ Gem::Specification.new do |s|
|
|
34
35
|
|
35
36
|
s.extra_rdoc_files = %w(LICENSE README.rdoc)
|
36
37
|
|
37
|
-
s.add_dependency("rsolr", ["=0.
|
38
|
+
s.add_dependency("rsolr", ["=0.11.0"])
|
38
39
|
|
39
40
|
end
|
data/test/connection_test.rb
CHANGED
@@ -11,8 +11,10 @@ class RSolrExtConnectionTest < Test::Unit::TestCase
|
|
11
11
|
|
12
12
|
test 'the #find method' do
|
13
13
|
connection = RSolr::Ext.connect
|
14
|
-
response = connection.find :q=>'*:*'
|
14
|
+
response = connection.find 3, 10, :q=>'*:*'#, :page=>1, :per_page=>10
|
15
15
|
assert response.kind_of?(Mash)
|
16
|
+
#r = connection.find 3, 5, :q=>'*:*', :phrase_queries=>'rose'
|
17
|
+
#assert ! r.header[:params].include?(:phrase_queries)
|
16
18
|
end
|
17
19
|
|
18
20
|
test 'the #find method with a custom request handler' do
|
data/test/request_test.rb
CHANGED
@@ -5,8 +5,8 @@ class RSolrExtRequestTest < Test::Unit::TestCase
|
|
5
5
|
|
6
6
|
test 'standard request' do
|
7
7
|
solr_params = RSolr::Ext::Request.map(
|
8
|
-
:
|
9
|
-
:
|
8
|
+
:page=>'2',
|
9
|
+
:per_page=>'10',
|
10
10
|
:phrases=>{:name=>'This is a phrase'},
|
11
11
|
:filters=>['test', {:price=>(1..10)}],
|
12
12
|
:phrase_filters=>{:manu=>['Apple']},
|
data/test/response_test.rb
CHANGED
@@ -18,6 +18,8 @@ class RSolrExtResponseTest < Test::Unit::TestCase
|
|
18
18
|
assert r.ok?
|
19
19
|
assert_equal 11, r.docs.size
|
20
20
|
assert_equal 'EXPLICIT', r.params[:echoParams]
|
21
|
+
assert_equal 1, r.docs.previous_page
|
22
|
+
assert_equal 2, r.docs.next_page
|
21
23
|
#
|
22
24
|
assert r.kind_of?(RSolr::Ext::Response::Docs)
|
23
25
|
assert r.kind_of?(RSolr::Ext::Response::Facets)
|
@@ -47,6 +49,7 @@ class RSolrExtResponseTest < Test::Unit::TestCase
|
|
47
49
|
|
48
50
|
first_facet = r.facets.first
|
49
51
|
assert_equal 'cat', first_facet.name
|
52
|
+
|
50
53
|
assert_equal 10, first_facet.items.size
|
51
54
|
|
52
55
|
expected = first_facet.items.collect do |item|
|
@@ -71,4 +74,33 @@ class RSolrExtResponseTest < Test::Unit::TestCase
|
|
71
74
|
assert_equal 'cat', facet.name
|
72
75
|
end
|
73
76
|
|
77
|
+
=begin
|
78
|
+
|
79
|
+
# pagination for facets has been commented out in the response/facets module.
|
80
|
+
# ...need to think more about how this can be handled
|
81
|
+
|
82
|
+
test 'response::standard facets.paginate' do
|
83
|
+
raw_response = eval(mock_query_response)
|
84
|
+
raw_response['responseHeader']['params']['facet.offset'] = 1
|
85
|
+
raw_response['responseHeader']['params']['facet.limit'] = 2
|
86
|
+
|
87
|
+
r = RSolr::Ext::Response::Standard.new(raw_response)
|
88
|
+
|
89
|
+
assert_equal 2, r.facets.current_page
|
90
|
+
|
91
|
+
# always 1 less than facet.limit
|
92
|
+
assert_equal 1, r.facets.per_page
|
93
|
+
|
94
|
+
assert_equal 3, r.facets.next_page
|
95
|
+
|
96
|
+
assert_equal 1, r.facets.previous_page
|
97
|
+
|
98
|
+
# can't know how many pages there are with facets.... so we set it to -1
|
99
|
+
assert_equal -1, r.facets.total_pages
|
100
|
+
|
101
|
+
assert r.facets.has_next?
|
102
|
+
assert r.facets.has_previous?
|
103
|
+
end
|
104
|
+
=end
|
105
|
+
|
74
106
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rsolr-ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Mitchell
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-17 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - "="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.
|
23
|
+
version: 0.11.0
|
24
24
|
version:
|
25
25
|
description: An extension lib for RSolr
|
26
26
|
email: goodieboy@gmail.com
|