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.
- data/.dir-locals.el +3 -0
- data/.gitignore +6 -0
- data/.travis.yml +15 -0
- data/.yardopts +7 -0
- data/Gemfile +66 -0
- data/LICENSE.txt +14 -0
- data/README.md +17 -0
- data/Rakefile +64 -0
- data/benchmark/benchmark.rb +123 -0
- data/benchmark/utils.rb +246 -0
- data/benchmark/watch/benchmark-notify.rb +143 -0
- data/benchmark/watch/benchmark-notify.sh +20 -0
- data/benchmark/watch/benchmark-publish.rb +120 -0
- data/benchmark/watch/benchmark-scan.rb +213 -0
- data/bin/droonga-catalog-generate +103 -0
- data/bin/droonga-engine +20 -0
- data/bin/droonga-engine-service +20 -0
- data/doc/text/news.md +106 -0
- data/droonga-engine.gemspec +52 -0
- data/lib/droonga/adapter.rb +48 -0
- data/lib/droonga/adapter_runner.rb +104 -0
- data/lib/droonga/catalog/base.rb +41 -0
- data/lib/droonga/catalog/collection_volume.rb +106 -0
- data/lib/droonga/catalog/dataset.rb +69 -0
- data/lib/droonga/catalog/errors.rb +113 -0
- data/lib/droonga/catalog/schema.rb +186 -0
- data/lib/droonga/catalog/single_volume.rb +28 -0
- data/lib/droonga/catalog/slice.rb +41 -0
- data/lib/droonga/catalog/version1.rb +427 -0
- data/lib/droonga/catalog/version2.rb +96 -0
- data/lib/droonga/catalog/version2_validator.rb +63 -0
- data/lib/droonga/catalog/volume.rb +33 -0
- data/lib/droonga/catalog/volume_collection.rb +56 -0
- data/lib/droonga/catalog_generator.rb +156 -0
- data/lib/droonga/catalog_loader.rb +56 -0
- data/lib/droonga/catalog_observer.rb +83 -0
- data/lib/droonga/collector.rb +38 -0
- data/lib/droonga/collector_message.rb +71 -0
- data/lib/droonga/collector_runner.rb +64 -0
- data/lib/droonga/collectors/and.rb +26 -0
- data/lib/droonga/collectors/or.rb +26 -0
- data/lib/droonga/collectors/sum.rb +26 -0
- data/lib/droonga/collectors.rb +18 -0
- data/lib/droonga/dispatcher.rb +326 -0
- data/lib/droonga/distributed_command_planner.rb +179 -0
- data/lib/droonga/distributor.rb +87 -0
- data/lib/droonga/engine/command/droonga_engine.rb +441 -0
- data/lib/droonga/engine/version.rb +20 -0
- data/lib/droonga/engine.rb +80 -0
- data/lib/droonga/engine_state.rb +79 -0
- data/lib/droonga/error.rb +73 -0
- data/lib/droonga/error_messages.rb +33 -0
- data/lib/droonga/event_loop.rb +46 -0
- data/lib/droonga/farm.rb +58 -0
- data/lib/droonga/fluent_message_receiver.rb +191 -0
- data/lib/droonga/fluent_message_sender.rb +140 -0
- data/lib/droonga/forwarder.rb +119 -0
- data/lib/droonga/handler.rb +49 -0
- data/lib/droonga/handler_message.rb +61 -0
- data/lib/droonga/handler_messenger.rb +119 -0
- data/lib/droonga/handler_runner.rb +125 -0
- data/lib/droonga/input_message.rb +51 -0
- data/lib/droonga/job_protocol.rb +20 -0
- data/lib/droonga/job_pusher.rb +179 -0
- data/lib/droonga/job_receiver.rb +70 -0
- data/lib/droonga/loggable.rb +29 -0
- data/lib/droonga/logger.rb +142 -0
- data/lib/droonga/message_matcher.rb +109 -0
- data/lib/droonga/output_message.rb +55 -0
- data/lib/droonga/planner.rb +47 -0
- data/lib/droonga/pluggable.rb +31 -0
- data/lib/droonga/plugin/metadata/adapter_input_message.rb +39 -0
- data/lib/droonga/plugin/metadata/adapter_output_message.rb +39 -0
- data/lib/droonga/plugin/metadata/collector_message.rb +39 -0
- data/lib/droonga/plugin/metadata/handler_action.rb +39 -0
- data/lib/droonga/plugin/metadata/input_message.rb +54 -0
- data/lib/droonga/plugin.rb +43 -0
- data/lib/droonga/plugin_loader.rb +63 -0
- data/lib/droonga/plugin_registry.rb +66 -0
- data/lib/droonga/plugins/basic.rb +54 -0
- data/lib/droonga/plugins/crud.rb +145 -0
- data/lib/droonga/plugins/dump.rb +97 -0
- data/lib/droonga/plugins/error.rb +51 -0
- data/lib/droonga/plugins/groonga/column_create.rb +123 -0
- data/lib/droonga/plugins/groonga/column_list.rb +124 -0
- data/lib/droonga/plugins/groonga/column_remove.rb +65 -0
- data/lib/droonga/plugins/groonga/column_rename.rb +67 -0
- data/lib/droonga/plugins/groonga/delete.rb +117 -0
- data/lib/droonga/plugins/groonga/generic_command.rb +105 -0
- data/lib/droonga/plugins/groonga/generic_response.rb +43 -0
- data/lib/droonga/plugins/groonga/select.rb +236 -0
- data/lib/droonga/plugins/groonga/table_create.rb +111 -0
- data/lib/droonga/plugins/groonga/table_list.rb +120 -0
- data/lib/droonga/plugins/groonga/table_remove.rb +57 -0
- data/lib/droonga/plugins/groonga.rb +37 -0
- data/lib/droonga/plugins/search/distributed_search_planner.rb +407 -0
- data/lib/droonga/plugins/search.rb +146 -0
- data/lib/droonga/plugins/watch.rb +178 -0
- data/lib/droonga/processor.rb +63 -0
- data/lib/droonga/reducer.rb +169 -0
- data/lib/droonga/replier.rb +49 -0
- data/lib/droonga/schema_applier.rb +167 -0
- data/lib/droonga/searcher/mecab_filter.rb +67 -0
- data/lib/droonga/searcher.rb +733 -0
- data/lib/droonga/server.rb +45 -0
- data/lib/droonga/session.rb +99 -0
- data/lib/droonga/single_step.rb +68 -0
- data/lib/droonga/single_step_definition.rb +54 -0
- data/lib/droonga/slice.rb +122 -0
- data/lib/droonga/status_code.rb +25 -0
- data/lib/droonga/step_runner.rb +64 -0
- data/lib/droonga/sweeper.rb +42 -0
- data/lib/droonga/test/stub_handler.rb +37 -0
- data/lib/droonga/test/stub_handler_message.rb +35 -0
- data/lib/droonga/test/stub_handler_messenger.rb +34 -0
- data/lib/droonga/test/stub_planner.rb +31 -0
- data/lib/droonga/test.rb +21 -0
- data/lib/droonga/watch_schema.rb +92 -0
- data/lib/droonga/watcher.rb +257 -0
- data/lib/droonga/worker.rb +61 -0
- data/sample/cluster/catalog.json +42 -0
- data/sample/mecab_filter/data.grn +7 -0
- data/sample/mecab_filter/ddl.grn +7 -0
- data/sample/mecab_filter/search_with_mecab_filter.json +21 -0
- data/sample/mecab_filter/search_without_mecab_filter.json +21 -0
- data/test/command/config/default/catalog.json +85 -0
- data/test/command/config/default/fluentd.conf +11 -0
- data/test/command/config/version1/catalog.json +68 -0
- data/test/command/config/version1/fluentd.conf +11 -0
- data/test/command/fixture/documents.jsons +208 -0
- data/test/command/fixture/event.jsons +41 -0
- data/test/command/fixture/user-table-array.jsons +38 -0
- data/test/command/fixture/user-table.jsons +47 -0
- data/test/command/run-test.rb +34 -0
- data/test/command/suite/add/dimension/column.catalog.json +28 -0
- data/test/command/suite/add/dimension/column.expected +41 -0
- data/test/command/suite/add/dimension/column.test +51 -0
- data/test/command/suite/add/dimension/integer.catalog.json +19 -0
- data/test/command/suite/add/dimension/integer.expected +41 -0
- data/test/command/suite/add/dimension/integer.test +51 -0
- data/test/command/suite/add/error/invalid-integer.expected +46 -0
- data/test/command/suite/add/error/invalid-integer.test +12 -0
- data/test/command/suite/add/error/invalid-time.expected +46 -0
- data/test/command/suite/add/error/invalid-time.test +12 -0
- data/test/command/suite/add/error/missing-key.expected +25 -0
- data/test/command/suite/add/error/missing-key.test +16 -0
- data/test/command/suite/add/error/missing-table.expected +25 -0
- data/test/command/suite/add/error/missing-table.test +16 -0
- data/test/command/suite/add/error/unknown-column.expected +46 -0
- data/test/command/suite/add/error/unknown-column.test +12 -0
- data/test/command/suite/add/error/unknown-table.expected +25 -0
- data/test/command/suite/add/error/unknown-table.test +17 -0
- data/test/command/suite/add/minimum.expected +6 -0
- data/test/command/suite/add/minimum.test +11 -0
- data/test/command/suite/add/with-values.expected +6 -0
- data/test/command/suite/add/with-values.test +17 -0
- data/test/command/suite/add/without-key.expected +6 -0
- data/test/command/suite/add/without-key.test +16 -0
- data/test/command/suite/groonga/column_create/scalar.expected +26 -0
- data/test/command/suite/groonga/column_create/scalar.test +17 -0
- data/test/command/suite/groonga/column_create/unknown-table.expected +14 -0
- data/test/command/suite/groonga/column_create/unknown-table.test +7 -0
- data/test/command/suite/groonga/column_create/vector.expected +26 -0
- data/test/command/suite/groonga/column_create/vector.test +18 -0
- data/test/command/suite/groonga/column_list/success.expected +86 -0
- data/test/command/suite/groonga/column_list/success.test +24 -0
- data/test/command/suite/groonga/column_list/unknown-table.expected +13 -0
- data/test/command/suite/groonga/column_list/unknown-table.test +7 -0
- data/test/command/suite/groonga/column_remove/success.expected +39 -0
- data/test/command/suite/groonga/column_remove/success.test +25 -0
- data/test/command/suite/groonga/column_remove/unknown-column.expected +27 -0
- data/test/command/suite/groonga/column_remove/unknown-column.test +16 -0
- data/test/command/suite/groonga/column_remove/unknown-table.expected +14 -0
- data/test/command/suite/groonga/column_remove/unknown-table.test +7 -0
- data/test/command/suite/groonga/column_rename/success.expected +39 -0
- data/test/command/suite/groonga/column_rename/success.test +26 -0
- data/test/command/suite/groonga/column_rename/unknown-column.expected +27 -0
- data/test/command/suite/groonga/column_rename/unknown-column.test +16 -0
- data/test/command/suite/groonga/column_rename/unknown-table.expected +14 -0
- data/test/command/suite/groonga/column_rename/unknown-table.test +7 -0
- data/test/command/suite/groonga/delete/duplicated-identifiers.expected +27 -0
- data/test/command/suite/groonga/delete/duplicated-identifiers.test +17 -0
- data/test/command/suite/groonga/delete/filter.expected +19 -0
- data/test/command/suite/groonga/delete/filter.test +19 -0
- data/test/command/suite/groonga/delete/invalid-filter.expected +14 -0
- data/test/command/suite/groonga/delete/invalid-filter.test +9 -0
- data/test/command/suite/groonga/delete/no-identifier.expected +27 -0
- data/test/command/suite/groonga/delete/no-identifier.test +15 -0
- data/test/command/suite/groonga/delete/success.expected +19 -0
- data/test/command/suite/groonga/delete/success.test +19 -0
- data/test/command/suite/groonga/delete/unknown-table.expected +14 -0
- data/test/command/suite/groonga/delete/unknown-table.test +7 -0
- data/test/command/suite/groonga/select/minimum.expected +22 -0
- data/test/command/suite/groonga/select/minimum.test +8 -0
- data/test/command/suite/groonga/table_create/array.expected +14 -0
- data/test/command/suite/groonga/table_create/array.test +8 -0
- data/test/command/suite/groonga/table_create/hash.expected +13 -0
- data/test/command/suite/groonga/table_create/hash.test +8 -0
- data/test/command/suite/groonga/table_list/success.expected +71 -0
- data/test/command/suite/groonga/table_list/success.test +15 -0
- data/test/command/suite/groonga/table_remove/success.expected +13 -0
- data/test/command/suite/groonga/table_remove/success.test +8 -0
- data/test/command/suite/groonga/table_remove/unknown-table.expected +14 -0
- data/test/command/suite/groonga/table_remove/unknown-table.test +7 -0
- data/test/command/suite/message/error/missing-dataset.expected +9 -0
- data/test/command/suite/message/error/missing-dataset.test +5 -0
- data/test/command/suite/message/error/unknown-dataset.expected +9 -0
- data/test/command/suite/message/error/unknown-dataset.test +6 -0
- data/test/command/suite/message/error/unknown-type.expected +9 -0
- data/test/command/suite/message/error/unknown-type.test +6 -0
- data/test/command/suite/search/adjusters/multiple.catalog.json +38 -0
- data/test/command/suite/search/adjusters/multiple.expected +19 -0
- data/test/command/suite/search/adjusters/multiple.test +75 -0
- data/test/command/suite/search/adjusters/one.catalog.json +38 -0
- data/test/command/suite/search/adjusters/one.expected +19 -0
- data/test/command/suite/search/adjusters/one.test +66 -0
- data/test/command/suite/search/attributes/array.expected +21 -0
- data/test/command/suite/search/attributes/array.test +28 -0
- data/test/command/suite/search/attributes/hash.expected +30 -0
- data/test/command/suite/search/attributes/hash.test +36 -0
- data/test/command/suite/search/complex.expected +48 -0
- data/test/command/suite/search/complex.test +23 -0
- data/test/command/suite/search/condition/nested.expected +15 -0
- data/test/command/suite/search/condition/nested.test +27 -0
- data/test/command/suite/search/condition/query/nonexistent_column.catalog.json +37 -0
- data/test/command/suite/search/condition/query/nonexistent_column.expected +48 -0
- data/test/command/suite/search/condition/query/nonexistent_column.test +33 -0
- data/test/command/suite/search/condition/query/syntax_error.catalog.json +36 -0
- data/test/command/suite/search/condition/query/syntax_error.expected +48 -0
- data/test/command/suite/search/condition/query/syntax_error.test +33 -0
- data/test/command/suite/search/condition/query.expected +24 -0
- data/test/command/suite/search/condition/query.test +23 -0
- data/test/command/suite/search/condition/script.expected +24 -0
- data/test/command/suite/search/condition/script.test +26 -0
- data/test/command/suite/search/error/cyclic-source.expected +14 -0
- data/test/command/suite/search/error/cyclic-source.test +12 -0
- data/test/command/suite/search/error/deeply-cyclic-source.expected +17 -0
- data/test/command/suite/search/error/deeply-cyclic-source.test +15 -0
- data/test/command/suite/search/error/missing-source-parameter.expected +13 -0
- data/test/command/suite/search/error/missing-source-parameter.test +11 -0
- data/test/command/suite/search/error/no-query.expected +9 -0
- data/test/command/suite/search/error/no-query.test +7 -0
- data/test/command/suite/search/error/unknown-source.expected +52 -0
- data/test/command/suite/search/error/unknown-source.test +12 -0
- data/test/command/suite/search/group/count.expected +10 -0
- data/test/command/suite/search/group/count.test +18 -0
- data/test/command/suite/search/group/limit.expected +15 -0
- data/test/command/suite/search/group/limit.test +20 -0
- data/test/command/suite/search/group/string.expected +32 -0
- data/test/command/suite/search/group/string.test +40 -0
- data/test/command/suite/search/group/subrecord/with-sort.catalog.json +33 -0
- data/test/command/suite/search/group/subrecord/with-sort.expected +30 -0
- data/test/command/suite/search/group/subrecord/with-sort.test +81 -0
- data/test/command/suite/search/multiple/chained.expected +41 -0
- data/test/command/suite/search/multiple/chained.test +39 -0
- data/test/command/suite/search/multiple/parallel.expected +35 -0
- data/test/command/suite/search/multiple/parallel.test +35 -0
- data/test/command/suite/search/output/attributes/invalid.catalog.json +13 -0
- data/test/command/suite/search/output/attributes/invalid.expected +44 -0
- data/test/command/suite/search/output/attributes/invalid.test +28 -0
- data/test/command/suite/search/range/only-output.expected +24 -0
- data/test/command/suite/search/range/only-output.test +23 -0
- data/test/command/suite/search/range/only-sort.expected +24 -0
- data/test/command/suite/search/range/only-sort.test +26 -0
- data/test/command/suite/search/range/sort-and-output.expected +21 -0
- data/test/command/suite/search/range/sort-and-output.test +27 -0
- data/test/command/suite/search/range/too-large-output-offset.expected +12 -0
- data/test/command/suite/search/range/too-large-output-offset.test +23 -0
- data/test/command/suite/search/range/too-large-sort-offset.expected +12 -0
- data/test/command/suite/search/range/too-large-sort-offset.test +26 -0
- data/test/command/suite/search/response/elapsed_time.catalog.json +13 -0
- data/test/command/suite/search/response/elapsed_time.expected +11 -0
- data/test/command/suite/search/response/elapsed_time.test +26 -0
- data/test/command/suite/search/response/records/value/time.expected +20 -0
- data/test/command/suite/search/response/records/value/time.test +22 -0
- data/test/command/suite/search/simple.expected +48 -0
- data/test/command/suite/search/simple.test +22 -0
- data/test/command/suite/search/sort/default-offset-limit.expected +39 -0
- data/test/command/suite/search/sort/default-offset-limit.test +24 -0
- data/test/command/suite/search/sort/invisible-column.expected +24 -0
- data/test/command/suite/search/sort/invisible-column.test +26 -0
- data/test/command/suite/watch/subscribe.expected +6 -0
- data/test/command/suite/watch/subscribe.test +9 -0
- data/test/command/suite/watch/unsubscribe.expected +6 -0
- data/test/command/suite/watch/unsubscribe.test +9 -0
- data/test/performance/run-test.rb +56 -0
- data/test/performance/watch/catalog.json +33 -0
- data/test/performance/watch/feed.json +9 -0
- data/test/performance/watch/fluentd.conf +11 -0
- data/test/performance/watch/subscribe.json +3 -0
- data/test/unit/catalog/test_collection_volume.rb +103 -0
- data/test/unit/catalog/test_dataset.rb +104 -0
- data/test/unit/catalog/test_schema.rb +226 -0
- data/test/unit/catalog/test_single_volume.rb +31 -0
- data/test/unit/catalog/test_slice.rb +92 -0
- data/test/unit/catalog/test_version1.rb +361 -0
- data/test/unit/catalog/test_version2.rb +124 -0
- data/test/unit/catalog/test_version2_validator.rb +66 -0
- data/test/unit/catalog/test_volume_collection.rb +50 -0
- data/test/unit/fixtures/array.grn +18 -0
- data/test/unit/fixtures/catalog/version1.json +40 -0
- data/test/unit/fixtures/catalog/version2.json +62 -0
- data/test/unit/fixtures/document.grn +34 -0
- data/test/unit/fixtures/reference/array.grn +11 -0
- data/test/unit/fixtures/reference/hash.grn +7 -0
- data/test/unit/helper/distributed_search_planner_helper.rb +83 -0
- data/test/unit/helper/fixture.rb +28 -0
- data/test/unit/helper/plugin_helper.rb +38 -0
- data/test/unit/helper/sandbox.rb +86 -0
- data/test/unit/helper/stub_worker.rb +27 -0
- data/test/unit/helper/watch_helper.rb +23 -0
- data/test/unit/helper.rb +28 -0
- data/test/unit/plugins/crud/test_add.rb +190 -0
- data/test/unit/plugins/groonga/select/test_adapter_input.rb +510 -0
- data/test/unit/plugins/groonga/select/test_adapter_output.rb +201 -0
- data/test/unit/plugins/groonga/test_column_create.rb +171 -0
- data/test/unit/plugins/groonga/test_column_list.rb +170 -0
- data/test/unit/plugins/groonga/test_column_remove.rb +98 -0
- data/test/unit/plugins/groonga/test_column_rename.rb +105 -0
- data/test/unit/plugins/groonga/test_delete.rb +127 -0
- data/test/unit/plugins/groonga/test_table_create.rb +147 -0
- data/test/unit/plugins/groonga/test_table_list.rb +184 -0
- data/test/unit/plugins/groonga/test_table_remove.rb +61 -0
- data/test/unit/plugins/search/planner/test_basic.rb +120 -0
- data/test/unit/plugins/search/planner/test_group_by.rb +573 -0
- data/test/unit/plugins/search/planner/test_output.rb +388 -0
- data/test/unit/plugins/search/planner/test_sort_by.rb +938 -0
- data/test/unit/plugins/search/test_collector.rb +806 -0
- data/test/unit/plugins/search/test_handler.rb +930 -0
- data/test/unit/plugins/search/test_planner.rb +174 -0
- data/test/unit/plugins/test_basic.rb +510 -0
- data/test/unit/plugins/test_groonga.rb +70 -0
- data/test/unit/plugins/test_watch.rb +211 -0
- data/test/unit/run-test.rb +56 -0
- data/test/unit/test_catalog_generator.rb +93 -0
- data/test/unit/test_message_matcher.rb +160 -0
- data/test/unit/test_schema_applier.rb +59 -0
- data/test/unit/test_sweeper.rb +95 -0
- data/test/unit/test_watch_schema.rb +57 -0
- data/test/unit/test_watcher.rb +336 -0
- 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
|
+
|