cassandra 0.11.0 → 0.11.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.
Files changed (67) hide show
  1. data/CHANGELOG +10 -0
  2. data/LICENSE +0 -0
  3. data/Manifest +12 -13
  4. data/README.md +344 -0
  5. data/Rakefile +52 -8
  6. data/cassandra.gemspec +5 -5
  7. data/conf/0.6/cassandra.in.sh +0 -0
  8. data/conf/0.6/log4j.properties +0 -0
  9. data/conf/0.6/schema.json +9 -0
  10. data/conf/0.6/storage-conf.xml +10 -0
  11. data/conf/0.7/cassandra.in.sh +0 -0
  12. data/conf/0.7/cassandra.yaml +0 -0
  13. data/conf/0.7/log4j-server.properties +0 -0
  14. data/conf/0.7/schema.json +9 -0
  15. data/conf/0.7/schema.txt +5 -16
  16. data/conf/0.8/cassandra.in.sh +0 -0
  17. data/conf/0.8/cassandra.yaml +1 -1
  18. data/conf/0.8/log4j-server.properties +0 -0
  19. data/conf/0.8/schema.json +19 -1
  20. data/conf/0.8/schema.txt +12 -17
  21. data/lib/cassandra.rb +3 -2
  22. data/lib/cassandra/0.6.rb +0 -0
  23. data/lib/cassandra/0.6/cassandra.rb +57 -6
  24. data/lib/cassandra/0.6/columns.rb +19 -0
  25. data/lib/cassandra/0.6/protocol.rb +2 -1
  26. data/lib/cassandra/0.7.rb +0 -0
  27. data/lib/cassandra/0.7/cassandra.rb +0 -270
  28. data/lib/cassandra/0.7/columns.rb +1 -81
  29. data/lib/cassandra/0.7/protocol.rb +0 -112
  30. data/lib/cassandra/0.8.rb +0 -0
  31. data/lib/cassandra/0.8/cassandra.rb +5 -267
  32. data/lib/cassandra/0.8/columns.rb +1 -81
  33. data/lib/cassandra/0.8/protocol.rb +9 -103
  34. data/lib/cassandra/array.rb +0 -0
  35. data/lib/cassandra/cassandra.rb +715 -92
  36. data/lib/cassandra/{0.7/column_family.rb → column_family.rb} +0 -0
  37. data/lib/cassandra/columns.rb +63 -6
  38. data/lib/cassandra/comparable.rb +0 -0
  39. data/lib/cassandra/constants.rb +0 -0
  40. data/lib/cassandra/debug.rb +0 -0
  41. data/lib/cassandra/helpers.rb +0 -0
  42. data/lib/cassandra/{0.7/keyspace.rb → keyspace.rb} +0 -0
  43. data/lib/cassandra/long.rb +0 -0
  44. data/lib/cassandra/mock.rb +45 -8
  45. data/lib/cassandra/ordered_hash.rb +0 -0
  46. data/lib/cassandra/protocol.rb +119 -0
  47. data/lib/cassandra/time.rb +0 -0
  48. data/test/cassandra_client_test.rb +0 -0
  49. data/test/cassandra_mock_test.rb +3 -0
  50. data/test/cassandra_test.rb +202 -20
  51. data/test/comparable_types_test.rb +0 -0
  52. data/test/eventmachine_test.rb +0 -0
  53. data/test/ordered_hash_test.rb +0 -0
  54. data/test/test_helper.rb +1 -1
  55. data/vendor/0.6/gen-rb/cassandra.rb +0 -0
  56. data/vendor/0.6/gen-rb/cassandra_constants.rb +0 -0
  57. data/vendor/0.6/gen-rb/cassandra_types.rb +0 -0
  58. data/vendor/0.7/gen-rb/cassandra.rb +0 -0
  59. data/vendor/0.7/gen-rb/cassandra_constants.rb +0 -0
  60. data/vendor/0.7/gen-rb/cassandra_types.rb +0 -0
  61. data/vendor/0.8/gen-rb/cassandra.rb +0 -0
  62. data/vendor/0.8/gen-rb/cassandra_constants.rb +0 -0
  63. data/vendor/0.8/gen-rb/cassandra_types.rb +0 -0
  64. metadata +27 -29
  65. data/README.rdoc +0 -99
  66. data/lib/cassandra/0.8/column_family.rb +0 -3
  67. data/lib/cassandra/0.8/keyspace.rb +0 -3
