o
    ˳i!                     @  s  U d dl mZ d dlmZmZmZ d dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ eeB eB eB eB eB eB eB eB eB Z de!d< edZ"G dd dee	e" Z#G dd de#e Z$G dd de#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*ee)e*B eddf 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Z0G d*d+ d+eZ1ee.e/B e0B e1B ed,df Z2G d-d. d.eZ3G d/d0 d0eZ4d1S )2    )annotations)datedatetimetime)Decimal)	AnnotatedGenericLiteral	TypeAliasTypeVar)UUID)Fieldmodel_validator)ErrorResponseMessage)BooleanExpressionSerializableBooleanExpression)
FileFormat)IcebergBaseModelr
   PrimitiveTypeValueVc                   @  sT   e Zd ZU dZeedZded< eedZded< e	dddddZ
dddZdS )KeyValueMapzBMap serialized as parallel key/value arrays for column statistics.default_factoryz	list[int]keyszlist[V]valuesaftermodereturnKeyValueMap[V]c                 C  s8   t | jt | jkrtdt | j dt | j | S )Nz'keys and values must have same length: z != )lenr   r   
ValueErrorself r$   X/home/ubuntu/.local/lib/python3.10/site-packages/pyiceberg/catalog/rest/scan_planning.py_validate_lengths_match+   s    z#KeyValueMap._validate_lengths_matchdict[int, V]c                 C  s   t t| j| jddS )z0Convert to dictionary mapping field ID to value.T)strict)dictzipr   r   r"   r$   r$   r%   to_dict1   s   zKeyValueMap.to_dictN)r   r   )r   r'   )__name__
__module____qualname____doc__r   listr   __annotations__r   r   r&   r+   r$   r$   r$   r%   r   %   s   
 r   c                   @     e Zd ZdZdS )CountMapzMap of field IDs to counts.Nr,   r-   r.   r/   r$   r$   r$   r%   r3   6       r3   c                   @  r2   )ValueMapz>Map of field IDs to primitive values (for lower/upper bounds).Nr4   r$   r$   r$   r%   r6   :   r5   r6   c                   @  s6   e Zd ZU dZeddZded< eedZded< d	S )
StorageCredentialz/Storage credential for accessing content files.z2Storage location prefix this credential applies to)descriptionstrprefixr   zdict[str, str]configN)	r,   r-   r.   r/   r   r:   r1   r)   r;   r$   r$   r$   r%   r7   >   s   
 r7   c                   @  s   e Zd ZU dZeddZded< eedZded< d	ed
< eddZ	ded< eddZ
ded< eddZded< eddZded< edddZded< edddZded< edddZded< dS ) RESTContentFilez3Base model for data and delete files from REST API.zspec-idaliasintspec_idr   zlist[PrimitiveTypeValue]	partitionz7Literal['data', 'position-deletes', 'equality-deletes']contentz	file-pathr9   	file_pathzfile-formatr   file_formatzfile-size-in-bytesfile_size_in_byteszrecord-countrecord_countzkey-metadataNr>   default
str | Nonekey_metadatazsplit-offsetslist[int] | Nonesplit_offsetszsort-order-id
int | Nonesort_order_id)r,   r-   r.   r/   r   r@   r1   r0   rA   rC   rD   rE   rF   rJ   rL   rN   r$   r$   r$   r%   r<   E   s   
 r<   c                   @  s   e Zd ZU dZeddZded< edddZd	ed
