U
    >iz                     @  s`   d 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 G dd	 d	e
Zd
S )z=Helpers for batch requests to the Google Cloud Firestore API.    )annotations)gapic_v1)retry)_helpers)	BaseBatch)BatchWriteResponsec                      sR   e Zd ZdZdd fddZejjdfddd	d
ddZdddddZ	  Z
S )BulkWriteBatcha  Accumulate write operations to be sent in a batch. Use this over
    `WriteBatch` for higher volumes (e.g., via `BulkWriter`) and when the order
    of operations within a given batch is unimportant.

    Because the order in which individual write operations are applied to the database
    is not guaranteed, `batch_write` RPCs can never contain multiple operations
    to the same document. If calling code detects a second write operation to a
    known document reference, it should first cut off the previous batch and
    send it, then create a new batch starting with the latest write operation.
    In practice, the [Async]BulkWriter classes handle this.

    This has the same set of methods for write operations that
    :class:`~google.cloud.firestore_v1.document.DocumentReference` does,
    e.g. :meth:`~google.cloud.firestore_v1.document.DocumentReference.create`.

    Args:
        client (:class:`~google.cloud.firestore_v1.client.Client`):
            The client that created this batch.
    None)returnc                   s   t t| j|d d S )N)client)superr   __init__)selfr   	__class__ H/tmp/pip-unpacked-wheel-599y42ri/google/cloud/firestore_v1/bulk_batch.pyr   .   s    zBulkWriteBatch.__init__Nzretries.Retry | object | Nonezfloat | Noner   )r   timeoutr
   c                 C  sH   |  ||\}}| jj}|jf || jjd|}g | _t|j| _|S )a  Writes the changes accumulated in this batch.

        Write operations are not guaranteed to be applied in order and must not
        contain multiple writes to any given document. Preferred over `commit`
        for performance reasons if these conditions are acceptable.

        Args:
            retry (google.api_core.retry.Retry): Designation of what errors, if any,
                should be retried.  Defaults to a system-specified policy.
            timeout (float): The timeout for this request.  Defaults to a
                system-specified value.

        Returns:
            :class:`google.cloud.firestore_v1.write.BatchWriteResponse`:
            Container holding the write results corresponding to the changes
            committed, returned in the same order as the changes were applied to
            this batch. An individual write result contains an ``update_time``
            field.
        )requestmetadata)_prep_commit_clientZ_firestore_apiZbatch_writeZ_rpc_metadata
_write_pbslistZwrite_results)r   r   r   r   kwargsZ_apiZsave_responser   r   r   commit1   s    zBulkWriteBatch.commit)r   r   c                 C  s&   | j j| jd d}t||}||fS )N)ZdatabaseZwriteslabels)r   Z_database_stringr   r   Zmake_retry_timeout_kwargs)r   r   r   r   r   r   r   r   r   W   s    zBulkWriteBatch._prep_commit)__name__
__module____qualname____doc__r   r   methodDEFAULTr   r   __classcell__r   r   r   r   r      s   &r   N)r    
__future__r   Zgoogle.api_corer   r   retriesZgoogle.cloud.firestore_v1r   Z$google.cloud.firestore_v1.base_batchr   Z)google.cloud.firestore_v1.types.firestorer   r   r   r   r   r   <module>   s   