
     h_.                         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 )    )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                F   |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          |          k    rt          d
          |r(t          d |D                       st          d          |r|st          d          t          |t          d           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     W/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/django/db/models/indexes.py	<genexpr>z!Index.__init__.<locals>.<genexpr>9   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                 X    g | ]'}|                     d           r|dd         dfn|df(S )-   NDESC )
startswith)r   
field_names     r!   
<listcomp>z"Index.__init__.<locals>.<listcomp>A   sS     
 
 
 )3(=(=c(B(BXZ^V$$UWHX
 
 
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>J   sO       !
 !
 (
C88HAjMMMj!
 !
 !
 !
 !
 !
r#   )
ValueErrorr   typer   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)d4jj!_55 	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 	@>???'DJJe#<== 	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_expressionsO   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>Z   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_sqlS   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>m   s=       !J %%j11  r#   c                     g | ]
}|d          S )r&   r   )r   orders     r!   r+   z$Index.create_sql.<locals>.<listcomp>r   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   rW   kwargsr   r   index_expressionsr-   index_expressionr5   r   rX   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   r`   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   pathr`   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.)rn   ri   )r6   rT   argsr`   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*   rV   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*   rV   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%sr&   )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>)
ri   __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!) B$tD,>'?'??@ .(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   )ri   rn   NotImplemented)r6   others     r!   __eq__zIndex.__eq__   s:    >U_,,##%%):):)<)<<<r#   )r(   )rk   rj   r   r|   r}   r7   propertyr;   rL   rc   rf   rn   rq   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 )rY   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!   rZ   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   )r/   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#   r&   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   ra   wrapperswrapper_typesroot_expressionresolve_root_expressionir   ri   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)rk   rj   r   __doc__r   r	   r   r   rZ   classmethodr   r\   r   __classcell__)ri   s   @r!   rY   rY      s        AA H(O	 	 	 	 . . [.
 ;
 ;
 ;
 ;
 ;
 ;
zB B B B B B Br#   rY   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   rY   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 . . . . . . * * * * * * & & & & & & - - - - - -)E E E E E E E EPTB TB TB TB TBd TB TB TB TB TBr#   