
    H(                         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
 ddl	mZ  G d	 d
      Z G d de      Z G d de      Z G d de      Zy)z1The different TableReader options for the BQ CLI.    )absolute_import)division)print_function)Optional)	discovery)bq_error)bq_id_utilsc            
           e Zd ZdZ	 	 	 ddee   dee   dee   fdZ	 ddee   dee   dee   fdZd Z	d	efd
Z
d	efdZd	efdZ	 	 ddee   dee   dee   dee   fdZy)_TableReaderzBase class that defines the TableReader interface.

  _TableReaders provide a way to read paginated rows and schemas from a table.
  N	start_rowmax_rowsselected_fieldsc                 4    | j                  |||      \  }}|S )ag  Read at most max_rows rows from a table.

    Args:
      start_row: first row to return.
      max_rows: maximum number of rows to return.
      selected_fields: a subset of fields to return.

    Raises:
      BigqueryInterfaceError: when bigquery returns something unexpected.

    Returns:
      list of rows, each of which is a list of field values.
    )r   r   r   )ReadSchemaAndRows)selfr   r   r   _rowss         #platform/bq/clients/table_reader.pyReadRowsz_TableReader.ReadRows   s-    & &&' ' IQ
 K    c                    |t        d      |t        d      d}g }i }t        |      |k  r|t        |      z
  }t        | d      st        d      | j                  rt        | j                  |      }| j                  |rdn||||      \  }}}	|s|	r|	j                  dg       }|D ](  }
|j                  | j                  ||
             |dz  }* |r|s	 ||fS t        |      |k  r||fS )	a  Read at most max_rows rows from a table and the schema.

    Args:
      start_row: first row to read.
      max_rows: maximum number of rows to return.
      selected_fields: a subset of fields to return.

    Raises:
      BigqueryInterfaceError: when bigquery returns something unexpected.
      ValueError: when start_row is None.
      ValueError: when max_rows is None.

    Returns:
      A tuple where the first item is the list of fields and the
      second item a list of rows.
    Nzstart_row is requiredzmax_rows is requiredmax_rows_per_requestz9Subclass must have max_rows_per_request instance variable)r   
page_tokenr   fields   )

ValueErrorlenhasattrNotImplementedErrorr   min_ReadOnePagegetappend_ConvertFromFV)r   r   r   r   r   r   schemarows_to_read	more_rowscurrent_schemarows              r   r   z_TableReader.ReadSchemaAndRows0   s)   , .//-..JDF
d)h
D	)lT12!G
 	
 
	"	"444lC040A0A$))	 1B 1-y*n ##Hb1#D''45Q	  yD>+ d)h
* D>r   c                    |sy|j                  dg       D cg c]  }|j                  dd       }}g }t        ||      D ]1  \  }}d|vrt        j                  d      |d   j	                         dk(  r|j                  dg       }|j                  d	d
      j	                         dk(  r@|j                  |D 	cg c]$  }	| j                  ||	j                  dd            & c}	       |j                  | j                  ||             |j                  d	d
      j	                         dk(  r1|j                  |D 	cg c]  }	|	j                  dd       c}	       !|j                  |       4 |S c c}w c c}	w c c}	w )z;Converts from FV format to possibly nested lists of values.Nfv typez'Invalid response: missing type propertyRECORDr   modeNULLABLEREPEATED)r"   zipr   BigqueryCommunicationErrorupperr#   r$   )
r   r%   r)   entryvaluesresultfieldr,   	subfieldssubvalues
             r   r$   z_TableReader._ConvertFromFVd   sq   .1ggc2.>?.>UeiiR .>F?F'q	u	115
 	
 
v			(	*IIh+	99VZ(..0J>
--( !!)X\\#r-BC  --++Iq9
:99VZ(..0J>Q?Qx||C,Q?@ 	a- (. M3 @ @s   E8;)E=
 F
returnc                 "    | j                         S N_GetPrintContextr   s    r   __str__z_TableReader.__str__         ""r   c                 "    | j                         S r>   r?   rA   s    r   __repr__z_TableReader.__repr__   rC   r   c                     t        d      )z'Returns context for what is being read.z'Subclass must implement GetPrintContextr   rA   s    r   r@   z_TableReader._GetPrintContext   s    
G
HHr   r   c                     t        d      )a  Read one page of data, up to max_rows rows.

    Assumes that the table is ready for reading. Will signal an error otherwise.

    Args:
      start_row: first row to read.
      max_rows: maximum number of rows to return.
      page_token: Optional. current page token.
      selected_fields: a subset of field to return.

    Returns:
      tuple of:
      rows: the actual rows of the table, in f,v format.
      page_token: the page token of the next page of results.
      schema: the schema of the table.
    z$Subclass must implement _ReadOnePagerG   )r   r   r   r   r   s        r   r!   z_TableReader._ReadOnePage   s    . D
EEr   )r   NNr>   NN)__name__
__module____qualname____doc__r   intstrr   r   r$   rB   rE   r@   r!    r   r   r   r      s     "# $'+	#   }	< (,	2#2 2  }	2h>#s ## #I I #''+F#F F 3-	F
  }Fr   r   c            
           e Zd ZdZdej
                  dedej                  j                  fdZ
