corm 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/corm.rb +2 -0
- data/lib/corm/model.rb +202 -0
- metadata +106 -0
checksums.yaml
ADDED
@@ -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
|
data/lib/corm.rb
ADDED
data/lib/corm/model.rb
ADDED
@@ -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:
|