aerospike 2.14.0 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d0452d4d35ee6d5ce56586cc99b3a68c7e1b4a6c4f6334c6794414a483e2ef01
4
- data.tar.gz: 328a5672510bb68e044a92c39fc1f04059daa53b4332eaa5a64dda04f5b3de78
3
+ metadata.gz: 703f1af2ab5b0050745490618dc48f4f1135b457523ebe69b6c35d9111c67037
4
+ data.tar.gz: 9fba2d0c3a53c93a46f3fc1635f9fcabfa2e7804191cf9f20bf79c306099e6ce
5
5
  SHA512:
6
- metadata.gz: 44c883336f3993d532c7989e1c6bf737deca2773cb444a4cfa6021bca35311c9d4fe5c74ddb73fa1274661435a127892f9a368bd1d94120e6965bee38b870216
7
- data.tar.gz: ebac442b5b2ddc345b7d7713b0e8d7f0aaaba9da24aabe811e1a10a26555c2a85ba1d2bad0a0266674fdcc1c3deb573ed1839ffe98294dc979ccc69e42eab187
6
+ metadata.gz: eba3f39bbfd7399f7e424894521aeed62cbd4b28e74f81b1d5207485eca59d236497d05c5f5dbfdfadd2e8e52c01eebcf4a06c71ea5eedf272f3ee6efd5f23b5
7
+ data.tar.gz: 3d2b651ccc051d95255acf0affdebd41822fcd0d36461653987186183bf84100a4507601eb5a640a0972827968b765645e31c6f6eb1f2f82b25f564704cb2aa7
@@ -2,16 +2,24 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
- ## [2.14.0] - 2019-08-06
5
+ ## [2.15.0] - 2020-10-05
6
6
 
7
7
  * **New Features**
8
- * Adds support for rake-aware reads.
8
+ * [CLIENT-1254] Adds support for HyperLogLog.
9
+
10
+ * **Changes**
11
+ * `Client#operate` now uses `OperatePolicy` by default.
12
+
13
+ ## [2.14.0] - 2020-08-06
14
+
15
+ * **New Features**
16
+ * Adds support for rack-aware reads.
9
17
  * Adds support for client-server compression.
10
18
 
11
19
  * **Improvements**
12
20
  * Adds support for `truncate-namespace` command.
13
21
 
14
- ## [2.13.0] - 2019-07-17
22
+ ## [2.13.0] - 2020-07-17
15
23
 
16
24
  * **New Features**
17
25
  * Adds support for replica policies.
@@ -77,6 +77,9 @@ require 'aerospike/cdt/map_return_type'
77
77
  require 'aerospike/cdt/map_write_flags'
78
78
  require 'aerospike/cdt/map_write_mode'
79
79
  require 'aerospike/cdt/map_policy'
80
+ require 'aerospike/cdt/hll_operation'
81
+ require 'aerospike/cdt/hll_write_flags'
82
+ require 'aerospike/cdt/hll_policy'
80
83
  require 'aerospike/geo_json'
81
84
  require 'aerospike/ttl'
82
85
 
