cequel 1.4.2 → 1.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +19 -12
- data/Rakefile +5 -1
- data/lib/cequel/record/data_set_builder.rb +9 -2
- data/lib/cequel/record/record_set.rb +16 -2
- data/lib/cequel/record/tasks.rb +6 -2
- data/lib/cequel/version.rb +1 -1
- data/spec/examples/metal/data_set_spec.rb +113 -106
- data/spec/examples/metal/keyspace_spec.rb +7 -15
- data/spec/examples/record/associations_spec.rb +30 -30
- data/spec/examples/record/callbacks_spec.rb +25 -25
- data/spec/examples/record/dirty_spec.rb +11 -10
- data/spec/examples/record/list_spec.rb +33 -33
- data/spec/examples/record/map_spec.rb +57 -41
- data/spec/examples/record/mass_assignment_spec.rb +5 -5
- data/spec/examples/record/naming_spec.rb +2 -2
- data/spec/examples/record/persistence_spec.rb +23 -23
- data/spec/examples/record/properties_spec.rb +19 -19
- data/spec/examples/record/record_set_spec.rb +155 -151
- data/spec/examples/record/schema_spec.rb +7 -7
- data/spec/examples/record/scoped_spec.rb +2 -2
- data/spec/examples/record/serialization_spec.rb +2 -2
- data/spec/examples/record/set_spec.rb +27 -23
- data/spec/examples/record/validations_spec.rb +13 -13
- data/spec/examples/schema/table_reader_spec.rb +85 -79
- data/spec/examples/schema/table_synchronizer_spec.rb +9 -9
- data/spec/examples/schema/table_updater_spec.rb +17 -17
- data/spec/examples/schema/table_writer_spec.rb +33 -33
- data/spec/examples/type_spec.rb +55 -55
- data/spec/support/helpers.rb +18 -10
- metadata +18 -5
- data/spec/shared/readable_dictionary.rb +0 -192
@@ -31,7 +31,7 @@ describe Cequel::Record::Schema do
|
|
31
31
|
its(:data_columns) { should include(Cequel::Schema::List.new(:categories, :text)) }
|
32
32
|
its(:data_columns) { should include(Cequel::Schema::Set.new(:tags, :text)) }
|
33
33
|
its(:data_columns) { should include(Cequel::Schema::Map.new(:trackbacks, :timestamp, :text)) }
|
34
|
-
specify { subject.property(:comment).
|
34
|
+
specify { expect(subject.property(:comment)).to eq('Blog Posts') }
|
35
35
|
end
|
36
36
|
|
37
37
|
context 'existing model with additional attribute' do
|
@@ -69,7 +69,7 @@ describe Cequel::Record::Schema do
|
|
69
69
|
subject { cequel.schema.read_table(table_name) }
|
70
70
|
|
71
71
|
it 'should order clustering column descending' do
|
72
|
-
subject.clustering_columns.first.clustering_order.
|
72
|
+
expect(subject.clustering_columns.first.clustering_order).to eq(:desc)
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
@@ -97,7 +97,7 @@ describe Cequel::Record::Schema do
|
|
97
97
|
|
98
98
|
its(:partition_key_columns) { should == [Cequel::Schema::Column.new(:blog_subdomain, :text)] }
|
99
99
|
its(:clustering_columns) { should == [Cequel::Schema::Column.new(:id, :uuid)] }
|
100
|
-
it {
|
100
|
+
it { is_expected.to be_compact_storage }
|
101
101
|
its(:data_columns) { should == [Cequel::Schema::Column.new(:data, :text)] }
|
102
102
|
end
|
103
103
|
|
@@ -110,10 +110,10 @@ describe Cequel::Record::Schema do
|
|
110
110
|
legacy_model.synchronize_schema
|
111
111
|
end
|
112
112
|
|
113
|
-
its(:partition_key_columns) {
|
114
|
-
its(:clustering_columns) {
|
115
|
-
it {
|
116
|
-
its(:data_columns) {
|
113
|
+
its(:partition_key_columns) { is_expected.to eq([Cequel::Schema::Column.new(:blog_subdomain, :text)]) }
|
114
|
+
its(:clustering_columns) { is_expected.to eq([Cequel::Schema::Column.new(:id, :uuid)]) }
|
115
|
+
it { is_expected.to be_compact_storage }
|
116
|
+
its(:data_columns) { is_expected.to eq([Cequel::Schema::Column.new(:data, :text)]) }
|
117
117
|
|
118
118
|
it 'should be able to synchronize schema again' do
|
119
119
|
expect { legacy_model.synchronize_schema }.to_not raise_error
|
@@ -9,13 +9,13 @@ describe Cequel::Record::Scoped do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it 'should use current scoped key values to populate new record' do
|
12
|
-
Post['bigdata'].new.blog_subdomain.
|
12
|
+
expect(Post['bigdata'].new.blog_subdomain).to eq('bigdata')
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should not mess up class' #puts" do
|
16
16
|
StringIO.new.tap do |out|
|
17
17
|
out.puts Post
|
18
|
-
out.string.
|
18
|
+
expect(out.string).to eq("Post\n")
|
19
19
|
end
|
20
20
|
|
21
21
|
end
|
@@ -21,7 +21,7 @@ describe 'serialization' do
|
|
21
21
|
|
22
22
|
it 'should provide JSON serialization' do
|
23
23
|
Post.include_root_in_json = false
|
24
|
-
Post.new(attributes).as_json.symbolize_keys.
|
25
|
-
|
24
|
+
expect(Post.new(attributes).as_json.symbolize_keys).
|
25
|
+
to eq(attributes.merge(body: nil))
|
26
26
|
end
|
27
27
|
end
|
@@ -24,7 +24,7 @@ describe Cequel::Record::Set do
|
|
24
24
|
|
25
25
|
context 'new record' do
|
26
26
|
it 'should save set as-is' do
|
27
|
-
subject[:tags].
|
27
|
+
expect(subject[:tags]).to eq(Set['one', 'two'])
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -32,13 +32,13 @@ describe Cequel::Record::Set do
|
|
32
32
|
it 'should overwrite value' do
|
33
33
|
post.tags = Set['three', 'four']
|
34
34
|
post.save!
|
35
|
-
subject[:tags].
|
35
|
+
expect(subject[:tags]).to eq(Set['three', 'four'])
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'should cast collection before overwriting' do
|
39
39
|
post.tags = %w(three four)
|
40
40
|
post.save!
|
41
|
-
subject[:tags].
|
41
|
+
expect(subject[:tags]).to eq(Set['three', 'four'])
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -49,7 +49,7 @@ describe Cequel::Record::Set do
|
|
49
49
|
it 'should add atomically' do
|
50
50
|
post.tags.add('four')
|
51
51
|
post.save
|
52
|
-
subject[:tags].
|
52
|
+
expect(subject[:tags]).to eq(Set['one', 'two', 'three', 'four'])
|
53
53
|
expect(post.tags).to eq(Set['one', 'two', 'four'])
|
54
54
|
end
|
55
55
|
|
@@ -59,10 +59,11 @@ describe Cequel::Record::Set do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it 'should add without reading' do
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
62
|
+
expect_statement_count 1 do
|
63
|
+
unloaded_post.tags.add('four')
|
64
|
+
unloaded_post.save
|
65
|
+
end
|
66
|
+
expect(subject[:tags]).to eq(Set['one', 'two', 'three', 'four'])
|
66
67
|
end
|
67
68
|
|
68
69
|
it 'should apply add post-hoc' do
|
@@ -75,15 +76,16 @@ describe Cequel::Record::Set do
|
|
75
76
|
it 'should clear atomically' do
|
76
77
|
post.tags.clear
|
77
78
|
post.save
|
78
|
-
subject[:tags].
|
79
|
+
expect(subject[:tags]).to be_blank
|
79
80
|
expect(post.tags).to eq(Set[])
|
80
81
|
end
|
81
82
|
|
82
83
|
it 'should clear without reading' do
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
84
|
+
expect_statement_count 1 do
|
85
|
+
unloaded_post.tags.clear
|
86
|
+
unloaded_post.save
|
87
|
+
end
|
88
|
+
expect(subject[:tags]).to be_blank
|
87
89
|
end
|
88
90
|
|
89
91
|
it 'should apply clear post-hoc' do
|
@@ -96,7 +98,7 @@ describe Cequel::Record::Set do
|
|
96
98
|
it 'should delete atomically' do
|
97
99
|
post.tags.delete('two')
|
98
100
|
post.save
|
99
|
-
subject[:tags].
|
101
|
+
expect(subject[:tags]).to eq(Set['one', 'three'])
|
100
102
|
expect(post.tags).to eq(Set['one'])
|
101
103
|
end
|
102
104
|
|
@@ -106,10 +108,11 @@ describe Cequel::Record::Set do
|
|
106
108
|
end
|
107
109
|
|
108
110
|
it 'should delete without reading' do
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
111
|
+
expect_statement_count 1 do
|
112
|
+
unloaded_post.tags.delete('two')
|
113
|
+
unloaded_post.save
|
114
|
+
end
|
115
|
+
expect(subject[:tags]).to eq(Set['one', 'three'])
|
113
116
|
end
|
114
117
|
|
115
118
|
it 'should apply delete post-hoc' do
|
@@ -122,7 +125,7 @@ describe Cequel::Record::Set do
|
|
122
125
|
it 'should replace atomically' do
|
123
126
|
post.tags.replace(Set['a', 'b'])
|
124
127
|
post.save
|
125
|
-
subject[:tags].
|
128
|
+
expect(subject[:tags]).to eq(Set['a', 'b'])
|
126
129
|
expect(post.tags).to eq(Set['a', 'b'])
|
127
130
|
end
|
128
131
|
|
@@ -132,10 +135,11 @@ describe Cequel::Record::Set do
|
|
132
135
|
end
|
133
136
|
|
134
137
|
it 'should replace without reading' do
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
138
|
+
expect_statement_count 1 do
|
139
|
+
unloaded_post.tags.replace(Set['a', 'b'])
|
140
|
+
unloaded_post.save
|
141
|
+
end
|
142
|
+
expect(subject[:tags]).to eq(Set['a', 'b'])
|
139
143
|
end
|
140
144
|
|
141
145
|
it 'should apply delete post-hoc' do
|
@@ -29,37 +29,37 @@ describe Cequel::Record::Validations do
|
|
29
29
|
|
30
30
|
describe '#valid?' do
|
31
31
|
it 'should be false if model is not valid' do
|
32
|
-
invalid_post.
|
32
|
+
expect(invalid_post).not_to be_valid
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'should be true if model is valid' do
|
36
|
-
valid_post.
|
36
|
+
expect(valid_post).to be_valid
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
describe '#invalid?' do
|
41
41
|
it 'should be true if model is not valid' do
|
42
|
-
invalid_post.
|
42
|
+
expect(invalid_post).to be_invalid
|
43
43
|
end
|
44
44
|
|
45
45
|
it 'should be false if model is valid' do
|
46
|
-
valid_post.
|
46
|
+
expect(valid_post).not_to be_invalid
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
50
|
describe '#save' do
|
51
51
|
it 'should return false and not persist model if invalid' do
|
52
|
-
invalid_post.save.
|
52
|
+
expect(invalid_post.save).to eq(false)
|
53
53
|
end
|
54
54
|
|
55
55
|
it 'should return true and persist model if valid' do
|
56
|
-
valid_post.save.
|
57
|
-
Post.find('valid').title.
|
56
|
+
expect(valid_post.save).to eq(true)
|
57
|
+
expect(Post.find('valid').title).to eq('Valid Post')
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'should bypass validations if :validate => false is passed' do
|
61
|
-
invalid_post.save(:validate => false).
|
62
|
-
Post.find('invalid').body.
|
61
|
+
expect(invalid_post.save(:validate => false)).to eq(true)
|
62
|
+
expect(Post.find('invalid').body).to eq('This is an invalid post.')
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -71,7 +71,7 @@ describe Cequel::Record::Validations do
|
|
71
71
|
|
72
72
|
it 'should persist model and return self if valid' do
|
73
73
|
expect { valid_post.save! }.to_not raise_error
|
74
|
-
Post.find(valid_post.permalink).title.
|
74
|
+
expect(Post.find(valid_post.permalink).title).to eq('Valid Post')
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
@@ -83,7 +83,7 @@ describe Cequel::Record::Validations do
|
|
83
83
|
|
84
84
|
it 'should return successfully and update data in the database if valid' do
|
85
85
|
invalid_post.update_attributes!(:title => 'My Post')
|
86
|
-
Post.find(invalid_post.permalink).title.
|
86
|
+
expect(Post.find(invalid_post.permalink).title).to eq('My Post')
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -96,7 +96,7 @@ describe Cequel::Record::Validations do
|
|
96
96
|
|
97
97
|
it 'should persist record to database if valid' do
|
98
98
|
Post.create!(:permalink => 'cequel', :title => 'Cequel')
|
99
|
-
Post.find('cequel').title.
|
99
|
+
expect(Post.find('cequel').title).to eq('Cequel')
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
@@ -104,7 +104,7 @@ describe Cequel::Record::Validations do
|
|
104
104
|
it 'should call validation callbacks' do
|
105
105
|
post = Post.new(:title => 'cequel')
|
106
106
|
post.valid?
|
107
|
-
post.called_validate_callback.
|
107
|
+
expect(post.called_validate_callback).to eq(true)
|
108
108
|
end
|
109
109
|
end
|
110
110
|
end
|
@@ -15,15 +15,15 @@ describe Cequel::Schema::TableReader do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'should read name correctly' do
|
18
|
-
table.partition_key_columns.first.name.
|
18
|
+
expect(table.partition_key_columns.first.name).to eq(:permalink)
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'should read type correctly' do
|
22
|
-
table.partition_key_columns.first.type.
|
22
|
+
expect(table.partition_key_columns.first.type).to be_a(Cequel::Type::Text)
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'should have no nonpartition keys' do
|
26
|
-
table.clustering_columns.
|
26
|
+
expect(table.clustering_columns).to be_empty
|
27
27
|
end
|
28
28
|
end # describe 'reading simple key'
|
29
29
|
|
@@ -39,24 +39,24 @@ describe Cequel::Schema::TableReader do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
it 'should read partition key name' do
|
42
|
-
table.partition_key_columns.map(&:name).
|
42
|
+
expect(table.partition_key_columns.map(&:name)).to eq([:blog_subdomain])
|
43
43
|
end
|
44
44
|
|
45
45
|
it 'should read partition key type' do
|
46
|
-
table.partition_key_columns.map(&:type).
|
46
|
+
expect(table.partition_key_columns.map(&:type)).to eq([Cequel::Type::Text.instance])
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'should read non-partition key name' do
|
50
|
-
table.clustering_columns.map(&:name).
|
50
|
+
expect(table.clustering_columns.map(&:name)).to eq([:permalink])
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'should read non-partition key type' do
|
54
|
-
table.clustering_columns.map(&:type).
|
55
|
-
|
54
|
+
expect(table.clustering_columns.map(&:type)).
|
55
|
+
to eq([Cequel::Type::Ascii.instance])
|
56
56
|
end
|
57
57
|
|
58
58
|
it 'should default clustering order to asc' do
|
59
|
-
table.clustering_columns.map(&:clustering_order).
|
59
|
+
expect(table.clustering_columns.map(&:clustering_order)).to eq([:asc])
|
60
60
|
end
|
61
61
|
end # describe 'reading single non-partition key'
|
62
62
|
|
@@ -73,16 +73,16 @@ describe Cequel::Schema::TableReader do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
it 'should read non-partition key name' do
|
76
|
-
table.clustering_columns.map(&:name).
|
76
|
+
expect(table.clustering_columns.map(&:name)).to eq([:permalink])
|
77
77
|
end
|
78
78
|
|
79
79
|
it 'should read non-partition key type' do
|
80
|
-
table.clustering_columns.map(&:type).
|
81
|
-
|
80
|
+
expect(table.clustering_columns.map(&:type)).
|
81
|
+
to eq([Cequel::Type::Ascii.instance])
|
82
82
|
end
|
83
83
|
|
84
84
|
it 'should recognize reversed clustering order' do
|
85
|
-
table.clustering_columns.map(&:clustering_order).
|
85
|
+
expect(table.clustering_columns.map(&:clustering_order)).to eq([:desc])
|
86
86
|
end
|
87
87
|
end # describe 'reading reverse-ordered non-partition key'
|
88
88
|
|
@@ -100,16 +100,16 @@ describe Cequel::Schema::TableReader do
|
|
100
100
|
end
|
101
101
|
|
102
102
|
it 'should read non-partition key names' do
|
103
|
-
table.clustering_columns.map(&:name).
|
103
|
+
expect(table.clustering_columns.map(&:name)).to eq([:permalink, :author_id])
|
104
104
|
end
|
105
105
|
|
106
106
|
it 'should read non-partition key types' do
|
107
|
-
table.clustering_columns.map(&:type).
|
108
|
-
|
107
|
+
expect(table.clustering_columns.map(&:type)).
|
108
|
+
to eq([Cequel::Type::Ascii.instance, Cequel::Type::Uuid.instance])
|
109
109
|
end
|
110
110
|
|
111
111
|
it 'should read heterogeneous clustering orders' do
|
112
|
-
table.clustering_columns.map(&:clustering_order).
|
112
|
+
expect(table.clustering_columns.map(&:clustering_order)).to eq([:desc, :asc])
|
113
113
|
end
|
114
114
|
end # describe 'reading compound non-partition key'
|
115
115
|
|
@@ -125,16 +125,16 @@ describe Cequel::Schema::TableReader do
|
|
125
125
|
end
|
126
126
|
|
127
127
|
it 'should read partition key names' do
|
128
|
-
table.partition_key_columns.map(&:name).
|
128
|
+
expect(table.partition_key_columns.map(&:name)).to eq([:blog_subdomain, :permalink])
|
129
129
|
end
|
130
130
|
|
131
131
|
it 'should read partition key types' do
|
132
|
-
table.partition_key_columns.map(&:type).
|
133
|
-
|
132
|
+
expect(table.partition_key_columns.map(&:type)).
|
133
|
+
to eq([Cequel::Type::Text.instance, Cequel::Type::Ascii.instance])
|
134
134
|
end
|
135
135
|
|
136
136
|
it 'should have empty nonpartition keys' do
|
137
|
-
table.clustering_columns.
|
137
|
+
expect(table.clustering_columns).to be_empty
|
138
138
|
end
|
139
139
|
|
140
140
|
end # describe 'reading compound partition key'
|
@@ -154,26 +154,27 @@ describe Cequel::Schema::TableReader do
|
|
154
154
|
end
|
155
155
|
|
156
156
|
it 'should read partition key names' do
|
157
|
-
table.partition_key_columns.map(&:name).
|
157
|
+
expect(table.partition_key_columns.map(&:name)).to eq([:blog_subdomain, :permalink])
|
158
158
|
end
|
159
159
|
|
160
160
|
it 'should read partition key types' do
|
161
|
-
table.partition_key_columns.map(&:type).
|
162
|
-
|
161
|
+
expect(table.partition_key_columns.map(&:type)).
|
162
|
+
to eq([Cequel::Type::Text.instance, Cequel::Type::Ascii.instance])
|
163
163
|
end
|
164
164
|
|
165
165
|
it 'should read non-partition key names' do
|
166
|
-
table.clustering_columns.map(&:name).
|
167
|
-
|
166
|
+
expect(table.clustering_columns.map(&:name)).
|
167
|
+
to eq([:author_id, :published_at])
|
168
168
|
end
|
169
169
|
|
170
170
|
it 'should read non-partition key types' do
|
171
|
-
table.clustering_columns.map(&:type).
|
171
|
+
expect(table.clustering_columns.map(&:type)).to eq(
|
172
172
|
[Cequel::Type::Uuid.instance, Cequel::Type::Timestamp.instance]
|
173
|
+
)
|
173
174
|
end
|
174
175
|
|
175
176
|
it 'should read clustering order' do
|
176
|
-
table.clustering_columns.map(&:clustering_order).
|
177
|
+
expect(table.clustering_columns.map(&:clustering_order)).to eq([:asc, :desc])
|
177
178
|
end
|
178
179
|
|
179
180
|
end # describe 'reading compound partition and non-partition keys'
|
@@ -197,55 +198,55 @@ describe Cequel::Schema::TableReader do
|
|
197
198
|
end
|
198
199
|
|
199
200
|
it 'should read types of scalar data columns' do
|
200
|
-
table.data_columns.find { |column| column.name == :title }.type.
|
201
|
-
|
202
|
-
table.data_columns.find { |column| column.name == :author_id }.type.
|
203
|
-
|
201
|
+
expect(table.data_columns.find { |column| column.name == :title }.type).
|
202
|
+
to eq(Cequel::Type[:text])
|
203
|
+
expect(table.data_columns.find { |column| column.name == :author_id }.type).
|
204
|
+
to eq(Cequel::Type[:uuid])
|
204
205
|
end
|
205
206
|
|
206
207
|
it 'should read index attributes' do
|
207
|
-
table.data_columns.find { |column| column.name == :author_id }.index_name.
|
208
|
-
|
208
|
+
expect(table.data_columns.find { |column| column.name == :author_id }.index_name).
|
209
|
+
to eq(:posts_author_id_idx)
|
209
210
|
end
|
210
211
|
|
211
212
|
it 'should leave nil index for non-indexed columns' do
|
212
|
-
table.data_columns.find { |column| column.name == :title }.index_name.
|
213
|
-
|
213
|
+
expect(table.data_columns.find { |column| column.name == :title }.index_name).
|
214
|
+
to be_nil
|
214
215
|
end
|
215
216
|
|
216
217
|
it 'should read list columns' do
|
217
|
-
table.data_columns.find { |column| column.name == :categories }.
|
218
|
-
|
218
|
+
expect(table.data_columns.find { |column| column.name == :categories }).
|
219
|
+
to be_a(Cequel::Schema::List)
|
219
220
|
end
|
220
221
|
|
221
222
|
it 'should read list column type' do
|
222
|
-
table.data_columns.find { |column| column.name == :categories }.type.
|
223
|
-
|
223
|
+
expect(table.data_columns.find { |column| column.name == :categories }.type).
|
224
|
+
to eq(Cequel::Type[:text])
|
224
225
|
end
|
225
226
|
|
226
227
|
it 'should read set columns' do
|
227
|
-
table.data_columns.find { |column| column.name == :tags }.
|
228
|
-
|
228
|
+
expect(table.data_columns.find { |column| column.name == :tags }).
|
229
|
+
to be_a(Cequel::Schema::Set)
|
229
230
|
end
|
230
231
|
|
231
232
|
it 'should read set column type' do
|
232
|
-
table.data_columns.find { |column| column.name == :tags }.type.
|
233
|
-
|
233
|
+
expect(table.data_columns.find { |column| column.name == :tags }.type).
|
234
|
+
to eq(Cequel::Type[:text])
|
234
235
|
end
|
235
236
|
|
236
237
|
it 'should read map columns' do
|
237
|
-
table.data_columns.find { |column| column.name == :trackbacks }.
|
238
|
-
|
238
|
+
expect(table.data_columns.find { |column| column.name == :trackbacks }).
|
239
|
+
to be_a(Cequel::Schema::Map)
|
239
240
|
end
|
240
241
|
|
241
242
|
it 'should read map column key type' do
|
242
|
-
table.data_columns.find { |column| column.name == :trackbacks }.key_type.
|
243
|
-
|
243
|
+
expect(table.data_columns.find { |column| column.name == :trackbacks }.key_type).
|
244
|
+
to eq(Cequel::Type[:timestamp])
|
244
245
|
end
|
245
246
|
|
246
247
|
it 'should read map column value type' do
|
247
|
-
table.data_columns.find { |column| column.name == :trackbacks }.
|
248
|
-
value_type.
|
248
|
+
expect(table.data_columns.find { |column| column.name == :trackbacks }.
|
249
|
+
value_type).to eq(Cequel::Type[:ascii])
|
249
250
|
end
|
250
251
|
|
251
252
|
end # describe 'reading data columns'
|
@@ -272,41 +273,41 @@ describe Cequel::Schema::TableReader do
|
|
272
273
|
end
|
273
274
|
|
274
275
|
it 'should read float properties' do
|
275
|
-
table.property(:bloom_filter_fp_chance).
|
276
|
+
expect(table.property(:bloom_filter_fp_chance)).to eq(0.02)
|
276
277
|
end
|
277
278
|
|
278
279
|
it 'should read string properties' do
|
279
|
-
table.property(:comment).
|
280
|
+
expect(table.property(:comment)).to eq('Posts table')
|
280
281
|
end
|
281
282
|
|
282
283
|
it 'should read and simplify compaction class' do
|
283
|
-
table.property(:compaction)[:class].
|
284
|
-
|
284
|
+
expect(table.property(:compaction)[:class]).
|
285
|
+
to eq('SizeTieredCompactionStrategy')
|
285
286
|
end
|
286
287
|
|
287
288
|
it 'should read float properties from compaction hash' do
|
288
|
-
table.property(:compaction)[:bucket_high].
|
289
|
+
expect(table.property(:compaction)[:bucket_high]).to eq(1.8)
|
289
290
|
end
|
290
291
|
|
291
292
|
it 'should read integer properties from compaction hash' do
|
292
|
-
table.property(:compaction)[:max_threshold].
|
293
|
+
expect(table.property(:compaction)[:max_threshold]).to eq(64)
|
293
294
|
end
|
294
295
|
|
295
296
|
it 'should read and simplify compression class' do
|
296
|
-
table.property(:compression)[:sstable_compression].
|
297
|
-
|
297
|
+
expect(table.property(:compression)[:sstable_compression]).
|
298
|
+
to eq('DeflateCompressor')
|
298
299
|
end
|
299
300
|
|
300
301
|
it 'should read integer properties from compression class' do
|
301
|
-
table.property(:compression)[:chunk_length_kb].
|
302
|
+
expect(table.property(:compression)[:chunk_length_kb]).to eq(128)
|
302
303
|
end
|
303
304
|
|
304
305
|
it 'should read float properties from compression class' do
|
305
|
-
table.property(:compression)[:crc_check_chance].
|
306
|
+
expect(table.property(:compression)[:crc_check_chance]).to eq(0.5)
|
306
307
|
end
|
307
308
|
|
308
309
|
it 'should recognize no compact storage' do
|
309
|
-
table.
|
310
|
+
expect(table).not_to be_compact_storage
|
310
311
|
end
|
311
312
|
|
312
313
|
end # describe 'reading storage properties'
|
@@ -320,13 +321,13 @@ describe Cequel::Schema::TableReader do
|
|
320
321
|
end
|
321
322
|
subject { table }
|
322
323
|
|
323
|
-
it {
|
324
|
+
it { is_expected.to be_compact_storage }
|
324
325
|
its(:partition_key_columns) { should ==
|
325
326
|
[Cequel::Schema::PartitionKey.new(:permalink, :text)] }
|
326
327
|
its(:clustering_columns) { should be_empty }
|
327
|
-
|
328
|
-
|
329
|
-
|
328
|
+
specify { expect(table.data_columns).to contain_exactly(
|
329
|
+
Cequel::Schema::DataColumn.new(:title, :text),
|
330
|
+
Cequel::Schema::DataColumn.new(:body, :text)) }
|
330
331
|
end
|
331
332
|
|
332
333
|
describe 'wide-row compact storage' do
|
@@ -343,7 +344,7 @@ describe Cequel::Schema::TableReader do
|
|
343
344
|
end
|
344
345
|
subject { table }
|
345
346
|
|
346
|
-
it {
|
347
|
+
it { is_expected.to be_compact_storage }
|
347
348
|
its(:partition_key_columns) { should ==
|
348
349
|
[Cequel::Schema::PartitionKey.new(:blog_subdomain, :text)] }
|
349
350
|
its(:clustering_columns) { should ==
|
@@ -360,13 +361,15 @@ describe Cequel::Schema::TableReader do
|
|
360
361
|
end
|
361
362
|
subject { table }
|
362
363
|
|
363
|
-
it {
|
364
|
-
its(:partition_key_columns) {
|
365
|
-
[Cequel::Schema::PartitionKey.new(:permalink, :text)]
|
366
|
-
|
367
|
-
its(:
|
364
|
+
it { is_expected.to be_compact_storage }
|
365
|
+
its(:partition_key_columns) { is_expected.to eq(
|
366
|
+
[Cequel::Schema::PartitionKey.new(:permalink, :text)]
|
367
|
+
) }
|
368
|
+
its(:clustering_columns) { is_expected.to be_empty }
|
369
|
+
its(:data_columns) { is_expected.to match_array(
|
368
370
|
[Cequel::Schema::DataColumn.new(:title, :text),
|
369
|
-
Cequel::Schema::DataColumn.new(:body, :text)]
|
371
|
+
Cequel::Schema::DataColumn.new(:body, :text)]
|
372
|
+
) }
|
370
373
|
end
|
371
374
|
|
372
375
|
describe 'wide-row legacy table', thrift: true do
|
@@ -378,12 +381,15 @@ describe Cequel::Schema::TableReader do
|
|
378
381
|
end
|
379
382
|
subject { table }
|
380
383
|
|
381
|
-
it {
|
382
|
-
its(:partition_key_columns) {
|
383
|
-
[Cequel::Schema::PartitionKey.new(:blog_subdomain, :text)]
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
384
|
+
it { is_expected.to be_compact_storage }
|
385
|
+
its(:partition_key_columns) { is_expected.to eq(
|
386
|
+
[Cequel::Schema::PartitionKey.new(:blog_subdomain, :text)]
|
387
|
+
) }
|
388
|
+
its(:clustering_columns) { is_expected.to eq(
|
389
|
+
[Cequel::Schema::ClusteringColumn.new(:column1, :uuid)]
|
390
|
+
) }
|
391
|
+
its(:data_columns) { is_expected.to eq(
|
392
|
+
[Cequel::Schema::DataColumn.new(:value, :text)]
|
393
|
+
) }
|
388
394
|
end
|
389
395
|
end
|