fluent-plugin-droonga 0.8.0 → 0.9.0

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.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile +7 -0
  4. data/benchmark/watch/benchmark-notify.rb +6 -6
  5. data/benchmark/watch/benchmark-notify.sh +3 -2
  6. data/bin/grn2jsons +0 -3
  7. data/doc/text/news.md +13 -0
  8. data/fluent-plugin-droonga.gemspec +1 -1
  9. data/lib/droonga/catalog/base.rb +8 -3
  10. data/lib/droonga/catalog.rb +1 -16
  11. data/lib/droonga/catalog_observer.rb +57 -0
  12. data/lib/droonga/collector.rb +1 -1
  13. data/lib/droonga/dispatcher.rb +3 -1
  14. data/lib/droonga/distributor_plugin.rb +47 -19
  15. data/lib/droonga/handler_messenger.rb +26 -2
  16. data/lib/droonga/message_processing_error.rb +6 -8
  17. data/lib/droonga/output_message.rb +17 -1
  18. data/lib/droonga/plugin/collector/basic.rb +44 -81
  19. data/lib/droonga/plugin/collector/groonga.rb +83 -0
  20. data/lib/droonga/plugin/collector/search.rb +104 -0
  21. data/lib/droonga/plugin/distributor/crud.rb +41 -0
  22. data/lib/droonga/plugin/distributor/distributed_search_planner.rb +4 -4
  23. data/lib/droonga/plugin/distributor/groonga.rb +38 -0
  24. data/lib/droonga/plugin/handler/add.rb +4 -1
  25. data/lib/droonga/plugin/handler/groonga/column_create.rb +7 -0
  26. data/lib/droonga/plugin/handler/groonga/table_remove.rb +42 -0
  27. data/lib/droonga/plugin/handler/groonga.rb +17 -2
  28. data/lib/droonga/plugin/handler/watch.rb +4 -4
  29. data/lib/droonga/plugin/input_adapter/crud.rb +27 -0
  30. data/lib/droonga/plugin/input_adapter/groonga.rb +16 -1
  31. data/lib/droonga/plugin/output_adapter/crud.rb +51 -0
  32. data/lib/droonga/plugin/output_adapter/groonga.rb +8 -1
  33. data/lib/droonga/plugin.rb +1 -1
  34. data/lib/droonga/replier.rb +7 -1
  35. data/lib/droonga/searcher.rb +168 -74
  36. data/lib/droonga/session.rb +1 -1
  37. data/lib/groonga_command_converter.rb +7 -1
  38. data/test/command/config/default/catalog.json +1 -1
  39. data/test/command/suite/add/error/invalid-integer.expected +31 -1
  40. data/test/command/suite/add/error/invalid-time.expected +31 -1
  41. data/test/command/suite/add/error/missing-key.expected +17 -1
  42. data/test/command/suite/add/error/missing-table.expected +17 -1
  43. data/test/command/suite/add/error/unknown-column.expected +31 -1
  44. data/test/command/suite/add/error/unknown-table.expected +17 -1
  45. data/test/command/suite/add/minimum.expected +1 -1
  46. data/test/command/suite/add/with-values.expected +1 -1
  47. data/test/command/suite/add/without-key.expected +1 -1
  48. data/test/command/suite/groonga/column_create/scalar.expected +2 -2
  49. data/test/command/suite/groonga/column_create/unknown-table.expected +18 -0
  50. data/test/command/suite/groonga/column_create/unknown-table.test +7 -0
  51. data/test/command/suite/groonga/column_create/vector.expected +2 -2
  52. data/test/command/suite/groonga/select/minimum.expected +1 -1
  53. data/test/command/suite/groonga/table_create/array.expected +1 -1
  54. data/test/command/suite/groonga/table_create/hash.expected +1 -1
  55. data/test/command/suite/groonga/table_remove/success.expected +17 -0
  56. data/test/command/suite/groonga/table_remove/success.test +8 -0
  57. data/test/command/suite/groonga/table_remove/unknown-table.expected +18 -0
  58. data/test/command/suite/groonga/table_remove/unknown-table.test +7 -0
  59. data/test/command/suite/message/error/missing-dataset.expected +1 -1
  60. data/test/command/suite/message/error/unknown-command.expected +1 -1
  61. data/test/command/suite/message/error/unknown-dataset.expected +1 -1
  62. data/test/command/suite/search/attributes/array.expected +1 -1
  63. data/test/command/suite/search/attributes/hash.expected +1 -1
  64. data/test/command/suite/search/complex.expected +1 -1
  65. data/test/command/suite/search/condition/nested.expected +1 -1
  66. data/test/command/suite/search/condition/query.expected +1 -1
  67. data/test/command/suite/search/condition/script.expected +1 -1
  68. data/test/command/suite/search/error/cyclic-source.expected +1 -1
  69. data/test/command/suite/search/error/deeply-cyclic-source.expected +1 -1
  70. data/test/command/suite/search/error/missing-source-parameter.expected +1 -1
  71. data/test/command/suite/search/error/unknown-source.expected +1 -1
  72. data/test/command/suite/search/group/count.expected +1 -1
  73. data/test/command/suite/search/group/limit.expected +1 -1
  74. data/test/command/suite/search/group/string.expected +1 -1
  75. data/test/command/suite/search/multiple/chained.expected +1 -1
  76. data/test/command/suite/search/multiple/parallel.expected +1 -1
  77. data/test/command/suite/search/range/only-output.expected +1 -1
  78. data/test/command/suite/search/range/only-sort.expected +1 -1
  79. data/test/command/suite/search/range/sort-and-output.expected +1 -1
  80. data/test/command/suite/search/range/too-large-output-offset.expected +1 -1
  81. data/test/command/suite/search/range/too-large-sort-offset.expected +1 -1
  82. data/test/command/suite/search/response/records/value/time.expected +1 -1
  83. data/test/command/suite/search/simple.expected +1 -1
  84. data/test/command/suite/search/sort/default-offset-limit.expected +1 -1
  85. data/test/command/suite/search/sort/invisible-column.expected +1 -1
  86. data/test/command/suite/watch/subscribe.expected +1 -1
  87. data/test/command/suite/watch/unsubscribe.expected +1 -1
  88. data/test/performance/run-test.rb +56 -0
  89. data/{benchmark → test/performance}/watch/catalog.json +0 -0
  90. data/test/performance/watch/feed.json +9 -0
  91. data/{benchmark → test/performance}/watch/fluentd.conf +0 -0
  92. data/test/performance/watch/subscribe.json +3 -0
  93. data/test/unit/catalog/test_version1.rb +34 -0
  94. data/test/unit/plugin/collector/test_basic.rb +300 -479
  95. data/test/unit/plugin/collector/test_search.rb +814 -0
  96. data/test/unit/plugin/distributor/test_search.rb +4 -4
  97. data/test/unit/plugin/distributor/test_search_planner.rb +260 -260
  98. data/test/unit/plugin/handler/groonga/test_column_create.rb +15 -1
  99. data/test/unit/plugin/handler/groonga/test_table_create.rb +6 -2
  100. data/test/unit/plugin/handler/groonga/test_table_remove.rb +58 -0
  101. data/test/unit/plugin/handler/test_add.rb +3 -1
  102. data/test/unit/plugin/handler/test_groonga.rb +24 -0
  103. data/test/unit/plugin/handler/test_search.rb +294 -0
  104. data/test/unit/plugin/handler/test_watch.rb +1 -1
  105. data/test/unit/plugin/{adapter → input_adapter}/groonga/test_select.rb +5 -37
  106. data/test/unit/plugin/output_adapter/groonga/test_select.rb +55 -0
  107. metadata +38 -6
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2013 Droonga Project
1
+ # Copyright (C) 2013-2014 Droonga Project
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
@@ -68,250 +68,6 @@ class BasicCollectorTest < Test::Unit::TestCase
68
68
  "output" => "search_result",
