aerospike 2.24.0 → 2.25.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -15,18 +15,17 @@
15
15
  # License for the specific language governing permissions and limitations under
16
16
  # the License.
17
17
 
18
- require 'time'
19
- require 'zlib'
18
+ require "time"
19
+ require "zlib"
20
20
 
21
- require 'msgpack'
22
- require 'aerospike/result_code'
23
- require 'aerospike/command/field_type'
21
+ require "msgpack"
22
+ require "aerospike/result_code"
23
+ require "aerospike/command/field_type"
24
24
 
25
- require 'aerospike/policy/consistency_level'
26
- require 'aerospike/policy/commit_level'
25
+ require "aerospike/policy/consistency_level"
26
+ require "aerospike/policy/commit_level"
27
27
 
28
28
  module Aerospike
29
-
30
29
  private
31
30
 
32
31
  # Flags commented out are not supported by cmd client.
@@ -34,9 +33,8 @@ module Aerospike
34
33
  INFO1_READ = Integer(1 << 0)
35
34
  # Get all bins.
36
35
  INFO1_GET_ALL = Integer(1 << 1)
37
- # Short query
38
- INFO1_SHORT_QUERY = Integer(1 << 2)
39
-
36
+ # Short query
37
+ INFO1_SHORT_QUERY = Integer(1 << 2)
40
38
 
41
39
  INFO1_BATCH = Integer(1 << 3)
42
40
  # Do not read the bins
@@ -78,19 +76,18 @@ module Aerospike
78
76
  # Completely replace existing record only.
79
77
  INFO3_REPLACE_ONLY = Integer(1 << 5)
80
78
 
81
- MSG_TOTAL_HEADER_SIZE = 30
82
- FIELD_HEADER_SIZE = 5
83
- OPERATION_HEADER_SIZE = 8
84
- MSG_REMAINING_HEADER_SIZE = 22
85
- DIGEST_SIZE = 20
86
- COMPRESS_THRESHOLD = 128
87
- CL_MSG_VERSION = 2
88
- AS_MSG_TYPE = 3
89
- AS_MSG_TYPE_COMPRESSED = 4
79
+ MSG_TOTAL_HEADER_SIZE = 30
80
+ FIELD_HEADER_SIZE = 5
81
+ OPERATION_HEADER_SIZE = 8
82
+ MSG_REMAINING_HEADER_SIZE = 22
83
+ DIGEST_SIZE = 20
84
+ COMPRESS_THRESHOLD = 128
85
+ CL_MSG_VERSION = 2
86
+ AS_MSG_TYPE = 3
87
+ AS_MSG_TYPE_COMPRESSED = 4
90
88
 
91
89
  class Command #:nodoc:
92
-
93
- def initialize(node=nil)
90
+ def initialize(node = nil)
94
91
  @data_offset = 0
95
92
  @data_buffer = nil
96
93
 
@@ -118,6 +115,9 @@ module Aerospike
118
115
  predexp_size = estimate_predexp(policy.predexp)
119
116
  field_count += 1 if predexp_size > 0
120
117
 
118
+ exp_size = estimate_expression_size(@policy.filter_exp)
119
+ field_count += 1 if exp_size > 0
120
+
121
121
  bins.each do |bin|
122
122
  estimate_operation_size_for_bin(bin)
123
123
  end
@@ -127,6 +127,7 @@ module Aerospike
127
127
  write_header_with_policy(policy, 0, INFO2_WRITE, field_count, bins.length)
128
128
  write_key(key, policy)
129
129
  write_predexp(policy.predexp, predexp_size)
130
+ write_filter_exp(@policy.filter_exp, exp_size)
130
131
 
131
132
  bins.each do |bin|
132
133
  write_operation_for_bin(bin, operation)
@@ -144,10 +145,14 @@ module Aerospike
144
145
  predexp_size = estimate_predexp(policy.predexp)
145
146
  field_count += 1 if predexp_size > 0
146
147
 
148
+ exp_size = estimate_expression_size(@policy.filter_exp)
149
+ field_count += 1 if exp_size > 0
150
+
147
151
  size_buffer
