groonga-client 0.5.9 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 16493f7abb6c08faa1f10060a64bedca44071acc4772ed06ac400a91a4b96282
4
- data.tar.gz: 0c94271fb51d35d2758e423a7d52cacc46488ae1c6afbc9ab947b3093dedcfee
3
+ metadata.gz: eaec3aab0752df6b5832fe16cb3c79d107103636b06a603ecb2e453bd6e29bec
4
+ data.tar.gz: cc03ea25d9b87599a6fc10cc553716c3bd7e0b885b2887f7a414b0377490e37d
5
5
  SHA512:
6
- metadata.gz: 8df38010cd75c8e29bd0461243ed0ce07a6cb7efe84450e2eae1e5a8612cd3237be4f00c37bda7a10bbd7016bf5be88507961016337664c988a27ee5c66487b5
7
- data.tar.gz: 3a23a2605d9711c4e46582b5a06021a434763d7021a4bd1263be077e605ec1bdcfdfb7fd8d858e2166bd0213ec2feb24961317699a486d33c817182214c3106b
6
+ metadata.gz: 16a4c67ddfa8bb7f401ff0cd5f49d852f3f279966c3839379ae0ed0f29629b8402ae7b14a87087f263440b8ee0365eb646688a8a3ad7b1cc9979d9ddd3bc61d1
7
+ data.tar.gz: 86c7edc062f853a4d56e18b0b43477f6317630471de314d4952ab8dd7b9a85146180ce8d5e93ce7f687e0345ec6a26f938846409b3ad3bdcd45677ec4e0029f2
@@ -1,5 +1,19 @@
1
1
  # NEWS
2
2
 
3
+ ## 0.6.0 - 2018-08-30
4
+
5
+ ### Improvements
6
+
7
+ * `groonga-client`:
8
+
9
+ * Added `--target-command` option.
10
+
11
+ * Added `--target-table` option.
12
+
13
+ * Added `--target-column` option.
14
+
15
+ * Added support for JSONP.
16
+
3
17
  ## 0.5.9 - 2018-07-13
4
18
 
5
19
  ### Improvements
@@ -34,6 +34,9 @@ module Groonga
34
34
  @runner_options = {
35
35
  :split_load_chunk_size => 10000,
36
36
  :generate_request_id => false,
37
+ :target_commands => [],
38
+ :target_tables => [],
39
+ :target_columns => [],
37
40
  }
38
41
  end
39
42
 
@@ -108,6 +111,39 @@ module Groonga
108
111
  "(#{@chunk})") do |boolean|
109
112
  @chunk = boolean
110
113
  end
114
+
115
+ parser.on("--target-command=COMMAND",
116
+ "Add COMMAND as target commands",
117
+ "You can specify multiple times",
118
+ "If COMMAND is /.../,",
119
+ "it's treated as a regular expression") do |command|
120
+ add_target(@runner_options[:target_commands], command)
121
+ end
122
+
123
+ parser.on("--target-table=TABLE",
124
+ "Add TABLE as target tables",
125
+ "You can specify multiple times",
126
+ "If TABLE is /.../,",
127
+ "it's treated as a regular expression") do |table|
128
+ add_target(@runner_options[:target_tables], table)
129
+ end
130
+
131
+ parser.on("--target-column=COLUMN",
132
+ "Add COLUMN as target columns",
133
+ "You can specify multiple times",
134
+ "If COLUMN is /.../,",
135
+ "it's treated as a regular expression") do |column|
136
+ add_target(@runner_options[:target_columns], column)
137
+ end
138
+ end
139
+
140
+ def add_target(targets, target)
141
+ if /\A\\(.+?)\\(i)?\z/ =~ target
142
+ pattern = Regexp.new($1, $2 == "i")
143
+ targets << pattern
144
+ else
145
+ targets << target
146
+ end
111
147
  end
112
148
 
113
149
  class Runner
@@ -115,6 +151,9 @@ module Groonga
115
151
  @client = client
116
152
  @split_load_chunk_size = options[:split_load_chunk_size] || 10000
117
153
  @generate_request_id = options[:generate_request_id]
154
+ @target_commands = options[:target_commands]
155
+ @target_tables = options[:target_tables]
156
+ @target_columns = options[:target_columns]
118
157
  @load_values = []
119
158
  @parser = create_command_parser
120
159
  end
