
    ihK                     p   d Z 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	 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  ej        d          Z edd          Zd Z G d dej                  Z G d d          Z G d d          Z G d d          Z d Z!d Z"d Z# G d d          Z$dS )z
Various data structures used in query construction.

Factored out from django.db.models.query to avoid making the main module very
large and/or so that they can be used by other modules without getting into
circular import difficulties.
    N)
namedtuple)nullcontext)
FieldError)DEFAULT_DB_ALIASDatabaseErrorconnectionsmodelstransaction)
LOOKUP_SEP)tree)cached_property)make_hashabledjango.db.modelsPathInfozGfrom_opts to_opts target_fields join_field m2m direct filtered_relationc              #   j   K   | V  |                                  D ]}t          |          E d {V  d S N)__subclasses__
subclassesclssubclasss     S/var/www/histauto/venv/lib/python3.11/site-packages/django/db/models/query_utils.pyr   r   !   sW      
III&&(( ( (h''''''''''( (    c                        e Zd ZdZdZdZdZeZdZddd fd	
Z	d
 Z
d Zd Zd Zd Z	 ddZd Zd ZefdZd Zed             Zd Zd Zed             Z xZS )Qze
    Encapsulate filters as objects that can then be combined logically (using
    `&` and `|`).
    ANDORXORTNF)
_connector_negatedc                    t                                          g |t          |                                          ||           d S )N)children	connectornegated)super__init__sorteditems)selfr   r    argskwargs	__class__s        r   r&   z
Q.__init__4   sQ    5t5fV\\^^445  	 	
 	
 	
 	
 	
r   c                 P   t          |dd          du rt          |          | s|                                S |s)t          |t                    r|                                 S |                     |          }|                    | |           |                    ||           |S )NconditionalF)r#   )getattr	TypeErrorcopy
isinstancer   createadd)r)   otherconnobjs       r   _combinez
Q._combine;   s    5-//588E""" 	 ::<< 	E1-- 	99;;kkDk))dt
r   c                 8    |                      || j                  S r   )r8   r   r)   r5   s     r   __or__zQ.__or__H   s    }}UDG,,,r   c                 8    |                      || j                  S r   )r8   r   r:   s     r   __and__z	Q.__and__K       }}UDH---r   c                 8    |                      || j                  S r   )r8   r   r:   s     r   __xor__z	Q.__xor__N   r>   r   c                 V    |                                  }|                                 |S r   )r1   negate)r)   r7   s     r   
__invert__zQ.__invert__Q   s!    iikk


r   c                 l    |                     | ||dd|          \  }}|                    |           |S )NF)allow_joins
split_subqcheck_filterable	summarize)_add_qpromote_joins)r)   queryrE   reuserH   for_saveclausejoinss           r   resolve_expressionzQ.resolve_expressionV   sM    
 #" % 
 
 	E"""r   c                    |s| S |                      | j        | j                  }| j        D ]*}|}t	          |t
                    r|\  }}t          |v r|                    t          d          \  }}n|}d }t          j	        |          }	|	
                    |          x}
|	ur|d}|
                    |          x}:|
                    |          x}	 " ||
          }
d}|
                    |          }||dk    r|
                    d          }d}| ||
|          }n|
                    |          }|j                            |           ,|S )N)r#   r$      exactisnullT)r3   r#   r$   r"   r2   tupler   rsplitr	   Freplace_expressions
get_lookupget_transformappend)r)   replacementsclonechildchild_replacementlhsrhspathlookupfieldfield_replacementlookup_classtransform_classs                r   rX   zQ.replace_expressionsf   s    	KdndlKK]  	5  	5E %%'' L S$$#&::j!#<#<LD&&D!F).)B)B<)P)PP%  ~!((9(D(DV(L(LLU/@/N/Nv/V/VVO!%& 1@@Q0R0R-%,F+<+G+G+O+OL{v'8'8'8'C'CH'M'M"#/,8L9JC,P,P)$)$=$=l$K$K!N!!"34444r   c              #      K   | V  | j         D ]N}t          |t                    r|d         }t          |d          r|                                E d{V  J|V  OdS )zg
        Recursively yield this Q object and all subexpressions, in depth-first
        order.
        rR   flattenN)r"   r2   rU   hasattrri   )r)   r^   s     r   ri   z	Q.flatten   s      
 


] 	 	E%'' !aui((  ==??********	 	r   c           
      >   ddl m}m} ddlm} ddlm} ddlm}  |d          }|	                                D ]8\  }	}
t          |
d          s ||
          }
|                    |
|	d	           9|                     |d
          d           t          |         }|j        j        r7|                    t!           || d |                                           n|                    |            |                    |          }|j        rt'          j        |          nt+                      }	 |5  |                    |          ducddd           S # 1 swxY w Y   dS # t.          $ r'}t0                              d| |           Y d}~dS d}~ww xY w)z|
        Do a database query to check if the expressions of the Q instance
        matches against the expressions.
        r   )BooleanFieldValue)Coalesce)Query)SINGLENrP   F)selectrR   _checkT)output_field)usingz.Got a database error calling check() on %r: %s)django.db.modelsrl   rm   django.db.models.functionsrn   django.db.models.sqlro   django.db.models.sql.constantsrp   r(   rj   add_annotationr   featuressupports_comparing_boolean_expradd_qr   get_compilerin_atomic_blockr
   atomicr   execute_sqlr   loggerwarning)r)   againstrt   rl   rm   rn   ro   rp   rK   namevalue
connectioncompilercontext_manageres                  r   checkzQ.check   sS    	98888888777777......999999d"==?? 	< 	<KD%5"677 %e  U ;;;;UU1XXx000 '
> 	KK((4LLNNKKKLLMMMMKK%%E%22 )KU++++ 	
	  @ @++F334?@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 	 	 	NNKTSTUUU44444	s<   8E+ :EE+ E""E+ %E"&E+ +
F5FFc                    | j         j        d| j         j        }|                    d          r|                    dd          }t          | j                  }i }| j        | j        k    r
| j        |d<   | j	        rd|d<   |||fS )N.zdjango.db.models.query_utilsr   r   Tr    )
r,   
__module____name__
startswithreplacerU   r"   r#   defaultr$   )r)   rb   r*   r+   s       r   deconstructzQ.deconstruct   s    .333T^5L5LM??9:: 	T<< >@RSSDT]##>T\))#'>F< < 	&!%F:T6!!r   c                 4   |                                  \  }}}|g|                                }|D ]X}t          |t                    r,|\  }}t	          |          }|                    ||f           C|                    |           Yt          |          S r   )r   r(   r2   rU   r   r[   )r)   rb   r*   r+   identityr^   argr   s           r   r   z
Q.identity   s    !--//dF*6<<>>* 	' 	'E%'' '"
U%e,,e----&&&&Xr   c                 Z    t          |t                    st          S |j        | j        k    S r   )r2   r   NotImplementedr   r:   s     r   __eq__zQ.__eq__   s)    %## 	"!!~..r   c                 *    t          | j                  S r   )hashr   )r)   s    r   __hash__z
Q.__hash__   s    DM"""r   c                 L    ddl m} d |                    |           D             S )z
        Retrieve all base fields referenced directly or through F expressions
        excluding any fields referenced through joins.
        r   )rK   c                 P    h | ]#}|                     t          d           d         $S )rR   r   )splitr   ).0r^   s     r   	<setcomp>z+Q.referenced_base_fields.<locals>.<setcomp>   s8     
 
 
.3EKK
A&&q)
 
 
r   )rw   rK   get_children_from_q)r)   rK   s     r   referenced_base_fieldszQ.referenced_base_fields   sF     	/.....
 
7<7P7PQU7V7V
 
 
 	
r   )NTNFF)r   r   __qualname____doc__r   r   r   r   r.   r&   r8   r;   r=   r@   rC   rP   rX   ri   r   r   r   r   r   r   r   r   __classcell__)r,   s   @r   r   r   '   sn         C	B
CGK)- 
 
 
 
 
 
 
  - - -. . .. . .   SX    % % %N   $4 " " " "H
" 
" 
" 
 
 _
/ / /
# # # 

 

 _

 

 

 

 

r   r   c                   &    e Zd ZdZd ZddZd ZdS )DeferredAttributez
    A wrapper for a deferred-loading field. When the value is read from this
    object the first time, the query is executed.
    c                     || _         d S r   )rd   )r)   rd   s     r   r&   zDeferredAttribute.__init__   s    


r   Nc                    || S |j         }| j        j        }||vrc|                     |          }|G|                                s| j        j        rt          d          |                    |g           n|||<   ||         S )zx
        Retrieve and caches the value from the datastore on the first lookup.
        Return the cached value.
        Nz4Cannot read a generated field from an unsaved model.)fields)__dict__rd   attname_check_parent_chain
_is_pk_set	generatedAttributeErrorrefresh_from_db)r)   instancer   data
field_namevals         r   __get__zDeferredAttribute.__get__   s    
 K Z'
T!! **844C{**,, 1E (N   (((====#&Z Jr   c                     |j         }|                    | j        j                  }| j        j        r | j        |k    rt          ||j                  S dS )z
        Check if the field value can be fetched from a parent field already
        loaded in the instance. This can be done if the to-be fetched
        field is a primary key field.
        N)_metaget_ancestor_linkrd   modelprimary_keyr/   r   )r)   r   opts
link_fields       r   r   z%DeferredAttribute._check_parent_chain  sT     ~++DJ,<==
:! 	9djJ&>&>8Z%7888tr   r   )r   r   r   r   r&   r   r    r   r   r   r      sP         
         .
 
 
 
 
r   r   c                       e Zd ZdZd Zd ZdS )class_or_instance_methodz
    Hook used in RegisterLookupMixin to return partial functions depending on
    the caller type (instance or class of models.Field).
    c                 "    || _         || _        d S r   )class_methodinstance_method)r)   r   r   s      r   r&   z!class_or_instance_method.__init__"  s    (.r   c                 n    |t          j        | j        |          S t          j        | j        |          S r   )	functoolspartialr   r   )r)   r   owners      r   r   z class_or_instance_method.__get__&  s4    $T%6>>> !5x@@@r   N)r   r   r   r   r&   r   r   r   r   r   r     sA         
/ / /A A A A Ar   r   c                      e Zd Zd Zej        d             Zd Z eee          Z	 e
e          Zd Zd Zed             Ze
d             Zdd	Zdd
Z eee          Z e
e          ZddZddZ eee          Z e
e          ZdS )RegisterLookupMixinc                 R    |                                                      |d           S r   )get_lookupsget)r)   lookup_names     r   _get_lookupzRegisterLookupMixin._get_lookup-  s$    !!%%k4888r   c                 h    d t          j        |           D             }|                     |          S )Nc                 D    g | ]}|j                             d i           S )class_lookups)r   r   )r   parents     r   
<listcomp>z9RegisterLookupMixin.get_class_lookups.<locals>.<listcomp>2  s7     
 
 
9?FO44
 
 
r   )inspectgetmromerge_dicts)r   r   s     r   get_class_lookupsz%RegisterLookupMixin.get_class_lookups0  s?    
 
CJ>RUCVCV
 
 
 }---r   c                 `    |                                  }t          | dd           x}ri ||S |S Ninstance_lookups)r   r/   )r)   r   r   s      r   get_instance_lookupsz(RegisterLookupMixin.get_instance_lookups7  sE    ..00&t-?FFF 	98m8'788r   c                     ddl m} |                     |          }|*t          | d          r| j                            |          S |t          ||          sd S |S )Nr   )Lookuprs   )django.db.models.lookupsr   r   rj   rs   rY   
issubclass)r)   r   r   founds       r   rY   zRegisterLookupMixin.get_lookup@  sp    333333  --=WT>::=$//<<<Zv%>%>4r   c                     ddl m} |                     |          }|*t          | d          r| j                            |          S |t          ||          sd S |S )Nr   )	Transformrs   )r   r   r   rj   rs   rZ   r   )r)   r   r   r   s       r   rZ   z!RegisterLookupMixin.get_transformJ  sp    666666  --=WT>::=$22;???Zy%A%A4r   c                 X    i }t          |           D ]}|                    |           |S )z
        Merge dicts in reverse to preference the order of the original list. e.g.,
        merge_dicts([a, b]) will preference the keys in 'a' over those in 'b'.
        )reversedupdate)dictsmergedds      r   r   zRegisterLookupMixin.merge_dictsT  s8     % 	 	AMM!r   c                 \    t          |           D ]}|j                                         d S r   )r   r   cache_clearr   s     r   _clear_cached_class_lookupsz/RegisterLookupMixin._clear_cached_class_lookups_  s9    "3 	5 	5H&224444	5 	5r   Nc                 t    ||j         }d| j        vri | _        || j        |<   |                                  |S )Nr   )r   r   r   r   r   rc   r   s      r   register_class_lookupz)RegisterLookupMixin.register_class_lookupd  sI     ,K#,.. "C)/+&'')))r   c                 L    ||j         }d| j        vri | _        || j        |<   |S r   )r   r   r   r)   rc   r   s      r   register_instance_lookupz,RegisterLookupMixin.register_instance_lookupm  s7     ,KT]22$&D!-3k*r   c                 P    ||j         }| j        |= |                                  dS )zn
        Remove given lookup from cls lookups. For use in tests only as it's
        not thread-safe.
        N)r   r   r   r   s      r   _unregister_class_lookupz,RegisterLookupMixin._unregister_class_lookupz  s5    
  ,Kk*'')))))r   c                 (    ||j         }| j        |= dS )zs
        Remove given lookup from instance lookups. For use in tests only as
        it's not thread-safe.
        N)r   r   r   s      r   _unregister_instance_lookupz/RegisterLookupMixin._unregister_instance_lookup  s#    
  ,K!+...r   r   )r   r   r   r   r   cacher   r   r   r   classmethodrY   rZ   staticmethodr   r   r   r   register_lookupr   r   _unregister_lookupr   r   r   r   r   ,  sq       9 9 9 _. . _.   +*+<>RSSK#$566       \ 5 5 [5       /.7 O (K(=>>* * * */ / / / 21 "=   +{+CDDr   r   c                     | j         sdS t          | j         dd          rdS |s| j         S | j        |vrdS |r.| |vr*t	          d| j        j        j         d| j         d          dS )a  
    Return whether `field` should be used to descend deeper for
    `select_related()` purposes.

    Arguments:
     * `field` - the field to be checked. Can be either a `Field` or
       `ForeignObjectRel` instance.
     * `restricted` - a boolean field, indicating if the field list has been
       manually restricted using a select_related() clause.
     * `requested` - the select_related() dictionary.
     * `select_mask` - the dictionary of selected fields.
    Fparent_linkzField r   zM cannot be both deferred and traversed using select_related at the same time.T)remote_fieldr/   nullr   r   r   r   object_name)rd   
restricted	requestedselect_masks       r   select_related_descendr    s      u u!=%88 u  :~ z""u  
uK//LU[&2 L LUZ L L L
 
 	
 4r   c                     t          dt          |           dz             D ]A}t          j        | d|                   }|                    |          r|| |d         fc S BdS )z
    Check if the lookup_parts contains references to the given annotations set.
    Because the LOOKUP_SEP is contained in the default annotation names, check
    each prefix of the lookup_parts for a match.
    rR   r   N)Nr   )rangelenr   joinr   )lookup_partsannotationsnlevel_n_lookups       r   refs_expressionr    sz     1c,''!+,, 4 4#ac):;;??>** 	4!<#33333	48r   c                 p      fd} ||          p%t          |dd          o ||j        j                  S )z
    Check that self.model is compatible with target_opts. Compatibility
    is OK if:
      1) model and opts match (where proxy inheritance is removed)
      2) model is parent of opts' model or the other way around
    c                 f    j         j        | j        k    p| j        j         j        v p| j        v S r   )r   concrete_modelall_parents)r   r   s    r   r   z-check_rel_lookup_compatibility.<locals>.check  s=    K&$*== )"ek&==)((	
r   r   F)r/   r   r   )r   target_optsrd   r   s   `   r   check_rel_lookup_compatibilityr    sX    
 
 
 
 
  5 }e,,Iu{7H1I1Ir   c                   L    e Zd ZdZ e            ddZd Zd Zd Zd Z	d Z
d	S )
FilteredRelationz7Specify custom filtering in the ON clause of SQL joins.	conditionc                    |st          d          || _        d | _        t          |t                    st          d          || _        d | _        d S )Nzrelation_name cannot be empty.z*condition argument must be a Q() instance.)
ValueErrorrelation_namealiasr2   r   r  resolved_condition)r)   r  r  s      r   r&   zFilteredRelation.__init__  sa     	?=>>>*
)Q'' 	KIJJJ #"&r   c                     t          || j                  st          S | j        |j        k    o| j        |j        k    o| j        |j        k    S r   )r2   r,   r   r  r  r  r:   s     r   r   zFilteredRelation.__eq__  sQ    %00 	"!!%"55 2
ek)2%/1	
r   c                     t          | j        | j                  }| j        |_        | j        x}|                                |_        |S )Nr  )r  r  r  r  r  r]   )r)   r]   r  s      r   r]   zFilteredRelation.clone  sJ     !3t~NNNj"&"99F'9'?'?'A'AE$r   c                 t    |                                  }|j        x}r|                    |          |_        |S r   )r]   r  relabeled_clone)r)   
change_mapr]   r  s       r   r  z FilteredRelation.relabeled_clone  s<    

!&!99 	V'9'I'I*'U'UE$r   c                     |                                  }|                    | j        |ddd          d         |_        |S )NTF)	can_reuserE   rF   update_join_typesr   )r]   build_filterr  r  )r)   rK   rL   r*   r+   r]   s         r   rP   z#FilteredRelation.resolve_expression	  sN    

#(#5#5N# $6 $
 $
 $  r   c                 6    |                     | j                  S r   )compiler  )r)   r   r   s      r   as_sqlzFilteredRelation.as_sql  s     7888r   N)r   r   r   r   r   r&   r   r]   r  rP   r'  r   r   r   r  r    s        AA34133 ' ' ' ' '
 
 
    	 	 	9 9 9 9 9r   r  )%r   r   r   loggingcollectionsr   
contextlibr   django.core.exceptionsr   	django.dbr   r   r   r	   r
   django.db.models.constantsr   django.utilsr   django.utils.functionalr   django.utils.hashabler   	getLoggerr   r   r   Noder   r   r   r   r  r  r  r  r   r   r   <module>r3     s9          " " " " " " " " " " " " - - - - - - W W W W W W W W W W W W W W 1 1 1 1 1 1       3 3 3 3 3 3 / / / / / /		-	.	.
 :M ( ( (E
 E
 E
 E
 E
	 E
 E
 E
P* * * * * * * *ZA A A A A A A A dE dE dE dE dE dE dE dEN# # #L
 
 
  :29 29 29 29 29 29 29 29 29 29r   