3
g,                 @   s   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 dZG d	d
 d
eZdS )    )names_digestsplit_identifier)ColExpressionListFFuncOrderBy)Collate)Q)Query)	partitionIndexc               @   sz   e Zd ZdZdZf ddf dddddZedd Zd	d
 ZdddZ	dd Z
dd Zdd Zdd Zdd Zdd ZdS )r   idx   N)fieldsnamedb_tablespace	opclasses	conditionincludec            G   s  |r| rt dt|td tfs,t d|r>| r>t dt|ttfsTt dt|ttfsjt d| r~| r~t d|r|rt d|r| rt d|r|rt d	|rt|t|krt d
|rtdd |D  rt d|o| r t dt|td ttfst dt|| _dd | jD | _	|pBd| _
|| _|| _|| _|rft|nf | _td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             s   s   | ]}t |tV  qd S )N)
isinstancestr).0field r   V/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/db/models/indexes.py	<genexpr>7   s    z!Index.__init__.<locals>.<genexpr>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             S   s.   g | ]&}|j d r"|dd dfn|dfqS )-   NZDESC )
startswith)r   
field_namer   r   r   
<listcomp>@   s   z"Index.__init__.<locals>.<listcomp>r   c             s   s$   | ]}t |trt|n|V  qd S )N)r   r   r   )r   
expressionr   r   r   r   I   s   )
ValueErrorr   typer
   listtuplelenallr   fields_ordersr   r   r   r   r   expressions)selfr   r   r   r   r   r   r+   r   r   r   __init__   sP    




zIndex.__init__c             C   s
   t | jS )N)boolr+   )r,   r   r   r   contains_expressionsM   s    zIndex.contains_expressionsc                s`   | j d krd S t|dd}|j| j }|j jd}|j| j\}}|t fdd|D  S )NF)model
alias_cols)
connectionc             3   s   | ]} j |V  qd S )N)Zquote_value)r   p)schema_editorr   r   r   X   s    z+Index._get_condition_sql.<locals>.<genexpr>)r   r   Zbuild_whereZget_compilerr2   as_sqlr'   )r,   r0   r4   querywherecompilerZsqlparamsr   )r4   r   _get_condition_sqlQ   s    
zIndex._get_condition_sqlr   c                s    fdd| j D }| j |}| jrxg }x,| jD ]"}t|}	|	j|j |j|	 q2W t| jt	 dd}
d }d }n( fdd| j
D }dd | j
D }d }
|j f|| j|| j|| j|||
d	|S )Nc                s   g | ]} j j|jqS r   )_meta	get_fieldcolumn)r   r!   )r0   r   r   r"   [   s    z$Index.create_sql.<locals>.<listcomp>F)r1   c                s   g | ]\}} j j|qS r   )r;   r<   )r   r!   _)r0   r   r   r"   j   s   c             S   s   g | ]}|d  qS )r   r   )r   orderr   r   r   r"   m   s    )	r   r   usingr   col_suffixesr   r   r   r+   )r   r:   r+   IndexExpressionset_wrapper_classesr2   appendr   resolve_expressionr   r*   Z_create_index_sqlr   r   r   )r,   r0   r4   r@   kwargsr   r   index_expressionsr#   Zindex_expressionr+   r   rA   r   )r0   r   
create_sqlZ   s*    

zIndex.create_sqlc             K   s   |j || jf|S )N)Z_delete_index_sqlr   )r,   r0   r4   rF   r   r   r   
remove_sqlv   s    zIndex.remove_sqlc             C   s   d| j j| j jf }|jdd}d| ji}| jr:| j|d< | jd k	rN| j|d< | jr^| j|d< | jrn| j|d< | j	r~| j	|d	< || j
|fS )
Nz%s.%szdjango.db.models.indexeszdjango.db.modelsr   r   r   r   r   r   )	__class__
__module____name__replacer   r   r   r   r   r   r+   )r,   pathrF   r   r   r   deconstructy   s    






zIndex.deconstructc             C   s   | j  \}}}| j||S )zCreate a copy of this Index.)rO   rJ   )r,   r>   argsrF   r   r   r   clone   s    zIndex.clonec                s   t  jj\}} fdd| jD }dd t|| jD }|g| | jg }d|dd |d dd d	t|d
di| jf f | _t| j| j	kst
d| jd dks| jd j rd| jdd  | _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                s   g | ]\}} j j|jqS r   )r;   r<   r=   )r   r!   r?   )r0   r   r   r"      s    z-Index.set_name_with_model.<locals>.<listcomp>c             S   s$   g | ]\}\}}|rd nd| qS )z-%sz%sr   )r   Zcolumn_namer!   r?   r   r   r   r"      s   z%s_%s_%sN   r      z%s_%slength   zVIndex too long for multiple database support. Is self.suffix longer than 3 characters?r>   zD%sr   )r   r;   Zdb_tabler*   zipsuffixr   r   r(   max_name_lengthAssertionErrorisdigit)r,   r0   r>   Z
table_nameZcolumn_namesZcolumn_names_with_orderZ	hash_datar   )r0   r   set_name_with_model   s    
zIndex.set_name_with_modelc          	   C   s   d| j j| jsdnddj| j | js*dnddjdd | jD  | jd krPdnd| j | jsbdnd	dj| j | jszdnd
dj| j f S )Nz<%s:%s%s%s%s%s>r   z fields='%s'z, z expressions='%s'c             S   s   g | ]}t |qS r   )r   )r   r#   r   r   r   r"      s    z"Index.__repr__.<locals>.<listcomp>z condition=%sz include='%s'z opclasses='%s')rJ   rL   r   joinr+   r   r   r   )r,   r   r   r   __repr__   s    zIndex.__repr__c             C   s    | j |j kr| j |j kS tS )N)rJ   rO   NotImplemented)r,   otherr   r   r   __eq__   s    zIndex.__eq__)r   )rL   rK   __qualname__rW   rX   r-   propertyr/   r:   rH   rI   rO   rQ   r[   r]   r`   r   r   r   r   r      s"   4	
c                   sL   e Zd ZdZdZeefZdddZe	dd Z
d fd
d	Zdd Z  ZS )rB   z7Order and wrap expressions for CREATE INDEX statements.z%(expressions)sNc             C   s&   |r"|j jr"tdd | jD | _d S )Nc             S   s   g | ]}|t k	r|qS r   )r	   )r   wrapper_clsr   r   r   r"      s   z7IndexExpression.set_wrapper_classes.<locals>.<listcomp>)featuresZcollate_as_index_expressionr'   wrapper_classes)r,   r2   r   r   r   rC      s    z#IndexExpression.set_wrapper_classesc             G   s
   || _ d S )N)re   )clsre   r   r   r   register_wrappers   s    z!IndexExpression.register_wrappersTFc                sf  t  j }t fdd|\}}dd |D }	t|	tt|	krbtddjdd  jD  |dt|d  |krtd	djd