@@ -188,6 +227,12 @@ module Groonga
188
227
  end
189
228
 
190
229
  def run_command(command)
230
+ return unless target_command?(command)
231
+ return unless target_table?(command)
232
+ return unless target_column?(command)
233
+
234
+ command = Marshal.load(Marshal.dump(command))
235
+ apply_target_columns(command)
191
236
  command[:request_id] ||= SecureRandom.uuid if @generate_request_id
192
237
  response = @client.execute(command)
193
238
  case command.output_type
@@ -199,6 +244,92 @@ module Groonga
199
244
  puts(response.body)
200
245
  end
201
246
  end
247
+
248
+ def target_command?(command)
249
+ return true if @target_commands.empty?
250
+
251
+ @target_commands.any? do |name|
252
+ name === command.command_name
253
+ end
254
+ end
255
+
256
+ def target_table?(command)
257
+ return true if @target_tables.empty?
258
+
259
+ target = nil
260
+ case command.command_name
261
+ when "load", "column_create", "select"
262
+ target = command.table
263
+ when "table_create", "table_remove"
264
+ target = command.name
265
+ end
266
+ return true if target.nil?
267
+
268
+ @target_tables.any? do |name|
269
+ name === target
270
+ end
271
+ end
272
+
273
+ def target_column?(command)
274
+ return true if @target_columns.empty?
275
+
276
+ target = nil
277
+ case command.command_name
278
+ when "column_create"
279
+ target = command.name
280
+ end
281
+ return true if target.nil?
282
+
283
+ @target_columns.any? do |name|
284
+ name === target
285
+ end
286
+ end
287
+
288
+ def apply_target_columns(command)
289
+ return if @target_columns.empty?
290
+
291
+ values = command[:values]
292
+ return if values.nil?
293
+
294
+ command = command.dup
295
+
296
+ values = JSON.parse(values)
297
+ columns = command[:columns]
298
+ if columns
299
+ columns = columns.split(/\s*,\s*/)
300
+ target_indexes = []
301
+ new_columns = []
302
+ columns.each_with_index do |column, i|
303
+ if load_target_column?(column)
304
+ target_indexes << i
305
+ new_columns << column
306
+ end
307
+ end
308
+ command[:columns] = new_columns.join(",")
309
+ new_values = values.collect do |value|
310
+ target_indexes.collect do |i|
311
+ value[i]
312
+ end
313
+ end
314
+ command[:values] = JSON.generate(new_values)
315
+ else
316
+ new_values = values.collect do |value|
317
+ new_value = {}
318
+ value.each do |key, value|
319
+ if load_target_column?(key)
320
+ new_value[key] = value
321
+ end
322
+ end
323
+ new_value
324
+ end
325
+ command[:values] = JSON.generate(new_values)
326
+ end
327
+ end
328
+
329
+ def load_target_column?(column)
330
+ column == "_key" or
331
+ @target_columns.any? {|name| name === column}
332
+ end
202
333
  end
203
334
 
204
335
  class BareREPL
@@ -1,7 +1,5 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
1
  # Copyright (C) 2013 Haruka Yoshihara <yoshihara@clear-code.com>
4
- # Copyright (C) 2013-2014 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2013-2018 Kouhei Sutou <kou@clear-code.com>
5
3
  #
6
4
  # This library is free software; you can redistribute it and/or
7
5
  # modify it under the terms of the GNU Lesser General Public
@@ -67,7 +65,13 @@ module Groonga
67
65
  return_code = nil
68
66
  case command.output_type
69
67
  when :json
70
- response = JSON.parse(raw_response)
68
+ callback = command["callback"]
69
+ if callback and
70
+ /\A#{Regexp.escape(callback)}\((.+)\);\z/ =~ raw_response
71
+ response = JSON.parse($1)
72
+ else
73
+ response = JSON.parse(raw_response)
74
+ end
71
75
  if response.is_a?(::Array)
72
76
  header, body = response
73
77
  return_code = header[0] if header
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2013-2017 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2013-2018 Kouhei Sutou <kou@clear-code.com>
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -16,6 +16,6 @@
16
16
 
17
17
  module Groonga
18
18
  class Client
19
- VERSION = "0.5.9"
19
+ VERSION = "0.6.0"
20
20
  end
21
21
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2014-2018 Kouhei Sutou <kou@clear-code.com>
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -210,4 +210,17 @@ class TestResponseBase < Test::Unit::TestCase
210
210
  end
