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
 
| 
         @@ -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.
         
     | 
| 
         @@ -26,31 +26,31 @@ module Cassandra 
     | 
|
| 
       26 
26 
     | 
    
         
             
                    Result = Struct.new(:results, :collections)
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
                    @@types = {
         
     | 
| 
       29 
     | 
    
         
            -
                       
     | 
| 
       30 
     | 
    
         
            -
                       
     | 
| 
       31 
     | 
    
         
            -
                       
     | 
| 
       32 
     | 
    
         
            -
                       
     | 
| 
       33 
     | 
    
         
            -
                       
     | 
| 
       34 
     | 
    
         
            -
                       
     | 
| 
       35 
     | 
    
         
            -
                       
     | 
| 
       36 
     | 
    
         
            -
                       
     | 
| 
       37 
     | 
    
         
            -
                       
     | 
| 
       38 
     | 
    
         
            -
                       
     | 
| 
       39 
     | 
    
         
            -
                       
     | 
| 
       40 
     | 
    
         
            -
                       
     | 
| 
       41 
     | 
    
         
            -
                       
     | 
| 
       42 
     | 
    
         
            -
                       
     | 
| 
       43 
     | 
    
         
            -
                       
     | 
| 
       44 
     | 
    
         
            -
                       
     | 
| 
       45 
     | 
    
         
            -
                       
     | 
| 
       46 
     | 
    
         
            -
                       
     | 
| 
       47 
     | 
    
         
            -
                       
     | 
| 
       48 
     | 
    
         
            -
                       
     | 
| 
       49 
     | 
    
         
            -
                       
     | 
| 
       50 
     | 
    
         
            -
                       
     | 
| 
       51 
     | 
    
         
            -
                       
     | 
| 
       52 
     | 
    
         
            -
                       
     | 
| 
       53 
     | 
    
         
            -
                       
     | 
| 
      
 29 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.AsciiType'         => :ascii,
         
     | 
| 
      
 30 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.LongType'          => :bigint,
         
     | 
| 
      
 31 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.BytesType'         => :blob,
         
     | 
| 
      
 32 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.BooleanType'       => :boolean,
         
     | 
| 
      
 33 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.CounterColumnType' => :counter,
         
     | 
| 
      
 34 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.DecimalType'       => :decimal,
         
     | 
| 
      
 35 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.DoubleType'        => :double,
         
     | 
| 
      
 36 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.FloatType'         => :float,
         
     | 
| 
      
 37 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.InetAddressType'   => :inet,
         
     | 
| 
      
 38 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.Int32Type'         => :int,
         
     | 
| 
      
 39 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.UTF8Type'          => :text,
         
     | 
| 
      
 40 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.TimestampType'     => :timestamp,
         
     | 
| 
      
 41 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.DateType'          => :timestamp,
         
     | 
| 
      
 42 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.UUIDType'          => :uuid,
         
     | 
| 
      
 43 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.IntegerType'       => :varint,
         
     | 
| 
      
 44 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.TimeUUIDType'      => :timeuuid,
         
     | 
| 
      
 45 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.MapType'           => :map,
         
     | 
| 
      
 46 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.SetType'           => :set,
         
     | 
| 
      
 47 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.ListType'          => :list,
         
     | 
| 
      
 48 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.UserType'          => :udt,
         
     | 
| 
      
 49 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.TupleType'         => :tuple,
         
     | 
| 
      
 50 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.ShortType'         => :smallint,
         
     | 
| 
      
 51 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.ByteType'          => :tinyint,
         
     | 
| 
      
 52 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.TimeType'          => :time,
         
     | 
| 
      
 53 
     | 
    
         
            +
                      'org.apache.cassandra.db.marshal.SimpleDateType'    => :date
         
     | 
| 
       54 
54 
     | 
    
         
             
                    }.freeze
         
     | 
| 
       55 
55 
     | 
    
         | 
| 
       56 
56 
     | 
    
         
             
                    def parse(string)
         
     | 
| 
         @@ -63,15 +63,16 @@ module Cassandra 
     | 
|
| 
       63 
63 
     | 
    
         
             
                      collections = nil
         
     | 
| 
       64 
64 
     | 
    
         
             
                      results     = []
         
     | 
| 
       65 
65 
     | 
    
         | 
| 
       66 
     | 
    
         
            -
                      if node.name ==  
     | 
| 
      
 66 
     | 
    
         
            +
                      if node.name == 'org.apache.cassandra.db.marshal.CompositeType'
         
     | 
| 
       67 
67 
     | 
    
         
             
                        collections = {}
         
     | 
| 
       68 
68 
     | 
    
         | 
| 
       69 
     | 
    
         
            -
                        if node.children.last.name == 
     | 
| 
      
 69 
     | 
    
         
            +
                        if node.children.last.name ==
         
     | 
| 
      
 70 
     | 
    
         
            +
                           'org.apache.cassandra.db.marshal.ColumnToCollectionType'
         
     | 
| 
       70 
71 
     | 
    
         
             
                          node.children.pop.children.each do |child|
         
     | 
