o
    i&                     @   s  d dl Z d dlZd dlmZmZmZmZmZ d dlm	Z	 d dl
mZmZ d dlmZmZmZmZ d dl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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Z0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9d Z:d!Z;d"Z<d#Z=d$Z>d%Z?d&Z@d'ZAd(ZBd)ZCd*ZDd+ZEd,ZFd-ZGd.ZHd/ZId0ZJd1ZKd2ZLd3ZMd4ZNd5ZOd6ZPd7ZQd8ZRd9ZSd:ZTd;ZUd<ZVd=ZWG d>d? d?ZXG d@dA dAeXZYdS )B    N)AnyDictListOptionalUnion)pairs_to_dict)NEVER_DECODEPipeline)CombineResultsMethodHybridCursorQueryHybridPostProcessingConfigHybridQuery)HybridCursorResultHybridResult)deprecated_functionexperimental_method   )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.SYNDUMPz	FT.HYBRID	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dd ZdddZ									ddee dededeee  dee deded efd!d"Zdeeee f fd#d$Zdd%efd&d'Z			(					dd)d*Z	dd+d,Zed-d.d/		(					dd0ed1ed2ed3ee d4ed5ed6ee d7edee fd8d9Zed-d.d/dd:d;Zed-d<d/dd=d>Zd?d@ Zed-d<d/dAdB Z dCdD Z!dEee"eeee#ee$f f  fdFdGZ%dEee"eeee#ee$f f  fdHdIZ&	ddJeee'f dEee"eeee#ee$f f df fdKdLZ(e) 					ddJe*dMee+ dNee, dOee"eeee#ee$f f  dPee# dQee- dRee.e/e0f fdSdTZ1	ddJeee'f dEee"eeee#ee$f f  fdUdVZ2dJeee'f fdWdXZ3	ddJee4e5f dEee"eeee#ee$f f  fdYdZZ6d[edJee4e5f d\efd]d^Z7		ddJee'e4f d_edEee"eeee#ee$f f  fd`daZ8ddbdcZ9ddedeee fdfdgZ:ddedeee fdhdiZ;ddefdjdkZ<edldmd/dnedoedRefdpdqZ=edldrd/dnedRefdsdtZ>duefdvdwZ?dxefdydzZ@dxefd{d|ZAdxefd}d~ZBdd ZCdedRe#fddZDdededRe#fddZE				ddededede#dededReeF fddZGddededeee fddZHdd ZIdS )SearchCommandszSearch commands.c                 K   s8   t | jdv r|dkrt|S |S | j| |fi |S )N3   r"   )r   clientr   _RESP2_MODULE_CALLBACKS)selfcmdreskwargs r8   R/home/ubuntu/.local/lib/python3.10/site-packages/redis/commands/search/commands.py_parse_resultsP   s   zSearchCommands._parse_resultsc                 K   s   t t|}tt||S N)mapr   dictzip)r4   r6   r7   itr8   r8   r9   _parse_infoV   s   
zSearchCommands._parse_infoc                 K   s2   t ||d j |d |d j|d j|d jdS )Nqueryduration)rB   has_payloadwith_scoresfield_encodings)r   _no_content_with_payloads_with_scores_return_fields_decode_asr4   r6   r7   r8   r8   r9   _parse_searchZ   s   
zSearchCommands._parse_searchc                 K   s|   t |dd}d|v rtt|d t|d dS g }|d D ]}t |dd}|| qtt|d ||d	 t|d
 dS )NT)decode_keyscursorSEARCHVSIM)search_cursor_idvsim_cursor_idresultstotal_resultswarningsexecution_time)rS   rR   rT   rU   )r   r   intappendr   float)r4   r6   r7   res_dictrR   res_item	item_dictr8   r8   r9   _parse_hybrid_searchd   s    



