gotime-cassandra_object 2.2.0 → 2.2.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.
- 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
|