@@ -2,18 +2,18 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{cassandra}
5
- s.version = "0.11.0"
5
+ s.version = "0.11.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0.8") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Evan Weaver, Ryan King"]
9
- s.date = %q{2011-05-18}
9
+ s.date = %q{2011-06-01}
10
10
  s.description = %q{A Ruby client for the Cassandra distributed database.}
11
11
  s.email = %q{}
12
12
  s.executables = ["cassandra_helper"]
13
- s.extra_rdoc_files = ["bin/cassandra_helper", "CHANGELOG", "lib/cassandra/0.6/cassandra.rb", "lib/cassandra/0.6/columns.rb", "lib/cassandra/0.6/protocol.rb", "lib/cassandra/0.6.rb", "lib/cassandra/0.7/cassandra.rb", "lib/cassandra/0.7/column_family.rb", "lib/cassandra/0.7/columns.rb", "lib/cassandra/0.7/keyspace.rb", "lib/cassandra/0.7/protocol.rb", "lib/cassandra/0.7.rb", "lib/cassandra/0.8/cassandra.rb", "lib/cassandra/0.8/column_family.rb", "lib/cassandra/0.8/columns.rb", "lib/cassandra/0.8/keyspace.rb", "lib/cassandra/0.8/protocol.rb", "lib/cassandra/0.8.rb", "lib/cassandra/array.rb", "lib/cassandra/cassandra.rb", "lib/cassandra/columns.rb", "lib/cassandra/comparable.rb", "lib/cassandra/constants.rb", "lib/cassandra/debug.rb", "lib/cassandra/helpers.rb", "lib/cassandra/long.rb", "lib/cassandra/mock.rb", "lib/cassandra/ordered_hash.rb", "lib/cassandra/time.rb", "lib/cassandra.rb", "LICENSE", "README.rdoc"]
14
- s.files = ["bin/cassandra_helper", "CHANGELOG", "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/0.6/cassandra.rb", "lib/cassandra/0.6/columns.rb", "lib/cassandra/0.6/protocol.rb", "lib/cassandra/0.6.rb", "lib/cassandra/0.7/cassandra.rb", "lib/cassandra/0.7/column_family.rb", "lib/cassandra/0.7/columns.rb", "lib/cassandra/0.7/keyspace.rb", "lib/cassandra/0.7/protocol.rb", "lib/cassandra/0.7.rb", "lib/cassandra/0.8/cassandra.rb", "lib/cassandra/0.8/column_family.rb", "lib/cassandra/0.8/columns.rb", "lib/cassandra/0.8/keyspace.rb", "lib/cassandra/0.8/protocol.rb", "lib/cassandra/0.8.rb", "lib/cassandra/array.rb", "lib/cassandra/cassandra.rb", "lib/cassandra/columns.rb", "lib/cassandra/comparable.rb", "lib/cassandra/constants.rb", "lib/cassandra/debug.rb", "lib/cassandra/helpers.rb", "lib/cassandra/long.rb", "lib/cassandra/mock.rb", "lib/cassandra/ordered_hash.rb", "lib/cassandra/time.rb", "lib/cassandra.rb", "LICENSE", "Manifest", "Rakefile", "README.rdoc", "test/cassandra_client_test.rb", "test/cassandra_mock_test.rb", "test/cassandra_test.rb", "test/comparable_types_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", "cassandra.gemspec"]
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/array.rb", "lib/cassandra/cassandra.rb", "lib/cassandra/column_family.rb", "lib/cassandra/columns.rb", "lib/cassandra/comparable.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/array.rb", "lib/cassandra/cassandra.rb", "lib/cassandra/column_family.rb", "lib/cassandra/columns.rb", "lib/cassandra/comparable.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/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", "cassandra.gemspec"]
15
15
  s.homepage = %q{http://fauna.github.com/fauna/cassandra/}
16
- s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Cassandra", "--main", "README.rdoc"]
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Cassandra", "--main", "README.md"]
17
17
  s.require_paths = ["lib"]
18
18
  s.rubyforge_project = %q{fauna}
19
19
  s.rubygems_version = %q{1.7.2}
File without changes
File without changes
@@ -44,5 +44,14 @@
44
44
  "Comments":{
45
45
  "CompareWith":"org.apache.cassandra.db.marshal.LongType",
46
46
  "Type":"Standard"}
47
+ },
48
+ "TypeConversions":{
49
+ "UUIDColumnConversion":{
50
+ "CompareWith":"org.apache.cassandra.db.marshal.TimeUUIDType",
51
+ "Type":"Standard"},
52
+ "SuperUUID":{
53
+ "CompareSubcolumnsWith":"org.apache.cassandra.db.marshal.TimeUUIDType",
54
+ "CompareWith":"org.apache.cassandra.db.marshal.TimeUUIDType",
55
+ "Type":"Super"}
47
56
  }