z#SearchCommands._parse_hybrid_searchc                 K   s   |  ||d |d S )NrA   
has_cursor)_get_aggregate_resultrJ   r8   r8   r9   _parse_aggregatez      zSearchCommands._parse_aggregatec                 K   sZ   |d }t |tr| |d ||j}nt|d |j |d |j|jd}|t|d fS )NrA   r   rB   )rB   rC   rD   r   )	
isinstancer   r^   _cursorr   rF   rG   rH   r   )r4   r6   r7   rA   resultr8   r8   r9   _parse_profile}   s   
zSearchCommands._parse_profilec                 K   sr   i }|dkr|S |D ],}t |tr|dkrq
t|dkrq
|d s"q
|d d s)q
dd |d D ||d < q
|S )Nr   r1   r   c                 S   s   g | ]}|d  |d dqS )r   r   )score
suggestionr8   ).0_itemr8   r8   r9   
<listcomp>   s    z4SearchCommands._parse_spellcheck.<locals>.<listcomp>r   )ra   rV   len)r4   r6   r7   corrections_correctionr8   r8   r9   _parse_spellcheck   s    z SearchCommands._parse_spellcheckc                 K   s   |r	dd |D S i S )Nc                 S   s   i | ]	}|d  |d qS )r   r   r8   )rg   kvsr8   r8   r9   
<dictcomp>   s    z4SearchCommands._parse_config_get.<locals>.<dictcomp>r8   rJ   r8   r8   r9   _parse_config_get   r`   z SearchCommands._parse_config_getc                    s    fddt dt dD S )Nc                    s   i | ]} |  |d   qS )r   r8   )rg   ir6   r8   r9   ro          z1SearchCommands._parse_syndump.<locals>.<dictcomp>r   r   )rangerj   rJ   r8   rr   r9   _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)BatchIndexer)r4   rw   r8   r8   r9   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ur||j7 }|r|t |dur(t|tr(|t || |r/|t |r6|t	 |r=|t
 |	rD|t |
rK|t |durkt|tttfrk|tt|g7 }t|dkrk|t|7 }|d z|ttjdd |D  7 }W n ty   || 7 }Y nw | 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       | ]}|  V  qd S r;   
redis_argsrg   fr8   r8   r9   	<genexpr>       z.SearchCommands.create_index.<locals>.<genexpr>)
CREATE_CMD
index_nameargsrW   r'   ra   rV   r(   r#   r%   r$   r&   r*   listtuplesetr)   rj   	itertoolschain	TypeErrorr   execute_command)r4   rz   r{   r|   r}   r~   max_text_fields	temporaryr   r   r   r   r8   r8   r9   create_index   s:   
'









 
zSearchCommands.create_indexc                 C   sX   t | jddg}z|ttjdd |D  7 }W n ty&   || 7 }Y nw | 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   ADDc                 s   r   r;   r   r   r8   r8   r9   r     r   z2SearchCommands.alter_schema_add.<locals>.<genexpr>)	ALTER_CMDr   r   r   r   r   r   r   )r4   rz   r   r8   r8   r9   alter_schema_add  s    
zSearchCommands.alter_schema_adddelete_documentsc                 C   s<   t | jg}t|tr|du rdnd}|r|| | 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_CMDr   ra   boolrW   r   )r4   r   r   
delete_strr8   r8   r9   	dropindex  s   


zSearchCommands.dropindex      ?c
                 K   s   |s|	rd}t | j||g}|r|d |dur"|d || |r7|d |r0|d |	r7|d |r?|d|g7 }|d	 |ttj|
  7 }|durX|j| S | j| S )
zS
        Internal add_document used for both batch and single doc indexing
        TNOSAVENPAYLOADREPLACEPARTIALNOCREATELANGUAGEFIELDS)ADD_CMDr   rW   r   r   r   itemsr   )r4   doc_idconnnosavere   payloadreplacepartiallanguage	no_createrz   r   r8   r8   r9   _add_document0  s*   








zSearchCommands._add_documentc                 C   sH   t | j||g}|r|d |r|d|g7 }|dur|j| S | j| S )zX
        Internal add_document_hash used for both batch and single doc indexing
        r   r   N)ADDHASH_CMDr   rW   r   )r4   r   r   re   r   r   r   r8   r8   r9   _add_document_hashZ  s   


z!SearchCommands._add_document_hashz2.0.0z2deprecated since redisearch 2.0, call hset insteadversionreasonr   r   re   r   r   r   r   r   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   re   r   r   r   r   r   )r   )
r4   r   r   re   r   r   r   r   r   rz   r8   r8   r9   add_documentn  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   re   r   r   )r   )r4   r   re   r   r   r8   r8   r9   add_document_hash  s   
z SearchCommands.add_document_hashzdeprecated since redisearch 2.0c                 C   s6   t | j|g}|r|d |du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
        r   N)DEL_CMDr   rW   r   )r4   r   r   delete_actual_documentr   r8   r8   r9   delete_document  s   


zSearchCommands.delete_documentc                 C   sR   | j |}dd | D }|}z|d= W n	 ty   Y nw tdd|i|S ).
        Load a single document by id
        c                 S      i | ]\}}t |t |qS r8   r   rg   kvr8   r8   r9   ro     rs   z0SearchCommands.load_document.<locals>.<dictcomp>idNr8   r2   hgetallr   KeyErrorr   r4   r   rz   f2r8   r8   r9   load_document  s   
zSearchCommands.load_documentc                 G   s   | j t| jg|R  S )z
        Returns the full contents of multiple documents.

        ### Parameters

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

        )r   MGET_CMDr   )r4   idsr8   r8   r9   get  s   zSearchCommands.getc                 C      |  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>`_.
        r   INFO_CMDr   r:   r4   r6   r8   r8   r9   info  s   zSearchCommands.infoquery_paramsc                 C   sb   |d u rg S g }t |dkr/|d |t |d  | D ]\}}|| || q |S )Nr   PARAMSr   )rj   rW   r   )r4   r   r   keyvaluer8   r8   r9   get_params_args  s   

