cassandra-driver 3.0.0.beta.1-java → 3.0.0-java

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 (138) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +106 -39
  3. data/lib/cassandra.rb +396 -148
  4. data/lib/cassandra/address_resolution.rb +1 -1
  5. data/lib/cassandra/address_resolution/policies/ec2_multi_region.rb +1 -1
  6. data/lib/cassandra/address_resolution/policies/none.rb +1 -1
  7. data/lib/cassandra/aggregate.rb +21 -7
  8. data/lib/cassandra/argument.rb +2 -2
  9. data/lib/cassandra/attr_boolean.rb +33 -0
  10. data/lib/cassandra/auth.rb +6 -5
  11. data/lib/cassandra/auth/providers.rb +1 -1
  12. data/lib/cassandra/auth/providers/password.rb +5 -13
  13. data/lib/cassandra/cassandra_logger.rb +80 -0
  14. data/lib/cassandra/cluster.rb +49 -9
  15. data/lib/cassandra/cluster/client.rb +835 -209
  16. data/lib/cassandra/cluster/connection_pool.rb +2 -2
  17. data/lib/cassandra/cluster/connector.rb +86 -27
  18. data/lib/cassandra/cluster/control_connection.rb +222 -95
  19. data/lib/cassandra/cluster/failed_connection.rb +1 -1
  20. data/lib/cassandra/cluster/metadata.rb +14 -8
  21. data/lib/cassandra/cluster/options.rb +68 -22
  22. data/lib/cassandra/cluster/registry.rb +81 -17
  23. data/lib/cassandra/cluster/schema.rb +70 -8
  24. data/lib/cassandra/cluster/schema/cql_type_parser.rb +15 -10
  25. data/lib/cassandra/cluster/schema/fetchers.rb +601 -241
  26. data/lib/cassandra/cluster/schema/fqcn_type_parser.rb +39 -38
  27. data/lib/cassandra/cluster/schema/partitioners.rb +1 -1
  28. data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +6 -8
  29. data/lib/cassandra/cluster/schema/partitioners/ordered.rb +1 -1
  30. data/lib/cassandra/cluster/schema/partitioners/random.rb +1 -1
  31. data/lib/cassandra/cluster/schema/replication_strategies.rb +1 -1
  32. data/lib/cassandra/cluster/schema/replication_strategies/network_topology.rb +19 -18
  33. data/lib/cassandra/cluster/schema/replication_strategies/none.rb +1 -1
  34. data/lib/cassandra/cluster/schema/replication_strategies/simple.rb +1 -1
  35. data/lib/cassandra/column.rb +4 -23
  36. data/lib/cassandra/column_container.rb +322 -0
  37. data/lib/cassandra/compression.rb +1 -1
  38. data/lib/cassandra/compression/compressors/lz4.rb +7 -8
  39. data/lib/cassandra/compression/compressors/snappy.rb +4 -3
  40. data/lib/cassandra/driver.rb +107 -46
  41. data/lib/cassandra/errors.rb +303 -52
  42. data/lib/cassandra/execution/info.rb +16 -5
  43. data/lib/cassandra/execution/options.rb +102 -55
  44. data/lib/cassandra/execution/trace.rb +16 -9
  45. data/lib/cassandra/executors.rb +1 -1
  46. data/lib/cassandra/function.rb +19 -13
  47. data/lib/cassandra/function_collection.rb +85 -0
  48. data/lib/cassandra/future.rb +101 -49
  49. data/lib/cassandra/host.rb +25 -5
  50. data/lib/cassandra/index.rb +118 -0
  51. data/lib/cassandra/keyspace.rb +169 -33
  52. data/lib/cassandra/listener.rb +1 -1
  53. data/lib/cassandra/load_balancing.rb +2 -2
  54. data/lib/cassandra/load_balancing/policies.rb +1 -1
  55. data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +39 -25
  56. data/lib/cassandra/load_balancing/policies/round_robin.rb +8 -1
  57. data/lib/cassandra/load_balancing/policies/token_aware.rb +22 -13
  58. data/lib/cassandra/load_balancing/policies/white_list.rb +18 -5
  59. data/lib/cassandra/materialized_view.rb +90 -0
  60. data/lib/cassandra/null_logger.rb +27 -6
  61. data/lib/cassandra/protocol.rb +1 -1
  62. data/lib/cassandra/protocol/coder.rb +81 -42
  63. data/lib/cassandra/protocol/cql_byte_buffer.rb +58 -44
  64. data/lib/cassandra/protocol/cql_protocol_handler.rb +57 -54
  65. data/lib/cassandra/protocol/request.rb +6 -7
  66. data/lib/cassandra/protocol/requests/auth_response_request.rb +3 -3
  67. data/lib/cassandra/protocol/requests/batch_request.rb +17 -8
  68. data/lib/cassandra/protocol/requests/credentials_request.rb +3 -3
  69. data/lib/cassandra/protocol/requests/execute_request.rb +39 -20
  70. data/lib/cassandra/protocol/requests/options_request.rb +1 -1
  71. data/lib/cassandra/protocol/requests/prepare_request.rb +5 -5
  72. data/lib/cassandra/protocol/requests/query_request.rb +28 -23
  73. data/lib/cassandra/protocol/requests/register_request.rb +2 -2
  74. data/lib/cassandra/protocol/requests/startup_request.rb +8 -8
  75. data/lib/cassandra/protocol/requests/void_query_request.rb +1 -1
  76. data/lib/cassandra/protocol/response.rb +3 -4
  77. data/lib/cassandra/protocol/responses/already_exists_error_response.rb +12 -2
  78. data/lib/cassandra/protocol/responses/auth_challenge_response.rb +4 -5
  79. data/lib/cassandra/protocol/responses/auth_success_response.rb +4 -5
  80. data/lib/cassandra/protocol/responses/authenticate_response.rb +4 -5
  81. data/lib/cassandra/protocol/responses/error_response.rb +104 -17
  82. data/lib/cassandra/protocol/responses/event_response.rb +3 -4
  83. data/lib/cassandra/protocol/responses/function_failure_error_response.rb +13 -2
  84. data/lib/cassandra/protocol/responses/prepared_result_response.rb +14 -9
  85. data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +14 -9
  86. data/lib/cassandra/protocol/responses/read_failure_error_response.rb +26 -4
  87. data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +22 -3
  88. data/lib/cassandra/protocol/responses/ready_response.rb +6 -7
  89. data/lib/cassandra/protocol/responses/result_response.rb +11 -10
  90. data/lib/cassandra/protocol/responses/rows_result_response.rb +8 -7
  91. data/lib/cassandra/protocol/responses/schema_change_event_response.rb +8 -8
  92. data/lib/cassandra/protocol/responses/schema_change_result_response.rb +19 -13
  93. data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +5 -6
  94. data/lib/cassandra/protocol/responses/status_change_event_response.rb +5 -6
  95. data/lib/cassandra/protocol/responses/supported_response.rb +4 -5
  96. data/lib/cassandra/protocol/responses/topology_change_event_response.rb +4 -5
  97. data/lib/cassandra/protocol/responses/unavailable_error_response.rb +20 -3
  98. data/lib/cassandra/protocol/responses/unprepared_error_response.rb +11 -2
  99. data/lib/cassandra/protocol/responses/void_result_response.rb +4 -5
  100. data/lib/cassandra/protocol/responses/write_failure_error_response.rb +26 -4
  101. data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +22 -3
  102. data/lib/cassandra/protocol/v1.rb +98 -37
  103. data/lib/cassandra/protocol/v3.rb +121 -50
  104. data/lib/cassandra/protocol/v4.rb +172 -68
  105. data/lib/cassandra/reconnection.rb +1 -1
  106. data/lib/cassandra/reconnection/policies.rb +1 -1
  107. data/lib/cassandra/reconnection/policies/constant.rb +2 -4
  108. data/lib/cassandra/reconnection/policies/exponential.rb +6 -6
  109. data/lib/cassandra/result.rb +55 -20
  110. data/lib/cassandra/retry.rb +8 -8
  111. data/lib/cassandra/retry/policies.rb +1 -1
  112. data/lib/cassandra/retry/policies/default.rb +1 -1
  113. data/lib/cassandra/retry/policies/downgrading_consistency.rb +4 -2
  114. data/lib/cassandra/retry/policies/fallthrough.rb +1 -1
  115. data/lib/cassandra/session.rb +24 -16
  116. data/lib/cassandra/statement.rb +1 -1
  117. data/lib/cassandra/statements.rb +1 -1
  118. data/lib/cassandra/statements/batch.rb +16 -10
  119. data/lib/cassandra/statements/bound.rb +10 -3
  120. data/lib/cassandra/statements/prepared.rb +62 -18
  121. data/lib/cassandra/statements/simple.rb +23 -10
  122. data/lib/cassandra/statements/void.rb +1 -1
  123. data/lib/cassandra/table.rb +53 -185
  124. data/lib/cassandra/time.rb +11 -6
  125. data/lib/cassandra/time_uuid.rb +12 -14
  126. data/lib/cassandra/timestamp_generator.rb +37 -0
  127. data/lib/cassandra/timestamp_generator/simple.rb +38 -0
  128. data/lib/cassandra/timestamp_generator/ticking_on_duplicate.rb +58 -0
  129. data/lib/cassandra/tuple.rb +4 -4
  130. data/lib/cassandra/types.rb +109 -71
  131. data/lib/cassandra/udt.rb +66 -50
  132. data/lib/cassandra/util.rb +155 -15
  133. data/lib/cassandra/uuid.rb +20 -21
  134. data/lib/cassandra/uuid/generator.rb +7 -5
  135. data/lib/cassandra/version.rb +2 -2
  136. data/lib/cassandra_murmur3.jar +0 -0
  137. data/lib/datastax/cassandra.rb +1 -1
  138. metadata +27 -16
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -26,31 +26,31 @@ module Cassandra
26
26
  Result = Struct.new(:results, :collections)
