o
    ^"<f=Z                     @   s  d dl Z d dlZ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 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ZG dd dee	ZG dd deZG dd dZG dd deZ G dd deeZ!ej"G dd deeZ#ej"G dd deZ$ej"G dd deeZ%ej"G dd deeZ&ej"G dd  d eeZ'ej"G d!d" d"eeZ(G d#d$ d$Z)ej"G d%d& d&e)e&Z*ej"G d'd( d(e)e'Z+ej"G d)d* d*e eZ,G d+d, d,eZ-ej"G d-d. d.e-Z.ej"G d/d0 d0e.Z/ej"G d1d2 d2e-Z0ej"G d3d4 d4e0Z1ej"G d5d6 d6e-Z2ej"G d7d8 d8e2Z3ej"G d9d: d:e eZ4ej"G d;d< d<eZ5ej"G d=d> d>eZ6ej"G d?d@ d@e6Z7G dAdB dBeZ8G dCdD dDe8e#Z9G dEdF dFe8e%Z:G dGdH dHe8e&Z;G dIdJ dJe8e'Z<G dKdL dLe8e(Z=G dMdN dNZ>ej"G dOdP dPe>e$Z?ej"G dQdR dRe>e.Z@ej"G dSdT dTe>e/ZAej"G dUdV dVe>e0ZBej"G dWdX dXe>e1ZCej"G dYdZ dZe>e2ZDej"G d[d\ d\e>e3ZEdS )]    N)copy)EmptyResultSet)CaseExistsFuncValueWhen)	CharFieldDateTimeFieldFieldIntegerField	UUIDField)RegisterLookupMixin)
OrderedSet)RemovedInDjango40Warning)cached_property)make_hashablec                   @   s   e Zd ZdZdZdZdd Zdd Zd,dd	Zd
d Z	dd Z
dd Zdd Zd,ddZdd Zdd Zdd Zd,ddZdd Zdd Zed d! Zed"d# Zed$d% Zed&d' Zd(d) Zd*d+ ZdS )-LookupNTFc                 C   s`   ||| _ | _|  | _t| j dr| j  }ng }|r+ddlm} t||r+td|| _	d S )Nget_bilateral_transformsr   QueryzBBilateral transformations on nested querysets are not implemented.)
lhsrhsget_prep_lookuphasattrr   django.db.models.sql.queryr   
isinstanceNotImplementedErrorbilateral_transforms)selfr   r   r   r    r    O/var/www/html/kck/venv/lib/python3.10/site-packages/django/db/models/lookups.py__init__   s   


zLookup.__init__c                 C   s   | j D ]}||}q|S N)r   )r   value	transformr    r    r!   apply_bilateral_transforms(   s   

z!Lookup.apply_bilateral_transformsc                 C   s   |d u r| j }| jr<g g }}|D ]&}t|| jjd}| |}||j}||\}}	|	| |
|	 q||fS | ||\}
}dgt| |}}||fS )Noutput_field%s)r   r   r   r   r(   r&   resolve_expressionquerycompileappendextendget_db_prep_lookuplen)r   compiler
connectionr   sqlssqls_paramspr$   sql
sql_params_paramsr    r    r!   batch_process_rhs-   s   


zLookup.batch_process_rhsc                 C   s   |   r| jgS | j| jgS r#   )rhs_is_direct_valuer   r   r   r    r    r!   get_source_expressions>   s   zLookup.get_source_expressionsc                 C   s*   t |dkr|d | _d S |\| _| _d S )N   r   )r0   r   r   )r   	new_exprsr    r    r!   set_source_expressionsC   s   zLookup.set_source_expressionsc                 C   s<   t | jdr	| jS | jrt | jjdr| jj| jS | jS Nr*   get_prep_value)r   r   prepare_rhsr   r(   rB   r<   r    r    r!   r   I   s
   zLookup.get_prep_lookupc                 C   s
   d|gfS )Nr)   r    )r   r$   r2   r    r    r!   r/   P   s   
zLookup.get_db_prep_lookupc                 C   s*   |p| j }t|dr||j}||S )Nr*   )r   r   r*   r+   r,   )r   r1   r2   r   r    r    r!   process_lhsS   s   


zLookup.process_lhsc                 C   sZ   | j }| jr|  rt|| jjd}| |}||j}t	|dr'|
|S | ||S )Nr'   as_sql)r   r   r;   r   r   r(   r&   r*   r+   r   r,   r/   )r   r1   r2   r$   r    r    r!   process_rhsY   s   


