aerospike 2.23.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,7 +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
-
36
+ # Short query
37
+ INFO1_SHORT_QUERY = Integer(1 << 2)
38
38
 
39
39
  INFO1_BATCH = Integer(1 << 3)
40
40
  # Do not read the bins
@@ -76,19 +76,18 @@ module Aerospike
76
76
  # Completely replace existing record only.
77
77
  INFO3_REPLACE_ONLY = Integer(1 << 5)
78
78
 
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
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
88
88
 
89
89
  class Command #:nodoc:
90
-
91
- def initialize(node=nil)
90
+ def initialize(node = nil)
92
91
  @data_offset = 0
93
92
  @data_buffer = nil
94
93
 
@@ -116,6 +115,9 @@ module Aerospike
116
115
  predexp_size = estimate_predexp(policy.predexp)
117
116
  field_count += 1 if predexp_size > 0
118
117
 
118
+ exp_size = estimate_expression_size(@policy.filter_exp)
119
+ field_count += 1 if exp_size > 0
120
+
119
121
  bins.each do |bin|
120
122
  estimate_operation_size_for_bin(bin)
121
123
  end
@@ -125,6 +127,7 @@ module Aerospike
125
127
  write_header_with_policy(policy, 0, INFO2_WRITE, field_count, bins.length)
126
128
  write_key(key, policy)
127
129
  write_predexp(policy.predexp, predexp_size)
130
+ write_filter_exp(@policy.filter_exp, exp_size)
128
131
 
129
132
  bins.each do |bin|
130
133
  write_operation_for_bin(bin, operation)
@@ -142,10 +145,14 @@ module Aerospike
142
145
  predexp_size = estimate_predexp(policy.predexp)
143
146
  field_count += 1 if predexp_size > 0
144
147
 
148
+ exp_size = estimate_expression_size(@policy.filter_exp)
149
+ field_count += 1 if exp_size > 0
150
+
145
151
  size_buffer
146
- 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)
147
153
  write_key(key)
148
154
  write_predexp(policy.predexp, predexp_size)
155
+ write_filter_exp(@policy.filter_exp, exp_size)
149
156
  end_cmd
150
157
  end
151
158
 
@@ -157,11 +164,15 @@ module Aerospike
157
164
  predexp_size = estimate_predexp(policy.predexp)
158
165
  field_count += 1 if predexp_size > 0
159
166
 
167
+ exp_size = estimate_expression_size(@policy.filter_exp)
168
+ field_count += 1 if exp_size > 0
169
+
160
170
  estimate_operation_size
161
171
  size_buffer
162
172
  write_header_with_policy(policy, 0, INFO2_WRITE, field_count, 1)
163
173
  write_key(key)
164
174
  write_predexp(policy.predexp, predexp_size)
175
+ write_filter_exp(@policy.filter_exp, exp_size)
165
176
  write_operation_for_operation_type(Aerospike::Operation::TOUCH)
166
177
  end_cmd
167
178
  end
@@ -174,10 +185,14 @@ module Aerospike
174
185
  predexp_size = estimate_predexp(policy.predexp)
175
186
  field_count += 1 if predexp_size > 0
176
187
 
188
+ exp_size = estimate_expression_size(@policy.filter_exp)
189
+ field_count += 1 if exp_size > 0
190
+
177
191
  size_buffer
178
- write_header(policy, INFO1_READ|INFO1_NOBINDATA, 0, field_count, 0)
192
+ write_header(policy, INFO1_READ | INFO1_NOBINDATA, 0, field_count, 0)
179
193
  write_key(key)
180
194
  write_predexp(policy.predexp, predexp_size)
195
+ write_filter_exp(@policy.filter_exp, exp_size)
181
196
  end_cmd
182
197
  end
183
198
 
@@ -189,10 +204,14 @@ module Aerospike
189
204
  predexp_size = estimate_predexp(policy.predexp)
190
205
  field_count += 1 if predexp_size > 0
191
206
 
207
+ exp_size = estimate_expression_size(@policy.filter_exp)
208
+ field_count += 1 if exp_size > 0
209
+
192
210
  size_buffer
193
- 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)
194
212
  write_key(key)
195
213
  write_predexp(policy.predexp, predexp_size)
214
+ write_filter_exp(@policy.filter_exp, exp_size)
196
215
  end_cmd
197
216
  end
198
217
 
@@ -205,6 +224,8 @@ module Aerospike
205
224
  predexp_size = estimate_predexp(policy.predexp)
