U
    x^A                     @   st   d dl Z ddlmZ ddlmZ ddlmZ G dd deZedd	 d
D Z	edd	 dD Z
G dd deZdS )    N   )inspect)util)	operatorsc                   @   s   e Zd ZdS )UnevaluatableErrorN)__name__
__module____qualname__ r
   r
   @/tmp/pip-install-dq5v43_d/SQLAlchemy/sqlalchemy/orm/evaluator.pyr      s   r   c                 c   s   | ]}t t|V  qd S Ngetattrr   .0opr
   r
   r   	<genexpr>   s   r   )addmulsubdivmodtruedivltlenegtgeeqc                 c   s   | ]}t t|V  qd S r   r   r   r
   r
   r   r   &   s   )	Zlike_opZ
notlike_opZilike_opZnotilike_opZ
between_opZin_opZnotin_opZendswith_opZ	concat_opc                   @   sf   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )EvaluatorCompilerNc                 C   s
   || _ d S r   )
target_cls)selfr    r
   r
   r   __init__7   s    zEvaluatorCompiler.__init__c                 C   s0   t | d|j d }|s(tdt|j ||S )Nzvisit_%szCannot evaluate %s)r   Z__visit_name__r   typer   )r!   clausemethr
   r
   r   process:   s    zEvaluatorCompiler.processc                 C   s   |  |jS r   )r&   elementr!   r$   r
   r
   r   visit_groupingB   s    z EvaluatorCompiler.visit_groupingc                 C   s   dd S )Nc                 S   s   d S r   r
   objr
   r
   r   <lambda>F       z.EvaluatorCompiler.visit_null.<locals>.<lambda>r
   r(   r
   r
   r   
visit_nullE   s    zEvaluatorCompiler.visit_nullc                 C   s   dd S )Nc                 S   s   dS )NFr
   r*   r
   r
   r   r,   I   r-   z/EvaluatorCompiler.visit_false.<locals>.<lambda>r
   r(   r
   r
   r   visit_falseH   s    zEvaluatorCompiler.visit_falsec                 C   s   dd S )Nc                 S   s   dS )NTr
   r*   r
   r
   r   r,   L   r-   z.EvaluatorCompiler.visit_true.<locals>.<lambda>r
   r(   r
   r
   r   
visit_trueK   s    zEvaluatorCompiler.visit_truec                    s   d|j krD|j d }| jr6t| j|js6td|j |j| j}n8|j}| jrp|t| jjkrpt	
d|  ntd| t|  fddS )Nparentmapperz2Can't evaluate criteria against alternate class %szEvaluating non-mapped column expression '%s' onto ORM instances; this is a deprecated use case.  Please make use of the actual mapped columns in ORM-evaluated UPDATE / DELETE expressions.zCannot evaluate column: %sc                    s    | S r   r
   r*   Zget_corresponding_attrr
   r   r,   i   r-   z0EvaluatorCompiler.visit_column.<locals>.<lambda>)Z_annotationsr    
issubclassclass_r   Z_columntopropertykeyr   Zcolumn_attrsr   warnoperator
attrgetter)r!   r$   r1   r5   r
   r2   r   visit_columnN   s2    

 
zEvaluatorCompiler.visit_columnc                    sX   t t| j|j |jtjkr, fdd}n(|jtjkrF fdd}ntd|j |S )Nc                    s8   d} D ]"}|| }|r dS |p(|d k}q|r4d S dS NFTr
   )r+   Zhas_nullsub_evaluatevalueZ
evaluatorsr
   r   evaluateo   s    z4EvaluatorCompiler.visit_clauselist.<locals>.evaluatec                    s.    D ]$}|| }|s|d kr" d S  dS qdS r:   r
   )r+   r;   r<   r=   r
   r   r>   |   s    z+Cannot evaluate clauselist with operator %s)	listmapr&   Zclausesr7   r   or_and_r   r!   r$   r>   r
   r=   r   visit_clauselistk   s    
z"EvaluatorCompiler.visit_clauselistc                    s   t t| j|j|jg\ |jtjkr< fdd}nLtjkrV fdd}n2t	krp fdd}nt
dt|j|jf |S )Nc                    s    | | kS r   r
   r*   	eval_left
eval_rightr
   r   r>      s    z0EvaluatorCompiler.visit_binary.<locals>.evaluatec                    s    | | kS r   r
   r*   rE   r
   r   r>      s    c                    s6    | }| }|d ks |d kr$d S  | | S r   r
   )r+   Zleft_valZ	right_valrF   rG   r7   r
   r   r>      s
    #Cannot evaluate %s with operator %s)r?   r@   r&   leftrightr7   r   is_Zisnot_straight_opsr   r#   r   rC   r
   rH   r   visit_binary   s     

zEvaluatorCompiler.visit_binaryc                    sD   |  |j |jtjkr( fdd}|S tdt|j|jf d S )Nc                    s    | }|d krd S | S r   r
   )r+   r<   Z
eval_innerr
   r   r>      s    z/EvaluatorCompiler.visit_unary.<locals>.evaluaterI   )r&   r'   r7   r   invr   r#   r   rC   r
   rO   r   visit_unary   s    zEvaluatorCompiler.visit_unaryc                    s"   |j r|   n|j  fddS )Nc                    s    S r   r
   r*   valr
   r   r,      r-   z3EvaluatorCompiler.visit_bindparam.<locals>.<lambda>)callabler<   r(   r
   rR   r   visit_bindparam   s    
z!EvaluatorCompiler.visit_bindparam)N)r   r   r	   r"   r&   r)   r.   r/   r0   r9   rD   rN   rQ   rU   r
   r
   r
   r   r   6   s   
!r   )r7    r   r   Zsqlr   	Exceptionr   setrM   Z_notimplemented_opsobjectr   r
   r
   r
   r   <module>   s   