o
    NDi                  
   @   s  d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlZd dlZd dlZd dlZd dlmZ d dlZd dlZdZzd d	lmZ W n ey^ Z zW Y dZ[ndZ[ww d d
lmZmZmZmZ d dlmZ d dl m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z'm(Z( d dl)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ e0e1Z2e3dZ4	 e3dZ5	 e4e5 Z6	 e! Z7G dd de8Z9dZ:dd Z;i Z<G dd de=Z>G dd de8e>dZ?e?Z@G dd de8ZAG d d! d!e@ZBG d"d# d#e8ZCG d$d% d%e@ZDG d&d' d'e@ZEG d(d) d)e@ZFG d*d+ d+e8ZGG d,d- d-e8ZHG d.d/ d/e8ZIG d0d1 d1e8ZJG d2d3 d3e8ZKG d4d5 d5eKZLG d6d7 d7eLZMG d8d9 d9e8ZNG d:d; d;e=ZOG d<d= d=eNeOdZPd>d? ZQd@dA ZRdBdC ZSeTdDZUdEdF ZVdGdH ZWdIdJ ZXG dKdL dLe8ZYG dMdN dNe8ZZG dOdP dPe8Z[e	G dQdR dRe8Z\dSZ]dTZ^G dUdV dVe_Z`G dWdX dXe\ZaG dYdZ dZeaZbG d[d\ d\eaZcG d]d^ d^e\ZdG d_d` d`e8ZeG dadb dbe8ZfG dcdd ddefZgG dedf dfegZhG dgdh dhehZiG didj djehZjG dkdl dlejZkG dmdn dnekZlG dodp dpe8ZmG dqdr dre8ZnG dsdt dte8Zodudv Zpdwdx ZqG dydz dzePZre8 Zsd{d| ZtG d}d~ d~e8ZudS )    )	unhexlify)bisect_left)defaultdict)Mapping)total_ordering)md5N)RLock)murmur3)SignatureDescriptorConsistencyLevelInvalidRequestUnauthorized)Encoder)varint_unpack)QueryMessage)dict_factorybind_params)OrderedDictVersion)HostDistance)EndPoint)add	aggregateallallowalterandapplyasascascii	authorizebatchbeginbigintblobbooleanbycalled
clusteringcolumnfamilycompactcontainscountcountercreatecustomdatedecimaldefaultdeletedescdescribedeterministicdistinctdoubledropentriesexecuteexists	filtering	finalfuncfloatfromfrozenfullfunction	functionsgrantifinindexinetinfinityinitcondinputinsertintintoisjsonkeykeyskeyspace	keyspaceslanguagelimitlistloginmapmaterializedmbeanmbeansmodify	monotonicnannologinnorecursivenosuperusernotnullofonoptionsororderpassword
permissionpermissionsprimaryrenamereplacereturnsrevokerolerolesschemaselectsetsfuncsmallintstaticstoragestype	superusertabletexttime	timestamptimeuuidtinyinttotokentriggertruncatettltupletypeunloggedunsetupdateuseuserusersusinguuidvaluesvarcharvarintviewwherewith	writetimenodenodesplanactiveapplicationapplicationsjavaexecutor	executorsstd_outstd_errrenew
delegationnoredactr   lowercasestringclusterauthenticationschemesschemeinternalldapkerberosremoteobjectmethodcallcallssearchrv   configrowscolumnsprofilescommitreloadrebuildfieldworkpoolany
submissionindicesrestrict
unrestrict)Fr   r   r   r    r$   r%   r&   r(   r)   r+   r,   r-   r.   r0   r1   r2   r7   r8   r9   r=   r>   r?   r@   rB   rD   rE   rJ   rL   rM   rO   rR   rS   rT   rV   rW   rY   rZ   r[   r`   rb   rd   ri   rl   rm   rn   rr   rt   ru   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                   @   s   e Zd ZdZdZ	 dZ	 dZ	 dZ	 dZ	 dd Z	dd Z
d6dd	Zd
d Zd7ddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd7d0d1Zd7d2d3Z d4d5 Z!dS )8MetadatazD
    Holds a representation of the cluster schema and topology.
    NFc                 C   s   i | _ d| _i | _t | _d S NF)rV   dbaas_hostsr   _hosts_lockself r   K/var/www/Datamplify/venv/lib/python3.10/site-packages/cassandra/metadata.py__init__x   s   zMetadata.__init__c                 C   s   d dd | j D S )z
        Returns a string that can be executed as a query in order to recreate
        the entire schema.  The string is formatted to be human readable.
        

c                 s   s    | ]}|  V  qd S Nexport_as_string).0ksr   r   r   	<genexpr>   s    z3Metadata.export_schema_as_string.<locals>.<genexpr>)joinrV   r   r   r   r   r   export_schema_as_string~   s   z Metadata.export_schema_as_stringc                 K   s   |  |jj}|  |jj}t||||}|s| | d S | }	zMt|d|	 }
|
| jfi |}|r_t| d|	 }|	dkrX|j	dk rX|j
| jfi |}| || W d S || W d S t| d|	 }|di | W d S  ty|   td| w )Nget__update_rU      _drop_z Unknown schema target_type: '%s'r   )get_hostendpointrelease_versiondse_versionget_schema_parser_rebuild_alllowergetattrrV   protocol_versionget_types_map_update_keyspaceAttributeError
ValueError)r   
connectiontimeouttarget_typechange_typekwargsserver_versionr   parsertt_lowerparse_methodmetaupdate_method
user_typesdrop_methodr   r   r   refresh   s*   
zMetadata.refreshc                    s   t   | D ]%} |j | j|jd }|| j|j< |r&| |j q| |j q fdd| j D }t	 fdd| j
 D | _|D ]}| | qJd S )Nc                       g | ]}| vr|qS r   r   )r   namecurrent_keyspacesr   r   
<listcomp>   s    z)Metadata._rebuild_all.<locals>.<listcomp>c                 3   s$    | ]\}}| v r||fV  qd S r   r   )r   r   r   r   r   r   r      s   
 z(Metadata._rebuild_all.<locals>.<genexpr>)rx   get_all_keyspacesr   r   rV   get_keyspace_updated_keyspace_addedrT   dictitems_keyspace_removed)r   r   keyspace_metaold_keyspace_metaremoved_keyspacesksnamer   r   r   r      s   zMetadata._rebuild_allc                 C   s   |j }| j|d }|| j|< |r>|j|_|d ur|n|j|_|j|_|j|_|j|_|j|_|j	|j	kr<| 
| d S d S | | d S r   )r   rV   r   tablesr   indexesrE   
aggregatesviewsreplication_strategyr   r   )r   r  new_user_typesks_namer  r   r   r   r      s   
zMetadata._update_keyspacec                 C   s    | j |d r| | d S d S r   )rV   popr  r   rU   r   r   r   _drop_keyspace   s   zMetadata._drop_keyspacec                 C   sL   z| j |j }t|tr|| W d S || W d S  ty%   Y d S w r   )rV   keyspace_name
isinstanceTableMetadata_add_table_metadata_add_view_metadataKeyError)r   r   r  r   r   r   _update_table   s   
zMetadata._update_tablec                 C   s0   z| j | }|| W d S  ty   Y d S w r   )rV   _drop_table_metadatar  )r   rU   r   r  r   r   r   _drop_table   s   
zMetadata._drop_tablec                 C   0   z|| j |j j|j< W d S  ty   Y d S w r   )rV   rU   r   r   r  )r   	type_metar   r   r   _update_type   
   zMetadata._update_typec                 C   s0   z| j | j|d  W d S  ty   Y d S w r   )rV   r   r  r  )r   rU   r   r   r   r   
_drop_type   r  zMetadata._drop_typec                 C   r  r   )rV   rU   rE   	signaturer  )r   function_metar   r   r   _update_function   r  zMetadata._update_functionc                 C   2   z| j | j|jd  W d S  ty   Y d S w r   )rV   rE   r  r   r  )r   rU   rD   r   r   r   _drop_function   
   zMetadata._drop_functionc                 C   r  r   )rV   rU   r
  r   r  )r   aggregate_metar   r   r   _update_aggregate   s
   zMetadata._update_aggregatec                 C   r#  r   )rV   r
  r  r   r  )r   rU   r   r   r   r   _drop_aggregate   r%  zMetadata._drop_aggregatec                 C      | j r| j j|dd d S d S NFbuild_if_absent	token_maprebuild_keyspacer   r  r   r   r   r        zMetadata._keyspace_addedc                 C   r)  r*  r-  r0  r   r   r   r   
  r1  zMetadata._keyspace_updatedc                 C   s   | j r| j | d S d S r   )r.  remove_keyspacer0  r   r   r   r    s   zMetadata._keyspace_removedc                 C   s   || _ |drt}n|drt}n|drt}nd| _dS i }g }| D ]\}}|D ]}||}	||	 |||	< q.q(t	|}
t
|||
| | _dS )z
        Rebuild our view of the topology from fresh rows from the
        system topology tables.
        For internal use only.
        RandomPartitionerMurmur3PartitionerByteOrderedPartitionerN)partitionerendswithMD5TokenMurmur3Token
BytesTokenr.  r  from_stringappendsortedTokenMap)r   r6  r.  token_classtoken_to_host_ownerringhosttoken_stringstoken_stringr   
all_tokensr   r   r   rebuild_token_map  s*   






zMetadata.rebuild_token_mapc                 C   s<   | j }|sg S z|||j|W S  ty   g  Y S w )zq
        Returns a list of :class:`.Host` instances that are replicas for a given
        partition key.
        )r.  get_replicasr?  from_key	NoMurmur3)r   rU   rS   tr   r   r   rG  /  s   zMetadata.get_replicasc                 C   s   | j drtd u rdS dS )Nr4  FT)r6  r7  r	   r   r   r   r   can_support_partitioner<  s   z Metadata.can_support_partitionerc              	   C   sr   | j , z| j|j dfW W  d   S  ty.   || j|j< |df Y W  d   S w 1 s2w   Y  dS )z
        Returns a tuple (host, new), where ``host`` is a Host
        instance, and ``new`` is a bool indicating whether
        the host was newly added.
        FNT)r   r   r   r  r   rB  r   r   r   add_or_return_hostB  s   
zMetadata.add_or_return_hostc                 C   s>   | j  t| j|jdW  d    S 1 sw   Y  d S r   )r   boolr   r  r   rL  r   r   r   remove_hostO  s   $zMetadata.remove_hostc                 C   s"   t |ts| ||S | j|S )a  
        Find a host in the metadata for a specific endpoint. If a string inet address and port are passed,
        iterate all hosts to match the :attr:`~.pool.Host.broadcast_rpc_address` and
        :attr:`~.pool.Host.broadcast_rpc_port`attributes.
        )r  r   _get_host_by_addressr   r   )r   endpoint_or_addressportr   r   r   r   S  s   
zMetadata.get_hostc                 C   sB   | j  D ]}|j|kr|d u s|jd u s|j|kr|  S qd S r   )r   r   broadcast_rpc_addressbroadcast_rpc_port)r   addressrR  rB  r   r   r   rP  ^  s   
zMetadata._get_host_by_addressc                 C   s8   | j  t| j W  d   S 1 sw   Y  dS )zV
        Returns a list of all known :class:`.Host` instances in the cluster.
        N)r   rY   r   r   r   r   r   r   	all_hostsf  s   $zMetadata.all_hostsNNr   )"__name__
__module____qualname____doc__cluster_namerV   r6  r.  r   r   r   r   r   r   r  r  r  r  r  r"  r$  r'  r(  r   r   r  rF  rG  rK  rM  rO  r   rP  rV  r   r   r   r   r   `   sJ    



r   zorg.apache.cassandra.locator.c                 C   s   |  |r| t|d  S | S r   )
startswithlen)sprefixr   r   r   trim_if_startswithq  s   
ra  c                   @   s   e Zd Zdd ZdS )ReplicationStrategyTypeTypec                 C   s2   | d| t| |||}|ds|t|< |S )Nr   _)
setdefaultr   __new__r]  _replication_strategies)metaclsr   basesdctclsr   r   r   re  {  s
   
z#ReplicationStrategyTypeType.__new__N)rX  rY  rZ  re  r   r   r   r   rb  z  s    rb  c                   @   s,   e Zd ZdZedd Zdd Zdd ZdS )_ReplicationStrategyNc              
   C   s|   |sd S t |t}t|d }|d u rt|}|t|< z||}W |S  ty= } ztd||| W Y d }~d S d }~ww )Nz&Failed creating %s with options %s: %s)ra  !REPLICATION_STRATEGY_CLASS_PREFIXrf  r   _UnknownStrategyBuilder	Exceptionlogwarning)rj  strategy_classoptions_mapstrategy_namers_classrs_instanceexcr   r   r   r/     s   

