o
    bY                     @   s  d Z ddlZddlZddlZddl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 dd
lmZ dZG dd deZdd Zd7ddZd7ddZd7ddZd7ddZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZ G d%d& d&eZ!G d'd( d(eZ"G d)d* d*e"Z#G d+d, d,e"Z$G d-d. d.eZ%G d/d0 d0eZ&G d1d2 d2eZ'G d3d4 d4eZ(G d5d6 d6eZ)dS )8zImplementation of Statements.    N   )ProgrammingErrorNotSupportedError)
ExprParser)LockContention)DbDoc)
deprecated)Result)mysqlxpb_enumz&The given index name "{}" is not validc                   @   s   e Zd ZdZdd ZdS )ExprzExpression wrapper.c                 C   
   || _ d S N)expr)selfr    r   O/var/www/secure340b-portal/env/lib/python3.10/site-packages/mysqlx/statement.py__init__0   s   
zExpr.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r   .   s    r   c                  G   s*   t | dkrt| d ttfr| d S | S )zParse flexible parameters.r   r   )len
isinstancelisttuple)valuesr   r   r   flexible_params4   s   r    c                 C   sP   d|v r| d dkr| d dkp| d dko| d dkS | d dko'| d dkS )zCheck if the given identifier is quoted.

    Args:
        identifier (string): Identifier to check.
        sql_mode (Optional[string]): SQL mode.

    Returns:
        `True` if the identifier has backtick quotes, and False otherwise.
    ANSI_QUOTESr   `"r   
identifiersql_moder   r   r   is_quoted_identifier;   s
   
r%   c                 C   s<   t | dkrdS d|v rd| ddS d| ddS )	a@  Quote the given identifier with backticks, converting backticks (`) in
    the identifier name with the correct escape sequence (``).

    Args:
        identifier (string): Identifier to quote.
        sql_mode (Optional[string]): SQL mode.

    Returns:
        A string with the identifier quoted with backticks.
    r   z``r   z"{0}"r!   z""z`{0}`r   )r   formatreplacer"   r   r   r   quote_identifierK   s
   r(   c                    s   d  fdd| D S )a  Quote the given multi-part identifier with backticks.

    Args:
        identifiers (iterable): List of identifiers to quote.
        sql_mode (Optional[string]): SQL mode.

    Returns:
        A string with the multi-part identifier quoted with backticks.
    .c                    s   g | ]}t | qS r   )r(   ).0r#   r$   r   r   
<listcomp>g   s    z.quote_multipart_identifier.<locals>.<listcomp>)join)Zidentifiersr$   r   r+   r   quote_multipart_identifier]   s   
r.   c                 C   s^   d|v rdnd}||v rd |nd}||d}t|dkr!| n|d ||d |fS )	zParse table name.

    Args:
        default_schema (str): The default schema.
        table_name (str): The table name.
        sql_mode(Optional[str]): The SQL mode.

    Returns:
        str: The parsed table name.
    r   r!   r   z.{0}r)   r   r   r    )r&   splitr   strip)Zdefault_schemaZ
table_namer$   quote	delimitertempr   r   r   parse_table_namek   s   r4   c                   @   s   e Zd ZdZd"ddZedd Zedd Zed	d
 Zej	dd
 Zedd Z
edd Zej	dd Zedd Zej	dd Zedd Zedd Zej	dd Zdd Zdd Zdd Zdd  Zd!S )#	Statementa	  Provides base functionality for statement objects.

    Args:
        target (object): The target database object, it can be
                         :class:`mysqlx.Collection` or :class:`mysqlx.Table`.
        doc_based (bool): `True` if it is document based.
    Tc                 C   s@   || _ || _|r| nd | _d | _d| _d| _d| _d| _d S )Nr   TF)	_target
_doc_basedget_connection_connection_stmt_id_exec_counter_changed	_prepared_deallocate_prepare_executer   target	doc_basedr   r   r   r      s   
zStatement.__init__c                 C      | j S )z#object: The database object target.)r6   r   r   r   r   r@         zStatement.targetc                 C   s   | j jS )z*:class:`mysqlx.Schema`: The Schema object.)r6   schemarC   r   r   r   rE      s   zStatement.schemac                 C   rB   )zXReturns this statement ID.

        Returns:
            int: The statement ID.
        r:   rC   r   r   r   stmt_id   s   zStatement.stmt_idc                 C   r   r   rF   r   valuer   r   r   rG         
