Ë
    ò%9jôL  ã                   óX  — 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j0                  d«      Z edd«      Zd„ Z G d„ dej8                  «      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z d„ Z!d„ Z"d„ Z# G d„ d«      Z$y)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              #   óh   K  — | –— | j                  «       D ]  }t        |«      E d {  –—†  Œ y 7 Œ­w©N)Ú__subclasses__Ú
subclasses©ÚclsÚsubclasss     úX/var/www/html/truck-me/venv/lib/python3.12/site-packages/django/db/models/query_utils.pyr   r   !   s4   è ø€ Ø
‚IØ×&Ñ&Ó(ò (ˆÜ˜hÓ'×'Ñ'ñ(Ø'ús   ‚&2¨0©2c                   óº   ‡ — e Zd ZdZdZdZdZeZdZdeeef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                óä   •— || j                   vr4dj                  d„ | j                   dd  D «       «      }t        d|› d�«      ‚t        ‰| �  g |¢t        |j                  «       «      ¢||¬«       y )Nz, c              3   ó"   K  — | ]  }|›–— Œ	 y ­wr   © )Ú.0Úconns     r   ú	<genexpr>zQ.__init__.<locals>.<genexpr>7   s   è ø€ Ò'T¸¨4¨(«Ñ'Tùs   ‚é   z_connector must be one of z
, or None.)ÚchildrenÚ	connectorÚnegated)Ú
connectorsÚjoinÚ
ValueErrorÚsuperÚ__init__ÚsortedÚitems)Úselfr   r   ÚargsÚkwargsÚconnector_reprsÚ	__class__s         €r   r.   z
Q.__init__5   sv   ø€ Ø˜TŸ_™_Ñ,Ø"Ÿi™iÑ'TÀÇÁÐPQÐPRÐ@SÔ'TÓTˆOÜÐ9¸/Ð9JÈ*ÐUÓVÐVÜ‰ÑØ5�tÐ5œf V§\¡\£^Ó4Ð5Ø Øð 	õ 	
ó    c                 ó  — t        |dd«      du rt        |«      ‚| s|j                  «       S |s t        |t        «      r| j                  «       S | j                  |¬«      }|j                  | |«       |j                  ||«       |S )NÚconditionalF)r(   )ÚgetattrÚ	TypeErrorÚcopyÚ
isinstancer   ÚcreateÚadd)r1   Úotherr$   Úobjs       r   Ú_combinez
Q._combine?   sv   € Ü�5˜-¨Ó/°5Ñ8Ü˜EÓ"Ð"ÙØ—:‘:“<ÐÙœ E¬1Ô-Ø—9‘9“;Ðà�k‰k DˆkÓ)ˆØ�‰��dÔØ�‰��tÔØˆ
r6   c                 ó:   — | j                  || j                  «      S r   )rA   r   ©r1   r?   s     r   Ú__or__zQ.__or__L   s   € Ø�}‰}˜U D§G¡GÓ,Ð,r6   c                 ó:   — | j                  || j                  «      S r   )rA   r   rC   s     r   Ú__and__z	Q.__and__O   ó   € Ø�}‰}˜U D§H¡HÓ-Ð-r6   c                 ó:   — | j                  || j                  «      S r   )rA   r   rC   s     r   Ú__xor__z	Q.__xor__R   rG   r6   c                 óF   — | j                  «       }|j                  «        |S r   )r;   Únegate)r1   r@   s     r   Ú
__invert__zQ.__invert__U   s   € Ø�i‰i‹kˆØ�
‰
ŒØˆ
r6   c                 ó\   — |j                  | ||dd|¬«      \  }}|j                  |«       |S )NF)Úallow_joinsÚ
split_subqÚcheck_filterableÚ	summarize)Ú_add_qÚpromote_joins)r1   ÚqueryrN   ÚreuserQ   Úfor_saveÚclauseÚjoinss           r   Úresolve_expressionzQ.resolve_expressionZ   sB   € ð
 Ÿ™ØØØ#ØØ"Øð %ó 
‰ˆ�ð 	×Ñ˜EÔ"Øˆr6   c                 ó€  — |s| S | j                  | j                  | j                  ¬«      }| j                  D �]  }|}t	        |t
        «      rÁ|\  }}t        |v r|j                  t        d«      \  }}n|}d }t        j                  |«      }	|	j                  |«      x}
