fluent-plugin-droonga 0.9.0 → 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/Gemfile +8 -1
  4. data/fluent-plugin-droonga.gemspec +2 -2
  5. data/lib/droonga/adapter.rb +39 -0
  6. data/lib/droonga/adapter_runner.rb +99 -0
  7. data/lib/droonga/catalog/base.rb +11 -11
  8. data/lib/droonga/catalog/dataset.rb +54 -0
  9. data/lib/droonga/catalog/version1.rb +1 -1
  10. data/lib/droonga/collector.rb +5 -7
  11. data/lib/droonga/collector_plugin.rb +7 -7
  12. data/lib/droonga/command.rb +36 -0
  13. data/lib/droonga/{plugin/input_adapter/crud.rb → command_repository.rb} +14 -8
  14. data/lib/droonga/dispatcher.rb +86 -54
  15. data/lib/droonga/distributed_command_planner.rb +183 -0
  16. data/lib/droonga/distributor.rb +43 -17
  17. data/lib/droonga/handler.rb +13 -72
  18. data/lib/droonga/handler_message.rb +5 -5
  19. data/lib/droonga/handler_messenger.rb +4 -1
  20. data/lib/droonga/handler_plugin.rb +2 -2
  21. data/lib/droonga/handler_runner.rb +104 -0
  22. data/lib/droonga/input_message.rb +4 -4
  23. data/lib/droonga/legacy_pluggable.rb +66 -0
  24. data/lib/droonga/{input_adapter.rb → legacy_plugin.rb} +27 -22
  25. data/lib/droonga/{plugin_repository.rb → legacy_plugin_repository.rb} +2 -4
  26. data/lib/droonga/message_matcher.rb +101 -0
  27. data/lib/droonga/{input_adapter_plugin.rb → planner.rb} +14 -10
  28. data/lib/droonga/planner_plugin.rb +54 -0
  29. data/lib/droonga/pluggable.rb +9 -45
  30. data/lib/droonga/plugin.rb +9 -33
  31. data/lib/droonga/plugin/collector/basic.rb +2 -0
  32. data/lib/droonga/plugin/collector/search.rb +31 -37
  33. data/lib/droonga/plugin/{handler/groonga/table_remove.rb → metadata/adapter_message.rb} +23 -18
  34. data/lib/droonga/plugin/{handler/search.rb → metadata/handler_action.rb} +19 -15
  35. data/lib/droonga/plugin/metadata/input_message.rb +39 -0
  36. data/lib/droonga/plugin/planner/crud.rb +49 -0
  37. data/lib/droonga/plugin/{distributor → planner}/distributed_search_planner.rb +62 -70
  38. data/lib/droonga/plugin/{distributor → planner}/groonga.rb +11 -32
  39. data/lib/droonga/plugin/{distributor → planner}/search.rb +5 -5
  40. data/lib/droonga/plugin/{distributor → planner}/watch.rb +15 -6
  41. data/lib/droonga/plugin_loader.rb +10 -0
  42. data/lib/droonga/plugin_registerable.rb +34 -10
  43. data/lib/droonga/plugin_registry.rb +58 -0
  44. data/lib/droonga/plugins/crud.rb +124 -0
  45. data/lib/droonga/plugins/error.rb +50 -0
  46. data/lib/droonga/{output_adapter_plugin.rb → plugins/groonga.rb} +9 -13
  47. data/lib/droonga/plugins/groonga/column_create.rb +123 -0
  48. data/lib/droonga/plugins/groonga/generic_command.rb +65 -0
  49. data/lib/droonga/{plugin/output_adapter/groonga.rb → plugins/groonga/generic_response.rb} +16 -15
  50. data/lib/droonga/plugins/groonga/select.rb +124 -0
  51. data/lib/droonga/plugins/groonga/table_create.rb +106 -0
  52. data/lib/droonga/plugins/groonga/table_remove.rb +57 -0
  53. data/lib/droonga/plugins/search.rb +40 -0
  54. data/lib/droonga/plugins/watch.rb +156 -0
  55. data/lib/droonga/processor.rb +8 -10
  56. data/lib/droonga/searcher.rb +14 -4
  57. data/lib/droonga/searcher/mecab_filter.rb +67 -0
  58. data/lib/droonga/session.rb +5 -5
  59. data/lib/droonga/test.rb +1 -1
  60. data/lib/droonga/test/stub_handler_message.rb +1 -1
  61. data/lib/droonga/test/{stub_distributor.rb → stub_planner.rb} +1 -1
  62. data/lib/droonga/worker.rb +7 -8
  63. data/lib/fluent/plugin/out_droonga.rb +0 -1
  64. data/sample/cluster/catalog.json +2 -4
  65. data/sample/mecab_filter/data.grn +7 -0
  66. data/sample/mecab_filter/ddl.grn +7 -0
  67. data/sample/mecab_filter/search_with_mecab_filter.json +21 -0
  68. data/sample/mecab_filter/search_without_mecab_filter.json +21 -0
  69. data/test/command/config/default/catalog.json +2 -5
  70. data/test/command/suite/search/error/no-query.expected +13 -0
  71. data/test/command/suite/search/error/no-query.test +7 -0
  72. data/test/command/suite/search/error/unknown-source.expected +26 -0
  73. data/test/command/suite/watch/subscribe.expected +3 -3
  74. data/test/command/suite/watch/unsubscribe.expected +3 -3
  75. data/test/unit/catalog/test_dataset.rb +385 -0
  76. data/test/unit/catalog/test_version1.rb +111 -45
  77. data/test/unit/fixtures/catalog/version1.json +0 -3
  78. data/test/unit/helper.rb +2 -1
  79. data/test/unit/helper/distributed_search_planner_helper.rb +83 -0
  80. data/test/unit/plugin/collector/test_basic.rb +233 -376
  81. data/test/unit/plugin/collector/test_search.rb +8 -17
  82. data/test/unit/plugin/planner/search_planner/test_basic.rb +120 -0
  83. data/test/unit/plugin/planner/search_planner/test_group_by.rb +573 -0
  84. data/test/unit/plugin/planner/search_planner/test_output.rb +388 -0
  85. data/test/unit/plugin/planner/search_planner/test_sort_by.rb +938 -0
  86. data/test/unit/plugin/{distributor → planner}/test_search.rb +20 -75
  87. data/test/unit/{plugin/handler → plugins/crud}/test_add.rb +11 -11
  88. data/test/unit/plugins/groonga/select/test_adapter_input.rb +213 -0
  89. data/test/unit/{plugin/output_adapter/groonga/test_select.rb → plugins/groonga/select/test_adapter_output.rb} +12 -13
  90. data/test/unit/{plugin/handler → plugins}/groonga/test_column_create.rb +20 -5
  91. data/test/unit/{plugin/handler → plugins}/groonga/test_table_create.rb +5 -0
  92. data/test/unit/{plugin/handler → plugins}/groonga/test_table_remove.rb +8 -1
  93. data/test/unit/{plugin/handler → plugins}/test_groonga.rb +5 -5
  94. data/test/unit/{plugin/handler → plugins}/test_search.rb +21 -5
  95. data/test/unit/{plugin/handler → plugins}/test_watch.rb +29 -10
  96. data/{lib/droonga/command_mapper.rb → test/unit/test_command_repository.rb} +16 -22
  97. data/test/unit/{test_plugin.rb → test_legacy_plugin.rb} +3 -3
  98. data/test/unit/{test_plugin_repository.rb → test_legacy_plugin_repository.rb} +3 -3
  99. data/test/unit/test_message_matcher.rb +137 -0
  100. metadata +86 -66
  101. data/bin/grn2jsons +0 -82
  102. data/lib/droonga/distribution_planner.rb +0 -76
  103. data/lib/droonga/distributor_plugin.rb +0 -95
  104. data/lib/droonga/output_adapter.rb +0 -53
  105. data/lib/droonga/plugin/collector/groonga.rb +0 -83
  106. data/lib/droonga/plugin/distributor/crud.rb +0 -84
  107. data/lib/droonga/plugin/handler/add.rb +0 -109
  108. data/lib/droonga/plugin/handler/forward.rb +0 -75
  109. data/lib/droonga/plugin/handler/groonga.rb +0 -99
  110. data/lib/droonga/plugin/handler/groonga/column_create.rb +0 -106
  111. data/lib/droonga/plugin/handler/groonga/table_create.rb +0 -91
  112. data/lib/droonga/plugin/handler/watch.rb +0 -108
  113. data/lib/droonga/plugin/input_adapter/groonga.rb +0 -49
  114. data/lib/droonga/plugin/input_adapter/groonga/select.rb +0 -63
  115. data/lib/droonga/plugin/output_adapter/crud.rb +0 -51
  116. data/lib/droonga/plugin/output_adapter/groonga/select.rb +0 -54
  117. data/lib/groonga_command_converter.rb +0 -143
  118. data/sample/fluentd.conf +0 -8
  119. data/test/unit/plugin/distributor/test_search_planner.rb +0 -1102
  120. data/test/unit/plugin/input_adapter/groonga/test_select.rb +0 -248
  121. data/test/unit/test_command_mapper.rb +0 -44
  122. data/test/unit/test_groonga_command_converter.rb +0 -242