z_ReplicationStrategy.createc                 C      t  r   NotImplementedErrorr   r@  rA  r   r   r   make_token_replica_map     z+_ReplicationStrategy.make_token_replica_mapc                 C   rw  r   rx  r   r   r   r   export_for_schema  r|  z&_ReplicationStrategy.export_for_schema)rX  rY  rZ  rr  classmethodr/   r{  r}  r   r   r   r   rk    s    
rk  )	metaclassc                   @   s   e Zd Zdd Zdd ZdS )rm  c                 C   
   || _ d S r   r   )r   r   r   r   r   r        
z _UnknownStrategyBuilder.__init__c                 C   s   t | j|}|S r   )_UnknownStrategyr   )r   rr  strategy_instancer   r   r   __call__  s   z _UnknownStrategyBuilder.__call__N)rX  rY  rZ  r   r  r   r   r   r   rm    s    rm  c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r  c                 C   s.   || _ |d ur| nt | _| j | jd< d S )Nclass)r   copyr  rr  )r   r   rr  r   r   r   r     s   z_UnknownStrategy.__init__c                 C   s"   t |to| j|jko| j|jkS r   )r  r  r   rr  r   otherr   r   r   __eq__  s
   


z_UnknownStrategy.__eq__c                 C   s*   | j rtdd | j  D S d| jf S )
        Returns a string version of these replication options which are
        suitable for use in a CREATE KEYSPACE statement.
        c                 s   s$    | ]\}}t |t |fV  qd S r   )str)r   rS   valuer   r   r   r     s   " z5_UnknownStrategy.export_for_schema.<locals>.<genexpr>z{'class': '%s'})rr  r  r  r   r   r   r   r   r}    s   z"_UnknownStrategy.export_for_schemac                 C      i S r   r   rz  r   r   r   r{       z'_UnknownStrategy.make_token_replica_mapN)rX  rY  rZ  r   r  r}  r{  r   r   r   r   r    s
    	r  c                   @   sH   e Zd ZdZdZ	 dZ	 dZ	 dddZedd Z	dd Z
d	d
 ZdS )ReplicationFactorz9
    Represent the replication factor of a keyspace.
    Nc                 C   s(   || _ || _|r|| | _d S || _d S r   )all_replicastransient_replicasfull_replicas)r   r  r  r   r   r   r     s   zReplicationFactor.__init__c                 C   st   d}zt | }W n, ty4   z| d} t | d t | d }}W n ty1   td| w Y nw t||S )zp
        Given the inputted replication factor string, parse and return the ReplicationFactor instance.
        N/r      z/Unable to determine replication factor from: {})rO   r   splitrn  formatr  )rfr  r  r   r   r   r/     s   

zReplicationFactor.createc                 C   s    | j rd| j| j f S d| j S )Nz%d/%dz%d)r  r  r   r   r   r   __str__  s   zReplicationFactor.__str__c                 C   s&   t |tsdS | j|jko| j|jkS r   )r  r  r  r  r  r   r   r   r    s   
zReplicationFactor.__eq__r   )rX  rY  rZ  r[  r  r  r  r   staticmethodr/   r  r  r   r   r   r   r    s    

r  c                   @   s>   e Zd ZdZ	 edd Zdd Zdd Zdd	 Zd
d Z	dS )SimpleStrategyNc                 C   s   | j jS )a  
        The replication factor for this keyspace.

        For backward compatibility, this returns the
        :attr:`cassandra.metadata.ReplicationFactor.full_replicas` value of
        :attr:`cassandra.metadata.SimpleStrategy.replication_factor_info`.
        )replication_factor_infor  r   r   r   r   replication_factor  s   	z!SimpleStrategy.replication_factorc                 C   s   t |d | _d S )Nr  )r  r/   r  r   rr  r   r   r   r     s   zSimpleStrategy.__init__c           	      C   s   i }t t|D ]C}dt }}t|| jk rE|t|k rE||| t|  }|| }||vr4|| |d7 }t|| jk rE|t|k s|||| < q|S )Nr   r  )ranger^  rY   r  r<  )	r   r@  rA  replica_mapijhostsr   rB  r   r   r   r{    s   
z%SimpleStrategy.make_token_replica_mapc                 C   s   dt | jf S )r  z7{'class': 'SimpleStrategy', 'replication_factor': '%s'})r  r  r   r   r   r   r}  !  s   
z SimpleStrategy.export_for_schemac                 C   s"   t |tsdS t| jt|jkS r   )r  r  r  r  r  r   r   r   r  )  s   
zSimpleStrategy.__eq__)
rX  rY  rZ  r  propertyr  r   r{  r}  r  r   r   r   r   r    s    

r  c                   @   s8   e Zd ZdZ	 dZ	 dd Zdd Zdd Zdd	 ZdS )
NetworkTopologyStrategyNc                 C   s6   t dd | D | _t dd | j D | _d S )Nc                 s   s&    | ]\}}t |t|fV  qd S r   )r  r  r/   r   kvr   r   r   r   @  s    
z3NetworkTopologyStrategy.__init__.<locals>.<genexpr>c                 s   s    | ]
\}}||j fV  qd S r   )r  )r   dcr  r   r   r   r   B  s    
)r  r  dc_replication_factors_infodc_replication_factors)r   r  r   r   r   r   ?  s   
z NetworkTopologyStrategy.__init__c                 C   s>  t dd | j D }tt}tt}tt}t|D ]'\}}|| }	||	j | |	jrC|	j	rC||	j 
|	j	 ||	j 
|	 qtt}
tt}tt|D ]}|||  }| D ]}||vreq^|| }|
| }t|}||k r|| |k r|d7 }||k r|| |k s{||
|< || }d}g }t }|| }t|| }t||| D ]q}|t|kr|t| }|| }|||  }	|dks||kr nP|	|v rq|	j	|v rt|t|k r||	 q||	 |d7 }|d8 }|
|	j	 t|t|kr|D ]}	|dkr
 n||	 |d8 }q|d d = qq^qR|S )Nc                 s   s$    | ]\}}|d kr||fV  qdS )r   Nr   )r   r  r  r   r   r   r   F  s    zANetworkTopologyStrategy.make_token_replica_map.<locals>.<genexpr>r  r   )r  r  r  r   rY   rx   	enumerate
datacenterr<  rackr   rO   r  r^  rT   )r   r@  rA  	dc_rf_mapdc_to_token_offsetdc_rackshosts_per_dcr  r   rB  dc_to_current_indexr  replicasr  token_offsetsrI   
num_tokensreplicas_remainingreplicas_this_dcskipped_hostsracks_placedracks_this_dchosts_this_dctoken_offset_indextoken_offsetr   r   r   r{  E  sv   




1z.NetworkTopologyStrategy.make_token_replica_mapc                 C   s8   d}t | j D ]\}}|d|t|f 7 }q	|d S )r  z#{'class': 'NetworkTopologyStrategy'z, '%s': '%s'})r=  r  r  r  )r   retr  r  r   r   r   r}    s   z)NetworkTopologyStrategy.export_for_schemac                 C   s   t |tsdS | j|jkS r   )r  r  r  r  r   r   r   r    s   
zNetworkTopologyStrategy.__eq__)	rX  rY  rZ  r  r  r   r{  r}  r  r   r   r   r   r  0  s    M
r  c                   @   r  )
LocalStrategyc                 C   s   d S r   r   r  r   r   r   r     r  zLocalStrategy.__init__c                 C   r  r   r   rz  r   r   r   r{    r  z$LocalStrategy.make_token_replica_mapc                 C      dS )r  z{'class': 'LocalStrategy'}r   r   r   r   r   r}    s   zLocalStrategy.export_for_schemac                 C   s
   t |tS r   )r  r  r  r   r   r   r    r  zLocalStrategy.__eq__N)rX  rY  rZ  r   r{  r}  r  r   r   r   r   r    s
    r  c                   @   s   e Zd ZdZdZ	 dZ	 dZ	 dZ	 dZ	 dZ		 dZ
	 dZ	 dZ	 dZ	 dZ	 dZ	 dddZedd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd ZdS )KeyspaceMetadataz?
    A representation of the schema for a single keyspace.
    NTFc                 C   sH   || _ || _t||| _i | _i | _i | _i | _i | _	i | _
|| _d S r   )r   durable_writesReplicationStrategyr/   r  r  r	  r   rE   r
  r  graph_engine)r   r   r  rq  strategy_optionsr  r   r   r   r     s   
zKeyspaceMetadata.__init__c                 C   s
   | j d uS r   )r  r   r   r   r   is_graph_enabled  s   
z!KeyspaceMetadata.is_graph_enabledc                    s   dd | j  D   fdd| j  D }d|  d g|   dd | j D  dd | j D  dd  | D  }| jrbd	d
l}d| j	 }|j
| j D ]}||7 }qS|d| 7 }|S | jrmdj| j	|dS |S )z
        Returns a CQL query string that can be used to recreate the entire keyspace,
        including user-defined types and tables.
        c                 S   s    g | ]}t |d r|jr|qS )vertex)hasattrr  r   rJ  r   r   r   r     s     z5KeyspaceMetadata.export_as_string.<locals>.<listcomp>c                    r   r   r   r  tables_with_vertexr   r   r     s    r   ;c                 S      g | ]}|  qS r   r   )r   fr   r   r   r         c                 S   r  r   r   )r   ar   r   r   r     r  c                 S   r  r   r   r  r   r   r   r     r  r   NzO/*
Warning: Keyspace %s is incomplete because of an error processing metadata.
`
Approximate structure, for reference:
(this should not be used to reproduce this schema)

%s
*/zt/*
Warning: Keyspace {ks} is a virtual keyspace and cannot be recreated with CQL.
Structure, for reference:*/
{cql}
)r   cql)r  r   r   as_cql_queryuser_type_stringsrE   r
  	_exc_info	tracebackr   format_exceptionvirtualr  )r   other_tablesr  r  r  liner   r  r   r     s6   
