cassilds 0.9.2 → 0.12.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 +51 -1
  2. data/LICENSE +0 -0
  3. data/Manifest +25 -7
  4. data/README.md +352 -0
  5. data/Rakefile +169 -1
  6. data/cassilds.gemspec +45 -0
  7. data/conf/{cassandra.in.sh → 0.6/cassandra.in.sh} +0 -0
  8. data/conf/{log4j.properties → 0.6/log4j.properties} +0 -0
  9. data/conf/0.6/schema.json +57 -0
  10. data/conf/{storage-conf.xml → 0.6/storage-conf.xml} +15 -5
  11. data/conf/0.7/cassandra.in.sh +46 -0
  12. data/conf/0.7/cassandra.yaml +336 -0
  13. data/conf/0.7/log4j-server.properties +41 -0
  14. data/conf/0.7/schema.json +57 -0
  15. data/conf/0.7/schema.txt +45 -0
  16. data/conf/0.8/cassandra.in.sh +41 -0
  17. data/conf/0.8/cassandra.yaml +61 -0
  18. data/conf/0.8/log4j-server.properties +40 -0
  19. data/conf/0.8/schema.json +66 -0
  20. data/conf/0.8/schema.txt +51 -0
  21. data/lib/cassandra/0.6/cassandra.rb +58 -13
  22. data/lib/cassandra/0.6/columns.rb +43 -0
  23. data/lib/cassandra/0.6/protocol.rb +16 -18
  24. data/lib/cassandra/0.6.rb +0 -0
  25. data/lib/cassandra/0.7/cassandra.rb +0 -270
  26. data/lib/cassandra/0.7/columns.rb +1 -64
  27. data/lib/cassandra/0.7/protocol.rb +0 -134
  28. data/lib/cassandra/0.7.rb +0 -0
  29. data/lib/cassandra/0.8/cassandra.rb +10 -0
  30. data/lib/cassandra/0.8/columns.rb +4 -0
  31. data/lib/cassandra/0.8/protocol.rb +23 -0
  32. data/lib/cassandra/0.8.rb +7 -0
  33. data/lib/cassandra/array.rb +0 -0
  34. data/lib/cassandra/cassandra.rb +877 -111
  35. data/lib/cassandra/{0.7/column_family.rb → column_family.rb} +0 -0
  36. data/lib/cassandra/columns.rb +72 -6
  37. data/lib/cassandra/comparable.rb +0 -0
  38. data/lib/cassandra/constants.rb +0 -0
  39. data/lib/cassandra/debug.rb +0 -0
  40. data/lib/cassandra/helpers.rb +1 -0
  41. data/lib/cassandra/{0.7/keyspace.rb → keyspace.rb} +0 -0
  42. data/lib/cassandra/long.rb +5 -0
  43. data/lib/cassandra/mock.rb +259 -85
  44. data/lib/cassandra/ordered_hash.rb +10 -18
  45. data/lib/cassandra/protocol.rb +120 -0
  46. data/lib/cassandra/time.rb +0 -0
  47. data/lib/cassandra.rb +6 -7
  48. data/test/cassandra_client_test.rb +0 -0
  49. data/test/cassandra_mock_test.rb +52 -28
  50. data/test/cassandra_test.rb +465 -44
  51. data/test/comparable_types_test.rb +0 -0
  52. data/test/eventmachine_test.rb +30 -30
  53. data/test/ordered_hash_test.rb +6 -0
  54. data/test/test_helper.rb +3 -2
  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 +4 -2
  61. data/vendor/0.8/gen-rb/cassandra.rb +2215 -0
  62. data/vendor/0.8/gen-rb/cassandra_constants.rb +12 -0
  63. data/vendor/0.8/gen-rb/cassandra_types.rb +816 -0
  64. metadata +50 -27
  65. data/README.rdoc +0 -83
  66. data/cassandra.gemspec +0 -46
  67. data/conf/cassandra.yaml +0 -113