206
225
  field_count += 1 if predexp_size > 0
207
226
 
227
+ exp_size = estimate_expression_size(@policy.filter_exp)
228
+ field_count += 1 if exp_size > 0
208
229
 
209
230
  bin_names.each do |bin_name|
210
231
  estimate_operation_size_for_bin_name(bin_name)
@@ -214,6 +235,7 @@ module Aerospike
214
235
  write_header(policy, INFO1_READ, 0, field_count, bin_names.length)
215
236
  write_key(key)
216
237
  write_predexp(policy.predexp, predexp_size)
238
+ write_filter_exp(@policy.filter_exp, exp_size)
217
239
 
218
240
  bin_names.each do |bin_name|
219
241
  write_operation_for_bin_name(bin_name, Aerospike::Operation::READ)
@@ -233,7 +255,10 @@ module Aerospike
233
255
  predexp_size = estimate_predexp(policy.predexp)
234
256
  field_count += 1 if predexp_size > 0
235
257
 
236
- 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("")
237
262
  size_buffer
238
263
 
239
264
  # The server does not currently return record header data with _INFO1_NOBINDATA attribute set.
@@ -244,70 +269,35 @@ module Aerospike
244
269
 
245
270
  write_key(key)
246
271
  write_predexp(policy.predexp, predexp_size)
247
- 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)
248
274
  end_cmd
249
275
  end
250
276
 
251
277
  # Implements different command operations
252
- def set_operate(policy, key, operations)
278
+ def set_operate(policy, key, args)
253
279
  begin_cmd
254
280
  field_count = estimate_key_size(key, policy)
255
281
 
256
282
  predexp_size = estimate_predexp(policy.predexp)
257
283
  field_count += 1 if predexp_size > 0
258
284
 
259
- read_attr = 0
260
- write_attr = 0
261
- read_header = false
262
- record_bin_multiplicity = policy.record_bin_multiplicity == RecordBinMultiplicity::ARRAY
263
-
264
- operations.each do |operation|
265
- case operation.op_type
266
- when Aerospike::Operation::READ, Aerospike::Operation::CDT_READ,
267
- Aerospike::Operation::HLL_READ, Aerospike::Operation::BIT_READ
268
- read_attr |= INFO1_READ
269
-
270
- # Read all bins if no bin is specified.
271
- read_attr |= INFO1_GET_ALL unless operation.bin_name
272
-
273
- when Aerospike::Operation::READ_HEADER
274
- # The server does not currently return record header data with _INFO1_NOBINDATA attribute set.
275
- # The workaround is to request a non-existent bin.
276
- # TODO: Fix this on server.
277
- # read_attr |= _INFO1_READ | _INFO1_NOBINDATA
278
- read_attr |= INFO1_READ
279
- read_header = true
280
-
281
- else
282
- write_attr = INFO2_WRITE
283
- end
285
+ exp_size = estimate_expression_size(policy.filter_exp)
286
+ field_count += 1 if exp_size > 0
284
287
 
285
- if [Aerospike::Operation::HLL_MODIFY, Aerospike::Operation::HLL_READ,
286
- Aerospike::Operation::BIT_MODIFY, Aerospike::Operation::BIT_READ].include?(operation.op_type)
287
- record_bin_multiplicity = true
288
- end
288
+ @data_offset += args.size
289
289
 
290
- estimate_operation_size_for_operation(operation)
291
- end
292
290
  size_buffer
293
291
 
294
-
295
- write_attr |= INFO2_RESPOND_ALL_OPS if write_attr != 0 && record_bin_multiplicity
296
-
297
- if write_attr == 0
298
- write_header(policy, read_attr, write_attr, field_count, operations.length)
299
- else
300
- write_header_with_policy(policy, read_attr, write_attr, field_count, operations.length)
301
- end
292
+ write_header_with_policy(policy, args.read_attr, args.write_attr, field_count, args.operations.length)
302
293
  write_key(key, policy)
303
294
  write_predexp(policy.predexp, predexp_size)
295
+ write_filter_exp(policy.filter_exp, exp_size)
304
296
 
305
- operations.each do |operation|
297
+ args.operations.each do |operation|
306
298
  write_operation_for_operation(operation)
307
299
  end
308
300
 
309
- write_operation_for_bin(nil, Aerospike::Operation::READ) if read_header
310
-
311
301
  end_cmd
312
302
  mark_compressed(policy)
313
303
  end
