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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +106 -39
  3. data/lib/cassandra.rb +396 -148
  4. data/lib/cassandra/address_resolution.rb +1 -1
  5. data/lib/cassandra/address_resolution/policies/ec2_multi_region.rb +1 -1
  6. data/lib/cassandra/address_resolution/policies/none.rb +1 -1
  7. data/lib/cassandra/aggregate.rb +21 -7
  8. data/lib/cassandra/argument.rb +2 -2
  9. data/lib/cassandra/attr_boolean.rb +33 -0
  10. data/lib/cassandra/auth.rb +6 -5
  11. data/lib/cassandra/auth/providers.rb +1 -1
  12. data/lib/cassandra/auth/providers/password.rb +5 -13
  13. data/lib/cassandra/cassandra_logger.rb +80 -0
  14. data/lib/cassandra/cluster.rb +49 -9
  15. data/lib/cassandra/cluster/client.rb +835 -209
  16. data/lib/cassandra/cluster/connection_pool.rb +2 -2
  17. data/lib/cassandra/cluster/connector.rb +86 -27
  18. data/lib/cassandra/cluster/control_connection.rb +222 -95
  19. data/lib/cassandra/cluster/failed_connection.rb +1 -1
  20. data/lib/cassandra/cluster/metadata.rb +14 -8
  21. data/lib/cassandra/cluster/options.rb +68 -22
  22. data/lib/cassandra/cluster/registry.rb +81 -17
  23. data/lib/cassandra/cluster/schema.rb +70 -8
  24. data/lib/cassandra/cluster/schema/cql_type_parser.rb +15 -10
  25. data/lib/cassandra/cluster/schema/fetchers.rb +601 -241
  26. data/lib/cassandra/cluster/schema/fqcn_type_parser.rb +39 -38
  27. data/lib/cassandra/cluster/schema/partitioners.rb +1 -1
  28. data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +6 -8
  29. data/lib/cassandra/cluster/schema/partitioners/ordered.rb +1 -1
  30. data/lib/cassandra/cluster/schema/partitioners/random.rb +1 -1
  31. data/lib/cassandra/cluster/schema/replication_strategies.rb +1 -1
  32. data/lib/cassandra/cluster/schema/replication_strategies/network_topology.rb +19 -18
  33. data/lib/cassandra/cluster/schema/replication_strategies/none.rb +1 -1
  34. data/lib/cassandra/cluster/schema/replication_strategies/simple.rb +1 -1
  35. data/lib/cassandra/column.rb +4 -23
  36. data/lib/cassandra/column_container.rb +322 -0
  37. data/lib/cassandra/compression.rb +1 -1
  38. data/lib/cassandra/compression/compressors/lz4.rb +7 -8
  39. data/lib/cassandra/compression/compressors/snappy.rb +4 -3
  40. data/lib/cassandra/driver.rb +107 -46
  41. data/lib/cassandra/errors.rb +303 -52
  42. data/lib/cassandra/execution/info.rb +16 -5
  43. data/lib/cassandra/execution/options.rb +102 -55
  44. data/lib/cassandra/execution/trace.rb +16 -9
  45. data/lib/cassandra/executors.rb +1 -1
  46. data/lib/cassandra/function.rb +19 -13
  47. data/lib/cassandra/function_collection.rb +85 -0
  48. data/lib/cassandra/future.rb +101 -49
  49. data/lib/cassandra/host.rb +25 -5
  50. data/lib/cassandra/index.rb +118 -0
  51. data/lib/cassandra/keyspace.rb +169 -33
  52. data/lib/cassandra/listener.rb +1 -1
  53. data/lib/cassandra/load_balancing.rb +2 -2
  54. data/lib/cassandra/load_balancing/policies.rb +1 -1
  55. data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +39 -25
  56. data/lib/cassandra/load_balancing/policies/round_robin.rb +8 -1
  57. data/lib/cassandra/load_balancing/policies/token_aware.rb +22 -13
  58. data/lib/cassandra/load_balancing/policies/white_list.rb +18 -5
  59. data/lib/cassandra/materialized_view.rb +90 -0
  60. data/lib/cassandra/null_logger.rb +27 -6
  61. data/lib/cassandra/protocol.rb +1 -1
  62. data/lib/cassandra/protocol/coder.rb +81 -42
  63. data/lib/cassandra/protocol/cql_byte_buffer.rb +58 -44
  64. data/lib/cassandra/protocol/cql_protocol_handler.rb +57 -54
  65. data/lib/cassandra/protocol/request.rb +6 -7
  66. data/lib/cassandra/protocol/requests/auth_response_request.rb +3 -3
  67. data/lib/cassandra/protocol/requests/batch_request.rb +17 -8
  68. data/lib/cassandra/protocol/requests/credentials_request.rb +3 -3
  69. data/lib/cassandra/protocol/requests/execute_request.rb +39 -20
  70. data/lib/cassandra/protocol/requests/options_request.rb +1 -1
  71. data/lib/cassandra/protocol/requests/prepare_request.rb +5 -5
  72. data/lib/cassandra/protocol/requests/query_request.rb +28 -23
  73. data/lib/cassandra/protocol/requests/register_request.rb +2 -2
  74. data/lib/cassandra/protocol/requests/startup_request.rb +8 -8
  75. data/lib/cassandra/protocol/requests/void_query_request.rb +1 -1
  76. data/lib/cassandra/protocol/response.rb +3 -4
  77. data/lib/cassandra/protocol/responses/already_exists_error_response.rb +12 -2
  78. data/lib/cassandra/protocol/responses/auth_challenge_response.rb +4 -5
  79. data/lib/cassandra/protocol/responses/auth_success_response.rb +4 -5
  80. data/lib/cassandra/protocol/responses/authenticate_response.rb +4 -5
  81. data/lib/cassandra/protocol/responses/error_response.rb +104 -17
  82. data/lib/cassandra/protocol/responses/event_response.rb +3 -4
  83. data/lib/cassandra/protocol/responses/function_failure_error_response.rb +13 -2
  84. data/lib/cassandra/protocol/responses/prepared_result_response.rb +14 -9
  85. data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +14 -9
  86. data/lib/cassandra/protocol/responses/read_failure_error_response.rb +26 -4
  87. data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +22 -3
  88. data/lib/cassandra/protocol/responses/ready_response.rb +6 -7
  89. data/lib/cassandra/protocol/responses/result_response.rb +11 -10
  90. data/lib/cassandra/protocol/responses/rows_result_response.rb +8 -7
  91. data/lib/cassandra/protocol/responses/schema_change_event_response.rb +8 -8
  92. data/lib/cassandra/protocol/responses/schema_change_result_response.rb +19 -13
  93. data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +5 -6
  94. data/lib/cassandra/protocol/responses/status_change_event_response.rb +5 -6
  95. data/lib/cassandra/protocol/responses/supported_response.rb +4 -5
  96. data/lib/cassandra/protocol/responses/topology_change_event_response.rb +4 -5
  97. data/lib/cassandra/protocol/responses/unavailable_error_response.rb +20 -3
  98. data/lib/cassandra/protocol/responses/unprepared_error_response.rb +11 -2
  99. data/lib/cassandra/protocol/responses/void_result_response.rb +4 -5
  100. data/lib/cassandra/protocol/responses/write_failure_error_response.rb +26 -4
  101. data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +22 -3
  102. data/lib/cassandra/protocol/v1.rb +98 -37
  103. data/lib/cassandra/protocol/v3.rb +121 -50
  104. data/lib/cassandra/protocol/v4.rb +172 -68
  105. data/lib/cassandra/reconnection.rb +1 -1
  106. data/lib/cassandra/reconnection/policies.rb +1 -1
  107. data/lib/cassandra/reconnection/policies/constant.rb +2 -4
  108. data/lib/cassandra/reconnection/policies/exponential.rb +6 -6
  109. data/lib/cassandra/result.rb +55 -20
  110. data/lib/cassandra/retry.rb +8 -8
  111. data/lib/cassandra/retry/policies.rb +1 -1
  112. data/lib/cassandra/retry/policies/default.rb +1 -1
  113. data/lib/cassandra/retry/policies/downgrading_consistency.rb +4 -2
  114. data/lib/cassandra/retry/policies/fallthrough.rb +1 -1
  115. data/lib/cassandra/session.rb +24 -16
  116. data/lib/cassandra/statement.rb +1 -1
  117. data/lib/cassandra/statements.rb +1 -1
  118. data/lib/cassandra/statements/batch.rb +16 -10
  119. data/lib/cassandra/statements/bound.rb +10 -3
  120. data/lib/cassandra/statements/prepared.rb +62 -18
  121. data/lib/cassandra/statements/simple.rb +23 -10
  122. data/lib/cassandra/statements/void.rb +1 -1
  123. data/lib/cassandra/table.rb +53 -185
  124. data/lib/cassandra/time.rb +11 -6
  125. data/lib/cassandra/time_uuid.rb +12 -14
  126. data/lib/cassandra/timestamp_generator.rb +37 -0
  127. data/lib/cassandra/timestamp_generator/simple.rb +38 -0
  128. data/lib/cassandra/timestamp_generator/ticking_on_duplicate.rb +58 -0
  129. data/lib/cassandra/tuple.rb +4 -4
  130. data/lib/cassandra/types.rb +109 -71
  131. data/lib/cassandra/udt.rb +66 -50
  132. data/lib/cassandra/util.rb +155 -15
  133. data/lib/cassandra/uuid.rb +20 -21
  134. data/lib/cassandra/uuid/generator.rb +7 -5
  135. data/lib/cassandra/version.rb +2 -2
  136. data/lib/cassandra_murmur3.jar +0 -0
  137. data/lib/datastax/cassandra.rb +1 -1
  138. metadata +27 -16
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -32,17 +32,28 @@ module Cassandra
32
32
  attr_reader :options
