droonga-engine 1.0.1

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 (341) hide show
  1. data/.dir-locals.el +3 -0
  2. data/.gitignore +6 -0
  3. data/.travis.yml +15 -0
  4. data/.yardopts +7 -0
  5. data/Gemfile +66 -0
  6. data/LICENSE.txt +14 -0
  7. data/README.md +17 -0
  8. data/Rakefile +64 -0
  9. data/benchmark/benchmark.rb +123 -0
  10. data/benchmark/utils.rb +246 -0
  11. data/benchmark/watch/benchmark-notify.rb +143 -0
  12. data/benchmark/watch/benchmark-notify.sh +20 -0
  13. data/benchmark/watch/benchmark-publish.rb +120 -0
  14. data/benchmark/watch/benchmark-scan.rb +213 -0
  15. data/bin/droonga-catalog-generate +103 -0
  16. data/bin/droonga-engine +20 -0
  17. data/bin/droonga-engine-service +20 -0
  18. data/doc/text/news.md +106 -0
  19. data/droonga-engine.gemspec +52 -0
  20. data/lib/droonga/adapter.rb +48 -0
  21. data/lib/droonga/adapter_runner.rb +104 -0
  22. data/lib/droonga/catalog/base.rb +41 -0
  23. data/lib/droonga/catalog/collection_volume.rb +106 -0
  24. data/lib/droonga/catalog/dataset.rb +69 -0
  25. data/lib/droonga/catalog/errors.rb +113 -0
  26. data/lib/droonga/catalog/schema.rb +186 -0
  27. data/lib/droonga/catalog/single_volume.rb +28 -0
  28. data/lib/droonga/catalog/slice.rb +41 -0
  29. data/lib/droonga/catalog/version1.rb +427 -0
  30. data/lib/droonga/catalog/version2.rb +96 -0
  31. data/lib/droonga/catalog/version2_validator.rb +63 -0
  32. data/lib/droonga/catalog/volume.rb +33 -0
  33. data/lib/droonga/catalog/volume_collection.rb +56 -0
  34. data/lib/droonga/catalog_generator.rb +156 -0
  35. data/lib/droonga/catalog_loader.rb +56 -0
  36. data/lib/droonga/catalog_observer.rb +83 -0
  37. data/lib/droonga/collector.rb +38 -0
  38. data/lib/droonga/collector_message.rb +71 -0
  39. data/lib/droonga/collector_runner.rb +64 -0
  40. data/lib/droonga/collectors/and.rb +26 -0
  41. data/lib/droonga/collectors/or.rb +26 -0
  42. data/lib/droonga/collectors/sum.rb +26 -0
  43. data/lib/droonga/collectors.rb +18 -0
  44. data/lib/droonga/dispatcher.rb +326 -0
  45. data/lib/droonga/distributed_command_planner.rb +179 -0
  46. data/lib/droonga/distributor.rb +87 -0
  47. data/lib/droonga/engine/command/droonga_engine.rb +441 -0
  48. data/lib/droonga/engine/version.rb +20 -0
  49. data/lib/droonga/engine.rb +80 -0
  50. data/lib/droonga/engine_state.rb +79 -0
  51. data/lib/droonga/error.rb +73 -0
  52. data/lib/droonga/error_messages.rb +33 -0
  53. data/lib/droonga/event_loop.rb +46 -0
  54. data/lib/droonga/farm.rb +58 -0
  55. data/lib/droonga/fluent_message_receiver.rb +191 -0
  56. data/lib/droonga/fluent_message_sender.rb +140 -0
  57. data/lib/droonga/forwarder.rb +119 -0
  58. data/lib/droonga/handler.rb +49 -0
  59. data/lib/droonga/handler_message.rb +61 -0
  60. data/lib/droonga/handler_messenger.rb +119 -0
  61. data/lib/droonga/handler_runner.rb +125 -0
  62. data/lib/droonga/input_message.rb +51 -0
  63. data/lib/droonga/job_protocol.rb +20 -0
  64. data/lib/droonga/job_pusher.rb +179 -0
  65. data/lib/droonga/job_receiver.rb +70 -0
  66. data/lib/droonga/loggable.rb +29 -0
  67. data/lib/droonga/logger.rb +142 -0
  68. data/lib/droonga/message_matcher.rb +109 -0
  69. data/lib/droonga/output_message.rb +55 -0
  70. data/lib/droonga/planner.rb +47 -0
  71. data/lib/droonga/pluggable.rb +31 -0
  72. data/lib/droonga/plugin/metadata/adapter_input_message.rb +39 -0
  73. data/lib/droonga/plugin/metadata/adapter_output_message.rb +39 -0
  74. data/lib/droonga/plugin/metadata/collector_message.rb +39 -0
  75. data/lib/droonga/plugin/metadata/handler_action.rb +39 -0
  76. data/lib/droonga/plugin/metadata/input_message.rb +54 -0
  77. data/lib/droonga/plugin.rb +43 -0
  78. data/lib/droonga/plugin_loader.rb +63 -0
  79. data/lib/droonga/plugin_registry.rb +66 -0
  80. data/lib/droonga/plugins/basic.rb +54 -0
  81. data/lib/droonga/plugins/crud.rb +145 -0
  82. data/lib/droonga/plugins/dump.rb +97 -0
  83. data/lib/droonga/plugins/error.rb +51 -0
  84. data/lib/droonga/plugins/groonga/column_create.rb +123 -0
  85. data/lib/droonga/plugins/groonga/column_list.rb +124 -0
  86. data/lib/droonga/plugins/groonga/column_remove.rb +65 -0
  87. data/lib/droonga/plugins/groonga/column_rename.rb +67 -0
  88. data/lib/droonga/plugins/groonga/delete.rb +117 -0
  89. data/lib/droonga/plugins/groonga/generic_command.rb +105 -0
  90. data/lib/droonga/plugins/groonga/generic_response.rb +43 -0
  91. data/lib/droonga/plugins/groonga/select.rb +236 -0
  92. data/lib/droonga/plugins/groonga/table_create.rb +111 -0
  93. data/lib/droonga/plugins/groonga/table_list.rb +120 -0
  94. data/lib/droonga/plugins/groonga/table_remove.rb +57 -0
  95. data/lib/droonga/plugins/groonga.rb +37 -0
  96. data/lib/droonga/plugins/search/distributed_search_planner.rb +407 -0
  97. data/lib/droonga/plugins/search.rb +146 -0
  98. data/lib/droonga/plugins/watch.rb +178 -0
  99. data/lib/droonga/processor.rb +63 -0
  100. data/lib/droonga/reducer.rb +169 -0
  101. data/lib/droonga/replier.rb +49 -0
  102. data/lib/droonga/schema_applier.rb +167 -0
  103. data/lib/droonga/searcher/mecab_filter.rb +67 -0
  104. data/lib/droonga/searcher.rb +733 -0
  105. data/lib/droonga/server.rb +45 -0
  106. data/lib/droonga/session.rb +99 -0
  107. data/lib/droonga/single_step.rb +68 -0
  108. data/lib/droonga/single_step_definition.rb +54 -0
  109. data/lib/droonga/slice.rb +122 -0
  110. data/lib/droonga/status_code.rb +25 -0
  111. data/lib/droonga/step_runner.rb +64 -0
  112. data/lib/droonga/sweeper.rb +42 -0
  113. data/lib/droonga/test/stub_handler.rb +37 -0
  114. data/lib/droonga/test/stub_handler_message.rb +35 -0
  115. data/lib/droonga/test/stub_handler_messenger.rb +34 -0
  116. data/lib/droonga/test/stub_planner.rb +31 -0
  117. data/lib/droonga/test.rb +21 -0
  118. data/lib/droonga/watch_schema.rb +92 -0
  119. data/lib/droonga/watcher.rb +257 -0
  120. data/lib/droonga/worker.rb +61 -0
  121. data/sample/cluster/catalog.json +42 -0
  122. data/sample/mecab_filter/data.grn +7 -0
  123. data/sample/mecab_filter/ddl.grn +7 -0
  124. data/sample/mecab_filter/search_with_mecab_filter.json +21 -0
  125. data/sample/mecab_filter/search_without_mecab_filter.json +21 -0
  126. data/test/command/config/default/catalog.json +85 -0
  127. data/test/command/config/default/fluentd.conf +11 -0
  128. data/test/command/config/version1/catalog.json +68 -0
  129. data/test/command/config/version1/fluentd.conf +11 -0
  130. data/test/command/fixture/documents.jsons +208 -0
  131. data/test/command/fixture/event.jsons +41 -0
  132. data/test/command/fixture/user-table-array.jsons +38 -0
  133. data/test/command/fixture/user-table.jsons +47 -0
  134. data/test/command/run-test.rb +34 -0
  135. data/test/command/suite/add/dimension/column.catalog.json +28 -0
  136. data/test/command/suite/add/dimension/column.expected +41 -0
  137. data/test/command/suite/add/dimension/column.test +51 -0
  138. data/test/command/suite/add/dimension/integer.catalog.json +19 -0
  139. data/test/command/suite/add/dimension/integer.expected +41 -0
  140. data/test/command/suite/add/dimension/integer.test +51 -0
  141. data/test/command/suite/add/error/invalid-integer.expected +46 -0
  142. data/test/command/suite/add/error/invalid-integer.test +12 -0
  143. data/test/command/suite/add/error/invalid-time.expected +46 -0
  144. data/test/command/suite/add/error/invalid-time.test +12 -0
  145. data/test/command/suite/add/error/missing-key.expected +25 -0
  146. data/test/command/suite/add/error/missing-key.test +16 -0
  147. data/test/command/suite/add/error/missing-table.expected +25 -0
  148. data/test/command/suite/add/error/missing-table.test +16 -0
  149. data/test/command/suite/add/error/unknown-column.expected +46 -0
  150. data/test/command/suite/add/error/unknown-column.test +12 -0
  151. data/test/command/suite/add/error/unknown-table.expected +25 -0
  152. data/test/command/suite/add/error/unknown-table.test +17 -0
  153. data/test/command/suite/add/minimum.expected +6 -0
  154. data/test/command/suite/add/minimum.test +11 -0
  155. data/test/command/suite/add/with-values.expected +6 -0
  156. data/test/command/suite/add/with-values.test +17 -0
  157. data/test/command/suite/add/without-key.expected +6 -0
  158. data/test/command/suite/add/without-key.test +16 -0
  159. data/test/command/suite/groonga/column_create/scalar.expected +26 -0
  160. data/test/command/suite/groonga/column_create/scalar.test +17 -0
  161. data/test/command/suite/groonga/column_create/unknown-table.expected +14 -0
  162. data/test/command/suite/groonga/column_create/unknown-table.test +7 -0
  163. data/test/command/suite/groonga/column_create/vector.expected +26 -0
  164. data/test/command/suite/groonga/column_create/vector.test +18 -0
  165. data/test/command/suite/groonga/column_list/success.expected +86 -0
  166. data/test/command/suite/groonga/column_list/success.test +24 -0
  167. data/test/command/suite/groonga/column_list/unknown-table.expected +13 -0
  168. data/test/command/suite/groonga/column_list/unknown-table.test +7 -0
  169. data/test/command/suite/groonga/column_remove/success.expected +39 -0
  170. data/test/command/suite/groonga/column_remove/success.test +25 -0
  171. data/test/command/suite/groonga/column_remove/unknown-column.expected +27 -0
  172. data/test/command/suite/groonga/column_remove/unknown-column.test +16 -0
  173. data/test/command/suite/groonga/column_remove/unknown-table.expected +14 -0
  174. data/test/command/suite/groonga/column_remove/unknown-table.test +7 -0
  175. data/test/command/suite/groonga/column_rename/success.expected +39 -0
  176. data/test/command/suite/groonga/column_rename/success.test +26 -0
  177. data/test/command/suite/groonga/column_rename/unknown-column.expected +27 -0
  178. data/test/command/suite/groonga/column_rename/unknown-column.test +16 -0
  179. data/test/command/suite/groonga/column_rename/unknown-table.expected +14 -0
  180. data/test/command/suite/groonga/column_rename/unknown-table.test +7 -0
  181. data/test/command/suite/groonga/delete/duplicated-identifiers.expected +27 -0
  182. data/test/command/suite/groonga/delete/duplicated-identifiers.test +17 -0
  183. data/test/command/suite/groonga/delete/filter.expected +19 -0
  184. data/test/command/suite/groonga/delete/filter.test +19 -0
  185. data/test/command/suite/groonga/delete/invalid-filter.expected +14 -0
  186. data/test/command/suite/groonga/delete/invalid-filter.test +9 -0
  187. data/test/command/suite/groonga/delete/no-identifier.expected +27 -0
  188. data/test/command/suite/groonga/delete/no-identifier.test +15 -0
  189. data/test/command/suite/groonga/delete/success.expected +19 -0
  190. data/test/command/suite/groonga/delete/success.test +19 -0
  191. data/test/command/suite/groonga/delete/unknown-table.expected +14 -0
  192. data/test/command/suite/groonga/delete/unknown-table.test +7 -0
  193. data/test/command/suite/groonga/select/minimum.expected +22 -0
  194. data/test/command/suite/groonga/select/minimum.test +8 -0
  195. data/test/command/suite/groonga/table_create/array.expected +14 -0
  196. data/test/command/suite/groonga/table_create/array.test +8 -0
  197. data/test/command/suite/groonga/table_create/hash.expected +13 -0
  198. data/test/command/suite/groonga/table_create/hash.test +8 -0
  199. data/test/command/suite/groonga/table_list/success.expected +71 -0
  200. data/test/command/suite/groonga/table_list/success.test +15 -0
  201. data/test/command/suite/groonga/table_remove/success.expected +13 -0
  202. data/test/command/suite/groonga/table_remove/success.test +8 -0
  203. data/test/command/suite/groonga/table_remove/unknown-table.expected +14 -0
  204. data/test/command/suite/groonga/table_remove/unknown-table.test +7 -0
  205. data/test/command/suite/message/error/missing-dataset.expected +9 -0
  206. data/test/command/suite/message/error/missing-dataset.test +5 -0
  207. data/test/command/suite/message/error/unknown-dataset.expected +9 -0
  208. data/test/command/suite/message/error/unknown-dataset.test +6 -0
  209. data/test/command/suite/message/error/unknown-type.expected +9 -0
  210. data/test/command/suite/message/error/unknown-type.test +6 -0
  211. data/test/command/suite/search/adjusters/multiple.catalog.json +38 -0
  212. data/test/command/suite/search/adjusters/multiple.expected +19 -0
  213. data/test/command/suite/search/adjusters/multiple.test +75 -0
  214. data/test/command/suite/search/adjusters/one.catalog.json +38 -0
  215. data/test/command/suite/search/adjusters/one.expected +19 -0
  216. data/test/command/suite/search/adjusters/one.test +66 -0
  217. data/test/command/suite/search/attributes/array.expected +21 -0
  218. data/test/command/suite/search/attributes/array.test +28 -0
  219. data/test/command/suite/search/attributes/hash.expected +30 -0
  220. data/test/command/suite/search/attributes/hash.test +36 -0
  221. data/test/command/suite/search/complex.expected +48 -0
  222. data/test/command/suite/search/complex.test +23 -0
  223. data/test/command/suite/search/condition/nested.expected +15 -0
  224. data/test/command/suite/search/condition/nested.test +27 -0
  225. data/test/command/suite/search/condition/query/nonexistent_column.catalog.json +37 -0
  226. data/test/command/suite/search/condition/query/nonexistent_column.expected +48 -0
  227. data/test/command/suite/search/condition/query/nonexistent_column.test +33 -0
  228. data/test/command/suite/search/condition/query/syntax_error.catalog.json +36 -0
  229. data/test/command/suite/search/condition/query/syntax_error.expected +48 -0
  230. data/test/command/suite/search/condition/query/syntax_error.test +33 -0
  231. data/test/command/suite/search/condition/query.expected +24 -0
  232. data/test/command/suite/search/condition/query.test +23 -0
  233. data/test/command/suite/search/condition/script.expected +24 -0
  234. data/test/command/suite/search/condition/script.test +26 -0
  235. data/test/command/suite/search/error/cyclic-source.expected +14 -0
  236. data/test/command/suite/search/error/cyclic-source.test +12 -0
  237. data/test/command/suite/search/error/deeply-cyclic-source.expected +17 -0
  238. data/test/command/suite/search/error/deeply-cyclic-source.test +15 -0
  239. data/test/command/suite/search/error/missing-source-parameter.expected +13 -0
  240. data/test/command/suite/search/error/missing-source-parameter.test +11 -0
  241. data/test/command/suite/search/error/no-query.expected +9 -0
  242. data/test/command/suite/search/error/no-query.test +7 -0
  243. data/test/command/suite/search/error/unknown-source.expected +52 -0
  244. data/test/command/suite/search/error/unknown-source.test +12 -0
  245. data/test/command/suite/search/group/count.expected +10 -0
  246. data/test/command/suite/search/group/count.test +18 -0
  247. data/test/command/suite/search/group/limit.expected +15 -0
  248. data/test/command/suite/search/group/limit.test +20 -0
  249. data/test/command/suite/search/group/string.expected +32 -0
  250. data/test/command/suite/search/group/string.test +40 -0
  251. data/test/command/suite/search/group/subrecord/with-sort.catalog.json +33 -0
  252. data/test/command/suite/search/group/subrecord/with-sort.expected +30 -0
  253. data/test/command/suite/search/group/subrecord/with-sort.test +81 -0
  254. data/test/command/suite/search/multiple/chained.expected +41 -0
  255. data/test/command/suite/search/multiple/chained.test +39 -0
  256. data/test/command/suite/search/multiple/parallel.expected +35 -0
  257. data/test/command/suite/search/multiple/parallel.test +35 -0
  258. data/test/command/suite/search/output/attributes/invalid.catalog.json +13 -0
  259. data/test/command/suite/search/output/attributes/invalid.expected +44 -0
  260. data/test/command/suite/search/output/attributes/invalid.test +28 -0
  261. data/test/command/suite/search/range/only-output.expected +24 -0
  262. data/test/command/suite/search/range/only-output.test +23 -0
  263. data/test/command/suite/search/range/only-sort.expected +24 -0
  264. data/test/command/suite/search/range/only-sort.test +26 -0
  265. data/test/command/suite/search/range/sort-and-output.expected +21 -0
  266. data/test/command/suite/search/range/sort-and-output.test +27 -0
  267. data/test/command/suite/search/range/too-large-output-offset.expected +12 -0
  268. data/test/command/suite/search/range/too-large-output-offset.test +23 -0
  269. data/test/command/suite/search/range/too-large-sort-offset.expected +12 -0
  270. data/test/command/suite/search/range/too-large-sort-offset.test +26 -0
  271. data/test/command/suite/search/response/elapsed_time.catalog.json +13 -0
  272. data/test/command/suite/search/response/elapsed_time.expected +11 -0
  273. data/test/command/suite/search/response/elapsed_time.test +26 -0
  274. data/test/command/suite/search/response/records/value/time.expected +20 -0
  275. data/test/command/suite/search/response/records/value/time.test +22 -0
  276. data/test/command/suite/search/simple.expected +48 -0
  277. data/test/command/suite/search/simple.test +22 -0
  278. data/test/command/suite/search/sort/default-offset-limit.expected +39 -0
  279. data/test/command/suite/search/sort/default-offset-limit.test +24 -0
  280. data/test/command/suite/search/sort/invisible-column.expected +24 -0
  281. data/test/command/suite/search/sort/invisible-column.test +26 -0
  282. data/test/command/suite/watch/subscribe.expected +6 -0
  283. data/test/command/suite/watch/subscribe.test +9 -0
  284. data/test/command/suite/watch/unsubscribe.expected +6 -0
  285. data/test/command/suite/watch/unsubscribe.test +9 -0
  286. data/test/performance/run-test.rb +56 -0
  287. data/test/performance/watch/catalog.json +33 -0
  288. data/test/performance/watch/feed.json +9 -0
  289. data/test/performance/watch/fluentd.conf +11 -0
  290. data/test/performance/watch/subscribe.json +3 -0
  291. data/test/unit/catalog/test_collection_volume.rb +103 -0
  292. data/test/unit/catalog/test_dataset.rb +104 -0
  293. data/test/unit/catalog/test_schema.rb +226 -0
  294. data/test/unit/catalog/test_single_volume.rb +31 -0
  295. data/test/unit/catalog/test_slice.rb +92 -0
  296. data/test/unit/catalog/test_version1.rb +361 -0
  297. data/test/unit/catalog/test_version2.rb +124 -0
  298. data/test/unit/catalog/test_version2_validator.rb +66 -0
  299. data/test/unit/catalog/test_volume_collection.rb +50 -0
  300. data/test/unit/fixtures/array.grn +18 -0
  301. data/test/unit/fixtures/catalog/version1.json +40 -0
  302. data/test/unit/fixtures/catalog/version2.json +62 -0
  303. data/test/unit/fixtures/document.grn +34 -0
  304. data/test/unit/fixtures/reference/array.grn +11 -0
  305. data/test/unit/fixtures/reference/hash.grn +7 -0
  306. data/test/unit/helper/distributed_search_planner_helper.rb +83 -0
  307. data/test/unit/helper/fixture.rb +28 -0
  308. data/test/unit/helper/plugin_helper.rb +38 -0
  309. data/test/unit/helper/sandbox.rb +86 -0
  310. data/test/unit/helper/stub_worker.rb +27 -0
  311. data/test/unit/helper/watch_helper.rb +23 -0
  312. data/test/unit/helper.rb +28 -0
  313. data/test/unit/plugins/crud/test_add.rb +190 -0
  314. data/test/unit/plugins/groonga/select/test_adapter_input.rb +510 -0
  315. data/test/unit/plugins/groonga/select/test_adapter_output.rb +201 -0
  316. data/test/unit/plugins/groonga/test_column_create.rb +171 -0
  317. data/test/unit/plugins/groonga/test_column_list.rb +170 -0
  318. data/test/unit/plugins/groonga/test_column_remove.rb +98 -0
  319. data/test/unit/plugins/groonga/test_column_rename.rb +105 -0
  320. data/test/unit/plugins/groonga/test_delete.rb +127 -0
  321. data/test/unit/plugins/groonga/test_table_create.rb +147 -0
  322. data/test/unit/plugins/groonga/test_table_list.rb +184 -0
  323. data/test/unit/plugins/groonga/test_table_remove.rb +61 -0
  324. data/test/unit/plugins/search/planner/test_basic.rb +120 -0
  325. data/test/unit/plugins/search/planner/test_group_by.rb +573 -0
  326. data/test/unit/plugins/search/planner/test_output.rb +388 -0
  327. data/test/unit/plugins/search/planner/test_sort_by.rb +938 -0
  328. data/test/unit/plugins/search/test_collector.rb +806 -0
  329. data/test/unit/plugins/search/test_handler.rb +930 -0
  330. data/test/unit/plugins/search/test_planner.rb +174 -0
  331. data/test/unit/plugins/test_basic.rb +510 -0
  332. data/test/unit/plugins/test_groonga.rb +70 -0
  333. data/test/unit/plugins/test_watch.rb +211 -0
  334. data/test/unit/run-test.rb +56 -0
  335. data/test/unit/test_catalog_generator.rb +93 -0
  336. data/test/unit/test_message_matcher.rb +160 -0
  337. data/test/unit/test_schema_applier.rb +59 -0
  338. data/test/unit/test_sweeper.rb +95 -0
  339. data/test/unit/test_watch_schema.rb +57 -0
  340. data/test/unit/test_watcher.rb +336 -0
  341. metadata +759 -0
