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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 972c48841d081a702bd2bb4dd97cc94a7da02f42
|
4
|
+
data.tar.gz: 0d75dca1e13d7bb1856e4f0ea6d7af3795a95959
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c58f9ec3bb7cf8c308d38eb091d18535b5051c8301d7b84e33beb8e03abfc01f8ca8ea4711b894980fe6df760055e10b8fba78a9639fa0bdb7dba018cb31624a
|
7
|
+
data.tar.gz: e4b13cb2ee0ed6b1971fefbaa5609107289722bd788c0ae4088e663fe37b56d40d094673941ce49b82afdb2b3e40990a48749dba93640cdc3da81a3b71d4082e
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cequel (1.4.
|
4
|
+
cequel (1.4.3)
|
5
5
|
activemodel (>= 3.1, < 5.0)
|
6
6
|
cql-rb (>= 1.2, < 3.0)
|
7
7
|
|
@@ -44,7 +44,7 @@ GEM
|
|
44
44
|
json (1.8.1)
|
45
45
|
json (1.8.1-java)
|
46
46
|
method_source (0.8.2)
|
47
|
-
minitest (5.4.
|
47
|
+
minitest (5.4.2)
|
48
48
|
parser (2.1.9)
|
49
49
|
ast (>= 1.1, < 3.0)
|
50
50
|
slop (~> 3.4, >= 3.4.5)
|
@@ -62,14 +62,21 @@ GEM
|
|
62
62
|
racc (1.4.12)
|
63
63
|
rainbow (2.0.0)
|
64
64
|
rake (10.3.2)
|
65
|
-
rspec (
|
66
|
-
rspec-core (~>
|
67
|
-
rspec-expectations (~>
|
68
|
-
rspec-mocks (~>
|
69
|
-
rspec-core (
|
70
|
-
|
71
|
-
|
72
|
-
|
65
|
+
rspec (3.1.0)
|
66
|
+
rspec-core (~> 3.1.0)
|
67
|
+
rspec-expectations (~> 3.1.0)
|
68
|
+
rspec-mocks (~> 3.1.0)
|
69
|
+
rspec-core (3.1.5)
|
70
|
+
rspec-support (~> 3.1.0)
|
71
|
+
rspec-expectations (3.1.2)
|
72
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
73
|
+
rspec-support (~> 3.1.0)
|
74
|
+
rspec-its (1.0.1)
|
75
|
+
rspec-core (>= 2.99.0.beta1)
|
76
|
+
rspec-expectations (>= 2.99.0.beta1)
|
77
|
+
rspec-mocks (3.1.2)
|
78
|
+
rspec-support (~> 3.1.0)
|
79
|
+
rspec-support (3.1.1)
|
73
80
|
rubocop (0.19.1)
|
74
81
|
json (>= 1.7.7, < 2)
|
75
82
|
parser (~> 2.1.7)
|
@@ -284,7 +291,6 @@ GEM
|
|
284
291
|
ffi
|
285
292
|
thor (0.19.1)
|
286
293
|
thread_safe (0.3.4)
|
287
|
-
thread_safe (0.3.4-java)
|
288
294
|
timecop (0.7.1)
|
289
295
|
tzinfo (1.2.2)
|
290
296
|
thread_safe (~> 0.1)
|
@@ -304,7 +310,8 @@ DEPENDENCIES
|
|
304
310
|
psych (~> 2.0)
|
305
311
|
racc (~> 1.4)
|
306
312
|
rake (~> 10.1)
|
307
|
-
rspec (~>
|
313
|
+
rspec (~> 3.1)
|
314
|
+
rspec-its (~> 1.0)
|
308
315
|
rubocop (~> 0.19.0)
|
309
316
|
rubysl (~> 2.0)
|
310
317
|
timecop (~> 0.7)
|
data/Rakefile
CHANGED
@@ -11,7 +11,7 @@ task :default => :release
|
|
11
11
|
task :release => [
|
12
12
|
:verify_changelog,
|
13
13
|
:rubocop,
|
14
|
-
:
|
14
|
+
:"test:all",
|
15
15
|
:build,
|
16
16
|
:tag,
|
17
17
|
:update_stable,
|
@@ -67,6 +67,10 @@ namespace :test do
|
|
67
67
|
t.rspec_opts = '--fail-fast --format=progress'
|
68
68
|
t.fail_on_error = true
|
69
69
|
end
|
70
|
+
|
71
|
+
task :all do
|
72
|
+
system('bundle', 'exec', 'wwtd', '--parallel')
|
73
|
+
end
|
70
74
|
end
|
71
75
|
|
72
76
|
desc 'Update changelog'
|
@@ -51,7 +51,7 @@ module Cequel
|
|
51
51
|
:scoped_key_names, :scoped_key_values,
|
52
52
|
:scoped_indexed_column, :lower_bound,
|
53
53
|
:upper_bound, :reversed?, :order_by_column,
|
54
|
-
:query_consistency
|
54
|
+
:query_consistency, :ascends_by?
|
55
55
|
|
56
56
|
private
|
57
57
|
|
@@ -85,7 +85,10 @@ module Cequel
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def add_order
|
88
|
-
|
88
|
+
column = order_by_column
|
89
|
+
if column.present? && reversed?
|
90
|
+
self.data_set = data_set.order(column.name => sort_direction)
|
91
|
+
end
|
89
92
|
end
|
90
93
|
|
91
94
|
def set_consistency
|
@@ -93,6 +96,10 @@ module Cequel
|
|
93
96
|
self.data_set = data_set.consistency(query_consistency)
|
94
97
|
end
|
95
98
|
end
|
99
|
+
|
100
|
+
def sort_direction
|
101
|
+
ascends_by?(order_by_column) ? :asc : :desc
|
102
|
+
end
|
96
103
|
end
|
97
104
|
end
|
98
105
|
end
|
@@ -656,7 +656,21 @@ module Cequel
|
|
656
656
|
protected :reversed?
|
657
657
|
|
658
658
|
def next_batch_from(row)
|
659
|
-
|
659
|
+
range_key_value = row[range_key_name]
|
660
|
+
if ascends_by?(range_key_column)
|
661
|
+
after(range_key_value)
|
662
|
+
else
|
663
|
+
before(range_key_value)
|
664
|
+
end
|
665
|
+
end
|
666
|
+
|
667
|
+
def ascends_by?(column)
|
668
|
+
!descends_by?(column)
|
669
|
+
end
|
670
|
+
|
671
|
+
def descends_by?(column)
|
672
|
+
column.clustering_column? &&
|
673
|
+
(reversed? ^ (column.clustering_order == :desc))
|
660
674
|
end
|
661
675
|
|
662
676
|
def find_nested_batches_from(row, options, &block)
|
@@ -837,7 +851,7 @@ module Cequel
|
|
837
851
|
|
838
852
|
def order_by_column
|
839
853
|
if target_class.clustering_columns.any?
|
840
|
-
target_class.clustering_columns.first
|
854
|
+
target_class.clustering_columns.first
|
841
855
|
end
|
842
856
|
end
|
843
857
|
|
data/lib/cequel/record/tasks.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
+
task :environment do
|
3
|
+
end
|
4
|
+
|
2
5
|
namespace :cequel do
|
3
6
|
namespace :keyspace do
|
4
7
|
desc 'Initialize Cassandra keyspace'
|
@@ -20,8 +23,9 @@ namespace :cequel do
|
|
20
23
|
watch_stack = ActiveSupport::Dependencies::WatchStack.new
|
21
24
|
|
22
25
|
migration_table_names = Set[]
|
23
|
-
|
24
|
-
|
26
|
+
project_root = defined?(Rails) ? Rails.root : Dir.pwd
|
27
|
+
models_dir_path = "#{File.expand_path('app/models', project_root)}/"
|
28
|
+
model_files = Dir.glob(File.join(models_dir_path, '**', '*.rb'))
|
25
29
|
model_files.sort.each do |file|
|
26
30
|
watch_namespaces = ["Object"]
|
27
31
|
model_file_name = file.sub(/^#{Regexp.escape(models_dir_path)}/, "")
|
data/lib/cequel/version.rb
CHANGED
@@ -49,39 +49,39 @@ describe Cequel::Metal::DataSet do
|
|
49
49
|
|
50
50
|
it 'should insert a row' do
|
51
51
|
cequel[:posts].insert(row)
|
52
|
-
cequel[:posts].where(row_keys).first[:title].
|
52
|
+
expect(cequel[:posts].where(row_keys).first[:title]).to eq('Fun times')
|
53
53
|
end
|
54
54
|
|
55
55
|
it 'should correctly insert a list' do
|
56
56
|
cequel[:posts].insert(row)
|
57
|
-
cequel[:posts].where(row_keys).first[:categories].
|
58
|
-
|
57
|
+
expect(cequel[:posts].where(row_keys).first[:categories]).
|
58
|
+
to eq(['Fun', 'Profit'])
|
59
59
|
end
|
60
60
|
|
61
61
|
it 'should correctly insert a set' do
|
62
62
|
cequel[:posts].insert(row)
|
63
|
-
cequel[:posts].where(row_keys).first[:tags].
|
64
|
-
|
63
|
+
expect(cequel[:posts].where(row_keys).first[:tags]).
|
64
|
+
to eq(Set['cassandra', 'big-data'])
|
65
65
|
end
|
66
66
|
|
67
67
|
it 'should correctly insert a map' do
|
68
68
|
cequel[:posts].insert(row)
|
69
|
-
cequel[:posts].where(row_keys).first[:trackbacks].
|
70
|
-
|
69
|
+
expect(cequel[:posts].where(row_keys).first[:trackbacks]).
|
70
|
+
to eq(row[:trackbacks])
|
71
71
|
end
|
72
72
|
|
73
73
|
it 'should include ttl argument' do
|
74
74
|
cequel[:posts].insert(row, :ttl => 10.minutes)
|
75
|
-
cequel[:posts].select_ttl(:title).where(row_keys).first.ttl(:title).
|
76
|
-
|
75
|
+
expect(cequel[:posts].select_ttl(:title).where(row_keys).first.ttl(:title)).
|
76
|
+
to be_within(5).of(10.minutes)
|
77
77
|
end
|
78
78
|
|
79
79
|
it 'should include timestamp argument' do
|
80
80
|
cequel.schema.truncate_table(:posts)
|
81
81
|
time = 1.day.ago
|
82
82
|
cequel[:posts].insert(row, :timestamp => time)
|
83
|
-
cequel[:posts].select_writetime(:title).where(row_keys).
|
84
|
-
first.writetime(:title).
|
83
|
+
expect(cequel[:posts].select_writetime(:title).where(row_keys).
|
84
|
+
first.writetime(:title)).to eq((time.to_f * 1_000_000).to_i)
|
85
85
|
end
|
86
86
|
|
87
87
|
it 'should insert row with given consistency' do
|
@@ -96,8 +96,8 @@ describe Cequel::Metal::DataSet do
|
|
96
96
|
cequel[:posts].insert(row, :ttl => 600, :timestamp => time)
|
97
97
|
result = cequel[:posts].select_ttl(:title).select_writetime(:title).
|
98
98
|
where(row_keys).first
|
99
|
-
result.writetime(:title).
|
100
|
-
result.ttl(:title).
|
99
|
+
expect(result.writetime(:title)).to eq((time.to_f * 1_000_000).to_i)
|
100
|
+
expect(result.ttl(:title)).to be_within(5).of(10.minutes)
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
@@ -105,8 +105,8 @@ describe Cequel::Metal::DataSet do
|
|
105
105
|
it 'should send basic update statement' do
|
106
106
|
cequel[:posts].where(row_keys).
|
107
107
|
update(:title => 'Fun times', :body => 'Fun')
|
108
|
-
cequel[:posts].where(row_keys).
|
109
|
-
first[:title].
|
108
|
+
expect(cequel[:posts].where(row_keys).
|
109
|
+
first[:title]).to eq('Fun times')
|
110
110
|
end
|
111
111
|
|
112
112
|
it 'should send update statement with options' do
|
@@ -120,8 +120,8 @@ describe Cequel::Metal::DataSet do
|
|
120
120
|
select_ttl(:title).select_writetime(:title).
|
121
121
|
where(row_keys).first
|
122
122
|
|
123
|
-
row.ttl(:title).
|
124
|
-
row.writetime(:title).
|
123
|
+
expect(row.ttl(:title)).to be_within(5).of(10.minutes)
|
124
|
+
expect(row.writetime(:title)).to eq((time.to_f * 1_000_000).to_i)
|
125
125
|
end
|
126
126
|
|
127
127
|
it 'should send update statement with given consistency' do
|
@@ -134,14 +134,14 @@ describe Cequel::Metal::DataSet do
|
|
134
134
|
it 'should overwrite list column' do
|
135
135
|
cequel[:posts].where(row_keys).
|
136
136
|
update(categories: ['Big Data', 'Cassandra'])
|
137
|
-
cequel[:posts].where(row_keys).first[:categories].
|
138
|
-
|
137
|
+
expect(cequel[:posts].where(row_keys).first[:categories]).
|
138
|
+
to eq(['Big Data', 'Cassandra'])
|
139
139
|
end
|
140
140
|
|
141
141
|
it 'should overwrite set column' do
|
142
142
|
cequel[:posts].where(row_keys).update(tags: Set['big-data', 'nosql'])
|
143
|
-
cequel[:posts].where(row_keys).first[:tags].
|
144
|
-
|
143
|
+
expect(cequel[:posts].where(row_keys).first[:tags]).
|
144
|
+
to eq(Set['big-data', 'nosql'])
|
145
145
|
end
|
146
146
|
|
147
147
|
it 'should overwrite map column' do
|
@@ -149,8 +149,8 @@ describe Cequel::Metal::DataSet do
|
|
149
149
|
time2 = Time.at(10.minutes.ago.to_i)
|
150
150
|
cequel[:posts].where(row_keys).update(
|
151
151
|
trackbacks: {time1 => 'foo', time2 => 'bar'})
|
152
|
-
cequel[:posts].where(row_keys).first[:trackbacks].
|
153
|
-
|
152
|
+
expect(cequel[:posts].where(row_keys).first[:trackbacks]).
|
153
|
+
to eq({time1 => 'foo', time2 => 'bar'})
|
154
154
|
end
|
155
155
|
|
156
156
|
it 'should perform various types of update in one go' do
|
@@ -162,9 +162,9 @@ describe Cequel::Metal::DataSet do
|
|
162
162
|
set(title: 'Bigger Data')
|
163
163
|
list_append(:categories, 'Fault-Tolerance')
|
164
164
|
end
|
165
|
-
cequel[:posts].where(row_keys).first[:title].
|
166
|
-
cequel[:posts].where(row_keys).first[:categories].
|
167
|
-
|
165
|
+
expect(cequel[:posts].where(row_keys).first[:title]).to eq('Bigger Data')
|
166
|
+
expect(cequel[:posts].where(row_keys).first[:categories]).
|
167
|
+
to eq(%w(Scalability Fault-Tolerance))
|
168
168
|
end
|
169
169
|
|
170
170
|
it 'should use the last value set for a given column' do
|
@@ -176,7 +176,7 @@ describe Cequel::Metal::DataSet do
|
|
176
176
|
set(title: 'Bigger Data')
|
177
177
|
set(title: 'Even Bigger Data')
|
178
178
|
end
|
179
|
-
cequel[:posts].where(row_keys).first[:title].
|
179
|
+
expect(cequel[:posts].where(row_keys).first[:title]).to eq('Even Bigger Data')
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
@@ -186,8 +186,9 @@ describe Cequel::Metal::DataSet do
|
|
186
186
|
row_keys.merge(categories: ['Big Data', 'Cassandra']))
|
187
187
|
cequel[:posts].where(row_keys).
|
188
188
|
list_prepend(:categories, 'Scalability')
|
189
|
-
cequel[:posts].where(row_keys).first[:categories].
|
189
|
+
expect(cequel[:posts].where(row_keys).first[:categories]).to eq(
|
190
190
|
['Scalability', 'Big Data', 'Cassandra']
|
191
|
+
)
|
191
192
|
end
|
192
193
|
|
193
194
|
it 'should prepend multiple elements to list column' do
|
@@ -195,8 +196,9 @@ describe Cequel::Metal::DataSet do
|
|
195
196
|
row_keys.merge(categories: ['Big Data', 'Cassandra']))
|
196
197
|
cequel[:posts].where(row_keys).
|
197
198
|
list_prepend(:categories, ['Scalability', 'Partition Tolerance'])
|
198
|
-
cequel[:posts].where(row_keys).first[:categories].
|
199
|
+
expect(cequel[:posts].where(row_keys).first[:categories]).to eq(
|
199
200
|
['Partition Tolerance', 'Scalability', 'Big Data', 'Cassandra']
|
201
|
+
)
|
200
202
|
end
|
201
203
|
end
|
202
204
|
|
@@ -206,8 +208,9 @@ describe Cequel::Metal::DataSet do
|
|
206
208
|
row_keys.merge(categories: ['Big Data', 'Cassandra']))
|
207
209
|
cequel[:posts].where(row_keys).
|
208
210
|
list_append(:categories, 'Scalability')
|
209
|
-
cequel[:posts].where(row_keys).first[:categories].
|
211
|
+
expect(cequel[:posts].where(row_keys).first[:categories]).to eq(
|
210
212
|
['Big Data', 'Cassandra', 'Scalability']
|
213
|
+
)
|
211
214
|
end
|
212
215
|
|
213
216
|
it 'should append multiple elements to list column' do
|
@@ -215,8 +218,9 @@ describe Cequel::Metal::DataSet do
|
|
215
218
|
row_keys.merge(categories: ['Big Data', 'Cassandra']))
|
216
219
|
cequel[:posts].where(row_keys).
|
217
220
|
list_append(:categories, ['Scalability', 'Partition Tolerance'])
|
218
|
-
cequel[:posts].where(row_keys).first[:categories].
|
221
|
+
expect(cequel[:posts].where(row_keys).first[:categories]).to eq(
|
219
222
|
['Big Data', 'Cassandra', 'Scalability', 'Partition Tolerance']
|
223
|
+
)
|
220
224
|
end
|
221
225
|
end
|
222
226
|
|
@@ -226,8 +230,9 @@ describe Cequel::Metal::DataSet do
|
|
226
230
|
row_keys.merge(categories: ['Big Data', 'Cassandra', 'Scalability']))
|
227
231
|
cequel[:posts].where(row_keys).
|
228
232
|
list_replace(:categories, 1, 'C*')
|
229
|
-
cequel[:posts].where(row_keys).first[:categories].
|
233
|
+
expect(cequel[:posts].where(row_keys).first[:categories]).to eq(
|
230
234
|
['Big Data', 'C*', 'Scalability']
|
235
|
+
)
|
231
236
|
end
|
232
237
|
end
|
233
238
|
|
@@ -237,8 +242,9 @@ describe Cequel::Metal::DataSet do
|
|
237
242
|
row_keys.merge(categories: ['Big Data', 'Cassandra', 'Scalability']))
|
238
243
|
cequel[:posts].where(row_keys).
|
239
244
|
list_remove(:categories, 'Cassandra')
|
240
|
-
cequel[:posts].where(row_keys).first[:categories].
|
245
|
+
expect(cequel[:posts].where(row_keys).first[:categories]).to eq(
|
241
246
|
['Big Data', 'Scalability']
|
247
|
+
)
|
242
248
|
end
|
243
249
|
|
244
250
|
it 'should remove from list by multiple values' do
|
@@ -246,8 +252,9 @@ describe Cequel::Metal::DataSet do
|
|
246
252
|
row_keys.merge(categories: ['Big Data', 'Cassandra', 'Scalability']))
|
247
253
|
cequel[:posts].where(row_keys).
|
248
254
|
list_remove(:categories, ['Big Data', 'Cassandra'])
|
249
|
-
cequel[:posts].where(row_keys).first[:categories].
|
255
|
+
expect(cequel[:posts].where(row_keys).first[:categories]).to eq(
|
250
256
|
['Scalability']
|
257
|
+
)
|
251
258
|
end
|
252
259
|
end
|
253
260
|
|
@@ -256,16 +263,16 @@ describe Cequel::Metal::DataSet do
|
|
256
263
|
cequel[:posts].insert(
|
257
264
|
row_keys.merge(tags: Set['big-data', 'nosql']))
|
258
265
|
cequel[:posts].where(row_keys).set_add(:tags, 'cassandra')
|
259
|
-
cequel[:posts].where(row_keys).first[:tags].
|
260
|
-
|
266
|
+
expect(cequel[:posts].where(row_keys).first[:tags]).
|
267
|
+
to eq(Set['big-data', 'nosql', 'cassandra'])
|
261
268
|
end
|
262
269
|
|
263
270
|
it 'should add multiple elements to set' do
|
264
271
|
cequel[:posts].insert(
|
265
272
|
row_keys.merge(tags: Set['big-data', 'nosql']))
|
266
273
|
cequel[:posts].where(row_keys).set_add(:tags, 'cassandra')
|
267
|
-
cequel[:posts].where(row_keys).first[:tags].
|
268
|
-
|
274
|
+
expect(cequel[:posts].where(row_keys).first[:tags]).
|
275
|
+
to eq(Set['big-data', 'nosql', 'cassandra'])
|
269
276
|
end
|
270
277
|
end
|
271
278
|
|
@@ -274,8 +281,8 @@ describe Cequel::Metal::DataSet do
|
|
274
281
|
cequel[:posts].insert(
|
275
282
|
row_keys.merge(tags: Set['big-data', 'nosql', 'cassandra']))
|
276
283
|
cequel[:posts].where(row_keys).set_remove(:tags, 'cassandra')
|
277
|
-
cequel[:posts].where(row_keys).first[:tags].
|
278
|
-
|
284
|
+
expect(cequel[:posts].where(row_keys).first[:tags]).
|
285
|
+
to eq(Set['big-data', 'nosql'])
|
279
286
|
end
|
280
287
|
|
281
288
|
it 'should remove multiple elements from set' do
|
@@ -283,8 +290,8 @@ describe Cequel::Metal::DataSet do
|
|
283
290
|
row_keys.merge(tags: Set['big-data', 'nosql', 'cassandra']))
|
284
291
|
cequel[:posts].where(row_keys).
|
285
292
|
set_remove(:tags, Set['nosql', 'cassandra'])
|
286
|
-
cequel[:posts].where(row_keys).first[:tags].
|
287
|
-
|
293
|
+
expect(cequel[:posts].where(row_keys).first[:tags]).
|
294
|
+
to eq(Set['big-data'])
|
288
295
|
end
|
289
296
|
end
|
290
297
|
|
@@ -296,8 +303,8 @@ describe Cequel::Metal::DataSet do
|
|
296
303
|
cequel[:posts].insert(row_keys.merge(
|
297
304
|
trackbacks: {time1 => 'foo', time2 => 'bar'}))
|
298
305
|
cequel[:posts].where(row_keys).map_update(:trackbacks, time3 => 'baz')
|
299
|
-
cequel[:posts].where(row_keys).first[:trackbacks].
|
300
|
-
|
306
|
+
expect(cequel[:posts].where(row_keys).first[:trackbacks]).
|
307
|
+
to eq({time1 => 'foo', time2 => 'bar', time3 => 'baz'})
|
301
308
|
end
|
302
309
|
|
303
310
|
it 'should update specified map key with multiple values' do
|
@@ -308,8 +315,8 @@ describe Cequel::Metal::DataSet do
|
|
308
315
|
trackbacks: {time1 => 'foo', time2 => 'bar'}))
|
309
316
|
cequel[:posts].where(row_keys).
|
310
317
|
map_update(:trackbacks, time1 => 'FOO', time3 => 'baz')
|
311
|
-
cequel[:posts].where(row_keys).first[:trackbacks].
|
312
|
-
|
318
|
+
expect(cequel[:posts].where(row_keys).first[:trackbacks]).
|
319
|
+
to eq({time1 => 'FOO', time2 => 'bar', time3 => 'baz'})
|
313
320
|
end
|
314
321
|
end
|
315
322
|
|
@@ -323,8 +330,8 @@ describe Cequel::Metal::DataSet do
|
|
323
330
|
|
324
331
|
row = cequel[:post_activity].where(row_keys).first
|
325
332
|
|
326
|
-
row[:visits].
|
327
|
-
row[:tweets].
|
333
|
+
expect(row[:visits]).to eq(1)
|
334
|
+
expect(row[:tweets]).to eq(2)
|
328
335
|
end
|
329
336
|
end
|
330
337
|
|
@@ -336,8 +343,8 @@ describe Cequel::Metal::DataSet do
|
|
336
343
|
decrement(visits: 1, tweets: 2)
|
337
344
|
|
338
345
|
row = cequel[:post_activity].where(row_keys).first
|
339
|
-
row[:visits].
|
340
|
-
row[:tweets].
|
346
|
+
expect(row[:visits]).to eq(-1)
|
347
|
+
expect(row[:tweets]).to eq(-2)
|
341
348
|
end
|
342
349
|
end
|
343
350
|
|
@@ -349,14 +356,14 @@ describe Cequel::Metal::DataSet do
|
|
349
356
|
|
350
357
|
it 'should send basic delete statement' do
|
351
358
|
cequel[:posts].where(row_keys).delete
|
352
|
-
cequel[:posts].where(row_keys).first.
|
359
|
+
expect(cequel[:posts].where(row_keys).first).to be_nil
|
353
360
|
end
|
354
361
|
|
355
362
|
it 'should send delete statement for specified columns' do
|
356
363
|
cequel[:posts].where(row_keys).delete(:body)
|
357
364
|
row = cequel[:posts].where(row_keys).first
|
358
|
-
row[:body].
|
359
|
-
row[:title].
|
365
|
+
expect(row[:body]).to be_nil
|
366
|
+
expect(row[:title]).to eq('Big Data')
|
360
367
|
end
|
361
368
|
|
362
369
|
it 'should send delete statement with writetime option' do
|
@@ -366,7 +373,7 @@ describe Cequel::Metal::DataSet do
|
|
366
373
|
:body, :timestamp => time
|
367
374
|
)
|
368
375
|
row = cequel[:posts].select(:body).where(row_keys).first
|
369
|
-
row[:body].
|
376
|
+
expect(row[:body]).to eq('It\'s big.')
|
370
377
|
# This means timestamp is working, since the earlier timestamp would cause
|
371
378
|
# Cassandra to ignore the deletion
|
372
379
|
end
|
@@ -383,16 +390,16 @@ describe Cequel::Metal::DataSet do
|
|
383
390
|
cequel[:posts].
|
384
391
|
insert(row_keys.merge(categories: ['Big Data', 'NoSQL', 'Cassandra']))
|
385
392
|
cequel[:posts].where(row_keys).list_remove_at(:categories, 1)
|
386
|
-
cequel[:posts].where(row_keys).first[:categories].
|
387
|
-
|
393
|
+
expect(cequel[:posts].where(row_keys).first[:categories]).
|
394
|
+
to eq(['Big Data', 'Cassandra'])
|
388
395
|
end
|
389
396
|
|
390
397
|
it 'should remove element at specified positions from list' do
|
391
398
|
cequel[:posts].
|
392
399
|
insert(row_keys.merge(categories: ['Big Data', 'NoSQL', 'Cassandra']))
|
393
400
|
cequel[:posts].where(row_keys).list_remove_at(:categories, 0, 2)
|
394
|
-
cequel[:posts].where(row_keys).first[:categories].
|
395
|
-
|
401
|
+
expect(cequel[:posts].where(row_keys).first[:categories]).
|
402
|
+
to eq(['NoSQL'])
|
396
403
|
end
|
397
404
|
end
|
398
405
|
|
@@ -404,8 +411,8 @@ describe Cequel::Metal::DataSet do
|
|
404
411
|
cequel[:posts].insert(row_keys.merge(
|
405
412
|
trackbacks: {time1 => 'foo', time2 => 'bar', time3 => 'baz'}))
|
406
413
|
cequel[:posts].where(row_keys).map_remove(:trackbacks, time2)
|
407
|
-
cequel[:posts].where(row_keys).first[:trackbacks].
|
408
|
-
|
414
|
+
expect(cequel[:posts].where(row_keys).first[:trackbacks]).
|
415
|
+
to eq({time1 => 'foo', time3 => 'baz'})
|
409
416
|
end
|
410
417
|
|
411
418
|
it 'should remove multiple elements from a map' do
|
@@ -415,14 +422,14 @@ describe Cequel::Metal::DataSet do
|
|
415
422
|
cequel[:posts].insert(row_keys.merge(
|
416
423
|
trackbacks: {time1 => 'foo', time2 => 'bar', time3 => 'baz'}))
|
417
424
|
cequel[:posts].where(row_keys).map_remove(:trackbacks, time1, time3)
|
418
|
-
cequel[:posts].where(row_keys).first[:trackbacks].
|
419
|
-
|
425
|
+
expect(cequel[:posts].where(row_keys).first[:trackbacks]).
|
426
|
+
to eq({time2 => 'bar'})
|
420
427
|
end
|
421
428
|
end
|
422
429
|
|
423
430
|
describe '#cql' do
|
424
431
|
it 'should generate select statement with all columns' do
|
425
|
-
cequel[:posts].cql.
|
432
|
+
expect(cequel[:posts].cql).to eq(['SELECT * FROM posts'])
|
426
433
|
end
|
427
434
|
end
|
428
435
|
|
@@ -436,18 +443,18 @@ describe Cequel::Metal::DataSet do
|
|
436
443
|
end
|
437
444
|
|
438
445
|
it 'should generate select statement with given columns' do
|
439
|
-
cequel[:posts].select(:title, :body).where(row_keys).first.
|
440
|
-
keys.
|
446
|
+
expect(cequel[:posts].select(:title, :body).where(row_keys).first.
|
447
|
+
keys).to eq(%w(title body))
|
441
448
|
end
|
442
449
|
|
443
450
|
it 'should accept array argument' do
|
444
|
-
cequel[:posts].select([:title, :body]).where(row_keys).first.
|
445
|
-
keys.
|
451
|
+
expect(cequel[:posts].select([:title, :body]).where(row_keys).first.
|
452
|
+
keys).to eq(%w(title body))
|
446
453
|
end
|
447
454
|
|
448
455
|
it 'should combine multiple selects' do
|
449
|
-
cequel[:posts].select(:title).select(:body).where(row_keys).first.
|
450
|
-
keys.
|
456
|
+
expect(cequel[:posts].select(:title).select(:body).where(row_keys).first.
|
457
|
+
keys).to eq(%w(title body))
|
451
458
|
end
|
452
459
|
end
|
453
460
|
|
@@ -461,8 +468,8 @@ describe Cequel::Metal::DataSet do
|
|
461
468
|
end
|
462
469
|
|
463
470
|
it 'should override select statement with given columns' do
|
464
|
-
cequel[:posts].select(:title, :body).select!(:published_at).
|
465
|
-
where(row_keys).first.keys.
|
471
|
+
expect(cequel[:posts].select(:title, :body).select!(:published_at).
|
472
|
+
where(row_keys).first.keys).to eq(%w(published_at))
|
466
473
|
end
|
467
474
|
end
|
468
475
|
|
@@ -476,15 +483,15 @@ describe Cequel::Metal::DataSet do
|
|
476
483
|
end
|
477
484
|
|
478
485
|
it 'should build WHERE statement from hash' do
|
479
|
-
cequel[:posts].where(blog_subdomain: row_keys[:blog_subdomain]).
|
480
|
-
first[:title].
|
481
|
-
cequel[:posts].where(blog_subdomain: 'foo').first.
|
486
|
+
expect(cequel[:posts].where(blog_subdomain: row_keys[:blog_subdomain]).
|
487
|
+
first[:title]).to eq('Big Data')
|
488
|
+
expect(cequel[:posts].where(blog_subdomain: 'foo').first).to be_nil
|
482
489
|
end
|
483
490
|
|
484
491
|
it 'should build WHERE statement from multi-element hash' do
|
485
|
-
cequel[:posts].where(row_keys).first[:title].
|
486
|
-
cequel[:posts].where(row_keys.merge(:permalink => 'foo')).
|
487
|
-
first.
|
492
|
+
expect(cequel[:posts].where(row_keys).first[:title]).to eq('Big Data')
|
493
|
+
expect(cequel[:posts].where(row_keys.merge(:permalink => 'foo')).
|
494
|
+
first).to be_nil
|
488
495
|
end
|
489
496
|
|
490
497
|
it 'should build WHERE statement with IN' do
|
@@ -496,32 +503,32 @@ describe Cequel::Metal::DataSet do
|
|
496
503
|
blog_subdomain: 'bogus-blog',
|
497
504
|
title: 'Bogus Post',
|
498
505
|
))
|
499
|
-
cequel[:posts].where(
|
506
|
+
expect(cequel[:posts].where(
|
500
507
|
:blog_subdomain => %w(cassandra big-data-weekly),
|
501
508
|
:permalink => 'big-data'
|
502
|
-
).map { |row| row[:title] }.
|
509
|
+
).map { |row| row[:title] }).to eq(['Big Data', 'Cassandra'])
|
503
510
|
end
|
504
511
|
|
505
512
|
it 'should use = if provided one-element array' do
|
506
|
-
cequel[:posts].
|
513
|
+
expect(cequel[:posts].
|
507
514
|
where(row_keys.merge(blog_subdomain: [row_keys[:blog_subdomain]])).
|
508
|
-
first[:title].
|
515
|
+
first[:title]).to eq('Big Data')
|
509
516
|
end
|
510
517
|
|
511
518
|
it 'should build WHERE statement from CQL string' do
|
512
|
-
cequel[:posts].where("blog_subdomain = '#{row_keys[:blog_subdomain]}'").
|
513
|
-
first[:title].
|
519
|
+
expect(cequel[:posts].where("blog_subdomain = '#{row_keys[:blog_subdomain]}'").
|
520
|
+
first[:title]).to eq('Big Data')
|
514
521
|
end
|
515
522
|
|
516
523
|
it 'should build WHERE statement from CQL string with bind variables' do
|
517
|
-
cequel[:posts].where("blog_subdomain = ?", row_keys[:blog_subdomain]).
|
518
|
-
first[:title].
|
524
|
+
expect(cequel[:posts].where("blog_subdomain = ?", row_keys[:blog_subdomain]).
|
525
|
+
first[:title]).to eq('Big Data')
|
519
526
|
end
|
520
527
|
|
521
528
|
it 'should aggregate multiple WHERE statements' do
|
522
|
-
cequel[:posts].where(:blog_subdomain => row_keys[:blog_subdomain]).
|
529
|
+
expect(cequel[:posts].where(:blog_subdomain => row_keys[:blog_subdomain]).
|
523
530
|
where('permalink = ?', row_keys[:permalink]).
|
524
|
-
first[:title].
|
531
|
+
first[:title]).to eq('Big Data')
|
525
532
|
end
|
526
533
|
|
527
534
|
end
|
@@ -536,9 +543,9 @@ describe Cequel::Metal::DataSet do
|
|
536
543
|
end
|
537
544
|
|
538
545
|
it 'should override chained conditions' do
|
539
|
-
cequel[:posts].where(:permalink => 'bogus').
|
546
|
+
expect(cequel[:posts].where(:permalink => 'bogus').
|
540
547
|
where!(:blog_subdomain => row_keys[:blog_subdomain]).
|
541
|
-
first[:title].
|
548
|
+
first[:title]).to eq('Big Data')
|
542
549
|
end
|
543
550
|
end
|
544
551
|
|
@@ -552,8 +559,8 @@ describe Cequel::Metal::DataSet do
|
|
552
559
|
end
|
553
560
|
|
554
561
|
it 'should add LIMIT' do
|
555
|
-
cequel[:posts].where(row_keys.slice(:blog_subdomain)).limit(2).
|
556
|
-
map { |row| row[:title] }.
|
562
|
+
expect(cequel[:posts].where(row_keys.slice(:blog_subdomain)).limit(2).
|
563
|
+
map { |row| row[:title] }).to eq(['Big Data', 'Marshmallows'])
|
557
564
|
end
|
558
565
|
end
|
559
566
|
|
@@ -567,9 +574,9 @@ describe Cequel::Metal::DataSet do
|
|
567
574
|
end
|
568
575
|
|
569
576
|
it 'should add order' do
|
570
|
-
cequel[:posts].where(row_keys.slice(:blog_subdomain)).
|
571
|
-
order(permalink: 'desc').map { |row| row[:title] }.
|
572
|
-
|
577
|
+
expect(cequel[:posts].where(row_keys.slice(:blog_subdomain)).
|
578
|
+
order(permalink: 'desc').map { |row| row[:title] }).
|
579
|
+
to eq(['ZZ Top', 'Marshmallows', 'Big Data'])
|
573
580
|
end
|
574
581
|
end
|
575
582
|
|
@@ -655,13 +662,13 @@ describe Cequel::Metal::DataSet do
|
|
655
662
|
end
|
656
663
|
|
657
664
|
it 'should enumerate over results' do
|
658
|
-
cequel[:posts].to_a.map { |row| row.select { |k, v| v }}.
|
659
|
-
|
665
|
+
expect(cequel[:posts].to_a.map { |row| row.select { |k, v| v }}).
|
666
|
+
to eq([row.stringify_keys])
|
660
667
|
end
|
661
668
|
|
662
669
|
it 'should provide results with indifferent access' do
|
663
|
-
cequel[:posts].to_a.first[:blog_permalink].
|
664
|
-
|
670
|
+
expect(cequel[:posts].to_a.first[:blog_permalink]).
|
671
|
+
to eq(row_keys[:blog_permalink])
|
665
672
|
end
|
666
673
|
|
667
674
|
it 'should not run query if no block given to #each' do
|
@@ -669,9 +676,9 @@ describe Cequel::Metal::DataSet do
|
|
669
676
|
end
|
670
677
|
|
671
678
|
it 'should return Enumerator if no block given to #each' do
|
672
|
-
cequel[:posts].each.each_with_index.
|
673
|
-
map { |row, i| [row[:blog_permalink], i] }.
|
674
|
-
|
679
|
+
expect(cequel[:posts].each.each_with_index.
|
680
|
+
map { |row, i| [row[:blog_permalink], i] }).
|
681
|
+
to eq([[row[:blog_permalink], 0]])
|
675
682
|
end
|
676
683
|
end
|
677
684
|
|
@@ -685,7 +692,7 @@ describe Cequel::Metal::DataSet do
|
|
685
692
|
end
|
686
693
|
|
687
694
|
it 'should run a query with LIMIT 1 and return first row' do
|
688
|
-
cequel[:posts].first.select { |k, v| v }.
|
695
|
+
expect(cequel[:posts].first.select { |k, v| v }).to eq(row.stringify_keys)
|
689
696
|
end
|
690
697
|
end
|
691
698
|
|
@@ -698,16 +705,16 @@ describe Cequel::Metal::DataSet do
|
|
698
705
|
end
|
699
706
|
|
700
707
|
it 'should run a count query and return count' do
|
701
|
-
cequel[:posts].count.
|
708
|
+
expect(cequel[:posts].count).to eq(4)
|
702
709
|
end
|
703
710
|
|
704
711
|
it 'should use where clause if specified' do
|
705
|
-
cequel[:posts].where(row_keys.merge(permalink: 'post-1')).
|
706
|
-
count.
|
712
|
+
expect(cequel[:posts].where(row_keys.merge(permalink: 'post-1')).
|
713
|
+
count).to eq(1)
|
707
714
|
end
|
708
715
|
|
709
716
|
it 'should use limit if specified' do
|
710
|
-
cequel[:posts].limit(2).count.
|
717
|
+
expect(cequel[:posts].limit(2).count).to eq(2)
|
711
718
|
end
|
712
719
|
end
|
713
720
|
|