Ë
    q^ëi_.  ã                   ó�   — d dl 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gZ G d„ d«      Z G d	„ d
e«      Zy)é    )Únames_digestÚsplit_identifier)ÚColÚExpressionListÚFÚFuncÚOrderBy)ÚCollate)ÚQ)ÚQuery)Ú	partitionÚIndexc                   ól   — e Zd ZdZdZdddddddœd„Zed„ «       Zd„ Zdd	„Z	d
„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zy)r   Úidxé   © N)ÚfieldsÚnameÚdb_tablespaceÚ	opclassesÚ	conditionÚincludec                ó´  — |r|st        d«      ‚t        |t        d «      t        f«      st        d«      ‚|r|st        d«      ‚t        |t        t
        f«      st        d«      ‚t        |t        t
        f«      st        d«      ‚|s|st        d«      ‚|r|rt        d«      ‚|r|st        d«      ‚|r|rt        d	«      ‚|r"t        |«      t        |«      k7  rt        d
«      ‚|rt        d„ |D «       «      st        d«      ‚|r|st        d«      ‚t        |t        d «      t        t
        f«      st        d«      ‚t	        |«      | _        | j                  D �cg c]  }|j                  d«      r|dd  dfn|df‘Œ  c}| _
        |xs d| _        || _        || _        || _        |rt        |«      nd| _        t        d„ |D «       «      | _        y c c}w )Nz(An index must be named to use opclasses.z%Index.condition must be a Q instance.z(An index must be named to use condition.z%Index.fields must be a list or tuple.z(Index.opclasses must be a list or tuple.z@At least one field or expression is required to define an index.z4Index.fields and expressions are mutually exclusive.z*An index must be named to use expressions.zgIndex.opclasses cannot be used with expressions. Use django.contrib.postgres.indexes.OpClass() instead.zGIndex.fields and Index.opclasses must have the same number of elements.c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­w©N)Ú
isinstanceÚstr)Ú.0Úfields     úI/var/www/eb/venv/lib/python3.12/site-packages/django/db/models/indexes.pyú	<genexpr>z!Index.__init__.<locals>.<genexpr>9   s   è ø€ ÒI¸œj¨´×4ÑIùs   ‚z8Index.fields must contain only strings with field names.zA covering index must be named.z&Index.include must be a list or tuple.ú-é   ÚDESCÚ r   c              3   óV   K  — | ]!  }t        |t        «      rt        |«      n|–— Œ# y ­wr   )r   r   r   )r   Ú
expressions     r    r!   z!Index.__init__.<locals>.<genexpr>J   s*   è ø€ ò !
àô (¨
´CÔ8ŒAˆjŒM¸jÓHñ!
ùs   ‚'))Ú
ValueErrorr   Útyper   ÚlistÚtupleÚlenÚallr   Ú
startswithÚfields_ordersr   r   r   r   r   Úexpressions)	Úselfr   r   r   r   r   r   r0   Ú
field_names	            r    Ú__init__zIndex.__init__   så  € ñ ™TÜÐGÓHÐHÜ˜)¤d¨4£j´! _Ô5ÜÐDÓEÐEÙ™TÜÐGÓHÐHÜ˜&¤4¬ -Ô0ÜÐDÓEÐEÜ˜)¤d¬E ]Ô3ÜÐGÓHÐHÙ¡6ÜØRóð ñ ™6ÜØFóð ñ ™tÜÐIÓJÐJÙ™9ÜðEóð ñ œ˜V›¬¨I«Ò6Üðóð ñ œ#ÑIÀ&ÔIÔIÜÐWÓXÐXÙ™4ÜÐ>Ó?Ð?Ü˜'¤D¨£J´´eÐ#<Ô=ÜÐEÓFÐFÜ˜6“lˆŒð #Ÿk™kö
àð )3×(=Ñ(=¸cÔ(BˆZ˜˜ˆ^˜VÑ$ÈÐUWÐHXÑXò
ˆÔð ’J˜BˆŒ	Ø*ˆÔØ"ˆŒØ"ˆŒÙ)0”u˜W”~°bˆŒÜ ñ !
à)ô!
ó 
ˆÕùò
s   Å#Gc                 ó,   — t        | j                  «      S r   )Úboolr0   ©r1   s    r    Úcontains_expressionszIndex.contains_expressionsO   s   € ä�D×$Ñ$Ó%Ð%ó    c                 ó  ‡— | j                   €y t        |d¬«      }|j                  | j                   «      }|j                  ‰j                  ¬«      }|j                  |‰j                  «      \  }}|t        ˆfd„|D «       «      z  S )NF)ÚmodelÚ
alias_cols)Ú
connectionc              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr   )Úquote_value)r   ÚpÚschema_editors     €r    r!   z+Index._get_condition_sql.<locals>.<genexpr>Z   s   øè ø€ ÒH¸A˜=×4Ñ4°Q×7ÑHùs   ƒ)r   r   Úbuild_whereÚget_compilerr<   Úas_sqlr+   )r1   r:   r@   ÚqueryÚwhereÚcompilerÚsqlÚparamss     `     r    Ú_get_condition_sqlzIndex._get_condition_sqlS   sy   ø€ Ø�>‰>Ð!ØÜ˜E¨eÔ4ˆØ×!Ñ! $§.¡.Ó1ˆØ×%Ñ%°×1IÑ1IÐ%ÓJˆØ—l‘l 8¨]×-EÑ-EÓF‰ˆˆVØ”UÓHÀÔHÓHÑHÐHr8   c                 óL  — | j                   D �cg c]'  }|j                  j                  |«      j                  ‘Œ) }}| j	                  ||«      }| j
                  rqg }| j
                  D ]9  }	t        |	«      }
|
j                  |j                  «       |j                  |
«       Œ; t        |Ž j                  t        |d¬«      «      }d }d }n�| j                  D ��cg c]   \  }}|j                  j                  |«      ‘Œ" }}}|j                  j                  j                  r| j                  D �cg c]  }|d   ‘Œ	 }}ndgt!        | j                  «      z  }d } |j"                  |f|| j$                  || j&                  || j(                  |||dœ	|¤ŽS c c}w c c}}w c c}w )NF)r;   r#   r%   )	r   r   Úusingr   Úcol_suffixesr   r   r   r0   )r   Ú_metaÚ	get_fieldÚcolumnrI   r0   ÚIndexExpressionÚset_wrapper_classesr<   Úappendr   Úresolve_expressionr   r/   ÚfeaturesÚsupports_index_column_orderingr,   Ú_create_index_sqlr   r   r   )r1   r:   r@   rK   Úkwargsr2   r   r   Úindex_expressionsr'   Úindex_expressionr0   r   rL   Ú_Úorders                   r    Ú
create_sqlzIndex.create_sql\   s±  € àGKÇ|Á|ö
Ø9CˆE�K‰K×!Ñ! *Ó-×4Ó4ð
ˆð 
ð ×+Ñ+¨E°=ÓAˆ	Ø×ÒØ "ÐØ"×.Ñ.ò ;�
Ü#2°:Ó#>Ð Ø ×4Ñ4°]×5MÑ5MÔNØ!×(Ñ(Ð)9Õ:ð;ô )Ð*;Ð<×OÑOÜ�e¨Ô.óˆKð ˆFØ‰Lð &*×%7Ñ%7÷á!�J ð —‘×%Ñ% jÕ1ðˆFñ ð ×'Ñ'×0Ñ0×OÒOØ6:×6HÑ6HÖI¨U  a£ÐI�ÑIà "˜t¤c¨$×*<Ñ*<Ó&=Ñ=�ØˆKØ.ˆ}×.Ñ.Øð
àØ—‘ØØ×,Ñ,Ø%Ø—n‘nØØØ#ñ
ð ñ
ð 	
ùò3
ùó ùò
  Js   �,FÃ%FÄ1F!c                 ó>   —  |j                   || j                  fi |¤ŽS r   )Ú_delete_index_sqlr   )r1   r:   r@   rW   s       r    Ú
remove_sqlzIndex.remove_sql„   s    € Ø.ˆ}×.Ñ.¨u°d·i±iÑJÀ6ÑJÐJr8   c                 óÌ  — | j                   j                  ›d| j                   j                  ›�}|j                  dd«      }d| j                  i}| j
                  r| j
                  |d<   | j                  �| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d	<   || j                  |fS )
Nú.zdjango.db.models.indexeszdjango.db.modelsr   r   r   r   r   r   )Ú	__class__Ú
__module__Ú__name__Úreplacer   r   r   r   r   r   r0   )r1   ÚpathrW   s      r    ÚdeconstructzIndex.deconstruct‡   sÃ   € ØŸ.™.×3Ó3°T·^±^×5LÒ5LÐMˆØ�|‰|Ð6Ð8JÓKˆØ˜$Ÿ)™)Ð$ˆØ�;Š;Ø#Ÿ{™{ˆF�8ÑØ×ÑÐ)Ø&*×&8Ñ&8ˆF�?Ñ#Ø�>Š>Ø"&§.¡.ˆF�;ÑØ�>Š>Ø"&§.¡.ˆF�;ÑØ�<Š<Ø $§¡ˆF�9ÑØ�d×&Ñ&¨Ð/Ð/r8   c                 óN   — | j                  «       \  }}} | j                  |i |¤ŽS )zCreate a copy of this Index.)rg   rb   )r1   rZ   ÚargsrW   s       r    ÚclonezIndex.clone—   s,   € à×*Ñ*Ó,‰ˆˆ4�Øˆt�~‰~˜tÐ. vÑ.Ð.r8   c           	      ó¼  — t        |j                  j                  «      \  }}| j                  D ��cg c]*  \  }}|j                  j	                  |«      j
                  ‘Œ, }}}t        || j                  «      D ���cg c]  \  }\  }}|rdnd|z  ‘Œ }}}}|g|z   | j                  gz   }	|dd ›d|d   dd ›dt        |	dd	iŽ›d| j                  ›�›�| _	        t        | j                  «      | j                  kD  rt        d
«      ‚| j                  d   dk(  s| j                  d   j                  «       rd| j                  dd z  | _	        yyc c}}w c c}}}w )a  
        Generate a unique name for the index.

        The name is divided into 3 parts - table name (12 chars), field name
        (8 chars) and unique hash + suffix (10 chars). Each part is made to
        fit its size by truncating the excess length.
        z-%sz%sNé   rZ   r   é   Úlengthé   zVIndex too long for multiple database support. Is self.suffix longer than 3 characters?zD%sr#   )r   rM   Údb_tabler/   rN   rO   ÚzipÚsuffixr   r   r,   Úmax_name_lengthr(   Úisdigit)
r1   r:   rZ   Ú
table_namer2   r[   Úcolumn_namesÚcolumn_nameÚcolumn_names_with_orderÚ	hash_datas
             r    Úset_name_with_modelzIndex.set_name_with_modelœ   se  € ô )¨¯©×)=Ñ)=Ó>‰ˆˆ:ð &*×%7Ñ%7÷
á!�
˜Eð �K‰K×!Ñ! *Ó-×4Ó4ð
ˆñ 
ô 58Ø˜d×0Ñ0ó5÷#
ð #
á0�Ñ0˜j¨%ñ ‰e $¨+Ó5ð#
Ðò #
ð  �LÐ#:Ñ:¸d¿k¹k¸]ÑJˆ	à�s˜ŠOØ˜‰O˜B˜QÒÜ# YÐ9°qÓ9¸4¿;º;ÑGð
ˆŒ	ô
 ˆt�y‰y‹>˜D×0Ñ0Ò0Üð,óð ð �9‰9�Q‰<˜3Ò $§)¡)¨A¡,×"6Ñ"6Ô"8Ø §	¡	¨!¨" Ñ-ˆD�Ið #9ùó/
ùô#
s   ²/EÁ>Ec                 ó@  — d| j                   j                  ›d| j                  sdndt        | j                  «      z  ›| j                  sdndt        | j                  «      z  ›| j
                  sdndt        | j
                  «      z  ›| j                  €dndt        | j                  «      z  ›| j                  €dnd| j                  z  ›| j                  sdnd	t        | j                  «      z  ›| j                  sd›d�S d
t        | j                  «      z  ›d�S )Nú<ú:r%   z
 fields=%sz expressions=%sz name=%sz db_tablespace=%sz condition=%sz include=%sz opclasses=%sú>)
rb   Ú__qualname__r   Úreprr0   r   r   r   r   r   r6   s    r    Ú__repr__zIndex.__repr__¿   sÿ   � à�N‰N×'Ó'Ø—k’k‰B |´d¸4¿;¹;Ó6GÑ'GÐGØ×&Ò&‰BÐ,=ÄÀT×EUÑEUÓ@VÑ,VÐVØ—i’i‰B Z´$°t·y±y³/Ñ%AÐAà×!Ñ!Ð)ñ à$¤t¨D×,>Ñ,>Ó'?Ñ?ð@ð —.‘.Ð(‰B¨oÀÇÁÑ.NÐNØ—l’l‰B¨¼¸T¿\¹\Ó8JÑ(JÐJØ—n’nˆBÑPð
ð 	
ð +:¼DÀÇÁÓ<PÑ*PÑPð
ð 	
r8   c                 ó‚   — | j                   |j                   k(  r!| j                  «       |j                  «       k(  S t        S r   )rb   rg   ÚNotImplemented)r1   Úothers     r    Ú__eq__zIndex.__eq__Í   s5   € Ø�>‰>˜UŸ_™_Ò,Ø×#Ñ#Ó%¨×):Ñ):Ó)<Ñ<Ð<ÜÐr8   )r%   )rd   rc   r   rr   rs   r3   Úpropertyr7   rI   r\   r_   rg   rj   rz   r�   r…   r   r8   r    r   r      sh   „ Ø€Fð €Oð
 ØØØØØô<
ð| ñ&ó ð&òIó&
òPKò0ò /ò
!.òF
ór8   c                   óX   ‡ — e Zd ZdZdZeefZdd„Ze	d„ «       Z
	 	 	 	 	 dˆ fd„	Zd„ Zˆ xZS )	rP   z7Order and wrap expressions for CREATE INDEX statements.z%(expressions)sc                 ó¢   — |rH|j                   j                  r1t        | j                  D �cg c]  }|t        ur|‘Œ c}«      | _        y y y c c}w r   )rT   Úcollate_as_index_expressionr+   Úwrapper_classesr
   )r1   r<   Úwrapper_clss      r    rQ   z#IndexExpression.set_wrapper_classesÙ   sS   € á˜*×-Ñ-×IÒIÜ#(ð (,×';Ñ';öà#Ø"¬'Ñ1ò  òó$ˆDÕ ð Jˆ:ùòs   ¬Ac                 ó   — || _         y r   )rŠ   )ÚclsrŠ   s     r    Úregister_wrappersz!IndexExpression.register_wrappersä   s
   € à-ˆÕr8   c           	      óà  •‡ — t        ‰ j                  «       «      }t        ˆ fd„|«      \  }}|D �	cg c]  }	t        |	«      ‘Œ }
}	t	        |
«      t	        t        |
«      «      k7  r?t        ddj                  ‰ j                  D �cg c]  }|j                  ‘Œ c}«      z  «      ‚|dt	        |«      dz    |k7  r?t        ddj                  ‰ j                  D �cg c]  }|j                  ‘Œ c}«      z  «      ‚|d   }|j                  |||||«      }t        |t        «      st        |d¬«      }|r†t        |ˆ fd„¬	«      }|D �	cg c]  }	|	j                  «       ‘Œ }}	t!        |d d
 «      D ]  \  }}	|	j#                  ||dz      g«       Œ |d
   j#                  |g«       ‰ j#                  |d   g«       n‰ j#                  |g«       t$        ‰‰ �)  |||||«      S c c}	w c c}w c c}w c c}	w )Nc                 ó0   •— t        | ‰j                  «      S r   )r   rŠ   )Úer1   s    €r    ú<lambda>z4IndexExpression.resolve_expression.<locals>.<lambda>ó   s   ø€ ”j  D×$8Ñ$8Ó9€ r8   zAMultiple references to %s can't be used in an indexed expression.z, r#   z8%s must be topmost expressions in an indexed expression.z(%(expressions)s))Útemplatec                 óL   •— ‰j                   j                  t        | «      «      S r   )rŠ   Úindexr)   )Úwr1   s    €r    r’   z4IndexExpression.resolve_expression.<locals>.<lambda>  s   ø€ ˜d×2Ñ2×8Ñ8¼¸a»ÓA€ r8   )Úkeyéÿÿÿÿr   )r*   Úflattenr   r)   r,   Úsetr(   ÚjoinrŠ   r   rS   r   r   r   ÚsortedÚcopyÚ	enumerateÚset_source_expressionsÚsuper)r1   rD   Úallow_joinsÚreuseÚ	summarizeÚfor_saver0   rX   ÚwrappersÚwrapperÚwrapper_typesr‹   Úroot_expressionÚresolve_root_expressionÚirb   s   `              €r    rS   z"IndexExpression.resolve_expressionè   s  ù€ ô ˜4Ÿ<™<›>Ó*ˆä&/Û9Øó'