27
27
 
28
28
  @@types = {
29
- "org.apache.cassandra.db.marshal.AsciiType" => :ascii,
30
- "org.apache.cassandra.db.marshal.LongType" => :bigint,
31
- "org.apache.cassandra.db.marshal.BytesType" => :blob,
32
- "org.apache.cassandra.db.marshal.BooleanType" => :boolean,
33
- "org.apache.cassandra.db.marshal.CounterColumnType" => :counter,
34
- "org.apache.cassandra.db.marshal.DecimalType" => :decimal,
35
- "org.apache.cassandra.db.marshal.DoubleType" => :double,
36
- "org.apache.cassandra.db.marshal.FloatType" => :float,
37
- "org.apache.cassandra.db.marshal.InetAddressType" => :inet,
38
- "org.apache.cassandra.db.marshal.Int32Type" => :int,
39
- "org.apache.cassandra.db.marshal.UTF8Type" => :text,
40
- "org.apache.cassandra.db.marshal.TimestampType" => :timestamp,
41
- "org.apache.cassandra.db.marshal.DateType" => :timestamp,
42
- "org.apache.cassandra.db.marshal.UUIDType" => :uuid,
43
- "org.apache.cassandra.db.marshal.IntegerType" => :varint,
44
- "org.apache.cassandra.db.marshal.TimeUUIDType" => :timeuuid,
45
- "org.apache.cassandra.db.marshal.MapType" => :map,
46
- "org.apache.cassandra.db.marshal.SetType" => :set,
47
- "org.apache.cassandra.db.marshal.ListType" => :list,
48
- "org.apache.cassandra.db.marshal.UserType" => :udt,
49
- "org.apache.cassandra.db.marshal.TupleType" => :tuple,
50
- "org.apache.cassandra.db.marshal.ShortType" => :smallint,
51
- "org.apache.cassandra.db.marshal.ByteType" => :tinyint,
52
- "org.apache.cassandra.db.marshal.TimeType" => :time,
53
- "org.apache.cassandra.db.marshal.SimpleDateType" => :date,
29
+ 'org.apache.cassandra.db.marshal.AsciiType' => :ascii,
30
+ 'org.apache.cassandra.db.marshal.LongType' => :bigint,
31
+ 'org.apache.cassandra.db.marshal.BytesType' => :blob,
32
+ 'org.apache.cassandra.db.marshal.BooleanType' => :boolean,
33
+ 'org.apache.cassandra.db.marshal.CounterColumnType' => :counter,
34
+ 'org.apache.cassandra.db.marshal.DecimalType' => :decimal,
35
+ 'org.apache.cassandra.db.marshal.DoubleType' => :double,
36
+ 'org.apache.cassandra.db.marshal.FloatType' => :float,
37
+ 'org.apache.cassandra.db.marshal.InetAddressType' => :inet,
38
+ 'org.apache.cassandra.db.marshal.Int32Type' => :int,
39
+ 'org.apache.cassandra.db.marshal.UTF8Type' => :text,
40
+ 'org.apache.cassandra.db.marshal.TimestampType' => :timestamp,
41
+ 'org.apache.cassandra.db.marshal.DateType' => :timestamp,
42
+ 'org.apache.cassandra.db.marshal.UUIDType' => :uuid,
43
+ 'org.apache.cassandra.db.marshal.IntegerType' => :varint,
44
+ 'org.apache.cassandra.db.marshal.TimeUUIDType' => :timeuuid,
45
+ 'org.apache.cassandra.db.marshal.MapType' => :map,
46
+ 'org.apache.cassandra.db.marshal.SetType' => :set,
47
+ 'org.apache.cassandra.db.marshal.ListType' => :list,
48
+ 'org.apache.cassandra.db.marshal.UserType' => :udt,
49
+ 'org.apache.cassandra.db.marshal.TupleType' => :tuple,
50
+ 'org.apache.cassandra.db.marshal.ShortType' => :smallint,
51
+ 'org.apache.cassandra.db.marshal.ByteType' => :tinyint,
52
+ 'org.apache.cassandra.db.marshal.TimeType' => :time,
53
+ 'org.apache.cassandra.db.marshal.SimpleDateType' => :date
54
54
  }.freeze
