cequel 0.5.6 → 1.0.0.pre.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/cequel.rb +5 -8
- data/lib/cequel/errors.rb +1 -0
- data/lib/cequel/metal.rb +17 -0
- data/lib/cequel/metal/batch.rb +62 -0
- data/lib/cequel/metal/cql_row_specification.rb +26 -0
- data/lib/cequel/metal/data_set.rb +461 -0
- data/lib/cequel/metal/deleter.rb +47 -0
- data/lib/cequel/metal/incrementer.rb +35 -0
- data/lib/cequel/metal/inserter.rb +53 -0
- data/lib/cequel/metal/keyspace.rb +213 -0
- data/lib/cequel/metal/row.rb +48 -0
- data/lib/cequel/metal/row_specification.rb +37 -0
- data/lib/cequel/metal/statement.rb +30 -0
- data/lib/cequel/metal/updater.rb +65 -0
- data/lib/cequel/metal/writer.rb +73 -0
- data/lib/cequel/model.rb +12 -84
- data/lib/cequel/model/association_collection.rb +23 -0
- data/lib/cequel/model/associations.rb +84 -80
- data/lib/cequel/model/base.rb +74 -0
- data/lib/cequel/model/belongs_to_association.rb +31 -0
- data/lib/cequel/model/callbacks.rb +14 -10
- data/lib/cequel/model/collection.rb +255 -0
- data/lib/cequel/model/errors.rb +6 -6
- data/lib/cequel/model/has_many_association.rb +26 -0
- data/lib/cequel/model/mass_assignment.rb +31 -0
- data/lib/cequel/model/persistence.rb +119 -115
- data/lib/cequel/model/properties.rb +89 -87
- data/lib/cequel/model/railtie.rb +21 -14
- data/lib/cequel/model/record_set.rb +285 -0
- data/lib/cequel/model/schema.rb +33 -0
- data/lib/cequel/model/scoped.rb +5 -48
- data/lib/cequel/model/validations.rb +18 -18
- data/lib/cequel/schema.rb +15 -0
- data/lib/cequel/schema/column.rb +135 -0
- data/lib/cequel/schema/create_table_dsl.rb +56 -0
- data/lib/cequel/schema/keyspace.rb +50 -0
- data/lib/cequel/schema/table.rb +120 -0
- data/lib/cequel/schema/table_property.rb +67 -0
- data/lib/cequel/schema/table_reader.rb +139 -0
- data/lib/cequel/schema/table_synchronizer.rb +114 -0
- data/lib/cequel/schema/table_updater.rb +83 -0
- data/lib/cequel/schema/table_writer.rb +80 -0
- data/lib/cequel/schema/update_table_dsl.rb +60 -0
- data/lib/cequel/type.rb +232 -0
- data/lib/cequel/version.rb +1 -1
- data/spec/environment.rb +5 -1
- data/spec/examples/metal/data_set_spec.rb +608 -0
- data/spec/examples/model/associations_spec.rb +84 -74
- data/spec/examples/model/callbacks_spec.rb +66 -59
- data/spec/examples/model/list_spec.rb +393 -0
- data/spec/examples/model/map_spec.rb +229 -0
- data/spec/examples/model/mass_assignment_spec.rb +55 -0
- data/spec/examples/model/naming_spec.rb +11 -4
- data/spec/examples/model/persistence_spec.rb +140 -150
- data/spec/examples/model/properties_spec.rb +122 -75
- data/spec/examples/model/record_set_spec.rb +285 -0
- data/spec/examples/model/schema_spec.rb +44 -0
- data/spec/examples/model/serialization_spec.rb +20 -14
- data/spec/examples/model/set_spec.rb +133 -0
- data/spec/examples/model/spec_helper.rb +0 -10
- data/spec/examples/model/validations_spec.rb +51 -38
- data/spec/examples/schema/table_reader_spec.rb +328 -0
- data/spec/examples/schema/table_synchronizer_spec.rb +172 -0
- data/spec/examples/schema/table_updater_spec.rb +157 -0
- data/spec/examples/schema/table_writer_spec.rb +225 -0
- data/spec/examples/spec_helper.rb +29 -0
- data/spec/examples/type_spec.rb +204 -0
- data/spec/support/helpers.rb +67 -8
- metadata +121 -152
- data/lib/cequel/batch.rb +0 -58
- data/lib/cequel/cql_row_specification.rb +0 -22
- data/lib/cequel/data_set.rb +0 -371
- data/lib/cequel/keyspace.rb +0 -205
- data/lib/cequel/model/class_internals.rb +0 -49
- data/lib/cequel/model/column.rb +0 -20
- data/lib/cequel/model/counter.rb +0 -35
- data/lib/cequel/model/dictionary.rb +0 -126
- data/lib/cequel/model/dirty.rb +0 -53
- data/lib/cequel/model/dynamic.rb +0 -31
- data/lib/cequel/model/inheritable.rb +0 -48
- data/lib/cequel/model/instance_internals.rb +0 -23
- data/lib/cequel/model/local_association.rb +0 -42
- data/lib/cequel/model/magic.rb +0 -79
- data/lib/cequel/model/mass_assignment_security.rb +0 -21
- data/lib/cequel/model/naming.rb +0 -17
- data/lib/cequel/model/observer.rb +0 -42
- data/lib/cequel/model/readable_dictionary.rb +0 -182
- data/lib/cequel/model/remote_association.rb +0 -40
- data/lib/cequel/model/scope.rb +0 -362
- data/lib/cequel/model/subclass_internals.rb +0 -45
- data/lib/cequel/model/timestamps.rb +0 -52
- data/lib/cequel/model/translation.rb +0 -17
- data/lib/cequel/row_specification.rb +0 -63
- data/lib/cequel/statement.rb +0 -23
- data/spec/examples/data_set_spec.rb +0 -444
- data/spec/examples/keyspace_spec.rb +0 -84
- data/spec/examples/model/counter_spec.rb +0 -94
- data/spec/examples/model/dictionary_spec.rb +0 -301
- data/spec/examples/model/dirty_spec.rb +0 -39
- data/spec/examples/model/dynamic_spec.rb +0 -41
- data/spec/examples/model/inheritable_spec.rb +0 -45
- data/spec/examples/model/magic_spec.rb +0 -199
- data/spec/examples/model/mass_assignment_security_spec.rb +0 -13
- data/spec/examples/model/observer_spec.rb +0 -86
- data/spec/examples/model/scope_spec.rb +0 -677
- data/spec/examples/model/timestamps_spec.rb +0 -52
- data/spec/examples/model/translation_spec.rb +0 -23
@@ -1,84 +0,0 @@
|
|
1
|
-
require File.expand_path('../spec_helper', __FILE__)
|
2
|
-
require 'stringio'
|
3
|
-
require 'logger'
|
4
|
-
|
5
|
-
describe Cequel::Keyspace do
|
6
|
-
describe '::batch' do
|
7
|
-
it 'should send enclosed write statements in bulk' do
|
8
|
-
connection.should_receive(:execute).with(<<CQL, [:id, :title], [1, 'Hey'], :body, 'Body')
|
9
|
-
BEGIN BATCH
|
10
|
-
INSERT INTO posts (?) VALUES (?)
|
11
|
-
UPDATE posts SET ? = ?
|
12
|
-
DELETE FROM posts
|
13
|
-
APPLY BATCH
|
14
|
-
CQL
|
15
|
-
cequel.batch do
|
16
|
-
cequel[:posts].insert(:id => 1, :title => 'Hey')
|
17
|
-
cequel[:posts].update(:body => 'Body')
|
18
|
-
cequel[:posts].delete
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'should auto-apply if option given' do
|
23
|
-
connection.should_receive(:execute).with(<<CQL, [:id, :title], [1, 'Hey'], :body, 'Body')
|
24
|
-
BEGIN BATCH
|
25
|
-
INSERT INTO posts (?) VALUES (?)
|
26
|
-
UPDATE posts SET ? = ?
|
27
|
-
APPLY BATCH
|
28
|
-
CQL
|
29
|
-
connection.should_receive(:execute).with(<<CQL)
|
30
|
-
BEGIN BATCH
|
31
|
-
DELETE FROM posts
|
32
|
-
APPLY BATCH
|
33
|
-
CQL
|
34
|
-
|
35
|
-
cequel.batch(:auto_apply => 2) do
|
36
|
-
cequel[:posts].insert(:id => 1, :title => 'Hey')
|
37
|
-
cequel[:posts].update(:body => 'Body')
|
38
|
-
cequel[:posts].delete
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'should do nothing if no statements executed in batch' do
|
43
|
-
expect { cequel.batch {} }.to_not raise_error
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe '::connection_pool' do
|
48
|
-
it 'should use connection pool if pool specified' do
|
49
|
-
#NOTE: called one time per pool entry
|
50
|
-
Cequel::Keyspace.any_instance.should_receive(:build_connection).once.and_return(connection)
|
51
|
-
Cequel::Keyspace.any_instance.should_receive(:connection).never
|
52
|
-
keyspace = Cequel::Keyspace.new(:pool => 1)
|
53
|
-
|
54
|
-
keyspace.with_connection { |conn| }
|
55
|
-
keyspace.with_connection { |conn| }
|
56
|
-
keyspace.with_connection { |conn| }
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'should not use connection pool if no pool specified' do
|
60
|
-
Cequel::Keyspace.any_instance.should_receive(:connection).exactly(3).times.and_return(connection)
|
61
|
-
keyspace = Cequel::Keyspace.new({})
|
62
|
-
|
63
|
-
keyspace.with_connection { |conn| }
|
64
|
-
keyspace.with_connection { |conn| }
|
65
|
-
keyspace.with_connection { |conn| }
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
describe '::logger=' do
|
70
|
-
let(:io) { StringIO.new }
|
71
|
-
let(:logger) { Logger.new(io) }
|
72
|
-
|
73
|
-
before do
|
74
|
-
logger.level = Logger::DEBUG
|
75
|
-
cequel.logger = logger
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'should log queries with bind variables resolved' do
|
79
|
-
connection.stub(:execute).with("SELECT ? FROM posts", [:id, :title]).and_return result_stub
|
80
|
-
cequel[:posts].select(:id, :title).to_a
|
81
|
-
io.string.should =~ /CQL \(\d+ms\) SELECT 'id','title' FROM posts/
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
@@ -1,94 +0,0 @@
|
|
1
|
-
require File.expand_path('../spec_helper', __FILE__)
|
2
|
-
|
3
|
-
describe Cequel::Model::Counter do
|
4
|
-
let(:counter) { CommentCounts[1] }
|
5
|
-
let(:dictionary) { counter }
|
6
|
-
let(:uuid1) { CassandraCQL::UUID.new }
|
7
|
-
let(:uuid2) { CassandraCQL::UUID.new }
|
8
|
-
|
9
|
-
it_behaves_like 'readable dictionary'
|
10
|
-
|
11
|
-
describe '#increment' do
|
12
|
-
it 'should increment single column by default 1' do
|
13
|
-
connection.should_receive(:execute).with(
|
14
|
-
'UPDATE comment_counts SET ? = ? + ? WHERE ? = ?',
|
15
|
-
uuid1, uuid1, 1, :blog_id, 1
|
16
|
-
)
|
17
|
-
dictionary.increment(uuid1)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'should increment single column by given value' do
|
21
|
-
connection.should_receive(:execute).with(
|
22
|
-
'UPDATE comment_counts SET ? = ? + ? WHERE ? = ?',
|
23
|
-
uuid1, uuid1, 4, :blog_id, 1
|
24
|
-
)
|
25
|
-
dictionary.increment(uuid1, 4)
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'should increment multiple columns by default value' do
|
29
|
-
connection.should_receive(:execute).with(
|
30
|
-
'UPDATE comment_counts SET ? = ? + ?, ? = ? + ? WHERE ? = ?',
|
31
|
-
uuid1, uuid1, 1, uuid2, uuid2, 1, :blog_id, 1
|
32
|
-
)
|
33
|
-
dictionary.increment([uuid1, uuid2])
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'should increment multiple columns by given value' do
|
37
|
-
connection.should_receive(:execute).with(
|
38
|
-
'UPDATE comment_counts SET ? = ? + ?, ? = ? + ? WHERE ? = ?',
|
39
|
-
uuid1, uuid1, 4, uuid2, uuid2, 4, :blog_id, 1
|
40
|
-
)
|
41
|
-
dictionary.increment([uuid1, uuid2], 4)
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'should increment multiple columns by given deltas' do
|
45
|
-
connection.should_receive(:execute).with(
|
46
|
-
'UPDATE comment_counts SET ? = ? + ?, ? = ? + ? WHERE ? = ?',
|
47
|
-
uuid1, uuid1, 4, uuid2, uuid2, 2, :blog_id, 1
|
48
|
-
)
|
49
|
-
dictionary.increment(uuid1 => 4, uuid2 => 2)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe '#decrement' do
|
54
|
-
it 'should increment single column by default 1' do
|
55
|
-
connection.should_receive(:execute).with(
|
56
|
-
'UPDATE comment_counts SET ? = ? - ? WHERE ? = ?',
|
57
|
-
uuid1, uuid1, 1, :blog_id, 1
|
58
|
-
)
|
59
|
-
dictionary.decrement(uuid1)
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'should increment single column by given value' do
|
63
|
-
connection.should_receive(:execute).with(
|
64
|
-
'UPDATE comment_counts SET ? = ? - ? WHERE ? = ?',
|
65
|
-
uuid1, uuid1, 4, :blog_id, 1
|
66
|
-
)
|
67
|
-
dictionary.decrement(uuid1, 4)
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'should increment multiple columns by default value' do
|
71
|
-
connection.should_receive(:execute).with(
|
72
|
-
'UPDATE comment_counts SET ? = ? - ?, ? = ? - ? WHERE ? = ?',
|
73
|
-
uuid1, uuid1, 1, uuid2, uuid2, 1, :blog_id, 1
|
74
|
-
)
|
75
|
-
dictionary.decrement([uuid1, uuid2])
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'should increment multiple columns by given value' do
|
79
|
-
connection.should_receive(:execute).with(
|
80
|
-
'UPDATE comment_counts SET ? = ? - ?, ? = ? - ? WHERE ? = ?',
|
81
|
-
uuid1, uuid1, 4, uuid2, uuid2, 4, :blog_id, 1
|
82
|
-
)
|
83
|
-
dictionary.decrement([uuid1, uuid2], 4)
|
84
|
-
end
|
85
|
-
|
86
|
-
it 'should increment multiple columns by given deltas' do
|
87
|
-
connection.should_receive(:execute).with(
|
88
|
-
'UPDATE comment_counts SET ? = ? - ?, ? = ? - ? WHERE ? = ?',
|
89
|
-
uuid1, uuid1, 4, uuid2, uuid2, 2, :blog_id, 1
|
90
|
-
)
|
91
|
-
dictionary.decrement(uuid1 => 4, uuid2 => 2)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
@@ -1,301 +0,0 @@
|
|
1
|
-
require File.expand_path('../spec_helper', __FILE__)
|
2
|
-
|
3
|
-
describe Cequel::Model::Dictionary do
|
4
|
-
let(:uuid1) { uuid }
|
5
|
-
let(:uuid2) { uuid }
|
6
|
-
let(:uuid3) { uuid }
|
7
|
-
let(:dictionary) { BlogPosts[1] }
|
8
|
-
|
9
|
-
it_behaves_like 'readable dictionary'
|
10
|
-
|
11
|
-
describe '#save' do
|
12
|
-
before do
|
13
|
-
connection.stub(:execute).
|
14
|
-
with('SELECT FIRST 2 * FROM blog_posts WHERE ? = ? LIMIT 1', :blog_id, 1).
|
15
|
-
and_return result_stub('blog_id' => 1, uuid1 => 1, uuid2 => 2)
|
16
|
-
connection.stub(:execute).
|
17
|
-
with('SELECT FIRST 2 ?..? FROM blog_posts WHERE ? = ? LIMIT 1', uuid2, '', :blog_id, 1).
|
18
|
-
and_return result_stub('blog_id' => 1)
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'should write to row' do
|
22
|
-
dictionary[uuid1] = 1
|
23
|
-
dictionary[uuid2] = 2
|
24
|
-
connection.should_receive(:execute).
|
25
|
-
with('UPDATE blog_posts SET ? = ?, ? = ? WHERE ? = ?', uuid1, 1, uuid2, 2, :blog_id, 1)
|
26
|
-
dictionary.save
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should update changed columns' do
|
30
|
-
dictionary.load
|
31
|
-
dictionary[uuid1] = 2
|
32
|
-
connection.should_receive(:execute).
|
33
|
-
with('UPDATE blog_posts SET ? = ? WHERE ? = ?', uuid1, 2, :blog_id, 1)
|
34
|
-
dictionary.save
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'should write new columns' do
|
38
|
-
dictionary.load
|
39
|
-
dictionary[uuid3] = 3
|
40
|
-
connection.should_receive(:execute).
|
41
|
-
with('UPDATE blog_posts SET ? = ? WHERE ? = ?', uuid3, 3, :blog_id, 1)
|
42
|
-
dictionary.save
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'should delete removed columns' do
|
46
|
-
dictionary.load
|
47
|
-
dictionary[uuid1] = nil
|
48
|
-
connection.should_receive(:execute).
|
49
|
-
with('DELETE ? FROM blog_posts WHERE ? = ?', [uuid1], :blog_id, 1)
|
50
|
-
dictionary.save
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'should not update a row if it should be deleted' do
|
54
|
-
dictionary.load
|
55
|
-
dictionary[uuid1] = 1
|
56
|
-
dictionary[uuid1] = nil
|
57
|
-
connection.should_receive(:execute).once.
|
58
|
-
with('DELETE ? FROM blog_posts WHERE ? = ?', [uuid1], :blog_id, 1)
|
59
|
-
dictionary.save
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'should not delete a row if it was subsequently updated' do
|
63
|
-
dictionary.load
|
64
|
-
dictionary[uuid1] = nil
|
65
|
-
dictionary[uuid1] = 1
|
66
|
-
connection.should_receive(:execute).once.
|
67
|
-
with('UPDATE blog_posts SET ? = ? WHERE ? = ?', uuid1, 1, :blog_id, 1)
|
68
|
-
dictionary.save
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'should not save columns that have been saved previously' do
|
72
|
-
dictionary.load
|
73
|
-
dictionary[uuid3] = 3
|
74
|
-
connection.should_receive(:execute).once.
|
75
|
-
with('UPDATE blog_posts SET ? = ? WHERE ? = ?', uuid3, 3, :blog_id, 1)
|
76
|
-
2.times { dictionary.save }
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'should not delete columns that have been deleted previously' do
|
80
|
-
dictionary.load
|
81
|
-
dictionary[uuid1] = nil
|
82
|
-
connection.should_receive(:execute).once.
|
83
|
-
with('DELETE ? FROM blog_posts WHERE ? = ?', [uuid1], :blog_id, 1)
|
84
|
-
2.times { dictionary.save }
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
|
-
describe '#destroy' do
|
90
|
-
before do
|
91
|
-
connection.stub(:execute).
|
92
|
-
with('SELECT FIRST 2 * FROM blog_posts WHERE ? = ? LIMIT 1', :blog_id, 1).
|
93
|
-
and_return result_stub('blog_id' => 1, uuid1 => 1, uuid2 => 2)
|
94
|
-
connection.stub(:execute).
|
95
|
-
with('SELECT FIRST 2 ?..? FROM blog_posts WHERE ? = ? LIMIT 1', uuid2, '', :blog_id, 1).
|
96
|
-
and_return result_stub({'blog_id' => 1})
|
97
|
-
|
98
|
-
dictionary.load
|
99
|
-
connection.should_receive(:execute).
|
100
|
-
with('DELETE FROM blog_posts WHERE ? = ?', :blog_id, 1)
|
101
|
-
end
|
102
|
-
|
103
|
-
it 'should delete row from cassandra' do
|
104
|
-
dictionary.destroy
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'should remove all properties from memory' do
|
108
|
-
dictionary.destroy
|
109
|
-
connection.stub(:execute).
|
110
|
-
with('SELECT ? FROM blog_posts WHERE ? = ? LIMIT 1', [uuid1], :blog_id, 1).
|
111
|
-
and_return result_stub({})
|
112
|
-
dictionary[uuid1].should be_nil
|
113
|
-
end
|
114
|
-
|
115
|
-
it 'should not save previously updated properties when saved' do
|
116
|
-
dictionary[uuid1] = 5
|
117
|
-
dictionary.destroy
|
118
|
-
connection.should_not_receive(:execute)
|
119
|
-
dictionary.save
|
120
|
-
end
|
121
|
-
|
122
|
-
it 'should not delete previously deleted properties when saved' do
|
123
|
-
dictionary[uuid1] = nil
|
124
|
-
dictionary.destroy
|
125
|
-
connection.should_not_receive(:execute)
|
126
|
-
dictionary.save
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
context 'with data modified but not loaded in memory' do
|
131
|
-
let(:uuid4) { uuid }
|
132
|
-
|
133
|
-
before do
|
134
|
-
dictionary[uuid1] = -1
|
135
|
-
dictionary[uuid3] = nil
|
136
|
-
dictionary[uuid4] = 4
|
137
|
-
end
|
138
|
-
|
139
|
-
describe '#each_pair' do
|
140
|
-
it 'should override persisted data with unsaved changes' do
|
141
|
-
connection.stub(:execute).
|
142
|
-
with('SELECT FIRST 2 * FROM blog_posts WHERE ? = ? LIMIT 1', :blog_id, 1).
|
143
|
-
and_return result_stub('blog_id' => 1, uuid1 => 1, uuid2 => 2)
|
144
|
-
connection.stub(:execute).
|
145
|
-
with('SELECT FIRST 2 ?..? FROM blog_posts WHERE ? = ? LIMIT 1', uuid2, '', :blog_id, 1).
|
146
|
-
and_return result_stub('blog_id' => 1, uuid2 => 2, uuid3 => 3)
|
147
|
-
connection.stub(:execute).
|
148
|
-
with('SELECT FIRST 2 ?..? FROM blog_posts WHERE ? = ? LIMIT 1', uuid3, '', :blog_id, 1).
|
149
|
-
and_return result_stub({'blog_id' => 1})
|
150
|
-
hash = {}
|
151
|
-
dictionary.each_pair do |key, value|
|
152
|
-
hash[key] = value
|
153
|
-
end
|
154
|
-
hash.should == {uuid1 => -1, uuid2 => 2, uuid4 => 4}
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
describe '#[]' do
|
159
|
-
it 'should return unsaved changed value' do
|
160
|
-
dictionary[uuid1].should == -1
|
161
|
-
end
|
162
|
-
|
163
|
-
it 'should return nil if value removed' do
|
164
|
-
dictionary[uuid3].should be_nil
|
165
|
-
end
|
166
|
-
|
167
|
-
it 'should return unsaved new value' do
|
168
|
-
dictionary[uuid4].should == 4
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
describe '#slice' do
|
173
|
-
it 'should override loaded slice with unsaved data in memory' do
|
174
|
-
connection.stub(:execute).
|
175
|
-
with('SELECT ? FROM blog_posts WHERE ? = ? LIMIT 1', [uuid1,uuid2,uuid3,uuid4], :blog_id, 1).
|
176
|
-
and_return result_stub(uuid1 => 1, uuid2 => 2, uuid3 => 3)
|
177
|
-
dictionary.slice(uuid1, uuid2, uuid3, uuid4).should ==
|
178
|
-
{uuid1 => -1, uuid2 => 2, uuid4 => 4}
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
describe '#keys' do
|
183
|
-
it 'should override keys that have been added or removed' do
|
184
|
-
connection.should_receive(:execute).
|
185
|
-
with('SELECT FIRST 2 * FROM blog_posts WHERE ? = ? LIMIT 1', :blog_id, 1).
|
186
|
-
and_return result_stub('blog_id' => 1, uuid1 => 1, uuid2 => 2)
|
187
|
-
connection.should_receive(:execute).
|
188
|
-
with('SELECT FIRST 2 ?..? FROM blog_posts WHERE ? = ? LIMIT 1', uuid2, '', :blog_id, 1).
|
189
|
-
and_return result_stub('blog_id' => 1, uuid2 => 2, uuid3 => 3)
|
190
|
-
connection.should_receive(:execute).
|
191
|
-
with('SELECT FIRST 2 ?..? FROM blog_posts WHERE ? = ? LIMIT 1', uuid3, '', :blog_id, 1).
|
192
|
-
and_return result_stub({'blog_id' => 1})
|
193
|
-
dictionary.keys.should == [uuid1, uuid2, uuid4]
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
describe '#values' do
|
198
|
-
it 'should override values that have been added or removed' do
|
199
|
-
connection.should_receive(:execute).
|
200
|
-
with('SELECT FIRST 2 * FROM blog_posts WHERE ? = ? LIMIT 1', :blog_id, 1).
|
201
|
-
and_return result_stub('blog_id' => 1, uuid1 => 1, uuid2 => 2)
|
202
|
-
connection.should_receive(:execute).
|
203
|
-
with('SELECT FIRST 2 ?..? FROM blog_posts WHERE ? = ? LIMIT 1', uuid2, '', :blog_id, 1).
|
204
|
-
and_return result_stub('blog_id' => 1, uuid2 => 2, uuid3 => 3)
|
205
|
-
connection.should_receive(:execute).
|
206
|
-
with('SELECT FIRST 2 ?..? FROM blog_posts WHERE ? = ? LIMIT 1', uuid3, '', :blog_id, 1).
|
207
|
-
and_return result_stub({'blog_id' => 1})
|
208
|
-
dictionary.values.should == [-1, 2, 4]
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
context 'with serializer/deserializer defined' do
|
214
|
-
let(:dictionary) { PostComments[1] }
|
215
|
-
let(:comment) { {'user' => 'Mat Brown', 'comment' => 'I like big data.'} }
|
216
|
-
|
217
|
-
describe '#save' do
|
218
|
-
it 'should serialize data' do
|
219
|
-
dictionary[4] = comment
|
220
|
-
connection.should_receive(:execute).
|
221
|
-
with(
|
222
|
-
'UPDATE post_comments SET ? = ? WHERE ? = ?',
|
223
|
-
4, comment.to_json, :post_id, 1
|
224
|
-
)
|
225
|
-
dictionary.save
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
describe '#[]' do
|
230
|
-
it 'should return deserialized data' do
|
231
|
-
connection.stub(:execute).with(
|
232
|
-
'SELECT ? FROM post_comments WHERE ? = ? LIMIT 1',
|
233
|
-
[4], :post_id, 1
|
234
|
-
).and_return result_stub(4 => comment.to_json)
|
235
|
-
dictionary[4].should == comment
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
describe '#slice' do
|
240
|
-
it 'should return deserialized values' do
|
241
|
-
connection.stub(:execute).with(
|
242
|
-
'SELECT ? FROM post_comments WHERE ? = ? LIMIT 1',
|
243
|
-
[4, 5], :post_id, 1
|
244
|
-
).and_return result_stub(4 => comment.to_json)
|
245
|
-
dictionary.slice(4, 5).should == {4 => comment}
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
describe '#load' do
|
250
|
-
it 'should retain deserialized values in memory' do
|
251
|
-
connection.stub(:execute).with(
|
252
|
-
'SELECT FIRST 1000 * FROM post_comments WHERE ? = ? LIMIT 1',
|
253
|
-
:post_id, 1
|
254
|
-
).and_return result_stub(4 => comment.to_json)
|
255
|
-
dictionary.load
|
256
|
-
connection.should_not_receive(:execute)
|
257
|
-
dictionary[4].should == comment
|
258
|
-
end
|
259
|
-
|
260
|
-
it 'should be a no-op if already loaded' do
|
261
|
-
connection.stub(:execute).with(
|
262
|
-
'SELECT FIRST 1000 * FROM post_comments WHERE ? = ? LIMIT 1',
|
263
|
-
:post_id, 1
|
264
|
-
).and_return result_stub(4 => comment.to_json)
|
265
|
-
dictionary.load
|
266
|
-
connection.should_not_receive(:execute)
|
267
|
-
dictionary.load
|
268
|
-
dictionary[4].should == comment
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
describe '#each_pair' do
|
273
|
-
it 'should yield deserialized values' do
|
274
|
-
connection.stub(:execute).
|
275
|
-
with(
|
276
|
-
'SELECT FIRST 1000 * FROM post_comments WHERE ? = ? LIMIT 1',
|
277
|
-
:post_id, 1
|
278
|
-
).and_return result_stub('post_id' => 1, 4 => comment.to_json)
|
279
|
-
dictionary.each_pair.map { |column, comment| comment }.first.
|
280
|
-
should == comment
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
describe '#values' do
|
285
|
-
it 'should return deserialized values' do
|
286
|
-
connection.stub(:execute).
|
287
|
-
with(
|
288
|
-
'SELECT FIRST 1000 * FROM post_comments WHERE ? = ? LIMIT 1',
|
289
|
-
:post_id, 1
|
290
|
-
).and_return result_stub('post_id' => 1, 4 => comment.to_json)
|
291
|
-
dictionary.values.should == [comment]
|
292
|
-
end
|
293
|
-
end
|
294
|
-
end
|
295
|
-
|
296
|
-
private
|
297
|
-
|
298
|
-
def uuid
|
299
|
-
SimpleUUID::UUID.new.to_guid
|
300
|
-
end
|
301
|
-
end
|