@@ -0,0 +1,120 @@
1
+ class Cassandra
2
+ # Inner methods for actually doing the Thrift calls
3
+ module Protocol #:nodoc:
4
+ private
5
+
6
+ def _mutate(mutation_map, consistency_level)
7
+ client.batch_mutate(mutation_map, consistency_level)
8
+ end
9
+
10
+ def _remove(key, column_path, timestamp, consistency_level)
11
+ client.remove(key, column_path, timestamp, consistency_level)
12
+ end
13
+
14
+ def _count_columns(column_family, key, super_column, start, stop, count, consistency)
15
+ client.get_count(key,
16
+ CassandraThrift::ColumnParent.new(:column_family => column_family, :super_column => super_column),
17
+ CassandraThrift::SlicePredicate.new(:slice_range =>
18
+ CassandraThrift::SliceRange.new(
19
+ :start => start || '',
20
+ :finish => stop || '',
21
+ :count => count || 100
22
+ )),
23
+ consistency
24
+ )
25
+ end
26
+
27
+ # FIXME: Add support for start, stop, count
28
+ def _get_columns(column_family, key, columns, sub_columns, consistency)
29
+ result = if is_super(column_family)
30
+ if sub_columns
31
+ columns_to_hash(column_family, client.get_slice(key,
32
+ CassandraThrift::ColumnParent.new(:column_family => column_family, :super_column => columns),
33
+ CassandraThrift::SlicePredicate.new(:column_names => sub_columns),
34
+ consistency))
35
+ else
36
+ columns_to_hash(column_family, client.get_slice(key,
37
+ CassandraThrift::ColumnParent.new(:column_family => column_family),
38
+ CassandraThrift::SlicePredicate.new(:column_names => columns),
39
+ consistency))
40
+ end
41
+ else
42
+ columns_to_hash(column_family, client.get_slice(key,
43
+ CassandraThrift::ColumnParent.new(:column_family => column_family),
44
+ CassandraThrift::SlicePredicate.new(:column_names => columns),
45
+ consistency))
46
+ end
47
+
48
+ klass = column_name_class(column_family)
49
+ (sub_columns || columns).map { |name| result[klass.new(name)] }
50
+ end
51
+
52
+ def _multiget(column_family, keys, column, sub_column, start, finish, count, reversed, consistency)
53
+ # Single values; count and range parameters have no effect
54
+ if is_super(column_family) and sub_column
55
+ predicate = CassandraThrift::SlicePredicate.new(:column_names => [sub_column])
56
+ column_parent = CassandraThrift::ColumnParent.new(:column_family => column_family, :super_column => column)
57
+ column_hash = multi_sub_columns_to_hash!(column_family, client.multiget_slice(keys, column_parent, predicate, consistency))
58
+
59
+ klass = sub_column_name_class(column_family)
60
+ keys.inject({}){|hash, key| hash[key] = column_hash[key][klass.new(sub_column)]; hash}
61
+ elsif !is_super(column_family) and column
62
+ predicate = CassandraThrift::SlicePredicate.new(:column_names => [column])
63
+ column_parent = CassandraThrift::ColumnParent.new(:column_family => column_family)
64
+ column_hash = multi_columns_to_hash!(column_family, client.multiget_slice(keys, column_parent, predicate, consistency))
65
+
66
+ klass = column_name_class(column_family)
67
+ keys.inject({}){|hash, key| hash[key] = column_hash[key][klass.new(column)]; hash}
68
+
69
+ # Slices
70
+ else
71
+ predicate = CassandraThrift::SlicePredicate.new(:slice_range =>
72
+ CassandraThrift::SliceRange.new(
73
+ :reversed => reversed,
74
+ :count => count,
75
+ :start => start,
76
+ :finish => finish))
77
+
78
+ if is_super(column_family) and column
79
+ column_parent = CassandraThrift::ColumnParent.new(:column_family => column_family, :super_column => column)
80
+ multi_sub_columns_to_hash!(column_family, client.multiget_slice(keys, column_parent, predicate, consistency))
81
+ else
82
+ column_parent = CassandraThrift::ColumnParent.new(:column_family => column_family)
83
+ multi_columns_to_hash!(column_family, client.multiget_slice(keys, column_parent, predicate, consistency))
84
+ end
85
+ end
86
+ end
87
+
88
+ def _get_range(column_family, start_key, finish_key, key_count, columns, start, finish, count, consistency, reversed=false)
89
+ column_parent = CassandraThrift::ColumnParent.new(:column_family => column_family)
90
+ predicate = if columns
91
+ CassandraThrift::SlicePredicate.new(:column_names => columns)
92
+ else
93
+ CassandraThrift::SlicePredicate.new(:slice_range =>
94
+ CassandraThrift::SliceRange.new(
95
+ :start => start,
96
+ :finish => finish,
97
+ :count => count,
98
+ :reversed => reversed))
99
+ end
100
+ range = CassandraThrift::KeyRange.new(:start_key => start_key, :end_key => finish_key, :count => key_count)
101
+ client.get_range_slices(column_parent, predicate, range, consistency)
102
+ end
103
+
104
+ # TODO: Supercolumn support
105
+ def _get_indexed_slices(column_family, index_clause, column, count, start, finish, reversed, consistency)
106
+ column_parent = CassandraThrift::ColumnParent.new(:column_family => column_family)
107
+ if column
108
+ predicate = CassandraThrift::SlicePredicate.new(:column_names => [column])
109
+ else
110
+ predicate = CassandraThrift::SlicePredicate.new(:slice_range =>
111
+ CassandraThrift::SliceRange.new(
112
+ :reversed => reversed,
113
+ :count => count,
114
+ :start => start,
115
+ :finish => finish))
116
+ end
117
+ client.get_indexed_slices(column_parent, index_clause, predicate, consistency)
118
+ end
119
+ end
120
+ end
File without changes
data/lib/cassandra.rb CHANGED
@@ -1,9 +1,7 @@
1
1
  require 'rubygems'
