o
    Š¨Êh5’  ã                   @   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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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@d0ZAd1ZBd2ZCd3ZDd4ZEd5ZFd6ZGd7ZHd8ZId9ZJd:ZKG d;d<„ d<ƒZLG d=d>„ d>eLƒZMdS )?é    N)ÚDictÚListÚOptionalÚUnion)ÚNEVER_DECODEÚPipeline)Údeprecated_functioné   )Úget_protocol_versionÚparse_to_dicté   ©Ú	to_string)ÚAggregateRequestÚAggregateResultÚCursor)ÚDocument)ÚField)ÚIndexDefinition)ÚQuery)ÚResult)ÚSuggestionParserÚNUMERICz	FT.CREATEzFT.ALTERz	FT.SEARCHzFT.ADDz
FT.ADDHASHzFT.DROPzFT.DROPINDEXz
FT.EXPLAINzFT.EXPLAINCLIzFT.DELzFT.AGGREGATEz
FT.PROFILEz	FT.CURSORzFT.SPELLCHECKz
FT.DICTADDz
FT.DICTDELzFT.DICTDUMPzFT.GETz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dˆdd„Z									d‰d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 fd!d"„ZdŠd#efd$d%„Z			&					d‹d'd(„Z	dŒd)d*„Zed+d,d-�		&					d�d.ed/ed0ed1ed2ed3ed4ee d5edee fd6d7„ƒZed+d,d-�dŽd8d9„ƒZd�d:d;„Zd<d=„ Zd>d?„ Zd@dA„ ZdBe e!ee ee"ee#f f df fdCdD„Z$dBe e!ee ee"ee#f f df fdEdF„Z%	d�dGe ee&f dBe e!ee ee"ee#f f df fdHdI„Z'	d�dGe ee&f dBe!ee ee"ef f fdJdK„Z(dGe ee&f fdLdM„Z)	d�dGe ee&f dBe!ee ee"ef f fdNdO„Z*dPedGe ee&e+f dQefdRdS„Z,		d‘dGe ee&e+f dTedBee!ee ee"ef f  fdUdV„Z-d’dWdX„Z.dYedZee fd[d\„Z/dYedZee fd]d^„Z0dYefd_d`„Z1daedbedcefddde„Z2daedcefdfdg„Z3dhefdidj„Z4dkefdldm„Z5dkefdndo„Z6dkefdpdq„Z7drds„ Z8dtedce"fdudv„Z9dtedwedce"fdxdy„Z:		z		d“dted{ed|ed}e"d~ededcee; fd€d�„Z<dŠd‚edƒedZee fd„d…„Z=d†d‡„ Z>dS )”ÚSearchCommandszSearch commands.c                 K   s(   t | jƒdv r	|S | j| |fi |¤ŽS )N©Ú3é   )r
   ÚclientÚ_RESP2_MODULE_CALLBACKS)ÚselfÚcmdÚresÚkwargs© r.   úP/var/www/html/env/lib/python3.10/site-packages/redis/commands/search/commands.pyÚ_parse_resultsD   s   zSearchCommands._parse_resultsc                 K   s   t t|ƒ}tt||ƒƒS ©N)Úmapr   ÚdictÚzip)r*   r,   r-   Úitr.   r.   r/   Ú_parse_infoJ   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_scoresÚfield_encodings)r   Ú_no_contentÚ_with_payloadsÚ_with_scoresÚ_return_fields_decode_as©r*   r,   r-   r.   r.   r/   Ú_parse_searchN   s   
