Module: CassandraObject::Persistence::ClassMethods

Defined in:
lib/cassandra_object/persistence.rb

Instance Method Summary collapse

Instance Method Details

#add(key, value, *columns) ⇒ Object



6
7
8
9
10
11
12
# File 'lib/cassandra_object/persistence.rb', line 6

def add(key, value, *columns)
  CassandraObject::Base.with_connection(key, :write) do
    ActiveSupport::Notifications.instrument("add.cassandra_object", column_family: column_family, key: key, column: columns, value: value) do
      connection.add(column_family, key, value, columns, :consistency => thrift_write_consistency)
    end
  end
end

#add_multiple_columns(key, hash, options = {}) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/cassandra_object/persistence.rb', line 14

def add_multiple_columns(key, hash, options = {})
  columns = hash.keys
  values = []
  if ! columns.empty? && hash[columns.first].is_a?(Hash)
    column_spec = hash.map { |column, sub_columns| sub_columns.keys.map { |sub_column| [column, sub_column].join('.') } }.flatten.join(', ')
    values = hash.map { |column, sub_columns| sub_columns.values }.flatten
  else
    column_spec = columns.join(', ')
    values = hash.values
  end
  values.uniq!
  value_spec = values.length == 1 ? values[0] : '<various>'

  CassandraObject::Base.with_connection(key, :write) do
    ActiveSupport::Notifications.instrument("add.cassandra_object", column_family: column_family, key: key, column: column_spec, value: value_spec) do
      connection.add_multiple_columns(column_family, key, hash, :consistency => thrift_write_consistency)
    end
  end
end

#column_family_configurationObject



123
124
125
# File 'lib/cassandra_object/persistence.rb', line 123

def column_family_configuration
  [{:Name => column_family, :CompareWith => "UTF8Type"}]
end

#create(attributes = {}) ⇒ Object



61
62
63
64
65
# File 'lib/cassandra_object/persistence.rb', line 61

def create(attributes = {})
  new(attributes).tap do |object|
    object.save
  end
end

#decode_columns_hash(attributes) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
# File 'lib/cassandra_object/persistence.rb', line 111

def decode_columns_hash(attributes)
  Hash[attributes.map do |k, v|
         attribute = model_attributes[k]
         decoded = if attribute.converter.method(:decode).arity == 1
                     attribute.converter.decode(v)
                   else
                     attribute.converter.decode(v, attribute.options)
                   end
         [k.to_s, decoded]
       end]
end

#delete_allObject



53
54
55
56
57
58
59
# File 'lib/cassandra_object/persistence.rb', line 53

def delete_all
  CassandraObject::Base.with_connection(nil, :write) do
    ActiveSupport::Notifications.instrument("truncate.cassandra_object", column_family: column_family) do
      connection.truncate!(column_family)
    end
  end
end

#encode_columns_hash(attributes, schema_version) ⇒ Object



101
102
103
104
105
106
107
108
109
# File 'lib/cassandra_object/persistence.rb', line 101

def encode_columns_hash(attributes, schema_version)
  attributes.inject({}) do |memo, (column_name, value)|
    # cassandra stores bytes, not strings, so it has no concept of encodings. The ruby thrift gem 
    # expects all strings to be encoded as ascii-8bit.
    # don't attempt to encode columns that are nil
    memo[column_name.to_s] = value.nil? ? '' : model_attributes[column_name].converter.encode(value).force_encoding('ASCII-8BIT')
    memo
  end.merge({"schema_version" => schema_version.to_s})
end

#instantiate(key, attributes) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/cassandra_object/persistence.rb', line 86

def instantiate(key, attributes)
  # remove any attributes we don't know about. we would do this earlier, but we want to make such
  #  attributes available to migrations
  attributes.delete_if { |k,_| model_attributes[k].nil? }

  allocate.tap do |object|
    object.instance_variable_set("@schema_version", attributes.delete('schema_version'))
    object.instance_variable_set("@key", parse_key(key))
    object.instance_variable_set("@new_record", false)
    object.instance_variable_set("@destroyed", false)
    object.instance_variable_set("@association_cache", {})
    object.instance_variable_set("@attributes", decode_columns_hash(attributes))
  end
end

#remove(key) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/cassandra_object/persistence.rb', line 34

def remove(key)
  CassandraObject::Base.with_connection(key, :write) do
    ActiveSupport::Notifications.instrument("remove.cassandra_object", column_family: column_family, key: key) do
      connection.remove(column_family, key.to_s, consistency: thrift_write_consistency)
    end
  end
end

#remove_counter(key) ⇒ Object

remove_counter is not exposed by Cassandra gem. TODO: move this to Cassandra gem.



44
45
46
47
48
49
50
51
# File 'lib/cassandra_object/persistence.rb', line 44

def remove_counter(key)
  CassandraObject::Base.with_connection(key, :write) do
    ActiveSupport::Notifications.instrument("remove.cassandra_object", column_family: column_family, key: key) do
      parent = CassandraThrift::ColumnParent.new(:column_family => column_family)
      connection.send(:client).remove_counter(key, parent, thrift_write_consistency)
    end
  end
end

#write(key, attributes, schema_version) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/cassandra_object/persistence.rb', line 67

def write(key, attributes, schema_version)
  key.tap do |key|
    unless attributes.blank?
      attributes = encode_columns_hash(attributes, schema_version)
      CassandraObject::Base.with_connection(key, :write) do
        ActiveSupport::Notifications.instrument("insert.cassandra_object", column_family: column_family, key: key, attributes: attributes) do
        
          options = {}.tap do |options|
            options[:consistency] = thrift_write_consistency
            options[:ttl] = row_ttl unless row_ttl.nil?
          end

          connection.insert(column_family, key.to_s, attributes, options)
        end
      end
    end
  end
end