fluent-plugin-droonga 0.9.0 → 0.9.9
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.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/Gemfile +8 -1
- data/fluent-plugin-droonga.gemspec +2 -2
- data/lib/droonga/adapter.rb +39 -0
- data/lib/droonga/adapter_runner.rb +99 -0
- data/lib/droonga/catalog/base.rb +11 -11
- data/lib/droonga/catalog/dataset.rb +54 -0
- data/lib/droonga/catalog/version1.rb +1 -1
- data/lib/droonga/collector.rb +5 -7
- data/lib/droonga/collector_plugin.rb +7 -7
- data/lib/droonga/command.rb +36 -0
- data/lib/droonga/{plugin/input_adapter/crud.rb → command_repository.rb} +14 -8
- data/lib/droonga/dispatcher.rb +86 -54
- data/lib/droonga/distributed_command_planner.rb +183 -0
- data/lib/droonga/distributor.rb +43 -17
- data/lib/droonga/handler.rb +13 -72
- data/lib/droonga/handler_message.rb +5 -5
- data/lib/droonga/handler_messenger.rb +4 -1
- data/lib/droonga/handler_plugin.rb +2 -2
- data/lib/droonga/handler_runner.rb +104 -0
- data/lib/droonga/input_message.rb +4 -4
- data/lib/droonga/legacy_pluggable.rb +66 -0
- data/lib/droonga/{input_adapter.rb → legacy_plugin.rb} +27 -22
- data/lib/droonga/{plugin_repository.rb → legacy_plugin_repository.rb} +2 -4
- data/lib/droonga/message_matcher.rb +101 -0
- data/lib/droonga/{input_adapter_plugin.rb → planner.rb} +14 -10
- data/lib/droonga/planner_plugin.rb +54 -0
- data/lib/droonga/pluggable.rb +9 -45
- data/lib/droonga/plugin.rb +9 -33
- data/lib/droonga/plugin/collector/basic.rb +2 -0
- data/lib/droonga/plugin/collector/search.rb +31 -37
- data/lib/droonga/plugin/{handler/groonga/table_remove.rb → metadata/adapter_message.rb} +23 -18
- data/lib/droonga/plugin/{handler/search.rb → metadata/handler_action.rb} +19 -15
- data/lib/droonga/plugin/metadata/input_message.rb +39 -0
- data/lib/droonga/plugin/planner/crud.rb +49 -0
- data/lib/droonga/plugin/{distributor → planner}/distributed_search_planner.rb +62 -70
- data/lib/droonga/plugin/{distributor → planner}/groonga.rb +11 -32
- data/lib/droonga/plugin/{distributor → planner}/search.rb +5 -5
- data/lib/droonga/plugin/{distributor → planner}/watch.rb +15 -6
- data/lib/droonga/plugin_loader.rb +10 -0
- data/lib/droonga/plugin_registerable.rb +34 -10
- data/lib/droonga/plugin_registry.rb +58 -0
- data/lib/droonga/plugins/crud.rb +124 -0
- data/lib/droonga/plugins/error.rb +50 -0
- data/lib/droonga/{output_adapter_plugin.rb → plugins/groonga.rb} +9 -13
- data/lib/droonga/plugins/groonga/column_create.rb +123 -0
- data/lib/droonga/plugins/groonga/generic_command.rb +65 -0
- data/lib/droonga/{plugin/output_adapter/groonga.rb → plugins/groonga/generic_response.rb} +16 -15
- data/lib/droonga/plugins/groonga/select.rb +124 -0
- data/lib/droonga/plugins/groonga/table_create.rb +106 -0
- data/lib/droonga/plugins/groonga/table_remove.rb +57 -0
- data/lib/droonga/plugins/search.rb +40 -0
- data/lib/droonga/plugins/watch.rb +156 -0
- data/lib/droonga/processor.rb +8 -10
- data/lib/droonga/searcher.rb +14 -4
- data/lib/droonga/searcher/mecab_filter.rb +67 -0
- data/lib/droonga/session.rb +5 -5
- data/lib/droonga/test.rb +1 -1
- data/lib/droonga/test/stub_handler_message.rb +1 -1
- data/lib/droonga/test/{stub_distributor.rb → stub_planner.rb} +1 -1
- data/lib/droonga/worker.rb +7 -8
- data/lib/fluent/plugin/out_droonga.rb +0 -1
- data/sample/cluster/catalog.json +2 -4
- 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 +2 -5
- data/test/command/suite/search/error/no-query.expected +13 -0
- data/test/command/suite/search/error/no-query.test +7 -0
- data/test/command/suite/search/error/unknown-source.expected +26 -0
- data/test/command/suite/watch/subscribe.expected +3 -3
- data/test/command/suite/watch/unsubscribe.expected +3 -3
- data/test/unit/catalog/test_dataset.rb +385 -0
- data/test/unit/catalog/test_version1.rb +111 -45
- data/test/unit/fixtures/catalog/version1.json +0 -3
- data/test/unit/helper.rb +2 -1
- data/test/unit/helper/distributed_search_planner_helper.rb +83 -0
- data/test/unit/plugin/collector/test_basic.rb +233 -376
- data/test/unit/plugin/collector/test_search.rb +8 -17
- data/test/unit/plugin/planner/search_planner/test_basic.rb +120 -0
- data/test/unit/plugin/planner/search_planner/test_group_by.rb +573 -0
- data/test/unit/plugin/planner/search_planner/test_output.rb +388 -0
- data/test/unit/plugin/planner/search_planner/test_sort_by.rb +938 -0
- data/test/unit/plugin/{distributor → planner}/test_search.rb +20 -75
- data/test/unit/{plugin/handler → plugins/crud}/test_add.rb +11 -11
- data/test/unit/plugins/groonga/select/test_adapter_input.rb +213 -0
- data/test/unit/{plugin/output_adapter/groonga/test_select.rb → plugins/groonga/select/test_adapter_output.rb} +12 -13
- data/test/unit/{plugin/handler → plugins}/groonga/test_column_create.rb +20 -5
- data/test/unit/{plugin/handler → plugins}/groonga/test_table_create.rb +5 -0
- data/test/unit/{plugin/handler → plugins}/groonga/test_table_remove.rb +8 -1
- data/test/unit/{plugin/handler → plugins}/test_groonga.rb +5 -5
- data/test/unit/{plugin/handler → plugins}/test_search.rb +21 -5
- data/test/unit/{plugin/handler → plugins}/test_watch.rb +29 -10
- data/{lib/droonga/command_mapper.rb → test/unit/test_command_repository.rb} +16 -22
- data/test/unit/{test_plugin.rb → test_legacy_plugin.rb} +3 -3
- data/test/unit/{test_plugin_repository.rb → test_legacy_plugin_repository.rb} +3 -3
- data/test/unit/test_message_matcher.rb +137 -0
- metadata +86 -66
- data/bin/grn2jsons +0 -82
- data/lib/droonga/distribution_planner.rb +0 -76
- data/lib/droonga/distributor_plugin.rb +0 -95
- data/lib/droonga/output_adapter.rb +0 -53
- data/lib/droonga/plugin/collector/groonga.rb +0 -83
- data/lib/droonga/plugin/distributor/crud.rb +0 -84
- data/lib/droonga/plugin/handler/add.rb +0 -109
- data/lib/droonga/plugin/handler/forward.rb +0 -75
- data/lib/droonga/plugin/handler/groonga.rb +0 -99
- data/lib/droonga/plugin/handler/groonga/column_create.rb +0 -106
- data/lib/droonga/plugin/handler/groonga/table_create.rb +0 -91
- data/lib/droonga/plugin/handler/watch.rb +0 -108
- data/lib/droonga/plugin/input_adapter/groonga.rb +0 -49
- data/lib/droonga/plugin/input_adapter/groonga/select.rb +0 -63
- data/lib/droonga/plugin/output_adapter/crud.rb +0 -51
- data/lib/droonga/plugin/output_adapter/groonga/select.rb +0 -54
- data/lib/groonga_command_converter.rb +0 -143
- data/sample/fluentd.conf +0 -8
- data/test/unit/plugin/distributor/test_search_planner.rb +0 -1102
- data/test/unit/plugin/input_adapter/groonga/test_select.rb +0 -248
- data/test/unit/test_command_mapper.rb +0 -44
- data/test/unit/test_groonga_command_converter.rb +0 -242
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2013 Droonga Project
|
|
1
|
+
# Copyright (C) 2013-2014 Droonga Project
|
|
4
2
|
#
|
|
5
3
|
# This library is free software; you can redistribute it and/or
|
|
6
4
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -16,7 +14,7 @@
|
|
|
16
14
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
17
15
|
|
|
18
16
|
module Droonga
|
|
19
|
-
class
|
|
17
|
+
class LegacyPluginRepository
|
|
20
18
|
include Enumerable
|
|
21
19
|
|
|
22
20
|
def initialize
|
|
@@ -0,0 +1,101 @@
|
|
|
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
|
+
module Droonga
|
|
17
|
+
# It checks whether the pattern matches against a message.
|
|
18
|
+
#
|
|
19
|
+
# It provides the small language. Here is the pattern syntax.
|
|
20
|
+
#
|
|
21
|
+
# * PATTERN = [TARGET_PATH, OPERATOR, ARGUMENTS*]
|
|
22
|
+
# * PATTERN = [PATTERN, LOGICAL_OPERATOR, PATTERN]
|
|
23
|
+
# * TARGET_PATH = "COMPONENT(.COMPONENT)*"
|
|
24
|
+
# * OPERATOR = :equal, :in, :include?, :exist?
|
|
25
|
+
# (More operators may be added in the future.
|
|
26
|
+
# For example, :start_with and so on.)
|
|
27
|
+
# * ARGUMENTS = OBJECT_DEFINED_IN_JSON*
|
|
28
|
+
# * LOGICAL_OPERATOR = :or (:add will be added.)
|
|
29
|
+
#
|
|
30
|
+
# For example:
|
|
31
|
+
#
|
|
32
|
+
# ```
|
|
33
|
+
# ["type", :equal, "search"]
|
|
34
|
+
# ```
|
|
35
|
+
#
|
|
36
|
+
# matches to the following message:
|
|
37
|
+
#
|
|
38
|
+
# ```
|
|
39
|
+
# {"type" => "search"}
|
|
40
|
+
# ```
|
|
41
|
+
#
|
|
42
|
+
# Another example:
|
|
43
|
+
#
|
|
44
|
+
# ```
|
|
45
|
+
# ["body.output.limit", :equal, 10]
|
|
46
|
+
# ```
|
|
47
|
+
#
|
|
48
|
+
# matches to the following message:
|
|
49
|
+
#
|
|
50
|
+
# ```
|
|
51
|
+
# {
|
|
52
|
+
# "body" => {
|
|
53
|
+
# "output" => {
|
|
54
|
+
# "limit" => 10,
|
|
55
|
+
# },
|
|
56
|
+
# },
|
|
57
|
+
# }
|
|
58
|
+
# ```
|
|
59
|
+
class MessageMatcher
|
|
60
|
+
# @param [Array] pattern The pattern to be matched against a message.
|
|
61
|
+
def initialize(pattern)
|
|
62
|
+
@pattern = pattern
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def match?(message)
|
|
66
|
+
return false if @pattern.nil?
|
|
67
|
+
path, operator, *arguments = @pattern
|
|
68
|
+
target = resolve_path(path, message)
|
|
69
|
+
apply_operator(operator, target, arguments)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
NONEXISTENT_PATH = Object.new
|
|
74
|
+
def resolve_path(path, message)
|
|
75
|
+
path.split(".").inject(message) do |result, component|
|
|
76
|
+
return NONEXISTENT_PATH unless result.is_a?(Hash)
|
|
77
|
+
result[component]
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def apply_operator(operator, target, arguments)
|
|
82
|
+
case operator
|
|
83
|
+
when :equal
|
|
84
|
+
[target] == arguments
|
|
85
|
+
when :in
|
|
86
|
+
arguments.any? do |argument|
|
|
87
|
+
argument.include?(target)
|
|
88
|
+
end
|
|
89
|
+
when :include?
|
|
90
|
+
return false unless target.respond_to?(:include?)
|
|
91
|
+
arguments.any? do |argument|
|
|
92
|
+
target.include?(argument)
|
|
93
|
+
end
|
|
94
|
+
when :exist?
|
|
95
|
+
target != NONEXISTENT_PATH
|
|
96
|
+
else
|
|
97
|
+
raise ArgumentError, "Unknown operator"
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2013 Droonga Project
|
|
1
|
+
# Copyright (C) 2013-2014 Droonga Project
|
|
4
2
|
#
|
|
5
3
|
# This library is free software; you can redistribute it and/or
|
|
6
4
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -15,19 +13,25 @@
|
|
|
15
13
|
# License along with this library; if not, write to the Free Software
|
|
16
14
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
17
15
|
|
|
18
|
-
require "droonga/
|
|
16
|
+
require "droonga/legacy_pluggable"
|
|
17
|
+
require "droonga/planner_plugin"
|
|
19
18
|
|
|
20
19
|
module Droonga
|
|
21
|
-
class
|
|
22
|
-
|
|
20
|
+
class Planner
|
|
21
|
+
include LegacyPluggable
|
|
23
22
|
|
|
24
|
-
def initialize(dispatcher)
|
|
25
|
-
super()
|
|
23
|
+
def initialize(dispatcher, plugins)
|
|
26
24
|
@dispatcher = dispatcher
|
|
25
|
+
load_plugins(plugins)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
def instantiate_plugin(name)
|
|
30
|
+
PlannerPlugin.repository.instantiate(name, self)
|
|
27
31
|
end
|
|
28
32
|
|
|
29
|
-
def
|
|
30
|
-
|
|
33
|
+
def log_tag
|
|
34
|
+
"[#{Process.pid}] planner"
|
|
31
35
|
end
|
|
32
36
|
end
|
|
33
37
|
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2013-2014 Droonga Project
|
|
4
|
+
#
|
|
5
|
+
# This library is free software; you can redistribute it and/or
|
|
6
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
7
|
+
# License version 2.1 as published by the Free Software Foundation.
|
|
8
|
+
#
|
|
9
|
+
# This library is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
12
|
+
# Lesser General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
15
|
+
# License along with this library; if not, write to the Free Software
|
|
16
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
17
|
+
|
|
18
|
+
require "droonga/legacy_plugin"
|
|
19
|
+
require "droonga/distributed_command_planner"
|
|
20
|
+
|
|
21
|
+
module Droonga
|
|
22
|
+
class PlannerPlugin < LegacyPlugin
|
|
23
|
+
extend PluginRegisterable
|
|
24
|
+
|
|
25
|
+
def initialize(planner)
|
|
26
|
+
super()
|
|
27
|
+
@planner = planner
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def scatter(message, options={})
|
|
31
|
+
planner = DistributedCommandPlanner.new(message)
|
|
32
|
+
planner.scatter
|
|
33
|
+
planner.key = options[:key]
|
|
34
|
+
planner.reduce(options[:reduce])
|
|
35
|
+
planner.plan
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def broadcast(message, options={})
|
|
39
|
+
planner = DistributedCommandPlanner.new(message)
|
|
40
|
+
planner.broadcast(:write => options[:write])
|
|
41
|
+
planner.reduce(options[:reduce])
|
|
42
|
+
planner.plan
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
def process_error(command, error, arguments)
|
|
47
|
+
if error.is_a?(MessageProcessingError)
|
|
48
|
+
raise error
|
|
49
|
+
else
|
|
50
|
+
super
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
data/lib/droonga/pluggable.rb
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2013 Droonga Project
|
|
1
|
+
# Copyright (C) 2014 Droonga Project
|
|
4
2
|
#
|
|
5
3
|
# This library is free software; you can redistribute it and/or
|
|
6
4
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -17,51 +15,17 @@
|
|
|
17
15
|
|
|
18
16
|
module Droonga
|
|
19
17
|
module Pluggable
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def initialize(command)
|
|
24
|
-
@command = command
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def shutdown
|
|
29
|
-
$log.trace("#{log_tag}: shutdown: plugin: start")
|
|
30
|
-
@plugins.each do |plugin|
|
|
31
|
-
plugin.shutdown
|
|
32
|
-
end
|
|
33
|
-
$log.trace("#{log_tag}: shutdown: plugin: done")
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def processable?(command)
|
|
37
|
-
not find_plugin(command).nil?
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def process(command, *arguments)
|
|
41
|
-
plugin = find_plugin(command)
|
|
42
|
-
$log.trace("#{log_tag}: process: start: <#{command}>",
|
|
43
|
-
:plugin => plugin.class)
|
|
44
|
-
raise UnknownPlugin.new(command) if plugin.nil?
|
|
45
|
-
plugin.process(command, *arguments)
|
|
46
|
-
$log.trace("#{log_tag}: process: done: <#{command}>",
|
|
47
|
-
:plugin => plugin.class)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
private
|
|
51
|
-
def load_plugins(names)
|
|
52
|
-
@plugins = names.collect do |name|
|
|
53
|
-
plugin = instantiate_plugin(name)
|
|
54
|
-
if plugin.nil?
|
|
55
|
-
raise "unknown plugin: <#{name}>: TODO: improve error handling"
|
|
56
|
-
end
|
|
57
|
-
plugin
|
|
58
|
-
end
|
|
18
|
+
def options
|
|
19
|
+
@options ||= {}
|
|
59
20
|
end
|
|
60
21
|
|
|
61
|
-
def
|
|
62
|
-
|
|
63
|
-
|
|
22
|
+
def find_sub_classes(names)
|
|
23
|
+
target_sub_classes = []
|
|
24
|
+
names.each do |name|
|
|
25
|
+
sub_classes = Plugin.registry.find_sub_classes(name, self)
|
|
26
|
+
target_sub_classes.concat(sub_classes)
|
|
64
27
|
end
|
|
28
|
+
target_sub_classes
|
|
65
29
|
end
|
|
66
30
|
end
|
|
67
31
|
end
|
data/lib/droonga/plugin.rb
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2013 Droonga Project
|
|
1
|
+
# Copyright (C) 2014 Droonga Project
|
|
4
2
|
#
|
|
5
3
|
# This library is free software; you can redistribute it and/or
|
|
6
4
|
# modify it under the terms of the GNU Lesser General Public
|
|
@@ -15,38 +13,16 @@
|
|
|
15
13
|
# License along with this library; if not, write to the Free Software
|
|
16
14
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
17
15
|
|
|
18
|
-
require "droonga/
|
|
16
|
+
require "droonga/plugin_registry"
|
|
17
|
+
require "droonga/adapter"
|
|
18
|
+
require "droonga/handler"
|
|
19
19
|
|
|
20
20
|
module Droonga
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def shutdown
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def processable?(command)
|
|
32
|
-
self.class.processable?(command)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def process(command, *arguments)
|
|
36
|
-
run_command(command, *arguments)
|
|
37
|
-
rescue => exception
|
|
38
|
-
process_error(command, exception, arguments)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
private
|
|
42
|
-
def run_command(command, *arguments)
|
|
43
|
-
__send__(self.class.method_name(command), *arguments)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def process_error(command, error, arguments)
|
|
47
|
-
Logger.error("error while processing #{command}",
|
|
48
|
-
error,
|
|
49
|
-
:arguments => arguments)
|
|
21
|
+
module Plugin
|
|
22
|
+
class << self
|
|
23
|
+
def registry
|
|
24
|
+
@@registry ||= PluginRegistry.new
|
|
25
|
+
end
|
|
50
26
|
end
|
|
51
27
|
end
|
|
52
28
|
end
|
|
@@ -52,6 +52,8 @@ module Droonga
|
|
|
52
52
|
case deal["type"]
|
|
53
53
|
when "and"
|
|
54
54
|
reduced_value = left_value && right_value
|
|
55
|
+
when "or"
|
|
56
|
+
reduced_value = left_value || right_value
|
|
55
57
|
when "sum"
|
|
56
58
|
reduced_value = sum(left_value, right_value)
|
|
57
59
|
reduced_value = apply_output_range(reduced_value,
|
|
@@ -27,32 +27,24 @@ module Droonga
|
|
|
27
27
|
if output.is_a?(Hash)
|
|
28
28
|
elements = output["elements"]
|
|
29
29
|
if elements && elements.is_a?(Hash)
|
|
30
|
-
#
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
# because "count" mapper requires all records,
|
|
31
|
+
# I have to apply it at first, before "limit" and "offset" are applied.
|
|
32
|
+
count_mapper = elements["count"]
|
|
33
|
+
if count_mapper
|
|
34
|
+
if count_mapper["no_output"]
|
|
35
|
+
result.delete("count")
|
|
36
|
+
else
|
|
37
|
+
result["count"] = result[count_mapper["target"]].size
|
|
37
38
|
end
|
|
38
39
|
end
|
|
39
|
-
# phase 2: post-process
|
|
40
|
-
elements.each do |element, mapper|
|
|
41
|
-
if mapper["no_output"]
|
|
42
|
-
result.delete(element)
|
|
43
|
-
next
|
|
44
|
-
end
|
|
45
40
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
result[element] = apply_output_range(result[element], mapper)
|
|
54
|
-
result[element] = apply_output_attributes_and_format(result[element], mapper)
|
|
55
|
-
end
|
|
41
|
+
records_mapper = elements["records"]
|
|
42
|
+
if records_mapper && result["records"]
|
|
43
|
+
if records_mapper["no_output"]
|
|
44
|
+
result.delete("records")
|
|
45
|
+
else
|
|
46
|
+
result["records"] = apply_output_range(result["records"], records_mapper)
|
|
47
|
+
result["records"] = apply_output_attributes_and_format(result["records"], records_mapper)
|
|
56
48
|
end
|
|
57
49
|
end
|
|
58
50
|
end
|
|
@@ -62,21 +54,18 @@ module Droonga
|
|
|
62
54
|
end
|
|
63
55
|
|
|
64
56
|
def apply_output_attributes_and_format(items, output)
|
|
65
|
-
attributes = output["attributes"]
|
|
66
|
-
if
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
complex_item =
|
|
71
|
-
attributes.each_with_index do |label, index|
|
|
72
|
-
complex_item[label] = item[index]
|
|
73
|
-
end
|
|
74
|
-
complex_item
|
|
75
|
-
end
|
|
76
|
-
else
|
|
77
|
-
items.collect! do |item|
|
|
78
|
-
item[0...attributes.size]
|
|
57
|
+
attributes = output["attributes"] || []
|
|
58
|
+
if output["format"] == "complex"
|
|
59
|
+
items.collect! do |item|
|
|
60
|
+
complex_item = {}
|
|
61
|
+
attributes.each_with_index do |label, index|
|
|
62
|
+
complex_item[label] = item[index]
|
|
79
63
|
end
|
|
64
|
+
complex_item
|
|
65
|
+
end
|
|
66
|
+
else
|
|
67
|
+
items.collect! do |item|
|
|
68
|
+
item[0...attributes.size]
|
|
80
69
|
end
|
|
81
70
|
end
|
|
82
71
|
items
|
|
@@ -84,6 +73,11 @@ module Droonga
|
|
|
84
73
|
|
|
85
74
|
command :collector_search_reduce
|
|
86
75
|
def collector_search_reduce(request)
|
|
76
|
+
#XXX This is just a workaround. Errors should be handled by the framework itself.
|
|
77
|
+
if input_name == "errors"
|
|
78
|
+
return collector_reduce(request)
|
|
79
|
+
end
|
|
80
|
+
|
|
87
81
|
return unless request
|
|
88
82
|
body[input_name].each do |output, elements|
|
|
89
83
|
value = request
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
#
|
|
3
1
|
# Copyright (C) 2014 Droonga Project
|
|
4
2
|
#
|
|
5
3
|
# This library is free software; you can redistribute it and/or
|
|
@@ -15,27 +13,34 @@
|
|
|
15
13
|
# License along with this library; if not, write to the Free Software
|
|
16
14
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
17
15
|
|
|
18
|
-
require "groonga"
|
|
19
|
-
require "groonga/command/table-remove"
|
|
20
|
-
|
|
21
16
|
module Droonga
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
17
|
+
module Plugin
|
|
18
|
+
module Metadata
|
|
19
|
+
class AdapterMessage
|
|
20
|
+
def initialize(adapter_class)
|
|
21
|
+
@adapter_class = adapter_class
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def input_pattern
|
|
25
|
+
configuration[:input_pattern]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def input_pattern=(pattern)
|
|
29
|
+
configuration[:input_pattern] = pattern
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def output_pattern
|
|
33
|
+
configuration[:output_pattern]
|
|
34
|
+
end
|
|
27
35
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
raise CommandError.new(:status => Status::INVALID_ARGUMENT,
|
|
31
|
-
:message => "table not found",
|
|
32
|
-
:result => false)
|
|
36
|
+
def output_pattern=(pattern)
|
|
37
|
+
configuration[:output_pattern] = pattern
|
|
33
38
|
end
|
|
34
39
|
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
private
|
|
41
|
+
def configuration
|
|
42
|
+
@adapter_class.options[:message] ||= {}
|
|
37
43
|
end
|
|
38
|
-
true
|
|
39
44
|
end
|
|
40
45
|
end
|
|
41
46
|
end
|