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

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