33
33
  # @return [Array<Cassandra::Host>] a list of attempted hosts
34
34
  attr_reader :hosts
35
- # Actual consistency used, it can differ from consistency in {Cassandra::Execution::Info#options} if a retry policy modified it.
35
+ # Actual consistency used, it can differ from consistency in
36
+ # {Cassandra::Execution::Info#options} if a retry policy modified it.
36
37
  # @return [Symbol] one of {Cassandra::CONSISTENCIES}
37
38
  attr_reader :consistency
38
39
  # @return [Integer] number of retries
39
40
  attr_reader :retries
40
- # Returns {Cassandra::Execution::Trace} if `trace: true` was passed to {Cassandra::Session#execute} or {Cassandra::Session#execute_async}
41
- # @return [Cassandra::Execution::Trace, nil] a Trace if it has been enabled for request
41
+ # Returns {Cassandra::Execution::Trace} if `trace: true` was passed to
42
+ # {Cassandra::Session#execute} or {Cassandra::Session#execute_async}
43
+ # @return [Cassandra::Execution::Trace, nil] a Trace if it has been enabled for
44
+ # request
42
45
  attr_reader :trace
43
46
 
44
47
  # @private
45
- def initialize(payload, warnings, keyspace, statement, options, hosts, consistency, retries, trace)
48
+ def initialize(payload,
49
+ warnings,
50
+ keyspace,
51
+ statement,
52
+ options,
53
+ hosts,
54
+ consistency,
55
+ retries,
56
+ trace)
46
57
  @payload = payload
47
58
  @warnings = warnings
48
59
  @keyspace = keyspace
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -38,11 +38,11 @@ module Cassandra
38
38
  # @return [String] paging state
39
39
  #
40
40
  # @note Although this feature exists to allow web applications to store
41
- # paging state in an [HTTP cookie](http://en.wikipedia.org/wiki/HTTP_cookie), **it is not safe to
42
- # expose without encrypting or otherwise securing it**. Paging state
43
- # contains information internal to the Apache Cassandra cluster, such as
44
- # partition key and data. Additionally, if a paging state is sent with CQL
45
- # statement, different from the original, the behavior of Cassandra is
41
+ # paging state in an [HTTP cookie](http://en.wikipedia.org/wiki/HTTP_cookie),
42
+ # **it is not safe to expose without encrypting or otherwise securing it**.
43
+ # Paging state contains information internal to the Apache Cassandra cluster,
44
+ # such as partition key and data. Additionally, if a paging state is sent with
45
+ # CQL statement, different from the original, the behavior of Cassandra is
46
46
  # undefined and will likely cause a server process of the coordinator of
47
47
  # such request to abort.
48
48
  #
@@ -52,8 +52,10 @@ module Cassandra
52
52
  # @return [nil, Hash<String, String>] custom outgoing payload, a map of