|	ur}|€d}|
j                  |«      x}€/|
j                  |«      x}	 � ||
«      }
d}|
j                  |«      }|€|dk(  r|
j                  d«      }d}|� ||
|«      }n|j                  |«      }|j                  j                  |«       �Œ |S )N)r(   r)   r&   ÚexactÚisnullT)r=   r(   r)   r'   r<   Útupler   Úrsplitr	   ÚFÚreplace_expressionsÚ
get_lookupÚget_transformÚappend)r1   ÚreplacementsÚcloneÚchildÚchild_replacementÚlhsÚrhsÚpathÚlookupÚfieldÚfield_replacementÚlookup_classÚtransform_classs                r   r`   zQ.replace_expressionsj   sb  € ÙØˆKØ—‘ d§n¡n¸d¿l¹l�ÓKˆØ—]‘]ó  	5ˆEØ %ÐÜ˜%¤Ô'Ø ‘��SÜ Ñ$Ø#&§:¡:¬j¸!Ó#<‘L�D™&à�DØ!�FÜŸ™ ›�à).×)BÑ)BÀ<Ó)PÐPÐ%Øñð �~Ø!(˜Ø(9×(DÑ(DÀVÓ(LÐL˜ÐUà/@×/NÑ/NÈvÓ/VÐV˜OØ!%ð&ñ 1@Ð@QÓ0RÐ-Ø%,˜FØ+<×+GÑ+GÈÓ+O˜LØ�{ v°Ò'8Ø'8×'CÑ'CÀHÓ'M˜Ø"˜Ø#Ð/Ù,8Ð9JÈCÓ,PÑ)à$)×$=Ñ$=¸lÓ$KÐ!Ø�N‰N×!Ñ!Ð"3Ö4ðA 	5ðB ˆr6   c              #   ó¶   K  — | –— | j                   D ]@  }t        |t        «      r|d   }t        |d«      r|j	                  «       E d{  –—†  Œ=|–— ŒB y7 Œ­w)zg
        Recursively yield this Q object and all subexpressions, in depth-first
        order.
        r&   ÚflattenN)r'   r<   r]   Úhasattrrq   )r1   rf   s     r   rq   z	Q.flatten‘   sV   è ø€ ð
 Š
Ø—]‘]ò 	ˆEÜ˜%¤Ô'à˜a™�Ü�u˜iÔ(Ø Ÿ=™=›?×*Ñ*à“ñ	ð
 +ús   ‚AAÁ
AÁAc           
      óÖ  — ddl m}m} ddlm} ddlm} ddlm}  |d«      }|j                  «       D ]-  \  }	}
t        |
d«      s ||
«      }
|j                  |
|	d¬	«       Œ/ |j                   |d
«      d«       t        |   }|j                  j                  r)|j                  t!         || d |«       ¬«      «      «       n|j                  | «       |j#                  |¬«      }|j$                  rt'        j(                  |¬«      n	t+        «       }	 |5  |j-                  |«      ducddd«       S # 1 sw Y   yxY w# t.        $ r!}t0        j3                  d| |«       Y d}~y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)ÚSINGLENrY   F)Úselectr&   Ú_checkT)Úoutput_field)Úusingz.Got a database error calling check() on %r: %s)Údjango.db.modelsrt   ru   Údjango.db.models.functionsrv   Údjango.db.models.sqlrw   Údjango.db.models.sql.constantsrx   r0   rr   Úadd_annotationr   ÚfeaturesÚsupports_comparing_boolean_exprÚadd_qr   Úget_compilerÚin_atomic_blockr
   Úatomicr   Úexecute_sqlr   ÚloggerÚwarning)r1   Úagainstr|   rt   ru   rv   rw   rx   rT   ÚnameÚvalueÚ
connectionÚcompilerÚcontext_managerÚes                  r   ÚcheckzQ.check    sB  € ÷ 	9Ý7Ý.Ý9á�d“ˆØ"Ÿ=™=›?ò 	<‰KˆD�%Ü˜5Ð"6Ô7Ù˜e›�Ø× Ñ  ¨°UÐ Õ;ð	<ð 	×Ñ™U 1›X xÔ0Ü  Ñ'ˆ
à×Ñ×>Ò>Ø�K‰Kœ™( 4¨¹L»NÔKÓLÕMà�K‰K˜ÔØ×%Ñ%¨EÐ%Ó2ˆð ×)Ò)ô ×Ñ UÕ+ä“ð 	ð
	Ø ñ @Ø×+Ñ+¨FÓ3¸4Ð?÷@÷ @ò @ûäò 	Ü�N‰NÐKÈTÐSTÔUÜûð	ús6   ÄD> ÄD2Ä(	D> Ä2D;Ä7D> Ä;D> Ä>	E(ÅE#Å#E(c                 óP  — | j                   j                  ›d| j                   j                  ›�}|j                  d«      r|j	                  dd«      }t        | j                  «      }i }| j                  | j                  k7  r| j                  |d<   | j                  rd|d<   |||fS )Nú.zdjango.db.models.query_utilsr   r   Tr   )
r5   Ú
__module__Ú__name__Ú
startswithÚreplacer]   r'   r(   Údefaultr)   )r1   rj   r2   r3   s       r   ÚdeconstructzQ.deconstructÄ   sŽ   € ØŸ.™.×3Ó3°T·^±^×5LÒ5LÐMˆØ�?‰?Ð9Ô:Ø—<‘<Ð >Ð@RÓSˆDÜ�T—]‘]Ó#ˆØˆØ�>‰>˜TŸ\™\Ò)Ø#'§>¡>ˆF�<Ñ Ø�<Š<Ø!%ˆF�:ÑØ�T˜6Ð!Ð!r6   c                 óþ   — | j                  «       \  }}}|g|j                  «       ¢}|D ]G  }t        |t        «      r$|\  }}t	        |«      }|j                  ||f«       Œ7|j                  |«       ŒI t        |«      S r   )rš   r0   r<   r]   r   rc   )r1   rj   r2   r3   Úidentityrf   Úargr�   s           r   rœ   z
Q.identityÐ   s~   € à!×-Ñ-Ó/Ñˆˆd�FØÐ*˜6Ÿ<™<›>Ð*ˆØò 	'ˆEÜ˜%¤Ô'Ø"‘
��UÜ% eÓ,�Ø—‘  e Õ-à—‘ Õ&ð	'ô �X‹Ðr6   c                 ó`   — t        |t        «      st        S |j                  | j                  k(  S r   )r<   r   ÚNotImplementedrœ   rC   s     r   Ú__eq__zQ.__eq__Ý   s%   € Ü˜%¤Ô#Ü!Ð!Ø�~‰~ §¡Ñ.Ð.r6   c                 ó,   — t        | j                  «      S r   )Úhashrœ   )r1   s    r   Ú__hash__z
Q.__hash__â   s   € Ü�D—M‘MÓ"Ð"r6   c                 ó„   — ddl m} |j                  | «      D �ch c]  }|j                  t        d«      d   ’Œ c}S c c}w )zŽ
        Retrieve all base fields referenced directly or through F expressions
        excluding any fields referenced through joins.
        r   )rT   r&   )r   rT   Úget_children_from_qÚsplitr   )r1   rT   rf   s      r   Úreferenced_base_fieldszQ.referenced_base_fieldså   sB   € õ 	/ð 8=×7PÑ7PÐQUÓ7Vö
