corm 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/lib/corm.rb +2 -0
  3. data/lib/corm/model.rb +202 -0
  4. metadata +106 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 67ef8193840e0b7e30a9c91e1514d810375df22e
4
+ data.tar.gz: f04ac8aedcf098c9dc693b894b2a87c557d1d800
5
+ SHA512:
6
+ metadata.gz: 4353603cfd46afb226f050ff30dade6cd58298176a9a48ba65c28c4114511b2be191881aa2eef9b53d0af9b824c83e6d14a8658147de56689b7163a7ef51b948
7
+ data.tar.gz: 0c55131ed43b43cb681f1422d50f166d0860d5b346e1b02f248db53d068b88fcdbeccd7cf0101c09f1135123883ac378dc426f8f60a55a44ff91c7a2337817c5
@@ -0,0 +1,2 @@
1
+ # encoding: utf-8
2
+ require 'corm/model'
@@ -0,0 +1,202 @@
1
+ # encoding: utf-8
2
+
3
+ require 'cassandra'
4
+ require 'multi_json'
5
+ require 'set'
6
+
7
+
8
+ module Corm
9
+
10
+ class Model
11
+
12
+ def self.configure opts = {}
13
+ @@cluster = Cassandra.cluster opts
14
+ end
15
+
16
+ def self.cluster
17
+ @@cluster
18
+ end
19
+
20
+ def self.execute *args
21
+ session.execute *args
22
+ end
23
+
24
+ def self.field name, type, pkey = false
25
+
26
+ fields[name.to_s.downcase] = type.to_s.downcase
27
+
28
+ primary_key name.to_s.downcase if pkey
29
+
30
+ send(:define_method, name.to_s.downcase) do
31
+ type = self.class.fields[name.to_s.downcase]
32
+ value = record[name.to_s.downcase]
33
+ if type == 'json'
34
+ MultiJson.decode value
35
+ elsif type.start_with?('list') && type['json']
36
+ value.map{|s| MultiJson.decode s}
37
+ elsif type.start_with?('set') && type['json']
38
+ Set.new value.map{|s| MultiJson.decode s}
39
+ elsif type.start_with?('map') && type['json']
40
+ value.inject({}) do |hash, (k, v)|
41
+ k = MultiJson.decode k if type['json,'] || type['json ,']
42
+ v = MultiJson.decode v if type[', json'] || type[',json']
43
+ hash.merge(k => v)
44
+ end
45
+ else
46
+ value
47
+ end
48
+ end
49
+
50
+ send(:define_method, '[]') do |field|
51
+ send field.to_s.downcase
52
+ end
53
+
54
+ send(:define_method, "#{name.to_s.downcase}=") do |value|
55
+ type = self.class.fields[name.to_s.downcase]
56
+ record[name.to_s.downcase] = if type == 'json'
57
+ MultiJson.encode value
58
+ elsif type.start_with?('list') && type['json']
59
+ value.map{|s| MultiJson.encode s}
60
+ elsif type.start_with?('set') && type['json']
61
+ Set.new value.map{|s| MultiJson.encode s}
62
+ elsif type.start_with?('map') && type['json']
63
+ value.inject({}) do |hash, (k, v)|
64
+ k = MultiJson.encode k if type['json,'] || type['json ,']
65
+ v = MultiJson.encode v if type[', json'] || type[',json']
66
+ hash.merge(k => v)
67
+ end
68
+ else
69
+ value
70
+ end
71
+ end
72
+
73
+ send(:define_method, '[]=') do |field, value|
74
+ send "#{field.to_s.downcase}=", value
75
+ end
76
+
77
+ nil
78
+ end
79
+
80
+ def self.fields
81
+ @@fields ||= {}
82
+ @@fields
83
+ end
84
+
85
+ def self.get relations
86
+ if statements['get'].nil?
87
+ fields = primary_key.flatten.map{ |key| "#{key} = ?" }.join ' AND '
88
+ statement = "SELECT * FROM #{keyspace}.#{table} WHERE #{fields} LIMIT 1;"
89
+ statements['get'] = session.prepare statement
90
+ end
91
+ values = primary_key.flatten.map{ |key| relations[key.to_s] || relations[key.to_sym] }
92
+ _cassandra_record = execute(statements['get'], arguments: values).first
93
+ _cassandra_record ? self.new(_cassandra_record: _cassandra_record) : nil
94
+ end
95
+
96
+ def self.keyspace name = nil
97
+ @@keyspace = name.to_s unless name.nil?
98
+ @@keyspace
99
+ end
100
+
101
+ def self.primary_key partition_key = nil, *cols
102
+ @@primary_key = [Array(partition_key), cols] unless partition_key.nil?
103
+ @@primary_key
104
+ end
105
+
106
+ def self.properties *args
107
+ @@properties ||= args
108
+ @@properties
109
+ end
110
+
111
+ def self.session
112
+ @@session ||= cluster.connect keyspace
113
+ @@session
114
+ end
115
+
116
+ def self.statements
117
+ @@statements ||= {}
118
+ @@statements
119
+ end
120
+
121
+ def self.table name = nil
122
+ @@table = name unless name.nil?
123
+ @@table
124
+ end
125
+
126
+ def self.table!
127
+ table_ = [keyspace, table].compact.join '.'
128
+ pkey = []
129
+ partition_key = primary_key[0].join(',')
130
+ pkey << (primary_key[0].count > 1 ? "(#{partition_key})" : partition_key) unless primary_key[0].to_a.empty?
131
+ pkey << primary_key[1].join(',') unless primary_key[1].to_a.empty?
132
+ pkey = pkey.join ','
133
+ fields_ = fields.to_a.map{ |args| args.join ' ' }.concat(["PRIMARY KEY (#{pkey})"]).join ', '
134
+ definition = "CREATE TABLE #{table_} (#{fields_})".downcase.gsub('json', 'text')
135
+ definition = properties.to_a.empty? ? "#{definition};" : "#{definition} WITH #{properties.to_a.join ' AND '};"
136
+ execute definition
137
+ end
138
+
139
+ def initialize opts = {}
140
+ @record = opts.delete(:_cassandra_record) || opts.delete('_cassandra_record')
141
+ opts.each{ |k,v| self.send "#{k}=", v } if @record.nil?
142
+ end
143
+
144
+ def delete
145
+ if statements['delete'].nil?
146
+ pks = primary_key.flatten.map{ |key| "#{key} = ?" }.join ' AND '
147
+ statement = "DELETE FROM #{keyspace}.#{table} WHERE #{pks};"
148
+ statements['delete'] = session.prepare statement
149
+ end
150
+ values = primary_key.flatten.map{ |key| record[key.to_s] || record[key.to_sym] }
151
+ execute statements['delete'], arguments: values
152
+ nil
153
+ end
154
+
155
+ def record
156
+ @record ||= {}
157
+ @record
158
+ end
159
+
160
+ def save
161
+ if statements['save'].nil?
162
+ values = fields.keys.map{'?'} .join ','
163
+ statement = "INSERT INTO #{keyspace}.#{table} (#{fields.keys.join ','}) VALUES (#{values});"
164
+ statements['save'] = session.prepare statement
165
+ end
166
+ puts execute statements['save'], arguments: fields.keys.map{|k| record[k]}
167
+ nil
168
+ end
169
+
170
+ private
171
+
172
+ def execute *args
173
+ self.class.execute *args
174
+ end
175
+
176
+ def keyspace
177
+ self.class.keyspace
178
+ end
179
+
180
+ def fields
181
+ self.class.fields
182
+ end
183
+
184
+ def primary_key
185
+ self.class.primary_key
186
+ end
187
+
188
+ def session
189
+ self.class.session
190
+ end
191
+
192
+ def statements
193
+ self.class.statements
194
+ end
195
+
196
+ def table
197
+ self.class.table
198
+ end
199
+
200
+ end
201
+
202
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: corm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Stefano Fontanelli
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cassandra-driver
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.1
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.0.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 2.0.1
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.0.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: multi_json
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 1.10.1
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.10.1
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: 1.10.1
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.10.1
53
+ - !ruby/object:Gem::Dependency
54
+ name: rake
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: 10.0.0
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 10.0.0
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 10.0.0
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 10.0.0
73
+ description: ''
74
+ email:
75
+ - stefano@gild.com
76
+ executables: []
77
+ extensions: []
78
+ extra_rdoc_files: []
79
+ files:
80
+ - lib/corm.rb
81
+ - lib/corm/model.rb
82
+ homepage: https://github.com/stefanofontanelli/corm
83
+ licenses: []
84
+ metadata: {}
85
+ post_install_message:
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 2.2.2
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: Very basic Cassandrea ORM which is rails-deps-free
105
+ test_files: []
106
+ has_rdoc: