solr4r 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog +9 -0
- data/README +2 -2
- data/Rakefile +1 -1
- data/lib/solr4r/builder.rb +29 -39
- data/lib/solr4r/client.rb +14 -0
- data/lib/solr4r/document.rb +47 -0
- data/lib/solr4r/request.rb +1 -1
- data/lib/solr4r/response.rb +18 -14
- data/lib/solr4r/result.rb +79 -0
- data/lib/solr4r/uri_extension.rb +1 -1
- data/lib/solr4r/version.rb +1 -1
- data/spec/spec_helper.rb +4 -0
- metadata +27 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4fc0f7535c323bbbd5658b37a8347ffb480352d8
|
4
|
+
data.tar.gz: 8adf499638d2dce1b6f145714f19897e35234679
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6c0549a56c70c7b9e7a644a2d1c563bf42dc5ad172db183f01b4966a411b379db21ca751a7295fbfa12f1ccfa84bc3564a9f5a7477ba631599e25643f2c9569
|
7
|
+
data.tar.gz: 038f091785cb04024a139c4de2f7da174b359496c82dc3f2881e95000e8ba8c3dbf38123023291bd76c845d2b88a2a13808a4bc30590450fbf2b656a395a4b81
|
data/ChangeLog
CHANGED
@@ -2,6 +2,15 @@
|
|
2
2
|
|
3
3
|
= Revision history for solr4r
|
4
4
|
|
5
|
+
== 0.0.3 [2014-09-19]
|
6
|
+
|
7
|
+
* Added Solr4R::Client#json.
|
8
|
+
* Added Solr4R::Client#json_query.
|
9
|
+
* Added Solr4R::Client#solr_version.
|
10
|
+
* Updated Solr4R::Request with some fixes.
|
11
|
+
* Refactored Solr4R::Response to use wrapper object.
|
12
|
+
* Refactored Solr4R::Builder to use custom document class.
|
13
|
+
|
5
14
|
== 0.0.2 [2014-04-17]
|
6
15
|
|
7
16
|
* Refactored Solr4R::Request away from curb.
|
data/README
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
== VERSION
|
4
4
|
|
5
|
-
This documentation refers to solr4r version 0.0.
|
5
|
+
This documentation refers to solr4r version 0.0.3
|
6
6
|
|
7
7
|
|
8
8
|
== DESCRIPTION
|
@@ -12,7 +12,7 @@ TODO
|
|
12
12
|
|
13
13
|
== LINKS
|
14
14
|
|
15
|
-
Documentation:: https://blackwinter.github.
|
15
|
+
Documentation:: https://blackwinter.github.com/solr4r
|
16
16
|
Source code:: https://github.com/blackwinter/solr4r
|
17
17
|
RubyGem:: https://rubygems.org/gems/solr4r
|
18
18
|
Travis CI:: https://travis-ci.org/blackwinter/solr4r
|
data/Rakefile
CHANGED
data/lib/solr4r/builder.rb
CHANGED
@@ -27,10 +27,16 @@ require 'nokogiri'
|
|
27
27
|
|
28
28
|
module Solr4R
|
29
29
|
|
30
|
-
Document = Nokogiri::XML::Document
|
31
|
-
|
32
30
|
class Builder < Nokogiri::XML::Builder
|
33
31
|
|
32
|
+
class Document < Nokogiri::XML::Document
|
33
|
+
|
34
|
+
def document
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
34
40
|
DEFAULT_OPTIONS = {
|
35
41
|
encoding: 'UTF-8'
|
36
42
|
}
|
@@ -41,9 +47,10 @@ module Solr4R
|
|
41
47
|
'block argument not supported, use options hash instead'
|
42
48
|
end
|
43
49
|
|
44
|
-
super(
|
45
|
-
|
46
|
-
|
50
|
+
super(
|
51
|
+
@_solr_opt = DEFAULT_OPTIONS.merge(options),
|
52
|
+
@_solr_doc = Document.new
|
53
|
+
)
|
47
54
|
end
|
48
55
|
|
49
56
|
# See Schema[http://wiki.apache.org/solr/UpdateXmlMessages#add.2Freplace_documents].
|
@@ -122,21 +129,14 @@ module Solr4R
|
|
122
129
|
# </doc>
|
123
130
|
# </add>
|
124
131
|
def add(doc, attributes = {})
|
125
|
-
to_xml(:add, attributes) { |add_node|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
hash.each { |key, values|
|
130
|
-
values = values.is_a?(Array) ? values.dup : [values]
|
132
|
+
to_xml(:add, attributes) { |add_node| _each(doc) { |hash, doc_attributes|
|
133
|
+
add_node.doc_(doc_attributes) { |doc_node| hash.each { |key, values|
|
134
|
+
field_attributes = (values.is_a?(Array) && values.last.is_a?(Hash) ?
|
135
|
+
(values = values.dup).pop : {}).merge(name: key)
|
131
136
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
values.each { |value| doc_node.field_(value, field_attributes) }
|
136
|
-
}
|
137
|
-
}
|
138
|
-
}
|
139
|
-
}
|
137
|
+
_each(values) { |value| doc_node.field_(value, field_attributes) }
|
138
|
+
} }
|
139
|
+
} }
|
140
140
|
end
|
141
141
|
|
142
142
|
# See Schema[http://wiki.apache.org/solr/UpdateXmlMessages#A.22commit.22_and_.22optimize.22].
|
@@ -252,40 +252,30 @@ module Solr4R
|
|
252
252
|
# <query>office:Osaka</query>
|
253
253
|
# </delete>
|
254
254
|
def delete(hash)
|
255
|
-
to_xml(:delete) { |delete_node|
|
256
|
-
|
257
|
-
values = [values] unless values.is_a?(Array)
|
258
|
-
values.each { |value|
|
259
|
-
ary = []
|
260
|
-
|
261
|
-
if value.is_a?(Hash)
|
262
|
-
value.each { |k, v| Array(v).each { |w| ary << "#{k}:#{w}" } }
|
263
|
-
else
|
264
|
-
ary << value
|
265
|
-
end
|
255
|
+
to_xml(:delete) { |delete_node| hash.each { |key, values|
|
256
|
+
delete = lambda { |value| delete_node.method_missing(key, value) }
|
266
257
|
|
267
|
-
|
268
|
-
}
|
269
|
-
|
270
|
-
}
|
258
|
+
_each(values) { |value| !value.is_a?(Hash) ? delete[value] :
|
259
|
+
value.each { |k, v| Array(v).each { |w| delete["#{k}:#{w}"] } } }
|
260
|
+
} }
|
271
261
|
end
|
272
262
|
|
273
263
|
def inspect
|
274
|
-
'#<%s:0x%x
|
275
|
-
self.class, object_id, @options
|
276
|
-
]
|
264
|
+
'#<%s:0x%x %p>' % [self.class, object_id, @_solr_opt]
|
277
265
|
end
|
278
266
|
|
279
267
|
private
|
280
268
|
|
281
269
|
def to_xml(name, attributes = {}, &block)
|
282
270
|
self.parent = self.doc = @_solr_doc.dup
|
283
|
-
|
284
271
|
method_missing(name, attributes, &block)
|
285
|
-
|
286
272
|
super(&nil)
|
287
273
|
end
|
288
274
|
|
275
|
+
def _each(values, &block)
|
276
|
+
(values.is_a?(Array) ? values : [values]).each(&block)
|
277
|
+
end
|
278
|
+
|
289
279
|
end
|
290
280
|
|
291
281
|
end
|
data/lib/solr4r/client.rb
CHANGED
@@ -43,6 +43,8 @@ module Solr4R
|
|
43
43
|
|
44
44
|
DEFAULT_UPDATE_PATH = 'update'
|
45
45
|
|
46
|
+
SYSTEM_INFO_PATH = 'admin/info/system'
|
47
|
+
|
46
48
|
MATCH_ALL_QUERY = '*:*'
|
47
49
|
|
48
50
|
def initialize(options = {})
|
@@ -84,6 +86,10 @@ module Solr4R
|
|
84
86
|
self
|
85
87
|
end
|
86
88
|
|
89
|
+
def json(path, params = {}, options = {}, &block)
|
90
|
+
get(path, params.merge(wt: :json), options, &block).result
|
91
|
+
end
|
92
|
+
|
87
93
|
def get(path, params = {}, options = {}, &block)
|
88
94
|
send_request(path, options.merge(method: :get, params: params), &block)
|
89
95
|
end
|
@@ -147,6 +153,14 @@ module Solr4R
|
|
147
153
|
get(path, params, options, &block)
|
148
154
|
end
|
149
155
|
|
156
|
+
def json_query(params = {}, options = {}, path = DEFAULT_SELECT_PATH, &block)
|
157
|
+
json(path, params, options, &block)
|
158
|
+
end
|
159
|
+
|
160
|
+
def solr_version(type = :spec)
|
161
|
+
json(SYSTEM_INFO_PATH) % "lucene/solr-#{type}-version"
|
162
|
+
end
|
163
|
+
|
150
164
|
def inspect
|
151
165
|
'#<%s:0x%x @default_params=%p %s>' % [
|
152
166
|
self.class, object_id, default_params, request.request_line
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
#--
|
4
|
+
###############################################################################
|
5
|
+
# #
|
6
|
+
# solr4r -- A Ruby client for Apache Solr #
|
7
|
+
# #
|
8
|
+
# Copyright (C) 2014 Jens Wille #
|
9
|
+
# #
|
10
|
+
# Mir is free software: you can redistribute it and/or modify it under the #
|
11
|
+
# terms of the GNU Affero General Public License as published by the Free #
|
12
|
+
# Software Foundation, either version 3 of the License, or (at your option) #
|
13
|
+
# any later version. #
|
14
|
+
# #
|
15
|
+
# solr4r is distributed in the hope that it will be useful, but WITHOUT ANY #
|
16
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
17
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
18
|
+
# more details. #
|
19
|
+
# #
|
20
|
+
# You should have received a copy of the GNU Affero General Public License #
|
21
|
+
# along with solr4r. If not, see <http://www.gnu.org/licenses/>. #
|
22
|
+
# #
|
23
|
+
###############################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
require 'forwardable'
|
27
|
+
|
28
|
+
module Solr4R
|
29
|
+
|
30
|
+
class Document
|
31
|
+
|
32
|
+
extend Forwardable
|
33
|
+
def_delegators :to_hash, :[], :each
|
34
|
+
|
35
|
+
def initialize(result, hash)
|
36
|
+
@result, @hash = result, hash
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_reader :result
|
40
|
+
|
41
|
+
def to_hash
|
42
|
+
@hash
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/lib/solr4r/request.rb
CHANGED
data/lib/solr4r/response.rb
CHANGED
@@ -24,6 +24,7 @@
|
|
24
24
|
#++
|
25
25
|
|
26
26
|
require 'json'
|
27
|
+
require_relative 'result'
|
27
28
|
|
28
29
|
module Solr4R
|
29
30
|
|
@@ -45,8 +46,8 @@ module Solr4R
|
|
45
46
|
'"%s %s" %d' % [request_method.upcase, request_url, response_code]
|
46
47
|
end
|
47
48
|
|
48
|
-
def result
|
49
|
-
@result ||= evaluate_result
|
49
|
+
def result
|
50
|
+
@result ||= evaluate_result if @evaluate
|
50
51
|
end
|
51
52
|
|
52
53
|
def num_found
|
@@ -67,30 +68,33 @@ module Solr4R
|
|
67
68
|
|
68
69
|
private
|
69
70
|
|
70
|
-
def evaluate_result
|
71
|
+
def evaluate_result
|
71
72
|
case wt = request_params[:wt]
|
72
73
|
when String then to_s
|
73
|
-
when :ruby then eval(to_s)
|
74
|
-
when :json then JSON.parse(to_s
|
74
|
+
when :ruby then extend_hash(eval(to_s))
|
75
|
+
when :json then extend_hash(JSON.parse(to_s))
|
75
76
|
else raise 'The response cannot be evaluated: wt=%p not supported.' % wt
|
76
77
|
end
|
77
78
|
end
|
78
79
|
|
79
80
|
def evaluate_count(name)
|
80
81
|
case wt = request_params[:wt]
|
81
|
-
#
|
82
|
-
when '
|
83
|
-
#
|
84
|
-
when
|
85
|
-
# "numFound":35
|
86
|
-
when 'json' then Integer(result[/"#{name}":(\d+)/, 1])
|
87
|
-
# { 'response' => 'numFound' } OR { :response => :numFound }
|
88
|
-
when :ruby, :json then result.fetch(key = 'response') {
|
89
|
-
name = name.to_sym; result.fetch(key.to_sym) }.fetch(name)
|
82
|
+
when 'xml' then extract_int(name, '\s%s="%s"') # numFound="35"
|
83
|
+
when 'ruby' then extract_int(name, "'%s'=>%s") # 'numFound'=>35
|
84
|
+
when 'json' then extract_int(name, '"%s":%s') # "numFound":35
|
85
|
+
when Symbol then result % ['response', name] # {"response"=>{"numFound"=>35}}
|
90
86
|
else raise 'The count cannot be extracted: wt=%p not supported.' % wt
|
91
87
|
end
|
92
88
|
end
|
93
89
|
|
90
|
+
def extract_int(name, pattern)
|
91
|
+
Integer(result[Regexp.new(pattern % [name, '(\d+)']), 1])
|
92
|
+
end
|
93
|
+
|
94
|
+
def extend_hash(object)
|
95
|
+
object.is_a?(Hash) ? Result.new(self, object) : object
|
96
|
+
end
|
97
|
+
|
94
98
|
end
|
95
99
|
|
96
100
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
#--
|
4
|
+
###############################################################################
|
5
|
+
# #
|
6
|
+
# solr4r -- A Ruby client for Apache Solr #
|
7
|
+
# #
|
8
|
+
# Copyright (C) 2014 Jens Wille #
|
9
|
+
# #
|
10
|
+
# Mir is free software: you can redistribute it and/or modify it under the #
|
11
|
+
# terms of the GNU Affero General Public License as published by the Free #
|
12
|
+
# Software Foundation, either version 3 of the License, or (at your option) #
|
13
|
+
# any later version. #
|
14
|
+
# #
|
15
|
+
# solr4r is distributed in the hope that it will be useful, but WITHOUT ANY #
|
16
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
17
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
18
|
+
# more details. #
|
19
|
+
# #
|
20
|
+
# You should have received a copy of the GNU Affero General Public License #
|
21
|
+
# along with solr4r. If not, see <http://www.gnu.org/licenses/>. #
|
22
|
+
# #
|
23
|
+
###############################################################################
|
24
|
+
#++
|
25
|
+
|
26
|
+
require 'forwardable'
|
27
|
+
require 'nuggets/hash/deep_fetch_mixin'
|
28
|
+
|
29
|
+
require_relative 'document'
|
30
|
+
|
31
|
+
module Solr4R
|
32
|
+
|
33
|
+
class Result
|
34
|
+
|
35
|
+
include Enumerable
|
36
|
+
|
37
|
+
extend Forwardable
|
38
|
+
|
39
|
+
def_delegators :response, :to_i
|
40
|
+
def_delegators :to_hash, :%, :deep_fetch
|
41
|
+
|
42
|
+
def initialize(response, hash)
|
43
|
+
@response, @hash = response, hash.extend(Nuggets::Hash::DeepFetchMixin)
|
44
|
+
extend(Error) if hash.key?('error')
|
45
|
+
end
|
46
|
+
|
47
|
+
attr_reader :response
|
48
|
+
|
49
|
+
def to_hash
|
50
|
+
@hash
|
51
|
+
end
|
52
|
+
|
53
|
+
def each
|
54
|
+
return enum_for(:each) unless block_given?
|
55
|
+
|
56
|
+
deep_fetch('response/docs').each { |hash|
|
57
|
+
yield Document.new(self, hash)
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def error?
|
62
|
+
is_a?(Error)
|
63
|
+
end
|
64
|
+
|
65
|
+
module Error
|
66
|
+
|
67
|
+
def to_i
|
68
|
+
0
|
69
|
+
end
|
70
|
+
|
71
|
+
def each
|
72
|
+
[]
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/lib/solr4r/uri_extension.rb
CHANGED
data/lib/solr4r/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solr4r
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jens Wille
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: nuggets
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: hen
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -83,9 +97,11 @@ files:
|
|
83
97
|
- lib/solr4r.rb
|
84
98
|
- lib/solr4r/builder.rb
|
85
99
|
- lib/solr4r/client.rb
|
100
|
+
- lib/solr4r/document.rb
|
86
101
|
- lib/solr4r/request.rb
|
87
102
|
- lib/solr4r/request_extension.rb
|
88
103
|
- lib/solr4r/response.rb
|
104
|
+
- lib/solr4r/result.rb
|
89
105
|
- lib/solr4r/uri_extension.rb
|
90
106
|
- lib/solr4r/version.rb
|
91
107
|
- spec/solr4r/builder_spec.rb
|
@@ -96,14 +112,18 @@ licenses:
|
|
96
112
|
metadata: {}
|
97
113
|
post_install_message: |2+
|
98
114
|
|
99
|
-
solr4r-0.0.
|
115
|
+
solr4r-0.0.3 [2014-09-19]:
|
100
116
|
|
101
|
-
*
|
102
|
-
*
|
117
|
+
* Added Solr4R::Client#json.
|
118
|
+
* Added Solr4R::Client#json_query.
|
119
|
+
* Added Solr4R::Client#solr_version.
|
120
|
+
* Updated Solr4R::Request with some fixes.
|
121
|
+
* Refactored Solr4R::Response to use wrapper object.
|
122
|
+
* Refactored Solr4R::Builder to use custom document class.
|
103
123
|
|
104
124
|
rdoc_options:
|
105
125
|
- "--title"
|
106
|
-
- solr4r Application documentation (v0.0.
|
126
|
+
- solr4r Application documentation (v0.0.3)
|
107
127
|
- "--charset"
|
108
128
|
- UTF-8
|
109
129
|
- "--line-numbers"
|
@@ -124,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
144
|
version: '0'
|
125
145
|
requirements: []
|
126
146
|
rubyforge_project:
|
127
|
-
rubygems_version: 2.
|
147
|
+
rubygems_version: 2.4.1
|
128
148
|
signing_key:
|
129
149
|
specification_version: 4
|
130
150
|
summary: A Ruby client for Apache Solr.
|