U
    h                     @   s  d dl Z d dlZd dlmZmZmZmZ d dlmZm	Z	 d dl
mZ ddlmZ ddlmZ dd	l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dlmZ ddlmZ ddl m!Z! dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1d!Z2d"Z3d#Z4d$Z5d%Z6d&Z7d'Z8d(Z9d)Z:d*Z;d+Z<d,Z=d-Z>d.Z?d/Z@d0ZAd1ZBd2ZCd3ZDd4ZEd5ZFd6ZGd7ZHd8ZId9ZJG d:d; d;ZKG d<d= d=eKZLdS )>    N)DictListOptionalUnion)NEVER_DECODEPipeline)deprecated_function   )get_protocol_version   	to_string)AggregateRequestAggregateResultCursor)Document)Field)IndexDefinition)ProfileInformation)Query)Result)SuggestionParserNUMERICz	FT.CREATEzFT.ALTERz	FT.SEARCHzFT.ADDz
FT.ADDHASHzFT.DROPINDEXz
FT.EXPLAINzFT.EXPLAINCLIzFT.DELzFT.AGGREGATE
FT.PROFILEz	FT.CURSORzFT.SPELLCHECKz
FT.DICTADDz
FT.DICTDELzFT.DICTDUMPzFT.MGETz	FT.CONFIGz
FT.TAGVALSzFT.ALIASADDzFT.ALIASUPDATEzFT.ALIASDELzFT.INFOz	FT.SUGADDz	FT.SUGDELz	FT.SUGLENz	FT.SUGGETzFT.SYNUPDATEz
FT.SYNDUMP	NOOFFSETSNOFIELDSNOHLNOFREQSMAXTEXTFIELDS	TEMPORARY	STOPWORDSSKIPINITIALSCAN
WITHSCORESFUZZYWITHPAYLOADSc                   @   s  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdyddZdzee eeeee  ee eeedddZee dddZd{edddZd|d!d"Zd}d#d$Zed%d&d'd~eeeeeeee eee d(	d)d*Zed%d&d'dd+d,Zed%d-d'dd.d/Zd0d1 Zed%d-d'd2d3 Zd4d5 Ze e!ee ee"ee#f f df d6d7d8Z$e e!ee ee"ee#f f df d6d9d:Z%de ee&f e e!ee ee"ee#f f df d;d<d=Z'de ee&f e!ee ee"ef f d;d>d?Z(e ee&f d@dAdBZ)de ee&f e!ee ee"ef f d;dCdDZ*ee ee&e+f edEdFdGZ,de e&e+f eee!ee ee"ef f  dHdIdJZ-ddKdLZ.eee dMdNdOZ/eee dMdPdQZ0edRdSdTZ1edUdVd'eeedWdXdYZ2edUdZd'eed[d\d]Z3ed^d_d`Z4edadbdcZ5edadddeZ6edadfdgZ7dhdi Z8ee"djdkdlZ9eee"dmdndoZ:deeee"eeee; dqdrdsZ<deeee dtdudvZ=dwdx Z>dS )SearchCommandszSearch commands.c                 K   s8   t | jdkr"|dkrt|S |S | j| |f|S d S )N3   r   )r
   clientr   Z_RESP2_MODULE_CALLBACKS)selfcmdreskwargs r.   B/tmp/pip-unpacked-wheel-4avdqdik/redis/commands/search/commands.py_parse_resultsC   s    zSearchCommands._parse_resultsc                 K   s   t t|}tt||S N)mapr   dictzip)r*   r,   r-   itr.   r.   r/   _parse_infoI   s    
