
    Evg.                         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dS )    )NoneType)names_digestsplit_identifier)ColExpressionListFFuncOrderByCollate)Q)Query)	partitionIndexc                   t    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dS )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          |          k    rt          d
          |r(t          d |D                       st          d          |r|st          d          t          |t          t          t
          f          st          d          t	          |          | _        d | j        D             | _	        |pd| _
        || _        || _        || _        |rt          |          nd| _        t          d |D                       | _        d S )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                    V  d S N)
isinstancestr).0fields     U/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/django/db/models/indexes.py	<genexpr>z!Index.__init__.<locals>.<genexpr>;   s,      IIj44IIIIII    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.c                 j    g | ]0}|                     d           |                    d           rdndf1S )-DESC )removeprefix
startswith)r    
field_names     r"   
<listcomp>z"Index.__init__.<locals>.<listcomp>C   sS     
 
 
 $$S))Z5J5J35O5O+W66UWX
 
 
r$   r(   r   c              3   b   K   | ]*}t          |t                    rt          |          n|V  +d S r   )r   r   r   )r    
expressions     r"   r#   z!Index.__init__.<locals>.<genexpr>L   sO       !
 !
 (
C88HAjMMMj!
 !
 !
 !
 !
 !
r$   )
ValueErrorr   r   r   listtuplelenallr   fields_ordersr   r   r   r   r   expressions)selfr   r   r   r   r   r   r5   s           r"   __init__zIndex.__init__   s     	IT 	IGHHH)h]33 	FDEEE 	IT 	IGHHH&4-00 	FDEEE)dE]33 	IGHHH 	6 	R    	6 	F    	Kt 	KIJJJ 	9 	E    	VI66    	Y#II&IIIII 	YWXXX 	@4 	@>???'HdE#:;; 	GEFFF6ll
 
"k
 
 
 JB	*"")08uW~~~b  !
 !
)!
 !
 !
 
 
r$   c                 *    t          | j                  S r   )boolr5   r6   s    r"   contains_expressionszIndex.contains_expressionsQ   s    D$%%%r$   c                    | j         d S t          |d          }|                    | j                   }|                    j                  }|                    |j                  \  }}|t          fd|D                       z  S )NF)model
alias_cols)
connectionc              3   B   K   | ]}                     |          V  d S r   )quote_value)r    pschema_editors     r"   r#   z+Index._get_condition_sql.<locals>.<genexpr>\   s1      HHA=44Q77HHHHHHr$   )r   r   build_whereget_compilerr?   as_sqlr1   )r6   r=   rC   querywherecompilersqlparamss     `     r"   _get_condition_sqlzIndex._get_condition_sqlU   s    >!4Ee444!!$.11%%1I%JJll8]-EFFVUHHHHHHHHHHHr$   r(   c                 F   fd| j         D             }|                     |          }| j        rzg }| j        D ]@}t          |          }	|	                    |j                   |                    |	           At          |                     t          d                    }
d }d }nPfd| j
        D             }|j        j        j        rd | j
        D             }ndgt          | j
                  z  }d }
 |j        f|| j        || j        || j        |||
d	|S )Nc                 N    g | ]!}j                             |          j        "S r   _meta	get_fieldcolumn)r    r+   r=   s     r"   r,   z$Index.create_sql.<locals>.<listcomp>_   s9     
 
 
9CEK!!*--4
 
 
r$   F)r>   c                 J    g | ]\  }}j                             |           S r   )rP   rQ   )r    r+   _r=   s      r"   r,   z$Index.create_sql.<locals>.<listcomp>o   s=       !J %%j11  r$   c                     g | ]
}|d          S )   r   )r    orders     r"   r,   z$Index.create_sql.<locals>.<listcomp>t   s    IIIUaIIIr$   r(   )	r   r   usingr   col_suffixesr   r   r   r5   )r   rL   r5   IndexExpressionset_wrapper_classesr?   appendr   resolve_expressionr   r4   featuressupports_index_column_orderingr2   _create_index_sqlr   r   r   )r6   r=   rC   rX   kwargsr   r   index_expressionsr.   index_expressionr5   r   rY   s    `           r"   
create_sqlzIndex.create_sql^   s   
 
 
 