d  jD  |d }
|
j|||||}t	|t
st|
dd}
|rFt| fddd}dd |D }x2t|d d D ]\}}|j||d  g qW |d j|
g  j|d g n j|
g t j|||||S )Nc                s   t |  jS )N)r   re   )e)r,   r   r   <lambda>   s    z4IndexExpression.resolve_expression.<locals>.<lambda>c             S   s   g | ]}t |qS r   )r%   )r   wrapperr   r   r   r"      s    z6IndexExpression.resolve_expression.<locals>.<listcomp>zAMultiple references to %s can't be used in an indexed expression.z, c             S   s   g | ]
}|j qS r   )ra   )r   rc   r   r   r   r"      s    r   z8%s must be topmost expressions in an indexed expression.c             S   s   g | ]
}|j qS r   )ra   )r   rc   r   r   r   r"      s    z(%(expressions)s))templatec                s    j jt| S )N)re   indexr%   )w)r,   r   r   ri      s    )keyc             S   s   g | ]}|j  qS r   )copy)r   rj   r   r   r   r"      s    r   rp   )r&   flattenr   r(   setr$   r\   re   rE   r   r   r   sorted	enumerateZset_source_expressionssuper)r,   r6   Zallow_joinsZreuseZ	summarizeZfor_saver+   rG   wrappersZwrapper_typesZroot_expressionZresolve_root_expressionirj   )rJ   )r,   r   rE      sF    


z"IndexExpression.resolve_expressionc             K   s   | j ||f|S )N)r5   )r,   r8   r2   Zextra_contextr   r   r   	as_sqlite	  s    zIndexExpression.as_sqlite)N)NTNFF)rL   rK   ra   __doc__rk   r   r	   re   rC   classmethodrg   rE   rx   __classcell__r   r   )rJ   r   rB      s   
	    4rB   N)Zdjango.db.backends.utilsr   r   Zdjango.db.models.expressionsr   r   r   r   r   Zdjango.db.models.functionsr	   Zdjango.db.models.query_utilsr
   Zdjango.db.models.sqlr   Zdjango.utils.functionalr   __all__r   rB   r   r   r   r   <module>   s    3