mwmitchell-rsolr 0.9.1 → 0.9.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +20 -0
- data/LICENSE +1 -55
- data/README.rdoc +61 -61
- data/Rakefile +17 -17
- data/examples/direct.rb +3 -1
- data/examples/http.rb +8 -6
- data/lib/rsolr/{adapter → connection/adapter}/direct.rb +3 -2
- data/lib/rsolr/{adapter → connection/adapter}/http.rb +5 -6
- data/lib/rsolr/connection.rb +103 -102
- data/lib/rsolr/http_client/adapter/curb.rb +2 -2
- data/lib/rsolr/http_client/adapter/net_http.rb +2 -2
- data/lib/rsolr/http_client.rb +55 -69
- data/lib/rsolr/message/{builders → adapter}/builder.rb +1 -1
- data/lib/rsolr/message/{builders → adapter}/libxml.rb +1 -1
- data/lib/rsolr/message.rb +20 -13
- data/lib/rsolr.rb +30 -23
- data/rsolr.gemspec +8 -9
- data/test/connection/direct_test.rb +3 -3
- data/test/connection/http_test.rb +1 -1
- data/test/connection/test_methods.rb +1 -1
- data/test/http_client/curb_test.rb +1 -1
- data/test/http_client/net_http_test.rb +1 -1
- data/test/http_client/test_methods.rb +1 -1
- data/test/http_client/util_test.rb +51 -8
- data/test/message_test.rb +18 -15
- metadata +8 -10
- data/lib/rsolr/adapter.rb +0 -6
- data/lib/rsolr/http_client/adapter.rb +0 -6
- data/lib/rsolr/message/builders.rb +0 -6
data/CHANGES.txt
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
0.9.5 - September 4, 2009
|
2
|
+
Removed Array #extract_options!
|
3
|
+
Removed the Connection #send_request method (now #request)
|
4
|
+
Removed the Connection #select method -- still works, but this now ends up calling Connection #method_missing
|
5
|
+
Removed HTTPClient::Connector
|
6
|
+
- HTTPClient now uses a method called #connect (like RSolr.connect)
|
7
|
+
- This method accepts 1 or 2 args, see the #connect method comments
|
8
|
+
Changed the way the HTTP client adapter is set. Now just pass in when connecting:
|
9
|
+
- RSolr.connect(:http, :adapter=>curb, :url=>'http://solr.com')
|
10
|
+
Moved Message::Builders to Message::Adapter
|
11
|
+
Made Connection a module and moved class methods to "Base" class
|
12
|
+
Made HTTPClient a module and moved class methods to "Base" class
|
13
|
+
Removed the "adapter.rb" files -- Adapter modules are defined in the parent module file.
|
14
|
+
Moved Message module/singleton functionality to Message::Builder class
|
15
|
+
XML message adapter API change: no longer a singleton, must instantiate Message::Builder
|
16
|
+
Made RSolr::Connection #message public -- can change the adapter as needed; connection.message.adapter = RSolr::Message::Adapter::LibXML.new
|
17
|
+
More tests for HTTPClient::Util
|
18
|
+
Simplified url/query building in HTTPClient::Util
|
19
|
+
Updated tests accordingly
|
20
|
+
|
1
21
|
0.9.1 - July 22, 2009
|
2
22
|
Added LibXml builder support (Thanks to Mat Brown - github.com/outoftime)
|
3
23
|
|
data/LICENSE
CHANGED
@@ -10,58 +10,4 @@ Unless required by applicable law or agreed to in writing, software
|
|
10
10
|
distributed under the License is distributed on an "AS IS" BASIS,
|
11
11
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
12
|
See the License for the specific language governing permissions and
|
13
|
-
limitations under the License.
|
14
|
-
|
15
|
-
========================================================================
|
16
|
-
|
17
|
-
For use of the lib/Mash/extlib code:
|
18
|
-
|
19
|
-
========================================================================
|
20
|
-
|
21
|
-
Copyright (c) 2008 Sam Smoot.
|
22
|
-
|
23
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
24
|
-
a copy of this software and associated documentation files (the
|
25
|
-
"Software"), to deal in the Software without restriction, including
|
26
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
27
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
28
|
-
permit persons to whom the Software is furnished to do so, subject to
|
29
|
-
the following conditions:
|
30
|
-
|
31
|
-
The above copyright notice and this permission notice shall be
|
32
|
-
included in all copies or substantial portions of the Software.
|
33
|
-
|
34
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
35
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
36
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
37
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
38
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
39
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
40
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
41
|
-
|
42
|
-
---
|
43
|
-
---
|
44
|
-
|
45
|
-
Some portions of blank.rb and mash.rb are verbatim copies of software
|
46
|
-
licensed under the MIT license. That license is included below:
|
47
|
-
|
48
|
-
Copyright (c) 2005-2008 David Heinemeier Hansson
|
49
|
-
|
50
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
51
|
-
a copy of this software and associated documentation files (the
|
52
|
-
"Software"), to deal in the Software without restriction, including
|
53
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
54
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
55
|
-
permit persons to whom the Software is furnished to do so, subject to
|
56
|
-
the following conditions:
|
57
|
-
|
58
|
-
The above copyright notice and this permission notice shall be
|
59
|
-
included in all copies or substantial portions of the Software.
|
60
|
-
|
61
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
62
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
63
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
64
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
65
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
66
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
67
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
13
|
+
limitations under the License.
|
data/README.rdoc
CHANGED
@@ -1,83 +1,79 @@
|
|
1
1
|
=RSolr
|
2
2
|
|
3
|
-
A Ruby client for Apache Solr.
|
3
|
+
A Ruby client for Apache Solr. RSolr has been developed to be simple and extendable. It features transparent JRuby DirectSolrConnection support and a simple Hash-in, Hash-out architecture.
|
4
4
|
|
5
|
-
==Installation:
|
5
|
+
== Installation:
|
6
6
|
gem sources -a http://gems.github.com
|
7
7
|
sudo gem install mwmitchell-rsolr
|
8
8
|
|
9
|
-
==
|
10
|
-
|
9
|
+
==Related Resources & Projects
|
10
|
+
* {Solr}[http://lucene.apache.org/solr/]
|
11
|
+
* {RSolr Google Group}[http://groups.google.com/group/rsolr]
|
12
|
+
* {RSolr::Ext}[http://github.com/mwmitchell/rsolr-ext] -- an extension kit for RSolr
|
13
|
+
* {Sunspot}[http://github.com/outoftime/sunspot] -- an awesome Solr DSL, built with RSolr
|
14
|
+
* {Blacklight}[http://blacklightopac.org] -- a next generation Library OPAC, built with RSolr
|
15
|
+
* {solr-ruby}[http://wiki.apache.org/solr/solr-ruby] -- the original Solr Ruby Gem
|
11
16
|
|
12
|
-
==
|
13
|
-
http://github.com/mwmitchell/rsolr-ext
|
14
|
-
http://wiki.apache.org/solr/solr-ruby
|
15
|
-
|
16
|
-
==Simple usage:
|
17
|
+
== Simple usage:
|
17
18
|
require 'rubygems'
|
18
19
|
require 'rsolr'
|
19
|
-
|
20
|
+
solr = RSolr.connect :url=>'http://solrserver.com'
|
20
21
|
|
21
|
-
#
|
22
|
-
response = rsolr.select
|
22
|
+
# send a request to /select
|
23
|
+
response = rsolr.select :q=>'*:*'
|
23
24
|
|
24
25
|
# send a request to a custom request handler; /catalog
|
25
|
-
response = rsolr.
|
26
|
+
response = rsolr.request '/catalog', :q=>'*:*'
|
26
27
|
|
27
|
-
# alternative to above
|
28
|
+
# alternative to above:
|
28
29
|
response = rsolr.catalog :q=>'*:*'
|
29
|
-
|
30
|
-
To run tests:
|
31
|
-
|
32
|
-
Copy an Apache Solr 1.3.0/or later (http://apache.seekmeup.com/lucene/solr/1.3.0/) distribution into this directory and rename to "apache-solr"
|
33
|
-
Start Solr HTTP: rake rsolr:start_test_server
|
34
|
-
MRI Ruby: rake
|
35
|
-
JRuby: jruby -S rake
|
36
|
-
|
37
|
-
To get a connection in MRI/standard Ruby:
|
38
30
|
|
39
|
-
|
40
|
-
|
41
|
-
To change the Solr HTTP host:
|
31
|
+
To use a DirectSolrConnection (no http) in JRuby:
|
42
32
|
|
43
|
-
solr = RSolr.connect(:
|
44
|
-
|
45
|
-
To get a direct connection (no http) in jRuby using DirectSolrConnection:
|
46
|
-
|
47
|
-
solr = RSolr.connect({
|
48
|
-
:adapter=>:direct,
|
33
|
+
solr = RSolr.connect(:direct,
|
49
34
|
:home_dir=>'/path/to/solr/home',
|
50
35
|
:dist_dir=>'/path/to/solr/distribution'
|
51
|
-
|
36
|
+
)
|
52
37
|
|
53
|
-
|
54
|
-
Once you have a connection, you can execute queries, updates etc..
|
38
|
+
For more information about DirecSolrConnection, see the {API}[http://lucene.apache.org/solr/api/org/apache/solr/servlet/DirectSolrConnection.html].
|
55
39
|
|
56
|
-
|
40
|
+
|
41
|
+
== Querying
|
57
42
|
Use the #select method to send requests to the /select handler:
|
58
43
|
response = solr.select({
|
59
44
|
:q=>'washington',
|
60
45
|
:start=>0,
|
61
46
|
:rows=>10
|
62
47
|
})
|
48
|
+
|
49
|
+
The params sent into the method are sent to Solr as-is. The one exception is if a value is an array. When an array is used, multiple parameters are generated for the Solr query. Example:
|
63
50
|
|
64
|
-
|
65
|
-
response = solr.send_request('/documents', {:q=>'test'})
|
51
|
+
solr.select :q=>'roses', :fq=>['red', 'violet']
|
66
52
|
|
53
|
+
The above statement generates this Solr query:
|
54
|
+
|
55
|
+
?q=roses&fq=red&fq=violet
|
56
|
+
|
57
|
+
Use the #request method for a custom request handler path:
|
58
|
+
response = solr.request '/documents', :q=>'test'
|
59
|
+
|
60
|
+
A shortcut for the above example:
|
61
|
+
response = solr.documents :q=>'test'
|
67
62
|
|
68
|
-
|
69
|
-
Updating
|
63
|
+
|
64
|
+
== Updating Solr
|
65
|
+
Updating can be done using native Ruby structures. Hashes are used for single documents and arrays are used for a collection of documents (hashes). These structures get turned into simple XML "messages". Raw XML strings can also be used.
|
70
66
|
|
71
67
|
Raw XML via #update
|
72
|
-
solr.update
|
73
|
-
solr.update
|
68
|
+
solr.update '</commit>'
|
69
|
+
solr.update '</optimize>'
|
74
70
|
|
75
71
|
Single document via #add
|
76
|
-
solr.add
|
72
|
+
solr.add :id=>1, :price=>1.00
|
77
73
|
|
78
74
|
Multiple documents via #add
|
79
75
|
documents = [{:id=>1, :price=>1.00}, {:id=>2, :price=>10.50}]
|
80
|
-
solr.add
|
76
|
+
solr.add documents
|
81
77
|
|
82
78
|
When adding, you can also supply "add" xml element attributes and/or a block for manipulating other "add" related elements (docs and fields) when using the #add method:
|
83
79
|
|
@@ -91,23 +87,27 @@ When adding, you can also supply "add" xml element attributes and/or a block for
|
|
91
87
|
end
|
92
88
|
|
93
89
|
Delete by id
|
94
|
-
solr.delete_by_id
|
90
|
+
solr.delete_by_id 1
|
95
91
|
or an array of ids
|
96
|
-
solr.delete_by_id
|
92
|
+
solr.delete_by_id [1, 2, 3, 4]
|
97
93
|
|
98
94
|
Delete by query:
|
99
|
-
solr.delete_by_query
|
95
|
+
solr.delete_by_query 'price:1.00'
|
100
96
|
Delete by array of queries
|
101
|
-
solr.delete_by_query
|
102
|
-
|
97
|
+
solr.delete_by_query ['price:1.00', 'price:10.00']
|
103
98
|
|
104
99
|
Commit & optimize shortcuts
|
105
100
|
solr.commit
|
106
101
|
solr.optimize
|
107
102
|
|
103
|
+
===XML Builders for RSolr
|
104
|
+
As of version 0.9.1, RSolr can use LibXml to create the update messages sent to solr. To switch from Builder to LibXml, set the RSolr::Message.builder like:
|
105
|
+
solr = RSolr.connect
|
106
|
+
solr.message.adapter = RSolr::Message::Adapter::Libxml.new
|
107
|
+
|
108
108
|
|
109
109
|
== Response Formats
|
110
|
-
The default response format is Ruby. When the :wt param is set to :ruby, the response is eval'd
|
110
|
+
The default response format is Ruby. When the :wt param is set to :ruby, the response is eval'd resulting in a Hash. You can get a raw response by setting the :wt to "ruby" - notice, the string -- not a symbol. RSolr will eval the Ruby string ONLY if the :wt value is :ruby. All other response formats are available as expected, :wt=>'xml' etc..
|
111
111
|
|
112
112
|
===Evaluated Ruby (default)
|
113
113
|
solr.select(:wt=>:ruby) # notice :ruby is a Symbol
|
@@ -120,7 +120,7 @@ The default response format is Ruby. When the :wt param is set to :ruby, the res
|
|
120
120
|
solr.select(:wt=>:json)
|
121
121
|
|
122
122
|
You can access the original request context (path, params, url etc.) by calling the #adapter_response method:
|
123
|
-
response = solr.select
|
123
|
+
response = solr.select :q=>'*:*'
|
124
124
|
response.adapter_response[:status_code]
|
125
125
|
response.adapter_response[:body]
|
126
126
|
response.adapter_response[:url]
|
@@ -129,20 +129,20 @@ The adapter_response is a hash that contains the generated params, url, path, po
|
|
129
129
|
|
130
130
|
|
131
131
|
== HTTP Client Adapter
|
132
|
-
You can specify the http client adapter
|
132
|
+
You can specify the http client adapter:
|
133
133
|
:net_http uses the standard Net::HTTP library
|
134
|
-
:curb uses the
|
134
|
+
:curb uses the C based "curl" library
|
135
135
|
|
136
|
-
|
137
|
-
|
138
|
-
solr.adapter.connector.adapter_name = :curb
|
136
|
+
NOTE: The Net::Http is the default adapter.
|
139
137
|
|
140
|
-
Example
|
138
|
+
Example:
|
141
139
|
|
142
|
-
|
143
|
-
|
144
|
-
hclient.get('/')
|
140
|
+
RSolr.connect(:adapter => :curb)
|
141
|
+
RSolr.connect(:adapter => :net_http)
|
145
142
|
|
146
|
-
|
143
|
+
Intereseting read about Ruby's Net::HTTP library:
|
144
|
+
http://apocryph.org/2008/11/09/more_indepth_analysis_ruby_http_client_performance
|
147
145
|
|
146
|
+
NOTE: You can't use the :curb adapter under jRuby. To install curb:
|
147
|
+
|
148
148
|
sudo gem install curb
|
data/Rakefile
CHANGED
@@ -29,24 +29,24 @@ Spec::Rake::SpecTask.new('spec') do |t|
|
|
29
29
|
t.libs += ["lib", "spec"]
|
30
30
|
end
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
32
|
+
desc 'Run specs' # this task runs each test in its own process
|
33
|
+
task :specs do
|
34
|
+
require 'rubygems'
|
35
|
+
require 'facets/more/filelist' unless defined?(FileList)
|
36
|
+
files = FileList["**/*_spec.rb"]
|
37
|
+
p files.to_a
|
38
|
+
files.each do |filename|
|
39
|
+
system "cd #{File.dirname(filename)} && ruby #{File.basename(filename)}"
|
40
|
+
end
|
41
|
+
end
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
43
|
+
desc "Run specs"
|
44
|
+
Rake::TestTask.new("specs") { |t|
|
45
|
+
t.pattern = 'spec/**/*_spec.rb'
|
46
|
+
t.verbose = true
|
47
|
+
t.warning = true
|
48
|
+
t.libs += ["lib", "spec"]
|
49
|
+
}
|
50
50
|
|
51
51
|
# Clean house
|
52
52
|
desc 'Clean up tmp files.'
|
data/examples/direct.rb
CHANGED
@@ -5,13 +5,15 @@ base = File.expand_path( File.dirname(__FILE__) )
|
|
5
5
|
dist = File.join(base, '..', 'apache-solr')
|
6
6
|
home = File.join(dist, 'example', 'solr')
|
7
7
|
|
8
|
-
solr = RSolr.connect(:
|
8
|
+
solr = RSolr.connect(:direct, :home_dir=>home, :dist_dir=>dist)
|
9
9
|
|
10
10
|
Dir['../apache-solr/example/exampledocs/*.xml'].each do |xml_file|
|
11
11
|
puts "Updating with #{xml_file}"
|
12
12
|
solr.update File.read(xml_file)
|
13
13
|
end
|
14
14
|
|
15
|
+
solr.commit
|
16
|
+
|
15
17
|
puts
|
16
18
|
|
17
19
|
response = solr.select :q=>'ipod', :fq=>'price:[0 TO 50]', :rows=>2, :start=>0
|
data/examples/http.rb
CHANGED
@@ -1,22 +1,24 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', 'lib', 'rsolr')
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
# switch out the http adapter from curb to net_http (just for an example)
|
6
|
-
solr.adapter.connector.adapter_name = :curb
|
3
|
+
# switch out the http adapter from net_http to curb
|
4
|
+
solr = RSolr.connect :adapter=>:curb
|
7
5
|
|
8
6
|
Dir['../apache-solr/example/exampledocs/*.xml'].each do |xml_file|
|
9
7
|
puts "Updating with #{xml_file}"
|
10
8
|
solr.update File.read(xml_file)
|
11
9
|
end
|
12
10
|
|
11
|
+
solr.commit
|
12
|
+
|
13
13
|
puts
|
14
14
|
|
15
|
-
response = solr.select(:q=>'ipod', :fq=>'price:[0 TO 50]', :rows=>2, :start=>0)
|
15
|
+
response = solr.select(:q=>'ipod', :fq=>['price:[0 TO 50]'], :rows=>2, :start=>0)
|
16
16
|
|
17
17
|
puts "URL : #{response.adapter_response[:url]} -> #{response.adapter_response[:status_code]}"
|
18
18
|
|
19
|
-
|
19
|
+
puts
|
20
|
+
|
21
|
+
response['response']['docs'].each do |doc|
|
20
22
|
puts doc['timestamp']
|
21
23
|
end
|
22
24
|
|
@@ -5,7 +5,7 @@ require 'java'
|
|
5
5
|
#
|
6
6
|
# Connection for JRuby + DirectSolrConnection
|
7
7
|
#
|
8
|
-
class RSolr::Adapter::Direct
|
8
|
+
class RSolr::Connection::Adapter::Direct
|
9
9
|
|
10
10
|
include RSolr::HTTPClient::Util
|
11
11
|
|
@@ -52,8 +52,9 @@ class RSolr::Adapter::Direct
|
|
52
52
|
end
|
53
53
|
|
54
54
|
# send a request to the connection
|
55
|
+
# request '/select', :q=>'something'
|
55
56
|
# request '/update', :wt=>:xml, '</commit>'
|
56
|
-
def
|
57
|
+
def request(path, params={}, data=nil)
|
57
58
|
data = data.to_xml if data.respond_to?(:to_xml)
|
58
59
|
url = build_url(path, params)
|
59
60
|
begin
|
@@ -1,25 +1,24 @@
|
|
1
1
|
#
|
2
2
|
# Connection for standard HTTP Solr server
|
3
3
|
#
|
4
|
-
class RSolr::Adapter::HTTP
|
4
|
+
class RSolr::Connection::Adapter::HTTP
|
5
5
|
|
6
|
-
attr_reader :opts
|
6
|
+
attr_reader :opts
|
7
7
|
|
8
8
|
# opts can have:
|
9
9
|
# :url => 'http://localhost:8080/solr'
|
10
10
|
def initialize(opts={}, &block)
|
11
|
-
opts[:url]||='http://127.0.0.1:8983/solr'
|
11
|
+
opts[:url] ||= 'http://127.0.0.1:8983/solr'
|
12
12
|
@opts = opts
|
13
|
-
@connector = RSolr::HTTPClient::Connector.new
|
14
13
|
end
|
15
14
|
|
16
15
|
def connection
|
17
|
-
@connection ||=
|
16
|
+
@connection ||= RSolr::HTTPClient.connect(@opts)
|
18
17
|
end
|
19
18
|
|
20
19
|
# send a request to the connection
|
21
20
|
# request '/update', :wt=>:xml, '</commit>'
|
22
|
-
def
|
21
|
+
def request(path, params={}, data=nil)
|
23
22
|
data = data.to_xml if data.respond_to?(:to_xml)
|
24
23
|
if data
|
25
24
|
http_context = connection.post(path, data, params, post_headers)
|
data/lib/rsolr/connection.rb
CHANGED
@@ -1,124 +1,125 @@
|
|
1
|
-
|
1
|
+
module RSolr::Connection
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
# RSolr::Adapter::HTTP
|
7
|
-
# RSolr::Adapter::Direct (jRuby only)
|
8
|
-
def initialize(adapter, opts={})
|
9
|
-
@adapter = adapter
|
10
|
-
@opts = opts
|
11
|
-
end
|
12
|
-
|
13
|
-
# Send a request to a request handler using the method name.
|
14
|
-
# This does not handle data, only selects
|
15
|
-
def method_missing(method_name, params)
|
16
|
-
send_request("/#{method_name}", map_params(params))
|
17
|
-
end
|
18
|
-
|
19
|
-
# send a request to the "select" handler
|
20
|
-
def select(params)
|
21
|
-
send_request('/select', map_params(params))
|
22
|
-
end
|
23
|
-
|
24
|
-
# sends data to the update handler
|
25
|
-
# data can be a string of xml, or an object that returns xml from its #to_xml method
|
26
|
-
def update(data, params={})
|
27
|
-
send_request('/update', map_params(params), data)
|
3
|
+
module Adapter
|
4
|
+
autoload :Direct, 'rsolr/connection/adapter/direct'
|
5
|
+
autoload :HTTP, 'rsolr/connection/adapter/http'
|
28
6
|
end
|
29
7
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
# allow #request to be used like send_request
|
44
|
-
alias_method :request, :send_request
|
8
|
+
class Base
|
9
|
+
|
10
|
+
attr_reader :adapter
|
11
|
+
|
12
|
+
# "adapter" is instance of:
|
13
|
+
# RSolr::Adapter::HTTP
|
14
|
+
# RSolr::Adapter::Direct (jRuby only)
|
15
|
+
# or any other class that uses the connection "interface"
|
16
|
+
def initialize(adapter)
|
17
|
+
@adapter = adapter
|
18
|
+
end
|
45
19
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
# solr.update([{:id=>1, :name=>'one'}, {:id=>2, :name=>'two'}])
|
52
|
-
#
|
53
|
-
def add(doc, &block)
|
54
|
-
update message.add(doc, &block)
|
55
|
-
end
|
20
|
+
# Send a request to a request handler using the method name.
|
21
|
+
# This does not handle data/POSTs, only GET requests.
|
22
|
+
def method_missing(method_name, params, &blk)
|
23
|
+
request("/#{method_name}", map_params(params))
|
24
|
+
end
|
56
25
|
|
57
|
-
|
58
|
-
|
59
|
-
update
|
60
|
-
|
26
|
+
# sends data to the update handler
|
27
|
+
# data can be a string of xml, or an object that returns xml from its #to_xml method
|
28
|
+
def update(data, params={})
|
29
|
+
request('/update', map_params(params), data)
|
30
|
+
end
|
61
31
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
32
|
+
# send request solr
|
33
|
+
# params is hash with valid solr request params (:q, :fl, :qf etc..)
|
34
|
+
# if params[:wt] is not set, the default is :ruby
|
35
|
+
# if :wt is something other than :ruby, the raw response body is used
|
36
|
+
# otherwise, a simple Hash is returned
|
37
|
+
# NOTE: to get raw ruby, use :wt=>'ruby' <- a string, not a symbol like :ruby
|
38
|
+
#
|
39
|
+
#
|
40
|
+
def request(path, params={}, data=nil)
|
41
|
+
response = @adapter.request(path, map_params(params), data)
|
42
|
+
adapt_response(response)
|
43
|
+
end
|
66
44
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
45
|
+
#
|
46
|
+
# single record:
|
47
|
+
# solr.update(:id=>1, :name=>'one')
|
48
|
+
#
|
49
|
+
# update using an array
|
50
|
+
# solr.update([{:id=>1, :name=>'one'}, {:id=>2, :name=>'two'}])
|
51
|
+
#
|
52
|
+
def add(doc, &block)
|
53
|
+
update message.add(doc, &block)
|
54
|
+
end
|
72
55
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
update message.delete_by_id(id)
|
78
|
-
end
|
56
|
+
# send </commit>
|
57
|
+
def commit
|
58
|
+
update message.commit
|
59
|
+
end
|
79
60
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
update message.delete_by_query(query)
|
85
|
-
end
|
61
|
+
# send </optimize>
|
62
|
+
def optimize
|
63
|
+
update message.optimize
|
64
|
+
end
|
86
65
|
|
87
|
-
|
66
|
+
# send </rollback>
|
67
|
+
# NOTE: solr 1.4 only
|
68
|
+
def rollback
|
69
|
+
update message.rollback
|
70
|
+
end
|
88
71
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
72
|
+
# Delete one or many documents by id
|
73
|
+
# solr.delete_by_id 10
|
74
|
+
# solr.delete_by_id([12, 41, 199])
|
75
|
+
def delete_by_id(id)
|
76
|
+
update message.delete_by_id(id)
|
77
|
+
end
|
93
78
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
79
|
+
# delete one or many documents by query
|
80
|
+
# solr.delete_by_query 'available:0'
|
81
|
+
# solr.delete_by_query ['quantity:0', 'manu:"FQ"']
|
82
|
+
def delete_by_query(query)
|
83
|
+
update message.delete_by_query(query)
|
84
|
+
end
|
85
|
+
|
86
|
+
# shortcut to RSolr::Message::Builder
|
87
|
+
def message
|
88
|
+
@message ||= RSolr::Message::Builder.new
|
89
|
+
end
|
90
|
+
|
91
|
+
protected
|
92
|
+
|
93
|
+
# sets default params etc.. - could be used as a mapping hook
|
94
|
+
# type of request should be passed in here? -> map_params(:query, {})
|
95
|
+
def map_params(params)
|
96
|
+
params||={}
|
97
|
+
{:wt=>:ruby}.merge(params)
|
98
|
+
end
|
100
99
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
100
|
+
# "adapter_response" must be a hash with the following keys:
|
101
|
+
# :params - a sub hash of standard solr params
|
102
|
+
# : body - the raw response body from the solr server
|
103
|
+
# This method will evaluate the :body value if the params[:wt] == :ruby
|
104
|
+
# otherwise, the body is returned
|
105
|
+
# The return object has a special method attached called #adapter_response
|
106
|
+
# This method gives you access to the original response from the adapter,
|
107
|
+
# so you can access things like the actual :url sent to solr,
|
108
|
+
# the raw :body, original :params and original :data
|
109
|
+
def adapt_response(adapter_response)
|
110
|
+
data = adapter_response[:body]
|
111
|
+
# if the wt is :ruby, evaluate the ruby string response
|
112
|
+
if adapter_response[:params][:wt] == :ruby
|
113
|
+
data = Kernel.eval(data)
|
114
|
+
end
|
115
115
|
# attach a method called #adapter_response that returns the original adapter response value
|
116
116
|
def data.adapter_response
|
117
117
|
@adapter_response
|
118
118
|
end
|
119
119
|
data.send(:instance_variable_set, '@adapter_response', adapter_response)
|
120
|
+
data
|
120
121
|
end
|
121
|
-
|
122
|
+
|
122
123
|
end
|
123
124
|
|
124
125
|
end
|