48
57
  }
@@ -91,6 +91,16 @@
91
91
  <EndPointSnitch>org.apache.cassandra.locator.EndPointSnitch</EndPointSnitch>
92
92
  </Keyspace>
93
93
 
94
+ <Keyspace Name="TypeConversions">
95
+ <KeysCachedFraction>0.01</KeysCachedFraction>
96
+ <ColumnFamily CompareWith="TimeUUIDType" Name="UUIDColumnConversion"/>
97
+ <ColumnFamily CompareWith="TimeUUIDType" CompareSubcolumnsWith="UTF8Type" ColumnType="Super" Name="SuperUUID"/>
98
+
99
+ <ReplicaPlacementStrategy>org.apache.cassandra.locator.RackUnawareStrategy</ReplicaPlacementStrategy>
100
+ <ReplicationFactor>1</ReplicationFactor>
101
+ <EndPointSnitch>org.apache.cassandra.locator.EndPointSnitch</EndPointSnitch>
102
+ </Keyspace>
103
+
94
104
  <Keyspace Name="CassandraObject">
95
105
  <KeysCachedFraction>0.01</KeysCachedFraction>
96
106
  <ColumnFamily CompareWith="UTF8Type" Name="Customers" />
File without changes
File without changes
File without changes
@@ -44,5 +44,14 @@
44
44
  "Comments":{
45
45
  "comparator_type":"org.apache.cassandra.db.marshal.LongType",
46
46
  "column_type":"Standard"}
47
+ },
48
+ "TypeConversions":{
49
+ "UUIDColumnConversion":{
50
+ "comparator_type":"org.apache.cassandra.db.marshal.TimeUUIDType",
51
+ "column_type":"Standard"},
52
+ "SuperUUID":{
53
+ "subcomparator_type":"org.apache.cassandra.db.marshal.TimeUUIDType",
54
+ "comparator_type":"org.apache.cassandra.db.marshal.TimeUUIDType",
55
+ "column_type":"Super"}
47
56
  }
48
57
  }
@@ -36,21 +36,10 @@ use MultiblogLong;
36
36
  create column family Blogs with comparator = 'LongType';
37
37
  create column family Comments with comparator = 'LongType';
38
38
 
39
- create keyspace CassandraObject with
39
+ create keyspace TypeConversions with
40
40
  placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' AND
41
41
  replication_factor = 1;
42
- use CassandraObject;
43
- create column family Customers with comparator = 'UTF8Type';
44
- create column family CustomerRelationships with
45
- comparator = 'UTF8Type' AND
46
- column_type = 'Super' AND
47
- subcomparator = 'TimeUUIDType';
48
- create column family CustomersByLastName with comparator = 'TimeUUIDType';
49
- create column family Invoices with comparator = 'UTF8Type';
50
- create column family InvoiceRelationships with
51
- comparator = 'UTF8Type' AND
52
- column_type = 'Super' AND
53
- subcomparator = 'TimeUUIDType';
54
- create column family InvoicesByNumber with comparator = 'UTF8Type';
55
- create column family Payments with comparator = 'UTF8Type';
56
- create column family Appointments with comparator = 'UTF8Type';
42
+ use TypeConversions;
43
+ create column family UUIDColumnConversion with comparator = TimeUUIDType;
44
+ create column family SuperUUID with comparator = TimeUUIDType and column_type = Super;
45
+
File without changes
@@ -42,7 +42,7 @@ incremental_backups: false
42
42
  snapshot_before_compaction: false
