fluent-plugin-droonga 0.0.2 → 0.7.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 (150) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -0
  3. data/.yardopts +7 -0
  4. data/Gemfile +14 -2
  5. data/LICENSE.txt +1 -1
  6. data/README.md +1 -1
  7. data/Rakefile +27 -5
  8. data/benchmark/benchmark.rb +1 -1
  9. data/benchmark/utils.rb +9 -6
  10. data/benchmark/watch/benchmark-notify.rb +2 -2
  11. data/benchmark/watch/benchmark-publish.rb +1 -1
  12. data/benchmark/watch/benchmark-scan.rb +1 -1
  13. data/benchmark/watch/catalog.json +1 -1
  14. data/bin/grn2jsons +1 -1
  15. data/fluent-plugin-droonga.gemspec +5 -3
  16. data/lib/droonga/adapter.rb +13 -130
  17. data/lib/droonga/adapter_plugin.rb +51 -0
  18. data/lib/droonga/catalog.rb +2 -2
  19. data/lib/droonga/collector.rb +107 -0
  20. data/lib/droonga/collector_plugin.rb +82 -0
  21. data/lib/droonga/command_mapper.rb +1 -1
  22. data/lib/droonga/{proxy.rb → dispatcher.rb} +116 -151
  23. data/lib/droonga/distributor.rb +51 -0
  24. data/lib/droonga/distributor_plugin.rb +59 -0
  25. data/lib/droonga/engine.rb +9 -50
  26. data/lib/droonga/farm.rb +47 -0
  27. data/lib/droonga/forwarder.rb +125 -0
  28. data/lib/droonga/handler.rb +69 -60
  29. data/lib/droonga/handler_plugin.rb +22 -11
  30. data/lib/droonga/input_message.rb +51 -0
  31. data/lib/droonga/job_queue.rb +5 -1
  32. data/lib/droonga/job_queue_schema.rb +1 -1
  33. data/lib/droonga/logger.rb +1 -1
  34. data/lib/droonga/partition.rb +76 -0
  35. data/lib/droonga/pluggable.rb +62 -0
  36. data/lib/droonga/plugin.rb +18 -16
  37. data/lib/droonga/plugin/{adapter_groonga.rb → adapter/groonga.rb} +10 -10
  38. data/lib/droonga/plugin/adapter/groonga/select.rb +13 -4
  39. data/lib/droonga/plugin/collector/basic.rb +142 -0
  40. data/lib/droonga/plugin/distributor/crud.rb +43 -0
  41. data/lib/droonga/plugin/distributor/groonga.rb +37 -0
  42. data/lib/droonga/plugin/distributor/search.rb +273 -0
  43. data/lib/droonga/plugin/distributor/watch.rb +39 -0
  44. data/lib/droonga/plugin/{handler_add.rb → handler/add.rb} +6 -6
  45. data/lib/droonga/plugin/{handler_forward.rb → handler/forward.rb} +9 -4
  46. data/lib/droonga/plugin/{handler_groonga.rb → handler/groonga.rb} +36 -4
  47. data/lib/droonga/plugin/handler/groonga/column_create.rb +5 -9
  48. data/lib/droonga/plugin/handler/groonga/table_create.rb +9 -18
  49. data/lib/droonga/plugin/{handler_search.rb → handler/search.rb} +4 -4
  50. data/lib/droonga/plugin/{handler_watch.rb → handler/watch.rb} +4 -4
  51. data/lib/droonga/plugin_loader.rb +45 -0
  52. data/lib/droonga/plugin_registerable.rb +51 -0
  53. data/lib/droonga/plugin_repository.rb +56 -0
  54. data/lib/droonga/processor.rb +64 -0
  55. data/lib/droonga/searcher.rb +16 -7
  56. data/lib/droonga/server.rb +5 -9
  57. data/lib/droonga/sweeper.rb +1 -1
  58. data/lib/droonga/watch_schema.rb +1 -1
  59. data/lib/droonga/watcher.rb +1 -1
  60. data/lib/droonga/worker.rb +21 -9
  61. data/lib/fluent/plugin/out_droonga.rb +33 -15
  62. data/lib/groonga_command_converter.rb +1 -1
  63. data/sample/cluster/fluentd.conf +0 -1
  64. data/test/command/config/default/catalog.json +43 -0
  65. data/test/command/config/default/fluentd.conf +11 -0
  66. data/test/command/fixture/documents.jsons +208 -0
  67. data/test/command/fixture/user-table-array.jsons +38 -0
  68. data/test/command/fixture/user-table.jsons +38 -0
  69. data/test/command/run-test.rb +35 -0
  70. data/test/command/suite/add/minimum.expected +12 -0
  71. data/test/command/suite/add/minimum.test +11 -0
  72. data/test/command/suite/add/with-values.expected +12 -0
  73. data/test/command/suite/add/with-values.test +17 -0
  74. data/test/command/suite/add/without-key.expected +12 -0
  75. data/test/command/suite/add/without-key.test +16 -0
  76. data/test/command/suite/groonga/column_create/scalar.expected +34 -0
  77. data/test/command/suite/groonga/column_create/scalar.test +17 -0
  78. data/test/command/suite/groonga/column_create/vector.expected +34 -0
  79. data/test/command/suite/groonga/column_create/vector.test +18 -0
  80. data/test/command/suite/groonga/select/minimum.expected +26 -0
  81. data/test/command/suite/groonga/select/minimum.test +8 -0
  82. data/test/command/suite/groonga/table_create/array.expected +17 -0
  83. data/test/command/suite/groonga/table_create/array.test +8 -0
  84. data/test/command/suite/groonga/table_create/hash.expected +17 -0
  85. data/test/command/suite/groonga/table_create/hash.test +8 -0
  86. data/test/command/suite/search/array-attribute-label.expected +25 -0
  87. data/test/command/suite/search/array-attribute-label.test +30 -0
  88. data/test/command/suite/search/chained-queries.expected +45 -0
  89. data/test/command/suite/search/chained-queries.test +43 -0
  90. data/test/command/suite/search/complex.expected +52 -0
  91. data/test/command/suite/search/complex.test +25 -0
  92. data/test/command/suite/search/condition-nested.expected +19 -0
  93. data/test/command/suite/search/condition-nested.test +29 -0
  94. data/test/command/suite/search/condition-query.expected +28 -0
  95. data/test/command/suite/search/condition-query.test +25 -0
  96. data/test/command/suite/search/condition-script.expected +28 -0
  97. data/test/command/suite/search/condition-script.test +28 -0
  98. data/test/command/suite/search/hash-attribute-label.expected +34 -0
  99. data/test/command/suite/search/hash-attribute-label.test +38 -0
  100. data/test/command/suite/search/minimum.expected +13 -0
  101. data/test/command/suite/search/minimum.test +16 -0
  102. data/test/command/suite/search/multiple-queries.expected +39 -0
  103. data/test/command/suite/search/multiple-queries.test +39 -0
  104. data/test/command/suite/search/output-range.expected +28 -0
  105. data/test/command/suite/search/output-range.test +25 -0
  106. data/test/command/suite/search/simple.expected +52 -0
  107. data/test/command/suite/search/simple.test +24 -0
  108. data/test/command/suite/search/sort-and-output-range.expected +25 -0
  109. data/test/command/suite/search/sort-and-output-range.test +29 -0
  110. data/test/command/suite/search/sort-range.expected +28 -0
  111. data/test/command/suite/search/sort-range.test +28 -0
  112. data/test/command/suite/search/sort-with-invisible-column.expected +28 -0
  113. data/test/command/suite/search/sort-with-invisible-column.test +28 -0
  114. data/test/unit/fixtures/array.grn +18 -0
  115. data/test/{fixtures → unit/fixtures}/catalog.json +0 -0
  116. data/test/{fixtures → unit/fixtures}/document.grn +20 -9
  117. data/test/unit/fixtures/reference/array.grn +11 -0
  118. data/test/unit/fixtures/reference/hash.grn +7 -0
  119. data/test/{helper.rb → unit/helper.rb} +2 -1
  120. data/test/{helper → unit/helper}/fixture.rb +1 -1
  121. data/test/unit/helper/plugin_helper.rb +38 -0
  122. data/test/{helper → unit/helper}/sandbox.rb +19 -6
  123. data/test/{helper → unit/helper}/stub_worker.rb +1 -1
  124. data/test/{helper → unit/helper}/watch_helper.rb +1 -13
  125. data/test/{plugin → unit/plugin}/adapter/groonga/test_select.rb +108 -4
  126. data/test/unit/plugin/collector/test_basic.rb +558 -0
  127. data/test/unit/plugin/distributor/test_search.rb +914 -0
  128. data/test/{plugin → unit/plugin}/handler/groonga/test_column_create.rb +18 -14
  129. data/test/{plugin → unit/plugin}/handler/groonga/test_table_create.rb +13 -11
  130. data/test/{plugin/handler/test_handler_add.rb → unit/plugin/handler/test_add.rb} +2 -14
  131. data/test/{plugin/handler/test_handler_groonga.rb → unit/plugin/handler/test_groonga.rb} +6 -26
  132. data/test/unit/plugin/handler/test_search.rb +601 -0
  133. data/test/{plugin/handler/test_handler_watch.rb → unit/plugin/handler/test_watch.rb} +2 -2
  134. data/test/{run-test.rb → unit/run-test.rb} +3 -3
  135. data/test/{test_adapter.rb → unit/test_adapter.rb} +17 -14
  136. data/test/{test_catalog.rb → unit/test_catalog.rb} +4 -4
  137. data/test/{test_command_mapper.rb → unit/test_command_mapper.rb} +1 -1
  138. data/test/{test_groonga_command_converter.rb → unit/test_groonga_command_converter.rb} +3 -3
  139. data/test/{test_job_queue_schema.rb → unit/test_job_queue_schema.rb} +1 -1
  140. data/test/{test_output.rb → unit/test_output.rb} +9 -9
  141. data/test/{test_handler.rb → unit/test_plugin.rb} +19 -22
  142. data/test/unit/test_plugin_repository.rb +89 -0
  143. data/test/{test_sweeper.rb → unit/test_sweeper.rb} +1 -1
  144. data/test/{test_watch_schema.rb → unit/test_watch_schema.rb} +1 -1
  145. data/test/{test_watcher.rb → unit/test_watcher.rb} +1 -1
  146. metadata +226 -66
  147. data/lib/droonga/executor.rb +0 -289
  148. data/lib/droonga/plugin/handler_proxy.rb +0 -82
  149. data/test/plugin/handler/test_handler_search.rb +0 -512
  150. data/test/test_worker.rb +0 -144
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2013 droonga project
1
+ # Copyright (C) 2013 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
@@ -15,14 +15,18 @@
15
15
 