úzSearchCommands._parse_searchc                 K   s   |   ||d |d ¡S )Nr7   Ú
has_cursor)Ú_get_aggregate_resultr@   r.   r.   r/   Ú_parse_aggregateX   ó   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   rC   Ú_cursorr   r<   r=   r>   r   )r*   r,   r-   r7   Úresultr.   r.   r/   Ú_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   r'   r	   c                 S   s   g | ]}|d  |d dœ‘qS )r   r   )ÚscoreÚ
suggestionr.   )Ú.0Ú_itemr.   r.   r/   Ú
<listcomp>‰   s    ÿz4SearchCommands._parse_spellcheck.<locals>.<listcomp>r   )rF   ÚintÚlen)r*   r,   r-   ÚcorrectionsÚ_correctionr.   r.   r/   Ú_parse_spellcheckj   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.   )rL   Úkvsr.   r.   r/   Ú
<dictcomp>�   s    z4SearchCommands._parse_config_get.<locals>.<dictcomp>r.   r@   r.   r.   r/   Ú_parse_config_get�   rE   z SearchCommands._parse_config_getc                    s   ‡ fdd„t dtˆ ƒdƒD ƒS )Nc                    s   i | ]}ˆ | ˆ |d   “qS )r   r.   )rL   Úi©r,   r.   r/   rU   “   ó    z1SearchCommands._parse_syndump.<locals>.<dictcomp>r   r	   )ÚrangerP   r@   r.   rX   r/   Ú_parse_syndump’   s   zSearchCommands._parse_syndumpéd   c                 C   s   | j | |d�S )zT
        Create a new batch indexer from the client with a given chunk size
        )Ú
chunk_size)ÚBatchIndexer)r*   r]   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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 r1   ©Ú
redis_args©rL   Úfr.   r.   r/   Ú	<genexpr>Û   ó   € z.SearchCommands.create_index.<locals>.<genexpr>)Ú
CREATE_CMDÚ
index_nameÚargsÚappendr   rF   rO   r   r   r   r   r   r    ÚlistÚtupleÚsetr   rP   Ú	itertoolsÚchainÚ	TypeErrorrk   Úexecute_command)r*   r`   ra   rb   rc   rd   Úmax_text_fieldsÚ	temporaryre   rf   rg   rr   r.   r.   r/   Ú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>`_.
        rh   ÚADDc                 s   ri   r1   rj   rl   r.   r.   r/   rn   ï   ro   z2SearchCommands.alter_schema_add.<locals>.<genexpr>)Ú	ALTER_CMDrq   rt   rw   rx   ry   rk   rz   )r*   r`   rr   r.   r.   r/   Úalter_schema_addá   s    ÿ
zSearchCommands.alter_schema_addÚdelete_documentsc                 C   s   |rdnd}|   t| 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>`_.
        ÚDDÚ )rz   ÚDROPINDEX_CMDrq   )r*   r�   Ú
delete_strr.   r.   r/   Ú	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_CMDrq   rs   rt   rw   rx   Úitemsrz   )r*   Údoc_idÚconnÚnosaverJ   ÚpayloadÚreplaceÚpartialÚlanguageÚ	no_creater`   rr   r.   r.   r/   Ú_add_document  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_CMDrq   rs   rz   )r*   r‘   r’   rJ   r—   r•   rr   r.   r.   r/   Ú_add_document_hash.  s   


z!SearchCommands._add_document_hashz2.0.0z2deprecated since redisearch 2.0, call hset instead)ÚversionÚreasonr‘   r“   rJ   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“   rJ   r”   r•   r–   r—   r˜   )r™   )
r*   r‘   r“   rJ   r”   r•   r–   r—   r˜   r`   r.   r.   r/   Úadd_documentB  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’   rJ   r—   r•   )r›   )r*   r‘   rJ   r—   r•   r.   r.   r/   Úadd_document_hashz  s   
ÿz SearchCommands.add_document_hashc                 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_CMDrq   rs   rz   )r*   r‘   r’   Údelete_actual_documentrr   r.   r.   r/   Ú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 r.   r   ©rL   ÚkÚvr.   r.   r/   rU   ¦  rY   z0SearchCommands.load_document.<locals>.<dictcomp>ÚidNr.   ©r(   Úhgetallr�   ÚKeyErrorr   ©r*   r¨   r`   Úf2r.   r.   r/   Ú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.

        )rz   ÚMGET_CMDrq   )r*   Úidsr.   r.   r/   Ú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>`_.
        ©rz   ÚINFO_CMDrq   r0   ©r*   r,   r.   r.   r/   Ú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	   )rP   rs   r�   )r*   r¸   rr   ÚkeyÚvaluer.   r.   r/   Ú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 )rq   rF   Ústrr   Ú
ValueErrorÚtypeÚget_argsr¼   )r*   r7   r¸   rr   r.   r.   r/   Ú_mk_query_argsÕ  s   