2
- gem 'thrift', '>= 0.5.0'
3
- require 'thrift'
4
- gem 'thrift_client', '>= 0.6.0'
2
+ gem 'thrift_client', '~> 0.7.0'
5
3
  require 'thrift_client'
6
- gem 'simple_uuid' , '>= 0.1.0'
4
+ gem 'simple_uuid' , '~> 0.2.0'
7
5
  require 'simple_uuid'
8
6
 
9
7
  require 'json' unless defined?(JSON)
@@ -12,7 +10,7 @@ here = File.expand_path(File.dirname(__FILE__))
12
10
 
13
11
  class Cassandra ; end
14
12
  unless Cassandra.respond_to?(:VERSION)
15
- require "#{here}/cassandra/0.7"
13
+ require "#{here}/cassandra/0.8"
16
14
  end
17
15
 
18
16
  $LOAD_PATH << "#{here}/../vendor/#{Cassandra.VERSION}/gen-rb"
@@ -27,13 +25,14 @@ require 'cassandra/comparable'
27
25
  require 'cassandra/long'
28
26
  require 'cassandra/ordered_hash'
29
27
  require 'cassandra/columns'
28
+ require 'cassandra/protocol'
30
29
  require "cassandra/#{Cassandra.VERSION}/columns"
31
30
  require "cassandra/#{Cassandra.VERSION}/protocol"
32
31
  require "cassandra/cassandra"
33
32
  require "cassandra/#{Cassandra.VERSION}/cassandra"
34
33
  unless Cassandra.VERSION.eql?("0.6")
35
- require "cassandra/#{Cassandra.VERSION}/column_family"
36
- require "cassandra/#{Cassandra.VERSION}/keyspace"
34
+ require "cassandra/column_family"
35
+ require "cassandra/keyspace"
37
36
  end
38
37
  require 'cassandra/constants'
39
38
  require 'cassandra/debug' if ENV['DEBUG']
File without changes
@@ -1,21 +1,25 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
- require 'cassandra_test'
2
+ require File.expand_path(File.dirname(__FILE__) + '/cassandra_test')
3
3
  require 'cassandra/mock'
4
+ require 'json'
4
5
 
5
6
  class CassandraMockTest < CassandraTest
6
7
  include Cassandra::Constants
7
8
 
8
9
  def setup
9
- storage_xml_path = File.expand_path(File.join(File.dirname(File.dirname(__FILE__)), 'conf', 'storage-conf.xml'))
10
- @twitter = Cassandra::Mock.new('Twitter', storage_xml_path)
10
+ @test_schema = JSON.parse(File.read(File.join(File.expand_path(File.dirname(__FILE__)), '..','conf', CASSANDRA_VERSION, 'schema.json')))
11
+ @twitter = Cassandra::Mock.new('Twitter', @test_schema)
11
12
  @twitter.clear_keyspace!
12
13
 
13
- @blogs = Cassandra::Mock.new('Multiblog', storage_xml_path)
14
+ @blogs = Cassandra::Mock.new('Multiblog', @test_schema)
14
15
  @blogs.clear_keyspace!
15
16
 
16
- @blogs_long = Cassandra::Mock.new('MultiblogLong', storage_xml_path)
17
+ @blogs_long = Cassandra::Mock.new('MultiblogLong', @test_schema)
17
18
  @blogs_long.clear_keyspace!
18
19
 