@@ -319,6 +309,9 @@ module Aerospike
319
309
  predexp_size = estimate_predexp(policy.predexp)
320
310
  field_count += 1 if predexp_size > 0
321
311
 
312
+ exp_size = estimate_expression_size(@policy.filter_exp)
313
+ field_count += 1 if exp_size > 0
314
+
322
315
  arg_bytes = args.to_bytes
323
316
 
324
317
  field_count += estimate_udf_size(package_name, function_name, arg_bytes)
@@ -327,6 +320,7 @@ module Aerospike
327
320
  write_header(policy, 0, INFO2_WRITE, field_count, 0)
328
321
  write_key(key, policy)
329
322
  write_predexp(policy.predexp, predexp_size)
323
+ write_filter_exp(@policy.filter_exp, exp_size)
330
324
  write_field_string(package_name, Aerospike::FieldType::UDF_PACKAGE_NAME)
331
325
  write_field_string(function_name, Aerospike::FieldType::UDF_FUNCTION)
332
326
  write_field_bytes(arg_bytes, Aerospike::FieldType::UDF_ARGLIST)
@@ -377,6 +371,9 @@ module Aerospike
377
371
  predexp_size = estimate_predexp(policy.predexp)
378
372
  field_count += 1 if predexp_size > 0
379
373
 
374
+ exp_size = estimate_expression_size(@policy.filter_exp)
375
+ field_count += 1 if exp_size > 0
376
+
380
377
  # Estimate scan options size.
381
378
  # @data_offset += 2 + FIELD_HEADER_SIZE
382
379
  # field_count += 1
@@ -418,7 +415,7 @@ module Aerospike
418
415
 
419
416
  node_partitions.parts_full.each do |part|
420
417
  @data_buffer.write_uint16_little_endian(part.id, @data_offset)
421
- @data_offset+=2
418
+ @data_offset += 2
422
419
  end
423
420
  end
424
421
 
@@ -427,7 +424,7 @@ module Aerospike
427
424
 
428
425
  node_partitions.parts_partial.each do |part|
429
426
  @data_buffer.write_binary(part.digest, @data_offset)
430
- @data_offset+=part.digest.length
427
+ @data_offset += part.digest.length
431
428
  end
432
429
  end
433
430
 
@@ -440,6 +437,7 @@ module Aerospike
440
437
  end
441
438
 
442
439
  write_predexp(policy.predexp, predexp_size)
440
+ write_filter_exp(@policy.filter_exp, exp_size)
443
441
 
444
442
  # write_field_header(2, Aerospike::FieldType::SCAN_OPTIONS)
445
443
 
@@ -454,7 +452,7 @@ module Aerospike
454
452
  # @data_buffer.write_byte(policy.scan_percent.to_i.ord, @data_offset)
455
453
  # @data_offset += 1
456
454
 
457
- write_field_header(4, Aerospike::FieldType::SCAN_TIMEOUT)
455
+ write_field_header(4, Aerospike::FieldType::SOCKET_TIMEOUT)
458
456
  @data_buffer.write_uint32(policy.socket_timeout.to_i, @data_offset)
459
457
  @data_offset += 4
460
458
 
@@ -477,7 +475,7 @@ module Aerospike
477
475
  while true
478
476
  # too many retries
479
477
  iterations += 1
480
- break if (@policy.max_retries > 0) && (iterations > @policy.max_retries+1)
478
+ break if (@policy.max_retries > 0) && (iterations > @policy.max_retries + 1)
481
479
 
482
480
  # Sleep before trying again, after the first iteration
483
481
  sleep(@policy.sleep_between_retries) if iterations > 1 && @policy.sleep_between_retries > 0
@@ -565,7 +563,6 @@ module Aerospike
565
563
  ensure
566
564
  Buffer.put(@data_buffer)
567
565
  end
568
-
569
566
  end # while
570
567
 
571
568
  # execution timeout
@@ -574,7 +571,6 @@ module Aerospike
574
571
 
575
572
  protected
576
573
 
577
-
578
574
  def estimate_key_size(key, policy = nil)
579
575
  field_count = 0
580
576
 
@@ -644,6 +640,15 @@ module Aerospike
644
640
  return 0
645
641
  end
646
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
+
647
652
  # Generic header write.
648
653
  def write_header(policy, read_attr, write_attr, field_count, operation_count)
649
654
  read_attr |= INFO1_CONSISTENCY_ALL if policy.consistency_level == Aerospike::ConsistencyLevel::CONSISTENCY_ALL
