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,236 @@
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/plugin"
17
+
18
+ module Droonga
19
+ module Plugins
20
+ module Groonga
21
+ module Select
22
+ DRILLDOWN_RESULT_PREFIX = "drilldown_result_"
23
+
24
+ class RequestConverter
25
+ def convert(select_request)
26
+ @table = select_request["table"]
27
+ @result_name = @table + "_result"
28
+
29
+ output_columns = select_request["output_columns"] || ""
30
+ attributes = output_columns.split(/, */)
31
+ offset = (select_request["offset"] || "0").to_i
32
+ limit = (select_request["limit"] || "10").to_i
33
+
34
+ output_offset = offset
35
+ output_limit = limit
36
+
37
+ sort_by = nil
38
+ sort_keys = (select_request["sortby"] || "").split(",")
39
+ unless sort_keys.empty?
40
+ sort_by = {
41
+ "keys" => sort_keys,
42
+ "offset" => offset,
43
+ "limit" => limit,
44
+ }
45
+ output_offset = 0
46
+ end
47
+
48
+ search_request = {
49
+ "queries" => {
50
+ @result_name => {
51
+ "source" => @table,
52
+ "output" => {
53
+ "elements" => [
54
+ "startTime",
55
+ "elapsedTime",
56
+ "count",
57
+ "attributes",
58
+ "records",
59
+ ],
60
+ "attributes" => attributes,
61
+ "offset" => output_offset,
62
+ "limit" => output_limit,
63
+ },
64
+ }
65
+ }
66
+ }
67
+ if sort_by
68
+ search_request["queries"][@result_name]["sortBy"] = sort_by
69
+ end
70
+
71
+ condition = convert_condition(select_request)
72
+ if condition
73
+ search_request["queries"][@result_name]["condition"] = condition
74
+ end
75
+
76
+ drilldown_queries = convert_drilldown(select_request)
77
+ if drilldown_queries
78
+ search_request["queries"].merge!(drilldown_queries)
79
+ end
80
+
81
+ search_request
82
+ end
83
+
84
+ def convert_condition(select_request)
85
+ match_columns = select_request["match_columns"]
86
+ match_to = match_columns ? match_columns.split(/ *\|\| */) : []
87
+ query = select_request["query"]
88
+ filter = select_request["filter"]
89
+
90
+ conditions = []
91
+ if query
92
+ conditions << {
93
+ "query" => query,
94
+ "matchTo"=> match_to,
95
+ "defaultOperator"=> "&&",
96
+ "allowPragma"=> false,
97
+ "allowColumn"=> true,
98
+ }
99
+ end
100
+
101
+ if filter
102
+ conditions << filter
103
+ end
104
+
105
+ condition = nil
106
+
107
+ case conditions.size
108
+ when 1
109
+ condition = conditions.first
110
+ when 2
111
+ condition = ["&&"] + conditions
112
+ end
113
+
114
+ condition
115
+ end
116
+
117
+ def convert_drilldown(select_request)
118
+ drilldown_keys = select_request["drilldown"]
119
+ return nil if drilldown_keys.nil? or drilldown_keys.empty?
120
+
121
+ drilldown_keys = drilldown_keys.split(",")
122
+
123
+ sort_keys = (select_request["drilldown_sortby"] || "").split(",")
124
+ columns = (select_request["drilldown_output_columns"] || "").split(",")
125
+ offset = (select_request["drilldown_offset"] || "0").to_i
126
+ limit = (select_request["drilldown_limit"] || "10").to_i
127
+
128
+ queries = {}
129
+ drilldown_keys.each_with_index do |key, index|
130
+ query = {
131
+ "source" => @result_name,
132
+ "groupBy" => key,
133
+ "output" => {
134
+ "elements" => [
135
+ "count",
136
+ "attributes",
137
+ "records",
138
+ ],
139
+ "attributes" => columns,
140
+ "limit" => limit,
141
+ },
142
+ }
143
+
144
+ if sort_keys.empty?
145
+ query["output"]["offset"] = offset
146
+ else
147
+ query["sortBy"] = {
148
+ "keys" => sort_keys,
149
+ "offset" => offset,
150
+ "limit" => limit,
151
+ }
152
+ end
153
+
154
+ queries["#{DRILLDOWN_RESULT_PREFIX}#{key}"] = query
155
+ end
156
+ queries
157
+ end
158
+ end
159
+
160
+ class ResponseConverter
161
+ def convert(search_response)
162
+ @drilldown_results = []
163
+ search_response.each do |key, value|
164
+ if key.start_with?(DRILLDOWN_RESULT_PREFIX)
165
+ key = key[DRILLDOWN_RESULT_PREFIX.size..-1]
166
+ convert_drilldown_result(key, value)
167
+ else
168
+ convert_main_result(value)
169
+ end
170
+ end
171
+
172
+ select_results = [@body] + @drilldown_results
173
+ [@header, select_results]
174
+ end
175
+
176
+ private
177
+ def convert_main_result(result)
178
+ status_code = 0
179
+ start_time = result["startTime"]
180
+ start_time_in_unix_time = if start_time
181
+ Time.parse(start_time).to_f
182
+ else
183
+ Time.now.to_f
184
+ end
185
+ elapsed_time = result["elapsedTime"] || 0
186
+ @header = [status_code, start_time_in_unix_time, elapsed_time]
187
+ @body = convert_search_result(result)
188
+ end
189
+
190
+ def convert_drilldown_result(key, result)
191
+ @drilldown_results << convert_search_result(result)
192
+ end
193
+
194
+ def convert_search_result(result)
195
+ count = result["count"]
196
+ attributes = convert_attributes(result["attributes"])
197
+ records = result["records"]
198
+ if records.nil? or records.empty?
199
+ [[count], attributes]
200
+ else
201
+ [[count], attributes, records]
202
+ end
203
+ end
204
+
205
+ def convert_attributes(attributes)
206
+ attributes = attributes || []
207
+ attributes.collect do |attribute|
208
+ name = attribute["name"]
209
+ type = attribute["type"]
210
+ [name, type]
211
+ end
212
+ end
213
+ end
214
+
215
+ class Adapter < Droonga::Adapter
216
+ input_message.pattern = ["type", :equal, "select"]
217
+
218
+ def adapt_input(input_message)
219
+ converter = RequestConverter.new
220
+ select_request = input_message.body
221
+ search_request = converter.convert(select_request)
222
+ input_message.type = "search"
223
+ input_message.body = search_request
224
+ end
225
+
226
+ def adapt_output(output_message)
227
+ converter = ResponseConverter.new
228
+ search_response = output_message.body
229
+ select_response = converter.convert(search_response)
230
+ output_message.body = select_response
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,111 @@
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 "groonga/command/table-create"
17
+
18
+ require "droonga/plugin"
19
+ require "droonga/plugins/groonga/generic_command"
20
+
21
+ module Droonga
22
+ module Plugins
23
+ module Groonga
24
+ module TableCreate
25
+ class Command < GenericCommand
26
+ def process_request(request)
27
+ command_class = ::Groonga::Command.find("table_create")
28
+ @command = command_class.new("table_create", request)
29
+
30
+ name = @command["name"]
31
+ unless name
32
+ message = "Should not create anonymous table"
33
+ raise CommandError.new(:status => Status::INVALID_ARGUMENT,
34
+ :message => message,
35
+ :result => false)
36
+ end
37
+
38
+ options = parse_command
39
+ ::Groonga::Schema.define(:context => @context) do |schema|
40
+ schema.create_table(name, options)
41
+ end
42
+ true
43
+ end
44
+
45
+ private
46
+ def parse_command
47
+ options = {}
48
+ parse_flags(options)
49
+ parse_key_type(options)
50
+ parse_value_type(options)
51
+ parse_default_tokenizer(options)
52
+ parse_normalizer(options)
53
+ options
54
+ end
55
+
56
+ def parse_flags(options)
57
+ options[:type] = :hash
58
+ if @command.table_no_key?
59
+ options[:type] = :array
60
+ elsif @command.table_hash_key?
61
+ options[:type] = :hash
62
+ elsif @command.table_pat_key?
63
+ options[:type] = :patricia_trie
64
+ elsif @command.table_dat_key?
65
+ options[:type] = :double_array_trie
66
+ end
67
+ if @command.key_with_sis? and @command.table_pat_key?
68
+ options[:key_with_sis] = true
69
+ end
70
+ end
71
+
72
+ def parse_key_type(options)
73
+ return unless @command["key_type"]
74
+ options[:key_type] = @command["key_type"]
75
+ end
76
+
77
+ def parse_value_type(options)
78
+ return unless @command["value_type"]
79
+ options[:value_type] = @command["value_type"]
80
+ end
81
+
82
+ def parse_default_tokenizer(options)
83
+ return unless @command["default_tokenizer"]
84
+ options[:default_tokenizer] = @command["default_tokenizer"]
85
+ end
86
+
87
+ def parse_normalizer(options)
88
+ return unless @command["normalizer"]
89
+ options[:normalizer] = @command["normalizer"]
90
+ end
91
+ end
92
+
93
+ class Handler < Droonga::Handler
94
+ action.synchronous = true
95
+
96
+ def handle(message)
97
+ command = Command.new(@context)
98
+ command.execute(message.request)
99
+ end
100
+ end
101
+
102
+ Groonga.define_single_step do |step|
103
+ step.name = "table_create"
104
+ step.write = true
105
+ step.handler = Handler
106
+ step.collector = Collectors::Or
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,120 @@
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"
17
+ require "droonga/plugins/groonga/generic_command"
18
+
19
+ module Droonga
20
+ module Plugins
21
+ module Groonga
22
+ module TableList
23
+ HEADER = [
24
+ ["id", "UInt32"],
25
+ ["name", "ShortText"],
26
+ ["path", "ShortText"],
27
+ ["flags", "ShortText"],
28
+ ["domain", "ShortText"],
29
+ ["range", "ShortText"],
30
+ ["default_tokenizer", "ShortText"],
31
+ ["normalizer", "ShortText"],
32
+ ].freeze
33
+
34
+ class Command < GenericCommand
35
+ def process_request(request)
36
+ [HEADER, *list_tables]
37
+ end
38
+
39
+ private
40
+ def list_tables
41
+ @context.database.tables.collect do |table|
42
+ format_table(table)
43
+ end
44
+ end
45
+
46
+ def format_table(table)
47
+ [
48
+ table.id,
49
+ table.name,
50
+ table.path,
51
+ table_flags(table),
52
+ domain_name(table),
53
+ range_name(table),
54
+ default_tokenizer_name(table),
55
+ normalizer_name(table),
56
+ ]
57
+ end
58
+
59
+ def table_flags(table)
60
+ flags = []
61
+ case table
62
+ when ::Groonga::Array
63
+ flags << "TABLE_NO_KEY"
64
+ when ::Groonga::Hash
65
+ flags << "TABLE_HASH_KEY"
66
+ when ::Groonga::PatriciaTrie
67
+ flags << "TABLE_PAT_KEY"
68
+ when ::Groonga::DoubleArrayTrie
69
+ flags << "TABLE_DAT_KEY"
70
+ end
71
+ if table.domain
72
+ if table.is_a?(::Groonga::PatriciaTrie) and
73
+ table.register_key_with_sis?
74
+ flags << "KEY_WITH_SIS"
75
+ end
76
+ end
77
+ flags << "PERSISTENT"
78
+ flags.join("|")
79
+ end
80
+
81
+ def domain_name(table)
82
+ return nil unless table.domain
83
+ table.domain.name
84
+ end
85
+
86
+ def range_name(table)
87
+ return nil unless table.range
88
+ table.range.name
89
+ end
90
+
91
+ def default_tokenizer_name(table)
92
+ return nil if table.is_a?(::Groonga::Array)
93
+ return nil unless table.default_tokenizer
94
+ table.default_tokenizer.name
95
+ end
96
+
97
+ def normalizer_name(table)
98
+ return nil if table.is_a?(::Groonga::Array)
99
+ return nil unless table.domain
100
+ return nil unless table.normalizer
101
+ table.normalizer.name
102
+ end
103
+ end
104
+
105
+ class Handler < Droonga::Handler
106
+ def handle(message)
107
+ command = Command.new(@context)
108
+ command.execute(message.request)
109
+ end
110
+ end
111
+
112
+ Groonga.define_single_step do |step|
113
+ step.name = "table_list"
114
+ step.handler = Handler
115
+ step.collector = Collectors::Or
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,57 @@
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 "groonga/command/table-remove"
17
+
18
+ require "droonga/plugin"
19
+ require "droonga/plugins/groonga/generic_command"
20
+
21
+ module Droonga
22
+ module Plugins
23
+ module Groonga
24
+ module TableRemove
25
+ class Command < GenericCommand
26
+ def process_request(request)
27
+ command_class = ::Groonga::Command.find("table_remove")
28
+ @command = command_class.new("table_remove", request)
29
+
30
+ name = valid_table_name("name")
31
+
32
+ ::Groonga::Schema.define(:context => @context) do |schema|
33
+ schema.remove_table(name)
34
+ end
35
+ true
36
+ end
37
+ end
38
+
39
+ class Handler < Droonga::Handler
40
+ action.synchronous = true
41
+
42
+ def handle(message)
43
+ command = Command.new(@context)
44
+ command.execute(message.request)
45
+ end
46
+ end
47
+
48
+ Groonga.define_single_step do |step|
49
+ step.name = "table_remove"
50
+ step.write = true
51
+ step.handler = Handler
52
+ step.collector = Collectors::Or
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,37 @@
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/plugin"
17
+
18
+ module Droonga
19
+ module Plugins
20
+ module Groonga
21
+ extend Plugin
22
+ register("groonga")
23
+ end
24
+ end
25
+ end
26
+
27
+ require "droonga/plugins/groonga/generic_response"
28
+ require "droonga/plugins/groonga/select"
29
+ require "droonga/plugins/groonga/table_create"
30
+ require "droonga/plugins/groonga/table_remove"
31
+ require "droonga/plugins/groonga/table_list"
32
+ require "droonga/plugins/groonga/column_create"
33
+ require "droonga/plugins/groonga/column_remove"
34
+ require "droonga/plugins/groonga/column_rename"
35
+ require "droonga/plugins/groonga/column_list"
36
+ require "droonga/plugins/groonga/delete"
37
+