| 
       71 
     | 
    
         
            -
                            key, name  = child.name.split( 
     | 
| 
      
 72 
     | 
    
         
            +
                            key, name  = child.name.split(':')
         
     | 
| 
       72 
73 
     | 
    
         
             
                            key        = [key].pack('H*').force_encoding(::Encoding::UTF_8)
         
     | 
| 
       73 
74 
     | 
    
         | 
| 
       74 
     | 
    
         
            -
                            if name ==  
     | 
| 
      
 75 
     | 
    
         
            +
                            if name == 'org.apache.cassandra.db.marshal.ReversedType'
         
     | 
| 
       75 
76 
     | 
    
         
             
                              collections[key] = lookup_type(child.children.first)
         
     | 
| 
       76 
77 
     | 
    
         
             
                            else
         
     | 
| 
       77 
78 
     | 
    
         
             
                              child.name = name
         
     | 
| 
         @@ -94,12 +95,12 @@ module Cassandra 
     | 
|
| 
       94 
95 
     | 
    
         
             
                      order  = :asc
         
     | 
| 
       95 
96 
     | 
    
         
             
                      frozen = false
         
     | 
| 
       96 
97 
     | 
    
         | 
| 
       97 
     | 
    
         
            -
                      if node.name ==  
     | 
| 
      
 98 
     | 
    
         
            +
                      if node.name == 'org.apache.cassandra.db.marshal.ReversedType'
         
     | 
| 
       98 
99 
     | 
    
         
             
                        order = :desc
         
     | 
| 
       99 
100 
     | 
    
         
             
                        node  = node.children.first
         
     | 
| 
       100 
101 
     | 
    
         
             
                      end
         
     | 
| 
       101 
102 
     | 
    
         | 
| 
       102 
     | 
    
         
            -
                      if node.name ==  
     | 
| 
      
 103 
     | 
    
         
            +
                      if node.name == 'org.apache.cassandra.db.marshal.FrozenType'
         
     | 
| 
       103 
104 
     | 
    
         
             
                        frozen = true
         
     | 
| 
       104 
105 
     | 
    
         
             
                        node   = node.children.first
         
     | 
| 
       105 
106 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -108,11 +109,11 @@ module Cassandra 
     | 
|
| 
       108 
109 
     | 
    
         
             
                    end
         
     | 
| 
       109 
110 
     | 
    
         | 
| 
       110 
111 
     | 
    
         
             
                    def lookup_type(node)
         
     | 
| 
       111 
     | 
    
         
            -
                      if node.name ==  
     | 
| 
       112 
     | 
    
         
            -
                        return lookup_type(node.children.first)
         
     | 
| 
       113 
     | 
    
         
            -
                      end
         
     | 
| 
      
 112 
     | 
    
         
            +
                      return lookup_type(node.children.first) if node.name == 'org.apache.cassandra.db.marshal.FrozenType'
         
     | 
| 
       114 
113 
     | 
    
         | 
| 
       115 
     | 
    
         
            -
                      type = @@types.fetch(node.name)  
     | 
| 
      
 114 
     | 
    
         
            +
                      type = @@types.fetch(node.name) do
         
     | 
| 
      
 115 
     | 
    
         
            +
                        return Cassandra::Types.custom(dump_node(node))
         
     | 
| 
      
 116 
     | 
    
         
            +
                      end
         
     | 
| 
       116 
117 
     | 
    
         | 
| 
       117 
118 
     | 
    
         
             
                      case type
         
     | 
| 
       118 
119 
     | 
    
         
             
                      when :set, :list
         
     | 
| 
         @@ -123,7 +124,7 @@ module Cassandra 
     | 
|
| 
       123 
124 
     | 
    
         
             
                        keyspace = node.children.shift.name
         
     | 
| 
       124 
125 
     | 
    
         
             
                        name     = [node.children.shift.name].pack('H*')
         
     | 
| 
       125 
126 
     | 
    
         
             
                        fields   = node.children.map do |child|
         
     | 
| 
       126 
     | 
    
         
            -
                          field_name, child_name = child.name.split( 
     | 
| 
      
 127 
     | 
    
         
            +
                          field_name, child_name = child.name.split(':')
         
     | 
| 
       127 
128 
     | 
    
         | 
| 
       128 
129 
     | 
    
         
             
                          child.name = child_name
         
     | 
| 
       129 
130 
     | 
    
         
             
                          field_name = [field_name].pack('H*').force_encoding(::Encoding::UTF_8)
         
     | 
| 
         @@ -166,7 +167,7 @@ module Cassandra 
     | 
|
| 
       166 
167 
     | 
    
         | 
| 
       167 
168 
     | 
    
         
             
                    def dump_node(node)
         
     | 
| 
       168 
169 
     | 
    
         
             
                      str = node.name
         
     | 
| 
       169 
     | 
    
         
            -
                      str << '(' + node.children.map {|n| dump_node(n)}.join(',') + ')' unless node.children.empty?
         
     | 
| 
      
 170 
     | 
    
         
            +
                      str << '(' + node.children.map { |n| dump_node(n) }.join(',') + ')' unless node.children.empty?
         
     | 
| 
       170 
171 
     | 
    
         
             
                      str
         
     | 
| 
       171 
172 
     | 
    
         
             
                    end
         
     | 
| 
       172 
173 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -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.
         
     | 
| 
         @@ -23,6 +23,11 @@ module Cassandra 
     | 
|
| 
       23 
23 
     | 
    
         
             
                  module Partitioners
         
     | 
| 
       24 
24 
     | 
    
         
             
                    # @private
         
     | 
| 
       25 
25 
     | 
    
         
             
                    class Murmur3
         
     | 
| 
      
 26 
     | 
    
         
            +
                      # @private
         
     | 
| 
      
 27 
     | 
    
         
            +
                      LONG_MIN = -2**63
         
     | 
| 
      
 28 
     | 
    
         
            +
                      # @private
         
     | 
| 
      
 29 
     | 
    
         
            +
                      LONG_MAX = 2**63 - 1
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
       26 
31 
     | 
    
         
             
                      def create_token(partition_key)
         
     | 
| 
       27 
32 
     | 
    
         
             
                        token = Cassandra::Murmur3.hash(partition_key)
         
     | 
| 
       28 
33 
     | 
    
         
             
                        token = LONG_MAX if token == LONG_MIN
         
     | 
| 
         @@ -33,13 +38,6 @@ module Cassandra 
     | 
|
| 
       33 
38 
     | 
    
         
             
                      def parse_token(token_string)
         
     | 
| 
       34 
39 
     | 
    
         
             
                        token_string.to_i
         
     | 
| 
       35 
40 
     | 
    
         
             
                      end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                      private
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                      # @private
         
     | 
| 
       40 
     | 
    
         
            -
                      LONG_MIN = -2 ** 63
         
     | 
| 
       41 
     | 
    
         
            -
                      # @private
         
     | 
| 
       42 
     | 
    
         
            -
                      LONG_MAX = 2 ** 63 - 1
         
     | 
| 
       43 
41 
     | 
    
         
             
                    end
         
     | 
| 
       44 
42 
     | 
    
         
             
                  end
         
     | 
| 
       45 
43 
     | 
    
         
             
                end
         
     | 
| 
         @@ -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.
         
     | 
| 
         @@ -34,7 +34,7 @@ module Cassandra 
     | 
|
| 
       34 
34 
     | 
    
         
             
                          racks[host.datacenter] ||= ::Set.new
         
     | 
| 
       35 
35 
     | 
    
         
             
                          racks[host.datacenter].add(host.rack)
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
                          datacenter_token_rings[host.datacenter]  ||=  
     | 
| 
      
 37 
     | 
    
         
            +
                          datacenter_token_rings[host.datacenter]  ||= {}
         
     | 
| 
       38 
38 
     | 
    
         
             
                          datacenter_token_rings[host.datacenter][i] = token
         
     | 
| 
       39 
39 
     | 
    
         
             
                        end
         
     | 
| 
       40 
40 
     | 
    
         | 
| 
         @@ -48,8 +48,11 @@ module Cassandra 
     | 
|
| 
       48 
48 
     | 
    
         
             
                          replication_options.each do |datacenter, factor|
         
     | 
| 
       49 
49 
     | 
    
         
             
                            ring = datacenter_token_rings[datacenter]
         
     | 
| 
       50 
50 
     | 
    
         
             
                            next unless ring
         
     | 
| 
       51 
     | 
    
         
            -
                            factor =  
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
      
 51 
     | 
    
         
            +
                            factor = begin
         
     | 
| 
      
 52 
     | 
    
         
            +
                                       [Integer(factor), ring.size].min
         
     | 
| 
      
 53 
     | 
    
         
            +
                                     rescue
         
     | 
| 
      
 54 
     | 
    
         
            +
                                       next
         
     | 
| 
      
 55 
     | 
    
         
            +
                                     end
         
     | 
| 
       53 
56 
     | 
    
         | 
| 
       54 
57 
     | 
    
         
             
                            total_racks    = racks[datacenter].size
         
     | 
| 
       55 
58 
     | 
    
         
             
                            visited_racks  = visited[datacenter] ||= ::Set.new
         
     | 
| 
         @@ -68,21 +71,19 @@ module Cassandra 
     | 
|
| 
       68 
71 
     | 
    
         
             
                              if rack.nil? || visited_racks.size == total_racks
         
     | 
| 
       69 
72 
     | 
    
         
             
                                replicas << host
         
     | 
| 
       70 
73 
     | 
    
         
             
                                added_replicas << host
         
     | 
| 
      
 74 
     | 
    
         
            +
                              elsif visited_racks.include?(rack)
         
     | 
| 
      
 75 
     | 
    
         
            +
                                skipped_hosts << host
         
     | 
| 
       71 
76 
     | 
    
         
             
                              else
         
     | 
| 
       72 
     | 
    
         
            -
                                 
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
                                 
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
                                   
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
                                     
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
     | 
    
         
            -
                                      replicas << skipped_host
         
     | 
| 
       84 
     | 
    
         
            -
                                      added_replicas << host
         
     | 
| 
       85 
     | 
    
         
            -
                                    end
         
     | 
| 
      
 77 
     | 
    
         
            +
                                replicas << host
         
     | 
| 
      
 78 
     | 
    
         
            +
                                visited_racks << rack
         
     | 
| 
      
 79 
     | 
    
         
            +
                                added_replicas << host
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                                if visited_racks.size == total_racks
         
     | 
| 
      
 82 
     | 
    
         
            +
                                  skipped_hosts.each do |skipped_host|
         
     | 
| 
      
 83 
     | 
    
         
            +
                                    break if added_replicas.size >= factor
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                                    replicas << skipped_host
         
     | 
| 
      
 86 
     | 
    
         
            +
                                    added_replicas << host
         
     | 
| 
       86 
87 
     | 
    
         
             
                                  end
         
     | 
| 
       87 
88 
     | 
    
         
             
                                end
         
     | 
| 
       88 
89 
     | 
    
         
             
                              end
         
     | 
    
        data/lib/cassandra/column.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.
         
     | 
| 
         @@ -21,36 +21,18 @@ module Cassandra 
     | 
|
| 
       21 
21 
     | 
    
         
             
              # @see Cassandra::Table#each_column
         
     | 
| 
       22 
22 
     | 
    
         
             
              # @see Cassandra::Table#column
         
     | 
| 
       23 
23 
     | 
    
         
             
              class Column
         
     | 
| 
       24 
     | 
    
         
            -
                # @private
         
     | 
| 
       25 
     | 
    
         
            -
                class Index
         
     | 
| 
       26 
     | 
    
         
            -
                  # @return [String] index name
         
     | 
| 
       27 
     | 
    
         
            -
                  attr_reader :name
         
     | 
| 
       28 
     | 
    
         
            -
                  # @return [String] custom index class name
         
     | 
| 
       29 
     | 
    
         
            -
                  attr_reader :custom_class_name
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                  # @private
         
     | 
| 
       32 
     | 
    
         
            -
                  def initialize(name, custom_class_name = nil)
         
     | 
| 
       33 
     | 
    
         
            -
                    @name              = name
         
     | 
| 
       34 
     | 
    
         
            -
                    @custom_class_name = custom_class_name
         
     | 
| 
       35 
     | 
    
         
            -
                  end
         
     | 
| 
       36 
     | 
    
         
            -
                end
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
24 
     | 
    
         
             
                # @return [String] column name
         
     | 
| 
       39 
25 
     | 
    
         
             
                attr_reader :name
         
     | 
| 
       40 
26 
     | 
    
         
             
                # @return [Cassandra::Type] column type
         
     | 
| 
       41 
27 
     | 
    
         
             
                attr_reader :type
         
     | 
| 
       42 
28 
     | 
    
         
             
                # @return [Symbol] column order (`:asc` or `:desc`)
         
     | 
| 
       43 
29 
     | 
    
         
             
                attr_reader :order
         
     | 
| 
       44 
     | 
    
         
            -
                # @private
         
     | 
| 
       45 
     | 
    
         
            -
                # @return [Cassandra::Column::Index, nil] column index
         
     | 
| 
       46 
     | 
    
         
            -
                attr_reader :index
         
     | 
| 
       47 
30 
     | 
    
         | 
| 
       48 
31 
     | 
    
         
             
                # @private
         
     | 
| 
       49 
     | 
    
         
            -
                def initialize(name, type, order,  
     | 
| 
      
 32 
     | 
    
         
            +
                def initialize(name, type, order, is_static = false, is_frozen = false)
         
     | 
| 
       50 
33 
     | 
    
         
             
                  @name     = name
         
     | 
| 
       51 
34 
     | 
    
         
             
                  @type     = type
         
     | 
| 
       52 
35 
     | 
    
         
             
                  @order    = order
         
     | 
| 
       53 
     | 
    
         
            -
                  @index    = index
         
     | 
| 
       54 
36 
     | 
    
         
             
                  @static   = is_static
         
     | 
| 
       55 
37 
     | 
    
         
             
                  @frozen   = is_frozen
         
     | 
| 
       56 
38 
     | 
    
         
             
                end
         
     | 
| 
         @@ -67,7 +49,7 @@ module Cassandra 
     | 
|
| 
       67 
49 
     | 
    
         | 
| 
       68 
50 
     | 
    
         
             
                # @private
         
     | 
| 
       69 
51 
     | 
    
         
             
                def inspect
         
     | 
| 
       70 
     | 
    
         
            -
                  "#<#{self.class.name}:0x#{ 
     | 
| 
      
 52 
     | 
    
         
            +
                  "#<#{self.class.name}:0x#{object_id.to_s(16)} @name=#{@name} @type=#{@type}>"
         
     | 
| 
       71 
53 
     | 
    
         
             
                end
         
     | 
| 
       72 
54 
     | 
    
         | 
| 
       73 
55 
     | 
    
         
             
                # @private
         
     | 
| 
         @@ -76,10 +58,9 @@ module Cassandra 
     | 
|
| 
       76 
58 
     | 
    
         
             
                    @name == other.name &&
         
     | 
| 
       77 
59 
     | 
    
         
             
                    @type == other.type &&
         
     | 
| 
       78 
60 
     | 
    
         
             
                    @order == other.order &&
         
     | 
| 
       79 
     | 
    
         
            -
                    @index == other.index &&
         
     | 
| 
       80 
61 
     | 
    
         
             
                    @static == other.static? &&
         
     | 
| 
       81 
62 
     | 
    
         
             
                    @frozen == other.frozen?
         
     | 
| 
       82 
63 
     | 
    
         
             
                end
         
     | 
| 
       83 
     | 
    
         
            -
                alias  
     | 
| 
      
 64 
     | 
    
         
            +
                alias == eql?
         
     | 
| 
       84 
65 
     | 
    
         
             
              end
         
     | 
| 
       85 
66 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,322 @@ 
     | 
|
| 
      
 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 
     | 
    
         
            +
              # This class contains all the logic needed for manipulating columns of an object.
         
     | 
| 
      
 21 
     | 
    
         
            +
              class ColumnContainer
         
     | 
| 
      
 22 
     | 
    
         
            +
                # Encapsulates all of the configuration options of a column-container.
         
     | 
| 
      
 23 
     | 
    
         
            +
                class Options
         
     | 
| 
      
 24 
     | 
    
         
            +
                  # @return [String] the comment attribute of this column-container.
         
     | 
| 
      
 25 
     | 
    
         
            +
                  attr_reader :comment
         
     | 
| 
      
 26 
     | 
    
         
            +
                  # @return [Float] the chance with which a read repair is triggered for this column-container.
         
     | 
| 
      
 27 
     | 
    
         
            +
                  attr_reader :read_repair_chance
         
     | 
| 
      
 28 
     | 
    
         
            +
                  # @return [Float] the cluster local read repair chance for this column-container.
         
     | 
| 
      
 29 
     | 
    
         
            +
                  attr_reader :local_read_repair_chance
         
     | 
| 
      
 30 
     | 
    
         
            +
                  # @return [Integer] the tombstone garbage collection grace time in seconds for this column-container.
         
     | 
| 
      
 31 
     | 
    
         
            +
                  attr_reader :gc_grace_seconds
         
     | 
| 
      
 32 
     | 
    
         
            +
                  # @return [Hash] the caching options for this column-container.
         
     | 
| 
      
 33 
     | 
    
         
            +
                  attr_reader :caching
         
     | 
| 
      
 34 
     | 
    
         
            +
                  # @return [Float] the false positive chance for the Bloom filter of this column-container.
         
     | 
| 
      
 35 
     | 
    
         
            +
                  attr_reader :bloom_filter_fp_chance
         
     | 
| 
      
 36 
     | 
    
         
            +
                  # @return [Integer] how often (in milliseconds) to flush the memtable of this column-container.
         
     | 
| 
      
 37 
     | 
    
         
            +
                  attr_reader :memtable_flush_period_in_ms
         
     | 
| 
      
 38 
     | 
    
         
            +
                  # @return [Integer] the default TTL for this column-container.
         
     | 
| 
      
 39 
     | 
    
         
            +
                  attr_reader :default_time_to_live
         
     | 
| 
      
 40 
     | 
    
         
            +
                  # Return the speculative retry setting of this column-container, which determines how much
         
     | 
| 
      
 41 
     | 
    
         
            +
                  # response delay the coordinator node will tolerate from the chosen replica before
         
     | 
| 
      
 42 
     | 
    
         
            +
                  # retrying the request on other replicas. This setting can be expressed as a fixed
         
     | 
| 
      
 43 
     | 
    
         
            +
                  # delay in ms (e.g. 10ms) or as a percentile indicating "when the response time has
         
     | 
| 
      
 44 
     | 
    
         
            +
                  # exceeded the Nth percentile of read response times for this object" (e.g. 99percentile).
         
     | 
| 
      
 45 
     | 
    
         
            +
                  # @return [String] the speculative retry setting of this column-container.
         
     | 
| 
      
 46 
     | 
    
         
            +
                  attr_reader :speculative_retry
         
     | 
| 
      
 47 
     | 
    
         
            +
                  # Return the index interval of this column-container; Cassandra will hold `1/index_interval` of row keys in
         
     | 
| 
      
 48 
     | 
    
         
            +
                  # memory.
         
     | 
| 
      
 49 
     | 
    
         
            +
                  # @return [Integer] the index interval of this column-container. May be nil, indicating a default value of 128.
         
     | 
| 
      
 50 
     | 
    
         
            +
                  attr_reader :index_interval
         
     | 
| 
      
 51 
     | 
    
         
            +
                  # @return [Hash] compression settings
         
     | 
| 
      
 52 
     | 
    
         
            +
                  attr_reader :compression
         
     | 
| 
      
 53 
     | 
    
         
            +
                  # When compression is enabled, this option defines the probability
         
     | 
| 
      
 54 
     | 
    
         
            +
                  # with which checksums for compressed blocks are checked during reads.
         
     | 
| 
      
 55 
     | 
    
         
            +
                  # @return [Float] the probability of checking checksums on compressed blocks.
         
     | 
| 
      
 56 
     | 
    
         
            +
                  attr_reader :crc_check_chance
         
     | 
| 
      
 57 
     | 
    
         
            +
                  # @return [Hash] the extension options of this column-container.
         
     | 
| 
      
 58 
     | 
    
         
            +
                  attr_reader :extensions
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                  # @return [ColumnContainer::Compaction] the compaction strategy of this column-container.
         
     | 
| 
      
 61 
     | 
    
         
            +
                  attr_reader :compaction_strategy
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                  # @private
         
     | 
| 
      
 64 
     | 
    
         
            +
                  # rubocop:disable Metrics/ParameterLists
         
     | 
| 
      
 65 
     | 
    
         
            +
                  def initialize(comment,
         
     | 
| 
      
 66 
     | 
    
         
            +
                                 read_repair_chance,
         
     | 
| 
      
 67 
     | 
    
         
            +
                                 local_read_repair_chance,
         
     | 
| 
      
 68 
     | 
    
         
            +
                                 gc_grace_seconds,
         
     | 
| 
      
 69 
     | 
    
         
            +
                                 caching,
         
     | 
| 
      
 70 
     | 
    
         
            +
                                 bloom_filter_fp_chance,
         
     | 
| 
      
 71 
     | 
    
         
            +
                                 populate_io_cache_on_flush,
         
     | 
| 
      
 72 
     | 
    
         
            +
                                 memtable_flush_period_in_ms,
         
     | 
| 
      
 73 
     | 
    
         
            +
                                 default_time_to_live,
         
     | 
| 
      
 74 
     | 
    
         
            +
                                 speculative_retry,
         
     | 
| 
      
 75 
     | 
    
         
            +
                                 index_interval,
         
     | 
| 
      
 76 
     | 
    
         
            +
                                 replicate_on_write,
         
     | 
| 
      
 77 
     | 
    
         
            +
                                 min_index_interval,
         
     | 
| 
      
 78 
     | 
    
         
            +
                                 max_index_interval,
         
     | 
| 
      
 79 
     | 
    
         
            +
                                 compaction_strategy,
         
     | 
| 
      
 80 
     | 
    
         
            +
                                 compression,
         
     | 
| 
      
 81 
     | 
    
         
            +
                                 compact_storage,
         
     | 
| 
      
 82 
     | 
    
         
            +
                                 crc_check_chance,
         
     | 
| 
      
 83 
     | 
    
         
            +
                                 extensions)
         
     | 
| 
      
 84 
     | 
    
         
            +
                    @comment                     = comment
         
     | 
| 
      
 85 
     | 
    
         
            +
                    @read_repair_chance          = read_repair_chance
         
     | 
| 
      
 86 
     | 
    
         
            +
                    @local_read_repair_chance    = local_read_repair_chance
         
     | 
| 
      
 87 
     | 
    
         
            +
                    @gc_grace_seconds            = gc_grace_seconds
         
     | 
| 
      
 88 
     | 
    
         
            +
                    @caching                     = caching
         
     | 
| 
      
 89 
     | 
    
         
            +
                    @bloom_filter_fp_chance      = bloom_filter_fp_chance
         
     | 
| 
      
 90 
     | 
    
         
            +
                    @populate_io_cache_on_flush  = populate_io_cache_on_flush
         
     | 
| 
      
 91 
     | 
    
         
            +
                    @memtable_flush_period_in_ms = memtable_flush_period_in_ms
         
     | 
| 
      
 92 
     | 
    
         
            +
                    @default_time_to_live        = default_time_to_live
         
     | 
| 
      
 93 
     | 
    
         
            +
                    @speculative_retry           = speculative_retry
         
     | 
| 
      
 94 
     | 
    
         
            +
                    @index_interval              = index_interval
         
     | 
| 
      
 95 
     | 
    
         
            +
                    @replicate_on_write          = replicate_on_write
         
     | 
| 
      
 96 
     | 
    
         
            +
                    @min_index_interval          = min_index_interval
         
     | 
| 
      
 97 
     | 
    
         
            +
                    @max_index_interval          = max_index_interval
         
     | 
| 
      
 98 
     | 
    
         
            +
                    @compaction_strategy         = compaction_strategy
         
     | 
| 
      
 99 
     | 
    
         
            +
                    @compression                 = compression
         
     | 
| 
      
 100 
     | 
    
         
            +
                    @compact_storage             = compact_storage
         
     | 
| 
      
 101 
     | 
    
         
            +
                    @crc_check_chance            = crc_check_chance
         
     | 
| 
      
 102 
     | 
    
         
            +
                    @extensions                  = extensions
         
     | 
| 
      
 103 
     | 
    
         
            +
                  end
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
                  # Return whether to replicate counter updates to other replicas. It is *strongly* recommended
         
     | 
| 
      
 106 
     | 
    
         
            +
                  # that this setting be `true`. Otherwise, counter updates are only written to one replica
         
     | 
| 
      
 107 
     | 
    
         
            +
                  # and fault tolerance is sacrificed.
         
     | 
| 
      
 108 
     | 
    
         
            +
                  # @return [Boolean] whether to replicate counter updates to other replicas.
         
     | 
| 
      
 109 
     | 
    
         
            +
                  def replicate_on_write?
         
     | 
| 
      
 110 
     | 
    
         
            +
                    @replicate_on_write
         
     | 
| 
      
 111 
     | 
    
         
            +
                  end
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
                  # @return [Boolean] whether to populate the I/O cache on flush of this
         
     | 
| 
      
 114 
     | 
    
         
            +
                  #   column-container. May be nil, indicating a default value of `false`.
         
     | 
| 
      
 115 
     | 
    
         
            +
                  def populate_io_cache_on_flush?
         
     | 
| 
      
 116 
     | 
    
         
            +
                    @populate_io_cache_on_flush
         
     | 
| 
      
 117 
     | 
    
         
            +
                  end
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
                  # @return [Boolean] whether this column-container uses compact storage.
         
     | 
| 
      
 120 
     | 
    
         
            +
                  def compact_storage?
         
     | 
| 
      
 121 
     | 
    
         
            +
                    @compact_storage
         
     | 
| 
      
 122 
     | 
    
         
            +
                  end
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
                  # @private
         
     | 
| 
      
 125 
     | 
    
         
            +
                  def to_cql
         
     | 
| 
      
 126 
     | 
    
         
            +
                    options = []
         
     | 
| 
      
 127 
     | 
    
         
            +
             
     | 
| 
      
 128 
     | 
    
         
            +
                    options << 'COMPACT STORAGE' if @compact_storage
         
     | 
| 
      
 129 
     | 
    
         
            +
                    unless @bloom_filter_fp_chance.nil?
         
     | 
| 
      
 130 
     | 
    
         
            +
                      options << "bloom_filter_fp_chance = #{Util.encode_object(@bloom_filter_fp_chance)}"
         
     | 
| 
      
 131 
     | 
    
         
            +
                    end
         
     | 
| 
      
 132 
     | 
    
         
            +
                    options << "caching = #{Util.encode_object(@caching)}" unless @caching.nil?
         
     | 
| 
      
 133 
     | 
    
         
            +
                    options << "comment = #{Util.encode_object(@comment)}" unless @comment.nil?
         
     | 
| 
      
 134 
     | 
    
         
            +
                    options << "compaction = #{@compaction_strategy.to_cql}" unless @compaction_strategy.nil?
         
     | 
| 
      
 135 
     | 
    
         
            +
                    options << "compression = #{Util.encode_object(@compression)}" unless @compression.nil?
         
     | 
| 
      
 136 
     | 
    
         
            +
                    options << "crc_check_chance = #{Util.encode_object(@crc_check_chance)}" unless @crc_check_chance.nil?
         
     | 
| 
      
 137 
     | 
    
         
            +
                    unless @local_read_repair_chance.nil?
         
     | 
| 
      
 138 
     | 
    
         
            +
                      options << "dclocal_read_repair_chance = #{Util.encode_object(@local_read_repair_chance)}"
         
     | 
| 
      
 139 
     | 
    
         
            +
                    end
         
     | 
| 
      
 140 
     | 
    
         
            +
                    unless @default_time_to_live.nil?
         
     | 
| 
      
 141 
     | 
    
         
            +
                      options << "default_time_to_live = #{Util.encode_object(@default_time_to_live)}"
         
     | 
| 
      
 142 
     | 
    
         
            +
                    end
         
     | 
| 
      
 143 
     | 
    
         
            +
                    options << "gc_grace_seconds = #{Util.encode_object(@gc_grace_seconds)}" unless @gc_grace_seconds.nil?
         
     | 
| 
      
 144 
     | 
    
         
            +
                    options << "index_interval = #{Util.encode_object(@index_interval)}" unless @index_interval.nil?
         
     | 
| 
      
 145 
     | 
    
         
            +
                    options << "max_index_interval = #{Util.encode_object(@max_index_interval)}" unless @max_index_interval.nil?
         
     | 
| 
      
 146 
     | 
    
         
            +
                    unless @memtable_flush_period_in_ms.nil?
         
     | 
| 
      
 147 
     | 
    
         
            +
                      options << "memtable_flush_period_in_ms = #{Util.encode_object(@memtable_flush_period_in_ms)}"
         
     | 
| 
      
 148 
     | 
    
         
            +
                    end
         
     | 
| 
      
 149 
     | 
    
         
            +
                    options << "min_index_interval = #{Util.encode_object(@min_index_interval)}" unless @min_index_interval.nil?
         
     | 
| 
      
 150 
     | 
    
         
            +
                    unless @populate_io_cache_on_flush.nil?
         
     | 
| 
      
 151 
     | 
    
         
            +
                      options << "populate_io_cache_on_flush = '#{@populate_io_cache_on_flush}'"
         
     | 
| 
      
 152 
     | 
    
         
            +
                    end
         
     | 
| 
      
 153 
     | 
    
         
            +
                    options << "read_repair_chance = #{Util.encode_object(@read_repair_chance)}" unless @read_repair_chance.nil?
         
     | 
| 
      
 154 
     | 
    
         
            +
                    options << "replicate_on_write = '#{@replicate_on_write}'" unless @replicate_on_write.nil?
         
     | 
| 
      
 155 
     | 
    
         
            +
                    options << "speculative_retry = #{Util.encode_object(@speculative_retry)}" unless @speculative_retry.nil?
         
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
      
 157 
     | 
    
         
            +
                    options.join("\nAND ")
         
     | 
| 
      
 158 
     | 
    
         
            +
                  end
         
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
      
 160 
     | 
    
         
            +
                  # @private
         
     | 
| 
      
 161 
     | 
    
         
            +
                  def eql?(other)
         
     | 
| 
      
 162 
     | 
    
         
            +
                    other.is_a?(Options) &&
         
     | 
| 
      
 163 
     | 
    
         
            +
                      @comment == other.comment &&
         
     | 
| 
      
 164 
     | 
    
         
            +
                      @read_repair_chance == other.read_repair_chance &&
         
     | 
| 
      
 165 
     | 
    
         
            +
                      @local_read_repair_chance == other.local_read_repair_chance &&
         
     | 
| 
      
 166 
     | 
    
         
            +
                      @gc_grace_seconds == other.gc_grace_seconds &&
         
     | 
| 
      
 167 
     | 
    
         
            +
                      @caching == other.caching &&
         
     | 
| 
      
 168 
     | 
    
         
            +
                      @bloom_filter_fp_chance == other.bloom_filter_fp_chance &&
         
     | 
| 
      
 169 
     | 
    
         
            +
                      @populate_io_cache_on_flush == other.populate_io_cache_on_flush? &&
         
     | 
| 
      
 170 
     | 
    
         
            +
                      @memtable_flush_period_in_ms == other.memtable_flush_period_in_ms &&
         
     | 
| 
      
 171 
     | 
    
         
            +
                      @default_time_to_live == other.default_time_to_live &&
         
     | 
| 
      
 172 
     | 
    
         
            +
                      @speculative_retry == other.speculative_retry &&
         
     | 
| 
      
 173 
     | 
    
         
            +
                      @index_interval == other.index_interval &&
         
     | 
| 
      
 174 
     | 
    
         
            +
                      @replicate_on_write == other.replicate_on_write? &&
         
     | 
| 
      
 175 
     | 
    
         
            +
                      @compaction_strategy == other.compaction_strategy &&
         
     | 
| 
      
 176 
     | 
    
         
            +
                      @compression == other.compression &&
         
     | 
| 
      
 177 
     | 
    
         
            +
                      @compact_storage == other.compact_storage? &&
         
     | 
| 
      
 178 
     | 
    
         
            +
                      @crc_check_chance == other.crc_check_chance &&
         
     | 
| 
      
 179 
     | 
    
         
            +
                      @extensions == other.extensions
         
     | 
| 
      
 180 
     | 
    
         
            +
                  end
         
     | 
| 
      
 181 
     | 
    
         
            +
                  alias == eql?
         
     | 
| 
      
 182 
     | 
    
         
            +
                end
         
     | 
| 
      
 183 
     | 
    
         
            +
             
     | 
| 
      
 184 
     | 
    
         
            +
                # Encapsulates the compaction strategy of a column-container.
         
     | 
| 
      
 185 
     | 
    
         
            +
                class Compaction
         
     | 
| 
      
 186 
     | 
    
         
            +
                  # @return [String] the name of the Cassandra class that performs compaction.
         
     | 
| 
      
 187 
     | 
    
         
            +
                  attr_reader :class_name
         
     | 
| 
      
 188 
     | 
    
         
            +
                  # @return [Hash] compaction strategy options
         
     | 
| 
      
 189 
     | 
    
         
            +
                  attr_reader :options
         
     | 
| 
      
 190 
     | 
    
         
            +
             
     | 
| 
      
 191 
     | 
    
         
            +
                  # @private
         
     | 
| 
      
 192 
     | 
    
         
            +
                  def initialize(class_name, options)
         
     | 
| 
      
 193 
     | 
    
         
            +
                    @class_name = class_name
         
     | 
| 
      
 194 
     | 
    
         
            +
                    @options = options
         
     | 
| 
      
 195 
     | 
    
         
            +
                  end
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
      
 197 
     | 
    
         
            +
                  # @private
         
     | 
| 
      
 198 
     | 
    
         
            +
                  def to_cql
         
     | 
| 
      
 199 
     | 
    
         
            +
                    compaction = {'class' => @class_name}
         
     | 
| 
      
 200 
     | 
    
         
            +
                    compaction.merge!(@options)
         
     | 
| 
      
 201 
     | 
    
         
            +
             
     | 
| 
      
 202 
     | 
    
         
            +
                    Util.encode_hash(compaction)
         
     | 
| 
      
 203 
     | 
    
         
            +
                  end
         
     | 
| 
      
 204 
     | 
    
         
            +
             
     | 
| 
      
 205 
     | 
    
         
            +
                  # @private
         
     | 
| 
      
 206 
     | 
    
         
            +
                  def eql?(other)
         
     | 
| 
      
 207 
     | 
    
         
            +
                    other.is_a?(Compaction) &&
         
     | 
| 
      
 208 
     | 
    
         
            +
                      @class_name == other.class_name &&
         
     | 
| 
      
 209 
     | 
    
         
            +
                      @options == other.options
         
     | 
| 
      
 210 
     | 
    
         
            +
                  end
         
     | 
| 
      
 211 
     | 
    
         
            +
                  alias == eql?
         
     | 
| 
      
 212 
     | 
    
         
            +
                end
         
     | 
| 
      
 213 
     | 
    
         
            +
             
     | 
| 
      
 214 
     | 
    
         
            +
                # @return [String] name of this column-container
         
     | 
| 
      
 215 
     | 
    
         
            +
                attr_reader :name
         
     | 
| 
      
 216 
     | 
    
         
            +
                # @return [Cassandra::Uuid] the id of this object in Cassandra.
         
     | 
| 
      
 217 
     | 
    
         
            +
                attr_reader :id
         
     | 
| 
      
 218 
     | 
    
         
            +
                # @return [Cassandra::Keyspace] the keyspace that this column-container belongs to.
         
     | 
| 
      
 219 
     | 
    
         
            +
                attr_reader :keyspace
         
     | 
| 
      
 220 
     | 
    
         
            +
                # @return [ColumnContainer::Options] collection of configuration options of this column-container.
         
     | 
| 
      
 221 
     | 
    
         
            +
                attr_reader :options
         
     | 
| 
      
 222 
     | 
    
         
            +
                # @return [Array<Cassandra::Column>] ordered list of column-names that make up the partition-key.
         
     | 
| 
      
 223 
     | 
    
         
            +
                attr_reader :partition_key
         
     | 
| 
      
 224 
     | 
    
         
            +
                # @return [Array<Cassandra::Column>] ordered list of column-names that make up the clustering-columns.
         
     | 
| 
      
 225 
     | 
    
         
            +
                attr_reader :clustering_columns
         
     | 
| 
      
 226 
     | 
    
         
            +
                # @return [Array<Cassandra::Column>] primary key of this column-container. It's the combination of
         
     | 
| 
      
 227 
     | 
    
         
            +
                #   `partition_key` and `clustering_columns`.
         
     | 
| 
      
 228 
     | 
    
         
            +
                # @note This composition produces a flat list, so it will not be possible for the caller to distinguish
         
     | 
| 
      
 229 
     | 
    
         
            +
                #   partition-key columns from clustering-columns.
         
     | 
| 
      
 230 
     | 
    
         
            +
                attr_reader :primary_key
         
     | 
| 
      
 231 
     | 
    
         
            +
             
     | 
| 
      
 232 
     | 
    
         
            +
                # @private
         
     | 
| 
      
 233 
     | 
    
         
            +
                def initialize(keyspace,
         
     | 
| 
      
 234 
     | 
    
         
            +
                               name,
         
     | 
| 
      
 235 
     | 
    
         
            +
                               partition_key,
         
     | 
| 
      
 236 
     | 
    
         
            +
                               clustering_columns,
         
     | 
| 
      
 237 
     | 
    
         
            +
                               other_columns,
         
     | 
| 
      
 238 
     | 
    
         
            +
                               options,
         
     | 
| 
      
 239 
     | 
    
         
            +
                               id)
         
     | 
| 
      
 240 
     | 
    
         
            +
                  @keyspace           = keyspace
         
     | 
| 
      
 241 
     | 
    
         
            +
                  @name               = name.freeze
         
     | 
| 
      
 242 
     | 
    
         
            +
                  @partition_key      = partition_key.freeze
         
     | 
| 
      
 243 
     | 
    
         
            +
                  @clustering_columns = clustering_columns.freeze
         
     | 
| 
      
 244 
     | 
    
         
            +
                  @options            = options
         
     | 
| 
      
 245 
     | 
    
         
            +
                  @id                 = id
         
     | 
| 
      
 246 
     | 
    
         
            +
             
     | 
| 
      
 247 
     | 
    
         
            +
                  # Make one array of all the columns, ordered with partition key, clustering
         
     | 
| 
      
 248 
     | 
    
         
            +
                  # columns, then other columns. Make a hash as well, to support random access
         
     | 
| 
      
 249 
     | 
    
         
            +
                  # to column metadata for a given column name. Save off the primary key (which
         
     | 
| 
      
 250 
     | 
    
         
            +
                  # is partition-key + clustering-columns) while we're at it.
         
     | 
| 
      
 251 
     | 
    
         
            +
             
     | 
| 
      
 252 
     | 
    
         
            +
                  @primary_key = @partition_key.dup.concat(@clustering_columns).freeze
         
     | 
| 
      
 253 
     | 
    
         
            +
                  @columns = @primary_key.dup.concat(other_columns).freeze
         
     | 
| 
      
 254 
     | 
    
         
            +
                  @columns_hash = @columns.each_with_object({}) do |col, h|
         
     | 
| 
      
 255 
     | 
    
         
            +
                    h[col.name] = col
         
     | 
| 
      
 256 
     | 
    
         
            +
                  end
         
     | 
| 
      
 257 
     | 
    
         
            +
                end
         
     | 
| 
      
 258 
     | 
    
         
            +
             
     | 
| 
      
 259 
     | 
    
         
            +
                # @param name [String] column name
         
     | 
| 
      
 260 
     | 
    
         
            +
                # @return [Boolean] whether this column-container has a given column
         
     | 
| 
      
 261 
     | 
    
         
            +
                def has_column?(name)
         
     | 
| 
      
 262 
     | 
    
         
            +
                  @columns_hash.key?(name)
         
     | 
| 
      
 263 
     | 
    
         
            +
                end
         
     | 
| 
      
 264 
     | 
    
         
            +
             
     | 
| 
      
 265 
     | 
    
         
            +
                # @param name [String] column name
         
     | 
| 
      
 266 
     | 
    
         
            +
                # @return [Cassandra::Column, nil] a column or nil
         
     | 
| 
      
 267 
     | 
    
         
            +
                def column(name)
         
     | 
| 
      
 268 
     | 
    
         
            +
                  @columns_hash[name]
         
     | 
| 
      
 269 
     | 
    
         
            +
                end
         
     | 
| 
      
 270 
     | 
    
         
            +
             
     | 
| 
      
 271 
     | 
    
         
            +
                # Yield or enumerate each column defined in this column-container
         
     | 
| 
      
 272 
     | 
    
         
            +
                # @overload each_column
         
     | 
| 
      
 273 
     | 
    
         
            +
                #   @yieldparam column [Cassandra::Column] current column
         
     | 
| 
      
 274 
     | 
    
         
            +
                #   @return [Cassandra::ColumnContainer] self
         
     | 
| 
      
 275 
     | 
    
         
            +
                # @overload each_column
         
     | 
| 
      
 276 
     | 
    
         
            +
                #   @return [Array<Cassandra::Column>] a list of columns
         
     | 
| 
      
 277 
     | 
    
         
            +
                def each_column(&block)
         
     | 
| 
      
 278 
     | 
    
         
            +
                  if block_given?
         
     | 
| 
      
 279 
     | 
    
         
            +
                    @columns.each(&block)
         
     | 
| 
      
 280 
     | 
    
         
            +
                    self
         
     | 
| 
      
 281 
     | 
    
         
            +
                  else
         
     | 
| 
      
 282 
     | 
    
         
            +
                    @columns
         
     | 
| 
      
 283 
     | 
    
         
            +
                  end
         
     | 
| 
      
 284 
     | 
    
         
            +
                end
         
     | 
| 
      
 285 
     | 
    
         
            +
                alias columns each_column
         
     | 
| 
      
 286 
     | 
    
         
            +
             
     | 
| 
      
 287 
     | 
    
         
            +
                # @private
         
     | 
| 
      
 288 
     | 
    
         
            +
                # keyspace attribute may be nil because when this object was constructed, we didn't have
         
     | 
| 
      
 289 
     | 
    
         
            +
                # its keyspace constructed yet. So allow updating @keyspace if it's nil, thus
         
     | 
| 
      
 290 
     | 
    
         
            +
                # allowing fetchers to create keyspace, table/view, and hook them together without
         
     | 
| 
      
 291 
     | 
    
         
            +
                # worrying about chickens and eggs.
         
     | 
| 
      
 292 
     | 
    
         
            +
                # NOTE: Ignore the set request if the @keyspace is already set.
         
     | 
| 
      
 293 
     | 
    
         
            +
                # rubocop:disable Style/AccessorMethodName
         
     | 
| 
      
 294 
     | 
    
         
            +
                def set_keyspace(keyspace)
         
     | 
| 
      
 295 
     | 
    
         
            +
                  @keyspace = keyspace unless @keyspace
         
     | 
| 
      
 296 
     | 
    
         
            +
                end
         
     | 
| 
      
 297 
     | 
    
         
            +
             
     | 
| 
      
 298 
     | 
    
         
            +
                # @private
         
     | 
| 
      
 299 
     | 
    
         
            +
                def inspect
         
     | 
| 
      
 300 
     | 
    
         
            +
                  "#<#{self.class.name}:0x#{object_id.to_s(16)} " \
         
     | 
| 
      
 301 
     | 
    
         
            +
                      "@keyspace=#{@keyspace.name} @name=#{@name}>"
         
     | 
| 
      
 302 
     | 
    
         
            +
                end
         
     | 
| 
      
 303 
     | 
    
         
            +
             
     | 
| 
      
 304 
     | 
    
         
            +
                # @private
         
     | 
| 
      
 305 
     | 
    
         
            +
                def eql?(other)
         
     | 
| 
      
 306 
     | 
    
         
            +
                  other.is_a?(ColumnContainer) &&
         
     | 
| 
      
 307 
     | 
    
         
            +
                    @keyspace == other.keyspace &&
         
     | 
| 
      
 308 
     | 
    
         
            +
                    @name == other.name &&
         
     | 
| 
      
 309 
     | 
    
         
            +
                    @partition_key == other.partition_key &&
         
     | 
| 
      
 310 
     | 
    
         
            +
                    @clustering_columns == other.clustering_columns &&
         
     | 
| 
      
 311 
     | 
    
         
            +
                    @columns == other.raw_columns &&
         
     | 
| 
      
 312 
     | 
    
         
            +
                    @options == other.options
         
     | 
| 
      
 313 
     | 
    
         
            +
                end
         
     | 
| 
      
 314 
     | 
    
         
            +
                alias == eql?
         
     | 
| 
      
 315 
     | 
    
         
            +
             
     | 
| 
      
 316 
     | 
    
         
            +
                # @private
         
     | 
| 
      
 317 
     | 
    
         
            +
                def raw_columns
         
     | 
| 
      
 318 
     | 
    
         
            +
                  @columns
         
     | 
| 
      
 319 
     | 
    
         
            +
                end
         
     | 
| 
      
 320 
     | 
    
         
            +
                protected :raw_columns
         
     | 
| 
      
 321 
     | 
    
         
            +
              end
         
     | 
| 
      
 322 
     | 
    
         
            +
            end
         
     |