zSearchCommands._parse_infoc                 K   s2   t ||d j |d |d j|d j|d jdS )Nqueryduration)r8   has_payloadwith_scoresZfield_encodings)r   _no_content_with_payloads_with_scoresZ_return_fields_decode_asr*   r,   r-   r.   r.   r/   _parse_searchM   s    
zSearchCommands._parse_searchc                 K   s   |  ||d |d S )Nr7   
has_cursor)_get_aggregate_resultr>   r.   r.   r/   _parse_aggregateW   s    zSearchCommands._parse_aggregatec                 K   sZ   |d }t |tr(| |d ||j}n"t|d |j |d |j|jd}|t|d fS )Nr7   r   r8   )r8   r9   r:   r   )	
isinstancer   rA   _cursorr   r;   r<   r=   r   )r*   r,   r-   r7   resultr.   r.   r/   _parse_profileZ   s    
zSearchCommands._parse_profilec                 K   sr   i }|dkr|S |D ]X}t |tr,|dkr,qt|dkr:q|d sDq|d d sRqdd |d D ||d < q|S )Nr   r(   r	   c                 S   s   g | ]}|d  |d dqS )r   r   )score
suggestionr.   ).0Z_itemr.   r.   r/   
<listcomp>   s    z4SearchCommands._parse_spellcheck.<locals>.<listcomp>r   )rC   intlen)r*   r,   r-   ZcorrectionsZ_correctionr.   r.   r/   _parse_spellchecki   s     z SearchCommands._parse_spellcheckc                 K   s   |rdd |D S i S )Nc                 S   s   i | ]}|d  |d qS )r   r   r.   )rI   Zkvsr.   r.   r/   
<dictcomp>   s      z4SearchCommands._parse_config_get.<locals>.<dictcomp>r.   r>   r.   r.   r/   _parse_config_get   s    z SearchCommands._parse_config_getc                    s    fddt dt dD S )Nc                    s   i | ]} |  |d   qS )r   r.   )rI   ir,   r.   r/   rN      s      z1SearchCommands._parse_syndump.<locals>.<dictcomp>r   r	   )rangerL   r>   r.   rQ   r/   _parse_syndump   s    zSearchCommands._parse_syndumpd   c                 C   s   | j | |dS )zT
        Create a new batch indexer from the client with a given chunk size
        )
chunk_size)ZBatchIndexer)r*   rU   r.   r.   r/   batch_indexer   s    zSearchCommands.batch_indexerFN)fieldsno_term_offsetsno_field_flags	stopwords
definitionno_highlightno_term_frequenciesskip_initial_scanc                 C   s.  t | jg}|dk	r||j7 }|r*|t |dk	rPt|trP|t || |r^|t |rl|t	 |rz|t
 |	r|t |
r|t |dk	rt|tttfr|tt|g7 }t|dkr|t|7 }|d z |ttjdd |D  7 }W n" tk
r"   || 7 }Y nX | j| S )a  
        Creates the search index. The index must not already exist.

        For more information, see https://redis.io/commands/ft.create/

        Args:
            fields: A list of Field objects.
            no_term_offsets: If `true`, term offsets will not be saved in the index.
            no_field_flags: If true, field flags that allow searching in specific fields
                            will not be saved.
            stopwords: If provided, the index will be created with this custom stopword
                       list. The list can be empty.
            definition: If provided, the index will be created with this custom index
                        definition.
            max_text_fields: If true, indexes will be encoded as if there were more than
                             32 text fields, allowing for additional fields beyond 32.
            temporary: Creates a lightweight temporary index which will expire after the
                       specified period of inactivity. The internal idle timer is reset
                       whenever the index is searched or added to.
            no_highlight: If true, disables highlighting support. Also implied by
                          `no_term_offsets`.
            no_term_frequencies: If true, term frequencies will not be saved in the
                                 index.
            skip_initial_scan: If true, the initial scan and indexing will be skipped.

        Nr   SCHEMAc                 s   s   | ]}|  V  qd S r1   
