aerospike 2.10.0 → 2.15.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 +50 -1
- data/README.md +1 -1
- data/lib/aerospike.rb +20 -4
- data/lib/aerospike/aerospike_exception.rb +7 -1
- data/lib/aerospike/atomic/atomic.rb +1 -1
- data/lib/aerospike/bin.rb +1 -1
- data/lib/aerospike/cdt/hll_operation.rb +200 -0
- data/lib/aerospike/cdt/hll_policy.rb +34 -0
- data/lib/aerospike/cdt/hll_write_flags.rb +53 -0
- data/lib/aerospike/cdt/list_operation.rb +1 -1
- data/lib/aerospike/cdt/map_operation.rb +1 -1
- data/lib/aerospike/cdt/map_order.rb +1 -1
- data/lib/aerospike/cdt/map_policy.rb +1 -1
- data/lib/aerospike/cdt/map_return_type.rb +1 -1
- data/lib/aerospike/cdt/map_write_mode.rb +1 -1
- data/lib/aerospike/client.rb +34 -18
- data/lib/aerospike/cluster.rb +139 -17
- data/lib/aerospike/cluster/partition.rb +1 -1
- data/lib/aerospike/cluster/partition_parser.rb +169 -0
- data/lib/aerospike/cluster/rack_parser.rb +117 -0
- data/lib/aerospike/command/admin_command.rb +1 -1
- data/lib/aerospike/command/batch_direct_command.rb +2 -1
- data/lib/aerospike/command/batch_direct_exists_command.rb +1 -1
- data/lib/aerospike/command/batch_direct_node.rb +3 -3
- data/lib/aerospike/command/batch_index_command.rb +11 -2
- data/lib/aerospike/command/batch_index_node.rb +2 -2
- data/lib/aerospike/command/batch_item.rb +1 -1
- data/lib/aerospike/command/command.rb +168 -11
- data/lib/aerospike/command/delete_command.rb +21 -5
- data/lib/aerospike/command/execute_command.rb +1 -1
- data/lib/aerospike/command/exists_command.rb +21 -5
- data/lib/aerospike/command/field_type.rb +3 -1
- data/lib/aerospike/command/multi_command.rb +55 -5
- data/lib/aerospike/command/operate_command.rb +6 -1
- data/lib/aerospike/command/read_command.rb +63 -20
- data/lib/aerospike/command/read_header_command.rb +18 -6
- data/lib/aerospike/command/roles.rb +1 -1
- data/lib/aerospike/command/single_command.rb +9 -3
- data/lib/aerospike/command/touch_command.rb +48 -4
- data/lib/aerospike/command/unsupported_particle_type_validator.rb +1 -1
- data/lib/aerospike/command/write_command.rb +13 -4
- data/lib/aerospike/connection/create.rb +1 -1
- data/lib/aerospike/features.rb +3 -1
- data/lib/aerospike/geo_json.rb +70 -1
- data/lib/aerospike/host.rb +1 -1
- data/lib/aerospike/info.rb +1 -1
- data/lib/aerospike/key.rb +1 -1
- data/lib/aerospike/language.rb +1 -1
- data/lib/aerospike/node.rb +21 -7
- data/lib/aerospike/node/rebalance.rb +50 -0
- data/lib/aerospike/node/refresh/info.rb +4 -1
- data/lib/aerospike/node/refresh/partitions.rb +6 -15
- data/lib/aerospike/node/refresh/racks.rb +47 -0
- data/lib/aerospike/node/refresh/reset.rb +1 -0
- data/lib/aerospike/node/verify/rebalance_generation.rb +43 -0
- data/lib/aerospike/node_validator.rb +4 -19
- data/lib/aerospike/operation.rb +8 -1
- data/lib/aerospike/policy/admin_policy.rb +1 -1
- data/lib/aerospike/policy/batch_policy.rb +1 -1
- data/lib/aerospike/policy/client_policy.rb +16 -1
- data/lib/aerospike/policy/commit_level.rb +1 -1
- data/lib/aerospike/policy/consistency_level.rb +1 -1
- data/lib/aerospike/policy/generation_policy.rb +1 -1
- data/lib/aerospike/policy/operate_policy.rb +1 -1
- data/lib/aerospike/policy/policy.rb +64 -2
- data/lib/aerospike/policy/priority.rb +1 -1
- data/lib/aerospike/policy/query_policy.rb +8 -1
- data/lib/aerospike/policy/record_bin_multiplicity.rb +1 -1
- data/lib/aerospike/policy/record_exists_action.rb +1 -1
- data/lib/aerospike/policy/replica.rb +45 -0
- data/lib/aerospike/policy/scan_policy.rb +8 -1
- data/lib/aerospike/policy/write_policy.rb +1 -1
- data/lib/aerospike/query/filter.rb +1 -1
- data/lib/aerospike/query/pred_exp.rb +192 -0
- data/lib/aerospike/query/pred_exp/and_or.rb +32 -0
- data/lib/aerospike/query/pred_exp/geo_json_value.rb +41 -0
- data/lib/aerospike/query/pred_exp/integer_value.rb +32 -0
- data/lib/aerospike/query/pred_exp/op.rb +27 -0
- data/lib/aerospike/query/pred_exp/regex.rb +32 -0
- data/lib/aerospike/query/pred_exp/regex_flags.rb +23 -0
- data/lib/aerospike/query/pred_exp/string_value.rb +29 -0
- data/lib/aerospike/query/query_command.rb +27 -1
- data/lib/aerospike/query/recordset.rb +5 -5
- data/lib/aerospike/query/scan_command.rb +1 -1
- data/lib/aerospike/query/statement.rb +12 -3
- data/lib/aerospike/query/stream_command.rb +1 -1
- data/lib/aerospike/record.rb +1 -1
- data/lib/aerospike/result_code.rb +26 -7
- data/lib/aerospike/socket/base.rb +4 -3
- data/lib/aerospike/task/execute_task.rb +1 -1
- data/lib/aerospike/task/index_task.rb +1 -1
- data/lib/aerospike/task/task.rb +1 -1
- data/lib/aerospike/task/udf_register_task.rb +1 -1
- data/lib/aerospike/task/udf_remove_task.rb +1 -1
- data/lib/aerospike/ttl.rb +1 -1
- data/lib/aerospike/udf.rb +1 -1
- data/lib/aerospike/user_role.rb +1 -1
- data/lib/aerospike/utils/buffer.rb +14 -4
- data/lib/aerospike/utils/packer.rb +1 -1
- data/lib/aerospike/utils/pool.rb +1 -1
- data/lib/aerospike/utils/unpacker.rb +7 -2
- data/lib/aerospike/value/particle_type.rb +2 -2
- data/lib/aerospike/value/value.rb +106 -29
- data/lib/aerospike/version.rb +1 -1
- metadata +22 -8
- data/lib/aerospike/cluster/partition_tokenizer_new.rb +0 -130
- data/lib/aerospike/cluster/partition_tokenizer_old.rb +0 -135
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
# Copyright 2014-
|
2
|
+
# Copyright 2014-2020 Aerospike, Inc.
|
3
3
|
#
|
4
4
|
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
5
5
|
# license agreements.
|
@@ -20,7 +20,7 @@ module Aerospike
|
|
20
20
|
# a producer is a thread that fetches records from one node and puts them on this queue
|
21
21
|
# a consumer fetches records from this queue
|
22
22
|
# so the production and the consumptoin are decoupled
|
23
|
-
# there can be an unlimited count of producer threads and consumer threads
|
23
|
+
# there can be an unlimited count of producer threads and consumer threads
|
24
24
|
class Recordset
|
25
25
|
|
26
26
|
attr_reader :records
|
@@ -29,7 +29,7 @@ module Aerospike
|
|
29
29
|
queue_size = thread_count if queue_size < thread_count
|
30
30
|
@records = SizedQueue.new(queue_size)
|
31
31
|
|
32
|
-
# holds the count of active threads.
|
32
|
+
# holds the count of active threads.
|
33
33
|
# when it reaches zero it means the whole operations of fetching records from server nodes is finished
|
34
34
|
@active_threads = Atomic.new(thread_count)
|
35
35
|
|
@@ -48,7 +48,7 @@ module Aerospike
|
|
48
48
|
# if the operation is not finished and the queue is empty it blocks and waits for new records
|
49
49
|
# it sets the exception if it reaches the EOF mark, and returns nil
|
50
50
|
# EOF means the operation has finished and no more records are comming from server nodes
|
51
|
-
# it re-raises the exception occurred in threads, or which was set after reaching the EOF in the previous call
|
51
|
+
# it re-raises the exception occurred in threads, or which was set after reaching the EOF in the previous call
|
52
52
|
def next_record
|
53
53
|
raise @thread_exception.get unless @thread_exception.get.nil?
|
54
54
|
|
@@ -76,7 +76,7 @@ module Aerospike
|
|
76
76
|
|
77
77
|
# this is called by a thread who faced an exception to singnal to terminate the whole operation
|
78
78
|
# it also may be called by the user to terminate the command in the middle of fetching records from server nodes
|
79
|
-
# it clears the queue so that if any threads are waiting for the queue get unblocked and find out about the cancellation
|
79
|
+
# it clears the queue so that if any threads are waiting for the queue get unblocked and find out about the cancellation
|
80
80
|
def cancel(expn=nil)
|
81
81
|
set_exception(expn)
|
82
82
|
@cancelled.set(true)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
# Copyright 2014-
|
2
|
+
# Copyright 2014-2020 Aerospike, Inc.
|
3
3
|
#
|
4
4
|
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
5
5
|
# license agreements.
|
@@ -20,7 +20,7 @@ module Aerospike
|
|
20
20
|
|
21
21
|
attr_accessor :namespace, :set_name, :index_name, :bin_names, :task_id
|
22
22
|
attr_accessor :filters, :package_name, :function_name, :function_args
|
23
|
-
attr_accessor :return_data
|
23
|
+
attr_accessor :predexp, :return_data
|
24
24
|
|
25
25
|
def initialize(namespace, set_name, bin_names=[])
|
26
26
|
# Namespace determines query Namespace
|
@@ -43,6 +43,16 @@ module Aerospike
|
|
43
43
|
# aggregation function.
|
44
44
|
@filters = []
|
45
45
|
|
46
|
+
# Predicate expressions in postfix notation. If the expression is evaluated to false,
|
47
|
+
# the record will be ommited in the results.
|
48
|
+
#
|
49
|
+
# This method is redundant because PredExp can now be set in the base Policy for
|
50
|
+
# any transaction (including queries).
|
51
|
+
#
|
52
|
+
# NOTE : Policy.predexp takes precedence to this value. This value will be
|
53
|
+
# deprecated in the future.
|
54
|
+
@predexp = nil
|
55
|
+
|
46
56
|
@package_name = nil
|
47
57
|
@function_name = nil
|
48
58
|
@function_args = nil
|
@@ -76,5 +86,4 @@ module Aerospike
|
|
76
86
|
RAND_MAX = 2**63
|
77
87
|
|
78
88
|
end # class
|
79
|
-
|
80
89
|
end
|
data/lib/aerospike/record.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
# Copyright 2014-
|
2
|
+
# Copyright 2014-2020 Aerospike, Inc.
|
3
3
|
#
|
4
4
|
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
5
5
|
# license agreements.
|
@@ -60,6 +60,10 @@ module Aerospike
|
|
60
60
|
# exists.
|
61
61
|
KEY_EXISTS_ERROR = 5
|
62
62
|
|
63
|
+
# Bin already exists on a create-only operation.
|
64
|
+
BIN_EXISTS_ERROR = 6
|
65
|
+
|
66
|
+
|
63
67
|
# Expected cluster ID was not received.
|
64
68
|
CLUSTER_KEY_MISMATCH = 7
|
65
69
|
|
@@ -91,6 +95,9 @@ module Aerospike
|
|
91
95
|
# Unsupported Server Feature (e.g. Scan + UDF)
|
92
96
|
UNSUPPORTED_FEATURE = 16
|
93
97
|
|
98
|
+
# Bin not found on update-only operation.
|
99
|
+
BIN_NOT_FOUND = 17
|
100
|
+
|
94
101
|
# Specified bin name does not exist in record.
|
95
102
|
DEVICE_OVERLOAD = 18
|
96
103
|
|
@@ -116,6 +123,12 @@ module Aerospike
|
|
116
123
|
# Enterprise-only feature not supported by the community edition
|
117
124
|
ENTERPRISE_ONLY = 25
|
118
125
|
|
126
|
+
# The operation cannot be applied to the current bin value on the server.
|
127
|
+
OP_NOT_APPLICABLE = 26
|
128
|
+
|
129
|
+
# The transaction was not performed because the predexp was false.
|
130
|
+
FILTERED_OUT = 27
|
131
|
+
|
119
132
|
# There are no more records left for query.
|
120
133
|
QUERY_END = 50
|
121
134
|
|
@@ -167,9 +180,6 @@ module Aerospike
|
|
167
180
|
# A user defined function returned an error code.
|
168
181
|
UDF_BAD_RESPONSE = 100
|
169
182
|
|
170
|
-
# The requested item in a large collection was not found.
|
171
|
-
LARGE_ITEM_NOT_FOUND = 125
|
172
|
-
|
173
183
|
# Secondary index already exists.
|
174
184
|
INDEX_FOUND = 200
|
175
185
|
|
@@ -241,6 +251,9 @@ module Aerospike
|
|
241
251
|
when KEY_EXISTS_ERROR
|
242
252
|
"Key already exists"
|
243
253
|
|
254
|
+
when BIN_EXISTS_ERROR
|
255
|
+
"Bin already exists on a create-only operation"
|
256
|
+
|
244
257
|
when CLUSTER_KEY_MISMATCH
|
245
258
|
"Cluster key mismatch"
|
246
259
|
|
@@ -271,6 +284,9 @@ module Aerospike
|
|
271
284
|
when UNSUPPORTED_FEATURE
|
272
285
|
"Unsupported Server Feature"
|
273
286
|
|
287
|
+
when BIN_NOT_FOUND
|
288
|
+
"Bin not found on update-only operation"
|
289
|
+
|
274
290
|
when DEVICE_OVERLOAD
|
275
291
|
"Device overload"
|
276
292
|
|
@@ -295,6 +311,12 @@ module Aerospike
|
|
295
311
|
when ENTERPRISE_ONLY
|
296
312
|
"Enterprise-only feature not supported by community edition"
|
297
313
|
|
314
|
+
when OP_NOT_APPLICABLE
|
315
|
+
"The operation cannot be applied to the current bin value on the server."
|
316
|
+
|
317
|
+
when FILTERED_OUT
|
318
|
+
"The transaction was not performed because the predexp was false."
|
319
|
+
|
298
320
|
when QUERY_END
|
299
321
|
"Query end"
|
300
322
|
|
@@ -352,9 +374,6 @@ module Aerospike
|
|
352
374
|
when UDF_BAD_RESPONSE
|
353
375
|
"UDF d error"
|
354
376
|
|
355
|
-
when LARGE_ITEM_NOT_FOUND
|
356
|
-
"Large collection item not found"
|
357
|
-
|
358
377
|
when INDEX_FOUND
|
359
378
|
"Index already exists"
|
360
379
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright 2014-
|
3
|
+
# Copyright 2014-2020 Aerospike, Inc.
|
4
4
|
#
|
5
5
|
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
6
6
|
# license agreements.
|
@@ -25,13 +25,14 @@ module Aerospike
|
|
25
25
|
@timeout = nil
|
26
26
|
end
|
27
27
|
|
28
|
-
def read(buffer, length)
|
28
|
+
def read(buffer, length, offset = 0)
|
29
29
|
bytes_read = 0
|
30
30
|
until bytes_read >= length
|
31
31
|
result = read_from_socket(length - bytes_read)
|
32
|
-
buffer.write_binary(result, bytes_read)
|
32
|
+
buffer.write_binary(result, offset + bytes_read)
|
33
33
|
bytes_read += result.bytesize
|
34
34
|
end
|
35
|
+
bytes_read
|
35
36
|
end
|
36
37
|
|
37
38
|
def read_from_socket(length)
|
data/lib/aerospike/task/task.rb
CHANGED
data/lib/aerospike/ttl.rb
CHANGED
data/lib/aerospike/udf.rb
CHANGED
data/lib/aerospike/user_role.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
# Copyright 2014-
|
3
|
+
# Copyright 2014-2020 Aerospike, Inc.
|
4
4
|
#
|
5
5
|
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
6
6
|
# license agreements.
|
@@ -42,9 +42,9 @@ module Aerospike
|
|
42
42
|
DEFAULT_BUFFER_SIZE = 16 * 1024
|
43
43
|
MAX_BUFFER_SIZE = 10 * 1024 * 1024
|
44
44
|
|
45
|
-
def initialize(size=DEFAULT_BUFFER_SIZE)
|
46
|
-
@buf = "%0#{size}d" % 0
|
47
|
-
|
45
|
+
def initialize(size=DEFAULT_BUFFER_SIZE, buf = nil)
|
46
|
+
@buf = (buf ? buf : ("%0#{size}d" % 0))
|
47
|
+
@buf.force_encoding('binary')
|
48
48
|
@slice_end = @buf.bytesize
|
49
49
|
end
|
50
50
|
|
@@ -61,6 +61,10 @@ module Aerospike
|
|
61
61
|
end
|
62
62
|
alias_method :length, :size
|
63
63
|
|
64
|
+
def eat!(n)
|
65
|
+
@buf.replace(@buf[n..-1])
|
66
|
+
end
|
67
|
+
|
64
68
|
def resize(length)
|
65
69
|
if @buf.bytesize < length
|
66
70
|
@buf.concat("%0#{length - @buf.bytesize}d" % 0)
|
@@ -156,6 +160,12 @@ module Aerospike
|
|
156
160
|
@buf[0..@slice_end-1]
|
157
161
|
end
|
158
162
|
|
163
|
+
def reset
|
164
|
+
for i in 0..@buf.size-1
|
165
|
+
@buf[i] = ' '
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
159
169
|
def dump(from=nil, to=nil)
|
160
170
|
from ||= 0
|
161
171
|
to ||= @slice_end - 1
|
data/lib/aerospike/utils/pool.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
# Copyright 2016-
|
2
|
+
# Copyright 2016-2020 Aerospike, Inc.
|
3
3
|
#
|
4
4
|
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
5
5
|
# license agreements.
|
@@ -85,7 +85,12 @@ module Aerospike
|
|
85
85
|
def normalize_elem(elem)
|
86
86
|
case elem
|
87
87
|
when String
|
88
|
-
|
88
|
+
ptype = elem.ord
|
89
|
+
value = elem[1..-1]
|
90
|
+
if (ptype == ParticleType::STRING)
|
91
|
+
value.encode!(Aerospike.encoding)
|
92
|
+
end
|
93
|
+
value
|
89
94
|
when Array
|
90
95
|
normalize_strings_in_array(elem)
|
91
96
|
when Hash
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
# Copyright 2014-
|
2
|
+
# Copyright 2014-2020 Aerospike, Inc.
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License")
|
5
5
|
# you may not use this file except in compliance with the License.
|
@@ -36,7 +36,7 @@ module Aerospike
|
|
36
36
|
#RTA_DICT = 15
|
37
37
|
#RTA_APPEND_DICT = 16
|
38
38
|
#RTA_APPEND_LIST = 17
|
39
|
-
|
39
|
+
HLL = 18
|
40
40
|
MAP = 19
|
41
41
|
LIST = 20
|
42
42
|
GEOJSON = 23
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
# Copyright 2014-
|
3
|
+
# Copyright 2014-2020 Aerospike, Inc.
|
4
4
|
#
|
5
5
|
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
6
6
|
# license agreements.
|
@@ -22,14 +22,11 @@ require 'aerospike/aerospike_exception'
|
|
22
22
|
module Aerospike
|
23
23
|
# Polymorphic value classes used to efficiently serialize objects into the wire protocol.
|
24
24
|
class Value #:nodoc:
|
25
|
-
INTEGER_RANGE = Range.new(-2**63, 2**63 - 1).freeze
|
26
25
|
|
27
26
|
def self.of(value)
|
28
27
|
case value
|
29
|
-
when nil
|
30
|
-
res = NULL
|
31
28
|
when Integer
|
32
|
-
if
|
29
|
+
if value.bit_length < 64
|
33
30
|
res = IntegerValue.new(value)
|
34
31
|
else
|
35
32
|
# big nums > 2**63 are not supported
|
@@ -49,6 +46,8 @@ module Aerospike
|
|
49
46
|
res = ListValue.new(value)
|
50
47
|
when GeoJSON
|
51
48
|
res = GeoJSONValue.new(value)
|
49
|
+
when nil
|
50
|
+
res = NULL
|
52
51
|
else
|
53
52
|
# throw an exception for anything that is not supported.
|
54
53
|
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::TYPE_NOT_SUPPORTED, "Value type #{value.class} not supported.")
|
@@ -57,6 +56,22 @@ module Aerospike
|
|
57
56
|
res
|
58
57
|
end
|
59
58
|
|
59
|
+
def self.validate_hash_key(value)
|
60
|
+
case value
|
61
|
+
when Integer
|
62
|
+
if value.bit_length >= 64
|
63
|
+
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::TYPE_NOT_SUPPORTED, "Value type #{value.class} not supported as hash key.")
|
64
|
+
end
|
65
|
+
when Float
|
66
|
+
when String
|
67
|
+
when Symbol
|
68
|
+
when nil
|
69
|
+
else
|
70
|
+
# throw an exception for anything that is not supported.
|
71
|
+
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::TYPE_NOT_SUPPORTED, "Value type #{value.class} not supported as hash key.")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
60
75
|
end # Value
|
61
76
|
|
62
77
|
# Empty value.
|
@@ -137,7 +152,7 @@ module Aerospike
|
|
137
152
|
end
|
138
153
|
end
|
139
154
|
|
140
|
-
INFINITY = InfinityValue.new.freeze
|
155
|
+
INFINITY = Value::INFINITY = InfinityValue.new.freeze
|
141
156
|
|
142
157
|
# Wildcard value.
|
143
158
|
class WildcardValue < Value #:nodoc:
|
@@ -178,7 +193,7 @@ module Aerospike
|
|
178
193
|
end
|
179
194
|
end
|
180
195
|
|
181
|
-
WILDCARD = WildcardValue.new.freeze
|
196
|
+
WILDCARD = Value::WILDCARD = WildcardValue.new.freeze
|
182
197
|
|
183
198
|
# Byte array value.
|
184
199
|
class BytesValue < Value #:nodoc:
|
@@ -356,21 +371,16 @@ module Aerospike
|
|
356
371
|
class ListValue < Value #:nodoc:
|
357
372
|
|
358
373
|
def initialize(list)
|
359
|
-
@list = list ||
|
360
|
-
Packer.use do |packer|
|
361
|
-
pack(packer)
|
362
|
-
@bytes = packer.bytes
|
363
|
-
end
|
364
|
-
self
|
374
|
+
@list = list || []
|
365
375
|
end
|
366
376
|
|
367
377
|
def estimate_size
|
368
|
-
|
378
|
+
bytes.bytesize
|
369
379
|
end
|
370
380
|
|
371
381
|
def write(buffer, offset)
|
372
|
-
buffer.write_binary(
|
373
|
-
|
382
|
+
buffer.write_binary(bytes, offset)
|
383
|
+
bytes.bytesize
|
374
384
|
end
|
375
385
|
|
376
386
|
def pack(packer)
|
@@ -389,13 +399,26 @@ module Aerospike
|
|
389
399
|
end
|
390
400
|
|
391
401
|
def to_bytes
|
392
|
-
|
402
|
+
bytes
|
393
403
|
end
|
394
404
|
|
395
405
|
def to_s
|
396
406
|
@list.map{|v| v.to_s}.to_s
|
397
407
|
end
|
398
408
|
|
409
|
+
private
|
410
|
+
|
411
|
+
def bytes
|
412
|
+
return @bytes if @bytes
|
413
|
+
|
414
|
+
Packer.use do |packer|
|
415
|
+
pack(packer)
|
416
|
+
@bytes = packer.bytes
|
417
|
+
end
|
418
|
+
|
419
|
+
@bytes
|
420
|
+
end
|
421
|
+
|
399
422
|
end
|
400
423
|
|
401
424
|
# #######################################/
|
@@ -406,28 +429,22 @@ module Aerospike
|
|
406
429
|
|
407
430
|
def initialize(vmap)
|
408
431
|
@vmap = vmap || {}
|
409
|
-
|
410
|
-
Packer.use do |packer|
|
411
|
-
pack(packer)
|
412
|
-
@bytes = packer.bytes
|
413
|
-
end
|
414
|
-
|
415
|
-
self
|
416
432
|
end
|
417
433
|
|
418
434
|
def estimate_size
|
419
|
-
|
435
|
+
bytes.bytesize
|
420
436
|
end
|
421
437
|
|
422
438
|
def write(buffer, offset)
|
423
|
-
buffer.write_binary(
|
424
|
-
|
439
|
+
buffer.write_binary(bytes, offset)
|
440
|
+
bytes.bytesize
|
425
441
|
end
|
426
442
|
|
427
443
|
def pack(packer)
|
428
444
|
packer.write_map_header(@vmap.length)
|
429
|
-
# @vmap.each do |key, val|
|
430
445
|
for key, val in @vmap
|
446
|
+
Value.validate_hash_key(key)
|
447
|
+
|
431
448
|
Value.of(key).pack(packer)
|
432
449
|
Value.of(val).pack(packer)
|
433
450
|
end
|
@@ -442,13 +459,26 @@ module Aerospike
|
|
442
459
|
end
|
443
460
|
|
444
461
|
def to_bytes
|
445
|
-
|
462
|
+
bytes
|
446
463
|
end
|
447
464
|
|
448
465
|
def to_s
|
449
466
|
@vmap.map{|k, v| "#{k.to_s} => #{v.to_s}" }.to_s
|
450
467
|
end
|
451
468
|
|
469
|
+
private
|
470
|
+
|
471
|
+
def bytes
|
472
|
+
return @bytes if @bytes
|
473
|
+
|
474
|
+
Packer.use do |packer|
|
475
|
+
pack(packer)
|
476
|
+
@bytes = packer.bytes
|
477
|
+
end
|
478
|
+
|
479
|
+
@bytes
|
480
|
+
end
|
481
|
+
|
452
482
|
end
|
453
483
|
|
454
484
|
# #######################################/
|
@@ -496,6 +526,49 @@ module Aerospike
|
|
496
526
|
|
497
527
|
end
|
498
528
|
|
529
|
+
# #######################################/
|
530
|
+
|
531
|
+
# HLLValue value. Encapsulates a HyperLogLog value.
|
532
|
+
# Supported by Aerospike server version 4.9 and later.
|
533
|
+
class HLLValue < Value #:nodoc:
|
534
|
+
|
535
|
+
def initialize(value)
|
536
|
+
@bytes = value
|
537
|
+
@bytes.force_encoding('binary')
|
538
|
+
|
539
|
+
self
|
540
|
+
end
|
541
|
+
|
542
|
+
def type
|
543
|
+
Aerospike::ParticleType::HLL
|
544
|
+
end
|
545
|
+
|
546
|
+
def get
|
547
|
+
self
|
548
|
+
end
|
549
|
+
|
550
|
+
def to_s
|
551
|
+
@bytes.to_s
|
552
|
+
end
|
553
|
+
|
554
|
+
def to_bytes
|
555
|
+
@bytes
|
556
|
+
end
|
557
|
+
|
558
|
+
def estimate_size
|
559
|
+
@bytes.bytesize
|
560
|
+
end
|
561
|
+
|
562
|
+
def write(buffer, offset)
|
563
|
+
buffer.write_binary(@bytes, offset)
|
564
|
+
end
|
565
|
+
|
566
|
+
def pack(packer)
|
567
|
+
packer.write(Aerospike::ParticleType::BLOB.chr + @bytes)
|
568
|
+
end
|
569
|
+
|
570
|
+
end
|
571
|
+
|
499
572
|
#######################################
|
500
573
|
|
501
574
|
def self.encoding
|
@@ -542,6 +615,10 @@ module Aerospike
|
|
542
615
|
hdrsz = 1 + 2 + (ncells * 8)
|
543
616
|
Aerospike::GeoJSON.new(buf.read(offset + hdrsz, length - hdrsz))
|
544
617
|
|
618
|
+
when Aerospike::ParticleType::HLL
|
619
|
+
bytes = buf.read(offset,length)
|
620
|
+
Aerospike::HLLValue.new(bytes)
|
621
|
+
|
545
622
|
else
|
546
623
|
nil
|
547
624
|
end
|