GK|
 
 
 ++E=AA	 	 "". ; ;
#2:#>#>  44]5MNNN!(()9::::(*;<OOe... K FLL   %)%7  F '0O >IId6HIII "tc$*<&=&==K.}.
,%n#
 
 
 
 	
r$   c                 *     |j         || j        fi |S r   )_delete_index_sqlr   )r6   r=   rC   ra   s       r"   
remove_sqlzIndex.remove_sql   s!    .}.udiJJ6JJJr$   c                 4   | j         j        d| 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   r5   )r6   pathra   s      r"   deconstructzIndex.deconstruct   s    .333T^5L5LM||68JKK$)$; 	+#{F8)&*&8F?#> 	1"&.F;> 	1"&.F;< 	- $F9d&//r$   c                 L    |                                  \  }}} | j        |i |S )zCreate a copy of this Index.)ro   rj   )r6   rT   argsra   s       r"   clonezIndex.clone   s0    **,,4t~t.v...r$   c           	         t          j        j                  \  }}fd| j        D             }d t	          || j                  D             }|g|z   | j        gz   }|dd         d|d         dd         dt          |dd	id| j        | _        t          | j                  | j	        k    rt          d
          | j        d         dk    s| j        d                                         rd| j        dd         z  | _        dS dS )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.
        c                 T    g | ]$\  }}j                             |          j        %S r   rO   )r    r+   rW   r=   s      r"   r,   z-Index.set_name_with_model.<locals>.<listcomp>   s@     
 
 
!
E K!!*--4
 
 
r$   c                 ,    g | ]\  }\  }}|rd nd|z  S )z-%sz%sr   )r    column_namer+   rW   s       r"   r,   z-Index.set_name_with_model.<locals>.<listcomp>   s?     #
 #
 #
00j% &ee$+5#
 #
 #
