o
    {,h4                     @   s4  d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
 d dlmZmZmZmZmZmZmZ d dlmZ d dlmZmZmZ G dd	 d	eZG d
d dZG dd deeZG dd deeZG dd deeZG dd deeZG dd deeZG dd deeZ G dd deeZ!eeeee e!edZ"dS )    N)EmptyResultSet)Field)ColPairsFuncResolvedOuterRefSubqueryValue)ExactGreaterThanGreaterThanOrEqualInIsNullLessThanLessThanOrEqual)Query)ANDOR	WhereNodec                   @   s*   e Zd ZdZdZe Zdd Zdd ZdS )TupleT c                 C   
   t | jS N)lensource_expressionsself r   [/var/www/html/rh/venv/lib/python3.10/site-packages/django/db/models/fields/tuple_lookups.py__len__      
zTuple.__len__c                 C   r   r   )iterr   r   r   r   r   __iter__!   r   zTuple.__iter__N)	__name__
__module____qualname__allows_composite_expressionsfunctionr   output_fieldr   r!   r   r   r   r   r      s    r   c                       sz   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Z fddZ	d fdd	Z
 fddZdd Z fddZ  ZS )TupleLookupMixinTc                    s6   |   r|   |   | jS |   t   | jS r   )rhs_is_direct_valuecheck_rhs_is_tuple_or_list"check_rhs_length_equals_lhs_length!check_rhs_is_supported_expressionsuperget_prep_lookuprhsr   	__class__r   r   r.   (   s   
z TupleLookupMixin.get_prep_lookupc                 C   s2   t | jttfs|  }t| jd| dd S )N lookup of z must be a tuple or a list)
isinstancer/   tuplelistget_lhs_str
ValueErrorlookup_namer   lhs_strr   r   r   r*   1   s   z+TupleLookupMixin.check_rhs_is_tuple_or_listc                 C   s@   t | j}|t | jkr|  }t| jd| d| dd S )Nr2    must have z	 elements)r   lhsr/   r6   r7   r8   )r   len_lhsr:   r   r   r   r+   8   s   
z3TupleLookupMixin.check_rhs_length_equals_lhs_lengthc                 C   B   t | jttfs|  }| jjj}t| jd| d|dd S )N subquery lookup of z7 only supports OuterRef and QuerySet objects (received ))	r3   r/   r   r   r6   r1   r"   r7   r8   r   r:   rhs_clsr   r   r   r,   @      
z2TupleLookupMixin.check_rhs_is_supported_expressionc                 C   s<   t | jtrt| jjjS ddd | jD }d| dS )Nz, c                 s   s    | ]}t |jV  qd S r   )reprname).0fr   r   r   	<genexpr>M   s    z/TupleLookupMixin.get_lhs_str.<locals>.<genexpr>(r@   )r3   r<   r   rD   fieldrE   join)r   namesr   r   r   r6   I   s   zTupleLookupMixin.get_lhs_strc                    s$   t | jttfrt| j S t  S r   )r3   r<   r4   r5   r   r-   get_prep_lhsr   r0   r   r   rM   P   s   

