U
    ø×cc  ã                   @   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   ú</tmp/pip-unpacked-wheel-8u86ls_i/sqlalchemy/orm/evaluator.pyr	      s   r	   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	_NoObjectc                 O   s   d S ©Nr   ©ÚselfÚargÚkwr   r   r   Úoperate   s    z_NoObject.operatec                 O   s   d S r   r   r   r   r   r   Úreverse_operate   s    z_NoObject.reverse_operateN)r
   r   r   r   r   r   r   r   r   r      s   r   c                 c   s   | ]}t t|ƒV  qd S r   ©Úgetattrr   ©Ú.0Úopr   r   r   Ú	<genexpr>    s   ÿr   )ÚltÚleÚneÚgtÚgeÚeqc                 c   s   | ]}t t|ƒV  qd S r   r   r   r   r   r   r   ,   s   ÿ)ÚaddÚmulÚsubÚdivÚmodÚtruedivc                 C   s   | t k	r| |kS d S r   ©Ú
_NO_OBJECT©ÚaÚbr   r   r   Ú<lambda>9   ó    r.   c                 C   s   | t k	r| |kS d S r   r)   r+   r   r   r   r.   ;   r/   c                 c   s   | ]}t t|ƒV  qd S r   r   r   r   r   r   r   ?   s   ÿ)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   r1   r   r   r   Ú__init__N   s    zEvaluatorCompiler.__init__c                 G   sR   t |ƒdkrt|Ž }n|r"|d }t| d|j d ƒ}|sJt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   )r9   Úelement©r   r7   r   r   r   Úvisit_grouping^   s    z EvaluatorCompiler.visit_groupingc                 C   s   dd„ S )Nc                 S   s   d S r   r   ©Úobjr   r   r   r.   b   r/   z.EvaluatorCompiler.visit_null.<locals>.<lambda>r   r;   r   r   r   Ú
visit_nulla   s    zEvaluatorCompiler.visit_nullc                 C   s   dd„ S )Nc                 S   s   dS )NFr   r=   r   r   r   r.   e   r/   z/EvaluatorCompiler.visit_false.<locals>.<lambda>r   r;   r   r   r   Úvisit_falsed   s    zEvaluatorCompiler.visit_falsec                 C   s   dd„ S )Nc                 S   s   dS )NTr   r=   r   r   r   r.   h   r/   z.EvaluatorCompiler.visit_true.<locals>.<lambda>r   r;   r   r   r   Ú
visit_trueg   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 %sz»Evaluating 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 k	rˆ | ƒS t S r   r)   r=   ©Zget_corresponding_attrr   r   r.   †   s    ÿ
z0EvaluatorCompiler.visit_column.<locals>.<lambda>)Z_annotationsr1   Ú
issubclassÚclass_r	   Z_columntopropertyÚkeyr   Zcolumn_attrsr   ÚwarnÚoperatorÚ
attrgetter)r   r7   rB   rF   r   rC   r   Úvisit_columnj   s4    

 ÿÿÿÿþýÿ

ÿzEvaluatorCompiler.visit_columnc                 C   s
   |   |¡S r   )Úvisit_clauselistr;   r   r   r   Úvisit_tuple‹   s    zEvaluatorCompiler.visit_tuplec                    sr   t t| j|jƒƒ‰ |jtjkr,‡ fdd„}nB|jtjkrF‡ fdd„}n(|jtjkr`‡ 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   Úevaluate’   s    z4EvaluatorCompiler.visit_clauselist.<locals>.evaluatec                    s6   ˆ D ],}|| ƒ}|s|d ks$|t kr* d S  dS qdS rM   r)   )r>   rN   rO   rP   r   r   rQ   Ÿ   s    c                    s>   g }ˆ D ],}|| ƒ}|d ks$|t kr* d S | |¡ qt|ƒS r   )r*   ÚappendÚtuple)r>   ÚvaluesrN   rO   rP   r   r   rQ   ª   s    z+Cannot evaluate clauselist with operator %s)
ÚlistÚmapr9   r6   rH   r   Úor_r   Zcomma_opr	   ©r   r7   rQ   r   rP   r   rK   Ž   s    	
ÿz"EvaluatorCompiler.visit_clauselistc                    s  t t| j|j|jgƒƒ\‰ ‰|j‰ˆtjkr<‡ ‡fdd„}nÚˆtjkrV‡ ‡fdd„}nÀˆtj	krp‡ ‡fdd„}n¦ˆt
krŠ‡ ‡‡fdd„}nŒˆtkrä|jjjttfks¶|jjjttfkrÒtdˆj|jj|jjf ƒ‚‡ ‡‡fdd„}n2ˆtkrþ‡ ‡‡fdd„}ntd	t|ƒj|jf ƒ‚|S )
Nc                    s   ˆ | ƒˆ| ƒkS r   r   r=   ©Ú	eval_leftÚ
eval_rightr   r   rQ   Á   s    z0EvaluatorCompiler.visit_binary.<locals>.evaluatec                    s   ˆ | ƒˆ| ƒkS r   r   r=   rY   r   r   rQ   Æ   s    c                    s   ˆ | ƒˆ| ƒ S r   r   r=   rY   r   r   rQ   Ë   s    c                    s2   ˆ | ƒ}ˆ| ƒ}|d ks |d kr$d S t ˆ ||ƒS r   )Ú_extended_ops©r>   Zleft_valZ	right_val©rZ   r[   rH   r   r   rQ   Ð   s
    z7Cannot evaluate math operator "%s" for datatypes %s, %sc                    s6   ˆ | ƒ}ˆ| ƒ}|d ks |d kr$d S ˆˆ | ƒˆ| ƒƒS r   r   r]   r^   r   r   rQ   ç   s
    c                    s6   ˆ | ƒ}ˆ| ƒ}|d ks |d kr$d S ˆˆ | ƒˆ| ƒƒS r   r   r]   r^   r   r   rQ   ð   s
    ú#Cannot evaluate %s with operator %s)rU   rV   r9   ÚleftÚrightrH   r   Úis_Úis_notZ	concat_opr\   Ú_math_only_straight_opsr5   Z_type_affinityr   r   r	   r
   Ú_straight_opsrX   r   r^   r   Úvisit_binaryº   sF    ÿ


þÿÿúþÿÿÿ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>   rO   ©Z
eval_innerr   r   rQ     s    z/EvaluatorCompiler.visit_unary.<locals>.evaluater_   )r9   r:   rH   r   Úinvr	   r5   r
   rX   r   rg   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>)ÚcallablerO   r;   r   rj   r   Úvisit_bindparam  s    
z!EvaluatorCompiler.visit_bindparam)N)r
   r   r   r2   r9   r<   r?   r@   rA   rJ   rL   rK   rf   ri   rm   r   r   r   r   r0   M   s   
!,Dr0   )rH   Ú r   r   Zsqlr   r   Zsql.sqltypesr   r   Ú	Exceptionr	   ZColumnOperatorsr   r*   Úsetre   rd   Zin_opZ	not_in_opr\   Z_notimplemented_opsÚobjectr0   r   r   r   r   Ú<module>   s0   þþ ýþ