@@ -0,0 +1,200 @@
1
+ # encoding: utf-8
2
+ # Copyright 2016-2020 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
+ module Aerospike
18
+ module CDT
19
+
20
+ # HyperLogLog (HLL) operations.
21
+ # Requires server versions >= 4.9.
22
+ #
23
+ # HyperLogLog operations on HLL items nested in lists/maps are not currently
24
+ # supported by the server.
25
+ class HLLOperation < Operation
26
+
27
+ INIT = 0
28
+ ADD = 1
29
+ SET_UNION = 2
30
+ SET_COUNT = 3
31
+ FOLD = 4
32
+ COUNT = 50
33
+ UNION = 51
34
+ UNION_COUNT = 52
35
+ INTERSECT_COUNT = 53
36
+ SIMILARITY = 54
37
+ DESCRIBE = 55
38
+
39
+ attr_reader :hll_op, :values, :return_type, :policy, :index_bit_count, :minhash_bit_count
40
+
41
+ def initialize(op_type, hll_op, bin_name, values: nil, index_bit_count: nil, minhash_bit_count: nil, policy: nil)
42
+ @policy = policy
43
+ @op_type = op_type
44
+ @bin_name = bin_name
45
+ @bin_value = nil
46
+ @hll_op = hll_op
47
+ @index_bit_count = index_bit_count
48
+ @minhash_bit_count = minhash_bit_count
49
+ @values = values
50
+
51
+ self
52
+ end
53
+
54
+ ##
55
+ # Create HLL init operation with minhash bits.
56
+ # Server creates a new HLL or resets an existing HLL.
57
+ # Server does not return a value.
58
+ #
59
+ # policy write policy, HLLPolicy::DEFAULT is default
60
+ # bin_name name of bin
61
+ # index_bit_count number of index bits. Must be between 4 and 16 inclusive.
62
+ # minhash_bit_count number of min hash bits. Must be between 4 and 58 inclusive.
63
+ def self.init(bin_name, index_bit_count, minhash_bit_count, policy = HLLPolicy::DEFAULT)
64
+ HLLOperation.new(Operation::HLL_MODIFY, INIT, bin_name, index_bit_count: index_bit_count, minhash_bit_count: minhash_bit_count, policy: policy)
65
+ end
66
+
67
+ ##
68
+ # Create HLL add operation with minhash bits.
69
+ # Server adds values to HLL set. If HLL bin does not exist, use index_bit_count and minhash_bit_count
70
+ # to create HLL bin. Server returns number of entries that caused HLL to update a register.
71
+ #
72
+ # policy write policy, HLLPolicy::DEFAULT is default
73
+ # bin_name name of bin
74
+ # list list of values to be added
75
+ # index_bit_count number of index bits. Must be between 4 and 16 inclusive.
76
+ # minhash_bit_count number of min hash bits. Must be between 4 and 58 inclusive.
77
+ def self.add(bin_name, *values, policy: HLLPolicy::DEFAULT, index_bit_count: -1, minhash_bit_count: -1)
78
+ HLLOperation.new(Operation::HLL_MODIFY, ADD, bin_name, index_bit_count: index_bit_count, minhash_bit_count: minhash_bit_count, values: values, policy: policy)
79
+ end
80
+
81
+ ##
82
+ # Create HLL set union operation.
83
+ # Server sets union of specified HLL objects with HLL bin.
84
+ # Server does not return a value.
85
+ #
86
+ # policy write policy, HLLPolicy::DEFAULT is default
87
+ # bin_name name of bin
88
+ # list list of HLL objects
89
+ def self.set_union(bin_name, *values, policy: HLLPolicy::DEFAULT)
90
+ HLLOperation.new(Operation::HLL_MODIFY, SET_UNION, bin_name, values: values, policy: policy)
91
+ end
92
+
93
+ ##
94
+ # Create HLL refresh operation.
95
+ # Server updates the cached count (if stale) and returns the count.
96
+ #
97
+ # bin_name name of bin
98
+ def self.refresh_count(bin_name)
99
+ HLLOperation.new(Operation::HLL_MODIFY, SET_COUNT, bin_name)
100
+ end
101
+
102
+ ##
103
+ # Create HLL fold operation.
104
+ # Servers folds index_bit_count to the specified value.
105
+ # This can only be applied when minhash_bit_count on the HLL bin is 0.
106
+ # Server does not return a value.
107
+ #
108
+ # bin_name name of bin
109
+ # index_bit_count number of index bits. Must be between 4 and 16 inclusive.
110
+ def self.fold(bin_name, index_bit_count)
111
+ HLLOperation.new(Operation::HLL_MODIFY, FOLD, bin_name, index_bit_count: index_bit_count)
112
+ end
113
+
114
+ ##
115
+ # Create HLL getCount operation.
116
+ # Server returns estimated number of elements in the HLL bin.
117
+ #
118
+ # bin_name name of bin
119
+ def self.get_count(bin_name)
120
+ HLLOperation.new(Operation::HLL_READ, COUNT, bin_name)
121
+ end
122
+
123
+ ##
124
+ # Create HLL getUnion operation.
125
+ # Server returns an HLL object that is the union of all specified HLL objects in the list
126
+ # with the HLL bin.
127
+ #
128
+ # bin_name name of bin
129
+ # list list of HLL objects
130
+ def self.get_union(bin_name, *values)
131
+ HLLOperation.new(Operation::HLL_READ, UNION, bin_name, values: values)
132
+ end
133
+
134
+ ##
135
+ # Create HLL getUnionCount operation.
136
+ # Server returns estimated number of elements that would be contained by the union of these
137
+ # HLL objects.
138
+ # bin_name name of bin
139
+ # list list of HLL objects
140
+ def self.get_union_count(bin_name, *values)
141
+ HLLOperation.new(Operation::HLL_READ, UNION_COUNT, bin_name, values: values)
142
+ end
143
+
144
+ ##
145
+ # Create HLL getIntersectCount operation.
146
+ # Server returns estimated number of elements that would be contained by the intersection of
147
+ # these HLL objects.
148
+ #
149
+ # bin_name name of bin
150
+ # list list of HLL objects
151
+ def self.get_intersect_count(bin_name, *values)
152
+ HLLOperation.new(Operation::HLL_READ, INTERSECT_COUNT, bin_name, values: values)
153
+ end
154
+
155
+ ##
156
+ # Create HLL getSimilarity operation.
157
+ # Server returns estimated similarity of these HLL objects. Return type is a double.
158
+ #
159
+ # bin_name name of bin
160
+ # list list of HLL objects
161
+ def self.get_similarity(bin_name, *values)
162
+ HLLOperation.new(Operation::HLL_READ, SIMILARITY, bin_name, values: values)
163
+ end
164
+
165
+ ##
166
+ # Create HLL describe operation.
167
+ # Server returns index_bit_count and minhash_bit_count used to create HLL bin in a list of longs.
168
+ # The list size is 2.
169
+ #
170
+ # bin_name name of bin
171
+ def self.describe(bin_name)
172
+ HLLOperation.new(Operation::HLL_READ, DESCRIBE, bin_name)
173
+ end
174
+
175
+ def bin_value
176
+ @bin_value ||= pack_bin_value
177
+ end
178
+
179
+ private
180
+
181
+ def pack_bin_value
182
+ bytes = nil
183
+ Packer.use do |packer|
184
+ args = [hll_op]
185
+ args << values if values
186
+ args << index_bit_count if index_bit_count
187
+ args << minhash_bit_count if minhash_bit_count
188
+ args << policy.flags if policy
189
+
190
+ vv = ListValue.new(args)
191
+ vv.pack(packer)
192
+ bytes = packer.bytes
193
+ end
194
+ BytesValue.new(bytes)
195
+ end
196
+
197
+ end
198
+
199
+ end
200
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2020 Aerospike, Inc.
4
+ #
5
+ # Portions may be licensed to Aerospike, Inc. under one or more contributor
6
+ # license agreements.
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may not
9
+ # use this file except in compliance with the License. You may obtain a copy of
10
+ # the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
17
+ # License for the specific language governing permissions and limitations under
18
+ # the License.
19
+
20
+ module Aerospike
21
+ module CDT
22
+ class HLLPolicy
23
+
24
+ attr_accessor :flags
25
+
26
+ def initialize(write_flags: HLLWriteFlags::DEFAULT)
27
+ @flags = write_flags
28
+ end
29
+
30
+ DEFAULT = HLLPolicy.new
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+ # Copyright 2020 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
+ module Aerospike
18
+ module CDT
19
+
20
+ ##
21
+ # Map write bit flags.
22
+ # Requires server versions >= 4.3.
23
+ module HLLWriteFlags
24
+
25
+ ##
26
+ # Default is Default. Allow create or update.
27
+ DEFAULT = 0
28
+
29
+ ##
30
+ # CREATE_ONLY behaves like the following:
31
+ # If the bin already exists, the operation will be denied.
32
+ # If the bin does not exist, a new bin will be created.
33
+ CREATE_ONLY = 1
34
+
35
+ ##
36
+ # UPDATE_ONLY behaves like the following:
37
+ # If the bin already exists, the bin will be overwritten.
38
+ # If the bin does not exist, the operation will be denied.
39
+ UPDATE_ONLY = 2
40
+
41
+ ##
42
+ # NO_FAIL does not raise error if operation is denied.
43
+ NO_FAIL = 4
44
+
45
+ ##
46
+ # ALLOW_FOLD allows the resulting set to be the minimum of provided index bits.
47
+ # Also, allow the usage of less precise HLL algorithms when minHash bits
48
+ # of all participating sets do not match.
49
+ ALLOW_FOLD = 8
50
+
51
+ end
52
+ end
53
+ end
@@ -44,6 +44,7 @@ module Aerospike
44
44
  attr_accessor :default_read_policy
