o
    Rc                      @   s   d dl 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
 d
e
ZG dd dejZe Zedd dD Zedd dD Zejdd ejdd iZedd dD ZG dd deZdS )    N   )inspect)util)and_)	operators)Integer)Numericc                   @   s   e Zd ZdS )UnevaluatableErrorN)__name__
__module____qualname__ r   r   :D:\Flask\env\Lib\site-packages\sqlalchemy/orm/evaluator.pyr	      s    r	   c                   @   s   e Zd Zdd Zdd ZdS )	_NoObjectc                 O      d S Nr   selfargkwr   r   r   operate      z_NoObject.operatec                 O   r   r   r   r   r   r   r   reverse_operate   r   z_NoObject.reverse_operateN)r
   r   r   r   r   r   r   r   r   r      s    r   c                 c       | ]}t t|V  qd S r   getattrr   .0opr   r   r   	<genexpr>    
    
r   )ltlenegtgeeqc                 c   r   r   r   r   r   r   r   r   ,   r    )addmulsubdivmodtruedivc                 C   s   | t ur| |v S d S r   
_NO_OBJECTabr   r   r   <lambda>9       r2   c                 C   s   | t ur| |vS d S r   r-   r/   r   r   r   r2   ;   r3   c                 c   r   r   r   r   r   r   r   r   ?   r    )Zlike_opZnot_like_opZilike_opZnot_ilike_opZstartswith_opZ
between_opZendswith_opc                   @   sn   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d ZdS )EvaluatorCompilerNc                 C   s
   || _ d S r   )
target_cls)r   r5   r   r   r   __init__N      
zEvaluatorCompiler.__init__c                 G   sR   t |dkrt| }n|r|d }t| d|j d }|s%tdt|j ||S )N   r   zvisit_%szCannot evaluate %s)lenr   r   Z__visit_name__r	   typer
   )r   clausesclausemethr   r   r   processQ   s   
zEvaluatorCompiler.processc                 C   s   |  |jS r   )r>   elementr   r<   r   r   r   visit_grouping^   s   z EvaluatorCompiler.visit_groupingc                 C      dd S )Nc                 S   r   r   r   objr   r   r   r2   b       z.EvaluatorCompiler.visit_null.<locals>.<lambda>r   r@   r   r   r   
visit_nulla      zEvaluatorCompiler.visit_nullc                 C   rB   )Nc                 S      dS )NFr   rC   r   r   r   r2   e   rE   z/EvaluatorCompiler.visit_false.<locals>.<lambda>r   r@   r   r   r   visit_falsed   rG   zEvaluatorCompiler.visit_falsec                 C   rB   )Nc                 S   rH   )NTr   rC   r   r   r   r2   h   rE   z.EvaluatorCompiler.visit_true.<locals>.<lambda>r   r@   r   r   r   
visit_trueg   rG   zEvaluatorCompiler.visit_truec                    s   d|j v r"|j d }| jrt| j|jstd|j |j| j}n|j}| jr8|t| jjv r8t	
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   | d ur | S t S r   r-   rC   Zget_corresponding_attrr   r   r2      s   
z0EvaluatorCompiler.visit_column.<locals>.<lambda>)Z_annotationsr5   
issubclassclass_r	   Z_columntopropertykeyr   Zcolumn_attrsr   warnoperator
attrgetter)r   r<   rK   rO   r   rL   r   visit_columnj   s2   



zEvaluatorCompiler.visit_columnc                 C   s
   |  |S r   )visit_clauselistr@   r   r   r   visit_tuple   r7   zEvaluatorCompiler.visit_tuplec                    st   t t| j|j |jtju r fdd}|S |jtju r% fdd}|S |jtju r3 fdd}|S t	d|j )Nc                    s8   d} D ]}|| }|r dS |p|d u }q|rd S dS NFTr   )rD   Zhas_nullsub_evaluatevalueZ
evaluatorsr   r   evaluate   s   z4EvaluatorCompiler.visit_clauselist.<locals>.evaluatec                    s6    D ]}|| }|s|d u s|t u r d S  dS qdS rV   r-   )rD   rW   rX   rY   r   r   rZ      s   c                    s>   g } D ]}|| }|d u s|t u r d S || qt|S r   )r.   appendtuple)rD   valuesrW   rX   rY   r   r   rZ      s   z+Cannot evaluate clauselist with operator %s)
listmapr>   r;   rQ   r   or_r   Zcomma_opr	   r   r<   rZ   r   rY   r   rT      s   &z"EvaluatorCompiler.visit_clauselistc                    s"  t t| j|j|jg\ |jtju r fdd}|S tju r- fdd}|S tj	u r; fdd}|S t
v rI fdd}|S tv rw|jjjttfvs_|jjjttfvrmtdj|jj|jjf  fdd}|S tv r fdd}|S td	t|j|jf )
Nc                    s    | | kS r   r   rC   	eval_left
eval_rightr   r   rZ         z0EvaluatorCompiler.visit_binary.<locals>.evaluatec                    s    | | kS r   r   rC   rb   r   r   rZ      re   c                    s    | |  S r   r   rC   rb   r   r   rZ      re   c                    s2    | }| }|d u s|d u rd S t  ||S r   )_extended_opsrD   Zleft_valZ	right_valrc   rd   rQ   r   r   rZ      s
   z7Cannot evaluate math operator "%s" for datatypes %s, %sc                    6    | }| }|d u s|d u rd S  | | S r   r   rg   rh   r   r   rZ      
   c                    ri   r   r   rg   rh   r   r   rZ      rj   #Cannot evaluate %s with operator %s)r^   r_   r>   leftrightrQ   r   is_is_notZ	concat_oprf   _math_only_straight_opsr:   Z_type_affinityr   r   r	   r
   _straight_opsra   r   rh   r   visit_binary   sP   
;
6
1,zEvaluatorCompiler.visit_binaryc                    s@   |  |j |jtju r fdd}|S tdt|j|jf )Nc                    s    | }|d u r
d S | S r   r   )rD   rX   Z
eval_innerr   r   rZ     s   z/EvaluatorCompiler.visit_unary.<locals>.evaluaterk   )r>   r?   rQ   r   invr	   r:   r
   ra   r   rs   r   visit_unary   s   zEvaluatorCompiler.visit_unaryc                    s"   |j r|   n|j  fddS )Nc                    s    S r   r   rC   valr   r   r2     rE   z3EvaluatorCompiler.visit_bindparam.<locals>.<lambda>)callablerX   r@   r   rv   r   visit_bindparam  s   
z!EvaluatorCompiler.visit_bindparamr   )r
   r   r   r6   r>   rA   rF   rI   rJ   rS   rU   rT   rr   ru   ry   r   r   r   r   r4   M   s    
!,Dr4   )rQ    r   r   sqlr   r   Zsql.sqltypesr   r   	Exceptionr	   ZColumnOperatorsr   r.   setrq   rp   Zin_opZ	not_in_oprf   Z_notimplemented_opsobjectr4   r   r   r   r   <module>   s0   