53
53
  # string and byte buffers.
54
54
  #
55
- # @see https://github.com/apache/cassandra/blob/33f1edcce97779c971d4f78712a9a8bf014ffbbc/doc/native_protocol_v4.spec#L127-L133 Description of custom payload in Cassandra native protocol v4.
56
- # @see https://datastax.github.io/java-driver/features/custom_payloads/#enabling-custom-payloads-on-c-nodes Enabling custom payloads on Cassandra nodes.
55
+ # @see https://github.com/apache/cassandra/blob/cassandra-3.4/doc/native_protocol_v4.spec#L125-L131 Description
56
+ # of custom payload in Cassandra native protocol v4.
57
+ # @see https://datastax.github.io/java-driver/manual/custom_payloads/#enabling-custom-payloads-on-c-nodes
58
+ # Enabling custom payloads on Cassandra nodes.
57
59
  #
58
60
  # @example Sending a custom payload
59
61
  # result = session.execute(payload: {
@@ -63,7 +65,10 @@ module Cassandra
63
65
  attr_reader :payload
64
66
 
65
67
  # @private
66
- def initialize(options)
68
+ # @param options [Hash] execution options to validate and encapsulate
69
+ # @param trusted_options [Options] (optional) base Execution::Options from which
70
+ # to create this new Options object.
71
+ def initialize(options, trusted_options = nil)
67
72
  consistency = options[:consistency]
68
73
  page_size = options[:page_size]
69
74
  trace = options[:trace]
@@ -75,61 +80,114 @@ module Cassandra
75
80
  idempotent = options[:idempotent]
76
81
  payload = options[:payload]
77
82
 
78
- Util.assert_one_of(CONSISTENCIES, consistency) { ":consistency must be one of #{CONSISTENCIES.inspect}, #{consistency.inspect} given" }
83
+ # consistency is a required attribute of an Options object. If we are creating
84
+ # an Options object from scratch (e.g. no trusted_options as base) validate the
85
+ # given consistency value (even if nil). Otherwise we're overlaying and only
86
+ # validate the consistency option if given.
87
+ if trusted_options.nil? || !consistency.nil?
88
+ Util.assert_one_of(CONSISTENCIES, consistency) do
89
+ ":consistency must be one of #{CONSISTENCIES.inspect}, " \
90
+ "#{consistency.inspect} given"
91
+ end
92
+ end
79
93
 
80
94
  unless serial_consistency.nil?
81
- Util.assert_one_of(SERIAL_CONSISTENCIES, serial_consistency) { ":serial_consistency must be one of #{SERIAL_CONSISTENCIES.inspect}, #{serial_consistency.inspect} given" }
95
+ Util.assert_one_of(SERIAL_CONSISTENCIES, serial_consistency) do
96
+ ":serial_consistency must be one of #{SERIAL_CONSISTENCIES.inspect}, " \
97
+ "#{serial_consistency.inspect} given"
98
+ end
82
99
  end