z!KeyspaceMetadata.export_as_stringc                 C   s`   | j rdt| jS dt| j| j f }|d| jrdnd  }| jdur.|d| j  }|S )z
        Returns a CQL query string that can be used to recreate just this keyspace,
        not including user-defined types and tables.
        z// VIRTUAL KEYSPACE {}z)CREATE KEYSPACE %s WITH replication = %s z AND durable_writes = %struefalseNz AND graph_engine = '%s')r  r  protect_namer   r  r}  r  r  r   r  r   r   r   r  +  s   
zKeyspaceMetadata.as_cql_queryc                 C   s>   g }| j  }t| }|D ]}||v r| ||| q|S r   )r   r  r=  rT   resolve_user_types)r   r  r   rT   r  r   r   r   r  :  s   
z"KeyspaceMetadata.user_type_stringsc                 C   sN   | |}|jD ]}t|D ]}||v r| ||| qq||  d S r   )r  field_typestypescql_types_from_stringr  r<  r   )r   rS   r   r  	user_type	type_namesub_typer   r   r   r  C  s   

z#KeyspaceMetadata.resolve_user_typesc                    sz   i }| j  jd }|r|j _|j} j D ]	\}}|| j|< q fdd|D D ]	}| j|d  q+ | j  j< d S )Nc                 3   s    | ]
}| j vr|V  qd S r   )r	  r   ntable_metadatar   r   r   Y  s    z7KeyspaceMetadata._add_table_metadata.<locals>.<genexpr>)r  r   r   r  r	  r  r  )r   r  old_indexesold_meta
index_nameindex_metadatar   r  r   r  K  s   z$KeyspaceMetadata._add_table_metadatac                 C   s   | j |d }|r%|jD ]	}| j|d  q|jD ]	}| j|d  qd S | j|d }|rGz| j |j j|d  W d S  tyF   Y d S w d S r   )r  r  r	  r  base_table_namer  )r   
table_name
table_metar  	view_name	view_metar   r   r   r  ^  s   

z%KeyspaceMetadata._drop_table_metadatac                 C   s<   z|| j |j j|j< || j|j< W d S  ty   Y d S w r   )r  r  r  r   r  )r   view_metadatar   r   r   r  o  s   z#KeyspaceMetadata._add_view_metadatar   )rX  rY  rZ  r[  r   r  r  r  r	  r   rE   r
  r  r  r  r  r   r  r  r   r  r  r  r  r  r  r   r   r   r   r    sH    

	r  c                   @   sB   e Zd ZdZdZ	 dZ	 dZ	 dZ	 dd Zd
ddZ	dd	 Z
dS )UserTypez
    A user defined type, as created by ``CREATE TYPE`` statements.

    User-defined types were introduced in Cassandra 2.1.

    .. versionadded:: 2.1.0
    Nc                 C   s$   || _ || _|p	g | _|pg | _d S r   )rU   r   field_namesr  )r   rU   r   r  r  r   r   r   r     s   
zUserType.__init__Fc                    s   dt | jt | j|rdndf }|rd}d nd}d g }t| j| jD ]\}}|dt ||f  q%|| fdd	|D 7 }||rKd
7 }|S d7 }|S )z
        Returns a CQL query that can be used to recreate this type.
        If `formatted` is set to :const:`True`, extra whitespace will
        be added to make the query more readable.
        zCREATE TYPE %s.%s (%s
 ,
    , %s %sc                 3       | ]	}d  |f V  qdS z%s%sNr   )r   r   paddingr   r   r         z(UserType.as_cql_query.<locals>.<genexpr>z
)))r  rU   r   zipr  r  r<  r   )r   	formattedr  
field_joinfields
field_name
field_typer   r  r   r    s$   
zUserType.as_cql_queryc                 C      | j ddd S NTr  r  r  r   r   r   r   r        zUserType.export_as_stringF)rX  rY  rZ  r[  rU   r   r  r  r   r  r   r   r   r   r   r  w  s    
r  c                   @   sl   e Zd ZdZdZ	 dZ	 dZ	 dZ	 dZ	 dZ		 dZ
	 dZ	 dZ	 dd ZdddZdd	 Zed
d ZdS )	Aggregatez
    A user defined aggregate function, as created by ``CREATE AGGREGATE`` statements.

    Aggregate functions were introduced in Cassandra 2.2

    .. versionadded:: 2.6.0
    Nc
           
      C   s:   || _ || _|| _|| _|| _|| _|| _|| _|	| _d S r   )	rU   r   argument_types
state_func
state_type
final_funcinitial_conditionreturn_typer7   )
r   rU   r   r  r  r  r  r  r  r7   r   r   r   r     s   
zAggregate.__init__Fc           	      C   s   |rdnd}t | j}t | j}ddd | jD }t | j}t| j}dt	  }|| j
r:d|dt | j
fnd7 }|| jd	urLd|d
| jfnd7 }|| jr[d|7 }|S d7 }|S )z
        Returns a CQL query that can be used to recreate this aggregate.
        If `formatted` is set to :const:`True`, extra whitespace will
        be added to make the query more readable.
        
     r  c                 S   s   g | ]}t |qS r   )r  strip_frozen)r   arg_typer   r   r   r         z*Aggregate.as_cql_query.<locals>.<listcomp>zkCREATE AGGREGATE %(keyspace)s.%(name)s(%(type_list)s)%(sep)sSFUNC %(state_func)s%(sep)sSTYPE %(state_type)sr  z
FINALFUNC Nz	INITCOND z{}DETERMINISTIC)r  rU   r   r   r  r  r  r  r  localsr  r  r7   r  )	r   r  seprU   r   	type_listr  r  r  r   r   r   r    s   


$$zAggregate.as_cql_queryc                 C   r  r  r  r   r   r   r   r     r  zAggregate.export_as_stringc                 C      t | j| jS r   r
   format_signaturer   r  r   r   r   r   r        zAggregate.signaturer  )rX  rY  rZ  r[  rU   r   r  r  r  r  r  r  r7   r   r  r   r  r   r   r   r   r   r    s2    
r  c                   @   sx   e Zd ZdZdZ	 dZ	 dZ	 dZ	 dZ	 dZ		 dZ
	 dZ	 dZ	 dZ	 dZ	 dd ZdddZdd	 Zed
d ZdS )Functionz
    A user defined function, as created by ``CREATE FUNCTION`` statements.

    User-defined functions were introduced in Cassandra 2.2

    .. versionadded:: 2.6.0
    Nc                 C   sJ   || _ || _|| _|pg | _|| _|| _|| _|| _|	| _|
| _	|| _
d S r   )rU   r   r  argument_namesr  rW   bodycalled_on_null_inputr7   r`   monotonic_on)r   rU   r   r  r%  r  rW   r&  r'  r7   r`   r(  r   r   r   r   `  s   

zFunction.__init__Fc                 C   s   |rdnd}t | j}t | j}ddd t| j| jD }| j}| j}| j	}| j
r-dnd}	| jr7d|nd	}
d	}| jrDd
|}n| jrPd| jd |}dt  S )
        Returns a CQL query that can be used to recreate this function.
        If `formatted` is set to :const:`True`, extra whitespace will
        be added to make the query more readable.
        r  r  r  c                 S   s&   g | ]\}}d t |t|f qS )r  )r  r  r  )r   r  rJ  r   r   r   r   z  s    z)Function.as_cql_query.<locals>.<listcomp>CALLEDzRETURNS NULLzDETERMINISTIC{}r  zMONOTONIC{}zMONOTONIC ON {}{}r   zCREATE FUNCTION %(keyspace)s.%(name)s(%(arg_list)s)%(sep)s%(on_null)s ON NULL INPUT%(sep)sRETURNS %(typ)s%(sep)s%(deterministic_token)s%(monotonic_tokens)sLANGUAGE %(lang)s%(sep)sAS $$%(body)s$$)r  rU   r   r   r  r%  r  r  rW   r&  r'  r7   r  r`   r(  r  )r   r  r  rU   r   arg_listtyplangr&  on_nulldeterministic_tokenmonotonic_tokensr   r   r   r  q  s0   


zFunction.as_cql_queryc                 C   r  r  r  r   r   r   r   r     r  zFunction.export_as_stringc                 C   r   r   r!  r   r   r   r   r     r#  zFunction.signaturer  )rX  rY  rZ  r[  rU   r   r  r%  r  rW   r&  r'  r7   r`   r(  r   r  r   r  r   r   r   r   r   r$    s:    
%r$  c                   @   s   e Zd ZdZdZ	 dZ	 dZ	 dZ	 edd Z	dZ
	 dZ	 dZdZ	 dddd	ZdZ	 dZ	 dZ	 dZ	 ed
d ZdZ	 dddZdd Zdd ZdddZedddZedd ZdS )r  z<
    A representation of the schema for a single table.
    Nc                 C   s   | j | j S )z{
        A list of :class:`.ColumnMetadata` representing the components of
        the primary key for this table.
        partition_keyclustering_keyr   r   r   r   primary_key  s   zTableMetadata.primary_keyFmin_thresholdmax_thresholdr  )min_compaction_thresholdmax_compaction_thresholdcompaction_strategy_classc                 C   sP   | j rdS t| dd}|r&| jo"t| jt| jd ko"t| jdk}| S dS )zX
        A boolean indicating if this table can be represented as CQL in export
        F
comparatorNr  T)r  r   is_compact_storager^  r   r4  r3  )r   r:  incompatibler   r   r   is_cql_compatible  s   zTableMetadata.is_cql_compatiblec	           	      C   s   || _ || _|d u rg n|| _|d u rg n|| _|d u rt n|| _i | _|d u r+i n|| _d | _|d u r8t n|| _	i | _
|| _d S r   )r  r   r2  r3  r   r   r	  ri   r:  triggersr  r  )	r   r  r   r2  r3  r   r>  ri   r  r   r   r   r     s   
zTableMetadata.__init__c                 C   s   | j r&ddl}d| j| jf }|j| j  D ]}||7 }q|d|   7 }|S | js;d| j| jf }|d|   7 }|S | jrLdj| j| j|  d}|S |  }|S )z
        Returns a string of CQL queries that can be used to recreate this table
        along with all indexes on it.  The returned string is formatted to
        be human readable.
        r   NzO/*
Warning: Table %s.%s is incomplete because of an error processing metadata.
r  zp/*
Warning: Table %s.%s omitted because it has constructs not compatible with CQL (was created via legacy API).
zt/*
Warning: Table {ks}.{tab} is a virtual table and cannot be recreated with CQL.
Structure, for reference:
{cql}
*/)r   tabr  )	r  r  r  r   r  _all_as_cqlr=  r  r  )r   r  r  r  r   r   r   r     s,   


	zTableMetadata.export_as_stringc           	      C   s   | j dd}|d7 }| j D ]
}|d|   7 }q| j D ]}|d|  f 7 }q| j D ]}|d|j ddf 7 }q0| jretj}| | j@ D ]}|| }|	| || j| }|rd|d|f 7 }qK|S )NTr  r  z
%s;z

