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.
@@ -23,13 +23,18 @@ module Cassandra
23
23
  class TimeUuid < Uuid
24
24
  include Comparable
25
25
 
26
+ # @private
27
+ LOWER_HALF_MASK = 0xffffffff_ffffffff
28
+ # @private
29
+ GREGORIAN_OFFSET = 122192928000000000
30
+
26
31
  # Returns the time component from this UUID as a Time.
27
32
  #
28
33
  # @return [Time]
29
34
  def to_time
30
35
  t = time_bits - GREGORIAN_OFFSET
31
- seconds = t/10_000_000
32
- microseconds = (t - seconds * 10_000_000)/10.0
36
+ seconds = t / 10_000_000
37
+ microseconds = (t - seconds * 10_000_000) / 10.0
33
38
 
34
39
  ::Time.at(seconds, microseconds).utc
35
40
  end
@@ -52,10 +57,10 @@ module Cassandra
52
57
  # @return [Integer] `-1` when less than `other`, `0` when equal to `other`
53
58
  # and `1` when greater than `other`
54
59
  def <=>(other)
55
- return nil unless other.kind_of?(Cassandra::Uuid)
56
- c = self.value <=> other.value
60
+ return nil unless other.is_a?(Cassandra::Uuid)
61
+ c = value <=> other.value
57
62
  return c if c == 0 || !other.is_a?(Cassandra::TimeUuid)
58
- self.time_bits <=> other.time_bits
63
+ time_bits <=> other.time_bits
59
64
  end
60
65
 
61
66
  protected
@@ -69,12 +74,5 @@ module Cassandra
69
74
  t |= (n & 0xffffffff00000000) >> 32
70
75
  t
71
76
  end
72
-
73
- private
74
-
75
- # @private
76
- LOWER_HALF_MASK = 0xffffffff_ffffffff
77
- # @private
78
- GREGORIAN_OFFSET = 122192928000000000
79
77
  end
80
- end
78
+ end
@@ -0,0 +1,37 @@
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
+ # A generator is used to create client-timestamps (in the form of long integers) to send with C* requests when
21
+ # the `:client_timestamps` cluster option is set to true.
22
+ #
23
+ # @abstract A timestamp generator given to {Cassandra.cluster} doesn't need to include this module, but needs to
24
+ # implement the same methods. This module exists only for documentation purposes.
25
+ module TimestampGenerator
26
+ # Create a new timestamp, as a 64-bit integer. Calls must return monotonically increasing values.
27
+ #
28
+ # @return [Integer] an integer representing a timestamp in microseconds.
29
+ # @raise [NotImplementedError] if a class including this module does not define this method.
30
+ def next
31
+ raise NotImplementedError, "#{self.class} class must implement the 'next' method"
32
+ end
33
+ end
34
+ end
35
+
36
+ require 'cassandra/timestamp_generator/ticking_on_duplicate'
37
+ require 'cassandra/timestamp_generator/simple'
@@ -0,0 +1,38 @@
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
+ module TimestampGenerator
21
+ # Generate long integer timestamps from current time. This implementation relies on the {::Time} class to return
22
+ # microsecond precision time.
23
+ # @note It is not appropriate for use with JRuby because its {::Time#now} returns millisecond precision time.
24
+ class Simple
25
+ include TimestampGenerator
26
+
27
+ # Create a new timestamp, as a 64-bit integer. This is just a wrapper around Time::now.
28
+ #
29
+ # @return [Integer] an integer representing a timestamp in microseconds.
30
+ def next
31
+ # Use Time.now, which has microsecond precision on MRI (and probably Rubinius) to make an int representing
32
+ # client timestamp in protocol requests.
33
+ timestamp = ::Time.now
34
+ timestamp.tv_sec * 1000000 + timestamp.tv_usec
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,58 @@
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
+ module TimestampGenerator
21
+ # In JRuby, {::Time} has millisecond precision. We require client timestamps to have microsecond precision to
22
+ # minimize clashes in C*. This generator keeps track of the last generated timestamp, and if the current-time
23
+ # is within the same millisecond as the last, it fills the microsecond portion of the new timestamp with the
24
+ # value of an incrementing counter.
25
+ #
26
+ # For example, if the generator triggers twice at time 12345678000 (microsecond granularity, but ms precisions
27
+ # as shown by 0's for the three least-significant digits), it'll return 12345678000 and 12345678001.
28
+ class TickingOnDuplicate
29
+ include MonitorMixin
30
+ include TimestampGenerator
31
+
32
+ # @private
33
+ def initialize
34
+ mon_initialize
35
+ @last = 0
36
+ end
37
+
38
+ # Create a new timestamp, as a 64-bit integer.
39
+ #
40
+ # @return [Integer] an integer representing a timestamp in microseconds.
41
+ def next
42
+ now = ::Time.now
43
+ now_millis = now.tv_sec * 1000 + now.tv_usec / 1000
44
+ synchronize do
45
+ millis = @last / 1000
46
+ counter = @last % 1000
47
+ if millis >= now_millis
48
+ counter += 1
49
+ else
50
+ millis = now_millis
51
+ counter = 0
52
+ end
53
+ @last = millis * 1000 + counter
54
+ end
55
+ end
56
+ end
57
+ end
58
+ 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.
@@ -55,7 +55,7 @@ module Cassandra
55
55
  end
