gotime-cassandra_object 2.2.0 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/gotime-cassandra_object.gemspec +1 -1
- data/lib/cassandra_object.rb +1 -2
- data/lib/cassandra_object/associations.rb +3 -4
- data/lib/cassandra_object/associations/one_to_many.rb +2 -10
- data/lib/cassandra_object/associations/one_to_one.rb +1 -1
- data/lib/cassandra_object/base.rb +20 -4
- data/lib/cassandra_object/consistency.rb +21 -20
- data/lib/cassandra_object/cursor.rb +6 -7
- data/lib/cassandra_object/finder_methods.rb +4 -10
- data/lib/cassandra_object/identity.rb +8 -26
- data/lib/cassandra_object/persistence.rb +5 -30
- data/lib/cassandra_object/{validation.rb → validations.rb} +6 -8
- data/{test-old → test}/active_model_test.rb +2 -2
- data/test/base_test.rb +10 -0
- data/test/consistency_test.rb +20 -0
- data/test/identity_test.rb +6 -1
- data/test/validations_test.rb +15 -0
- metadata +15 -34
- data/lib/cassandra_object/primary_key.rb +0 -12
- data/test-old/base_test.rb +0 -4
- data/test-old/basic_scenarios_test.rb +0 -243
- data/test-old/callbacks_test.rb +0 -19
- data/test-old/config/cassandra.in.sh +0 -53
- data/test-old/config/log4j.properties +0 -38
- data/test-old/config/storage-conf.xml +0 -221
- data/test-old/connection.rb +0 -25
- data/test-old/cursor_test.rb +0 -66
- data/test-old/dirty_test.rb +0 -34
- data/test-old/fixture_models.rb +0 -90
- data/test-old/identity/natural_key_factory_test.rb +0 -94
- data/test-old/index_test.rb +0 -69
- data/test-old/legacy/test_helper.rb +0 -18
- data/test-old/migration_test.rb +0 -21
- data/test-old/one_to_many_associations_test.rb +0 -163
- data/test-old/test_case.rb +0 -28
- data/test-old/test_helper.rb +0 -16
- data/test-old/time_test.rb +0 -32
- data/test-old/types_test.rb +0 -252
- data/test-old/validation_test.rb +0 -25
- data/test-old/z_mock_test.rb +0 -36
- data/test/primary_key_test.rb +0 -9
data/Gemfile.lock
CHANGED
data/lib/cassandra_object.rb
CHANGED
@@ -6,12 +6,11 @@ module CassandraObject
|
|
6
6
|
autoload :Base
|
7
7
|
autoload :Connection
|
8
8
|
autoload :Attributes
|
9
|
-
autoload :PrimaryKey
|
10
9
|
autoload :Dirty
|
11
10
|
autoload :Consistency
|
12
11
|
autoload :Persistence
|
13
12
|
autoload :Callbacks
|
14
|
-
autoload :
|
13
|
+
autoload :Validations
|
15
14
|
autoload :Identity
|
16
15
|
autoload :Indexes
|
17
16
|
autoload :Serialization
|
@@ -11,7 +11,6 @@ module CassandraObject
|
|
11
11
|
end
|
12
12
|
|
13
13
|
module ClassMethods
|
14
|
-
|
15
14
|
def relationships_column_family=(column_family)
|
16
15
|
@relationships_column_family = column_family
|
17
16
|
end
|
@@ -23,7 +22,7 @@ module CassandraObject
|
|
23
22
|
def column_family_configuration
|
24
23
|
super << {:Name=>relationships_column_family, :CompareWith=>"UTF8Type", :CompareSubcolumnsWith=>"TimeUUIDType", :ColumnType=>"Super"}
|
25
24
|
end
|
26
|
-
|
25
|
+
|
27
26
|
def association(association_name, options= {})
|
28
27
|
if options[:unique]
|
29
28
|
write_inheritable_hash(:associations, {association_name => OneToOne.new(association_name, self, options)})
|
@@ -34,8 +33,8 @@ module CassandraObject
|
|
34
33
|
|
35
34
|
def remove(key)
|
36
35
|
begin
|
37
|
-
ActiveSupport::Notifications.instrument("remove.cassandra_object", :
|
38
|
-
connection.remove(relationships_column_family, key.to_s, :
|
36
|
+
ActiveSupport::Notifications.instrument("remove.cassandra_object", column_family: relationships_column_family, key: key) do
|
37
|
+
connection.remove(relationships_column_family, key.to_s, consistency: thrift_write_consistency)
|
39
38
|
end
|
40
39
|
rescue Cassandra::AccessError => e
|
41
40
|
raise e unless e.message =~ /Invalid column family/
|
@@ -1,26 +1,18 @@
|
|
1
1
|
module CassandraObject
|
2
2
|
module Associations
|
3
3
|
class OneToMany
|
4
|
-
include Consistency
|
5
|
-
|
6
|
-
attr_accessor :write_consistency
|
7
|
-
attr_accessor :read_consistency
|
8
|
-
|
9
4
|
def initialize(association_name, owner_class, options)
|
10
5
|
@association_name = association_name.to_s
|
11
6
|
@owner_class = owner_class
|
12
7
|
@target_class_name = options[:class_name] || association_name.to_s.singularize.camelize
|
13
8
|
@options = options
|
14
9
|
|
15
|
-
@write_consistency = owner_class.write_consistency
|
16
|
-
@read_consistency = owner_class.write_consistency
|
17
|
-
|
18
10
|
define_methods!
|
19
11
|
end
|
20
12
|
|
21
13
|
def find(owner, options = {})
|
22
14
|
reversed = options.has_key?(:reversed) ? options[:reversed] : reversed?
|
23
|
-
cursor = CassandraObject::Cursor.new(target_class, column_family, owner.key.to_s, @association_name, :start_after => options[:start_after], :reversed => reversed
|
15
|
+
cursor = CassandraObject::Cursor.new(target_class, column_family, owner.key.to_s, @association_name, :start_after => options[:start_after], :reversed => reversed)
|
24
16
|
cursor.find(options[:limit] || 100)
|
25
17
|
end
|
26
18
|
|
@@ -28,7 +20,7 @@ module CassandraObject
|
|
28
20
|
key = owner.key
|
29
21
|
attributes = {@association_name=>{new_key=>record.key.to_s}}
|
30
22
|
ActiveSupport::Notifications.instrument("insert.cassandra_object", :column_family => column_family, :key => key, :attributes => attributes) do
|
31
|
-
connection.insert(column_family, key.to_s, attributes, :consistency =>
|
23
|
+
connection.insert(column_family, key.to_s, attributes, :consistency => @owner_class.thrift_write_consistency)
|
32
24
|
end
|
33
25
|
if has_inverse? && set_inverse
|
34
26
|
inverse.set_inverse(record, owner)
|
@@ -42,7 +42,7 @@ module CassandraObject
|
|
42
42
|
key = owner.key
|
43
43
|
attributes = {@association_name=>{new_key=>record.key.to_s}}
|
44
44
|
ActiveSupport::Notifications.instrument("insert.cassandra_object", :column_family => column_family, :key => key, :attributes => attributes) do
|
45
|
-
connection.insert(column_family, key.to_s, attributes, :consistency =>
|
45
|
+
connection.insert(column_family, key.to_s, attributes, :consistency => @owner_class.thrift_write_consistency)
|
46
46
|
end
|
47
47
|
if has_inverse? && set_inverse
|
48
48
|
inverse.set_inverse(record, owner)
|
@@ -26,17 +26,18 @@ module CassandraObject
|
|
26
26
|
end
|
27
27
|
|
28
28
|
extend ActiveModel::Naming
|
29
|
+
include ActiveModel::Conversion
|
29
30
|
extend ActiveSupport::DescendantsTracker
|
30
31
|
|
31
32
|
include Connection
|
32
|
-
include
|
33
|
+
include Consistency
|
33
34
|
include Identity
|
34
35
|
include Attributes
|
35
36
|
include Persistence
|
36
37
|
include Callbacks
|
37
38
|
include Indexes
|
38
39
|
include Dirty
|
39
|
-
include
|
40
|
+
include Validations
|
40
41
|
include Associations
|
41
42
|
include Batches
|
42
43
|
include FinderMethods
|
@@ -58,8 +59,23 @@ module CassandraObject
|
|
58
59
|
@schema_version = self.class.current_schema_version
|
59
60
|
end
|
60
61
|
|
61
|
-
def
|
62
|
-
|
62
|
+
def to_param
|
63
|
+
id.to_s if persisted?
|
64
|
+
end
|
65
|
+
|
66
|
+
def hash
|
67
|
+
id.hash
|
68
|
+
end
|
69
|
+
|
70
|
+
def ==(comparison_object)
|
71
|
+
comparison_object.equal?(self) ||
|
72
|
+
(comparison_object.instance_of?(self.class) &&
|
73
|
+
comparison_object.key == key &&
|
74
|
+
!comparison_object.new_record?)
|
75
|
+
end
|
76
|
+
|
77
|
+
def eql?(comparison_object)
|
78
|
+
self == (comparison_object)
|
63
79
|
end
|
64
80
|
end
|
65
81
|
end
|
@@ -1,30 +1,31 @@
|
|
1
1
|
module CassandraObject
|
2
2
|
module Consistency
|
3
|
-
|
4
|
-
VALID_WRITE_CONSISTENCY_LEVELS = VALID_READ_CONSISTENCY_LEVELS
|
3
|
+
extend ActiveSupport::Concern
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
def valid_write_consistency_level?(level)
|
11
|
-
!!VALID_WRITE_CONSISTENCY_LEVELS.include?(level)
|
12
|
-
end
|
5
|
+
included do
|
6
|
+
cattr_accessor :consistency_levels
|
7
|
+
self.consistency_levels = [:one, :quorum, :all]
|
13
8
|
|
14
|
-
|
15
|
-
|
9
|
+
class_attribute :write_consistency
|
10
|
+
class_attribute :read_consistency
|
11
|
+
self.write_consistency = :quorum
|
12
|
+
self.read_consistency = :quorum
|
16
13
|
end
|
17
14
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
def consistency_for_thrift(consistency)
|
23
|
-
{
|
24
|
-
:one => Cassandra::Consistency::ONE,
|
15
|
+
module ClassMethods
|
16
|
+
THRIFT_LEVELS = {
|
17
|
+
:one => Cassandra::Consistency::ONE,
|
25
18
|
:quorum => Cassandra::Consistency::QUORUM,
|
26
19
|
:all => Cassandra::Consistency::ALL
|
27
|
-
}
|
20
|
+
}
|
21
|
+
|
22
|
+
def thrift_read_consistency
|
23
|
+
THRIFT_LEVELS[read_consistency] || (raise "Invalid consistency level #{read_consistency}")
|
24
|
+
end
|
25
|
+
|
26
|
+
def thrift_write_consistency
|
27
|
+
THRIFT_LEVELS[write_consistency] || (raise "Invalid consistency level #{write_consistency}")
|
28
|
+
end
|
28
29
|
end
|
29
30
|
end
|
30
|
-
end
|
31
|
+
end
|
@@ -8,8 +8,6 @@ module CassandraObject
|
|
8
8
|
@key = key.to_s
|
9
9
|
@super_column = super_column
|
10
10
|
@options = options
|
11
|
-
@read_consistency = options[:read_consistency] || options[:consistency] || :quorum
|
12
|
-
@write_consitency = options[:write_consistency] || options[:consistency] || :quorum
|
13
11
|
@validators = []
|
14
12
|
end
|
15
13
|
|
@@ -25,10 +23,11 @@ module CassandraObject
|
|
25
23
|
end
|
26
24
|
|
27
25
|
while objects.size < number_to_find && !out_of_keys
|
28
|
-
index_results = connection.get(@column_family, @key, @super_column,
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
index_results = connection.get(@column_family, @key, @super_column,
|
27
|
+
count: limit,
|
28
|
+
start: start_with,
|
29
|
+
reversed: @options[:reversed],
|
30
|
+
consistency: target_class.thrift_read_consistency)
|
32
31
|
|
33
32
|
out_of_keys = index_results.size < limit
|
34
33
|
|
@@ -81,7 +80,7 @@ module CassandraObject
|
|
81
80
|
end
|
82
81
|
|
83
82
|
def remove(index_key)
|
84
|
-
connection.remove(@column_family, @key, @super_column, index_key, :
|
83
|
+
connection.remove(@column_family, @key, @super_column, index_key, consistency: target_class.thrift_write_consistency)
|
85
84
|
end
|
86
85
|
|
87
86
|
def validator(&validator)
|
@@ -11,10 +11,9 @@ module CassandraObject
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def all(options = {})
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
connection.get_range(column_family, key_count: count, consistency: consistency_for_thrift(options[:consistency]))
|
14
|
+
limit = options[:limit] || 100
|
15
|
+
results = ActiveSupport::Notifications.instrument("get_range.cassandra_object", column_family: column_family, key_count: limit) do
|
16
|
+
connection.get_range(column_family, key_count: limit, consistency: thrift_read_consistency)
|
18
17
|
end
|
19
18
|
|
20
19
|
results.map do |k, v|
|
@@ -45,13 +44,8 @@ module CassandraObject
|
|
45
44
|
|
46
45
|
private
|
47
46
|
def multi_get(keys, options={})
|
48
|
-
options = options.reverse_merge(consistency: self.read_consistency)
|
49
|
-
unless valid_read_consistency_level?(options[:consistency])
|
50
|
-
raise ArgumentError, "Invalid read consistency level: '#{options[:consistency]}'. Valid options are [:quorum, :one]"
|
51
|
-
end
|
52
|
-
|
53
47
|
attribute_results = ActiveSupport::Notifications.instrument("multi_get.cassandra_object", column_family: column_family, keys: keys) do
|
54
|
-
connection.multi_get(column_family, keys.map(&:to_s), consistency:
|
48
|
+
connection.multi_get(column_family, keys.map(&:to_s), consistency: thrift_read_consistency)
|
55
49
|
end
|
56
50
|
|
57
51
|
attribute_results.inject({}) do |memo, (key, attributes)|
|
@@ -1,6 +1,4 @@
|
|
1
1
|
module CassandraObject
|
2
|
-
# Some docs will be needed here but the gist of this is simple. Instead of returning a string, Base#key now returns a key object.
|
3
|
-
# There are corresponding key factories which generate them
|
4
2
|
module Identity
|
5
3
|
extend ActiveSupport::Concern
|
6
4
|
extend ActiveSupport::Autoload
|
@@ -30,41 +28,25 @@ module CassandraObject
|
|
30
28
|
name_or_factory
|
31
29
|
end
|
32
30
|
end
|
33
|
-
|
31
|
+
|
34
32
|
def next_key(object = nil)
|
35
33
|
@key_factory.next_key(object).tap do |key|
|
36
34
|
raise "Keys may not be nil" if key.nil?
|
37
35
|
end
|
38
36
|
end
|
39
|
-
|
37
|
+
|
40
38
|
def parse_key(string)
|
41
39
|
@key_factory.parse(string)
|
42
40
|
end
|
43
41
|
end
|
44
|
-
|
45
|
-
module InstanceMethods
|
46
|
-
def ==(comparison_object)
|
47
|
-
comparison_object.equal?(self) ||
|
48
|
-
(comparison_object.instance_of?(self.class) &&
|
49
|
-
comparison_object.key == key &&
|
50
|
-
!comparison_object.new_record?)
|
51
|
-
end
|
52
|
-
|
53
|
-
def eql?(comparison_object)
|
54
|
-
self == (comparison_object)
|
55
|
-
end
|
56
42
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
def to_param
|
62
|
-
key.to_param
|
63
|
-
end
|
43
|
+
def id
|
44
|
+
key.to_s
|
45
|
+
end
|
64
46
|
|
65
|
-
|
66
|
-
|
67
|
-
|
47
|
+
def id=(key)
|
48
|
+
self.key = self.class.parse_key(key)
|
49
|
+
id
|
68
50
|
end
|
69
51
|
end
|
70
52
|
end
|
@@ -2,40 +2,15 @@ module CassandraObject
|
|
2
2
|
module Persistence
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
-
included do
|
6
|
-
extend Consistency
|
7
|
-
|
8
|
-
class_attribute :write_consistency
|
9
|
-
class_attribute :read_consistency
|
10
|
-
self.write_consistency = self.read_consistency = :quorum
|
11
|
-
end
|
12
|
-
|
13
|
-
|
14
5
|
module ClassMethods
|
15
|
-
def consistency_levels(levels)
|
16
|
-
if levels.has_key?(:write)
|
17
|
-
unless valid_write_consistency_level?(levels[:write])
|
18
|
-
raise ArgumentError, "Invalid write consistency level. Valid levels are: #{Consistency::VALID_WRITE_CONSISTENCY_LEVELS.inspect}. You gave me #{levels[:write].inspect}"
|
19
|
-
end
|
20
|
-
self.write_consistency = levels[:write]
|
21
|
-
end
|
22
|
-
|
23
|
-
if levels.has_key?(:read)
|
24
|
-
unless valid_read_consistency_level?(levels[:read])
|
25
|
-
raise ArgumentError, "Invalid read consistency level. Valid levels are #{Consistency::VALID_READ_CONSISTENCY_LEVELS.inspect}. You gave me #{levels[:write].inspect}"
|
26
|
-
end
|
27
|
-
self.read_consistency = levels[:read]
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
6
|
def remove(key)
|
32
|
-
ActiveSupport::Notifications.instrument("remove.cassandra_object", :
|
33
|
-
connection.remove(column_family, key.to_s, :
|
7
|
+
ActiveSupport::Notifications.instrument("remove.cassandra_object", column_family: column_family, key: key) do
|
8
|
+
connection.remove(column_family, key.to_s, consistency: thrift_write_consistency)
|
34
9
|
end
|
35
10
|
end
|
36
11
|
|
37
12
|
def delete_all
|
38
|
-
ActiveSupport::Notifications.instrument("truncate.cassandra_object", :
|
13
|
+
ActiveSupport::Notifications.instrument("truncate.cassandra_object", column_family: column_family) do
|
39
14
|
connection.truncate!(column_family)
|
40
15
|
end
|
41
16
|
end
|
@@ -49,8 +24,8 @@ module CassandraObject
|
|
49
24
|
def write(key, attributes, schema_version)
|
50
25
|
key.tap do |key|
|
51
26
|
attributes = encode_columns_hash(attributes, schema_version)
|
52
|
-
ActiveSupport::Notifications.instrument("insert.cassandra_object", :
|
53
|
-
connection.insert(column_family, key.to_s, attributes, :
|
27
|
+
ActiveSupport::Notifications.instrument("insert.cassandra_object", column_family: column_family, key: key, attributes: attributes) do
|
28
|
+
connection.insert(column_family, key.to_s, attributes, consistency: thrift_write_consistency)
|
54
29
|
end
|
55
30
|
end
|
56
31
|
end
|
@@ -5,13 +5,9 @@ module CassandraObject
|
|
5
5
|
@record = record
|
6
6
|
super("Invalid record: #{@record.errors.full_messages.to_sentence}")
|
7
7
|
end
|
8
|
-
|
9
|
-
def self.raise_error(record)
|
10
|
-
raise new(record)
|
11
|
-
end
|
12
8
|
end
|
13
9
|
|
14
|
-
module
|
10
|
+
module Validations
|
15
11
|
extend ActiveSupport::Concern
|
16
12
|
include ActiveModel::Validations
|
17
13
|
|
@@ -21,8 +17,10 @@ module CassandraObject
|
|
21
17
|
end
|
22
18
|
|
23
19
|
module ClassMethods
|
24
|
-
def create!(attributes)
|
25
|
-
new(attributes).tap
|
20
|
+
def create!(attributes = {})
|
21
|
+
new(attributes).tap do |object|
|
22
|
+
object.save!
|
23
|
+
end
|
26
24
|
end
|
27
25
|
end
|
28
26
|
|
@@ -37,7 +35,7 @@ module CassandraObject
|
|
37
35
|
end
|
38
36
|
|
39
37
|
def save!
|
40
|
-
save || RecordInvalid.
|
38
|
+
save || raise(RecordInvalid.new(self))
|
41
39
|
end
|
42
40
|
|
43
41
|
protected
|
data/test/base_test.rb
CHANGED
@@ -15,4 +15,14 @@ class CassandraObject::BaseTest < CassandraObject::TestCase
|
|
15
15
|
test 'column family' do
|
16
16
|
assert_equal 'CassandraObject::BaseTest::Sons', Son.column_family
|
17
17
|
end
|
18
|
+
|
19
|
+
test 'to_param' do
|
20
|
+
issue = Issue.create
|
21
|
+
assert_equal issue.id, issue.to_param
|
22
|
+
end
|
23
|
+
|
24
|
+
test 'hash' do
|
25
|
+
issue = Issue.create
|
26
|
+
assert_equal issue.id.hash, issue.hash
|
27
|
+
end
|
18
28
|
end
|