%s;

%s)
r  r	  r   r>  r  
extensions_RegisteredExtensionType_extension_registryrT   after_table_cql)	r   r  rI   trigger_metar  registryr  extr  r   r   r   r@  .  s"   zTableMetadata._all_as_cqlc                    s  d| j rdndt| jt| j|rdndf }|rd}d nd}d g }| j D ]}|d	t|j|j|jr9d
ndf  q)t	| j
dkrQ| jsQ|d  d7  < || fdd|D 7 }t	| j
dksi| jr|d| f 7 }t	| j
dkr|dddd | j
D  7 }n
|t| j
d j7 }| jr|dddd | jD  7 }|d7 }|d|rdnd 7 }|| || j| j| j7 }|S )z
        Returns a CQL query that can be used to recreate this table (index
        creations are not included).  If `formatted` is set to :const:`True`,
        extra whitespace will be added to make the query human readable.
        z%s TABLE %s.%s (%sVIRTUALCREATEr  r  r  r  r  z%s %s%sz staticr  r   z PRIMARY KEYc                 3   r  r   r   r   colr  r   r   r   _  r  z-TableMetadata.as_cql_query.<locals>.<genexpr>z%s%sPRIMARY KEY ((%s)c                 s       | ]}t |jV  qd S r   r  r   rK  r   r   r   r   f      , %sc                 s   rN  r   rO  rK  r   r   r   r   k  rP  r  z	%s) WITH )r  r  r  r   r   r   r<  cql_type	is_staticr^  r2  r3  r   _property_stringri   r;  )r   r  r  column_joinr   rL  r   r  r   r  E  s8   
( zTableMetadata.as_cql_queryc                 C   s   g }|r	| d |r5d}g }|D ]}|jrdnd}	| dt|j|	f  q|dd| 7 }| | || | |rAdnd	}
|
|S )
NzCOMPACT STORAGEzCLUSTERING ORDER BY DESCASCr  rM  r  z	
    AND z AND )r<  is_reversedr  r   r   extend_make_option_strings)rj  r  r3  rr  r;  
propertiescluster_strinnerrL  orderingjoin_strr   r   r   rT  u  s   


zTableMetadata._property_stringc                 C   s  g }t | }t|dd}|dd }|d| dd | D }|dd|  | j	 D ]}||d  q5|d	d  |
d
set|dd}dd | D }	|dd|	  | D ]\}
}|d ur|
dkry|pxd}|d|
t|f  qitt|S )Ncompaction_strategy_optionsz{}r9  r  c                 S      g | ]
\}}d ||f qS 
'%s': '%s'r   r  r   r   r   r         z6TableMetadata._make_option_strings.<locals>.<listcomp>zcompaction = {%s}r  compaction_strategy_optioncompressioncompression_parametersc                 S   ra  rb  r   r  r   r   r   r     rd  zcompression = {%s}commentr  %s = %s)r  r  rR   loadsr  rd  r<  r   compaction_optionsrT   r   protect_valuerY   r=  )rj  rr  r  options_copyactual_optionsr  compaction_option_stringssystem_table_nameparamsparam_stringsr   r   r   r   rZ    s*   
z"TableMetadata._make_option_strings)NNNNNFr  )rX  rY  rZ  r[  r  r   r2  r3  r  r4  r   r	  r;  ri   rk  r>  r  r  r  r=  rB  r   r   r@  r  r~  rT  rZ  r   r   r   r   r    sV    	



0r  c                   @   s4   e Zd ZdZi Zg dZedd Zedd Z	dS )TableMetadataV3z
    For C* 3.0+. `option_maps` take a superset of map names, so if  nothing
    changes structurally, new option maps can just be appended to the list.
    )
compactionrf  cachingnodesyncc                 C   r  )NTr   r   r   r   r   r=       z!TableMetadataV3.is_cql_compatiblec                 C   s   g }t | }| jD ]$}||}t|tr/||= dd | D }|d|d|f  q| D ]\}}|d urO|dkrD|pCd}|d|t|f  q4t	t
|S )Nc                 s   s     | ]\}}d ||f V  qdS )rc  Nr   r  r   r   r   r     s    z7TableMetadataV3._make_option_strings.<locals>.<genexpr>z	%s = {%s}r  rh  r  ri  )r  r  option_mapsr   r  r   r<  r   rl  rY   r=  )rj  rr  r  rm  optionr  rq  r   r   r   r   rZ    s    


z$TableMetadataV3._make_option_stringsN)
rX  rY  rZ  r[  rk  rx  r  r=  r~  rZ  r   r   r   r   rs    s    
rs  c                       s6   e Zd ZdZ	 dZ	 d fdd	Zedd Z  ZS )TableMetadataDSE68NFc                    s   t t| |}| jr|dt| jj 7 }| jrB|dt| jj 7 }|| | jj| jj	| jj
d7 }|| | jj| jj| jjd7 }|S )Nz AND VERTEX LABEL %sz AND EDGE LABEL %sFROMTO)superrz  r  r  r  
label_nameedge_export_edge_as_cql
from_labelfrom_partition_key_columnsfrom_clustering_columnsto_labelto_partition_key_columnsto_clustering_columns)r   r  r  	__class__r   r   r    s    zTableMetadataDSE68.as_cql_queryc                 C   sv   d|t | f }t|dkr|t |d 7 }n|dddd |D  7 }|r5|ddd	d |D  7 }|d
7 }|S )Nz %s %s(r  r   rM  r  c                 S      g | ]}t |qS r   r  r   r  r   r   r   r     r  z:TableMetadataDSE68._export_edge_as_cql.<locals>.<listcomp>rQ  c                 S   r  r   r  r  r   r   r   r     r  r  )r  r^  r   )r~  partition_keysclustering_columnskeywordr  r   r   r   r    s   z&TableMetadataDSE68._export_edge_as_cqlr  )	rX  rY  rZ  r  r  r  r  r  __classcell__r   r   r  r   rz    s    rz  c                   @      e Zd ZdZedd ZdS )TableExtensionInterfacez9
    Defines CQL/DDL for Cassandra table extensions.
    c                 C   r  )z
        Called to produce CQL/DDL to follow the table definition.
        Should contain requisite terminating semicolon(s).
        Nr   )rj  ext_keyext_blobr   r   r   rE    s   z'TableExtensionInterface.after_table_cqlN)rX  rY  rZ  r[  r~  rE  r   r   r   r   r        r  c                       s    e Zd Zi Z fddZ  ZS )rC  c                    s.   t t| | |||}|dkr|| j|j< |S )NRegisteredTableExtension)r}  rC  re  rD  r   )mcsr   rh  ri  rj  r  r   r   re    s   z _RegisteredExtensionType.__new__)rX  rY  rZ  rD  re  r  r   r   r  r   rC  
  s    rC  c                   @   s   e Zd ZdZdZdS )r  zu
    Extending this class registers it by name (associated by key in the `system_schema.tables.extensions` map).
    N)rX  rY  rZ  r[  r   r   r   r   r   r    s    r  c                 C   s   t | S r   )maybe_escape_namer  r   r   r   r    s   r  c                 C   s   dd | D S )Nc                 S   r  r   r  r  r   r   r   r   $  r  z!protect_names.<locals>.<listcomp>r   )namesr   r   r   protect_names#  s   r  c                 C   s8   | d u rdS t | tttfrt|  S d| dd S )NNULLz'%s''z'')r  rO   r@   rN  r  r   rq   r  r   r   r   rl  '  s
   rl  z^[a-z][0-9a-z_]*$c                 C   s*   | d u rdS |   tv rdS t| d uS r   )r   cql_keywords_reservedvalid_cql3_word_rematchr  r   r   r   is_valid_name2  s
   r  c                 C   s   t | r| S t| S r   )r  escape_namer  r   r   r   r  :  s   r  c                 C   s   d|  ddf S )Nz"%s""z"")rq   r  r   r   r   r  @     r  c                   @   sD   e Zd ZdZdZ	 dZ	 dZ	 dZ	 dZ	 dZ	dddZ
dd ZdS )	ColumnMetadataz9
    A representation of a single column in a table.
    NFc                 C   "   || _ || _|| _|| _|| _d S r   )r   r   rR  rS  rX  )r   r  column_namerR  rS  rX  r   r   r   r   a  
   
zColumnMetadata.__init__c                 C   s   d| j | jf S )Nr  )r   rR  r   r   r   r   r  h  r  zColumnMetadata.__str__)FF)rX  rY  rZ  r[  r   r   rR  rS  rX  
_cass_typer   r  r   r   r   r   r  D  s    
r  c                   @   sF   e Zd ZdZdZ	 dZ	 dZ	 dZ	 i Z	 dd Z	dd Z
dd ZdS )	IndexMetadataz<
    A representation of a secondary index on a column.
    Nc                 C   r  r   )r  r  r   kindindex_options)r   r  r  r  r  r  r   r   r   r     r  zIndexMetadata.__init__c                 C   s   t | j}|d}| jdkr dt| jt| jt| j|f S |d}dt| jt| jt| j||f }|rFtj	|dd}|d| 7 }|S )	zN
        Returns a CQL query that can be used to recreate this index.
        targetCUSTOMzCREATE INDEX %s ON %s.%s (%s)
class_namez/CREATE CUSTOM INDEX %s ON %s.%s (%s) USING '%s'T)as_text_typez WITH OPTIONS = %s)
r  r  r  r  r  r   r  r  _encodercql_encode_all_types)r   ri   index_targetr  r  opts_cql_encodedr   r   r   r    s*   



zIndexMetadata.as_cql_queryc                 C      |   d S )zU
        Returns a CQL query string that can be used to recreate this index.
        r  r  r   r   r   r   r        zIndexMetadata.export_as_string)rX  rY  rZ  r[  r  r  r   r  r  r   r  r   r   r   r   r   r  l  s    r  c                   @   sV   e Zd ZdZdZ	 dZ	 dZ	 dZ	 dZdd Z	dddZ
dd	 Zd
d Zdd ZdS )r>  z3
    Information about the layout of the ring.
    Nc                 C   s*   || _ || _|| _i | _|| _t | _d S r   )r?  rA  r@  tokens_to_hosts_by_ks	_metadatar   _rebuild_lock)r   r?  r@  rE  metadatar   r   r   r     s   zTokenMap.__init__Fc              	   C   s   | j T z,| j|d }|r|d u s|s/|d ur/| jj|}|r/| | jj| }|| j|< W n tyF   i | j|< td|| j	 Y n	w W d    d S W d    d S 1 sZw   Y  d S )Nz}Failed creating a token map for keyspace '%s' with %s. PLEASE REPORT THIS: https://datastax-oss.atlassian.net/projects/PYTHON)