83
100
 
84
101
  unless page_size.nil?
85
102
  page_size = Integer(page_size)
86
- Util.assert(page_size > 0) { ":page_size must be a positive integer, #{page_size.inspect} given" }
103
+ Util.assert(page_size > 0) do
104
+ ":page_size must be a positive integer, #{page_size.inspect} given"
105
+ end
87
106
  end
88
107
 
89
108
  unless timeout.nil?
90
- Util.assert_instance_of(::Numeric, timeout) { ":timeout must be a number of seconds, #{timeout} given" }
109
+ Util.assert_instance_of(::Numeric, timeout) do
110
+ ":timeout must be a number of seconds, #{timeout} given"
111
+ end
91
112
  Util.assert(timeout > 0) { ":timeout must be greater than 0, #{timeout} given" }
92
113
  end
93
114
 
94
115
  unless paging_state.nil?
95
116
  paging_state = String(paging_state)
96
- Util.assert_not_empty(paging_state) { ":paging_state must not be empty" }
97
- Util.assert(!page_size.nil?) { ":page_size is required when :paging_state is given" }
117
+ Util.assert_not_empty(paging_state) { ':paging_state must not be empty' }
118
+
119
+ # We require page_size in either the new options or trusted options.
120
+ Util.assert(!page_size.nil? ||
121
+ !(trusted_options.nil? || trusted_options.page_size.nil?)) do
122
+ ':page_size is required when :paging_state is given'
123
+ end
98
124
  end
99
125
 
100
- if arguments.nil?
126
+ # :arguments defaults to empty-list, but we want to delegate to trusted_options
127
+ # if it's set. So the logic is as follows:
128
+ # If an arguments option was given, validate and use it regardless of anything
129
+ # else.
130
+ # Otherwise, if we have trusted_options, leave arguments nil for now so as not
131
+ # to override trusted_options. Finally, if we don't have an arguments option
132
+ # nor do we have trusted_options, fall back to the default empty-list.
133
+ #
134
+ # :type_hints works exactly the same way.
135
+ if !arguments.nil?
136
+ Util.assert_instance_of_one_of([::Array, ::Hash], arguments) do
137
+ ":arguments must be an Array or a Hash, #{arguments.inspect} given"
138
+ end
139
+ elsif trusted_options.nil?
101
140
  arguments = EMPTY_LIST
102
- else
103
- Util.assert_instance_of_one_of([::Array, ::Hash], arguments) { ":arguments must be an Array or a Hash, #{arguments.inspect} given" }
104
141
  end
105
142
 
106
- if type_hints.nil?
143
+ if !type_hints.nil?
144
+ Util.assert_instance_of_one_of([::Array, ::Hash], type_hints) do
145
+ ":type_hints must be an Array or a Hash, #{type_hints.inspect} given"
146
+ end
147
+ elsif trusted_options.nil?
107
148
  type_hints = EMPTY_LIST
108
- else
109
- Util.assert_instance_of_one_of([::Array, ::Hash], type_hints) { ":type_hints must be an Array or a Hash, #{type_hints.inspect} given" }
110
149
  end
111
150
 
112
151
  unless payload.nil?
113
- Util.assert_instance_of(::Hash, payload) { ":payload must be a Hash" }
114
- Util.assert_not_empty(payload) { ":payload must not be empty" }
115
- Util.assert(payload.size <= 65535) { ":payload cannot contain more than 65535 key/value pairs" }
116
-
117
- payload = payload.each_with_object(::Hash.new) do |(key, value), payload|
118
- payload[String(key)] = String(value)
119
- end
152
+ Util.assert_instance_of(::Hash, payload) { ':payload must be a Hash' }
153
+ Util.assert_not_empty(payload) { ':payload must not be empty' }
154
+ Util.assert(payload.size <= 65535) do
155
+ ':payload cannot contain more than 65535 key/value pairs'
156
+ end
157
+
158
+ payload = payload.each_with_object(::Hash.new) do |(key, value), p|
159
+ p[String(key)] = String(value)
160
+ end
120
161
  payload.freeze
