yugabyte-ycql-driver 3.2.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +13 -0
  3. data/README.md +242 -0
  4. data/ext/cassandra_murmur3/cassandra_murmur3.c +178 -0
  5. data/ext/cassandra_murmur3/extconf.rb +2 -0
  6. data/lib/cassandra/address_resolution.rb +36 -0
  7. data/lib/cassandra/address_resolution/policies.rb +2 -0
  8. data/lib/cassandra/address_resolution/policies/ec2_multi_region.rb +56 -0
  9. data/lib/cassandra/address_resolution/policies/none.rb +35 -0
  10. data/lib/cassandra/aggregate.rb +123 -0
  11. data/lib/cassandra/argument.rb +51 -0
  12. data/lib/cassandra/attr_boolean.rb +33 -0
  13. data/lib/cassandra/auth.rb +100 -0
  14. data/lib/cassandra/auth/providers.rb +17 -0
  15. data/lib/cassandra/auth/providers/password.rb +65 -0
  16. data/lib/cassandra/cassandra_logger.rb +80 -0
  17. data/lib/cassandra/cluster.rb +331 -0
  18. data/lib/cassandra/cluster/client.rb +1612 -0
  19. data/lib/cassandra/cluster/connection_pool.rb +78 -0
  20. data/lib/cassandra/cluster/connector.rb +372 -0
  21. data/lib/cassandra/cluster/control_connection.rb +962 -0
  22. data/lib/cassandra/cluster/failed_connection.rb +35 -0
  23. data/lib/cassandra/cluster/metadata.rb +142 -0
  24. data/lib/cassandra/cluster/options.rb +145 -0
  25. data/lib/cassandra/cluster/registry.rb +284 -0
  26. data/lib/cassandra/cluster/schema.rb +405 -0
  27. data/lib/cassandra/cluster/schema/cql_type_parser.rb +112 -0
  28. data/lib/cassandra/cluster/schema/fetchers.rb +1627 -0
  29. data/lib/cassandra/cluster/schema/fqcn_type_parser.rb +175 -0
  30. data/lib/cassandra/cluster/schema/partitioners.rb +21 -0
  31. data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +45 -0
  32. data/lib/cassandra/cluster/schema/partitioners/ordered.rb +37 -0
  33. data/lib/cassandra/cluster/schema/partitioners/random.rb +37 -0
  34. data/lib/cassandra/cluster/schema/replication_strategies.rb +21 -0
  35. data/lib/cassandra/cluster/schema/replication_strategies/network_topology.rb +102 -0
  36. data/lib/cassandra/cluster/schema/replication_strategies/none.rb +39 -0
  37. data/lib/cassandra/cluster/schema/replication_strategies/simple.rb +44 -0
  38. data/lib/cassandra/column.rb +66 -0
  39. data/lib/cassandra/column_container.rb +326 -0
  40. data/lib/cassandra/compression.rb +69 -0
  41. data/lib/cassandra/compression/compressors/lz4.rb +73 -0
  42. data/lib/cassandra/compression/compressors/snappy.rb +69 -0
  43. data/lib/cassandra/custom_data.rb +53 -0
  44. data/lib/cassandra/driver.rb +260 -0
  45. data/lib/cassandra/errors.rb +784 -0
  46. data/lib/cassandra/execution/info.rb +69 -0
  47. data/lib/cassandra/execution/options.rb +267 -0
  48. data/lib/cassandra/execution/profile.rb +153 -0
  49. data/lib/cassandra/execution/profile_manager.rb +71 -0
  50. data/lib/cassandra/execution/trace.rb +192 -0
  51. data/lib/cassandra/executors.rb +113 -0
  52. data/lib/cassandra/function.rb +156 -0
  53. data/lib/cassandra/function_collection.rb +85 -0
  54. data/lib/cassandra/future.rb +794 -0
  55. data/lib/cassandra/host.rb +102 -0
  56. data/lib/cassandra/index.rb +118 -0
  57. data/lib/cassandra/keyspace.rb +473 -0
  58. data/lib/cassandra/listener.rb +87 -0
  59. data/lib/cassandra/load_balancing.rb +121 -0
  60. data/lib/cassandra/load_balancing/policies.rb +20 -0
  61. data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +172 -0
  62. data/lib/cassandra/load_balancing/policies/round_robin.rb +141 -0
  63. data/lib/cassandra/load_balancing/policies/token_aware.rb +149 -0
  64. data/lib/cassandra/load_balancing/policies/white_list.rb +100 -0
  65. data/lib/cassandra/materialized_view.rb +92 -0
  66. data/lib/cassandra/null_logger.rb +56 -0
  67. data/lib/cassandra/protocol.rb +102 -0
  68. data/lib/cassandra/protocol/coder.rb +1085 -0
  69. data/lib/cassandra/protocol/cql_byte_buffer.rb +418 -0
  70. data/lib/cassandra/protocol/cql_protocol_handler.rb +448 -0
  71. data/lib/cassandra/protocol/request.rb +41 -0
  72. data/lib/cassandra/protocol/requests/auth_response_request.rb +51 -0
  73. data/lib/cassandra/protocol/requests/batch_request.rb +117 -0
  74. data/lib/cassandra/protocol/requests/credentials_request.rb +51 -0
  75. data/lib/cassandra/protocol/requests/execute_request.rb +122 -0
  76. data/lib/cassandra/protocol/requests/options_request.rb +39 -0
  77. data/lib/cassandra/protocol/requests/prepare_request.rb +59 -0
  78. data/lib/cassandra/protocol/requests/query_request.rb +112 -0
  79. data/lib/cassandra/protocol/requests/register_request.rb +38 -0
  80. data/lib/cassandra/protocol/requests/startup_request.rb +49 -0
  81. data/lib/cassandra/protocol/requests/void_query_request.rb +24 -0
  82. data/lib/cassandra/protocol/response.rb +28 -0
  83. data/lib/cassandra/protocol/responses/already_exists_error_response.rb +50 -0
  84. data/lib/cassandra/protocol/responses/auth_challenge_response.rb +36 -0
  85. data/lib/cassandra/protocol/responses/auth_success_response.rb +36 -0
  86. data/lib/cassandra/protocol/responses/authenticate_response.rb +36 -0
  87. data/lib/cassandra/protocol/responses/error_response.rb +142 -0
  88. data/lib/cassandra/protocol/responses/event_response.rb +30 -0
  89. data/lib/cassandra/protocol/responses/function_failure_error_response.rb +52 -0
  90. data/lib/cassandra/protocol/responses/prepared_result_response.rb +62 -0
  91. data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +59 -0
  92. data/lib/cassandra/protocol/responses/read_failure_error_response.rb +71 -0
  93. data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +61 -0
  94. data/lib/cassandra/protocol/responses/ready_response.rb +43 -0
  95. data/lib/cassandra/protocol/responses/result_response.rb +42 -0
  96. data/lib/cassandra/protocol/responses/rows_result_response.rb +39 -0
  97. data/lib/cassandra/protocol/responses/schema_change_event_response.rb +73 -0
  98. data/lib/cassandra/protocol/responses/schema_change_result_response.rb +70 -0
  99. data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +37 -0
  100. data/lib/cassandra/protocol/responses/status_change_event_response.rb +39 -0
  101. data/lib/cassandra/protocol/responses/supported_response.rb +36 -0
  102. data/lib/cassandra/protocol/responses/topology_change_event_response.rb +33 -0
  103. data/lib/cassandra/protocol/responses/unavailable_error_response.rb +58 -0
  104. data/lib/cassandra/protocol/responses/unprepared_error_response.rb +48 -0
  105. data/lib/cassandra/protocol/responses/void_result_response.rb +34 -0
  106. data/lib/cassandra/protocol/responses/write_failure_error_response.rb +73 -0
  107. data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +63 -0
  108. data/lib/cassandra/protocol/v1.rb +326 -0
  109. data/lib/cassandra/protocol/v3.rb +358 -0
  110. data/lib/cassandra/protocol/v4.rb +478 -0
  111. data/lib/cassandra/reconnection.rb +49 -0
  112. data/lib/cassandra/reconnection/policies.rb +20 -0
  113. data/lib/cassandra/reconnection/policies/constant.rb +46 -0
  114. data/lib/cassandra/reconnection/policies/exponential.rb +79 -0
  115. data/lib/cassandra/result.rb +276 -0
  116. data/lib/cassandra/retry.rb +154 -0
  117. data/lib/cassandra/retry/policies.rb +21 -0
  118. data/lib/cassandra/retry/policies/default.rb +53 -0
  119. data/lib/cassandra/retry/policies/downgrading_consistency.rb +73 -0
  120. data/lib/cassandra/retry/policies/fallthrough.rb +39 -0
  121. data/lib/cassandra/session.rb +270 -0
  122. data/lib/cassandra/statement.rb +32 -0
  123. data/lib/cassandra/statements.rb +23 -0
  124. data/lib/cassandra/statements/batch.rb +146 -0
  125. data/lib/cassandra/statements/bound.rb +65 -0
  126. data/lib/cassandra/statements/prepared.rb +235 -0
  127. data/lib/cassandra/statements/simple.rb +118 -0
  128. data/lib/cassandra/statements/void.rb +38 -0
  129. data/lib/cassandra/table.rb +240 -0
  130. data/lib/cassandra/time.rb +103 -0
  131. data/lib/cassandra/time_uuid.rb +78 -0
  132. data/lib/cassandra/timestamp_generator.rb +37 -0
  133. data/lib/cassandra/timestamp_generator/simple.rb +38 -0
  134. data/lib/cassandra/timestamp_generator/ticking_on_duplicate.rb +58 -0
  135. data/lib/cassandra/trigger.rb +67 -0
  136. data/lib/cassandra/tuple.rb +131 -0
  137. data/lib/cassandra/types.rb +1704 -0
  138. data/lib/cassandra/udt.rb +443 -0
  139. data/lib/cassandra/util.rb +464 -0
  140. data/lib/cassandra/uuid.rb +110 -0
  141. data/lib/cassandra/uuid/generator.rb +212 -0
  142. data/lib/cassandra/version.rb +21 -0
  143. data/lib/datastax/cassandra.rb +47 -0
  144. data/lib/ycql.rb +842 -0
  145. metadata +243 -0