16
16
  class ColumnCreateTest < GroongaHandlerTest
17
17
  def test_success
18
- @handler.table_create({"name" => "Books"})
19
- @handler.column_create({"table" => "Books", "name" => "title", "type" => "ShortText"})
20
- assert_equal([true], @worker.body)
18
+ @plugin.table_create({"name" => "Books"})
19
+ @plugin.column_create({"table" => "Books", "name" => "title", "type" => "ShortText"})
20
+ response = @messages.last.first
21
+ assert_equal(
22
+ [[Droonga::GroongaHandler::Status::SUCCESS, NORMALIZED_START_TIME, NORMALIZED_ELAPSED_TIME], true],
23
+ [normalize_header(response.first), response.last]
24
+ )
21
25
  end
22
26
 
23
27
  def test_name
24
- @handler.table_create({"name" => "Books"})
25
- @handler.column_create({"table" => "Books", "name" => "title", "type" => "ShortText"})
28
+ @plugin.table_create({"name" => "Books"})
29
+ @plugin.column_create({"table" => "Books", "name" => "title", "type" => "ShortText"})
26
30
  assert_equal(<<-SCHEMA, dump)
27
31
  table_create Books TABLE_HASH_KEY --key_type ShortText
28
32
  column_create Books title COLUMN_SCALAR ShortText
