
    `?i<                         d dl mZ d dlmZ 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)    )NoneType)checks)names_digestsplit_identifier)ColExpressionListFFuncOrderBy)Collate)Q)Query)	partitionIndexc                   r    e Zd ZdZdZddddddddZed        Z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        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        t        t
        f      st        d      t	        |      | _        | j                  D cg c](  }|j                  d      |j                  d      rd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     j/home/cursorai/projects/django-cronjob-utils/venv/lib/python3.12/site-packages/django/db/models/indexes.py	<genexpr>z!Index.__init__.<locals>.<genexpr><   s     I&j4&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>M   s*      !
)
 (
C8AjMjH)s   '))
ValueErrorr   r   r   listtuplelenallr   removeprefix
startswithfields_ordersr   r   r   r   r   expressions)	selfr   r   r   r   r   r   r1   
field_names	            r"   __init__zIndex.__init__   s    TGHH)h]3DEETGHH&4-0DEE)dE]3GHH6R  6F  tIJJ9E  VI6  #I&IIWXX4>??'HdE#:;EFF6l #kk
)
 $$S)Z5J5J35O6UWX)
 JB	*"")0uW~b  !
)!
 

s   -Gc                 ,    t        | j                        S r   )boolr1   r2   s    r"   contains_expressionszIndex.contains_expressionsR   s    D$$%%    c                     g } j                   d   dk(  s j                   d   j                         r4|j                  t        j                  d j                   z  |d             t         j                          j                  kD  r@|j                  t        j                  d j                    j                  fz  |d             t               } j                  r8 j                  D ])  }|j                  d |j                  |      D               + |j                  |j                  h  j                  D cg c]  \  }}|	 c}} j                  |d	             |j                   j"                  }|j$                  j&                  sad
|v s]t)         fd|j                   j*                  D              r5|j                  t        j,                  d|j.                  z  d|d             |j$                  j0                  s_d|v s[t)        d |j                   j*                  D              r5|j                  t        j,                  d|j.                  z  d|d             |j$                  j2                  s_d|v s[t)        d |j                   j*                  D              r5|j                  t        j,                  d|j.                  z  d|d             |S c c}}w )z/Check fields, names, and conditions of indexes.r   _z@The index name '%s' cannot start with an underscore or a number.zmodels.E033)objidz8The index name '%s' cannot be longer than %d characters.zmodels.E034c              3   &   K   | ]	  }|d      yw)r   Nr   )r    refs     r"   r#   zIndex.check.<locals>.<genexpr>p   s      "&LsCF&Ls   indexessupports_partial_indexesc              3   :   K   | ]  }j                   d u  y wr   )r   )r    indexr2   s     r"   r#   zIndex.check.<locals>.<genexpr>   s     N:M$..,:Ms   z,%s does not support indexes with conditions.zLConditions will be ignored. Silence this warning if you don't care about it.zmodels.W037)hintr<   r=   supports_covering_indexesc              3   4   K   | ]  }|j                     y wr   )r   r    rC   s     r"   r#   zIndex.check.<locals>.<genexpr>   s     A-@E%---@   z1%s does not support indexes with non-key columns.zQNon-key columns will be ignored. Silence this warning if you don't care about it.zmodels.W040supports_expression_indexesc              3   4   K   | ]  }|j                     y wr   )r8   rG   s     r"   r#   zIndex.check.<locals>.<genexpr>   s     N:M%,,:MrH   z+%s does not support indexes on expressions.zKAn index won't be created. Silence this warning if you don't care about it.zmodels.W043)r   isdigitappendr   Errorr,   max_name_lengthsetr8   r1   update_get_expr_referencesextend_check_local_fieldsr0   r   _metarequired_db_featuresfeaturesrA   anyr@   Warningdisplay_namerE   rI   )	r2   model
connectionerrors
referencesr(   r!   r;   rU   s	   `        r"   checkzIndex.checkV   s    99Q<3$))A,"6"6"8MM#%)YY/$	 tyy>D000MM"%)YY0D0D$EF$	 U
$$"..
!! "&+&@&@&L"  / 	%%,0,>,>?,>qe,>?\\  
 		
  %{{??88)-AAN%++:M:MNNMMB --.6 $	 99*.BBAU[[-@-@AAMMG --.> $	 ;;,0DDN%++:M:MNNMMA --.6 $	 s @s   =Kc                    | j                   y t        |d      }|j                  | j                         }|j                  j                        }|j                  |j                        \  }}|t        fd|D              z  S )NF)rZ   