zSearchCommands.get_params_argsc                 C   sX   | j g}t|trt|}t|tstdt| || 7 }|| |7 }||fS )NzBad query type )r   ra   strr   
ValueErrortypeget_argsr   )r4   rA   r   r   r8   r8   r9   _mk_query_args  s   

zSearchCommands._mk_query_argsrA   c                 C   sx   | j ||d\}}t }i }t| jdvrd|t< | jtg|R i |}t|t	r-|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     @@rA   rB   r   time	monotonicr   r2   r   r   
SEARCH_CMDra   r	   r:   r4   rA   r   r   stoptionsr6   r8   r8   r9   search  s   
zSearchCommands.searchcombine_methodpost_processingparams_substitutiontimeoutrM   returnc                 C   s   | j }i }t|g}	|	|  |r|	|  |r"|	|  |r,|	| | |r5|	d|f |rBd|d< |	|  t| jdvrMd|t< | j	|	i |}
t
|
tr\|
S | jt|
fi |S )M  
        Execute a hybrid search using both text and vector queries

        Args:
            - **query**: HybridQuery object
                        Contains the text and vector queries
            - **combine_method**: CombineResultsMethod object
                        Contains the combine method and parameters
            - **post_processing**: HybridPostProcessingConfig object
                        Contains the post processing configuration
            - **params_substitution**: Dict[str, Union[str, int, float, bytes]]
                        Contains the parameters substitution
            - **timeout**: int - contains the timeout in milliseconds
            - **cursor**: HybridCursorQuery object - contains the cursor configuration


        For more information see `FT.SEARCH <https://redis.io/commands/ft.hybrid>`.
        TIMEOUTTrM   r/   r   
HYBRID_CMDextendr   
build_argsr   r   r2   r   r   ra   r	   r:   r4   rA   r   r   r   r   rM   indexr   piecesr6   r8   r8   r9   hybrid_search3  s*   
zSearchCommands.hybrid_searchc                 C   s$   | j ||d\}}| jtg|R  S )zReturns the execution plan for a complex query.

        For more information see `FT.EXPLAIN <https://redis.io/commands/ft.explain>`_.
        r   )r   r   EXPLAIN_CMD)r4   rA   r   r   
query_textr8   r8   r9   explaini  s   	zSearchCommands.explainc                 C   s   t d)Nz#EXPLAINCLI will not be implemented.)NotImplementedError)r4   rA   r8   r8   r9   explain_cliu  s   zSearchCommands.explain_clic                 C   s   t |trt|j}t| jg|  }nt |tr&d}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rA   r]   ra   r   r   rb   AGGREGATE_CMDr   r   r   
CURSOR_CMDr   r   r   r:   r4   rA   r   r]   r5   rawr8   r8   r9   	aggregatex  s   




zSearchCommands.aggregater  r]   c                 C   sz   |rt |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   )ra   r   cidr   _with_schemar   )r4   r  rA   r]   rM   schemarowsr8   r8   r9   r^     s   