zSearchCommands._mk_query_argsr7   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ç     @�@©r7   r8   ©
rÁ   Útimer
   r(   r   rz   Ú
SEARCH_CMDrF   r   r0   ©r*   r7   r¸   rr   ÚstÚoptionsr,   r.   r.   r/   Úsearchå  s   
ÿzSearchCommands.searchc                 C   s$   | j ||d�\}}| jtg|¢R Ž S )z�Returns the execution plan for a complex query.

        For more information see `FT.EXPLAIN <https://redis.io/commands/ft.explain>`_.
        rÃ   )rÁ   rz   ÚEXPLAIN_CMD)r*   r7   r¸   rr   Ú
query_textr.   r.   r/   Úexplain  s   	zSearchCommands.explainc                 C   s   t dƒ‚)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ƒ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©r7   rB   ©rF   r   ÚboolrG   ÚAGGREGATE_CMDrq   Ú
build_argsr   Ú
CURSOR_CMDr¾   r¼   rz   r0   ©r*   r7   r¸   rB   r+   Úrawr.   r.   r/   Ú	aggregate  s   




ÿzSearchCommands.aggregaterÜ   rB   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	   )rF   r   Úcidr   Ú_with_schemar   )r*   rÜ   r7   rB   ÚcursorÚschemaÚrowsr.   r.   r/   rC   4  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`, `Query` or string.
        **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	   ÚSEARCHz5Must provide AggregateRequest object or Query object.rÄ   rÅ   )rÇ   ÚPROFILE_CMDrq   rs   rF   r   rÙ   r   rÀ   r¼   r¾   rz   r0   )r*   r7   rã   r¸   rÊ   r+   r,   r.   r.   r/   ÚprofileJ  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_CMDrq   Úextendrz   r0   ©r*   r7   ÚdistanceÚincludeÚexcluder+   r,   r.   r.   r/   Ú
spellcheckr  s   
zSearchCommands.spellcheckÚnameÚtermsc                 G   ó   t |g}| |¡ | j|Ž S )zûAdds 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ð   rz   ©r*   rö   r÷   r+   r.   r.   r/   Ú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ð   rz   rú   r.   r.   r/   Údict_delœ  rü   zSearchCommands.dict_delc                 C   s   t |g}| j|Ž S )zÉDumps all terms in the given dictionary.

        ### Parameters

        - **name**: Dictionary name.

        For more information see `FT.DICTDUMP <https://redis.io/commands/ft.dictdump>`_.
        )ÚDICT_DUMP_CMDrz   )r*   rö   r+   r.   r.   r/   Ú	dict_dumpª  s   	
zSearchCommands.dict_dumpÚ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_CMDrz   ©r*   r  r»   r+   rÜ   r.   r.   r/   Ú
config_set¶  s   

zSearchCommands.config_setc                 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  rz   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>`_.
        )rz   ÚTAGVALS_CMDrq   )r*   r  r.   r.   r/   Ú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>`_.
        )rz   ÚALIAS_ADD_CMDrq   ©r*   r  r.   r.   r/   ÚaliasaddÞ  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>`_.
        )rz   ÚALIAS_UPDATE_CMDrq   r  r.   r.   r/   Úaliasupdateë  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>`_.
        )rz   ÚALIAS_DEL_CMDr  r.   r.   r/   Úaliasdelø  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ÚstringrJ   r±   rs   r”   rz   Úexecute©r*   rº   Úsuggestionsr-   ÚpipeÚsugrr   r.   r.   r/   Úsugadd  s   