redis_argsrI   fr.   r.   r/   	<genexpr>   s     z.SearchCommands.create_index.<locals>.<genexpr>)
CREATE_CMD
index_nameargsappendr   rC   rK   r   r   r   r   r   r!   listtuplesetr    rL   	itertoolschain	TypeErrorra   execute_command)r*   rW   rX   rY   rZ   r[   Zmax_text_fields	temporaryr\   r]   r^   rg   r.   r.   r/   create_index   s8    '










 zSearchCommands.create_index)rW   c                 C   sZ   t | jddg}z |ttjdd |D  7 }W n  tk
rN   || 7 }Y nX | j| S )a  
        Alter the existing search index by adding new fields. The index
        must already exist.

        ### Parameters:

        - **fields**: a list of Field objects to add for the index

        For more information see `FT.ALTER <https://redis.io/commands/ft.alter>`_.
        r_   ZADDc                 s   s   | ]}|  V  qd S r1   r`   rb   r.   r.   r/   rd      s     z2SearchCommands.alter_schema_add.<locals>.<genexpr>)	ALTER_CMDrf   ri   rl   rm   rn   ra   ro   )r*   rW   rg   r.   r.   r/   alter_schema_add   s     zSearchCommands.alter_schema_add)delete_documentsc                 C   s<   t | jg}t|tr |dkr dnd}|r2|| | j| S )ai  
        Drop the index if it exists.
        Replaced `drop_index` in RediSearch 2.0.
        Default behavior was changed to not delete the indexed documents.

        ### Parameters:

        - **delete_documents**: If `True`, all documents will be deleted.

        For more information see `FT.DROPINDEX <https://redis.io/commands/ft.dropindex>`_.
        TDD )DROPINDEX_CMDrf   rC   boolrh   ro   )r*   rt   rg   Z
delete_strr.   r.   r/   	dropindex   s    

