
    h2                     j   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	e      Z G d
 d      Z G d dee      Z G d dee      Z G d dee      Z G d dee      Z G d dee      Z G d dee      Z  G d dee      Z!eeeee e!edZ"y)    N)EmptyResultSet)Field)ColPairsFuncResolvedOuterRefSubqueryValue)ExactGreaterThanGreaterThanOrEqualInIsNullLessThanLessThanOrEqual)Query)ANDOR	WhereNodec                   .    e Zd ZdZdZ e       Zd Zd Zy)TupleT c                 ,    t        | j                        S N)lensource_expressionsselfs    b/var/www/django_project/virt/lib/python3.12/site-packages/django/db/models/fields/tuple_lookups.py__len__zTuple.__len__   s    4**++    c                 ,    t        | j                        S r   )iterr   r   s    r   __iter__zTuple.__iter__!   s    D++,,r    N)	__name__
__module____qualname__allows_composite_expressionsfunctionr   output_fieldr   r#    r    r   r   r      s    #' H7L,-r    r   c                   j     e Zd ZdZ fdZd Zd Zd Zd Z fdZ	d fd	Z
 fd	Zd
 Z fdZ xZS )TupleLookupMixinTc                     | j                         r,| j                          | j                          | j                  S | j                          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rhsr   	__class__s    r   r3   z TupleLookupMixin.get_prep_lookup(   sT    ##%++-335 xx 224G#%xxr    c                     t        | j                  t        t        f      s+| j	                         }t        | j                  d| d      y )N lookup of z must be a tuple or a list)
isinstancer4   tuplelistget_lhs_str
ValueErrorlookup_namer   lhs_strs     r   r/   z+TupleLookupMixin.check_rhs_is_tuple_or_list1   sL    $((UDM2&&(G##&k':TU  3r    c                     t        | j                        }|t        | j                        k7  r.| j                         }t	        | j
                  d| d| d      y )Nr8    must have z	 elements)r   lhsr4   r<   r=   r>   )r   len_lhsr@   s      r   r0   z3TupleLookupMixin.check_rhs_length_equals_lhs_length8   s\    dhh-c$((m#&&(G##&k'+gYiX  $r    c                     t        | j                  t        t        f      sN| j	                         }| j                  j
                  j                  }t        | j                  d| d|d      y )N subquery lookup of z7 only supports OuterRef and QuerySet objects (received ))	r9   r4   r   r   r<   r6   r$   r=   r>   r   r@   rhs_clss      r   r1   z2TupleLookupMixin.check_rhs_is_supported_expression@   ss    $((%5u$=>&&(Ghh((11G##&&:7) DIIPSTV  ?r    c                     t        | j                  t              r)t        | j                  j                  j
                        S dj                  d | j                  D              }d| dS )Nz, c              3   F   K   | ]  }t        |j                          y wr   )reprname).0fs     r   	<genexpr>z/TupleLookupMixin.get_lhs_str.<locals>.<genexpr>M   s     =qd166l=s   !(rG   )r9   rC   r   rL   fieldrM   join)r   namess     r   r<   zTupleLookupMixin.get_lhs_strI   sO    dhh)++,,II=DHH==EugQ<r    c                     t        | j                  t        t        f      rt	        | j                   S t
        |          S r   )r9   rC   r:   r;   r   r2   get_prep_lhsr5   s    r   rV   zTupleLookupMixin.get_prep_lhsP   s2    dhh.$((##w#%%r    c                 t    t         |   |||      \  }}t        | j                  t              sd| d}||fS )NrQ   rG   )r2   process_lhsr9   rC   r   )r   compiler
connectionrC   sqlparamsr6   s         r   rX   zTupleLookupMixin.process_lhsU   s?    g)(JDV$((E*cU!*CF{r    c                    | j                         r^t        | j                  | j                        D cg c]  \  }}t	        ||j
                         }}}|j                  t        |       S |j                  | j                        \  }}t        | j                  t              rd|z  |fS t        | j                  t              rt        | 1  ||      S t        d      c c}}w )Nr)   z(%s)z=Composite field lookups only work with composite expressions.)r.   ziprC   r4   r	   r)   compiler   r9   r   r   r2   process_rhsr=   )	r   rY   rZ   colvalargsr[   r\   r6   s	           r   ra   zTupleLookupMixin.process_rhs[   s    ##% !$DHHdhh 7C c(8(89D  ##E4L11"**4884KC$((H-|V++DHHe,w*8Z@@ S s   !C$c                 F    t        | j                  j                   d      )Nzp.get_fallback_sql() must be implemented for backends that don't have the supports_tuple_lookups feature enabled.)NotImplementedErrorr6   r$   )r   rY   rZ   s      r   get_fallback_sqlz!TupleLookupMixin.get_fallback_sqlm   s+    !~~&&' (W X
 	
r    c                 t    |j                   j                  s| j                  ||      S t        |   ||      S r   )featuressupports_tuple_lookupsrg   r2   as_sql)r   rY   rZ   r6   s      r   rk   zTupleLookupMixin.as_sqls   s6    ""99((:>>w~h
33r    r   )r$   r%   r&   r'   r3   r/   r0   r1   r<   rV   rX   ra   rg   rk   __classcell__r6   s   @r   r,   r,   %   s@    #'  &
$
4 4r    r,   c                        e Zd Z fdZ xZS )
TupleExactc                 N   t        | j                  t              rt        t        |   ||      S | j                  ||       t        | j                  | j                        D cg c]  \  }}t        ||       }}}t        |t              }|j                  ||      S c c}}w N	connector)r9   r4   r   r2   r,   rk   ra   r_   rC   r
   r   r   )r   rY   rZ   rb   rc   lookupsrootr6   s          r   rg   zTupleExact.get_fallback_sqlz   s    dhh&)47*MM:. 47txx3JKxsC5c?KKC0{{8Z00 Ls   %B!)r$   r%   r&   rg   rl   rm   s   @r   ro   ro   y   s    
1 
1r    ro   c                       e Zd Zd Zd Zy)TupleIsNullc                     | 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.)r4   r9   r:   r;   r   boolr=   )r   r4   s     r   r3   zTupleIsNull.get_prep_lookup   sK    hhcE4=)c#h!ma&Cc4 JL
 	