148
- write_header_with_policy(policy, 0, INFO2_WRITE|INFO2_DELETE, field_count, 0)
152
+ write_header_with_policy(policy, 0, INFO2_WRITE | INFO2_DELETE, field_count, 0)
149
153
  write_key(key)
150
154
  write_predexp(policy.predexp, predexp_size)
155
+ write_filter_exp(@policy.filter_exp, exp_size)
151
156
  end_cmd
152
157
  end
153
158
 
@@ -159,11 +164,15 @@ module Aerospike
159
164
  predexp_size = estimate_predexp(policy.predexp)
160
165
  field_count += 1 if predexp_size > 0
161
166
 
167
+ exp_size = estimate_expression_size(@policy.filter_exp)
168
+ field_count += 1 if exp_size > 0
169
+
162
170
  estimate_operation_size
163
171
  size_buffer
164
172
  write_header_with_policy(policy, 0, INFO2_WRITE, field_count, 1)
165
173
  write_key(key)
166
174
  write_predexp(policy.predexp, predexp_size)
175
+ write_filter_exp(@policy.filter_exp, exp_size)
167
176
  write_operation_for_operation_type(Aerospike::Operation::TOUCH)
168
177
  end_cmd
169
178
  end
@@ -176,10 +185,14 @@ module Aerospike
176
185
  predexp_size = estimate_predexp(policy.predexp)
177
186
  field_count += 1 if predexp_size > 0
178
187
 
188
+ exp_size = estimate_expression_size(@policy.filter_exp)
189
+ field_count += 1 if exp_size > 0
190
+
179
191
  size_buffer
180
- write_header(policy, INFO1_READ|INFO1_NOBINDATA, 0, field_count, 0)
192
+ write_header(policy, INFO1_READ | INFO1_NOBINDATA, 0, field_count, 0)
181
193
  write_key(key)
182
194
  write_predexp(policy.predexp, predexp_size)
195
+ write_filter_exp(@policy.filter_exp, exp_size)
183
196
  end_cmd
184
197
  end
185
198
 
@@ -191,10 +204,14 @@ module Aerospike
191
204
  predexp_size = estimate_predexp(policy.predexp)
192
205
  field_count += 1 if predexp_size > 0
193
206
 
207
+ exp_size = estimate_expression_size(@policy.filter_exp)
208
+ field_count += 1 if exp_size > 0
209
+
194
210
  size_buffer
195
- write_header(policy, INFO1_READ|INFO1_GET_ALL, 0, field_count, 0)
211
+ write_header(policy, INFO1_READ | INFO1_GET_ALL, 0, field_count, 0)
196
212
  write_key(key)
197
213
  write_predexp(policy.predexp, predexp_size)
214
+ write_filter_exp(@policy.filter_exp, exp_size)
198
215
  end_cmd
199
216
  end
200
217
 
@@ -207,6 +224,8 @@ module Aerospike
207
224
  predexp_size = estimate_predexp(policy.predexp)
208
225
  field_count += 1 if predexp_size > 0
209
226
 
227
+ exp_size = estimate_expression_size(@policy.filter_exp)
228
+ field_count += 1 if exp_size > 0
210
229
 
211
230
  bin_names.each do |bin_name|
212
231
  estimate_operation_size_for_bin_name(bin_name)
@@ -216,6 +235,7 @@ module Aerospike
216
235
  write_header(policy, INFO1_READ, 0, field_count, bin_names.length)
217
236
  write_key(key)
218
237
  write_predexp(policy.predexp, predexp_size)
238
+ write_filter_exp(@policy.filter_exp, exp_size)
219
239
 
220
240
  bin_names.each do |bin_name|
221
241
  write_operation_for_bin_name(bin_name, Aerospike::Operation::READ)
@@ -235,7 +255,10 @@ module Aerospike
235
255
  predexp_size = estimate_predexp(policy.predexp)
236
256
  field_count += 1 if predexp_size > 0
237
257
 
238
- estimate_operation_size_for_bin_name('')
258
+ exp_size = estimate_expression_size(@policy.filter_exp)
259
+ field_count += 1 if exp_size > 0
260
+
261
+ estimate_operation_size_for_bin_name("")
239
262
  size_buffer
240
263
 
241
264
  # The server does not currently return record header data with _INFO1_NOBINDATA attribute set.
