
    P}bg,-                         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  edd          Zd	 Z G d
 dej                  Z G d d          Z G d d          Zd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)
FieldError)
LOOKUP_SEP)tree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     o/home/e360mart.nyusoft.in/public_html/e360mart_env/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eZdZddd fd
Zd	 Z	d
 Z
d Zd ZddZd Z xZS )Qze
    Encapsulate filters as objects that can then be combined logically (using
    `&` and `|`).
    ANDORTNF)
_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__(   sD    "BD"B6&,,..+A+A"Bjbjkkkkkr   c                    t          |t                    s"t          |dd          du st          |          | s8t	          |d          r|                                nt          j        |          S t          |t                    r/|s-|                                 \  }}} t          |           |i |S  t          |                       }||_        |	                    | |           |	                    ||           |S )NconditionalFTcopy)

isinstancer   getattr	TypeErrorhasattrr%   deconstructtyper   add)r   otherconn_r    r!   objs          r   _combinez
Q._combine+   s    %## 	#wumU'K'Kt'S'SE""" 	/#*5&#9#9O5::<<<ty?O?OOq!! 	/% 	/"..00OAtV4::t.v...d4jjlldt
r   c                 8    |                      || j                  S r	   )r1   r   r   r-   s     r   __or__zQ.__or__;   s    }}UDG,,,r   c                 8    |                      || j                  S r	   )r1   r   r3   s     r   __and__z	Q.__and__>   s    }}UDH---r   c                      t          |                       }|                    | | j                   |                                 |S r	   )r+   r,   r   negate)r   r0   s     r   
__invert__zQ.__invert__A   s;    d4jjlldh


