rsolr 1.0.0.beta4 → 1.0.0.beta5

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -26,6 +26,14 @@ The code docs can be viewed here : http://rdoc.info/projects/mwmitchell/rsolr
26
26
  # send a request to /catalog
27
27
  response = solr.get 'catalog', :params => {:q => '*:*'}
28
28
 
29
+ When the Solr :wt is :ruby, then the response will be a Hash. This Hash is the same object returned by Solr, but evaluated as Ruby. If the :wt is not :ruby, then the response will be a String.
30
+
31
+ The response also exposes 2 attribute readers (for any :wt value), :request and :response. Both are Hash objects with symbolized keys.
32
+
33
+ The :request attribute contains the original request context. You can use this for debugging or logging. Some of the keys this object contains are :uri, :query, :method etc..
34
+
35
+ The :response attribute contains the original response. This object contains the :status, :body and :headers keys.
36
+
29
37
  == Querying
30
38
  Use the #get / #post method to send search requests to the /select handler:
31
39
  response = solr.get 'select', :params => {
@@ -33,8 +41,10 @@ Use the #get / #post method to send search requests to the /select handler:
33
41
  :start=>0,
34
42
  :rows=>10
35
43
  }
44
+ response["response"]["docs"].each{|doc| puts doc["id"] }
36
45
 
37
- The :params sent into the method are sent to Solr as-is. When an array is used, multiple parameters *with the same name* are generated for the Solr query. Example:
46
+ The :params sent into the method are sent to Solr as-is, which is to say they are converted to Solr url style, but no special mapping is used.
47
+ When an array is used, multiple parameters *with the same name* are generated for the Solr query. Example:
38
48
 
39
49
  solr.get 'select', :params => {:q=>'roses', :fq=>['red', 'violet']}
40
50
 
@@ -42,6 +52,15 @@ The above statement generates this Solr query:
42
52
 
43
53
  select?q=roses&fq=red&fq=violet
44
54
 
55
+ ===Pagination
56
+ To paginate through a set of Solr documents, use the paginate method:
57
+ solr.paginate 1, 10, "select", :params => {:q => "test"}
58
+
59
+ The first argument is the current page, the second is how many documents to return for each page. In other words, "page" is the "start" Solr param and "per-page" is the "rows" Solr param.
60
+
61
+ The paginate method returns WillPaginate ready "docs" objects, so for example in a Rails application, paginating is as simple as:
62
+ <%= will_paginate @solr_response["response"]["docs"] %>
63
+
45
64
  ===Method Missing
46
65
  The RSolr::Client class also uses method_missing for setting the request handler/path:
47
66
 
@@ -50,13 +69,32 @@ The RSolr::Client class also uses method_missing for setting the request handler
50
69
  This is sent to Solr as:
51
70
  paintings?q=roses&fq=red&fq=violet
52
71
 
72
+ This works with pagination as well:
73
+
74
+ solr.paginate_paintings 1, 10, {:q=>'roses', :fq=>['red', 'violet']}
53
75
 
54
76
  ===Using POST for Search Queries
55
77
  There may be cases where the query string is too long for a GET request. RSolr solves this issue by converting hash objects into form-encoded strings:
56
- response = solr.post "select", :data => enormous_params_hash
78
+ response = solr.music :data => {:q => "*:*"}
57
79
 
58
80
  The :data hash is serialized as a form-encoded query string, and the correct content-type headers are sent along to Solr.
59
81
 
82
+ ===Sending HEAD Requests
83
+ There may be cases where you'd like to send a HEAD request to Solr:
84
+ solr.head("admin/ping").response[:status] == 200
85
+
86
+ ==Sending HTTP Headers
87
+ Solr responds to the request headers listed here: http://wiki.apache.org/solr/SolrAndHTTPCaches
88
+ To send header information to Solr using RSolr, just use the :headers option:
89
+ response = solr.head "admin/ping", :headers => {"Cache-Control" => "If-None-Match"}
90
+
91
+ ===Building a Request
92
+ RSolr::Client provides a method for building a request context, which can be useful for debugging or logging etc.:
93
+ request_context = solr.build_request "select", :data => {:q => "*:*"}, :method => :post, :headers => {}
94
+
95
+ To build a paginated request use build_paginated_request:
96
+ request_context = solr.build_paginated_request 1, 10, "select", ...
97
+
60
98
  == Updating Solr