zLookup.process_rhsc                 C   s   t | jd S NrE   )r   r   r<   r    r    r!   r;   g      zLookup.rhs_is_direct_valuec                 C   s4   t | }|j||_t|jdr|j||_|S )Nrelabeled_clone)r   r   rI   r   r   )r   relabelsnewr    r    r!   rI   j   s
   zLookup.relabeled_clonec                 C   s*   | j  }t| jdr|| j  |S )Nget_group_by_cols)r   rL   r   r   r.   )r   aliascolsr    r    r!   rL   q   s   
zLookup.get_group_by_colsc                 C   s   t r#   r   r   r1   r2   r    r    r!   rE   w      zLookup.as_sqlc                 C   sf   d}g }| j | jfD ]}t|trtt|dddd}d}|| q
|r+t| | n| }|||S )NFT)then)default)	r   r   r   r   r   r   r-   typerE   )r   r1   r2   wrappedexprsexprlookupr    r    r!   	as_oraclez   s   
zLookup.as_oraclec                 C      | j jp
t| jddS )Ncontains_aggregateF)r   r[   getattrr   r<   r    r    r!   r[         zLookup.contains_aggregatec                 C   rZ   )Ncontains_over_clauseF)r   r^   r\   r   r<   r    r    r!   r^      r]   zLookup.contains_over_clausec                 C   rZ   )N
is_summaryF)r   r_   r\   r   r<   r    r    r!   r_      r]   zLookup.is_summaryc                 C   s   | j | j| jfS r#   )	__class__r   r   r<   r    r    r!   identity   s   zLookup.identityc                 C   s   t |tstS | j|jkS r#   )r   r   NotImplementedra   )r   otherr    r    r!   __eq__   s   
zLookup.__eq__c                 C   s   t t| jS r#   )hashr   ra   r<   r    r    r!   __hash__   rH   zLookup.__hash__r#   )__name__
__module____qualname__lookup_namerC   can_use_none_as_rhsr"   r&   r:   r=   r@   r   r/   rD   rF   r;   rI   rL   rE   rY   r   r[   r^   propertyr_   ra   rd   rf   r    r    r    r!   r      s8    






r   c                   @   s,   e Zd ZdZdZdZedd Zdd ZdS )		Transformz
    RegisterLookupMixin() is first so that get_lookup() and get_transform()
    first examine self and then check output_field.
    Fr>   c                 C   s   |   d S Nr   )r=   r<   r    r    r!   r      s   zTransform.lhsc                 C   s2   t | jdr| j }ng }| jr|| j |S )Nr   )r   r   r   	bilateralr-   r`   )r   r   r    r    r!   r      s   z"Transform.get_bilateral_transformsN)	rg   rh   ri   __doc__ro   arityrl   r   r   r    r    r    r!   rm      s    
rm   c                       s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	BuiltinLookupNc                    sb   t  |||\}}| jj }| jjj|d}|j||| }|j| j	|| }|t
|fS )N)r2   )superrD   r   r(   get_internal_typedb_typeopsfield_cast_sqllookup_castrj   list)r   r1   r2   r   lhs_sqlr9   field_internal_typeru   r`   r    r!   rD      s   zBuiltinLookup.process_lhsc                 C   sF   |  ||\}}| ||\}}|| | ||}d||f |fS Nz%s %s)rD   rF   r.   
get_rhs_op)r   r1   r2   rz   r9   rhs_sql
rhs_paramsr    r    r!   rE      s
   
zBuiltinLookup.as_sqlc                 C      |j | j | S r#   	operatorsrj   r   r2   r   r    r    r!   r~         zBuiltinLookup.get_rhs_opr#   )rg   rh   ri   rD   rE   r~   __classcell__r    r    r|   r!   rr      s    	rr   c                   @      e Zd ZdZdZdd ZdS )FieldGetDbPrepValueMixinzZ
    Some lookups require Field.get_db_prep_value() to be called on their
    inputs.
    Fc                    sV   t | jjdd }t |dd p| jjjd| jr" fdd|D fS | ddgfS )Ntarget_fieldget_db_prep_valuer)   c                    s   g | ]	}| d dqS )Tpreparedr    ).0vr2   r   r    r!   