r    c                     | j                   }| j                  D cg c]  }t        ||       }}t        ||rt        nt
              }|j                  ||      S c c}w rq   )r4   rC   r   r   r   r   rk   )r   rY   rZ   r4   rb   rt   ru   s          r   rk   zTupleIsNull.as_sql   sQ    
 hh/3xx86#s#88#B3?{{8Z00 9s   AN)r$   r%   r&   r3   rk   r*   r    r   rw   rw      s    
1r    rw   c                       e Zd Zd Zy)TupleGreaterThanc                     | j                  ||       t        j                  t        t        g      }t        j                  t
        t        g      }| j                  D cg c]  }t        d      D ]  }|  }}}| j                  D cg c]  }t        d      D ]  }|  }	}}t        |d d       }
t        |	d d       }t        |
      }t        |      }t        |      }t        |      }t         |||      g|      x}}t        |
|      D ]M  \  }}t        |      }t        |      }t         |||      g|      }|j                  j                  |       |}O |j!                  ||      S c c}}w c c}}w N   rr   ra   	itertoolscycler   r
   r   r   rC   ranger4   r"   nextr   r_   childrenappendrk   r   rY   rZ   rt   
connectorsrb   _	cols_listrc   	vals_list	cols_iter	vals_iterlookuprs   ru   nodechilds                    r   rg   z!TupleGreaterThan.get_fallback_sql   s]   :. //;"67__b#Y/
$(HH?SeAh?S?S?	?$(HH?SeAh?S?S?	?3B(	3B(	9o9og$	S!1 2iHHtIy1 	HC']FZ(Ivc3/0IFEMM  'D	 {{8Z00# @?    E4E:Nr$   r%   r&   rg   r*   r    r   r}   r}          1r    r}   c                       e Zd Zd Zy)TupleGreaterThanOrEqualc                    | j                  ||       t        j                  t        t        g      }t        j                  t
        t        g      }| j                  D cg c]  }t        d      D ]  }|  }}}| j                  D cg c]  }t        d      D ]  }|  }	}}t        |      }
t        |	      }t        |
      }t        |      }t        |      }t        |      }t         |||      g|      x}}t        |
|      D ]M  \  }}t        |      }t        |      }t         |||      g|      }|j                  j                  |       |}O |j!                  ||      S c c}}w c c}}w Nr   rr   r   r   s                    r   rg   z(TupleGreaterThanOrEqual.get_fallback_sql   sO   :. //;"67__b#Y/
$(HH?SeAh?S?S?	?$(HH?SeAh?S?S?	?O	O	9o9og$	S!1 2iHHtIy1 	HC']FZ(Ivc3/0IFEMM  'D	 {{8Z00# @?    E.E4Nr   r*   r    r   r   r      r   r    r   c                       e Zd Zd Zy)TupleLessThanc                     | j                  ||       t        j                  t        t        g      }t        j                  t
        t        g      }| j                  D cg c]  }t        d      D ]  }|  }}}| j                  D cg c]  }t        d      D ]  }|  }	}}t        |d d       }
t        |	d d       }t        |
      }t        |      }t        |      }t        |      }t         |||      g|      x}}t        |
|      D ]M  \  }}t        |      }t        |      }t         |||      g|      }|j                  j                  |       |}O |j!                  ||      S c c}}w c c}}w r   ra   r   r   r   r
   r   r   rC   r   r4   r"   r   r   r_   r   r   rk   r   s                    r   rg   zTupleLessThan.get_fallback_sql   s]   :. //8U"34__b#Y/
