yugabyte-ycql-driver 3.2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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