@@ -246,70 +269,35 @@ module Aerospike
246
269
 
247
270
  write_key(key)
248
271
  write_predexp(policy.predexp, predexp_size)
249
- write_operation_for_bin_name('', Aerospike::Operation::READ)
272
+ write_filter_exp(@policy.filter_exp, exp_size)
273
+ write_operation_for_bin_name("", Aerospike::Operation::READ)
250
274
  end_cmd
251
275
  end
252
276
 
253
277
  # Implements different command operations
254
- def set_operate(policy, key, operations)
278
+ def set_operate(policy, key, args)
255
279
  begin_cmd
256
280
  field_count = estimate_key_size(key, policy)
257
281
 
258
282
  predexp_size = estimate_predexp(policy.predexp)
259
283
  field_count += 1 if predexp_size > 0
260
284
 
261
- read_attr = 0
262
- write_attr = 0
263
- read_header = false
264
- record_bin_multiplicity = policy.record_bin_multiplicity == RecordBinMultiplicity::ARRAY
265
-
266
- operations.each do |operation|
267
- case operation.op_type
268
- when Aerospike::Operation::READ, Aerospike::Operation::CDT_READ,
269
- Aerospike::Operation::HLL_READ, Aerospike::Operation::BIT_READ
270
- read_attr |= INFO1_READ
271
-
272
- # Read all bins if no bin is specified.
273
- read_attr |= INFO1_GET_ALL unless operation.bin_name
274
-
275
- when Aerospike::Operation::READ_HEADER
276
- # The server does not currently return record header data with _INFO1_NOBINDATA attribute set.
277
- # The workaround is to request a non-existent bin.
278
- # TODO: Fix this on server.
279
- # read_attr |= _INFO1_READ | _INFO1_NOBINDATA
280
- read_attr |= INFO1_READ
281
- read_header = true
282
-
283
- else
284
- write_attr = INFO2_WRITE
285
- end
285
+ exp_size = estimate_expression_size(policy.filter_exp)
286
+ field_count += 1 if exp_size > 0
286
287
 
287
- if [Aerospike::Operation::HLL_MODIFY, Aerospike::Operation::HLL_READ,
288
- Aerospike::Operation::BIT_MODIFY, Aerospike::Operation::BIT_READ].include?(operation.op_type)
289
- record_bin_multiplicity = true
290
- end
288
+ @data_offset += args.size
291
289
 
292
- estimate_operation_size_for_operation(operation)
293
- end
294
290
  size_buffer
295
291
 
296
-
297
- write_attr |= INFO2_RESPOND_ALL_OPS if write_attr != 0 && record_bin_multiplicity
298
-
299
- if write_attr == 0
300
- write_header(policy, read_attr, write_attr, field_count, operations.length)
301
- else
302
- write_header_with_policy(policy, read_attr, write_attr, field_count, operations.length)
303
- end
292
+ write_header_with_policy(policy, args.read_attr, args.write_attr, field_count, args.operations.length)
304
293
  write_key(key, policy)
305
294
  write_predexp(policy.predexp, predexp_size)
295
+ write_filter_exp(policy.filter_exp, exp_size)
306
296
 
307
- operations.each do |operation|
297
+ args.operations.each do |operation|
308
298
  write_operation_for_operation(operation)
309
299
  end
310
300
 
311
- write_operation_for_bin(nil, Aerospike::Operation::READ) if read_header
312
-
313
301
  end_cmd
314
302
  mark_compressed(policy)
315
303
  end
@@ -321,6 +309,9 @@ module Aerospike
321
309
  predexp_size = estimate_predexp(policy.predexp)
322
310
  field_count += 1 if predexp_size > 0
323
311
 
312
+ exp_size = estimate_expression_size(@policy.filter_exp)
313
+ field_count += 1 if exp_size > 0
314
+
324
315
  arg_bytes = args.to_bytes
325
316
 
326
317
  field_count += estimate_udf_size(package_name, function_name, arg_bytes)
@@ -329,6 +320,7 @@ module Aerospike
329
320
  write_header(policy, 0, INFO2_WRITE, field_count, 0)
330
321
  write_key(key, policy)
331
322
  write_predexp(policy.predexp, predexp_size)