zSearchCommands.sugaddrº   c                 C   r  )z 
        Return the number of entries in the AutoCompleter index.

        For more information see `FT.SUGLEN <https://redis.io/commands/ft.suglen>`_.
        )rz   ÚSUGLEN_COMMAND)r*   rº   r.   r.   r/   Úsuglen  s   zSearchCommands.suglenr%  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>`_.
        )rz   ÚSUGDEL_COMMAND)r*   rº   r%  r.   r.   r/   Úsugdel#  s   zSearchCommands.sugdelé
   ÚprefixÚfuzzyÚnumr:   Ú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 r.   r.   ©rL   Úsr.   r.   r/   rN   b  ó    z)SearchCommands.sugget.<locals>.<listcomp>©ÚSUGGET_COMMANDrs   r"   r!   r#   rz   r   )r*   rº   r1  r2  r3  r:   r4  rr   r,   ÚresultsÚparserr.   r.   r/   Ú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_CMDrq   rð   rz   )r*   r@  rA  r÷   r+   r.   r.   r/   Ú	synupdated  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>`_.
        )rz   ÚSYNDUMP_CMDrq   r0   r¶   r.   r.   r/   Úsyndump|  s   	zSearchCommands.syndump)r\   )	FFNNFNFFF)F)NFr‡   NFFNF)Nr‡   NF)Fr‡   NFFNF)r‡   NF)NFr1   )FN©NNN©Fr0  FF)?Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   r6   rA   rD   rI   rS   rV   r[   r_   r   r   r×   r   r½   r   r}   r€   r†   r™   r›   r   Úfloatrž   rŸ   r¢   r®   r±   r·   r   r   rO   Úbytesr¼   rÁ   r   rÌ   rÏ   rÑ   rÝ   r   rC   ré   rõ   rû   rþ   r   r	  r  r  r  r  r  r+  r-  r/  r   r?  rC  rE  r.   r.   r.   r/   r$   A   sD   
%
	õþýü
ûú	÷
ö
õF
ö+
ÿÿ÷þýüûúùø	÷
ö5ÿ

ÿ
ÿý
þ
ý#ý
þ
ýý
þ
ý ÿÿ
ÿüþý
ü
(ùþýüûúù
ø8r$   c                   @   sê   e Zd Zdd„ Z	d!deeef deeeeee	f f fdd„Z
	d!deeef deeeeee	f f fdd	„Zd"d
d„Zdededefdd„Z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 )$ÚAsyncSearchCommandsc                 Ã   s"   �|   t| j¡I dH }|  t|¡S )r³   Nr´   r¶   r.   r.   r/   r·   Š  s   €zAsyncSearchCommands.infoNr7   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É   r.   r.   r/   rÌ   •  s   €
ÿzAsyncSearchCommands.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Û   r.   r.   r/   rÝ   µ  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ñ   r.   r.   r/   rõ   Õ  s   €zAsyncSearchCommands.spellcheckr  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_setc                 Ã   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y#   Y nw tdd|i|¤ŽS )r£   Nc                 S   r¤   r.   r   r¥   r.   r.   r/   rU     rY   z5AsyncSearchCommands.load_document.<locals>.<dictcomp>r¨   r.   r©   r¬   r.   r.   r/   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>`_.
        Fr  r  r   r‰   Nr!  r"  r'  r.   r.   r/   r+    s   €



zAsyncSearchCommands.sugaddFr0  rº   r1  r2  r3  r:   r4  c                 Ã   sp   �t ||d|g}|r| t¡ |r| t¡ |r| t¡ | j|Ž I dH }g }	|s+|	S t|||ƒ}
dd„ |
D ƒS )r5  r6  Nc                 S   r7  r.   r.   r8  r.   r.   r/   rN   i  r:  z.AsyncSearchCommands.sugget.<locals>.<listcomp>r;  )r*   rº   r1  r2  r3  r:   r4  rr   Úretr=  r>  r.   r.   r/   r?  3  s   €(


zAsyncSearchCommands.suggetr1   rF  rG  )rH  rI  rJ  r·   r   r½   r   r   rO   rL  rÌ   rÝ   rõ   r×   r	  r  r®   r+  r   r   r?  r.   r.   r.   r/   rN  ‰  sL    ý
þ
ý#ý
þ
ý
 ùþýüûúùørN  )Nrw   rÇ   Útypingr   r   r   r   Úredis.clientr   r   Úredis.utilsr   Úhelpersr
   r   Ú_utilr   Úaggregationr   r   r   Údocumentr   Úfieldr   ÚindexDefinitionr   r7   r   rH   r   rK   r   r   rp   r   rÈ   r�   rš   ÚDROP_CMDr„   rÍ   ÚEXPLAINCLI_CMDr    rØ   rè   rÚ   rï   rù   rý   rÿ   ÚGET_CMDr¯   r  r  r  r  r  rµ   r$  r.  r,  r<  rB  rD  r   r   r   r   r   r   r   r    r!   r"   r#   r$   rN  r.   r.   r.   r/   Ú<module>   s‚          N