cassandra 0.12.1 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +5 -0
- data/README.md +4 -4
- data/Rakefile +8 -5
- data/cassandra.gemspec +22 -22
- data/conf/0.8/log4j-server.properties +1 -1
- data/conf/0.8/schema.json +4 -1
- data/conf/0.8/schema.txt +6 -6
- data/lib/cassandra.rb +2 -1
- data/lib/cassandra/0.8/cassandra.rb +16 -1
- data/lib/cassandra/0.8/columns.rb +24 -0
- data/lib/cassandra/0.8/protocol.rb +0 -13
- data/lib/cassandra/1.0.rb +7 -0
- data/lib/cassandra/1.0/cassandra.rb +25 -0
- data/lib/cassandra/1.0/columns.rb +28 -0
- data/lib/cassandra/1.0/protocol.rb +12 -0
- data/lib/cassandra/cassandra.rb +12 -8
- data/lib/cassandra/columns.rb +5 -2
- data/lib/cassandra/composite.rb +118 -0
- data/lib/cassandra/mock.rb +18 -6
- data/test/cassandra_mock_test.rb +43 -0
- data/test/cassandra_test.rb +110 -21
- data/test/composite_type_test.rb +29 -0
- data/vendor/0.8/gen-rb/cassandra_constants.rb +1 -1
- data/vendor/0.8/gen-rb/cassandra_types.rb +9 -1
- data/vendor/1.0/gen-rb/cassandra.rb +2215 -0
- data/vendor/1.0/gen-rb/cassandra_constants.rb +12 -0
- data/vendor/1.0/gen-rb/cassandra_types.rb +857 -0
- metadata +75 -90
data/CHANGELOG
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
v0.12.2
|
2
|
+
- Respect the start_key in get_range. Resolves Issue #127.
|
3
|
+
- Fix issue with differences in gemspec and what is required. Resolves Issue #125.
|
4
|
+
- Update to Cassandra 0.8.7 and 1.0.2.
|
5
|
+
|
1
6
|
v0.12.1
|
2
7
|
- Fix issue with simple_uuid dependency.
|
3
8
|
- Fix issue with get_range & get_range_batch keeping all results when a block is given. Resolves Issue# 112.
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# cassandra
|
2
2
|
A Ruby client for the Cassandra distributed database.
|
3
3
|
|
4
|
-
Supports 1.8.7, 1.9.2, and rubinius on Cassandra 0.6.13, 0.7.
|
4
|
+
Supports 1.8.7, 1.9.2, and rubinius on Cassandra 0.6.13, 0.7.9, 0.8.6, 1.0.0-rc2.
|
5
5
|
|
6
6
|
## Getting Started
|
7
7
|
|
@@ -31,10 +31,10 @@ To use the default version simply use a normal require:
|
|
31
31
|
|
32
32
|
require 'cassandra'
|
33
33
|
|
34
|
-
To use a specific version (0
|
34
|
+
To use a specific version (1.0 in this example) you would use a
|
35
35
|
slightly differently formatted require:
|
36
36
|
|
37
|
-
require 'cassandra/0
|
37
|
+
require 'cassandra/1.0'
|
38
38
|
|
39
39
|
#### Environment Variable Method
|
40
40
|
These mechanisms work well when you are using the cassandra gem in your
|
@@ -349,4 +349,4 @@ Example:
|
|
349
349
|
|
350
350
|
## Reporting Problems
|
351
351
|
|
352
|
-
The Github issue tracker is [here](http://github.com/
|
352
|
+
The Github issue tracker is [here](http://github.com/twitter/cassandra/issues). If you have problems with this library or Cassandra itself, please use the [cassandra-user mailing list](http://mail-archives.apache.org/mod_mbox/incubator-cassandra-user/).
|
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ unless ENV['FROM_BIN_CASSANDRA_HELPER']
|
|
9
9
|
p.project = "fauna"
|
10
10
|
p.summary = "A Ruby client for the Cassandra distributed database."
|
11
11
|
p.rubygems_version = ">= 0.8"
|
12
|
-
p.dependencies = ['thrift_client >=0.7.0', 'json', 'rake', 'simple_uuid
|
12
|
+
p.dependencies = ['thrift_client >=0.7.0 <0.9', 'json', 'rake', 'simple_uuid ~>0.2.0']
|
13
13
|
p.ignore_pattern = /^(data|vendor\/cassandra|cassandra|vendor\/thrift|.*\.rbc)/
|
14
14
|
p.rdoc_pattern = /^(lib|bin|tasks|ext)|^README|^CHANGELOG|^TODO|^LICENSE|^COPYING$/
|
15
15
|
p.retain_gemspec = true
|
@@ -18,8 +18,9 @@ end
|
|
18
18
|
|
19
19
|
CassandraBinaries = {
|
20
20
|
'0.6' => 'http://archive.apache.org/dist/cassandra/0.6.13/apache-cassandra-0.6.13-bin.tar.gz',
|
21
|
-
'0.7' => 'http://archive.apache.org/dist/cassandra/0.7.
|
22
|
-
'0.8' => 'http://archive.apache.org/dist/cassandra/0.8.
|
21
|
+
'0.7' => 'http://archive.apache.org/dist/cassandra/0.7.9/apache-cassandra-0.7.9-bin.tar.gz',
|
22
|
+
'0.8' => 'http://archive.apache.org/dist/cassandra/0.8.7/apache-cassandra-0.8.7-bin.tar.gz',
|
23
|
+
'1.0' => 'http://archive.apache.org/dist/cassandra/1.0.6/apache-cassandra-1.0.6-bin.tar.gz'
|
23
24
|
}
|
24
25
|
|
25
26
|
CASSANDRA_HOME = ENV['CASSANDRA_HOME'] || "#{ENV['HOME']}/cassandra"
|
@@ -153,10 +154,12 @@ task :test => 'data:load'
|
|
153
154
|
# desc "Regenerate thrift bindings for Cassandra" # Dev only
|
154
155
|
task :thrift do
|
155
156
|
puts "Generating Thrift bindings"
|
157
|
+
FileUtils.mkdir_p "vendor/#{CASSANDRA_VERSION}"
|
158
|
+
|
156
159
|
system(
|
157
|
-
"cd vendor &&
|
160
|
+
"cd vendor/#{CASSANDRA_VERSION} &&
|
158
161
|
rm -rf gen-rb &&
|
159
|
-
thrift -gen rb #{CASSANDRA_HOME}/interface/cassandra.thrift")
|
162
|
+
thrift -gen rb #{File.join(CASSANDRA_HOME, "cassandra-#{CASSANDRA_VERSION}")}/interface/cassandra.thrift")
|
160
163
|
end
|
161
164
|
|
162
165
|
task :fix_perms do
|
data/cassandra.gemspec
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
|
-
s.name =
|
5
|
-
s.version = "0.
|
4
|
+
s.name = "cassandra"
|
5
|
+
s.version = "0.13.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0.8") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = [
|
9
|
-
s.date =
|
10
|
-
s.description =
|
11
|
-
s.email =
|
12
|
-
s.executables = [
|
13
|
-
s.extra_rdoc_files = [
|
14
|
-
s.files = [
|
15
|
-
s.homepage =
|
16
|
-
s.rdoc_options = [
|
17
|
-
s.require_paths = [
|
18
|
-
s.rubyforge_project =
|
19
|
-
s.rubygems_version =
|
20
|
-
s.summary =
|
21
|
-
s.test_files = [
|
8
|
+
s.authors = ["Evan Weaver, Ryan King"]
|
9
|
+
s.date = "2012-07-19"
|
10
|
+
s.description = "A Ruby client for the Cassandra distributed database."
|
11
|
+
s.email = ""
|
12
|
+
s.executables = ["cassandra_helper"]
|
13
|
+
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README.md", "bin/cassandra_helper", "lib/cassandra.rb", "lib/cassandra/0.6.rb", "lib/cassandra/0.6/cassandra.rb", "lib/cassandra/0.6/columns.rb", "lib/cassandra/0.6/protocol.rb", "lib/cassandra/0.7.rb", "lib/cassandra/0.7/cassandra.rb", "lib/cassandra/0.7/columns.rb", "lib/cassandra/0.7/protocol.rb", "lib/cassandra/0.8.rb", "lib/cassandra/0.8/cassandra.rb", "lib/cassandra/0.8/columns.rb", "lib/cassandra/0.8/protocol.rb", "lib/cassandra/1.0/cassandra.rb", "lib/cassandra/1.0/columns.rb", "lib/cassandra/1.0/protocol.rb", "lib/cassandra/1.0.rb", "lib/cassandra/array.rb", "lib/cassandra/cassandra.rb", "lib/cassandra/column_family.rb", "lib/cassandra/columns.rb", "lib/cassandra/comparable.rb", "lib/cassandra/composite.rb", "lib/cassandra/constants.rb", "lib/cassandra/debug.rb", "lib/cassandra/helpers.rb", "lib/cassandra/keyspace.rb", "lib/cassandra/long.rb", "lib/cassandra/mock.rb", "lib/cassandra/ordered_hash.rb", "lib/cassandra/protocol.rb", "lib/cassandra/time.rb"]
|
14
|
+
s.files = ["CHANGELOG", "LICENSE", "Manifest", "README.md", "Rakefile", "bin/cassandra_helper", "conf/0.6/cassandra.in.sh", "conf/0.6/log4j.properties", "conf/0.6/schema.json", "conf/0.6/storage-conf.xml", "conf/0.7/cassandra.in.sh", "conf/0.7/cassandra.yaml", "conf/0.7/log4j-server.properties", "conf/0.7/schema.json", "conf/0.7/schema.txt", "conf/0.8/cassandra.in.sh", "conf/0.8/cassandra.yaml", "conf/0.8/log4j-server.properties", "conf/0.8/schema.json", "conf/0.8/schema.txt", "lib/cassandra.rb", "lib/cassandra/0.6.rb", "lib/cassandra/0.6/cassandra.rb", "lib/cassandra/0.6/columns.rb", "lib/cassandra/0.6/protocol.rb", "lib/cassandra/0.7.rb", "lib/cassandra/0.7/cassandra.rb", "lib/cassandra/0.7/columns.rb", "lib/cassandra/0.7/protocol.rb", "lib/cassandra/0.8.rb", "lib/cassandra/0.8/cassandra.rb", "lib/cassandra/0.8/columns.rb", "lib/cassandra/0.8/protocol.rb", "lib/cassandra/1.0/cassandra.rb", "lib/cassandra/1.0/columns.rb", "lib/cassandra/1.0/protocol.rb", "lib/cassandra/1.0.rb", "lib/cassandra/array.rb", "lib/cassandra/cassandra.rb", "lib/cassandra/column_family.rb", "lib/cassandra/columns.rb", "lib/cassandra/comparable.rb", "lib/cassandra/composite.rb", "lib/cassandra/constants.rb", "lib/cassandra/debug.rb", "lib/cassandra/helpers.rb", "lib/cassandra/keyspace.rb", "lib/cassandra/long.rb", "lib/cassandra/mock.rb", "lib/cassandra/ordered_hash.rb", "lib/cassandra/protocol.rb", "lib/cassandra/time.rb", "test/cassandra_client_test.rb", "test/cassandra_mock_test.rb", "test/cassandra_test.rb", "test/comparable_types_test.rb", "test/composite_type_test.rb", "test/eventmachine_test.rb", "test/ordered_hash_test.rb", "test/test_helper.rb", "vendor/0.6/gen-rb/cassandra.rb", "vendor/0.6/gen-rb/cassandra_constants.rb", "vendor/0.6/gen-rb/cassandra_types.rb", "vendor/0.7/gen-rb/cassandra.rb", "vendor/0.7/gen-rb/cassandra_constants.rb", "vendor/0.7/gen-rb/cassandra_types.rb", "vendor/0.8/gen-rb/cassandra.rb", "vendor/0.8/gen-rb/cassandra_constants.rb", "vendor/0.8/gen-rb/cassandra_types.rb", "vendor/1.0/gen-rb/cassandra.rb", "vendor/1.0/gen-rb/cassandra_constants.rb", "vendor/1.0/gen-rb/cassandra_types.rb", "cassandra.gemspec"]
|
15
|
+
s.homepage = "http://github.com/twitter/cassandra/"
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Cassandra", "--main", "README.md"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = "fauna"
|
19
|
+
s.rubygems_version = "1.8.10"
|
20
|
+
s.summary = "A Ruby client for the Cassandra distributed database."
|
21
|
+
s.test_files = ["test/cassandra_mock_test.rb", "test/ordered_hash_test.rb", "test/cassandra_client_test.rb", "test/cassandra_test.rb", "test/comparable_types_test.rb", "test/test_helper.rb", "test/eventmachine_test.rb"]
|
22
22
|
|
23
23
|
if s.respond_to? :specification_version then
|
24
24
|
s.specification_version = 3
|
25
25
|
|
26
26
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
27
|
-
s.add_runtime_dependency(%q<thrift_client>, [">= 0.7.0"])
|
27
|
+
s.add_runtime_dependency(%q<thrift_client>, ["< 0.9", ">= 0.7.0"])
|
28
28
|
s.add_runtime_dependency(%q<json>, [">= 0"])
|
29
29
|
s.add_runtime_dependency(%q<rake>, [">= 0"])
|
30
|
-
s.add_runtime_dependency(%q<simple_uuid>, ["
|
30
|
+
s.add_runtime_dependency(%q<simple_uuid>, ["~> 0.2.0"])
|
31
31
|
else
|
32
|
-
s.add_dependency(%q<thrift_client>, [">= 0.7.0"])
|
32
|
+
s.add_dependency(%q<thrift_client>, ["< 0.9", ">= 0.7.0"])
|
33
33
|
s.add_dependency(%q<json>, [">= 0"])
|
34
34
|
s.add_dependency(%q<rake>, [">= 0"])
|
35
|
-
s.add_dependency(%q<simple_uuid>, ["
|
35
|
+
s.add_dependency(%q<simple_uuid>, ["~> 0.2.0"])
|
36
36
|
end
|
37
37
|
else
|
38
|
-
s.add_dependency(%q<thrift_client>, [">= 0.7.0"])
|
38
|
+
s.add_dependency(%q<thrift_client>, ["< 0.9", ">= 0.7.0"])
|
39
39
|
s.add_dependency(%q<json>, [">= 0"])
|
40
40
|
s.add_dependency(%q<rake>, [">= 0"])
|
41
|
-
s.add_dependency(%q<simple_uuid>, ["
|
41
|
+
s.add_dependency(%q<simple_uuid>, ["~> 0.2.0"])
|
42
42
|
end
|
43
43
|
end
|
data/conf/0.8/schema.json
CHANGED
@@ -61,6 +61,9 @@
|
|
61
61
|
"SuperUUID":{
|
62
62
|
"subcomparator_type":"org.apache.cassandra.db.marshal.TimeUUIDType",
|
63
63
|
"comparator_type":"org.apache.cassandra.db.marshal.TimeUUIDType",
|
64
|
-
"column_type":"Super"}
|
64
|
+
"column_type":"Super"},
|
65
|
+
"CompositeColumnConversion":{
|
66
|
+
"comparator_type":"org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.IntegerType,org.apache.cassandra.db.marshal.UTF8Type)",
|
67
|
+
"column_type":"Standard"}
|
65
68
|
}
|
66
69
|
}
|
data/conf/0.8/schema.txt
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
create keyspace Twitter with
|
2
|
-
placement_strategy = 'org.apache.cassandra.locator.
|
2
|
+
placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' AND
|
3
3
|
strategy_options = [{replication_factor:1}];
|
4
4
|
use Twitter;
|
5
5
|
create column family Users with comparator = 'UTF8Type';
|
@@ -17,7 +17,7 @@ create column family UserRelationships with
|
|
17
17
|
create column family Usernames with comparator = 'UTF8Type';
|
18
18
|
create column family Statuses with comparator = 'UTF8Type';
|
19
19
|
create column family StatusAudits with comparator = 'UTF8Type';
|
20
|
-
create column family StatusRelationships with
|
20
|
+
create column family StatusRelationships with
|
21
21
|
comparator = 'UTF8Type' and
|
22
22
|
column_type = 'Super' and
|
23
23
|
subcomparator = 'TimeUUIDType';
|
@@ -28,7 +28,7 @@ create column family TimelinishThings with
|
|
28
28
|
comparator = 'BytesType';
|
29
29
|
|
30
30
|
create keyspace Multiblog with
|
31
|
-
placement_strategy = 'org.apache.cassandra.locator.
|
31
|
+
placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' AND
|
32
32
|
strategy_options = [{replication_factor:1}];
|
33
33
|
use Multiblog;
|
34
34
|
create column family Blogs with comparator = 'TimeUUIDType';
|
@@ -36,16 +36,16 @@ create column family Comments with comparator = 'TimeUUIDType';
|
|
36
36
|
|
37
37
|
|
38
38
|
create keyspace MultiblogLong with
|
39
|
-
placement_strategy = 'org.apache.cassandra.locator.
|
39
|
+
placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' AND
|
40
40
|
strategy_options = [{replication_factor:1}];
|
41
41
|
use MultiblogLong;
|
42
42
|
create column family Blogs with comparator = 'LongType';
|
43
43
|
create column family Comments with comparator = 'LongType';
|
44
44
|
|
45
45
|
create keyspace TypeConversions with
|
46
|
-
placement_strategy = 'org.apache.cassandra.locator.
|
46
|
+
placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' AND
|
47
47
|
strategy_options = [{replication_factor:1}];
|
48
48
|
use TypeConversions;
|
49
49
|
create column family UUIDColumnConversion with comparator = TimeUUIDType;
|
50
50
|
create column family SuperUUID with comparator = TimeUUIDType and column_type = Super;
|
51
|
-
|
51
|
+
create column family CompositeColumnConversion with comparator = 'CompositeType(IntegerType, UTF8Type)';
|
data/lib/cassandra.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
gem 'thrift_client', '
|
2
|
+
gem 'thrift_client', '>= 0.7.0', '< 0.9'
|
3
3
|
require 'thrift_client'
|
4
4
|
gem 'simple_uuid' , '~> 0.2.0'
|
5
5
|
require 'simple_uuid'
|
@@ -23,6 +23,7 @@ require 'cassandra/array'
|
|
23
23
|
require 'cassandra/time'
|
24
24
|
require 'cassandra/comparable'
|
25
25
|
require 'cassandra/long'
|
26
|
+
require 'cassandra/composite'
|
26
27
|
require 'cassandra/ordered_hash'
|
27
28
|
require 'cassandra/columns'
|
28
29
|
require 'cassandra/protocol'
|
@@ -5,6 +5,21 @@ class Cassandra
|
|
5
5
|
# Add a value to the counter in cf:key:super column:column
|
6
6
|
def add(column_family, key, value, *columns_and_options)
|
7
7
|
column_family, column, sub_column, options = extract_and_validate_params(column_family, key, columns_and_options, WRITE_DEFAULTS)
|
8
|
-
|
8
|
+
|
9
|
+
mutation_map = if is_super(column_family)
|
10
|
+
{
|
11
|
+
key => {
|
12
|
+
column_family => [_super_counter_mutation(column_family, column, sub_column, value)]
|
13
|
+
}
|
14
|
+
}
|
15
|
+
else
|
16
|
+
{
|
17
|
+
key => {
|
18
|
+
column_family => [_standard_counter_mutation(column_family, column, value)]
|
19
|
+
}
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
@batch ? @batch << [mutation_map, options[:consistency]] : _mutate(mutation_map, options[:consistency])
|
9
24
|
end
|
10
25
|
end
|
@@ -1,4 +1,28 @@
|
|
1
1
|
class Cassandra
|
2
2
|
module Columns #:nodoc:
|
3
|
+
def _standard_counter_mutation(column_family, column_name, value)
|
4
|
+
CassandraThrift::Mutation.new(
|
5
|
+
:column_or_supercolumn => CassandraThrift::ColumnOrSuperColumn.new(
|
6
|
+
:counter_column => CassandraThrift::CounterColumn.new(
|
7
|
+
:name => column_name_class(column_family).new(column_name).to_s,
|
8
|
+
:value => value,
|
9
|
+
)
|
10
|
+
)
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
def _super_counter_mutation(column_family, super_column_name, sub_column, value)
|
15
|
+
CassandraThrift::Mutation.new(:column_or_supercolumn =>
|
16
|
+
CassandraThrift::ColumnOrSuperColumn.new(
|
17
|
+
:counter_super_column => CassandraThrift::SuperColumn.new(
|
18
|
+
:name => column_name_class(column_family).new(super_column_name).to_s,
|
19
|
+
:columns => [CassandraThrift::CounterColumn.new(
|
20
|
+
:name => sub_column_name_class(column_family).new(sub_column).to_s,
|
21
|
+
:value => value
|
22
|
+
)]
|
23
|
+
)
|
24
|
+
)
|
25
|
+
)
|
26
|
+
end
|
3
27
|
end
|
4
28
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require "#{File.expand_path(File.dirname(__FILE__))}/../0.7/protocol"
|
2
|
-
|
3
1
|
class Cassandra
|
4
2
|
# Inner methods for actually doing the Thrift calls
|
5
3
|
module Protocol #:nodoc:
|
@@ -8,16 +6,5 @@ class Cassandra
|
|
8
6
|
def _remove_counter(key, column_path, consistency_level)
|
9
7
|
client.remove_counter(key, column_path, consistency_level)
|
10
8
|
end
|
11
|
-
|
12
|
-
def _add(column_family, key, column, sub_column, value, consistency)
|
13
|
-
if is_super(column_family)
|
14
|
-
column_parent = CassandraThrift::ColumnParent.new(:column_family => column_family, :super_column => column)
|
15
|
-
counter_column = CassandraThrift::CounterColumn.new(:name => sub_column, :value => value)
|
16
|
-
else
|
17
|
-
column_parent = CassandraThrift::ColumnParent.new(:column_family => column_family)
|
18
|
-
counter_column = CassandraThrift::CounterColumn.new(:name => column, :value => value)
|
19
|
-
end
|
20
|
-
client.add(key, column_parent, counter_column, consistency)
|
21
|
-
end
|
22
9
|
end
|
23
10
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Cassandra
|
2
|
+
|
3
|
+
## Counters
|
4
|
+
|
5
|
+
# Add a value to the counter in cf:key:super column:column
|
6
|
+
def add(column_family, key, value, *columns_and_options)
|
7
|
+
column_family, column, sub_column, options = extract_and_validate_params(column_family, key, columns_and_options, WRITE_DEFAULTS)
|
8
|
+
|
9
|
+
mutation_map = if is_super(column_family)
|
10
|
+
{
|
11
|
+
key => {
|
12
|
+
column_family => [_super_counter_mutation(column_family, column, sub_column, value)]
|
13
|
+
}
|
14
|
+
}
|
15
|
+
else
|
16
|
+
{
|
17
|
+
key => {
|
18
|
+
column_family => [_standard_counter_mutation(column_family, column, value)]
|
19
|
+
}
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
@batch ? @batch << [mutation_map, options[:consistency]] : _mutate(mutation_map, options[:consistency])
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class Cassandra
|
2
|
+
module Columns #:nodoc:
|
3
|
+
def _standard_counter_mutation(column_family, column_name, value)
|
4
|
+
CassandraThrift::Mutation.new(
|
5
|
+
:column_or_supercolumn => CassandraThrift::ColumnOrSuperColumn.new(
|
6
|
+
:counter_column => CassandraThrift::CounterColumn.new(
|
7
|
+
:name => column_name_class(column_family).new(column_name).to_s,
|
8
|
+
:value => value,
|
9
|
+
)
|
10
|
+
)
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
def _super_counter_mutation(column_family, super_column_name, sub_column, value)
|
15
|
+
CassandraThrift::Mutation.new(:column_or_supercolumn =>
|
16
|
+
CassandraThrift::ColumnOrSuperColumn.new(
|
17
|
+
:counter_super_column => CassandraThrift::SuperColumn.new(
|
18
|
+
:name => column_name_class(column_family).new(super_column_name).to_s,
|
19
|
+
:columns => [CassandraThrift::CounterColumn.new(
|
20
|
+
:name => sub_column_name_class(column_family).new(sub_column).to_s,
|
21
|
+
:value => value
|
22
|
+
)]
|
23
|
+
)
|
24
|
+
)
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "#{File.expand_path(File.dirname(__FILE__))}/../0.7/protocol"
|
2
|
+
|
3
|
+
class Cassandra
|
4
|
+
# Inner methods for actually doing the Thrift calls
|
5
|
+
module Protocol #:nodoc:
|
6
|
+
private
|
7
|
+
|
8
|
+
def _remove_counter(key, column_path, consistency_level)
|
9
|
+
client.remove_counter(key, column_path, consistency_level)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/cassandra/cassandra.rb
CHANGED
@@ -741,27 +741,29 @@ class Cassandra
|
|
741
741
|
# range of keys in the column_family you request.
|
742
742
|
#
|
743
743
|
# If a block is passed in we will yield the row key and columns for
|
744
|
-
# each record returned.
|
744
|
+
# each record returned and return a nil value instead of a Cassandra::OrderedHash.
|
745
745
|
#
|
746
746
|
# See Cassandra#get_range for more details.
|
747
747
|
#
|
748
748
|
def get_range_batch(column_family, options = {})
|
749
749
|
batch_size = options.delete(:batch_size) || 100
|
750
750
|
count = options.delete(:key_count)
|
751
|
-
result = {}
|
751
|
+
result = (!block_given? && {}) || nil
|
752
|
+
num_results = 0
|
752
753
|
|
753
754
|
options[:start_key] ||= ''
|
754
755
|
last_key = nil
|
755
756
|
|
756
|
-
while
|
757
|
-
options
|
758
|
-
res = get_range_single(column_family, options.merge!(:start_key => last_key,
|
757
|
+
while count.nil? || count > num_results
|
758
|
+
res = get_range_single(column_family, options.merge!(:start_key => last_key || options[:start_key],
|
759
759
|
:key_count => batch_size,
|
760
760
|
:return_empty_rows => true
|
761
761
|
))
|
762
|
+
break if res.keys.last == last_key
|
763
|
+
|
762
764
|
res.each do |key, columns|
|
763
|
-
next if
|
764
|
-
next if
|
765
|
+
next if last_key == key
|
766
|
+
next if num_results == count
|
765
767
|
|
766
768
|
unless columns == {}
|
767
769
|
if block_given?
|
@@ -769,12 +771,14 @@ class Cassandra
|
|
769
771
|
else
|
770
772
|
result[key] = columns
|
771
773
|
end
|
774
|
+
num_results += 1
|
772
775
|
end
|
776
|
+
|
773
777
|
last_key = key
|
774
778
|
end
|
775
779
|
end
|
776
780
|
|
777
|
-
result
|
781
|
+
result
|
778
782
|
end
|
779
783
|
|
780
784
|
##
|
data/lib/cassandra/columns.rb
CHANGED
@@ -18,10 +18,11 @@ class Cassandra
|
|
18
18
|
|
19
19
|
def column_name_class_for_key(column_family, comparator_key)
|
20
20
|
property = column_family_property(column_family, comparator_key)
|
21
|
-
property =~
|
21
|
+
property =~ /[^(]*\.(.*?)$/
|
22
22
|
case $1
|
23
23
|
when "LongType" then Long
|
24
24
|
when "LexicalUUIDType", "TimeUUIDType" then SimpleUUID::UUID
|
25
|
+
when /^CompositeType\(/ then Composite
|
25
26
|
else
|
26
27
|
String # UTF8, Ascii, Bytes, anything else
|
27
28
|
end
|
@@ -73,8 +74,10 @@ class Cassandra
|
|
73
74
|
def columns_to_hash_for_classes(columns, column_name_class, sub_column_name_class = nil)
|
74
75
|
hash = OrderedHash.new
|
75
76
|
Array(columns).each do |c|
|
76
|
-
c = c.super_column || c.column || c.counter_column if c.is_a?(CassandraThrift::ColumnOrSuperColumn)
|
77
|
+
c = c.super_column || c.column || c.counter_column || c.counter_super_column if c.is_a?(CassandraThrift::ColumnOrSuperColumn)
|
77
78
|
case c
|
79
|
+
when CassandraThrift::CounterSuperColumn
|
80
|
+
hash.[]=(column_name_class.new(c.name), columns_to_hash_for_classes(c.columns, sub_column_name_class)) # Pop the class stack, and recurse
|
78
81
|
when CassandraThrift::SuperColumn
|
79
82
|
hash.[]=(column_name_class.new(c.name), columns_to_hash_for_classes(c.columns, sub_column_name_class)) # Pop the class stack, and recurse
|
80
83
|
when CassandraThrift::Column
|