aerospike 2.29.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/README.md +13 -9
- data/lib/aerospike/batch_attr.rb +292 -0
- data/lib/aerospike/batch_delete.rb +48 -0
- data/lib/aerospike/batch_read.rb +97 -0
- data/lib/aerospike/batch_record.rb +83 -0
- data/lib/aerospike/batch_results.rb +38 -0
- data/lib/aerospike/batch_udf.rb +76 -0
- data/lib/aerospike/batch_write.rb +79 -0
- data/lib/aerospike/cdt/bit_operation.rb +4 -5
- data/lib/aerospike/cdt/map_operation.rb +24 -10
- data/lib/aerospike/cdt/map_policy.rb +6 -3
- data/lib/aerospike/cdt/map_return_type.rb +8 -0
- data/lib/aerospike/client.rb +39 -56
- data/lib/aerospike/cluster.rb +50 -46
- data/lib/aerospike/command/batch_index_command.rb +7 -11
- data/lib/aerospike/command/batch_index_node.rb +3 -4
- data/lib/aerospike/command/batch_operate_command.rb +151 -0
- data/lib/aerospike/command/batch_operate_node.rb +51 -0
- data/lib/aerospike/command/command.rb +231 -128
- data/lib/aerospike/exp/exp.rb +54 -27
- data/lib/aerospike/exp/exp_bit.rb +24 -24
- data/lib/aerospike/exp/exp_hll.rb +12 -12
- data/lib/aerospike/exp/exp_list.rb +101 -86
- data/lib/aerospike/exp/exp_map.rb +118 -110
- data/lib/aerospike/exp/operation.rb +2 -2
- data/lib/aerospike/info.rb +2 -4
- data/lib/aerospike/node.rb +20 -3
- data/lib/aerospike/operation.rb +38 -0
- data/lib/aerospike/policy/batch_delete_policy.rb +71 -0
- data/lib/aerospike/policy/batch_policy.rb +53 -4
- data/lib/aerospike/{command/batch_direct_node.rb → policy/batch_read_policy.rb} +17 -19
- data/lib/aerospike/policy/batch_udf_policy.rb +75 -0
- data/lib/aerospike/policy/batch_write_policy.rb +105 -0
- data/lib/aerospike/policy/policy.rb +3 -40
- data/lib/aerospike/query/query_command.rb +3 -205
- data/lib/aerospike/query/query_executor.rb +2 -2
- data/lib/aerospike/query/query_partition_command.rb +4 -230
- data/lib/aerospike/query/scan_executor.rb +2 -2
- data/lib/aerospike/query/scan_partition_command.rb +3 -3
- data/lib/aerospike/query/server_command.rb +2 -2
- data/lib/aerospike/query/statement.rb +5 -21
- data/lib/aerospike/task/execute_task.rb +2 -2
- data/lib/aerospike/utils/buffer.rb +15 -15
- data/lib/aerospike/version.rb +1 -1
- data/lib/aerospike.rb +13 -12
- metadata +16 -14
- data/lib/aerospike/command/batch_direct_command.rb +0 -105
- data/lib/aerospike/command/batch_direct_exists_command.rb +0 -51
- data/lib/aerospike/query/pred_exp/and_or.rb +0 -32
- data/lib/aerospike/query/pred_exp/geo_json_value.rb +0 -41
- data/lib/aerospike/query/pred_exp/integer_value.rb +0 -32
- data/lib/aerospike/query/pred_exp/op.rb +0 -27
- data/lib/aerospike/query/pred_exp/regex.rb +0 -32
- data/lib/aerospike/query/pred_exp/regex_flags.rb +0 -23
- data/lib/aerospike/query/pred_exp/string_value.rb +0 -29
- data/lib/aerospike/query/pred_exp.rb +0 -192
@@ -0,0 +1,76 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright 2014-2024 Aerospike, Inc.
|
3
|
+
#
|
4
|
+
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
5
|
+
# license agreements.
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License") you may not
|
8
|
+
# use this file except in compliance with the License. You may obtain a copy of
|
9
|
+
# the License at http:#www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
13
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
14
|
+
# License for the specific language governing permissions and limitations under
|
15
|
+
# the License.
|
16
|
+
|
17
|
+
# Batch key and read only operations with default policy.
|
18
|
+
# Used in batch read commands where different bins are needed for each key.
|
19
|
+
|
20
|
+
module Aerospike
|
21
|
+
|
22
|
+
# Batch user defined functions.
|
23
|
+
class BatchUDF < BatchRecord
|
24
|
+
|
25
|
+
# Optional UDF policy.
|
26
|
+
attr_accessor :policy
|
27
|
+
|
28
|
+
# Package or lua module name.
|
29
|
+
attr_accessor :package_name
|
30
|
+
|
31
|
+
# Lua function name.
|
32
|
+
attr_accessor :function_name
|
33
|
+
|
34
|
+
# Optional arguments to lua function.
|
35
|
+
attr_accessor :function_args
|
36
|
+
|
37
|
+
# Wire protocol bytes for function args. For internal use only.
|
38
|
+
attr_reader :arg_bytes
|
39
|
+
|
40
|
+
# Constructor using default policy.
|
41
|
+
def initialize(key, package_name, function_name, function_args, opt = {})
|
42
|
+
super(key, has_write: true)
|
43
|
+
@policy = BatchRecord.create_policy(opt, BatchUDFPolicy, DEFAULT_BATCH_UDF_POLICY)
|
44
|
+
@package_name = package_name
|
45
|
+
@function_name = function_name
|
46
|
+
@function_args = ListValue.new(function_args)
|
47
|
+
# Do not set arg_bytes here because may not be necessary if batch repeat flag is used.
|
48
|
+
end
|
49
|
+
|
50
|
+
# Optimized reference equality check to determine batch wire protocol repeat flag.
|
51
|
+
# For internal use only.
|
52
|
+
def ==(other) # :nodoc:
|
53
|
+
other && other.instance_of?(self.class) &&
|
54
|
+
@function_name == other.function_name && @function_args == other.function_args &&
|
55
|
+
@package_name == other.package_name && @policy == other.policy
|
56
|
+
end
|
57
|
+
|
58
|
+
DEFAULT_BATCH_UDF_POLICY = BatchUDFPolicy.new
|
59
|
+
|
60
|
+
# Return wire protocol size. For internal use only.
|
61
|
+
def size # :nodoc:
|
62
|
+
size = 6 # gen(2) + exp(4) = 6
|
63
|
+
|
64
|
+
size += @policy&.filter_exp&.size if @policy&.filter_exp
|
65
|
+
|
66
|
+
if @policy&.send_key
|
67
|
+
size += @key.user_key.estimate_size + Aerospike::FIELD_HEADER_SIZE + 1
|
68
|
+
end
|
69
|
+
size += @package_name.bytesize + Aerospike::FIELD_HEADER_SIZE
|
70
|
+
size += @function_name.bytesize + Aerospike::FIELD_HEADER_SIZE
|
71
|
+
@arg_bytes = @function_args.to_bytes
|
72
|
+
size += @arg_bytes.bytesize + Aerospike::FIELD_HEADER_SIZE
|
73
|
+
size
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright 2014-2024 Aerospike, Inc.
|
3
|
+
#
|
4
|
+
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
5
|
+
# license agreements.
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License") you may not
|
8
|
+
# use this file except in compliance with the License. You may obtain a copy of
|
9
|
+
# the License at http:#www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
13
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
14
|
+
# License for the specific language governing permissions and limitations under
|
15
|
+
# the License.
|
16
|
+
|
17
|
+
# Batch key and read only operations with default policy.
|
18
|
+
# Used in batch read commands where different bins are needed for each key.
|
19
|
+
|
20
|
+
module Aerospike
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
# Batch key and read/write operations with write policy.
|
25
|
+
class BatchWrite < BatchRecord
|
26
|
+
# Optional write policy.
|
27
|
+
attr_accessor :policy
|
28
|
+
|
29
|
+
# Required operations for this key.
|
30
|
+
attr_accessor :ops
|
31
|
+
|
32
|
+
# Initialize batch key and read/write operations.
|
33
|
+
#
|
34
|
+
# {Operation#get()} is not allowed because it returns a variable number of bins and
|
35
|
+
# makes it difficult (sometimes impossible) to lineup operations with results. Instead,
|
36
|
+
# use {Operation#get(bin_name)} for each bin name.
|
37
|
+
def initialize(key, ops, opt = {})
|
38
|
+
super(key, has_write: true)
|
39
|
+
@policy = BatchRecord.create_policy(opt, BatchWritePolicy, DEFAULT_BATCH_WRITE_POLICY)
|
40
|
+
@ops = ops
|
41
|
+
end
|
42
|
+
|
43
|
+
# Optimized reference equality check to determine batch wire protocol repeat flag.
|
44
|
+
# For internal use only.
|
45
|
+
def ==(other) # :nodoc:
|
46
|
+
other && other.instance_of?(self.class) &&
|
47
|
+
@ops == other.ops && @policy == other.policy && (@policy.nil? || !@policy.send_key)
|
48
|
+
end
|
49
|
+
|
50
|
+
DEFAULT_BATCH_WRITE_POLICY = BatchWritePolicy.new
|
51
|
+
|
52
|
+
# Return wire protocol size. For internal use only.
|
53
|
+
def size # :nodoc:
|
54
|
+
size = 6 # gen(2) + exp(4) = 6
|
55
|
+
|
56
|
+
size += @policy&.filter_exp&.size if @policy&.filter_exp
|
57
|
+
|
58
|
+
if @policy&.send_key
|
59
|
+
size += @key.user_key.estimate_size + Aerospike::FIELD_HEADER_SIZE + 1
|
60
|
+
end
|
61
|
+
|
62
|
+
has_write = false
|
63
|
+
@ops&.each do |op|
|
64
|
+
if op.is_write?
|
65
|
+
has_write = true
|
66
|
+
end
|
67
|
+
|
68
|
+
size += op.bin_name.bytesize + Aerospike::OPERATION_HEADER_SIZE if op.bin_name
|
69
|
+
size += op.bin_value.estimate_size if op.bin_value
|
70
|
+
end
|
71
|
+
|
72
|
+
unless has_write
|
73
|
+
raise AerospikeException.new(ResultCode::PARAMETER_ERROR, "Batch write operations do not contain a write")
|
74
|
+
end
|
75
|
+
|
76
|
+
size
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -65,9 +65,8 @@ module Aerospike
|
|
65
65
|
@arguments = arguments
|
66
66
|
end
|
67
67
|
|
68
|
-
|
69
68
|
# BitResizeOp creates byte "resize" operation.
|
70
|
-
# Server resizes byte[] to byte_size according to resize_flags (See {
|
69
|
+
# Server resizes byte[] to byte_size according to resize_flags (See {BitResizeFlags}).
|
71
70
|
# Server does not return a value.
|
72
71
|
# Example:
|
73
72
|
# bin = [0b00000001, 0b01000010]
|
@@ -195,7 +194,7 @@ module Aerospike
|
|
195
194
|
# BitAddOp creates bit "add" operation.
|
196
195
|
# Server adds value to byte[] bin starting at bit_offset for bit_size. Bit_size must be <= 64.
|
197
196
|
# Signed indicates if bits should be treated as a signed number.
|
198
|
-
# If add overflows/underflows, {
|
197
|
+
# If add overflows/underflows, {BitOverflowAction} is used.
|
199
198
|
# Server does not return a value.
|
200
199
|
# Example:
|
201
200
|
# bin = [0b00000001, 0b01000010, 0b00000011, 0b00000100, 0b00000101]
|
@@ -223,7 +222,7 @@ module Aerospike
|
|
223
222
|
# BitSubtractOp creates bit "subtract" operation.
|
224
223
|
# Server subtracts value from byte[] bin starting at bit_offset for bit_size. Bit_size must be <= 64.
|
225
224
|
# Signed indicates if bits should be treated as a signed number.
|
226
|
-
# If add overflows/underflows, {
|
225
|
+
# If add overflows/underflows, {BitOverflowAction} is used.
|
227
226
|
# Server does not return a value.
|
228
227
|
# Example:
|
229
228
|
# bin = [0b00000001, 0b01000010, 0b00000011, 0b00000100, 0b00000101]
|
@@ -351,7 +350,7 @@ module Aerospike
|
|
351
350
|
bytes = nil
|
352
351
|
args = arguments.dup
|
353
352
|
Packer.use do |packer|
|
354
|
-
if
|
353
|
+
if !@ctx.nil? && @ctx.length > 0
|
355
354
|
packer.write_array_header(3)
|
356
355
|
Value.of(0xff).pack(packer)
|
357
356
|
|
@@ -110,14 +110,23 @@ module Aerospike
|
|
110
110
|
self
|
111
111
|
end
|
112
112
|
|
113
|
-
|
114
|
-
#
|
115
|
-
#
|
116
|
-
|
117
|
-
|
113
|
+
# Create map create operation.
|
114
|
+
# Server creates a map at the given context level.
|
115
|
+
#
|
116
|
+
# @param [String] bin_name The bin name.
|
117
|
+
# @param [Integer] order The map order.
|
118
|
+
# @param [Boolean] persist_index If true, persist map index. A map index improves lookup performance,
|
119
|
+
# but requires more storage. A map index can be created for a top-level
|
120
|
+
# ordered map only. Nested and unordered map indexes are not supported.
|
121
|
+
# @param [String] ctx Optional path to a nested map. If not defined, the top-level map is used.
|
122
|
+
def self.create(bin_name, order, persistent_index, ctx: nil)
|
123
|
+
if !ctx || ctx.empty?
|
118
124
|
# If context not defined, the set order for top-level bin map.
|
119
|
-
|
125
|
+
attr = order[:attr]
|
126
|
+
attr += 0x10 if persistent_index
|
127
|
+
MapOperation.new(Operation::CDT_MODIFY, SET_TYPE, bin_name, attr, ctx: ctx, flag: order[:flag])
|
120
128
|
else
|
129
|
+
# Create nested map. persistIndex does not apply here, so ignore it
|
121
130
|
MapOperation.new(Operation::CDT_MODIFY, SET_TYPE, bin_name, order[:attr], ctx: ctx, flag: order[:flag])
|
122
131
|
end
|
123
132
|
end
|
@@ -128,7 +137,12 @@ module Aerospike
|
|
128
137
|
#
|
129
138
|
# The required map policy attributes can be changed after the map is created.
|
130
139
|
def self.set_policy(bin_name, policy, ctx: nil)
|
131
|
-
|
140
|
+
attr = policy.attributes
|
141
|
+
# Remove persistIndex flag for nested maps.
|
142
|
+
if !ctx.nil? && !ctx.empty? && (attr & 0x10) != 0
|
143
|
+
attr &= ~0x10
|
144
|
+
end
|
145
|
+
MapOperation.new(Operation::CDT_MODIFY, SET_TYPE, bin_name, attr, ctx: ctx)
|
132
146
|
end
|
133
147
|
|
134
148
|
##
|
@@ -635,7 +649,7 @@ module Aerospike
|
|
635
649
|
args.unshift(return_type) if return_type
|
636
650
|
|
637
651
|
Packer.use do |packer|
|
638
|
-
if @ctx != nil &&
|
652
|
+
if @ctx != nil && !@ctx.empty?
|
639
653
|
packer.write_array_header(3)
|
640
654
|
Value.of(0xff).pack(packer)
|
641
655
|
|
@@ -645,12 +659,12 @@ module Aerospike
|
|
645
659
|
Value.of(@map_op).pack(packer)
|
646
660
|
else
|
647
661
|
packer.write_raw_short(@map_op)
|
648
|
-
if args.
|
662
|
+
if !args.empty?
|
649
663
|
packer.write_array_header(args.length)
|
650
664
|
end
|
651
665
|
end
|
652
666
|
|
653
|
-
if args.
|
667
|
+
if !args.empty?
|
654
668
|
args.each do |value|
|
655
669
|
Value.of(value).pack(packer)
|
656
670
|
end
|
@@ -17,10 +17,9 @@
|
|
17
17
|
module Aerospike
|
18
18
|
module CDT
|
19
19
|
class MapPolicy
|
20
|
-
attr_accessor :order, :write_mode, :flags
|
21
|
-
attr_accessor :item_command, :items_command, :attributes
|
20
|
+
attr_accessor :order, :write_mode, :flags, :item_command, :items_command, :attributes, :persist_index
|
22
21
|
|
23
|
-
def initialize(order: nil, write_mode: nil, flags: nil)
|
22
|
+
def initialize(order: nil, write_mode: nil, persist_index: false, flags: nil)
|
24
23
|
if write_mode && flags
|
25
24
|
raise ArgumentError, "Use write mode for server versions < 4.3; use write flags for server versions >= 4.3."
|
26
25
|
end
|
@@ -30,6 +29,10 @@ module Aerospike
|
|
30
29
|
@flags = flags || MapWriteFlags::DEFAULT
|
31
30
|
@attributes = order ? order[:attr] : 0
|
32
31
|
|
32
|
+
if @persist_index
|
33
|
+
@attributes |= 0x10
|
34
|
+
end
|
35
|
+
|
33
36
|
case @write_mode
|
34
37
|
when CDT::MapWriteMode::DEFAULT
|
35
38
|
@item_command = CDT::MapOperation::PUT
|
data/lib/aerospike/client.rb
CHANGED
@@ -36,15 +36,7 @@ module Aerospike
|
|
36
36
|
# +:fail_if_not_connected+ set to true
|
37
37
|
|
38
38
|
class Client
|
39
|
-
attr_accessor :default_admin_policy
|
40
|
-
attr_accessor :default_batch_policy
|
41
|
-
attr_accessor :default_info_policy
|
42
|
-
attr_accessor :default_query_policy
|
43
|
-
attr_accessor :default_read_policy
|
44
|
-
attr_accessor :default_scan_policy
|
45
|
-
attr_accessor :default_write_policy
|
46
|
-
attr_accessor :default_operate_policy
|
47
|
-
attr_accessor :cluster
|
39
|
+
attr_accessor :default_admin_policy, :default_batch_policy, :default_info_policy, :default_query_policy, :default_read_policy, :default_scan_policy, :default_write_policy, :default_operate_policy, :cluster
|
48
40
|
|
49
41
|
def initialize(hosts = nil, policy: ClientPolicy.new, connect: true)
|
50
42
|
hosts = ::Aerospike::Host::Parse.(hosts || ENV["AEROSPIKE_HOSTS"] || "localhost")
|
@@ -230,11 +222,11 @@ module Aerospike
|
|
230
222
|
str_cmd = "truncate:namespace=#{namespace}"
|
231
223
|
str_cmd << ";set=#{set_name}" unless set_name.to_s.strip.empty?
|
232
224
|
else
|
233
|
-
if node.supports_feature?(Aerospike::Features::TRUNCATE_NAMESPACE)
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
225
|
+
str_cmd = if node.supports_feature?(Aerospike::Features::TRUNCATE_NAMESPACE)
|
226
|
+
"truncate-namespace:namespace=#{namespace}"
|
227
|
+
else
|
228
|
+
"truncate:namespace=#{namespace}"
|
229
|
+
end
|
238
230
|
end
|
239
231
|
|
240
232
|
if before_last_update
|
@@ -329,15 +321,8 @@ module Aerospike
|
|
329
321
|
bin_names = nil
|
330
322
|
end
|
331
323
|
|
332
|
-
|
333
|
-
|
334
|
-
execute_batch_direct_commands(policy, keys) do |node, batch|
|
335
|
-
BatchDirectCommand.new(node, batch, policy, key_map, bin_names, results, info_flags)
|
336
|
-
end
|
337
|
-
else
|
338
|
-
execute_batch_index_commands(policy, keys) do |node, batch|
|
339
|
-
BatchIndexCommand.new(node, batch, policy, bin_names, results, info_flags)
|
340
|
-
end
|
324
|
+
execute_batch_index_commands(policy, keys) do |node, batch|
|
325
|
+
BatchIndexCommand.new(node, batch, policy, bin_names, results, info_flags)
|
341
326
|
end
|
342
327
|
|
343
328
|
results
|
@@ -351,6 +336,21 @@ module Aerospike
|
|
351
336
|
batch_get(keys, :none, options)
|
352
337
|
end
|
353
338
|
|
339
|
+
# Operate on multiple records for specified batch keys in one batch call.
|
340
|
+
# This method allows different namespaces/bins for each key in the batch.
|
341
|
+
# The returned records are located in the same list.
|
342
|
+
#
|
343
|
+
# records can be BatchRead, BatchWrite, BatchDelete or BatchUDF.
|
344
|
+
#
|
345
|
+
# Requires server version 6.0+
|
346
|
+
def batch_operate(records, options = nil)
|
347
|
+
policy = create_policy(options, BatchPolicy, default_batch_policy)
|
348
|
+
|
349
|
+
execute_batch_operate_commands(policy, records) do |node, batch|
|
350
|
+
BatchOperateCommand.new(node, batch, policy, records)
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
354
|
# Check if multiple record keys exist in one batch call.
|
355
355
|
# The returned boolean array is in positional order with the original key array order.
|
356
356
|
# The policy can be used to specify timeouts and protocol type.
|
@@ -358,15 +358,8 @@ module Aerospike
|
|
358
358
|
policy = create_policy(options, BatchPolicy, default_batch_policy)
|
359
359
|
results = Array.new(keys.length)
|
360
360
|
|
361
|
-
|
362
|
-
|
363
|
-
execute_batch_direct_commands(policy, keys) do |node, batch|
|
364
|
-
BatchDirectExistsCommand.new(node, batch, policy, key_map, results)
|
365
|
-
end
|
366
|
-
else
|
367
|
-
execute_batch_index_commands(policy, keys) do |node, batch|
|
368
|
-
BatchIndexExistsCommand.new(node, batch, policy, results)
|
369
|
-
end
|
361
|
+
execute_batch_index_commands(policy, keys) do |node, batch|
|
362
|
+
BatchIndexExistsCommand.new(node, batch, policy, results)
|
370
363
|
end
|
371
364
|
|
372
365
|
results
|
@@ -430,7 +423,7 @@ module Aerospike
|
|
430
423
|
end
|
431
424
|
|
432
425
|
if res["error"]
|
433
|
-
raise Aerospike::Exceptions::CommandRejected.new("Registration failed: #{res[
|
426
|
+
raise Aerospike::Exceptions::CommandRejected.new("Registration failed: #{res['error']}\nFile: #{res['file']}\nLine: #{res['line']}\nMessage: #{res['message']}")
|
434
427
|
end
|
435
428
|
|
436
429
|
UdfRegisterTask.new(@cluster, server_path)
|
@@ -529,7 +522,7 @@ module Aerospike
|
|
529
522
|
# This method is only supported by Aerospike 3 servers.
|
530
523
|
# If the policy is nil, the default relevant policy will be used.
|
531
524
|
def execute_udf_on_query(statement, package_name, function_name, function_args = [], options = nil)
|
532
|
-
policy = create_policy(options,
|
525
|
+
policy = create_policy(options, WritePolicy, default_write_policy)
|
533
526
|
|
534
527
|
nodes = @cluster.nodes
|
535
528
|
if nodes.empty?
|
@@ -538,14 +531,12 @@ module Aerospike
|
|
538
531
|
|
539
532
|
statement = statement.clone
|
540
533
|
statement.set_aggregate_function(package_name, function_name, function_args, false)
|
541
|
-
|
542
534
|
# Use a thread per node
|
543
535
|
nodes.each do |node|
|
544
|
-
partitions = node.cluster.node_partitions(node, statement.namespace)
|
545
536
|
Thread.new do
|
546
537
|
Thread.current.abort_on_exception = true
|
547
538
|
begin
|
548
|
-
command =
|
539
|
+
command = ServerCommand.new(@cluster, node, policy, statement, true, statement.task_id)
|
549
540
|
execute_command(command)
|
550
541
|
rescue => e
|
551
542
|
Aerospike.logger.error(e)
|
@@ -568,7 +559,8 @@ module Aerospike
|
|
568
559
|
# ctx is an optional list of context. Supported on server v6.1+.
|
569
560
|
def create_index(namespace, set_name, index_name, bin_name, index_type, collection_type = nil, options = nil, ctx: nil)
|
570
561
|
if options.nil? && collection_type.is_a?(Hash)
|
571
|
-
options
|
562
|
+
options = collection_type
|
563
|
+
collection_type = nil
|
572
564
|
end
|
573
565
|
policy = create_policy(options, Policy, default_info_policy)
|
574
566
|
|
@@ -701,7 +693,6 @@ module Aerospike
|
|
701
693
|
# If the policy is nil, the default relevant policy will be used.
|
702
694
|
def query_partitions(partition_filter, statement, options = nil)
|
703
695
|
policy = create_policy(options, QueryPolicy, default_query_policy)
|
704
|
-
new_policy = policy.clone
|
705
696
|
|
706
697
|
nodes = @cluster.nodes
|
707
698
|
if nodes.empty?
|
@@ -946,13 +937,11 @@ module Aerospike
|
|
946
937
|
when Hash
|
947
938
|
policy_klass.new(policy)
|
948
939
|
else
|
949
|
-
|
940
|
+
raise TypeError, "policy should be a #{policy_klass.name} instance or a Hash"
|
950
941
|
end
|
951
942
|
end
|
952
943
|
|
953
|
-
|
954
|
-
@cluster = cluster
|
955
|
-
end
|
944
|
+
attr_writer :cluster
|
956
945
|
|
957
946
|
def cluster_config_changed(cluster)
|
958
947
|
Aerospike.logger.debug { "Cluster config change detected; active nodes: #{cluster.nodes.map(&:name)}" }
|
@@ -1002,24 +991,18 @@ module Aerospike
|
|
1002
991
|
threads.each(&:join)
|
1003
992
|
end
|
1004
993
|
|
1005
|
-
def
|
994
|
+
def execute_batch_operate_commands(policy, records)
|
1006
995
|
if @cluster.nodes.empty?
|
1007
|
-
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::SERVER_NOT_AVAILABLE, "Executing Batch
|
996
|
+
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::SERVER_NOT_AVAILABLE, "Executing Batch Index command failed because cluster is empty.")
|
1008
997
|
end
|
1009
998
|
|
1010
|
-
batch_nodes =
|
999
|
+
batch_nodes = BatchOperateNode.generate_list(@cluster, policy.replica, records)
|
1011
1000
|
threads = []
|
1012
1001
|
|
1013
|
-
|
1014
|
-
|
1015
|
-
|
1016
|
-
|
1017
|
-
bn.batch_namespaces.each do |batch|
|
1018
|
-
threads << Thread.new do
|
1019
|
-
Thread.current.abort_on_exception = true
|
1020
|
-
command = yield batch_node.node, batch
|
1021
|
-
execute_command(command)
|
1022
|
-
end
|
1002
|
+
batch_nodes.each do |batch|
|
1003
|
+
threads << Thread.new do
|
1004
|
+
command = yield batch.node, batch
|
1005
|
+
execute_command(command)
|
1023
1006
|
end
|
1024
1007
|
end
|
1025
1008
|
|