121
162
  end
122
163
 
123
- @consistency = consistency
124
- @page_size = page_size
125
- @trace = !!trace
126
- @timeout = timeout
127
- @serial_consistency = serial_consistency
128
- @paging_state = paging_state
129
- @arguments = arguments
130
- @type_hints = type_hints
131
- @idempotent = !!idempotent
132
- @payload = payload
164
+ # Ok, validation is done. Time to save off all our values in our instance vars,
165
+ # merging in values from trusted_options if it's set. To keep things readable,
166
+ # we just put this into two branches of an if-else.
167
+
168
+ if trusted_options.nil?
169
+ @consistency = consistency
170
+ @page_size = page_size
171
+ @trace = !!trace
172
+ @timeout = timeout
173
+ @serial_consistency = serial_consistency
174
+ @arguments = arguments
175
+ @type_hints = type_hints
176
+ else
177
+ @consistency = consistency || trusted_options.consistency
178
+ @page_size = page_size || trusted_options.page_size
179
+ @trace = trace.nil? ? trusted_options.trace? : !!trace
180
+ @timeout = timeout || trusted_options.timeout
181
+ @serial_consistency = serial_consistency || trusted_options.serial_consistency
182
+ @arguments = arguments || trusted_options.arguments
183
+ @type_hints = type_hints || trusted_options.type_hints
184
+ end
185
+
186
+ # The following fields are *not* inherited from trusted_options, so we always
187
+ # rely on the options we were given.
188
+ @paging_state = paging_state
189
+ @idempotent = !!idempotent
190
+ @payload = payload
133
191
  end
134
192
 
135
193
  # @return [Boolean] whether request tracing was enabled
@@ -154,30 +212,19 @@ module Cassandra
154
212
  other.arguments == @arguments &&
155
213
  other.type_hints == @type_hints
156
214
  end
157
- alias :== :eql?
215
+ alias == eql?
158
216
 
159
217
  # @private
160
218
  def override(*options)
161
- merged = options.unshift(to_h).inject do |base, opts|
219
+ merged = options.unshift({}).inject do |base, opts|
162
220
  next base unless opts
163
- Util.assert_instance_of(::Hash, opts) { "options must be a Hash, #{options.inspect} given" }
221
+ Util.assert_instance_of(::Hash, opts) do
222
+ "options must be a Hash, #{options.inspect} given"
223
+ end
164
224
  base.merge!(opts)
165
225
  end
166
226
 
167
- Options.new(merged)
168
- end
169
-
170
- # @private
171
- def to_h
172
- {
173
- :consistency => @consistency,
174
- :page_size => @page_size,
175
- :trace => @trace,
176
- :timeout => @timeout,
177
- :serial_consistency => @serial_consistency,
178
- :arguments => @arguments || EMPTY_LIST,
179
- :type_hints => @type_hints || EMPTY_LIST
180
- }
227
+ Options.new(merged, self)
181
228
  end
182
229
  end
183
230
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -44,7 +44,7 @@ module Cassandra
44
44
  other == @id
45
45
  end
46
46
 
47
- alias :eql? :==
47
+ alias eql? ==
48
48
  end
49
49
 
50
50
  include MonitorMixin
@@ -124,15 +124,15 @@ module Cassandra
124
124
 
125
125
  # @private
126
126
  def inspect
127
- "#<#{self.class.name}:0x#{self.object_id.to_s(16)} @id=#{@id.inspect}>"
127
+ "#<#{self.class.name}:0x#{object_id.to_s(16)} @id=#{@id.inspect}>"
128
128
  end
