U
    [+d                      @   s   d dl mZ d dlmZmZ d dlmZ dddddd	d
gZG dd deZG dd deZ	G dd deZ
G dd deZG dd deZG dd deZG dd	 d	eZG dd
 d
eZG dd deZdS )    )NotSupportedError)FuncIndex)cached_property
BloomIndex	BrinIndex
BTreeIndexGinIndex	GistIndex	HashIndexSpGistIndexc                       s:   e Zd Zedd Zd
 fdd	Zdd Zdd	 Z  ZS )PostgresIndexc                 C   s   t jtt j t| j S N)r   max_name_lengthlensuffixself r   C/tmp/pip-unpacked-wheel-n7e__lmp/django/contrib/postgres/indexes.pyr      s    zPostgresIndex.max_name_length c                    s\   |  | t j||fdd|p"| j i|}|  }|rXdd||jd f |jd< |S )Nusingz	 USING %sz WITH (%s)%sz, extra)check_supportedsuper
create_sqlr   get_with_paramsjoinparts)r   modelschema_editorr   kwargsZ	statementwith_params	__class__r   r   r      s     
 zPostgresIndex.create_sqlc                 C   s   d S r   r   r   r    r   r   r   r   &   s    zPostgresIndex.check_supportedc                 C   s   g S r   r   r   r   r   r   r   )   s    zPostgresIndex.get_with_params)r   )	__name__
__module____qualname__r   r   r   r   r   __classcell__r   r   r#   r   r      s
   
r   c                       s<   e Zd ZdZddd fdd
Z fddZd	d
 Z  ZS )r   ZbloomNr   )lengthcolumnsc                   s   t  j|| t| jdkr$tdt|ttfs:tdt|t| jkrTtdtdd |D sntd|d k	rd|  k rd	ksn td
|| _	|| _
d S )N    z-Bloom indexes support a maximum of 32 fields.z+BloomIndex.columns must be a list or tuple.z7BloomIndex.columns cannot have more values than fields.c                 s   s&   | ]}d |  k odkn  V  qdS )r   i  Nr   ).0colr   r   r   	<genexpr>8   s     z&BloomIndex.__init__.<locals>.<genexpr>z8BloomIndex.columns must contain integers from 1 to 4095.r   i   z<BloomIndex.length must be None or an integer from 1 to 4096.)r   __init__r   fields
ValueError
isinstancelisttupleallr*   r+   )r   r*   r+   expressionsr!   r#   r   r   r0   0   s"    zBloomIndex.__init__c                    s>   t   \}}}| jd k	r$| j|d< | jr4| j|d< |||fS )Nr*   r+   )r   deconstructr*   r+   r   pathargsr!   r#   r   r   r8   C   s    


zBloomIndex.deconstructc                 C   sF   g }| j d k	r|d| j   | jrB|dd t| jddD  |S )Nzlength = %dc                 s   s   | ]\}}d ||f V  qdS )z
col%d = %dNr   )r-   ivr   r   r   r/   P   s    z-BloomIndex.get_with_params.<locals>.<genexpr>   )start)r*   appendr+   extend	enumerater   r"   r   r   r   r   K   s    

zBloomIndex.get_with_paramsr&   r'   r(   r   r0   r8   r   r)   r   r   r#   r   r   -   s   c                       s<   e Zd ZdZddd fdd
Z fddZdd	 Z  ZS )
r   ZbrinN)autosummarizepages_per_rangec                   s6   |d k	r|dkrt d|| _|| _t j|| d S )Nr   z2pages_per_range must be None or a positive integer)r2   rE   rF   r   r0   )r   rE   rF   r7   r!   r#   r   r   r0   Y   s
    zBrinIndex.__init__c                    sB   t   \}}}| jd k	r$| j|d< | jd k	r8| j|d< |||fS )NrE   rF   )r   r8   rE   rF   r9   r#   r   r   r8   b   s    



zBrinIndex.deconstructc                 C   sD   g }| j d k	r&|d| j rdnd  | jd k	r@|d| j  |S )Nzautosummarize = %sonoffzpages_per_range = %d)rE   r@   rF   rC   r   r   r   r   j   s    

zBrinIndex.get_with_paramsrD   r   r   r#   r   r   V   s    	c                       s:   e Zd ZdZdd fdd
Z fddZdd	 Z  ZS )
r   ZbtreeN
fillfactorc                   s   || _ t j|| d S r   rJ   r   r0   r   rJ   r7   r!   r#   r   r   r0   x   s    zBTreeIndex.__init__c                    s.   t   \}}}| jd k	r$| j|d< |||fS NrJ   r   r8   rJ   r9   r#   r   r   r8   |   s    

