cassandra-cql 1.0.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.
- data/.gitignore +9 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +203 -0
- data/README.rdoc +78 -0
- data/Rakefile +150 -0
- data/cassandra-cql.gemspec +29 -0
- data/lib/cassandra-cql.rb +39 -0
- data/lib/cassandra-cql/database.rb +107 -0
- data/lib/cassandra-cql/result.rb +133 -0
- data/lib/cassandra-cql/row.rb +59 -0
- data/lib/cassandra-cql/schema.rb +108 -0
- data/lib/cassandra-cql/statement.rb +111 -0
- data/lib/cassandra-cql/types/abstract_type.rb +47 -0
- data/lib/cassandra-cql/types/ascii_type.rb +25 -0
- data/lib/cassandra-cql/types/boolean_type.rb +25 -0
- data/lib/cassandra-cql/types/bytes_type.rb +21 -0
- data/lib/cassandra-cql/types/decimal_type.rb +25 -0
- data/lib/cassandra-cql/types/double_type.rb +25 -0
- data/lib/cassandra-cql/types/float_type.rb +25 -0
- data/lib/cassandra-cql/types/integer_type.rb +27 -0
- data/lib/cassandra-cql/types/long_type.rb +27 -0
- data/lib/cassandra-cql/types/utf8_type.rb +25 -0
- data/lib/cassandra-cql/types/uuid_type.rb +27 -0
- data/lib/cassandra-cql/utility.rb +37 -0
- data/lib/cassandra-cql/uuid.rb +21 -0
- data/lib/cassandra-cql/version.rb +19 -0
- data/spec/column_family_spec.rb +105 -0
- data/spec/comparator_spec.rb +225 -0
- data/spec/conf/0.8/cassandra.in.sh +41 -0
- data/spec/conf/0.8/cassandra.yaml +61 -0
- data/spec/conf/0.8/log4j-server.properties +40 -0
- data/spec/conf/0.8/schema.txt +10 -0
- data/spec/conf/1.0/cassandra.in.sh +41 -0
- data/spec/conf/1.0/cassandra.yaml +416 -0
- data/spec/conf/1.0/log4j-server.properties +40 -0
- data/spec/conf/1.0/schema.txt +10 -0
- data/spec/result_spec.rb +173 -0
- data/spec/row_spec.rb +55 -0
- data/spec/rowkey_spec.rb +223 -0
- data/spec/schema_spec.rb +51 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/statement_spec.rb +224 -0
- data/spec/utility_spec.rb +26 -0
- data/spec/uuid_spec.rb +26 -0
- data/spec/validation_spec.rb +250 -0
- data/vendor/gen-rb/cassandra.rb +2212 -0
- data/vendor/gen-rb/cassandra_constants.rb +10 -0
- data/vendor/gen-rb/cassandra_types.rb +854 -0
- metadata +171 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
3
|
+
# distributed with this work for additional information
|
4
|
+
# regarding copyright ownership. The ASF licenses this file
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
6
|
+
# "License"); you may not use this file except in compliance
|
7
|
+
# with the License. You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
# for production, you should probably set pattern to %c instead of %l.
|
18
|
+
# (%l is slower.)
|
19
|
+
|
20
|
+
# output messages into a rolling log file as well as stdout
|
21
|
+
log4j.rootLogger=DEBUG,stdout,R
|
22
|
+
|
23
|
+
# stdout
|
24
|
+
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
25
|
+
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
26
|
+
log4j.appender.stdout.layout.ConversionPattern=%5p %d{HH:mm:ss,SSS} %m%n
|
27
|
+
|
28
|
+
# rolling log file
|
29
|
+
log4j.appender.R=org.apache.log4j.RollingFileAppender
|
30
|
+
log4j.appender.R.maxFileSize=20MB
|
31
|
+
log4j.appender.R.maxBackupIndex=50
|
32
|
+
log4j.appender.R.layout=org.apache.log4j.PatternLayout
|
33
|
+
log4j.appender.R.layout.ConversionPattern=%5p [%t] %d{ISO8601} %F (line %L) %m%n
|
34
|
+
# Edit the next line to point to your logs directory
|
35
|
+
log4j.appender.R.File=data/logs/system.log
|
36
|
+
|
37
|
+
# Application logging options
|
38
|
+
#log4j.logger.org.apache.cassandra=DEBUG
|
39
|
+
#log4j.logger.org.apache.cassandra.db=DEBUG
|
40
|
+
#log4j.logger.org.apache.cassandra.service.StorageProxy=DEBUG
|
@@ -0,0 +1,10 @@
|
|
1
|
+
create keyspace TypeConversions with
|
2
|
+
placement_strategy = 'org.apache.cassandra.locator.LocalStrategy' AND
|
3
|
+
strategy_options = [{replication_factor:1}];
|
4
|
+
use TypeConversions;
|
5
|
+
create column family UUIDColumnConversion with comparator = TimeUUIDType;
|
6
|
+
create column family SuperUUID with comparator = TimeUUIDType and column_type = Super;
|
7
|
+
create column family IntegerConversion with comparator = 'IntegerType';
|
8
|
+
create column family LongConversion with comparator = 'LongType';
|
9
|
+
create column family CounterConversion with comparator = 'UTF8Type' and
|
10
|
+
default_validation_class = CounterColumnType;
|
data/spec/result_spec.rb
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
require File.expand_path('spec_helper.rb', File.dirname(__FILE__))
|
2
|
+
include CassandraCQL
|
3
|
+
|
4
|
+
describe "void results" do
|
5
|
+
before(:each) do
|
6
|
+
@connection = setup_cassandra_connection
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should return nil" do
|
10
|
+
@connection.execute("USE system").should be_nil
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "sparse row results" do
|
15
|
+
before(:each) do
|
16
|
+
@connection = setup_cassandra_connection
|
17
|
+
if !@connection.schema.column_family_names.include?('sparse_results')
|
18
|
+
@connection.execute("CREATE COLUMNFAMILY sparse_results (id varchar PRIMARY KEY)")
|
19
|
+
else
|
20
|
+
@connection.execute("TRUNCATE sparse_results")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should should be handled properly" do
|
25
|
+
@connection.execute("INSERT INTO sparse_results (id, col1, col2, col3) VALUES (?, ?, ?, ?)", 'key1', 'val1', 'val2', 'val3').should be_nil
|
26
|
+
@connection.execute("INSERT INTO sparse_results (id, col4, col5, col6) VALUES (?, ?, ?, ?)", 'key2', 'val4', 'val5', 'val6').should be_nil
|
27
|
+
result = @connection.execute("SELECT col1, col2, col3, col4 FROM sparse_results")
|
28
|
+
result.rows.should eq(2)
|
29
|
+
# First column should have 3 columns set, one nil
|
30
|
+
row = result.fetch
|
31
|
+
row.columns.should eq(4)
|
32
|
+
row.column_names.should eq(['col1', 'col2', 'col3', 'col4'])
|
33
|
+
row.column_values.should eq(['val1', 'val2', 'val3', nil])
|
34
|
+
|
35
|
+
# Second column should have the last column set
|
36
|
+
row = result.fetch
|
37
|
+
row.columns.should eq(4)
|
38
|
+
row.column_names.should eq(['col1', 'col2', 'col3', 'col4'])
|
39
|
+
row.column_values.should eq([nil, nil, nil, 'val4'])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "row results" do
|
44
|
+
before(:each) do
|
45
|
+
@connection = setup_cassandra_connection
|
46
|
+
@connection.execute("INSERT INTO sparse_results (id, col1, col2, col3) VALUES (?, ?, ?, ?)", 'key1', 'val1', 'val2', 'val3').should be_nil
|
47
|
+
@connection.execute("INSERT INTO sparse_results (id, col4, col5, col6) VALUES (?, ?, ?, ?)", 'key2', 'val4', 'val5', 'val6').should be_nil
|
48
|
+
@result = @connection.execute("SELECT col1, col2, col3, col4 FROM sparse_results")
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should return true only for rows?" do
|
52
|
+
@result.void?.should be_false
|
53
|
+
@result.rows?.should be_true
|
54
|
+
@result.int?.should be_false
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should have two rows" do
|
58
|
+
@result.rows.should eq(2)
|
59
|
+
end
|
60
|
+
|
61
|
+
context "initialize" do
|
62
|
+
it "should have a cursor set to 0" do
|
63
|
+
@result.instance_variable_get(:@cursor).should eq(0)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should have a result" do
|
67
|
+
@result.instance_variable_get(:@result).should be_kind_of(CassandraCQL::Thrift::CqlResult)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "setting the cursor" do
|
72
|
+
it "should set the cursor" do
|
73
|
+
expect {
|
74
|
+
@result.cursor = 15
|
75
|
+
}.to_not raise_error
|
76
|
+
@result.instance_variable_get(:@cursor).should eq(15)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should not set the cursor" do
|
80
|
+
expect {
|
81
|
+
@result.cursor = Object
|
82
|
+
}.to raise_error(CassandraCQL::Error::InvalidCursor)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "fetching a single row" do
|
87
|
+
it "should return a row object twice then nil" do
|
88
|
+
@result.fetch_row.should be_kind_of(Row)
|
89
|
+
@result.instance_variable_get(:@cursor).should eq(1)
|
90
|
+
|
91
|
+
@result.fetch_row.should be_kind_of(Row)
|
92
|
+
@result.instance_variable_get(:@cursor).should eq(2)
|
93
|
+
|
94
|
+
@result.fetch_row.should be_nil
|
95
|
+
@result.instance_variable_get(:@cursor).should eq(2)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context "resetting cursor should fetch the same row" do
|
100
|
+
it "should return the same row" do
|
101
|
+
@result.instance_variable_get(:@cursor).should eq(0)
|
102
|
+
arr = @result.fetch_array
|
103
|
+
@result.cursor = 0
|
104
|
+
arr.should eq(@result.fetch_array)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context "fetch without a block" do
|
109
|
+
it "should return a row twice then nil" do
|
110
|
+
@result.fetch.should be_kind_of(Row)
|
111
|
+
@result.instance_variable_get(:@cursor).should eq(1)
|
112
|
+
|
113
|
+
@result.fetch.should be_kind_of(Row)
|
114
|
+
@result.instance_variable_get(:@cursor).should eq(2)
|
115
|
+
|
116
|
+
@result.fetch.should be_nil
|
117
|
+
@result.instance_variable_get(:@cursor).should eq(2)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context "fetch with a block" do
|
122
|
+
it "fetched count should equal the number of rows" do
|
123
|
+
counter = 0
|
124
|
+
@result.fetch do |row|
|
125
|
+
counter += 1
|
126
|
+
row.should be_kind_of(Row)
|
127
|
+
end
|
128
|
+
counter.should eq(@result.rows)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "fetch_array without a block" do
|
133
|
+
it "should return a row as an array" do
|
134
|
+
row = @result.fetch
|
135
|
+
@result.cursor = 0
|
136
|
+
arr = @result.fetch_array
|
137
|
+
arr.should be_kind_of(Array)
|
138
|
+
arr.should eq(row.column_values)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context "fetch_array_with a block" do
|
143
|
+
it "fetched count should equal the number of rows" do
|
144
|
+
counter = 0
|
145
|
+
@result.fetch_array do |arr|
|
146
|
+
counter += 1
|
147
|
+
arr.should be_kind_of(Array)
|
148
|
+
end
|
149
|
+
counter.should eq(@result.rows)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context "fetch_hash without a block" do
|
154
|
+
it "should return a hash" do
|
155
|
+
row = @result.fetch
|
156
|
+
@result.cursor = 0
|
157
|
+
hash = @result.fetch_hash
|
158
|
+
hash.should be_kind_of(Hash)
|
159
|
+
hash.should eq(row.to_hash)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context "fetch_hash_with a block" do
|
164
|
+
it "should iterate rows() times and return hashes" do
|
165
|
+
counter = 0
|
166
|
+
@result.fetch_hash do |hash|
|
167
|
+
counter += 1
|
168
|
+
hash.should be_kind_of(Hash)
|
169
|
+
end
|
170
|
+
counter.should eq(@result.rows)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
data/spec/row_spec.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.expand_path('spec_helper.rb', File.dirname(__FILE__))
|
2
|
+
include CassandraCQL
|
3
|
+
|
4
|
+
|
5
|
+
describe "basic methods" do
|
6
|
+
before(:each) do
|
7
|
+
@connection = setup_cassandra_connection
|
8
|
+
if @connection.schema.column_family_names.include?('basic_methods')
|
9
|
+
@connection.execute("DROP COLUMNFAMILY basic_methods")
|
10
|
+
end
|
11
|
+
@connection.execute("CREATE COLUMNFAMILY basic_methods (id varchar PRIMARY KEY, created_at uuid, default_column varchar, name varchar, serial int)")
|
12
|
+
|
13
|
+
@connection.execute("INSERT INTO basic_methods (id, created_at, name, serial, default_column) VALUES (?, ?, ?, ?, ?)", 'test', Time.new, 'name', 12345, 'snork')
|
14
|
+
@row = @connection.execute("SELECT * FROM basic_methods WHERE id=?", "test").fetch
|
15
|
+
end
|
16
|
+
|
17
|
+
context "column_names" do
|
18
|
+
it "should return a list of column names" do
|
19
|
+
@row.column_names.sort.should eq(["created_at", "default_column", "id", "name", "serial"].sort)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "column_values" do
|
24
|
+
it "should return a list of column values as Ruby objects" do
|
25
|
+
@row.column_values.should be_kind_of(Array)
|
26
|
+
@row.column_values.size.should eq(@row.column_names.size)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "columns" do
|
31
|
+
it "should equal the number of columns" do
|
32
|
+
@row.column_names.size.should eq(@row.column_values.size)
|
33
|
+
@row.columns.should eq(@row.column_names.size)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "key" do
|
38
|
+
it "should return the cql_result row key" do
|
39
|
+
@row.key.should eq(@row.row.key)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "checking casting" do
|
44
|
+
it "should return column_values for to_a" do
|
45
|
+
@row.to_a.should eq(@row.column_values)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should return a hash for to_hash" do
|
49
|
+
h = @row.to_hash
|
50
|
+
h.should be_kind_of(Hash)
|
51
|
+
h.keys.sort.should eq(@row.column_names.sort)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
data/spec/rowkey_spec.rb
ADDED
@@ -0,0 +1,223 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require File.expand_path('spec_helper.rb', File.dirname(__FILE__))
|
3
|
+
include CassandraCQL
|
4
|
+
|
5
|
+
describe "Validation Roundtrip tests" do
|
6
|
+
before(:each) do
|
7
|
+
@connection = setup_cassandra_connection
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_and_fetch_column(column_family, row_key)
|
11
|
+
@connection.execute("insert into #{column_family} (id, test_column) values (?, ?)", row_key, 'test')
|
12
|
+
res = @connection.execute("select * from #{column_family} where id = ?", row_key)
|
13
|
+
return res.fetch['id']
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_column_family(name, test_row_key_type)
|
17
|
+
if !@connection.schema.column_family_names.include?(name)
|
18
|
+
@connection.execute("CREATE COLUMNFAMILY #{name} (id #{test_row_key_type} PRIMARY KEY, test_column text)")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "with ascii row_key_validation" do
|
23
|
+
let(:cf_name) { "row_key_validation_cf_ascii" }
|
24
|
+
before(:each) { create_column_family(cf_name, 'ascii') }
|
25
|
+
|
26
|
+
it "should return an ascii string" do
|
27
|
+
create_and_fetch_column(cf_name, "test string").should eq("test string")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "with bigint row_key_validation" do
|
32
|
+
let(:cf_name) { "row_key_validation_cf_bigint" }
|
33
|
+
before(:each) { create_column_family(cf_name, 'bigint') }
|
34
|
+
|
35
|
+
def test_for_value(value)
|
36
|
+
create_and_fetch_column(cf_name, value).should eq(value)
|
37
|
+
create_and_fetch_column(cf_name, value*-1).should eq(value*-1)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should properly convert integer values that fit into 1 byte" do
|
41
|
+
test_for_value(1)
|
42
|
+
end
|
43
|
+
it "should properly convert integer values that fit into 2 bytes" do
|
44
|
+
test_for_value(2**8 + 80)
|
45
|
+
end
|
46
|
+
it "should properly convert integer values that fit into 3 bytes" do
|
47
|
+
test_for_value(2**16 + 622)
|
48
|
+
end
|
49
|
+
it "should properly convert integer values that fit into 4 bytes" do
|
50
|
+
test_for_value(2**24 + 45820)
|
51
|
+
end
|
52
|
+
it "should properly convert integer values that fit into 5 bytes" do
|
53
|
+
test_for_value(2**32 + 618387)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "with blob row_key_validation" do
|
58
|
+
let(:cf_name) { "row_key_validation_cf_blob" }
|
59
|
+
before(:each) { create_column_family(cf_name, 'blob') }
|
60
|
+
|
61
|
+
it "should return a blob" do
|
62
|
+
bytes = "binary\x00"
|
63
|
+
bytes = bytes.force_encoding('ASCII-8BIT') if RUBY_VERSION >= "1.9"
|
64
|
+
create_and_fetch_column(cf_name, bytes).should eq(bytes)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "with boolean row_key_validation" do
|
69
|
+
let(:cf_name) { "row_key_validation_cf_boolean" }
|
70
|
+
before(:each) { create_column_family(cf_name, 'boolean') }
|
71
|
+
|
72
|
+
it "should return true" do
|
73
|
+
create_and_fetch_column(cf_name, true).should be_true
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should return false" do
|
77
|
+
create_and_fetch_column(cf_name, false).should be_false
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "with decimal row_key_validation" do
|
82
|
+
let(:cf_name) { "row_key_validation_cf_decimal" }
|
83
|
+
before(:each) { create_column_family(cf_name, 'decimal') }
|
84
|
+
|
85
|
+
def test_for_value(value)
|
86
|
+
create_and_fetch_column(cf_name, value*-1).should eq(value*-1)
|
87
|
+
create_and_fetch_column(cf_name, value).should eq(value)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should return a small decimal" do
|
91
|
+
test_for_value(15.333)
|
92
|
+
end
|
93
|
+
it "should return a huge decimal" do
|
94
|
+
test_for_value(BigDecimal.new('129182739481237481341234123411.1029348102934810293481039'))
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "with double row_key_validation" do
|
99
|
+
let(:cf_name) { "row_key_validation_cf_double" }
|
100
|
+
before(:each) { create_column_family(cf_name, 'double') }
|
101
|
+
|
102
|
+
def test_for_value(value)
|
103
|
+
create_and_fetch_column(cf_name, value).should be_within(0.1).of(value)
|
104
|
+
create_and_fetch_column(cf_name, value*-1).should be_within(0.1).of(value*-1)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should properly convert some float values" do
|
108
|
+
test_for_value(1.125)
|
109
|
+
test_for_value(384.125)
|
110
|
+
test_for_value(65540.125)
|
111
|
+
test_for_value(16777217.125)
|
112
|
+
test_for_value(1099511627776.125)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context "with float row_key_validation" do
|
117
|
+
let(:cf_name) { "row_key_validation_cf_float" }
|
118
|
+
before(:each) { create_column_family(cf_name, 'float') }
|
119
|
+
|
120
|
+
def test_for_value(value)
|
121
|
+
create_and_fetch_column(cf_name, value*-1).should eq(value*-1)
|
122
|
+
create_and_fetch_column(cf_name, value).should eq(value)
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should properly convert some float values" do
|
126
|
+
test_for_value(1.125)
|
127
|
+
test_for_value(384.125)
|
128
|
+
test_for_value(65540.125)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "with int row_key_validation" do
|
133
|
+
let(:cf_name) { "row_key_validation_cf_int" }
|
134
|
+
before(:each) { create_column_family(cf_name, 'int') }
|
135
|
+
|
136
|
+
def test_for_value(value)
|
137
|
+
create_and_fetch_column(cf_name, value).should eq(value)
|
138
|
+
create_and_fetch_column(cf_name, value*-1).should eq(value*-1)
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should properly convert integer values that fit into 1 byte" do
|
142
|
+
test_for_value(1)
|
143
|
+
end
|
144
|
+
it "should properly convert integer values that fit into 2 bytes" do
|
145
|
+
test_for_value(2**8 + 80)
|
146
|
+
end
|
147
|
+
it "should properly convert integer values that fit into 3 bytes" do
|
148
|
+
test_for_value(2**16 + 622)
|
149
|
+
end
|
150
|
+
it "should properly convert integer values that fit into 4 bytes" do
|
151
|
+
test_for_value(2**24 + 45820)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context "with text row_key_validation" do
|
156
|
+
let(:cf_name) { "row_key_validation_cf_text" }
|
157
|
+
before(:each) { create_column_family(cf_name, 'varchar') }
|
158
|
+
|
159
|
+
it "should return a non-multibyte string" do
|
160
|
+
create_and_fetch_column(cf_name, "snark").should eq("snark")
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should return a multibyte string" do
|
164
|
+
create_and_fetch_column(cf_name, "snårk").should eq("snårk")
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context "with timestamp row_key_validation" do
|
169
|
+
let(:cf_name) { "row_key_validation_cf_timestamp" }
|
170
|
+
before(:each) { create_column_family(cf_name, 'timestamp') }
|
171
|
+
|
172
|
+
it "should return a timestamp" do
|
173
|
+
uuid = UUID.new
|
174
|
+
#create_and_fetch_column(cf_name, uuid).should eq(uuid)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context "with uuid row_key_validation" do
|
179
|
+
let(:cf_name) { "row_key_validation_cf_uuid" }
|
180
|
+
before(:each) { create_column_family(cf_name, 'uuid') }
|
181
|
+
|
182
|
+
it "should return a uuid" do
|
183
|
+
uuid = UUID.new
|
184
|
+
create_and_fetch_column(cf_name, uuid).should eq(uuid)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
context "with varchar row_key_validation" do
|
189
|
+
let(:cf_name) { "row_key_validation_cf_varchar" }
|
190
|
+
before(:each) { create_column_family(cf_name, 'varchar') }
|
191
|
+
|
192
|
+
it "should return a non-multibyte string" do
|
193
|
+
create_and_fetch_column(cf_name, "snark").should eq("snark")
|
194
|
+
end
|
195
|
+
|
196
|
+
it "should return a multibyte string" do
|
197
|
+
create_and_fetch_column(cf_name, "snårk").should eq("snårk")
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context "with varint row_key_validation" do
|
202
|
+
let(:cf_name) { "row_key_validation_cf_varint" }
|
203
|
+
before(:each) { create_column_family(cf_name, 'varint') }
|
204
|
+
|
205
|
+
def test_for_value(value)
|
206
|
+
create_and_fetch_column(cf_name, value).should eq(value)
|
207
|
+
create_and_fetch_column(cf_name, value*-1).should eq(value*-1)
|
208
|
+
end
|
209
|
+
|
210
|
+
it "should properly convert integer values that fit into 1 byte" do
|
211
|
+
test_for_value(1)
|
212
|
+
end
|
213
|
+
it "should properly convert integer values that fit into 2 bytes" do
|
214
|
+
test_for_value(2**8 + 80)
|
215
|
+
end
|
216
|
+
it "should properly convert integer values that fit into 3 bytes" do
|
217
|
+
test_for_value(2**16 + 622)
|
218
|
+
end
|
219
|
+
it "should properly convert integer values that fit into more than 8 bytes" do
|
220
|
+
test_for_value(2**256)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|