61
99
  Updating is done using native Ruby objects. Hashes are used for single documents and arrays are used for a collection of documents (hashes). These objects get turned into simple XML "messages". Raw XML strings can also be used.
62
100
 
@@ -87,7 +125,7 @@ When adding, you can also supply "add" xml element attributes and/or a block for
87
125
 
88
126
  Now the "add_xml" object can be sent to Solr like:
89
127
  solr.update :data => add_xml
90
-
128
+
91
129
  ===Deleting
92
130
  Delete by id
93
131
  solr.delete_by_id 1
@@ -116,10 +154,6 @@ The default response format is Ruby. When the :wt param is set to :ruby, the res
116
154
  ===JSON:
117
155
  solr.get 'select', :params => {:wt => :json}
118
156
 
119
- ==Http Request Methods: +get+, +post+, and +head+
120
- RSolr can send GET, POST and HEAD requests to Solr:
121
- response = solr.head "admin"
122
-
123
157
  ==Related Resources & Projects
124
158
  * {RSolr Google Group}[http://groups.google.com/group/rsolr] -- The RSolr discussion group
125
159
  * {rsolr-ext}[http://github.com/mwmitchell/rsolr-ext] -- An extension kit for RSolr
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0.beta4
1
+ 1.0.0.beta5
@@ -38,8 +38,8 @@ module RSolr::Pagination
38
38
  protected
39
39
 
40
40
  # Checks if the called method starts
41
- # with "paginate_" and
42
- # converts the paginate_* to the solr
41
+ # with "paginate_*" and
42
+ # converts the * to the solr
43
43
  # request path. It then calls paginate
44
44
  # with the appropriate arguments.
45
45
  # If the called method doesn't
data/lib/rsolr/xml.rb CHANGED
@@ -74,7 +74,7 @@ module RSolr::Xml
74
74
 
75
75
  def build &block
76
76
  require 'builder'
77
- b = ::Builder::XmlMarkup.new(:indent=>0, :margin=>0, :encoding => 'UTF-8')
77
+ b = ::Builder::XmlMarkup.new(:indent => 0, :margin => 0, :encoding => 'UTF-8')
78
78
  b.instruct!
79
79
  block_given? ? yield(b) : b
80
80
  end
@@ -29,17 +29,16 @@ describe "RSolr::Client" do
29
29
 
30
30
  context "post" do
31
31
  include ClientHelper
32
- it "should pass the expected params to the connection's #post method" do
32
+ it "should pass the expected params to the connection's #execute method" do
33
+ request_opts = {:data => "the data", :method=>:post, :headers => {"Content-Type" => "text/plain"}}
33
34
  client.connection.should_receive(:execute).
34
- with(
35
- client, hash_including({:path => "update", :headers=>{"Content-Type"=>"text/plain"}, :method=>:post, :data=>"the data"})
36
- ).
37
- and_return(
38
- :body => "",
39
- :status => 200,
40
- :headers => {"Content-Type"=>"text/plain"}
41
- )
42
- client.post "update", :data => "the data", :method=>:post, :headers => {"Content-Type" => "text/plain"}
35
+ with(client, hash_including(request_opts)).
36
+ and_return(
37
+ :body => "",
38
+ :status => 200,
39
+ :headers => {"Content-Type"=>"text/plain"}
40
+ )
41
+ client.post "update", request_opts
43
42
  end
44
43
  end
45
44
 
@@ -55,15 +54,18 @@ describe "RSolr::Client" do
55
54
  it "should send xml to the connection's #post method" do
56
55
  client.connection.should_receive(:execute).
57
56
  with(
58
- client, hash_including({:path => "update", :headers=>{"Content-Type"=>"text/xml"}, :method=>:post, :data=>"<xml/>"})
57
+ client, hash_including({
58
+ :path => "update",
59
+ :headers => {"Content-Type"=>"text/xml"},
60
+ :method => :post,
61
+ :data => "<xml/>"
62
+ })
59
63
  ).
60
64
  and_return(
61
65
  :body => "",
62
66
  :status => 200,
63
67
  :headers => {"Content-Type"=>"text/xml"}
64
68
  )
65
- # the :xml attr is lazy loaded... so load it up first
66
- client.xml
67
69
  client.xml.should_receive(:add).
68
70
  with({:id=>1}, {:commitWith=>10}).
69
71
  and_return("<xml/>")
@@ -76,7 +78,12 @@ describe "RSolr::Client" do
76
78
  it "should send data to the connection's #post method" do
77
79
  client.connection.should_receive(:execute).
78
80
  with(
79
- client, hash_including({:path => "update", :headers=>{"Content-Type"=>"text/xml"}, :method=>:post, :data=>"<optimize/>"})
81
+ client, hash_including({
82
+ :path => "update",
83
+ :headers => {"Content-Type"=>"text/xml"},
84
+ :method => :post,
85
+ :data => "<optimize/>"
86
+ })
80
87
  ).
81
88
  and_return(
82
89
  :body => "",
@@ -93,7 +100,12 @@ describe "RSolr::Client" do
93
100
  it "should send a #{meth} message to the connection's #post method" do
94
101
  client.connection.should_receive(:execute).
95
102
  with(
96
- client, hash_including({:path => "update", :headers=>{"Content-Type"=>"text/xml"}, :method=>:post, :data=>"<?xml version=\"1.0\" encoding=\"UTF-8\"?><#{meth}/>"})
103
+ client, hash_including({
104
+ :path => "update",
105
+ :headers => {"Content-Type"=>"text/xml"},
106
+ :method => :post,
107
+ :data => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><#{meth}/>"
108
+ })
97
109
  ).
98
110
  and_return(
99
111
  :body => "",
@@ -110,7 +122,12 @@ describe "RSolr::Client" do
110
122
  it "should send data to the connection's #post method" do
111
123
  client.connection.should_receive(:execute).
112
124
  with(
113
- client, hash_including({:path => "update", :headers=>{"Content-Type"=>"text/xml"}, :method=>:post, :data=>"<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><id>1</id></delete>"})
125
+ client, hash_including({
126
+ :path => "update",
127
+ :headers => {"Content-Type"=>"text/xml"},
128
+ :method => :post,
129
+ :data => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><id>1</id></delete>"
130
+ })
114
131
  ).
115
132
  and_return(
116
133
  :body => "",
@@ -126,7 +143,12 @@ describe "RSolr::Client" do
126
143
  it "should send data to the connection's #post method" do
127
144
  client.connection.should_receive(:execute).
128
145
  with(
129
- client, hash_including({:path => "update", :headers=>{"Content-Type"=>"text/xml"}, :method=>:post, :data=>"<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><query fq=\"category:&quot;trash&quot;\"/></delete>"})
146
+ client, hash_including({
147
+ :path => "update",
148
+ :headers => {"Content-Type"=>"text/xml"},
149
+ :method => :post,
150
+ :data => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delete><query fq=\"category:&quot;trash&quot;\"/></delete>"
151
+ })
130
152
  ).
131
153
  and_return(
132
154
  :body => "",
@@ -142,18 +164,16 @@ describe "RSolr::Client" do
142
164
  it 'should not try to evaluate ruby when the :qt is not :ruby' do
143
165
  body = '{:time=>"NOW"}'
144
166
  result = client.adapt_response({:params=>{}}, {:status => 200, :body => body, :headers => {}})
145
- result.should be_a(String)
146
167
  result.should == body
147
168
  end
148
169
 
149
170
  it 'should evaluate ruby responses when the :wt is :ruby' do
150
171
  body = '{:time=>"NOW"}'
151
172
  result = client.adapt_response({:params=>{:wt=>:ruby}}, {:status => 200, :body => body, :headers => {}})
152
- result.should be_a(Hash)
153
173
  result.should == {:time=>"NOW"}
154
174
  end
155
175
 
156
- it "ought raise a RSolr::Error::InvalidRubyResponse when the ruby is indeed frugged" do
176
+ it "ought raise a RSolr::Error::InvalidRubyResponse when the ruby is indeed frugged, or even fruggified" do
157
177
  lambda {
158
178
  client.adapt_response({:params=>{:wt => :ruby}}, {:status => 200, :body => "<woops/>", :headers => {}})
159
179
  }.should raise_error RSolr::Error::InvalidRubyResponse
@@ -164,7 +184,12 @@ describe "RSolr::Client" do
164
184
  context "build_request" do
165
185
  include ClientHelper
166
186
  it 'should return a request context array' do
167
- result = client.build_request 'select', :method => :post, :params => {:q=>'test', :fq=>[0,1]}, :data => "data", :headers => {}
187
+ result = client.build_request('select',
188
+ :method => :post,
189
+ :params => {:q=>'test', :fq=>[0,1]},
190
+ :data => "data",
191
+ :headers => {}
192
+ )
168
193
  [/fq=0/, /fq=1/, /q=test/, /wt=ruby/].each do |pattern|
169
194
  result[:query].should match pattern
170
195
  end
@@ -173,7 +198,11 @@ describe "RSolr::Client" do
173
198
  end
174
199
 
175
200
  it "should set the Content-Type header to application/x-www-form-urlencoded if a hash is passed in to the data arg" do
176
- result = client.build_request 'select', :method => :post, :data => {:q=>'test', :fq=>[0,1]}, :headers => {}
201
+ result = client.build_request('select',
202
+ :method => :post,
203
+ :data => {:q=>'test', :fq=>[0,1]},
204
+ :headers => {}
205
+ )
177
206
  result[:query].should == "wt=ruby"
178
207
  [/fq=0/, /fq=1/, /q=test/].each do |pattern|
179
208
  result[:data].should match pattern
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+ describe "RSolr::Connection" do
3
+
4
+ # context "execute" do
5
+ # c = RSolr::Connection.new
6
+ # base_url = "http://localhost:8983/solr"
7
+ # client = RSolr::Client.new c, :url => base_url
8
+ # c.execute client, {:method => :get, :uri => URI.parse(base_url + "/select")}
9
+ # end
10
+
11
+ end
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+ describe "RSolr::Pagination" do
3
+
4
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ describe "RSolr" do
3
+
4
+ it "has a version that can be read via #version or VERSION" do
5
+ RSolr.version.should == RSolr::VERSION
6
+ end
7
+
8
+ it "can escape" do
9
+ RSolr.should be_a(RSolr::Char)
10
+ RSolr.escape("this string").should == "this\\ string"
11
+ end
12
+
13
+ context "connect" do
14
+ it "should return a RSolr::Client instance" do
15
+ RSolr.connect.should be_a(RSolr::Client)
16
+ end
17
+ end
18
+
19
+ end
metadata CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
6
6
  - 1
7
7
  - 0
8
8
  - 0
9
- - beta4
10
- version: 1.0.0.beta4
9
+ - beta5
10
+ version: 1.0.0.beta5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matt Mitchell
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-17 00:00:00 -04:00
18
+ date: 2010-10-28 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -88,8 +88,10 @@ summary: A Ruby client for Apache Solr
88
88
  test_files:
89
89
  - spec/api/char_spec.rb
90
90
  - spec/api/client_spec.rb
91
+ - spec/api/connection_spec.rb
91
92
  - spec/api/error_spec.rb
92
- - spec/api/http_spec.rb
93
+ - spec/api/pagination_spec.rb
94
+ - spec/api/rsolr_spec.rb
93
95
  - spec/api/uri_spec.rb
94
96
  - spec/api/xml_spec.rb
95
97
  - spec/spec_helper.rb
@@ -1,4 +0,0 @@
1
- require 'spec_helper'
2
- describe "RSolr::Http" do
3
-
4
- end