r  r  r   r  rV   replica_map_for_keyspacern  ro  	exceptionr@  )r   rU   r,  currentks_metar  r   r   r   r/    s"   

"zTokenMap.rebuild_keyspacec                 C   s   |j }|r|| j| jS d S r   )r  r{  r@  rA  )r   ks_metadatastrategyr   r   r   r    s   z!TokenMap.replica_map_for_keyspacec                 C   s   | j |d  d S r   )r  r  r  r   r   r   r2    r  zTokenMap.remove_keyspacec                 C   sp   | j |d}|du r| j|dd | j |d}|r6t| j|}|t| jkr/|| jd  S || j|  S g S )z
        Get  a set of :class:`.Host` instances representing all of the
        replica nodes for a given :class:`.Token`.
        NTr+  r   )r  r   r/  r   rA  r^  )r   rU   r   tokens_to_hostspointr   r   r   rG    s   zTokenMap.get_replicasr  )rX  rY  rZ  r[  r?  r@  r  rA  r  r   r/  r  r2  rG  r   r   r   r   r>    s     
	r>  c                   @   s`   e Zd ZdZdd Zedd Zedd Zedd	 Zd
d Z	dd Z
dd Zdd ZeZdS )Tokenz.
    Abstract class representing a token.
    c                 C   r  r   r  r   r   r   r   r   r      r  zToken.__init__c                 C   s   |S r   r   rj  rS   r   r   r   hash_fn  rw  zToken.hash_fnc                 C   s   | |  |S r   )r  r  r   r   r   rH       zToken.from_keyc                 C   rw  r   rx  rj  rD  r   r   r   r;    s   zToken.from_stringc                 C   s   | j |j kS r   r  r  r   r   r   r       zToken.__eq__c                 C   s   | j |j k S r   r  r  r   r   r   __lt__  r  zToken.__lt__c                 C   s
   t | jS r   )hashr  r   r   r   r   __hash__  r  zToken.__hash__c                 C   s   d| j j| jf S )Nz<%s: %s>)r  rX  r  r   r   r   r   __repr__  r  zToken.__repr__N)rX  rY  rZ  r[  r   r~  r  rH  r;  r  r  r  r  r  r   r   r   r   r    s    


r  l         l    c                   @   s   e Zd ZdS )rI  N)rX  rY  rZ  r   r   r   r   rI  !  s    rI  c                   @   s   e Zd Zedd ZdS )	HashTokenc                 C   s   | t |S )E `token_string` should be the string representation from the server. )rO   r  r   r   r   r;  '  r  zHashToken.from_stringN)rX  rY  rZ  r~  r;  r   r   r   r   r  %  s    r  c                   @   s$   e Zd ZdZedd Zdd ZdS )r9  z-
    A token for ``Murmur3Partitioner``.
    c                 C   s*   t d urtt |}|tkr|S tS t r   )r	   rO   MIN_LONGMAX_LONGrI  )rj  rS   hr   r   r   r  3  s   zMurmur3Token.hash_fnc                 C   s   t || _dS )z5 `token` is an int or string representing the token. N)rO   r  r  r   r   r   r   ;  r  zMurmur3Token.__init__N)rX  rY  rZ  r[  r~  r  r   r   r   r   r   r9  .  s
    
r9  c                   @   r  )r8  z,
    A token for ``RandomPartitioner``.
    c                 C   s(   t |tr
|d}ttt| S )NzUTF-8)r  r  encodeabsr   r   digestr  r   r   r   r  E  s   

zMD5Token.hash_fnN)rX  rY  rZ  r[  r~  r  r   r   r   r   r8  @  r  r8  c                   @   r  )r:  z1
    A token for ``ByteOrderedPartitioner``.
    c                 C   s    t |tr
|d}| t|S )r  r    )r  r  r  r   r  r   r   r   r;  Q  s   

zBytesToken.from_stringN)rX  rY  rZ  r[  r~  r;  r   r   r   r   r:  L  r  r:  c                   @   s<   e Zd ZdZdZ	 dZ	 dZ	 d	ddZdd Zdd Z	dS )
TriggerMetadataz4
    A representation of a trigger for a table.
    Nc                 C      || _ || _|| _d S r   )r   r   ri   )r   r  trigger_nameri   r   r   r   r   k     
zTriggerMetadata.__init__c                 C   s4   dt | jt | jjt | jjt| jd f }|S )Nz#CREATE TRIGGER %s ON %s.%s USING %sr  )r  r   r   r  rl  ri   r  r   r   r   r  p  s   

zTriggerMetadata.as_cql_queryc                 C   r  )Nr  r  r   r   r   r   r   y  r  z TriggerMetadata.export_as_stringr   )
rX  rY  rZ  r[  r   r   ri   r   r  r   r   r   r   r   r  [  s    
	r  c                   @   s2   e Zd Zdd Ze fddZdd Zdd Zd	S )
_SchemaParserc                 C   s   || _ || _d S r   )r   r   r   r   r   r   r   r   r     s   
z_SchemaParser.__init__c                 C   s0   |s	t ||r	g S |r|rt|j|jS g S |)a  
        Given a bool and a ResultSet (the form returned per result from
        Connection.wait_for_responses), return a dictionary containing the
        results. Used to process results from asynchronous queries to system
        tables.

        ``expected_failures`` will usually be used to allow callers to ignore
        ``InvalidRequest`` errors caused by a missing system keyspace. For
        example, some DSE versions report a 4.X server version, but do not have
        virtual tables. Thus, running against 4.X servers, SchemaParserV4 uses
        expected_failures to make a best-effort attempt to read those
        keyspaces, but treat them as empty if they're not found.

        :param success: A boolean representing whether or not the query
        succeeded
        :param result: The resultset in question.
        :expected_failures: An Exception class or an iterable thereof. If the
        query failed, but raised an instance of an expected failure class, this
        will ignore the failure and return an empty list.
        )r  r   column_namesparsed_rows)r   successresultexpected_failuresr   r   r   _handle_results  s
   z_SchemaParser._handle_resultsc                 C   s   |  ||}|r|d S d S )Nr   )_query_build_rows)r   query_string
build_funcr  r   r   r   _query_build_row  s   z_SchemaParser._query_build_rowc                    sn   t |tjd}| jj|| jdd}|d \}}|r)t|j|j} fdd|D S t	|t
r5td g S |)Nqueryconsistency_levelFr   fail_on_errorr   c                    s   g | ]} |qS r   r   )r   rowr  r   r   r     r  z3_SchemaParser._query_build_rows.<locals>.<listcomp>user types table not found)r   r   ONEr   wait_for_responsesr   r   r  r  r  r   ro  debug)r   r  r  r  	responsesr  responser  r   r  r   r    s   

z_SchemaParser._query_build_rowsN)rX  rY  rZ  r   r   r  r  r  r   r   r   r   r  }  s
    r  c                       s  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZ fddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zedd Zedd Zed d! Zed"d# Zed$d% Zd7d'd(Zd)d* Zed+d, Zed-d. Z ed/d0 Z!d1d2 Z"d3d4 Z#ed5d6 Z$  Z%S )8SchemaParserV22z
    For C* 2.2+
    z%SELECT * FROM system.schema_keyspacesz*SELECT * FROM system.schema_columnfamiliesz#SELECT * FROM system.schema_columnsz$SELECT * FROM system.schema_triggersz%SELECT * FROM system.schema_usertypesz%SELECT * FROM system.schema_functionsz&SELECT * FROM system.schema_aggregatescolumnfamily_namer   )rh  read_repair_chancedclocal_read_repair_chancelocal_read_repair_chancereplicate_on_writegc_grace_secondsbloom_filter_fp_chanceru  r9  r`  r7  r8  rg  min_index_intervalmax_index_intervalindex_intervalspeculative_retryrows_per_partition_to_cachememtable_flush_period_in_mspopulate_io_cache_on_flushrf  default_time_to_livec                    s   t t| || g | _g | _g | _g | _g | _g | _g | _	t
t| _t
dd | _t
t| _t
t| _t
t| _t
dd | _d S )Nc                   S      t tS r   r   rY   r   r   r   r   <lambda>      z*SchemaParserV22.__init__.<locals>.<lambda>c                   S   r  r   r  r   r   r   r   r    r  )r}  r  r   keyspaces_resulttables_resultcolumns_resulttriggers_resulttypes_resultfunctions_resultaggregates_resultr   rY   keyspace_table_rowskeyspace_table_col_rowskeyspace_type_rowskeyspace_func_rowskeyspace_agg_rowskeyspace_table_trigger_rowsr  r  r   r   r     s   



zSchemaParserV22.__init__c              	   c   s   |    | jD ]y}| |}zY| j|jg D ]}| |}|| q| j|jg D ]}| 	|}||j
|j< q-| j|jg D ]}| |}||j|j< qC| j|jg D ]}	| |	}
|
|j|
j< qYW n ty}   td|j t |_Y nw |V  qd S )NzPError while parsing metadata for keyspace %s. Metadata model will be incomplete.)
_query_allr  _build_keyspace_metadatar  r   r   _build_table_metadatar  r  _build_user_typer   r  _build_functionrE   r   r  _build_aggregater
  rn  ro  r  sysexc_infor  )r   r  r  	table_rowr  usertype_rowusertypefn_rowfnagg_rowaggr   r   r   r     s0   