zSearchCommands.dropindex      ?c
                 K   s   |s|	rd}t | j||g}|r(|d |dk	rD|d || |rn|d |r`|d |	rn|d |r~|d|g7 }|d	 |ttj|
  7 }|dk	r|j| S | j| S )
zS
        Internal add_document used for both batch and single doc indexing
        TZNOSAVENPAYLOADREPLACEPARTIALZNOCREATELANGUAGEZFIELDS)ADD_CMDrf   rh   ri   rl   rm   itemsro   )r*   doc_idconnnosaverG   payloadreplacepartiallanguage	no_createrW   rg   r.   r.   r/   _add_document  s*    







zSearchCommands._add_documentc                 C   sH   t | j||g}|r|d |r,|d|g7 }|dk	r>|j| S | j| S )zX
        Internal add_document_hash used for both batch and single doc indexing
        r|   r~   N)ADDHASH_CMDrf   rh   ro   )r*   r   r   rG   r   r   rg   r.   r.   r/   _add_document_hash7  s    

z!SearchCommands._add_document_hashz2.0.0z2deprecated since redisearch 2.0, call hset insteadversionreason)	r   r   rG   r   r   r   r   r   rW   c	           
      K   s$   | j |fd|||||||d|	S )a  
        Add a single document to the index.

        Args:

            doc_id: the id of the saved document.
            nosave: if set to true, we just index the document, and don't
                      save a copy of it. This means that searches will just
                      return ids.
            score: the document ranking, between 0.0 and 1.0
            payload: optional inner-index payload we can save for fast
                     access in scoring functions
            replace: if True, and the document already is in the index,
                     we perform an update and reindex the document
            partial: if True, the fields specified will be added to the
                       existing document.
                       This has the added benefit that any fields specified
                       with `no_index`
                       will not be reindexed again. Implies `replace`
            language: Specify the language used for document tokenization.
            no_create: if True, the document is only updated and reindexed
                         if it already exists.
                         If the document does not exist, an error will be
                         returned. Implies `replace`
            fields: kwargs dictionary of the document fields to be saved
                    and/or indexed.
                    NOTE: Geo points shoule be encoded as strings of "lon,lat"
        N)r   r   rG   r   r   r   r   r   )r   )
r*   r   r   rG   r   r   r   r   r   rW   r.   r.   r/   add_documentK  s    +
zSearchCommands.add_documentc                 C   s   | j |d|||dS )a  
        Add a hash document to the index.

        ### Parameters

        - **doc_id**: the document's id. This has to be an existing HASH key
                      in Redis that will hold the fields the index needs.
        - **score**:  the document ranking, between 0.0 and 1.0
        - **replace**: if True, and the document already is in the index, we
                      perform an update and reindex the document
        - **language**: Specify the language used for document tokenization.
        N)r   rG   r   r   )r   )r*   r   rG   r   r   r.   r.   r/   add_document_hash  s        z SearchCommands.add_document_hashzdeprecated since redisearch 2.0c                 C   s6   t | j|g}|r|d |dk	r,|j| S | j| S )a  
        Delete a document from index
        Returns 1 if the document was deleted, 0 if not

        ### Parameters

        - **delete_actual_document**: if set to True, RediSearch also delete
                                      the actual document if it is in the index
        ru   N)DEL_CMDrf   rh   ro   )r*   r   r   Zdelete_actual_documentrg   r.   r.   r/   delete_document  s    

zSearchCommands.delete_documentc                 C   sT   | j |}dd | D }|}z
|d= W n tk
r@   Y nX tf d|i|S ).
        Load a single document by id
        c                 S   s   i | ]\}}t |t |qS r.   r   rI   kvr.   r.   r/   rN     s      z0SearchCommands.load_document.<locals>.<dictcomp>idr)   Zhgetallr   KeyErrorr   r*   r   rW   f2r.   r.   r/   load_document  s    
zSearchCommands.load_documentc                 G   s   | j t| jf| S )z
        Returns the full contents of multiple documents.

        ### Parameters

        - **ids**: the ids of the saved documents.

        )ro   MGET_CMDrf   )r*   idsr.   r.   r/   get  s    zSearchCommands.getc                 C   s   |  t| j}| t|S )
        Get info an stats about the the current index, including the number of
        documents, memory consumption, etc

        For more information see `FT.INFO <https://redis.io/commands/ft.info>`_.
        ro   INFO_CMDrf   r0   r*   r,   r.   r.   r/   info  s    zSearchCommands.infoquery_paramsc                 C   sb   |d krg S g }t |dkr^|d |t |d  | D ]\}}|| || q@|S )Nr   paramsr	   )rL   rh   r   )r*   r   rg   keyvaluer.   r.   r/   get_params_args  s    

zSearchCommands.get_params_argsc                 C   sX   | j g}t|trt|}t|ts6tdt| || 7 }|| |7 }||fS )NzBad query type )rf   rC   strr   
ValueErrortypeget_argsr   )r*   r7   r   rg   r.   r.   r/   _mk_query_args  s    

zSearchCommands._mk_query_argsr7   r   c                 C   sr   | j ||d\}}t }i }t| jdkr4d|t< | jtf||}t|t	rT|S | j
t||t | d dS )  
        Search the index for a given query, and return a result of documents

        ### Parameters

        - **query**: the search query. Either a text for simple queries with
                     default parameters, or a Query object for complex queries.
                     See RediSearch's documentation on query format

        For more information see `FT.SEARCH <https://redis.io/commands/ft.search>`_.
        r   r&   T     @@r7   r8   r   time	monotonicr
   r)   r   ro   
SEARCH_CMDrC   r   r0   r*   r7   r   rg   stoptionsr,   r.   r.   r/   search  s    
   zSearchCommands.searchc                 C   s"   | j ||d\}}| jtf| S )zReturns the execution plan for a complex query.

        For more information see `FT.EXPLAIN <https://redis.io/commands/ft.explain>`_.
        r   )r   ro   EXPLAIN_CMD)r*   r7   r   rg   Z
