Class: Cassandra::Composite

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/cassandra/composite.rb

Direct Known Subclasses

DynamicComposite

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*parts) ⇒ Composite

Returns a new instance of Composite.


7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/cassandra/composite.rb', line 7

def initialize(*parts)
  return if parts.empty?

  options = {}
  if parts.last.is_a?(Hash)
    options = parts.pop
  end

  if parts.length == 1 && parts[0].instance_of?(self.class)
    make_from_parts(parts[0].parts, :slice => parts[0].column_slice)
  elsif parts.length == 1 && parts[0].instance_of?(String) && @column_slice.nil? && try_packed_composite(parts[0])
    @hash = parts[0].hash
  else
    make_from_parts(parts, options)
  end
end

Instance Attribute Details

#column_sliceObject (readonly)

Returns the value of attribute column_slice


5
6
7
# File 'lib/cassandra/composite.rb', line 5

def column_slice
  @column_slice
end

#partsObject (readonly)

Returns the value of attribute parts


4
5
6
# File 'lib/cassandra/composite.rb', line 4

def parts
  @parts
end

Class Method Details

.new_from_packed(packed) ⇒ Object


24
25
26
27
28
# File 'lib/cassandra/composite.rb', line 24

def self.new_from_packed(packed)
  obj = new
  obj.fast_unpack(packed)
  return obj
end

.new_from_parts(parts, args = {}) ⇒ Object


30
31
32
33
34
35
# File 'lib/cassandra/composite.rb', line 30

def self.new_from_parts(parts, args={})
  obj = new
  obj.make_from_parts(parts, args)

  return obj
end

Instance Method Details

#<=>(other) ⇒ Object


56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/cassandra/composite.rb', line 56

def <=>(other)
  if !other.instance_of?(self.class)
    return @parts.first <=> other
  end
  eoc = slice_end_of_component.unpack('c')[0]
  other_eoc = other.slice_end_of_component.unpack('c')[0]
  @parts.zip(other.parts).each do |a, b|
    next if a == b
    if a.nil? && b.nil?
      return eoc <=> other_eoc
    end

    if a.nil?
      return @column_slice == :after ? 1 : -1
    end
    if b.nil?
      return other.column_slice == :after ? -1 : 1
    end
    return -1 if a < b
    return 1 if a > b
  end
  return 0
end

#[](*args) ⇒ Object


37
38
39
# File 'lib/cassandra/composite.rb', line 37

def [](*args)
  return @parts[*args]
end

#fast_unpack(packed_string) ⇒ Object


93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/cassandra/composite.rb', line 93

def fast_unpack(packed_string)
  @hash = packed_string.hash

  @parts = []
  end_of_component = packed_string.slice(packed_string.length-1, 1)
  while packed_string.length > 0
    length = packed_string.unpack('n')[0]
    @parts << packed_string.slice(2, length)

    packed_string.slice!(0, length+3)
  end

  @column_slice = :after if end_of_component == "\x01"
  @column_slice = :before if end_of_component == "\xFF"
end

#inspectObject


80
81
82
# File 'lib/cassandra/composite.rb', line 80

def inspect
  return "#<#{self.class}:#{@column_slice} #{@parts.inspect}>"
end

#make_from_parts(parts, args) ⇒ Object

Raises:

  • (ArgumentError)

109
110
111
112
113
# File 'lib/cassandra/composite.rb', line 109

def make_from_parts(parts, args)
  @parts = parts
  @column_slice = args[:slice]
  raise ArgumentError if @column_slice != nil && ![:before, :after].include?(@column_slice)
end

#packObject


41
42
43
44
45
46
47
48
49
50
# File 'lib/cassandra/composite.rb', line 41

def pack
  packed = @parts.map do |part|
    [part.length].pack('n') + part + "\x00"
  end
  if @column_slice
    part = @parts[-1]
    packed[-1] = [part.length].pack('n') + part + slice_end_of_component
  end
  return packed.join('')
end

#slice_end_of_componentObject


84
85
86
87
88
89
90
91
# File 'lib/cassandra/composite.rb', line 84

def slice_end_of_component
  ret = "\x00"
  ret = "\x01" if @column_slice == :after
  ret = "\xFF" if @column_slice == :before

  ret.force_encoding('BINARY') if ret.respond_to?(:force_encoding)
  return ret
end

#to_sObject


52
53
54
# File 'lib/cassandra/composite.rb', line 52

def to_s
  return pack
end