c                 C   rB   )z5int: The number of times this statement was executed.r;   rC   r   r   r   exec_counter   rD   zStatement.exec_counterc                 C   rB   )z+bool: `True` if this statement has changes.r<   rC   r   r   r   changed   rD   zStatement.changedc                 C   r   r   rM   rH   r   r   r   rN      rJ   c                 C   rB   )z1bool: `True` if this statement has been prepared.r=   rC   r   r   r   prepared   rD   zStatement.preparedc                 C   r   r   rO   rH   r   r   r   rP      rJ   c                 C   s
   | j dkS )zDbool: `True` if this statement was executed more than once.
        r   rK   rC   r   r   r   repeated   s   
zStatement.repeatedc                 C   rB   )zBbool: `True` to deallocate + prepare + execute statement.
        r>   rC   r   r   r   deallocate_prepare_execute   s   z$Statement.deallocate_prepare_executec                 C   r   r   rR   rH   r   r   r   rS      rJ   c                 C   rB   )zkCheck if it is document based.

        Returns:
            bool: `True` if it is document based.
        )r7   rC   r   r   r   is_doc_based      zStatement.is_doc_basedc                 C   s   |  j d7  _ dS )z@Increments the number of times this statement has been executed.r   NrK   rC   r   r   r   increment_exec_counter   s   z Statement.increment_exec_counterc                 C   s
   d| _ dS )z<Resets the number of times this statement has been executed.r   NrK   rC   r   r   r   reset_exec_counter   rJ   zStatement.reset_exec_counterc                 C      t zqExecute the statement.

        Raises:
           NotImplementedError: This method must be implemented.
        NotImplementedErrorrC   r   r   r   execute      zStatement.executeNT)r   r   r   r   r   propertyr@   rE   rG   setterrL   rN   rP   rQ   rS   rT   rV   rW   r\   r   r   r   r   r5   }   s>    













r5   c                       s   e Zd ZdZd1 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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%d& Zed$d'd( Zd2d)d*Zd+d, Zd-d. Zd/d0 Z  ZS )3FilterableStatementa  A statement to be used with filterable statements.

    Args:
        target (object): The target database object, it can be
                         :class:`mysqlx.Collection` or :class:`mysqlx.Table`.
        doc_based (Optional[bool]): `True` if it is document based
                                    (default: `True`).
        condition (Optional[str]): Sets the search condition to filter
                                   documents or records.
    TNc                    s   t t| j||d i | _i | _d | _d| _d | _d| _d | _	d| _
d | _d| _d | _d| _d | _d| _d| _d| _d| _d| _d| _d| _|rO| | d S d S )Nr@   rA   r   r   F)superra   r   _binding_map	_bindings_having_grouping_str	_grouping_limit_offset_limit_row_count_projection_str_projection_expr	_sort_str
_sort_expr
_where_str_where_exprhas_bindings	has_limithas_group_by
has_havinghas_projectionhas_sort	has_where
_set_wherer   r@   rA   	condition	__class__r   r   r      s4   zFilterableStatement.__init__c                 C   s   t |tr| t|  dS t |tr| |  dS t |trNzt|}t |ts0tW n ty<   t	dw |
 D ]
}| |||  qAdS t	d)a  Bind single object.

        Args:
            obj (:class:`mysqlx.DbDoc` or str): DbDoc or JSON string object.

        Raises:
            :class:`mysqlx.ProgrammingError`: If invalid JSON string to bind.
            ValueError: If JSON loaded is not a dictionary.
        zInvalid JSON string to bindz%Invalid JSON string or object to bindN)r   dictbindr   Zas_strstrjsonloads
ValueErrorr   keys)r   objreskeyr   r   r   _bind_single  s"   





z FilterableStatement._bind_singlec                 G   s6   d| _ dt| | _t| j| j  | _d| _| S )zSets the sorting criteria.

        Args:
            *clauses: The expression strings defining the sort criteria.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.
        T,)	rv   r-   r   rm   r   r7   Zparse_order_specrn   r<   r   Zclausesr   r   r   _sort%  s   	zFilterableStatement._sortc                 C   sR   d| _ || _zt|| j }| | _W n ty   tdw |j| _	d| _
| S )a  Sets the search condition to filter.

        Args:
            condition (str): Sets the search condition to filter documents or
                             records.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.
        TzInvalid condition)rw   ro   r   r7   r   rp   r   r   Zplaceholder_name_to_positionrd   r<   )r   rz   r   r   r   r   rx   5  s   
zFilterableStatement._set_wherec                 G   s:   t | }d| _d|| _t| j| j  | _d| _dS )zJSet group by.

        Args:
            *fields: List of fields.
        Tr   N)	r   rs   r-   rg   r   r7   Zparse_expr_listrh   r<   r   fieldsr   r   r   _set_group_byJ  s   