56
56
 
57
57
  def inspect
58
- "#<Cassandra::Tuple:0x#{self.object_id.to_s(16)} #{to_s}>"
58
+ "#<Cassandra::Tuple:0x#{object_id.to_s(16)} #{self}>"
59
59
  end
60
60
  end
61
61
 
@@ -114,14 +114,14 @@ module Cassandra
114
114
 
115
115
  # @private
116
116
  def inspect
117
- "#<Cassandra::Tuple:0x#{self.object_id.to_s(16)} #{to_s}>"
117
+ "#<Cassandra::Tuple:0x#{object_id.to_s(16)} #{self}>"
118
118
  end
119
119
 
120
120
  # @private
121
121
  def eql?(other)
122
122
  other == @values
123
123
  end
124
- alias :== :eql?
124
+ alias == eql?
125
125
 
126
126
  # @private
127
127
  def hash
@@ -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.
@@ -48,7 +48,13 @@ module Cassandra
48
48
  end
49
49
  end
50
50
 
51
- module Types; extend self
51
+ module Types
52
+ # If we use module_function, the yard docs end up showing duplicates of all
53
+ # methods: one for self, the other as instance methods.
54
+ #
55
+ # rubocop:disable Style/ModuleFunction
56
+ extend self
57
+
52
58
  # @private
53
59
  class Simple < Type
54
60
  def new(value)
@@ -71,12 +77,13 @@ module Cassandra
71
77
  def eql?(other)
72
78
  other.is_a?(Simple) && @kind == other.kind
73
79
  end
74
- alias :== :eql?
80
+
81
+ alias == eql?
75
82
 
76
83
  private
77
84
 
78
85
  def new_varchar(value)
79
- String(value)
86
+ String(value)
80
87
  end
81
88
 
82
89
  def assert_varchar(value, message, &block)
@@ -140,11 +147,14 @@ module Cassandra
140
147
  end
141
148
 
142
149
  def new_boolean(value)
143
- !!value
150
+ !value.nil? && value != false
144
151
  end
145
152
 
146
153
  def assert_boolean(value, message, &block)
147
- Util.assert_instance_of_one_of([::TrueClass, ::FalseClass], value, message, &block)
154
+ Util.assert_instance_of_one_of([::TrueClass, ::FalseClass],
155
+ value,
156
+ message,
157
+ &block)
148
158
  end
149
159
 
150
160
  def new_decimal(value)
@@ -193,7 +203,7 @@ module Cassandra
193
203
  Util.assert_instance_of(::Time, value, message, &block)
194
204
  end
195
205
 
196
- def new_uuid(value, message, &block)
206
+ def new_uuid(value)
197
207
  Cassandra::Uuid.new(value)
198
208
  end
199
209
 
@@ -649,7 +659,7 @@ module Cassandra
649
659
  # @return [String] `"list<type>"`
650
660
  # @see Cassandra::Type#to_s
651
661
  def to_s
