riak-client 2.3.0 → 2.3.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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/.document +5 -5
  3. data/Gemfile +17 -17
  4. data/Guardfile +20 -20
  5. data/LICENSE.md +16 -16
  6. data/README.markdown +1 -1
  7. data/RELEASE_NOTES.md +9 -0
  8. data/lib/riak/client/beefcake/crdt/counter_loader.rb +18 -18
  9. data/lib/riak/client/beefcake/crdt/map_loader.rb +64 -64
  10. data/lib/riak/client/beefcake/footer +4 -4
  11. data/lib/riak/client/beefcake/header +6 -6
  12. data/lib/riak/client/beefcake/messages.rb +0 -16
  13. data/lib/riak/client/decaying.rb +36 -36
  14. data/lib/riak/client/feature_detection.rb +120 -120
  15. data/lib/riak/client/instrumentation.rb +19 -19
  16. data/lib/riak/client/node.rb +49 -49
  17. data/lib/riak/client/search.rb +27 -27
  18. data/lib/riak/conflict.rb +13 -13
  19. data/lib/riak/core_ext.rb +7 -7
  20. data/lib/riak/core_ext/blank.rb +53 -53
  21. data/lib/riak/core_ext/extract_options.rb +7 -7
  22. data/lib/riak/core_ext/json.rb +15 -15
  23. data/lib/riak/core_ext/slice.rb +18 -18
  24. data/lib/riak/core_ext/stringify_keys.rb +10 -10
  25. data/lib/riak/core_ext/symbolize_keys.rb +10 -10
  26. data/lib/riak/core_ext/to_param.rb +31 -31
  27. data/lib/riak/crdt.rb +21 -21
  28. data/lib/riak/crdt/operation.rb +19 -19
  29. data/lib/riak/encoding.rb +6 -6
  30. data/lib/riak/errors/backend_creation.rb +9 -9
  31. data/lib/riak/errors/connection_error.rb +50 -50
  32. data/lib/riak/errors/protobuffs_error.rb +11 -11
  33. data/lib/riak/i18n.rb +7 -7
  34. data/lib/riak/instrumentation.rb +6 -6
  35. data/lib/riak/json.rb +52 -52
  36. data/lib/riak/list_buckets.rb +28 -28
  37. data/lib/riak/locale/fr.yml +51 -51
  38. data/lib/riak/map_reduce/results.rb +49 -49
  39. data/lib/riak/map_reduce_error.rb +7 -7
  40. data/lib/riak/multiget.rb +122 -122
  41. data/lib/riak/stamp.rb +77 -77
  42. data/lib/riak/util/tcp_socket_extensions.rb +58 -58
  43. data/lib/riak/version.rb +1 -1
  44. data/spec/failover/failover.rb +59 -59
  45. data/spec/fixtures/bitcask.txt +25 -25
  46. data/spec/fixtures/multipart-basic-conflict.txt +15 -15
  47. data/spec/fixtures/multipart-blank.txt +7 -7
  48. data/spec/fixtures/multipart-mapreduce.txt +10 -10
  49. data/spec/fixtures/multipart-with-body.txt +16 -16
  50. data/spec/fixtures/multipart-with-marked-tombstones.txt +17 -17
  51. data/spec/fixtures/multipart-with-unmarked-tombstone.txt +16 -16
  52. data/spec/fixtures/server.cert.crt +15 -15
  53. data/spec/fixtures/server.cert.key +15 -15
  54. data/spec/fixtures/test.pem +1 -1
  55. data/spec/integration/riak/threading_spec.rb +150 -150
  56. data/spec/integration/yokozuna/index_spec.rb +61 -61
  57. data/spec/integration/yokozuna/schema_spec.rb +49 -49
  58. data/spec/riak/core_ext/to_param_spec.rb +15 -15
  59. data/spec/riak/crdt/inner_counter_spec.rb +21 -21
  60. data/spec/riak/crdt/inner_set_spec.rb +33 -33
  61. data/spec/riak/crdt/set_spec.rb +61 -61
  62. data/spec/riak/escape_spec.rb +72 -72
  63. data/spec/riak/feature_detection_spec.rb +77 -77
  64. data/spec/riak/index_collection_spec.rb +53 -53
  65. data/spec/riak/instrumentation_spec.rb +124 -124
  66. data/spec/riak/link_spec.rb +85 -85
  67. data/spec/riak/list_buckets_spec.rb +41 -41
  68. data/spec/riak/node_spec.rb +26 -26
  69. data/spec/riak/stamp_spec.rb +54 -54
  70. data/spec/support/certs/README.md +12 -12
  71. data/spec/support/certs/ca.crt +21 -21
  72. data/spec/support/certs/client.crl +13 -13
  73. data/spec/support/certs/client.crt +94 -94
  74. data/spec/support/certs/client.csr +18 -18
  75. data/spec/support/certs/client.key +27 -27
  76. data/spec/support/certs/empty_ca.crt +21 -21
  77. data/spec/support/certs/server.crl +13 -13
  78. data/spec/support/certs/server.crt +94 -94
  79. data/spec/support/certs/server.key +27 -27
  80. data/spec/support/integration_setup.rb +10 -10
  81. data/spec/support/test_client.yml.example +9 -9
  82. metadata +3 -3