z!FilterableStatement._set_group_byc                 C   s$   d| _ t|| j  | _d| _dS )zOSet having.

        Args:
            condition (str): The condition.
        TN)rt   r   r7   r   rf   r<   r   rz   r   r   r   _set_havingW  s   
zFilterableStatement._set_havingc                 G   s:   t | }d| _d|| _t| j| j  | _d| _| S )zSet the projection.

        Args:
            *fields: List of fields.

        Returns:
            :class:`mysqlx.FilterableStatement`: Returns self.
        Tr   )	r   ru   r-   rk   r   r7   Zparse_table_select_projectionrl   r<   r   r   r   r   _set_projectiona  s   	z#FilterableStatement._set_projectionc                 C   rB   zlReturns the binding map dictionary.

        Returns:
            dict: The binding map dictionary.
        rd   rC   r   r   r   get_binding_maps  rU   z#FilterableStatement.get_binding_mapc                 C   rB   z\Returns the bindings list.

        Returns:
            `list`: The bindings list.
        re   rC   r   r   r   get_bindings{  rU   z FilterableStatement.get_bindingsc                 C   rB   )zrReturns the grouping expression list.

        Returns:
            `list`: The grouping expression list.
        )rh   rC   r   r   r   get_grouping  rU   z FilterableStatement.get_groupingc                 C   rB   )zdReturns the having expression.

        Returns:
            object: The having expression.
        )rf   rC   r   r   r   
get_having  rU   zFilterableStatement.get_havingc                 C   rB   )z]Returns the limit row count.

        Returns:
            int: The limit row count.
        )rj   rC   r   r   r   get_limit_row_count  rU   z'FilterableStatement.get_limit_row_countc                 C   rB   )zWReturns the limit offset.

        Returns:
            int: The limit offset.
        )ri   rC   r   r   r   get_limit_offset  rU   z$FilterableStatement.get_limit_offsetc                 C   rB   )zbReturns the where expression.

        Returns:
            object: The where expression.
        )rp   rC   r   r   r   get_where_expr  rU   z"FilterableStatement.get_where_exprc                 C   rB   )zlReturns the projection expression.

        Returns:
            object: The projection expression.
        )rl   rC   r   r   r   get_projection_expr  rU   z'FilterableStatement.get_projection_exprc                 C   rB   )z`Returns the sort expression.

        Returns:
            object: The sort expression.
        )rn   rC   r   r   r   get_sort_expr  rU   z!FilterableStatement.get_sort_expr8.0.12c                 C   
   |  |S )a&  Sets the search condition to filter.

        Args:
            condition (str): Sets the search condition to filter documents or
                             records.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.

        .. deprecated:: 8.0.12
        rx   r   r   r   r   where  s   
zFilterableStatement.wherec                 G   
   | j | S )zSets the sorting criteria.

        Args:
            *clauses: The expression strings defining the sort criteria.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.

        .. deprecated:: 8.0.12
        r   r   r   r   r   sort  s   
zFilterableStatement.sortc                 C   sn   t |tr	|dk rtd| js!t| jdk| _t| jdk | _|| _d| _|r5| 	| t
jdtd | S )a  Sets the maximum number of items to be returned.

        Args:
            row_count (int): The maximum number of items.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.

        Raises:
            ValueError: If ``row_count`` is not a positive integer.

        .. versionchanged:: 8.0.12
           The usage of ``offset`` was deprecated.
        r   z0The 'row_count' value must be a positive integerTzh'limit(row_count, offset)' is deprecated, please use 'offset(offset)' to set the number of items to skip)category)r   intr   rr   boolr;   r<   r>   rj   offsetwarningswarnDeprecationWarning)r   	row_countr   r   r   r   limit  s   
zFilterableStatement.limitc                 C   s$   t |tr	|dk rtd|| _| S )a:  Sets the number of items to skip.

        Args:
            offset (int): The number of items to skip.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.

        Raises:
            ValueError: If ``offset`` is not a positive integer.

        .. versionadded:: 8.0.12
        r   z-The 'offset' value must be a positive integer)r   r   r   ri   )r   r   r   r   r   r     s   zFilterableStatement.offsetc                 G   sN   d| _ t|}|dkr| |d  | S |dkr#|d | j|d < | S td)a  Binds value(s) to a specific placeholder(s).

        Args:
            *args: The name of the placeholder and the value to bind.
                   A :class:`mysqlx.DbDoc` object or a JSON string
                   representation can be used.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.

        Raises:
            ProgrammingError: If the number of arguments is invalid.
        Tr   r      #Invalid number of arguments to bind)rq   r   r   re   r   )r   argscountr   r   r   r~   	  s   zFilterableStatement.bindc                 C   rX   rY   rZ   rC   r   r   r   r\   !  r]   zFilterableStatement.executeTNr   )r   r   r   r   r   r   r   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r~   r\   __classcell__r   r   r{   r   ra      s4    