323
+ write_filter_exp(@policy.filter_exp, exp_size)
332
324
  write_field_string(package_name, Aerospike::FieldType::UDF_PACKAGE_NAME)
333
325
  write_field_string(function_name, Aerospike::FieldType::UDF_FUNCTION)
334
326
  write_field_bytes(arg_bytes, Aerospike::FieldType::UDF_ARGLIST)
@@ -379,6 +371,9 @@ module Aerospike
379
371
  predexp_size = estimate_predexp(policy.predexp)
380
372
  field_count += 1 if predexp_size > 0
381
373
 
374
+ exp_size = estimate_expression_size(@policy.filter_exp)
375
+ field_count += 1 if exp_size > 0
376
+
382
377
  # Estimate scan options size.
383
378
  # @data_offset += 2 + FIELD_HEADER_SIZE
384
379
  # field_count += 1
@@ -420,7 +415,7 @@ module Aerospike
420
415
 
421
416
  node_partitions.parts_full.each do |part|
422
417
  @data_buffer.write_uint16_little_endian(part.id, @data_offset)
423
- @data_offset+=2
418
+ @data_offset += 2
424
419
  end
425
420
  end
426
421
 
@@ -429,7 +424,7 @@ module Aerospike
429
424
 
430
425
  node_partitions.parts_partial.each do |part|
431
426
  @data_buffer.write_binary(part.digest, @data_offset)
432
- @data_offset+=part.digest.length
427
+ @data_offset += part.digest.length
433
428
  end
434
429
  end
435
430
 
@@ -442,6 +437,7 @@ module Aerospike
442
437
  end
443
438
 
444
439
  write_predexp(policy.predexp, predexp_size)
440
+ write_filter_exp(@policy.filter_exp, exp_size)
445
441
 
446
442
  # write_field_header(2, Aerospike::FieldType::SCAN_OPTIONS)
447
443
 
@@ -479,7 +475,7 @@ module Aerospike
479
475
  while true
480
476
  # too many retries
481
477
  iterations += 1
482
- break if (@policy.max_retries > 0) && (iterations > @policy.max_retries+1)
478
+ break if (@policy.max_retries > 0) && (iterations > @policy.max_retries + 1)
483
479
 
484
480
  # Sleep before trying again, after the first iteration
485
481
  sleep(@policy.sleep_between_retries) if iterations > 1 && @policy.sleep_between_retries > 0
@@ -567,7 +563,6 @@ module Aerospike
567
563
  ensure
568
564
  Buffer.put(@data_buffer)
569
565
  end
570
-
571
566
  end # while
572
567
 
573
568
  # execution timeout
@@ -576,7 +571,6 @@ module Aerospike
576
571
 
577
572
  protected
578
573
 
579
-
580
574
  def estimate_key_size(key, policy = nil)
581
575
  field_count = 0
582
576
 
@@ -646,6 +640,15 @@ module Aerospike
646
640
  return 0
647
641
  end
648
642
 
643
+ def estimate_expression_size(exp)
644
+ unless exp.nil?
645
+ @data_offset += FIELD_HEADER_SIZE
646
+ @data_offset += exp.size
647
+ return exp.size
648
+ end
649
+ 0
650
+ end
651
+
649
652
  # Generic header write.
650
653
  def write_header(policy, read_attr, write_attr, field_count, operation_count)
651
654
  read_attr |= INFO1_CONSISTENCY_ALL if policy.consistency_level == Aerospike::ConsistencyLevel::CONSISTENCY_ALL
@@ -717,7 +720,6 @@ module Aerospike
717
720
  @data_buffer.write_byte(0, 24)
718
721
  @data_buffer.write_byte(0, 25)
719
722
 
720
-
721
723
  @data_buffer.write_int16(field_count, 26)
722
724
  @data_buffer.write_int16(operation_count, 28)
723
725
 
@@ -739,15 +741,14 @@ module Aerospike
739
741
  if policy && policy.respond_to?(:send_key) && policy.send_key == true
740
742
  write_field_value(key.user_key_as_value, Aerospike::FieldType::KEY)
741
743
  end
742
-
743
744
  end
744
745
 
745
746
  def write_operation_for_bin(bin, operation)
