
    `?i<                     r   d dl Z d dlmZ d dlmZ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	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)NotSupportedErrormodels)ColPairsExistsFuncResolvedOuterRefSubqueryValue)ExactGreaterThanGreaterThanOrEqualInIsNullLessThanLessThanOrEqual)Query)ANDOR	WhereNodec                   H    e Zd ZdZdZ ej                         Zd Zd Z	d Z
y)TupleT c                 ,    t        | j                        S N)lensource_expressionsselfs    w/home/cursorai/projects/django-cronjob-utils/venv/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"   c                 
   |j                         dk  r_t        | j                  d   x}t              r@|j	                         }d|_        t        |g| j                  dd   j                  ||      S | j                  ||      S )N)   %   r   VALUES   )get_database_version
isinstancer   r   copyfunctionas_sql)r   compiler
connection
first_exprs       r    	as_sqlitezTuple.as_sqlite%   s    **,w6:11!44Je<
 $*J"*JBd&=&=ab&ABII*  {{8Z00r"   N)__name__
__module____qualname__allows_composite_expressionsr.   r   Fieldoutput_fieldr!   r%   r3    r"   r    r   r      s)    #' H6<<>L,-	1r"   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    rC   z TupleLookupMixin.get_prep_lookup4   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)r,   rD   tuplelistget_lhs_str
ValueErrorlookup_namer   lhs_strs     r    r?   z+TupleLookupMixin.check_rhs_is_tuple_or_list=   sL    $((UDM2&&(G##&k':TU  3r"   c                     t        | j                        }|t        | j                        k7  r.| j                         }t	        | j
                  d| d| d      y )NrH    must have z	 elements)r   lhsrD   rK   rL   rM   )r   len_lhsrO   s      r    r@   z3TupleLookupMixin.check_rhs_length_equals_lhs_lengthD   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 ))	r,   rD   r	   r   rK   rF   r4   rL   rM   r   rO   rhs_clss      r    rA   z2TupleLookupMixin.check_rhs_is_supported_expressionL   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>Y   s     =Hqd166lHs   !(rV   )r,   rR   r   r[   fieldr\   join)r   namess     r    rK   zTupleLookupMixin.get_lhs_strU   sO    dhh)++,,II=DHH==EugQ<r"   c                     t        | j                  t        t        f      rt	        | j                   S t
        |          S r   )r,   rR   rI   rJ   r   rB   get_prep_lhsrE   s    r    re   zTupleLookupMixin.get_prep_lhs\   s2    dhh.$((##w#%%r"   c                 t    t         |   |||      \  }}t        | j                  t              sd| d}||fS )Nr`   rV   )rB   process_lhsr,   rR   r   )r   r0   r1   rR   sqlparamsrF   s         r    rg   zTupleLookupMixin.process_lhsa   s?    g)(JDV$((E*cU!*CF{r"   c                    | j                         rlt        | j                  | j                        D cg c]*  \  }}t	        |d      r|nt        ||j                        , }}}|j                  t        |       S |j                  | j                        \  }}t        | j                  t              rd|z  |fS t        | j                  t              rt        | 5  ||      S t        d      c c}}w )Nr/   r9   z(%s)z=Composite field lookups only work with composite expressions.)r>   ziprR   rD   hasattrr   r9   compiler   r,   r   r   rB   process_rhsrL   )	r   r0   r1   colvalargsrh   ri   rF   s	           r    ro   zTupleLookupMixin.process_rhsg   s    ##% !$DHHdhh 7 !8HC sH- s1A1ABC !8   ##E4L11"**4884KC$((H-|V++DHHe,w*8Z@@ S !s   /C2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.)NotImplementedErrorrF   r4   )r   r0   r1   s      r    get_fallback_sqlz!TupleLookupMixin.get_fallback_sql}   s+    !~~&&' (W X
 	
r"   c                 z   |j                   j                  smt        | j                  t              rS| j                  j
                  r=t        | t        t        t        t        f      r| j                  }d| d}t        |      |j                   j                  s| j                  ||      S t        | =  ||      S )N"zN" cannot be used to target composite fields through subqueries on this backend)features*supports_tuple_comparison_against_subqueryr,   rD   r   subqueryr   r   r   r   rM   r   supports_tuple_lookupsru   rB   r/   )r   r0   r1   lookupmsgrF   s        r    r/   zTupleLookupMixin.as_sql   s    ##NN488U+!!{$6/R %%FF8 5 5  $C((""99((:>>w~h
33r"   r   )r4   r5   r6   r7   rC   r?   r@   rA   rK   re   rg   ro   ru   r/   __classcell__rF   s   @r    r<   r<   1   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)r,   rD   r   rB   r<   r/   ro   rl   rR   r   r   r   )r   r0   r1   rp   rq   lookupsrootrF   s          r    ru   zTupleExact.get_fallback_sql   s    dhh&)47*MM:. 47txx3JK3JxsC5c?3JKC0{{8Z00 Ls   %B!)r4   r5   r6   ru   r~   r   s   @r    r   r      s    
1 
1r"   r   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      )Nr*   r   z>The QuerySet value for an isnull lookup must be True or False.)rD   r,   rI   rJ   r   boolrL   )r   rD   s     r    rC   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 r   )rD   rR   r   r   r   r   r/   )r   r0   r1   rD   rp   r   r   s          r    r/   zTupleIsNull.as_sql   sR    
 hh/3xx8x6#s#x8#B3?{{8Z00 9s   AN)r4   r5   r6   rC   r/   r:   r"   r    r   r      s    
