Class: Cassanova::Model

Inherits:
Object
  • Object
show all
Extended by:
ActiveModel::Naming, ActiveModel::Translation
Includes:
ActiveModel::AttributeMethods, ActiveModel::Conversion, ActiveModel::Validations
Defined in:
lib/cassanova.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data = {}) ⇒ Model

Returns a new instance of Model.



17
18
19
20
21
# File 'lib/cassanova.rb', line 17

def initialize data={}
  params = {}
  data.each{|k,v| params[k.to_s] = v }
  cassandra_columns.each{|c| send("#{c}=", params[c.to_s]) }
end

Class Method Details

.belongs_to(model_name) ⇒ Object

Relationship Methods ###



92
93
94
95
96
# File 'lib/cassanova.rb', line 92

def self.belongs_to model_name
  define_method(model_name.to_s) do
    model_name.to_s.classify.constantize.where(:id => send("#{model_name}_id")).first
  end
end

.clusterObject



39
40
41
# File 'lib/cassanova.rb', line 39

def self.cluster
  @@cassandra_cluster ||= Cassandra.cluster(hosts: cassandra_hosts)
end

.columns(*syms) ⇒ Object

Config Methods ###



106
107
108
109
110
111
# File 'lib/cassanova.rb', line 106

def self.columns *syms
  # unless defined? @@cassandra_columns
    @@cassandra_columns = syms if syms.present?
    @@cassandra_columns.each{|c| attr_accessor(c) }
  # end
end

.create(data = {}) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/cassanova.rb', line 69

def self.create data={}
  obj = self.new(data)
  obj.created_at = Time.zone.now if obj.attributes.include?("created_at")
  obj.updated_at = Time.zone.now if obj.attributes.include?("updated_at")
  if obj.valid?
    cols = obj.attributes.keys
    vals = cols.map{|k| obj.send(k) }
    query = "INSERT INTO #{self.name.underscore.pluralize} (#{cols.join(', ')}) VALUES (#{vals.map{'?'}.join(', ')})"
    begin
      query = Cassanova::Model.session.prepare(query)
      result = Cassanova::Model.session.execute(*[query, vals].flatten)
      return result.class == Cassandra::Results::Void
    rescue Exception => e
      obj.errors.add(:cassandra, e.message)
      return obj
    end
  else
    return obj
  end
end

.database(db) ⇒ Object



119
120
121
122
123
# File 'lib/cassanova.rb', line 119

def self.database db
  # unless defined? @@cassandra_database
    @@cassandra_database = db if db.present?
  # end
end

.execute(*query) ⇒ Object



47
48
49
# File 'lib/cassanova.rb', line 47

def self.execute *query
  session.execute(query)
end

.has_many(table_name) ⇒ Object



98
99
100
101
102
# File 'lib/cassanova.rb', line 98

def self.has_many table_name
  define_method(table_name.to_s) do
    table_name.to_s.classify.constantize.where("#{self.class.name.underscore}_id" => send("id")).first
  end
end

.hosts(*host_names) ⇒ Object



113
114
115
116
117
# File 'lib/cassanova.rb', line 113

def self.hosts *host_names
  # unless defined? @@cassandra_hosts
    @@cassandra_hosts = host_names if host_names.present?
  # end
end

.prepare(query) ⇒ Object



51
52
53
# File 'lib/cassanova.rb', line 51

def self.prepare query
  session.prepare(query)
end

.select(*attrs) ⇒ Object



63
64
65
66
67
# File 'lib/cassanova.rb', line 63

def self.select *attrs
  query = Cassanova::Query.new(:table_name => self.name.underscore.pluralize)
  query.select(attrs)
  return query
end

.sessionObject



43
44
45
# File 'lib/cassanova.rb', line 43

def self.session
  @@cassandra_session ||= cluster.connect(cassandra_database)
end

.where(conditions = {}) ⇒ Object

Query Methods ###



57
58
59
60
61
# File 'lib/cassanova.rb', line 57

def self.where conditions={}
  query = Cassanova::Query.new(:table_name => self.name.underscore.pluralize)
  query.where(conditions)
  return query
end

Instance Method Details

#assign_attributes(data = {}) ⇒ Object



29
30
31
32
33
34
35
36
37
# File 'lib/cassanova.rb', line 29

def assign_attributes data={}
  data.each do |k,v|
    begin
      send("#{k}=", v)
    rescue
      # only assign valid attributes
    end
  end
end

#attributesObject



23
24
25
26
27
# File 'lib/cassanova.rb', line 23

def attributes
  attrs = {}
  cassandra_columns.each{|m| attrs[m.to_s] = send(m) }
  return attrs
end