55
55
 
56
56
  def parse(string)
@@ -63,15 +63,16 @@ module Cassandra
63
63
  collections = nil
64
64
  results = []
65
65
 
66
- if node.name == "org.apache.cassandra.db.marshal.CompositeType"
66
+ if node.name == 'org.apache.cassandra.db.marshal.CompositeType'
67
67
  collections = {}
68
68
 
69
- if node.children.last.name == "org.apache.cassandra.db.marshal.ColumnToCollectionType"
69
+ if node.children.last.name ==
70
+ 'org.apache.cassandra.db.marshal.ColumnToCollectionType'
70
71
  node.children.pop.children.each do |child|
71
- key, name = child.name.split(":")
72
+ key, name = child.name.split(':')
72
73
  key = [key].pack('H*').force_encoding(::Encoding::UTF_8)
73
74
 
74
- if name == "org.apache.cassandra.db.marshal.ReversedType"
75
+ if name == 'org.apache.cassandra.db.marshal.ReversedType'
75
76
  collections[key] = lookup_type(child.children.first)
76
77
  else
77
78
  child.name = name
@@ -94,12 +95,12 @@ module Cassandra
94
95
  order = :asc
95
96
  frozen = false
96
97
 
97
- if node.name == "org.apache.cassandra.db.marshal.ReversedType"
98
+ if node.name == 'org.apache.cassandra.db.marshal.ReversedType'
98
99
  order = :desc