ra   c                       sL   e Zd ZdZ fddZedd Zdd Zdd	 Zd
d Z	dd Z
  ZS )SqlStatementzA statement for SQL execution.

    Args:
        connection (mysqlx.connection.Connection): Connection object.
        sql (string): The sql statement to be executed.
    c                    s<   t t| jd dd || _|| _d | _g | _d| _d| _d S NFrb   )	rc   r   r   r9   _sqlrd   re   rq   rr   )r   
connectionsqlr{   r   r   r   1  s   
zSqlStatement.__init__c                 C   rB   )zstring: The SQL text statement.)r   rC   r   r   r   r   :  rD   zSqlStatement.sqlc                 C   rB   r   r   rC   r   r   r   r   ?  rU   zSqlStatement.get_binding_mapc                 C   rB   r   r   rC   r   r   r   r   G  rU   zSqlStatement.get_bindingsc                 G   sJ   t |dkr
tdd| _t| }t|ttfr|| _| S | j| | S )zBinds value(s) to a specific placeholder(s).

        Args:
            *args: The value(s) to bind.

        Returns:
            mysqlx.SqlStatement: SqlStatement object.
        r   r   T)	r   r   rq   r   r   r   r   re   append)r   r   Zbindingsr   r   r   r~   O  s   	zSqlStatement.bindc                 C      | j | S )zaExecute the statement.

        Returns:
            mysqlx.SqlResult: SqlResult object.
        )r9   Zsend_sqlrC   r   r   r   r\   b     zSqlStatement.execute)r   r   r   r   r   r_   r   r   r   r~   r\   r   r   r   r{   r   r   *  s    	
r   c                       0   e Zd ZdZ fddZdd Zdd Z  ZS )WriteStatementz/Provide common write operation attributes.
    c                    s   t t| || g | _d S r   )rc   r   r   _valuesr?   r{   r   r   r   n  s   
zWriteStatement.__init__c                 C   rB   )z^Returns the list of values.

        Returns:
            `list`: The list of values.
        )r   rC   r   r   r   
get_valuesr  rU   zWriteStatement.get_valuesc                 C   rX   rY   rZ   rC   r   r   r   r\   z  r]   zWriteStatement.execute)r   r   r   r   r   r   r\   r   r   r   r{   r   r   k  s
    r   c                       sB   e Zd ZdZ fddZdd ZdddZd	d
 Zdd Z  Z	S )AddStatementzA statement for document addition on a collection.

    Args:
        collection (mysqlx.Collection): The Collection object.
    c                    s"   t t| |d d| _g | _d S )NTF)rc   r   r   _upsertids)r   
collectionr{   r   r   r     s   
zAddStatement.__init__c                 C   rB   )zhReturns `True` if it's an upsert.

        Returns:
            bool: `True` if it's an upsert.
        r   rC   r   r   r   	is_upsert  rU   zAddStatement.is_upsertTc                 C   s
   || _ | S )zSets the upset flag to the boolean of the value provided.
        Setting of this flag allows updating of the matched rows/documents
        with the provided value.

        Args:
            value (optional[bool]): Set or unset the upsert flag.
        r   rH   r   r   r   upsert  s   zAddStatement.upsertc                 G   s:   t | D ]}t|tr| j| q| jt| q| S )zAdds a list of documents into a collection.

        Args:
            *values: The documents to be added into the collection.

        Returns:
            mysqlx.AddStatement: AddStatement object.
        )r   r   r   r   r   )r   r   valr   r   r   add  s
   	
zAddStatement.addc                 C   s    t | jdkr
t S | j| S )[Execute the statement.

        Returns:
            mysqlx.Result: Result object.
        r   )r   r   r	   r9   send_insertrC   r   r   r   r\     s   zAddStatement.executer^   )
r   r   r   r   r   r   r   r   r\   r   r   r   r{   r   r     s    
r   c                   @   s"   e Zd ZdZdddZdd ZdS )
UpdateSpeczUpdate specification class implementation.

    Args:
        update_type (int): The update type.
        source (str): The source.
        value (Optional[str]): The value.
    Nc                 C   sl   |t dkr| || d S || _|| _t|dkr'|d dkr'|dd  | _t| jd j| _|| _d S )N*Mysqlx.Crud.UpdateOperation.UpdateType.SETr   $r   F)	r
   
