solr4r 0.0.2 → 0.0.3
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.
- 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.
|