99
100
  node = node.children.first
100
101
  end
101
102
 
102
- if node.name == "org.apache.cassandra.db.marshal.FrozenType"
103
+ if node.name == 'org.apache.cassandra.db.marshal.FrozenType'
103
104
  frozen = true
104
105
  node = node.children.first
105
106
  end
@@ -108,11 +109,11 @@ module Cassandra
108
109
  end
109
110
 
110
111
  def lookup_type(node)
111
- if node.name == "org.apache.cassandra.db.marshal.FrozenType"
112
- return lookup_type(node.children.first)
113
- end
112
+ return lookup_type(node.children.first) if node.name == 'org.apache.cassandra.db.marshal.FrozenType'
114
113
 
115
- type = @@types.fetch(node.name) { return Cassandra::Types.custom(dump_node(node)) }
114
+ type = @@types.fetch(node.name) do
115
+ return Cassandra::Types.custom(dump_node(node))
116
+ end
116
117
 
117
118
  case type
118
119
  when :set, :list
@@ -123,7 +124,7 @@ module Cassandra
123
124
  keyspace = node.children.shift.name
124
125
  name = [node.children.shift.name].pack('H*')
125
126
  fields = node.children.map do |child|
126
- field_name, child_name = child.name.split(":")
127
+ field_name, child_name = child.name.split(':')
127
128
 
128
129
  child.name = child_name
129
130
  field_name = [field_name].pack('H*').force_encoding(::Encoding::UTF_8)
@@ -166,7 +167,7 @@ module Cassandra
166
167
 
167
168
  def dump_node(node)
168
169
  str = node.name
169
- str << '(' + node.children.map {|n| dump_node(n)}.join(',') + ')' unless node.children.empty?
170
+ str << '(' + node.children.map { |n| dump_node(n) }.join(',') + ')' unless node.children.empty?
170
171
  str
171
172
  end
172
173
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -23,6 +23,11 @@ module Cassandra
23
23
  module Partitioners
24
24
  # @private
25
25
  class Murmur3
26
+ # @private
27
+ LONG_MIN = -2**63
28
+ # @private
29
+ LONG_MAX = 2**63 - 1
30
+
26
31
  def create_token(partition_key)
27
32
  token = Cassandra::Murmur3.hash(partition_key)
28
33
  token = LONG_MAX if token == LONG_MIN
@@ -33,13 +38,6 @@ module Cassandra
33
38
  def parse_token(token_string)
34
39
  token_string.to_i
35
40
  end