zTupleLookupMixin.get_prep_lhsNc                    s4   t  |||\}}t| jtsd| d}||fS )NrI   r@   )r-   process_lhsr3   r<   r   )r   compiler
connectionr<   sqlparamsr0   r   r   rN   U   s   zTupleLookupMixin.process_lhsc                    sx   |   rdd t| j| jD }|t| S || j\}}t| jtr+d| |fS t| jtr8t	 
||S td)Nc                 S      g | ]\}}t ||jd qS )r'   r   r'   rF   colvalr   r   r   
<listcomp>]       z0TupleLookupMixin.process_rhs.<locals>.<listcomp>z(%s)z=Composite field lookups only work with composite expressions.)r)   zipr<   r/   compiler   r3   r   r   r-   process_rhsr7   )r   rO   rP   argsrQ   rR   r0   r   r   r]   [   s   zTupleLookupMixin.process_rhsc                 C   s   t | jj d)Nzp.get_fallback_sql() must be implemented for backends that don't have the supports_tuple_lookups feature enabled.)NotImplementedErrorr1   r"   r   rO   rP   r   r   r   get_fallback_sqlm   s   z!TupleLookupMixin.get_fallback_sqlc                    s"   |j js
| ||S t ||S r   )featuressupports_tuple_lookupsra   r-   as_sqlr`   r0   r   r   rd   s   s   zTupleLookupMixin.as_sqlr   )r"   r#   r$   r%   r.   r*   r+   r,   r6   rM   rN   r]   ra   rd   __classcell__r   r   r0   r   r(   %   s    		r(   c                       s   e Zd Z fddZ  ZS )
TupleExactc                    sZ   t | jtrtt| ||S | || dd t| j| jD }t	|t
d}|||S )Nc                 S      g | ]	\}}t ||qS r   r	   rV   r   r   r   rY          z/TupleExact.get_fallback_sql.<locals>.<listcomp>	connector)r3   r/   r   r-   r(   rd   r]   r[   r<   r   r   r   rO   rP   lookupsrootr0   r   r   ra   z   s   zTupleExact.get_fallback_sql)r"   r#   r$   ra   re   r   r   r0   r   rf   y   s    rf   c                   @   s   e Zd Zdd Zdd ZdS )TupleIsNullc                 C   s>   | j }t|ttfrt|dkr|d }t|tr|S td)N   r   z>The QuerySet value for an isnull lookup must be True or False.)r/   r3   r4   r5   r   boolr7   )r   r/   r   r   r   r.      s   
zTupleIsNull.get_prep_lookupc                    s:   | j   fdd| jD }t| rtntd}|||S )Nc                    s   g | ]}t | qS r   )r   )rF   rW   r/   r   r   rY      s    z&TupleIsNull.as_sql.<locals>.<listcomp>rj   )r/   r<   r   r   r   rd   rl   r   rr   r   rd      s   zTupleIsNull.as_sqlN)r"   r#   r$   r.   rd   r   r   r   r   ro      s    
ro   c                   @      e Zd Zdd ZdS )TupleGreaterThanc                 C      |  || tttg}tttg}dd | jD }dd | jD }t	|d d }t	|d d }t
|}	t
|}
t
|}t
|}t||	|
g|d }}t||D ]\}	}
t
|}t
|}t||	|
g|d}|j| |}qU|||S )Nc                 S      g | ]}t d D ]}|qqS    rangerF   rW   _r   r   r   rY          z5TupleGreaterThan.get_fallback_sql.<locals>.<listcomp>c                 S   rv   rw   ry   rF   rX   r|   r   r   r   rY      r}   rj   r]   	itertoolscycler
   r	   r   r   r<   r/   r    nextr   r[   childrenappendrd   r   rO   rP   rm   
connectors	cols_list	vals_list	cols_iter	vals_iterrW   rX   lookuprk   rn   nodechildr   r   r   ra      &   z!TupleGreaterThan.get_fallback_sqlNr"   r#   r$   ra   r   r   r   r   rt          rt   c                   @   rs   )TupleGreaterThanOrEqualc                 C      |  || tttg}tttg}dd | jD }dd | jD }t	|}t	|}t
|}	t
|}
t
|}t
|}t||	|
g|d }}t||D ]\}	}
t
|}t
|}t||	|
g|d}|j| |}qM|||S )Nc                 S   rv   rw   ry   r{   r   r   r   rY      r}   z<TupleGreaterThanOrEqual.get_fallback_sql.<locals>.<listcomp>c                 S   rv   rw   ry   r~   r   r   r   rY      r}   rj   r   r   r   r   r   ra      &   z(TupleGreaterThanOrEqual.get_fallback_sqlNr   r   r   r   r   r      r   r   c                   @   rs   )TupleLessThanc                 C   ru   )Nc                 S   rv   rw   ry   r{   r   r   r   rY      r}   z2TupleLessThan.get_fallback_sql.<locals>.<listcomp>c                 S   rv   rw   ry   r~   r   r   r   rY      r}   r   rj   r]   r   r   r   r	   r   r   r<   r/   r    r   r   r[   r   r   rd   r   r   r   r   ra      r   zTupleLessThan.get_fallback_sqlNr   r   r   r   r   r      r   r   c                   @   rs   )TupleLessThanOrEqualc                 C   r   )Nc                 S   rv   rw   ry   r{   r   r   r   rY      r}   z9TupleLessThanOrEqual.get_fallback_sql.<locals>.<listcomp>c                 S   rv   rw   ry   r~   r   r   r   rY      r}   rj   r   r   r   r   r   ra      r   z%TupleLessThanOrEqual.get_fallback_sqlNr   r   r   r   r   r      r   r   c                       sL   e Zd Z fddZdd Zdd Zdd Z fd	d
Z fddZ  Z	S )TupleInc                    sB   |   r|   |   |   | jS |   tt|   | jS r   )	r)   r*   *check_rhs_is_collection_of_tuples_or_lists+check_rhs_elements_length_equals_lhs_lengthcheck_rhs_is_queryr-   r(   r.   r/   r   r0   r   r   r.     s   zTupleIn.get_prep_lookupc                 C   s6   t dd | jD s|  }t| jd| dd S )Nc                 s   s    | ]
}t |ttfV  qd S r   )r3   r4   r5   rF   valsr   r   r   rH     s    zETupleIn.check_rhs_is_collection_of_tuples_or_lists.<locals>.<genexpr>r2   z( must be a collection of tuples or lists)allr/   r6   r7   r8   r9   r   r   r   r     s   z2TupleIn.check_rhs_is_collection_of_tuples_or_listsc                    sJ   t | j t fdd| jD s#|  }t| jd| d  dd S )Nc                 3   s    | ]	} t |kV  qd S r   )r   r   r=   r   r   rH   #  s    zFTupleIn.check_rhs_elements_length_equals_lhs_length.<locals>.<genexpr>r2   r;   z elements each)r   r<   r   r/   r6   r7   r8   r9   r   r   r   r   !  s   
z3TupleIn.check_rhs_elements_length_equals_lhs_lengthc                 C   r>   )Nr?   z" must be a Query object (received r@   )	r3   r/   r   r   r6   r1   r"   r7   r8   rA   r   r   r   r   *  rC   zTupleIn.check_rhs_is_queryc                    s   |   stt| ||S | j}|stg }| j}|D ]}tdd |D r'q|t	dd t
||D   q|s;t|t	| S )Nc                 s       | ]}|d u V  qd S r   r   rF   rX   r   r   r   rH   C      z&TupleIn.process_rhs.<locals>.<genexpr>c                 S   rS   rT   rU   rV   r   r   r   rY   G  rZ   z'TupleIn.process_rhs.<locals>.<listcomp>)r)   r-   r(   r]   r/   r   r<   anyr   r   r[   r\   )r   rO   rP   r/   resultr<   r   r0   r   r   r]   3  s(   	zTupleIn.process_rhsc                    s   | j }|st|  stt| ||S tg td}| j}|D ] }t	dd |D r+qdd t
||D }|jt|td q|jsEt|||S )Nrj   c                 s   r   r   r   r   r   r   r   rH   b  r   z+TupleIn.get_fallback_sql.<locals>.<genexpr>c                 S   rg   r   rh   rV   r   r   r   rY   d  ri   z,TupleIn.get_fallback_sql.<locals>.<listcomp>)r/   r   r)   r-   r(   rd   r   r   r<   r   r[   r   r   r   )r   rO   rP   r/   rn   r<   r   rm   r0   r   r   ra   S  s   zTupleIn.get_fallback_sql)
r"   r#   r$   r.   r   r   r   r]   ra   re   r   r   r0   r   r     s    		 r   )exactgtgteltlteinisnull)#r   django.core.exceptionsr   django.db.modelsr   django.db.models.expressionsr   r   r   r   r   django.db.models.lookupsr	   r
   r   r   r   r   r   django.db.models.sqlr   django.db.models.sql.wherer   r   r   r   r(   rf   ro   rt   r   r   r   r   tuple_lookupsr   r   r   r   <module>   s0    $	T`