746
- name_length = @data_buffer.write_binary(bin.name, @data_offset+OPERATION_HEADER_SIZE)
747
- value_length = bin.value_object.write(@data_buffer, @data_offset+OPERATION_HEADER_SIZE+name_length)
747
+ name_length = @data_buffer.write_binary(bin.name, @data_offset + OPERATION_HEADER_SIZE)
748
+ value_length = bin.value_object.write(@data_buffer, @data_offset + OPERATION_HEADER_SIZE + name_length)
748
749
 
749
750
  # Buffer.Int32ToBytes(name_length+value_length+4, @data_buffer, @data_offset)
750
- @data_buffer.write_int32(name_length+value_length+4, @data_offset)
751
+ @data_buffer.write_int32(name_length + value_length + 4, @data_offset)
751
752
 
752
753
  @data_offset += 4
753
754
  @data_buffer.write_byte(operation, @data_offset)
@@ -764,13 +765,13 @@ module Aerospike
764
765
  def write_operation_for_operation(operation)
765
766
  name_length = 0
766
767
  if operation.bin_name
767
- name_length = @data_buffer.write_binary(operation.bin_name, @data_offset+OPERATION_HEADER_SIZE)
768
+ name_length = @data_buffer.write_binary(operation.bin_name, @data_offset + OPERATION_HEADER_SIZE)
768
769
  end
769
770
 
770
- value_length = operation.bin_value.write(@data_buffer, @data_offset+OPERATION_HEADER_SIZE+name_length)
771
+ value_length = operation.bin_value.write(@data_buffer, @data_offset + OPERATION_HEADER_SIZE + name_length)
771
772
 
772
773
  # Buffer.Int32ToBytes(name_length+value_length+4, @data_buffer, @data_offset)
773
- @data_buffer.write_int32(name_length+value_length+4, @data_offset)
774
+ @data_buffer.write_int32(name_length + value_length + 4, @data_offset)
774
775
 
775
776
  @data_offset += 4
776
777
  @data_buffer.write_byte(operation.op_type, @data_offset)
@@ -785,9 +786,9 @@ module Aerospike
785
786
  end
786
787
 
787
788
  def write_operation_for_bin_name(name, operation)
788
- name_length = @data_buffer.write_binary(name, @data_offset+OPERATION_HEADER_SIZE)
789
+ name_length = @data_buffer.write_binary(name, @data_offset + OPERATION_HEADER_SIZE)
789
790
  # Buffer.Int32ToBytes(name_length+4, @data_buffer, @data_offset)
790
- @data_buffer.write_int32(name_length+4, @data_offset)
791
+ @data_buffer.write_int32(name_length + 4, @data_offset)
791
792
 
792
793
  @data_offset += 4
793
794
  @data_buffer.write_byte(operation, @data_offset)
@@ -826,37 +827,37 @@ module Aerospike
826
827
  end
827
828
 
828
829
  def write_field_string(str, ftype)
829
- len = @data_buffer.write_binary(str, @data_offset+FIELD_HEADER_SIZE)
830
+ len = @data_buffer.write_binary(str, @data_offset + FIELD_HEADER_SIZE)
830
831
  write_field_header(len, ftype)
831
832
  @data_offset += len
832
833
  end
833
834
 
834
835
  def write_u16_little_endian(i, ftype)
835
- @data_buffer.write_uint16_little_endian(i, @data_offset+FIELD_HEADER_SIZE)
836
+ @data_buffer.write_uint16_little_endian(i, @data_offset + FIELD_HEADER_SIZE)
836
837
  write_field_header(2, ftype)
837
838
  @data_offset += 2
838
839
  end
839
840
 
840
841
  def write_field_int(i, ftype)
841
- @data_buffer.write_int32(i, @data_offset+FIELD_HEADER_SIZE)
842
+ @data_buffer.write_int32(i, @data_offset + FIELD_HEADER_SIZE)
842
843
  write_field_header(4, ftype)
843
844
  @data_offset += 4
844
845
  end
845
846
 
846
847
  def write_field_int64(i, ftype)
847
- @data_buffer.write_int64(i, @data_offset+FIELD_HEADER_SIZE)
848
+ @data_buffer.write_int64(i, @data_offset + FIELD_HEADER_SIZE)
848
849
  write_field_header(8, ftype)
