o
    ŠågA0  ã                   @  sþ   d 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 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 ddlmZ G dd„ dejƒZG dd„ dejƒZG dd„ dejƒZeƒ Zeƒ ZG dd„ dƒZddd„ZdS ) zÕEvaluation functions used **INTERNALLY** by ORM DML use cases.


This module is **private, for internal use by SQLAlchemy**.

.. versionchanged:: 2.0.4 renamed ``EvaluatorCompiler`` to
   ``_EvaluatorCompiler``.

é    )Úannotations)ÚTypeé   )Úexc)ÚLoaderCallableStatus)ÚPassiveFlagé   )Úinspect)Úand_)Ú	operators)ÚConcatenable)ÚInteger)ÚNumeric)Úwarn_deprecatedc                   @  s   e Zd ZdS )ÚUnevaluatableErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úT/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/orm/evaluator.pyr   %   s    r   c                   @  ó   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   )   ó    r   c                   @  r   )Ú_ExpiredObjectc                 O  ó   | S r   r   r   r   r   r   r   2   r   z_ExpiredObject.operatec                 O  r$   r   r   r   r   r   r   r    5   r   z_ExpiredObject.reverse_operateNr!   r   r   r   r   r#   1   r"   r#   c                   @  s
  e Zd Zd6d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d„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ ZeZeZeZeZeZeZeZeZeZeZeZ d(d)„ Z!d*d+„ Z"d,d-„ Z#d.d/„ Z$d0d1„ Z%d2d3„ Z&d4d5„ Z'dS )7Ú_EvaluatorCompilerNc                 C  s
   || _ d S r   )Ú
target_cls)r   r&   r   r   r   Ú__init__>   ó   
z_EvaluatorCompiler.__init__c                 G  sH   |r
t |g|¢R Ž }t| d|j› �d ƒ}|s tdt|ƒj› �ƒ‚||ƒS )NÚvisit_úCannot evaluate )r
   ÚgetattrÚ__visit_name__r   Útyper   )r   ÚclauseÚclausesÚmethr   r   r   ÚprocessA   s   ÿz_EvaluatorCompiler.processc                 C  s   |   |j¡S r   )r1   Úelement©r   r.   r   r   r   Úvisit_groupingL   s   z!_EvaluatorCompiler.visit_groupingc                 C  ó   dd„ S )Nc                 S  r   r   r   ©Úobjr   r   r   Ú<lambda>P   ó    z/_EvaluatorCompiler.visit_null.<locals>.<lambda>r   r3   r   r   r   Ú
visit_nullO   ó   z_EvaluatorCompiler.visit_nullc                 C  r5   )Nc                 S  ó   dS )NFr   r6   r   r   r   r8   S   r9   z0_EvaluatorCompiler.visit_false.<locals>.<lambda>r   r3   r   r   r   Úvisit_falseR   r;   z_EvaluatorCompiler.visit_falsec                 C  r5   )Nc                 S  r<   )NTr   r6   r   r   r   r8   V   r9   z/_EvaluatorCompiler.visit_true.<locals>.<lambda>r   r3   r   r   r   Ú
visit_trueU   r;   z_EvaluatorCompiler.visit_truec              
     s¼   z|j d }W n ty } ztd|› �ƒ|‚d }~ww | jr.t| j|jƒs.td|j› �ƒ‚| ¡  z|j| j}W n t	j
yO } ztd|› �ƒ|‚d }~ww |j| j‰ ‡ fdd„}|S )NÚparentmapperzCannot evaluate column: z0Can't evaluate criteria against alternate class zCannot evaluate expression: c                   s>   | d u rt S t| ƒ}|j}ˆ j||tjd�}|tju rtS |S )N)Úpassive)	Ú
_NO_OBJECTr	   ÚdictÚgetr   ÚPASSIVE_NO_FETCHr   ÚPASSIVE_NO_RESULTÚ_EXPIRED_OBJECT)r7   ÚstateÚdict_Úvalue©Úimplr   r   Úget_corresponding_attr   s   ÿ
z?_EvaluatorCompiler.visit_column.<locals>.get_corresponding_attr)Ú_annotationsÚKeyErrorr   r&   Ú
issubclassÚclass_Ú_check_configureÚ_columntopropertyÚkeyÚorm_excÚUnmappedColumnErrorÚclass_managerrK   )r   r.   r?   ÚkerS   ÚerrrL   r   rJ   r   Úvisit_columnX   s@   ÿþ€ÿÿÿÿÿþ€ÿz_EvaluatorCompiler.visit_columnc                 C  ó
   |   |¡S r   ©Úvisit_clauselistr3   r   r   r   Úvisit_tupleŽ   r(   z_EvaluatorCompiler.visit_tuplec                 C  rZ   r   r[   r3   r   r   r   Úvisit_expression_clauselist‘   r(   z._EvaluatorCompiler.visit_expression_clauselistc                   sX   ‡ fdd„|j D ƒ}d|jj d¡› d�}tˆ |d ƒ}|r$||j||ƒS td|j› �ƒ‚)Nc                   s   g | ]}ˆ   |¡‘qS r   )r1   )Ú.0r.   ©r   r   r   Ú