<listcomp>   s    z?FieldGetDbPrepValueMixin.get_db_prep_lookup.<locals>.<listcomp>Tr   )r\   r   r(   r   $get_db_prep_lookup_value_is_iterable)r   r$   r2   fieldr    r   r!   r/      s   z+FieldGetDbPrepValueMixin.get_db_prep_lookupN)rg   rh   ri   rp   r   r/   r    r    r    r!   r      s    r   c                       sB   e Zd ZdZdZdd Z fddZdd Zd fd
d	Z  Z	S ) FieldGetDbPrepValueIterableMixinzg
    Some lookups require Field.get_db_prep_value() to be called on each value
    in an iterable.
    Tc                 C   s^   t | jdr	| jS g }| jD ]}t |drn| jr't | jjdr'| jj|}|| q|S rA   )r   r   rC   r   r(   rB   r-   )r   prepared_values	rhs_valuer    r    r!   r      s   

z0FieldGetDbPrepValueIterableMixin.get_prep_lookupc                    s"   |   r
| ||S t ||S r#   )r;   r:   rs   rF   rP   r|   r    r!   rF      s   z,FieldGetDbPrepValueIterableMixin.process_rhsc                 C   s<   |g}t |dr||j}t |dr||\}}||fS )Nr*   rE   )r   r*   r+   r,   )r   r1   r2   r6   paramr9   r    r    r!   resolve_expression_parameter   s   

z=FieldGetDbPrepValueIterableMixin.resolve_expression_parameterNc                    sJ   t   |}t fddt| D  \}}tj|}|t|fS )Nc                 3   s$    | ]\}}  ||V  qd S r#   )r   )r   r6   r   r1   r2   r   r    r!   	<genexpr>
  s
    
zEFieldGetDbPrepValueIterableMixin.batch_process_rhs.<locals>.<genexpr>)rs   r:   zip	itertoolschainfrom_iterabletuple)r   r1   r2   r   pre_processedr6   r9   r|   r   r!   r:     s   z2FieldGetDbPrepValueIterableMixin.batch_process_rhsr#   )
rg   rh   ri   rp   r   r   rF   r   r:   r   r    r    r|   r!   r      s    r   c                   @   s   e Zd ZdZdZdd ZdS )PostgresOperatorLookupz*Lookup defined by operators on PostgreSQL.Nc                 C   sD   |  ||\}}| ||\}}t|t| }d|| j|f |fS )Nz%s %s %s)rD   rF   r   postgres_operator)r   r1   r2   r   
lhs_paramsr   r   r9   r    r    r!   as_postgresql  s   z$PostgresOperatorLookup.as_postgresql)rg   rh   ri   rp   r   r   r    r    r    r!   r     s    r   c                       s,   e Zd ZdZ fddZ fddZ  ZS )Exactexactc                    sZ   ddl m} t| j|r&| j r"| jjs!| j  | jdg ntdt	 
||S )Nr   r   pkzSThe QuerySet value for an exact lookup must be limited to one result using slicing.)r   r   r   r   has_limit_onehas_select_fieldsclear_select_clause
add_fields
ValueErrorrs   rF   )r   r1   r2   r   r|   r    r!   rF   !  s   