849
850
  @data_offset += 8
850
851
  end
851
852
 
852
853
  def write_field_bytes(bytes, ftype)
853
- @data_buffer.write_binary(bytes, @data_offset+FIELD_HEADER_SIZE)
854
+ @data_buffer.write_binary(bytes, @data_offset + FIELD_HEADER_SIZE)
854
855
  write_field_header(bytes.bytesize, ftype)
855
856
  @data_offset += bytes.bytesize
856
857
  end
857
858
 
858
859
  def write_field_header(size, ftype)
859
- @data_buffer.write_int32(size+1, @data_offset)
860
+ @data_buffer.write_int32(size + 1, @data_offset)
860
861
  @data_offset += 4
861
862
  @data_buffer.write_byte(ftype, @data_offset)
862
863
  @data_offset += 1
@@ -864,13 +865,20 @@ module Aerospike
864
865
 
865
866
  def write_predexp(predexp, predexp_size)
866
867
  if predexp && predexp.size > 0
867
- write_field_header(predexp_size, Aerospike::FieldType::PREDEXP)
868
+ write_field_header(predexp_size, Aerospike::FieldType::FILTER_EXP)
868
869
  @data_offset = Aerospike::PredExp.write(
869
870
  predexp, @data_buffer, @data_offset
870
871
  )
871
872
  end
872
873
  end
873
874
 
875
+ def write_filter_exp(exp, exp_size)
876
+ unless exp.nil?
877
+ write_field_header(exp_size, Aerospike::FieldType::FILTER_EXP)
878
+ @data_offset += exp.write(@data_buffer, @data_offset)
879
+ end
880
+ end
881
+
874
882
  def begin_cmd
875
883
  @data_offset = MSG_TOTAL_HEADER_SIZE
876
884
  end
@@ -884,7 +892,7 @@ module Aerospike
884
892
  end
885
893
 
886
894
  def end_cmd
887
- size = (@data_offset-8) | Integer(CL_MSG_VERSION << 56) | Integer(AS_MSG_TYPE << 48)
895
+ size = (@data_offset - 8) | Integer(CL_MSG_VERSION << 56) | Integer(AS_MSG_TYPE << 48)
888
896
  @data_buffer.write_int64(size, 0)
889
897
  end
890
898
 
@@ -898,13 +906,13 @@ module Aerospike
898
906
 
899
907
  # write original size as header
900
908
  proto_s = "%08d" % 0
901
- proto_s[0, 8] = [@data_offset].pack('q>')
909
+ proto_s[0, 8] = [@data_offset].pack("q>")
902
910
  compressed.prepend(proto_s)
903
911
 
904
912
  # write proto
905
- proto = (compressed.size+8) | Integer(CL_MSG_VERSION << 56) | Integer(AS_MSG_TYPE << 48)
913
+ proto = (compressed.size + 8) | Integer(CL_MSG_VERSION << 56) | Integer(AS_MSG_TYPE << 48)
906
914
  proto_s = "%08d" % 0
907
- proto_s[0, 8] = [proto].pack('q>')
915
+ proto_s[0, 8] = [proto].pack("q>")
908
916
  compressed.prepend(proto_s)
909
917
 
910
918
  @data_buffer = Buffer.new(-1, compressed)
@@ -929,7 +937,5 @@ module Aerospike
929
937
  def mark_compressed(policy)
930
938
  @compress = policy.use_compression
931
939
  end
932
-
933
940
  end # class
934
-
935
941
  end # module