z$SearchCommands._get_aggregate_resultlimitedc                 C   s   t  }t| jdg}|r|d |d t|tr&d|d< || 7 }nt|tr=d|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.

        r   LIMITEDQUERY	AGGREGATEr   rN   z5Must provide AggregateRequest object or Query object.r   r   )r   r   PROFILE_CMDr   rW   ra   r   r   r   r   r   r   r   r:   )r4   rA   r  r   r   r5   r6   r8   r8   r9   profile  s"   




zSearchCommands.profilec                 C   s\   t | j|g}|r|d|g |r|dd|g |r#|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_CMDr   r   r   r:   r4   rA   distanceincludeexcluder5   r6   r8   r8   r9   
spellcheck  s   
zSearchCommands.spellchecknametermsc                 G      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   r   r4   r  r  r5   r8   r8   r9   dict_add     


zSearchCommands.dict_addc                 G   r  )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   r   r   r8   r8   r9   dict_del   r"  zSearchCommands.dict_delc                 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_CMDr   )r4   r  r5   r8   r8   r9   	dict_dump  s   	
zSearchCommands.dict_dump8.0.0Ddeprecated since Redis 8.0, call config_set from core module insteadoptionr   c                 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_CMDr   r4   r)  r   r5   r  r8   r8   r9   
config_set  s   
zSearchCommands.config_setDdeprecated since Redis 8.0, call config_get from core module insteadc                 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.  r   r:   r4   r)  r5   r6   r8   r8   r9   
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>`_.
        )r   TAGVALS_CMDr   )r4   r7  r8   r8   r9   tagvals=     zSearchCommands.tagvalsaliasc                 C      |  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>`_.
        )r   ALIAS_ADD_CMDr   r4   r;  r8   r8   r9   aliasaddJ  r:  zSearchCommands.aliasaddc                 C   r<  )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>`_.
        )r   ALIAS_UPDATE_CMDr   r>  r8   r8   r9   aliasupdateW  r:  zSearchCommands.aliasupdatec                 C      |  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>`_.
        )r   ALIAS_DEL_CMDr>  r8   r8   r9   aliasdeld  s   
zSearchCommands.aliasdelc                 O   sl   | j dd}|D ]'}t||j|jg}|dr|d |jr*|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transaction	incrementINCRr   	pipelineSUGADD_COMMANDstringre   r   rW   r   r   executer4   r   suggestionsr7   pipesugr   r8   r8   r9   sugaddp  s   



zSearchCommands.sugaddr   c                 C   rB  )z
        Return the number of entries in the AutoCompleter index.

        For more information see `FT.SUGLEN <https://redis.io/commands/ft.suglen>`_.
        )r   SUGLEN_COMMAND)r4   r   r8   r8   r9   suglen  s   zSearchCommands.suglenrM  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>`_.
        )r   SUGDEL_COMMAND)r4   r   rM  r8   r8   r9   sugdel  s   zSearchCommands.sugdel
   prefixfuzzynumrD   with_payloadsc                 C   sh   t ||d|g}|r|t |r|t |r|t | j| }g }	|s'|	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      g | ]}|qS r8   r8   rg   sr8   r8   r9   ri         z)SearchCommands.sugget.<locals>.<listcomp>SUGGET_COMMANDrW   r,   r+   r-   r   r    )r4   r   rY  rZ  r[  rD   r\  r   r6   rR   parserr8   r8   r9   sugget  s   (



zSearchCommands.suggetgroupidskipinitialc                 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_CMDr   r   r   )r4   rg  rh  r  r5   r8   r8   r9   	synupdate  s
   

zSearchCommands.synupdatec                 C   r   )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>`_.
        )r   SYNDUMP_CMDr   r:   r   r8   r8   r9   syndump  s   	zSearchCommands.syndump)rv   )	FFNNFNFFF)F)NFr   NFFNF)Nr   NF)Fr   NFFNF)r   NF)NFr;   NNNNN)FNNNNFrX  FF)J__name__
__module____qualname____doc__r:   r@   rK   r\   r_   rd   rm   rp   ru   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   rX   r   r   r   r   r   r   r   rV   bytesr   r   r   r   r   r   r
   r   r   r   r   r	   r   r   r   r   r   r  r^   r  r  r!  r$  r&  r0  r6  r9  r?  rA  rD  rS  rU  rW  r    rf  rj  rl  r8   r8   r8   r9   r.   M   s   