_table_setupdate_typesourcer   r   Zdocument_fieldr#   rI   )r   r   r   rI   r   r   r   r     s   
zUpdateSpec.__init__c                 C   s$   t d| _t|d | _|| _dS )zlTable set.

        Args:
            source (str): The source.
            value (str): The value.
        r   TN)r
   r   r   Zparse_table_update_fieldr   rI   )r   r   rI   r   r   r   r     s
   
zUpdateSpec._table_setr   )r   r   r   r   r   r   r   r   r   r   r     s    
r   c                       sp   e Zd ZdZ fddZdd Zdd Zdd	 Zed
dd Z	dd Z
dd Zdd Zdd Zdd Z  ZS )ModifyStatementaU  A statement for document update operations on a Collection.

    Args:
        collection (mysqlx.Collection): The Collection object.
        condition (str): Sets the search condition to identify the documents
                         to be modified.

    .. versionchanged:: 8.0.12
       The ``condition`` parameter is now mandatory.
    c                    s   t t| j||d i | _d S N)r@   rz   )rc   r   r   _update_opsr   r   rz   r{   r   r   r     s   
zModifyStatement.__init__c                 G   r   )zSets the sorting criteria.

        Args:
            *clauses: The expression strings defining the sort criteria.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.
        r   r   r   r   r   r        
	zModifyStatement.sortc                 C   rB   ztReturns the list of update operations.

        Returns:
            `list`: The list of update operations.
        r   rC   r   r   r   get_update_ops  rU   zModifyStatement.get_update_opsc                 C       t td||| j|< d| _| S )a2  Sets or updates attributes on documents in a collection.

        Args:
            doc_path (string): The document path of the item to be set.
            value (string): The value to be set on the specified attribute.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.
        z/Mysqlx.Crud.UpdateOperation.UpdateType.ITEM_SETTr   r
   r   r<   r   Zdoc_pathrI   r   r   r   set  s   

zModifyStatement.setr   c                 C   r   )a  Add an update to the statement setting the field, if it exists at
        the document path, to the given value.

        Args:
            doc_path (string): The document path of the item to be set.
            value (object): The value to be set on the specified attribute.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.

        .. deprecated:: 8.0.12
        z3Mysqlx.Crud.UpdateOperation.UpdateType.ITEM_REPLACETr   r   r   r   r   change  s   
zModifyStatement.changec                 G   s,   t | D ]}ttd|| j|< qd| _| S )a  Removes attributes from documents in a collection.

        Args:
            doc_paths (list): The list of document paths of the attributes to be
                              removed.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.
        z2Mysqlx.Crud.UpdateOperation.UpdateType.ITEM_REMOVET)r   r   r
   r   r<   )r   Z	doc_pathsitemr   r   r   unset&  s   
zModifyStatement.unsetc                 C   r   )a  Insert a value into the specified array in documents of a
        collection.

        Args:
            field (string): A document path that identifies the array attribute
                            and position where the value will be inserted.
            value (object): The value to be inserted.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.
        z3Mysqlx.Crud.UpdateOperation.UpdateType.ARRAY_INSERTTr   r   fieldrI   r   r   r   array_insert6  s   
zModifyStatement.array_insertc                 C   r   )a  Inserts a value into a specific position in an array attribute in
        documents of a collection.

        Args:
            doc_path (string): A document path that identifies the array
                               attribute and position where the value will be
                               inserted.
            value (object): The value to be inserted.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.
        z3Mysqlx.Crud.UpdateOperation.UpdateType.ARRAY_APPENDTr   r   r   r   r   array_appendH  s   
