B
    knd+                 @   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mZmZmZ yd dlmZ d dlmZ W n& ek
r   G dd dZeZY nX dd	d
ZddddefddZdd ZefddZdS )    )Table)
Expressionfield)		_group_byDeclarationExecNodeOptionsTableSourceNodeOptionsFilterNodeOptionsProjectNodeOptionsAggregateNodeOptionsOrderByNodeOptionsHashJoinNodeOptionsN)ScanNodeOptionsc               @   s(   e Zd ZG dd dZG dd dZdS )DatasetModuleStubc               @   s   e Zd ZdS )zDatasetModuleStub.DatasetN)__name__
__module____qualname__ r   r   1/tmp/pip-unpacked-wheel-i2z0tf32/pyarrow/acero.pyDataset-   s   r   c               @   s   e Zd ZdS )z!DatasetModuleStub.InMemoryDatasetN)r   r   r   r   r   r   r   InMemoryDataset0   s   r   N)r   r   r   r   r   r   r   r   r   r   ,   s   r   Tc             C   sl   t dt| |d}dd | jjD }t |t dt|g}| jd}|d k	rht |t dt|g}|S )Nscan)use_threadsc             S   s   g | ]}t |qS r   )r   ).0fr   r   r   
<listcomp>:   s    z$_dataset_to_decl.<locals>.<listcomp>projectfilter)	r   r   schemanamesfrom_sequencer
   Z_scan_optionsgetr	   )datasetr   declprojectionsZfilter_exprr   r   r   _dataset_to_decl5   s    r%   Fc
                s  t |ttjfs"tdt| t |ttjfsDtdt| i  t |ttfs\|g}xt|D ]\}
}|
 |< qfW i t |ttfs|g}xt|D ]\}
}|
|< qW |j	j
}|j	j
}| dks| dkrg }nX| dks| dkrg }nB| dks| dkrfdd	|D }n| d
kr. fdd	|D }i }x(t|D ]\}
}||kr<|
||< q<W i }x(t|D ]\}
}||krj|
||< qjW t |tjrt||d}ntdt|}t |tjrt||d}ntdt|}|rt| |||||pd|p dd}nt| |||pd|p dd}td|||gd}|rt| dkrtt|}t|}t|}g }g }xt|| D ]\}
}|
t|k r||kr|| || |   }|tdt|
t|| g nx|
|kr||krqvn^|r|
|k r||kr||7 }|r6|
|kr6||kr6||7 }|| |t|
 qvW tdt||}t||g}|j|d}|	tkr|S |	tjkrt|S tddS )a\  
    Perform join of two tables or datasets.

    The result will be an output table with the result of the join operation

    Parameters
    ----------
    join_type : str
        One of supported join types.
    left_operand : Table or Dataset
        The left operand for the join operation.
    left_keys : str or list[str]
        The left key (or keys) on which the join operation should be performed.
    right_operand : Table or Dataset
        The right operand for the join operation.
    right_keys : str or list[str]
        The right key (or keys) on which the join operation should be performed.
    left_suffix : str, default None
        Which suffix to add to left column names. This prevents confusion
        when the columns in left and right operands have colliding names.
    right_suffix : str, default None
        Which suffix to add to the right column names. This prevents confusion
        when the columns in left and right operands have colliding names.
    use_threads : bool, default True
        Whether to use multithreading or not.
    coalesce_keys : bool, default False
        If the duplicated keys should be omitted from one of the sides
        in the join result.
    output_type: Table or InMemoryDataset
        The output type for the exec plan result.

    Returns
    -------
    result_table : Table or InMemoryDataset
    zExpected Table or Dataset, got z	left semiz	left antiz
right semiz
right antiinnerz
left outerc                s   g | ]}| kr|qS r   r   )r   col)right_keys_orderr   r   r      s    z!_perform_join.<locals>.<listcomp>zright outerc                s   g | ]}| kr|qS r   r   )r   r'   )left_keys_orderr   r   r      s    )r   table_source )Zoutput_suffix_for_leftZoutput_suffix_for_rightZhashjoin)optionsinputsz
full outerZcoalescer   zUnsupported output typeN)
isinstancer   dsr   	TypeErrortypetuplelist	enumerater   r   r%   r   r   r   setlenappendr   Z_callZ_fieldr
   r    to_tabler   )Z	join_typeZleft_operandZ	left_keysZright_operandZ
right_keysZleft_suffixZright_suffixr   Zcoalesce_keysoutput_typeidxkeyZleft_columnsZright_columnsZleft_column_keys_indicesZcolnameZright_column_keys_indicesZleft_sourceZright_sourceZ	join_optsr#   Zleft_columns_setZright_columns_setZright_operand_indexZprojected_col_namesr$   r'   Zright_key_indexZ
projectionresult_tabler   )r)   r(   r   _perform_joinJ   s    (









r=   c             C   s2   t t dt| dt dt|dg}|jddS )a  Filter rows of a table based on the provided expression.

    The result will be an output table with only the rows matching
    the provided expression.

    Parameters
    ----------
    table : Table or Dataset
        Table or Dataset that should be filtered.
    expression : Expression
        The expression on which rows should be filtered.

    Returns
    -------
    Table
    r*   )r,   r   T)r   )r   r    r   r	   r8   )tableZ
expressionr#   r   r   r   _filter_table   s    r?   c             K   s   t | tjrt| dd}ntdt| }tdt|f|}t||g}|jdd}|t	kr`|S |tj
krtt
|S tdd S )NT)r   r*   order_byzUnsupported output type)r.   r/   r   r%   r   r   r   r    r8   r   r   r0   )Ztable_or_dataset	sort_keysr9   kwargsZdata_sourcer@   r#   r<   r   r   r   _sort_source  s    

rC   )T)Zpyarrow.libr   Zpyarrow.computer   r   Zpyarrow._aceror   r   r   r   r	   r
   r   r   r   Zpyarrow.datasetr"   r/   Zpyarrow._datasetr   ImportErrorr   r%   r=   r?   rC   r   r   r   r   <module>   s   ,

 .