43
43
  column_index_size_in_kb: 64
44
44
  in_memory_compaction_limit_in_mb: 64
45
- compaction_multithreading: false
45
+ concurrent_compactors: 1
46
46
  compaction_throughput_mb_per_sec: 16
47
47
  compaction_preheat_key_cache: true
48
48
  rpc_timeout_in_ms: 10000
File without changes
@@ -5,7 +5,16 @@
5
5
  "UserAudits":{
6
6
  "comparator_type":"org.apache.cassandra.db.marshal.UTF8Type",
7
7
  "column_type":"Standard"},
8
- "UserRelationships":{
8
+ "UserCounters":{
9
+ "comparator_type":"org.apache.cassandra.db.marshal.UTF8Type",
10
+ "column_type":"Standard",
11
+ "default_validation_class":"CounterColumnType"},
12
+ "UserCounterAggregates":{
13
+ "subcomparator_type":"org.apache.cassandra.db.marshal.UTF8Type",
14
+ "comparator_type":"org.apache.cassandra.db.marshal.UTF8Type",
15
+ "column_type":"Super",
16
+ "default_validation_class":"CounterColumnType"},
17
+ "UserRelationships":{
9
18
  "subcomparator_type":"org.apache.cassandra.db.marshal.TimeUUIDType",
10
19
  "comparator_type":"org.apache.cassandra.db.marshal.UTF8Type",
11
20
  "column_type":"Super"},
@@ -44,5 +53,14 @@
44
53
  "Comments":{
45
54
  "comparator_type":"org.apache.cassandra.db.marshal.LongType",
46
55
  "column_type":"Standard"}
56
+ },
57
+ "TypeConversions":{
58
+ "UUIDColumnConversion":{
59
+ "comparator_type":"org.apache.cassandra.db.marshal.TimeUUIDType",
60
+ "column_type":"Standard"},
61
+ "SuperUUID":{
62
+ "subcomparator_type":"org.apache.cassandra.db.marshal.TimeUUIDType",
63
+ "comparator_type":"org.apache.cassandra.db.marshal.TimeUUIDType",
64
+ "column_type":"Super"}
47
65
  }
48
66
  }
@@ -4,7 +4,13 @@ create keyspace Twitter with
4
4
  use Twitter;
5
5
  create column family Users with comparator = 'UTF8Type';
6
6
  create column family UserAudits with comparator = 'UTF8Type';
7
- create column family UserRelationships with
7
+ create column family UserCounters with comparator = 'UTF8Type' and
8
+ default_validation_class = CounterColumnType;
9
+ create column family UserCounterAggregates with column_type = 'Super'
10
+ and comparator = 'UTF8Type' and
11
+ subcomparator = 'UTF8Type' and
12
+ default_validation_class = CounterColumnType;
13
+ create column family UserRelationships with
8
14
  comparator = 'UTF8Type' and
9
15
  column_type = 'Super' and
10
16
  subcomparator = 'TimeUUIDType';
@@ -36,21 +42,10 @@ use MultiblogLong;
36
42
  create column family Blogs with comparator = 'LongType';
37
43
  create column family Comments with comparator = 'LongType';
38
44
 
39
- create keyspace CassandraObject with
45
+ create keyspace TypeConversions with
40
46
  placement_strategy = 'org.apache.cassandra.locator.LocalStrategy' AND
41
47
  strategy_options = [{replication_factor:1}];