z!SchemaParserV22.get_all_keyspacesc                 C   s   t j}td| jf ||ft}t| j| |d}t| j| |d}t| j| |d}| j	j
|||| jdd\\}	}
\}}\}}| |	|
}| ||}| j||td}|r^| |d ||S d S )N' WHERE keyspace_name = %%s AND %s = %%sr  Fr  r  r   )r   r  r   _table_name_colr  r   _SELECT_COLUMN_FAMILIES_SELECT_COLUMNS_SELECT_TRIGGERSr   r  r   r  r   r  )r   rV   rU   r   clwhere_clausecf_query	col_querytriggers_query
cf_success	cf_resultcol_success
col_resulttriggers_successr	  table_resultr   r   r   	get_table  s   zSchemaParserV22.get_tablec                 C   s$   t d||ft}| | j| | jS )Nz, WHERE keyspace_name = %s AND type_name = %s)r   r  r  _SELECT_TYPESr  )r   rV   rU   r   r)  r   r   r   get_type  s   zSchemaParserV22.get_typec                 C   s4   t d|ft}| | j| | j}tdd |D S )N WHERE keyspace_name = %sc                 s   s    | ]}|j |fV  qd S r   r  r  r   r   r   r     rP  z0SchemaParserV22.get_types_map.<locals>.<genexpr>)r   r  r  r4  r  r  )r   rV   rU   r)  r  r   r   r   r     s   zSchemaParserV22.get_types_mapc                 C   2   t d| jf ||j|jft}| | j| | jS )Nz? WHERE keyspace_name = %%s AND function_name = %%s AND %s = %%s)r   _function_agg_arument_type_colr   r  r  r  _SELECT_FUNCTIONSr  )r   rV   rU   rD   r)  r   r   r   get_function!  s   zSchemaParserV22.get_functionc                 C   r7  )Nz@ WHERE keyspace_name = %%s AND aggregate_name = %%s AND %s = %%s)r   r8  r   r  r  r  _SELECT_AGGREGATESr  )r   rV   rU   r   r)  r   r   r   get_aggregate&  s   zSchemaParserV22.get_aggregatec                 C   s"   t d|ft}| | j| | jS )Nr6  )r   r  r  _SELECT_KEYSPACESr  )r   rV   rU   r)  r   r   r   get_keyspace,  s   zSchemaParserV22.get_keyspacec                 C   sT   z|  |}W |S  ty)   |d }t|ddi }t |_td|| Y |S w )Nr  FUNKNOWNz4Error while parsing metadata for keyspace %s row(%s))!_build_keyspace_metadata_internalrn  r  r  r  r  ro  r  )rj  r  ksmr   r   r   r   r  0  s   
z(SchemaParserV22._build_keyspace_metadatac                 C   s4   | d }| d }| d }t | d }t||||S )Nr  r  rq  r  )rR   rj  r  )r  r   r  rq  r  r   r   r   r@  ;  s
   z1SchemaParserV22._build_keyspace_metadata_internalc                 C   s.   t t| j|d }t|d |d |d |S )Nr  r  r  r  )rY   r[   _schema_type_to_cqlr  )rj  r  r  r   r   r   r  C  s   z SchemaParserV22._build_user_typec                 C   sl   |  |d }|dd}|dd}|dd}t|d |d || j |d	 ||d
 |d |d |||S )Nr  r7   Fr`   r(  r   r  function_namer%  rW   r&  r'  )rB  r   r$  r8  )rj  function_rowr  r7   r`   r(  r   r   r   r  I  s   zSchemaParserV22._build_functionc                 C   sz   t |d }|d }|d urt||d}t|}| |d }t|d |d |d |d ||d	 |||d
d	S )Nr  rL   r   r  r  aggregate_namer   r  r  r7   F)	r  lookup_casstyper  r  deserialize_cql_from_cass_typerB  r  r   )rj  aggregate_rowcass_state_typer  r  r  r   r   r   r  U  s   

z SchemaParserV22._build_aggregateNc           '   
   C   s  |d }|| j  }|p| j| | }|p| j| | }|s$td|| t||}zt|d }||_t	|tj
}t	|tj}	|	rF|jn|f}
t|
}|
d }|dd }dd |D }t|dkrlt|d	d
 d}|d urut|}|s~dd |D }|	rt	|tjrd}d}|d }n?t||d krt	|tjrd}d}|d }n(d}|p| }|}|st|drtd |j}nd}|s|r|rd}|}nd}d}dd |D }t|dkrt|dd
 d}|d}|d ur|rt|ng }ndd |D }|d}|d urt|}t	|tjr|jn|g}ndd |D }t|D ]0\}}t||kr5|| }n|dkr=d}nd| }t||| }||j|< |j| q%t|D ]5}t||krh|| }nd|d  }|
| }t|}t|}t||||d}||j|< |j | qZ|rdd |D }|sd}n|dd }|d u r|r|d d}|d } | rt| }!n|rt|d d!}!t|!}t|||}|r||j|< |D ]$}"| !||"}#|#j"d ur|#|j|#j"< | #|#|"}$|$r|$|j$|$j"< q|D ]}%| %||%}&|&|j&|&j"< q| '||_(||_)W |S  t*y?   t+, |_-t.d"|||| Y |S w )#Nr  z5Building table metadata with no column meta for %s.%sr:  column_aliasesc                 S       g | ]}| d ddkr|qS )r   Nr3  r   r   rr   r   r   r   |      z9SchemaParserV22._build_table_metadata.<locals>.<listcomp>r  c                 S   
   |  dS Ncomponent_indexrN  r  r   r   r   r       
 z7SchemaParserV22._build_table_metadata.<locals>.<lambda>rS   c                 S      g | ]}| d qS r  rN  rO  r   r   r   r     r  F   T