129
129
 
130
130
  private
131
131
 
132
132
  # @private
133
- SELECT_SESSION = "SELECT * FROM system_traces.sessions WHERE session_id = %s"
133
+ SELECT_SESSION = 'SELECT * FROM system_traces.sessions WHERE session_id = %s'.freeze
134
134
  # @private
135
- SELECT_EVENTS = "SELECT * FROM system_traces.events WHERE session_id = %s"
135
+ SELECT_EVENTS = 'SELECT * FROM system_traces.events WHERE session_id = %s'.freeze
136
136
 
137
137
  # @private
138
138
  def load
@@ -140,11 +140,13 @@ module Cassandra
140
140
  return if @loaded
141
141
 
142
142
  attempt = 1
143
- data = @client.query(Statements::Simple.new(SELECT_SESSION % @id), VOID_OPTIONS).get.first
143
+ data = @client.query(Statements::Simple.new(SELECT_SESSION % @id),
144
+ VOID_OPTIONS).get.first
144
145
 
145
146
  while data.nil? && attempt <= 5
146
147
  sleep(attempt * 0.4)
147
- data = @client.query(Statements::Simple.new(SELECT_SESSION % @id), VOID_OPTIONS).get.first
148
+ data = @client.query(Statements::Simple.new(SELECT_SESSION % @id),
149
+ VOID_OPTIONS).get.first
148
150
  break if data
149
151
  attempt += 1
150
152
  end
@@ -170,8 +172,13 @@ module Cassandra
170
172
 
171
173
  @events = []
172
174
 
173
- @client.query(Statements::Simple.new(SELECT_EVENTS % @id), VOID_OPTIONS).get.each do |row|
174
- @events << Event.new(row['event_id'], row['activity'], row['source'], row['source_elapsed'], row['thread'])
175
+ @client.query(Statements::Simple.new(SELECT_EVENTS % @id),
176
+ VOID_OPTIONS).get.each do |row|
177
+ @events << Event.new(row['event_id'],
178
+ row['activity'],
179
+ row['source'],
180
+ row['source_elapsed'],
181
+ row['thread'])
175
182
  end
176
183
 
177
184
  @events.freeze
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
4
+ # Copyright 2013-2016 DataStax, Inc.
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -57,7 +57,7 @@ module Cassandra
57
57
  # @param name [String] argument name
58
58
  # @return [Boolean] whether this function has a given argument
59
59
  def has_argument?(name)
60
- @arguments_hash.has_key?(name)
60
+ @arguments_hash.key?(name)
61
61
  end
62
62
 
63
63
  # @param name [String] argument name
@@ -82,12 +82,12 @@ module Cassandra
82
82
  @arguments.dup
83
83
  end
84
84
  end
85
- alias :arguments :each_argument
85
+ alias arguments each_argument
86
86
 
87
87
  # Get the list of argument types for this function.
88
88
  # @return [Array<Cassandra::Type>] a list of argument types.
89
89
  def argument_types
90
- @arguments.map { |argument| argument.type }
90
+ @arguments.map(&:type)
91
91
  end
92
92
 
93
93
  # @private
@@ -101,7 +101,7 @@ module Cassandra
101
101
  @body == other.body && \
102
102
  @called_on_null == other.called_on_null?
103
103
  end
104
- alias :== :eql?
104
+ alias == eql?
105
105
 
106
106
  # @private
107
107
  def hash
@@ -120,7 +120,13 @@ module Cassandra
120
120
 
121
121
  # @private
122
122
  def inspect