alias_cols)r[   c              3   @   K   | ]  }j                  |        y wr   )quote_value)r    pschema_editors     r"   r#   z+Index._get_condition_sql.<locals>.<genexpr>   s     HA=44Q7s   )r   r   build_whereget_compilerr[   as_sqlr+   )r2   rZ   rd   querywherecompilersqlparamss     `     r"   _get_condition_sqlzIndex._get_condition_sql   sy    >>!Ee4!!$..1%%1I1I%Jll8]-E-EFVUHHHHHr9   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   usingr   col_suffixesr   r   r   r1   )r   rT   	get_fieldcolumnrm   r1   IndexExpressionset_wrapper_classesr[   rL   r   resolve_expressionr   r0   rV   supports_index_column_orderingr,   _create_index_sqlr   r   r   )r2   rZ   rd   rp   kwargsr3   r   r   index_expressionsr(   index_expressionr1   r   rq   r;   orders                   r"   
create_sqlzIndex.create_sql   s   GK||
GSEKK!!*-44| 	 
 ++E=A	 ""..
#2:#>  44]5M5MN!(()9: / )*;<OOe.K FL &*%7%7%7MJ %%j1%7   ''00OO6:6H6HI6HUa6HI "tc$*<*<&==K.}..
,,%nn#
 
 	
3
 
  Js   ,F%F1F!c                 >     |j                   || j                  fi |S r   )_delete_index_sqlr   )r2   rZ   rd   ry   s       r"   
remove_sqlzIndex.remove_sql   s     .}..udiiJ6JJr9   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   r1   )r2   pathry   s      r"   deconstructzIndex.deconstruct   s    ..33T^^5L5LM||68JK$))$;;#{{F8)&*&8&8F?#>>"&..F;>>"&..F;<< $F9d&&//r9   c                 N    | j                         \  }}} | j                  |i |S )zCreate a copy of this Index.)r   r   )r2   r;   argsry   s       r"   clonezIndex.clone   s,    **,4t~~t.v..r9   c           	         t        |j                  j                        \  }}| j                  D cg c]*  \  }}|j                  j	                  |      j
                  , }}}t        || j                        D cg c]  \  }\  }}|rdnd|z   }}}}|g|| j                  }	|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   r;   r      length   zVIndex too long for multiple database support. Is self.suffix longer than 3 characters?zD%sro   )r   rT   db_tabler0   rr   rs   zipsuffixr   r   r,   rN   r)   rK   )
r2   rZ   r;   
table_namer3   r|   column_namescolumn_namecolumn_names_with_order	hash_datas
             r"   set_name_with_modelzIndex.set_name_with_model   sj    ))=)=>: &*%7%7
%7!
E KK!!*-44%7 	 
 58d005#
500j% e$+55 	  #
  G"9G4;;G	sOOBQ#Y9q94;;G
	
 tyy>D000,  99Q<3$))A,"6"6"8		!"-DI #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>)
r   __qualname__r   reprr1   r   r   r   r   r   r7   s    r"   __repr__zIndex.__repr__  s   NN''kkB|d4;;6G'GG&&B,=TEUEU@V,VViiBZ$tyy/%AA %%- (40B0B+CCD ..(Bo.NNllBT\\8J(JJnnBP
 	
 +:D<P*PP
 	
r9   c                     | j                   |j                   k(  r!| j                         |j                         k(  S t        S r   )r   r   NotImplemented)r2   others     r"   __eq__zIndex.__eq__-  s5    >>U__,##%):):)<<<r9   )r&   )r   r   r   r   rN   r4   propertyr8   r^   rm   r}   r   r   r   r   r   r   r   r9   r"   r   r      so    F O
 <
| & &YvI&
PK0 /
!.F
 r9   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 )	rt   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   )rV   collate_as_index_expressionr+   wrapper_classesr   )r2   r[   wrapper_clss      r"   ru   z#IndexExpression.set_wrapper_classes9  sX    *--II#( (,';';';"'1  ';$D  J:s   Ac                     || _         y r   )r   )clsr   s     r"   register_wrappersz!IndexExpression.register_wrappersD  s
    -r9   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      }|rt        | 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   )er2   s    r"   <lambda>z4IndexExpression.resolve_expression.<locals>.<lambda>S  s    jD$8$89r9   zAMultiple references to %s can't be used in an indexed expression.z, ro   z8%s must be topmost expressions in an indexed expression.z(%(expressions)s))templatec                 L    j                   j                  t        |             S r   )r   rC   type)wr2   s    r"   r   z4IndexExpression.resolve_expression.<locals>.<lambda>v  s    d2288aAr9   )keyr   )r*   flattenr   r   r,   rO   r)   joinr   r   rv   r   r   r
   sortedcopy	enumerateset_source_expressionssuper)r2   rh   allow_joinsreuse	summarizefor_saver1   rz   wrapperswrapperwrapper_typesr   root_expressionresolve_root_expressionir   s   `              r"   rv   z"IndexExpression.resolve_expressionH  s    4<<>*&/9'
#8 7??h7gh?}S%7!88))AEAUAUVAU+[--AUV  q3x=1,-9J))AEAUAUVAU+[--AUV  ,A."1"D"D#
 137"?=PQOAH 7??h7hH?'"6
7..Q/@A 7 RL//0AB''!6 ''(9:w);y(
 	
W @ W W* @s   GG!G&G+c                 *     | j                   ||fi |S r   )rg   )r2   rj   r[   extra_contexts       r"   	as_sqlitezIndexExpression.as_sqlite  s    t{{8ZA=AAr9   r   )NTNFF)r   r   r   __doc__r   r   r   r   ru   classmethodr   rv   r   __classcell__)r   s   @r"   rt   rt   3  sK    A H(O	 . .
 ;
zBr9   rt   N)typesr   django.corer   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   rt   r   r9   r"   <module>r      sD      C N N . * & -)b bJ	TBd TBr9   