datastax_rails 1.2.3 → 2.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/README.rdoc +20 -8
- data/config/schema.xml.erb +22 -19
- data/config/solrconfig.xml.erb +1 -1
- data/lib/cql-rb_extensions.rb +27 -0
- data/lib/datastax_rails.rb +13 -17
- data/lib/datastax_rails/associations/association.rb +1 -4
- data/lib/datastax_rails/associations/collection_proxy.rb +0 -13
- data/lib/datastax_rails/attribute_assignment.rb +28 -91
- data/lib/datastax_rails/attribute_methods.rb +109 -44
- data/lib/datastax_rails/attribute_methods/before_type_cast.rb +71 -0
- data/lib/datastax_rails/attribute_methods/dirty.rb +52 -11
- data/lib/datastax_rails/attribute_methods/primary_key.rb +87 -0
- data/lib/datastax_rails/attribute_methods/read.rb +120 -0
- data/lib/datastax_rails/attribute_methods/typecasting.rb +52 -21
- data/lib/datastax_rails/attribute_methods/write.rb +59 -0
- data/lib/datastax_rails/base.rb +227 -236
- data/lib/datastax_rails/cassandra_only_model.rb +25 -19
- data/lib/datastax_rails/column.rb +384 -0
- data/lib/datastax_rails/connection.rb +12 -13
- data/lib/datastax_rails/cql/alter_column_family.rb +0 -1
- data/lib/datastax_rails/cql/base.rb +15 -3
- data/lib/datastax_rails/cql/column_family.rb +2 -2
- data/lib/datastax_rails/cql/create_column_family.rb +7 -18
- data/lib/datastax_rails/cql/delete.rb +4 -9
- data/lib/datastax_rails/cql/insert.rb +2 -8
- data/lib/datastax_rails/cql/select.rb +4 -4
- data/lib/datastax_rails/cql/update.rb +8 -17
- data/lib/datastax_rails/dynamic_model.rb +98 -0
- data/lib/datastax_rails/payload_model.rb +19 -31
- data/lib/datastax_rails/persistence.rb +39 -54
- data/lib/datastax_rails/railtie.rb +1 -0
- data/lib/datastax_rails/reflection.rb +1 -1
- data/lib/datastax_rails/relation.rb +20 -20
- data/lib/datastax_rails/relation/batches.rb +18 -16
- data/lib/datastax_rails/relation/facet_methods.rb +1 -1
- data/lib/datastax_rails/relation/finder_methods.rb +6 -10
- data/lib/datastax_rails/relation/search_methods.rb +62 -48
- data/lib/datastax_rails/rsolr_client_wrapper.rb +1 -1
- data/lib/datastax_rails/schema/cassandra.rb +34 -62
- data/lib/datastax_rails/schema/migrator.rb +9 -24
- data/lib/datastax_rails/schema/solr.rb +13 -30
- data/lib/datastax_rails/schema_cache.rb +67 -0
- data/lib/datastax_rails/timestamps.rb +84 -11
- data/lib/datastax_rails/types/dirty_collection.rb +88 -0
- data/lib/datastax_rails/types/dynamic_list.rb +14 -0
- data/lib/datastax_rails/types/dynamic_map.rb +32 -0
- data/lib/datastax_rails/types/dynamic_set.rb +10 -0
- data/lib/datastax_rails/util/solr_repair.rb +4 -5
- data/lib/datastax_rails/validations.rb +6 -12
- data/lib/datastax_rails/validations/uniqueness.rb +0 -4
- data/lib/datastax_rails/version.rb +1 -1
- data/lib/datastax_rails/wide_storage_model.rb +13 -29
- data/lib/schema_migration.rb +4 -0
- data/spec/datastax_rails/associations_spec.rb +0 -1
- data/spec/datastax_rails/attribute_methods_spec.rb +9 -6
- data/spec/datastax_rails/base_spec.rb +26 -0
- data/spec/datastax_rails/column_spec.rb +238 -0
- data/spec/datastax_rails/cql/select_spec.rb +1 -1
- data/spec/datastax_rails/cql/update_spec.rb +2 -2
- data/spec/datastax_rails/persistence_spec.rb +29 -15
- data/spec/datastax_rails/relation/batches_spec.rb +5 -5
- data/spec/datastax_rails/relation/finder_methods_spec.rb +0 -20
- data/spec/datastax_rails/relation/search_methods_spec.rb +8 -0
- data/spec/datastax_rails/relation_spec.rb +7 -0
- data/spec/datastax_rails/schema/migrator_spec.rb +5 -10
- data/spec/datastax_rails/schema/solr_spec.rb +1 -1
- data/spec/datastax_rails/types/dynamic_list_spec.rb +20 -0
- data/spec/datastax_rails/types/dynamic_map_spec.rb +22 -0
- data/spec/datastax_rails/types/dynamic_set_spec.rb +16 -0
- data/spec/dummy/config/application.rb +2 -1
- data/spec/dummy/config/datastax.yml +6 -3
- data/spec/dummy/config/environments/development.rb +4 -5
- data/spec/dummy/config/environments/test.rb +0 -5
- data/spec/dummy/log/development.log +18 -0
- data/spec/dummy/log/test.log +36 -0
- data/spec/feature/dynamic_fields_spec.rb +9 -0
- data/spec/feature/overloaded_tables_spec.rb +24 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/support/default_consistency_shared_examples.rb +2 -2
- data/spec/support/models.rb +28 -14
- metadata +212 -188
- data/lib/datastax_rails/identity.rb +0 -64
- data/lib/datastax_rails/identity/abstract_key_factory.rb +0 -29
- data/lib/datastax_rails/identity/custom_key_factory.rb +0 -37
- data/lib/datastax_rails/identity/hashed_natural_key_factory.rb +0 -10
- data/lib/datastax_rails/identity/natural_key_factory.rb +0 -39
- data/lib/datastax_rails/identity/uuid_key_factory.rb +0 -27
- data/lib/datastax_rails/type.rb +0 -16
- data/lib/datastax_rails/types.rb +0 -9
- data/lib/datastax_rails/types/array_type.rb +0 -86
- data/lib/datastax_rails/types/base_type.rb +0 -42
- data/lib/datastax_rails/types/binary_type.rb +0 -19
- data/lib/datastax_rails/types/boolean_type.rb +0 -22
- data/lib/datastax_rails/types/date_type.rb +0 -23
- data/lib/datastax_rails/types/float_type.rb +0 -18
- data/lib/datastax_rails/types/integer_type.rb +0 -18
- data/lib/datastax_rails/types/string_type.rb +0 -16
- data/lib/datastax_rails/types/text_type.rb +0 -15
- data/lib/datastax_rails/types/time_type.rb +0 -23
- data/spec/datastax_rails/types/float_type_spec.rb +0 -31
- data/spec/datastax_rails/types/integer_type_spec.rb +0 -31
- data/spec/datastax_rails/types/time_type_spec.rb +0 -28
@@ -1,44 +1,28 @@
|
|
1
1
|
module DatastaxRails
|
2
2
|
# A special model that is designed to efficiently store very wide data.
|
3
|
-
# This model type assumes that you have a unique ID
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
3
|
+
# This model type assumes that you have a unique ID that you want to
|
4
|
+
# store a lot of data about. The data is stored as a single, very
|
5
|
+
# wide row; however you can safely treat it as if there were multiple rows.
|
6
|
+
# A common example of this is a logs table
|
7
|
+
#
|
8
|
+
# You can also apply secondary indexes onto the other columns.
|
7
9
|
#
|
8
10
|
# CAVEATS:
|
9
|
-
# *
|
10
|
-
# * Once the cluster is set, it cannot be changed as it becomes the column header in Cassandra
|
11
|
+
# * Once the cluster attribute is set, it cannot be changed as it becomes the column header in Cassandra
|
11
12
|
#
|
12
13
|
# class AuditLog < DatastaxRails::WideStorageModel
|
13
14
|
# self.column_family = 'audit_logs'
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
15
|
+
# self.primary_key = :uuid
|
16
|
+
# self.cluster_by = :created_at
|
17
|
+
# # If you don't want the default ascending sort order
|
18
|
+
# self.create_options = 'CLUSTERING ORDER BY (created_at DESC)'
|
17
19
|
#
|
18
20
|
# string :uuid
|
19
21
|
# string :message
|
22
|
+
# string :user_id, :cql_index => true
|
20
23
|
# timestamps
|
21
24
|
# end
|
22
|
-
class WideStorageModel <
|
25
|
+
class WideStorageModel < DatastaxRails::Base
|
23
26
|
self.abstract_class = true
|
24
|
-
|
25
|
-
def self.cluster_by(attr = nil)
|
26
|
-
@cluster_by ||= attr.is_a?(Hash) ? attr : {attr => :asc}
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.write(key, attributes, options = {})
|
30
|
-
attributes = encode_attributes(attributes)
|
31
|
-
level = (options[:consistency] || self.default_consistency).to_s.upcase
|
32
|
-
if(valid_consistency?(level))
|
33
|
-
options[:consistency] = level
|
34
|
-
else
|
35
|
-
raise ArgumentError, "'#{level}' is not a valid Cassandra consistency level"
|
36
|
-
end
|
37
|
-
key.tap do |key|
|
38
|
-
ActiveSupport::Notifications.instrument("insert.datastax_rails", :column_family => column_family, :key => key, :attributes => attributes) do
|
39
|
-
cql.insert.using(level).columns(attributes).execute
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
27
|
end
|
44
28
|
end
|
data/lib/schema_migration.rb
CHANGED
@@ -2,12 +2,13 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
class AttributeMethodsTester < DatastaxRails::Base
|
4
4
|
string :test_string
|
5
|
-
string :non_search_string, :
|
5
|
+
string :non_search_string, :solr_index => false
|
6
6
|
end
|
7
7
|
|
8
|
-
class CassandraOnlyTester < DatastaxRails::
|
8
|
+
class CassandraOnlyTester < DatastaxRails::Base
|
9
|
+
include DatastaxRails::CassandraOnlyModel
|
9
10
|
string :test_string
|
10
|
-
string :test_string2, :
|
11
|
+
string :test_string2, :cql_index => true
|
11
12
|
end
|
12
13
|
|
13
14
|
describe DatastaxRails::Base do
|
@@ -28,17 +29,19 @@ describe DatastaxRails::Base do
|
|
28
29
|
describe "#attribute" do
|
29
30
|
context "Cassandra-only models" do
|
30
31
|
it "does not index columns by default" do
|
31
|
-
expect(CassandraOnlyTester.attribute_definitions[:test_string].
|
32
|
+
expect(CassandraOnlyTester.attribute_definitions[:test_string].options[:solr_index]).to be_false
|
33
|
+
expect(CassandraOnlyTester.attribute_definitions[:test_string].options[:cql_index]).to be_false
|
32
34
|
end
|
33
35
|
|
34
36
|
it "does not index into solr" do
|
35
|
-
expect(CassandraOnlyTester.attribute_definitions[:test_string2].
|
37
|
+
expect(CassandraOnlyTester.attribute_definitions[:test_string2].options[:solr_index]).to be_false
|
38
|
+
expect(CassandraOnlyTester.attribute_definitions[:test_string2].options[:cql_index]).to be_true
|
36
39
|
end
|
37
40
|
end
|
38
41
|
|
39
42
|
context "Normal models" do
|
40
43
|
it "indexes data into solr by default" do
|
41
|
-
expect(AttributeMethodsTester.attribute_definitions[:test_string].
|
44
|
+
expect(AttributeMethodsTester.attribute_definitions[:test_string].options[:solr_index]).to be_true
|
42
45
|
end
|
43
46
|
end
|
44
47
|
end
|
@@ -17,4 +17,30 @@ describe DatastaxRails::Base do
|
|
17
17
|
it "should raise RecordNotFound when finding a bogus ID" do
|
18
18
|
lambda { Person.find("xyzzy") }.should raise_exception(DatastaxRails::RecordNotFound)
|
19
19
|
end
|
20
|
+
|
21
|
+
describe "equality" do
|
22
|
+
it "considers new objects to be unequal" do
|
23
|
+
p1=Person.new(:name => 'John')
|
24
|
+
p2=Person.new(:name => 'John')
|
25
|
+
expect(p1).not_to eq(p2)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "considers a new object to be unequal to a saved object" do
|
29
|
+
p1=Person.create!(:name => 'John')
|
30
|
+
p2=Person.new(:name => 'John')
|
31
|
+
expect(p1).not_to eq(p2)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "considers two persisted objects to be equal if their primary keys are equal" do
|
35
|
+
p1=Person.create!(:name => 'John')
|
36
|
+
p2=Person.find(p1.id)
|
37
|
+
expect(p1).to eq(p2)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "considers two persisted objects to be unequal if they have different primary keys" do
|
41
|
+
p1=Person.create!(:name => 'John')
|
42
|
+
p2=Person.create!(:name => 'James')
|
43
|
+
expect(p1).not_to eq(p2)
|
44
|
+
end
|
45
|
+
end
|
20
46
|
end
|
@@ -0,0 +1,238 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DatastaxRails::Column do
|
4
|
+
describe "type casting" do
|
5
|
+
let(:record) {double(Person, :changed_attributes => {}, :attributes => {})}
|
6
|
+
|
7
|
+
describe "boolean" do
|
8
|
+
let(:c) {DatastaxRails::Column.new("field", nil, "boolean")}
|
9
|
+
|
10
|
+
describe "to ruby" do
|
11
|
+
it "casts '' to nil" do
|
12
|
+
expect(c.type_cast('')).to be_nil
|
13
|
+
end
|
14
|
+
|
15
|
+
it "casts nil to nil" do
|
16
|
+
expect(c.type_cast(nil)).to be_nil
|
17
|
+
end
|
18
|
+
|
19
|
+
[true, 1, '1', 't', 'T', 'true', 'TRUE', 'on', 'ON'].each do |val|
|
20
|
+
it "casts #{val.inspect} to true" do
|
21
|
+
expect(c.type_cast(val)).to eq(true)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
[false, 0, '0', 'f', 'F', 'false', 'FALSE', 'off', 'OFF', ' ', "\u3000\r\n", "\u0000", 'SOMETHING RANDOM'].each do |val|
|
26
|
+
it "casts #{val.inspect} to false" do
|
27
|
+
expect(c.type_cast(val)).to eq(false)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "to cql3" do
|
33
|
+
it "casts false to false" do
|
34
|
+
expect(c.type_cast_for_cql3(false)).to be_false
|
35
|
+
end
|
36
|
+
|
37
|
+
it "casts true to true" do
|
38
|
+
expect(c.type_cast_for_cql3(true)).to be_true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "to solr" do
|
43
|
+
it "casts false to 'false'" do
|
44
|
+
expect(c.type_cast_for_solr(false)).to eq('false')
|
45
|
+
end
|
46
|
+
|
47
|
+
it "casts true to 'true'" do
|
48
|
+
expect(c.type_cast_for_solr(true)).to eq('true')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "integer" do
|
54
|
+
let(:c) {DatastaxRails::Column.new("field", nil, "integer")}
|
55
|
+
|
56
|
+
describe "to ruby" do
|
57
|
+
[1,'1','1ignore','1.7',true].each do |val|
|
58
|
+
it "casts #{val.inspect} to true" do
|
59
|
+
expect(c.type_cast(val)).to eq(1)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
['bad1','bad',false].each do |val|
|
64
|
+
it "casts #{val.inspect} to 0" do
|
65
|
+
expect(c.type_cast(val)).to eq(0)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
[nil,[1,2],{1 => 2},(1..2),Object.new,Float::NAN,(1.0/0.0)].each do |val|
|
70
|
+
it "casts #{val.inspect} to nil" do
|
71
|
+
expect(c.type_cast(val)).to be_nil
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
it "casts a duration to an integer" do
|
76
|
+
expect(c.type_cast(30.minutes)).to be(1800)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "to cql3" do
|
81
|
+
it "casts 1 to 1" do
|
82
|
+
expect(c.type_cast_for_cql3(1)).to be(1)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "to solr" do
|
87
|
+
it "casts 1 to 1" do
|
88
|
+
expect(c.type_cast_for_solr(1)).to be(1)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "time" do
|
94
|
+
let(:c) {DatastaxRails::Column.new("field", nil, "time")}
|
95
|
+
|
96
|
+
describe "to ruby" do
|
97
|
+
[nil,'ABC',''].each do |val|
|
98
|
+
it "casts #{val.inspect} to nil" do
|
99
|
+
expect(c.type_cast(val)).to be_nil
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
it "casts a time string to Time" do
|
104
|
+
time_string = Time.now.utc.strftime("%T")
|
105
|
+
expect(c.type_cast(time_string).strftime("%T")).to eq(time_string)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "to cql3" do
|
110
|
+
it "casts a Time object to a Time object" do
|
111
|
+
time = Time.parse('1980-10-19 17:55:00')
|
112
|
+
expect(c.type_cast_for_cql3(time)).to eq(time)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "to solr" do
|
117
|
+
it "casts a Time object to a solr formatted time string" do
|
118
|
+
time = Time.parse('1980-10-19 17:55:00')
|
119
|
+
expect(c.type_cast_for_solr(time)).to eq('1980-10-19T17:55:00Z')
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe "timestamp" do
|
125
|
+
let(:c) {DatastaxRails::Column.new("field", nil, "timestamp")}
|
126
|
+
|
127
|
+
describe "to ruby" do
|
128
|
+
[nil,'',' ', 'ABC'].each do |val|
|
129
|
+
it "casts #{val.inspect} to nil" do
|
130
|
+
expect(c.type_cast(val)).to be_nil
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
it "casts a datetime string to Time" do
|
135
|
+
datetime_string = Time.now.utc.strftime("%FT%T")
|
136
|
+
expect(c.type_cast(datetime_string).strftime("%FT%T")).to eq(datetime_string)
|
137
|
+
end
|
138
|
+
|
139
|
+
it "casts a datetime string with timezone to Time" do
|
140
|
+
begin
|
141
|
+
old = DatastaxRails::Base.default_timezone
|
142
|
+
[:utc, :local].each do |zone|
|
143
|
+
DatastaxRails::Base.default_timezone = zone
|
144
|
+
datetime_string = "Wed, 04 Sep 2013 03:00:00 EAT"
|
145
|
+
expect(c.type_cast(val)).to eq(Time.utc(2013, 9, 4, 0, 0, 0))
|
146
|
+
end
|
147
|
+
rescue
|
148
|
+
DatastaxRails::Base.default_timezone = old
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
describe "to cql3" do
|
154
|
+
it "casts a Time object to a Time object" do
|
155
|
+
time = Time.parse('1980-10-19 17:55:00')
|
156
|
+
expect(c.type_cast_for_cql3(time)).to eq(time)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
describe "to solr" do
|
161
|
+
it "casts a Time object to a solr formatted time string" do
|
162
|
+
time = Time.parse('1980-10-19 17:55:00')
|
163
|
+
expect(c.type_cast_for_solr(time)).to eq('1980-10-19T17:55:00Z')
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe "date" do
|
169
|
+
let(:c) {DatastaxRails::Column.new("field", nil, "date")}
|
170
|
+
|
171
|
+
[nil,'',' ', 'ABC'].each do |val|
|
172
|
+
it "casts #{val.inspect} to nil" do
|
173
|
+
expect(c.type_cast(val)).to be_nil
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
it "casts a date string to Date" do
|
178
|
+
date_string = Time.now.utc.strftime("%F")
|
179
|
+
expect(c.type_cast(date_string).strftime("%F")).to eq(date_string)
|
180
|
+
end
|
181
|
+
|
182
|
+
describe "to cql3" do
|
183
|
+
it "casts a Date object to a Time object" do
|
184
|
+
time = Time.parse('1980-10-19 00:00:00')
|
185
|
+
date = Date.parse('1980-10-19')
|
186
|
+
expect(c.type_cast_for_cql3(date)).to eq(time)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
describe "to solr" do
|
191
|
+
it "casts a Date object to a solr formatted time string" do
|
192
|
+
date = Date.parse('1980-10-19')
|
193
|
+
expect(c.type_cast_for_solr(date)).to eq('1980-10-19T00:00:00Z')
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
describe "map" do
|
199
|
+
let(:c) {DatastaxRails::Column.new("field_", nil, "map", :holds => :integer)}
|
200
|
+
|
201
|
+
it "casts map keys to strings" do
|
202
|
+
expect(c.type_cast({:field_key => 7}, record)).to eq({"field_key" => 7})
|
203
|
+
end
|
204
|
+
|
205
|
+
it "casts map values to the type specified in the options" do
|
206
|
+
expect(c.type_cast({'field_key' => '7'}, record)).to eq({"field_key" => 7})
|
207
|
+
end
|
208
|
+
|
209
|
+
it "wraps map values in a DynamicMap" do
|
210
|
+
expect(c.type_cast({'field_key' => '7'}, record)).to be_a(DatastaxRails::Types::DynamicMap)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
describe "list" do
|
215
|
+
let(:c) {DatastaxRails::Column.new("field", nil, "list", :holds => :integer)}
|
216
|
+
|
217
|
+
it "casts list values to the type specified in the options" do
|
218
|
+
expect(c.type_cast([1,"2",6.minutes], record)).to eq([1,2,360])
|
219
|
+
end
|
220
|
+
|
221
|
+
it "wraps list values in a DynamicList" do
|
222
|
+
expect(c.type_cast([1,"2",6.minutes], record)).to be_a(DatastaxRails::Types::DynamicList)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
describe "set" do
|
227
|
+
let(:c) {DatastaxRails::Column.new("field", nil, "set", :holds => :integer)}
|
228
|
+
|
229
|
+
it "casts list values to the type specified in the options" do
|
230
|
+
expect(c.type_cast([1,"2",6.minutes, 2], record)).to eq(Set.new([1,2,360]))
|
231
|
+
end
|
232
|
+
|
233
|
+
it "wraps list values in a DynamicSet" do
|
234
|
+
expect(c.type_cast([1,"2",6.minutes, 2], record)).to be_a(DatastaxRails::Types::DynamicSet)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
@@ -8,7 +8,7 @@ describe DatastaxRails::Cql::Select do
|
|
8
8
|
it "should generate valid CQL" do
|
9
9
|
cql = DatastaxRails::Cql::Select.new(@model_class, ["*"])
|
10
10
|
cql.using(DatastaxRails::Cql::Consistency::QUORUM).conditions(:key => '12345').limit(1)
|
11
|
-
cql.to_cql.should == "SELECT * FROM users WHERE \"key\" =
|
11
|
+
cql.to_cql.should == "SELECT * FROM users WHERE \"key\" = ? LIMIT 1 "
|
12
12
|
end
|
13
13
|
|
14
14
|
it_has_behavior "default_consistency"
|
@@ -2,13 +2,13 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe DatastaxRails::Cql::Update do
|
4
4
|
before(:each) do
|
5
|
-
@model_class = double("Model Class", :column_family => 'users', :default_consistency => DatastaxRails::Cql::Consistency::QUORUM)
|
5
|
+
@model_class = double("Model Class", :column_family => 'users', :default_consistency => DatastaxRails::Cql::Consistency::QUORUM, :primary_key => 'id')
|
6
6
|
end
|
7
7
|
|
8
8
|
it "should generate valid CQL" do
|
9
9
|
cql = DatastaxRails::Cql::Update.new(@model_class, "12345")
|
10
10
|
cql.using(DatastaxRails::Cql::Consistency::QUORUM).columns(:name => 'John', :age => '23')
|
11
|
-
cql.to_cql.should match(/update users SET ("name" =
|
11
|
+
cql.to_cql.should match(/update users SET ("name" = \?, "age" = \?|"age" = \?, "name" = \?) WHERE id IN \(\?\)/)
|
12
12
|
end
|
13
13
|
|
14
14
|
it_has_behavior "default_consistency"
|
@@ -13,29 +13,53 @@ describe "DatastaxRails::Base" do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
describe "with cql" do
|
16
|
+
before(:each) do
|
17
|
+
Person.storage_method = :cql
|
18
|
+
@statement = double("prepared statement")
|
19
|
+
DatastaxRails::Base.connection.stub(:prepare).and_return(@statement)
|
20
|
+
end
|
21
|
+
|
16
22
|
describe "#create" do
|
17
23
|
it "should persist at the given consistency level" do
|
18
|
-
|
19
|
-
|
24
|
+
@statement.should_receive(:execute) do |*args|
|
25
|
+
expect(args.last).to include(:consistency => :local_quorum)
|
26
|
+
end
|
20
27
|
Person.create({:name => 'Steven'},{:consistency => 'LOCAL_QUORUM'})
|
21
28
|
end
|
22
29
|
end
|
23
30
|
|
24
31
|
describe "#save" do
|
25
32
|
it "should persist at the given consistency level" do
|
26
|
-
|
27
|
-
|
33
|
+
@statement.should_receive(:execute) do |*args|
|
34
|
+
expect(args.last).to include(:consistency => :local_quorum)
|
35
|
+
end
|
28
36
|
p=Person.new(:name => 'Steven')
|
29
37
|
p.save(:consistency => 'LOCAL_QUORUM')
|
30
38
|
end
|
31
39
|
end
|
40
|
+
|
41
|
+
describe "#remove" do
|
42
|
+
it "should remove at the given consistency level" do
|
43
|
+
@statement.stub(:execute)
|
44
|
+
p=Person.create(:name => 'Steven')
|
45
|
+
@statement.should_receive(:execute) do |*args|
|
46
|
+
expect(args.last).to include(:consistency => :local_quorum)
|
47
|
+
end
|
48
|
+
p.destroy(:consistency => :local_quorum)
|
49
|
+
end
|
50
|
+
end
|
32
51
|
end
|
33
52
|
|
34
53
|
describe "with solr" do
|
54
|
+
around(:each) do |example|
|
55
|
+
Person.storage_method = :solr
|
56
|
+
example.run
|
57
|
+
Person.storage_method = :cql
|
58
|
+
end
|
59
|
+
|
35
60
|
describe "#create" do
|
36
61
|
it "should persist at the given consistency level" do
|
37
62
|
Person.solr_connection.should_receive(:update).with(hash_including(:params => hash_including({:cl => 'LOCAL_QUORUM'}))).and_return(true)
|
38
|
-
Person.storage_method = :solr
|
39
63
|
Person.create({:name => 'Steven'},{:consistency => 'LOCAL_QUORUM'})
|
40
64
|
end
|
41
65
|
end
|
@@ -43,14 +67,12 @@ describe "DatastaxRails::Base" do
|
|
43
67
|
describe "#save" do
|
44
68
|
it "should persist at the given consistency level" do
|
45
69
|
Person.solr_connection.should_receive(:update).with(hash_including(:params => hash_including({:cl => 'LOCAL_QUORUM'}))).and_return(true)
|
46
|
-
Person.storage_method = :solr
|
47
70
|
p=Person.new(:name => 'Steven')
|
48
71
|
p.save(:consistency => 'LOCAL_QUORUM')
|
49
72
|
end
|
50
73
|
|
51
74
|
it "should successfully remove columns that are set to nil" do
|
52
75
|
pending do
|
53
|
-
Person.storage_method = :solr
|
54
76
|
p = Person.create!(:name => 'Steven', :birthdate => Date.today)
|
55
77
|
Person.commit_solr
|
56
78
|
p = Person.find_by_name('Steven')
|
@@ -63,14 +85,6 @@ describe "DatastaxRails::Base" do
|
|
63
85
|
end
|
64
86
|
end
|
65
87
|
|
66
|
-
describe "#remove" do
|
67
|
-
it "should remove at the given consistency level" do
|
68
|
-
p=Person.create(:name => 'Steven')
|
69
|
-
DatastaxRails::Base.connection.should_receive(:execute_cql_query).with(an_instance_of(String), :consistency => CassandraCQL::Thrift::ConsistencyLevel::LOCAL_QUORUM)
|
70
|
-
p.destroy(:consistency => :local_quorum)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
88
|
describe "#store_file" do
|
75
89
|
it "should store a file", :slow => true do
|
76
90
|
file = "abcd"*1.megabyte
|