@@ -0,0 +1,78 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 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 variant of UUID which can extract its time component.
21
+ #
22
+ # You can use {Cassandra::Uuid::Generator} to generate {Cassandra::TimeUuid}s
23
+ class TimeUuid < Uuid
24
+ include Comparable
25
+
26
+ # @private
27
+ LOWER_HALF_MASK = 0xffffffff_ffffffff
28
+ # @private
29
+ GREGORIAN_OFFSET = 122192928000000000
30
+
31
+ # Returns the time component from this UUID as a Time.
32
+ #
33
+ # @return [Time]
34
+ def to_time
35
+ t = time_bits - GREGORIAN_OFFSET
36
+ seconds = t / 10_000_000
37
+ microseconds = (t - seconds * 10_000_000) / 10.0
38
+
39
+ ::Time.at(seconds, microseconds).utc
40
+ end
41
+
42
+ # Returns the date component from this UUID as Date.
43
+ #
44
+ # This just sugar around {#to_time}
45
+ #
46
+ # @return [Date]
47
+ def to_date
48
+ to_time.to_date
49
+ end
50
+
51
+ # Compares this timeuuid with another timeuuid
52
+ #
53
+ # @param other [Cassandra::TimeUuid] another timeuuid to compare
54
+ # @see Comparable
55
+ #
56
+ # @return [nil] when other is not a {Cassandra::Uuid}
57
+ # @return [Integer] `-1` when less than `other`, `0` when equal to `other`
58
+ # and `1` when greater than `other`
59
+ def <=>(other)
60
+ return nil unless other.is_a?(Cassandra::Uuid)
61
+ c = value <=> other.value
62
+ return c if c == 0 || !other.is_a?(Cassandra::TimeUuid)
63
+ time_bits <=> other.time_bits
64
+ end
65
+
66
+ protected
67
+
68
+ # @private
69
+ def time_bits
70
+ n = (value >> 64)
71
+ t = 0
72
+ t |= (n & 0x0000000000000fff) << 48
73
+ t |= (n & 0x00000000ffff0000) << 16
74
+ t |= (n & 0xffffffff00000000) >> 32
75
+ t
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 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 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 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
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 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
+ # Represents a trigger on a cassandra table
21
+ class Trigger
22
+ # @return [Cassandra::Table] table that the trigger applies to.
23
+ attr_reader :table
24
+ # @return [String] name of the trigger.
25
+ attr_reader :name
26
+ # @return [Hash] options of the trigger.
27
+ attr_reader :options
28
+
29
+ # @private
30
+ def initialize(table,
31
+ name,
32
+ options)
33
+ @table = table
34
+ @name = name.freeze
35
+ @options = options.freeze
36
+ end
37
+
38
+ # @return [String] name of the trigger class
39
+ def custom_class_name
40
+ @options['class']
41
+ end
42
+
43
+ # @return [String] a cql representation of this trigger
44
+ def to_cql
45
+ keyspace_name = Util.escape_name(@table.keyspace.name)
46
+ table_name = Util.escape_name(@table.name)
47
+ trigger_name = Util.escape_name(@name)
48
+
49
+ "CREATE TRIGGER #{trigger_name} ON #{keyspace_name}.#{table_name} USING '#{@options['class']}';"
50
+ end
51
+
52
+ # @private
53
+ def eql?(other)
54
+ other.is_a?(Trigger) &&
55
+ @table == other.table &&
56
+ @name == other.name &&
57
+ @options == other.options
58
+ end
59
+ alias == eql?
60
+
61
+ # @private
62
+ def inspect
63
+ "#<#{self.class.name}:0x#{object_id.to_s(16)} " \
64
+ "@name=#{@name.inspect} @table=#{@table.inspect} @options=#{@options.inspect}>"
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,131 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 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
+ class Tuple
21
+ # @private
22
+ class Strict < Tuple
23
+ attr_reader :types
24
+
25
+ def initialize(types, values)
26
+ @types = types
27
+ @values = values
28
+ end
29
+
30
+ def each(&block)
31
+ @types.size.times do |i|
32
+ yield(@values[i])
33
+ end
34
+ self
35
+ end
36
+
37
+ def [](i)
38
+ @values[Integer(i)]
39
+ end
40
+
41
+ def fetch(i)
42
+ i = Integer(i)
43
+ raise ::IndexError, "index #{i} is outside of tuple, size: #{@types.size}" if i < 0 || i >= @types.size
44
+ @values[i]
45
+ end
46
+
47
+ def []=(i, value)
48
+ raise ::IndexError, "index #{i} is outside of tuple, size: #{@types.size}" if i < 0 || i >= @types.size
49
+ Util.assert_type(@types[i], value)
50
+ @values[i] = value
51
+ end
52
+
53
+ def size
54
+ @types.size
55
+ end
56
+
57
+ def inspect
58
+ "#<Cassandra::Tuple:0x#{object_id.to_s(16)} types=#{@types.inspect}, []=#{@values.inspect}>"
59
+ end
60
+ end
61
+
62
+ include Enumerable
63
+
64
+ # Constructs a tuple with given values
65
+ def initialize(*values)
66
+ @values = values
67
+ end
68
+
69
+ # Iterates over all values of the tuple
70
+ # @yieldparam value [Object] current value
71
+ def each(&block)
72
+ @values.each(&block)
73
+ self
74
+ end
75
+
76
+ # @param i [Integer] numeric index of the value inside the tuple, must
77
+ # be `0 < i < tuple.size`
78
+ # @return [Object] value of the tuple at position `i`
79
+ def [](i)
80
+ @values[Integer(i)]
81
+ end
82
+
83
+ # @param i [Integer] numeric index of the value inside the tuple, must
84
+ # be `0 < i < tuple.size`
85
+ # @raise [IndexError] when index is outside of tuple bounds
86
+ # @return [Object] value of the tuple at position `i`
87
+ def fetch(i)
88
+ i = Integer(i)
89
+ raise ::IndexError, "index #{i} is outside of tuple, size: #{@values.size}" if i < 0 || i >= @values.size
90
+ @values[i]
91
+ end
92
+
93
+ # @param i [Integer] numeric index of the value inside the tuple, must
94
+ # be `0 < i < tuple.size`
95
+ # @param value [Object] a value to assign at position `i`
96
+ # @raise [IndexError] when index is outside of tuple bounds
97
+ # @return [Object] value of the tuple at position `i`
98
+ def []=(i, value)
99
+ i = Integer(i)
100
+ raise ::IndexError, "index #{i} is outside of tuple, size: #{@values.size}" if i < 0 || i >= @values.size
101
+ @values[i] = value
102
+ end
103
+
104
+ # Returns tuple size
105
+ # @return [Integer] tuple size
106
+ def size
107
+ @values.size
108
+ end
109
+
110
+ # String representation of the tuple
111
+ def to_s
112
+ "(#{@values.map(&:to_s).join(', ')})"
113
+ end
114
+
115
+ # @private
116
+ def inspect
117
+ "#<Cassandra::Tuple:0x#{object_id.to_s(16)} []=#{@values.inspect}>"
118
+ end
119
+
120
+ # @private
121
+ def eql?(other)
122
+ other == @values
123
+ end
124
+ alias == eql?
125
+
126
+ # @private
127
+ def hash
128
+ @values.inject(17) {|h, v| 31 * h + v.hash}
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,1704 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 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
+ # Base class for all cassandra types.
21
+ # @abstract This class exists for documentation purposes only
22
+ class Type
23
+ # @return [Symbol] shorthand type name
24
+ attr_reader :kind
25
+
26
+ def initialize(kind)
27
+ @kind = kind
28
+ end
29
+
30
+ # Coerces a given value to this type
31
+ #
32
+ # @param values [*Object] value to be coerced
33
+ # @return [Object] a value of this type
34
+ def new(*values)
35
+ end
36
+
37
+ # Asserts that a given value is of this type
38
+ # @param value [Object] value to be validated
39
+ # @param message [String] error message to use when assertion fails
40
+ # @yieldreturn [String] error message to use when assertion fails
41
+ # @raise [ArgumentError] if the value is invalid
42
+ # @return [void]
43
+ def assert(value, message = nil, &block)
44
+ end
45
+
46
+ # @return [String] a cassandra representation of this type
47
+ def to_s
48
+ end
49
+ end
50
+
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
+
58
+ # @private
59
+ class Simple < Type
60
+ def new(value)
61
+ __send__(:"new_#{@kind}", value)
62
+ end
63
+
64
+ def assert(value, message = nil, &block)
65
+ __send__(:"assert_#{@kind}", value, message, &block)
66
+ nil
67
+ end
68
+
69
+ def to_s
70
+ @kind.to_s
71
+ end
72
+
73
+ def hash
74
+ @hash ||= 31 * 17 + @kind.hash
75
+ end
76
+
77
+ def eql?(other)
78
+ other.is_a?(Simple) && @kind == other.kind
79
+ end
80
+
81
+ alias == eql?
82
+
83
+ private
84
+
85
+ def new_varchar(value)
86
+ String(value)
87
+ end
88
+
89
+ def assert_varchar(value, message, &block)
90
+ Util.assert_instance_of(::String, value, message, &block)
91
+ end
92
+
93
+ def new_text(value)
94
+ String(value)
95
+ end
96
+
97
+ def assert_text(value, message, &block)
98
+ Util.assert_instance_of(::String, value, message, &block)
99
+ end
100
+
101
+ def new_blob(value)
102
+ String(value)
103
+ end
104
+
105
+ def assert_blob(value, message, &block)
106
+ Util.assert_instance_of(::String, value, message, &block)
107
+ end
108
+
109
+ def new_ascii(value)
110
+ String(value)
111
+ end
112
+
113
+ def assert_ascii(value, message, &block)
114
+ Util.assert_instance_of(::String, value, message, &block)
115
+ end
116
+
117
+ def new_bigint(value)
118
+ Integer(value)
119
+ end
120
+
121
+ def assert_bigint(value, message, &block)
122
+ Util.assert_instance_of(::Integer, value, message, &block)
123
+ end
124
+
125
+ def new_counter(value)
126
+ Integer(value)
127
+ end
128
+
129
+ def assert_counter(value, message, &block)
130
+ Util.assert_instance_of(::Integer, value, message, &block)
131
+ end
132
+
133
+ def new_int(value)
134
+ Integer(value)
135
+ end
136
+
137
+ def assert_int(value, message, &block)
138
+ Util.assert_instance_of(::Integer, value, message, &block)
139
+ end
140
+
141
+ def new_varint(value)
142
+ Integer(value)
143
+ end
144
+
145
+ def assert_varint(value, message, &block)
146
+ Util.assert_instance_of(::Integer, value, message, &block)
147
+ end
148
+
149
+ def new_boolean(value)
150
+ !value.nil? && value != false
151
+ end
152
+
153
+ def assert_boolean(value, message, &block)
154
+ Util.assert_instance_of_one_of([::TrueClass, ::FalseClass],
155
+ value,
156
+ message,
157
+ &block)
158
+ end
159
+
160
+ def new_decimal(value)
161
+ ::BigDecimal.new(value)
162
+ end
163
+
164
+ def assert_decimal(value, message, &block)
165
+ Util.assert_instance_of(::BigDecimal, value, message, &block)
166
+ end
167
+
168
+ def new_double(value)
169
+ Float(value)
170
+ end
171
+
172
+ def assert_double(value, message, &block)
173
+ Util.assert_instance_of(::Float, value, message, &block)
174
+ end
175
+
176
+ def new_float(value)
177
+ Float(value)
178
+ end
179
+
180
+ def assert_float(value, message, &block)
181
+ Util.assert_instance_of(::Float, value, message, &block)
182
+ end
183
+
184
+ def new_inet(value)
185
+ ::IPAddr.new(value)
186
+ end
187
+
188
+ def assert_inet(value, message, &block)
189
+ Util.assert_instance_of(::IPAddr, value, message, &block)
190
+ end
191
+
192
+ def new_timestamp(value)
193
+ case value
194
+ when ::Time
195
+ value
196
+ else
197
+ return value.to_time if value.respond_to?(:to_time)
198
+ raise ::ArgumentError, "cannot convert #{value.inspect} to timestamp"
199
+ end
200
+ end
201
+
202
+ def assert_timestamp(value, message, &block)
203
+ Util.assert_instance_of(::Time, value, message, &block)
204
+ end
205
+
206
+ def new_uuid(value)
207
+ Cassandra::Uuid.new(value)
208
+ end
209
+
210
+ def assert_uuid(value, message, &block)
211
+ Util.assert_instance_of(Cassandra::Uuid, value, message, &block)
212
+ end
213
+
214
+ def new_timeuuid(value)
215
+ Cassandra::TimeUuid.new(value)
216
+ end
217
+
218
+ def assert_timeuuid(value, message, &block)
219
+ Util.assert_instance_of(Cassandra::TimeUuid, value, message, &block)
220
+ end
221
+
222
+ def new_date(value)
223
+ case value
224
+ when ::Date
225
+ value
226
+ else
227
+ return value.to_date if value.respond_to?(:to_date)
228
+ raise ::ArgumentError, "cannot convert #{value.inspect} to date"
229
+ end
230
+ end
231
+
232
+ def assert_date(value, message, &block)
233
+ Util.assert_instance_of(::Date, value, message, &block)
234
+ end
235
+
236
+ def new_smallint(value)
237
+ Integer(value)
238
+ end
239
+
240
+ def assert_smallint(value, message, &block)
241
+ Util.assert_instance_of(::Integer, value, message, &block)
242
+ Util.assert(value <= 32767 && value >= -32768, message, &block)
243
+ end
244
+
245
+ def new_time(value)
246
+ case value
247
+ when ::Integer
248
+ Time.new(value)
249
+ else
250
+ return Time.new(value.to_nanoseconds) if value.respond_to?(:to_nanoseconds)
251
+ raise ::ArgumentError, "cannot convert #{value.inspect} to time"
252
+ end
253
+ end
254
+
255
+ def assert_time(value, message, &block)
256
+ Util.assert_instance_of(Cassandra::Time, value, message, &block)
257
+ end
258
+
259
+ def new_tinyint(value)
260
+ Integer(value)
261
+ end
262
+
263
+ def assert_tinyint(value, message, &block)
264
+ Util.assert_instance_of(::Integer, value, message, &block)
265
+ Util.assert(value <= 127 && value >= -128, message, &block)
266
+ end
267
+ end
268
+
269
+ # @!parse
270
+ # class Ascii < Type
271
+ # # @return [Symbol] `:ascii`
272
+ # # @see Cassandra::Type#kind
273
+ # def kind
274
+ # end
275
+ #
276
+ # # Coerces the value to String
277
+ # # @param value [Object] original value
278
+ # # @return [String] value
279
+ # # @see Cassandra::Type#new
280
+ # def new(value)
281
+ # end
282
+ #
283
+ # # Asserts that a given value is a String
284
+ # # @param value [Object] value to be validated
285
+ # # @param message [String] error message to use when assertion
286
+ # # fails
287
+ # # @yieldreturn [String] error message to use when assertion fails
288
+ # # @raise [ArgumentError] if the value is not a String
289
+ # # @return [void]
290
+ # # @see Cassandra::Type#assert
291
+ # def assert(value, message = nil, &block)
292
+ # end
293
+ #
294
+ # # @return [String] `"ascii"`
295
+ # # @see Cassandra::Type#to_s
296
+ # def to_s
297
+ # end
298
+ # end
299
+ const_set('Ascii', Simple.new(:ascii))
300
+
301
+ # @!parse
302
+ # class Bigint < Type
303
+ # # @return [Symbol] `:bigint`
304
+ # # @see Cassandra::Type#kind
305
+ # def kind
306
+ # end
307
+ #
308
+ # # Coerces the value to Integer
309
+ # # @param value [Object] original value
310
+ # # @return [Integer] value
311
+ # # @see Cassandra::Type#new
312
+ # def new(value)
313
+ # end
314
+ #
315
+ # # Asserts that a given value is an Integer
316
+ # # @param value [Object] value to be validated
317
+ # # @param message [String] error message to use when assertion
318
+ # # fails
319
+ # # @yieldreturn [String] error message to use when assertion fails
320
+ # # @raise [ArgumentError] if the value is not an Integer
321
+ # # @return [void]
322
+ # # @see Cassandra::Type#assert
323
+ # def assert(value, message = nil, &block)
324
+ # end
325
+ #
326
+ # # @return [String] `"bigint"`
327
+ # # @see Cassandra::Type#to_s
328
+ # def to_s
329
+ # end
330
+ # end
331
+ const_set('Bigint', Simple.new(:bigint))
332
+
333
+ # @!parse
334
+ # class Blob < Type
335
+ # # @return [Symbol] `:blob`
336
+ # # @see Cassandra::Type#kind
337
+ # def kind
338
+ # end
339
+ #
340
+ # # Coerces the value to String
341
+ # # @param value [Object] original value
342
+ # # @return [String] value
343
+ # # @see Cassandra::Type#new
344
+ # def new(value)
345
+ # end
346
+ #
347
+ # # Asserts that a given value is a String
348
+ # # @param value [Object] value to be validated
349
+ # # @param message [String] error message to use when assertion
350
+ # # fails
351
+ # # @yieldreturn [String] error message to use when assertion fails
352
+ # # @raise [ArgumentError] if the value is not a String
353
+ # # @return [void]
354
+ # # @see Cassandra::Type#assert
355
+ # def assert(value, message = nil, &block)
356
+ # end
357
+ #
358
+ # # @return [String] `"blob"`
359
+ # # @see Cassandra::Type#to_s
360
+ # def to_s
361
+ # end
362
+ # end
363
+ const_set('Blob', Simple.new(:blob))
364
+
365
+ # @!parse
366
+ # class Boolean < Type
367
+ # # @return [Symbol] `:boolean`
368
+ # # @see Cassandra::Type#kind
369
+ # def kind
370
+ # end
371
+ #
372
+ # # Coerces the value to `true` or `false`
373
+ # # @param value [Object] original value
374
+ # # @return [Boolean] value
375
+ # # @see Cassandra::Type#new
376
+ # def new(value)
377
+ # end
378
+ #
379
+ # # Asserts that a given value is a `true` or `false`
380
+ # # @param value [Object] value to be validated
381
+ # # @param message [String] error message to use when assertion
382
+ # # fails
383
+ # # @yieldreturn [String] error message to use when assertion fails
384
+ # # @raise [ArgumentError] if the value is not `true` or `false`
385
+ # # @return [void]
386
+ # # @see Cassandra::Type#assert
387
+ # def assert(value, message = nil, &block)
388
+ # end
389
+ #
390
+ # # @return [String] `"boolean"`
391
+ # # @see Cassandra::Type#to_s
392
+ # def to_s
393
+ # end
394
+ # end
395
+ const_set('Boolean', Simple.new(:boolean))
396
+
397
+ # @!parse
398
+ # class Counter < Type
399
+ # # @return [Symbol] `:counter`
400
+ # # @see Cassandra::Type#kind
401
+ # def kind
402
+ # end
403
+ #
404
+ # # Coerces the value to Integer
405
+ # # @param value [Object] original value
406
+ # # @return [Integer] value
407
+ # # @see Cassandra::Type#new
408
+ # def new(value)
409
+ # end
410
+ #
411
+ # # Asserts that a given value is an Integer
412
+ # # @param value [Object] value to be validated
413
+ # # @param message [String] error message to use when assertion
414
+ # # fails
415
+ # # @yieldreturn [String] error message to use when assertion fails
416
+ # # @raise [ArgumentError] if the value is not an Integer
417
+ # # @return [void]
418
+ # # @see Cassandra::Type#assert
419
+ # def assert(value, message = nil, &block)
420
+ # end
421
+ #
422
+ # # @return [String] `"counter"`
423
+ # # @see Cassandra::Type#to_s
424
+ # def to_s
425
+ # end
426
+ # end
427
+ const_set('Counter', Simple.new(:counter))
428
+
429
+ # @!parse
430
+ # class Date < Type
431
+ # # @return [Symbol] `:date`
432
+ # # @see Cassandra::Type#kind
433
+ # def kind
434
+ # end
435
+ #
436
+ # # Coerces the value to Date
437
+ # # @param value [Object] original value
438
+ # # @return [Date] value
439
+ # # @see Cassandra::Type#new
440
+ # def new(value)
441
+ # end
442
+ #
443
+ # # Asserts that a given value is a Date
444
+ # # @param value [Object] value to be validated
445
+ # # @param message [String] error message to use when assertion
446
+ # # fails
447
+ # # @yieldreturn [String] error message to use when assertion fails
448
+ # # @raise [ArgumentError] if the value is not a Date
449
+ # # @return [void]
450
+ # # @see Cassandra::Type#assert
451
+ # def assert(value, message = nil, &block)
452
+ # end
453
+ #
454
+ # # @return [String] `"date"`
455
+ # # @see Cassandra::Type#to_s
456
+ # def to_s
457
+ # end
458
+ # end
459
+ const_set('Date', Simple.new(:date))
460
+
461
+ # @!parse
462
+ # class Decimal < Type
463
+ # # @return [Symbol] `:decimal`
464
+ # # @see Cassandra::Type#kind
465
+ # def kind
466
+ # end
467
+ #
468
+ # # Coerces the value to BigDecimal
469
+ # # @param value [Object] original value
470
+ # # @return [BigDecimal] value
471
+ # # @see Cassandra::Type#new
472
+ # def new(value)
473
+ # end
474
+ #
475
+ # # Asserts that a given value is a BigDecimal
476
+ # # @param value [Object] value to be validated
477
+ # # @param message [String] error message to use when assertion
478
+ # # fails
479
+ # # @yieldreturn [String] error message to use when assertion fails
480
+ # # @raise [ArgumentError] if the value is not a BigDecimal
481
+ # # @return [void]
482
+ # # @see Cassandra::Type#assert
483
+ # def assert(value, message = nil, &block)
484
+ # end
485
+ #
486
+ # # @return [String] `"decimal"`
487
+ # # @see Cassandra::Type#to_s
488
+ # def to_s
489
+ # end
490
+ # end
491
+ const_set('Decimal', Simple.new(:decimal))
492
+
493
+ # @!parse
494
+ # class Double < Type
495
+ # # @return [Symbol] `:double`
496
+ # # @see Cassandra::Type#kind
497
+ # def kind
498
+ # end
499
+ #
500
+ # # Coerces the value to Float
501
+ # # @param value [Object] original value
502
+ # # @return [Float] value
503
+ # # @see Cassandra::Type#new
504
+ # def new(value)
505
+ # end
506
+ #
507
+ # # Asserts that a given value is a Float
508
+ # # @param value [Object] value to be validated
509
+ # # @param message [String] error message to use when assertion
510
+ # # fails
511
+ # # @yieldreturn [String] error message to use when assertion fails
512
+ # # @raise [ArgumentError] if the value is not a Float
513
+ # # @return [void]
514
+ # # @see Cassandra::Type#assert
515
+ # def assert(value, message = nil, &block)
516
+ # end
517
+ #
518
+ # # @return [String] `"double"`
519
+ # # @see Cassandra::Type#to_s
520
+ # def to_s
521
+ # end
522
+ # end
523
+ const_set('Double', Simple.new(:double))
524
+
525
+ # @!parse
526
+ # class Float < Type
527
+ # # @return [Symbol] `:float`
528
+ # # @see Cassandra::Type#kind
529
+ # def kind
530
+ # end
531
+ #
532
+ # # Coerces the value to Float
533
+ # # @param value [Object] original value
534
+ # # @return [Float] value
535
+ # # @see Cassandra::Type#new
536
+ # def new(value)
537
+ # end
538
+ #
539
+ # # Asserts that a given value is a Float
540
+ # # @param value [Object] value to be validated
541
+ # # @param message [String] error message to use when assertion
542
+ # # fails
543
+ # # @yieldreturn [String] error message to use when assertion fails
544
+ # # @raise [ArgumentError] if the value is not a Float
545
+ # # @return [void]
546
+ # # @see Cassandra::Type#assert
547
+ # def assert(value, message = nil, &block)
548
+ # end
549
+ #
550
+ # # @return [String] `"float"`
551
+ # # @see Cassandra::Type#to_s
552
+ # def to_s
553
+ # end
554
+ # end
555
+ const_set('Float', Simple.new(:float))
556
+
557
+ # @!parse
558
+ # class Inet < Type
559
+ # # @return [Symbol] `:inet`
560
+ # # @see Cassandra::Type#kind
561
+ # def kind
562
+ # end
563
+ #
564
+ # # Coerces the value to IPAddr
565
+ # # @param value [Object] original value
566
+ # # @return [IPAddr] value
567
+ # # @see Cassandra::Type#new
568
+ # def new(value)
569
+ # end
570
+ #
571
+ # # Asserts that a given value is an IPAddr
572
+ # # @param value [Object] value to be validated
573
+ # # @param message [String] error message to use when assertion
574
+ # # fails
575
+ # # @yieldreturn [String] error message to use when assertion fails
576
+ # # @raise [ArgumentError] if the value is not an IPAddr
577
+ # # @return [void]
578
+ # # @see Cassandra::Type#assert
579
+ # def assert(value, message = nil, &block)
580
+ # end
581
+ #
582
+ # # @return [String] `"inet"`
583
+ # # @see Cassandra::Type#to_s
584
+ # def to_s
585
+ # end
586
+ # end
587
+ const_set('Inet', Simple.new(:inet))
588
+
589
+ # @!parse
590
+ # class Int < Type
591
+ # # @return [Symbol] `:int`
592
+ # # @see Cassandra::Type#kind
593
+ # def kind
594
+ # end
595
+ #
596
+ # # Coerces the value to Integer
597
+ # # @param value [Object] original value
598
+ # # @return [Integer] value
599
+ # # @see Cassandra::Type#new
600
+ # def new(value)
601
+ # end
602
+ #
603
+ # # Asserts that a given value is an Integer
604
+ # # @param value [Object] value to be validated
605
+ # # @param message [String] error message to use when assertion
606
+ # # fails
607
+ # # @yieldreturn [String] error message to use when assertion fails
608
+ # # @raise [ArgumentError] if the value is not an Integer
609
+ # # @return [void]
610
+ # # @see Cassandra::Type#assert
611
+ # def assert(value, message = nil, &block)
612
+ # end
613
+ #
614
+ # # @return [String] `"int"`
615
+ # # @see Cassandra::Type#to_s
616
+ # def to_s
617
+ # end
618
+ # end
619
+ const_set('Int', Simple.new(:int))
620
+
621
+ class List < Type
622
+ # @private
623
+ attr_reader :value_type
624
+
625
+ # @private
626
+ def initialize(value_type)
627
+ super(:list)
628
+ @value_type = value_type
629
+ end
630
+
631
+ # Coerces the value to Array
632
+ # @param value [Object] original value
633
+ # @return [Array] value
634
+ # @see Cassandra::Type#new
635
+ def new(*value)
636
+ value = Array(value.first) if value.one?
637
+
638
+ value.each do |v|
639
+ Util.assert_type(@value_type, v)
640
+ end
641
+ value
642
+ end
643
+
644
+ # Asserts that a given value is an Array
645
+ # @param value [Object] value to be validated
646
+ # @param message [String] error message to use when assertion fails
647
+ # @yieldreturn [String] error message to use when assertion fails
648
+ # @raise [ArgumentError] if the value is not an Array
649
+ # @return [void]
650
+ # @see Cassandra::Type#assert
651
+ def assert(value, message = nil, &block)
652
+ Util.assert_instance_of(::Array, value, message, &block)
653
+ value.each do |v|
654
+ Util.assert_type(@value_type, v, message, &block)
655
+ end
656
+ nil
657
+ end
658
+
659
+ # @return [String] `"list<type>"`
660
+ # @see Cassandra::Type#to_s
661
+ def to_s
662
+ "list<#{@value_type}>"
663
+ end
664
+
665
+ def hash
666
+ @hash ||= begin
667
+ h = 17
668
+ h = 31 * h + @kind.hash
669
+ h = 31 * h + @value_type.hash
670
+ h
671
+ end
672
+ end
673
+
674
+ def eql?(other)
675
+ other.is_a?(List) && @value_type == other.value_type
676
+ end
677
+
678
+ alias == eql?
679
+ end
680
+
681
+ class Map < Type
682
+ # @private
683
+ attr_reader :key_type, :value_type
684
+
685
+ # @private
686
+ def initialize(key_type, value_type)
687
+ super(:map)
688
+ @key_type = key_type
689
+ @value_type = value_type
690
+ end
691
+
692
+ # Coerces the value to Hash
693
+ # @param value [Object] original value
694
+ # @return [Hash] value
695
+ # @see Cassandra::Type#new
696
+ def new(*value)
697
+ value = value.first if value.one?
698
+
699
+ case value
700
+ when ::Hash
701
+ value.each do |k, v|
702
+ Util.assert_type(@key_type, k)
703
+ Util.assert_type(@value_type, v)
704
+ end
705
+ value
706
+ when ::Array
707
+ result = ::Hash.new
708
+ value.each_slice(2) do |(k, v)|
709
+ Util.assert_type(@key_type, k)
710
+ Util.assert_type(@value_type, v)
711
+ result[k] = v
712
+ end
713
+ result
714
+ else
715
+ raise ::ArgumentError, "cannot convert #{value.inspect} to #{self}"
716
+ end
717
+ end
718
+
719
+ # Asserts that a given value is a Hash
720
+ # @param value [Object] value to be validated
721
+ # @param message [String] error message to use when assertion fails
722
+ # @yieldreturn [String] error message to use when assertion fails
723
+ # @raise [ArgumentError] if the value is not a Hash
724
+ # @return [void]
725
+ # @see Cassandra::Type#assert
726
+ def assert(value, message = nil, &block)
727
+ Util.assert_instance_of(::Hash, value, message, &block)
728
+ value.each do |k, v|
729
+ Util.assert_type(@key_type, k, message, &block)
730
+ Util.assert_type(@value_type, v, message, &block)
731
+ end
732
+ nil
733
+ end
734
+
735
+ # @return [String] `"map<type, type>"`
736
+ # @see Cassandra::Type#to_s
737
+ def to_s
738
+ "map<#{@key_type}, #{@value_type}>"
739
+ end
740
+
741
+ def hash
742
+ @hash ||= begin
743
+ h = 17
744
+ h = 31 * h + @kind.hash
745
+ h = 31 * h + @key_type.hash
746
+ h = 31 * h + @value_type.hash
747
+ h
748
+ end
749
+ end
750
+
751
+ def eql?(other)
752
+ other.is_a?(Map) &&
753
+ @key_type == other.key_type &&
754
+ @value_type == other.value_type
755
+ end
756
+
757
+ alias == eql?
758
+ end
759
+
760
+ class Set < Type
761
+ # @private
762
+ attr_reader :value_type
763
+
764
+ # @private
765
+ def initialize(value_type)
766
+ super(:set)
767
+ @value_type = value_type
768
+ end
769
+
770
+ # Coerces the value to Set
771
+ # @param value [Object] original value
772
+ # @return [Set] value
773
+ # @see Cassandra::Type#new
774
+ # @example Creating a set using splat arguments
775
+ # include Cassandra::Types
776
+ #
777
+ # set(varchar).new('Jane', 'Alice', 'Loren') => #<Set: {"Jane", "Alice", "Loren"}>
778
+ #
779
+ # @example Coercing an existing set
780
+ # include Cassandra::Types
781
+ #
782
+ # set(varchar).new(Set['Jane', 'Alice', 'Loren']) => #<Set: {"Jane", "Alice", "Loren"}>
783
+ #
784
+ # @example Coercing an array
785
+ # include Cassandra::Types
786
+ #
787
+ # set(varchar).new(['Jane', 'Alice', 'Loren']) => #<Set: {"Jane", "Alice", "Loren"}>
788
+ def new(*value)
789
+ value = value.first if value.one?
790
+
791
+ case value
792
+ when ::Array
793
+ result = ::Set.new
794
+ value.each do |v|
795
+ Util.assert_type(@value_type, v)
796
+ result << v
797
+ end
798
+ result
799
+ when ::Set
800
+ value.each do |v|
801
+ Util.assert_type(@value_type, v)
802
+ end
803
+ value
804
+ else
805
+ Util.assert_type(@value_type, value)
806
+ ::Set[value]
807
+ end
808
+ end
809
+
810
+ # Asserts that a given value is an Set
811
+ # @param value [Object] value to be validated
812
+ # @param message [String] error message to use when assertion fails
813
+ # @yieldreturn [String] error message to use when assertion fails
814
+ # @raise [ArgumentError] if the value is not an Set
815
+ # @return [void]
816
+ # @see Cassandra::Type#assert
817
+ def assert(value, message = nil, &block)
818
+ Util.assert_instance_of(::Set, value, message, &block)
819
+ value.each do |v|
820
+ Util.assert_type(@value_type, v, message, &block)
821
+ end
822
+ nil
823
+ end
824
+
825
+ # @return [String] `"set<type>"`
826
+ # @see Cassandra::Type#to_s
827
+ def to_s
828
+ "set<#{@value_type}>"
829
+ end
830
+
831
+ def hash
832
+ @hash ||= begin
833
+ h = 17
834
+ h = 31 * h + @kind.hash
835
+ h = 31 * h + @value_type.hash
836
+ h
837
+ end
838
+ end
839
+
840
+ def eql?(other)
841
+ other.is_a?(Set) && @value_type == other.value_type
842
+ end
843
+
844
+ alias == eql?
845
+ end
846
+
847
+ # @!parse
848
+ # class Smallint < Type
849
+ # # @return [Symbol] `:smallint`
850
+ # # @see Cassandra::Type#kind
851
+ # def kind
852
+ # end
853
+ #
854
+ # # Coerces the value to an Integer
855
+ # # @param value [Object] original value
856
+ # # @return [Integer] value
857
+ # # @see Cassandra::Type#new
858
+ # def new(value)
859
+ # end
860
+ #
861
+ # # Asserts that a given value is an Integer
862
+ # # @param value [Object] value to be validated
863
+ # # @param message [String] error message to use when assertion
864
+ # # fails
865
+ # # @yieldreturn [String] error message to use when assertion fails
866
+ # # @raise [ArgumentError] if the value is not an Integer
867
+ # # @return [void]
868
+ # # @see Cassandra::Type#assert
869
+ # def assert(value, message = nil, &block)
870
+ # end
871
+ #
872
+ # # @return [String] `"smallint"`
873
+ # # @see Cassandra::Type#to_s
874
+ # def to_s
875
+ # end
876
+ # end
877
+ const_set('Smallint', Simple.new(:smallint))
878
+
879
+ # @!parse
880
+ # class Text < Type
881
+ # # @return [Symbol] `:text`
882
+ # # @see Cassandra::Type#kind
883
+ # def kind
884
+ # end
885
+ #
886
+ # # Coerces the value to String
887
+ # # @param value [Object] original value
888
+ # # @return [String] value
889
+ # # @see Cassandra::Type#new
890
+ # def new(value)
891
+ # end
892
+ #
893
+ # # Asserts that a given value is a String
894
+ # # @param value [Object] value to be validated
895
+ # # @param message [String] error message to use when assertion
896
+ # # fails
897
+ # # @yieldreturn [String] error message to use when assertion fails
898
+ # # @raise [ArgumentError] if the value is not a String
899
+ # # @return [void]
900
+ # # @see Cassandra::Type#assert
901
+ # def assert(value, message = nil, &block)
902
+ # end
903
+ #
904
+ # # @return [String] `"text"`
905
+ # # @see Cassandra::Type#to_s
906
+ # def to_s
907
+ # end
908
+ # end
909
+ const_set('Text', Simple.new(:text))
910
+
911
+ # @!parse
912
+ # class Time < Type
913
+ # # @return [Symbol] `:time`
914
+ # # @see Cassandra::Type#kind
915
+ # def kind
916
+ # end
917
+ #
918
+ # # Coerces the value to Time
919
+ # # @param value [Object] original value
920
+ # # @return [Time] value
921
+ # # @see Cassandra::Type#new
922
+ # def new(value)
923
+ # end
924
+ #
925
+ # # Asserts that a given value is a Time
926
+ # # @param value [Object] value to be validated
927
+ # # @param message [String] error message to use when assertion
928
+ # # fails
929
+ # # @yieldreturn [String] error message to use when assertion fails
930
+ # # @raise [ArgumentError] if the value is not a String
931
+ # # @return [void]
932
+ # # @see Cassandra::Type#assert
933
+ # def assert(value, message = nil, &block)
934
+ # end
935
+ #
936
+ # # @return [String] `"time"`
937
+ # # @see Cassandra::Type#to_s
938
+ # def to_s
939
+ # end
940
+ # end
941
+ const_set('Time', Simple.new(:time))
942
+
943
+ # @!parse
944
+ # class Timestamp < Type
945
+ # # @return [Symbol] `:timestamp`
946
+ # # @see Cassandra::Type#kind
947
+ # def kind
948
+ # end
949
+ #
950
+ # # Coerces the value to Time
951
+ # # @param value [Object] original value
952
+ # # @return [Time] value
953
+ # # @see Cassandra::Type#new
954
+ # def new(value)
955
+ # end
956
+ #
957
+ # # Asserts that a given value is a Time
958
+ # # @param value [Object] value to be validated
959
+ # # @param message [String] error message to use when assertion
960
+ # # fails
961
+ # # @yieldreturn [String] error message to use when assertion fails
962
+ # # @raise [ArgumentError] if the value is not a Time
963
+ # # @return [void]
964
+ # # @see Cassandra::Type#assert
965
+ # def assert(value, message = nil, &block)
966
+ # end
967
+ #
968
+ # # @return [String] `"timestamp"`
969
+ # # @see Cassandra::Type#to_s
970
+ # def to_s
971
+ # end
972
+ # end
973
+ const_set('Timestamp', Simple.new(:timestamp))
974
+
975
+ # @!parse
976
+ # class Timeuuid < Type
977
+ # # @return [Symbol] `:timeuuid`
978
+ # # @see Cassandra::Type#kind
979
+ # def kind
980
+ # end
981
+ #
982
+ # # Coerces the value to Cassandra::Timeuuid
983
+ # # @param value [Object] original value
984
+ # # @return [Cassandra::Timeuuid] value
985
+ # # @see Cassandra::Type#new
986
+ # def new(value)
987
+ # end
988
+ #
989
+ # # Asserts that a given value is a Cassandra::Timeuuid
990
+ # # @param value [Object] value to be validated
991
+ # # @param message [String] error message to use when assertion
992
+ # # fails
993
+ # # @yieldreturn [String] error message to use when assertion fails
994
+ # # @raise [ArgumentError] if the value is not a Cassandra::Timeuuid
995
+ # # @return [void]
996
+ # # @see Cassandra::Type#assert
997
+ # def assert(value, message = nil, &block)
998
+ # end
999
+ #
1000
+ # # @return [String] `"timeuuid"`
1001
+ # # @see Cassandra::Type#to_s
1002
+ # def to_s
1003
+ # end
1004
+ # end
1005
+ const_set('Timeuuid', Simple.new(:timeuuid))
1006
+
1007
+ # @!parse
1008
+ # class Tinyint < Type
1009
+ # # @return [Symbol] `:tinyint`
1010
+ # # @see Cassandra::Type#kind
1011
+ # def kind
1012
+ # end
1013
+ #
1014
+ # # Coerces the value to Integer
1015
+ # # @param value [Object] original value
1016
+ # # @return [Integer] value
1017
+ # # @see Cassandra::Type#new
1018
+ # def new(value)
1019
+ # end
1020
+ #
1021
+ # # Asserts that a given value is an Integer
1022
+ # # @param value [Object] value to be validated
1023
+ # # @param message [String] error message to use when assertion
1024
+ # # fails
1025
+ # # @yieldreturn [String] error message to use when assertion fails
1026
+ # # @raise [ArgumentError] if the value is not an Integer
1027
+ # # @return [void]
1028
+ # # @see Cassandra::Type#assert
1029
+ # def assert(value, message = nil, &block)
1030
+ # end
1031
+ #
1032
+ # # @return [String] `"tinyint"`
1033
+ # # @see Cassandra::Type#to_s
1034
+ # def to_s
1035
+ # end
1036
+ # end
1037
+ const_set('Tinyint', Simple.new(:tinyint))
1038
+
1039
+ class Tuple < Type
1040
+ # @private
1041
+ attr_reader :members
1042
+
1043
+ # @private
1044
+ def initialize(*members)
1045
+ super(:tuple)
1046
+ @members = members
1047
+ end
1048
+
1049
+ # Coerces the value to Cassandra::Tuple
1050
+ # @param values [*Object] tuple values
1051
+ # @return [Cassandra::Tuple] value
1052
+ # @see Cassandra::Type#new
1053
+ # @example Creating a tuple
1054
+ # include Cassandra::Types
1055
+ #
1056
+ # tuple(varchar, varchar, int).new('Jane', 'Smith', 38) # => (Jane, Smith, 38)
1057
+ def new(*values)
1058
+ Util.assert(values.size <= @members.size) do
1059
+ "too many values: #{values.size} out of max #{@members.size}"
1060
+ end
1061
+ values.each_with_index do |v, i|
1062
+ Util.assert_type(@members[i], v)
1063
+ end
1064
+ Cassandra::Tuple::Strict.new(@members, values)
1065
+ end
1066
+
1067
+ # Asserts that a given value is an Cassandra::Tuple
1068
+ # @param value [Object] value to be validated
1069
+ # @param message [String] error message to use when assertion fails
1070
+ # @yieldreturn [String] error message to use when assertion fails
1071
+ # @raise [ArgumentError] if the value is not an Cassandra::Tuple
1072
+ # @return [void]
1073
+ # @see Cassandra::Type#assert
1074
+ def assert(value, message = nil, &block)
1075
+ Util.assert_instance_of(Cassandra::Tuple, value, message, &block)
1076
+ Util.assert(value.size <= @members.size, message, &block)
1077
+ @members.each_with_index do |type, i|
1078
+ Util.assert_type(type, value[i], message, &block)
1079
+ end
1080
+ nil
1081
+ end
1082
+
1083
+ # @return [String] `"tuple<type, type, type...>"`
1084
+ # @see Cassandra::Type#to_s
1085
+ def to_s
1086
+ "tuple<#{@members.map(&:to_s).join(', ')}>"
1087
+ end
1088
+
1089
+ def hash
1090
+ @hash ||= begin
1091
+ h = 17
1092
+ h = 31 * h + @kind.hash
1093
+ h = 31 * h + @members.hash
1094
+ h
1095
+ end
1096
+ end
1097
+
1098
+ def eql?(other)
1099
+ other.is_a?(Tuple) && @members == other.members
1100
+ end
1101
+
1102
+ alias == eql?
1103
+ end
1104
+
1105
+ # @!parse
1106
+ # class Uuid < Type
1107
+ # # @return [Symbol] `:uuid`
1108
+ # # @see Cassandra::Type#kind
1109
+ # def kind
1110
+ # end
1111
+ #
1112
+ # # Coerces the value to Cassandra::Uuid
1113
+ # # @param value [Object] original value
1114
+ # # @return [Cassandra::Uuid] value
1115
+ # # @see Cassandra::Type#new
1116
+ # def new(value)
1117
+ # end
1118
+ #
1119
+ # # Asserts that a given value is a Cassandra::Uuid
1120
+ # # @param value [Object] value to be validated
1121
+ # # @param message [String] error message to use when assertion
1122
+ # # fails
1123
+ # # @yieldreturn [String] error message to use when assertion fails
1124
+ # # @raise [ArgumentError] if the value is not a Cassandra::Uuid
1125
+ # # @return [void]
1126
+ # # @see Cassandra::Type#assert
1127
+ # def assert(value, message = nil, &block)
1128
+ # end
1129
+ #
1130
+ # # @return [String] `"uuid"`
1131
+ # # @see Cassandra::Type#to_s
1132
+ # def to_s
1133
+ # end
1134
+ # end
1135
+ const_set('Uuid', Simple.new(:uuid))
1136
+
1137
+ # @!parse
1138
+ # class Varint < Type
1139
+ # # @return [Symbol] `:varint`
1140
+ # # @see Cassandra::Type#kind
1141
+ # def kind
1142
+ # end
1143
+ #
1144
+ # # Coerces the value to Integer
1145
+ # # @param value [Object] original value
1146
+ # # @return [Integer] value
1147
+ # # @see Cassandra::Type#new
1148
+ # def new(value)
1149
+ # end
1150
+ #
1151
+ # # Asserts that a given value is an Integer
1152
+ # # @param value [Object] value to be validated
1153
+ # # @param message [String] error message to use when assertion
1154
+ # # fails
1155
+ # # @yieldreturn [String] error message to use when assertion fails
1156
+ # # @raise [ArgumentError] if the value is not an Integer
1157
+ # # @return [void]
1158
+ # # @see Cassandra::Type#assert
1159
+ # def assert(value, message = nil, &block)
1160
+ # end
1161
+ #
1162
+ # # @return [String] `"varint"`
1163
+ # # @see Cassandra::Type#to_s
1164
+ # def to_s
1165
+ # end
1166
+ # end
1167
+ const_set('Varint', Simple.new(:varint))
1168
+
1169
+ class UserDefined < Type
1170
+ class Field
1171
+ # @return [String] name of this field
1172
+ attr_reader :name
1173
+ # @return [Cassandra::Type] type of this field
1174
+ attr_reader :type
1175
+
1176
+ # @private
1177
+ def initialize(name, type)
1178
+ @name = name
1179
+ @type = type
1180
+ end
1181
+
1182
+ # String representation of the field
1183
+ # @return [String] String representation of the field
1184
+ def to_s
1185
+ "#{@name} #{@type}"
1186
+ end
1187
+
1188
+ def hash
1189
+ @hash ||= begin
1190
+ h = 17
1191
+ h = 31 * h + @name.hash
1192
+ h = 31 * h + @type.hash
1193
+ h
1194
+ end
1195
+ end
1196
+
1197
+ def eql?(other)
1198
+ other.is_a?(Field) &&
1199
+ @name == other.name &&
1200
+ @type == other.type
1201
+ end
1202
+
1203
+ alias == eql?
1204
+ end
1205
+
1206
+ # @return [String] keyspace where this type is defined
1207
+ attr_reader :keyspace
1208
+
1209
+ # @return [String] name of this type
1210
+ attr_reader :name
1211
+
1212
+ # @private
1213
+ attr_reader :fields
1214
+
1215
+ # @private
1216
+ def initialize(keyspace, name, fields)
1217
+ super(:udt)
1218
+ @keyspace = keyspace
1219
+ @name = name
1220
+ @fields = fields
1221
+ end
1222
+
1223
+ # @param name [String] field name
1224
+ # @return [Boolean] whether this type has a given field
1225
+ def has_field?(name)
1226
+ @fields.any? { |f| f.name == name }
1227
+ end
1228
+
1229
+ # Yield or enumerate each field defined in this type
1230
+ # @overload each_field
1231
+ # @yieldparam field [Cassandra::UserDefined::Field] field
1232
+ # @return [Cassandra::Types::UserDefined] self
1233
+ # @overload each_field
1234
+ # @return [Array<Array<String, Cassandra::Type>>] a list of fields
1235
+ def each_field(&block)
1236
+ if block_given?
1237
+ @fields.each(&block)
1238
+ self
1239
+ else
1240
+ @fields.dup
1241
+ end
1242
+ end
1243
+
1244
+ alias fields each_field
1245
+
1246
+ # @param name [String] field name
1247
+ # @return [Cassandra::UserDefined::Field, nil] a field with this name or
1248
+ # nil
1249
+ def field(name)
1250
+ @fields.find { |f| f.name == name }
1251
+ end
1252
+
1253
+ # Coerces the value to Cassandra::UDT
1254
+ # @param value [Object] original value
1255
+ # @return [Cassandra::UDT] value
1256
+ # @see Cassandra::Type#new
1257
+ def new(*value)
1258
+ value = value.first if value.one?
1259
+ value = Array(value) unless value.is_a?(::Hash)
1260
+
1261
+ Util.assert(value.size <= @fields.size) do
1262
+ "too many values: #{value.size} out of #{@fields.size}"
1263
+ end
1264
+
1265
+ case value
1266
+ when ::Array
1267
+ result = ::Hash.new
1268
+ value.each_with_index do |v, i|
1269
+ f = @fields[i]
1270
+ Util.assert_type(f.type, v)
1271
+ result[f.name] = v
1272
+ end
1273
+ when ::Hash
1274
+ result = ::Hash.new
1275
+ @fields.each do |f|
1276
+ n = f.name
1277
+ v = value[n]
1278
+ Util.assert_type(f.type, v)
1279
+ result[n] = v
1280
+ end
1281
+ end
1282
+
1283
+ Cassandra::UDT::Strict.new(@keyspace, @name, @fields, result)
1284
+ end
1285
+
1286
+ # Asserts that a given value is an Cassandra::UDT
1287
+ # @param value [Object] value to be validated
1288
+ # @param message [String] error message to use when assertion fails
1289
+ # @yieldreturn [String] error message to use when assertion fails
1290
+ # @raise [ArgumentError] if the value is not an Cassandra::UDT
1291
+ # @return [void]
1292
+ # @see Cassandra::Type#assert
1293
+ def assert(value, message = nil, &block)
1294
+ Util.assert_instance_of(Cassandra::UDT, value, message, &block)
1295
+ Util.assert(value.size <= @fields.size, message, &block)
1296
+ @fields.each do |field|
1297
+ Util.assert_type(field.type, value[field.name], message, &block)
1298
+ end
1299
+ nil
1300
+ end
1301
+
1302
+ # @return [String] `"keyspace.name"`
1303
+ # @see Cassandra::Type#to_s
1304
+ def to_s
1305
+ "#{Util.escape_name(@keyspace)}.#{Util.escape_name(@name)} " \
1306
+ "{#{@fields.join(', ')}}"
1307
+ end
1308
+
1309
+ def hash
1310
+ @hash ||= begin
1311
+ h = 17
1312
+ h = 31 * h + @kind.hash
1313
+ h = 31 * h + @keyspace.hash
1314
+ h = 31 * h + @name.hash
1315
+ h = 31 * h + @fields.hash
1316
+ h
1317
+ end
1318
+ end
1319
+
1320
+ def eql?(other)
1321
+ other.is_a?(UserDefined) &&
1322
+ @keyspace == other.keyspace &&
1323
+ @name == other.name &&
1324
+ @fields == other.fields
1325
+ end
1326
+
1327
+ alias == eql?
1328
+
1329
+ # Output this type in CQL
1330
+ def to_cql
1331
+ cql = "CREATE TYPE #{Util.escape_name(@keyspace)}.#{Util.escape_name(@name)} " \
1332
+ "(\n"
1333
+ first = true
1334
+
1335
+ @fields.each do |field|
1336
+ if first
1337
+ first = false
1338
+ else
1339
+ cql << ",\n" unless first
1340
+ end
1341
+ cql << " #{field.name} #{type_to_cql(field.type)}"
1342
+ end
1343
+
1344
+ cql << "\n);"
1345
+
1346
+ cql
1347
+ end
1348
+
1349
+ private
1350
+
1351
+ # @private
1352
+ def type_to_cql(type)
1353
+ case type.kind
1354
+ when :tuple
1355
+ "frozen <#{type}>"
1356
+ when :udt
1357
+ if @keyspace == type.keyspace
1358
+ "frozen <#{Util.escape_name(type.name)}>"
1359
+ else
1360
+ "frozen <#{Util.escape_name(type.keyspace)}.#{Util.escape_name(type.name)}>"
1361
+ end
1362
+ else
1363
+ type.to_s
1364
+ end
1365
+ end
1366
+ end
1367
+
1368
+ class Custom < Type
1369
+ attr_reader :name
1370
+
1371
+ def initialize(name)
1372
+ super(:custom)
1373
+ @name = name
1374
+ end
1375
+
1376
+ # Coerces a given value to this type
1377
+ #
1378
+ # @param value [*Object] value to be coerced
1379
+ # @return [Object] a value of this type
1380
+ def new(*value)
1381
+ raise ::NotImplementedError,
1382
+ "unable to create a value for custom type: #{@name.inspect}"
1383
+ end
1384
+
1385
+ # Asserts that a given value is of this type
1386
+ # @param value [Object] value to be validated
1387
+ # @param message [String] error message to use when assertion fails
1388
+ # @yieldreturn [String] error message to use when assertion fails
1389
+ # @raise [ArgumentError] if the value is invalid
1390
+ # @return [void]
1391
+ def assert(value, message = nil, &block)
1392
+ Util.assert_instance_of(CustomData, value, message, &block)
1393
+ Util.assert_equal(self, value.class.type, message, &block)
1394
+ end
1395
+
1396
+ # @return [String] a cassandra representation of this type
1397
+ def to_s
1398
+ "'#{@name}'"
1399
+ end
1400
+
1401
+ def hash
1402
+ @hash ||= begin
1403
+ h = 17
1404
+ h = 31 * h + @kind.hash
1405
+ h = 31 * h + @name.hash
1406
+ h
1407
+ end
1408
+ end
1409
+
1410
+ def eql?(other)
1411
+ other.is_a?(Custom) && @name == other.name
1412
+ end
1413
+
1414
+ alias == eql?
1415
+ end
1416
+
1417
+ class Frozen < Type
1418
+ # @private
1419
+ attr_reader :value_type
1420
+
1421
+ # @private
1422
+ def initialize(value_type)
1423
+ super(:frozen)
1424
+ @value_type = value_type
1425
+ end
1426
+
1427
+ # Coerces the value to Array
1428
+ # @param value [Object] original value
1429
+ # @return [Array] value
1430
+ # @see Cassandra::Type#new
1431
+ def new(*value)
1432
+ value = Array(value.first) if value.one?
1433
+
1434
+ value.each do |v|
1435
+ Util.assert_type(@value_type, v)
1436
+ end
1437
+ value
1438
+ end
1439
+
1440
+ # Asserts that a given value is an Array
1441
+ # @param value [Object] value to be validated
1442
+ # @param message [String] error message to use when assertion fails
1443
+ # @yieldreturn [String] error message to use when assertion fails
1444
+ # @raise [ArgumentError] if the value is not an Array
1445
+ # @return [void]
1446
+ # @see Cassandra::Type#assert
1447
+ def assert(value, message = nil, &block)
1448
+ Util.assert_instance_of(::Array, value, message, &block)
1449
+ value.each do |v|
1450
+ Util.assert_type(@value_type, v, message, &block)
1451
+ end
1452
+ nil
1453
+ end
1454
+
1455
+ # @return [String] `"list<type>"`
1456
+ # @see Cassandra::Type#to_s
1457
+ def to_s
1458
+ "frozen<#{@value_type}>"
1459
+ end
1460
+
1461
+ def hash
1462
+ @hash ||= begin
1463
+ h = 17
1464
+ h = 31 * h + @kind.hash
1465
+ h = 31 * h + @value_type.hash
1466
+ h
1467
+ end
1468
+ end
1469
+
1470
+ def eql?(other)
1471
+ other.is_a?(List) && @value_type == other.value_type
1472
+ end
1473
+
1474
+ alias == eql?
1475
+ end
1476
+
1477
+ def frozen(value_type)
1478
+ Util.assert_instance_of(Cassandra::Type, value_type,
1479
+ "frozen type must be a Cassandra::Type, #{value_type.inspect} given")
1480
+
1481
+ Frozen.new(value_type)
1482
+ end
1483
+
1484
+ # @return [Cassandra::Types::Text] text type since varchar is an alias for text
1485
+ def varchar
1486
+ Text
1487
+ end
1488
+
1489
+ # @return [Cassandra::Types::Text] text type
1490
+ def text
1491
+ Text
1492
+ end
1493
+
1494
+ # @return [Cassandra::Types::Blob] blob type
1495
+ def blob
1496
+ Blob
1497
+ end
1498
+
1499
+ # @return [Cassandra::Types::Ascii] ascii type
1500
+ def ascii
1501
+ Ascii
1502
+ end
1503
+
1504
+ # @return [Cassandra::Types::Bigint] bigint type
1505
+ def bigint
1506
+ Bigint
1507
+ end
1508
+
1509
+ # @return [Cassandra::Types::Counter] counter type
1510
+ def counter
1511
+ Counter
1512
+ end
1513
+
1514
+ # @return [Cassandra::Types::Int] int type
1515
+ def int
1516
+ Int
1517
+ end
1518
+
1519
+ # @return [Cassandra::Types::Varint] varint type
1520
+ def varint
1521
+ Varint
1522
+ end
1523
+
1524
+ # @return [Cassandra::Types::Boolean] boolean type
1525
+ def boolean
1526
+ Boolean
1527
+ end
1528
+
1529
+ # @return [Cassandra::Types::Decimal] decimal type
1530
+ def decimal
1531
+ Decimal
1532
+ end
1533
+
1534
+ # @return [Cassandra::Types::Double] double type
1535
+ def double
1536
+ Double
1537
+ end
1538
+
1539
+ # @return [Cassandra::Types::Float] float type
1540
+ def float
1541
+ Float
1542
+ end
1543
+
1544
+ # @return [Cassandra::Types::Inet] inet type
1545
+ def inet
1546
+ Inet
1547
+ end
1548
+
1549
+ # @return [Cassandra::Types::Timestamp] timestamp type
1550
+ def timestamp
1551
+ Timestamp
1552
+ end
1553
+
1554
+ # @return [Cassandra::Types::Uuid] uuid type
1555
+ def uuid
1556
+ Uuid
1557
+ end
1558
+
1559
+ # @return [Cassandra::Types::Timeuuid] timeuuid type
1560
+ def timeuuid
1561
+ Timeuuid
1562
+ end
1563
+
1564
+ # @return [Cassandra::Types::Date] date type
1565
+ def date
1566
+ Date
1567
+ end
1568
+
1569
+ # @return [Cassandra::Types::Time] time type
1570
+ def time
1571
+ Time
1572
+ end
1573
+
1574
+ # @return [Cassandra::Types::Smallint] smallint type
1575
+ def smallint
1576
+ Smallint
1577
+ end
1578
+
1579
+ # @return [Cassandra::Types::Tinyint] tinyint type
1580
+ def tinyint
1581
+ Tinyint
1582
+ end
1583
+
1584
+ # @param value_type [Cassandra::Type] the type of elements in this list
1585
+ # @return [Cassandra::Types::List] list type
1586
+ def list(value_type)
1587
+ Util.assert_instance_of(Cassandra::Type, value_type,
1588
+ "list type must be a Cassandra::Type, #{value_type.inspect} given")
1589
+
1590
+ List.new(value_type)
1591
+ end
1592
+
1593
+ # @param key_type [Cassandra::Type] the type of keys in this map
1594
+ # @param value_type [Cassandra::Type] the type of values in this map
1595
+ # @return [Cassandra::Types::Map] map type
1596
+ def map(key_type, value_type)
1597
+ Util.assert_instance_of(Cassandra::Type, key_type,
1598
+ "map key type must be a Cassandra::Type, #{key_type.inspect} given")
1599
+ Util.assert_instance_of(Cassandra::Type, value_type,
1600
+ "map value type must be a Cassandra::Type, #{value_type.inspect} given")
1601
+
1602
+ Map.new(key_type, value_type)
1603
+ end
1604
+
1605
+ # @param value_type [Cassandra::Type] the type of values in this set
1606
+ # @return [Cassandra::Types::Set] set type
1607
+ def set(value_type)
1608
+ Util.assert_instance_of(Cassandra::Type, value_type,
1609
+ "set type must be a Cassandra::Type, #{value_type.inspect} given")
1610
+
1611
+ Set.new(value_type)
1612
+ end
1613
+
1614
+ # @param members [*Cassandra::Type] types of members of this tuple
1615
+ # @return [Cassandra::Types::Tuple] tuple type
1616
+ def tuple(*members)
1617
+ Util.assert_not_empty(members, 'tuple must contain at least one member')
1618
+ members.each do |member|
1619
+ Util.assert_instance_of(Cassandra::Type, member,
1620
+ 'each tuple member must be a Cassandra::Type, ' \
1621
+ "#{member.inspect} given")
1622
+ end
1623
+
1624
+ Tuple.new(*members)
1625
+ end
1626
+
1627
+ # Creates a User Defined Type instance
1628
+ # @example Various ways of defining the same UDT
1629
+ # include Cassandra::Types
1630
+ #
1631
+ # udt('simplex', 'address', {'street' => varchar,
1632
+ # 'city' => varchar,
1633
+ # 'state' => varchar,
1634
+ # 'zip' => varchar}) #=> simplex.address
1635
+ #
1636
+ # udt('simplex', 'address', [['street', varchar],
1637
+ # ['city', varchar],
1638
+ # ['state', varchar],
1639
+ # ['zip', varchar]]) #=> simplex.address
1640
+ #
1641
+ # udt('simplex', 'address', ['street', varchar],
1642
+ # ['city', varchar],
1643
+ # ['state', varchar],
1644
+ # ['zip', varchar]) #=> simplex.address
1645
+ #
1646
+ # udt('simplex', 'address', 'street', varchar,
1647
+ # 'city', varchar,
1648
+ # 'state', varchar,
1649
+ # 'zip', varchar) #=> simplex.address
1650
+ # @param keyspace [String] name of the keyspace that this UDT is defined in
1651
+ # @param name [String] name of this UDT
1652
+ # @param fields [Hash<String, Cassandra::Type>,
1653
+ # Array<Array<String, Cassandra::Type>>,
1654
+ # *(String, Cassandra::Type),
1655
+ # *Array<String, Cassandra::Type>] UDT field types
1656
+ # @return [Cassandra::Types::UserDefined] user defined type
1657
+ def udt(keyspace, name, *fields)
1658
+ keyspace = String(keyspace)
1659
+ name = String(name)
1660
+ fields = Array(fields.first) if fields.one?
1661
+
1662
+ Util.assert_not_empty(fields,
1663
+ 'user-defined type must contain at least one field')
1664
+
1665
+ if fields.first.is_a?(::Array)
1666
+ fields = fields.map do |pair|
1667
+ Util.assert(pair.size == 2,
1668
+ 'fields of a user-defined type must be an Array of name and ' \
1669
+ "value pairs, #{pair.inspect} given")
1670
+ Util.assert_instance_of(::String, pair[0],
1671
+ 'each field name for a user-defined type must be a String, ' \
1672
+ "#{pair[0].inspect} given")
1673
+ Util.assert_instance_of(Cassandra::Type, pair[1],
1674
+ 'each field type for a user-defined type must be a ' \
1675
+ "Cassandra::Type, #{pair[1].inspect} given")
1676
+
1677
+ UserDefined::Field.new(*pair)
1678
+ end
1679
+ else
1680
+ Util.assert(fields.size.even?,
1681
+ 'fields of a user-defined type must be an Array of alternating ' \
1682
+ "names and values pairs, #{fields.inspect} given")
1683
+ fields = fields.each_slice(2).map do |field_name, field_type|
1684
+ Util.assert_instance_of(::String, field_name,
1685
+ 'each field name for a user-defined type must be a String, ' \
1686
+ "#{field_name.inspect} given")
1687
+ Util.assert_instance_of(Cassandra::Type, field_type,
1688
+ 'each field type for a user-defined type must be a ' \
1689
+ "Cassandra::Type, #{field_type.inspect} given")
1690
+
1691
+ UserDefined::Field.new(field_name, field_type)
1692
+ end
1693
+ end
1694
+
1695
+ UserDefined.new(keyspace, name, fields)
1696
+ end
1697
+
1698
+ # @param name [String] name of the custom type
1699
+ # @return [Cassandra::Types::Custom] custom type
1700
+ def custom(name)
1701
+ Custom.new(name)
1702
+ end
1703
+ end
1704
+ end