652
- "list<#{@value_type.to_s}>"
662
+ "list<#{@value_type}>"
653
663
  end
654
664
 
655
665
  def hash
@@ -664,7 +674,8 @@ module Cassandra
664
674
  def eql?(other)
665
675
  other.is_a?(List) && @value_type == other.value_type
666
676
  end
667
- alias :== :eql?
677
+
678
+ alias == eql?
668
679
  end
669
680
 
670
681
  class Map < Type
@@ -674,7 +685,7 @@ module Cassandra
674
685
  # @private
675
686
  def initialize(key_type, value_type)
676
687
  super(:map)
677
- @key_type = key_type
688
+ @key_type = key_type
678
689
  @value_type = value_type
679
690
  end
680
691
 
@@ -701,7 +712,7 @@ module Cassandra
701
712
  end
702
713
  result
703
714
  else
704
- raise ::ArgumentError, "cannot convert #{value.inspect} to #{to_s}"
715
+ raise ::ArgumentError, "cannot convert #{value.inspect} to #{self}"
705
716
  end
706
717
  end
707
718
 
@@ -724,7 +735,7 @@ module Cassandra
724
735
  # @return [String] `"map<type, type>"`
725
736
  # @see Cassandra::Type#to_s
726
737
  def to_s
727
- "map<#{@key_type.to_s}, #{@value_type.to_s}>"
738
+ "map<#{@key_type}, #{@value_type}>"
728
739
  end
729
740
 
730
741
  def hash
@@ -742,7 +753,8 @@ module Cassandra
742
753
  @key_type == other.key_type &&
743
754
  @value_type == other.value_type
744
755
  end
745
- alias :== :eql?
756
+
757
+ alias == eql?
746
758
  end
747
759
 
748
760
  class Set < Type
@@ -813,7 +825,7 @@ module Cassandra
813
825
  # @return [String] `"set<type>"`
814
826
  # @see Cassandra::Type#to_s
815
827
  def to_s
816
- "set<#{@value_type.to_s}>"
828
+ "set<#{@value_type}>"
817
829
  end
818
830
 
819
831
  def hash
@@ -828,7 +840,8 @@ module Cassandra
828
840
  def eql?(other)
829
841
  other.is_a?(Set) && @value_type == other.value_type
830
842
  end
831
- alias :== :eql?
843
+
844
+ alias == eql?
832
845
  end
833
846
 
834
847
  # @!parse
@@ -1042,7 +1055,9 @@ module Cassandra
1042
1055
  #
1043
1056
  # tuple(varchar, varchar, int).new('Jane', 'Smith', 38) # => (Jane, Smith, 38)
1044
1057
  def new(*values)
1045
- Util.assert(values.size <= @members.size) { "too many values: #{values.size} out of max #{@members.size}" }
1058
+ Util.assert(values.size <= @members.size) do
1059
+ "too many values: #{values.size} out of max #{@members.size}"
1060
+ end
1046
1061
  values.each_with_index do |v, i|
1047
1062
  Util.assert_type(@members[i], v)
1048
1063
  end
@@ -1083,7 +1098,8 @@ module Cassandra
1083
1098
  def eql?(other)
1084
1099
  other.is_a?(Tuple) && @members == other.members
1085
1100
  end
1086
- alias :== :eql?
1101
+
1102
+ alias == eql?
1087
1103
  end
1088
1104
 
1089
1105
  # @!parse
@@ -1183,7 +1199,8 @@ module Cassandra
1183
1199
  @name == other.name &&
1184
1200
  @type == other.type
1185
1201
  end
1186
- alias :== :eql?
1202
+
1203
+ alias == eql?
1187
1204
  end
1188
1205
 
1189
1206
  # @return [String] keyspace where this type is defined
@@ -1198,15 +1215,15 @@ module Cassandra
1198
1215
  # @private
1199
1216
  def initialize(keyspace, name, fields)
1200
1217
  super(:udt)
1201
- @keyspace = keyspace
1202
- @name = name
1203
- @fields = fields
1218
+ @keyspace = keyspace
1219
+ @name = name
1220
+ @fields = fields
1204
1221
  end
1205
1222
 
1206
1223
  # @param name [String] field name