211
211
  end
212
212
  end
213
+
214
+ class TestParse < self
215
+ def test_jsonp
216
+ command = Groonga::Command::Base.new("status", {"callback" => "a"})
217
+ response = [
218
+ [0, 1396012478, 0.00050806999206543],
219
+ {"start_time" => 1396012478},
220
+ ]
221
+ raw_response = "a(#{response.to_json});"
222
+ response = Groonga::Client::Response::Base.parse(command, raw_response)
223
+ assert_equal(1396012478, response.body["start_time"])
224
+ end
225
+ end
213
226
  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.9
4
+ version: 0.6.0
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: 2018-07-13 00:00:00.000000000 Z
13
+ date: 2018-08-30 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: gqtp
@@ -161,9 +161,9 @@ email:
161
161
  - kou@clear-code.com
162
162
  - tfortress58@gmail.com
163
163
  executables:
164
+ - groonga-client
164
165
  - groonga-client-index-check
165
166
  - groonga-client-index-recreate
166
- - groonga-client
167
167
  extensions: []
168
168
  extra_rdoc_files: []
169
169
  files:
@@ -283,42 +283,42 @@ required_rubygems_version: !ruby/object:Gem::Requirement
283
283
  version: '0'
284
284
  requirements: []
285
285
  rubyforge_project:
286
- rubygems_version: 2.7.6
286
+ rubygems_version: 3.0.0.beta1
287
287
  signing_key:
288
288
  specification_version: 4
289
289
  summary: Groonga-client is a client for Groonga (http://groonga.org/) implemented
290
290
  with pure Ruby. You can use it without Groonga.
291
291
  test_files:
292
- - test/test-client.rb
293
- - test/command-line/test-index-check.rb
294
- - test/command-line/helper.rb
295
- - test/command-line/test-index-recreate.rb
296
292
  - test/test-script-syntax.rb
297
- - test/request/select/test-backward-compatible-sort-keys-parameter.rb
298
- - test/request/select/test-filter.rb
299
- - test/request/select/test-sort-keys-parameter.rb
300
- - test/request/select/test-output-columns-parameter.rb
301
- - test/request/select/test-values-parameter.rb
302
- - test/request/select/test-scorer.rb
303
- - test/request/test-merger.rb
304
- - test/request/test-generic.rb
305
- - test/request/test-select.rb
306
- - test/test-command.rb
307
- - test/protocol/test-gqtp.rb
308
293
  - test/protocol/test-http.rb
309
- - test/run-test.rb
310
- - test/response/test-base.rb
294
+ - test/protocol/test-gqtp.rb
295
+ - test/response/test-schema.rb
311
296
  - test/response/test-select-tsv.rb
312
- - test/response/test-load.rb
313
- - test/response/test-column-list.rb
314
- - test/response/helper.rb
315
297
  - test/response/test-error.rb
316
- - test/response/test-table-list.rb
317
- - test/response/test-status.rb
298
+ - test/response/test-table-remove.rb
318
299
  - test/response/test-select-xml.rb
319
- - test/response/test-schema.rb
320
300
  - test/response/test-select-command-version3.rb
301
+ - test/response/test-table-list.rb
302
+ - test/response/test-column-list.rb
303
+ - test/response/test-load.rb
304
+ - test/response/helper.rb
305
+ - test/response/test-base.rb
321
306
  - test/response/test-select-command-version1.rb
307
+ - test/response/test-status.rb
322
308
  - test/response/test-table-create.rb
323
- - test/response/test-table-remove.rb
324
309
  - test/results/test-table-list.rb
310
+ - test/test-command.rb
311
+ - test/run-test.rb
312
+ - test/request/test-generic.rb
313
+ - test/request/select/test-values-parameter.rb
314
+ - test/request/select/test-output-columns-parameter.rb
315
+ - test/request/select/test-scorer.rb
316
+ - test/request/select/test-backward-compatible-sort-keys-parameter.rb
317
+ - test/request/select/test-filter.rb
318
+ - test/request/select/test-sort-keys-parameter.rb
319
+ - test/request/test-select.rb
320
+ - test/request/test-merger.rb
321
+ - test/test-client.rb
322
+ - test/command-line/test-index-recreate.rb
323
+ - test/command-line/helper.rb
324
+ - test/command-line/test-index-check.rb