36
-
37
- private
38
-
39
- # @private
40
- LONG_MIN = -2 ** 63
41
- # @private
42
- LONG_MAX = 2 ** 63 - 1
43
41
  end
44
42
  end
45
43
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -34,7 +34,7 @@ module Cassandra
34
34
  racks[host.datacenter] ||= ::Set.new
35
35
  racks[host.datacenter].add(host.rack)
36
36
 
37
- datacenter_token_rings[host.datacenter] ||= Hash.new
37
+ datacenter_token_rings[host.datacenter] ||= {}
38
38
  datacenter_token_rings[host.datacenter][i] = token
39
39
  end
40
40
 
@@ -48,8 +48,11 @@ module Cassandra
48
48
  replication_options.each do |datacenter, factor|
49
49
  ring = datacenter_token_rings[datacenter]
50
50
  next unless ring
51
- factor = [Integer(factor), ring.size].min rescue next
52
-
51
+ factor = begin
52
+ [Integer(factor), ring.size].min
53
+ rescue
54
+ next
55
+ end
53
56
 
54
57
  total_racks = racks[datacenter].size
55
58
  visited_racks = visited[datacenter] ||= ::Set.new
@@ -68,21 +71,19 @@ module Cassandra
68
71
  if rack.nil? || visited_racks.size == total_racks
69
72
  replicas << host
70
73
  added_replicas << host
74
+ elsif visited_racks.include?(rack)
75
+ skipped_hosts << host
71
76
  else
72
- if visited_racks.include?(rack)
73
- skipped_hosts << host
74
- else
75
- replicas << host
76
- visited_racks << rack
77
- added_replicas << host
78
-
79
- if visited_racks.size == total_racks
80
- skipped_hosts.each do |skipped_host|
81
- break if added_replicas.size >= factor
82
-
83
- replicas << skipped_host
84
- added_replicas << host
85
- end
77
+ replicas << host
78
+ visited_racks << rack
79
+ added_replicas << host
80
+
81
+ if visited_racks.size == total_racks
82
+ skipped_hosts.each do |skipped_host|
83
+ break if added_replicas.size >= factor
84
+
85
+ replicas << skipped_host
86
+ added_replicas << host
86
87
  end
87
88
  end
88
89
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -21,36 +21,18 @@ module Cassandra
21
21
  # @see Cassandra::Table#each_column
22
22
  # @see Cassandra::Table#column
23
23
  class Column
24
- # @private
25
- class Index
26
- # @return [String] index name
27
- attr_reader :name
28
- # @return [String] custom index class name
29
- attr_reader :custom_class_name
30
-
31
- # @private
32
- def initialize(name, custom_class_name = nil)
33
- @name = name
34
- @custom_class_name = custom_class_name
35
- end
36
- end
37
-
38
24
  # @return [String] column name
39
25
  attr_reader :name
40
26
  # @return [Cassandra::Type] column type
41
27
  attr_reader :type
42
28
  # @return [Symbol] column order (`:asc` or `:desc`)
43
29
  attr_reader :order
44
- # @private
45
- # @return [Cassandra::Column::Index, nil] column index
46
- attr_reader :index
47
30
 
48
31
  # @private
49
- def initialize(name, type, order, index = nil, is_static = false, is_frozen = false)
32
+ def initialize(name, type, order, is_static = false, is_frozen = false)
50
33
  @name = name
51
34
  @type = type
52
35
  @order = order
53
- @index = index
54
36
  @static = is_static
55
37
  @frozen = is_frozen
56
38
  end
@@ -67,7 +49,7 @@ module Cassandra
67
49
 
68
50
  # @private
69
51
  def inspect
70
- "#<#{self.class.name}:0x#{self.object_id.to_s(16)} @name=#{@name} @type=#{@type}>"
52
+ "#<#{self.class.name}:0x#{object_id.to_s(16)} @name=#{@name} @type=#{@type}>"
71
53
  end
72
54
 
73
55
  # @private
@@ -76,10 +58,9 @@ module Cassandra
76
58
  @name == other.name &&
77
59
  @type == other.type &&
78
60
  @order == other.order &&
79
- @index == other.index &&
80
61
  @static == other.static? &&
81
62
  @frozen == other.frozen?
82
63
  end
83
- alias :== :eql?
64
+ alias == eql?
84
65
  end
85
66
  end
