gotime-cassandra_object 4.12.1 → 4.12.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/gotime-cassandra_object.gemspec +1 -1
- data/lib/cassandra_object/adapters/cassandra_adapter.rb +8 -1
- data/lib/cassandra_object/adapters/hstore_adapter.rb +9 -1
- data/lib/cassandra_object/attribute_methods/typecasting.rb +2 -2
- data/lib/cassandra_object/connection.rb +11 -3
- data/lib/cassandra_object/counter_base.rb +1 -1
- data/lib/cassandra_object/model.rb +1 -1
- data/lib/cassandra_object/schema.rb +9 -7
- data/lib/cassandra_object/schema/tasks.rb +2 -2
- data/lib/cassandra_object/tasks/ks.rake +5 -13
- data/lib/cassandra_object/types.rb +0 -1
- data/lib/gotime-cassandra_object.rb +0 -2
- metadata +2 -6
- data/lib/cassandra_object/config.rb +0 -15
- data/lib/cassandra_object/types/hash_type.rb +0 -52
- data/test/unit/config_test.rb +0 -23
- data/test/unit/types/hash_type_test.rb +0 -77
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bc6183624ab74d725fd7e3987ccf1e94692b18d
|
4
|
+
data.tar.gz: 3f566d83342e4ee9732a7ac48edcf37ab753f3bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 685060d649e8529db79557cdc23397adf1bb50bde0b22e5dc262d95f223f133470df90ea0b0f2999e9fd0acaa68db2c916b8d55cb43d1f17629d88cab1026843
|
7
|
+
data.tar.gz: e8f7b4a16e6b51391d6cb82b56ad5dda6446de2f04201b71ff6cd8e01b532221a986355b8ecbaf01b1977e2ae6f4dfb4a3c122edb9d2fcdbc90fb818ed3cd94e
|
@@ -49,7 +49,14 @@ module CassandraObject
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def connection
|
52
|
-
@connection ||=
|
52
|
+
@connection ||= begin
|
53
|
+
thrift_options = (config[:thrift] || {})
|
54
|
+
CassandraCQL::Database.new(servers, {keyspace: config[:keyspace]}, thrift_options)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def servers
|
59
|
+
Array.wrap(config[:servers] || "127.0.0.1:9160")
|
53
60
|
end
|
54
61
|
|
55
62
|
def execute(statement)
|
@@ -57,7 +57,6 @@ module CassandraObject
|
|
57
57
|
# conf = {:adapter=>"postgresql", :encoding=>"unicode", :database=>"axle_place_test", :pool=>5, :username=>"postgres"}
|
58
58
|
# @connection ||= ActiveRecord::Base.postgresql_connection(conf)
|
59
59
|
ActiveRecord::Base.connection
|
60
|
-
# @connection ||= ActiveRecord::Base.postgresql_connection(config)
|
61
60
|
end
|
62
61
|
|
63
62
|
def execute(statement)
|
@@ -114,6 +113,15 @@ module CassandraObject
|
|
114
113
|
execute stmt
|
115
114
|
end
|
116
115
|
|
116
|
+
def create_table(table_name, options = {})
|
117
|
+
connection.execute 'CREATE EXTENSION IF NOT EXISTS hstore'
|
118
|
+
ActiveRecord::Migration.create_table table_name, id: false do |t|
|
119
|
+
t.string :id, null: false
|
120
|
+
t.hstore :attribute_store, null: false
|
121
|
+
end
|
122
|
+
connection.execute "ALTER TABLE #{table_name} ADD CONSTRAINT #{table_name}_pkey PRIMARY KEY (id)"
|
123
|
+
end
|
124
|
+
|
117
125
|
def create_ids_where_clause(ids)
|
118
126
|
ids = ids.first if ids.is_a?(Array) && ids.one?
|
119
127
|
|
@@ -7,12 +7,12 @@ module CassandraObject
|
|
7
7
|
class_attribute :attribute_definitions
|
8
8
|
self.attribute_definitions = {}
|
9
9
|
|
10
|
-
%w(array boolean date float
|
10
|
+
%w(array boolean date float integer json string time).each do |type|
|
11
11
|
instance_eval <<-EOV, __FILE__, __LINE__ + 1
|
12
12
|
def #{type}(*args)
|
13
13
|
options = args.extract_options!
|
14
14
|
args.each do |name|
|
15
|
-
attribute(name, options.merge(:type => :#{type
|
15
|
+
attribute(name, options.merge(:type => :#{type}))
|
16
16
|
end
|
17
17
|
end
|
18
18
|
EOV
|
@@ -21,9 +21,17 @@ module CassandraObject
|
|
21
21
|
|
22
22
|
module ClassMethods
|
23
23
|
def adapter
|
24
|
-
@@adapter ||=
|
25
|
-
|
26
|
-
|
24
|
+
@@adapter ||= adapter_class.new(config)
|
25
|
+
end
|
26
|
+
|
27
|
+
def adapter_class
|
28
|
+
case config[:adapter]
|
29
|
+
when 'hstore'
|
30
|
+
CassandraObject::Adapters::HstoreAdapter
|
31
|
+
when nil, 'cassandra'
|
32
|
+
CassandraObject::Adapters::CassandraAdapter
|
33
|
+
else
|
34
|
+
raise "Unknown adapter #{config[:adapter]}"
|
27
35
|
end
|
28
36
|
end
|
29
37
|
end
|
@@ -10,12 +10,10 @@ module CassandraObject
|
|
10
10
|
'strategy_options:replication_factor' => 1
|
11
11
|
}
|
12
12
|
|
13
|
-
def create_keyspace(keyspace, options =
|
13
|
+
def create_keyspace(keyspace, options = nil)
|
14
14
|
stmt = "CREATE KEYSPACE #{keyspace}"
|
15
15
|
|
16
|
-
|
17
|
-
options = DEFAULT_CREATE_KEYSPACE
|
18
|
-
end
|
16
|
+
options ||= DEFAULT_CREATE_KEYSPACE
|
19
17
|
|
20
18
|
system_execute statement_with_options(stmt, options)
|
21
19
|
end
|
@@ -25,7 +23,11 @@ module CassandraObject
|
|
25
23
|
end
|
26
24
|
|
27
25
|
def create_column_family(column_family, options = {})
|
28
|
-
|
26
|
+
create_table column_family, options
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_table(table_name, options = {})
|
30
|
+
stmt = "CREATE COLUMNFAMILY #{table_name} " +
|
29
31
|
"(KEY varchar PRIMARY KEY)"
|
30
32
|
|
31
33
|
keyspace_execute statement_with_options(stmt, options)
|
@@ -64,11 +66,11 @@ module CassandraObject
|
|
64
66
|
end
|
65
67
|
|
66
68
|
def db
|
67
|
-
@db ||= CassandraCQL::Database.new(CassandraObject::Base.
|
69
|
+
@db ||= CassandraCQL::Database.new(CassandraObject::Base.adapter.servers, {keyspace: 'system'}, {connect_timeout: 30, timeout: 30})
|
68
70
|
end
|
69
71
|
|
70
72
|
def keyspace_execute(cql)
|
71
|
-
db.execute "USE #{CassandraObject::Base.config
|
73
|
+
db.execute "USE #{CassandraObject::Base.config[:keyspace]}"
|
72
74
|
db.execute cql
|
73
75
|
end
|
74
76
|
|
@@ -37,11 +37,11 @@ module CassandraObject
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def keyspace
|
40
|
-
CassandraObject::Base.config
|
40
|
+
CassandraObject::Base.config[:keyspace]
|
41
41
|
end
|
42
42
|
|
43
43
|
def server
|
44
|
-
CassandraObject::Base.
|
44
|
+
CassandraObject::Base.adapter.servers.first.gsub(/:.*/, '')
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
ks_namespace = namespace :ks do
|
2
|
-
desc 'Create the keyspace in
|
2
|
+
desc 'Create the keyspace in config/cassandra.yml for the current environment'
|
3
3
|
task create: :environment do
|
4
4
|
begin
|
5
|
-
CassandraObject::Schema.create_keyspace
|
5
|
+
CassandraObject::Schema.create_keyspace CassandraObject::Base.config[:keyspace], CassandraObject::Base.config[:keyspace_options]
|
6
6
|
rescue Exception => e
|
7
7
|
if e.message =~ /conflicts/
|
8
|
-
p "Keyspace #{
|
8
|
+
p "Keyspace #{CassandraObject::Base.config[:keyspace]} already exists"
|
9
9
|
else
|
10
10
|
raise e
|
11
11
|
end
|
@@ -14,10 +14,10 @@ ks_namespace = namespace :ks do
|
|
14
14
|
|
15
15
|
task drop: :environment do
|
16
16
|
begin
|
17
|
-
CassandraObject::Schema.drop_keyspace
|
17
|
+
CassandraObject::Schema.drop_keyspace CassandraObject::Base.config[:keyspace]
|
18
18
|
rescue Exception => e
|
19
19
|
if e.message =~ /non existing keyspace/
|
20
|
-
p "Keyspace #{
|
20
|
+
p "Keyspace #{CassandraObject::Base.config[:keyspace]} does not exist"
|
21
21
|
else
|
22
22
|
raise e
|
23
23
|
end
|
@@ -51,12 +51,4 @@ ks_namespace = namespace :ks do
|
|
51
51
|
task :_load do
|
52
52
|
ks_namespace["structure:load"].invoke
|
53
53
|
end
|
54
|
-
|
55
|
-
private
|
56
|
-
def cassandra_config
|
57
|
-
@cassandra_config ||= begin
|
58
|
-
cassandra_configs = YAML.load_file(Rails.root.join('config', 'cassandra.yml'))
|
59
|
-
CassandraObject::Config.new cassandra_configs[Rails.env || 'development']
|
60
|
-
end
|
61
|
-
end
|
62
54
|
end
|
@@ -2,7 +2,6 @@ CassandraObject::Type.register(:array, CassandraObject::Types::ArrayTyp
|
|
2
2
|
CassandraObject::Type.register(:boolean, CassandraObject::Types::BooleanType)
|
3
3
|
CassandraObject::Type.register(:date, CassandraObject::Types::DateType)
|
4
4
|
CassandraObject::Type.register(:float, CassandraObject::Types::FloatType)
|
5
|
-
CassandraObject::Type.register(:hash, CassandraObject::Types::HashType)
|
6
5
|
CassandraObject::Type.register(:integer, CassandraObject::Types::IntegerType)
|
7
6
|
CassandraObject::Type.register(:json, CassandraObject::Types::JsonType)
|
8
7
|
CassandraObject::Type.register(:time, CassandraObject::Types::TimeType)
|
@@ -10,7 +10,6 @@ module CassandraObject
|
|
10
10
|
autoload :Base
|
11
11
|
autoload :BelongsTo
|
12
12
|
autoload :Callbacks
|
13
|
-
autoload :Config
|
14
13
|
autoload :Connection
|
15
14
|
autoload :Core
|
16
15
|
autoload :CounterBase
|
@@ -61,7 +60,6 @@ module CassandraObject
|
|
61
60
|
autoload :BooleanType
|
62
61
|
autoload :DateType
|
63
62
|
autoload :FloatType
|
64
|
-
autoload :HashType
|
65
63
|
autoload :IntegerType
|
66
64
|
autoload :JsonType
|
67
65
|
autoload :StringType
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gotime-cassandra_object
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.12.
|
4
|
+
version: 4.12.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Koziarski
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-02-
|
12
|
+
date: 2014-02-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
@@ -97,7 +97,6 @@ files:
|
|
97
97
|
- lib/cassandra_object/belongs_to/builder.rb
|
98
98
|
- lib/cassandra_object/belongs_to/reflection.rb
|
99
99
|
- lib/cassandra_object/callbacks.rb
|
100
|
-
- lib/cassandra_object/config.rb
|
101
100
|
- lib/cassandra_object/connection.rb
|
102
101
|
- lib/cassandra_object/core.rb
|
103
102
|
- lib/cassandra_object/counter_base.rb
|
@@ -126,7 +125,6 @@ files:
|
|
126
125
|
- lib/cassandra_object/types/boolean_type.rb
|
127
126
|
- lib/cassandra_object/types/date_type.rb
|
128
127
|
- lib/cassandra_object/types/float_type.rb
|
129
|
-
- lib/cassandra_object/types/hash_type.rb
|
130
128
|
- lib/cassandra_object/types/integer_type.rb
|
131
129
|
- lib/cassandra_object/types/json_type.rb
|
132
130
|
- lib/cassandra_object/types/string_type.rb
|
@@ -147,7 +145,6 @@ files:
|
|
147
145
|
- test/unit/belongs_to/reflection_test.rb
|
148
146
|
- test/unit/belongs_to_test.rb
|
149
147
|
- test/unit/callbacks_test.rb
|
150
|
-
- test/unit/config_test.rb
|
151
148
|
- test/unit/connection_test.rb
|
152
149
|
- test/unit/core_test.rb
|
153
150
|
- test/unit/counter_base_test.rb
|
@@ -168,7 +165,6 @@ files:
|
|
168
165
|
- test/unit/types/boolean_type_test.rb
|
169
166
|
- test/unit/types/date_type_test.rb
|
170
167
|
- test/unit/types/float_type_test.rb
|
171
|
-
- test/unit/types/hash_type_test.rb
|
172
168
|
- test/unit/types/integer_type_test.rb
|
173
169
|
- test/unit/types/json_type_test.rb
|
174
170
|
- test/unit/types/string_type_test.rb
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/hash/keys'
|
2
|
-
|
3
|
-
module CassandraObject
|
4
|
-
class Config
|
5
|
-
attr_accessor :servers, :keyspace, :thrift_options, :keyspace_options
|
6
|
-
|
7
|
-
def initialize(options)
|
8
|
-
options = options.symbolize_keys
|
9
|
-
self.servers = Array.wrap(options[:servers] || "127.0.0.1:9160")
|
10
|
-
self.keyspace = options[:keyspace]
|
11
|
-
self.thrift_options = (options[:thrift] || {}).symbolize_keys
|
12
|
-
self.keyspace_options = (options[:keyspace_options] || {}).symbolize_keys
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
module CassandraObject
|
2
|
-
module Types
|
3
|
-
class HashType < BaseType
|
4
|
-
class DirtyHash < Hash
|
5
|
-
attr_accessor :record, :name, :options
|
6
|
-
def initialize(record, name, hash, options)
|
7
|
-
@record = record
|
8
|
-
@name = name.to_s
|
9
|
-
@options = options
|
10
|
-
|
11
|
-
self.merge!(hash)
|
12
|
-
@init_hash = self.hash
|
13
|
-
@init_value = hash
|
14
|
-
end
|
15
|
-
|
16
|
-
def []=(obj, val)
|
17
|
-
modifying { super }
|
18
|
-
end
|
19
|
-
|
20
|
-
def delete(obj)
|
21
|
-
modifying { super }
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
def modifying
|
26
|
-
result = yield
|
27
|
-
|
28
|
-
if !record.changed_attributes.key?(name) && @init_hash != self.hash
|
29
|
-
record.changed_attributes[name] = @init_value
|
30
|
-
end
|
31
|
-
|
32
|
-
record.send("#{name}=", self)
|
33
|
-
|
34
|
-
result
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def encode(hash)
|
39
|
-
ActiveSupport::JSON.encode(hash)
|
40
|
-
end
|
41
|
-
|
42
|
-
def decode(str)
|
43
|
-
ActiveSupport::JSON.decode(str)
|
44
|
-
end
|
45
|
-
|
46
|
-
def wrap(record, name, value)
|
47
|
-
DirtyHash.new(record, name, Hash(value), options)
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
data/test/unit/config_test.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class CassandraObject::ConfigTest < CassandraObject::TestCase
|
4
|
-
test 'config writer' do
|
5
|
-
config = CassandraObject::Config.new(
|
6
|
-
keyspace: 'place_directory_development',
|
7
|
-
servers: '192.168.0.100:9160',
|
8
|
-
thrift: {'timeout' => 10},
|
9
|
-
keyspace_options: {'placement_strategy' => 'NetworkTopologyStrategy'}
|
10
|
-
)
|
11
|
-
|
12
|
-
assert_equal ['192.168.0.100:9160'], config.servers
|
13
|
-
assert_equal 'place_directory_development', config.keyspace
|
14
|
-
assert_equal 10, config.thrift_options[:timeout]
|
15
|
-
assert_equal 'NetworkTopologyStrategy', config.keyspace_options[:placement_strategy]
|
16
|
-
end
|
17
|
-
|
18
|
-
test 'defaults' do
|
19
|
-
config = CassandraObject::Config.new(keyspace: 'widget_factory')
|
20
|
-
|
21
|
-
assert_equal ["127.0.0.1:9160"], config.servers
|
22
|
-
end
|
23
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class CassandraObject::Types::HashTypeTest < CassandraObject::Types::TestCase
|
4
|
-
test 'encode' do
|
5
|
-
assert_equal({a: 'b'}.to_json, coder.encode(a: 'b'))
|
6
|
-
assert_equal '-3', coder.encode(-3)
|
7
|
-
end
|
8
|
-
|
9
|
-
test 'decode' do
|
10
|
-
assert_equal({'a' => 'b'}, coder.decode({'a' => 'b'}.to_json))
|
11
|
-
end
|
12
|
-
|
13
|
-
test 'setting marks dirty' do
|
14
|
-
record = temp_object do
|
15
|
-
string :name
|
16
|
-
hash_t :stuff
|
17
|
-
|
18
|
-
end.new name: 'abcd', stuff: Hash[a: 1, b: 2]
|
19
|
-
|
20
|
-
record.save!
|
21
|
-
assert !record.stuff_changed?
|
22
|
-
|
23
|
-
record.stuff[:c] = 3
|
24
|
-
|
25
|
-
assert record.stuff_changed?
|
26
|
-
assert_equal Hash[a: 1, b: 2, c: 3], record.stuff
|
27
|
-
end
|
28
|
-
|
29
|
-
test 'hash change marks dirty' do
|
30
|
-
record = temp_object do
|
31
|
-
string :name
|
32
|
-
hash_t :stuff
|
33
|
-
|
34
|
-
end.new name: 'abcd', stuff: Hash[a: 1, b: 2, v: {}]
|
35
|
-
|
36
|
-
record.save!
|
37
|
-
assert !record.stuff_changed?
|
38
|
-
|
39
|
-
record.stuff[:v][:data] = 69
|
40
|
-
record.stuff[:v] = record.stuff[:v]
|
41
|
-
|
42
|
-
assert record.stuff_changed?
|
43
|
-
assert_equal Hash[a: 1, b: 2, v: Hash[data: 69]], record.stuff
|
44
|
-
end
|
45
|
-
|
46
|
-
test 'hash no change does not dirty' do
|
47
|
-
record = temp_object do
|
48
|
-
string :name
|
49
|
-
hash_t :stuff
|
50
|
-
|
51
|
-
end.new name: 'abcd', stuff: Hash[a: 1, b: 2, v: {data: 69}]
|
52
|
-
|
53
|
-
record.save!
|
54
|
-
assert !record.stuff_changed?
|
55
|
-
|
56
|
-
record.stuff[:v][:data] = 69
|
57
|
-
record.stuff[:v] = record.stuff[:v]
|
58
|
-
|
59
|
-
assert !record.stuff_changed?
|
60
|
-
assert_equal Hash[a: 1, b: 2, v: Hash[data: 69]], record.stuff
|
61
|
-
end
|
62
|
-
|
63
|
-
test 'delete marks dirty' do
|
64
|
-
record = temp_object do
|
65
|
-
string :name
|
66
|
-
hash_t :stuff
|
67
|
-
|
68
|
-
end.new name: 'abcd', stuff: Hash[a: 1, b: 2]
|
69
|
-
|
70
|
-
record.stuff.delete :b
|
71
|
-
|
72
|
-
assert record.stuff_changed?
|
73
|
-
assert_equal Hash[a: 1], record.stuff
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
|
-
end
|