@@ -30,8 +34,8 @@ column_create Books title COLUMN_SCALAR ShortText
30
34
  end
31
35
 
32
36
  def test_type
33
- @handler.table_create({"name" => "Books"})
34
- @handler.column_create({"table" => "Books", "name" => "main_text", "type" => "LongText"})
37
+ @plugin.table_create({"name" => "Books"})
38
+ @plugin.column_create({"table" => "Books", "name" => "main_text", "type" => "LongText"})
35
39
  assert_equal(<<-SCHEMA, dump)
36
40
  table_create Books TABLE_HASH_KEY --key_type ShortText
37
41
  column_create Books main_text COLUMN_SCALAR LongText
@@ -55,8 +59,8 @@ column_create Books main_text COLUMN_SCALAR LongText
55
59
  "type" => "ShortText",
56
60
  "flags" => data[:flags],
57
61
  }
58
- @handler.table_create({"name" => "Books"})
59
- @handler.column_create(request)
62
+ @plugin.table_create({"name" => "Books"})
63
+ @plugin.column_create(request)
60
64
  assert_equal(<<-EXPECTED, dump)
61
65
  table_create Books TABLE_HASH_KEY --key_type ShortText
62
66
  column_create Books title #{data[:flags]} ShortText
@@ -67,8 +71,8 @@ column_create Books title #{data[:flags]} ShortText
67
71
  class IndexTest < self