69
69
  },
70
70
  },
71
- :offset_and_limit => {
72
- :expected => {
73
- "count" => 3,
74
- "records" => [
75
- create_record(1),
76
- ],
77
- },
78
- :source => {
79
- "count" => 3,
80
- "records" => [
81
- create_record(0),
82
- create_record(1),
83
- create_record(2),
84
- ],
85
- },
86
- :mapping => {
87
- "output" => "search_result",
88
- "elements" => {
89
- "records" => {
90
- "type" => "sort",
91
- "offset" => 1,
92
- "limit" => 1,
93
- },
94
- },
95
- },
96
- },
97
- :offset_and_unlimited_limit => {
98
- :expected => {
99
- "count" => 3,
100
- "records" => [
101
- create_record(1),
102
- create_record(2),
103
- ],
104
- },
105
- :source => {
106
- "count" => 3,
107
- "records" => [
108
- create_record(0),
109
- create_record(1),
110
- create_record(2),
111
- ],
112
- },
113
- :mapping => {
114
- "output" => "search_result",
115
- "elements" => {
116
- "records" => {
117
- "type" => "sort",
118
- "offset" => 1,
119
- "limit" => -1,
120
- },
121
- },
122
- },
123
- },
124
- :too_large_offset => {
125
- :expected => {
126
- "count" => 2,
127
- "records" => [
128
- ],
129
- },
130
- :source => {
131
- "count" => 2,
132
- "records" => [
133
- create_record(1, 1.1, 1.2),
134
- create_record(2, 2.1, 2.2),
135
- ],
136
- },
137
- :mapping => {
138
- "output" => "search_result",
139
- "elements" => {
140
- "records" => {
141
- "type" => "sort",
142
- "format" => "simple",
143
- "attributes" => [],
144
- "offset" => 10000,
145
- "limit" => -1,
146
- },
147
- },
148
- },
149
- },
150
- :attributes => {
151
- :expected => {
152
- "count" => 2,
153
- "records" => [
154
- create_record(1, 1.1, 1.2, 1.3, 1.4),
155
- create_record(2, 2.1, 2.2, 2.3, 2.4),
156
- ],
157
- },
158
- :source => {
159
- "count" => 2,
160
- "records" => [
161
- create_record(1, 1.1, 1.2, 1.3, 1.4),
162
- create_record(2, 2.1, 2.2, 2.3, 2.4),
163
- ],
164
- },
165
- :mapping => {
166
- "output" => "search_result",
167
- "elements" => {
168
- "records" => {
169
- "type" => "sort",
170
- "attributes" => ["_key", "chapter", "section", "subsection", "paragraph"],
171
- "limit" => -1,
172
- },
173
- },
174
- },
175
- },
176
- :attributes_with_sort_attributes => {
177
- :expected => {
178
- "count" => 2,
179
- "records" => [
180
- create_record(1, 1.1, 1.2),
181
- create_record(2, 2.1, 2.2),
182
- ],
183
- },
184
- :source => {
185
- "count" => 2,
186
- "records" => [
187
- create_record(1, 1.1, 1.2, 1.3, 1.4),
188
- create_record(2, 2.1, 2.2, 2.3, 2.4),
189
- ],
190
- },
191
- :mapping => {
192
- "output" => "search_result",
193
- "elements" => {
194
- "records" => {
195
- "type" => "sort",
196
- "attributes" => ["_key", "chapter", "section"],
197
- "limit" => -1,
198
- },
199
- },
200
- },
201
- },
202
- :format_simple => {
203
- :expected => {
204
- "count" => 2,
205
- "records" => [
206
- create_record(1, 1.1, 1.2),
207
- create_record(2, 2.1, 2.2),
208
- ],
209
- },
210
- :source => {
211
- "count" => 2,
212
- "records" => [
213
- create_record(1, 1.1, 1.2),
214
- create_record(2, 2.1, 2.2),
215
- ],
216
- },
217
- :mapping => {
218
- "output" => "search_result",
219
- "elements" => {
220
- "records" => {
221
- "type" => "sort",
222
- "format" => "simple",
223
- "attributes" => ["_key", "chapter", "section"],
224
- "limit" => -1,
225
- },
226
- },
227
- },
228
- },
229
- :format_complex => {
230
- :expected => {
231
- "count" => 2,
232
- "records" => [
233
- { "_key" => 1, "chapter" => 1.1, "section" => 1.2 },
234
- { "_key" => 2, "chapter" => 2.1, "section" => 2.2 },
235
- ],
236
- },
237
- :source => {
238
- "count" => 2,
239
- "records" => [
240
- create_record(1, 1.1, 1.2),
241
- create_record(2, 2.1, 2.2),
242
- ],
243
- },
244
- :mapping => {
245
- "output" => "search_result",
246
- "elements" => {
247
- "records" => {
248
- "type" => "sort",
249
- "format" => "complex",
250
- "attributes" => ["_key", "chapter", "section"],
251
- "limit" => -1,
252
- },
253
- },
254
- },
255
- },
256
- :count_with_records => {
257
- :expected => {
258
- "count" => 2,
259
- "records" => [
260
- [],
261
- [],
262
- ],
263
- },
264
- :source => {
265
- "count" => 5,
266
- "records" => [
267
- [],
268
- [],
269
- ],
270
- },
271
- :mapping => {
272
- "output" => "search_result",
273
- "elements" => {
274
- "count" => {
275
- "type" => "count",
276
- "target" => "records",
277
- },
278
- "records" => {
279
- "type" => "sort",
280
- "format" => "simple",
281
- "attributes" => [],
282
- "limit" => -1,
283
- },
284
- },
285
- },
286
- },
287
- :count_only => {
288
- :expected => {
289
- "count" => 2,
290
- },
291
- :source => {
292
- "count" => 5,
293
- "records" => [
294
- [],
295
- [],
296
- ],
297
- },
298
- :mapping => {
299
- "output" => "search_result",
300
- "elements" => {
301
- "count" => {
302
- "type" => "count",
303
- "target" => "records",
304
- },
305
- "records" => {
306
- "type" => "sort",
307
- "format" => "simple",
308
- "attributes" => [],
309
- "limit" => -1,
310
- "no_output" => true,
311
- },
312
- },
313
- },
314
- },
315
71
  )
