groonga-client 0.2.5 → 0.2.6
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/doc/text/news.md +12 -0
- data/groonga-client.gemspec +0 -1
- data/lib/groonga/client/response/base.rb +58 -11
- data/lib/groonga/client/response/select.rb +62 -27
- data/lib/groonga/client/version.rb +1 -1
- data/test/response/test-base.rb +169 -70
- data/test/response/{test-select.rb → test-select-command-version1.rb} +28 -4
- data/test/response/test-select-command-version3.rb +274 -0
- data/test/run-test.rb +0 -1
- metadata +6 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37800c0ceaac12320a9c1d92cf63012703cf8b1d
|
4
|
+
data.tar.gz: d7dfd6abd5db78f48e8602759245d110e593c632
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48a5b7f236ada9ad6aa43d29901ac253721cb101ecb37141320fc3cddb29b0f6d45bf5b4ba37b85ae6b3630ea4f70305acce34d4425def8ec72badc1d7f47a3c
|
7
|
+
data.tar.gz: ff37c41507bcdf210f557eb6afa4b54443cd14b5ee9246bfc197b8c30691875ce1b78e66c601578e6726a37f63997d4f60d19e6685b6aa5ed9398758538efb2e
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# NEWS
|
2
2
|
|
3
|
+
## 0.2.6 - 2016-06-17
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* Supported command version 3.
|
8
|
+
|
9
|
+
* Added {Groonga::Client::Response#return_code}.
|
10
|
+
{Groonga::Client::Response#status_code} is deprecated. Use
|
11
|
+
`#return_code` instead.
|
12
|
+
|
13
|
+
* `select` response: Supported vector of `Time`.
|
14
|
+
|
3
15
|
## 0.2.5 - 2016-04-02
|
4
16
|
|
5
17
|
### Fixes
|
data/groonga-client.gemspec
CHANGED
@@ -51,7 +51,6 @@ Gem::Specification.new do |spec|
|
|
51
51
|
spec.add_development_dependency("bundler")
|
52
52
|
spec.add_development_dependency("rake")
|
53
53
|
spec.add_development_dependency("test-unit")
|
54
|
-
spec.add_development_dependency("test-unit-notify")
|
55
54
|
spec.add_development_dependency("test-unit-rr")
|
56
55
|
spec.add_development_dependency("packnga")
|
57
56
|
spec.add_development_dependency("redcarpet")
|
@@ -39,7 +39,7 @@ module Groonga
|
|
39
39
|
# response object.
|
40
40
|
#
|
41
41
|
# @param [Groonga::Command::Base] The command of the request.
|
42
|
-
# @param [String] The raw (not parsed) response returned by
|
42
|
+
# @param [String] The raw (not parsed) response returned by Groonga
|
43
43
|
# server.
|
44
44
|
# @return [Base]
|
45
45
|
def parse(command, raw_response)
|
@@ -61,16 +61,26 @@ module Groonga
|
|
61
61
|
class Base
|
62
62
|
class << self
|
63
63
|
def parse(command, raw_response)
|
64
|
+
return_code = nil
|
64
65
|
case command.output_type
|
65
66
|
when :json
|
66
|
-
|
67
|
+
response = JSON.parse(raw_response)
|
68
|
+
if response.is_a?(::Array)
|
69
|
+
header, body = response
|
70
|
+
return_code = header[0] if header
|
71
|
+
else
|
72
|
+
header = response["header"]
|
73
|
+
body = response["body"]
|
74
|
+
return_code = header["return_code"] if header
|
75
|
+
end
|
67
76
|
when :xml
|
68
77
|
header, body = parse_xml(raw_response)
|
78
|
+
return_code = header[0] if header
|
69
79
|
else
|
70
80
|
header = nil
|
71
81
|
body = raw_response
|
72
82
|
end
|
73
|
-
if header.nil? or
|
83
|
+
if header.nil? or return_code == 0
|
74
84
|
response = new(command, header, body)
|
75
85
|
else
|
76
86
|
response = Error.new(command, header, body)
|
@@ -136,7 +146,7 @@ module Groonga
|
|
136
146
|
# `[return_code, start_time, elapsed_time_in_seconds, error_message, error_location]`
|
137
147
|
# for error case.
|
138
148
|
# @see http://groonga.org/docs/reference/command/output_format.html#header
|
139
|
-
#
|
149
|
+
# Details for header format.
|
140
150
|
attr_accessor :header
|
141
151
|
# @return [::Hash] The body of response. Its content is depends on
|
142
152
|
# command.
|
@@ -144,7 +154,7 @@ module Groonga
|
|
144
154
|
# The list of built-in commands.
|
145
155
|
attr_accessor :body
|
146
156
|
# @return [String] The unparsed response. It may be JSON, XML or
|
147
|
-
#
|
157
|
+
# Groonga command format.
|
148
158
|
attr_accessor :raw
|
149
159
|
|
150
160
|
def initialize(command, header, body)
|
@@ -154,35 +164,72 @@ module Groonga
|
|
154
164
|
self.raw = nil
|
155
165
|
end
|
156
166
|
|
167
|
+
# @return [Integer] The return code of the response.
|
168
|
+
# @since 0.2.6
|
169
|
+
def return_code
|
170
|
+
if header.nil?
|
171
|
+
0
|
172
|
+
elsif header_v1?
|
173
|
+
header[0]
|
174
|
+
else
|
175
|
+
header["return_code"] || 0
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
157
179
|
# @return [Integer] The status code of the response.
|
158
180
|
# @since 0.1.0
|
181
|
+
#
|
182
|
+
# @deprecated since 0.2.6. Use {return_code} instead.
|
159
183
|
def status_code
|
160
|
-
|
184
|
+
return_code
|
161
185
|
end
|
162
186
|
|
163
187
|
# @return [Time] The time of the request is accepted.
|
164
188
|
# @since 0.1.0
|
165
189
|
def start_time
|
166
|
-
|
190
|
+
if header.nil?
|
191
|
+
Time.at(0)
|
192
|
+
elsif header_v1?
|
193
|
+
Time.at(header[1])
|
194
|
+
else
|
195
|
+
Time.at(header["start_time"])
|
196
|
+
end
|
167
197
|
end
|
168
198
|
|
169
|
-
# @return [
|
199
|
+
# @return [Float] The elapsed time of the request.
|
170
200
|
# @since 0.1.0
|
171
201
|
def elapsed_time
|
172
|
-
|
202
|
+
if header.nil?
|
203
|
+
0.0
|
204
|
+
elsif header_v1?
|
205
|
+
header[2]
|
206
|
+
else
|
207
|
+
header["elapsed_time"]
|
208
|
+
end
|
173
209
|
end
|
174
210
|
|
175
211
|
# @return [String, nil] The error message of the response.
|
176
212
|
# @since 0.2.4
|
177
213
|
def error_message
|
178
|
-
|
214
|
+
if header.nil?
|
215
|
+
nil
|
216
|
+
elsif header_v1?
|
217
|
+
header[3]
|
218
|
+
else
|
219
|
+
(header["error"] || {})["message"]
|
220
|
+
end
|
179
221
|
end
|
180
222
|
|
181
223
|
# @return [Boolean] `true` if the request is processed successfully,
|
182
224
|
# `false` otherwise.
|
183
225
|
# @since 0.1.0
|
184
226
|
def success?
|
185
|
-
|
227
|
+
return_code.zero?
|
228
|
+
end
|
229
|
+
|
230
|
+
private
|
231
|
+
def header_v1?
|
232
|
+
header.is_a?(::Array)
|
186
233
|
end
|
187
234
|
end
|
188
235
|
end
|
@@ -36,57 +36,92 @@ module Groonga
|
|
36
36
|
|
37
37
|
private
|
38
38
|
def parse_body(body)
|
39
|
-
|
40
|
-
|
39
|
+
if body.is_a?(::Array)
|
40
|
+
@n_hits, @records = parse_match_records_v1(body.first)
|
41
|
+
@drilldowns = parse_drilldowns_v1(body[1..-1])
|
42
|
+
else
|
43
|
+
@n_hits, @records = parse_match_records_v3(body)
|
44
|
+
@drilldowns = parse_drilldowns_v3(body["drilldowns"])
|
45
|
+
end
|
41
46
|
body
|
42
47
|
end
|
43
48
|
|
44
|
-
def
|
45
|
-
n_hits = raw_result.first.first
|
49
|
+
def parse_records(raw_columns, raw_records)
|
46
50
|
column_names = {}
|
47
|
-
|
48
|
-
|
51
|
+
columns = raw_columns.collect do |column|
|
52
|
+
if column.is_a?(::Array)
|
53
|
+
name, type = column
|
54
|
+
else
|
55
|
+
name = column["name"]
|
56
|
+
type = column["type"]
|
57
|
+
end
|
58
|
+
base_column_name = name
|
49
59
|
suffix = 2
|
50
|
-
while column_names.key?(
|
51
|
-
|
60
|
+
while column_names.key?(name)
|
61
|
+
name = "#{base_column_name}#{suffix}"
|
52
62
|
suffix += 1
|
53
63
|
end
|
54
|
-
column_names[
|
55
|
-
[
|
64
|
+
column_names[name] = true
|
65
|
+
[name, type]
|
56
66
|
end
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
67
|
+
|
68
|
+
(raw_records || []).collect do |raw_record|
|
69
|
+
record = {}
|
70
|
+
columns.each_with_index do |(name, type), i|
|
71
|
+
record[name] = convert_value(raw_record[i], type)
|
62
72
|
end
|
63
|
-
|
73
|
+
record
|
64
74
|
end
|
65
|
-
[n_hits, items]
|
66
75
|
end
|
67
76
|
|
68
77
|
def convert_value(value, type)
|
69
|
-
case
|
70
|
-
when
|
71
|
-
|
78
|
+
case value
|
79
|
+
when ::Array
|
80
|
+
value.collect do |element|
|
81
|
+
convert_value(element, type)
|
82
|
+
end
|
72
83
|
else
|
73
|
-
|
84
|
+
case type
|
85
|
+
when "Time"
|
86
|
+
Time.at(value)
|
87
|
+
else
|
88
|
+
value
|
89
|
+
end
|
74
90
|
end
|
75
91
|
end
|
76
92
|
|
77
|
-
def
|
78
|
-
|
93
|
+
def parse_match_records_v1(raw_records)
|
94
|
+
[
|
95
|
+
raw_records.first.first,
|
96
|
+
parse_records(raw_records[1], raw_records[2..-1]),
|
97
|
+
]
|
79
98
|
end
|
80
99
|
|
81
|
-
def
|
100
|
+
def parse_match_records_v3(raw_records)
|
101
|
+
[
|
102
|
+
raw_records["n_hits"],
|
103
|
+
parse_records(raw_records["columns"], raw_records["records"]),
|
104
|
+
]
|
105
|
+
end
|
106
|
+
|
107
|
+
def parse_drilldowns_v1(raw_drilldowns)
|
82
108
|
(raw_drilldowns || []).collect.with_index do |raw_drilldown, i|
|
83
109
|
key = @command.drilldowns[i]
|
84
|
-
n_hits,
|
85
|
-
Drilldown.new(key, n_hits,
|
110
|
+
n_hits, records = parse_match_records_v1(raw_drilldown)
|
111
|
+
Drilldown.new(key, n_hits, records)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def parse_drilldowns_v3(raw_drilldowns)
|
116
|
+
(raw_drilldowns || {}).collect do |(key, raw_drilldown)|
|
117
|
+
n_hits, records = parse_match_records_v3(raw_drilldown)
|
118
|
+
Drilldown.new(key, n_hits, records)
|
86
119
|
end
|
87
120
|
end
|
88
121
|
|
89
|
-
class Drilldown < Struct.new(:key, :n_hits, :
|
122
|
+
class Drilldown < Struct.new(:key, :n_hits, :records)
|
123
|
+
# @deprecated since 0.2.6. Use {#records} instead.
|
124
|
+
alias_method :items, :records
|
90
125
|
end
|
91
126
|
end
|
92
127
|
end
|
data/test/response/test-base.rb
CHANGED
@@ -18,95 +18,194 @@ require "response/helper"
|
|
18
18
|
|
19
19
|
class TestResponseBase < Test::Unit::TestCase
|
20
20
|
class TestHeader < self
|
21
|
-
class
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
class TestCommandVersion1 < self
|
22
|
+
class TestReturnCode < self
|
23
|
+
def test_have_header
|
24
|
+
header = [
|
25
|
+
-21,
|
26
|
+
1396012478.14975,
|
27
|
+
0.00050806999206543,
|
28
|
+
]
|
29
|
+
response = Groonga::Client::Response::Base.new(nil, header, nil)
|
30
|
+
assert_equal(-21, response.return_code)
|
31
|
+
end
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
def test_no_header
|
34
|
+
response = Groonga::Client::Response::Error.new(nil, nil, nil)
|
35
|
+
assert_equal(0, response.return_code)
|
36
|
+
end
|
35
37
|
end
|
36
|
-
end
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
39
|
+
class TestStartTime < self
|
40
|
+
def test_have_header
|
41
|
+
start_time = 1396012478.14975
|
42
|
+
header = [
|
43
|
+
-21,
|
44
|
+
start_time,
|
45
|
+
0.00050806999206543,
|
46
|
+
]
|
47
|
+
response = Groonga::Client::Response::Base.new(nil, header, nil)
|
48
|
+
assert_equal(Time.at(start_time), response.start_time)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_no_header
|
52
|
+
response = Groonga::Client::Response::Error.new(nil, nil, nil)
|
53
|
+
assert_equal(Time.at(0), response.start_time)
|
54
|
+
end
|
48
55
|
end
|
49
56
|
|
50
|
-
|
51
|
-
|
52
|
-
|
57
|
+
class TestElapsedTime < self
|
58
|
+
def test_have_header
|
59
|
+
elapsed_time = 0.00050806999206543
|
60
|
+
header = [
|
61
|
+
-21,
|
62
|
+
1396012478.14975,
|
63
|
+
elapsed_time,
|
64
|
+
]
|
65
|
+
response = Groonga::Client::Response::Base.new(nil, header, nil)
|
66
|
+
assert_equal(elapsed_time, response.elapsed_time)
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_no_header
|
70
|
+
response = Groonga::Client::Response::Error.new(nil, nil, nil)
|
71
|
+
assert_equal(0.0, response.elapsed_time)
|
72
|
+
end
|
53
73
|
end
|
54
|
-
end
|
55
74
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
75
|
+
class TestErrorMessage < self
|
76
|
+
def test_have_header
|
77
|
+
error_message = "invalid argument"
|
78
|
+
header = [
|
79
|
+
-21,
|
80
|
+
1396012478.14975,
|
81
|
+
0.00050806999206543,
|
82
|
+
error_message,
|
83
|
+
]
|
84
|
+
response = Groonga::Client::Response::Base.new(nil, header, nil)
|
85
|
+
assert_equal(error_message, response.error_message)
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_no_header
|
89
|
+
response = Groonga::Client::Response::Error.new(nil, nil, nil)
|
90
|
+
assert_nil(response.error_message)
|
91
|
+
end
|
66
92
|
end
|
67
93
|
|
68
|
-
|
69
|
-
|
70
|
-
|
94
|
+
class TestSuccess < self
|
95
|
+
def test_have_header
|
96
|
+
header = [
|
97
|
+
-21,
|
98
|
+
1396012478.14975,
|
99
|
+
0.00050806999206543,
|
100
|
+
]
|
101
|
+
response = Groonga::Client::Response::Base.new(nil, header, nil)
|
102
|
+
assert do
|
103
|
+
not response.success?
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_no_header
|
108
|
+
response = Groonga::Client::Response::Error.new(nil, nil, nil)
|
109
|
+
assert do
|
110
|
+
response.success?
|
111
|
+
end
|
112
|
+
end
|
71
113
|
end
|
72
114
|
end
|
73
115
|
|
74
|
-
class
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
116
|
+
class TestCommandVersion3 < self
|
117
|
+
class TestReturnCode < self
|
118
|
+
def test_have_header
|
119
|
+
header = {
|
120
|
+
"return_code" => -21,
|
121
|
+
"start_time" => 1396012478.14975,
|
122
|
+
"elapsed_time" => 0.00050806999206543,
|
123
|
+
}
|
124
|
+
response = Groonga::Client::Response::Base.new(nil, header, nil)
|
125
|
+
assert_equal(-21, response.return_code)
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_no_header
|
129
|
+
response = Groonga::Client::Response::Error.new(nil, nil, nil)
|
130
|
+
assert_equal(0, response.return_code)
|
131
|
+
end
|
85
132
|
end
|
86
133
|
|
87
|
-
|
88
|
-
|
89
|
-
|
134
|
+
class TestStartTime < self
|
135
|
+
def test_have_header
|
136
|
+
start_time = 1396012478.14975
|
137
|
+
header = {
|
138
|
+
"return_code" => -21,
|
139
|
+
"start_time" => start_time,
|
140
|
+
"elapsed_time" => 0.00050806999206543,
|
141
|
+
}
|
142
|
+
response = Groonga::Client::Response::Base.new(nil, header, nil)
|
143
|
+
assert_equal(Time.at(start_time), response.start_time)
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_no_header
|
147
|
+
response = Groonga::Client::Response::Error.new(nil, nil, nil)
|
148
|
+
assert_equal(Time.at(0), response.start_time)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
class TestElapsedTime < self
|
153
|
+
def test_have_header
|
154
|
+
elapsed_time = 0.00050806999206543
|
155
|
+
header = {
|
156
|
+
"return_code" => -21,
|
157
|
+
"start_time" => 1396012478.14975,
|
158
|
+
"elapsed_time" => elapsed_time,
|
159
|
+
}
|
160
|
+
response = Groonga::Client::Response::Base.new(nil, header, nil)
|
161
|
+
assert_equal(elapsed_time, response.elapsed_time)
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_no_header
|
165
|
+
response = Groonga::Client::Response::Error.new(nil, nil, nil)
|
166
|
+
assert_equal(0.0, response.elapsed_time)
|
167
|
+
end
|
90
168
|
end
|
91
|
-
end
|
92
169
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
170
|
+
class TestErrorMessage < self
|
171
|
+
def test_have_header
|
172
|
+
error_message = "invalid argument"
|
173
|
+
header = {
|
174
|
+
"return_code" => -21,
|
175
|
+
"start_time" => 1396012478.14975,
|
176
|
+
"elapsed_time" => 0.00050806999206543,
|
177
|
+
"error" => {
|
178
|
+
"message" => error_message,
|
179
|
+
},
|
180
|
+
}
|
181
|
+
response = Groonga::Client::Response::Base.new(nil, header, nil)
|
182
|
+
assert_equal(error_message, response.error_message)
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_no_header
|
186
|
+
response = Groonga::Client::Response::Error.new(nil, nil, nil)
|
187
|
+
assert_nil(response.error_message)
|
103
188
|
end
|
104
189
|
end
|
105
190
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
191
|
+
class TestSuccess < self
|
192
|
+
def test_have_header
|
193
|
+
header = {
|
194
|
+
"return_code" => -21,
|
195
|
+
"start_time" => 1396012478.14975,
|
196
|
+
"elapsed_time" => 0.00050806999206543,
|
197
|
+
}
|
198
|
+
response = Groonga::Client::Response::Base.new(nil, header, nil)
|
199
|
+
assert do
|
200
|
+
not response.success?
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_no_header
|
205
|
+
response = Groonga::Client::Response::Error.new(nil, nil, nil)
|
206
|
+
assert do
|
207
|
+
response.success?
|
208
|
+
end
|
110
209
|
end
|
111
210
|
end
|
112
211
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2013-
|
1
|
+
# Copyright (C) 2013-2016 Kouhei Sutou <kou@clear-code.com>
|
2
2
|
# Copyright (C) 2013 Kosuke Asami
|
3
3
|
#
|
4
4
|
# This library is free software; you can redistribute it and/or
|
@@ -17,7 +17,7 @@
|
|
17
17
|
|
18
18
|
require "response/helper"
|
19
19
|
|
20
|
-
class
|
20
|
+
class TestResponseSelectCommandVersion1 < Test::Unit::TestCase
|
21
21
|
class TestParseRawResponse < self
|
22
22
|
include TestResponseHelper
|
23
23
|
|
@@ -54,6 +54,30 @@ class TestResponseSelect < Test::Unit::TestCase
|
|
54
54
|
records([[[1], [["updated_at", "Time"]], [updated_at]]]))
|
55
55
|
end
|
56
56
|
|
57
|
+
def test_time_vector
|
58
|
+
update1 = 1379040474
|
59
|
+
update2 = 1464598349
|
60
|
+
assert_equal([
|
61
|
+
{
|
62
|
+
"updates" => [
|
63
|
+
Time.at(update1),
|
64
|
+
Time.at(update2),
|
65
|
+
],
|
66
|
+
},
|
67
|
+
],
|
68
|
+
records([
|
69
|
+
[
|
70
|
+
[1],
|
71
|
+
[
|
72
|
+
["updates", "Time"],
|
73
|
+
],
|
74
|
+
[
|
75
|
+
[update1, update2],
|
76
|
+
],
|
77
|
+
]
|
78
|
+
]))
|
79
|
+
end
|
80
|
+
|
57
81
|
def test_duplicated_column_name
|
58
82
|
assert_equal([
|
59
83
|
{
|
@@ -88,7 +112,7 @@ class TestResponseSelect < Test::Unit::TestCase
|
|
88
112
|
class TestDrilldowns < self
|
89
113
|
def setup
|
90
114
|
pair_arguments = {
|
91
|
-
"drilldown" => "
|
115
|
+
"drilldown" => "tag",
|
92
116
|
"drilldown_output_columns" => "_key,_nsubrecs",
|
93
117
|
}
|
94
118
|
@command = Groonga::Command::Select.new("select", pair_arguments)
|
@@ -108,7 +132,7 @@ class TestResponseSelect < Test::Unit::TestCase
|
|
108
132
|
["rroonga", 9],
|
109
133
|
],
|
110
134
|
]
|
111
|
-
assert_equal(["
|
135
|
+
assert_equal(["tag"],
|
112
136
|
drilldowns(body).collect(&:key))
|
113
137
|
end
|
114
138
|
|
@@ -0,0 +1,274 @@
|
|
1
|
+
# Copyright (C) 2013-2016 Kouhei Sutou <kou@clear-code.com>
|
2
|
+
# Copyright (C) 2013 Kosuke Asami
|
3
|
+
#
|
4
|
+
# This library is free software; you can redistribute it and/or
|
5
|
+
# modify it under the terms of the GNU Lesser General Public
|
6
|
+
# License as published by the Free Software Foundation; either
|
7
|
+
# version 2.1 of the License, or (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This library is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
12
|
+
# Lesser General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
15
|
+
# License along with this library; if not, write to the Free Software
|
16
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
17
|
+
|
18
|
+
require "response/helper"
|
19
|
+
|
20
|
+
class TestResponseSelectCommandVersion3 < Test::Unit::TestCase
|
21
|
+
class TestParseRawResponse < self
|
22
|
+
include TestResponseHelper
|
23
|
+
|
24
|
+
def test_select
|
25
|
+
header = {
|
26
|
+
"return_code" => 0,
|
27
|
+
"start_time" => 1372430096.70991,
|
28
|
+
"elapsed_time" => 0.000522851943969727,
|
29
|
+
}
|
30
|
+
body = {
|
31
|
+
"n_hits" => 1,
|
32
|
+
"columns" => [
|
33
|
+
{
|
34
|
+
"name" => "_id",
|
35
|
+
"type" => "UInt32",
|
36
|
+
},
|
37
|
+
],
|
38
|
+
"records" => [
|
39
|
+
1,
|
40
|
+
],
|
41
|
+
}
|
42
|
+
raw_response = {
|
43
|
+
"header" => header,
|
44
|
+
"body" => body,
|
45
|
+
}.to_json
|
46
|
+
|
47
|
+
response = parse_raw_response("select", raw_response)
|
48
|
+
assert_equal(Groonga::Client::Response::Select, response.class)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class TestBody < self
|
53
|
+
def setup
|
54
|
+
@command = Groonga::Command::Select.new("select", {})
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_n_hits
|
58
|
+
response = create_response({
|
59
|
+
"n_hits" => 29,
|
60
|
+
"columns" => [
|
61
|
+
{
|
62
|
+
"name" => "_id",
|
63
|
+
"type" => "UInt32",
|
64
|
+
},
|
65
|
+
],
|
66
|
+
"records" => [
|
67
|
+
],
|
68
|
+
})
|
69
|
+
assert_equal(29, response.n_hits)
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
def create_response(body)
|
74
|
+
header = {
|
75
|
+
"return_code" => 0,
|
76
|
+
"start_time" => 1372430096.70991,
|
77
|
+
"elapsed_time" => 0.000522851943969727,
|
78
|
+
}
|
79
|
+
Groonga::Client::Response::Select.new(@command, header, body)
|
80
|
+
end
|
81
|
+
|
82
|
+
class TestRecords < self
|
83
|
+
def test_time
|
84
|
+
updated_at = 1379040474
|
85
|
+
assert_equal([{"updated_at" => Time.at(updated_at)}],
|
86
|
+
records({
|
87
|
+
"n_hits" => 1,
|
88
|
+
"columns" => [
|
89
|
+
{
|
90
|
+
"name" => "updated_at",
|
91
|
+
"type" => "Time",
|
92
|
+
},
|
93
|
+
],
|
94
|
+
"records" => [
|
95
|
+
[updated_at],
|
96
|
+
],
|
97
|
+
}))
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_time_vector
|
101
|
+
update1 = 1379040474
|
102
|
+
update2 = 1464598349
|
103
|
+
assert_equal([
|
104
|
+
{
|
105
|
+
"updates" => [
|
106
|
+
Time.at(update1),
|
107
|
+
Time.at(update2),
|
108
|
+
],
|
109
|
+
},
|
110
|
+
],
|
111
|
+
records({
|
112
|
+
"n_hits" => 1,
|
113
|
+
"columns" => [
|
114
|
+
{
|
115
|
+
"name" => "updates",
|
116
|
+
"type" => "Time",
|
117
|
+
},
|
118
|
+
],
|
119
|
+
"records" => [
|
120
|
+
[
|
121
|
+
[update1, update2],
|
122
|
+
],
|
123
|
+
],
|
124
|
+
}))
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_duplicated_column_name
|
128
|
+
assert_equal([
|
129
|
+
{
|
130
|
+
"html_escape" => "content1",
|
131
|
+
"html_escape2" => "content2",
|
132
|
+
"html_escape3" => "content3",
|
133
|
+
}
|
134
|
+
],
|
135
|
+
records({
|
136
|
+
"n_hits" => 1,
|
137
|
+
"columns" => [
|
138
|
+
{
|
139
|
+
"name" => "html_escape",
|
140
|
+
"type" => nil,
|
141
|
+
},
|
142
|
+
{
|
143
|
+
"name" => "html_escape",
|
144
|
+
"type" => nil,
|
145
|
+
},
|
146
|
+
{
|
147
|
+
"name" => "html_escape",
|
148
|
+
"type" => nil,
|
149
|
+
}
|
150
|
+
],
|
151
|
+
"records" => [
|
152
|
+
["content1", "content2", "content3"],
|
153
|
+
],
|
154
|
+
}))
|
155
|
+
end
|
156
|
+
|
157
|
+
private
|
158
|
+
def records(body)
|
159
|
+
create_response(body).records
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
class TestDrilldowns < self
|
164
|
+
def setup
|
165
|
+
pair_arguments = {
|
166
|
+
"drilldown" => "tag",
|
167
|
+
"drilldown_output_columns" => "_key,_nsubrecs",
|
168
|
+
}
|
169
|
+
@command = Groonga::Command::Select.new("select", pair_arguments)
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_key
|
173
|
+
body = {
|
174
|
+
"n_hits" => 0,
|
175
|
+
"columns" => [],
|
176
|
+
"records" => [],
|
177
|
+
"drilldowns" => {
|
178
|
+
"tag" => {
|
179
|
+
"n_hits" => 29,
|
180
|
+
"columns" => [
|
181
|
+
{
|
182
|
+
"name" => "_key",
|
183
|
+
"type" => "ShortText",
|
184
|
+
},
|
185
|
+
{
|
186
|
+
"name" => "_nsubrecs",
|
187
|
+
"type" => "Int32",
|
188
|
+
},
|
189
|
+
],
|
190
|
+
"records" => [
|
191
|
+
["groonga", 29],
|
192
|
+
["Ruby", 19],
|
193
|
+
["rroonga", 9],
|
194
|
+
],
|
195
|
+
},
|
196
|
+
},
|
197
|
+
}
|
198
|
+
assert_equal(["tag"],
|
199
|
+
drilldowns(body).collect(&:key))
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_n_hits
|
203
|
+
body = {
|
204
|
+
"n_hits" => 0,
|
205
|
+
"columns" => [],
|
206
|
+
"records" => [],
|
207
|
+
"drilldowns" => {
|
208
|
+
"tag" => {
|
209
|
+
"n_hits" => 29,
|
210
|
+
"columns" => [
|
211
|
+
{
|
212
|
+
"name" => "_key",
|
213
|
+
"type" => "ShortText",
|
214
|
+
},
|
215
|
+
{
|
216
|
+
"name" => "_nsubrecs",
|
217
|
+
"type" => "Int32",
|
218
|
+
},
|
219
|
+
],
|
220
|
+
"records" => [
|
221
|
+
["groonga", 29],
|
222
|
+
["Ruby", 19],
|
223
|
+
["rroonga", 9],
|
224
|
+
],
|
225
|
+
},
|
226
|
+
},
|
227
|
+
}
|
228
|
+
assert_equal([29],
|
229
|
+
drilldowns(body).collect(&:n_hits))
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_items
|
233
|
+
body = {
|
234
|
+
"n_hits" => 0,
|
235
|
+
"columns" => [],
|
236
|
+
"records" => [],
|
237
|
+
"drilldowns" => {
|
238
|
+
"tag" => {
|
239
|
+
"n_hits" => 29,
|
240
|
+
"columns" => [
|
241
|
+
{
|
242
|
+
"name" => "_key",
|
243
|
+
"type" => "ShortText",
|
244
|
+
},
|
245
|
+
{
|
246
|
+
"name" => "_nsubrecs",
|
247
|
+
"type" => "Int32",
|
248
|
+
},
|
249
|
+
],
|
250
|
+
"records" => [
|
251
|
+
["groonga", 29],
|
252
|
+
["Ruby", 19],
|
253
|
+
["rroonga", 9],
|
254
|
+
],
|
255
|
+
},
|
256
|
+
},
|
257
|
+
}
|
258
|
+
assert_equal([
|
259
|
+
[
|
260
|
+
{"_key" => "groonga", "_nsubrecs" => 29},
|
261
|
+
{"_key" => "Ruby", "_nsubrecs" => 19},
|
262
|
+
{"_key" => "rroonga", "_nsubrecs" => 9},
|
263
|
+
],
|
264
|
+
],
|
265
|
+
drilldowns(body).collect(&:items))
|
266
|
+
end
|
267
|
+
|
268
|
+
private
|
269
|
+
def drilldowns(body)
|
270
|
+
create_response(body).drilldowns
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
data/test/run-test.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: groonga-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Haruka Yoshihara
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2016-
|
13
|
+
date: 2016-06-17 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: gqtp
|
@@ -96,20 +96,6 @@ dependencies:
|
|
96
96
|
- - ">="
|
97
97
|
- !ruby/object:Gem::Version
|
98
98
|
version: '0'
|
99
|
-
- !ruby/object:Gem::Dependency
|
100
|
-
name: test-unit-notify
|
101
|
-
requirement: !ruby/object:Gem::Requirement
|
102
|
-
requirements:
|
103
|
-
- - ">="
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
version: '0'
|
106
|
-
type: :development
|
107
|
-
prerelease: false
|
108
|
-
version_requirements: !ruby/object:Gem::Requirement
|
109
|
-
requirements:
|
110
|
-
- - ">="
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
version: '0'
|
113
99
|
- !ruby/object:Gem::Dependency
|
114
100
|
name: test-unit-rr
|
115
101
|
requirement: !ruby/object:Gem::Requirement
|
@@ -232,7 +218,8 @@ files:
|
|
232
218
|
- test/response/test-column-list.rb
|
233
219
|
- test/response/test-error.rb
|
234
220
|
- test/response/test-schema.rb
|
235
|
-
- test/response/test-select.rb
|
221
|
+
- test/response/test-select-command-version1.rb
|
222
|
+
- test/response/test-select-command-version3.rb
|
236
223
|
- test/response/test-status.rb
|
237
224
|
- test/response/test-table-create.rb
|
238
225
|
- test/response/test-table-list.rb
|
@@ -282,7 +269,8 @@ test_files:
|
|
282
269
|
- test/response/test-table-list.rb
|
283
270
|
- test/response/test-status.rb
|
284
271
|
- test/response/test-schema.rb
|
285
|
-
- test/response/test-select.rb
|
272
|
+
- test/response/test-select-command-version3.rb
|
273
|
+
- test/response/test-select-command-version1.rb
|
286
274
|
- test/response/test-table-create.rb
|
287
275
|
- test/response/test-table-remove.rb
|
288
276
|
- test/results/test-column-list.rb
|