query_textr.   r.   r/   explain  s    	zSearchCommands.explain)r7   c                 C   s   t dd S )Nz#EXPLAINCLI will not be implemented.)NotImplementedError)r*   r7   r.   r.   r/   explain_cli  s    zSearchCommands.explain_clic                 C   s   t |tr(t|j}t| jg|  }n.t |trLd}td| jg|  }n
t	d||| 
|7 }| j| }| jt|||dS )  
        Issue an aggregation query.

        ### Parameters

        **query**: This can be either an `AggregateRequest`, or a `Cursor`

        An `AggregateResult` object is returned. You can access the rows from
        its `rows` property, which will always yield the rows of the result.

        For more information see `FT.AGGREGATE <https://redis.io/commands/ft.aggregate>`_.
        TREAD	Bad queryr7   r@   rC   r   rx   rD   AGGREGATE_CMDrf   
build_argsr   
CURSOR_CMDr   r   ro   r0   r*   r7   r   r@   r+   rawr.   r.   r/   	aggregate  s    




   zSearchCommands.aggregate)r   r7   r@   c                 C   sz   |r4t |tr|d |_|}nt|d }|d }nd }t |tr^|jr^|d }|dd  }nd }|dd  }t|||S )Nr   r   r	   )rC   r   Zcidr   Z_with_schemar   )r*   r   r7   r@   cursorZschemaZrowsr.   r.   r/   rA   ?  s    


z$SearchCommands._get_aggregate_result)r7   limitedr   c                 C   s   t  }t| jdg}|r"|d |d t|trLd|d< || 7 }n6t|trzd|d< ||	 7 }|| 
|7 }ntd| j| }| jt||t  | d d	S )
a  
        Performs a search or aggregate command and collects performance
        information.

        ### Parameters

        **query**: This can be either an `AggregateRequest` or `Query`.
        **limited**: If set to True, removes details of reader iterator.
        **query_params**: Define one or more value parameters.
        Each parameter has a name and a value.

        rv   ZLIMITEDZQUERYZ	AGGREGATEr	   ZSEARCHz5Must provide AggregateRequest object or Query object.r   r   )r   r   PROFILE_CMDrf   rh   rC   r   r   r   r   r   r   ro   r0   )r*   r7   r   r   r   r+   r,   r.   r.   r/   profileU  s(    




   zSearchCommands.profilec                 C   s\   t | j|g}|r|d|g |r2|dd|g |rF|dd|g | j| }| t |S )a  
        Issue a spellcheck query

        Args:

            query: search query.
            distance: the maximal Levenshtein distance for spelling
                       suggestions (default: 1, max: 4).
            include: specifies an inclusion custom dictionary.
            exclude: specifies an exclusion custom dictionary.

        For more information see `FT.SPELLCHECK <https://redis.io/commands/ft.spellcheck>`_.
        DISTANCETERMSINCLUDEEXCLUDESPELLCHECK_CMDrf   extendro   r0   r*   r7   Zdistanceincludeexcluder+   r,   r.   r.   r/   
spellcheck}  s    
zSearchCommands.spellcheck)nametermsc                 G   s   t |g}|| | j| S )zAdds terms to a dictionary.

        ### Parameters

        - **name**: Dictionary name.
        - **terms**: List of items for adding to the dictionary.

        For more information see `FT.DICTADD <https://redis.io/commands/ft.dictadd>`_.
        )DICT_ADD_CMDr   ro   r*   r   r   r+   r.   r.   r/   dict_add  s    

zSearchCommands.dict_addc                 G   s   t |g}|| | j| S )a  Deletes terms from a dictionary.

        ### Parameters

        - **name**: Dictionary name.
        - **terms**: List of items for removing from the dictionary.

        For more information see `FT.DICTDEL <https://redis.io/commands/ft.dictdel>`_.
        )DICT_DEL_CMDr   ro   r   r.   r.   r/   dict_del  s    

