cassandro 1.1.0 → 1.2.0
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 +5 -13
- data/.gitignore +1 -0
- data/README.md +26 -0
- data/cassandro.gemspec +1 -1
- data/lib/cassandro/model.rb +28 -2
- data/test/cassandro_model_test.rb +64 -0
- data/test/support/tables.rb +1 -0
- metadata +20 -21
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
Y2M3MTA2ZTVjMGJkOTZjNTdiNWZmNGY0NzE0YzU4ZjMyNTM3NmFmNw==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0120288029f77b9b0c1f5decbf83dd3aa28ee3f6
|
4
|
+
data.tar.gz: 3f50c226fb664ccbd79eb2e95b6c638b0a0caaf0
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
N2E5NjNjZGVlNTFjZDE2NDAwNTJmMWY4ZmIyMzRkMWMyN2M1ODU1OTE0ODBi
|
11
|
-
MDhkODlhN2FmMjhkNWM3NjJlYWRiNzBhNmRlZDU5MjFlZTNlYWE=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MDc2OTk4YTA4NDc3MzI1MGZmMmViMWYxYjdjMjBkNGFiYTIyNjI4MmVlMDIz
|
14
|
-
ZGM5N2EzZDk1Y2ZlYjM0N2IwMmJmODM1NWU4ZWNkNDkxMmM3NDFjYmUzMTIy
|
15
|
-
ZTdlZDQ4MmRhMGRlOTM1YzAwMGNjYTZmYmMwZTM0YTU4MjY2ZGY=
|
6
|
+
metadata.gz: 734ad77b4020a932713e66d2618815798c14b850a0243fd3f36c2d621dcaaec4b4d937f7c4a66c624dc13c653618039c55534bb2d904c7c28569bd6587aac153
|
7
|
+
data.tar.gz: 97d3d021c5808aa343988e8781beaee4327756fe52a7a68304caed7e1b8657dc0446b2981a42de502a9b8b8e8a6329bf0f398ab487b26857cf303c529d4a7b8b
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -119,6 +119,32 @@ class User < Cassandro::Model
|
|
119
119
|
end
|
120
120
|
```
|
121
121
|
|
122
|
+
|
123
|
+
### Setting TTL to a model
|
124
|
+
|
125
|
+
```Ruby
|
126
|
+
class Person < Cassandro::Model
|
127
|
+
table :people
|
128
|
+
ttl 60
|
129
|
+
end
|
130
|
+
```
|
131
|
+
This will make all the instances of the People class will have a Time To Live of `60` seconds in the database.
|
132
|
+
|
133
|
+
Creating a single record with a given TTL:
|
134
|
+
|
135
|
+
```Ruby
|
136
|
+
class Person < Cassandro::Model
|
137
|
+
table :people
|
138
|
+
attribute :first_name, :text
|
139
|
+
attribute :last_name, :text
|
140
|
+
end
|
141
|
+
|
142
|
+
Person.create_with_ttl(20, :first_name => "Eddie", :last_name => "Vedder")
|
143
|
+
```
|
144
|
+
|
145
|
+
This will create a record in the `people` table with a TTL of `20` seconds. It doesn't matter if the model has a different TTL set, this will override that TTL for _this record only_
|
146
|
+
|
147
|
+
|
122
148
|
__A complete example__
|
123
149
|
|
124
150
|
```ruby
|
data/cassandro.gemspec
CHANGED
data/lib/cassandro/model.rb
CHANGED
@@ -10,6 +10,7 @@ module Cassandro
|
|
10
10
|
@persisted = persisted
|
11
11
|
|
12
12
|
attrs.each do |att, val|
|
13
|
+
next unless self.respond_to?(:"#{att}=")
|
13
14
|
case val.class.name
|
14
15
|
when "Set"
|
15
16
|
send(:"#{att}=", val.to_a)
|
@@ -173,7 +174,7 @@ module Cassandro
|
|
173
174
|
|
174
175
|
return nil unless result.any?
|
175
176
|
|
176
|
-
self.new(result.first, true)
|
177
|
+
self.new(self.parse_row(result.first), true)
|
177
178
|
end
|
178
179
|
|
179
180
|
def self.create(attrs = {})
|
@@ -189,7 +190,7 @@ module Cassandro
|
|
189
190
|
rows = Cassandro.execute(query)
|
190
191
|
all = []
|
191
192
|
rows.each do |row|
|
192
|
-
all << new(row, true)
|
193
|
+
all << new(self.parse_row(row), true)
|
193
194
|
end
|
194
195
|
all
|
195
196
|
end
|
@@ -289,6 +290,24 @@ module Cassandro
|
|
289
290
|
pk.first
|
290
291
|
end
|
291
292
|
|
293
|
+
def self.options
|
294
|
+
@options ||= {}
|
295
|
+
end
|
296
|
+
|
297
|
+
def self.ttl(seconds)
|
298
|
+
self.options[:ttl] = seconds.to_i
|
299
|
+
end
|
300
|
+
|
301
|
+
def self.create_with_ttl(seconds, attrs = {})
|
302
|
+
old_ttl = self.options[:ttl]
|
303
|
+
self.options[:ttl] = seconds.to_i
|
304
|
+
|
305
|
+
result = self.create(attrs)
|
306
|
+
|
307
|
+
old_ttl ? self.options[:ttl] = old_ttl : self.options.delete(:ttl)
|
308
|
+
result
|
309
|
+
end
|
310
|
+
|
292
311
|
def statement_for(operation, options = {})
|
293
312
|
case operation
|
294
313
|
when :insert
|
@@ -297,6 +316,7 @@ module Cassandro
|
|
297
316
|
INSERT INTO #{self.class.table_name}(#{@attributes.keys.map { |x| x.to_s}.join(',')})
|
298
317
|
VALUES(#{@attributes.keys.map { |x| '?' }.join(",")})
|
299
318
|
#{options[:insert_check] ? 'IF NOT EXISTS' : ''}
|
319
|
+
#{self.class.options[:ttl] && self.class.options[:ttl] > 0 ? "USING TTL #{self.class.options[:ttl]}" : ''}
|
300
320
|
QUERY
|
301
321
|
if @insert_statement.nil? ||
|
302
322
|
@insert_statement.params_metadata.count != @attributes.count
|
@@ -319,6 +339,8 @@ module Cassandro
|
|
319
339
|
end
|
320
340
|
|
321
341
|
case self.class.casts[k]
|
342
|
+
when :set
|
343
|
+
n_attrs << Set.new(attrs[k])
|
322
344
|
when :uuid
|
323
345
|
n_attrs << Cassandra::Uuid.new(attrs[k])
|
324
346
|
when :integer
|
@@ -333,5 +355,9 @@ module Cassandro
|
|
333
355
|
end
|
334
356
|
n_attrs
|
335
357
|
end
|
358
|
+
|
359
|
+
def self.parse_row(row)
|
360
|
+
row.each{ |k,v| row[k] = [] if casts[k.to_sym] == :set && v.nil? }
|
361
|
+
end
|
336
362
|
end
|
337
363
|
end
|
@@ -153,6 +153,14 @@ Protest.describe "Cassandro Model" do
|
|
153
153
|
|
154
154
|
assert_equal 1, Test.count(:test_col_1, Cassandra::Uuid.new(uuid))
|
155
155
|
end
|
156
|
+
|
157
|
+
test "ignore columns not defined in model" do
|
158
|
+
uuid = SecureRandom.uuid
|
159
|
+
Test.create(test_col_1: uuid, test_col_2: 'test_value_2')
|
160
|
+
|
161
|
+
tests = Test[uuid]
|
162
|
+
assert_equal false, tests.respond_to?("test_col_3")
|
163
|
+
end
|
156
164
|
end
|
157
165
|
|
158
166
|
context 'Updating' do
|
@@ -184,4 +192,60 @@ Protest.describe "Cassandro Model" do
|
|
184
192
|
assert_equal "PRIMARY KEY part name found in SET part", patient.errors[:update_error]
|
185
193
|
end
|
186
194
|
end
|
195
|
+
|
196
|
+
context 'TTL' do
|
197
|
+
setup do
|
198
|
+
class Test < Cassandro::Model
|
199
|
+
table 'tests'
|
200
|
+
|
201
|
+
ttl 20
|
202
|
+
|
203
|
+
attribute :test_col_1, :uuid
|
204
|
+
attribute :test_col_2, :text
|
205
|
+
|
206
|
+
primary_key :test_col_1
|
207
|
+
unique :test_col_1
|
208
|
+
end
|
209
|
+
|
210
|
+
class Patient < Cassandro::Model
|
211
|
+
table :patients
|
212
|
+
|
213
|
+
attribute :name, :text
|
214
|
+
attribute :address, :text
|
215
|
+
attribute :age, :int
|
216
|
+
|
217
|
+
primary_key [:name]
|
218
|
+
end
|
219
|
+
Cassandro.truncate_table('patients')
|
220
|
+
end
|
221
|
+
|
222
|
+
test "should create with TTL defined by the model" do
|
223
|
+
volatile_record = Test.create(:test_col_1 => SecureRandom.uuid, :test_col_2 => "Test Text")
|
224
|
+
results = Cassandro.execute "SELECT TTL(test_col_2) FROM tests WHERE test_col_1 = #{volatile_record.test_col_1}"
|
225
|
+
|
226
|
+
assert results.first["ttl(test_col_2)"] > 0
|
227
|
+
assert results.first["ttl(test_col_2)"] <= 20
|
228
|
+
end
|
229
|
+
|
230
|
+
test "should override TTL defined by the model" do
|
231
|
+
volatile_record = Test.create_with_ttl(10, :test_col_1 => SecureRandom.uuid, :test_col_2 => "Test Text")
|
232
|
+
results = Cassandro.execute "SELECT TTL(test_col_2) FROM tests WHERE test_col_1 = #{volatile_record.test_col_1}"
|
233
|
+
|
234
|
+
assert results.first["ttl(test_col_2)"] > 0
|
235
|
+
assert results.first["ttl(test_col_2)"] <= 10
|
236
|
+
end
|
237
|
+
|
238
|
+
test "should be able to create with TTL if not specified in the model" do
|
239
|
+
dog = Patient.create(:name => "Cassandro", :address => "cassandstreet", :age => 1)
|
240
|
+
results = Cassandro.execute "SELECT TTL(address) FROM patients WHERE name = 'Cassandro'"
|
241
|
+
|
242
|
+
assert !results.first["ttl(address)"]
|
243
|
+
|
244
|
+
cat = Patient.create_with_ttl(30, :name => "Cassandra", :address => "cassandstreet 123", :age => 2)
|
245
|
+
results = Cassandro.execute "SELECT TTL(address) FROM patients WHERE name = 'Cassandra'"
|
246
|
+
|
247
|
+
assert results.first["ttl(address)"] > 0
|
248
|
+
assert results.first["ttl(address)"] <= 30
|
249
|
+
end
|
250
|
+
end
|
187
251
|
end
|
data/test/support/tables.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cassandro
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lautaro Orazi
|
@@ -9,66 +9,66 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-03-
|
12
|
+
date: 2015-03-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cassandra-driver
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - ~>
|
18
|
+
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '1.2'
|
21
|
-
- -
|
21
|
+
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: 1.0.0
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
|
-
- - ~>
|
28
|
+
- - "~>"
|
29
29
|
- !ruby/object:Gem::Version
|
30
30
|
version: '1.2'
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 1.0.0
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: protest
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0.5'
|
41
|
-
- -
|
41
|
+
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: 0.5.3
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
46
|
version_requirements: !ruby/object:Gem::Requirement
|
47
47
|
requirements:
|
48
|
-
- - ~>
|
48
|
+
- - "~>"
|
49
49
|
- !ruby/object:Gem::Version
|
50
50
|
version: '0.5'
|
51
|
-
- -
|
51
|
+
- - ">="
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: 0.5.3
|
54
54
|
- !ruby/object:Gem::Dependency
|
55
55
|
name: rack-test
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
|
-
- - ~>
|
58
|
+
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: '0.6'
|
61
|
-
- -
|
61
|
+
- - ">="
|
62
62
|
- !ruby/object:Gem::Version
|
63
63
|
version: 0.6.3
|
64
64
|
type: :development
|
65
65
|
prerelease: false
|
66
66
|
version_requirements: !ruby/object:Gem::Requirement
|
67
67
|
requirements:
|
68
|
-
- - ~>
|
68
|
+
- - "~>"
|
69
69
|
- !ruby/object:Gem::Version
|
70
70
|
version: '0.6'
|
71
|
-
- -
|
71
|
+
- - ">="
|
72
72
|
- !ruby/object:Gem::Version
|
73
73
|
version: 0.6.3
|
74
74
|
description: Lightweight Apache Cassandra ORM for Ruby
|
@@ -79,9 +79,9 @@ executables: []
|
|
79
79
|
extensions: []
|
80
80
|
extra_rdoc_files: []
|
81
81
|
files:
|
82
|
-
- .gems
|
83
|
-
- .gems-test
|
84
|
-
- .gitignore
|
82
|
+
- ".gems"
|
83
|
+
- ".gems-test"
|
84
|
+
- ".gitignore"
|
85
85
|
- LICENSE
|
86
86
|
- README.md
|
87
87
|
- cassandro.gemspec
|
@@ -114,19 +114,18 @@ require_paths:
|
|
114
114
|
- lib
|
115
115
|
required_ruby_version: !ruby/object:Gem::Requirement
|
116
116
|
requirements:
|
117
|
-
- -
|
117
|
+
- - ">="
|
118
118
|
- !ruby/object:Gem::Version
|
119
119
|
version: '0'
|
120
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
requirements: []
|
126
126
|
rubyforge_project:
|
127
|
-
rubygems_version: 2.
|
127
|
+
rubygems_version: 2.2.2
|
128
128
|
signing_key:
|
129
129
|
specification_version: 4
|
130
130
|
summary: Ruby ORM for Apache Cassandra
|
131
131
|
test_files: []
|
132
|
-
has_rdoc:
|