o
    ˳i                     @  s   d dl mZ d dlmZmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZmZmZmZmZmZmZ d dlmZ er>d dlmZ G dd ded Zd	S )
    )annotations)TYPE_CHECKINGAny)INITIAL_SORT_ORDER_IDUNSORTED_SORT_ORDER	NullOrderSortDirection	SortField	SortOrder)AddSortOrderUpdateAssertDefaultSortOrderIdSetDefaultSortOrderUpdateTableRequirementTableUpdateUpdatesAndRequirementsUpdateTableMetadata)	Transform)Transactionc                      s   e Zd ZU ded< ded< ded< ded< d+d, fddZd-ddZd.ddZd/ddZej	fd0d!d"Z
ej	fd0d#d$Zd1d&d'Zd2d)d*Z  ZS )3UpdateSortOrderr   _transactionz
int | None_last_assigned_order_idbool_case_sensitivezlist[SortField]_fieldsTtransactioncase_sensitivereturnNonec                   s"   t  | g | _|| _d | _d S )N)super__init__r   r   r   )selfr   r   	__class__ R/home/ubuntu/.local/lib/python3.10/site-packages/pyiceberg/table/update/sorting.pyr   +   s   
zUpdateSortOrder.__init__column_namestrintc                 C  s   | j j j|| jdjS )z+Map the column name to the column field id.)
name_or_idr   )r   table_metadataschema
find_fieldr   field_id)r    r%   r#   r#   r$   _column_name_to_id1   s   
z"UpdateSortOrder._column_name_to_id	source_id	transformTransform[Any, Any]	directionr   
null_orderr   c                 C  s   | j t||||d | S )z(Add a sort field to the sort order list.r.   r/   r1   r2   )r   appendr	   )r    r.   r/   r1   r2   r#   r#   r$   _add_sort_field<   s   zUpdateSortOrder._add_sort_fieldc                 C  sN   t }| jjjD ]}t||j}|j| jkr|j  S ||jkr$|jd }q|S )z;Return the last assigned sort order id or create a new one.   )r   r   r)   sort_ordersmaxorder_idfieldsr   )r    new_sort_order_id
sort_orderr#   r#   r$   _reuse_or_create_sort_order_idN   s   


z.UpdateSortOrder._reuse_or_create_sort_order_idsource_column_namec                 C     | j | ||tj|dS )z&Add a sort field with ascending order.r3   )r5   r-   r   ASCr    r>   r/   r2   r#   r#   r$   ascY      zUpdateSortOrder.ascc                 C  r?   )z'Add a sort field with descending order.r3   )r5   r-   r   DESCrA   r#   r#   r$   descd   rC   zUpdateSortOrder.descr
   c                 C  s,   t t| jddu rtS t| jd|  iS )zReturn the sort order.Nr9   )nextiterr   r   r
   r=   )r    r#   r#   r$   _applyo   s   zUpdateSortOrder._applyr   c                 C  s~   |   }d}d}| jjj|jkr)| jj|jdu r)|j| _t|dtddf}nt|jdf}| jjj}t	|df}||fS )z%Apply the pending changes and commit.r#   N)r<   )sort_order_id)default_sort_order_id)
rH   r   r)   rK   r9   sort_order_by_idr   r   r   r   )r    new_sort_orderrequirementsupdates$required_last_assigned_sort_order_idr#   r#   r$   _commitv   s   
zUpdateSortOrder._commit)T)r   r   r   r   r   r   )r%   r&   r   r'   )
r.   r'   r/   r0   r1   r   r2   r   r   r   )r   r'   )r>   r&   r/   r0   r2   r   r   r   )r   r
   )r   r   )__name__
__module____qualname____annotations__r   r-   r5   r=   r   
NULLS_LASTrB   rE   rH   rQ   __classcell__r#   r#   r!   r$   r   %   s   
 



r   N)
__future__r   typingr   r   pyiceberg.table.sortingr   r   r   r   r	   r
   pyiceberg.table.updater   r   r   r   r   r   r   pyiceberg.transformsr   pyiceberg.tabler   r   r#   r#   r#   r$   <module>   s    $	