@@ -36,8 +36,5 @@
36
36
  }
37
37
  }
38
38
  }
39
- },
40
- "options": {
41
- "plugins": ["for_global"]
42
39
  }
43
40
  }
data/test/unit/helper.rb CHANGED
@@ -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
@@ -20,6 +20,7 @@ require_relative "helper/fixture"
20
20
  require_relative "helper/stub_worker"
21
21
  require_relative "helper/plugin_helper"
22
22
  require_relative "helper/watch_helper"
23
+ require_relative "helper/distributed_search_planner_helper"
23
24
 
24
25
  class Test::Unit::TestCase
25
26
  include Sandbox
@@ -0,0 +1,83 @@
1
+ # Copyright (C) 2014 Droonga Project
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 version 2.1 as published by the Free Software Foundation.
6
+ #
7
+ # This library is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10
+ # Lesser General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU Lesser General Public
13
+ # License along with this library; if not, write to the Free Software
14
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
+
16
+ require "droonga/plugin/planner/distributed_search_planner"
17
+
18
+ module DistributedSearchPlannerHelper
19
+ def plan(search_request)
20
+ planner = Droonga::DistributedSearchPlanner.new(search_request)
21
+ planner.plan
22
+ end
23
+
24
+ def messages
25
+ @messages ||= plan(@request)
26
+ end
27
+
28
+ def broadcast_message
29
+ messages.find do |message|
30
+ message["type"] == "broadcast"
31
+ end
32
+ end
33
+
34
+ def reduce_message
35
+ messages.find do |message|
36
+ message["type"] == "search_reduce"
37
+ end
38
+ end
39
+
40
+ def gather_message
41
+ messages.find do |message|
42
+ message["type"] == "search_gather"
43
+ end
44
+ end
45
+
46
+ def dependencies
47
+ dependencies = messages.collect do |message|
48
+ {
49
+ "type" => message["type"],
50
+ "inputs" => message["inputs"],
51
+ "outputs" => message["outputs"],
52
+ }
53
+ end
54
+ sort_dependencies(dependencies)
55
+ end
56
+
57
+ def sort_dependencies(dependencies)
58
+ dependencies.sort do |a, b|
59
+ a["type"] <=> b["type"]
60
+ end
61
+ end
62
+
63
+ def expected_dependencies(reduce_inputs, gather_inputs)
64
+ dependencies = [
65
+ {
66
+ "type" => "search_reduce",
67
+ "inputs" => reduce_inputs,
68
+ "outputs" => gather_inputs,
69
+ },
70
+ {
71
+ "type" => "search_gather",
72
+ "inputs" => gather_inputs,
73
+ "outputs" => nil,
74
+ },
75
+ {
76
+ "type" => "broadcast",
77
+ "inputs" => nil,
78
+ "outputs" => reduce_inputs,
79
+ },
80
+ ]
81
+ sort_dependencies(dependencies)
82
+ end
83
+ end
@@ -40,32 +40,18 @@ class BasicCollectorTest < Test::Unit::TestCase
40
40
  end
