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.
- checksums.yaml +4 -4
- data/README.md +106 -39
- data/lib/cassandra.rb +396 -148
- data/lib/cassandra/address_resolution.rb +1 -1
- data/lib/cassandra/address_resolution/policies/ec2_multi_region.rb +1 -1
- data/lib/cassandra/address_resolution/policies/none.rb +1 -1
- data/lib/cassandra/aggregate.rb +21 -7
- data/lib/cassandra/argument.rb +2 -2
- data/lib/cassandra/attr_boolean.rb +33 -0
- data/lib/cassandra/auth.rb +6 -5
- data/lib/cassandra/auth/providers.rb +1 -1
- data/lib/cassandra/auth/providers/password.rb +5 -13
- data/lib/cassandra/cassandra_logger.rb +80 -0
- data/lib/cassandra/cluster.rb +49 -9
- data/lib/cassandra/cluster/client.rb +835 -209
- data/lib/cassandra/cluster/connection_pool.rb +2 -2
- data/lib/cassandra/cluster/connector.rb +86 -27
- data/lib/cassandra/cluster/control_connection.rb +222 -95
- data/lib/cassandra/cluster/failed_connection.rb +1 -1
- data/lib/cassandra/cluster/metadata.rb +14 -8
- data/lib/cassandra/cluster/options.rb +68 -22
- data/lib/cassandra/cluster/registry.rb +81 -17
- data/lib/cassandra/cluster/schema.rb +70 -8
- data/lib/cassandra/cluster/schema/cql_type_parser.rb +15 -10
- data/lib/cassandra/cluster/schema/fetchers.rb +601 -241
- data/lib/cassandra/cluster/schema/fqcn_type_parser.rb +39 -38
- data/lib/cassandra/cluster/schema/partitioners.rb +1 -1
- data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +6 -8
- data/lib/cassandra/cluster/schema/partitioners/ordered.rb +1 -1
- data/lib/cassandra/cluster/schema/partitioners/random.rb +1 -1
- data/lib/cassandra/cluster/schema/replication_strategies.rb +1 -1
- data/lib/cassandra/cluster/schema/replication_strategies/network_topology.rb +19 -18
- data/lib/cassandra/cluster/schema/replication_strategies/none.rb +1 -1
- data/lib/cassandra/cluster/schema/replication_strategies/simple.rb +1 -1
- data/lib/cassandra/column.rb +4 -23
- data/lib/cassandra/column_container.rb +322 -0
- data/lib/cassandra/compression.rb +1 -1
- data/lib/cassandra/compression/compressors/lz4.rb +7 -8
- data/lib/cassandra/compression/compressors/snappy.rb +4 -3
- data/lib/cassandra/driver.rb +107 -46
- data/lib/cassandra/errors.rb +303 -52
- data/lib/cassandra/execution/info.rb +16 -5
- data/lib/cassandra/execution/options.rb +102 -55
- data/lib/cassandra/execution/trace.rb +16 -9
- data/lib/cassandra/executors.rb +1 -1
- data/lib/cassandra/function.rb +19 -13
- data/lib/cassandra/function_collection.rb +85 -0
- data/lib/cassandra/future.rb +101 -49
- data/lib/cassandra/host.rb +25 -5
- data/lib/cassandra/index.rb +118 -0
- data/lib/cassandra/keyspace.rb +169 -33
- data/lib/cassandra/listener.rb +1 -1
- data/lib/cassandra/load_balancing.rb +2 -2
- data/lib/cassandra/load_balancing/policies.rb +1 -1
- data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +39 -25
- data/lib/cassandra/load_balancing/policies/round_robin.rb +8 -1
- data/lib/cassandra/load_balancing/policies/token_aware.rb +22 -13
- data/lib/cassandra/load_balancing/policies/white_list.rb +18 -5
- data/lib/cassandra/materialized_view.rb +90 -0
- data/lib/cassandra/null_logger.rb +27 -6
- data/lib/cassandra/protocol.rb +1 -1
- data/lib/cassandra/protocol/coder.rb +81 -42
- data/lib/cassandra/protocol/cql_byte_buffer.rb +58 -44
- data/lib/cassandra/protocol/cql_protocol_handler.rb +57 -54
- data/lib/cassandra/protocol/request.rb +6 -7
- data/lib/cassandra/protocol/requests/auth_response_request.rb +3 -3
- data/lib/cassandra/protocol/requests/batch_request.rb +17 -8
- data/lib/cassandra/protocol/requests/credentials_request.rb +3 -3
- data/lib/cassandra/protocol/requests/execute_request.rb +39 -20
- data/lib/cassandra/protocol/requests/options_request.rb +1 -1
- data/lib/cassandra/protocol/requests/prepare_request.rb +5 -5
- data/lib/cassandra/protocol/requests/query_request.rb +28 -23
- data/lib/cassandra/protocol/requests/register_request.rb +2 -2
- data/lib/cassandra/protocol/requests/startup_request.rb +8 -8
- data/lib/cassandra/protocol/requests/void_query_request.rb +1 -1
- data/lib/cassandra/protocol/response.rb +3 -4
- data/lib/cassandra/protocol/responses/already_exists_error_response.rb +12 -2
- data/lib/cassandra/protocol/responses/auth_challenge_response.rb +4 -5
- data/lib/cassandra/protocol/responses/auth_success_response.rb +4 -5
- data/lib/cassandra/protocol/responses/authenticate_response.rb +4 -5
- data/lib/cassandra/protocol/responses/error_response.rb +104 -17
- data/lib/cassandra/protocol/responses/event_response.rb +3 -4
- data/lib/cassandra/protocol/responses/function_failure_error_response.rb +13 -2
- data/lib/cassandra/protocol/responses/prepared_result_response.rb +14 -9
- data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +14 -9
- data/lib/cassandra/protocol/responses/read_failure_error_response.rb +26 -4
- data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +22 -3
- data/lib/cassandra/protocol/responses/ready_response.rb +6 -7
- data/lib/cassandra/protocol/responses/result_response.rb +11 -10
- data/lib/cassandra/protocol/responses/rows_result_response.rb +8 -7
- data/lib/cassandra/protocol/responses/schema_change_event_response.rb +8 -8
- data/lib/cassandra/protocol/responses/schema_change_result_response.rb +19 -13
- data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +5 -6
- data/lib/cassandra/protocol/responses/status_change_event_response.rb +5 -6
- data/lib/cassandra/protocol/responses/supported_response.rb +4 -5
- data/lib/cassandra/protocol/responses/topology_change_event_response.rb +4 -5
- data/lib/cassandra/protocol/responses/unavailable_error_response.rb +20 -3
- data/lib/cassandra/protocol/responses/unprepared_error_response.rb +11 -2
- data/lib/cassandra/protocol/responses/void_result_response.rb +4 -5
- data/lib/cassandra/protocol/responses/write_failure_error_response.rb +26 -4
- data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +22 -3
- data/lib/cassandra/protocol/v1.rb +98 -37
- data/lib/cassandra/protocol/v3.rb +121 -50
- data/lib/cassandra/protocol/v4.rb +172 -68
- data/lib/cassandra/reconnection.rb +1 -1
- data/lib/cassandra/reconnection/policies.rb +1 -1
- data/lib/cassandra/reconnection/policies/constant.rb +2 -4
- data/lib/cassandra/reconnection/policies/exponential.rb +6 -6
- data/lib/cassandra/result.rb +55 -20
- data/lib/cassandra/retry.rb +8 -8
- data/lib/cassandra/retry/policies.rb +1 -1
- data/lib/cassandra/retry/policies/default.rb +1 -1
- data/lib/cassandra/retry/policies/downgrading_consistency.rb +4 -2
- data/lib/cassandra/retry/policies/fallthrough.rb +1 -1
- data/lib/cassandra/session.rb +24 -16
- data/lib/cassandra/statement.rb +1 -1
- data/lib/cassandra/statements.rb +1 -1
- data/lib/cassandra/statements/batch.rb +16 -10
- data/lib/cassandra/statements/bound.rb +10 -3
- data/lib/cassandra/statements/prepared.rb +62 -18
- data/lib/cassandra/statements/simple.rb +23 -10
- data/lib/cassandra/statements/void.rb +1 -1
- data/lib/cassandra/table.rb +53 -185
- data/lib/cassandra/time.rb +11 -6
- data/lib/cassandra/time_uuid.rb +12 -14
- data/lib/cassandra/timestamp_generator.rb +37 -0
- data/lib/cassandra/timestamp_generator/simple.rb +38 -0
- data/lib/cassandra/timestamp_generator/ticking_on_duplicate.rb +58 -0
- data/lib/cassandra/tuple.rb +4 -4
- data/lib/cassandra/types.rb +109 -71
- data/lib/cassandra/udt.rb +66 -50
- data/lib/cassandra/util.rb +155 -15
- data/lib/cassandra/uuid.rb +20 -21
- data/lib/cassandra/uuid/generator.rb +7 -5
- data/lib/cassandra/version.rb +2 -2
- data/lib/cassandra_murmur3.jar +0 -0
- data/lib/datastax/cassandra.rb +1 -1
- metadata +27 -16
data/lib/cassandra/future.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
#--
|
4
|
-
# Copyright 2013-
|
4
|
+
# Copyright 2013-2016 DataStax, Inc.
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
# you may not use this file except in compliance with the License.
|
@@ -55,41 +55,53 @@ module Cassandra
|
|
55
55
|
raise(@error, @error.message, @error.backtrace)
|
56
56
|
end
|
57
57
|
|
58
|
-
alias
|
58
|
+
alias join get
|
59
59
|
|
60
60
|
def on_success
|
61
|
-
raise ::ArgumentError,
|
61
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
62
62
|
self
|
63
63
|
end
|
64
64
|
|
65
65
|
def on_failure
|
66
|
-
raise ::ArgumentError,
|
67
|
-
|
66
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
67
|
+
begin
|
68
|
+
yield(@error)
|
69
|
+
rescue
|
70
|
+
nil
|
71
|
+
end
|
68
72
|
self
|
69
73
|
end
|
70
74
|
|
71
75
|
def on_complete
|
72
|
-
raise ::ArgumentError,
|
73
|
-
|
76
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
77
|
+
begin
|
78
|
+
yield(nil, @error)
|
79
|
+
rescue
|
80
|
+
nil
|
81
|
+
end
|
74
82
|
self
|
75
83
|
end
|
76
84
|
|
77
85
|
def add_listener(listener)
|
78
|
-
unless
|
79
|
-
raise ::ArgumentError,
|
86
|
+
unless listener.respond_to?(:success) && listener.respond_to?(:failure)
|
87
|
+
raise ::ArgumentError, 'listener must respond to both #success and #failure'
|
80
88
|
end
|
81
89
|
|
82
|
-
|
90
|
+
begin
|
91
|
+
listener.failure(@error)
|
92
|
+
rescue
|
93
|
+
nil
|
94
|
+
end
|
83
95
|
self
|
84
96
|
end
|
85
97
|
|
86
98
|
def then
|
87
|
-
raise ::ArgumentError,
|
99
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
88
100
|
self
|
89
101
|
end
|
90
102
|
|
91
103
|
def fallback
|
92
|
-
raise ::ArgumentError,
|
104
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
93
105
|
|
94
106
|
begin
|
95
107
|
result = yield(@error)
|
@@ -111,31 +123,43 @@ module Cassandra
|
|
111
123
|
@value
|
112
124
|
end
|
113
125
|
|
114
|
-
alias
|
126
|
+
alias join get
|
115
127
|
|
116
128
|
def on_success
|
117
|
-
raise ::ArgumentError,
|
118
|
-
|
129
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
130
|
+
begin
|
131
|
+
yield(@value)
|
132
|
+
rescue
|
133
|
+
nil
|
134
|
+
end
|
119
135
|
self
|
120
136
|
end
|
121
137
|
|
122
138
|
def on_failure
|
123
|
-
raise ::ArgumentError,
|
139
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
124
140
|
self
|
125
141
|
end
|
126
142
|
|
127
143
|
def on_complete
|
128
|
-
raise ::ArgumentError,
|
129
|
-
|
144
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
145
|
+
begin
|
146
|
+
yield(@value, nil)
|
147
|
+
rescue
|
148
|
+
nil
|
149
|
+
end
|
130
150
|
self
|
131
151
|
end
|
132
152
|
|
133
153
|
def add_listener(listener)
|
134
|
-
unless
|
135
|
-
raise ::ArgumentError,
|
154
|
+
unless listener.respond_to?(:success) && listener.respond_to?(:failure)
|
155
|
+
raise ::ArgumentError, 'listener must respond to both #success and #failure'
|
136
156
|
end
|
137
157
|
|
138
|
-
|
158
|
+
begin
|
159
|
+
listener.success(@value)
|
160
|
+
rescue
|
161
|
+
nil
|
162
|
+
end
|
139
163
|
self
|
140
164
|
end
|
141
165
|
|
@@ -144,7 +168,7 @@ module Cassandra
|
|
144
168
|
end
|
145
169
|
|
146
170
|
def then
|
147
|
-
raise ::ArgumentError,
|
171
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
148
172
|
|
149
173
|
begin
|
150
174
|
result = yield(@value)
|
@@ -156,7 +180,7 @@ module Cassandra
|
|
156
180
|
end
|
157
181
|
|
158
182
|
def fallback
|
159
|
-
raise ::ArgumentError,
|
183
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
160
184
|
self
|
161
185
|
end
|
162
186
|
end
|
@@ -252,7 +276,7 @@ module Cassandra
|
|
252
276
|
# @raise [ArgumentError] if no block given
|
253
277
|
# @return [self]
|
254
278
|
def on_success(&block)
|
255
|
-
raise ::ArgumentError,
|
279
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
256
280
|
@signal.on_success(&block)
|
257
281
|
self
|
258
282
|
end
|
@@ -265,7 +289,7 @@ module Cassandra
|
|
265
289
|
# @raise [ArgumentError] if no block given
|
266
290
|
# @return [self]
|
267
291
|
def on_failure(&block)
|
268
|
-
raise ::ArgumentError,
|
292
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
269
293
|
@signal.on_failure(&block)
|
270
294
|
self
|
271
295
|
end
|
@@ -281,7 +305,7 @@ module Cassandra
|
|
281
305
|
# @raise [ArgumentError] if no block given
|
282
306
|
# @return [self]
|
283
307
|
def on_complete(&block)
|
284
|
-
raise ::ArgumentError,
|
308
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
285
309
|
@signal.on_complete(&block)
|
286
310
|
self
|
287
311
|
end
|
@@ -296,8 +320,8 @@ module Cassandra
|
|
296
320
|
# `#success` and `#failure`
|
297
321
|
# @return [self]
|
298
322
|
def add_listener(listener)
|
299
|
-
unless
|
300
|
-
raise ::ArgumentError,
|
323
|
+
unless listener.respond_to?(:success) && listener.respond_to?(:failure)
|
324
|
+
raise ::ArgumentError, 'listener must respond to both #success and #failure'
|
301
325
|
end
|
302
326
|
|
303
327
|
@signal.add_listener(listener)
|
@@ -325,7 +349,7 @@ module Cassandra
|
|
325
349
|
# @raise [ArgumentError] if no block given
|
326
350
|
# @return [Cassandra::Future] a new future
|
327
351
|
def then(&block)
|
328
|
-
raise ::ArgumentError,
|
352
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
329
353
|
@signal.then(&block)
|
330
354
|
end
|
331
355
|
|
@@ -351,7 +375,7 @@ module Cassandra
|
|
351
375
|
# @raise [ArgumentError] if no block given
|
352
376
|
# @return [Cassandra::Future] a new future
|
353
377
|
def fallback(&block)
|
354
|
-
raise ::ArgumentError,
|
378
|
+
raise ::ArgumentError, 'no block given' unless block_given?
|
355
379
|
@signal.fallback(&block)
|
356
380
|
end
|
357
381
|
|
@@ -372,7 +396,7 @@ module Cassandra
|
|
372
396
|
@signal.get(timeout)
|
373
397
|
end
|
374
398
|
|
375
|
-
alias
|
399
|
+
alias join get
|
376
400
|
end
|
377
401
|
|
378
402
|
# @private
|
@@ -493,9 +517,7 @@ module Cassandra
|
|
493
517
|
end
|
494
518
|
|
495
519
|
def failure(error)
|
496
|
-
unless error.is_a?(::Exception)
|
497
|
-
raise ::ArgumentError, "error must be an exception, #{error.inspect} given"
|
498
|
-
end
|
520
|
+
raise ::ArgumentError, "error must be an exception, #{error.inspect} given" unless error.is_a?(::Exception)
|
499
521
|
|
500
522
|
return unless @state == :pending
|
501
523
|
|
@@ -507,12 +529,17 @@ module Cassandra
|
|
507
529
|
@error = error
|
508
530
|
@state = :broken
|
509
531
|
|
510
|
-
listeners
|
532
|
+
listeners = @listeners
|
533
|
+
@listeners = nil
|
511
534
|
end
|
512
535
|
|
513
536
|
@executor.execute do
|
514
537
|
listeners.each do |listener|
|
515
|
-
|
538
|
+
begin
|
539
|
+
listener.failure(error)
|
540
|
+
rescue
|
541
|
+
nil
|
542
|
+
end
|
516
543
|
end
|
517
544
|
|
518
545
|
synchronize do
|
@@ -534,12 +561,17 @@ module Cassandra
|
|
534
561
|
@value = value
|
535
562
|
@state = :fulfilled
|
536
563
|
|
537
|
-
listeners
|
564
|
+
listeners = @listeners
|
565
|
+
@listeners = nil
|
538
566
|
end
|
539
567
|
|
540
568
|
@executor.execute do
|
541
569
|
listeners.each do |listener|
|
542
|
-
|
570
|
+
begin
|
571
|
+
listener.success(value)
|
572
|
+
rescue
|
573
|
+
nil
|
574
|
+
end
|
543
575
|
end
|
544
576
|
|
545
577
|
synchronize do
|
@@ -561,7 +593,7 @@ module Cassandra
|
|
561
593
|
#
|
562
594
|
# @return [Object] the value that the future has been resolved with
|
563
595
|
def get(timeout = nil)
|
564
|
-
timeout
|
596
|
+
timeout &&= Float(timeout)
|
565
597
|
|
566
598
|
if timeout
|
567
599
|
raise ::ArgumentError, "timeout cannot be negative, #{timeout.inspect} given" if timeout < 0
|
@@ -590,18 +622,18 @@ module Cassandra
|
|
590
622
|
|
591
623
|
if @state == :pending
|
592
624
|
total_wait = deadline - start
|
593
|
-
raise Errors::TimeoutError,
|
625
|
+
raise Errors::TimeoutError,
|
626
|
+
"Future did not complete within #{timeout.inspect} seconds. " \
|
627
|
+
"Wait time: #{total_wait.inspect}"
|
594
628
|
end
|
595
629
|
end
|
596
630
|
|
597
|
-
if @state == :broken
|
598
|
-
raise(@error, @error.message, @error.backtrace)
|
599
|
-
end
|
631
|
+
raise(@error, @error.message, @error.backtrace) if @state == :broken
|
600
632
|
|
601
633
|
@value
|
602
634
|
end
|
603
635
|
|
604
|
-
alias
|
636
|
+
alias join get
|
605
637
|
|
606
638
|
def add_listener(listener)
|
607
639
|
if @state == :pending
|
@@ -614,8 +646,16 @@ module Cassandra
|
|
614
646
|
end
|
615
647
|
end
|
616
648
|
|
617
|
-
|
618
|
-
|
649
|
+
begin
|
650
|
+
listener.success(@value)
|
651
|
+
rescue
|
652
|
+
nil
|
653
|
+
end if @state == :fulfilled
|
654
|
+
begin
|
655
|
+
listener.failure(@error)
|
656
|
+
rescue
|
657
|
+
nil
|
658
|
+
end if @state == :broken
|
619
659
|
|
620
660
|
self
|
621
661
|
end
|
@@ -630,7 +670,11 @@ module Cassandra
|
|
630
670
|
end
|
631
671
|
end
|
632
672
|
|
633
|
-
|
673
|
+
begin
|
674
|
+
yield(@value)
|
675
|
+
rescue
|
676
|
+
nil
|
677
|
+
end if @state == :fulfilled
|
634
678
|
|
635
679
|
self
|
636
680
|
end
|
@@ -645,7 +689,11 @@ module Cassandra
|
|
645
689
|
end
|
646
690
|
end
|
647
691
|
|
648
|
-
|
692
|
+
begin
|
693
|
+
yield(@error)
|
694
|
+
rescue
|
695
|
+
nil
|
696
|
+
end if @state == :broken
|
649
697
|
|
650
698
|
self
|
651
699
|
end
|
@@ -660,7 +708,11 @@ module Cassandra
|
|
660
708
|
end
|
661
709
|
end
|
662
710
|
|
663
|
-
|
711
|
+
begin
|
712
|
+
yield(@value, @error)
|
713
|
+
rescue
|
714
|
+
nil
|
715
|
+
end
|
664
716
|
|
665
717
|
self
|
666
718
|
end
|
data/lib/cassandra/host.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
#--
|
4
|
-
# Copyright 2013-
|
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.
|
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
module Cassandra
|
20
20
|
class Host
|
21
|
-
# @return [IPAddr] host ip
|
21
|
+
# @return [IPAddr] host ip that clients use to connect to this host.
|
22
22
|
attr_reader :ip
|
23
23
|
# @note Host id can be `nil` before cluster has connected.
|
24
24
|
# @return [Cassandra::Uuid, nil] host id.
|
@@ -37,9 +37,25 @@ module Cassandra
|
|
37
37
|
attr_reader :tokens
|
38
38
|
# @return [Symbol] host status. Must be `:up` or `:down`
|
39
39
|
attr_reader :status
|
40
|
+
# @note This is the public IP address of the host if the cluster is deployed across multiple Amazon EC2 regions
|
41
|
+
# (or equivalently multiple networks). Cassandra nodes in other EC2 regions use this address to connect to this
|
42
|
+
# host.
|
43
|
+
# @return [IPAddr, String] broadcast address, if available.
|
44
|
+
attr_reader :broadcast_address
|
45
|
+
# @note This is the address that other Cassandra nodes use to connect to this host.
|
46
|
+
# @return [IPAddr, String] listen address, if available.
|
47
|
+
attr_reader :listen_address
|
40
48
|
|
41
49
|
# @private
|
42
|
-
def initialize(ip,
|
50
|
+
def initialize(ip,
|
51
|
+
id = nil,
|
52
|
+
rack = nil,
|
53
|
+
datacenter = nil,
|
54
|
+
release_version = nil,
|
55
|
+
tokens = EMPTY_LIST,
|
56
|
+
status = :up,
|
57
|
+
broadcast_address = nil,
|
58
|
+
listen_address = nil)
|
43
59
|
@ip = ip
|
44
60
|
@id = id
|
45
61
|
@rack = rack
|
@@ -47,6 +63,10 @@ module Cassandra
|
|
47
63
|
@release_version = release_version
|
48
64
|
@tokens = tokens
|
49
65
|
@status = status
|
66
|
+
@broadcast_address = broadcast_address.is_a?(String) ?
|
67
|
+
::IPAddr.new(broadcast_address) : broadcast_address
|
68
|
+
@listen_address = listen_address.is_a?(String) ?
|
69
|
+
::IPAddr.new(listen_address) : listen_address
|
50
70
|
end
|
51
71
|
|
52
72
|
# @return [Boolean] whether this host's status is `:up`
|
@@ -72,11 +92,11 @@ module Cassandra
|
|
72
92
|
def eql?(other)
|
73
93
|
other.eql?(@ip)
|
74
94
|
end
|
75
|
-
alias
|
95
|
+
alias == eql?
|
76
96
|
|
77
97
|
# @private
|
78
98
|
def inspect
|
79
|
-
"#<#{self.class.name}:0x#{
|
99
|
+
"#<#{self.class.name}:0x#{object_id.to_s(16)} @ip=#{@ip}>"
|
80
100
|
end
|
81
101
|
end
|
82
102
|
end
|
@@ -0,0 +1,118 @@
|
|
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
|
+
# Represents an index on a cassandra table
|
21
|
+
class Index
|
22
|
+
# @return [Cassandra::Table] table that the index applies to.
|
23
|
+
attr_reader :table
|
24
|
+
# @return [String] name of the index.
|
25
|
+
attr_reader :name
|
26
|
+
# @return [Symbol] kind of index: `:keys`, `:composites`, or `:custom`.
|
27
|
+
attr_reader :kind
|
28
|
+
# @return [String] name of column that the index applies to.
|
29
|
+
attr_reader :target
|
30
|
+
# @return [Hash] options of the index.
|
31
|
+
attr_reader :options
|
32
|
+
|
33
|
+
# @private
|
34
|
+
def initialize(table,
|
35
|
+
name,
|
36
|
+
kind,
|
37
|
+
target,
|
38
|
+
options)
|
39
|
+
@table = table
|
40
|
+
@name = name.freeze
|
41
|
+
@kind = kind
|
42
|
+
@options = options.freeze
|
43
|
+
|
44
|
+
# Target is a bit tricky; it may be an escaped name or not
|
45
|
+
# depending on C* version. Unify to be unescaped since a user
|
46
|
+
# who wants to know the target would want the bare column name.
|
47
|
+
|
48
|
+
@target = if target[0] == '"'
|
49
|
+
target[1..-2]
|
50
|
+
else
|
51
|
+
target
|
52
|
+
end.freeze
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [Boolean] whether or not this index uses a custom class.
|
56
|
+
def custom_index?
|
57
|
+
!@options['class_name'].nil?
|
58
|
+
end
|
59
|
+
|
60
|
+
# @return [String] name of the index class if this is a custom index; nil otherwise.
|
61
|
+
def custom_class_name
|
62
|
+
@options['class_name']
|
63
|
+
end
|
64
|
+
|
65
|
+
# @return [String] a cql representation of this table
|
66
|
+
def to_cql
|
67
|
+
keyspace_name = Util.escape_name(@table.keyspace.name)
|
68
|
+
table_name = Util.escape_name(@table.name)
|
69
|
+
index_name = Util.escape_name(@name)
|
70
|
+
|
71
|
+
# Target is interesting in that it's not necessarily a column name,
|
72
|
+
# so we can't simply escape it. If it contains a paren, we take it as is,
|
73
|
+
# otherwise assume it's a column name and escape accordingly.
|
74
|
+
escaped_target = @target.include?('(') ? @target : Util.escape_name(@target)
|
75
|
+
|
76
|
+
if custom_index?
|
77
|
+
"CREATE CUSTOM INDEX #{index_name} ON #{keyspace_name}.#{table_name} (#{escaped_target}) " \
|
78
|
+
"USING '#{@options['class_name']}'#{options_cql};"
|
79
|
+
else
|
80
|
+
"CREATE INDEX #{index_name} ON #{keyspace_name}.#{table_name} (#{escaped_target});"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# @private
|
85
|
+
def eql?(other)
|
86
|
+
other.is_a?(Index) &&
|
87
|
+
@table == other.table &&
|
88
|
+
@name == other.name &&
|
89
|
+
@kind == other.kind &&
|
90
|
+
@target == other.target &&
|
91
|
+
@options == other.options
|
92
|
+
end
|
93
|
+
alias == eql?
|
94
|
+
|
95
|
+
# @private
|
96
|
+
def inspect
|
97
|
+
"#<#{self.class.name}:0x#{object_id.to_s(16)} " \
|
98
|
+
"@name=#{@name.inspect} @table=#{@table.inspect} @kind=#{@kind.inspect} @target=#{@target.inspect}>"
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def options_cql
|
104
|
+
# exclude 'class_name', 'target' keys
|
105
|
+
filtered_options = @options.reject do |key, _|
|
106
|
+
key == 'class_name' || key == 'target'
|
107
|
+
end
|
108
|
+
return '' if filtered_options.empty?
|
109
|
+
|
110
|
+
result = ' WITH OPTIONS = {'
|
111
|
+
result << filtered_options.map do |key, value|
|
112
|
+
"'#{key}': '#{value}'"
|
113
|
+
end.join(', ')
|
114
|
+
result << '}'
|
115
|
+
result
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|