zExact.process_rhsc                    s`   t | jtr)t| jddr)|j| jr)| ||\}}| jr!dnd}|| |fS t 	||S )NconditionalFr)   zNOT %s)
r   r   boolr\   r   rv   0conditional_expression_supported_in_where_clauserD   rs   rE   )r   r1   r2   rz   r9   templater|   r    r!   rE   /  s   
zExact.as_sql)rg   rh   ri   rj   rF   rE   r   r    r    r|   r!   r     s    r   c                       $   e Zd ZdZdZ fddZ  ZS )IExactiexactFc                    s2   t  ||\}}|r|j|d |d< ||fS rn   )rs   rF   rv   prep_for_iexact_queryr   qnr2   r   r9   r|   r    r!   rF   C  s   zIExact.process_rhs)rg   rh   ri   rj   rC   rF   r   r    r    r|   r!   r   >      r   c                   @      e Zd ZdZdS )GreaterThangtNrg   rh   ri   rj   r    r    r    r!   r   J      r   c                   @   r   )GreaterThanOrEqualgteNr   r    r    r    r!   r   O  r   r   c                   @   r   )LessThanltNr   r    r    r    r!   r   T  r   r   c                   @   r   )LessThanOrEquallteNr   r    r    r    r!   r   Y  r   r   c                           e Zd ZdZ fddZ  ZS )IntegerFieldFloatRoundingz
    Allow floats to work as query values for IntegerField. Without this, the
    decimal portion of the float would always be discarded.
    c                    s$   t | jtrt| j| _t  S r#   )r   r   floatmathceilrs   r   r<   r|   r    r!   r   c  s   
z)IntegerFieldFloatRounding.get_prep_lookup)rg   rh   ri   rp   r   r   r    r    r|   r!   r   ^      r   c                   @      e Zd ZdS )IntegerGreaterThanOrEqualNrg   rh   ri   r    r    r    r!   r   i      r   c                   @   r   )IntegerLessThanNr   r    r    r    r!   r   n  r   r   c                       s<   e Zd ZdZ fddZdd Z fddZdd	 Z  ZS )
Ininc                    s   t | jdd }|d ur||jkrtd|  rPzt| j}|d  W n ty5   dd | jD }Y nw |s:t| 	|||\}}dd
| d }||fS t | jdd	sc| j  | jd
g t ||S )N_dbzvSubqueries aren't allowed across different databases. Force the inner query to be evaluated using `list(inner_query)`.c                 S   s   g | ]}|d ur|qS r#   r    )r   rr    r    r!   r     s    z"In.process_rhs.<locals>.<listcomp>(, )r   Tr   )r\   r   rM   r   r;   r   discard	TypeErrorr   r:   joinr   r   rs   rF   )r   r1   r2   db_rhsr   r3   r4   placeholderr|   r    r!   rF   w  s*   

zIn.process_rhsc                 C   s   d| S )NzIN %sr    r   r    r    r!   r~        zIn.get_rhs_opc                    s>   |j  }|  r|rt| j|kr| ||S t ||S r#   )rv   max_in_list_sizer;   r0   r   split_parameter_list_as_sqlrs   rE   )r   r1   r2   r   r|   r    r!   rE     s   
z	In.as_sqlc                 C   s   |j  }| ||\}}| ||\}}dg}g }	tdt||D ];}
|
dkr-|d |d|  |	| ||
|
|  }||
|
|  }d|}|| |d |	| q"|d d||	fS )Nr   r   z OR z%s IN (r   r    )	rv   r   rD   r:   ranger0   r-   r.   r   )r   r1   r2   r   r   r   r   r   in_clause_elementsr9   offsetr3   r4   param_groupr    r    r!   r     s$   






zIn.split_parameter_list_as_sql)	rg   rh   ri   rj   rF   r~   rE   r   r   r    r    r|   r!   r   s  s    r   c                       s0   e Zd ZdZdZ fddZ fddZ  ZS )PatternLookupz%%%s%%Fc                    s>   t | jds	| jr|j| j |j}||S t ||S rG   )	r   r   r   pattern_opsrj   formatpattern_escrs   r~   )r   r2   r   patternr|   r    r!   r~     s   

zPatternLookup.get_rhs_opc                    sF   t  ||\}}|  r|r| js| j|j|d  |d< ||fS rn   )rs   rF   r;   r   param_patternrv   prep_for_like_queryr   r|   r    r!   rF     s   zPatternLookup.process_rhs)rg   rh   ri   r   rC   r~   rF   r   r    r    r|   r!   r     s
    r   c                   @   r   )ContainscontainsNr   r    r    r    r!   r     r   r   c                   @   r   )	IContains	icontainsNr   r    r    r    r!   r     r   r   c                   @      e Zd ZdZdZdS )
StartsWith
startswithz%s%%Nrg   rh   ri   rj   r   r    r    r    r!   r         r   c                   @   r   )IStartsWithistartswithNr   r    r    r    r!   r     r   r   c                   @   r   )EndsWithendswithz%%%sNr   r    r    r    r!   r     r   r   c                   @   r   )	IEndsWith	iendswithNr   r    r    r    r!   r     r   r   c                   @   s   e Zd ZdZdd ZdS )Ranger   c                 C   s   d|d |d f S )NBETWEEN %s AND %sr   r>   r    r   r    r    r!   r~     s   zRange.get_rhs_opN)rg   rh   ri   rj   r~   r    r    r    r!   r     s    r   c                   @   r   )IsNullisnullFc                 C   sF   t | jtstdt || j\}}| jrd| |fS d| |fS )NzXUsing a non-boolean value for an isnull lookup is deprecated, use True or False instead.z
%s IS NULLz%s IS NOT NULL)r   r   r   warningswarnr   r,   r   )r   r1   r2   r6   r9   r    r    r!   rE     s   zIsNull.as_sqlN)rg   rh   ri   rj   rC   rE   r    r    r    r!   r     s    r   c                       r   )RegexregexFc                    s\   | j |jv rt ||S | ||\}}| ||\}}|j| j }|||f || fS r#   )rj   r   rs   rE   rD   rF   rv   regex_lookup)r   r1   r2   r   r   r   r   sql_templater|   r    r!   rE     s   zRegex.as_sql)rg   rh   ri   rj   rC   rE   r   r    r    r|   r!   r     r   r   c                   @   r   )IRegexiregexNr   r    r    r    r!   r    r   r  c                       s4   e Zd Zdd Z fddZdd Zdd Z  ZS )	
YearLookupc                 C   s4   | j j j}t|tr|j|}|S |j|}|S r#   )r   r(   r   r
   rv   %year_lookup_bounds_for_datetime_field!year_lookup_bounds_for_date_field)r   r2   yearr(   boundsr    r    r!   year_lookup_bounds%  s   

zYearLookup.year_lookup_boundsc           	         s|   |   r7| ||| jj\}}| ||\}}| ||}| || j\}}|| || d||f |fS t	 
||S r}   )r;   rD   r   rF   get_direct_rhs_sqlr  r   r.   get_bound_paramsrs   rE   )	r   r1   r2   rz   r9   r   r8   startfinishr|   r    r!   rE   -  s   zYearLookup.as_sqlc                 C   r   r#   r   r   r    r    r!   r	  ;  r   zYearLookup.get_direct_rhs_sqlc                 C   s   t d)NzAsubclasses of YearLookup must provide a get_bound_params() methodrO   r   r  r  r    r    r!   r
  >  s   zYearLookup.get_bound_params)rg   rh   ri   r  rE   r	  r
  r   r    r    r|   r!   r  $  s
    r  c                   @   s   e Zd Zdd Zdd ZdS )	YearExactc                 C   s   dS )Nr   r    r   r    r    r!   r	  E  rQ   zYearExact.get_direct_rhs_sqlc                 C   s   ||fS r#   r    r  r    r    r!   r
  H  r   zYearExact.get_bound_paramsN)rg   rh   ri   r	  r
  r    r    r    r!   r  D  s    r  c                   @      e Zd Zdd ZdS )YearGtc                 C      |fS r#   r    r  r    r    r!   r
  M     zYearGt.get_bound_paramsNrg   rh   ri   r
  r    r    r    r!   r  L      r  c                   @   r  )YearGtec                 C      |fS r#   r    r  r    r    r!   r
  R  r  zYearGte.get_bound_paramsNr  r    r    r    r!   r  Q  r  r  c                   @   r  )YearLtc                 C   r  r#   r    r  r    r    r!   r
  W  r  zYearLt.get_bound_paramsNr  r    r    r    r!   r  V  r  r  c                   @   r  )YearLtec                 C   r  r#   r    r  r    r    r!   r
  \  r  zYearLte.get_bound_paramsNr  r    r    r    r!   r  [  r  r  c                       r   )UUIDTextMixinzs
    Strip hyphens from a value when filtering a UUIDField on backends without
    a native datatype for UUID.
    c                    s`   |j js#ddlm} |  rt| j| _|| jtdtdt d| _t 	||\}}||fS )Nr   )Replace-r   r'   )