1207
1224
  # @return [Boolean] whether this type has a given field
1208
1225
  def has_field?(name)
1209
- @fields.any? {|f| f.name == name}
1226
+ @fields.any? { |f| f.name == name }
1210
1227
  end
1211
1228
 
1212
1229
  # Yield or enumerate each field defined in this type
@@ -1223,13 +1240,14 @@ module Cassandra
1223
1240
  @fields.dup
1224
1241
  end
1225
1242
  end
1226
- alias :fields :each_field
1243
+
1244
+ alias fields each_field
1227
1245
 
1228
1246
  # @param name [String] field name
1229
1247
  # @return [Cassandra::UserDefined::Field, nil] a field with this name or
1230
1248
  # nil
1231
1249
  def field(name)
1232
- @fields.find {|f| f.name == name}
1250
+ @fields.find { |f| f.name == name }
1233
1251
  end
1234
1252
 
1235
1253
  # Coerces the value to Cassandra::UDT
@@ -1240,7 +1258,9 @@ module Cassandra
1240
1258
  value = value.first if value.one?
1241
1259
  value = Array(value) unless value.is_a?(::Hash)
1242
1260
 
1243
- Util.assert(value.size <= @fields.size) { "too many values: #{value.size} out of #{@fields.size}" }
1261
+ Util.assert(value.size <= @fields.size) do
1262
+ "too many values: #{value.size} out of #{@fields.size}"
1263
+ end
1244
1264
 
1245
1265
  case value
1246
1266
  when ::Array
@@ -1282,7 +1302,8 @@ module Cassandra
1282
1302
  # @return [String] `"keyspace.name"`
1283
1303
  # @see Cassandra::Type#to_s
1284
1304
  def to_s
1285
- "#{Util.escape_name(@keyspace)}.#{Util.escape_name(@name)} {#{@fields.join(', ')}}"
1305
+ "#{Util.escape_name(@keyspace)}.#{Util.escape_name(@name)} " \
1306
+ "{#{@fields.join(', ')}}"
1286
1307
  end
1287
1308
 
1288
1309
  def hash
@@ -1302,11 +1323,13 @@ module Cassandra
1302
1323
  @name == other.name &&
1303
1324
  @fields == other.fields
1304
1325
  end
1305
- alias :== :eql?
1326
+
1327
+ alias == eql?
1306
1328
 
1307
1329
  # Output this type in CQL
1308
1330
  def to_cql
1309
- cql = "CREATE TYPE #{Util.escape_name(@keyspace)}.#{Util.escape_name(@name)} (\n"
1331
+ cql = "CREATE TYPE #{Util.escape_name(@keyspace)}.#{Util.escape_name(@name)} " \
1332
+ "(\n"
1310
1333
  first = true
1311
1334
 
1312
1335
  @fields.each do |field|
@@ -1337,7 +1360,7 @@ module Cassandra
1337
1360
  "frozen <#{Util.escape_name(type.keyspace)}.#{Util.escape_name(type.name)}>"
1338
1361
  end
1339
1362
  else
1340
- "#{type}"
1363
+ type.to_s
1341
1364
  end
1342
1365
  end
1343
1366
  end
@@ -1355,7 +1378,8 @@ module Cassandra
1355
1378
  # @param value [*Object] value to be coerced
1356
1379
  # @return [Object] a value of this type
1357
1380
  def new(*value)
1358
- raise ::NotImplementedError, "unable to create a value for custom type: #{@name.inspect}"
1381
+ raise ::NotImplementedError,
1382
+ "unable to create a value for custom type: #{@name.inspect}"
1359
1383
  end
1360
1384
 
1361
1385
  # Asserts that a given value is of this type
@@ -1365,7 +1389,8 @@ module Cassandra
1365
1389
  # @raise [ArgumentError] if the value is invalid
1366
1390
  # @return [void]
1367
1391
  def assert(value, message = nil, &block)
1368
- raise ::NotImplementedError, "unable to assert a value for custom type: #{@name.inspect}"
1392
+ raise ::NotImplementedError,
1393
+ "unable to assert a value for custom type: #{@name.inspect}"
1369
1394
  end
1370
1395
 