42
- use CassandraObject;
43
- create column family Customers with comparator = 'UTF8Type';
44
- create column family CustomerRelationships with
45
- comparator = 'UTF8Type' AND
46
- column_type = 'Super' AND
47
- subcomparator = 'TimeUUIDType';
48
- create column family CustomersByLastName with comparator = 'TimeUUIDType';
49
- create column family Invoices with comparator = 'UTF8Type';
50
- create column family InvoiceRelationships with
51
- comparator = 'UTF8Type' AND
52
- column_type = 'Super' AND
53
- subcomparator = 'TimeUUIDType';
54
- create column family InvoicesByNumber with comparator = 'UTF8Type';
55
- create column family Payments with comparator = 'UTF8Type';
56
- create column family Appointments with comparator = 'UTF8Type';
48
+ use TypeConversions;
49
+ create column family UUIDColumnConversion with comparator = TimeUUIDType;
50
+ create column family SuperUUID with comparator = TimeUUIDType and column_type = Super;
51
+
@@ -25,13 +25,14 @@ require 'cassandra/comparable'
25
25
  require 'cassandra/long'
26
26
  require 'cassandra/ordered_hash'
27
27
  require 'cassandra/columns'
28
+ require 'cassandra/protocol'
28
29
  require "cassandra/#{Cassandra.VERSION}/columns"
29
30
  require "cassandra/#{Cassandra.VERSION}/protocol"
30
31
  require "cassandra/cassandra"
31
32
  require "cassandra/#{Cassandra.VERSION}/cassandra"
32
33
  unless Cassandra.VERSION.eql?("0.6")
33
- require "cassandra/#{Cassandra.VERSION}/column_family"
34
- require "cassandra/#{Cassandra.VERSION}/keyspace"
34
+ require "cassandra/column_family"
35
+ require "cassandra/keyspace"
35
36
  end
36
37
  require 'cassandra/constants'
37
38
  require 'cassandra/debug' if ENV['DEBUG']
File without changes
@@ -2,13 +2,40 @@ class Cassandra
2
2
  def self.DEFAULT_TRANSPORT_WRAPPER
3
3
  Thrift::BufferedTransport
4
4
  end
5
-
6
- ## Delete
7
5
 
8
- # Remove all rows in the column family you request. Supports options
9
- # <tt>:consistency</tt> and <tt>:timestamp</tt>.
10
- # FIXME May not currently delete all records without multiple calls. Waiting
11
- # for ranged remove support in Cassandra.
6
+ ##
7
+ # Issues a login attempt using the username and password specified.
8
+ #
9
+ # * username
10
+ # * password
11
+ #
12
+ def login!(username, password)
13
+ @auth_request = CassandraThrift::AuthenticationRequest.new
14
+ @auth_request.credentials = {'username' => username, 'password' => password}
15
+ client.login(@keyspace, @auth_request)
16
+ end
17
+
18
+ def inspect
19
+ "#<Cassandra:#{object_id}, @keyspace=#{keyspace.inspect}, @schema={#{
20
+ schema(false).map {|name, hash| ":#{name} => #{hash['type'].inspect}"}.join(', ')
21
+ }}, @servers=#{servers.inspect}>"
22
+ end
23
+
24
+ ##
25
+ # Returns an array of available keyspaces.
26
+ #
27
+ def keyspaces
28
+ @keyspaces ||= client.describe_keyspaces()
29
+ end
30
+
31
+ ##
32
+ # Remove all rows in the column family you request.
33
+ #
34
+ # * column_family
35
+ # * options
36
+ # * consitency
37
+ # * timestamp
38
+ #
12
39
  def clear_column_family!(column_family, options = {})
13
40
  each_key(column_family) do |key|
14
41
  remove(column_family, key, options)
@@ -24,6 +51,30 @@ class Cassandra
24
51
  schema.keys.each { |column_family| clear_column_family!(column_family, options) }
25
52
  end
26
53
 