zModifyStatement.array_appendc                 C   sX   |du rd}t |ttttfstdttddt |tr!| n|| j	d< d| _
| S )a  Takes a :class:`mysqlx.DbDoc`, string JSON format or a dict with the
        changes and applies it on all matching documents.

        Args:
            doc (object): A generic document (DbDoc), string in JSON format or
                          dict, with the changes to apply to the matching
                          documents.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.
        Nr   z>Invalid data for update operation on document collection tablez2Mysqlx.Crud.UpdateOperation.UpdateType.MERGE_PATCHpatchT)r   r   r}   r   r   r   r   r
   r   r   r<   )r   docr   r   r   r   [  s   
zModifyStatement.patchc                 C      | j std| j| S )Execute the statement.

        Returns:
            mysqlx.Result: Result object.

        Raises:
            ProgrammingError: If condition was not set.
        z!No condition was found for modifyrw   r   r9   Zsend_updaterC   r   r   r   r\   s     	zModifyStatement.execute)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r\   r   r   r   r{   r   r     s    

r   c                       sz   e Zd ZdZd fdd	Zedd Zdd	 Zd
d Zdd Z	e
jfddZe
jfddZdd Zdd Zdd Z  ZS )ReadStatementa  Provide base functionality for Read operations

    Args:
        target (object): The target database object, it can be
                         :class:`mysqlx.Collection` or :class:`mysqlx.Table`.
        doc_based (Optional[bool]): `True` if it is document based
                                    (default: `True`).
        condition (Optional[str]): Sets the search condition to filter
                                   documents or records.
    TNc                    s,   t t| ||| d| _d| _tj| _d S NF)rc   r   r   _lock_exclusive_lock_sharedr   DEFAULT_lock_contentionry   r{   r   r   r     s   zReadStatement.__init__c                 C   rB   )z::class:`mysqlx.LockContention`: The lock contention value.)r   rC   r   r   r   lock_contention  rD   zReadStatement.lock_contentionc                 C   s0   zt |}W n ty   tdw || _dS )zSet the lock contention.

        Args:
            lock_contention (:class:`mysqlx.LockContention`): Lock contention.

        Raises:
            ProgrammingError: If is an invalid lock contention value.
        z;Invalid lock contention mode. Use 'NOWAIT' or 'SKIP_LOCKED'N)r   indexr   r   r   )r   r   _r   r   r   _set_lock_contention  s   	
z"ReadStatement._set_lock_contentionc                 C   rB   )zrReturns `True` if is `EXCLUSIVE LOCK`.

        Returns:
            bool: `True` if is `EXCLUSIVE LOCK`.
        )r   rC   r   r   r   is_lock_exclusive  rU   zReadStatement.is_lock_exclusivec                 C   rB   )zlReturns `True` if is `SHARED LOCK`.

        Returns:
            bool: `True` if is `SHARED LOCK`.
        )r   rC   r   r   r   is_lock_shared  rU   zReadStatement.is_lock_sharedc                 C      d| _ d| _| | | S )zExecute a read operation with `SHARED LOCK`. Only one lock can be
           active at a time.

        Args:
            lock_contention (:class:`mysqlx.LockContention`): Lock contention.
        FTr   r   r   r   r   r   r   r   lock_shared     
zReadStatement.lock_sharedc                 C   r   )zExecute a read operation with `EXCLUSIVE LOCK`. Only one lock can be
           active at a time.

        Args:
            lock_contention (:class:`mysqlx.LockContention`): Lock contention.
        TFr   r   r   r   r   lock_exclusive  r   zReadStatement.lock_exclusivec                 G   s   | j |  | S )zSets a grouping criteria for the resultset.

        Args:
            *fields: The string expressions identifying the grouping criteria.

        Returns:
            mysqlx.ReadStatement: ReadStatement object.
        )r   r   r   r   r   group_by  s   
	zReadStatement.group_byc                 C   s   |  | | S )a=  Sets a condition for records to be considered in agregate function
        operations.

        Args:
            condition (string): A condition on the agregate functions used on
                                the grouping criteria.

        Returns:
            mysqlx.ReadStatement: ReadStatement object.
        )r   r   r   r   r   having  s   
zReadStatement.havingc                 C   r   r   )r9   Z	send_findrC   r   r   r   r\     r   zReadStatement.executer   )r   r   r   r   r   r_   r   r   r   r   r   r   r   r   r   r   r\   r   r   r   r{   r   r     s    

r   c                       s2   e Zd ZdZd	 fdd	Zdd Zdd Z  ZS )
FindStatementa  A statement document selection on a Collection.

    Args:
        collection (mysqlx.Collection): The Collection object.
        condition (Optional[str]): An optional expression to identify the
                                   documents to be retrieved. If not specified
                                   all the documents will be included on the
                                   result unless a limit is set.
    Nc                    s   t t| |d| d S )NT)rc   r   r   r   r{   r   r   r        zFindStatement.__init__c                 G   r   )zSets a document field filter.

        Args:
            *fields: The string expressions identifying the fields to be
                     extracted.

        Returns:
            mysqlx.FindStatement: FindStatement object.
        )r   r   r   r   r   r      s   