zSearchCommands.dict_del)r   c                 C   s   t |g}| j| S )zDumps all terms in the given dictionary.

        ### Parameters

        - **name**: Dictionary name.

        For more information see `FT.DICTDUMP <https://redis.io/commands/ft.dictdump>`_.
        )DICT_DUMP_CMDro   )r*   r   r+   r.   r.   r/   	dict_dump  s    	zSearchCommands.dict_dump8.0.0Ddeprecated since Redis 8.0, call config_set from core module insteadoptionr   returnc                 C   s   t d||g}| j| }|dkS )  Set runtime configuration option.

        ### Parameters

        - **option**: the name of the configuration option.
        - **value**: a value for the configuration option.

        For more information see `FT.CONFIG SET <https://redis.io/commands/ft.config-set>`_.
        SETOK
CONFIG_CMDro   r*   r   r   r+   r   r.   r.   r/   
config_set  s    
zSearchCommands.config_setDdeprecated since Redis 8.0, call config_get from core module insteadr   r   c                 C   s    t d|g}| j| }| t |S )Get runtime configuration option value.

        ### Parameters

        - **option**: the name of the configuration option.

        For more information see `FT.CONFIG GET <https://redis.io/commands/ft.config-get>`_.
        GETr   ro   r0   r*   r   r+   r,   r.   r.   r/   
config_get  s    

zSearchCommands.config_get)tagfieldc                 C   s   |  t| j|S )z
        Return a list of all possible tag values

        ### Parameters

        - **tagfield**: Tag field name

        For more information see `FT.TAGVALS <https://redis.io/commands/ft.tagvals>`_.
        )ro   TAGVALS_CMDrf   )r*   r   r.   r.   r/   tagvals  s    zSearchCommands.tagvals)aliasc                 C   s   |  t|| jS )z
        Alias a search index - will fail if alias already exists

        ### Parameters

        - **alias**: Name of the alias to create

        For more information see `FT.ALIASADD <https://redis.io/commands/ft.aliasadd>`_.
        )ro   ALIAS_ADD_CMDrf   r*   r   r.   r.   r/   aliasadd  s    zSearchCommands.aliasaddc                 C   s   |  t|| jS )z
        Updates an alias - will fail if alias does not already exist

        ### Parameters

        - **alias**: Name of the alias to create

        For more information see `FT.ALIASUPDATE <https://redis.io/commands/ft.aliasupdate>`_.
        )ro   ALIAS_UPDATE_CMDrf   r   r.   r.   r/   aliasupdate  s    zSearchCommands.aliasupdatec                 C   s   |  t|S )z
        Removes an alias to a search index

        ### Parameters

        - **alias**: Name of the alias to delete

        For more information see `FT.ALIASDEL <https://redis.io/commands/ft.aliasdel>`_.
        )ro   ALIAS_DEL_CMDr   r.   r.   r/   aliasdel  s    
zSearchCommands.aliasdelc                 O   sl   | j dd}|D ]N}t||j|jg}|dr8|d |jrT|d ||j |j|  q| d S )aJ  
        Add suggestion terms to the AutoCompleter engine. Each suggestion has
        a score and string.
        If kwargs["increment"] is true and the terms are already in the
        server's dictionary, we increment their scores.

        For more information see `FT.SUGADD <https://redis.io/commands/ft.sugadd/>`_.
        FZtransaction	incrementINCRr{   	ZpipelineSUGADD_COMMANDstringrG   r   rh   r   ro   executer*   r   Zsuggestionsr-   pipeZsugrg   r.   r.   r/   sugadd  s    



zSearchCommands.sugadd)r   r   c                 C   s   |  t|S )z
        Return the number of entries in the AutoCompleter index.

        For more information see `FT.SUGLEN <https://redis.io/commands/ft.suglen>`_.
        )ro   SUGLEN_COMMAND)r*   r   r.   r.   r/   suglen.  s    zSearchCommands.suglen)r   r  r   c                 C   s   |  t||S )z
        Delete a string from the AutoCompleter index.
        Returns 1 if the string was found and deleted, 0 otherwise.

        For more information see `FT.SUGDEL <https://redis.io/commands/ft.sugdel>`_.
        )ro   SUGDEL_COMMAND)r*   r   r  r.   r.   r/   sugdel6  s    zSearchCommands.sugdel
   r   prefixfuzzynumr:   with_payloadsr   c                 C   sh   t ||d|g}|r|t |r*|t |r8|t | j| }g }	|sN|	S t|||}