54
+ # Open a batch operation and yield self. Inserts and deletes will be queued
55
+ # until the block closes, and then sent atomically to the server. Supports
56
+ # the <tt>:consistency</tt> option, which overrides the consistency set in
57
+ # the individual commands.
58
+ def batch(options = {})
59
+ _, _, _, options =
60
+ extract_and_validate_params(schema.keys.first, "", [options], WRITE_DEFAULTS)
61
+
62
+ @batch = []
63
+ yield(self)
64
+ compacted_map,seen_clevels = compact_mutations!
65
+ clevel = if options[:consistency] != nil # Override any clevel from individual mutations if
66
+ options[:consistency]
67
+ elsif seen_clevels.length > 1 # Cannot choose which CLevel to use if there are several ones
68
+ raise "Multiple consistency levels used in the batch, and no override...cannot pick one"
69
+ else # if no consistency override has been provided but all the clevels in the batch are the same: use that one
70
+ seen_clevels.first
71
+ end
72
+
73
+ _mutate(compacted_map,clevel)
74
+ ensure
75
+ @batch = nil
76
+ end
77
+
27
78
  protected
28
79
 
29
80
  def schema(load=true)
@@ -3,6 +3,25 @@ class Cassandra
3
3
  module Columns #:nodoc:
4
4
  private
5
5
 
6
+ def is_super(column_family)
7
+ @is_super[column_family] ||= column_family_property(column_family, 'Type') == "Super"
8
+ end
9
+
10
+ def column_name_class(column_family)
11
+ @column_name_class[column_family] ||= column_name_class_for_key(column_family, "CompareWith")
12
+ end
13
+
14
+ def sub_column_name_class(column_family)
15
+ @sub_column_name_class[column_family] ||= column_name_class_for_key(column_family, "CompareSubcolumnsWith")
16
+ end
17
+
18
+ def column_family_property(column_family, key)
19
+ unless schema[column_family]
20
+ raise AccessError, "Invalid column family \"#{column_family}\""
21
+ end
22
+ schema[column_family][key]
23
+ end
24
+
6
25
  def _standard_insert_mutation(column_family, column_name, value, timestamp, _=nil)
7
26
  CassandraThrift::Mutation.new(
8
27
  :column_or_supercolumn => CassandraThrift::ColumnOrSuperColumn.new(
@@ -19,6 +19,7 @@ class Cassandra
19
19
  )
20
20
  end
21
21
 
22
+ # FIXME: add support for start, stop, count functionality
22
23
  def _get_columns(column_family, key, columns, sub_columns, consistency)
23
24
  result = if is_super(column_family)
24
25
  if sub_columns
@@ -60,7 +61,7 @@ class Cassandra
60
61
  :count => count,
61
62
  :start => start,
62
63
  :finish => finish))
63
-
64
+
64
65
  if is_super(column_family) and column
65
66
  column_parent = CassandraThrift::ColumnParent.new(:column_family => column_family, :super_column => column)
66
67
  multi_sub_columns_to_hash!(column_family, client.multiget_slice(@keyspace, keys, column_parent, predicate, consistency))
File without changes
@@ -1,272 +1,2 @@
1
1
  class Cassandra