fieldnamesr   c                 S   rM  )r   Nr2  rN  rO  r   r   r   r     rQ  c                 S   rR  rS  rN  rU  r   r   r   r    rV  key_aliasesc                 S   rX  rY  rN  rO  r   r   r   r     r  key_validatorc                 S   s   g | ]
}t |d qS )	validator)r  rF  r   rO  r   r   r   r     rd  rS   zkey%dzcolumn%d)rX  c                 S   rM  )r   Ncompact_valuerN  rO  r   r   r   r     rQ  r  value_aliasr  default_validatorr^  @Error while parsing metadata for table %s.%s row(%s) columns(%s))/r$  r  r  ro  rp  r  r  rF  r:  
issubclassDynamicCompositeTypeCompositeTypesubtypesr^  r   r=  rR   rj  ColumnToCollectionTypeUTF8Typer  filterr[  r  r  cql_parameterized_typer   r2  r<  r  rH  is_reversed_casstyper3  _build_column_metadatar   _build_index_metadatar	  _build_trigger_metadatar>  _build_table_optionsri   r;  rn  r  r  r  r  )'r   r  col_rowstrigger_rowsr  cfnamer  r:  is_dct_comparatoris_composite_comparatorcolumn_name_typesnum_column_name_componentslast_colrL  clustering_rows
is_compact	has_valueclustering_sizepartition_rowsr\  r]  key_type	key_typesr  col_typer  rL  	data_typerR  rX  value_alias_rowsr`  ra  r^  col_rowcolumn_meta
index_metatrigger_rowrF  r   r   r   r  b  s   



















z%SchemaParserV22._build_table_metadatac                    s6   t  fdd| jD }d|v r|d}||d< |S )B Setup the mostly-non-schema table options, like caching settings c                 3   &    | ]}| v r|  |fV  qd S r   rN  r   orU  r   r   r   	     $ z7SchemaParserV22._build_table_options.<locals>.<genexpr>r  r  )r  recognized_table_optionsr  )r   r  ri   valr   rU  r   ro  	  s
   
z$SchemaParserV22._build_table_optionsc           
      C   sV   |d }|d }t |}t|}|dd dk}t |}t|||||}	||	_|	S )Nr  r^  r   r{   )r  rF  rH  r   rk  r  r  )
rj  r  r  r   type_stringr  rR  rS  rX  r  r   r   r   rl  	  s   

z&SchemaParserV22._build_column_metadatac                 C   s   | d}| d}|s|r_| d}|rt|ni }|pi }t| j}|dkrOd|v r3d|f }nd|v r8n| j}d}|jd	krO|jd
 j|v rOd|f }||d< t| j	j
| j	j|||S d S )Nr  
index_typer  r  
index_keyszkeys(%s)index_values)r[   rx   rY   rB   r   zfull(%s)r  )r   rR   rj  r  r   r  typenamerf  r  r   r  )column_metadatar  r  r  ri   r  r  collection_typesr   r   r   rm  	  s&   




z%SchemaParserV22._build_index_metadatac                 C       |d }|d }t | ||}|S )Nr  trigger_optionsr  r  r  r   ri   rF  r   r   r   rn  ;	     z'SchemaParserV22._build_trigger_metadatac              
   C   s  t j}t| j|dt| j|dt| j|dt| j|dt| j|dt| j|dt| j	|dg}| j
j|| jdd\\}}\}}\}}\}	}
\}}\}}\}}| ||| _| ||| _| ||| _|rot|j|j| _nt|trztd nt|trtd n||	rt|
j|
j| _nt|
trtd i | _n|
|rt|j|j| _nt|trtd n||rt|j|j| _nt|trtd n||   d S )	Nr  Fr  ztriggers table not foundzthis version of Cassandra does not allow access to schema_triggers metadata with authorization enabled (CASSANDRA-7967); The driver will operate normally, but will not reflect triggers in the local metadata model, or schema strings.r  zuser functions table not foundzuser aggregates table not found)r   r  r   r=  r%  r&  r4  r9  r;  r'  r   r  r   r  r  r  r  r   r  r  r	  r  r   ro  r  r   rp  r
  r  r  _aggregate_results)r   r(  queries
ks_success	ks_resulttable_successr2  r/  r0  types_successr
  functions_successr  aggregates_successr  r1  r	  r   r   r   r  B	  s\   





zSchemaParserV22._query_allc                 C   s   | j }| jD ]}||d  | q| j}| jD ]}|d }|| j }|| | | q| j}| jD ]}||d  | q3| j}| j	D ]}||d  | qE| j
}| jD ]}||d  | qW| j}| jD ]}|d }|| j }|| | | qid S Nr  )r  r  r<  r  r  r$  r  r
  r  r  r  r  r  r	  r   mr  r  rr  r   r   r   r  	  s.   







z"SchemaParserV22._aggregate_resultsc                 C   s   t | }t|S r   )r  rF  rH  )r  	cass_typer   r   r   rB  	  s   
z#SchemaParserV22._schema_type_to_cqlrW  )&rX  rY  rZ  r[  r=  r%  r&  r'  r4  r9  r;  r$  r8  r  r   r   r3  r5  r   r:  r<  r>  r~  r  r  r@  r  r  r  r  ro  rl  rm  rn  r  r  rB  r  r   r   r  r   r    sV    






 !


Er  c                       s   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZeZdZ fddZ fddZdd Zedd Zedd Zd.ddZdd Zd/ddZd0d d!Zed"d# Zed$d% Zed&d' Zd(d) Z fd*d+Z ed,d- Z!  Z"S )1SchemaParserV3z
    For C* 3.0+
    z%SELECT * FROM system_schema.keyspacesz"SELECT * FROM system_schema.tablesz#SELECT * FROM system_schema.columnsz#SELECT * FROM system_schema.indexesz$SELECT * FROM system_schema.triggersz!SELECT * FROM system_schema.typesz%SELECT * FROM system_schema.functionsz&SELECT * FROM system_schema.aggregatesz!SELECT * FROM system_schema.viewsr  r  )r  ru  cdcrh  rt  rf  crc_check_chancer  r  r  r  r  r  r  r  c                    s4   t t| || g | _tdd | _tt| _d S )Nc                   S   r  r   r  r   r   r   r   r  	  r  z)SchemaParserV3.__init__.<locals>.<lambda>)r}  r  r   indexes_resultr   keyspace_table_index_rowsrY   keyspace_view_rowsr  r  r   r   r   	  s   zSchemaParserV3.__init__c                 #   sF    t t|  D ]}| j|j D ]}| |}|| q|V  qd S r   )r}  r  r   r  r   _build_view_metadatar  )r   r  r  r  r  r   r   r   	  s   
z SchemaParserV3.get_all_keyspacesc              	   C   s,  t j}td| j ||ft}t| j| |d}t| j| |d}t| j| |d}t| j	| |d}	td||ft}t| j
| |d}
| jj||||	|
| jdd\\}}\}}\}}\}}\}}| ||}| ||}|r| ||}| ||}| |d |||S | ||}|r| |d |S d S )Nr"  r  z, WHERE keyspace_name = %s AND view_name = %sFr  r   )r   r  r   r$  r  r   _SELECT_TABLESr&  _SELECT_INDEXESr'  _SELECT_VIEWSr   r  r   r  r  r  )r   rV   rU   r   r(  r)  r*  r+  indexes_queryr,  
view_queryr-  r.  r/  r0  indexes_sucessr  r1  r	  view_successview_resultr2  r   r   r   r3  	  s6   
zSchemaParserV3.get_tablec                 C   s4   | d }| d }t | d }|d}t||||S )Nr  r  replicationr  )r  r  r  )r  r   r  r  rq  r   r   r   r@  	  s
   
z0SchemaParserV3._build_keyspace_metadata_internalc                 C   s@   t | d | d | d | d | d | d | d | d | d	d
	S )Nr  rE  r  r  r  r  rL   r  r7   F)r  r   )rI  r   r   r   r  
  s
   
zSchemaParserV3._build_aggregateNFc              
   C   sn  |d }|| j  }|p| j| | }|p| j| | }|p#| j| | }| j|||d}zr| ||_|dt }	|	rWd|	v }
|
 oJd|	voJd|	v}|
pTd|	v pTd|	v|_	n|rad}d|_	d}
nd}d|_	d}
| 
||||
| |D ]}| ||}||j|j< qs|D ]}| ||}|r||j|j< q|d	i |_W |S  ty   t |_td
|||| Y |S w )Nr  )r  flagsdenser}  compoundFTrB  rb  )r$  r  r  r  _table_metadata_classro  ri   r   rx   r;  _build_table_columnsrn  r>  r   rm  r	  rB  rn  r  r  r  ro  r  )r   r  rp  rq  
index_rowsr  r  r  r  r  is_densecompact_staticr  rF  	index_rowr  r   r   r   r  	
  sH   

z$SchemaParserV3._build_table_metadatac                    s   t  fdd| jD S )r  c                 3   r  r   rN  r  rU  r   r   r   6
  r  z6SchemaParserV3._build_table_options.<locals>.<genexpr>)r  r  )r   r  r   rU  r   ro  4
  s   z#SchemaParserV3._build_table_optionsc                 C   s$  dd |D }t |dkrt|dd d}|D ]}| ||}||j|j< |j|j|d  q|sfdd |D }	t |	dkrIt|	d	d d}	|	D ]}| ||}||j|j< |j|j|d  qKd
d |D D ]"}
| ||
}|r~|j	t
jkr~qm|r|jsqm|rd|_||j|j< qmd S )Nc                 S   rM  )r  Nr2  rN  rO  r   r   r   r   :
  rQ  z7SchemaParserV3._build_table_columns.<locals>.<listcomp>r  c                 S   rR  NpositionrN  rU  r   r   r   r  =
  rV  z5SchemaParserV3._build_table_columns.<locals>.<lambda>rW  r  c                 S   rM  )r  Nr)   rN  rO  r   r   r   r   G
  rQ  c                 S   rR  r  rN  rU  r   r   r   r  J
  rV  c                 s   s$    | ]}| d ddvr|V  qdS )r  Nr1  rN  rO  r   r   r   r   P
  s    z6SchemaParserV3._build_table_columns.<locals>.<genexpr>F)r^  r=  rl  r   r   r2  r<  r   r3  rR  r  cql_empty_typerS  )r   r   rp  r  r  r  r|  rP  r  rx  r  r   r   r   r  8
  s2   
z#SchemaParserV3._build_table_columnsc           	   	   C   sp   |d }|d }|d }|d }|d }|p| j | | }t|||||| |}| || |di |_|S )Nr  r  r  include_all_columnsr)  rB  )r  MaterializedViewMetadataro  r  r   rB  )	r   r  rp  r  r  r  r  r)  r  r   r   r   r  ]
  s   z#SchemaParserV3._build_view_metadatac                 C   sD   |d }|d }| dd dk}|d  dk}t| ||||}|S )Nr  r   r  r{   clustering_orderrV  )r   upperr  )r  r  r   rR  rS  rX  r  r   r   r   rl  k
  s   z%SchemaParserV3._build_column_metadatac                 C   s>   | d}| d}|s|r| d}t| j| j|||S d S )Nr  r  ri   )r   r  r  r   )r  r  r  r  r  r   r   r   rm  t
  s   


z$SchemaParserV3._build_index_metadatac                 C   r  )Nr  ri   r  r  r   r   r   rn  ~
  r  z&SchemaParserV3._build_trigger_metadatac                 C   sL  t j}t| j|dt| j|dt| j|dt| j|dt| j|dt| j|dt| j	|dt| j
|dt| j|dg	}| jj|| jdd\	\}}\}}\}}\}	}
\}}\}}\}}\}}\}}| ||| _| ||| _| ||| _| ||| _| |	|
| _| ||| _| ||| _| ||| _| ||| _|   d S )Nr  Fr  )r   r  r   r=  r  r&  r4  r9  r;  r'  r  r  r   r  r   r  r  r  r  r	  r
  r  r  r  views_resultr  )r   r(  r  r  r  r  r2  r/  r0  r  r
  r  r  r  r  r1  r	  indexes_successr  views_successr  r   r   r   r  
  sB   zSchemaParserV3._query_allc                    sl   t t|   | j}| jD ]}|d }|| j }|| | | q| j}| jD ]}||d  | q(d S r  )	r}  r  r  r  r  r$  r<  r  r  r  r  r   r   r  
  s   


z!SchemaParserV3._aggregate_resultsc                 C   s   | S r   r   )r  r   r   r   rB  
  rw  z"SchemaParserV3._schema_type_to_cql)NNNF)FFFr   )#rX  rY  rZ  r[  r=  r  r&  r  r'  r4  r9  r;  r  r$  r8  rs  r  r  r   r   r3  r  r@  r  r  ro  r  r  rl  rm  rn  r  r  rB  r  r   r   r  r   r  	  sH    


+

%

	
&r  c                   @      e Zd ZdZejd ZdS )SchemaParserDSE60z
    For DSE 6.0+
    rv  N)rX  rY  rZ  r[  r  r  r   r   r   r   r  
  
    r  c                       s\   e Zd ZdZdZdZdZ fddZdd Z fd	d
Z	 fddZ
e fddZ  ZS )SchemaParserV4)additional_write_policyr  ru  r  rh  rt  rf  r  r  r  r  r  r  read_repairr  z-SELECT * from system_virtual_schema.keyspacesz*SELECT * from system_virtual_schema.tablesz+SELECT * from system_virtual_schema.columnsc                    s8   t t| || tt| _tt| _tdd | _d S )Nc                   S   r  r   r  r   r   r   r   r  
  r  z)SchemaParserV4.__init__.<locals>.<lambda>)r}  r  r   r   rY   virtual_keyspaces_rowsvirtual_tables_rowsvirtual_columns_rowsr  r  r   r   r   
  s   

zSchemaParserV4.__init__c                 C   s  t j}t| j|dt| j|dt| j|dt| j|dt| j|dt| j|dt| j	|dt| j
|dt| j|dt| j|dt| j|dt| j|dg}| jj|| jdd}|\\}}\}}\}}	\}
}\}}\}}\}}\}}\}}\}}\}}\}}| ||| _| ||| _| ||	| _| ||| _| |
|| _| ||| _| ||| _| ||| _| ||| _| j||tfd| _| j||tfd| _| j||tfd| _|    d S Nr  Fr  r#  )!r   r  r   r=  r  r&  r4  r9  r;  r'  r  r  _SELECT_VIRTUAL_KEYSPACES_SELECT_VIRTUAL_TABLES_SELECT_VIRTUAL_COLUMNSr   r  r   r  r  r  r  r	  r
  r  r  r  r  r   virtual_keyspaces_resultvirtual_tables_resultvirtual_columns_resultr  )r   r(  r  r  r  r  r  r2  r/  r0  r  r
  r  r  r  r  r1  r	  r  r  r  r  virtual_ks_successvirtual_ks_resultvirtual_table_successvirtual_table_resultvirtual_column_successvirtual_column_resultr   r   r   r  
  sj   zSchemaParserV4._query_allc                    sl   t t|   | j}| jD ]}||d  | q| j}| jD ]}|d }|| j }|| | | qd S r  )	r}  r  r  r  r  r<  r  r  r$  )r   r  r  r  tab_namer  r   r   r  &  s   


z!SchemaParserV4._aggregate_resultsc              	   #   s    t t|  D ]}|V  q| jD ]2}|d }| |}d|_| j|g D ]}|| j }| j	| | }|
| j||dd q&|V  qd S )Nr  T)rp  r  )r}  r  r   r  r  r  r  r   r$  r  r  r  )r   xr  r  r  r  r  rp  r  r   r   r   3  s$   


z SchemaParserV4.get_all_keyspacesc                    sH   |  dd | d< |  di | d< | d  dd | d d< ttt| S )Nr  r  r  )r   r}  r  r@  rU  r  r   r   r@  G  s   z0SchemaParserV4._build_keyspace_metadata_internal)rX  rY  rZ  r  r  r  r  r   r  r  r   r  r@  r  r   r   r  r   r  
  s    Dr  c                   @   r  )SchemaParserDSE67z
    For DSE 6.7+
    r  N)rX  rY  rZ  r[  r  r  r   r   r   r   r  P  r  r  c                       s   e Zd ZdZdZdZeZ fddZ fddZ	 fdd	Z
ed
d Zdd Zedd Zedd Zdd Z fddZ  ZS )SchemaParserDSE68z
    For DSE 6.8+
    z$SELECT * FROM system_schema.verticesz!SELECT * FROM system_schema.edgesc                    s2   t t| || tdd | _tdd | _d S )Nc                   S   r  r   r  r   r   r   r   r  d  r  z,SchemaParserDSE68.__init__.<locals>.<lambda>c                   S   r  r   r  r   r   r   r   r  e  r  )r}  r  r   r   keyspace_table_vertex_rowskeyspace_table_edge_rowsr  r  r   r   r   b  s   zSchemaParserDSE68.__init__c                 #   s*    t t|  D ]
}| | |V  qd S r   )r}  r  r   _build_graph_metadata)r   r  r  r   r   r   g  s
   
z#SchemaParserDSE68.get_all_keyspacesc                    s  t t| |||}tj}td| j ||ft}t| j	| |d}t| j
| |d}| jj||| jdd\\}	}
\}}| |	|
}
| ||}z |
rU| |
d |_W |S |re| || |d |_W |S W |S  ty   d |_d |_t |_td|| Y |S w )Nr"  r  Fr  r   z3Error while parsing graph metadata for table %s.%s.)r}  r  r3  r   r  r   r$  r  r   _SELECT_VERTICES_SELECT_EDGESr   r  r   r  _build_table_vertex_metadatar  _build_table_edge_metadatar  rn  r  r  r  ro  r  )r   rV   rU   r   r  r(  r)  vertices_queryedges_queryvertices_successvertices_resultedges_successedges_resultr  r   r   r3  l  s2   	
zSchemaParserDSE68.get_tablec                 C   s`   | d }|  dd }d| v rt|  dni }d|v r |dnd }|  dd }t|||||S )Nr  r  r  r  r  )r   r  r  r  )r  r   r  r  replication_classr  r   r   r   r@    s   z3SchemaParserDSE68._build_keyspace_metadata_internalc                    s    fdd}z+ fdd j  D D ]}|| q fdd j  D D ]}|| q)W d S  tyV    j  D ]}d  |_|_q>t  _t	d j
 Y d S w )Nc                    sN   j  j | j D ]}|| _q	j j | j D ]	} || _qd S r   )r  r   r  r  r  r  r  )r  r  r  r   r   r   _build_table_graph_metadata  s
   zLSchemaParserDSE68._build_graph_metadata.<locals>._build_table_graph_metadatac                    s"   g | ]}|j j j  v r|qS r   r   r  r  r  r   r   r         z;SchemaParserDSE68._build_graph_metadata.<locals>.<listcomp>c                    s"   g | ]}|j j j  vr|qS r   r  r  r  r   r   r     r  z2Error while parsing graph metadata for keyspace %s)r  r   rn  r  r  r  r  r  ro  r  r   )r   r  r  r  rJ  r   r  r   r    s   