@@ -715,7 +720,6 @@ module Aerospike
715
720
  @data_buffer.write_byte(0, 24)
716
721
  @data_buffer.write_byte(0, 25)
717
722
 
718
-
719
723
  @data_buffer.write_int16(field_count, 26)
720
724
  @data_buffer.write_int16(operation_count, 28)
721
725
 
@@ -737,15 +741,14 @@ module Aerospike
737
741
  if policy && policy.respond_to?(:send_key) && policy.send_key == true
738
742
  write_field_value(key.user_key_as_value, Aerospike::FieldType::KEY)
739
743
  end
740
-
741
744
  end
742
745
 
743
746
  def write_operation_for_bin(bin, operation)
744
- name_length = @data_buffer.write_binary(bin.name, @data_offset+OPERATION_HEADER_SIZE)
745
- 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)
746
749
 
747
750
  # Buffer.Int32ToBytes(name_length+value_length+4, @data_buffer, @data_offset)
748
- @data_buffer.write_int32(name_length+value_length+4, @data_offset)
751
+ @data_buffer.write_int32(name_length + value_length + 4, @data_offset)
749
752
 
750
753
  @data_offset += 4
751
754
  @data_buffer.write_byte(operation, @data_offset)
@@ -762,13 +765,13 @@ module Aerospike
762
765
  def write_operation_for_operation(operation)
763
766
  name_length = 0
764
767
  if operation.bin_name
765
- 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)
766
769
  end
767
770
 
768
- 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)
769
772
 
770
773
  # Buffer.Int32ToBytes(name_length+value_length+4, @data_buffer, @data_offset)
771
- @data_buffer.write_int32(name_length+value_length+4, @data_offset)
774
+ @data_buffer.write_int32(name_length + value_length + 4, @data_offset)
772
775
 
773
776
  @data_offset += 4
774
777
  @data_buffer.write_byte(operation.op_type, @data_offset)
@@ -783,9 +786,9 @@ module Aerospike
783
786
  end
784
787
 
785
788
  def write_operation_for_bin_name(name, operation)
786
- 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)
787
790
  # Buffer.Int32ToBytes(name_length+4, @data_buffer, @data_offset)
788
- @data_buffer.write_int32(name_length+4, @data_offset)
791
+ @data_buffer.write_int32(name_length + 4, @data_offset)
789
792
 
790
793
  @data_offset += 4
791
794
  @data_buffer.write_byte(operation, @data_offset)
@@ -824,37 +827,37 @@ module Aerospike
824
827
  end
825
828
 
826
829
  def write_field_string(str, ftype)
827
- len = @data_buffer.write_binary(str, @data_offset+FIELD_HEADER_SIZE)
830
+ len = @data_buffer.write_binary(str, @data_offset + FIELD_HEADER_SIZE)
828
831
  write_field_header(len, ftype)
829
832
  @data_offset += len
830
833
  end
831
834
 
832
835
  def write_u16_little_endian(i, ftype)
833
- @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)
834
837
  write_field_header(2, ftype)
835
838
  @data_offset += 2
836
839
  end
837
840
 
838
841
  def write_field_int(i, ftype)
839
- @data_buffer.write_int32(i, @data_offset+FIELD_HEADER_SIZE)
842
+ @data_buffer.write_int32(i, @data_offset + FIELD_HEADER_SIZE)
840
843
  write_field_header(4, ftype)
841
844
  @data_offset += 4
842
845
  end
843
846
 
844
847
  def write_field_int64(i, ftype)
845
- @data_buffer.write_int64(i, @data_offset+FIELD_HEADER_SIZE)
848
+ @data_buffer.write_int64(i, @data_offset + FIELD_HEADER_SIZE)
846
849
  write_field_header(8, ftype)
847
850
  @data_offset += 8
848
851
  end
849
852
 
850
853
  def write_field_bytes(bytes, ftype)
851
- @data_buffer.write_binary(bytes, @data_offset+FIELD_HEADER_SIZE)
854
+ @data_buffer.write_binary(bytes, @data_offset + FIELD_HEADER_SIZE)
852
855
  write_field_header(bytes.bytesize, ftype)
853
856
  @data_offset += bytes.bytesize
854
857
  end
855
858
 
856
859
  def write_field_header(size, ftype)
857
- @data_buffer.write_int32(size+1, @data_offset)
860
+ @data_buffer.write_int32(size + 1, @data_offset)
858
861
  @data_offset += 4