68
72
  def setup
69
73
  super
70
- @handler.table_create({"name" => "Books"})
71
- @handler.column_create({"table" => "Books", "name" => "title", "type" => "ShortText"})
74
+ @plugin.table_create({"name" => "Books"})
75
+ @plugin.column_create({"table" => "Books", "name" => "title", "type" => "ShortText"})
72
76
  end
73
77
 
74
78
  def test_index_column_type
@@ -82,7 +86,7 @@ column_create Books title #{data[:flags]} ShortText
82
86
  "source" => "title",
83
87
  "flags" => data[:flags],
84
88
  }
85
- @handler.column_create(request)
89
+ @plugin.column_create(request)
86
90
  assert_equal(<<-EXPECTED, dump)
87
91
  table_create Books TABLE_HASH_KEY --key_type ShortText
88
92
  column_create Books title COLUMN_SCALAR ShortText
@@ -114,7 +118,7 @@ column_create Books entry_title #{data[:flags]} Books title
114
118
  "source" => "title",
115
119
  "flags" => flags,
116
120
  }
117
- @handler.column_create(request)
121
+ @plugin.column_create(request)
118
122
  assert_equal(<<-EXPECTED, dump)
119
123
  table_create Books TABLE_HASH_KEY --key_type ShortText
120
124
  column_create Books title COLUMN_SCALAR ShortText
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2013 droonga project
1
+ # Copyright (C) 2013 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
@@ -15,23 +15,25 @@
15
15
 
16
16
  class TableCreateTest < GroongaHandlerTest
17
17
  def test_success
18
- @handler.table_create({"name" => "Books"})
18
+ @plugin.table_create({"name" => "Books"})
19
+ response = @messages.last.first
19
20
  assert_equal(
20
21
  [[Droonga::GroongaHandler::Status::SUCCESS, NORMALIZED_START_TIME, NORMALIZED_ELAPSED_TIME], true],
21
- [normalize_header(@worker.body.first), @worker.body.last]
22
+ [normalize_header(response.first), response.last]
22
23
  )
23
24
  end
24
25
 
25
26
  def test_failure
26
- @handler.table_create({})
27
+ @plugin.table_create({})
28
+ response = @messages.last.first
27
29
  assert_equal(
28
30
  [[Droonga::GroongaHandler::Status::INVALID_ARGUMENT, NORMALIZED_START_TIME, NORMALIZED_ELAPSED_TIME], false],
29
- [normalize_header(@worker.body.first), @worker.body.last]
31
+ [normalize_header(response.first), response.last]
30
32
  )
31
33
  end
32
34
 
33
35
  def test_name
34
- @handler.table_create({"name" => "Books"})
36
+ @plugin.table_create({"name" => "Books"})
35
37
  assert_equal(<<-SCHEMA, dump)
36
38
  table_create Books TABLE_HASH_KEY --key_type ShortText
37
39
  SCHEMA
@@ -81,7 +83,7 @@ table_create Books TABLE_NO_KEY
81
83
  "name" => "Books",
82
84
  "flags" => data[:flags],
83
85
  }
84
- @handler.table_create(request)
86
+ @plugin.table_create(request)
85
87
  assert_equal(data[:schema], dump)
86
88
  end
87
89
  end
@@ -92,7 +94,7 @@ table_create Books TABLE_NO_KEY
92
94
  "name" => "Books",
93
95
  "key_type" => "Int32",
94
96
  }
95
- @handler.table_create(request)
97
+ @plugin.table_create(request)
96
98
  assert_equal(<<-SCHEMA, dump)
97
99
  table_create Books TABLE_HASH_KEY --key_type Int32
98
100
  SCHEMA
@@ -105,7 +107,7 @@ table_create Books TABLE_HASH_KEY --key_type Int32
105
107
  "name" => "Books",
106
108
  "value_type" => "Int32",
107
109
  }
108
- @handler.table_create(request)
110
+ @plugin.table_create(request)
109
111
  assert_equal(<<-SCHEMA, dump)
110
112
  table_create Books TABLE_HASH_KEY --key_type ShortText --value_type Int32
111
113
  SCHEMA
@@ -118,7 +120,7 @@ table_create Books TABLE_HASH_KEY --key_type ShortText --value_type Int32
118
120
  "name" => "Books",
119
121
  "default_tokenizer" => "TokenBigram",
120
122
  }
121
- @handler.table_create(request)
123
+ @plugin.table_create(request)
122
124
  assert_equal(<<-SCHEMA, dump)