zFindStatement.fieldsc                 G   r   zSets the sorting criteria.

        Args:
            *clauses: The expression strings defining the sort criteria.

        Returns:
            mysqlx.FindStatement: FindStatement object.
        r   r   r   r   r   r     r   zFindStatement.sortr   )r   r   r   r   r   r   r   r   r   r   r{   r   r     s
    	r   c                       8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
SelectStatementzA statement for record retrieval operations on a Table.

    Args:
        table (mysqlx.Table): The Table object.
        *fields: The fields to be retrieved.
    c                    s    t t| |d | j|  d S r   )rc   r  r   r   r   tabler   r{   r   r   r        zSelectStatement.__init__c                 C   r   )zSets the search condition to filter.

        Args:
            condition (str): Sets the search condition to filter records.

        Returns:
            mysqlx.SelectStatement: SelectStatement object.
        r   r   r   r   r   r   #  r   zSelectStatement.wherec                 G   r   )zSets the order by criteria.

        Args:
            *clauses: The expression strings defining the order by criteria.

        Returns:
            mysqlx.SelectStatement: SelectStatement object.
        r   r   r   r   r   order_by.  r   zSelectStatement.order_byc              
   C   s   | j r	d| jnd}| jrd| jnd}| jrd| jnd}| jr*d| jnd}| j	r7d| j
| jnd}dj| jp?d| jj| jj|||||d	}|S )
zYReturns the generated SQL.

        Returns:
            str: The generated SQL.
        z
 WHERE {0}r   z GROUP BY {0}z HAVING {0}z ORDER BY {0}z LIMIT {0} OFFSET {1}zISELECT {select} FROM {schema}.{table}{where}{group}{having}{order}{limit}*)selectrE   r  r   r   groupr   order)rw   r&   ro   rs   rg   rt   rf   rv   rm   rr   rj   ri   rk   rE   namer@   )r   r   r   r   r  r   stmtr   r   r   get_sql9  s.   

zSelectStatement.get_sql)	r   r   r   r   r   r   r  r  r   r   r   r{   r   r    s    r  c                       r   )InsertStatementzA statement for insert operations on Table.

    Args:
        table (mysqlx.Table): The Table object.
        *fields: The fields to be inserted.
    c                    s    t t| |d t| | _d S r   )rc   r  r   r   _fieldsr  r{   r   r   r   X  r  zInsertStatement.__init__c                 G   s   | j tt|  | S )zSet the values to be inserted.

        Args:
            *values: The values of the columns to be inserted.

        Returns:
            mysqlx.InsertStatement: InsertStatement object.
        )r   r   r   r   )r   r   r   r   r   r   \  s   	zInsertStatement.valuesc                 C   r   r   )r9   r   rC   r   r   r   r\   h  r   zInsertStatement.execute)r   r   r   r   r   r   r\   r   r   r   r{   r   r  Q  s
    r  c                       sH   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Zdd Z	  Z
S )UpdateStatementzA statement for record update operations on a Table.

    Args:
        table (mysqlx.Table): The Table object.

    .. versionchanged:: 8.0.12
       The ``fields`` parameters were removed.
    c                    s   t t| j|dd i | _d S r   )rc   r  r   r   r   r  r{   r   r   r   z  s   
zUpdateStatement.__init__c                 C   r   )zSets the search condition to filter.

        Args:
            condition (str): Sets the search condition to filter records.

        Returns:
            mysqlx.UpdateStatement: UpdateStatement object.
        r   r   r   r   r   r   ~  r   zUpdateStatement.wherec                 G   r   )zSets the order by criteria.

        Args:
            *clauses: The expression strings defining the order by criteria.

        Returns:
            mysqlx.UpdateStatement: UpdateStatement object.
        r   r   r   r   r   r    r   zUpdateStatement.order_byc                 C   rB   r   r   rC   r   r   r   r     rU   zUpdateStatement.get_update_opsc                 C   r   )a  Updates the column value on records in a table.

        Args:
            field (string): The column name to be updated.
            value (object): The value to be set on the specified column.

        Returns:
            mysqlx.UpdateStatement: UpdateStatement object.
        r   Tr   r   r   r   r   r     s   