45
45
  attr_accessor :default_scan_policy
46
46
  attr_accessor :default_write_policy
47
+ attr_accessor :default_operate_policy
47
48
  attr_accessor :cluster
48
49
 
49
50
  def initialize(hosts = nil, policy: ClientPolicy.new, connect: true)
@@ -383,7 +384,7 @@ module Aerospike
383
384
  # read the result, all in one database call. Operations are executed in
384
385
  # the order they are specified.
385
386
  def operate(key, operations, options = nil)
386
- policy = create_policy(options, WritePolicy, default_write_policy)
387
+ policy = create_policy(options, OperatePolicy, default_operate_policy)
387
388
 
388
389
  command = OperateCommand.new(@cluster, policy, key, operations)
389
390
  execute_command(command)
@@ -827,6 +828,7 @@ module Aerospike
827
828
  self.default_query_policy = create_policy(policies[:query], QueryPolicy)
828
829
  self.default_scan_policy = create_policy(policies[:scan], ScanPolicy)
829
830
  self.default_write_policy = create_policy(policies[:write], WritePolicy)
831
+ self.default_operate_policy = create_policy(policies[:operate], OperatePolicy)
830
832
  end
831
833
 
832
834
  def send_info_command(policy, command, node = nil)
@@ -59,6 +59,9 @@ module Aerospike
59
59
  # Create only. Fail if record already exists.