<listcomp>•   s    z7_EvaluatorCompiler.visit_clauselist.<locals>.<listcomp>r)   Ú_Ú_clauselist_opz)Cannot evaluate clauselist with operator )r/   Úoperatorr   Úrstripr+   r   )r   r.   Ú
evaluatorsÚdispatchr0   r   r`   r   r\   ”   s   ÿ
ÿz#_EvaluatorCompiler.visit_clauselistc                 C  sj   |   |j¡}|   |j¡}d|jj d¡› d�}t| |d ƒ}|r'||j|||ƒS tdt|ƒj› d|j› �ƒ‚)Nr)   rb   Ú
_binary_opr*   ú with operator )	r1   ÚleftÚrightrd   r   re   r+   r   r-   )r   r.   Ú	eval_leftÚ
eval_rightrg   r0   r   r   r   Úvisit_binary¢   s   ÿÿz_EvaluatorCompiler.visit_binaryc                   ó   ‡ fdd„}|S )Nc                   sH   d}ˆ D ]}|| ƒ}|t u rt   S |r dS |p|d u }q|r"d S dS ©NFT©rF   )r7   Úhas_nullÚsub_evaluaterI   ©rf   r   r   Úevaluate±   s   z;_EvaluatorCompiler.visit_or_clauselist_op.<locals>.evaluater   ©r   rd   rf   r.   ru   r   rt   r   Úvisit_or_clauselist_op°   s   z)_EvaluatorCompiler.visit_or_clauselist_opc                   ro   )Nc                   sF   ˆ D ]}|| ƒ}|t u rt   S |s |d u s|tu r d S  dS qdS rp   )rF   rA   )r7   rs   rI   rt   r   r   ru   Á   s   ýz<_EvaluatorCompiler.visit_and_clauselist_op.<locals>.evaluater   rv   r   rt   r   Úvisit_and_clauselist_opÀ   s   z*_EvaluatorCompiler.visit_and_clauselist_opc                   ro   )Nc                   sN   g }ˆ D ]}|| ƒ}|t u rt   S |d u s|tu r d S | |¡ qt|ƒS r   )rF   rA   ÚappendÚtuple)r7   Úvaluesrs   rI   rt   r   r   ru   Ð   s   zA_EvaluatorCompiler.visit_comma_op_clauselist_op.<locals>.evaluater   rv   r   rt   r   Úvisit_comma_op_clauselist_opÏ   s   z/_EvaluatorCompiler.visit_comma_op_clauselist_opc                 C  s(   |j r|  ||||¡S td|j›d�ƒ‚)NzCustom operator zR can't be evaluated in Python unless it specifies a callable using `.python_impl`.)Úpython_implÚ_straight_evaluater   Úopstring©r   rd   rl   rm   r.   r   r   r   Úvisit_custom_op_binary_opÝ   s   ÿÿz,_EvaluatorCompiler.visit_custom_op_binary_opc                   ó   ‡ ‡fdd„}|S )Nc                   s,   ˆ | ƒ}ˆ| ƒ}|t u s|t u rt S ||kS r   rq   ©r7   Úleft_valÚ	right_val©rl   rm   r   r   ru   ì   ó
   z7_EvaluatorCompiler.visit_is_binary_op.<locals>.evaluater   ©r   rd   rl   rm   r.   ru   r   r†   r   Úvisit_is_binary_opë   ó   z%_EvaluatorCompiler.visit_is_binary_opc                   r‚   )Nc                   s,   ˆ | ƒ}ˆ| ƒ}|t u s|t u rt S ||kS r   rq   rƒ   r†   r   r   ru   ö   r‡   z;_EvaluatorCompiler.visit_is_not_binary_op.<locals>.evaluater   rˆ   r   r†   r   Úvisit_is_not_binary_opõ   rŠ   z)_EvaluatorCompiler.visit_is_not_binary_opc                   s   ‡ ‡‡fdd„}|S )Nc                   sJ   ˆ | ƒ}ˆ| ƒ}|t u s|t u rt S |d u s|d u rd S ˆˆ | ƒˆ| ƒƒS r   rq   rƒ   ©rl   rm   rd   r   r   ru      s   z7_EvaluatorCompiler._straight_evaluate.<locals>.evaluater   rˆ   r   rŒ   r   r~   ÿ   s   
z%_EvaluatorCompiler._straight_evaluatec                 C  sX   |j jjttfvs|jjjttfvr$td|j› d|j j› d|jj› �ƒ‚|  ||||¡S )NzCannot evaluate math operator "ú" for datatypes ú, )	rj   r-   Ú_type_affinityr   r   rk   r   r   r~   r€   r   r   r   Ú_straight_evaluate_numeric_only  s   þ
ÿÿÿz2_EvaluatorCompiler._straight_evaluate_numeric_onlyc                 C  ó   |   dd„ |||¡S )Nc                 S  s   | t ur| |v S d S r   ©rA   ©ÚaÚbr   r   r   r8   (  ó    z:_EvaluatorCompiler.visit_in_op_binary_op.<locals>.<lambda>©r~   r€   r   r   r   Úvisit_in_op_binary_op&  s   üz(_EvaluatorCompiler.visit_in_op_binary_opc                 C  r‘   )Nc                 S  s   | t ur| |vS d S r   r’   r“   r   r   r   r8   2  r–   z>_EvaluatorCompiler.visit_not_in_op_binary_op.<locals>.<lambda>r—   r€   r   r   r   Úvisit_not_in_op_binary_op.  s   üz,_EvaluatorCompiler.visit_not_in_op_binary_opc                 C  sX   t |jjjtƒrt |jjjtƒs"td|j› d|jj› d|jj› �ƒ‚|  dd„ |||¡S )Nz&Cannot evaluate concatenate operator "r�   rŽ   c                 S  s   | | S r   r   r“   r   r   r   r8   F  s    z>_EvaluatorCompiler.visit_concat_op_binary_op.<locals>.<lambda>)	rO   rj   r-   r�   r   rk   r   r   r~   r€   r   r   r   Úvisit_concat_op_binary_op8  s"   
ÿþÿþþÿÿz,_EvaluatorCompiler.visit_concat_op_binary_opc                 C  r‘   )Nc                 S  rZ   r   )Ú
startswithr“   r   r   r   r8   M  ó   
 zB_EvaluatorCompiler.visit_startswith_op_binary_op.<locals>.<lambda>r—   r€   r   r   r   Úvisit_startswith_op_binary_opI  ó   ÿz0_EvaluatorCompiler.visit_startswith_op_binary_opc                 C  r‘   )Nc                 S  rZ   r   )Úendswithr“   r   r   r   r8   T  rœ   z@_EvaluatorCompiler.visit_endswith_op_binary_op.<locals>.<lambda>r—   r€   r   r   r   Úvisit_endswith_op_binary_opP  rž   z._EvaluatorCompiler.visit_endswith_op_binary_opc                   sD   |   |j¡‰ |jtju r‡ fdd„}|S tdt|ƒj› d|j› �ƒ‚)Nc                   s&   ˆ | ƒ}|t u r
t S |d u rd S | S r   rq   )r7   rI   ©Ú
eval_innerr   r   ru   [  s   z0_EvaluatorCompiler.visit_unary.<locals>.evaluater*   ri   )r1   r2   rd   r   Úinvr   r-   r   )r   r.   ru   r   r¡   r   Úvisit_unaryW  s   ÿÿz_EvaluatorCompiler.visit_unaryc                   s"   |j r|  ¡ ‰ n|j‰ ‡ fdd„S )Nc                   s   ˆ S r   r   r6   ©Úvalr   r   r8   n  r9   z4_EvaluatorCompiler.visit_bindparam.<locals>.<lambda>)ÚcallablerI   r3   r   r¥   r   Úvisit_bindparami  s   
z"_EvaluatorCompiler.visit_bindparamr   )(r   r   r   r'   r1   r4   r:   r=   r>   rY   r]   r^   r\   rn   rw   rx   r|   r�   r‰   r‹   r~   r�   Úvisit_add_binary_opÚvisit_mul_binary_opÚvisit_sub_binary_opÚvisit_mod_binary_opÚvisit_truediv_binary_opÚvisit_lt_binary_opÚvisit_le_binary_opÚvisit_ne_binary_opÚvisit_gt_binary_opÚvisit_ge_binary_opÚvisit_eq_binary_opr˜   r™   rš   r�   r    r¤   r¨   r   r   r   r   r%   =   sL    
6


r%   ÚnameÚstrÚreturnúType[_EvaluatorCompiler]c                 C  s*   | dkrt ddƒ tS tdt›d| ›�ƒ‚)NÚEvaluatorCompilerz•Direct use of 'EvaluatorCompiler' is not supported, and this name will be removed in a future release.  '_EvaluatorCompiler' is for internal use onlyz2.0zmodule z has no attribute )r   r%   ÚAttributeErrorr   )r´   r   r   r   Ú__getattr__q  s   ürº   N)r´   rµ   r¶   r·   )Ú__doc__Ú
__future__r   Útypingr   Ú r   rT   Úbaser   r   r	   Úsqlr
   r   Úsql.sqltypesr   r   r   Úutilr   ÚInvalidRequestErrorr   ÚColumnOperatorsr   r#   rA   rF   r%   rº   r   r   r   r   Ú<module>   s.     6