1r"   r   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   r   ro   	itertoolscycler   r   r   r   rR   rangerD   r$   nextr   rl   childrenappendr/   r   r0   r1   r   
connectorsrp   _	cols_listrq   	vals_list	cols_iter	vals_iterr|   r   r   nodechilds                    r    ru   z!TupleGreaterThan.get_fallback_sql   sR   :. //;"67__b#Y/
$(HH?HSeAhShSH	?$(HH?HSeAhShSH	?3B(	3B(	9o9og$	S!1 2iHHtIy1HC']FZ(Ivc3/0IFEMM  'D 2 {{8Z00# @?    E4E:Nr4   r5   r6   ru   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   r   r   r   s                    r    ru   z(TupleGreaterThanOrEqual.get_fallback_sql   sD   :. //;"67__b#Y/
$(HH?HSeAhShSH	?$(HH?HSeAhShSH	?O	O	9o9og$	S!1 2iHHtIy1HC']FZ(Ivc3/0IFEMM  'D 2 {{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   ro   r   r   r   r   r   r   rR   r   rD   r$   r   r   rl   r   r   r/   r   s                    r    ru   zTupleLessThan.get_fallback_sql   sR   :. //8U"34__b#Y/
$(HH?HSeAhShSH	?$(HH?HSeAhShSH	?3B(	3B(	9o9og$	S!1 2iHHtIy1HC']FZ(Ivc3/0IFEMM  'D 2 {{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    ru   z%TupleLessThanOrEqual.get_fallback_sql  sD   :. //8U"34__b#Y/
$(HH?HSeAhShSH	?$(HH?HSeAhShSH	?O	O	9o9og$	S!1 2iHHtIy1HC']FZ(Ivc3/0IFEMM  'D 2 {{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_queryrB   r<   rC   rD   rE   s    r    rC   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   )r,   rI   rJ   )r]   valss     r    r_   zETupleIn.check_rhs_is_collection_of_tuples_or_lists.<locals>.<genexpr>8  s     Hxt:dUDM2xs    "rH   z( must be a collection of tuples or lists)allrD   rK   rL   rM   rN   s     r    r   z2TupleIn.check_rhs_is_collection_of_tuples_or_lists7  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   )r]   r   rS   s     r    r_   zFTupleIn.check_rhs_elements_length_equals_lhs_length.<locals>.<genexpr>A  s     =HD7c$i'Hs   rH   rQ   z elements each)r   rR   r   rD   rK   rL   rM   )r   rO   rS   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 )NrU   z" must be a Query object (received rV   )	r,   rD   r   r
   rK   rF   r4   rL   rM   rW   s      r    r   zTupleIn.check_rhs_is_queryH  sp    $((UH$56&&(Ghh((11G##&&:7) D44;;aA  7r"   c                    | j                         st        t        |   ||      S | j                  }|st
        g }| j                  }|D ]l  }t        d |D              r|j                  t        t        ||      D cg c]*  \  }}t        |d      r|nt        ||j                        , c}}        n |st
        |j                  t        |       S c c}}w )Nc              3   $   K   | ]  }|d u  
 y wr   r:   r]   rq   s     r    r_   z&TupleIn.process_rhs.<locals>.<genexpr>a       /$33$;$   r/   rk   )r>   rB   r<   ro   rD   r   rR   anyr   r   rl   rm   r   r9   rn   )
r   r0   r1   rD   resultrR   r   rp   rq   rF   s
            r    ro   zTupleIn.process_rhsQ  s    ''))4<XzRRhh   hhD /$//MM ),C )7HC  'sH5  !&s9I9I!JK )7	 $   v//s   ?/Cc                    | j                   }|st        t        |t              rt        j
                  j                  fd|j                  |      j                         d   D              }|j                         }|j                  t        j                  t        | j                  |      D cg c]  \  }}t        ||       c}}        |j!                  t#        |            S | j%                         st&        t(        | W  ||      S t-        g t.              }| j                  }|D ]g  }	t1        d |	D              rt        ||	      D cg c]  \  }}t        ||       }
}}|j2                  j5                  t-        |
t6                     i |j2                  st        |j+                  ||      S c c}}w c c}}w )Nc              3   R   K   | ]  }t        |d    xt              rng   yw)r   N)r,   r   )r]   selectselect_exprs     r    r_   z+TupleIn.get_fallback_sql.<locals>.<genexpr>z  s>      6 VF "&)#;;hG  %' Vs   $')r1   r   r   c              3   $   K   | ]  }|d u  
 y wr   r:   r   s     r    r_   z+TupleIn.get_fallback_sql.<locals>.<genexpr>  r   r   )rD   r   r,   r   r   chainfrom_iterableget_compiler
get_selectcloneadd_qr   Qrl   rR   r   rn   r   r>   rB   r<   r/   r   r   r   r   r   r   )r   r0   r1   rD   	rhs_exprsrp   rq   r   rR   r   r   r   rF   s              @r    ru   zTupleIn.get_fallback_sqlu  s   hh  c5!!55 6 "..*.EPPRSTU6 I ))+CII3txx;ST;SxsC5c?;STU ##F3K00))+)47*MM
 r*hhD /$//7:3~F~83uS#~GFMM  7c!BC  }}  {{8Z00- U" Gs   3F=G)
r4   r5   r6   rC   r   r   r   ro   ru   r~   r   s   @r    r   r   +  s'    	"0H%1 %1r"   r   )exactgtgteltlteinisnull)%r   django.core.exceptionsr   	django.dbr   r   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<   r   r   r   r   r   r   r   tuple_lookupsr:   r"   r    <module>r      s     1 /    ' 9 91D 1.c4 c4L1!5 11"F 1,1' 181.0B 181$h 181+_ 18o1 o1f 
"

r"   