featureshas_native_uuid_fielddjango.db.models.functionsr  r;   r   r   r	   rs   rF   )r   r   r2   r  r   r9   r|   r    r!   rF   e  s   zUUIDTextMixin.process_rhs)rg   rh   ri   rp   rF   r   r    r    r|   r!   r  `  r   r  c                   @   r   )
UUIDIExactNr   r    r    r    r!   r  o  r   r  c                   @   r   )UUIDContainsNr   r    r    r    r!   r   t  r   r   c                   @   r   )UUIDIContainsNr   r    r    r    r!   r!  y  r   r!  c                   @   r   )UUIDStartsWithNr   r    r    r    r!   r"  ~  r   r"  c                   @   r   )UUIDIStartsWithNr   r    r    r    r!   r#    r   r#  c                   @   r   )UUIDEndsWithNr   r    r    r    r!   r$    r   r$  c                   @   r   )UUIDIEndsWithNr   r    r    r    r!   r%    r   r%  )Fr   r   r   r   django.core.exceptionsr   django.db.models.expressionsr   r   r   r   r   django.db.models.fieldsr	   r
   r   r   r   django.db.models.query_utilsr   django.utils.datastructuresr   django.utils.deprecationr   django.utils.functionalr   django.utils.hashabler   r   rm   rr   r   r   r   register_lookupr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r    r    r    r!   <module>   s     3 A 