r$   N   rT   r      length   zVIndex too long for multiple database support. Is self.suffix longer than 3 characters?zD%srV   )r   rP   db_tabler4   zipsuffixr   r   r2   max_name_lengthr/   isdigit)r6   r=   rT   
table_namecolumn_namescolumn_names_with_order	hash_datas    `     r"   set_name_with_modelzIndex.set_name_with_model   sZ    ))=>>:
 
 
 
%)%7
 
 
#
 #
47d05 5#
 #
 #
  L#::dk]J	ssOOOOBQB#Y9q99994;;GG
	
 ty>>D000,   9Q<3$)A,"6"6"8"8	!""-DIII r$   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nd
t          | j	                  z  dS )N<:r(   z
 fields=%sz expressions=%sz name=%sz db_tablespace=%sz condition=%sz include=%sz opclasses=%s>)
rj   __qualname__r   reprr5   r   r   r   r   r   r:   s    r"   __repr__zIndex.__repr__   s    N'''kGBB|d4;6G6G'GG&VBB,=TEU@V@V,VViABBZ$ty//%AA %- (40B+C+CCD .(BBo.NNlJBBT\8J8J(JJnPBB/D<P<P*PPP
 	
r$   c                     | j         |j         k    r*|                                 |                                k    S t          S r   )rj   ro   NotImplemented)r6   others     r"   __eq__zIndex.__eq__   s:    >U_,,##%%):):)<)<<<r$   )r(   )rl   rk   r   r}   r~   r7   propertyr;   rL   rd   rg   ro   rr   r   r   r   r   r$   r"   r   r      s        F O
 <
 <
 <
 <
 <
| & & X&I I I&
 &
 &
 &
PK K K0 0 0 / / /
!. !. !.F
 
 
     r$   c                   ^     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 )rZ   z7Order and wrap expressions for CREATE INDEX statements.z%(expressions)sNc                 p    |r1|j         j        r't          d | j        D                       | _        d S d S d S )Nc                 $    g | ]}|t           u|S r   r   r    wrapper_clss     r"   r,   z7IndexExpression.set_wrapper_classes.<locals>.<listcomp>   s-       #"'11  111r$   )r^   collate_as_index_expressionr1   wrapper_classes)r6   r?   s     r"   r[   z#IndexExpression.set_wrapper_classes   sb     	*-I 	#( '+';  $ $D   	 	 	 	r$   c                     || _         d S r   )r   )clsr   s     r"   register_wrappersz!IndexExpression.register_wrappers   s    -r$   TFc                 $    t                                                     }t           fd|          \  }}d |D             }	t          |	          t          t	          |	                    k    r4t          dd                    d  j        D                       z            |dt          |          dz            |k    r4t          dd                    d  j        D                       z            |d         }
|
                    |||||          }t          |t                    st          |
d	
          }
|rt          | fd          }d |D             }t          |d d                   D ]$\  }}|                    ||dz            g           %|d                             |
g                                |d         g           n                     |
g           t                                          |||||          S )Nc                 .    t          | j                  S r   )r   r   )er6   s    r"   <lambda>z4IndexExpression.resolve_expression.<locals>.<lambda>   s    jD$899 r$   c                 ,    g | ]}t          |          S r   )typer    wrappers     r"   r,   z6IndexExpression.resolve_expression.<locals>.<listcomp>   s    ???7g???r$   zAMultiple references to %s can't be used in an indexed expression.z, c                     g | ]	}|j         
S r   r   r   s     r"   r,   z6IndexExpression.resolve_expression.<locals>.<listcomp>       VVV+[-VVVr$   rV   z8%s must be topmost expressions in an indexed expression.c                     g | ]	}|j         
S r   r   r   s     r"   r,   z6IndexExpression.resolve_expression.<locals>.<listcomp>  r   r$   z(%(expressions)s))templatec                 R    j                             t          |                     S r   )r   indexr   )wr6   s    r"   r   z4IndexExpression.resolve_expression.<locals>.<lambda>  s    d288aAA r$   )keyc                 6    g | ]}|                                 S r   )copyr   s     r"   r,   z6IndexExpression.resolve_expression.<locals>.<listcomp>  s     ???7???r$   r   )r0   flattenr   r2   setr/   joinr   r]   r   r   r	   sorted	enumerateset_source_expressionssuper)r6   rG   allow_joinsreuse	summarizefor_saver5   rb   wrapperswrapper_typesroot_expressionresolve_root_expressionir   rj   s   `             r"   r]   z"IndexExpression.resolve_expression   st    4<<>>**&/9999'
 '
#8 @?h???}S%7%7!8!888))VVAUVVV    q3x==1,,-99J))VVAUVVV    ,A."1"D"D#
 #
 1377 	R"?=PQQQO 	;AAAA  H @?h???H'"66 B B
7..Q/@AAAARL//0ABBB''!6666 ''(9:::ww));y(
 
 	
r$   c                       | j         ||fi |S r   )rF   )r6   rI   r?   extra_contexts       r"   	as_sqlitezIndexExpression.as_sqlite)  s    t{8ZAA=AAAr$   r   )NTNFF)rl   rk   r   __doc__r   r
   r   r   r[   classmethodr   r]   r   __classcell__)rj   s   @r"   rZ   rZ      s        AA H(O	 	 	 	 . . [.
 ;
 ;
 ;
 ;
 ;
 ;
zB B B B B B Br$   rZ   N)typesr   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   rZ   r   r$   r"   <module>r      s!         C C C C C C C C N N N N N N N N N N N N N N . . . . . . * * * * * * & & & & & & - - - - - -)G G G G G G G GTTB TB TB TB TBd TB TB TB TB TBr$   