zBTreeIndex.deconstructc                 C   s"   g }| j d k	r|d| j   |S Nfillfactor = %drJ   r@   rC   r   r   r   r      s    
zBTreeIndex.get_with_paramsrD   r   r   r#   r   r   u   s   c                       s<   e Zd ZdZddd fdd
Z fddZdd	 Z  ZS )
r	   ZginN)
fastupdategin_pending_list_limitc                   s   || _ || _t j|| d S r   )rR   rS   r   r0   )r   rR   rS   r7   r!   r#   r   r   r0      s    zGinIndex.__init__c                    sB   t   \}}}| jd k	r$| j|d< | jd k	r8| j|d< |||fS )NrR   rS   )r   r8   rR   rS   r9   r#   r   r   r8      s    



zGinIndex.deconstructc                 C   sD   g }| j d k	r|d| j   | jd k	r@|d| jr8dnd  |S )Nzgin_pending_list_limit = %dzfastupdate = %srG   rH   )rS   r@   rR   rC   r   r   r   r      s    

zGinIndex.get_with_paramsrD   r   r   r#   r   r	      s    c                       sD   e Zd ZdZddd fdd
Z fddZdd	 Zd
d Z  ZS )r
   ZgistN)	bufferingrJ   c                   s   || _ || _t j|| d S r   )rT   rJ   r   r0   )r   rT   rJ   r7   r!   r#   r   r   r0      s    zGistIndex.__init__c                    sB   t   \}}}| jd k	r$| j|d< | jd k	r8| j|d< |||fS )NrT   rJ   )r   r8   rT   rJ   r9   r#   r   r   r8      s    



zGistIndex.deconstructc                 C   sD   g }| j d k	r&|d| j rdnd  | jd k	r@|d| j  |S )Nzbuffering = %srG   rH   rP   )rT   r@   rJ   rC   r   r   r   r      s    

zGistIndex.get_with_paramsc                 C   s   | j r|jjjstdd S )Nz-Covering GiST indexes require PostgreSQL 12+.)include
connectionfeaturesZsupports_covering_gist_indexesr   r%   r   r   r   r      s
    zGistIndex.check_supported	r&   r'   r(   r   r0   r8   r   r   r)   r   r   r#   r   r
      s
   c                       s:   e Zd ZdZdd fdd
Z fddZdd	 Z  ZS )
r   hashNrI   c                   s   || _ t j|| d S r   rK   rL   r#   r   r   r0      s    zHashIndex.__init__c                    s.   t   \}}}| jd k	r$| j|d< |||fS rM   rN   r9   r#   r   r   r8      s    

zHashIndex.deconstructc                 C   s"   g }| j d k	r|d| j   |S rO   rQ   rC   r   r   r   r      s    
zHashIndex.get_with_paramsrD   r   r   r#   r   r      s   c                       sB   e Zd ZdZdd fdd
Z fddZdd	 Zd
d Z  ZS )r   ZspgistNrI   c                   s   || _ t j|| d S r   rK   rL   r#   r   r   r0      s    zSpGistIndex.__init__c                    s.   t   \}}}| jd k	r$| j|d< |||fS rM   rN   r9   r#   r   r   r8      s    

zSpGistIndex.deconstructc                 C   s"   g }| j d k	r|d| j   |S rO   rQ   rC   r   r   r   r      s    
zSpGistIndex.get_with_paramsc                 C   s   | j r|jjjstdd S )Nz0Covering SP-GiST indexes require PostgreSQL 14+.)rU   rV   rW   Z supports_covering_spgist_indexesr   r%   r   r   r   r      s
    zSpGistIndex.check_supportedrX   r   r   r#   r   r      s
   c                       s    e Zd ZdZ fddZ  ZS )OpClassz%(expressions)s %(name)sc                    s   t  j||d d S )N)name)r   r0   )r   Z
expressionr[   r#   r   r   r0      s    zOpClass.__init__)r&   r'   r(   templater0   r)   r   r   r#   r   rZ      s   rZ   N)Z	django.dbr   Zdjango.db.modelsr   r   Zdjango.utils.functionalr   __all__r   r   r   r   r	   r
   r   r   rZ   r   r   r   r   <module>   s&   ) 