dd |
D S )t  
        Get a list of suggestions from the AutoCompleter, for a given prefix.

        Parameters:

        prefix : str
            The prefix we are searching. **Must be valid ascii or utf-8**
        fuzzy : bool
            If set to true, the prefix search is done in fuzzy mode.
            **NOTE**: Running fuzzy searches on short (<3 letters) prefixes
            can be very
            slow, and even scan the entire index.
        with_scores : bool
            If set to true, we also return the (refactored) score of
            each suggestion.
            This is normally not needed, and is NOT the original score
            inserted into the index.
        with_payloads : bool
            Return suggestion payloads
        num : int
            The maximum number of results we return. Note that we might
            return less. The algorithm trims irrelevant suggestions.

        Returns:

        list:
             A list of Suggestion objects. If with_scores was False, the
             score of all suggestions is 1.

        For more information see `FT.SUGGET <https://redis.io/commands/ft.sugget>`_.
        MAXc                 S   s   g | ]}|qS r.   r.   rI   sr.   r.   r/   rJ   u  s     z)SearchCommands.sugget.<locals>.<listcomp>SUGGET_COMMANDrh   r#   r"   r$   ro   r   )r*   r   r  r  r  r:   r  rg   r,   resultsparserr.   r.   r/   sugget?  s    (



zSearchCommands.sugget)groupidskipinitialr   c                 G   s0   t | j|g}|r|dg || | j| S )a  
        Updates a synonym group.
        The command is used to create or update a synonym group with
        additional terms.
        Only documents which were indexed after the update will be affected.

        Parameters:

        groupid :
            Synonym group id.
        skipinitial : bool
            If set to true, we do not scan and index.
        terms :
            The terms.

        For more information see `FT.SYNUPDATE <https://redis.io/commands/ft.synupdate>`_.
        r!   )SYNUPDATE_CMDrf   r   ro   )r*   r  r   r   r+   r.   r.   r/   	synupdatew  s
    
zSearchCommands.synupdatec                 C   s   |  t| j}| t|S )a  
        Dumps the contents of a synonym group.

        The command is used to dump the synonyms data structure.
        Returns a list of synonym terms and their synonym group ids.

        For more information see `FT.SYNDUMP <https://redis.io/commands/ft.syndump>`_.
        )ro   SYNDUMP_CMDrf   r0   r   r.   r.   r/   syndump  s    	zSearchCommands.syndump)rT   )	FFNNFNFFF)F)NFrz   NFFNF)Nrz   NF)Frz   NFFNF)rz   NF)NF)N)N)N)FN)NNN)Fr  FF)F)?__name__
__module____qualname____doc__r0   r6   r?   rB   rF   rM   rO   rS   rV   r   r   rx   r   r   r   rq   rs   ry   r   r   r   floatr   r   r   r   r   r   r   r   rK   bytesr   r   r   r   r   r   r   r   rA   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r  r"  r$  r.   r.   r.   r/   r%   @   s"  
%
	         
F        
+       
        5 


 
# 
 
