U
    d                     @   sz   d dl mZ d dlmZ G dd d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 )    )List)	DataErrorc                   @   s\   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zdeee eeedddZdd Zdd Zd
S )FieldNUMERICTEXTWEIGHTGEOTAGVECTORSORTABLENOINDEXASNF)nameargssortableno_indexas_namec                 C   s^   |d krg }|| _ || _t | _|| _|r8| jtj |rJ| jtj |rZ|sZt	dd S )Nz-Non-Sortable non-Indexable fields are ignored)
r   r   listargs_suffixr   appendr   r   r   
ValueError)selfr   r   r   r   r    r   ?/tmp/pip-unpacked-wheel-f5h5_hbx/redis/commands/search/field.py__init__   s    zField.__init__c                 C   s   | j | d S N)r   r   )r   valuer   r   r   
append_arg)   s    zField.append_argc                 C   s6   | j g}| jr|| j| jg7 }|| j7 }|| j7 }|S r   )r   r   r   r   r   )r   r   r   r   r   
redis_args,   s    

zField.redis_args)NFFN)__name__
__module____qualname__r   r   r   r   r	   r
   r   r   r   strr   boolr   r   r   r   r   r   r   r      s,       r   c                   @   s0   e Zd ZdZdZdZd
eeeeeddd	Z	dS )	TextFieldzI
    TextField is used to define a text field in a schema definition
    NOSTEMPHONETIC      ?FN)r   weightno_stemphonetic_matcherwithsuffixtriec                 K   sn   t j| |fdt jt j|gi| |r4t | | j |rZ|dkrZt | | j t | | |rjt | d d S )Nr   )zdm:enzdm:frzdm:ptzdm:esWITHSUFFIXTRIE)r   r   r   r   r   r%   r&   )r   r   r(   r)   r*   r+   kwargsr   r   r   r   =   s    	"zTextField.__init__)r'   FNF)
r   r    r!   __doc__r%   r&   r"   floatr#   r   r   r   r   r   r$   5   s       r$   c                   @   s   e Zd ZdZedddZdS )NumericFieldzO
    NumericField is used to define a numeric field in a schema definition
    r   c                 K   s    t j| |fdt jgi| d S Nr   )r   r   r   r   r   r-   r   r   r   r   [   s    zNumericField.__init__Nr   r    r!   r.   r"   r   r   r   r   r   r0   V   s   r0   c                   @   s   e Zd ZdZedddZdS )GeoFieldzP
    GeoField is used to define a geo-indexing field in a schema definition
    r1   c                 K   s    t j| |fdt jgi| d S r2   )r   r   r   r3   r   r   r   r   d   s    zGeoField.__init__Nr4   r   r   r   r   r5   _   s   r5   c                   @   s.   e Zd ZdZdZdZd
eeeedddZd	S )TagFieldzx
    TagField is a tag-indexing field with simpler compression and tokenization.
    See http://redisearch.io/Tags/
    	SEPARATORCASESENSITIVE,F)r   	separatorcase_sensitiver+   c                 K   sH   t j| j|g}|r|| j |r,|d t j| |fd|i| d S )Nr,   r   )r   r	   r7   r   r8   r   )r   r   r:   r;   r+   r-   r   r   r   r   r   q   s    
zTagField.__init__N)r9   FF)	r   r    r!   r.   r7   r8   r"   r#   r   r   r   r   r   r6   h   s      r6   c                   @   s"   e Zd ZdZeeedddZdS )VectorFieldz
    Allows vector similarity queries against the value in this attribute.
    See https://oss.redis.com/redisearch/Vectors/#vector_fields.
    )r   	algorithm
attributesc           
      K   s   | dd}| dd}|s |r(td| dkr<tdg }| D ]\}}	|||	g qHtj| |fdtj|t|f|i| dS )	a  
        Create Vector Field. Notice that Vector cannot have sortable or no_index tag,
        although it's also a Field.

        ``name`` is the name of the field.

        ``algorithm`` can be "FLAT" or "HNSW".

        ``attributes`` each algorithm can have specific attributes. Some of them
        are mandatory and some of them are optional. See
        https://oss.redis.com/redisearch/master/Vectors/#specific_creation_attributes_per_algorithm
        for more information.
        r   Fr   z5Cannot set 'sortable' or 'no_index' in Vector fields.)ZFLATZHNSWzIRealtime vector indexing supporting 2 Indexing Methods:'FLAT' and 'HNSW'.r   N)	getr   upperitemsextendr   r   r
   len)
r   r   r=   r>   r-   sortZnoindexZattr_likeyr   r   r   r   r      s&     zVectorField.__init__N)r   r    r!   r.   r"   dictr   r   r   r   r   r<      s   r<   N)
typingr   Zredisr   r   r$   r0   r5   r6   r<   r   r   r   r   <module>   s   /!		