r   c                 j    |                     | ||dd          \  }}|                    |           |S )NF)allow_joins
split_subqcheck_filterable)_add_qpromote_joins)r   queryr;   reuse	summarizefor_saveclausejoinss           r   resolve_expressionzQ.resolve_expressionG   sG     %[U" % 
 
 	E"""r   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_utilszdjango.db.modelsr   Tr   )
r"   
__module____name__
startswithreplacetupler   r   defaultr   )r   pathr    r!   s       r   r*   zQ.deconstructQ   s    .333T^5L5LM??9:: 	T<< >@RSSDT]##>T\))#'>F< < 	&!%F:T6!!r   )NTNFF)rJ   rI   __qualname____doc__r   r   rN   r$   r   r1   r4   r6   r9   rF   r*   __classcell__)r"   s   @r   r   r      s         
 C	BGK)- l l l l l l l   - - -. . .     
" 
" 
" 
" 
" 
" 
"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	   )field)r   rV   s     r   r   zDeferredAttribute.__init__c   s    


r   Nc                     || S |j         }| j        j        }||vr4|                     |          }||                    |g           n|||<   ||         S )zx
        Retrieve and caches the value from the datastore on the first lookup.
        Return the cached value.
        N)fields)__dict__rV   attname_check_parent_chainrefresh_from_db)r   instancer   data
field_namevals         r   __get__zDeferredAttribute.__get__f   sw    
 K Z'
T!! **844C{(((====#&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_linkrV   modelprimary_keyr'   rZ   )r   r]   opts
link_fields       r   r[   z%DeferredAttribute._check_parent_chainy   sT     ~++DJ,<==
:! 	9djJ&>&>8Z%7888tr   r	   )rJ   rI   rP   rQ   r   ra   r[    r   r   rT   rT   ^   sP                  &
 
 
 
 
r   rT   c                       e Zd Zed             Ze ej        d          d                         Zd Zd Z	e
d             Zed             Zedd	            Zedd
            ZdS )RegisterLookupMixinc                 R    |                                                      |d           S r	   )get_lookupsget)r   lookup_names     r   _get_lookupzRegisterLookupMixin._get_lookup   s"      $$[$777r   N)maxsizec                 h    d t          j        |           D             }|                     |          S )Nc                 D    g | ]}|j                             d i           S )class_lookups)rY   rn   ).0parents     r   
<listcomp>z3RegisterLookupMixin.get_lookups.<locals>.<listcomp>   s*    dddf,,_bAAdddr   )inspectgetmromerge_dicts)r   rt   s     r   rm   zRegisterLookupMixin.get_lookups   s7     edPWP^_bPcPcddd}---r   c                     ddl m} |                     |          }|*t          | d          r| j                            |          S |t          ||          sd S |S )Nr   )Lookupoutput_field)django.db.models.lookupsr|   rp   r)   r}   
get_lookup
issubclass)r   ro   r|   founds       r   r   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   )	Transformr}   )r~   r   rp   r)   r}   get_transformr   )r   ro   r   r   s       r   r   z!RegisterLookupMixin.get_transform   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   rz   zRegisterLookupMixin.merge_dicts   s8     % 	 	AMM!r   c                 \    t          |           D ]}|j                                         d S r	   )r   rm   cache_clearr   s     r   _clear_cached_lookupsz)RegisterLookupMixin._clear_cached_lookups   s9    "3 	/ 	/H ,,....	/ 	/r   c                 t    ||j         }d| j        vri | _        || j        |<   |                                  |S )Nrt   )ro   rY   rt   r   r   lookupro   s      r   register_lookupz#RegisterLookupMixin.register_lookup   sI     ,K#,.. "C)/+&!!###r   c                 (    ||j         }| j        |= dS )zn
        Remove given lookup from cls lookups. For use in tests only as it's
        not thread-safe.
        N)ro   rt   r   s      r   _unregister_lookupz&RegisterLookupMixin._unregister_lookup   s#      ,Kk***r   r	   )rJ   rI   rP   classmethodrp   	functools	lru_cacherm   r   r   staticmethodrz   r   r   r   ri   r   r   rk   rk      s        8 8 [8 Y&&&. . '& [.       \ / / [/    [ + + + [+ + +r   rk   Fc                 $   | j         sdS | j         j        r|sdS |r'|r|                                 |vrdS |s| j        |vrdS |s	| j        rdS |r@| j        |vr7|r5| j        |v r,d| j        j        j        d| j        d}t          |          dS )au  
    Return True if this field should be used to descend deeper for
    select_related() purposes. Used by both the query construction code
    (sql.query.fill_related_selections()) and the model instance creation code
    (query.get_klass_info()).

    Arguments:
     * field - the field to be checked
     * restricted - a boolean field, indicating if the field list has been
       manually restricted using a requested clause)
     * requested - The select_related() dictionary.
     * load_fields - the set of fields to be loaded on this model
     * reverse - boolean, True if we are checking a reverse select related
    FzField rH   zM cannot be both deferred and traversed using select_related at the same time.T)
remote_fieldparent_linkrelated_query_namenamenullrZ   re   rc   object_namer   )rV   
restricted	requestedload_fieldsreversemsgs         r   select_related_descendr      s      u% g u  	u//11BB5 	5:Y665 %* u &=++ &ejI555 [&222EJJJ@ !oo%4r   c                     t          dt          |           dz             D ]>}t          j        | d|                   }||v r||         r||         | |d         fc S ?d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.
       r   N)Fri   )rangelenr   join)lookup_partsannotationsnlevel_n_lookups       r   refs_expressionr      s~     1c,''!+,, A A#ac):;;[(([-H(~.QRR0@@@@@9r   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                     j         j        | j        k    p5| j        j                                         v p|                                 v S r	   )rc   concrete_modelget_parent_list)rg   re   s    r   checkz-check_rel_lookup_compatibility.<locals>.check  sO    K&$*== ,5;#>#>#@#@@,T))+++	
r   rf   F)r'   re   rc   )re   target_optsrV   r   s   `   r   check_rel_lookup_compatibilityr      sY    
 
 
 
 
  	k 	L	u	-	-	J%%8I2J2Jr   c                   F    e Zd ZdZ e            d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          || _        g | _        d S )Nzrelation_name cannot be empty.z*condition argument must be a Q() instance.)
ValueErrorrelation_namealiasr&   r   r   rO   )r   r   r   s      r   r   zFilteredRelation.__init__  s\     	?=>>>*
)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	   )r&   r"   NotImplementedr   r   r   r3   s     r   __eq__zFilteredRelation.__eq__$  sQ    %00 	"!!%"55 .J%+%.Neo-	
r   c                 |    t          | j        | j                  }| j        |_        | j        d d          |_        |S )Nr   )r   r   r   r   rO   )r   clones     r   r   zFilteredRelation.clone-  s8     !3t~NNNjYqqq\
r   c                      t          d          )zz
        QuerySet.annotate() only accepts expression-like arguments
        (with a resolve_expression() method).
        z0FilteredRelation.resolve_expression() is unused.)NotImplementedError)r   r    r!   s      r   rF   z#FilteredRelation.resolve_expression3  s    
 ""TUUUr   c                     |j         }|                    | j        t          | j                            }|                    |          S )N)rA   )r@   build_filtered_relation_qr   setrO   compile)r   compiler
connectionr@   wheres        r   as_sqlzFilteredRelation.as_sql:  s?    //c$)nn/UU&&&r   N)
rJ   rI   rP   rQ   r   r   r   r   rF   r   ri   r   r   r   r     s{        AA34133     
 
 
  V V V' ' ' ' 'r   r   )F)rQ   r%   r   rx   collectionsr   django.core.exceptionsr   django.db.models.constantsr   django.utilsr   r   r   Noder   rT   rk   r   r   r   r   ri   r   r   <module>r      s          " " " " " " - - - - - - 1 1 1 1 1 1      
 :j"kll( ( (>" >" >" >" >"	 >" >" >"B% % % % % % % %P@+ @+ @+ @+ @+ @+ @+ @+F" " " "J
 
 
  8'' '' '' '' '' '' '' '' '' ''r   