60
60
  INFO2_CREATE_ONLY = Integer(1 << 5)
61
61
 
62
+ # Return a result for every operation.
63
+ INFO2_RESPOND_ALL_OPS = Integer(1 << 7)
64
+
62
65
  # This is the last of a multi-part message.
63
66
  INFO3_LAST = Integer(1 << 0)
64
67
  # Commit to master only before declaring success.
@@ -254,6 +257,7 @@ module Aerospike
254
257
  read_attr = 0
255
258
  write_attr = 0
256
259
  read_header = false
260
+ record_bin_multiplicity = policy.record_bin_multiplicity == RecordBinMultiplicity::ARRAY
257
261
 
258
262
  operations.each do |operation|
259
263
  case operation.op_type
@@ -271,17 +275,24 @@ module Aerospike
271
275
  read_attr |= INFO1_READ
272
276
  read_header = true
273
277
 
274
- when Aerospike::Operation::CDT_READ
278
+ when Aerospike::Operation::CDT_READ,Aerospike::Operation::HLL_READ
275
279
  read_attr |= INFO1_READ
276
280
 
277
281
  else
278
282
  write_attr = INFO2_WRITE
279
283
  end
280
284
 
285
+ if [Aerospike::Operation::HLL_MODIFY, Aerospike::Operation::HLL_READ].include?(operation.op_type)
286
+ record_bin_multiplicity = true
287
+ end
288
+
281
289
  estimate_operation_size_for_operation(operation)