41
41
  end
42
42
 
43
- class GatherTest < self
43
+ class IOTest < self
44
44
  data(
45
45
  :simple_mapping => {
46
- :expected => "result",
46
+ :expected => ["output_name", "result"],
47
47
  :source => "result",
48
- :mapping => "string_name",
48
+ :mapping => "output_name",
49
49
  },
50
50
  :complex_mapping => {
51
- :expected => {
52
- "count" => 3,
53
- "records" => [
54
- create_record(0),
55
- create_record(1),
56
- create_record(2),
57
- ],
58
- },
59
- :source => {
60
- "count" => 3,
61
- "records" => [
62
- create_record(0),
63
- create_record(1),
64
- create_record(2),
65
- ],
66
- },
51
+ :expected => ["output_name", "result"],
52
+ :source => "result",
67
53
  :mapping => {
68
- "output" => "search_result",
54
+ "output" => "output_name",
69
55
  },
70
56
  },
71
57
  )
@@ -73,7 +59,7 @@ class BasicCollectorTest < Test::Unit::TestCase
73
59
  request = {
74
60
  "task" => {
75
61
  "values" => nil,
76
- "component" => {
62
+ "step" => {
77
63
  "body" => nil,
78
64
  "outputs" => nil,
79
65
  },
@@ -84,38 +70,23 @@ class BasicCollectorTest < Test::Unit::TestCase
84
70
  "descendants" => nil,
85
71
  }
86
72
  @plugin.process("collector_gather", request)
87
- output_name = data[:mapping]
88
- output_name = output_name["output"] if output_name.is_a?(Hash)
89
- assert_equal([output_name, data[:expected]], @outputs.last)
73
+ assert_equal(data[:expected], @outputs.last)
90
74
  end
91
- end
92
75
 
93
- class ReduceTest < self
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)
76
+ def test_reduce
107
77
  input_name = "input_#{Time.now.to_i}"
108
78
  output_name = "output_#{Time.now.to_i}"
109
79
  request = {
110
80
  "task" => {
111
81
  "values" => {
112
- output_name => data[:value],
82
+ output_name => [0, 1, 2],
113
83
  },
114
- "component" => {
84
+ "step" => {
115
85
  "body" => {
116
86
  input_name => {
117
87
  output_name => {
118
- "type" => "average",
88
+ "type" => "sum",
89
+ "limit" => -1,
119
90
  },
120
91
  },
121
92
  },
@@ -123,77 +94,102 @@ class BasicCollectorTest < Test::Unit::TestCase
123
94
  },
124
95
  },
125
96
  "id" => nil,
126
- "value" => data[:source],
97
+ "value" => [3, 4, 5],
127
98
  "name" => input_name,
128
99
  "descendants" => nil,
129
100
  }
130
101
  @plugin.process("collector_reduce", request)
131
102
  assert_equal([
132
103
  output_name,
133
- data[:expected],
104
+ [0, 1, 2, 3, 4, 5],
134
105
  ],
135
106
  @outputs.last)
136
107
  end
108
+ end
109
+
110
+ class ReduceTest < self
111
+ data(
112
+ :int => {
113
+ :expected => 1.5,
114
+ :left => 1,
115
+ :right => 2,
116
+ },
117
+ :float => {
118
+ :expected => 1.5,
119
+ :left => 1.0,
120
+ :right => 2.0,
121
+ },
122
+ )
123
+ def test_average(data)
124
+ reduced = @plugin.reduce({ "type" => "average" },
125
+ data[:left],
126
+ data[:right])
127
+ assert_equal(data[:expected], reduced)
128
+ end
137
129
 
138
130
  data(
139
131
  :true_and_false => {
140
132
  :expected => false,
141
- :value => true,
142
- :source => false,
133
+ :left => true,
134
+ :right => false,
143
135
  },
144
136
  :false_and_true => {
145
137
  :expected => false,
146
- :value => false,
147
- :source => true,
138
+ :left => false,
139
+ :right => true,
148
140
  },
149
141
  :both_true => {
150
142
  :expected => true,
151
- :value => true,
152
- :source => true,
143
+ :left => true,
144
+ :right => true,
153
145
  },
154
146
  :both_false => {
155
147
  :expected => false,
156
- :value => false,
157
- :source => false,
148
+ :left => false,
149
+ :right => false,
158
150
  },
159
151
  )
160
152
  def test_and(data)
161
- input_name = "input_#{Time.now.to_i}"
162
- output_name = "output_#{Time.now.to_i}"
163
- request = {
164
- "task" => {
165
- "values" => {
166
- output_name => data[:value],
167
- },
168
- "component" => {
169
- "body" => {
170
- input_name => {
171
- output_name => {
172
- "type" => "and",
173
- },
174
- },
175
- },
176
- "outputs" => nil,
177
- },
178
- },
179
- "id" => nil,
180
- "value" => data[:source],
181
- "name" => input_name,
182
- "descendants" => nil,
183
- }
184
- @plugin.process("collector_reduce", request)
185
- assert_equal([
186
- output_name,
187
- data[:expected],
188
- ],
189
- @outputs.last)
153
+ reduced = @plugin.reduce({ "type" => "and" },
154
+ data[:left],
155
+ data[:right])
156
+ assert_equal(data[:expected], reduced)
157
+ end
158
+
159
+ data(
160
+ :true_and_false => {
161
+ :expected => true,
162
+ :left => true,
163
+ :right => false,
164
+ },
165
+ :false_and_true => {
166
+ :expected => true,
167
+ :left => false,
168
+ :right => true,
169
+ },
170
+ :both_true => {
171
+ :expected => true,
172
+ :left => true,
173
+ :right => true,
174
+ },
175
+ :both_false => {
176
+ :expected => false,
177
+ :left => false,
178
+ :right => false,
179
+ },
180
+ )
181
+ def test_or(data)
182
+ reduced = @plugin.reduce({ "type" => "or" },
183
+ data[:left],
184
+ data[:right])
185
+ assert_equal(data[:expected], reduced)
190
186
  end
191
187
 
192
188
  data(
193
189
  :numeric_values => {
194
190
  :expected => 3,
195
- :value => 1,
196
- :source => 2,
191
+ :left => 1,
192
+ :right => 2,
197
193
  },
198
194
  :numeric_key_records => {
199
195
  :expected => [
@@ -204,12 +200,12 @@ class BasicCollectorTest < Test::Unit::TestCase
204
200
  create_record(5),
205
201
  create_record(6),
206
202
  ],
207
- :value => [
203
+ :left => [
208
204
  create_record(1),
209
205
  create_record(2),
210
206
  create_record(3),
211
207
  ],
212
- :source => [
208
+ :right => [
213
209
  create_record(4),
214
210
  create_record(5),
215
211
  create_record(6),
@@ -224,86 +220,51 @@ class BasicCollectorTest < Test::Unit::TestCase
224
220
  create_record("e"),
225
221
  create_record("f"),
226
222
  ],
227
- :value => [
223
+ :left => [
228
224
  create_record("a"),
229
225
  create_record("b"),
230
226
  create_record("c"),
231
227
  ],
232
- :source => [
228
+ :right => [
233
229
  create_record("d"),
234
230
  create_record("e"),
235
231
  create_record("f"),
236
232
  ],
237
233
  },
238
- )
239
- def test_sum(data)
240
- input_name = "input_#{Time.now.to_i}"
241
- output_name = "output_#{Time.now.to_i}"
242
- request = {
243
- "task" => {
244
- "values" => {
245
- output_name => data[:value],
246
- },
247
- "component" => {
248
- "body" => {
249
- input_name => {
250
- output_name => {
251
- "type" => "sum",
252
- "limit" => -1,
253
- },
254
- },
255
- },
256
- "outputs" => nil,
257
- },
258
- },
259
- "id" => nil,
260
- "value" => data[:source],
261
- "name" => input_name,
262
- "descendants" => nil,
263
- }
264
- @plugin.process("collector_reduce", request)
265
- assert_equal([
266
- output_name,
267
- data[:expected],
268
- ],
269
- @outputs.last)
270
- end
271
-
272
- data(
273
- :numeric_values => {
234
+ :numeric_values_with_limit => {
274
235
  :expected => 3,
275
- :value => 1,
276
- :source => 2,
236
+ :left => 1,
237
+ :right => 2,
277
238
  :limit => 2,
278
239
  },
279
- :numeric_key_records => {
240
+ :numeric_key_records_with_limit => {
280
241
  :expected => [
281
242
  create_record(1),
282
243
  create_record(2),
283
244
  ],
284
- :value => [
245
+ :left => [
285
246
  create_record(1),
286
247
  create_record(2),
287
248
  create_record(3),
288
249
  ],
289
- :source => [
250
+ :right => [
290
251
  create_record(4),
291
252
  create_record(5),
292
253
  create_record(6),
293
254
  ],
294
255
  :limit => 2,
295
256
  },
296
- :string_key_records => {
257
+ :string_key_records_with_limit => {
297
258
  :expected => [
298
259
  create_record("a"),
299
260
  create_record("b"),
300
261
  ],
301
- :value => [
262
+ :left => [
302
263
  create_record("a"),
303
264
  create_record("b"),
304
265
  create_record("c"),
305
266
  ],
306
- :source => [
267
+ :right => [
307
268
  create_record("d"),
308
269
  create_record("e"),
309
270
  create_record("f"),
@@ -311,37 +272,12 @@ class BasicCollectorTest < Test::Unit::TestCase
311
272
  :limit => 2,
312
273
  },
313
274
  )
314
- def test_sum_with_limit(data)
315
- input_name = "input_#{Time.now.to_i}"
316
- output_name = "output_#{Time.now.to_i}"
317
- request = {
318
- "task" => {
319
- "values" => {
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
- },
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)
275
+ def test_sum(data)
276
+ reduced = @plugin.reduce({ "type" => "sum",
277
+ "limit" => data[:limit] || -1 },
278
+ data[:left],
279
+ data[:right])
280
+ assert_equal(data[:expected], reduced)
345
281
  end
346
282
 
347
283
  data(
@@ -354,12 +290,12 @@ class BasicCollectorTest < Test::Unit::TestCase
354
290
  create_record(5),
355
291
  create_record(6),
356
292
  ],
357
- :value => [
293
+ :left => [
358
294
  create_record(1),
359
295
  create_record(3),
360
296
  create_record(5),
361
297
  ],
362
- :source => [
298
+ :right => [
363
299
  create_record(2),
364
300
  create_record(4),
365
301
  create_record(6),
@@ -374,83 +310,45 @@ class BasicCollectorTest < Test::Unit::TestCase
374
310
  create_record("e"),
375
311
  create_record("f"),
376
312
  ],
377
- :value => [
313
+ :left => [
378
314
  create_record("a"),
379
315
  create_record("c"),
380
316
  create_record("e"),
381
317
  ],
382
- :source => [
318
+ :right => [
383
319
  create_record("b"),
384
320
  create_record("d"),
385
321
  create_record("f"),
386
322
  ],
387
323
  },
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],
396
- },
397
- "component" => {
398
- "body" => {
399
- input_name => {
400
- output_name => {
401
- "type" => "sort",
402
- "operators" => [
403
- { "column" => 0, "operator" => "<" },
404
- ],
405
- "limit" => -1,
406
- },
407
- },
408
- },
409
- "outputs" => nil,
410
- },
411
- },
412
- "id" => nil,
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 => {
324
+ :numeric_key_records_with_limit => {
427
325
  :expected => [
428
326
  create_record(1),
429
327
  create_record(2),
430
328
  ],
431
- :value => [
329
+ :left => [
432
330
  create_record(1),
433
331
  create_record(3),
434
332
  create_record(5),
435
333
  ],
436
- :source => [
334
+ :right => [
437
335
  create_record(2),
438
336
  create_record(4),
439
337
  create_record(6),
440
338
  ],
441
339
  :limit => 2,
442
340
  },
443
- :string_key_records => {
341
+ :string_key_records_with_limit => {
444
342
  :expected => [
445
343
  create_record("a"),
446
344
  create_record("b"),
447
345
  ],
448
- :value => [
346
+ :left => [
449
347
  create_record("a"),
450
348
  create_record("c"),
451
349
  create_record("e"),
452
350
  ],
453
- :source => [
351
+ :right => [
454
352
  create_record("b"),
455
353
  create_record("d"),
456
354
  create_record("f"),
@@ -458,178 +356,137 @@ class BasicCollectorTest < Test::Unit::TestCase
458
356
  :limit => 2,
459
357
  },
460
358
  )
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
- },
483
- },
484
- "id" => nil,
485
- "value" => data[:source],
486
- "name" => input_name,
487
- "descendants" => nil,
488
- }
489
- @plugin.process("collector_reduce", request)
490
- assert_equal([
491
- output_name,
492
- data[:expected],
493
- ],
494
- @outputs.last)
359
+ def test_sort(data)
360
+ reduced = @plugin.reduce({
361
+ "type" => "sort",
362
+ "operators" => [
363
+ { "column" => 0, "operator" => "<" },
364
+ ],
365
+ "limit" => data[:limit] || -1,
366
+ },
367
+ data[:left],
368
+ data[:right])
369
+ assert_equal(data[:expected], reduced)
495
370
  end
496
371
  end
497
372
 
498
373
  class MergeTest < self
499
374
  def test_grouped
500
- input_name = "input_#{Time.now.to_i}"
501
- output_name = "output_#{Time.now.to_i}"
502
- request = {
503
- "task" => {
504
- "values" => {
505
- output_name => [
506
- [
507
- "group1",
508
- 10,
509
- [
510
- create_record(1),
511
- create_record(3),
512
- create_record(5),
513
- ],
514
- ],
515
- [
516
- "group2",
517
- 20,
518
- [
519
- create_record("a"),
520
- create_record("c"),
521
- create_record("e"),
522
- ],
523
- ],
524
- [
525
- "group3",
526
- 30,
527
- [
528
- create_record("A"),
529
- create_record("B"),
530
- create_record("C"),
531
- ],
532
- ],
533
- ],
534
- },
535
- "component" => {
536
- "body" => {
537
- input_name => {
538
- output_name => {
539
- "type" => "sort",
540
- "operators" => [
541
- { "column" => 1, "operator" => "<" },
542
- ],
543
- "key_column" => 0,
544
- "limit" => -1,
545
- },
546
- },
547
- },
548
- "outputs" => nil,
549
- },
550
- },
551
- "id" => nil,
552
- "value" => [
553
- [
554
- "group1",
555
- 30,
556
- [
557
- create_record(2),
558
- create_record(4),
559
- create_record(6),
560
- ],
561
- ],
562
- [
563
- "group2",
564
- 40,
565
- [
566
- create_record("b"),
567
- create_record("d"),
568
- create_record("f"),
569
- ],
570
- ],
571
- [
572
- "group4",
573
- 50,
574
- [
575
- create_record("D"),
576
- create_record("E"),
577
- create_record("F"),
578
- ],
579
- ],
375
+ expected = [
376
+ [
377
+ "group3",
378
+ 30,
379
+ [
380
+ create_record("A"),
381
+ create_record("B"),
382
+ create_record("C"),
383
+ ],
580
384
  ],
581
- "name" => input_name,
582
- "descendants" => nil,
583
- }
584
- @plugin.process("collector_reduce", request)
585
- assert_equal([
586
- output_name,
587
- [
588
- [
589
- "group3",
590
- 30,
591
- [
592
- create_record("A"),
593
- create_record("B"),
594
- create_record("C"),
595
- ],
596
- ],
597
- [
598
- "group1",
599
- 40,
600
- [
601
- create_record(2),
602
- create_record(4),
603
- create_record(6),
604
- create_record(1),
605
- create_record(3),
606
- create_record(5),
607
- ],
608
- ],
609
- [
610
- "group4",
611
- 50,
612
- [
613
- create_record("D"),
614
- create_record("E"),
615
- create_record("F"),
616
- ],
617
- ],
618
- [
619
- "group2",
620
- 60,
621
- [
622
- create_record("b"),
623
- create_record("d"),
624
- create_record("f"),
625
- create_record("a"),
626
- create_record("c"),
627
- create_record("e"),
628
- ],
629
- ],
630
- ],
631
- ],
632
- @outputs.last)
385
+ [
386
+ "group1",
387
+ 40,
388
+ [
389
+ create_record(2),
390
+ create_record(4),
391
+ create_record(6),
392
+ create_record(1),
393
+ create_record(3),
394
+ create_record(5),
395
+ ],
396
+ ],
397
+ [
398
+ "group4",
399
+ 50,
400
+ [
401
+ create_record("D"),
402
+ create_record("E"),
403
+ create_record("F"),
404
+ ],
405
+ ],
406
+ [
407
+ "group2",
408
+ 60,
409
+ [
410
+ create_record("b"),
411
+ create_record("d"),
412
+ create_record("f"),
413
+ create_record("a"),
414
+ create_record("c"),
415
+ create_record("e"),
416
+ ],
417
+ ],
418
+ ]
419
+
420
+ left = [
421
+ [
422
+ "group1",
423
+ 10,
424
+ [
425
+ create_record(1),
426
+ create_record(3),
427
+ create_record(5),
428
+ ],
429
+ ],
430
+ [
431
+ "group2",
432
+ 20,
433
+ [
434
+ create_record("a"),
435
+ create_record("c"),
436
+ create_record("e"),
437
+ ],
438
+ ],
439
+ [
440
+ "group3",
441
+ 30,
442
+ [
443
+ create_record("A"),
444
+ create_record("B"),
445
+ create_record("C"),
446
+ ],
447
+ ],
448
+ ]
449
+ right = [
450
+ [
451
+ "group1",
452
+ 30,
453
+ [
454
+ create_record(2),
455
+ create_record(4),
456
+ create_record(6),
457
+ ],
458
+ ],
459
+ [
460
+ "group2",
461
+ 40,
462
+ [
463
+ create_record("b"),
464
+ create_record("d"),
465
+ create_record("f"),
466
+ ],
467
+ ],
468
+ [
469
+ "group4",
470
+ 50,
471
+ [
472
+ create_record("D"),
473
+ create_record("E"),
474
+ create_record("F"),
475
+ ],
476
+ ],
477
+ ]
478
+
479
+ reduced = @plugin.reduce({
480
+ "type" => "sort",
481
+ "operators" => [
482
+ { "column" => 1, "operator" => "<" },
483
+ ],
484
+ "key_column" => 0,
485
+ "limit" => -1,
486
+ },
487
+ left,
488
+ right)
489
+ assert_equal(expected, reduced)
633
490
  end
634
491
  end
635
492
  end