cassandra 0.11.0 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
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