2
-
3
- def self.DEFAULT_TRANSPORT_WRAPPER
4
- Thrift::FramedTransport
5
- end
6
-
7
- def login!(username, password)
8
- @auth_request = CassandraThrift::AuthenticationRequest.new
9
- @auth_request.credentials = {'username' => username, 'password' => password}
10
- client.login(@auth_request)
11
- end
12
-
13
- def inspect
14
- "#<Cassandra:#{object_id}, @keyspace=#{keyspace.inspect}, @schema={#{
15
- Array(schema(false).cf_defs).map {|cfdef| ":#{cfdef.name} => #{cfdef.column_type}"}.join(', ')
16
- }}, @servers=#{servers.inspect}>"
17
- end
18
-
19
- def keyspace=(ks)
20
- client.set_keyspace(ks)
21
- @schema = nil; @keyspace = ks
22
- end
23
-
24
- def keyspaces
25
- client.describe_keyspaces.to_a.collect {|ksdef| ksdef.name }
26
- end
27
-
28
- def schema(load=true)
29
- if !load && !@schema
30
- Cassandra::Keyspace.new
31
- else
32
- @schema ||= client.describe_keyspace(@keyspace)
33
- end
34
- end
35
-
36
- def schema_agreement?
37
- client.describe_schema_versions().length == 1
38
- end
39
-
40
- def version
41
- client.describe_version()
42
- end
43
-
44
- def cluster_name
45
- @cluster_name ||= client.describe_cluster_name()
46
- end
47
-
48
- def ring
49
- client.describe_ring(@keyspace)
50
- end
51
-
52
- def partitioner
53
- client.describe_partitioner()
54
- end
55
-
56
- ## Delete
57
-
58
- # Remove all rows in the column family you request.
59
- def truncate!(column_family)
60
- client.truncate(column_family.to_s)
61
- end
62
- alias clear_column_family! truncate!
63
-
64
- # Remove all rows in the keyspace.
65
- def clear_keyspace!
66
- schema.cf_defs.each { |cfdef| truncate!(cfdef.name) }
67
- end
68
-
69
- ### Read
70
-
71
- def add_column_family(cf_def)
72
- begin
73
- res = client.system_add_column_family(cf_def)
74
- rescue CassandraThrift::TimedOutException => te
75
- puts "Timed out: #{te.inspect}"
76
- end
77
- @schema = nil
78
- res
79
- end
80
-
81
- def drop_column_family(cf_name)
82
- begin
83
- res = client.system_drop_column_family(cf_name)
84
- rescue CassandraThrift::TimedOutException => te
85
- puts "Timed out: #{te.inspect}"
86
- end
87
- @schema = nil
88
- res
89
- end
90
-
91
- def rename_column_family(old_name, new_name)
92
- begin
93
- res = client.system_rename_column_family(old_name, new_name)
94
- rescue CassandraThrift::TimedOutException => te
95
- puts "Timed out: #{te.inspect}"
96
- end
97
- @schema = nil
98
- res
99
- end
100
-
101
- def update_column_family(cf_def)
102
- begin
103
- res = client.system_update_column_family(cf_def)
104
- rescue CassandraThrift::TimedOutException => te
105
- puts "Timed out: #{te.inspect}"
106
- end
107
- @schema = nil
108
- res
109
- end
110
-
111
- def add_keyspace(ks_def)
112
- begin
113
- res = client.system_add_keyspace(ks_def)
114
- rescue CassandraThrift::TimedOutException => toe
115
- puts "Timed out: #{toe.inspect}"
116
- rescue Thrift::TransportException => te
117
- puts "Timed out: #{te.inspect}"
118
- end
119
- @keyspaces = nil
120
- res
121
- end
122
-
123
- def drop_keyspace(ks_name)
124
- begin
125
- res = client.system_drop_keyspace(ks_name)
126
- rescue CassandraThrift::TimedOutException => toe
127
- puts "Timed out: #{toe.inspect}"
128
- rescue Thrift::TransportException => te
129
- puts "Timed out: #{te.inspect}"
130
- end
131
- keyspace = "system" if ks_name.eql?(@keyspace)
132
- @keyspaces = nil
133
- res
134
- end
135
-
136
- def rename_keyspace(old_name, new_name)
137
- begin
138
- res = client.system_rename_keyspace(old_name, new_name)
139
- rescue CassandraThrift::TimedOutException => toe
140
- puts "Timed out: #{toe.inspect}"
141
- rescue Thrift::TransportException => te
142
- puts "Timed out: #{te.inspect}"
143
- end
144
- keyspace = new_name if old_name.eql?(@keyspace)
145
- @keyspaces = nil
146
- res
147
- end
148
-
149
- def update_keyspace(ks_def)
150
- begin
151
- res = client.system_update_keyspace(ks_def)
152
- rescue CassandraThrift::TimedOutException => toe
153
- puts "Timed out: #{toe.inspect}"
154
- rescue Thrift::TransportException => te
155
- puts "Timed out: #{te.inspect}"
156
- end
157
- @keyspaces = nil
158
- res
159
- end
160
-
161
- # Open a batch operation and yield self. Inserts and deletes will be queued
162
- # until the block closes, and then sent atomically to the server. Supports
163
- # the <tt>:consistency</tt> option, which overrides the consistency set in
164
- # the individual commands.
165
- def batch(options = {})
166
- _, _, _, options =
167
- extract_and_validate_params(schema.cf_defs.first.name, "", [options], WRITE_DEFAULTS)
168
-
169
- @batch = []
170
- yield(self)
171
- compacted_map,seen_clevels = compact_mutations!
172
- clevel = if options[:consistency] != nil # Override any clevel from individual mutations if
173
- options[:consistency]
174
- elsif seen_clevels.length > 1 # Cannot choose which CLevel to use if there are several ones
175
- raise "Multiple consistency levels used in the batch, and no override...cannot pick one"
176
- else # if no consistency override has been provided but all the clevels in the batch are the same: use that one
177
- seen_clevels.first
178
- end
179
-
180
- _mutate(compacted_map,clevel)
181
- ensure
182
- @batch = nil
183
- end
184
-
185
- ### 2ary Indexing
186
-
187
- def create_index(ks_name, cf_name, c_name, v_class)
188
- cf_def = client.describe_keyspace(ks_name).cf_defs.find{|x| x.name == cf_name}
189
- if !cf_def.nil? and !cf_def.column_metadata.find{|x| x.name == c_name}
190
- c_def = CassandraThrift::ColumnDef.new do |cd|
191
- cd.name = c_name
192
- cd.validation_class = "org.apache.cassandra.db.marshal."+v_class
193
- cd.index_type = CassandraThrift::IndexType::KEYS
194
- end
195
- cf_def.column_metadata.push(c_def)
196
- update_column_family(cf_def)
197
- end
198
- end
199
-
200
- def drop_index(ks_name, cf_name, c_name)
201
- cf_def = client.describe_keyspace(ks_name).cf_defs.find{|x| x.name == cf_name}
202
- if !cf_def.nil? and cf_def.column_metadata.find{|x| x.name == c_name}
203
- cf_def.column_metadata.delete_if{|x| x.name == c_name}
204
- update_column_family(cf_def)
205
- end
206
- end
207
-
208
- def create_idx_expr(c_name, value, op)
209
- CassandraThrift::IndexExpression.new(
210
- :column_name => c_name,
211
- :value => value,
212
- :op => (case op
213
- when nil, "EQ", "eq", "=="
214
- CassandraThrift::IndexOperator::EQ
215
- when "GTE", "gte", ">="
216
- CassandraThrift::IndexOperator::GTE
217
- when "GT", "gt", ">"
218
- CassandraThrift::IndexOperator::GT
219
- when "LTE", "lte", "<="
220
- CassandraThrift::IndexOperator::LTE
221
- when "LT", "lt", "<"
222
- CassandraThrift::IndexOperator::LT
223
- end ))
224
- end
225
-
226
- def create_idx_clause(idx_expressions, start = "")
227
- CassandraThrift::IndexClause.new(
228
- :start_key => start,
229
- :expressions => idx_expressions)
230
- end
231
-
232
- # TODO: Supercolumn support.
233
- def get_indexed_slices(column_family, idx_clause, *columns_and_options)
234
- column_family, columns, _, options =
235
- extract_and_validate_params(column_family, [], columns_and_options, READ_DEFAULTS)
236
- key_slices = _get_indexed_slices(column_family, idx_clause, columns, options[:count], options[:start],
237
- options[:finish], options[:reversed], options[:consistency])
238
-
239
- key_slices.inject({}){|h, key_slice| h[key_slice.key] = key_slice.columns; h}
240
- end
241
-
242
- protected
243
-
244
- def client
245
- if @client.nil? || @client.current_server.nil?
246
- reconnect!
247
- @client.set_keyspace(@keyspace)
248
- end
249
- @client
250
- end
251
-
252
- def reconnect!
253
- @servers = all_nodes
254
- @client = new_client
255
- end
256
-
257
- def all_nodes
258
- if @auto_discover_nodes && !@keyspace.eql?("system")
259
- temp_client = new_client
260
- begin
261
- ips = (temp_client.describe_ring(@keyspace).map {|range| range.endpoints}).flatten.uniq
262
- port = @servers.first.split(':').last
263
- ips.map{|ip| "#{ip}:#{port}" }
264
- ensure
265
- temp_client.disconnect!
266
- end
267
- else
268
- @servers
269
- end
270
- end
271
-
272
2
  end