extendi-cassandra_object 1.0.9 → 1.0.10
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 +4 -4
- data/.gitignore +1 -0
- data/extendi-cassandra_object.gemspec +1 -1
- data/lib/cassandra_object/adapters/cassandra_adapter.rb +19 -5
- data/lib/cassandra_object/adapters/cassandra_schemaless_adapter.rb +0 -1
- data/lib/cassandra_object/base.rb +4 -0
- data/lib/cassandra_object/model.rb +5 -1
- data/lib/cassandra_object/persistence.rb +17 -8
- data/lib/cassandra_object/scope.rb +7 -2
- data/lib/cassandra_object/timestamps.rb +7 -3
- data/lib/cassandra_object/types/type_helper.rb +0 -1
- data/test/support/cassandra.rb +3 -1
- data/test/support/issue_schema_ck.rb +18 -0
- data/test/test_helper.rb +1 -0
- data/test/unit/persistence_schema_ck_test.rb +69 -0
- data/test/unit/persistence_schema_test.rb +21 -21
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ecd527d822a4895c5206c941bf16083025307c42
|
4
|
+
data.tar.gz: 918d17478765af790449a2545818856358854e35
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d14760b8e19cfaf29a8b18822b37ba8e19140c3e679b35bd05425650f0c750180dd7428e544a98068d5c719241c5f0b61e2df5a89ab90ea29712f4062b92fe8a
|
7
|
+
data.tar.gz: 700146529ef52a4046b0d7f39bdfedc2b09c3889f878a724bad17af14e00f113feb15977709eed4ecafb33f6a8414643c8a609b690b6861f9fbc8e0fcb051374
|
data/.gitignore
CHANGED
@@ -41,7 +41,7 @@ module CassandraObject
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def where_string_async(id)
|
44
|
-
wheres = @scope.where_values.dup
|
44
|
+
wheres = @scope.where_values.dup.select.each_with_index { |_, i| i.even? }
|
45
45
|
wheres << "#{@scope._key} = '#{id}'" if !id.nil?
|
46
46
|
"WHERE #{wheres * ' AND '}" if wheres.any?
|
47
47
|
end
|
@@ -139,7 +139,8 @@ module CassandraObject
|
|
139
139
|
def select(scope)
|
140
140
|
queries = QueryBuilder.new(self, scope).to_query_async
|
141
141
|
# todo paginate
|
142
|
-
|
142
|
+
arguments = scope.where_values.select.each_with_index{ |_, i| i.odd? }.reject{ |c| c.blank? }
|
143
|
+
cql_rows = execute_async(queries, arguments).map{|item| item.rows.map{|x| x}}.flatten!
|
143
144
|
cql_rows.each do |cql_row|
|
144
145
|
attributes = cql_row.to_hash
|
145
146
|
key = attributes.delete(scope._key)
|
@@ -176,10 +177,23 @@ module CassandraObject
|
|
176
177
|
execute_batchable(queries)
|
177
178
|
end
|
178
179
|
|
179
|
-
def delete(
|
180
|
+
def delete(scope, ids, attributes = {})
|
180
181
|
ids = [ids] if !ids.is_a?(Array)
|
181
|
-
statement = "DELETE FROM #{
|
182
|
-
|
182
|
+
statement = "DELETE FROM #{scope.column_family} WHERE #{scope._key} IN (#{ids.map{|id| '?'}.join(',')})"
|
183
|
+
arguments = ids
|
184
|
+
unless attributes.blank?
|
185
|
+
statement += " AND #{attributes.keys.map{ |k| "#{k} = ?" }.join(' AND ')}"
|
186
|
+
arguments += attributes.values
|
187
|
+
end
|
188
|
+
execute(statement, arguments)
|
189
|
+
end
|
190
|
+
|
191
|
+
def delete_single(obj)
|
192
|
+
keys = obj.class._keys
|
193
|
+
wheres = keys.map{ |k| "#{k} = ?" }.join(' AND ')
|
194
|
+
arguments = keys.map{ |k| obj.attributes[k] }
|
195
|
+
statement = "DELETE FROM #{obj.class.column_family} WHERE #{wheres}"
|
196
|
+
execute(statement, arguments)
|
183
197
|
end
|
184
198
|
|
185
199
|
def execute_batch(statements)
|
@@ -48,21 +48,25 @@ module CassandraObject
|
|
48
48
|
|
49
49
|
def delete(ids, attributes = [])
|
50
50
|
ids = [ids] if !ids.is_a?(Array)
|
51
|
-
|
51
|
+
|
52
|
+
if self.schema_type == :standard
|
53
|
+
attrs = attributes.is_a?(Array) ? {} : attributes
|
54
|
+
adapter.delete self, ids, attrs
|
55
|
+
elsif attributes.blank?
|
56
|
+
adapter.delete column_family, ids
|
57
|
+
else
|
52
58
|
attr = {}
|
53
59
|
attributes.each{|a| attr[a] = nil}
|
54
60
|
ids.each do |id|
|
55
61
|
adapter.update column_family, id, encode_attributes(attr)
|
56
62
|
end
|
57
|
-
else
|
58
|
-
if self.schema_type == :standard
|
59
|
-
adapter.delete column_family, self._key, ids
|
60
|
-
else
|
61
|
-
adapter.delete column_family, ids
|
62
|
-
end
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
+
def delete_schema(obj)
|
67
|
+
adapter.delete_single(obj)
|
68
|
+
end
|
69
|
+
|
66
70
|
def insert_record(id, attributes)
|
67
71
|
attributes = attributes.dup
|
68
72
|
attributes[self._key] = id if self.schema_type == :standard
|
@@ -152,7 +156,12 @@ module CassandraObject
|
|
152
156
|
end
|
153
157
|
|
154
158
|
def destroy
|
155
|
-
self.class.
|
159
|
+
if self.class.schema_type == :standard
|
160
|
+
self.class.delete_schema self
|
161
|
+
else
|
162
|
+
self.class.remove(id)
|
163
|
+
end
|
164
|
+
|
156
165
|
@destroyed = true
|
157
166
|
end
|
158
167
|
|
@@ -47,7 +47,8 @@ module CassandraObject
|
|
47
47
|
|
48
48
|
if self.schema_type == :standard
|
49
49
|
klass.adapter.select(self) do |key, attributes|
|
50
|
-
records[key]
|
50
|
+
records[key] ||= []
|
51
|
+
records[key] << attributes
|
51
52
|
end
|
52
53
|
else
|
53
54
|
if @is_all && @id_values.empty?
|
@@ -73,7 +74,11 @@ module CassandraObject
|
|
73
74
|
if self.raw_response || self.schema_type == :dynamic_attributes
|
74
75
|
results << {key => attributes.values.compact.empty? ? attributes.keys : attributes}
|
75
76
|
else
|
76
|
-
|
77
|
+
if attributes.is_a?(Array)
|
78
|
+
attributes.each{ |attrs| results << klass.instantiate(key, attrs) }
|
79
|
+
else
|
80
|
+
results << klass.instantiate(key, attributes)
|
81
|
+
end
|
77
82
|
end
|
78
83
|
end
|
79
84
|
results = results.reduce({}, :merge!) if self.schema_type == :dynamic_attributes
|
@@ -7,12 +7,16 @@ module CassandraObject
|
|
7
7
|
attribute :updated_at, type: :time
|
8
8
|
|
9
9
|
before_create do
|
10
|
-
self.
|
11
|
-
|
10
|
+
if self.class.timestamps
|
11
|
+
self.created_at ||= Time.current
|
12
|
+
self.updated_at ||= Time.current
|
13
|
+
end
|
12
14
|
end
|
13
15
|
|
14
16
|
before_update if: :changed? do
|
15
|
-
self.
|
17
|
+
if self.class.timestamps
|
18
|
+
self.updated_at = Time.current
|
19
|
+
end
|
16
20
|
end
|
17
21
|
end
|
18
22
|
end
|
data/test/support/cassandra.rb
CHANGED
@@ -22,7 +22,7 @@ CassandraObject::Base.config = {
|
|
22
22
|
|
23
23
|
begin
|
24
24
|
CassandraObject::Schema.drop_keyspace 'cassandra_object_test', true
|
25
|
-
CassandraObject::Schema.drop_keyspace '
|
25
|
+
CassandraObject::Schema.drop_keyspace 'Blah', true
|
26
26
|
rescue Exception => e
|
27
27
|
puts e.message
|
28
28
|
end
|
@@ -31,6 +31,7 @@ sleep 1
|
|
31
31
|
CassandraObject::Schema.create_keyspace 'cassandra_object_test'
|
32
32
|
CassandraObject::Schemaless.create_column_family 'Issues'
|
33
33
|
CassandraObject::Schema.create_column_family 'IssueSchemas', {attributes: 'id text, title text, description text, field float, intero int, created_at timestamp, updated_at timestamp, PRIMARY KEY (id)', options: {}}
|
34
|
+
CassandraObject::Schema.create_column_family 'IssueSchemaCks', {attributes: 'id text, type text, date timestamp, value float, PRIMARY KEY (id, type, date)', options: {}}
|
34
35
|
CassandraObject::Schemaless.create_column_family 'IssueDynamics'
|
35
36
|
CassandraObject::Schemaless.create_column_family 'IssuesCustomConfig'
|
36
37
|
CassandraObject::Schema.create_column_family 'IssueSchemaFathers', {attributes: 'id text, title text, field float, created_at timestamp, updated_at timestamp, PRIMARY KEY (id)', options: {}}
|
@@ -51,6 +52,7 @@ CassandraObject::Base.class_eval do
|
|
51
52
|
# created_records.reject(&:destroyed?).each(&:destroy)
|
52
53
|
Issue.delete_all
|
53
54
|
IssueSchema.delete_all
|
55
|
+
IssueSchemaCk.delete_all
|
54
56
|
IssueDynamic.delete_all
|
55
57
|
created_records.clear
|
56
58
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class IssueSchemaCk < CassandraObject::BaseSchema
|
2
|
+
string :id
|
3
|
+
string :type
|
4
|
+
time :date
|
5
|
+
float :value
|
6
|
+
|
7
|
+
self.allow_filtering = true
|
8
|
+
|
9
|
+
self.keys = '(id, type, date)'
|
10
|
+
|
11
|
+
def self.timestamps
|
12
|
+
false
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.for_key key
|
16
|
+
where_ids(key)
|
17
|
+
end
|
18
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -13,6 +13,7 @@ require 'support/issue_custom_config'
|
|
13
13
|
require 'support/issue_schema'
|
14
14
|
require 'support/issue_schema_child'
|
15
15
|
require 'support/issue_schema_father'
|
16
|
+
require 'support/issue_schema_ck'
|
16
17
|
|
17
18
|
module CassandraObject
|
18
19
|
class TestCase < ActiveSupport::TestCase
|
@@ -0,0 +1,69 @@
|
|
1
|
+
#!/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require 'test_helper'
|
5
|
+
|
6
|
+
class CassandraObject::PersistenceSchemaCkTest < CassandraObject::TestCase
|
7
|
+
|
8
|
+
test 'composite key' do
|
9
|
+
time1 = Time.now
|
10
|
+
time2 = time1 + 1.second
|
11
|
+
|
12
|
+
IssueSchemaCk.create(id: '1', type: 'first', date: time1, value: 1.to_f)
|
13
|
+
IssueSchemaCk.create(id: '1', type: 'second', date: time1, value: 1.to_f)
|
14
|
+
IssueSchemaCk.create(id: '1', type: 'first', date: time2, value: 2.to_f)
|
15
|
+
IssueSchemaCk.create(id: '1', type: 'second', date: time2, value: 2.to_f)
|
16
|
+
|
17
|
+
res = IssueSchemaCk.where('type = ?', 'first').find_by_id([1])
|
18
|
+
assert_equal 2, res.size
|
19
|
+
assert_equal 1, res.first.value
|
20
|
+
|
21
|
+
item = res[0]
|
22
|
+
assert_equal '1', item.id
|
23
|
+
assert_equal time1.to_i, item.date.to_i
|
24
|
+
|
25
|
+
item = res[1]
|
26
|
+
assert_equal '1', item.id
|
27
|
+
assert_equal time2.to_i, item.date.to_i
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
test 'delete' do
|
32
|
+
IssueSchemaCk.create(id: '1', type: 'first', date: Time.now, value: 1.to_f)
|
33
|
+
IssueSchemaCk.create(id: '1', type: 'second', date: Time.now, value: 1.to_f)
|
34
|
+
|
35
|
+
IssueSchemaCk.delete('1')
|
36
|
+
assert_equal 0, IssueSchemaCk.find_by_id([1]).size
|
37
|
+
end
|
38
|
+
|
39
|
+
test 'delete with attributes' do
|
40
|
+
time = Time.now
|
41
|
+
IssueSchemaCk.create(id: '1', type: 'first', date: time, value: 1.to_f)
|
42
|
+
IssueSchemaCk.create(id: '1', type: 'first', date: Time.now, value: 1.to_f)
|
43
|
+
IssueSchemaCk.create(id: '2', type: 'first', date: time, value: 1.to_f)
|
44
|
+
IssueSchemaCk.create(id: '2', type: 'first', date: Time.now, value: 1.to_f)
|
45
|
+
|
46
|
+
IssueSchemaCk.delete('1', type: 'first')
|
47
|
+
assert_equal 2, IssueSchemaCk.find_by_id([1,2]).size
|
48
|
+
end
|
49
|
+
|
50
|
+
test 'delete multiple' do
|
51
|
+
IssueSchemaCk.create(id: '1', type: 'first', date: Time.now, value: 1.to_f)
|
52
|
+
IssueSchemaCk.create(id: '1', type: 'second', date: Time.now, value: 1.to_f)
|
53
|
+
IssueSchemaCk.create(id: '2', type: 'first', date: Time.now, value: 1.to_f)
|
54
|
+
IssueSchemaCk.create(id: '2', type: 'first', date: Time.now, value: 1.to_f)
|
55
|
+
|
56
|
+
IssueSchemaCk.delete(['1','2'])
|
57
|
+
assert_equal 0, IssueSchemaCk.find_by_id([1]).size
|
58
|
+
assert_equal 0, IssueSchemaCk.find_by_id([2]).size
|
59
|
+
end
|
60
|
+
|
61
|
+
test 'destroy' do
|
62
|
+
IssueSchemaCk.create(id: '1', type: 'first', date: Time.now, value: 1.to_f)
|
63
|
+
IssueSchemaCk.create(id: '1', type: 'second', date: Time.now, value: 1.to_f)
|
64
|
+
|
65
|
+
IssueSchemaCk.find_by_id(['1']).first.destroy
|
66
|
+
assert_equal 1, IssueSchemaCk.find_by_id([1]).size
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -95,27 +95,27 @@ class CassandraObject::PersistenceSchemaTest < CassandraObject::TestCase
|
|
95
95
|
assert_equal persisted_issue, reloaded_issue
|
96
96
|
end
|
97
97
|
|
98
|
-
test 'remove' do
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
end
|
107
|
-
|
108
|
-
test 'remove multiple' do
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
end
|
98
|
+
# test 'remove' do
|
99
|
+
# issue = IssueSchema.create(title: 'I rule', description: 'lololol')
|
100
|
+
# id = issue.id
|
101
|
+
# assert_equal id, IssueSchema.find(id).id
|
102
|
+
# IssueSchema.remove(id)
|
103
|
+
# assert_raise CassandraObject::RecordNotFound do
|
104
|
+
# IssueSchema.find(id)
|
105
|
+
# end
|
106
|
+
# end
|
107
|
+
|
108
|
+
# test 'remove multiple' do
|
109
|
+
# ids = []
|
110
|
+
# (1..10).each do
|
111
|
+
# issue = IssueSchema.create(title: 'I rule', description: 'lololol')
|
112
|
+
# ids << issue.id
|
113
|
+
# end
|
114
|
+
|
115
|
+
# IssueSchema.remove(ids)
|
116
|
+
|
117
|
+
# assert_equal [], IssueSchema.find(ids)
|
118
|
+
# end
|
119
119
|
|
120
120
|
test 'ttl' do
|
121
121
|
description_test = 'this is the one with ttl'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extendi-cassandra_object
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Duccio Giovannelli
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-08-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
@@ -139,6 +139,7 @@ files:
|
|
139
139
|
- test/support/issue_dynamic.rb
|
140
140
|
- test/support/issue_schema.rb
|
141
141
|
- test/support/issue_schema_child.rb
|
142
|
+
- test/support/issue_schema_ck.rb
|
142
143
|
- test/support/issue_schema_father.rb
|
143
144
|
- test/support/reconnection.rb
|
144
145
|
- test/test_helper.rb
|
@@ -159,6 +160,7 @@ files:
|
|
159
160
|
- test/unit/identity_test.rb
|
160
161
|
- test/unit/inspect_test.rb
|
161
162
|
- test/unit/log_subscriber_test.rb
|
163
|
+
- test/unit/persistence_schema_ck_test.rb
|
162
164
|
- test/unit/persistence_schema_test.rb
|
163
165
|
- test/unit/persistence_test.rb
|
164
166
|
- test/unit/railties/controller_runtime_test.rb
|