316
72
  def test_gather(data)
317
73
  request = {
@@ -335,42 +91,31 @@ class BasicCollectorTest < Test::Unit::TestCase
335
91
  end
336
92
 
337
93
  class ReduceTest < self
338
- def test_sum
94
+ data(
95
+ :int => {
96
+ :expected => 1.5,
97
+ :value => 1,
98
+ :source => 2,
99
+ },
100
+ :float => {
101
+ :expected => 1.5,
102
+ :value => 1.0,
103
+ :source => 2.0,
104
+ },
105
+ )
106
+ def test_average(data)
339
107
  input_name = "input_#{Time.now.to_i}"
340
108
  output_name = "output_#{Time.now.to_i}"
341
109
  request = {
342
110
  "task" => {
343
111
  "values" => {
344
- output_name => {
345
- "numeric_value" => 1,
346
- "numeric_key_records" => [
347
- create_record(1),
348
- create_record(2),
349
- create_record(3),
350
- ],
351
- "string_key_records" => [
352
- create_record("a"),
353
- create_record("b"),
354
- create_record("c"),
355
- ],
356
- },
112
+ output_name => data[:value],
357
113
  },
358
114
  "component" => {
359
115
  "body" => {
360
116
  input_name => {
361
117
  output_name => {
362
- "numeric_value" => {
363
- "type" => "sum",
364
- "limit" => -1,
365
- },
366
- "numeric_key_records" => {
367
- "type" => "sum",
368
- "limit" => -1,
369
- },
370
- "string_key_records" => {
371
- "type" => "sum",
372
- "limit" => -1,
373
- },
118
+ "type" => "average",
374
119
  },
375
120
  },
376
121
  },
@@ -378,84 +123,53 @@ class BasicCollectorTest < Test::Unit::TestCase
378
123
  },
379
124
  },
380
125
  "id" => nil,
381
- "value" => {
382
- "numeric_value" => 2,
383
- "numeric_key_records" => [
384
- create_record(4),
385
- create_record(5),
386
- create_record(6),
387
- ],
388
- "string_key_records" => [
389
- create_record("d"),
390
- create_record("e"),
391
- create_record("f"),
392
- ],
393
- },
126
+ "value" => data[:source],
394
127
  "name" => input_name,
395
128
  "descendants" => nil,
396
129
  }
397
130
  @plugin.process("collector_reduce", request)
398
131
  assert_equal([
399
132
  output_name,
400
- {
401
- "numeric_value" => 3,
402
- "numeric_key_records" => [
403
- create_record(1),
404
- create_record(2),
405
- create_record(3),
406
- create_record(4),
407
- create_record(5),
408
- create_record(6),
409
- ],
410
- "string_key_records" => [
411
- create_record("a"),
412
- create_record("b"),
413
- create_record("c"),
414
- create_record("d"),
415
- create_record("e"),
416
- create_record("f"),
417
- ],
418
- },
133
+ data[:expected],
419
134
  ],
420
135
  @outputs.last)
421
136
  end
422
137
 
423
- def test_sum_with_limit
138
+ data(
139
+ :true_and_false => {
140
+ :expected => false,
141
+ :value => true,
142
+ :source => false,
143
+ },
144
+ :false_and_true => {
145
+ :expected => false,
146
+ :value => false,
147
+ :source => true,
148
+ },
149
+ :both_true => {
150
+ :expected => true,
151
+ :value => true,
152
+ :source => true,
153
+ },
154
+ :both_false => {
155
+ :expected => false,
156
+ :value => false,
157
+ :source => false,
158
+ },
159
+ )
160
+ def test_and(data)
424
161
  input_name = "input_#{Time.now.to_i}"
425
162
  output_name = "output_#{Time.now.to_i}"
426
163
  request = {
427
164
  "task" => {
428
165
  "values" => {
429
- output_name => {
430
- "numeric_value" => 1,
431
- "numeric_key_records" => [
432
- create_record(1),
433
- create_record(2),
434
- create_record(3),
435
- ],
436
- "string_key_records" => [
437
- create_record("a"),
438
- create_record("b"),
439
- create_record("c"),
440
- ],
441
- },
166
+ output_name => data[:value],
442
167
  },
443
168
  "component" => {
444
169
  "body" => {
445
170
  input_name => {
446
171
  output_name => {
447
- "numeric_value" => {
448
- "type" => "sum",
449
- "limit" => 2,
450
- },
451
- "numeric_key_records" => {
452
- "type" => "sum",
453
- "limit" => 2,
454
- },
455
- "string_key_records" => {
456
- "type" => "sum",
457
- "limit" => -1,
458
- },
172
+ "type" => "and",
459
173
  },
460
174
  },
461
175
  },
@@ -463,81 +177,79 @@ class BasicCollectorTest < Test::Unit::TestCase
463
177
  },
464
178
  },
465
179
  "id" => nil,
466
- "value" => {
467
- "numeric_value" => 2,
468
- "numeric_key_records" => [
469
- create_record(4),
470
- create_record(5),
471
- create_record(6),
472
- ],
473
- "string_key_records" => [
474
- create_record("d"),
475
- create_record("e"),
476
- create_record("f"),
477
- ],
478
- },
180
+ "value" => data[:source],
479
181
  "name" => input_name,
480
182
  "descendants" => nil,
481
183
  }
482
184
  @plugin.process("collector_reduce", request)
483
185
  assert_equal([
484
186
  output_name,
485
- {
486
- "numeric_value" => 3,
487
- "numeric_key_records" => [
488
- create_record(1),
489
- create_record(2),
490
- ],
491
- "string_key_records" => [
492
- create_record("a"),
493
- create_record("b"),
494
- create_record("c"),
495
- create_record("d"),
496
- create_record("e"),
497
- create_record("f"),
498
- ],
499
- },
187
+ data[:expected],
500
188
  ],
501
189
  @outputs.last)
502
190
  end
503
191
 
504
- def test_sort
192
+ data(
193
+ :numeric_values => {
194
+ :expected => 3,
195
+ :value => 1,
196
+ :source => 2,
197
+ },
198
+ :numeric_key_records => {
199
+ :expected => [
200
+ create_record(1),
201
+ create_record(2),
202
+ create_record(3),
203
+ create_record(4),
204
+ create_record(5),
205
+ create_record(6),
206
+ ],
207
+ :value => [
208
+ create_record(1),
209
+ create_record(2),
210
+ create_record(3),
211
+ ],
212
+ :source => [
213
+ create_record(4),
214
+ create_record(5),
215
+ create_record(6),
216
+ ],
217
+ },
218
+ :string_key_records => {
219
+ :expected => [
220
+ create_record("a"),
221
+ create_record("b"),
222
+ create_record("c"),
223
+ create_record("d"),
224
+ create_record("e"),
225
+ create_record("f"),
226
+ ],
227
+ :value => [
228
+ create_record("a"),
229
+ create_record("b"),
230
+ create_record("c"),
231
+ ],
232
+ :source => [
233
+ create_record("d"),
234
+ create_record("e"),
235
+ create_record("f"),
236
+ ],
237
+ },
238
+ )
239
+ def test_sum(data)
505
240
  input_name = "input_#{Time.now.to_i}"
506
241
  output_name = "output_#{Time.now.to_i}"
507
242
  request = {
508
243
  "task" => {
509
244
  "values" => {
510
- output_name => {
511
- "numeric_key_records" => [
512
- create_record(1),
513
- create_record(3),
514
- create_record(5),
515
- ],
516
- "string_key_records" => [
517
- create_record("a"),
518
- create_record("c"),
519
- create_record("e"),
520
- ],
521
- },
245
+ output_name => data[:value],
522
246
  },
523
247
  "component" => {
524
248
  "body" => {
525
249
  input_name => {
526
250
  output_name => {
527
- "numeric_key_records" => {
528
- "type" => "sort",
529
- "operators" => [
530
- { "column" => 0, "operator" => "<" },
531
- ],
532
- "limit" => -1,
533
- },
534
- "string_key_records" => {
535
- "type" => "sort",
536
- "operators" => [
537
- { "column" => 0, "operator" => "<" },
538
- ],
539
- "limit" => -1,
540
- },
251
+ "type" => "sum",
252
+ "limit" => -1,
541
253
  },
542
254
  },
543
255
  },
@@ -545,83 +257,152 @@ class BasicCollectorTest < Test::Unit::TestCase
545
257
  },
546
258
  },
547
259
  "id" => nil,
548
- "value" => {
549
- "numeric_key_records" => [
550
- create_record(2),
551
- create_record(4),
552
- create_record(6),
553
- ],
554
- "string_key_records" => [
555
- create_record("b"),
556
- create_record("d"),
557
- create_record("f"),
558
- ],
559
- },
260
+ "value" => data[:source],
560
261
  "name" => input_name,
561
262
  "descendants" => nil,
562
263
  }
563
264
  @plugin.process("collector_reduce", request)
564
265
  assert_equal([
565
266
  output_name,
566
- {
567
- "numeric_key_records" => [
568
- create_record(1),
569
- create_record(2),
570
- create_record(3),
571
- create_record(4),
572
- create_record(5),
573
- create_record(6),
574
- ],
575
- "string_key_records" => [
576
- create_record("a"),
577
- create_record("b"),
578
- create_record("c"),
579
- create_record("d"),
580
- create_record("e"),
581
- create_record("f"),
582
- ],
583
- },
267
+ data[:expected],
584
268
  ],
585
269
  @outputs.last)
586
270
  end
587
271
 
588
- def test_sort_with_limit
272
+ data(
273
+ :numeric_values => {
274
+ :expected => 3,
275
+ :value => 1,
276
+ :source => 2,
277
+ :limit => 2,
278
+ },
279
+ :numeric_key_records => {
280
+ :expected => [
281
+ create_record(1),
282
+ create_record(2),
283
+ ],
284
+ :value => [
285
+ create_record(1),
286
+ create_record(2),
287
+ create_record(3),
288
+ ],
289
+ :source => [
290
+ create_record(4),
291
+ create_record(5),
292
+ create_record(6),
293
+ ],
294
+ :limit => 2,
295
+ },
296
+ :string_key_records => {
297
+ :expected => [
298
+ create_record("a"),
299
+ create_record("b"),
300
+ ],
301
+ :value => [
302
+ create_record("a"),
303
+ create_record("b"),
304
+ create_record("c"),
305
+ ],
306
+ :source => [
307
+ create_record("d"),
308
+ create_record("e"),
309
+ create_record("f"),
310
+ ],
311
+ :limit => 2,
312
+ },
313
+ )
314
+ def test_sum_with_limit(data)
589
315
  input_name = "input_#{Time.now.to_i}"
590
316
  output_name = "output_#{Time.now.to_i}"
591
317
  request = {
592
318
  "task" => {
593
319
  "values" => {
594
- output_name => {
595
- "numeric_key_records" => [
596
- create_record(1),
597
- create_record(3),
598
- create_record(5),
599
- ],
600
- "string_key_records" => [
601
- create_record("a"),
602
- create_record("c"),
603
- create_record("e"),
604
- ],
320
+ output_name => data[:value],
321
+ },
322
+ "component" => {
323
+ "body" => {
324
+ input_name => {
325
+ output_name => {
326
+ "type" => "sum",
327
+ "limit" => data[:limit],
328
+ },
329
+ },
605
330
  },
331
+ "outputs" => nil,
332
+ },
333
+ },
334
+ "id" => nil,
335
+ "value" => data[:source],
336
+ "name" => input_name,
337
+ "descendants" => nil,
338
+ }
339
+ @plugin.process("collector_reduce", request)
340
+ assert_equal([
341
+ output_name,
342
+ data[:expected],
343
+ ],
344
+ @outputs.last)
345
+ end
346
+
347
+ data(
348
+ :numeric_key_records => {
349
+ :expected => [
350
+ create_record(1),
351
+ create_record(2),
352
+ create_record(3),
353
+ create_record(4),
354
+ create_record(5),
355
+ create_record(6),
356
+ ],
357
+ :value => [
358
+ create_record(1),
359
+ create_record(3),
360
+ create_record(5),
361
+ ],
362
+ :source => [
363
+ create_record(2),
364
+ create_record(4),
365
+ create_record(6),
366
+ ],
367
+ },
368
+ :string_key_records => {
369
+ :expected => [
370
+ create_record("a"),
371
+ create_record("b"),
372
+ create_record("c"),
373
+ create_record("d"),
374
+ create_record("e"),
375
+ create_record("f"),
376
+ ],
377
+ :value => [
378
+ create_record("a"),
379
+ create_record("c"),
380
+ create_record("e"),
381
+ ],
382
+ :source => [
383
+ create_record("b"),
384
+ create_record("d"),
385
+ create_record("f"),
386
+ ],
387
+ },
388
+ )
389
+ def test_sort(data)
390
+ input_name = "input_#{Time.now.to_i}"
391
+ output_name = "output_#{Time.now.to_i}"
392
+ request = {
393
+ "task" => {
394
+ "values" => {
395
+ output_name => data[:value],
606
396
  },
607
397
  "component" => {
608
398
  "body" => {
609
399
  input_name => {
610
400
  output_name => {
611
- "numeric_key_records" => {
612
- "type" => "sort",
613
- "operators" => [
614
- { "column" => 0, "operator" => "<" },
615
- ],
616
- "limit" => 2,
617
- },
618
- "string_key_records" => {
619
- "type" => "sort",
620
- "operators" => [
621
- { "column" => 0, "operator" => "<" },
622
- ],
623
- "limit" => -1,
624
- },
401
+ "type" => "sort",
402
+ "operators" => [
403
+ { "column" => 0, "operator" => "<" },
404
+ ],
405
+ "limit" => -1,
625
406
  },
626
407
  },
627
408
  },
@@ -629,38 +410,86 @@ class BasicCollectorTest < Test::Unit::TestCase
629
410
  },
630
411
  },
631
412
  "id" => nil,
632
- "value" => {
633
- "numeric_key_records" => [
634
- create_record(2),
635
- create_record(4),
636
- create_record(6),
637
- ],
638
- "string_key_records" => [
639
- create_record("b"),
640
- create_record("d"),
641
- create_record("f"),
642
- ],
413
+ "value" => data[:source],
414
+ "name" => input_name,
415
+ "descendants" => nil,
416
+ }
417
+ @plugin.process("collector_reduce", request)
418
+ assert_equal([
419
+ output_name,
420
+ data[:expected],
421
+ ],
422
+ @outputs.last)
423
+ end
424
+
425
+ data(
426
+ :numeric_key_records => {
427
+ :expected => [
428
+ create_record(1),
429
+ create_record(2),
430
+ ],
431
+ :value => [
432
+ create_record(1),
433
+ create_record(3),
434
+ create_record(5),
435
+ ],
436
+ :source => [
437
+ create_record(2),
438
+ create_record(4),
439
+ create_record(6),
440
+ ],
441
+ :limit => 2,
442
+ },
443
+ :string_key_records => {
444
+ :expected => [
445
+ create_record("a"),
446
+ create_record("b"),
447
+ ],
448
+ :value => [
449
+ create_record("a"),
450
+ create_record("c"),
451
+ create_record("e"),
452
+ ],
453
+ :source => [
454
+ create_record("b"),
455
+ create_record("d"),
456
+ create_record("f"),
457
+ ],
458
+ :limit => 2,
459
+ },
460
+ )
461
+ def test_sort_with_limit(data)
462
+ input_name = "input_#{Time.now.to_i}"
463
+ output_name = "output_#{Time.now.to_i}"
464
+ request = {
465
+ "task" => {
466
+ "values" => {
467
+ output_name => data[:value],
468
+ },
469
+ "component" => {
470
+ "body" => {
471
+ input_name => {
472
+ output_name => {
473
+ "type" => "sort",
474
+ "operators" => [
475
+ { "column" => 0, "operator" => "<" },
476
+ ],
477
+ "limit" => 2,
478
+ },
479
+ },
480
+ },
481
+ "outputs" => nil,
482
+ },
643
483
  },
484
+ "id" => nil,
485
+ "value" => data[:source],
644
486
  "name" => input_name,
645
487
  "descendants" => nil,
646
488
  }
647
489
  @plugin.process("collector_reduce", request)
648
490
  assert_equal([
649
491
  output_name,
650
- {
651
- "numeric_key_records" => [
652
- create_record(1),
653
- create_record(2),
654
- ],
655
- "string_key_records" => [
656
- create_record("a"),
657
- create_record("b"),
658
- create_record("c"),
659
- create_record("d"),
660
- create_record("e"),
661
- create_record("f"),
662
- ],
663
- },
492
+ data[:expected],
664
493
  ],
665
494
  @outputs.last)
666
495
  end
@@ -673,8 +502,7 @@ class BasicCollectorTest < Test::Unit::TestCase
673
502
  request = {
674
503
  "task" => {
675
504
  "values" => {
676
- output_name => {
677
- "records" => [
505
+ output_name => [
678
506
  [
679
507
  "group1",
680
508
  10,
@@ -702,21 +530,18 @@ class BasicCollectorTest < Test::Unit::TestCase
702
530
  create_record("C"),
703
531
  ],
704
532
  ],
705
- ],
706
- },
533
+ ],
707
534
  },
708
535
  "component" => {
709
536
  "body" => {
710
537
  input_name => {
711
538
  output_name => {
712
- "records" => {
713
539
  "type" => "sort",
714
540
  "operators" => [
715
541
  { "column" => 1, "operator" => "<" },
716
542
  ],
717
543
  "key_column" => 0,
718
544
  "limit" => -1,
719
- },
720
545
  },
721
546
  },
722
547
  },
@@ -724,8 +549,7 @@ class BasicCollectorTest < Test::Unit::TestCase
724
549
  },
725
550
  },
726
551
  "id" => nil,
727
- "value" => {
728
- "records" => [
552
+ "value" => [
729
553
  [
730
554
  "group1",
731
555
  30,
@@ -753,16 +577,14 @@ class BasicCollectorTest < Test::Unit::TestCase
753
577
  create_record("F"),
754
578
  ],
755
579
  ],
756
- ],
757
- },
580
+ ],
758
581
  "name" => input_name,
759
582
  "descendants" => nil,
760
583
  }
761
584
  @plugin.process("collector_reduce", request)
762
585
  assert_equal([
763
586
  output_name,
764
- {
765
- "records" => [
587
+ [
766
588
  [
767
589
  "group3",
768
590
  30,
@@ -805,8 +627,7 @@ class BasicCollectorTest < Test::Unit::TestCase
805
627
  create_record("e"),
806
628
  ],
807
629
  ],
808
- ],
809
- },
630
+ ],
810
631
  ],
811
632
  @outputs.last)
812
633
  end