zUpdateStatement.setc                 C   r   )zExecute the statement.

        Returns:
            mysqlx.Result: Result object

        Raises:
            ProgrammingError: If condition was not set.
        z!No condition was found for updater   rC   r   r   r   r\     r   zUpdateStatement.execute)r   r   r   r   r   r   r  r   r   r\   r   r   r   r{   r   r  q  s    r  c                       r   )RemoveStatementaE  A statement for document removal from a collection.

    Args:
        collection (mysqlx.Collection): The Collection object.
        condition (str): Sets the search condition to identify the documents
                         to be removed.

    .. versionchanged:: 8.0.12
       The ``condition`` parameter was added.
    c                    s   t t| j||d d S r   )rc   r  r   r   r{   r   r   r     s   
zRemoveStatement.__init__c                 G   r   r  r   r   r   r   r   r     r   zRemoveStatement.sortc                 C   r   )r   z!No condition was found for removerw   r   r9   Zsend_deleterC   r   r   r   r\     r   zRemoveStatement.execute)r   r   r   r   r   r   r\   r   r   r   r{   r   r    s
    
r  c                       r  )
DeleteStatementzA statement that drops a table.

    Args:
        table (mysqlx.Table): The Table object.

    .. versionchanged:: 8.0.12
       The ``condition`` parameter was removed.
    c                    s   t t| j|dd d S r   )rc   r  r   r  r{   r   r   r     r   zDeleteStatement.__init__c                 C   r   )zSets the search condition to filter.

        Args:
            condition (str): Sets the search condition to filter records.

        Returns:
            mysqlx.DeleteStatement: DeleteStatement object.
        r   r   r   r   r   r     r   zDeleteStatement.wherec                 G   r   )zSets the order by criteria.

        Args:
            *clauses: The expression strings defining the order by criteria.

        Returns:
            mysqlx.DeleteStatement: DeleteStatement object.
        r   r   r   r   r   r    r   zDeleteStatement.order_byc                 C   r   )r   z!No condition was found for deleter  rC   r   r   r   r\     r   zDeleteStatement.execute)	r   r   r   r   r   r   r  r\   r   r   r   r{   r   r    s    r  c                       s(   e Zd ZdZ fddZdd Z  ZS )CreateCollectionIndexStatementa)  A statement that creates an index on a collection.

    Args:
        collection (mysqlx.Collection): Collection.
        index_name (string): Index name.
        index_desc (dict): A dictionary containing the fields members that
                           constraints the index to be created. It must have
                           the form as shown in the following::

                               {"fields": [{"field": member_path,
                                            "type": member_type,
                                            "required": member_required,
                                            "collation": collation,
                                            "options": options,
                                            "srid": srid},
                                            # {... more members,
                                            #      repeated as many times
                                            #      as needed}
                                            ],
                                "type": type}
    c                    s8   t t| j|d t|| _|| _| jdg | _d S )N)r@   r   )	rc   r  r   copydeepcopy_index_desc_index_namepop_fields_desc)r   r   Z
index_nameZ
index_descr{   r   r   r   '  s   z'CreateCollectionIndexStatement.__init__c              
   C   s,  | j du rtt| j z0t| j   }t|tr-|d t	dkr,tt| j n|j
t	dkr<tt| j W n ttfyN   tt| j w | jsZtd| jt| jtsdtdi }| j |d< | jj|d< | jjj|d< d| jv r| jd|d< nd	|d< | jd
d|d
< |d
 rtdg |d< | jrtd| jz| jD ]}i }|d|d< |d|d< |dd|d< |dd|d< t|d tstdt|d tstd|d  dkr|d std|d  d	kr
|d dkr
tdd|v r+|d  ds$td|d  |d|d< d|v rD|d  dkr=td|d|d< d|v r]|d  dkrVtd|d|d< |d | qW n ty{ } ztd ||d}~ww | jD ]}|rtd!|q| jd"d#d$|S )%r   NtypezMysqlx.Expr.Expr.Type.IDENTzERequired member 'fields' not found in the given index description: {}z-Required member 'fields' must contain a list.r  r   rE   ZINDEXuniqueFz!Unique indexes are not supported.
constraintzUnidentified fields: {}r   memberrequiredarrayz'Field member 'required' must be Booleanz$Field member 'array' must be BooleanZSPATIALzQField member 'required' must be set to 'True' when index type is set to 'SPATIAL'ZGEOJSONzIIndex 'type' must be set to 'SPATIAL' when field type is set to 'GEOJSON'Z	collationZTEXTzFThe 'collation' member can only be used when field type is set to '{}'optionszIThe 'options' member can only be used when index type is set to 'GEOJSON'ZsridzFThe 'srid' member can only be used when index type is set to 'GEOJSON'z4Required inner member {} not found in constraint: {}zUnidentified inner fields:{}ZmysqlxZcreate_collection_indexT)r  r   ERR_INVALID_INDEX_NAMEr&   r   r   Zget_messager   r}   r
   r  r   AttributeErrorr  r  r   r6   r  rE   r  r   r   	TypeErrorupper
startswithr   KeyErrorr9   Zexecute_nonquery)r   Zparsed_identr   Z
field_descr  errr   r   r   r\   -  s   












*
z&CreateCollectionIndexStatement.execute)r   r   r   r   r   r\   r   r   r   r{   r   r    s    r  )r   )*r   r  r   r   errorsr   r   r   r   	constantsr   Zdbdocr   helpersr   resultr	   protobufr
   r$  objectr   r   r%   r(   r.   r4   r5   ra   r   r   r   r   r   r   r   r  r  r  r  r  r  r   r   r   r   <module>   sH   



i  FA:" #r%9 H(0