1371
1396
  # @return [String] a cassandra representation of this type
@@ -1385,7 +1410,8 @@ module Cassandra
1385
1410
  def eql?(other)
1386
1411
  other.is_a?(Custom) && @name == other.name
1387
1412
  end
1388
- alias :== :eql?
1413
+
1414
+ alias == eql?
1389
1415
  end
1390
1416
 
1391
1417
  # @return [Cassandra::Types::Text] text type since varchar is an alias for text
@@ -1492,8 +1518,8 @@ module Cassandra
1492
1518
  # @return [Cassandra::Types::List] list type
1493
1519
  def list(value_type)
1494
1520
  Util.assert_instance_of(Cassandra::Type, value_type,
1495
- "list type must be a Cassandra::Type, #{value_type.inspect} given"
1496
- )
1521
+ "list type must be a Cassandra::Type, #{value_type.inspect} given"
1522
+ )
1497
1523
 
1498
1524
  List.new(value_type)
1499
1525
  end
@@ -1503,11 +1529,11 @@ module Cassandra
1503
1529
  # @return [Cassandra::Types::Map] map type
1504
1530
  def map(key_type, value_type)
1505
1531
  Util.assert_instance_of(Cassandra::Type, key_type,
1506
- "map key type must be a Cassandra::Type, #{key_type.inspect} given"
1507
- )
1532
+ "map key type must be a Cassandra::Type, #{key_type.inspect} given"
1533
+ )
1508
1534
  Util.assert_instance_of(Cassandra::Type, value_type,
1509
- "map value type must be a Cassandra::Type, #{value_type.inspect} given"
1510
- )
1535
+ "map value type must be a Cassandra::Type, #{value_type.inspect} given"
1536
+ )
1511
1537
 
1512
1538
  Map.new(key_type, value_type)
1513
1539
  end
@@ -1516,8 +1542,8 @@ module Cassandra
1516
1542
  # @return [Cassandra::Types::Set] set type
1517
1543
  def set(value_type)
1518
1544
  Util.assert_instance_of(Cassandra::Type, value_type,
1519
- "set type must be a Cassandra::Type, #{value_type.inspect} given"
1520
- )
1545
+ "set type must be a Cassandra::Type, #{value_type.inspect} given"
1546
+ )
1521
1547
 
1522
1548
  Set.new(value_type)
1523
1549
  end
@@ -1525,12 +1551,12 @@ module Cassandra
1525
1551
  # @param members [*Cassandra::Type] types of members of this tuple
1526
1552
  # @return [Cassandra::Types::Tuple] tuple type
1527
1553
  def tuple(*members)
1528
- Util.assert_not_empty(members, "tuple must contain at least one member")
1554
+ Util.assert_not_empty(members, 'tuple must contain at least one member')
1529
1555
  members.each do |member|
1530
1556
  Util.assert_instance_of(Cassandra::Type, member,
1531
- "each tuple member must be a Cassandra::Type, " \
1532
- "#{member.inspect} given"
1533
- )
1557
+ 'each tuple member must be a Cassandra::Type, ' \
1558
+ "#{member.inspect} given"
1559
+ )
1534
1560
  end
1535
1561
 
1536
1562
  Tuple.new(*members)
@@ -1540,13 +1566,25 @@ module Cassandra
1540
1566
  # @example Various ways of defining the same UDT
1541
1567
  # include Cassandra::Types
1542
1568
  #
1543
- # udt('simplex', 'address', {'street' => varchar, 'city' => varchar, 'state' => varchar, 'zip' => varchar}) #=> simplex.address
1569
+ # udt('simplex', 'address', {'street' => varchar,
1570
+ # 'city' => varchar,
1571
+ # 'state' => varchar,
1572
+ # 'zip' => varchar}) #=> simplex.address
1544
1573
  #
1545
- # udt('simplex', 'address', [['street', varchar], ['city', varchar], ['state', varchar], ['zip', varchar]]) #=> simplex.address
1574
+ # udt('simplex', 'address', [['street', varchar],
1575
+ # ['city', varchar],
1576
+ # ['state', varchar],
1577
+ # ['zip', varchar]]) #=> simplex.address
1546
1578
  #