@@ -0,0 +1,201 @@
1
+ # Copyright (C) 2013-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/plugins/groonga/select"
17
+
18
+ class GroongaSelectAdapterOutputTest < Test::Unit::TestCase
19
+ private
20
+ def convert(search_response)
21
+ converter = Droonga::Plugins::Groonga::Select::ResponseConverter.new
22
+ converter.convert(search_response)
23
+ end
24
+
25
+ class RecordsTest < self
26
+ def test_empty
27
+ start_time = "2001-08-02T10:45:23.5+09:00"
28
+ elapsed_time = 0
29
+ count = 0
30
+
31
+ search_response = {
32
+ "EmptyTable" => {
33
+ "startTime" => start_time,
34
+ "elapsedTime" => elapsed_time,
35
+ "count" => count,
36
+ "attributes" => [
37
+ {"name" => "_id", "type" => "UInt32", "vector" => false},
38
+ ],
39
+ "records" => [],
40
+ },
41
+ }
42
+
43
+ status_code = 0
44
+ start_time_in_unix_time = Time.parse(start_time).to_f
45
+ headers = [["_id","UInt32"]]
46
+ expected_select_response = [
47
+ [status_code, start_time_in_unix_time, elapsed_time],
48
+ [
49
+ [[count], headers],
50
+ ],
51
+ ]
52
+
53
+ assert_equal(expected_select_response, convert(search_response))
54
+ end
55
+ end
56
+
57
+ class DrilldownTest < self
58
+ START_TIME = "2001-08-02T10:45:23.5+09:00"
59
+ ELAPSED_TIME = 0
60
+ COUNT = 0
61
+
62
+ def main_search_result
63
+ {
64
+ "startTime" => START_TIME,
65
+ "elapsedTime" => ELAPSED_TIME,
66
+ "count" => COUNT,
67
+ "attributes" => [
68
+ {"name" => "_id", "type" => "UInt32", "vector" => false},
69
+ ],
70
+ "records" => [],
71
+ }
72
+ end
73
+
74
+ def expected_header
75
+ status_code = 0
76
+ start_time_in_unix_time = Time.parse(START_TIME).to_f
77
+ [status_code, start_time_in_unix_time, ELAPSED_TIME]
78
+ end
79
+
80
+ def expected_main_select_result
81
+ headers = [["_id","UInt32"]]
82
+ [[COUNT], headers]
83
+ end
84
+
85
+ def test_no_drilldown
86
+ search_response = {
87
+ "EmptyTable" => main_search_result,
88
+ }
89
+
90
+ expected_select_response = [
91
+ expected_header,
92
+ [
93
+ expected_main_select_result,
94
+ ],
95
+ ]
96
+
97
+ assert_equal(expected_select_response, convert(search_response))
98
+ end
99
+
100
+ def test_have_one_result
101
+ search_response = {
102
+ "EmptyTable" => main_search_result,
103
+ "drilldown_result_a" => {
104
+ "count" => 3,
105
+ "attributes" => [
106
+ {"name" => "_id", "type" => "UInt32", "vector" => false},
107
+ {"name" => "_key", "type" => "ShortText", "vector" => false},
108
+ {"name" => "_nsubrecs", "type" => "UInt32", "vector" => false},
109
+ ],
110
+ "records" => [
111
+ [1, "a1", 10],
112
+ [2, "a2", 20],
113
+ [3, "a3", 30],
114
+ ],
115
+ },
116
+ }
117
+
118
+ headers = [
119
+ ["_id", "UInt32"],
120
+ ["_key", "ShortText"],
121
+ ["_nsubrecs", "UInt32"],
122
+ ]
123
+ expected_select_response = [
124
+ expected_header,
125
+ [
126
+ expected_main_select_result,
127
+ [
128
+ [3],
129
+ headers,
130
+ [
131
+ [1, "a1", 10],
132
+ [2, "a2", 20],
133
+ [3, "a3", 30],
134
+ ],
135
+ ],
136
+ ],
137
+ ]
138
+
139
+ assert_equal(expected_select_response, convert(search_response))
140
+ end
141
+
142
+ def test_have_multiple_results
143
+ search_response = {
144
+ "EmptyTable" => main_search_result,
145
+ "drilldown_result_a" => {
146
+ "count" => 3,
147
+ "attributes" => [
148
+ {"name" => "_key", "type" => "ShortText", "vector" => false},
149
+ {"name" => "_nsubrecs", "type" => "UInt32", "vector" => false},
150
+ ],
151
+ "records" => [
152
+ ["a1", 10],
153
+ ["a2", 20],
154
+ ["a3", 30],
155
+ ],
156
+ },
157
+ "drilldown_result_b" => {
158
+ "count" => 2,
159
+ "attributes" => [
160
+ {"name" => "_key", "type" => "ShortText", "vector" => false},
161
+ {"name" => "_nsubrecs", "type" => "UInt32", "vector" => false},
162
+ ],
163
+ "records" => [
164
+ ["b1", 10],
165
+ ["b2", 20],
166
+ ],
167
+ },
168
+ }
169
+
170
+ headers = [
171
+ ["_key", "ShortText"],
172
+ ["_nsubrecs", "UInt32"],
173
+ ]
174
+ expected_select_response = [
175
+ expected_header,
176
+ [
177
+ expected_main_select_result,
178
+ [
179
+ [3],
180
+ headers,
181
+ [
182
+ ["a1", 10],
183
+ ["a2", 20],
184
+ ["a3", 30],
185
+ ],
186
+ ],
187
+ [
188
+ [2],
189
+ headers,
190
+ [
191
+ ["b1", 10],
192
+ ["b2", 20],
193
+ ],
194
+ ],
195
+ ],
196
+ ]
197
+
198
+ assert_equal(expected_select_response, convert(search_response))
199
+ end
200
+ end
201
+ end
@@ -0,0 +1,171 @@
1
+ # Copyright (C) 2013-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
+ class ColumnCreateTest < GroongaHandlerTest
17
+ def create_handler
18
+ Droonga::Plugins::Groonga::ColumnCreate::Handler.new("droonga",
19
+ @handler.context,
20
+ @messenger,
21
+ @loop)
22
+ end
23
+
24
+ def test_success
25
+ Groonga::Schema.define do |schema|
26
+ schema.create_table("Books", :type => :hash)
27
+ end
28
+ message = {
29
+ "table" => "Books",
30
+ "name" => "title",
31
+ "type" => "ShortText",
32
+ }
33
+ response = process(:column_create, message)
34
+ assert_equal(
35
+ [NORMALIZED_HEADER_SUCCESS, true],
36
+ [normalize_header(response.first), response.last]
37
+ )
38
+ end
39
+
40
+ def test_unknown_table
41
+ message = {
42
+ "table" => "Unknown",
43
+ "name" => "title",
44
+ "type" => "ShortText",
45
+ }
46
+ response = process(:column_create, message)
47
+ assert_equal(
48
+ [NORMALIZED_HEADER_INVALID_ARGUMENT, false],
49
+ [normalize_header(response.first), response.last]
50
+ )
51
+ end
52
+
53
+ def test_name
54
+ Groonga::Schema.define do |schema|
55
+ schema.create_table("Books", :type => :hash)
56
+ end
57
+ process(:column_create,
58
+ {"table" => "Books", "name" => "title", "type" => "ShortText"})
59
+ assert_equal(<<-SCHEMA, dump)
60
+ table_create Books TABLE_HASH_KEY --key_type ShortText
61
+ column_create Books title COLUMN_SCALAR ShortText
62
+ SCHEMA
63
+ end
64
+
65
+ def test_type
66
+ Groonga::Schema.define do |schema|
67
+ schema.create_table("Books", :type => :hash)
68
+ end
69
+ process(:column_create,
70
+ {"table" => "Books", "name" => "main_text", "type" => "LongText"})
71
+ assert_equal(<<-SCHEMA, dump)
72
+ table_create Books TABLE_HASH_KEY --key_type ShortText
73
+ column_create Books main_text COLUMN_SCALAR LongText
74
+ SCHEMA
75
+ end
76
+
77
+ class FlagsTest < self
78
+ class DataStoreTest < self
79
+ data({
80
+ "COLUMN_SCALAR" => {
81
+ :flags => "COLUMN_SCALAR",
82
+ },
83
+ "COLUMN_VECTOR" => {
84
+ :flags => "COLUMN_VECTOR",
85
+ },
86
+ "COLUMN_VECTOR|WITH_WEIGHT" => {
87
+ :flags => "COLUMN_VECTOR|WITH_WEIGHT",
88
+ },
89
+ })
90
+ def test_data_store_column_type(data)
91
+ request = {
92
+ "table" => "Books",
93
+ "name" => "title",
94
+ "type" => "ShortText",
95
+ "flags" => data[:flags],
96
+ }
97
+ Groonga::Schema.define do |schema|
98
+ schema.create_table("Books", :type => :hash)
99
+ end
100
+ process(:column_create, request)
101
+ assert_equal(<<-EXPECTED, dump)
102
+ table_create Books TABLE_HASH_KEY --key_type ShortText
103
+ column_create Books title #{data[:flags]} ShortText
104
+ EXPECTED
105
+ end
106
+ end
107
+
108
+ class IndexTest < self
109
+ def setup
110
+ super
111
+ Groonga::Schema.define do |schema|
112
+ schema.create_table("Books", :type => :hash)
113
+ end
114
+ process(:column_create,
115
+ {"table" => "Books", "name" => "title", "type" => "ShortText"})
116
+ end
117
+
118
+ def test_index_column_type
119
+ data = {
120
+ :flags => "COLUMN_INDEX",
121
+ }
122
+ request = {
123
+ "table" => "Books",
124
+ "name" => "entry_title",
125
+ "type" => "Books",
126
+ "source" => "title",
127
+ "flags" => data[:flags],
128
+ }
129
+ process(:column_create, request)
130
+ assert_equal(<<-EXPECTED, dump)
131
+ table_create Books TABLE_HASH_KEY --key_type ShortText
132
+ column_create Books title COLUMN_SCALAR ShortText
133
+
134
+ column_create Books entry_title #{data[:flags]} Books title
135
+ EXPECTED
136
+ end
137
+
138
+ data({
139
+ "WITH_SECTION" => {
140
+ :flags => "WITH_SECTION",
141
+ },
142
+ "WITH_WEIGHT" => {
143
+ :flags => "WITH_WEIGHT",
144
+ },
145
+ "WITH_POSITION" => {
146
+ :flags => "WITH_POSITION",
147
+ },
148
+ "COLUMN_INDEX with all" => {
149
+ :flags => "WITH_SECTION|WITH_WEIGHT|WITH_POSITION",
150
+ },
151
+ })
152
+ def test_index_flags(data)
153
+ flags = "COLUMN_INDEX|#{data[:flags]}"
154
+ request = {
155
+ "table" => "Books",
156
+ "name" => "entry_title",
157
+ "type" => "Books",
158
+ "source" => "title",
159
+ "flags" => flags,
160
+ }
161
+ process(:column_create, request)
162
+ assert_equal(<<-EXPECTED, dump)
163
+ table_create Books TABLE_HASH_KEY --key_type ShortText
164
+ column_create Books title COLUMN_SCALAR ShortText
165
+
166
+ column_create Books entry_title #{flags} Books title
167
+ EXPECTED
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,170 @@
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
+ class ColumnListTest < GroongaHandlerTest
17
+ COLUMNS_HEADER = [
18
+ ["id", "UInt32"],
19
+ ["name", "ShortText"],
20
+ ["path", "ShortText"],
21
+ ["type", "ShortText"],
22
+ ["flags", "ShortText"],
23
+ ["domain", "ShortText"],
24
+ ["range", "ShortText"],
25
+ ["source", "ShortText"],
26
+ ]
27
+
28
+ def create_handler
29
+ Droonga::Plugins::Groonga::ColumnList::Handler.new("droonga",
30
+ @handler.context,
31
+ @messenger,
32
+ @loop)
33
+ end
34
+
35
+ class HeaderTest < self
36
+ def test_success
37
+ Groonga::Schema.define do |schema|
38
+ schema.create_table("Books", :type => :hash)
39
+ schema.change_table("Books") do |table|
40
+ table.column("title", "ShortText", :type => :scalar)
41
+ end
42
+ end
43
+ message = {
44
+ "table" => "Books",
45
+ "name" => "title",
46
+ }
47
+ response = process(:column_list, message)
48
+ assert_equal(
49
+ NORMALIZED_HEADER_SUCCESS,
50
+ normalize_header(response.first)
51
+ )
52
+ end
53
+
54
+ def test_unknown_table
55
+ message = {
56
+ "table" => "Unknown",
57
+ "name" => "title",
58
+ "type" => "ShortText",
59
+ }
60
+ response = process(:column_list, message)
61
+ assert_equal(
62
+ NORMALIZED_HEADER_INVALID_ARGUMENT,
63
+ normalize_header(response.first)
64
+ )
65
+ end
66
+ end
67
+
68
+ class BodyTest < self
69
+ def test_fix
70
+ Groonga::Schema.define do |schema|
71
+ schema.create_table("Books", :type => :hash)
72
+ schema.change_table("Books") do |table|
73
+ table.column("age", "UInt32", :type => :scalar)
74
+ end
75
+ end
76
+ response = process(:column_list,
77
+ {"table" => "Books"})
78
+ expected = [
79
+ COLUMNS_HEADER,
80
+ [257,
81
+ "age",
82
+ @database_path.to_s + ".0000101",
83
+ "fix",
84
+ "COLUMN_SCALAR",
85
+ "Books",
86
+ "UInt32",
87
+ []],
88
+ ]
89
+ assert_equal(expected, response.last)
90
+ end
91
+
92
+ def test_var
93
+ Groonga::Schema.define do |schema|
94
+ schema.create_table("Books", :type => :hash)
95
+ schema.change_table("Books") do |table|
96
+ table.column("title", "ShortText", :type => :scalar)
97
+ end
98
+ end
99
+ response = process(:column_list,
100
+ {"table" => "Books"})
101
+ expected = [
102
+ COLUMNS_HEADER,
103
+ [257,
104
+ "title",
105
+ @database_path.to_s + ".0000101",
106
+ "var",
107
+ "COLUMN_SCALAR",
108
+ "Books",
109
+ "ShortText",
110
+ []],
111
+ ]
112
+ assert_equal(expected, response.last)
113
+ end
114
+
115
+ def test_vector
116
+ Groonga::Schema.define do |schema|
117
+ schema.create_table("Books", :type => :hash)
118
+ schema.change_table("Books") do |table|
119
+ table.column("authors", "ShortText", :type => :vector)
120
+ end
121
+ end
122
+ response = process(:column_list,
123
+ {"table" => "Books"})
124
+ expected = [
125
+ COLUMNS_HEADER,
126
+ [257,
127
+ "authors",
128
+ @database_path.to_s + ".0000101",
129
+ "var",
130
+ "COLUMN_VECTOR",
131
+ "Books",
132
+ "ShortText",
133
+ []],
134
+ ]
135
+ assert_equal(expected, response.last)
136
+ end
137
+
138
+ def test_index
139
+ Groonga::Schema.define do |schema|
140
+ schema.create_table("Books", :type => :hash)
141
+ schema.change_table("Books") do |table|
142
+ table.column("title", "ShortText", :type => :scalar)
143
+ table.index("Books", "title", :name => "entry_title")
144
+ end
145
+ end
146
+ response = process(:column_list,
147
+ {"table" => "Books"})
148
+ expected = [
149
+ COLUMNS_HEADER,
150
+ [258,
151
+ "entry_title",
152
+ @database_path.to_s + ".0000102",
153
+ "index",
154
+ "COLUMN_INDEX",
155
+ "Books",
156
+ "Books",
157
+ ["title"]],
158
+ [257,
159
+ "title",
160
+ @database_path.to_s + ".0000101",
161
+ "var",
162
+ "COLUMN_SCALAR",
163
+ "Books",
164
+ "ShortText",
165
+ []],
166
+ ]
167
+ assert_equal(expected, response.last)
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,98 @@
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
+ class ColumnRemoveTest < GroongaHandlerTest
17
+ def create_handler
18
+ Droonga::Plugins::Groonga::ColumnRemove::Handler.new("droonga",
19
+ @handler.context,
20
+ @messenger,
21
+ @loop)
22
+ end
23
+
24
+ def test_success
25
+ Groonga::Schema.define do |schema|
26
+ schema.create_table("Books", :type => :hash)
27
+ schema.change_table("Books") do |table|
28
+ table.column("title", "ShortText", :type => :scalar)
29
+ end
30
+ end
31
+ message = {
32
+ "table" => "Books",
33
+ "name" => "title",
34
+ }
35
+ response = process(:column_remove, message)
36
+ assert_equal(
37
+ [NORMALIZED_HEADER_SUCCESS, true],
38
+ [normalize_header(response.first), response.last]
39
+ )
40
+ end
41
+
42
+ def test_unknown_table
43
+ message = {
44
+ "table" => "Unknown",
45
+ "name" => "title",
46
+ "type" => "ShortText",
47
+ }
48
+ response = process(:column_remove, message)
49
+ assert_equal(
50
+ [NORMALIZED_HEADER_INVALID_ARGUMENT, false],
51
+ [normalize_header(response.first), response.last]
52
+ )
53
+ end
54
+
55
+ def test_unknown_column
56
+ Groonga::Schema.define do |schema|
57
+ schema.create_table("Books", :type => :hash)
58
+ end
59
+ message = {
60
+ "table" => "Books",
61
+ "name" => "title",
62
+ }
63
+ response = process(:column_remove, message)
64
+ assert_equal(
65
+ [NORMALIZED_HEADER_INVALID_ARGUMENT, false],
66
+ [normalize_header(response.first), response.last]
67
+ )
68
+ end
69
+
70
+ def test_remove
71
+ Groonga::Schema.define do |schema|
72
+ schema.create_table("Books", :type => :hash)
73
+ schema.change_table("Books") do |table|
74
+ table.column("title", "ShortText", :type => :scalar)
75
+ end
76
+ end
77
+ process(:column_remove,
78
+ {"table" => "Books", "name" => "title"})
79
+ assert_equal(<<-SCHEMA, dump)
80
+ table_create Books TABLE_HASH_KEY --key_type ShortText
81
+ SCHEMA
82
+ end
83
+
84
+ def test_remove_index
85
+ Groonga::Schema.define do |schema|
86
+ schema.create_table("Books", :type => :hash)
87
+ schema.change_table("Books") do |table|
88
+ table.column("title", "ShortText", :type => :scalar)
89
+ table.index("Books", "title", :name => "entry_title")
90
+ end
91
+ end
92
+ process(:column_remove,
93
+ {"table" => "Books", "name" => "title"})
94
+ assert_equal(<<-SCHEMA, dump)
95
+ table_create Books TABLE_HASH_KEY --key_type ShortText
96
+ SCHEMA
97
+ end
98
+ end