%
	
	

F
+
	
5






 8



 




(
8r.   c                   @   sx  e Zd Zdd Z	d,deeef deeeeee	e
ef f  fddZe 					d-dedee d	ee d
eeeeee	e
ef f  dee	 dee deeeef fddZ	d,deeef deeeeee	e
ef f  fddZd.ddZeddddededefddZeddddedefddZdd Zd d! Z	"	#	"	"d/d$ed%ed&ed'e	d(ed)ede e! fd*d+Z"dS )0AsyncSearchCommandsc                    s"   |  t| jI dH }| t|S )r   Nr   r   r8   r8   r9   r     s   zAsyncSearchCommands.infoNrA   r   c                    s   | j ||d\}}t }i }t| jdvrd|t< | jtg|R i |I dH }t|t	r1|S | j
t||t | d dS )r   r   r/   TNr   r   r   r   r8   r8   r9   r     s   
zAsyncSearchCommands.searchr   r   r   r   rM   r   c                    s   | j }i }t|g}	|	|  |r|	|  |r#|	|  |r-|	| | |r6|	d|f |rCd|d< |	|  t| jdvrNd|t< | j	|	i |I dH }
t
|
tr`|
S | jt|
fi |S )r   r   TrM   r/   Nr   r   r8   r8   r9   r   !  s,   
z!AsyncSearchCommands.hybrid_searchc                    s   t |trt|j}t| jg|  }nt |tr'd}td| jg|  }nt	d||| 
|7 }| j| I dH }| jt|||dS )r   Tr   r   Nr   r  r  r8   r8   r9   r  W  s   



zAsyncSearchCommands.aggregatec                    sd   t | j|g}|r|d|g |r|dd|g |r$|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  r8   r8   r9   r  w  s   zAsyncSearchCommands.spellcheckr'  r(  r   r)  r   c                    s&   t d||g}| j| I dH }|dkS )r*  r+  Nr,  r-  r/  r8   r8   r9   r0    s   zAsyncSearchCommands.config_setr1  c                    s,   t d|g}i }| j| I dH }| t |S )r2  r3  Nr4  r5  r8   r8   r9   r6    s
   
zAsyncSearchCommands.config_getc                    sZ   | j |I dH }dd | D }|}z|d= W n	 ty#   Y nw tdd|i|S )r   Nc                 S   r   r8   r   r   r8   r8   r9   ro     rs   z5AsyncSearchCommands.load_document.<locals>.<dictcomp>r   r8   r   r   r8   r8   r9   r     s   
z!AsyncSearchCommands.load_documentc                    st   | j dd}|D ]'}t||j|jg}|dr|d |jr+|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>`_.
        FrE  rG  rH  r   NrI  rJ  rO  r8   r8   r9   rS    s   



zAsyncSearchCommands.sugaddFrX  r   rY  rZ  r[  rD   r\  c                    sp   t ||d|g}|r|t |r|t |r|t | j| I dH }g }	|s+|	S t|||}
dd |
D S )r]  r^  Nc                 S   r_  r8   r8   r`  r8   r8   r9   ri     rb  z.AsyncSearchCommands.sugget.<locals>.<listcomp>rc  )r4   r   rY  rZ  r[  rD   r\  r   retrR   re  r8   r8   r9   rf    s   (


zAsyncSearchCommands.suggetr;   rm  rn  ro  )#rp  rq  rr  r   r   r   r   r   r   rV   rX   rt  r   r   r   r
   r   r   r   r   r	   r   r   r   r  r  r   r   r0  r6  r   rS  r   r    rf  r8   r8   r8   r9   ru    s    

 8


 ru  )Zr   r   typingr   r   r   r   r   redis._parsers.helpersr   redis.clientr   r	   "redis.commands.search.hybrid_queryr
   r   r   r   #redis.commands.search.hybrid_resultr   r   redis.utilsr   r   helpersr   _utilr   aggregationr   r   r   documentr   fieldr   index_definitionr   profile_informationr   rA   r   rc   r   rf   r    r!   r   r   r   r   r   r   r   EXPLAINCLI_CMDr   r  r  r  r  r  r#  r%  r   r.  r8  r=  r@  rC  r   rL  rV  rT  rd  ri  rk  r   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   ru  r8   r8   r8   r9   <module>   s           /