groonga-client 0.2.2 → 0.2.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/doc/text/news.md +13 -1
- data/lib/groonga/client/response/schema.rb +122 -8
- data/lib/groonga/client/version.rb +1 -1
- data/test/response/test-schema.rb +151 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13c9c1e871ac9bb792323a889b57eff795821300
|
4
|
+
data.tar.gz: 0437713eec1f8aae199978bda285fbc765958a81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dad7cfa134e3e11c426ab8cc62c399c455a1fbd4859759107bdf93f150ca1a581b9f8e7ffa5c025f6b20c334c39f9ea0e3d1077a0c45d24c0cb9abedf484e035
|
7
|
+
data.tar.gz: f2c0a41b91e8dbbcbbb93adf21b1845c13817f0c28e9868e9c4ccfe640e3f139d8a09b7a0123fdc3b5126eb4557cec2c0bfde891793b79f7ba3ac8b3c3e78cbe
|
data/doc/text/news.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# NEWS
|
2
2
|
|
3
|
-
## 0.2.
|
3
|
+
## 0.2.3 - 2016-03-22
|
4
4
|
|
5
5
|
### Improvements
|
6
6
|
|
@@ -8,6 +8,18 @@
|
|
8
8
|
|
9
9
|
* response: Supported `schema` command partially.
|
10
10
|
|
11
|
+
## 0.2.2 - 2016-03-22
|
12
|
+
|
13
|
+
### Improvements
|
14
|
+
|
15
|
+
* response: `schema`: Supported index.
|
16
|
+
|
17
|
+
* response: `schema`: Supported normalizer.
|
18
|
+
|
19
|
+
* response: `schema`: Supported token filter.
|
20
|
+
|
21
|
+
* response: `schema`: Supported tokenizer.
|
22
|
+
|
11
23
|
### Fixes
|
12
24
|
|
13
25
|
* Fixed a bug that `Groonga::Command` isn't accepted.
|
@@ -45,18 +45,49 @@ module Groonga
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
+
# @return [Hash<String, Normalizer>] Key is normalizer name and
|
49
|
+
# value is the definition of the normalizer.
|
50
|
+
#
|
51
|
+
# @since 0.2.3
|
52
|
+
def normalizers
|
53
|
+
@normalizers ||= HashValueConverter.convert(@body["normalizers"]) do |normalizer|
|
54
|
+
Normalizer[normalizer]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# @return [Hash<String, TokenFilter>] Key is token filter name and
|
59
|
+
# value is the definition of the token filter.
|
60
|
+
#
|
61
|
+
# @since 0.2.3
|
62
|
+
def token_filters
|
63
|
+
@token_filters ||= HashValueConverter.convert(@body["token_filters"]) do |token_filter|
|
64
|
+
TokenFilter[token_filter]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
48
68
|
# @return [Hash<String, Table>] Key is table name and value is the
|
49
69
|
# definition of the table.
|
50
70
|
#
|
51
71
|
# @since 0.2.2
|
52
72
|
def tables
|
53
|
-
@tables ||=
|
54
|
-
|
55
|
-
|
56
|
-
|
73
|
+
@tables ||= nil
|
74
|
+
return @tables if @tables
|
75
|
+
|
76
|
+
@tables = {}
|
77
|
+
@body["tables"].each do |key, _|
|
78
|
+
@tables[key] = Table.new(self)
|
79
|
+
end
|
80
|
+
@body["tables"].each do |key, raw_table|
|
81
|
+
table = @tables[key]
|
82
|
+
raw_table.each do |table_key, table_value|
|
83
|
+
table[table_key] = table_value
|
57
84
|
end
|
58
|
-
table
|
59
85
|
end
|
86
|
+
@tables
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
def coerce_tables
|
60
91
|
end
|
61
92
|
|
62
93
|
module HashValueConverter
|
@@ -79,6 +110,14 @@ module Groonga
|
|
79
110
|
include Hashie::Extensions::MethodAccess
|
80
111
|
end
|
81
112
|
|
113
|
+
class Normalizer < Hash
|
114
|
+
include Hashie::Extensions::MethodAccess
|
115
|
+
end
|
116
|
+
|
117
|
+
class TokenFilter < Hash
|
118
|
+
include Hashie::Extensions::MethodAccess
|
119
|
+
end
|
120
|
+
|
82
121
|
class KeyType < Hash
|
83
122
|
include Hashie::Extensions::MethodAccess
|
84
123
|
end
|
@@ -87,16 +126,67 @@ module Groonga
|
|
87
126
|
include Hashie::Extensions::MethodAccess
|
88
127
|
end
|
89
128
|
|
129
|
+
class Index < Hash
|
130
|
+
include Hashie::Extensions::MethodAccess
|
131
|
+
|
132
|
+
def initialize(schema, raw_index)
|
133
|
+
@schema = schema
|
134
|
+
super()
|
135
|
+
raw_index.each do |key, value|
|
136
|
+
self[key] = value
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def []=(key, value)
|
141
|
+
case key.to_sym
|
142
|
+
when :table
|
143
|
+
super(key, coerce_table(value))
|
144
|
+
else
|
145
|
+
super
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def column
|
150
|
+
column_name = name
|
151
|
+
if column_name.nil?
|
152
|
+
column_name
|
153
|
+
else
|
154
|
+
table.columns[column_name]
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
private
|
159
|
+
def coerce_table(table_name)
|
160
|
+
@schema.tables[table_name]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
90
164
|
class Column < Hash
|
91
165
|
include Hashie::Extensions::MethodAccess
|
92
166
|
|
93
|
-
def initialize(schema,
|
167
|
+
def initialize(schema, raw_column)
|
94
168
|
@schema = schema
|
95
169
|
super()
|
96
|
-
|
170
|
+
raw_column.each do |key, value|
|
97
171
|
self[key] = value
|
98
172
|
end
|
99
173
|
end
|
174
|
+
|
175
|
+
def []=(key, value)
|
176
|
+
case key.to_sym
|
177
|
+
when :indexes
|
178
|
+
super(key, coerce_indexes(value))
|
179
|
+
else
|
180
|
+
super
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
private
|
185
|
+
def coerce_indexes(raw_indexes)
|
186
|
+
raw_indexes.collect do |raw_index|
|
187
|
+
Index.new(@schema, raw_index)
|
188
|
+
end
|
189
|
+
end
|
100
190
|
end
|
101
191
|
|
102
192
|
class Table < Hash
|
@@ -112,9 +202,13 @@ module Groonga
|
|
112
202
|
when :key_type
|
113
203
|
super(key, coerce_key_type(value))
|
114
204
|
when :tokenizer
|
115
|
-
super(key,
|
205
|
+
super(key, coerce_tokenizer(value))
|
206
|
+
when :normalizer
|
207
|
+
super(key, coerce_normalizer(value))
|
116
208
|
when :columns
|
117
209
|
super(key, coerce_columns(value))
|
210
|
+
when :indexes
|
211
|
+
super(key, coerce_indexes(value))
|
118
212
|
else
|
119
213
|
super
|
120
214
|
end
|
@@ -139,11 +233,31 @@ module Groonga
|
|
139
233
|
end
|
140
234
|
end
|
141
235
|
|
236
|
+
def coerce_normalizer(raw_normalizer)
|
237
|
+
if raw_normalizer.nil?
|
238
|
+
nil
|
239
|
+
else
|
240
|
+
@schema.normalizers[raw_normalizer["name"]]
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
def coerce_token_filters(raw_token_filters)
|
245
|
+
raw_token_filters.collect do |raw_token_filter|
|
246
|
+
TokenFilter[raw_token_filter]
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
142
250
|
def coerce_columns(raw_columns)
|
143
251
|
HashValueConverter.convert(raw_columns) do |raw_column|
|
144
252
|
Column.new(@schema, raw_column)
|
145
253
|
end
|
146
254
|
end
|
255
|
+
|
256
|
+
def coerce_indexes(raw_indexes)
|
257
|
+
raw_indexes.collect do |raw_index|
|
258
|
+
Index.new(@schema, raw_index)
|
259
|
+
end
|
260
|
+
end
|
147
261
|
end
|
148
262
|
end
|
149
263
|
end
|
@@ -40,7 +40,7 @@ class TestResponseSchema < Test::Unit::TestCase
|
|
40
40
|
Groonga::Client::Response::Schema.new(@command, header, body)
|
41
41
|
end
|
42
42
|
|
43
|
-
class
|
43
|
+
class TestTable < self
|
44
44
|
def test_key_type
|
45
45
|
body = {
|
46
46
|
"types" => {
|
@@ -62,6 +62,68 @@ class TestResponseSchema < Test::Unit::TestCase
|
|
62
62
|
response.tables["Users"].key_type.name)
|
63
63
|
end
|
64
64
|
|
65
|
+
def test_tokenizer
|
66
|
+
body = {
|
67
|
+
"tokenizers" => {
|
68
|
+
"TokenBigram" => {
|
69
|
+
"name" => "TokenBigram",
|
70
|
+
},
|
71
|
+
},
|
72
|
+
"tables" => {
|
73
|
+
"Terms" => {
|
74
|
+
"tokenizer" => {
|
75
|
+
"name" => "TokenBigram",
|
76
|
+
},
|
77
|
+
}
|
78
|
+
}
|
79
|
+
}
|
80
|
+
response = create_response(body)
|
81
|
+
assert_equal(response.tokenizers["TokenBigram"],
|
82
|
+
response.tables["Terms"].tokenizer)
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_normalizer
|
86
|
+
body = {
|
87
|
+
"normalizers" => {
|
88
|
+
"NormalizerAuto" => {
|
89
|
+
"name" => "NormalizerAuto",
|
90
|
+
},
|
91
|
+
},
|
92
|
+
"tables" => {
|
93
|
+
"Users" => {
|
94
|
+
"normalizer" => {
|
95
|
+
"name" => "NormalizerAuto",
|
96
|
+
},
|
97
|
+
}
|
98
|
+
}
|
99
|
+
}
|
100
|
+
response = create_response(body)
|
101
|
+
assert_equal(response.normalizers["NormalizerAuto"],
|
102
|
+
response.tables["Users"].normalizer)
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_token_filters
|
106
|
+
body = {
|
107
|
+
"token_filters" => {
|
108
|
+
"TokenFilterStopWord" => {
|
109
|
+
"name" => "TokenFilterStopWord",
|
110
|
+
},
|
111
|
+
},
|
112
|
+
"tables" => {
|
113
|
+
"Names" => {
|
114
|
+
"token_filters" => [
|
115
|
+
{
|
116
|
+
"name" => "TokenFilterStopWord",
|
117
|
+
},
|
118
|
+
]
|
119
|
+
}
|
120
|
+
}
|
121
|
+
}
|
122
|
+
response = create_response(body)
|
123
|
+
assert_equal([response.token_filters["TokenFilterStopWord"]],
|
124
|
+
response.tables["Names"].token_filters)
|
125
|
+
end
|
126
|
+
|
65
127
|
def test_columns
|
66
128
|
body = {
|
67
129
|
"tables" => {
|
@@ -78,6 +140,94 @@ class TestResponseSchema < Test::Unit::TestCase
|
|
78
140
|
assert_equal("age",
|
79
141
|
response.tables["Users"].columns["age"].name)
|
80
142
|
end
|
143
|
+
|
144
|
+
def test_indexes
|
145
|
+
body = {
|
146
|
+
"tables" => {
|
147
|
+
"Users" => {
|
148
|
+
"indexes" => [
|
149
|
+
{
|
150
|
+
"full_name" => "Names.users"
|
151
|
+
}
|
152
|
+
]
|
153
|
+
}
|
154
|
+
}
|
155
|
+
}
|
156
|
+
response = create_response(body)
|
157
|
+
assert_equal("Names.users",
|
158
|
+
response.tables["Users"].indexes[0].full_name)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
class TestColumn < self
|
163
|
+
def test_indexes
|
164
|
+
body = {
|
165
|
+
"tables" => {
|
166
|
+
"Users" => {
|
167
|
+
"columns" => {
|
168
|
+
"age" => {
|
169
|
+
"indexes" => [
|
170
|
+
{
|
171
|
+
"full_name" => "Ages.users",
|
172
|
+
}
|
173
|
+
]
|
174
|
+
}
|
175
|
+
}
|
176
|
+
}
|
177
|
+
}
|
178
|
+
}
|
179
|
+
response = create_response(body)
|
180
|
+
assert_equal("Ages.users",
|
181
|
+
response.tables["Users"].columns["age"].indexes[0].full_name)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
class TestIndex < self
|
186
|
+
def test_table
|
187
|
+
body = {
|
188
|
+
"tables" => {
|
189
|
+
"Names" => {
|
190
|
+
"name" => "Names",
|
191
|
+
},
|
192
|
+
"Users" => {
|
193
|
+
"indexes" => [
|
194
|
+
{
|
195
|
+
"table" => "Names"
|
196
|
+
}
|
197
|
+
]
|
198
|
+
}
|
199
|
+
}
|
200
|
+
}
|
201
|
+
response = create_response(body)
|
202
|
+
assert_equal(response.tables["Names"],
|
203
|
+
response.tables["Users"].indexes[0].table)
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_column
|
207
|
+
body = {
|
208
|
+
"tables" => {
|
209
|
+
"Names" => {
|
210
|
+
"name" => "Names",
|
211
|
+
"columns" => {
|
212
|
+
"users_key" => {
|
213
|
+
"name" => "users_key",
|
214
|
+
},
|
215
|
+
},
|
216
|
+
},
|
217
|
+
"Users" => {
|
218
|
+
"indexes" => [
|
219
|
+
{
|
220
|
+
"table" => "Names",
|
221
|
+
"name" => "users_key",
|
222
|
+
}
|
223
|
+
]
|
224
|
+
}
|
225
|
+
}
|
226
|
+
}
|
227
|
+
response = create_response(body)
|
228
|
+
assert_equal(response.tables["Names"].columns["users_key"],
|
229
|
+
response.tables["Users"].indexes[0].column)
|
230
|
+
end
|
81
231
|
end
|
82
232
|
end
|
83
233
|
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.2.
|
4
|
+
version: 0.2.3
|
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-03-
|
13
|
+
date: 2016-03-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: gqtp
|