Ñ#Ð˜8ð 7?Ö?¨7œ˜g�Ð?ˆÐ?Üˆ}Ó¤¤S¨Ó%7Ó!8Ò8Üðà—)‘)ØAE×AUÑAUÖV°+�[×-Ó-ÒVóñóð ð �qœ3˜x›=¨1Ñ,Ð-°Ò9ÜØJØ—)‘)ØAE×AUÑAUÖV°+�[×-Ó-ÒVóñóð ð ,¨AÑ.ˆØ"1×"DÑ"DØØØØØó#
Ðô Ð1´3Ô7Ü" ?Ð=PÔQˆOáäØÛAôˆHð 7?Ö?¨7˜Ÿ™�Ð?ˆHÐ?Ü'¨°°"¨Ó6ò B‘
��7Ø×.Ñ.°¸¸Q¹±Ð/@ÕAðBð �R‰L×/Ñ/°Ð0AÔBØ×'Ñ'¨°!©¨Õ6ð ×'Ñ'¨Ð(9Ô:Ü‰wÑ)Ø�;  y°(ó
ð 	
ùòW @ùò Wùò Wùò* @s   ²GÂG!ÃG&ÅG+c                 ó*   —  | j                   ||fi |¤ŽS r   )rC   )r1   rF   r<   Úextra_contexts       r    Ú	as_sqlitezIndexExpression.as_sqlite%  s   € àˆt�{‰{˜8 ZÑA°=ÑAÐAr8   r   )NTNFF)rd   rc   r   Ú__doc__r“   r	   r
   rŠ   rQ   ÚclassmethodrŽ   rS   r­   Ú__classcell__)rb   s   @r    rP   rP   Ó   sK   ø„ ÙAà €HØ Ð(€Oó	ð ñ.ó ð.ð
 ØØØØõ;
özBr8   rP   N)Údjango.db.backends.utilsr   r   Údjango.db.models.expressionsr   r   r   r   r	   Údjango.db.models.functionsr
   Údjango.db.models.query_utilsr   Údjango.db.models.sqlr   Údjango.utils.functionalr   Ú__all__r   rP   r   r8   r    ú<module>r¸      s>   ðß Cß NÕ NÝ .Ý *Ý &Ý -àˆ)€÷Eñ EôPTB�dõ TBr8   