Ø.3ˆE�K‰Kœ
 AÓ& qÓ)ò
ð 	
ùò 
s   š =)NTNFF)r–   r•   Ú__qualname__Ú__doc__r   r   r   r™   r8   r*   r.   rA   rD   rF   rI   rL   rY   r`   rq   r   r’   rš   r   rœ   r    r£   r§   Ú__classcell__)r5   s   @r   r   r   '   s­   ø„ ñð €CØ	€BØ
€CØ€GØ€KØ˜˜R Ð%€Jà)-¸ö 
òò-ò.ò.òð SXóò %òNð $4ó "òH
"ð ñ
ó ð
ò/ò
#ð ñ

ó ô

r6   r   c                   ó$   — e Zd ZdZd„ Zdd„Zd„ Zy)ÚDeferredAttributez„
    A wrapper for a deferred-loading field. When the value is read from this
    object the first time, the query is executed.
    c                 ó   — || _         y r   )rl   )r1   rl   s     r   r.   zDeferredAttribute.__init__ù   s	   € Øˆ�
r6   Nc                 ó"  — |€| S |j                   }| j                  j                  }||vra| j                  |«      }|€I|j	                  «       s!| j                  j
                  rt        d«      ‚|j                  |g¬«       ||   S |||<   ||   S )zx
        Retrieve and caches the value from the datastore on the first lookup.
        Return the cached value.
        z4Cannot read a generated field from an unsaved model.)Úfields)Ú__dict__rl   ÚattnameÚ_check_parent_chainÚ
_is_pk_setÚ	generatedÚAttributeErrorÚrefresh_from_db)r1   Úinstancer   ÚdataÚ
field_nameÚvals         r   Ú__get__zDeferredAttribute.__get__ü   s©   € ð
 ÐØˆKØ× Ñ ˆØ—Z‘Z×'Ñ'ˆ
Ø˜TÑ!ð ×*Ñ*¨8Ó4ˆCØˆ{Ø×*Ñ*Ô,°·±×1EÒ1EÜ(ØNóð ð ×(Ñ(°°Ð(Ô=ð �JÑÐð $'��ZÑ Ø�JÑÐr6   c                 óÜ   — |j                   }|j                  | j                  j                  «      }| j                  j                  r%| j                  |k7  rt        ||j                  «      S y)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_linkrl   ÚmodelÚprimary_keyr9   r±   )r1   r·   ÚoptsÚ
link_fields       r   r²   z%DeferredAttribute._check_parent_chain  sU   € ð �~‰~ˆØ×+Ñ+¨D¯J©J×,<Ñ,<Ó=ˆ
Ø�:‰:×!Ò! d§j¡j°JÒ&>Ü˜8 Z×%7Ñ%7Ó8Ð8Ør6   r   )r–   r•   r¨   r©   r.   r»   r²   r"   r6   r   r¬   r¬   ó   s   „ ñò
ó ó.
r6   r¬   c                   ó   — e Zd ZdZd„ Zd„ Zy)Úclass_or_instance_methodzŒ
    Hook used in RegisterLookupMixin to return partial functions depending on
    the caller type (instance or class of models.Field).
    c                 ó    — || _         || _        y r   )Úclass_methodÚinstance_method)r1   rÆ   rÇ   s      r   r.   z!class_or_instance_method.__init__&  s   € Ø(ˆÔØ.ˆÕr6   c                 ó†   — |€ t        j                  | j                  |«      S t        j                  | j                  |«      S r   )Ú	functoolsÚpartialrÆ   rÇ   )r1   r·   Úowners      r   r»   z class_or_instance_method.__get__*  s:   € ØÐÜ×$Ñ$ T×%6Ñ%6¸Ó>Ð>Ü× Ñ  ×!5Ñ!5°xÓ@Ð@r6   N)r–   r•   r¨   r©   r.   r»   r"   r6   r   rÄ   rÄ      s   „ ñò
/óAr6   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y)ÚRegisterLookupMixinc                 óB   — | j                  «       j                  |d «      S r   )Úget_lookupsÚget)r1   Úlookup_names     r   Ú_get_lookupzRegisterLookupMixin._get_lookup1  s   € Ø×ÑÓ!×%Ñ% k°4Ó8Ð8r6   c                 ó¦   — t        j                  | «      D �cg c]  }|j                  j                  di «      ‘Œ  }}| j	                  |«      S c c}w ©NÚclass_lookups)ÚinspectÚgetmror°   rÐ   Úmerge_dicts)r   ÚparentrÕ   s      r   Úget_class_lookupsz%RegisterLookupMixin.get_class_lookups4  sQ   € ô DKÇ>Á>ÐRUÓCVö
Ø9?ˆF�O‰O×Ñ °Õ4ð
ˆð 
ð �‰˜}Ó-Ð-ùò
s   ˜#Ac                 óP   — | j                  «       }t        | dd «      x}ri |¥|¥S |S ©NÚinstance_lookups)rÚ   r9   )r1   rÕ   rÝ   s      r   Úget_instance_lookupsz(RegisterLookupMixin.get_instance_lookups;  s=   € Ø×.Ñ.Ó0ˆÜ& tÐ-?ÀÓFÐFÐÐFØ8�mÐ8Ð'7Ð8Ð8ØÐr6   c                 ó¤   — ddl m} | j                  |«      }|€'t        | d«      r| j                  j                  |«      S |�t        ||«      sy |S )Nr   )ÚLookupr{   )Údjango.db.models.lookupsrà   rÒ   rr   r{   ra   Ú
issubclass)r1   rÑ   rà   Úfounds       r   ra   zRegisterLookupMixin.get_lookupD  sQ   € Ý3à× Ñ  Ó-ˆØˆ=œW T¨>Ô:Ø×$Ñ$×/Ñ/°Ó<Ð<ØÐ¤Z°°vÔ%>ØØˆr6   c                 ó¤   — ddl m} | j                  |«      }|€'t        | d«      r| j                  j                  |«      S |�t        ||«      sy |S )Nr   )Ú	Transformr{   )rá   rå   rÒ   rr   r{   rb   râ   )r1   rÑ   rå   rã   s       r   rb   z!RegisterLookupMixin.get_transformN  sQ   € Ý6à× Ñ  Ó-ˆØˆ=œW T¨>Ô:Ø×$Ñ$×2Ñ2°;Ó?Ð?ØÐ¤Z°°yÔ%AØØˆr6   c                 óL   — i }t        | «      D ]  }|j                  |«       Œ |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_dictsX  s-   € ð ˆÜ˜%“ò 	ˆAØ�M‰M˜!Õð	àˆr6   c                 óX   — t        | «      D ]  }|j                  j                  «        Œ y r   )r   rÚ   Úcache_clearr   s     r   Ú_clear_cached_class_lookupsz/RegisterLookupMixin._clear_cached_class_lookupsc  s'   € ä" 3›ò 	5ˆHØ×&Ñ&×2Ñ2Õ4ñ	5r6   Nc                 óŠ   — |€|j                   }d| j                  vri | _        || j                  |<   | j                  «        |S rÔ   )rÑ   r°   rÕ   rî   ©r   rk   rÑ   s      r   Úregister_class_lookupz)RegisterLookupMixin.register_class_lookuph  sH   € ØÐØ ×,Ñ,ˆKØ #§,¡,Ñ.Ø "ˆCÔØ)/ˆ×Ñ˜+Ñ&Ø×'Ñ'Ô)Øˆr6   c                 ój   — |€|j                   }d| j                  vri | _        || j                  |<   |S rÜ   )rÑ   r°   rÝ   ©r1   rk   rÑ   s      r   Úregister_instance_lookupz,RegisterLookupMixin.register_instance_lookupq  s<   € ØÐØ ×,Ñ,ˆKØ T§]¡]Ñ2Ø$&ˆDÔ!Ø-3ˆ×Ñ˜kÑ*Øˆr6   c                 óZ   — |€|j                   }| j                  |= | j                  «        y)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_lookup~  s/   € ð
 ÐØ ×,Ñ,ˆKØ×Ñ˜kÐ*Ø×'Ñ'Õ)r6   c                 ó:   — |€|j                   }| j                  |= y)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Ø×!Ñ! +Ñ.r6   r   )r–   r•   r¨   rÒ   rÉ   ÚcacherÚ   rÞ   rÄ   rÏ   Úclassmethodra   rb   ÚstaticmethodrØ   rî   rñ   rô   Úregister_lookuprö   rø   Ú_unregister_lookupr"   r6   r   rÍ   rÍ   0  sÇ   „ ò9ð ‡_�_ñ.ó ð.òñ +Ð+<Ð>RÓS€KÙ#Ð$5Ó6Ðòòð ñó ðð ñ5ó ð5óóñ /ØÐ7ó€Oñ (Ð(=Ó>Ðó*ó/ñ 2Ø Ð"=óÐñ  +Ð+CÓDÑr6   rÍ   c                 ó
  — | j                   syt        | j                   dd«      ry|s| j                   S | j                  |vry|r>| |vr:t	        d| j
                  j                  j                  › d| j                  › d�«      ‚y)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_fieldr9   ÚnullrŒ   r   r¿   r½   Úobject_name)rl   Ú
restrictedÚ	requestedÚselect_masks       r   Úselect_related_descendr  —  s–   € ð ×ÒØô ˆu×!Ñ! =°%Ô8Øñ Ø—:‘:ˆ~Ðð ‡z�z˜Ñ"Øñ �u KÑ/ÜØ�U—[‘[×&Ñ&×2Ñ2Ð3°1°U·Z±Z°Lð ALð Ló
ð 	
ð r6   c                 ó¢   — t        dt        | «      dz   «      D ]4  }t        j                  | d| «      }|j	                  |«      sŒ-|| |d fc S  y)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&   r   N)Nr"   )ÚrangeÚlenr   r+   rÐ   )Úlookup_partsÚannotationsÚnÚlevel_n_lookups       r   Úrefs_expressionr  ½  s\   € ô �1”c˜,Ó'¨!Ñ+Ó,ò 4ˆÜ#Ÿ™¨°a¸Ð):Ó;ˆØ�?‰?˜>Õ*Ø! <°°Ð#3Ð3Ò3ð4ð r6   c                 óx   ‡ — ˆ fd„} ||«      xs+ t        |dd«      xr  ||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(  xs2 | j                  ‰j                   j                  v xs ‰| j                  v S r   )r½   Úconcrete_modelÚall_parents)rÁ   r¿   s    €r   r’   z-check_rel_lookup_compatibility.<locals>.checkÒ  sP   ø€ à�K‰K×&Ñ&¨$×*=Ñ*=Ñ=ò )Ø×"Ñ" e§k¡k×&=Ñ&=Ð=ò)à˜×(Ñ(Ð(ð	
r6   rÀ   F)r9   r¿   r½   )r¿   Útarget_optsrl   r’   s   `   r   Úcheck_rel_lookup_compatibilityr  Ê  s<   ø€ ô
ñ  �Óò Ü��} eÓ,ÒI±°u·{±{×7HÑ7HÓ1Iðr6   c                   óD   — e Zd ZdZ e«       dœd„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
y	)
ÚFilteredRelationz7Specify custom filtering in the ON clause of SQL joins.©Ú	conditionc                óŒ   — |st        d«      ‚|| _        d | _        t        |t        «      st        d«      ‚|| _        d | _        y )Nzrelation_name cannot be empty.z*condition argument must be a Q() instance.)r,   Úrelation_nameÚaliasr<   r   r  Úresolved_condition)r1   r  r  s      r   r.   zFilteredRelation.__init__ê  sG   € ÙÜÐ=Ó>Ð>Ø*ˆÔØˆŒ
Ü˜)¤QÔ'ÜÐIÓJÐJð #ˆŒØ"&ˆÕr6   c                 óØ   — t        || j                  «      st        S | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S r   )r<   r5   rŸ   r  r  r  rC   s     r   r    zFilteredRelation.__eq__÷  sY   € Ü˜% §¡Ô0Ü!Ð!à×Ñ %×"5Ñ"5Ñ5ò 2Ø—
‘
˜eŸk™kÑ)ò2à—‘ %§/¡/Ñ1ð	
r6   c                 ó°   — t        | j                  | j                  ¬«      }| j                  |_        | j                  x}�|j                  «       |_        |S )Nr  )r  r  r  r  r  re   )r1   re   r  s      r   re   zFilteredRelation.clone   sK   € Ü  ×!3Ñ!3¸t¿~¹~ÔNˆØ—j‘jˆŒØ"&×"9Ñ"9Ð9ÐÐFØ'9×'?Ñ'?Ó'AˆEÔ$Øˆr6   c                 ón   — | j                  «       }|j                  x}r|j                  |«      |_        |S r   )re   r  Úrelabeled_clone)r1   Ú
change_mapre   r  s       r   r   z FilteredRelation.relabeled_clone  s7   € Ø—
‘
“ˆØ!&×!9Ñ!9Ð9ÐÐ9Ø'9×'IÑ'IÈ*Ó'UˆEÔ$Øˆr6   c                 óv   — | j                  «       }|j                  | j                  |ddd¬«      d   |_        |S )NTF)Ú	can_reuserN   rO   Úupdate_join_typesr   )re   Úbuild_filterr  r  )r1   rT   rU   r2   r3   re   s         r   rY   z#FilteredRelation.resolve_expression  sI   € Ø—
‘
“ˆØ#(×#5Ñ#5Ø�N‰NØØØØ#ð $6ó $
ð ñ$ˆÔ ð ˆr6   c                 ó8   — |j                  | j                  «      S r   )Úcompiler  )r1   r�   rŽ   s      r   Úas_sqlzFilteredRelation.as_sql  s   € Ø×Ñ × 7Ñ 7Ó8Ð8r6   N)r–   r•   r¨   r©   r   r.   r    re   r   rY   r(  r"   r6   r   r  r  ç  s(   „ ÙAá34³3ô 'ò
òòò	ó9r6   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"   r6   r   ú<module>r4     s­   ðñó Û Û Ý "Ý "å -ß WÕ WÝ 1Ý Ý 3Ý /à	ˆ×	Ñ	Ð-Ó	.€ñ
 ØØMó€ò(ôI
ˆ�	‰	ô I
÷X*ñ *÷ZAñ A÷ dEñ dEòN#òL
ò÷:29ò 29r6   