123
- "#<Cassandra::Function:0x#{self.object_id.to_s(16)} @keyspace=#{@keyspace.inspect}, @name=#{@name.inspect}, @language=#{@language.inspect}, @type=#{@type.inspect}, @arguments=#{@arguments.inspect} @body=#{@body.inspect}>"
123
+ "#<Cassandra::Function:0x#{object_id.to_s(16)} " \
124
+ "@keyspace=#{@keyspace.inspect}, " \
125
+ "@name=#{@name.inspect}, " \
126
+ "@language=#{@language.inspect}, " \
127
+ "@type=#{@type.inspect}, " \
128
+ "@arguments=#{@arguments.inspect} " \
129
+ "@body=#{@body.inspect}>"
124
130
  end
125
131
 
126
132
  # @return [String] a cql representation of this function
@@ -135,16 +141,16 @@ module Cassandra
135
141
  end
136
142
  cql << "#{argument.name} #{argument.type}"
137
143
  end
138
- cql << ")"
139
- if @called_on_null
140
- cql << "\n CALLED ON NULL INPUT"
141
- else
142
- cql << "\n RETURNS NULL ON NULL INPUT"
143
- end
144
+ cql << ')'
145
+ cql << if @called_on_null
146
+ "\n CALLED ON NULL INPUT"
147
+ else
148
+ "\n RETURNS NULL ON NULL INPUT"
149
+ end
144
150
  cql << "\n RETURNS #{@type}"
145
151
  cql << "\n LANGUAGE #{@language}"
146
152
  cql << "\n AS $$#{@body}$$"
147
- cql << ";"
153
+ cql << ';'
148
154
  end
149
155
  end
150
156
  end
@@ -0,0 +1,85 @@
1
+ # encoding: utf-8
2
+
3
+ #--
4
+ # Copyright 2013-2016 DataStax, Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #++
18
+
19
+ module Cassandra
20
+ # @private
21
+ # This class encapsulates a collection of functions or aggregates.
22
+ # Really used internally, so it should not be documented.
23
+ class FunctionCollection
24
+ def initialize
25
+ @function_hash = {}
26
+ end
27
+
28
+ # Get the Function or Aggregate with the given name and argument-types.
29
+ # @param name [String] the name of the function/aggregate.
30
+ # @param argument_types [Array<Cassandra::Type>] list of argument-types.
31
+ # @return [Cassandra::Function] or [Cassandra::Aggregate] if found;
32
+ # nil otherwise.
33
+ def get(name, argument_types)
34
+ @function_hash[[name, argument_types]]
35
+ end
36
+
37
+ def add_or_update(function)
38
+ @function_hash[[function.name, function.argument_types]] = function
39
+ end
40
+
41
+ def delete(name, argument_types)
42
+ @function_hash.delete([name, argument_types])
43
+ end
44
+
45
+ # @return [Boolean] whether this FunctionCollection is equal to the other
46
+ def eql?(other)
47
+ other.is_a?(FunctionCollection) &&
48
+ @function_hash == other.raw_functions
49
+ end
50
+ alias == eql?
51
+
52
+ def hash
53
+ @function_hash.hash
54
+ end
55
+
56
+ # Yield or enumerate each function defined in this collection
57
+ # @overload each_function
58
+ # @yieldparam function [Cassandra::Function or Cassandra::Aggregate]
59
+ # current function or aggregate
60
+ # @return [Cassandra::FunctionCollection] self
61
+ # @overload each_function
62
+ # @return [Array<Cassandra::Function> or Array<Cassandra::Aggregate>]
63
+ # a list of functions or aggregates.
64
+ def each_function(&block)
65
+ if block_given?
66
+ @function_hash.each_value(&block)
67
+ self
68
+ else
69
+ @function_hash.values
70
+ end
71
+ end
72
+ alias functions each_function
73
+
74
+ def inspect
75
+ "#<Cassandra::FunctionCollection:0x#{object_id.to_s(16)} " \
76
+ "@function_hash=#{@function_hash.inspect}>"
77
+ end
78
+
79
+ protected
80
+
81
+ def raw_functions
82
+ @function_hash
83
+ end
84
+ end
85
+ end