282
290
  end
283
291
  size_buffer
284
292
 
293
+
294
+ write_attr |= INFO2_RESPOND_ALL_OPS if write_attr != 0 && record_bin_multiplicity
295
+
285
296
  if write_attr != 0
286
297
  write_header_with_policy(policy, read_attr, write_attr, field_count, operations.length)
287
298
  else
@@ -32,6 +32,8 @@ module Aerospike
32
32
  PREPEND = 10
33
33
  TOUCH = 11
34
34
  DELETE = 14
35
+ HLL_READ = 15
36
+ HLL_MODIFY = 16
35
37
 
36
38
  def initialize(op_type, bin_name=nil, bin_value=NullValue.new)
37
39
  @op_type = op_type
@@ -31,7 +31,7 @@ module Aerospike
31
31
  # Try node on the same rack as the client first. If there are no nodes on the
32
32
  # same rack, use SEQUENCE instead.
33
33
  #
34
- # ClientPolicy#rack_aware}, ClientPolicy#rack_id, and server rack
34
+ # ClientPolicy#rack_aware, ClientPolicy#rack_id, and server rack
35
35
  # configuration must also be set to enable this functionality.
36
36
  PREFER_RACK = 3
37
37
 
@@ -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
 
@@ -244,6 +251,9 @@ module Aerospike
244
251
  when KEY_EXISTS_ERROR
245
252
  "Key already exists"
246
253
 
254
+ when BIN_EXISTS_ERROR
255
+ "Bin already exists on a create-only operation"
256
+
247
257
  when CLUSTER_KEY_MISMATCH
248
258
  "Cluster key mismatch"
249
259
 
@@ -274,6 +284,9 @@ module Aerospike
274
284
  when UNSUPPORTED_FEATURE
275
285
  "Unsupported Server Feature"
276
286
 
287
+ when BIN_NOT_FOUND
288
+ "Bin not found on update-only operation"
289
+
277
290
  when DEVICE_OVERLOAD
278
291
  "Device overload"
279
292
 
@@ -36,7 +36,7 @@ module Aerospike
36
36
  #RTA_DICT = 15
37
37
  #RTA_APPEND_DICT = 16
38
38
  #RTA_APPEND_LIST = 17
39
- #LUA_BLOB = 18
39
+ HLL = 18
40
40
  MAP = 19
41
41
  LIST = 20
42
42
  GEOJSON = 23
@@ -526,6 +526,49 @@ module Aerospike
526
526
 
527
527
  end
528
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
+
529
572
  #######################################
530
573
 
531
574
  def self.encoding
@@ -572,6 +615,10 @@ module Aerospike
572
615
  hdrsz = 1 + 2 + (ncells * 8)
573
616
  Aerospike::GeoJSON.new(buf.read(offset + hdrsz, length - hdrsz))
574
617
 
618
+ when Aerospike::ParticleType::HLL
619
+ bytes = buf.read(offset,length)
620
+ Aerospike::HLLValue.new(bytes)
621
+
575
622
  else
576
623
  nil
577
624
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Aerospike
3
- VERSION = "2.14.0"
3
+ VERSION = "2.15.0"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aerospike
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.14.0
4
+ version: 2.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Khosrow Afroozeh
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-08-06 00:00:00.000000000 Z
12
+ date: 2020-10-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: msgpack
@@ -55,6 +55,9 @@ files:
55
55
  - lib/aerospike/aerospike_exception.rb
56
56
  - lib/aerospike/atomic/atomic.rb
57
57
  - lib/aerospike/bin.rb
58
+ - lib/aerospike/cdt/hll_operation.rb
59
+ - lib/aerospike/cdt/hll_policy.rb
60
+ - lib/aerospike/cdt/hll_write_flags.rb
58
61
  - lib/aerospike/cdt/list_operation.rb
59
62
  - lib/aerospike/cdt/list_order.rb
60
63
  - lib/aerospike/cdt/list_policy.rb