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.
- checksums.yaml +7 -0
- data/.yardopts +13 -0
- data/README.md +242 -0
- data/ext/cassandra_murmur3/cassandra_murmur3.c +178 -0
- data/ext/cassandra_murmur3/extconf.rb +2 -0
- data/lib/cassandra/address_resolution.rb +36 -0
- data/lib/cassandra/address_resolution/policies.rb +2 -0
- data/lib/cassandra/address_resolution/policies/ec2_multi_region.rb +56 -0
- data/lib/cassandra/address_resolution/policies/none.rb +35 -0
- data/lib/cassandra/aggregate.rb +123 -0
- data/lib/cassandra/argument.rb +51 -0
- data/lib/cassandra/attr_boolean.rb +33 -0
- data/lib/cassandra/auth.rb +100 -0
- data/lib/cassandra/auth/providers.rb +17 -0
- data/lib/cassandra/auth/providers/password.rb +65 -0
- data/lib/cassandra/cassandra_logger.rb +80 -0
- data/lib/cassandra/cluster.rb +331 -0
- data/lib/cassandra/cluster/client.rb +1612 -0
- data/lib/cassandra/cluster/connection_pool.rb +78 -0
- data/lib/cassandra/cluster/connector.rb +372 -0
- data/lib/cassandra/cluster/control_connection.rb +962 -0
- data/lib/cassandra/cluster/failed_connection.rb +35 -0
- data/lib/cassandra/cluster/metadata.rb +142 -0
- data/lib/cassandra/cluster/options.rb +145 -0
- data/lib/cassandra/cluster/registry.rb +284 -0
- data/lib/cassandra/cluster/schema.rb +405 -0
- data/lib/cassandra/cluster/schema/cql_type_parser.rb +112 -0
- data/lib/cassandra/cluster/schema/fetchers.rb +1627 -0
- data/lib/cassandra/cluster/schema/fqcn_type_parser.rb +175 -0
- data/lib/cassandra/cluster/schema/partitioners.rb +21 -0
- data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +45 -0
- data/lib/cassandra/cluster/schema/partitioners/ordered.rb +37 -0
- data/lib/cassandra/cluster/schema/partitioners/random.rb +37 -0
- data/lib/cassandra/cluster/schema/replication_strategies.rb +21 -0
- data/lib/cassandra/cluster/schema/replication_strategies/network_topology.rb +102 -0
- data/lib/cassandra/cluster/schema/replication_strategies/none.rb +39 -0
- data/lib/cassandra/cluster/schema/replication_strategies/simple.rb +44 -0
- data/lib/cassandra/column.rb +66 -0
- data/lib/cassandra/column_container.rb +326 -0
- data/lib/cassandra/compression.rb +69 -0
- data/lib/cassandra/compression/compressors/lz4.rb +73 -0
- data/lib/cassandra/compression/compressors/snappy.rb +69 -0
- data/lib/cassandra/custom_data.rb +53 -0
- data/lib/cassandra/driver.rb +260 -0
- data/lib/cassandra/errors.rb +784 -0
- data/lib/cassandra/execution/info.rb +69 -0
- data/lib/cassandra/execution/options.rb +267 -0
- data/lib/cassandra/execution/profile.rb +153 -0
- data/lib/cassandra/execution/profile_manager.rb +71 -0
- data/lib/cassandra/execution/trace.rb +192 -0
- data/lib/cassandra/executors.rb +113 -0
- data/lib/cassandra/function.rb +156 -0
- data/lib/cassandra/function_collection.rb +85 -0
- data/lib/cassandra/future.rb +794 -0
- data/lib/cassandra/host.rb +102 -0
- data/lib/cassandra/index.rb +118 -0
- data/lib/cassandra/keyspace.rb +473 -0
- data/lib/cassandra/listener.rb +87 -0
- data/lib/cassandra/load_balancing.rb +121 -0
- data/lib/cassandra/load_balancing/policies.rb +20 -0
- data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +172 -0
- data/lib/cassandra/load_balancing/policies/round_robin.rb +141 -0
- data/lib/cassandra/load_balancing/policies/token_aware.rb +149 -0
- data/lib/cassandra/load_balancing/policies/white_list.rb +100 -0
- data/lib/cassandra/materialized_view.rb +92 -0
- data/lib/cassandra/null_logger.rb +56 -0
- data/lib/cassandra/protocol.rb +102 -0
- data/lib/cassandra/protocol/coder.rb +1085 -0
- data/lib/cassandra/protocol/cql_byte_buffer.rb +418 -0
- data/lib/cassandra/protocol/cql_protocol_handler.rb +448 -0
- data/lib/cassandra/protocol/request.rb +41 -0
- data/lib/cassandra/protocol/requests/auth_response_request.rb +51 -0
- data/lib/cassandra/protocol/requests/batch_request.rb +117 -0
- data/lib/cassandra/protocol/requests/credentials_request.rb +51 -0
- data/lib/cassandra/protocol/requests/execute_request.rb +122 -0
- data/lib/cassandra/protocol/requests/options_request.rb +39 -0
- data/lib/cassandra/protocol/requests/prepare_request.rb +59 -0
- data/lib/cassandra/protocol/requests/query_request.rb +112 -0
- data/lib/cassandra/protocol/requests/register_request.rb +38 -0
- data/lib/cassandra/protocol/requests/startup_request.rb +49 -0
- data/lib/cassandra/protocol/requests/void_query_request.rb +24 -0
- data/lib/cassandra/protocol/response.rb +28 -0
- data/lib/cassandra/protocol/responses/already_exists_error_response.rb +50 -0
- data/lib/cassandra/protocol/responses/auth_challenge_response.rb +36 -0
- data/lib/cassandra/protocol/responses/auth_success_response.rb +36 -0
- data/lib/cassandra/protocol/responses/authenticate_response.rb +36 -0
- data/lib/cassandra/protocol/responses/error_response.rb +142 -0
- data/lib/cassandra/protocol/responses/event_response.rb +30 -0
- data/lib/cassandra/protocol/responses/function_failure_error_response.rb +52 -0
- data/lib/cassandra/protocol/responses/prepared_result_response.rb +62 -0
- data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +59 -0
- data/lib/cassandra/protocol/responses/read_failure_error_response.rb +71 -0
- data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +61 -0
- data/lib/cassandra/protocol/responses/ready_response.rb +43 -0
- data/lib/cassandra/protocol/responses/result_response.rb +42 -0
- data/lib/cassandra/protocol/responses/rows_result_response.rb +39 -0
- data/lib/cassandra/protocol/responses/schema_change_event_response.rb +73 -0
- data/lib/cassandra/protocol/responses/schema_change_result_response.rb +70 -0
- data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +37 -0
- data/lib/cassandra/protocol/responses/status_change_event_response.rb +39 -0
- data/lib/cassandra/protocol/responses/supported_response.rb +36 -0
- data/lib/cassandra/protocol/responses/topology_change_event_response.rb +33 -0
- data/lib/cassandra/protocol/responses/unavailable_error_response.rb +58 -0
- data/lib/cassandra/protocol/responses/unprepared_error_response.rb +48 -0
- data/lib/cassandra/protocol/responses/void_result_response.rb +34 -0
- data/lib/cassandra/protocol/responses/write_failure_error_response.rb +73 -0
- data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +63 -0
- data/lib/cassandra/protocol/v1.rb +326 -0
- data/lib/cassandra/protocol/v3.rb +358 -0
- data/lib/cassandra/protocol/v4.rb +478 -0
- data/lib/cassandra/reconnection.rb +49 -0
- data/lib/cassandra/reconnection/policies.rb +20 -0
- data/lib/cassandra/reconnection/policies/constant.rb +46 -0
- data/lib/cassandra/reconnection/policies/exponential.rb +79 -0
- data/lib/cassandra/result.rb +276 -0
- data/lib/cassandra/retry.rb +154 -0
- data/lib/cassandra/retry/policies.rb +21 -0
- data/lib/cassandra/retry/policies/default.rb +53 -0
- data/lib/cassandra/retry/policies/downgrading_consistency.rb +73 -0
- data/lib/cassandra/retry/policies/fallthrough.rb +39 -0
- data/lib/cassandra/session.rb +270 -0
- data/lib/cassandra/statement.rb +32 -0
- data/lib/cassandra/statements.rb +23 -0
- data/lib/cassandra/statements/batch.rb +146 -0
- data/lib/cassandra/statements/bound.rb +65 -0
- data/lib/cassandra/statements/prepared.rb +235 -0
- data/lib/cassandra/statements/simple.rb +118 -0
- data/lib/cassandra/statements/void.rb +38 -0
- data/lib/cassandra/table.rb +240 -0
- data/lib/cassandra/time.rb +103 -0
- data/lib/cassandra/time_uuid.rb +78 -0
- 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/trigger.rb +67 -0
- data/lib/cassandra/tuple.rb +131 -0
- data/lib/cassandra/types.rb +1704 -0
- data/lib/cassandra/udt.rb +443 -0
- data/lib/cassandra/util.rb +464 -0
- data/lib/cassandra/uuid.rb +110 -0
- data/lib/cassandra/uuid/generator.rb +212 -0
- data/lib/cassandra/version.rb +21 -0
- data/lib/datastax/cassandra.rb +47 -0
- data/lib/ycql.rb +842 -0
- metadata +243 -0
|
@@ -0,0 +1,102 @@
|
|
|
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 Host
|
|
21
|
+
# @return [IPAddr] host ip that clients use to connect to this host.
|
|
22
|
+
attr_reader :ip
|
|
23
|
+
# @note Host id can be `nil` before cluster has connected.
|
|
24
|
+
# @return [Cassandra::Uuid, nil] host id.
|
|
25
|
+
attr_reader :id
|
|
26
|
+
# @note Host datacenter can be `nil` before cluster has connected.
|
|
27
|
+
# @return [String, nil] host datacenter
|
|
28
|
+
attr_reader :datacenter
|
|
29
|
+
# @note Host rack can be `nil` before cluster has connected.
|
|
30
|
+
# @return [String, nil] host rack
|
|
31
|
+
attr_reader :rack
|
|
32
|
+
# @note Host's cassandra version can be `nil` before cluster has connected.
|
|
33
|
+
# @return [String, nil] version of cassandra that a host is running
|
|
34
|
+
attr_reader :release_version
|
|
35
|
+
# @note Host tokens will be empty before cluster has connected.
|
|
36
|
+
# @return [Array<String>] a list of tokens owned by this host
|
|
37
|
+
attr_reader :tokens
|
|
38
|
+
# @return [Symbol] host status. Must be `:up` or `:down`
|
|
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
|
|
48
|
+
|
|
49
|
+
# @private
|
|
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)
|
|
59
|
+
@ip = ip
|
|
60
|
+
@id = id
|
|
61
|
+
@rack = rack
|
|
62
|
+
@datacenter = datacenter
|
|
63
|
+
@release_version = release_version
|
|
64
|
+
@tokens = tokens
|
|
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
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# @return [Boolean] whether this host's status is `:up`
|
|
73
|
+
def up?
|
|
74
|
+
@status == :up
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# @return [Boolean] whether this host's status is `:down`
|
|
78
|
+
def down?
|
|
79
|
+
@status == :down
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# @private
|
|
83
|
+
def hash
|
|
84
|
+
@hash ||= begin
|
|
85
|
+
h = 17
|
|
86
|
+
h = 31 * h + @ip.hash
|
|
87
|
+
h
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# @private
|
|
92
|
+
def eql?(other)
|
|
93
|
+
other.eql?(@ip)
|
|
94
|
+
end
|
|
95
|
+
alias == eql?
|
|
96
|
+
|
|
97
|
+
# @private
|
|
98
|
+
def inspect
|
|
99
|
+
"#<#{self.class.name}:0x#{object_id.to_s(16)} @ip=#{@ip}>"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
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 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 index
|
|
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
|
|
@@ -0,0 +1,473 @@
|
|
|
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 cassandra keyspace
|
|
21
|
+
# @see Cassandra::Cluster#each_keyspace
|
|
22
|
+
# @see Cassandra::Cluster#keyspace
|
|
23
|
+
class Keyspace
|
|
24
|
+
# @private
|
|
25
|
+
class Replication
|
|
26
|
+
attr_reader :klass, :options
|
|
27
|
+
|
|
28
|
+
def initialize(klass, options)
|
|
29
|
+
@klass = klass
|
|
30
|
+
@options = options
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def to_cql
|
|
34
|
+
replication = {'class' => @klass}
|
|
35
|
+
replication.merge!(@options)
|
|
36
|
+
|
|
37
|
+
Util.encode_hash(replication)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def eql?(other)
|
|
41
|
+
other.is_a?(Replication) &&
|
|
42
|
+
@klass == other.klass &&
|
|
43
|
+
@options == other.options
|
|
44
|
+
end
|
|
45
|
+
alias == eql?
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @return [String] this keyspace name
|
|
49
|
+
attr_reader :name
|
|
50
|
+
# @private
|
|
51
|
+
attr_reader :replication
|
|
52
|
+
|
|
53
|
+
# @private
|
|
54
|
+
def initialize(name,
|
|
55
|
+
durable_writes,
|
|
56
|
+
replication,
|
|
57
|
+
tables,
|
|
58
|
+
types,
|
|
59
|
+
functions,
|
|
60
|
+
aggregates,
|
|
61
|
+
views)
|
|
62
|
+
@name = name
|
|
63
|
+
@durable_writes = durable_writes
|
|
64
|
+
@replication = replication
|
|
65
|
+
@tables = tables
|
|
66
|
+
@types = types
|
|
67
|
+
@functions = functions
|
|
68
|
+
@aggregates = aggregates
|
|
69
|
+
@views = views
|
|
70
|
+
|
|
71
|
+
# Set the keyspace attribute on the tables and views.
|
|
72
|
+
# Also set up the index collection on the keyspace and the view-collection on each table.
|
|
73
|
+
@indexes_hash = {}
|
|
74
|
+
@tables.each_value do |t|
|
|
75
|
+
t.set_keyspace(self)
|
|
76
|
+
t.each_index do |index|
|
|
77
|
+
@indexes_hash[index.name] = index
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
@views.each_value do |v|
|
|
81
|
+
v.set_keyspace(self)
|
|
82
|
+
table = v.base_table
|
|
83
|
+
table.add_view(v) if table
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# @return [Boolean] whether durables writes are enabled for this keyspace
|
|
88
|
+
def durable_writes?
|
|
89
|
+
@durable_writes
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# @return [Boolean] whether this keyspace has a table with the given name
|
|
93
|
+
# @param name [String] table name
|
|
94
|
+
def has_table?(name)
|
|
95
|
+
@tables.key?(name)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# @return [Cassandra::Table, nil] a table or nil
|
|
99
|
+
# @param name [String] table name
|
|
100
|
+
def table(name)
|
|
101
|
+
@tables[name]
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Yield or enumerate each table defined in this keyspace
|
|
105
|
+
# @overload each_table
|
|
106
|
+
# @yieldparam table [Cassandra::Table] current table
|
|
107
|
+
# @return [Cassandra::Keyspace] self
|
|
108
|
+
# @overload each_table
|
|
109
|
+
# @return [Array<Cassandra::Table>] a list of tables
|
|
110
|
+
def each_table(&block)
|
|
111
|
+
if block_given?
|
|
112
|
+
@tables.each_value(&block)
|
|
113
|
+
self
|
|
114
|
+
else
|
|
115
|
+
@tables.values
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
alias tables each_table
|
|
119
|
+
|
|
120
|
+
# @return [Boolean] whether this keyspace has an index with the given name
|
|
121
|
+
# @param name [String] index name
|
|
122
|
+
def has_index?(name)
|
|
123
|
+
@indexes_hash.key?(name)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# @return [Cassandra::Index, nil] an index or nil
|
|
127
|
+
# @param name [String] index name
|
|
128
|
+
def index(name)
|
|
129
|
+
@indexes_hash[name]
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Yield or enumerate each index defined in this keyspace
|
|
133
|
+
# @overload each_index
|
|
134
|
+
# @yieldparam index [Cassandra::Index] current index
|
|
135
|
+
# @return [Cassandra::Keyspace] self
|
|
136
|
+
# @overload each_index
|
|
137
|
+
# @return [Array<Cassandra::Index>] a list of indexes
|
|
138
|
+
def each_index(&block)
|
|
139
|
+
if block_given?
|
|
140
|
+
@indexes_hash.each_value(&block)
|
|
141
|
+
self
|
|
142
|
+
else
|
|
143
|
+
@indexes_hash.values
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
alias indexes each_index
|
|
147
|
+
|
|
148
|
+
# @return [Boolean] whether this keyspace has a materialized view with the given name
|
|
149
|
+
# @param name [String] materialized view name
|
|
150
|
+
def has_materialized_view?(name)
|
|
151
|
+
# We check if the view exists *and* that its base-table is set. If base-table isn't available,
|
|
152
|
+
# it will be soon, so the user can poll on this method until we return a fully-baked materialized view.
|
|
153
|
+
@views.key?(name) && !@views[name].base_table.nil?
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# @return [Cassandra::MaterializedView, nil] a materialized view or nil
|
|
157
|
+
# @param name [String] materialized view name
|
|
158
|
+
def materialized_view(name)
|
|
159
|
+
@views[name] if has_materialized_view?(name)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Yield or enumerate each materialized view defined in this keyspace
|
|
163
|
+
# @overload each_materialized_view
|
|
164
|
+
# @yieldparam view [Cassandra::MaterializedView] current materialized view
|
|
165
|
+
# @return [Cassandra::Keyspace] self
|
|
166
|
+
# @overload each_materialized_view
|
|
167
|
+
# @return [Array<Cassandra::MaterializedView>] a list of materialized views
|
|
168
|
+
def each_materialized_view(&block)
|
|
169
|
+
if block_given?
|
|
170
|
+
@views.each_value do |v|
|
|
171
|
+
yield(v) if v.base_table
|
|
172
|
+
end
|
|
173
|
+
self
|
|
174
|
+
else
|
|
175
|
+
result = []
|
|
176
|
+
@views.each_value do |v|
|
|
177
|
+
result << v if v.base_table
|
|
178
|
+
end
|
|
179
|
+
result
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
alias materialized_views each_materialized_view
|
|
183
|
+
|
|
184
|
+
# @return [Boolean] whether this keyspace has a user-defined type with the
|
|
185
|
+
# given name
|
|
186
|
+
# @param name [String] user-defined type name
|
|
187
|
+
def has_type?(name)
|
|
188
|
+
@types.key?(name)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# @return [Cassandra::Types::UserDefined, nil] a type or nil
|
|
192
|
+
# @param name [String] user-defined type name
|
|
193
|
+
def type(name)
|
|
194
|
+
@types[name]
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# Yield or enumerate each user-defined type present in this keyspace
|
|
198
|
+
# @overload each_type
|
|
199
|
+
# @yieldparam type [Cassandra::Types::UserDefined] current type
|
|
200
|
+
# @return [Cassandra::Keyspace] self
|
|
201
|
+
# @overload each_type
|
|
202
|
+
# @return [Array<Cassandra::Types::UserDefined>] a list of user-defined types
|
|
203
|
+
def each_type(&block)
|
|
204
|
+
if block_given?
|
|
205
|
+
@types.each_value(&block)
|
|
206
|
+
self
|
|
207
|
+
else
|
|
208
|
+
@types.values
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
alias types each_type
|
|
212
|
+
|
|
213
|
+
# @return [Boolean] whether this keyspace has a function with the given name and
|
|
214
|
+
# arguments
|
|
215
|
+
# @param name [String] function name
|
|
216
|
+
# @param args [Array<String>] (var-args style) function argument types
|
|
217
|
+
def has_function?(name, *args)
|
|
218
|
+
!@functions.get(name.downcase, args).nil?
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
# @return [Cassandra::Function, nil] a function or nil
|
|
222
|
+
# @param name [String] function name
|
|
223
|
+
# @param args [Array<String>] (var-args style) function argument types
|
|
224
|
+
def function(name, *args)
|
|
225
|
+
# The functions_hash datastructure is a hash <[func-name, args], Function>.
|
|
226
|
+
# So construct the array-key we're looking for.
|
|
227
|
+
@functions.get(name.downcase, args)
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Yield or enumerate each function defined in this keyspace
|
|
231
|
+
# @overload each_function
|
|
232
|
+
# @yieldparam function [Cassandra::Function] current function
|
|
233
|
+
# @return [Cassandra::Keyspace] self
|
|
234
|
+
# @overload each_function
|
|
235
|
+
# @return [Array<Cassandra::Function>] a list of functions
|
|
236
|
+
def each_function(&block)
|
|
237
|
+
if block_given?
|
|
238
|
+
@functions.each_function(&block)
|
|
239
|
+
self
|
|
240
|
+
else
|
|
241
|
+
@functions.functions
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
alias functions each_function
|
|
245
|
+
|
|
246
|
+
# @return [Boolean] whether this keyspace has an aggregate with the given
|
|
247
|
+
# name and arguments
|
|
248
|
+
# @param name [String] aggregate name
|
|
249
|
+
# @param args [Array<String>] (var-args style) aggregate function argument types
|
|
250
|
+
def has_aggregate?(name, *args)
|
|
251
|
+
!@aggregates.get(name.downcase, args).nil?
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
# @return [Cassandra::Aggregate, nil] an aggregate or nil
|
|
255
|
+
# @param name [String] aggregate name
|
|
256
|
+
# @param args [Array<String>] (var-args style) aggregate function argument types
|
|
257
|
+
def aggregate(name, *args)
|
|
258
|
+
@aggregates.get(name.downcase, args)
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
# Yield or enumerate each aggregate defined in this keyspace
|
|
262
|
+
# @overload each_aggregate
|
|
263
|
+
# @yieldparam aggregate [Cassandra::Aggregate] current aggregate
|
|
264
|
+
# @return [Cassandra::Keyspace] self
|
|
265
|
+
# @overload each_aggregate
|
|
266
|
+
# @return [Array<Cassandra::Aggregate>] a list of aggregates
|
|
267
|
+
def each_aggregate(&block)
|
|
268
|
+
if block_given?
|
|
269
|
+
@aggregates.each_function(&block)
|
|
270
|
+
self
|
|
271
|
+
else
|
|
272
|
+
@aggregates.functions
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
alias aggregates each_aggregate
|
|
276
|
+
|
|
277
|
+
# @return [String] a cql representation of this keyspace
|
|
278
|
+
def to_cql
|
|
279
|
+
"CREATE KEYSPACE #{Util.escape_name(@name)} " \
|
|
280
|
+
"WITH replication = #{@replication.to_cql} AND " \
|
|
281
|
+
"durable_writes = #{@durable_writes};"
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
# @private
|
|
285
|
+
def eql?(other)
|
|
286
|
+
other.is_a?(Keyspace) &&
|
|
287
|
+
@name == other.name &&
|
|
288
|
+
@durable_writes == other.durable_writes &&
|
|
289
|
+
@replication == other.replication &&
|
|
290
|
+
@tables == other.raw_tables &&
|
|
291
|
+
@types == other.raw_types &&
|
|
292
|
+
@functions == other.raw_functions &&
|
|
293
|
+
@aggregates == other.raw_aggregates
|
|
294
|
+
end
|
|
295
|
+
alias == eql?
|
|
296
|
+
|
|
297
|
+
# @private
|
|
298
|
+
def inspect
|
|
299
|
+
"#<#{self.class.name}:0x#{object_id.to_s(16)} @name=#{@name}>"
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
# @private
|
|
303
|
+
def update_table(table)
|
|
304
|
+
tables = @tables.dup
|
|
305
|
+
tables[table.name] = table
|
|
306
|
+
Keyspace.new(@name,
|
|
307
|
+
@durable_writes,
|
|
308
|
+
@replication,
|
|
309
|
+
tables,
|
|
310
|
+
@types,
|
|
311
|
+
@functions,
|
|
312
|
+
@aggregates,
|
|
313
|
+
@views)
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
# @private
|
|
317
|
+
def delete_table(table_name)
|
|
318
|
+
tables = @tables.dup
|
|
319
|
+
tables.delete(table_name)
|
|
320
|
+
Keyspace.new(@name,
|
|
321
|
+
@durable_writes,
|
|
322
|
+
@replication,
|
|
323
|
+
tables,
|
|
324
|
+
@types,
|
|
325
|
+
@functions,
|
|
326
|
+
@aggregates,
|
|
327
|
+
@views)
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
# @private
|
|
331
|
+
def update_materialized_view(view)
|
|
332
|
+
views = @views.dup
|
|
333
|
+
views[view.name] = view
|
|
334
|
+
Keyspace.new(@name,
|
|
335
|
+
@durable_writes,
|
|
336
|
+
@replication,
|
|
337
|
+
@tables,
|
|
338
|
+
@types,
|
|
339
|
+
@functions,
|
|
340
|
+
@aggregates,
|
|
341
|
+
views)
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
# @private
|
|
345
|
+
def delete_materialized_view(view_name)
|
|
346
|
+
views = @views.dup
|
|
347
|
+
views.delete(view_name)
|
|
348
|
+
Keyspace.new(@name,
|
|
349
|
+
@durable_writes,
|
|
350
|
+
@replication,
|
|
351
|
+
@tables,
|
|
352
|
+
@types,
|
|
353
|
+
@functions,
|
|
354
|
+
@aggregates,
|
|
355
|
+
views)
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
# @private
|
|
359
|
+
def update_type(type)
|
|
360
|
+
types = @types.dup
|
|
361
|
+
types[type.name] = type
|
|
362
|
+
Keyspace.new(@name,
|
|
363
|
+
@durable_writes,
|
|
364
|
+
@replication,
|
|
365
|
+
@tables,
|
|
366
|
+
types,
|
|
367
|
+
@functions,
|
|
368
|
+
@aggregates,
|
|
369
|
+
@views)
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
# @private
|
|
373
|
+
def delete_type(type_name)
|
|
374
|
+
types = @types.dup
|
|
375
|
+
types.delete(type_name)
|
|
376
|
+
Keyspace.new(@name,
|
|
377
|
+
@durable_writes,
|
|
378
|
+
@replication,
|
|
379
|
+
@tables,
|
|
380
|
+
types,
|
|
381
|
+
@functions,
|
|
382
|
+
@aggregates,
|
|
383
|
+
@views)
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
# @private
|
|
387
|
+
def update_function(function)
|
|
388
|
+
functions = @functions.dup
|
|
389
|
+
functions.add_or_update(function)
|
|
390
|
+
Keyspace.new(@name,
|
|
391
|
+
@durable_writes,
|
|
392
|
+
@replication,
|
|
393
|
+
@tables,
|
|
394
|
+
@types,
|
|
395
|
+
functions,
|
|
396
|
+
@aggregates,
|
|
397
|
+
@views)
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
# @private
|
|
401
|
+
def delete_function(function_name, function_args)
|
|
402
|
+
functions = @functions.dup
|
|
403
|
+
functions.delete(function_name, function_args)
|
|
404
|
+
Keyspace.new(@name,
|
|
405
|
+
@durable_writes,
|
|
406
|
+
@replication,
|
|
407
|
+
@tables,
|
|
408
|
+
@types,
|
|
409
|
+
functions,
|
|
410
|
+
@aggregates,
|
|
411
|
+
@views)
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
# @private
|
|
415
|
+
def update_aggregate(aggregate)
|
|
416
|
+
aggregates = @aggregates.dup
|
|
417
|
+
aggregates.add_or_update(aggregate)
|
|
418
|
+
Keyspace.new(@name,
|
|
419
|
+
@durable_writes,
|
|
420
|
+
@replication,
|
|
421
|
+
@tables,
|
|
422
|
+
@types,
|
|
423
|
+
@functions,
|
|
424
|
+
aggregates,
|
|
425
|
+
@views)
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
# @private
|
|
429
|
+
def delete_aggregate(aggregate_name, aggregate_args)
|
|
430
|
+
aggregates = @aggregates.dup
|
|
431
|
+
aggregates.delete(aggregate_name, aggregate_args)
|
|
432
|
+
Keyspace.new(@name,
|
|
433
|
+
@durable_writes,
|
|
434
|
+
@replication,
|
|
435
|
+
@tables,
|
|
436
|
+
@types,
|
|
437
|
+
@functions,
|
|
438
|
+
aggregates,
|
|
439
|
+
@views)
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
# @private
|
|
443
|
+
attr_reader :durable_writes
|
|
444
|
+
protected :durable_writes
|
|
445
|
+
|
|
446
|
+
protected
|
|
447
|
+
|
|
448
|
+
# @private
|
|
449
|
+
def raw_tables
|
|
450
|
+
@tables
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
# @private
|
|
454
|
+
def raw_materialized_views
|
|
455
|
+
@views
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
# @private
|
|
459
|
+
def raw_types
|
|
460
|
+
@types
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
# @private
|
|
464
|
+
def raw_functions
|
|
465
|
+
@functions
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
# @private
|
|
469
|
+
def raw_aggregates
|
|
470
|
+
@aggregates
|
|
471
|
+
end
|
|
472
|
+
end
|
|
473
|
+
end
|