123
125
  table_create Books TABLE_HASH_KEY --key_type ShortText --default_tokenizer TokenBigram
124
126
  SCHEMA
@@ -131,7 +133,7 @@ table_create Books TABLE_HASH_KEY --key_type ShortText --default_tokenizer Token
131
133
  "name" => "Books",
132
134
  "normalizer" => "NormalizerAuto",
133
135
  }
134
- @handler.table_create(request)
136
+ @plugin.table_create(request)
135
137
  assert_equal(<<-SCHEMA, dump)
136
138
  table_create Books TABLE_HASH_KEY|KEY_NORMALIZE --key_type ShortText
137
139
  SCHEMA
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2013 droonga project
1
+ # Copyright (C) 2013 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
@@ -13,7 +13,7 @@
13
13
  # License along with this library; if not, write to the Free Software
14
14
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
15
 
16
- require "droonga/plugin/handler_add"
16
+ require "droonga/plugin/handler/add"
17
17
 
18
18
  class AddHandlerTest < Test::Unit::TestCase
19
19
  def setup
@@ -28,21 +28,9 @@ class AddHandlerTest < Test::Unit::TestCase
28
28
  end
29
29
 
30
30
  private
31
- def setup_database
32
- FileUtils.rm_rf(@database_path.dirname.to_s)
33
- FileUtils.mkdir_p(@database_path.dirname.to_s)
34
- @database = Groonga::Database.create(:path => @database_path.to_s)
35
- end
36
-
37
31
  def setup_schema
38
32
  end
39
33
 
40
- def teardown_database
41
- @database.close
42
- @database = nil
43
- FileUtils.rm_rf(@database_path.dirname.to_s)
44
- end
45
-
46
34
  def setup_handler
47
35
  @worker = StubWorker.new
48
36
  @handler = Droonga::AddHandler.new(@worker)
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2013 droonga project
1
+ # Copyright (C) 2013 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
@@ -13,41 +13,21 @@
13
13
  # License along with this library; if not, write to the Free Software
14
14
  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
15
 
16
- require "droonga/plugin/handler_groonga"
16
+ require "droonga/plugin/handler/groonga"
17
17
 
18
18
  class GroongaHandlerTest < Test::Unit::TestCase
19
+ include PluginHelper
20
+
19
21
  def setup
20
22
  setup_database
21
- setup_handler
23
+ setup_plugin(Droonga::GroongaHandler)
22
24
  end
23
25
 
24
26
  def teardown
25
- teardown_handler
27
+ teardown_plugin
26
28
  teardown_database
27
29
  end
28
30
 
29
- private
30
- def setup_database
31
- FileUtils.rm_rf(@database_path.dirname.to_s)
32
- FileUtils.mkdir_p(@database_path.dirname.to_s)
33
- @database = Groonga::Database.create(:path => @database_path.to_s)
34
- end
35
-
36
- def teardown_database
37
- @database.close
38
- @database = nil
39
- FileUtils.rm_rf(@database_path.dirname.to_s)
40
- end
41
-
42
- def setup_handler
43
- @worker = StubWorker.new
44
- @handler = Droonga::GroongaHandler.new(@worker)
45
- end
46
-
47
- def teardown_handler
48
- @handler = nil
49
- end
50
-
51
31
  private
52
32
  def dump
53
33
  database_dumper = Groonga::DatabaseDumper.new(:database => @database)