$(HH?SeAh?S?S?	?$(HH?SeAh?S?S?	?3B(	3B(	9o9og$	S!1 2iHHtIy1 	HC']FZ(Ivc3/0IFEMM  'D	 {{8Z00# @?r   Nr   r*   r    r   r   r      r   r    r   c                       e Zd Zd Zy)TupleLessThanOrEqualc                    | j                  ||       t        j                  t        t        g      }t        j                  t
        t        g      }| j                  D cg c]  }t        d      D ]  }|  }}}| j                  D cg c]  }t        d      D ]  }|  }	}}t        |      }
t        |	      }t        |
      }t        |      }t        |      }t        |      }t         |||      g|      x}}t        |
|      D ]M  \  }}t        |      }t        |      }t         |||      g|      }|j                  j                  |       |}O |j!                  ||      S c c}}w c c}}w r   r   r   s                    r   rg   z%TupleLessThanOrEqual.get_fallback_sql   sO   :. //8U"34__b#Y/
$(HH?SeAh?S?S?	?$(HH?SeAh?S?S?	?O	O	9o9og$	S!1 2iHHtIy1 	HC']FZ(Ivc3/0IFEMM  'D	 {{8Z00# @?r   Nr   r*   r    r   r   r      r   r    r   c                   D     e Zd Z fdZd Zd Zd Z fdZ fdZ xZ	S )TupleInc                     | j                         r<| j                          | j                          | j                          | j                  S | j	                          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_queryr2   r,   r3   r4   r5   s    r   r3   zTupleIn.get_prep_lookup  sc    ##%++-;;=<<>
 xx ##%"D9;xxr    c                     t        d | j                  D              s+| j                         }t        | j                  d| d      y )Nc              3   H   K   | ]  }t        |t        t        f        y wr   )r9   r:   r;   )rN   valss     r   rP   zETupleIn.check_rhs_is_collection_of_tuples_or_lists.<locals>.<genexpr>  s     Ht:dUDM2Hs    "r8   z( must be a collection of tuples or lists)allr4   r<   r=   r>   r?   s     r   r   z2TupleIn.check_rhs_is_collection_of_tuples_or_lists  sQ    HtxxHH&&(G##&k' ;: :  Ir    c                     t        | j                        t        fd| j                  D              s.| j	                         }t        | j                  d| d d      y )Nc              3   :   K   | ]  }t        |      k(    y wr   )r   )rN   r   rD   s     r   rP   zFTupleIn.check_rhs_elements_length_equals_lhs_length.<locals>.<genexpr>#  s     =D7c$i'=s   r8   rB   z elements each)r   rC   r   r4   r<   r=   r>   )r   r@   rD   s     @r   r   z3TupleIn.check_rhs_elements_length_equals_lhs_length!  se    dhh-=DHH==&&(G##&k' ;$I^5  >r    c                     t        | j                  t        t        f      sN| j	                         }| j                  j
                  j                  }t        | j                  d| d|d      y )NrF   z" must be a Query object (received rG   )	r9   r4   r   r   r<   r6   r$   r=   r>   rH   s      r   r   zTupleIn.check_rhs_is_query*  sp    $((UH$56&&(Ghh((11G##&&:7) D44;;aA  7r    c                 j   | j                         st        t        |   ||      S | j                  }|st
        g }| j                  }|D ]K  }|j                  t        t        ||      D cg c]  \  }}t        ||j                         c}}        M |j                  t        |       S c c}}w )Nr^   )r.   r2   r,   ra   r4   r   rC   r   r   r_   r	   r)   r`   )
r   rY   rZ   r4   resultrC   r   rb   rc   r6   s
            r   ra   zTupleIn.process_rhs3  s    ''))4<XzRRhh   hh 	DMM ),C$C c0@0@A	 v//s   ,!B/c           	         | j                   }|st        | j                         st        t        |   ||      S t        g t              }| j                  }|D ]T  }t        ||      D cg c]  \  }}t        ||       }	}}|j                  j                  t        |	t                     V |j                  ||      S c c}}w rq   )r4   r   r.   r2   r,   rk   r   r   rC   r_   r
   r   r   r   )r   rY   rZ   r4   ru   rC   r   rb   rc   rt   r6   s             r   rg   zTupleIn.get_fallback_sqlL  s    hh  ''))47*MM r*hh 	DD7:3~F83uS#FGFMM  7c!BC	D {{8Z00 Gs   +C)
r$   r%   r&   r3   r   r   r   ra   rg   rl   rm   s   @r   r   r     s&    	021 1r    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,   ro   rw   r}   r   r   r   r   tuple_lookupsr*   r    r   <module>r      s     1 "    ' 9 9	-D 	-Q4 Q4h1!5 11"F 1,1' 181.0B 181$h 181+_ 18O1 O1f 
"

r    