@@ -0,0 +1,322 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 2013-2016 DataStax, Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #++
18
+
19
+ module Cassandra
20
+ # This class contains all the logic needed for manipulating columns of an object.
21
+ class ColumnContainer
22
+ # Encapsulates all of the configuration options of a column-container.
23
+ class Options
24
+ # @return [String] the comment attribute of this column-container.
25
+ attr_reader :comment
26
+ # @return [Float] the chance with which a read repair is triggered for this column-container.
27
+ attr_reader :read_repair_chance
28
+ # @return [Float] the cluster local read repair chance for this column-container.
29
+ attr_reader :local_read_repair_chance
30
+ # @return [Integer] the tombstone garbage collection grace time in seconds for this column-container.
31
+ attr_reader :gc_grace_seconds
32
+ # @return [Hash] the caching options for this column-container.
33
+ attr_reader :caching
34
+ # @return [Float] the false positive chance for the Bloom filter of this column-container.
35
+ attr_reader :bloom_filter_fp_chance
36
+ # @return [Integer] how often (in milliseconds) to flush the memtable of this column-container.
37
+ attr_reader :memtable_flush_period_in_ms
38
+ # @return [Integer] the default TTL for this column-container.
39
+ attr_reader :default_time_to_live
40
+ # Return the speculative retry setting of this column-container, which determines how much
41
+ # response delay the coordinator node will tolerate from the chosen replica before
42
+ # retrying the request on other replicas. This setting can be expressed as a fixed
43
+ # delay in ms (e.g. 10ms) or as a percentile indicating "when the response time has
44
+ # exceeded the Nth percentile of read response times for this object" (e.g. 99percentile).
45
+ # @return [String] the speculative retry setting of this column-container.
46
+ attr_reader :speculative_retry
47
+ # Return the index interval of this column-container; Cassandra will hold `1/index_interval` of row keys in
48
+ # memory.
49
+ # @return [Integer] the index interval of this column-container. May be nil, indicating a default value of 128.
50
+ attr_reader :index_interval
51
+ # @return [Hash] compression settings
52
+ attr_reader :compression
53
+ # When compression is enabled, this option defines the probability
54
+ # with which checksums for compressed blocks are checked during reads.
55
+ # @return [Float] the probability of checking checksums on compressed blocks.
56
+ attr_reader :crc_check_chance
57
+ # @return [Hash] the extension options of this column-container.
58
+ attr_reader :extensions
59
+
60
+ # @return [ColumnContainer::Compaction] the compaction strategy of this column-container.
61
+ attr_reader :compaction_strategy
62
+
63
+ # @private
64
+ # rubocop:disable Metrics/ParameterLists
65
+ def initialize(comment,
66
+ read_repair_chance,
67
+ local_read_repair_chance,
68
+ gc_grace_seconds,
69
+ caching,
70
+ bloom_filter_fp_chance,
71
+ populate_io_cache_on_flush,
72
+ memtable_flush_period_in_ms,
73
+ default_time_to_live,
74
+ speculative_retry,
75
+ index_interval,
76
+ replicate_on_write,
77
+ min_index_interval,
78
+ max_index_interval,
79
+ compaction_strategy,
80
+ compression,
81
+ compact_storage,
82
+ crc_check_chance,
83
+ extensions)
84
+ @comment = comment
85
+ @read_repair_chance = read_repair_chance
86
+ @local_read_repair_chance = local_read_repair_chance
87
+ @gc_grace_seconds = gc_grace_seconds
88
+ @caching = caching
89
+ @bloom_filter_fp_chance = bloom_filter_fp_chance
90
+ @populate_io_cache_on_flush = populate_io_cache_on_flush
91
+ @memtable_flush_period_in_ms = memtable_flush_period_in_ms
92
+ @default_time_to_live = default_time_to_live
93
+ @speculative_retry = speculative_retry
94
+ @index_interval = index_interval
95
+ @replicate_on_write = replicate_on_write
96
+ @min_index_interval = min_index_interval
97
+ @max_index_interval = max_index_interval
98
+ @compaction_strategy = compaction_strategy
99
+ @compression = compression
100
+ @compact_storage = compact_storage
101
+ @crc_check_chance = crc_check_chance
102
+ @extensions = extensions
103
+ end
104
+
105
+ # Return whether to replicate counter updates to other replicas. It is *strongly* recommended
106
+ # that this setting be `true`. Otherwise, counter updates are only written to one replica
107
+ # and fault tolerance is sacrificed.
108
+ # @return [Boolean] whether to replicate counter updates to other replicas.
109
+ def replicate_on_write?
110
+ @replicate_on_write
111
+ end
112
+
113
+ # @return [Boolean] whether to populate the I/O cache on flush of this
114
+ # column-container. May be nil, indicating a default value of `false`.
115
+ def populate_io_cache_on_flush?
116
+ @populate_io_cache_on_flush
117
+ end
118
+
119
+ # @return [Boolean] whether this column-container uses compact storage.
120
+ def compact_storage?
121
+ @compact_storage
122
+ end
123
+
124
+ # @private
125
+ def to_cql
126
+ options = []
127
+
128
+ options << 'COMPACT STORAGE' if @compact_storage
129
+ unless @bloom_filter_fp_chance.nil?
130
+ options << "bloom_filter_fp_chance = #{Util.encode_object(@bloom_filter_fp_chance)}"
131
+ end
132
+ options << "caching = #{Util.encode_object(@caching)}" unless @caching.nil?
133
+ options << "comment = #{Util.encode_object(@comment)}" unless @comment.nil?
134
+ options << "compaction = #{@compaction_strategy.to_cql}" unless @compaction_strategy.nil?
135
+ options << "compression = #{Util.encode_object(@compression)}" unless @compression.nil?
136
+ options << "crc_check_chance = #{Util.encode_object(@crc_check_chance)}" unless @crc_check_chance.nil?
137
+ unless @local_read_repair_chance.nil?
138
+ options << "dclocal_read_repair_chance = #{Util.encode_object(@local_read_repair_chance)}"
139
+ end
140
+ unless @default_time_to_live.nil?
141
+ options << "default_time_to_live = #{Util.encode_object(@default_time_to_live)}"
142
+ end
143
+ options << "gc_grace_seconds = #{Util.encode_object(@gc_grace_seconds)}" unless @gc_grace_seconds.nil?
144
+ options << "index_interval = #{Util.encode_object(@index_interval)}" unless @index_interval.nil?
145
+ options << "max_index_interval = #{Util.encode_object(@max_index_interval)}" unless @max_index_interval.nil?
146
+ unless @memtable_flush_period_in_ms.nil?
147
+ options << "memtable_flush_period_in_ms = #{Util.encode_object(@memtable_flush_period_in_ms)}"
148
+ end
149
+ options << "min_index_interval = #{Util.encode_object(@min_index_interval)}" unless @min_index_interval.nil?
150
+ unless @populate_io_cache_on_flush.nil?
151
+ options << "populate_io_cache_on_flush = '#{@populate_io_cache_on_flush}'"
152
+ end
153
+ options << "read_repair_chance = #{Util.encode_object(@read_repair_chance)}" unless @read_repair_chance.nil?
154
+ options << "replicate_on_write = '#{@replicate_on_write}'" unless @replicate_on_write.nil?
155
+ options << "speculative_retry = #{Util.encode_object(@speculative_retry)}" unless @speculative_retry.nil?
156
+
157
+ options.join("\nAND ")
158
+ end
159
+
160
+ # @private
161
+ def eql?(other)
162
+ other.is_a?(Options) &&
163
+ @comment == other.comment &&
164
+ @read_repair_chance == other.read_repair_chance &&
165
+ @local_read_repair_chance == other.local_read_repair_chance &&
166
+ @gc_grace_seconds == other.gc_grace_seconds &&
167
+ @caching == other.caching &&
168
+ @bloom_filter_fp_chance == other.bloom_filter_fp_chance &&
169
+ @populate_io_cache_on_flush == other.populate_io_cache_on_flush? &&
170
+ @memtable_flush_period_in_ms == other.memtable_flush_period_in_ms &&
171
+ @default_time_to_live == other.default_time_to_live &&
172
+ @speculative_retry == other.speculative_retry &&
173
+ @index_interval == other.index_interval &&
174
+ @replicate_on_write == other.replicate_on_write? &&
175
+ @compaction_strategy == other.compaction_strategy &&
176
+ @compression == other.compression &&
177
+ @compact_storage == other.compact_storage? &&
178
+ @crc_check_chance == other.crc_check_chance &&
179
+ @extensions == other.extensions
180
+ end
181
+ alias == eql?
182
+ end
183
+
184
+ # Encapsulates the compaction strategy of a column-container.
185
+ class Compaction
186
+ # @return [String] the name of the Cassandra class that performs compaction.
187
+ attr_reader :class_name
188
+ # @return [Hash] compaction strategy options
189
+ attr_reader :options
190
+
191
+ # @private
192
+ def initialize(class_name, options)
193
+ @class_name = class_name
194
+ @options = options
195
+ end
196
+
197
+ # @private
198
+ def to_cql
199
+ compaction = {'class' => @class_name}
200
+ compaction.merge!(@options)
201
+
202
+ Util.encode_hash(compaction)
203
+ end
204
+
205
+ # @private
206
+ def eql?(other)
207
+ other.is_a?(Compaction) &&
208
+ @class_name == other.class_name &&
209
+ @options == other.options
210
+ end
211
+ alias == eql?
212
+ end
213
+
214
+ # @return [String] name of this column-container
215
+ attr_reader :name
216
+ # @return [Cassandra::Uuid] the id of this object in Cassandra.
217
+ attr_reader :id
218
+ # @return [Cassandra::Keyspace] the keyspace that this column-container belongs to.
219
+ attr_reader :keyspace
220
+ # @return [ColumnContainer::Options] collection of configuration options of this column-container.
221
+ attr_reader :options
222
+ # @return [Array<Cassandra::Column>] ordered list of column-names that make up the partition-key.
223
+ attr_reader :partition_key
224
+ # @return [Array<Cassandra::Column>] ordered list of column-names that make up the clustering-columns.
225
+ attr_reader :clustering_columns
226
+ # @return [Array<Cassandra::Column>] primary key of this column-container. It's the combination of
227
+ # `partition_key` and `clustering_columns`.
228
+ # @note This composition produces a flat list, so it will not be possible for the caller to distinguish
229
+ # partition-key columns from clustering-columns.
230
+ attr_reader :primary_key
231
+
232
+ # @private
233
+ def initialize(keyspace,
234
+ name,
235
+ partition_key,
236
+ clustering_columns,
237
+ other_columns,
238
+ options,
239
+ id)
240
+ @keyspace = keyspace
241
+ @name = name.freeze
242
+ @partition_key = partition_key.freeze
243
+ @clustering_columns = clustering_columns.freeze
244
+ @options = options
245
+ @id = id
246
+
247
+ # Make one array of all the columns, ordered with partition key, clustering
248
+ # columns, then other columns. Make a hash as well, to support random access
249
+ # to column metadata for a given column name. Save off the primary key (which
250
+ # is partition-key + clustering-columns) while we're at it.
251
+
252
+ @primary_key = @partition_key.dup.concat(@clustering_columns).freeze
253
+ @columns = @primary_key.dup.concat(other_columns).freeze
254
+ @columns_hash = @columns.each_with_object({}) do |col, h|
255
+ h[col.name] = col
256
+ end
257
+ end
258
+
259
+ # @param name [String] column name
260
+ # @return [Boolean] whether this column-container has a given column
261
+ def has_column?(name)
262
+ @columns_hash.key?(name)
263
+ end
264
+
265
+ # @param name [String] column name
266
+ # @return [Cassandra::Column, nil] a column or nil
267
+ def column(name)
268
+ @columns_hash[name]
269
+ end
270
+
271
+ # Yield or enumerate each column defined in this column-container
272
+ # @overload each_column
273
+ # @yieldparam column [Cassandra::Column] current column
274
+ # @return [Cassandra::ColumnContainer] self
275
+ # @overload each_column
276
+ # @return [Array<Cassandra::Column>] a list of columns
277
+ def each_column(&block)
278
+ if block_given?
279
+ @columns.each(&block)
280
+ self
281
+ else
282
+ @columns
283
+ end
284
+ end
285
+ alias columns each_column
286
+
287
+ # @private
288
+ # keyspace attribute may be nil because when this object was constructed, we didn't have
289
+ # its keyspace constructed yet. So allow updating @keyspace if it's nil, thus
290
+ # allowing fetchers to create keyspace, table/view, and hook them together without
291
+ # worrying about chickens and eggs.
292
+ # NOTE: Ignore the set request if the @keyspace is already set.
293
+ # rubocop:disable Style/AccessorMethodName
294
+ def set_keyspace(keyspace)
295
+ @keyspace = keyspace unless @keyspace
296
+ end
297
+
298
+ # @private
299
+ def inspect
300
+ "#<#{self.class.name}:0x#{object_id.to_s(16)} " \
301
+ "@keyspace=#{@keyspace.name} @name=#{@name}>"
302
+ end
303
+
304
+ # @private
305
+ def eql?(other)
306
+ other.is_a?(ColumnContainer) &&
307
+ @keyspace == other.keyspace &&
308
+ @name == other.name &&
309
+ @partition_key == other.partition_key &&
310
+ @clustering_columns == other.clustering_columns &&
311
+ @columns == other.raw_columns &&
312
+ @options == other.options
313
+ end
314
+ alias == eql?
315
+
316
+ # @private
317
+ def raw_columns
318
+ @columns
319
+ end
320
+ protected :raw_columns
321
+ end
322
+ end