@@ -0,0 +1,601 @@
1
+ # Copyright (C) 2013 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/handler/search"
17
+
18
+ class SearchHandlerTest < Test::Unit::TestCase
19
+ include PluginHelper
20
+
21
+ def setup
22
+ setup_database
23
+ end
24
+
25
+ def teardown
26
+ teardown_plugin
27
+ teardown_database
28
+ end
29
+
30
+ private
31
+ def search(request)
32
+ @plugin.search(request)
33
+ results_to_result_set(@messages)
34
+ end
35
+
36
+ def results_to_result_set(results)
37
+ result_set = {}
38
+ results.each do |result_and_name|
39
+ result, name = result_and_name
40
+ result_set[name] = normalize_result(result)
41
+ end
42
+ result_set
43
+ end
44
+
45
+ def normalize_result(result)
46
+ result["startTime"] = start_time if result["startTime"]
47
+ result["elapsedTime"] = elapsed_time if result["elapsedTime"]
48
+ result
49
+ end
50
+
51
+ def start_time
52
+ "2013-01-31T14:34:47+09:00"
53
+ end
54
+
55
+ def elapsed_time
56
+ 0.01
57
+ end
58
+
59
+ def assert_search(expected, request)
60
+ assert_equal(expected, search(request))
61
+ end
62
+
63
+ class GeneralTest < self
64
+ def setup
65
+ super
66
+ restore(fixture_data("document.grn"))
67
+ setup_plugin(Droonga::SearchHandler)
68
+ end
69
+
70
+ class NoParameterTest < self
71
+ def test_empty
72
+ assert_search({}, {})
73
+ end
74
+ end
75
+
76
+ class QueriesTest < self
77
+ def test_empty
78
+ assert_search({}, {"queries" => {}})
79
+ end
80
+ end
81
+
82
+ class HashQueryTest < self
83
+ def test_string_matchTo
84
+ request = base_request
85
+ request["queries"]["sections-result"]["condition"] = {
86
+ "query" => "Groonga",
87
+ "matchTo" => "title"
88
+ }
89
+ assert_search({
90
+ "sections-result" => {
91
+ "records" => [
92
+ { "title" => "Groonga overview" },
93
+ ],
94
+ },
95
+ },
96
+ request)
97
+ end
98
+
99
+ def test_array_matchTo
100
+ request = base_request
101
+ request["queries"]["sections-result"]["condition"] = {
102
+ "query" => "Groonga",
103
+ "matchTo" => ["title"]
104
+ }
105
+ assert_search({
106
+ "sections-result" => {
107
+ "records" => [
108
+ { "title" => "Groonga overview" },
109
+ ],
110
+ },
111
+ },
112
+ request)
113
+ end
114
+
115
+ def base_request
116
+ {
117
+ "queries" => {
118
+ "sections-result" => {
119
+ "source" => "Sections",
120
+ "output" => {
121
+ "elements" => [
122
+ "records",
123
+ ],
124
+ "format" => "complex",
125
+ "limit" => 1,
126
+ "attributes" => ["title"],
127
+ },
128
+ },
129
+ },
130
+ }
131
+ end
132
+ end
133
+
134
+ class SourceTest < self
135
+ def test_non_existent
136
+ assert_raise(Droonga::Searcher::UndefinedSourceError) do
137
+ search({
138
+ "queries" => {
139
+ "non-existent-result" => {
140
+ "source" => "non-existent",
141
+ },
142
+ },
143
+ })
144
+ end
145
+ end
146
+
147
+ def test_existent
148
+ assert_search({
149
+ "sections-result" => {},
150
+ },
151
+ {
152
+ "queries" => {
153
+ "sections-result" => {
154
+ "source" => "Sections",
155
+ "output" => {},
156
+ },
157
+ },
158
+ })
159
+ end
160
+ end
161
+
162
+ class OutputTest < self
163
+ def test_count
164
+ assert_search({
165
+ "sections-result" => {
166
+ "count" => 9,
167
+ },
168
+ },
169
+ {
170
+ "queries" => {
171
+ "sections-result" => {
172
+ "source" => "Sections",
173
+ "output" => {
174
+ "elements" => [
175
+ "count",
176
+ ],
177
+ },
178
+ },
179
+ },
180
+ })
181
+ end
182
+
183
+ def test_elapsed_time
184
+ assert_search({
185
+ "sections-result" => {
186
+ "startTime" => start_time,
187
+ "elapsedTime" => elapsed_time,
188
+ },
189
+ },
190
+ {
191
+ "queries" => {
192
+ "sections-result" => {
193
+ "source" => "Sections",
194
+ "output" => {
195
+ "elements" => [
196
+ "startTime",
197
+ "elapsedTime",
198
+ ],
199
+ },
200
+ },
201
+ },
202
+ })
203
+ end
204
+
205
+ class AttributesTest < self
206
+ def test_source_only
207
+ expected = {
208
+ "sections-result" => {
209
+ "records" => [
210
+ {
211
+ "_key" => "1.1",
212
+ "title" => "Groonga overview",
213
+ },
214
+ {
215
+ "_key" => "1.2",
216
+ "title" => "Full text search and Instant update",
217
+ },
218
+ {
219
+ "_key" => "1.3",
220
+ "title" => "Column store and aggregate query",
221
+ },
222
+ ],
223
+ },
224
+ }
225
+ request = {
226
+ "queries" => {
227
+ "sections-result" => {
228
+ "source" => "Sections",
229
+ "output" => {
230
+ "elements" => [
231
+ "records",
232
+ ],
233
+ "format" => "complex",
234
+ "limit" => 3,
235
+ "attributes" => ["_key", "title"],
236
+ },
237
+ },
238
+ },
239
+ }
240
+ assert_search(expected, request)
241
+ end
242
+
243
+ def test_label
244
+ expected = {
245
+ "sections-result" => {
246
+ "records" => [
247
+ {
248
+ "key" => "1.1",
249
+ "title" => "Groonga overview",
250
+ },
251
+ {
252
+ "key" => "1.2",
253
+ "title" => "Full text search and Instant update",
254
+ },
255
+ {
256
+ "key" => "1.3",
257
+ "title" => "Column store and aggregate query",
258
+ },
259
+ ],
260
+ },
261
+ }
262
+ request = {
263
+ "queries" => {
264
+ "sections-result" => {
265
+ "source" => "Sections",
266
+ "output" => {
267
+ "elements" => [
268
+ "records",
269
+ ],
270
+ "format" => "complex",
271
+ "limit" => 3,
272
+ "attributes" => [
273
+ {
274
+ "label" => "key",
275
+ "source" => "_key",
276
+ },
277
+ "title",
278
+ ],
279
+ },
280
+ },
281
+ },
282
+ }
283
+ assert_search(expected, request)
284
+ end
285
+
286
+ def test_static_value
287
+ expected = {
288
+ "sections-result" => {
289
+ "records" => [
290
+ {
291
+ "single_quote_string" => "string value",
292
+ "double_quote_string" => "string value",
293
+ "integer" => 29,
294
+ "complex_negative_number" => -29.29,
295
+ },
296
+ {
297
+ "single_quote_string" => "string value",
298
+ "double_quote_string" => "string value",
299
+ "integer" => 29,
300
+ "complex_negative_number" => -29.29,
301
+ },
302
+ ],
303
+ },
304
+ }
305
+ request = {
306
+ "queries" => {
307
+ "sections-result" => {
308
+ "source" => "Sections",
309
+ "output" => {
310
+ "elements" => [
311
+ "records",
312
+ ],
313
+ "format" => "complex",
314
+ "limit" => 2,
315
+ "attributes" => [
316
+ {
317
+ "label" => "single_quote_string",
318
+ "source" => "'string value'",
319
+ },
320
+ {
321
+ "label" => "double_quote_string",
322
+ "source" => '"string value"',
323
+ },
324
+ {
325
+ "label" => "integer",
326
+ "source" => "29",
327
+ },
328
+ {
329
+ "label" => "complex_negative_number",
330
+ "source" => "-29.29",
331
+ },
332
+ ],
333
+ },
334
+ },
335
+ },
336
+ }
337
+ assert_search(expected, request)
338
+ end
339
+
340
+ def test_expression
341
+ expected = {
342
+ "sections-result" => {
343
+ "records" => [
344
+ {
345
+ "formatted title" => "<Groonga overview>",
346
+ "title" => "Groonga overview",
347
+ },
348
+ ],
349
+ },
350
+ }
351
+ request = {
352
+ "queries" => {
353
+ "sections-result" => {
354
+ "source" => "Sections",
355
+ "output" => {
356
+ "elements" => [
357
+ "records",
358
+ ],
359
+ "format" => "complex",
360
+ "limit" => 1,
361
+ "attributes" => [
362
+ "title",
363
+ {
364
+ "label" => "formatted title",
365
+ "source" => "'<' + title + '>'",
366
+ },
367
+ ],
368
+ },
369
+ },
370
+ },
371
+ }
372
+ assert_search(expected, request)
373
+ end
374
+
375
+ def test_snippet_html
376
+ expected = {
377
+ "sections-result" => {
378
+ "records" => [
379
+ {
380
+ "title" => "Groonga overview",
381
+ "snippet" => [
382
+ "<span class=\"keyword\">Groonga</span> overview",
383
+ ],
384
+ },
385
+ ],
386
+ },
387
+ }
388
+ request = {
389
+ "queries" => {
390
+ "sections-result" => {
391
+ "source" => "Sections",
392
+ "condition" => {
393
+ "query" => "Groonga",
394
+ "matchTo" => ["title"],
395
+ },
396
+ "output" => {
397
+ "elements" => [
398
+ "records",
399
+ ],
400
+ "format" => "complex",
401
+ "limit" => 1,
402
+ "attributes" => [
403
+ "title",
404
+ {
405
+ "label" => "snippet",
406
+ "source" => "snippet_html(title)",
407
+ },
408
+ ],
409
+ },
410
+ },
411
+ },
412
+ }
413
+ assert_search(expected, request)
414
+ end
415
+ end
416
+
417
+ class FormatTest < self
418
+ def test_complex
419
+ request = {
420
+ "queries" => {
421
+ "sections-result" => {
422
+ "source" => "Sections",
423
+ "output" => {
424
+ "elements" => [
425
+ "records",
426
+ ],
427
+ "format" => "complex",
428
+ "limit" => 3,
429
+ "attributes" => ["_key", "title"],
430
+ },
431
+ },
432
+ },
433
+ }
434
+ assert_search(complex_result, request)
435
+ end
436
+
437
+ def test_simple
438
+ request = {
439
+ "queries" => {
440
+ "sections-result" => {
441
+ "source" => "Sections",
442
+ "output" => {
443
+ "elements" => [
444
+ "records",
445
+ ],
446
+ "format" => "simple",
447
+ "limit" => 3,
448
+ "attributes" => ["_key", "title"],
449
+ },
450
+ },
451
+ },
452
+ }
453
+ assert_search(simple_result, request)
454
+ end
455
+
456
+ def test_default
457
+ request = {
458
+ "queries" => {
459
+ "sections-result" => {
460
+ "source" => "Sections",
461
+ "output" => {
462
+ "elements" => [
463
+ "records",
464
+ ],
465
+ "limit" => 3,
466
+ "attributes" => ["_key", "title"],
467
+ },
468
+ },
469
+ },
470
+ }
471
+ assert_search(simple_result, request)
472
+ end
473
+
474
+ def complex_result
475
+ {
476
+ "sections-result" => {
477
+ "records" => [
478
+ {
479
+ "_key" => "1.1",
480
+ "title" => "Groonga overview",
481
+ },
482
+ {
483
+ "_key" => "1.2",
484
+ "title" => "Full text search and Instant update",
485
+ },
486
+ {
487
+ "_key" => "1.3",
488
+ "title" => "Column store and aggregate query",
489
+ },
490
+ ],
491
+ },
492
+ }
493
+ end
494
+
495
+ def simple_result
496
+ {
497
+ "sections-result" => {
498
+ "records" => [
499
+ ["1.1", "Groonga overview"],
500
+ ["1.2", "Full text search and Instant update"],
501
+ ["1.3", "Column store and aggregate query"],
502
+ ],
503
+ },
504
+ }
505
+ end
506
+ end
507
+ end
508
+ end
509
+
510
+ class ReferenceTest < self
511
+ class Hash
512
+ def setup
513
+ super
514
+ restore(fixture_data("reference/hash.grn"))
515
+ setup_plugin(Droonga::SearchHandler)
516
+ end
517
+
518
+ def test_reference_to_hash
519
+ expected = {
520
+ "sections-result" => {
521
+ "records" => [
522
+ {
523
+ "_key" => "1.1",
524
+ "document" => "Groonga",
525
+ },
526
+ {
527
+ "_key" => "1.2",
528
+ "document" => "Groonga",
529
+ },
530
+ {
531
+ "_key" => "1.3",
532
+ "document" => "Groonga",
533
+ },
534
+ ],
535
+ },
536
+ }
537
+ request = {
538
+ "queries" => {
539
+ "sections-result" => {
540
+ "source" => "SectionsForHash",
541
+ "output" => {
542
+ "elements" => [
543
+ "records",
544
+ ],
545
+ "format" => "complex",
546
+ "limit" => 3,
547
+ "attributes" => ["_key", "document"],
548
+ },
549
+ },
550
+ },
551
+ }
552
+ assert_search(expected, request)
553
+ end
554
+ end
555
+
556
+ class Array
557
+ def setup
558
+ super
559
+ restore(fixture_data("reference/array.grn"))
560
+ setup_plugin(Droonga::SearchHandler)
561
+ end
562
+
563
+ def test_reference_to_array
564
+ expected = {
565
+ "sections-result" => {
566
+ "records" => [
567
+ {
568
+ "_key" => "1.1",
569
+ "document" => 1,
570
+ },
571
+ {
572
+ "_key" => "1.2",
573
+ "document" => 1,
574
+ },
575
+ {
576
+ "_key" => "1.3",
577
+ "document" => 1,
578
+ },
579
+ ],
580
+ },
581
+ }
582
+ request = {
583
+ "queries" => {
584
+ "sections-result" => {
585
+ "source" => "SectionsForArray",
586
+ "output" => {
587
+ "elements" => [
588
+ "records",
589
+ ],
590
+ "format" => "complex",
591
+ "limit" => 3,
592
+ "attributes" => ["_key", "document"],
593
+ },
594
+ },
595
+ },
596
+ }
597
+ assert_search(expected, request)
598
+ end
599
+ end
600
+ end
601
+ end