859
862
  @data_buffer.write_byte(ftype, @data_offset)
860
863
  @data_offset += 1
@@ -862,13 +865,20 @@ module Aerospike
862
865
 
863
866
  def write_predexp(predexp, predexp_size)
864
867
  if predexp && predexp.size > 0
865
- write_field_header(predexp_size, Aerospike::FieldType::PREDEXP)
868
+ write_field_header(predexp_size, Aerospike::FieldType::FILTER_EXP)
866
869
  @data_offset = Aerospike::PredExp.write(
867
870
  predexp, @data_buffer, @data_offset
868
871
  )
869
872
  end
870
873
  end
871
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
+
872
882
  def begin_cmd
873
883
  @data_offset = MSG_TOTAL_HEADER_SIZE
874
884
  end
@@ -882,7 +892,7 @@ module Aerospike
882
892
  end
883
893
 
884
894
  def end_cmd
885
- 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)
886
896
  @data_buffer.write_int64(size, 0)
887
897
  end
888
898
 
@@ -896,13 +906,13 @@ module Aerospike
896
906
 
897
907
  # write original size as header
898
908
  proto_s = "%08d" % 0
899
- proto_s[0, 8] = [@data_offset].pack('q>')
909
+ proto_s[0, 8] = [@data_offset].pack("q>")
900
910
  compressed.prepend(proto_s)
901
911
 
902
912
  # write proto
903
- 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)
904
914
  proto_s = "%08d" % 0
905
- proto_s[0, 8] = [proto].pack('q>')
915
+ proto_s[0, 8] = [proto].pack("q>")
906
916
  compressed.prepend(proto_s)
907
917
 
908
918
  @data_buffer = Buffer.new(-1, compressed)
@@ -927,7 +937,5 @@ module Aerospike
927
937
  def mark_compressed(policy)
928
938
  @compress = policy.use_compression
929
939
  end
930
-
931
940
  end # class
932
-
933
941
  end # module
@@ -21,34 +21,31 @@ module Aerospike
21
21
 
22
22
  module FieldType
23
23
 
24
- NAMESPACE = 0
25
- TABLE = 1
26
- KEY = 2
27
- #BIN = 3
28
- DIGEST_RIPE = 4
29
- #GU_TID = 5
30
- DIGEST_RIPE_ARRAY = 6
31
- TRAN_ID = 7 # user supplied transaction id, which is simply passed back
32
- SCAN_OPTIONS = 8
33
- SCAN_TIMEOUT = 9
34
- RECORDS_PER_SECOND = 10
35
- PID_ARRAY = 11
36
- DIGEST_ARRAY = 12
37
- MAX_RECORDS = 13
38
- BVAL_ARRAY = 15
39
- INDEX_NAME = 21
40
- INDEX_RANGE = 22
41
- INDEX_FILTER = 23
42
- INDEX_LIMIT = 24
43
- INDEX_ORDER_BY = 25
44
- INDEX_TYPE = 26
45
- UDF_PACKAGE_NAME = 30
46
- UDF_FUNCTION = 31
47
- UDF_ARGLIST = 32
48
- UDF_OP = 33
49
- QUERY_BINLIST = 40
50
- BATCH_INDEX = 41
51
- PREDEXP = 43
24
+ NAMESPACE = 0
25
+ TABLE = 1
26
+ KEY = 2
27
+ DIGEST_RIPE = 4
28
+ DIGEST_RIPE_ARRAY = 6
29
+ TRAN_ID = 7 # user supplied transaction id, which is simply passed back
30
+ SCAN_OPTIONS = 8
31
+ SOCKET_TIMEOUT = 9
32
+ RECORDS_PER_SECOND = 10
33
+ PID_ARRAY = 11
34
+ DIGEST_ARRAY = 12
35
+ MAX_RECORDS = 13
36
+ BVAL_ARRAY = 15
37
+ INDEX_NAME = 21
38
+ INDEX_RANGE = 22
39
+ INDEX_CONTEXT = 23
40
+ INDEX_TYPE = 26
41
+ UDF_PACKAGE_NAME = 30
42
+ UDF_FUNCTION = 31
43
+ UDF_ARGLIST = 32
44
+ UDF_OP = 33
45
+ QUERY_BINLIST = 40
46
+ BATCH_INDEX = 41
47
+ BATCH_INDEX_WITH_SET = 42
48
+ FILTER_EXP = 43
52
49
 
53
50
  end # module
54
51
 
@@ -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