z'SchemaParserDSE68._build_graph_metadatac                 C   s   t | d| d| dS )Nr  r  r~  )VertexMetadatar   rU  r   r   r   r    s   z.SchemaParserDSE68._build_table_vertex_metadatac                 C   s   | d}| j |}|jj}| d}| j |}|jj}t| d| d| d||| d| d||| d| d	S )
N
from_tableto_tabler  r  r~  r  r  r  r  )r   r  r  r~  EdgeMetadata)r  r  r  from_table_metar  r  to_table_metar  r   r   r   r    s   

z,SchemaParserDSE68._build_table_edge_metadatac                  C   s  t j}t| j|dt| j|dt| j|dt| j|dt| j|dt| j|dt| j	|dt| j
|dt| j|dt| j|dt| j|dt| j|dt| j|dt| j|dg}| jj|| jdd}|\\}}\}}\}}	\}
}\}}\}}\}}\}}\}}\}}\}}\}}\}}\}}| ||| _| ||| _| ||	| _| ||| _| |
|| _| ||| _| ||| _| ||| _| ||| _| j||tfd| _| j||tfd| _ | j||tfd| _!| ||| _"| ||| _#| $  d S r  )%r   r  r   r=  r  r&  r4  r9  r;  r'  r  r  r  r  r  r  r  r   r  r   r  r  r  r  r	  r
  r  r  r  r  r   r  r  r  r  r  r  ) r   r(  r  r  r  r  r  r2  r/  r0  r  r
  r  r  r  r  r1  r	  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r    sv   zSchemaParserDSE68._query_allc                    sz   t t|   | j}| jD ]}|d }|d }|| | | q| j}| jD ]}|d }|d }|| | | q'd S )Nr  r  )r}  r  r  r  r  r<  r  r  r  r  r   r   r    s   

z$SchemaParserDSE68._aggregate_results)rX  rY  rZ  r[  r  r  rz  r  r   r   r3  r  r@  r  r  r  r  r  r  r   r   r  r   r  X  s"    


Jr  c                   @   sf   e Zd ZdZdZ	 dZ	 dZ	 dZ	 dZ	 dZ		 dZ
	 dZ	 dZ	 dZ	 dd Zd
ddZdd	 ZdS )r  z<
    A representation of a materialized view on a table
    Nc                 C   s@   || _ || _|| _g | _g | _t | _|| _|| _|pi | _	d S r   )
r  r   r  r2  r3  r   r   r  r)  ri   )r   r  r  r  r  r)  ri   r   r   r   r   L  s   z!MaterializedViewMetadata.__init__Fc                 C   s$  |rdnd}t | j}t | j}| jrdnddd | j D }t | j}| j}ddd | j	D }t
| j	dkrAd	| }	nd
| }	| jrW|	dddd | jD  7 }	|	d7 }	t|| j| j}
dt  }| jrtj}| | j@ D ]}|| }|| || j| }|r|d|f 7 }qv|S )r)  r  r  *r  c                 s   rN  r   rO  rK  r   r   r   r   a  rP  z8MaterializedViewMetadata.as_cql_query.<locals>.<genexpr>c                 s   rN  r   rO  rK  r   r   r   r   e  rP  r  z((%s)z(%srQ  c                 s   rN  r   rO  rK  r   r   r   r   k  rP  r  zCREATE MATERIALIZED VIEW %(keyspace)s.%(name)s AS%(sep)sSELECT %(selected_cols)s%(sep)sFROM %(keyspace)s.%(base_table)s%(sep)sWHERE %(where_clause)s%(sep)sPRIMARY KEY %(pk)s%(sep)sWITH %(properties)srA  )r  r  r   r  r   r   r   r  r)  r2  r^  r3  rs  rT  ri   r  rB  rC  rD  rT   rE  )r   r  r  rU   r   selected_cols
base_tabler)  part_keypkr[  r  rG  r  rH  r  r   r   r   r  W  s4   

$

z%MaterializedViewMetadata.as_cql_queryc                 C   r  r  r  r   r   r   r   r     r  z)MaterializedViewMetadata.export_as_stringr  )rX  rY  rZ  r[  r  r   r  r2  r3  r   r  r)  ri   rB  r   r  r   r   r   r   r   r    s2    
)r  c                   @   s*   e Zd ZdZdZ	 dZ	 dZ	 dd ZdS )r  z1
    A representation of a vertex on a table
    Nc                 C   r  r   )r  r  r~  )r   r  r  r~  r   r   r   r     r  zVertexMetadata.__init__)rX  rY  rZ  r[  r  r  r~  r   r   r   r   r   r    s    r  c                   @   sZ   e Zd ZdZdZ	 dZ	 dZ	 dZ	 dZ	 dZ		 dZ
	 dZ	 dZ	 dZ	 dZ	 dd ZdS )r  z0
    A representation of an edge on a table
    Nc                 C   sF   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
d S r   )r  r  r~  r  r  r  r  r  r  r  r  )r   r  r  r~  r  r  r  r  r  r  r  r  r   r   r   r     s   
zEdgeMetadata.__init__)rX  rY  rZ  r[  r  r  r~  r  r  r  r  r  r  r  r  r   r   r   r   r   r    s2    r  c                 C   s   t |}|r+t |}|t dkrt| |S |t dkr t| |S |t dkr+t| |S |t dkr6t| |S |t dkrAt| |S t| |S )Nz6.8.0z6.7.0z6.0.0z4-az3.0.0)r   r  r  r  r  r  r  )r   r   r   r   versionr  r   r   r   r     s   





r   c                 C   s"   t | tjr| jd  S |  S )zk
    A string representation of the type for this column, such as "varchar"
    or "map<string, int>".
    r   )rc  r  ReversedTyperf  rj  )r  r   r   r   rH    s   rH  c                   @   r  )RLACTableExtension	DSE_RLACAc                 C   s$   dt |jt |jt |df S )Nz RESTRICT ROWS ON %s.%s USING %s;zutf-8)r  r  r   decode)rj  r  r  r  r   r   r   rE    s   
z"RLACTableExtension.after_table_cqlN)rX  rY  rZ  r   r~  rE  r   r   r   r   r    s    r  c                    s   | j   jj| j| j}tdd |D }tt} jj|D ]P} fddt	||D }t
|dkr9|d }	n
ddd |D }	 j||	}
fd	d|
D }|s\d
d |
D }|ri|t| | q |t | q t|S )a  
    Returns a :class:`dict` with the keys grouped per host. This can be
    used to more accurately group by IN clause or to batch the keys per host.

    If a valid replica is not found for a particular key it will be grouped under
    :class:`~.NO_VALID_REPLICA`

    Example usage::
        result = group_keys_by_replica(
                     session, "system", "peers",
                     (("127.0.0.1", ), ("127.0.0.2", ))
                 )
    c                 s   s    | ]	}t j|j V  qd S r   )r  	_cqltypesrR  )r   r2  r   r   r   r     r  z(group_keys_by_replica.<locals>.<genexpr>c                    s   g | ]\}}| | jqS r   )	serializer   )r   
serializerr  )r   r   r   r     s    z)group_keys_by_replica.<locals>.<listcomp>r  r       c                 s   s,    | ]}t d t| t||dV  qdS )z>H%dsBr   N)structpackr^  )r   pr   r   r   r     s   * c                    s$   g | ]}|j r |tjkr|qS r   )is_upr   LOCALr   rB  )distancer   r   r     s    c                 S   s   g | ]}|j r|qS r   )r  r  r   r   r   r     r  )r   r  rV   r  r2  rY   r   _default_load_balancing_policyr  r  r^  r   rG  randomchoicer<  NO_VALID_REPLICAr  )sessionrU   r   rT   r  serializerskeys_per_hostrS   serialized_keyrouting_keyr  valid_replicasr   )r   r  r   group_keys_by_replica  s(   

r  c                   @   s@   e Zd ZdZedd Zedd Zedd Zedd	 Zd
S )	_NodeInfozs
    Internal utility functions to determine the different host addresses/ports
    from a local or peers row.
    c                 C   sH   |  d}d| v r|  d}d| v r|  d}|r|dv r"|  d}|S )Nrpc_addressnative_addressnative_transport_address)z0.0.0.0z::peerrN  r  addrr   r   r   get_broadcast_rpc_address0  s   



z#_NodeInfo.get_broadcast_rpc_addressc                 C   8   |  d}|d u s|dkr|  d}|r|dkr|S d S )Nrpc_portr   native_portrN  r  rR  r   r   r   get_broadcast_rpc_port>     

z _NodeInfo.get_broadcast_rpc_portc                 C   s    |  d}|d u r|  d}|S )Nbroadcast_addressr  rN  r   r   r   r   get_broadcast_addressF  s   

z_NodeInfo.get_broadcast_addressc                 C   r#  )Nbroadcast_portr   	peer_portrN  r&  r   r   r   get_broadcast_portN  r(  z_NodeInfo.get_broadcast_portN)	rX  rY  rZ  r[  r  r"  r'  r*  r-  r   r   r   r   r  *  s    


r  )vbinasciir   bisectr   collectionsr   collections.abcr   	functoolsr   hashlibr   rR   loggingrer  	threadingr   r	  r  r	   cassandra.murmur3ImportErrore	cassandrar
   r   r   r   cassandra.cqltypescqltypesr  cassandra.encoderr   cassandra.marshalr   cassandra.protocolr   cassandra.queryr   r   cassandra.utilr   r   cassandra.poolr   cassandra.connectionr   	getLoggerrX  ro  rx   cql_keywordscql_keywords_unreservedr  r  r   r   rl  ra  rf  r   rb  rk  r  rm  r  r  r  r  r  r  r  r  r$  r  rs  rz  r  rC  r  r  r  rl  compiler  r  r  r  r  r  r>  r  r  r  rn  rI  r  r9  r8  r:  r  r  r  r  r  r  r  r  r  r  r  r   rH  r  r  r  r  r   r   r   r   <module>   s   
	  
	82s CBc   %.

(;S"	"4   |    Al8/