defdZ	 	 dd	ee   d
ee   dee   dee   fdZy)TableTableReaderz&A TableReader that reads from a table.local_apiclientr   	table_refc                 .    || _         || _        || _        y r>   )rT   r   
_apiclient)r   rS   r   rT   s       r   __init__zTableTableReader.__init__   s     DN 4D%DOr   r<   c                     | j                   S r>   )rT   rA   s    r   r@   z!TableTableReader._GetPrintContext   s    >>#r   Nr   r   r   r   c                    t        | j                        }||d<   |r||d<   n||d<   d }|||d<   |8 | j                  j                         j                  di |j                         }|j                  dd       }|j                  dg       }t        | j                        }|||d<    | j                  j                         j                  di |j                         }|j                  di       }	|||	fS )N
maxResults	pageToken
startIndexselectedFieldsr   r%   rP   )dictrT   rV   	tabledatalistexecuter"   tables)
r   r   r   r   r   kwdsdatar   
table_infor%   s
             r   r!   zTableTableReader._ReadOnePage   s     D!D$d;$d<D".d|-T__&&(--55==?d+t,J88FBDD".d-'')--55==?J^^Hb)F*f%%r   rI   )rJ   rK   rL   rM   r   ResourcerN   r	   ApiClientHelperTableReferencerW   rO   r@   r   r!   rP   r   r   rR   rR      s    .& ))&  & ,,;;	&$ $ #''+&#& & 3-	&
  }&r   rR   c            
           e Zd ZdZdej
                  dedej                  j                  fdZ
defdZ	 	 dd	ee   d
ee   dee   dee   fdZy)JobTableReaderz.A TableReader that reads from a completed job.rS   r   job_refc                 .    || _         || _        || _        y r>   )rk   r   rV   )r   rS   r   rk   s       r   rW   zJobTableReader.__init__   s     DL 4D%DOr   r<   c                     | j                   S r>   rk   rA   s    r   r@   zJobTableReader._GetPrintContext       <<!r   Nr   r   r   r   c                 |   t        | j                        }||d<   d|d<   |r||d<   n||d<    | j                  j                         j                  di |j                         }|d   st        j                  d| d      |j                  dd       }|j                  d	d       }|j                  d
g       }|||fS )NrZ   r   	timeoutMsr[   r\   jobCompleteJob  is not doner%   r   rP   )	r^   rk   rV   jobsgetQueryResultsra   r   BigqueryErrorr"   )	r   r   r   r   r   rc   rd   r%   r   s	            r   r!   zJobTableReader._ReadOnePage   s     D!DD$d;$d<14??!119D9AACD""4#ABB+t,JXXh%F88FBD*f%%r   rI   rJ   rK   rL   rM   r   rf   rN   r	   rg   JobReferencerW   rO   r@   r   r!   rP   r   r   rj   rj      s    6& ))&  & **77	&" " #''+&#& & 3-	&
  }&r   rj   c            
           e Zd ZdZdej
                  dedej                  j                  fdZ
defdZ	 	 dd	ee   d
ee   dee   dee   fdZy)QueryTableReaderz0A TableReader that reads from a completed query.rS   r   rk   c                 <    || _         || _        || _        || _        y r>   )rk   r   rV   _results)r   rS   r   rk   resultss        r   rW   zQueryTableReader.__init__   s!     DL 4D%DODMr   r<   c                     | j                   S r>   rn   rA   s    r   r@   z!QueryTableReader._GetPrintContext  ro   r   Nr   r   r   r   c                    | j                   rt        | j                         ni }||d<   d|d<   |r||d<   n||d<   | j                  d   st        j                  d| d      | j                  j                  d	d       }| j                  j                  d
d       }| j                  j                  dd       }|L|Jt        |      dk(  r<| j                  j                  dd       }	| j                  j                  d	g       }
d }n=|||t        |      t        t        |      ||z         k\  r| j                  j                  dd       }t        |      t        |      k  r|t        j                  d| d      | j                  j                  dd       }	| j                  j                  d	g       }
n | j                  j                         j                  di |j                         }|d   st        j                  d| d      |j                  dd       }|j                  dd       }	|j                  d	g       }
|
||	fS )NrZ   r   rq   r[   r\   rr   rs   rt   r   	totalRowsjobReferencer%   zSynchronous query z< did not return all rows, yet it did not return a page tokenrP   )rk   r^   r}   r   rw   r"   rN   r   r    rV   ru   rv   ra   )r   r   r   r   r   rc   result_rows
total_rowsjob_referencer%   r   rd   s               r   r!   zQueryTableReader._ReadOnePage  s    "&42D!DD$d;$d<=='""4#ABB --##FD1K"";5JMM%%nd;M3z?a#7 }}  40f]]vr*dj#!C
OY5I JJ==$$[$7j	[	C
O	+
0B$$&*-
 	
 }}  40f]]vr*d3T__!!#33;d;CCEd- $$T%CDD88K.jxx$'fXXfb!d*f%%r   rI   rx   rP   r   r   r{   r{      s    8
 ))
  
 **77	
" " #''+3&#3& 3& 3-	3&
  }3&r   r{   N)rM   
__future__r   r   r   typingr   googleapiclientr   utilsr   r	   r   rR   rj   r{   rP   r   r   <module>r      sT    7 &  %  %  TF TFn+&| +&\%&\ %&PE&| E&r   