groonga-client 0.5.1 → 0.5.2
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 +6 -0
- data/lib/groonga/client/response/base.rb +3 -11
- data/lib/groonga/client/response/select.rb +78 -0
- data/lib/groonga/client/version.rb +1 -1
- data/test/response/helper.rb +11 -2
- data/test/response/test-select-xml.rb +105 -0
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 98c07600cda5089240101c97f1055cee06406515
|
|
4
|
+
data.tar.gz: c26124ec4e3364a316949bb21bb9fbc00cac6661
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d3aeb65b3107c978fdfef99efe64aadc4a5fd7c5ed4a4835c6377d2d1910acb795994e923ac2cd7bed0737d89740999e8a2c50f511ac762b2797593ad0be4e04
|
|
7
|
+
data.tar.gz: dedc41cf9ce0f590bb557574d310d55a02cff6c033eec799ff30253093e18182c1141a9801eed0d8aee46df5c583b936511560d9905aabe673aaf2abaf3f78ef
|
data/doc/text/news.md
CHANGED
|
@@ -93,18 +93,10 @@ module Groonga
|
|
|
93
93
|
|
|
94
94
|
private
|
|
95
95
|
def parse_xml(response)
|
|
96
|
-
# FIXME: Use more fast XML parser
|
|
97
|
-
# Extract as a class
|
|
98
96
|
document = REXML::Document.new(response)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
header = parse_xml_header(result_element)
|
|
103
|
-
body = parse_xml_body(result_element.elements[1])
|
|
104
|
-
else
|
|
105
|
-
header = nil
|
|
106
|
-
body = parse_xml_body(root_element)
|
|
107
|
-
end
|
|
97
|
+
result_element = document.root
|
|
98
|
+
header = parse_xml_header(result_element)
|
|
99
|
+
body = parse_xml_body(result_element.elements[1])
|
|
108
100
|
[header, body]
|
|
109
101
|
end
|
|
110
102
|
|
|
@@ -24,6 +24,84 @@ module Groonga
|
|
|
24
24
|
class Select < Base
|
|
25
25
|
Response.register("select", self)
|
|
26
26
|
|
|
27
|
+
class << self
|
|
28
|
+
private
|
|
29
|
+
def parse_xml(response)
|
|
30
|
+
document = REXML::Document.new(response)
|
|
31
|
+
return super if document.root.name == "RESULT"
|
|
32
|
+
|
|
33
|
+
result_page = document.elements["SEGMENTS/SEGMENT/RESULTPAGE"]
|
|
34
|
+
result_set = result_page.elements["RESULTSET"]
|
|
35
|
+
n_hits, columns, records = parse_xml_result_set(result_set)
|
|
36
|
+
|
|
37
|
+
navigation_entry = result_page.elements["NAVIGATIONENTRY"]
|
|
38
|
+
drilldowns = parse_xml_navigation_entry(navigation_entry)
|
|
39
|
+
|
|
40
|
+
header = nil
|
|
41
|
+
body = [
|
|
42
|
+
[
|
|
43
|
+
[n_hits],
|
|
44
|
+
columns,
|
|
45
|
+
*records,
|
|
46
|
+
],
|
|
47
|
+
*drilldowns,
|
|
48
|
+
]
|
|
49
|
+
[header, body]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def parse_xml_result_set(result_set)
|
|
53
|
+
n_hits = Integer(result_set.attributes["NHITS"])
|
|
54
|
+
|
|
55
|
+
columns = []
|
|
56
|
+
records = []
|
|
57
|
+
result_set.each_element("HIT") do |hit|
|
|
58
|
+
if columns.empty?
|
|
59
|
+
hit.each_element("FIELD") do |field|
|
|
60
|
+
name = field.attributes["NAME"]
|
|
61
|
+
columns << [name, "ShortText"]
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
record = []
|
|
65
|
+
hit.each_element("FIELD") do |field|
|
|
66
|
+
record << field.text
|
|
67
|
+
end
|
|
68
|
+
records << record
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
[n_hits, columns, records]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def parse_xml_navigation_entry(navigation_entry)
|
|
75
|
+
return [] if navigation_entry.nil?
|
|
76
|
+
|
|
77
|
+
drilldowns = []
|
|
78
|
+
navigation_entry.each_element("NAVIGATIONELEMENTS") do |elements|
|
|
79
|
+
n_hits = Integer(elements.attributes["COUNT"])
|
|
80
|
+
columns = []
|
|
81
|
+
drilldown = []
|
|
82
|
+
elements.each_element("NAVIGATIONELEMENT") do |element|
|
|
83
|
+
if columns.empty?
|
|
84
|
+
element.attributes.each do |name, value|
|
|
85
|
+
columns << [name, "ShortText"]
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
drilldown << element.attributes.collect do |_, value|
|
|
90
|
+
value
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
drilldowns << [
|
|
95
|
+
[n_hits],
|
|
96
|
+
columns,
|
|
97
|
+
*drilldown,
|
|
98
|
+
]
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
drilldowns
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
27
105
|
include Enumerable
|
|
28
106
|
|
|
29
107
|
# @return [Integer] The number of records that match againt
|
data/test/response/helper.rb
CHANGED
|
@@ -16,9 +16,18 @@
|
|
|
16
16
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
17
17
|
|
|
18
18
|
module TestResponseHelper
|
|
19
|
-
def
|
|
19
|
+
def parse_raw_response_raw(command_name, pair_arguments, raw_response)
|
|
20
20
|
command_class = Groonga::Command.find(command_name)
|
|
21
|
-
command = command_class.new(command_name,
|
|
21
|
+
command = command_class.new(command_name, pair_arguments)
|
|
22
22
|
Groonga::Client::Response.parse(command, raw_response)
|
|
23
23
|
end
|
|
24
|
+
|
|
25
|
+
def parse_raw_response(command_name, raw_response)
|
|
26
|
+
parse_raw_response_raw(command_name, {}, raw_response)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def parse_raw_xml_response(command_name, raw_response)
|
|
30
|
+
parse_raw_response_raw(command_name, {"output_type" => "xml"},
|
|
31
|
+
raw_response)
|
|
32
|
+
end
|
|
24
33
|
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Copyright (C) 2017 Kouhei Sutou <kou@clear-code.com>
|
|
2
|
+
#
|
|
3
|
+
# This library is free software; you can redistribute it and/or
|
|
4
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
5
|
+
# License as published by the Free Software Foundation; either
|
|
6
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
7
|
+
#
|
|
8
|
+
# This library is distributed in the hope that it will be useful,
|
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
11
|
+
# Lesser General Public License for more details.
|
|
12
|
+
#
|
|
13
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
14
|
+
# License along with this library; if not, write to the Free Software
|
|
15
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
16
|
+
|
|
17
|
+
require "response/helper"
|
|
18
|
+
|
|
19
|
+
class TestResponseSelectXML < Test::Unit::TestCase
|
|
20
|
+
include TestResponseHelper
|
|
21
|
+
|
|
22
|
+
def drilldown(key, n_hits, records)
|
|
23
|
+
Groonga::Client::Response::Select::Drilldown.new(key, n_hits, records)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_basic
|
|
27
|
+
raw_response = <<-XML
|
|
28
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
29
|
+
<SEGMENTS>
|
|
30
|
+
<SEGMENT>
|
|
31
|
+
<RESULTPAGE>
|
|
32
|
+
<RESULTSET OFFSET="0" LIMIT="1" NHITS="100">
|
|
33
|
+
<HIT NO="1">
|
|
34
|
+
<FIELD NAME="_id">1</FIELD>
|
|
35
|
+
</HIT>
|
|
36
|
+
</RESULTSET>
|
|
37
|
+
</RESULTPAGE>
|
|
38
|
+
</SEGMENT>
|
|
39
|
+
</SEGMENTS>
|
|
40
|
+
XML
|
|
41
|
+
|
|
42
|
+
response = parse_raw_xml_response("select", raw_response)
|
|
43
|
+
assert_equal({
|
|
44
|
+
:return_code => 0,
|
|
45
|
+
:start_time => Time.at(0),
|
|
46
|
+
:elapsed_time => 0.0,
|
|
47
|
+
:records => [{"_id" => "1"}],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
:return_code => response.return_code,
|
|
51
|
+
:start_time => response.start_time,
|
|
52
|
+
:elapsed_time => response.elapsed_time,
|
|
53
|
+
:records => response.records,
|
|
54
|
+
})
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_drilldown
|
|
58
|
+
raw_response = <<-XML
|
|
59
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
60
|
+
<SEGMENTS>
|
|
61
|
+
<SEGMENT>
|
|
62
|
+
<RESULTPAGE>
|
|
63
|
+
<RESULTSET OFFSET="0" LIMIT="0" NHITS="100">
|
|
64
|
+
</RESULTSET>
|
|
65
|
+
<NAVIGATIONENTRY>
|
|
66
|
+
<NAVIGATIONELEMENTS COUNT="7">
|
|
67
|
+
<NAVIGATIONELEMENT _key="2.2.0" _nsubrecs="18044" />
|
|
68
|
+
<NAVIGATIONELEMENT _key="2.3.0" _nsubrecs="18115" />
|
|
69
|
+
<NAVIGATIONELEMENT _key="2.4.0" _nsubrecs="14594" />
|
|
70
|
+
</NAVIGATIONELEMENTS>
|
|
71
|
+
</NAVIGATIONENTRY>
|
|
72
|
+
</RESULTPAGE>
|
|
73
|
+
</SEGMENT>
|
|
74
|
+
</SEGMENTS>
|
|
75
|
+
XML
|
|
76
|
+
|
|
77
|
+
response = parse_raw_response_raw("select",
|
|
78
|
+
{
|
|
79
|
+
"drilldown" => "version",
|
|
80
|
+
"output_type" => "xml",
|
|
81
|
+
},
|
|
82
|
+
raw_response)
|
|
83
|
+
drilldown_records = [
|
|
84
|
+
{"_key" => "2.2.0", "_nsubrecs" => "18044"},
|
|
85
|
+
{"_key" => "2.3.0", "_nsubrecs" => "18115"},
|
|
86
|
+
{"_key" => "2.4.0", "_nsubrecs" => "14594"},
|
|
87
|
+
]
|
|
88
|
+
assert_equal({
|
|
89
|
+
:return_code => 0,
|
|
90
|
+
:start_time => Time.at(0),
|
|
91
|
+
:elapsed_time => 0.0,
|
|
92
|
+
:records => [],
|
|
93
|
+
:drilldowns => [
|
|
94
|
+
drilldown("version", 7, drilldown_records),
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
:return_code => response.return_code,
|
|
99
|
+
:start_time => response.start_time,
|
|
100
|
+
:elapsed_time => response.elapsed_time,
|
|
101
|
+
:records => response.records,
|
|
102
|
+
:drilldowns => response.drilldowns,
|
|
103
|
+
})
|
|
104
|
+
end
|
|
105
|
+
end
|
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.5.
|
|
4
|
+
version: 0.5.2
|
|
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: 2017-
|
|
13
|
+
date: 2017-09-27 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: gqtp
|
|
@@ -240,6 +240,7 @@ files:
|
|
|
240
240
|
- test/response/test-schema.rb
|
|
241
241
|
- test/response/test-select-command-version1.rb
|
|
242
242
|
- test/response/test-select-command-version3.rb
|
|
243
|
+
- test/response/test-select-xml.rb
|
|
243
244
|
- test/response/test-status.rb
|
|
244
245
|
- test/response/test-table-create.rb
|
|
245
246
|
- test/response/test-table-list.rb
|
|
@@ -298,6 +299,7 @@ test_files:
|
|
|
298
299
|
- test/response/test-error.rb
|
|
299
300
|
- test/response/test-table-list.rb
|
|
300
301
|
- test/response/test-status.rb
|
|
302
|
+
- test/response/test-select-xml.rb
|
|
301
303
|
- test/response/test-schema.rb
|
|
302
304
|
- test/response/test-select-command-version3.rb
|
|
303
305
|
- test/response/test-select-command-version1.rb
|