@@ -0,0 +1,99 @@
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
+ require "aerospike/operation"
18
+
19
+ module Aerospike
20
+ private
21
+
22
+ class OperateArgs
23
+ attr_reader :write_policy, :operations, :partition
24
+ attr_reader :size, :read_attr, :write_attr, :has_write
25
+
26
+ RESPOND_ALL_OPS_READ_CMDS = [Operation::BIT_READ, Operation::EXP_READ, Operation::HLL_READ, Operation::CDT_READ]
27
+ READ_CMDS = [Operation::BIT_READ, Operation::EXP_READ, Operation::HLL_READ, Operation::CDT_READ, Operation::CDT_READ, Operation::READ]
28
+ MODIFY_CMDS = [Operation::BIT_MODIFY, Operation::EXP_MODIFY, Operation::HLL_MODIFY, Operation::CDT_MODIFY]
29
+
30
+ def initialize(cluster, policy, write_default, read_default, key, operations)
31
+ @operations = operations
32
+
33
+ data_offset = 0
34
+ rattr = 0
35
+ wattr = 0
36
+ write = false
37
+ read_bin = false
38
+ read_header = false
39
+ respond_all_ops = false
40
+
41
+ @operations.each do |operation|
42
+ if READ_CMDS.include?(operation.op_type)
43
+ if RESPOND_ALL_OPS_READ_CMDS.include?(operation.op_type)
44
+ # Map @operations require respond_all_ops to be true.
45
+ respond_all_ops = true
46
+ end
47
+
48
+ rattr |= Aerospike::INFO1_READ
49
+
50
+ # Read all bins if no bin is specified.
51
+ rattr |= Aerospike::INFO1_GET_ALL if operation.bin_name.nil?
52
+ read_bin = true
53
+ elsif operation.op_type == Operation::READ_HEADER
54
+ rattr |= Aerospike::INFO1_READ
55
+ read_header = true
56
+ elsif MODIFY_CMDS.include?(operation.op_type)
57
+ # Map @operations require respond_all_ops to be true.
58
+ respond_all_ops = true
59
+
60
+ wattr = Aerospike::INFO2_WRITE
61
+ write = true
62
+ else
63
+ wattr = Aerospike::INFO2_WRITE
64
+ write = true
65
+ end
66
+ data_offset += operation.bin_name.bytesize + Aerospike::OPERATION_HEADER_SIZE unless operation.bin_name.nil?
67
+ data_offset += operation.bin_value.estimate_size
68
+ end
69
+
70
+ @size = data_offset
71
+ @has_write = write
72
+
73
+ if read_header && !read_bin
74
+ rattr |= Aerospike::INFO1_NOBINDATA
75
+ end
76
+ @read_attr = rattr
77
+
78
+ if policy.nil?
79
+ @write_policy = write ? write_default : read_default
80
+ else
81
+ @write_policy = policy
82
+ end
83
+
84
+ # When GET_ALL is specified, RESPOND_ALL_OPS must be disabled.
85
+ if (respond_all_ops && policy.record_bin_multiplicity) && (rattr & Aerospike::INFO1_GET_ALL) == 0
86
+ wattr |= Aerospike::INFO2_RESPOND_ALL_OPS
87
+ end
88
+ @write_attr = wattr
89
+
90
+ if write
91
+ # @partition = Partition.write(cluster, @write_policy, key)
92
+ @partition = Partition.new_by_key(key)
93
+ else
94
+ # @partition = Partition.read(cluster, @write_policy, key)
95
+ @partition = Partition.new_by_key(key)
96
+ end
97
+ end
98
+ end
99
+ end
@@ -14,33 +14,28 @@
14
14
  # License for the specific language governing permissions and limitations under
15
15
  # the License.
16
16
 
17
- require 'aerospike/command/read_command'
17
+ require "aerospike/command/read_command"
18
18
 
19
19
  module Aerospike
20
-
21
20
  private
22
21
 
23
22
  class OperateCommand < ReadCommand #:nodoc:
23
+ def initialize(cluster, key, args)
24
+ super(cluster, args.write_policy, key, nil)
24
25
 
25
- def initialize(cluster, policy, key, operations)
26
- super(cluster, policy, key, nil)
27
-
28
- @operations = operations
26
+ @args = args
29
27
  end
30
28
 
31
29
  def get_node
32
30
  @cluster.master_node(@partition)
33
31
  end
34
32
 
35
-
36
33
  def write_bins
37
- @operations.select{|op| op.op_type == Aerospike::Operation::WRITE}.map(&:bin).compact
34
+ @operations.select { |op| op.op_type == Aerospike::Operation::WRITE }.map(&:bin).compact
38
35
  end
39
36
 
40
37
  def write_buffer
41
- set_operate(@policy, @key, @operations)
38
+ set_operate(@args.write_policy, @key, @args)
42
39
  end
43
-
44
40
  end # class
45
-
46
41
  end # module