1547
- # udt('simplex', 'address', ['street', varchar], ['city', varchar], ['state', varchar], ['zip', varchar]) #=> simplex.address
1579
+ # udt('simplex', 'address', ['street', varchar],
1580
+ # ['city', varchar],
1581
+ # ['state', varchar],
1582
+ # ['zip', varchar]) #=> simplex.address
1548
1583
  #
1549
- # udt('simplex', 'address', 'street', varchar, 'city', varchar, 'state', varchar, 'zip', varchar) #=> simplex.address
1584
+ # udt('simplex', 'address', 'street', varchar,
1585
+ # 'city', varchar,
1586
+ # 'state', varchar,
1587
+ # 'zip', varchar) #=> simplex.address
1550
1588
  # @param keyspace [String] name of the keyspace that this UDT is defined in
1551
1589
  # @param name [String] name of this UDT
1552
1590
  # @param fields [Hash<String, Cassandra::Type>,
@@ -1556,44 +1594,44 @@ module Cassandra
1556
1594
  # @return [Cassandra::Types::UserDefined] user defined type
1557
1595
  def udt(keyspace, name, *fields)
1558
1596
  keyspace = String(keyspace)
1559
- name = String(name)
1560
- fields = Array(fields.first) if fields.one?
1597
+ name = String(name)
1598
+ fields = Array(fields.first) if fields.one?
1561
1599
 
1562
1600
  Util.assert_not_empty(fields,
1563
- "user-defined type must contain at least one field"
1564
- )
1601
+ 'user-defined type must contain at least one field'
1602
+ )
1565
1603
 
1566
1604
  if fields.first.is_a?(::Array)
1567
1605
  fields = fields.map do |pair|
1568
1606
  Util.assert(pair.size == 2,
1569
- "fields of a user-defined type must be an Array of name and " \
1570
- "value pairs, #{pair.inspect} given"
1571
- )
1607
+ 'fields of a user-defined type must be an Array of name and ' \
1608
+ "value pairs, #{pair.inspect} given"
1609
+ )
1572
1610
  Util.assert_instance_of(::String, pair[0],
1573
- "each field name for a user-defined type must be a String, " \
1574
- "#{pair[0].inspect} given"
1575
- )
1611
+ 'each field name for a user-defined type must be a String, ' \
1612
+ "#{pair[0].inspect} given"
1613
+ )
1576
1614
  Util.assert_instance_of(Cassandra::Type, pair[1],
1577
- "each field type for a user-defined type must be a " \
1578
- "Cassandra::Type, #{pair[1].inspect} given"
1579
- )
1615
+ 'each field type for a user-defined type must be a ' \
1616
+ "Cassandra::Type, #{pair[1].inspect} given"
1617
+ )
1580
1618
 
1581
1619
  UserDefined::Field.new(*pair)
1582
1620
  end
1583
1621
  else
1584
- Util.assert((fields.size % 2) == 0,
1585
- "fields of a user-defined type must be an Array of alternating " \
1586
- "names and values pairs, #{fields.inspect} given"
1587
- )
1622
+ Util.assert(fields.size.even?,
1623
+ 'fields of a user-defined type must be an Array of alternating ' \
1624
+ "names and values pairs, #{fields.inspect} given"
1625
+ )
1588
1626
  fields = fields.each_slice(2).map do |field_name, field_type|
1589
1627
  Util.assert_instance_of(::String, field_name,
1590
- "each field name for a user-defined type must be a String, " \
1591
- "#{field_name.inspect} given"
1592
- )
1628
+ 'each field name for a user-defined type must be a String, ' \
1629
+ "#{field_name.inspect} given"
1630
+ )
1593
1631
  Util.assert_instance_of(Cassandra::Type, field_type,
1594
- "each field type for a user-defined type must be a " \
1595
- "Cassandra::Type, #{field_type.inspect} given"
1596
- )
1632
+ 'each field type for a user-defined type must be a ' \
1633
+ "Cassandra::Type, #{field_type.inspect} given"
1634
+ )
1597
1635
 
1598
1636
  UserDefined::Field.new(field_name, field_type)
1599
1637
  end