!    
(
    8r%   c                	   @   s   e Zd Zdd Zdeeef eeeeee	f f dddZ
deeef eeeeee	f f dddZd d	d
ZedddeeedddZedddeedddZdd Zdd Zd!eeeeeeee dddZdS )"AsyncSearchCommandsc                    s    |  t| jI dH }| t|S )r   Nr   r   r.   r.   r/   r     s    zAsyncSearchCommands.infoNr   c                    sx   | j ||d\}}t }i }t| jdkr4d|t< | jtf||I dH }t|t	rZ|S | j
t||t | d dS )r   r   r&   TNr   r   r   r   r.   r.   r/   r     s    
   zAsyncSearchCommands.searchc                    s   t |tr(t|j}t| jg|  }n.t |trLd}td| jg|  }n
t	d||| 
|7 }| j| I dH }| jt|||dS )r   Tr   r   Nr   r   r   r.   r.   r/   r     s    



   zAsyncSearchCommands.aggregatec                    sb   t | j|g}|r|d|g |r2|dd|g |rF|dd|g | j| I dH }| t |S )a  
        Issue a spellcheck query

        ### Parameters

        **query**: search query.
        **distance***: the maximal Levenshtein distance for spelling
                       suggestions (default: 1, max: 4).
        **include**: specifies an inclusion custom dictionary.
        **exclude**: specifies an exclusion custom dictionary.

        For more information see `FT.SPELLCHECK <https://redis.io/commands/ft.spellcheck>`_.
        r   r   r   r   Nr   r   r.   r.   r/   r     s    zAsyncSearchCommands.spellcheckr   r   r   r   c                    s$   t d||g}| j| I dH }|dkS )r   r   Nr   r   r   r.   r.   r/   r     s    zAsyncSearchCommands.config_setr   r   c                    s*   t d|g}i }| j| I dH }| t |S )r   r   Nr   r   r.   r.   r/   r     s    
zAsyncSearchCommands.config_getc                    sZ   | j |I dH }dd | D }|}z
|d= W n tk
rF   Y nX tf d|i|S )r   Nc                 S   s   i | ]\}}t |t |qS r.   r   r   r.   r.   r/   rN   -  s      z5AsyncSearchCommands.load_document.<locals>.<dictcomp>r   r   r   r.   r.   r/   r   (  s    
z!AsyncSearchCommands.load_documentc                    sr   | j dd}|D ]N}t||j|jg}|dr8|d |jrT|d ||j |j|  q| I dH d S )aI  
        Add suggestion terms to the AutoCompleter engine. Each suggestion has
        a score and string.
        If kwargs["increment"] is true and the terms are already in the
        server's dictionary, we increment their scores.

        For more information see `FT.SUGADD <https://redis.io/commands/ft.sugadd>`_.
        Fr  r  r  r{   Nr  r  r	  r.   r.   r/   r  7  s    



zAsyncSearchCommands.sugaddFr  r  c                    sn   t ||d|g}|r|t |r*|t |r8|t | j| I dH }g }	|sT|	S t|||}
dd |
D S )r  r  Nc                 S   s   g | ]}|qS r.   r.   r  r.   r.   r/   rJ     s     z.AsyncSearchCommands.sugget.<locals>.<listcomp>r  )r*   r   r  r  r  r:   r  rg   retr  r  r.   r.   r/   r  N  s    (


zAsyncSearchCommands.sugget)N)N)NNN)Fr  FF)r%  r&  r'  r   r   r   r   r   rK   r)  r   r   r   r   rx   r   r   r   r  r   r   r  r.   r.   r.   r/   r+    sJ    
# 
 
    r+  )Mrl   r   typingr   r   r   r   Zredis.clientr   r   Zredis.utilsr   Zhelpersr
   Z_utilr   Zaggregationr   r   r   documentr   fieldr   Zindex_definitionr   Zprofile_informationr   r7   r   rE   r   rH   r   r   re   rr   r   r   r   rw   r   ZEXPLAINCLI_CMDr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r!  r#  r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r+  r.   r.   r.   r/   <module>   s~         b