fluent-plugin-droonga 0.9.9 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.dir-locals.el +3 -0
- data/.travis.yml +6 -2
- data/README.md +6 -7
- data/Rakefile +23 -6
- data/fluent-plugin-droonga.gemspec +2 -2
- data/lib/droonga/adapter.rb +12 -3
- data/lib/droonga/adapter_runner.rb +28 -23
- data/lib/droonga/catalog/base.rb +7 -111
- data/lib/droonga/catalog/dataset.rb +13 -25
- data/lib/droonga/catalog/errors.rb +94 -0
- data/lib/droonga/catalog/schema.rb +277 -0
- data/lib/droonga/catalog/version1.rb +404 -0
- data/lib/droonga/catalog/version2.rb +160 -0
- data/lib/droonga/catalog_loader.rb +27 -4
- data/lib/droonga/catalog_observer.rb +44 -6
- data/lib/droonga/collector.rb +12 -10
- data/lib/droonga/{handler_plugin.rb → collector_message.rb} +47 -20
- data/lib/droonga/collector_runner.rb +64 -0
- data/lib/droonga/collectors.rb +18 -0
- data/lib/droonga/{catalog.rb → collectors/add.rb} +9 -7
- data/lib/droonga/{command_repository.rb → collectors/and.rb} +7 -14
- data/lib/droonga/collectors/sum.rb +26 -0
- data/lib/droonga/dispatcher.rb +74 -41
- data/lib/droonga/distributed_command_planner.rb +2 -2
- data/lib/droonga/engine.rb +13 -5
- data/lib/droonga/{message_processing_error.rb → error.rb} +33 -12
- data/lib/droonga/{plugin/planner/search.rb → error_messages.rb} +12 -10
- data/lib/droonga/farm.rb +15 -14
- data/lib/droonga/fluent_message_sender.rb +15 -11
- data/lib/droonga/forwarder.rb +22 -18
- data/lib/droonga/handler.rb +8 -2
- data/lib/droonga/handler_runner.rb +47 -26
- data/lib/droonga/input_message.rb +6 -6
- data/lib/droonga/{command.rb → loggable.rb} +7 -14
- data/lib/droonga/logger.rb +56 -15
- data/lib/droonga/message_matcher.rb +12 -7
- data/lib/droonga/message_pusher.rb +8 -4
- data/lib/droonga/message_receiver.rb +11 -9
- data/lib/droonga/output_message.rb +2 -0
- data/lib/droonga/planner.rb +21 -10
- data/lib/droonga/plugin.rb +15 -0
- data/lib/droonga/plugin/metadata/{adapter_message.rb → adapter_input_message.rb} +6 -14
- 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/input_message.rb +15 -0
- data/lib/droonga/plugin_loader.rb +33 -25
- data/lib/droonga/plugin_registry.rb +9 -1
- data/lib/droonga/plugins/basic.rb +54 -0
- data/lib/droonga/plugins/crud.rb +36 -15
- data/lib/droonga/plugins/error.rb +5 -4
- data/lib/droonga/plugins/groonga.rb +9 -6
- data/lib/droonga/plugins/groonga/column_create.rb +10 -5
- data/lib/droonga/plugins/groonga/generic_command.rb +2 -8
- data/lib/droonga/plugins/groonga/generic_response.rb +2 -2
- data/lib/droonga/plugins/groonga/select.rb +2 -2
- data/lib/droonga/plugins/groonga/table_create.rb +9 -4
- data/lib/droonga/plugins/groonga/table_remove.rb +10 -5
- data/lib/droonga/plugins/search.rb +106 -5
- data/lib/droonga/plugins/search/distributed_search_planner.rb +398 -0
- data/lib/droonga/plugins/watch.rb +41 -20
- data/lib/droonga/processor.rb +12 -9
- data/lib/droonga/{plugin/collector/basic.rb → reducer.rb} +36 -50
- data/lib/droonga/replier.rb +7 -4
- data/lib/droonga/searcher.rb +40 -37
- data/lib/droonga/server.rb +8 -6
- data/lib/droonga/session.rb +17 -7
- data/lib/droonga/single_step.rb +53 -0
- data/lib/droonga/{plugin/planner/watch.rb → single_step_definition.rb} +27 -26
- data/lib/droonga/{partition.rb → slice.rb} +23 -12
- data/lib/droonga/status_code.rb +25 -0
- data/lib/droonga/step_runner.rb +63 -0
- data/lib/droonga/watch_schema.rb +7 -3
- data/lib/droonga/watcher.rb +4 -4
- data/lib/droonga/worker.rb +6 -6
- data/lib/fluent/plugin/out_droonga.rb +27 -2
- data/sample/cluster/catalog.json +33 -32
- data/test/command/config/default/catalog.json +72 -45
- data/test/command/config/version1/catalog.json +68 -0
- data/test/command/config/version1/fluentd.conf +11 -0
- data/test/command/suite/message/error/missing-dataset.expected +1 -1
- data/test/command/suite/message/error/unknown-dataset.expected +1 -1
- data/test/command/suite/message/error/unknown-type.expected +13 -0
- data/test/command/suite/message/error/{unknown-command.test → unknown-type.test} +1 -1
- data/test/command/suite/search/error/missing-source-parameter.expected +1 -1
- data/test/command/suite/search/error/unknown-source.expected +15 -3
- data/test/command/suite/watch/subscribe.expected +1 -3
- data/test/command/suite/watch/unsubscribe.expected +1 -3
- data/test/performance/watch/catalog.json +1 -0
- data/test/unit/catalog/test_dataset.rb +16 -358
- data/test/unit/catalog/test_schema.rb +285 -0
- data/test/unit/catalog/test_version1.rb +222 -28
- data/test/unit/catalog/test_version2.rb +155 -0
- data/test/unit/fixtures/catalog/version2.json +62 -0
- data/test/unit/helper/distributed_search_planner_helper.rb +2 -2
- data/test/unit/plugins/crud/test_add.rb +13 -13
- data/test/unit/plugins/groonga/test_column_create.rb +14 -11
- data/test/unit/plugins/groonga/test_table_create.rb +4 -9
- data/test/unit/plugins/groonga/test_table_remove.rb +4 -9
- data/test/unit/{plugin/planner/search_planner → plugins/search/planner}/test_basic.rb +0 -0
- data/test/unit/{plugin/planner/search_planner → plugins/search/planner}/test_group_by.rb +0 -0
- data/test/unit/{plugin/planner/search_planner → plugins/search/planner}/test_output.rb +0 -0
- data/test/unit/{plugin/planner/search_planner → plugins/search/planner}/test_sort_by.rb +0 -0
- data/test/unit/{plugin/collector/test_search.rb → plugins/search/test_collector.rb} +40 -39
- data/test/unit/plugins/{test_search.rb → search/test_handler.rb} +6 -5
- data/test/unit/{plugin/planner/test_search.rb → plugins/search/test_planner.rb} +3 -3
- data/test/unit/{plugin/collector → plugins}/test_basic.rb +68 -50
- data/test/unit/plugins/test_groonga.rb +2 -15
- data/test/unit/plugins/test_watch.rb +25 -22
- data/test/unit/test_message_matcher.rb +29 -6
- data/test/unit/test_output.rb +4 -0
- metadata +58 -50
- data/lib/droonga/collector_plugin.rb +0 -50
- data/lib/droonga/legacy_pluggable.rb +0 -66
- data/lib/droonga/legacy_plugin.rb +0 -57
- data/lib/droonga/legacy_plugin_repository.rb +0 -54
- data/lib/droonga/planner_plugin.rb +0 -54
- data/lib/droonga/plugin/collector/search.rb +0 -98
- data/lib/droonga/plugin/planner/crud.rb +0 -49
- data/lib/droonga/plugin/planner/distributed_search_planner.rb +0 -393
- data/lib/droonga/plugin/planner/groonga.rb +0 -54
- data/lib/droonga/plugin_registerable.rb +0 -75
- data/test/command/suite/message/error/unknown-command.expected +0 -13
- data/test/unit/test_command_repository.rb +0 -39
- data/test/unit/test_legacy_plugin.rb +0 -50
- data/test/unit/test_legacy_plugin_repository.rb +0 -89
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 611f2ebd66b47ba06e51dcba81545e17dc8759fb
|
4
|
+
data.tar.gz: 60378c2f9a04272698fbb64bbeb104ab7dd49b76
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80eb92e66a2114940e77b7668941a2fd25d032d8caf1b3ca9752368b01027ed979049a4a90cfdcbb89a25e8ab85c3e91b7b9441da47fb2571a45b9e5fe271a71
|
7
|
+
data.tar.gz: a5dc67e0af98b68713b90ff8d15e8cf3923d86597d19777816a1a74391b5666295cfa74b3a569829b261e5eb629861cca79ecfcff3cbbb7259797f13e678a0e3
|
data/.dir-locals.el
ADDED
data/.travis.yml
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
notifications:
|
2
2
|
recipients:
|
3
3
|
- groonga-commit@lists.sourceforge.jp
|
4
|
+
env:
|
5
|
+
- DEFAULT_TEST_TASK=test:unit
|
6
|
+
- DEFAULT_TEST_TASK=test:command:default
|
7
|
+
- DEFAULT_TEST_TASK=test:command:version1
|
4
8
|
rvm:
|
5
9
|
- 1.9.3
|
6
10
|
- 2.0.0
|
7
|
-
- 2.1
|
8
|
-
- ruby-head
|
11
|
+
- 2.1
|
12
|
+
# - ruby-head
|
9
13
|
before_install:
|
10
14
|
- curl https://raw.github.com/groonga/groonga/master/data/travis/setup.sh | sh
|
data/README.md
CHANGED
@@ -1,18 +1,17 @@
|
|
1
1
|
# Fluent::Plugin::Droonga
|
2
2
|
|
3
|
-
|
3
|
+
## What's "Droonga"?
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
Droonga is a distributed fulltext search engine, named from "distributed-groonga".
|
8
|
-
This package provides droonga plugin for Fluent event collector.
|
5
|
+
Droonga is a scalable data processing engine, named from "Distributed
|
6
|
+
Groonga". Droonga can execute distributed fulltext search.
|
9
7
|
|
10
8
|
## Usage
|
11
9
|
|
12
|
-
|
10
|
+
See [droonga.org](http://droonga.org/). You can find overview, install
|
11
|
+
manual, reference manual and tutorial at the site.
|
13
12
|
|
14
13
|
## Copyright
|
15
14
|
|
16
|
-
* Copyright (c) 2013 Droonga Project
|
15
|
+
* Copyright (c) 2013-2014 Droonga Project
|
17
16
|
* License
|
18
17
|
* GNU Lesser General Public License version 2.1
|
data/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
#
|
3
|
-
# Copyright (C) 2013 Droonga Project
|
3
|
+
# Copyright (C) 2013-2014 Droonga Project
|
4
4
|
#
|
5
5
|
# This library is free software; you can redistribute it and/or
|
6
6
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -29,19 +29,36 @@ Packnga::DocumentTask.new(spec) do |task|
|
|
29
29
|
task.translate_languages = ["ja"]
|
30
30
|
end
|
31
31
|
|
32
|
+
def run_command_test(*options)
|
33
|
+
ruby(File.join(File.dirname(__FILE__), "test", "command", "run-test.rb",),
|
34
|
+
*options)
|
35
|
+
end
|
36
|
+
|
32
37
|
namespace :test do
|
33
38
|
desc "Run unit test"
|
34
39
|
task :unit do
|
35
40
|
ruby(File.join(File.dirname(__FILE__), "test", "unit", "run-test.rb"))
|
36
41
|
end
|
37
42
|
|
38
|
-
|
39
|
-
|
40
|
-
|
43
|
+
namespace :command do
|
44
|
+
desc "Run command test: default"
|
45
|
+
task :default do
|
46
|
+
run_command_test
|
47
|
+
end
|
48
|
+
|
49
|
+
desc "Run command test: version1"
|
50
|
+
task :version1 do
|
51
|
+
run_command_test("--config", "version1")
|
52
|
+
end
|
41
53
|
end
|
42
54
|
end
|
43
55
|
|
44
56
|
desc "Run test"
|
45
|
-
task :test => [
|
57
|
+
task :test => [
|
58
|
+
"test:unit",
|
59
|
+
"test:command:default",
|
60
|
+
"test:command:version1",
|
61
|
+
]
|
46
62
|
|
47
|
-
|
63
|
+
test_task = ENV["DEFAULT_TEST_TASK"] || "test"
|
64
|
+
task :default => test_task
|
@@ -17,10 +17,10 @@
|
|
17
17
|
|
18
18
|
Gem::Specification.new do |gem|
|
19
19
|
gem.name = "fluent-plugin-droonga"
|
20
|
-
gem.version = "0.
|
20
|
+
gem.version = "1.0.0"
|
21
21
|
gem.authors = ["Droonga Project"]
|
22
22
|
gem.email = ["droonga@groonga.org"]
|
23
|
-
gem.description = "Droonga(distributed Groonga) plugin for Fluent event collector"
|
23
|
+
gem.description = "Droonga (distributed Groonga) plugin for Fluent event collector"
|
24
24
|
gem.summary = gem.description
|
25
25
|
gem.homepage = "https://github.com/droonga/fluent-plugin-droonga"
|
26
26
|
gem.files = `git ls-files`.split($/)
|
data/lib/droonga/adapter.rb
CHANGED
@@ -14,15 +14,24 @@
|
|
14
14
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
15
15
|
|
16
16
|
require "droonga/pluggable"
|
17
|
-
require "droonga/
|
17
|
+
require "droonga/loggable"
|
18
|
+
require "droonga/plugin/metadata/adapter_input_message"
|
19
|
+
require "droonga/plugin/metadata/adapter_output_message"
|
20
|
+
require "droonga/error_messages"
|
18
21
|
|
19
22
|
module Droonga
|
20
23
|
class Adapter
|
21
24
|
extend Pluggable
|
25
|
+
include Loggable
|
26
|
+
include ErrorMessages
|
22
27
|
|
23
28
|
class << self
|
24
|
-
def
|
25
|
-
Plugin::Metadata::
|
29
|
+
def input_message
|
30
|
+
Plugin::Metadata::AdapterInputMessage.new(self)
|
31
|
+
end
|
32
|
+
|
33
|
+
def output_message
|
34
|
+
Plugin::Metadata::AdapterOutputMessage.new(self)
|
26
35
|
end
|
27
36
|
|
28
37
|
def id
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# License along with this library; if not, write to the Free Software
|
14
14
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
15
15
|
|
16
|
+
require "droonga/loggable"
|
16
17
|
require "droonga/message_matcher"
|
17
18
|
require "droonga/input_message"
|
18
19
|
require "droonga/output_message"
|
@@ -20,74 +21,78 @@ require "droonga/adapter"
|
|
20
21
|
|
21
22
|
module Droonga
|
22
23
|
class AdapterRunner
|
24
|
+
include Loggable
|
25
|
+
|
23
26
|
def initialize(dispatcher, plugins)
|
24
27
|
@dispatcher = dispatcher
|
25
28
|
default_plugins = ["error"]
|
26
29
|
plugins += (default_plugins - plugins)
|
30
|
+
logger.debug("activating plugins: #{plugins.join(", ")}")
|
27
31
|
@adapter_classes = Adapter.find_sub_classes(plugins)
|
32
|
+
logger.debug("activated:\n#{@adapter_classes.join("\n")}")
|
28
33
|
end
|
29
34
|
|
30
35
|
def shutdown
|
31
36
|
end
|
32
37
|
|
33
38
|
def adapt_input(message)
|
34
|
-
|
35
|
-
|
36
|
-
|
39
|
+
logger.trace("adapt_input: start",
|
40
|
+
:dataset => message["dataset"],
|
41
|
+
:type => message["type"])
|
37
42
|
adapted_message = message
|
38
43
|
adapted_message["appliedAdapters"] = []
|
39
44
|
@adapter_classes.each do |adapter_class|
|
40
45
|
adapter_class_id = adapter_class.id
|
41
|
-
pattern = adapter_class.
|
46
|
+
pattern = adapter_class.input_message.pattern
|
42
47
|
if pattern
|
43
48
|
matcher = MessageMatcher.new(pattern)
|
44
|
-
|
45
|
-
|
49
|
+
logger.trace("adapt_input: skip: #{adapter_class_id}",
|
50
|
+
:pattern => pattern)
|
46
51
|
next unless matcher.match?(adapted_message)
|
47
52
|
end
|
48
|
-
|
53
|
+
logger.trace("adapt_input: use: #{adapter_class_id}")
|
49
54
|
input_message = InputMessage.new(adapted_message)
|
50
55
|
adapter = adapter_class.new
|
51
56
|
adapter.adapt_input(input_message)
|
52
57
|
adapted_message = input_message.adapted_message
|
53
58
|
adapted_message["appliedAdapters"] << adapter_class_id
|
54
59
|
end
|
55
|
-
|
56
|
-
|
57
|
-
|
60
|
+
logger.trace("adapt_input: done",
|
61
|
+
:dataset => adapted_message["dataset"],
|
62
|
+
:type => adapted_message["type"])
|
58
63
|
adapted_message
|
59
64
|
end
|
60
65
|
|
61
66
|
def adapt_output(message)
|
62
|
-
|
63
|
-
|
64
|
-
|
67
|
+
logger.trace("adapt_output: start",
|
68
|
+
:dataset => message["dataset"],
|
69
|
+
:type => message["type"])
|
65
70
|
adapted_message = message
|
66
71
|
applied_adapters = adapted_message["appliedAdapters"]
|
67
72
|
@adapter_classes.reverse_each do |adapter_class|
|
68
73
|
adapter_class_id = adapter_class.id
|
69
74
|
if applied_adapters
|
70
|
-
|
71
|
-
|
72
|
-
|
75
|
+
logger.trace("adapt_output: skip: #{adapter_class_id}: " +
|
76
|
+
"input adapter wasn't applied",
|
77
|
+
:applied_adapters => applied_adapters)
|
73
78
|
next unless applied_adapters.include?(adapter_class.id)
|
74
79
|
end
|
75
|
-
pattern = adapter_class.
|
80
|
+
pattern = adapter_class.output_message.pattern
|
76
81
|
if pattern
|
77
82
|
matcher = MessageMatcher.new(pattern)
|
78
|
-
|
79
|
-
|
83
|
+
logger.trace("adapt_output: skip: #{adapter_class_id}",
|
84
|
+
:pattern => pattern)
|
80
85
|
next unless matcher.match?(adapted_message)
|
81
86
|
end
|
82
|
-
|
87
|
+
logger.trace("adapt_output: use: #{adapter_class_id}")
|
83
88
|
output_message = OutputMessage.new(adapted_message)
|
84
89
|
adapter = adapter_class.new
|
85
90
|
adapter.adapt_output(output_message)
|
86
91
|
adapted_message = output_message.adapted_message
|
87
92
|
end
|
88
|
-
|
89
|
-
|
90
|
-
|
93
|
+
logger.trace("adapt_output: done",
|
94
|
+
:dataset => adapted_message["dataset"],
|
95
|
+
:type => adapted_message["type"])
|
91
96
|
adapted_message
|
92
97
|
end
|
93
98
|
|
data/lib/droonga/catalog/base.rb
CHANGED
@@ -15,101 +15,18 @@
|
|
15
15
|
|
16
16
|
require "digest/sha1"
|
17
17
|
require "zlib"
|
18
|
-
require "
|
18
|
+
require "time"
|
19
|
+
require "droonga/error_messages"
|
20
|
+
require "droonga/catalog/errors"
|
19
21
|
|
20
22
|
module Droonga
|
21
23
|
module Catalog
|
22
24
|
class Base
|
23
|
-
attr_reader :base_path
|
24
|
-
def initialize(data,
|
25
|
+
attr_reader :path, :base_path
|
26
|
+
def initialize(data, path)
|
25
27
|
@data = data
|
26
|
-
@
|
27
|
-
|
28
|
-
@data["datasets"].each do |name, dataset|
|
29
|
-
number_of_partitions = dataset["number_of_partitions"]
|
30
|
-
next if number_of_partitions < 2
|
31
|
-
total_weight = compute_total_weight(dataset)
|
32
|
-
continuum = []
|
33
|
-
dataset["ring"].each do |key, value|
|
34
|
-
points = number_of_partitions * 160 * value["weight"] / total_weight
|
35
|
-
points.times do |point|
|
36
|
-
hash = Digest::SHA1.hexdigest("#{key}:#{point}")
|
37
|
-
continuum << [hash[0..7].to_i(16), key]
|
38
|
-
end
|
39
|
-
end
|
40
|
-
dataset["continuum"] = continuum.sort do |a, b| a[0] - b[0]; end
|
41
|
-
end
|
42
|
-
@options = @data["options"] || {}
|
43
|
-
end
|
44
|
-
|
45
|
-
def option(name)
|
46
|
-
@options[name]
|
47
|
-
end
|
48
|
-
|
49
|
-
def get_partitions(name)
|
50
|
-
device = @data["farms"][name]["device"]
|
51
|
-
pattern = Regexp.new("^#{name}\.")
|
52
|
-
results = {}
|
53
|
-
@data["datasets"].each do |key, dataset|
|
54
|
-
workers = dataset["workers"]
|
55
|
-
plugins = dataset["plugins"]
|
56
|
-
dataset["ring"].each do |key, part|
|
57
|
-
part["partitions"].each do |range, partitions|
|
58
|
-
partitions.each do |partition|
|
59
|
-
if partition =~ pattern
|
60
|
-
path = File.join([device, $POSTMATCH, "db"])
|
61
|
-
path = File.expand_path(path, base_path)
|
62
|
-
options = {
|
63
|
-
:database => path,
|
64
|
-
:n_workers => workers,
|
65
|
-
:plugins => plugins
|
66
|
-
}
|
67
|
-
results[partition] = options
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
return results
|
74
|
-
end
|
75
|
-
|
76
|
-
def get_routes(name, args)
|
77
|
-
routes = []
|
78
|
-
dataset = dataset(name)
|
79
|
-
case args["type"]
|
80
|
-
when "broadcast"
|
81
|
-
dataset["ring"].each do |key, partition|
|
82
|
-
select_range_and_replicas(partition, args, routes)
|
83
|
-
end
|
84
|
-
when "scatter"
|
85
|
-
name = get_partition(dataset, args["key"])
|
86
|
-
partition = dataset["ring"][name]
|
87
|
-
select_range_and_replicas(partition, args, routes)
|
88
|
-
end
|
89
|
-
return routes
|
90
|
-
end
|
91
|
-
|
92
|
-
def get_partition(dataset, key)
|
93
|
-
continuum = dataset["continuum"]
|
94
|
-
return dataset["ring"].keys[0] unless continuum
|
95
|
-
hash = Zlib.crc32(key)
|
96
|
-
min = 0
|
97
|
-
max = continuum.size - 1
|
98
|
-
while (min < max) do
|
99
|
-
index = (min + max) / 2
|
100
|
-
value, key = continuum[index]
|
101
|
-
return key if value == hash
|
102
|
-
if value > hash
|
103
|
-
max = index
|
104
|
-
else
|
105
|
-
min = index + 1
|
106
|
-
end
|
107
|
-
end
|
108
|
-
return continuum[max][1]
|
109
|
-
end
|
110
|
-
|
111
|
-
def datasets
|
112
|
-
@data["datasets"] || {}
|
28
|
+
@path = path
|
29
|
+
@base_path = File.dirname(path)
|
113
30
|
end
|
114
31
|
|
115
32
|
def have_dataset?(name)
|
@@ -119,27 +36,6 @@ module Droonga
|
|
119
36
|
def dataset(name)
|
120
37
|
datasets[name]
|
121
38
|
end
|
122
|
-
|
123
|
-
def select_range_and_replicas(partition, args, routes)
|
124
|
-
date_range = args["date_range"] || 0..-1
|
125
|
-
partition["partitions"].sort[date_range].each do |time, replicas|
|
126
|
-
case args["replica"]
|
127
|
-
when "top"
|
128
|
-
routes << replicas[0]
|
129
|
-
when "random"
|
130
|
-
routes << replicas[rand(replicas.size)]
|
131
|
-
when "all"
|
132
|
-
routes.concat(replicas)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
private
|
138
|
-
def compute_total_weight(dataset)
|
139
|
-
dataset["ring"].reduce(0) do |result, zone|
|
140
|
-
result + zone[1]["weight"]
|
141
|
-
end
|
142
|
-
end
|
143
39
|
end
|
144
40
|
end
|
145
41
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C)
|
1
|
+
# Copyright (C) 2014 Droonga Project
|
2
2
|
#
|
3
3
|
# This library is free software; you can redistribute it and/or
|
4
4
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -13,41 +13,29 @@
|
|
13
13
|
# License along with this library; if not, write to the Free Software
|
14
14
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
15
15
|
|
16
|
-
require "
|
16
|
+
require "droonga/catalog/schema"
|
17
17
|
|
18
18
|
module Droonga
|
19
19
|
module Catalog
|
20
20
|
class Dataset
|
21
|
-
def initialize(data)
|
21
|
+
def initialize(name, data)
|
22
|
+
@name = name
|
22
23
|
@data = data
|
24
|
+
@schema = nil
|
23
25
|
end
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
+
# provided for compatibility
|
28
|
+
def [](key)
|
29
|
+
@data[key]
|
27
30
|
end
|
28
31
|
|
29
|
-
|
30
|
-
def
|
31
|
-
|
32
|
-
return [] if number_of_partitions < 2
|
33
|
-
total_weight = compute_total_weight
|
34
|
-
continuum = []
|
35
|
-
@data["ring"].each do |key, value|
|
36
|
-
points = number_of_partitions * 160 * value["weight"] / total_weight
|
37
|
-
points.times do |point|
|
38
|
-
hash = Digest::SHA1.hexdigest("#{key}:#{point}")
|
39
|
-
continuum << [hash[0..7].to_i(16), key]
|
40
|
-
end
|
41
|
-
end
|
42
|
-
continuum.sort do |a, b|
|
43
|
-
a[0] - b[0]
|
44
|
-
end
|
32
|
+
# provided for compatibility
|
33
|
+
def []=(key, value)
|
34
|
+
@data[key] = value
|
45
35
|
end
|
46
36
|
|
47
|
-
def
|
48
|
-
@data["
|
49
|
-
result + zone[1]["weight"]
|
50
|
-
end
|
37
|
+
def schema
|
38
|
+
@schema ||= Droonga::Catalog::Schema.new(@name, @data["schema"])
|
51
39
|
end
|
52
40
|
end
|
53
41
|
end
|