@@ -1,11 +1,11 @@
1
- require 'riak/errors/base'
2
- module Riak
3
- class ProtobuffsError < Error
4
- end
5
-
6
- class ProtobuffsFailedHeader < ProtobuffsError
7
- def initialize
8
- super t('pbc.failed_header')
9
- end
10
- end
11
- end
1
+ require 'riak/errors/base'
2
+ module Riak
3
+ class ProtobuffsError < Error
4
+ end
5
+
6
+ class ProtobuffsFailedHeader < ProtobuffsError
7
+ def initialize
8
+ super t('pbc.failed_header')
9
+ end
10
+ end
11
+ end
data/lib/riak/i18n.rb CHANGED
@@ -1,7 +1,7 @@
1
- require 'i18n'
2
-
3
- I18n.config.enforce_available_locales = true unless I18n.config.enforce_available_locales == false
4
-
5
- Dir.glob(File.expand_path("../locale/*.yml", __FILE__)).each do |locale_file|
6
- I18n.load_path << locale_file
7
- end
1
+ require 'i18n'
2
+
3
+ I18n.config.enforce_available_locales = true unless I18n.config.enforce_available_locales == false
4
+
5
+ Dir.glob(File.expand_path("../locale/*.yml", __FILE__)).each do |locale_file|
6
+ I18n.load_path << locale_file
7
+ end
@@ -1,6 +1,6 @@
1
- begin
2
- require 'instrumentable'
3
- require 'riak/client/instrumentation'
4
- rescue LoadError => e
5
- # Go quietly into the night...(?)
6
- end
1
+ begin
2
+ require 'instrumentable'
3
+ require 'riak/client/instrumentation'
4
+ rescue LoadError => e
5
+ # Go quietly into the night...(?)
6
+ end
data/lib/riak/json.rb CHANGED
@@ -1,52 +1,52 @@
1
- require 'multi_json'
2
- if MultiJson.respond_to?(:adapter)
3
- MultiJson.adapter
4
- else
5
- MultiJson.engine # Force loading of an engine
6
- end
7
- require 'riak/core_ext/json'
8
-
9
- module Riak
10
- class << self
11
- # Options that will be passed to the JSON parser and encoder.
12
- # Defaults to `{:max_nesting => 20}`
13
- attr_accessor :json_options
14
- end
15
- self.json_options = {:max_nesting => 20}
16
-
17
- # JSON module for internal use inside riak-client
18
- module JSON
19
- class << self
20
- if MultiJson.respond_to?(:dump) # MultiJson 1.2 or later
21
- # Parse a JSON string
22
- # @param [String] str a JSON payload
23
- # @return [Array,Hash] a Ruby object decoded from the JSON payload
24
- def parse(str)
25
- MultiJson.load(str, Riak.json_options)
26
- end
27
-
28
- # Generate a JSON string
29
- # @param [Array, Hash] obj an object to JSON-encode
30
- # @return [String] a JSON payload
31
- def encode(obj)
32
- MultiJson.dump(obj)
33
- end
34
- else
35
- # Parse a JSON string
36
- # @param [String] str a JSON payload
37
- # @return [Array,Hash] a Ruby object decoded from the JSON payload
38
- def parse(str)
39
- MultiJson.decode(str, Riak.json_options)
40
- end
41
-
42
- # Generate a JSON string
43
- # @param [Array, Hash] obj an object to JSON-encode
44
- # @return [String] a JSON payload
45
- def encode(obj)
46
- MultiJson.encode(obj)
47
- end
48
- end
49
- alias :dump :encode
50
- end
51
- end
52
- end
1
+ require 'multi_json'
2
+ if MultiJson.respond_to?(:adapter)
3
+ MultiJson.adapter
4
+ else
5
+ MultiJson.engine # Force loading of an engine
6
+ end
7
+ require 'riak/core_ext/json'
8
+
9
+ module Riak
10
+ class << self
11
+ # Options that will be passed to the JSON parser and encoder.
12
+ # Defaults to `{:max_nesting => 20}`
13
+ attr_accessor :json_options
14
+ end
15
+ self.json_options = {:max_nesting => 20}
16
+
17
+ # JSON module for internal use inside riak-client
18
+ module JSON
19
+ class << self
20
+ if MultiJson.respond_to?(:dump) # MultiJson 1.2 or later
21
+ # Parse a JSON string
22
+ # @param [String] str a JSON payload
23
+ # @return [Array,Hash] a Ruby object decoded from the JSON payload
24
+ def parse(str)
25
+ MultiJson.load(str, Riak.json_options)
26
+ end
27
+
28
+ # Generate a JSON string
29
+ # @param [Array, Hash] obj an object to JSON-encode
30
+ # @return [String] a JSON payload
31
+ def encode(obj)
32
+ MultiJson.dump(obj)
33
+ end
34
+ else
35
+ # Parse a JSON string
36
+ # @param [String] str a JSON payload
37
+ # @return [Array,Hash] a Ruby object decoded from the JSON payload
38
+ def parse(str)
39
+ MultiJson.decode(str, Riak.json_options)
40
+ end
41
+
42
+ # Generate a JSON string
43
+ # @param [Array, Hash] obj an object to JSON-encode
44
+ # @return [String] a JSON payload
45
+ def encode(obj)
46
+ MultiJson.encode(obj)
47
+ end
48
+ end
49
+ alias :dump :encode
50
+ end
51
+ end
52
+ end
@@ -1,28 +1,28 @@
1
- module Riak
2
- class ListBuckets
3
- def initialize(client, options, block)
4
- @client = client
5
- @block = block
6
- @options = options
7
- perform_request
8
- end
9
-
10
- def perform_request
11
- @client.backend do |be|
12
- be.list_buckets @options, &wrapped_block
13
- end
14
- end
15
-
16
- private
17
-
18
- def wrapped_block
19
- proc do |bucket_names|
20
- next if bucket_names.nil?
21
- bucket_names.each do |bucket_name|
22
- bucket = @client.bucket bucket_name
23
- @block.call bucket
24
- end
25
- end
26
- end
27
- end
28
- end
1
+ module Riak
2
+ class ListBuckets
3
+ def initialize(client, options, block)
4
+ @client = client
5
+ @block = block
6
+ @options = options
7
+ perform_request
8
+ end
9
+
10
+ def perform_request
11
+ @client.backend do |be|
12
+ be.list_buckets @options, &wrapped_block
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def wrapped_block
19
+ proc do |bucket_names|
20
+ next if bucket_names.nil?
21
+ bucket_names.each do |bucket_name|
22
+ bucket = @client.bucket bucket_name
23
+ @block.call bucket
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,51 +1,51 @@
1
- fr:
2
- riak:
3
- backwards_clock: "L'horloge système a reculé. La génération des ID échouera pour les %{delay} millisecondes à venir."
4
- bucket_link_conversion: "Ne peut convertir un lien de bucket vers un walk spec"
5
- client_type: "argument invalide : %{client} n'est pas un Riak::Client"
6
- conflict_resolver_invalid: "Le résolveur (%{resolver}) n'a pas répondu à :call"
7
- content_type_undefined: "content_type n'est pas défini !"
8
- deprecated:
9
- port: "DEPRECATION: Riak::Client#port ne doit plus être utilisé (deprecated), utilisez #http_port ou #pb_port pour spécifier le protocol.\n%{backtrace}"
10
- search: "DEPRECATION: Les fonctionnalités Riak Search sont désormais inclues dans le client principal. Vous n'avez plus besoin d'inclure 'riak/search'.\n%{backtrace}"
11
- empty_map_reduce_query: "Spécifiez une ou plusieurs requêtes pour MapReduce."
12
- failed_request: "La requête client a échouée."
13
- filter_needs_block: "Le filtre %{filter} nécessite un bloc."
14
- filter_arity_mismatch: "Le filtre %{filter} nécessite %{expected} arguments. Seulement %{received} ont été fournis."
15
- full_bucket_mapred: "Les MapReduce sur un bucket complet, y compris les filtres de clé, invoque 'list-keys' qui est une opération coûteuse et ne doit pas être utilisée en production.\n %{backtrace}"
16
- hash_type: "argument invalide : %{hash} n'est pas un Hash"
17
- http_configuration: "Le moteur HTTP %{backend} ne peut être utilisé. Merci de vérifier ses dépendances et/ou sa configuration."
18
- http_failed_request: "%{expected} attendu depuis Riak mais %{code} reçu. %{body}"
19
- hostname_invalid: "host doit être un nom d'hôte valide"
20
- protocol_invalid: "'%{invalid}' n'est pas un protocole valide. Les valeurs possibles sont %{valid}"
21
- invalid_basic_auth: "L'authentification basique doit être utilisée comme ceci : 'user:pass'"
22
- invalid_client_id: "ID client invalide, doit être une chaîne ou un entier entre 0 et %{max_id}"
23
- invalid_io_object: "Object de type IO invalide assigné à RObject#data. Il devrait plutôt être assigné à raw_data"
24
- invalid_function_value: "Valeur invalide pour la fonction : %{value}"
25
- invalid_options: "Options de configuration invalides."
26
- invalid_phase_type: "type doit être :map, :reduce, ou :link"
27
- invalid_ssl_verify_mode: "%{invalid} n'est pas une option :verify_mode valide pour SSL. Les options valides sont 'peer' and 'none'."
28
- invalid_index_query: "%{value} n'est pas un term de requête valide. Seules les String, Integer et Range de ces types sont autorisés"
29
- indexes_unsupported: "Le serveur Riak ne supporte pas les index secondaires."
30
- loading_bucket: "pendant le chargement du bucket '%{name}'"
31
- list_buckets: "Riak::Client#buckets est une opération coûteuse et ne doit pas être utilisée en production.\n %{backtrace}"
32
- list_keys: "Riak::Bucket#keys est une opération coûteuse et ne doit pas être utilisée en production.\n %{backtrace}"
33
- missing_block: "Un bloc doit être fourni."
34
- missing_host_and_port: "Vous devez spécifier un hôte et un port, utiliser la valeur par défaut : 127.0.0.1:8098"
35
- module_function_pair_required: "la fonction doit avoir deux élément lorsqu'elle est définie par un tableau"
36
- not_found: "L'objet demandé n'a pas été trouvé."
37
- no_pipes: "Ne peut trouver ou ne peut ouvrir un pipe pour la console Riak dans %{path}."
38
- port_invalid: "le port doit être un entier entre 0 et 65535"
39
- protobuffs_failed_request: "Riak a retourné le code d'erreur %{code} au lieu d'une réponse réussie. %{body}"
40
- request_body_type: "Le corps de la requête doit être une chaine ou répondre à :read."
41
- search_unsupported: "Le serveur Riak ne supporte pas la recherche."
42
- search_docs_require_id: "Search index documents must include the 'id' field."
43
- search_remove_requires_id_or_query: "Les documents d'index de recherche doivent avoir des clés 'id' ou 'query'"
44
- serializer_not_implemented: "Aucun sérialiseur n'a été défini pour le type de contenu %{content_type}"
45
- source_and_root_required: "La configuration de Riak::Node configuration doit inclure les clés :source and :root."
46
- stale_write_prevented: "Le client a empêché une écriture périmée."
47
- stored_function_invalid: "Une fonction définie par un hash doit avoir :bucket et :key"
48
- string_type: "invalid_argument %{string} n'est pas une String"
49
- too_few_arguments: "pas assez d'arguments : %{params}"
50
- walk_spec_invalid_unless_link: "Le WalkSpec n'est valide pour une fonction que lorsque le type est :link"
51
- wrong_argument_count_walk_spec: "nombre d'argument invalide (un Hash ou bucket,tag,keep requis)"
1
+ fr:
2
+ riak:
3
+ backwards_clock: "L'horloge système a reculé. La génération des ID échouera pour les %{delay} millisecondes à venir."
4
+ bucket_link_conversion: "Ne peut convertir un lien de bucket vers un walk spec"
5
+ client_type: "argument invalide : %{client} n'est pas un Riak::Client"
6
+ conflict_resolver_invalid: "Le résolveur (%{resolver}) n'a pas répondu à :call"
7
+ content_type_undefined: "content_type n'est pas défini !"
8
+ deprecated:
9
+ port: "DEPRECATION: Riak::Client#port ne doit plus être utilisé (deprecated), utilisez #http_port ou #pb_port pour spécifier le protocol.\n%{backtrace}"
10
+ search: "DEPRECATION: Les fonctionnalités Riak Search sont désormais inclues dans le client principal. Vous n'avez plus besoin d'inclure 'riak/search'.\n%{backtrace}"
11
+ empty_map_reduce_query: "Spécifiez une ou plusieurs requêtes pour MapReduce."
12
+ failed_request: "La requête client a échouée."
13
+ filter_needs_block: "Le filtre %{filter} nécessite un bloc."
14
+ filter_arity_mismatch: "Le filtre %{filter} nécessite %{expected} arguments. Seulement %{received} ont été fournis."
15
+ full_bucket_mapred: "Les MapReduce sur un bucket complet, y compris les filtres de clé, invoque 'list-keys' qui est une opération coûteuse et ne doit pas être utilisée en production.\n %{backtrace}"
16
+ hash_type: "argument invalide : %{hash} n'est pas un Hash"
17
+ http_configuration: "Le moteur HTTP %{backend} ne peut être utilisé. Merci de vérifier ses dépendances et/ou sa configuration."
18
+ http_failed_request: "%{expected} attendu depuis Riak mais %{code} reçu. %{body}"
19
+ hostname_invalid: "host doit être un nom d'hôte valide"
20
+ protocol_invalid: "'%{invalid}' n'est pas un protocole valide. Les valeurs possibles sont %{valid}"
21
+ invalid_basic_auth: "L'authentification basique doit être utilisée comme ceci : 'user:pass'"
22
+ invalid_client_id: "ID client invalide, doit être une chaîne ou un entier entre 0 et %{max_id}"
23
+ invalid_io_object: "Object de type IO invalide assigné à RObject#data. Il devrait plutôt être assigné à raw_data"
24
+ invalid_function_value: "Valeur invalide pour la fonction : %{value}"
25
+ invalid_options: "Options de configuration invalides."
26
+ invalid_phase_type: "type doit être :map, :reduce, ou :link"
27
+ invalid_ssl_verify_mode: "%{invalid} n'est pas une option :verify_mode valide pour SSL. Les options valides sont 'peer' and 'none'."
28
+ invalid_index_query: "%{value} n'est pas un term de requête valide. Seules les String, Integer et Range de ces types sont autorisés"
29
+ indexes_unsupported: "Le serveur Riak ne supporte pas les index secondaires."
30
+ loading_bucket: "pendant le chargement du bucket '%{name}'"
31
+ list_buckets: "Riak::Client#buckets est une opération coûteuse et ne doit pas être utilisée en production.\n %{backtrace}"
32
+ list_keys: "Riak::Bucket#keys est une opération coûteuse et ne doit pas être utilisée en production.\n %{backtrace}"
33
+ missing_block: "Un bloc doit être fourni."
34
+ missing_host_and_port: "Vous devez spécifier un hôte et un port, utiliser la valeur par défaut : 127.0.0.1:8098"
35
+ module_function_pair_required: "la fonction doit avoir deux élément lorsqu'elle est définie par un tableau"
36
+ not_found: "L'objet demandé n'a pas été trouvé."
37
+ no_pipes: "Ne peut trouver ou ne peut ouvrir un pipe pour la console Riak dans %{path}."
38
+ port_invalid: "le port doit être un entier entre 0 et 65535"
39
+ protobuffs_failed_request: "Riak a retourné le code d'erreur %{code} au lieu d'une réponse réussie. %{body}"
40
+ request_body_type: "Le corps de la requête doit être une chaine ou répondre à :read."
41
+ search_unsupported: "Le serveur Riak ne supporte pas la recherche."
42
+ search_docs_require_id: "Search index documents must include the 'id' field."
43
+ search_remove_requires_id_or_query: "Les documents d'index de recherche doivent avoir des clés 'id' ou 'query'"
44
+ serializer_not_implemented: "Aucun sérialiseur n'a été défini pour le type de contenu %{content_type}"
45
+ source_and_root_required: "La configuration de Riak::Node configuration doit inclure les clés :source and :root."
46
+ stale_write_prevented: "Le client a empêché une écriture périmée."
47
+ stored_function_invalid: "Une fonction définie par un hash doit avoir :bucket et :key"
48
+ string_type: "invalid_argument %{string} n'est pas une String"
49
+ too_few_arguments: "pas assez d'arguments : %{params}"
50
+ walk_spec_invalid_unless_link: "Le WalkSpec n'est valide pour une fonction que lorsque le type est :link"
51
+ wrong_argument_count_walk_spec: "nombre d'argument invalide (un Hash ou bucket,tag,keep requis)"
@@ -1,49 +1,49 @@
1
- module Riak
2
- class MapReduce
3
- # @api private
4
- # Collects and normalizes results from MapReduce requests
5
- class Results
6
- # Creates a new result collector
7
- # @param [MapReduce] mr the MapReduce query
8
- def initialize(mr)
9
- @keep_count = mr.query.select {|p| p.keep }.size
10
- @hash = create_results_hash(mr.query)
11
- end
12
-
13
- # Adds a new result to the collector
14
- # @param [Fixnum] phase the phase index
15
- # @param [Array] result the phase result
16
- def add(phase, result)
17
- @hash[phase] += result
18
- end
19
-
20
- # Coalesces the query results
21
- # @return [Array] the query results, coalesced according to the
22
- # phase configuration
23
- def report
24
- if @keep_count > 1
25
- @hash.to_a.sort.map {|(num, results)| results }
26
- else
27
- @hash[@hash.keys.first]
28
- end
29
- end
30
-
31
- private
32
- def create_results_hash(query)
33
- # When the query is empty, only bucket/key pairs are returned,
34
- # but implicitly in phase 0.
35
- return { 0 => [] } if query.empty?
36
-
37
- # Pre-populate the hash with empty results for kept phases.
38
- # Additionally, the last phase is always implictly kept, even
39
- # when keep is false.
40
- query.inject({}) do |hash, phase|
41
- if phase.keep || query[-1] == phase
42
- hash[query.index(phase)] = []
43
- end
44
- hash
45
- end
46
- end
47
- end
48
- end
49
- end
1
+ module Riak
2
+ class MapReduce
3
+ # @api private
4
+ # Collects and normalizes results from MapReduce requests
5
+ class Results
6
+ # Creates a new result collector
7
+ # @param [MapReduce] mr the MapReduce query
8
+ def initialize(mr)
9
+ @keep_count = mr.query.select {|p| p.keep }.size
10
+ @hash = create_results_hash(mr.query)
11
+ end
12
+
13
+ # Adds a new result to the collector
14
+ # @param [Fixnum] phase the phase index
15
+ # @param [Array] result the phase result
16
+ def add(phase, result)
17
+ @hash[phase] += result
18
+ end
19
+
20
+ # Coalesces the query results
21
+ # @return [Array] the query results, coalesced according to the
22
+ # phase configuration
23
+ def report
24
+ if @keep_count > 1
25
+ @hash.to_a.sort.map {|(num, results)| results }
26
+ else
27
+ @hash[@hash.keys.first]
28
+ end
29
+ end
30
+
31
+ private
32
+ def create_results_hash(query)
33
+ # When the query is empty, only bucket/key pairs are returned,
34
+ # but implicitly in phase 0.
35
+ return { 0 => [] } if query.empty?
36
+
37
+ # Pre-populate the hash with empty results for kept phases.
38
+ # Additionally, the last phase is always implictly kept, even
39
+ # when keep is false.
40
+ query.inject({}) do |hash, phase|
41
+ if phase.keep || query[-1] == phase
42
+ hash[query.index(phase)] = []
43
+ end
44
+ hash
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,7 +1,7 @@
1
- require 'riak/util/translation'
2
-
3
- module Riak
4
- # Raised when an error occurred in the Javascript map-reduce chain.
5
- # The message will be the body of the JSON error response.
6
- class MapReduceError < StandardError; end
7
- end
1
+ require 'riak/util/translation'
2
+
3
+ module Riak
4
+ # Raised when an error occurred in the Javascript map-reduce chain.
5
+ # The message will be the body of the JSON error response.
6
+ class MapReduceError < StandardError; end
7
+ end
data/lib/riak/multiget.rb CHANGED
@@ -1,122 +1,122 @@
1
- require 'riak/client'
2
- require 'riak/bucket'
3
-
4
- module Riak
5
- # Coordinates a parallel fetch operation for multiple values.
6
- class Multiget
7
- include Util::Translation
8
-
9
- # @return [Riak::Client] the associated client
10
- attr_reader :client
11
-
12
- # @return [Array<Bucket, String>] fetch_list an {Array} of {Bucket} and {String} keys to fetch
13
- attr_reader :fetch_list
14
-
15
- # @return [Hash<fetch_list_entry, RObject] result_hash a {Hash} of {Bucket} and {String} key pairs to {RObject} instances
16
- attr_accessor :result_hash
17
-
18
- # @return [Boolean] finished if the fetch operation has completed
19
- attr_reader :finished
20
-
21
- # @return [Integer] The number of threads to use
22
- attr_accessor :thread_count
23
-
24
- # Perform a Riak Multiget operation.
25
- # @param [Client] client the {Riak::Client} that will perform the multiget
26
- # @param [Array<Bucket, String>] fetch_list an {Array} of {Bucket} and {String} keys to fetch
27
- # @return [Hash<fetch_list_entry, RObject] result_hash a {Hash} of {Bucket} and {String} key pairs to {RObject} instances
28
- def self.get_all(client, fetch_list)
29
- multi = new client, fetch_list
30
- multi.fetch
31
- multi.results
32
- end
33
-
34
- # Create a Riak Multiget operation.
35
- # @param [Client] client the {Riak::Client} that will perform the multiget
36
- # @param [Array<Bucket, String>] fetch_list an {Array} of {Bucket} and {String} keys to fetch
37
- def initialize(client, fetch_list)
38
- raise ArgumentError, t('client_type', :client => client.inspect) unless client.is_a? Riak::Client
39
- raise ArgumentError, t('array_type', :array => fetch_list.inspect) unless fetch_list.is_a? Array
40
-
41
- validate_fetch_list fetch_list
42
- @client, @fetch_list = client, fetch_list.uniq
43
- self.result_hash = Hash.new
44
- @finished = false
45
- self.thread_count = client.multiget_threads
46
- end
47
-
48
- # Starts the parallelized fetch operation
49
- # @raise [ArgumentError] when a non-positive-Integer count is given
50
- def fetch
51
- queue = fetch_list.dup
52
- queue_mutex = Mutex.new
53
- result_mutex = Mutex.new
54
-
55
- unless thread_count.is_a?(Integer) && thread_count > 0
56
- raise ArgumentError, t("invalid_multiget_thread_count")
57
- end
58
-
59
- @threads = 1.upto(thread_count).map do |_node|
60
- Thread.new do
61
- loop do
62
- pair = queue_mutex.synchronize do
63
- queue.shift
64
- end
65
-
66
- break if pair.nil?
67
-
68
- found = attempt_fetch(*pair)
69
- result_mutex.synchronize do
70
- result_hash[pair] = found
71
- end
72
- end
73
- end
74
- end
75
- end
76
-
77
- def results
78
- wait_for_finish
79
- result_hash
80
- end
81
-
82
- def finished?
83
- set_finished_for_thread_liveness
84
- finished
85
- end
86
-
87
- def wait_for_finish
88
- return if finished?
89
- @threads.each {|t| t.join }
90
- @finished = true
91
- end
92
-
93
- private
94
-
95
- def attempt_fetch(bucket, key)
96
- bucket[key]
97
- rescue Riak::FailedRequest => e
98
- raise e unless e.not_found?
99
- nil
100
- end
101
-
102
- def set_finished_for_thread_liveness
103
- return if @finished # already done
104
-
105
- all_dead = @threads.none? {|t| t.alive? }
106
- return unless all_dead # still working
107
-
108
- @finished = true
109
- return
110
- end
111
-
112
- def validate_fetch_list(fetch_list)
113
- return unless erroneous = fetch_list.detect do |e|
114
- bucket, key = e
115
- next true unless bucket.is_a? Bucket
116
- next true unless key.is_a? String
117
- end
118
-
119
- raise ArgumentError, t('fetch_list_type', :problem => erroneous)
120
- end
121
- end
122
- end
1
+ require 'riak/client'
2
+ require 'riak/bucket'
3
+
4
+ module Riak
5
+ # Coordinates a parallel fetch operation for multiple values.
6
+ class Multiget
7
+ include Util::Translation
8
+
9
+ # @return [Riak::Client] the associated client
10
+ attr_reader :client
11
+
12
+ # @return [Array<Bucket, String>] fetch_list an {Array} of {Bucket} and {String} keys to fetch
13
+ attr_reader :fetch_list
14
+
15
+ # @return [Hash<fetch_list_entry, RObject] result_hash a {Hash} of {Bucket} and {String} key pairs to {RObject} instances
16
+ attr_accessor :result_hash
17
+
18
+ # @return [Boolean] finished if the fetch operation has completed
19
+ attr_reader :finished
20
+
21
+ # @return [Integer] The number of threads to use
22
+ attr_accessor :thread_count
23
+
24
+ # Perform a Riak Multiget operation.
25
+ # @param [Client] client the {Riak::Client} that will perform the multiget
26
+ # @param [Array<Bucket, String>] fetch_list an {Array} of {Bucket} and {String} keys to fetch
27
+ # @return [Hash<fetch_list_entry, RObject] result_hash a {Hash} of {Bucket} and {String} key pairs to {RObject} instances
28
+ def self.get_all(client, fetch_list)
29
+ multi = new client, fetch_list
30
+ multi.fetch
31
+ multi.results
32
+ end
33
+
34
+ # Create a Riak Multiget operation.
35
+ # @param [Client] client the {Riak::Client} that will perform the multiget
36
+ # @param [Array<Bucket, String>] fetch_list an {Array} of {Bucket} and {String} keys to fetch
37
+ def initialize(client, fetch_list)
38
+ raise ArgumentError, t('client_type', :client => client.inspect) unless client.is_a? Riak::Client
39
+ raise ArgumentError, t('array_type', :array => fetch_list.inspect) unless fetch_list.is_a? Array
40
+
41
+ validate_fetch_list fetch_list
42
+ @client, @fetch_list = client, fetch_list.uniq
43
+ self.result_hash = Hash.new
44
+ @finished = false
45
+ self.thread_count = client.multiget_threads
46
+ end
47
+
48
+ # Starts the parallelized fetch operation
49
+ # @raise [ArgumentError] when a non-positive-Integer count is given
50
+ def fetch
51
+ queue = fetch_list.dup
52
+ queue_mutex = Mutex.new
53
+ result_mutex = Mutex.new
54
+
55
+ unless thread_count.is_a?(Integer) && thread_count > 0
56
+ raise ArgumentError, t("invalid_multiget_thread_count")
57
+ end
58
+
59
+ @threads = 1.upto(thread_count).map do |_node|
60
+ Thread.new do
61
+ loop do
62
+ pair = queue_mutex.synchronize do
63
+ queue.shift
64
+ end
65
+
66
+ break if pair.nil?
67
+
68
+ found = attempt_fetch(*pair)
69
+ result_mutex.synchronize do
70
+ result_hash[pair] = found
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ def results
78
+ wait_for_finish
79
+ result_hash
80
+ end
81
+
82
+ def finished?
83
+ set_finished_for_thread_liveness
84
+ finished
85
+ end
86
+
87
+ def wait_for_finish
88
+ return if finished?
89
+ @threads.each {|t| t.join }
90
+ @finished = true
91
+ end
92
+
93
+ private
94
+
95
+ def attempt_fetch(bucket, key)
96
+ bucket[key]
97
+ rescue Riak::FailedRequest => e
98
+ raise e unless e.not_found?
99
+ nil
100
+ end
101
+
102
+ def set_finished_for_thread_liveness
103
+ return if @finished # already done
104
+
105
+ all_dead = @threads.none? {|t| t.alive? }
106
+ return unless all_dead # still working
107
+
108
+ @finished = true
109
+ return
110
+ end
111
+
112
+ def validate_fetch_list(fetch_list)
113
+ return unless erroneous = fetch_list.detect do |e|
114
+ bucket, key = e
115
+ next true unless bucket.is_a? Bucket
116
+ next true unless key.is_a? String
117
+ end
118
+
119
+ raise ArgumentError, t('fetch_list_type', :problem => erroneous)
120
+ end
121
+ end
122
+ end