< edddZded< edddZ	ded< edddZ
ded< edddZded< edddZded< edddZded< dS )RESTDataFilezData file from REST API.datarH   zLiteral['data']rB   zfirst-row-idNrG   rM   first_row_idzcolumn-sizeszCountMap | Nonecolumn_sizeszvalue-countsvalue_countsznull-value-countsnull_value_countsznan-value-countsnan_value_countszlower-boundszValueMap | Nonelower_boundszupper-boundsupper_bounds)r,   r-   r.   r/   r   rB   r1   rR   rS   rT   rU   rV   rW   rX   r$   r$   r$   r%   rO   T   s   
 rO   c                   @  s`   e Zd ZU dZeddZded< edddZd	ed
< edddZded< edddZ	ded< dS )RESTPositionDeleteFilez#Position delete file from REST API.zposition-deletesrQ   zLiteral['position-deletes']rB   zreferenced-data-fileNrG   rI   referenced_data_filezcontent-offsetrM   content_offsetzcontent-size-in-bytescontent_size_in_bytes)
r,   r-   r.   r/   r   rB   r1   rZ   r[   r\   r$   r$   r$   r%   rY   a   s   
 rY   c                   @  s8   e Zd ZU dZeddZded< edddZd	ed
< dS )RESTEqualityDeleteFilez#Equality delete file from REST API.zequality-deletesrQ   zLiteral['equality-deletes']rB   zequality-idsNrG   rK   equality_ids)r,   r-   r.   r/   r   rB   r1   r^   r$   r$   r$   r%   r]   j   s   
 r]   rB   )discriminatorc                   @  sL   e Zd ZU dZeddZded< edddZd	ed
< edddZded< dS )RESTFileScanTaskz&A file scan task from the REST server.z	data-filer=   rO   	data_filezdelete-file-referencesNrG   rK   delete_file_referenceszresidual-filterzBooleanExpression | Noneresidual_filter)	r,   r-   r.   r/   r   ra   r1   rb   rc   r$   r$   r$   r%   r`   x   s
   
 r`   c                   @  sb   e Zd ZU dZededZded< ededZded< ed	edZ	d
ed< e
dddddZdS )	ScanTasksz0Container for scan tasks returned by the server.zdelete-files)r>   r   zlist[RESTDeleteFile]delete_fileszfile-scan-taskszlist[RESTFileScanTask]file_scan_tasksz
plan-tasksz	list[str]
plan_tasksr   r   r   c                 C  sh   t | jd }| jD ]}|jpg D ]}|dk s||kr&td| d| dqq
| jr2| js2td| S )N   r   zInvalid delete file reference: z (valid range: 0-)z\Invalid response: deleteFiles should only be returned with fileScanTasks that reference them)r    re   rf   rb   r!   )r#   max_idxtaskidxr$   r$   r%    _validate_delete_file_references   s   
z*ScanTasks._validate_delete_file_referencesN)r   rd   )r,   r-   r.   r/   r   r0   re   r1   rf   rg   r   rm   r$   r$   r$   r%   rd      s   
 rd   c                   @  sF   e Zd ZU dZdZded< edddZded	< ed
ddZded< dS )PlanCompletedzCompleted scan plan result.	completedzLiteral['completed']statusplan-idNrG   rI   plan_idzstorage-credentialszlist[StorageCredential] | Nonestorage_credentials)	r,   r-   r.   r/   rp   r1   r   rr   rs   r$   r$   r$   r%   rn      s
   
 rn   c                   @  s2   e Zd ZU dZdZded< edddZded	< dS )
PlanSubmittedz)Scan plan submitted, poll for completion.	submittedzLiteral['submitted']rp   rq   NrG   rI   rr   )r,   r-   r.   r/   rp   r1   r   rr   r$   r$   r$   r%   rt      s   
 rt   c                   @  s   e Zd ZU dZdZded< dS )PlanCancelledzPlanning was cancelled.	cancelledzLiteral['cancelled']rp   Nr,   r-   r.   r/   rp   r1   r$   r$   r$   r%   rv      s   
 rv   c                   @  s&   e Zd ZU dZdZded< ded< dS )
PlanFailedzPlanning failed with error.failedzLiteral['failed']rp   r   errorNrx   r$   r$   r$   r%   ry      s   
 ry   rp   c                   @  s   e Zd ZU dZedddZded< eddZded	< eddZd
ed< edddZ	ded< edddZ
ded< edddZded< edddZded< edddZded< edddZded< eddd ddZdS )!PlanTableScanRequestz&Request body for planning a REST scan.zsnapshot-idNrG   rM   snapshot_idrQ   zlist[str] | Noneselectz$SerializableBooleanExpression | Nonefilterzcase-sensitiveTboolcase_sensitivezuse-snapshot-schemaFuse_snapshot_schemazstart-snapshot-idstart_snapshot_idzend-snapshot-idend_snapshot_idzstats-fieldsstats_fieldszmin-rows-requestedmin_rows_requestedr   r   r   c                 C  s<   | j d ur| jd u rtd| jd ur| j d urtd| S )Nz?end-snapshot-id is required when start-snapshot-id is specifiedz5Cannot specify both snapshot-id and start-snapshot-id)r   r   r!   r}   r"   r$   r$   r%   _validate_snapshot_fields   s
   z.PlanTableScanRequest._validate_snapshot_fields)r   r|   )r,   r-   r.   r/   r   r}   r1   r~   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   r|      s   
 r|   c                   @  s$   e Zd ZU dZeddZded< dS )FetchScanTasksRequestz.Request body for fetching scan tasks endpoint.z	plan-taskr=   r9   	plan_taskN)r,   r-   r.   r/   r   r   r1   r$   r$   r$   r%   r      s   
 r   N)5
__future__r   r   r   r   decimalr   typingr   r   r	   r
   r   uuidr   pydanticr   r   pyiceberg.catalog.rest.responser   pyiceberg.expressionsr   r   pyiceberg.manifestr   pyiceberg.typedefr   r   r?   floatr9   bytesr   r1   r   r   r3   r6   r7   r<   rO   rY   r]   RESTDeleteFiler`   rd   rn   rt   rv   ry   PlanningResponser|   r   r$   r$   r$   r%   <module>   sL   0	