20
+ @type_conversions = Cassandra::Mock.new('TypeConversions', @test_schema)
21
+ @type_conversions.clear_keyspace!
22
+
19
23
  @uuids = (0..6).map {|i| SimpleUUID::UUID.new(Time.at(2**(24+i))) }
20
24
  @longs = (0..6).map {|i| Long.new(Time.at(2**(24+i))) }
21
25
  end
@@ -27,28 +31,7 @@ class CassandraMockTest < CassandraTest
27
31
  end
28
32
 
29
33
  def test_schema_for_keyspace
30
- data = {
31
- "StatusRelationships"=>{
32
- "CompareSubcolumnsWith"=>"org.apache.cassandra.db.marshal.TimeUUIDType",
33
- "CompareWith"=>"org.apache.cassandra.db.marshal.UTF8Type",
34
- "Type"=>"Super"},
35
- "StatusAudits"=>{
36
- "CompareWith"=>"org.apache.cassandra.db.marshal.UTF8Type",
37
- "Type"=>"Standard"},
38
- "Statuses"=>{
39
- "CompareWith"=>"org.apache.cassandra.db.marshal.UTF8Type",
40
- "Type"=>"Standard"},
41
- "UserRelationships"=>{
42
- "CompareSubcolumnsWith"=>"org.apache.cassandra.db.marshal.TimeUUIDType",
43
- "CompareWith"=>"org.apache.cassandra.db.marshal.UTF8Type",
44
- "Type"=>"Super"},
45
- "UserAudits"=>{
46
- "CompareWith"=>"org.apache.cassandra.db.marshal.UTF8Type",
47
- "Type"=>"Standard"},
48
- "Users"=>{"CompareWith"=>"org.apache.cassandra.db.marshal.UTF8Type", "Type"=>"Standard"},
49
- "TimelinishThings"=>
50
- {"CompareWith"=>"org.apache.cassandra.db.marshal.BytesType", "Type"=>"Standard"}
51
- }
34
+ data = @test_schema['Twitter']
52
35
  stuff = @twitter.send(:schema_for_keyspace, 'Twitter')
53
36
  data.keys.each do |k|
54
37
  assert_equal data[k], stuff[k], k
@@ -58,7 +41,48 @@ class CassandraMockTest < CassandraTest
58
41
  def test_sorting_row_keys
59
42
  @twitter.insert(:Statuses, 'b', {:text => 'foo'})
60
43
  @twitter.insert(:Statuses, 'a', {:text => 'foo'})
61
- assert_equal ['a'], @twitter.get_range(:Statuses, :count => 1)
44
+ assert_equal ['a'], @twitter.get_range(:Statuses, :key_count => 1).keys
45
+ end
46
+
47
+ def test_get_range_reversed
48
+ data = 3.times.map { |i| ["body-#{i.to_s}", "v"] }
49
+ hash = Cassandra::OrderedHash[data]
50
+ reversed_hash = Cassandra::OrderedHash[data.reverse]
51
+
52
+ @twitter.insert(:Statuses, "all-keys", hash)
53
+
54
+ columns = @twitter.get_range(:Statuses, :reversed => true)["all-keys"]
55
+ columns.each do |column|
56
+ assert_equal reversed_hash.shift, column
57
+ end
58
+ end
59
+
60
+ def test_get_range_reversed_slice
61
+ data = 4.times.map { |i| ["body-#{i.to_s}", "v"] }
62
+ hash = Cassandra::OrderedHash[data]
63
+ sliced_hash = Cassandra::OrderedHash[data.reverse[1..-1]]
64
+
65
+ @twitter.insert(:Statuses, "all-keys", hash)
66
+
67
+ columns = @twitter.get_range(
68
+ :Statuses,
69
+ :start => sliced_hash.keys.first,
70
+ :reversed => true
71
+ )["all-keys"]
72
+
73
+ columns.each do |column|
74
+ assert_equal sliced_hash.shift, column
75
+ end
76
+ end
77
+
78
+ def test_get_range_count
79
+ data = 3.times.map { |i| ["body-#{i.to_s}", "v"] }
80
+ hash = Cassandra::OrderedHash[data]
81
+
82
+ @twitter.insert(:Statuses, "all-keys", hash)
83
+
84
+ columns = @twitter.get_range(:Statuses, :count => 2)["all-keys"]
85
+ assert_equal 2, columns.count
62
86
  end
63
87
 
64
88
  def test_inserting_array_for_indices