o
    vh7                     @   s8  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
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)models)ColPairsExists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   c/var/www/html/hyperkenya/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   Field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   r0   )   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)
isinstancer1   tuplelistget_lhs_str
ValueErrorlookup_namer   lhs_strr   r   r   r,   2   s   z+TupleLookupMixin.check_rhs_is_tuple_or_listc                 C   s@   t | j}|t | jkr|  }t| jd| d| dd S )Nr4    must have z	 elements)r   lhsr1   r8   r9   r:   )r   len_lhsr<   r   r   r   r-   9   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 ))	r5   r1   r   r   r8   r3   r#   r9   r:   r   r<   rhs_clsr   r   r   r.   A      
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>N   s    z/TupleLookupMixin.get_lhs_str.<locals>.<genexpr>(rB   )r5   r>   r   rF   fieldrG   join)r   namesr   r   r   r8   J   s   zTupleLookupMixin.get_lhs_strc                    s$   t | jttfrt| j S t  S r   )r5   r>   r6   r7   r   r/   get_prep_lhsr   r2   r   r   rO   Q   s   

zTupleLookupMixin.get_prep_lhsNc                    s4   t  |||\}}t| jtsd| d}||fS )NrK   rB   )r/   process_lhsr5   r>   r   )r   compiler
connectionr>   sqlparamsr2   r   r   rP   V   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)   rH   colvalr   r   r   
<listcomp>^       z0TupleLookupMixin.process_rhs.<locals>.<listcomp>z(%s)z=Composite field lookups only work with composite expressions.)r+   zipr>   r1   compiler   r5   r   r   r/   process_rhsr9   )r   rQ   rR   argsrS   rT   r2   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.)NotImplementedErrorr3   r#   r   rQ   rR   r   r   r   get_fallback_sqln   s   z!TupleLookupMixin.get_fallback_sqlc                    s"   |j js
| ||S t ||S r   )featuressupports_tuple_lookupsrc   r/   as_sqlrb   r2   r   r   rf   t   s   zTupleLookupMixin.as_sqlr   )r#   r$   r%   r&   r0   r,   r-   r.   r8   rO   rP   r_   rc   rf   __classcell__r   r   r2   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
   rX   r   r   r   r[          z/TupleExact.get_fallback_sql.<locals>.<listcomp>	connector)r5   r1   r   r/   r*   rf   r_   r]   r>   r   r   r   rQ   rR   lookupsrootr2   r   r   rc   {   s   zTupleExact.get_fallback_sql)r#   r$   r%   rc   rg   r   r   r2   r   rh   z   s    rh   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.)r1   r5   r6   r7   r   boolr9   )r   r1   r   r   r   r0      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   )rH   rY   r1   r   r   r[      s    z&TupleIsNull.as_sql.<locals>.<listcomp>rl   )r1   r>   r   r   r   rf   rn   r   rt   r   rf      s   zTupleIsNull.as_sqlN)r#   r$   r%   r0   rf   r   r   r   r   rq      s    
rq   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rH   rY   _r   r   r   r[          z5TupleGreaterThan.get_fallback_sql.<locals>.<listcomp>c                 S   rx   ry   r{   rH   rZ   r~   r   r   r   r[      r   rl   r_   	itertoolscycler   r
   r   r   r>   r1   r!   nextr   r]   childrenappendrf   r   rQ   rR   ro   
connectors	cols_list	vals_list	cols_iter	vals_iterrY   rZ   lookuprm   rp   nodechildr   r   r   rc      &   z!TupleGreaterThan.get_fallback_sqlNr#   r$   r%   rc   r   r   r   r   rv          rv   c                   @   ru   )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   rx   ry   r{   r}   r   r   r   r[      r   z<TupleGreaterThanOrEqual.get_fallback_sql.<locals>.<listcomp>c                 S   rx   ry   r{   r   r   r   r   r[      r   rl   r   r   r   r   r   rc      &   z(TupleGreaterThanOrEqual.get_fallback_sqlNr   r   r   r   r   r      r   r   c                   @   ru   )TupleLessThanc                 C   rw   )Nc                 S   rx   ry   r{   r}   r   r   r   r[      r   z2TupleLessThan.get_fallback_sql.<locals>.<listcomp>c                 S   rx   ry   r{   r   r   r   r   r[      r   r   rl   r_   r   r   r   r
   r   r   r>   r1   r!   r   r   r]   r   r   rf   r   r   r   r   rc      r   zTupleLessThan.get_fallback_sqlNr   r   r   r   r   r      r   r   c                   @   ru   )TupleLessThanOrEqualc                 C   r   )Nc                 S   rx   ry   r{   r}   r   r   r   r[      r   z9TupleLessThanOrEqual.get_fallback_sql.<locals>.<listcomp>c                 S   rx   ry   r{   r   r   r   r   r[      r   rl   r   r   r   r   r   rc      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*   r0   r1   r   r2   r   r   r0     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   )r5   r6   r7   rH   valsr   r   r   rJ     s    zETupleIn.check_rhs_is_collection_of_tuples_or_lists.<locals>.<genexpr>r4   z( must be a collection of tuples or lists)allr1   r8   r9   r:   r;   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   rJ   $  s    zFTupleIn.check_rhs_elements_length_equals_lhs_length.<locals>.<genexpr>r4   r=   z elements each)r   r>   r   r1   r8   r9   r:   r;   r   r   r   r   "  s   
z3TupleIn.check_rhs_elements_length_equals_lhs_lengthc                 C   r@   )NrA   z" must be a Query object (received rB   )	r5   r1   r   r   r8   r3   r#   r9   r:   rC   r   r   r   r   +  rE   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   rH   rZ   r   r   r   rJ   D      z&TupleIn.process_rhs.<locals>.<genexpr>c                 S   rU   rV   rW   rX   r   r   r   r[   H  r\   z'TupleIn.process_rhs.<locals>.<listcomp>)r+   r/   r*   r_   r1   r   r>   anyr   r   r]   r^   )r   rQ   rR   r1   resultr>   r   r2   r   r   r_   4  s(   	zTupleIn.process_rhsc           	         s  | j }|stt|tr=tj fdd|j|d d D }|	 }|
tjdd t| j|D   |t|S |  sJtt| ||S tg td}| j}|D ] }tdd |D raqUd	d t||D }|jt|td qU|js{t|||S )
Nc                 3   s,    | ]}t |d    tr n gV  qdS )r   N)r5   r   )rH   selectselect_exprr   r   rJ   Y  s    
z+TupleIn.get_fallback_sql.<locals>.<genexpr>)rR   r   c                 S   ri   r   rj   rX   r   r   r   r[   c  rk   z,TupleIn.get_fallback_sql.<locals>.<listcomp>rl   c                 s   r   r   r   r   r   r   r   rJ   q  r   c                 S   ri   r   rj   rX   r   r   r   r[   s  rk   )r1   r   r5   r   r   chainfrom_iterableget_compiler
get_selectcloneadd_qr   Qr]   r>   r^   r   r+   r/   r*   rf   r   r   r   r   r   r   )	r   rQ   rR   r1   	rhs_exprsrp   r>   r   ro   r2   r   r   rc   T  s0   
zTupleIn.get_fallback_sql)
r#   r$   r%   r0   r   r   r   r_   rc   rg   r   r   r2   r   r     s    		 r   )exactgtgteltlteinisnull)$r   django.core.exceptionsr   	django.dbr   django.db.models.expressionsr   r   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*   rh   rq   rv   r   r   r   r   tuple_lookupsr   r   r   r   <module>   s0     $	Tn
