Method: Aerospike::BatchIndexCommand#write_buffer

Defined in:
lib/aerospike/command/batch_index_command.rb

#write_bufferObject

[View source]

35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/aerospike/command/batch_index_command.rb', line 35

def write_buffer
  bin_name_size = 0
  operation_count = 0
  field_count_row = 1
  field_count = 1

  exp_size = estimate_expression_size(@policy.filter_exp)
  field_count += 1 if exp_size > 0

  if bin_names
    bin_names.each do |bin_name|
      bin_name_size += bin_name.bytesize + OPERATION_HEADER_SIZE
    end
    operation_count = bin_names.length
  end
  begin_cmd
  @data_offset += FIELD_HEADER_SIZE + 4 + 1 # batch.keys.length + flags

  prev = nil
  batch.keys.each do |key|
    @data_offset += key.digest.length + 4 # 4 byte batch offset

    if !prev.nil? && prev.namespace == key.namespace
      @data_offset += 1
    else
      @data_offset += key.namespace.bytesize + FIELD_HEADER_SIZE + 1 + 1 + 2 + 2 # repeat/no-repeat flag + read_attr flags + field_count + operation_count
      @data_offset += bin_name_size
    end
  end
  size_buffer
  write_header_read(policy, read_attr | INFO1_BATCH, 0, 0, field_count, 0)

  write_filter_exp(@policy.filter_exp, exp_size)

  write_field_header(0, Aerospike::FieldType::BATCH_INDEX)
  @data_offset += @data_buffer.write_int32(batch.keys.length, @data_offset)
  @data_offset += @data_buffer.write_byte(1, @data_offset)

  prev = nil

  batch.each_key_with_index do |key, index|
    @data_offset += @data_buffer.write_int32(index, @data_offset)
    @data_offset += @data_buffer.write_binary(key.digest, @data_offset)

    if !prev.nil? && prev.namespace == key.namespace
      @data_offset += @data_buffer.write_byte(1, @data_offset)
    else
      @data_offset += @data_buffer.write_byte(0, @data_offset)
      @data_offset += @data_buffer.write_byte(read_attr, @data_offset)
      @data_offset += @data_buffer.write_int16(field_count_row, @data_offset)
      @data_offset += @data_buffer.write_int16(operation_count, @data_offset)
      write_field_string(key.namespace, Aerospike::FieldType::NAMESPACE)

      if bin_names
        bin_names.each do |bin_name|
          write_operation_for_bin_name(bin_name, Aerospike::Operation::READ)
        end
      end
      prev = key
    end
  end
  end_cmd
  mark_compressed(@policy)
end