
    +h                     z   d dl Z d dlZd dlmZmZmZmZ d dl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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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=d0Z>d1Z?d2Z@d3ZAd4ZBd5ZCd6ZDd7ZEd8ZF G d9 d:      ZG G d; d<eG      ZHy)=    N)DictListOptionalUnion)Pipeline)deprecated_function   )get_protocol_versionparse_to_dict   )	to_string)AggregateRequestAggregateResultCursor)Document)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                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 ZdQd
Z	 	 	 	 	 	 	 	 	 dRdZdee   fdZdSdefdZ	 	 	 	 	 	 	 	 dTdZ	 dUdZ edd      	 	 	 	 	 	 	 dVdededededededee   dedee   fd       Z edd      dWd       ZdXd Zd! Zd" Zd# Zd$eeeeee ee!f   f   df   fd%Z"d$eeeeee ee!f   f   df   fd&Z#	 dYd'eee$f   d$eeeeee ee!f   f   df   fd(Z%	 dYd'eee$f   d$eeeee ef   f   fd)Z&d'eee$f   fd*Z'	 dYd'eee$f   d$eeeee ef   f   fd+Z(d,ed'eee$e)f   d-efd.Z*	 	 dZd'eee$e)f   d/ed$eeeeee ef   f      fd0Z+d[d1Z,d2ed3ee   fd4Z-d2ed3ee   fd5Z.d2efd6Z/d7ed8ed9efd:Z0d7ed9efd;Z1d<efd=Z2d>efd?Z3d>efd@Z4d>efdAZ5dB Z6dCed9e fdDZ7dCedEed9e fdFZ8	 	 	 	 d\dCedGedHedIe dJedKed9ee9   fdLZ:dSdMedNed3ee   fdOZ;dP Z<y)]SearchCommandszSearch commands.c                 `    t        | j                        dv r|S  | j                  |   |fi |S )N)3   )r
   client_RESP2_MODULE_CALLBACKS)selfcmdreskwargss       Q/var/www/html/venv/lib/python3.12/site-packages/redis/commands/search/commands.py_parse_resultszSearchCommands._parse_resultsB   s5    ,8J44//4SCFCC    c                 L    t        t        |      }t        t        ||            S N)mapr   dictzip)r(   r*   r+   its       r,   _parse_infozSearchCommands._parse_infoH   s    C CBK  r.   c                 x    t        ||d   j                   |d   |d   j                  |d   j                        S )Nquerydurationr8   has_payloadwith_scores)r   _no_content_with_payloads_with_scoresr(   r*   r+   s      r,   _parse_searchzSearchCommands._parse_searchL   sD    w+++J'w66w44
 	
r.   c                 4    | j                  ||d   |d         S )Nr7   
has_cursor)_get_aggregate_resultr?   s      r,   _parse_aggregatezSearchCommands._parse_aggregateU   s     ))#vg|@TUUr.   c                     |d   }t        |t              r!| j                  |d   ||j                        }n5t	        |d   |j
                   |d   |j                  |j                        }|t        |d         fS )Nr7   r   r8   r9   r   )	
isinstancer   rC   _cursorr   r<   r=   r>   r   )r(   r*   r+   r7   results        r,   _parse_profilezSearchCommands._parse_profileX   s    we-.//Au}}MFA%%%
+!00!..F }SV,,,r.   c                     i }|dk(  r|S |D ]X  }t        |t              r|dk(  rt        |      dk7  r(|d   s.|d   d   s7|d   D cg c]  }|d   |d   d c}||d   <   Z |S c c}w )Nr   r%   r	   r   )score
suggestion)rF   intlen)r(   r*   r+   corrections_correction_items         r,   _parse_spellcheckz SearchCommands._parse_spellcheckg   s    !8 	K+s+q0@;1$q>q>!$$ JUUV+@E%(%(;+KA'5	< 	+s   
A)c                 B    |r|D ci c]  }|d   |d    c}S i S c c}w )Nr   r    )r(   r*   r+   kvss       r,   _parse_config_getz SearchCommands._parse_config_get   s)    25#.3AA.=2=.s   c                 h    t        dt        |      d      D ci c]  }||   ||dz       c}S c c}w )Nr   r	   r   )rangerN   )r(   r*   r+   is       r,   _parse_syndumpzSearchCommands._parse_syndump   s4    ,1!SXq,ABqAAE
"BBBs   /c                 (    | j                  | |      S )zT
        Create a new batch indexer from the client with a given chunk size
        )
chunk_size)BatchIndexer)r(   r\   s     r,   batch_indexerzSearchCommands.batch_indexer   s       * ==r.   Nc                 6   t         | j                  g}|||j                  z  }|r|j                  t               |6t        |t              r&|j                  t               |j                  |       |r|j                  t               |r|j                  t               |r|j                  t               |	r|j                  t               |
r|j                  t               |Kt        |t        t        t        f      r0|t         t#        |      gz  }t#        |      dkD  r|t        |      z  }|j                  d       	 |t        t%        j&                  d |D               z  } | j,                  | S # t(        $ r ||j+                         z  }Y -w xY w)a  
        Create the search index. The index must not already exist.

        ### Parameters:

        - **fields**: a list of TextField or NumericField objects
        - **no_term_offsets**: If true, we will not save term offsets in
        the index
        - **no_field_flags**: If true, we will not save field flags that
        allow searching in specific fields
        - **stopwords**: If not None, we create the index with this custom
        stopword list. The list can be empty
        - **max_text_fields**: If true, we will encode indexes as if there
        were more than 32 text fields which allows you to add additional
        fields (beyond 32).
        - **temporary**: Create a lightweight temporary index which will
        expire after the specified period of inactivity (in seconds). The
        internal idle timer is reset whenever the index is searched or added to.
        - **no_highlight**: If true, disabling highlighting support.
        Also implied by no_term_offsets.
        - **no_term_frequencies**: If true, we avoid saving the term frequencies
        in the index.
        - **skip_initial_scan**: If true, we do not scan and index.

        For more information see `FT.CREATE <https://redis.io/commands/ft.create>`_.
        r   SCHEMAc              3   <   K   | ]  }|j                           y wr0   
redis_args.0fs     r,   	<genexpr>z.SearchCommands.create_index.<locals>.<genexpr>        *Ja1<<>*J   )
CREATE_CMD
index_nameargsappendr   rF   rM   r   r   r   r   r   r   listtuplesetr   rN   	itertoolschain	TypeErrorrc   execute_command)r(   fieldsno_term_offsetsno_field_flags	stopwords
definitionmax_text_fields	temporaryno_highlightno_term_frequenciesskip_initial_scanrl   s               r,   create_indexzSearchCommands.create_index   sS   P DOO,!JOO#DKK& Z	3%?KK	"KK	"KK	"KKKK!KK KK( Z	D%;M%NYI//D9~!Y'H	(D*J6*JKLLD $t##T**  	(F%%''D	(s   %E9 9FFru   c                     t         | j                  ddg}	 |t        t        j                  d |D               z  } | j                  | S # t
        $ r ||j                         z  }Y -w xY w)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              3   <   K   | ]  }|j                           y wr0   rb   rd   s     r,   rg   z2SearchCommands.alter_schema_add.<locals>.<genexpr>   rh   ri   )	ALTER_CMDrk   rn   rq   rr   rs   rc   rt   )r(   ru   rl   s      r,   alter_schema_addzSearchCommands.alter_schema_add   sr     4??He<	(D*J6*JKLLD $t##T**  	(F%%''D	(s   %A
 
A)(A)delete_documentsc                 P    |rdnd}| j                  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 )rt   DROPINDEX_CMDrk   )r(   r   
delete_strs      r,   	dropindexzSearchCommands.dropindex   s&     .T2
##M4??JOOr.   c
                    |s|	rd}t         | j                  ||g}|r|j                  d       |"|j                  d       |j                  |       |r7|j                  d       |r|j                  d       |	r|j                  d       |r|d|gz  }|j                  d       |t        t	        j
                  |
j                                z  }| |j                  | S  | j                  | S )	zS
        Internal add_document used for both batch and single doc indexing
        TNOSAVEPAYLOADREPLACEPARTIALNOCREATELANGUAGEFIELDS)ADD_CMDrk   rm   rn   rq   rr   itemsrt   )r(   doc_idconnnosaverK   payloadreplacepartiallanguage	no_createru   rl   s               r,   _add_documentzSearchCommands._add_document  s    " iG&%8KK!KK	"KK KK	"I&J'Z**DHY__flln566'4''..#t##T**r.   c                     t         | j                  ||g}|r|j                  d       |r|d|gz  }| |j                  | S  | j                  | S )zX
        Internal add_document_hash used for both batch and single doc indexing
        r   r   )ADDHASH_CMDrk   rm   rt   )r(   r   r   rK   r   r   rl   s          r,   _add_document_hashz!SearchCommands._add_document_hash,  sc     T__fe<KK	"Z**D'4''..#t##T**r.   z2.0.0z2deprecated since redisearch 2.0, call hset instead)versionreasonr   r   rK   r   r   r   r   r   c	                 :     | j                   |fd|||||||d|	S )a  
        Add a single document to the index.

        ### Parameters

        - **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
        i              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   rK   r   r   r   r   r   )r   )
r(   r   r   rK   r   r   r   r   r   ru   s
             r,   add_documentzSearchCommands.add_document@  sD    V "t!!

 
 	
r.   c                 .    | j                  |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   rK   r   r   )r   )r(   r   rK   r   r   s        r,   add_document_hashz SearchCommands.add_document_hashx  s'      &&UXw ' 
 	
r.   c                     t         | j                  |g}|r|j                  d       | |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   )DEL_CMDrk   rm   rt   )r(   r   r   delete_actual_documentrl   s        r,   delete_documentzSearchCommands.delete_document  sO     &1!KK'4''..#t##T**r.   c                     | j                   j                  |      }|j                         D ci c]  \  }}t        |      t        |       }}}|}	 |d= t        dd|i|S c c}}w # t        $ r Y w xY w).
        Load a single document by id
        idrT   r&   hgetallr   r   KeyErrorr   r(   r   ru   kvf2s         r,   load_documentzSearchCommands.load_document  s     $$R(5;\\^DTQilIaL(DD	t (2((( E
  		s   A$A* *	A65A6c                 F     | j                   t        | j                  g| S )z
        Returns the full contents of multiple documents.

        ### Parameters

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

        )rt   MGET_CMDrk   )r(   idss     r,   getzSearchCommands.get  s"     $t##HdooDDDr.   c                 n    | j                  t        | j                        }| 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>`_.
        rt   INFO_CMDrk   r-   r(   r*   s     r,   infozSearchCommands.info  s-     ""8T__=""8S11r.   query_paramsc                     |g S g }t        |      dkD  rh|j                  d       |j                  t        |      dz         |j                         D ]'  \  }}|j                  |       |j                  |       ) |S )Nr   paramsr	   )rN   rm   r   )r(   r   rl   keyvalues        r,   get_params_argszSearchCommands.get_params_args  s~     I|q KK!KKL)A-.*002 #
UC E"# r.   c                     | j                   g}t        |t              rt        |      }t        |t              st	        dt        |             ||j                         z  }|| j                  |      z  }||fS )NzBad query type )rk   rF   strr   
ValueErrortypeget_argsr   )r(   r7   r   rl   s       r,   _mk_query_argszSearchCommands._mk_query_args  ss      eS!%LE%'tE{m<==  $$\22U{r.   r7   c                 
   | j                  ||      \  }}t        j                         } | j                  t        g| }t	        |t
              r|S | j                  t        ||t        j                         |z
  dz        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        @@r7   r8   r   timert   
SEARCH_CMDrF   r   r-   r(   r7   r   rl   str*   s         r,   searchzSearchCommands.search  s      ))%l)KeYY["d"":55c8$J""5DIIK"4D3N # 
 	
r.   c                 \    | j                  ||      \  }} | j                  t        g| S )zReturns the execution plan for a complex query.

        For more information see `FT.EXPLAIN <https://redis.io/commands/ft.explain>`_.
        r   )r   rt   EXPLAIN_CMD)r(   r7   r   rl   
query_texts        r,   explainzSearchCommands.explain  s6      ..u<.Pj#t##K7$77r.   c                     t        d      )Nz#EXPLAINCLI will not be implemented.)NotImplementedError)r(   r7   s     r,   explain_clizSearchCommands.explain_cli
  s    !"GHHr.   c                    t        |t              r9t        |j                        }t        | j
                  g|j                         z   }nCt        |t              r'd}t        d| j
                  g|j                         z   }nt        d|      || j                  |      z  } | j                  | }| j                  t        |||      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_CMDrk   
build_argsr   
CURSOR_CMDr   r   rt   r-   r(   r7   r   rB   r)   raws         r,   	aggregatezSearchCommands.aggregate  s    " e-.emm,J $//2U5E5E5GGCv&Jvt7%:J:J:LLC[%00t##L11"d""C(""3e
 # 
 	
r.   r   rB   c                     |r1t        |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rowss          r,   rC   z$SearchCommands._get_aggregate_result-  s     %(F	Aa&CFe-.53E3EVFqr7DFqr7DtVV44r.   limitedc                    t        j                          }t        | j                  dg}|r|j                  d       |j                  d       t	        |t
              rd|d<   ||j                         z  }nHt	        |t              r-d|d<   ||j                         z  }|| j                  |      z  }nt        d       | j                  | }| j                  t        ||t        j                          |z
  dz  	      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_CMDrk   rm   rF   r   r   r   r   r   r   rt   r-   )r(   r7   r   r   r   r)   r*   s          r,   profilezSearchCommands.profileC  s    $ YY[DOOR0JJy!

7e-. CF5##%%Cu%CF5>>##C4''55CTUU"d""C(""ETYY[25E4O # 
 	
r.   c                     t         | j                  |g}|r|j                  d|g       |r|j                  dd|g       |r|j                  dd|g        | j                  | }| j	                  t         |      S )  
        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>`_.
        DISTANCETERMSINCLUDEEXCLUDESPELLCHECK_CMDrk   extendrt   r-   r(   r7   distanceincludeexcluder)   r*   s          r,   
spellcheckzSearchCommands.spellcheckk  sy     t6JJ
H-.JJG45JJG45"d""C("">377r.   nametermsc                 R    t         |g}|j                  |        | 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  rt   r(   r  r	  r)   s       r,   dict_addzSearchCommands.dict_add  -     T"

5#t##S))r.   c                 R    t         |g}|j                  |        | 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  rt   r  s       r,   dict_delzSearchCommands.dict_del  r  r.   c                 0    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_CMDrt   )r(   r  r)   s      r,   	dict_dumpzSearchCommands.dict_dump  s!     d##t##S))r.   optionr   returnc                 >    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_CMDrt   r(   r  r   r)   r   s        r,   
config_setzSearchCommands.config_set  s.     5&%0"d""C(d{r.   c                 ^    t         d|g} | j                  | }| 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  rt   r-   r(   r  r)   r*   s       r,   
config_getzSearchCommands.config_get  s5     5&)"d""C("":s33r.   tagfieldc                 D    | j                  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>`_.
        )rt   TAGVALS_CMDrk   )r(   r%  s     r,   tagvalszSearchCommands.tagvals  s     ##K(KKr.   aliasc                 D    | j                  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>`_.
        )rt   ALIAS_ADD_CMDrk   r(   r)  s     r,   aliasaddzSearchCommands.aliasadd  s     ##M5$//JJr.   c                 D    | j                  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>`_.
        )rt   ALIAS_UPDATE_CMDrk   r,  s     r,   aliasupdatezSearchCommands.aliasupdate  s     ##$4eT__MMr.   c                 .    | j                  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>`_.
        )rt   ALIAS_DEL_CMDr,  s     r,   aliasdelzSearchCommands.aliasdel  s     ##M599r.   c                 h   | j                  d      }|D ]  }t        ||j                  |j                  g}|j	                  d      r|j                  d       |j                  r,|j                  d       |j                  |j                          |j                  |   |j                         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stringrK   r   rm   r   rt   executer(   r   suggestionsr+   pipesugrl   s          r,   sugaddzSearchCommands.sugadd  s     }}}/ 	(C"CSYY?Dzz+&F#{{I&CKK( D  $'	( ||~b!!r.   r   c                 .    | j                  t        |      S )z
        Return the number of entries in the AutoCompleter index.

        For more information see `FT.SUGLEN <https://redis.io/commands/ft.suglen>`_.
        )rt   SUGLEN_COMMAND)r(   r   s     r,   suglenzSearchCommands.suglen  s     ##NC88r.   r=  c                 0    | j                  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>`_.
        )rt   SUGDEL_COMMAND)r(   r   r=  s      r,   sugdelzSearchCommands.sugdel  s     ##NC@@r.   prefixfuzzynumr;   with_payloadsc                    t         ||d|g}|r|j                  t               |r|j                  t               |r|j                  t                | j
                  | }g }	|s|	S t        |||      }
|
D cg c]  }| c}S c c}w )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>`_.
        MAXSUGGET_COMMANDrm   r   r   r    rt   r   )r(   r   rJ  rK  rL  r;   rM  rl   r*   resultsparserss               r,   suggetzSearchCommands.sugget%  s    P VUC8KKKK
#KK%"d""D)N!+}cB!"a"""s   7	Bgroupidskipinitialc                     t         | j                  |g}|r|j                  dg       |j                  |        | 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_CMDrk   r  rt   )r(   rW  rX  r	  r)   s        r,   	synupdatezSearchCommands.synupdate]  sF    $ doow7JJ)*+

5#t##S))r.   c                 n    | j                  t        | j                        }| 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>`_.
        )rt   SYNDUMP_CMDrk   r-   r   s     r,   syndumpzSearchCommands.syndumpu  s-     "";@"";44r.   )d   )	FFNNFNFFF)F)NF      ?NFFNF)Nr`  NF)Fr`  NFFNF)r`  NF)NFr0   )FNNNNF
   FF)=__name__
__module____qualname____doc__r-   r5   r@   rD   rI   rR   rV   rZ   r^   r   r   r   r   r   r   r   r   r   floatr   r   r   r   r   r   r   r   r   rM   bytesr   r   r   r   r   r   r   r   rC   r   r  r  r  r  r  r$  r(  r-  r0  r3  rC  rF  rI  r   rV  r[  r^  rT   r.   r,   r"   r"   ?   sw   D!
V-#J>C> !E+N+tCy +(P$ P$ (+V DI+(  T "&3
3
 3
 	3

 3
 3
 3
 3-3
 3
 s)3
3
j  T

"+&)
E	2!$sE#sE52H,I'I"JD"PQ#(c5c5%9O3P.P)QSW)W#X& OS
S%Z 
 DeCeU,B&C!CDdJK
< ;?
8S%Z 
8 3c3o 667
8IsEz!2 I ;?
S%Z 
 3c3o 667
@55 %c52B&B C5QU52 DH	&
S%!112&
 &
 tCsC)?$?@A	&
P88*S *$s) **S *$s) *
*c 
* S T 4 4 4L LKc KN N
:c 
:".9# 9# 9A# As As A !#6#6# 6# 	6#
 6# 6# 6# 
	6#p* *4 *c *0
5r.   r"   c                       e Zd Zd Z	 ddeeef   deeeeee	f   f   fdZ
	 ddeeef   deeeeee	f   f   fdZddZded	ed
efdZded
efdZd Zd Z	 	 	 	 ddedededededed
ee   fdZy)AsyncSearchCommandsc                    K   | j                  t        | j                         d{   }| j                  t        |      S 7 w)r   Nr   r   s     r,   r   zAsyncSearchCommands.info  s:      ((4??CC""8S11 Ds   $AAANr7   r   c                 &  K   | j                  ||      \  }}t        j                         } | j                  t        g|  d{   }t	        |t
              r|S | j                  t        ||t        j                         |z
  dz        S 7 Gw)r   r   Nr   r   r   r   s         r,   r   zAsyncSearchCommands.search  s       ))%l)KeYY[(D((;d;;c8$J""5DIIK"4D3N # 
 	
 <s   ABBABc                   K   t        |t              r9t        |j                        }t        | j
                  g|j                         z   }nCt        |t              r'd}t        d| j
                  g|j                         z   }nt        d|      || j                  |      z  } | j                  |  d{   }| j                  t        |||      S 7 w)r   Tr   r   Nr   r   r   s         r,   r   zAsyncSearchCommands.aggregate  s     " e-.emm,J $//2U5E5E5GGCv&Jvt7%:J:J:LLC[%00t##L11(D((#..""3e
 # 
 	
 /s   B3C5C6Cc                   K   t         | j                  |g}|r|j                  d|g       |r|j                  dd|g       |r|j                  dd|g        | j                  |  d{   }| j	                  t         |      S 7 w)r   r   r   r   r   Nr   r  s          r,   r  zAsyncSearchCommands.spellcheck  s      t6JJ
H-.JJG45JJG45(D((#.."">377 /s   A'B)B*Br  r   r  c                 Z   K   t         d||g} | j                  |  d{   }|dk(  S 7 	w)r  r  Nr  r  r  s        r,   r  zAsyncSearchCommands.config_set  s:      5&%0(D((#..d{ /s   +)
+c                 ~   K   t         d|g}i } | j                  |  d{   }| j                  t         |      S 7 w)r   r!  Nr"  r#  s       r,   r$  zAsyncSearchCommands.config_get  sF      5&)(D((#.."":s33 /s   =;=c                   K   | j                   j                  |       d{   }|j                         D ci c]  \  }}t        |      t        |       }}}|}	 |d= t        dd|i|S 7 Lc c}}w # t        $ r Y  w xY ww)r   Nr   rT   r   r   s         r,   r   z!AsyncSearchCommands.load_document  s      {{**2..5;\\^DTQilIaL(DD	t (2((( /D
  		sD   BA.BA0BA6 !B0B6	B?BBBc                   K   | j                  d      }|D ]  }t        ||j                  |j                  g}|j	                  d      r|j                  d       |j                  r,|j                  d       |j                  |j                          |j                  |   |j                          d{   d   S 7 w)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>`_.
        Fr5  r7  r8  r   Nr9  r:  r?  s          r,   rC  zAsyncSearchCommands.sugadd  s      }}}/ 	(C"CSYY?Dzz+&F#{{I&CKK( D  $'	( lln$b))$s   B4C 6B>7C r   rJ  rK  rL  r;   rM  c                 ,  K   t         ||d|g}|r|j                  t               |r|j                  t               |r|j                  t                | j
                  |  d{   }g }	|s|	S t        |||      }
|
D cg c]  }| c}S 7 'c c}w w)rO  rP  NrQ  )r(   r   rJ  rK  rL  r;   rM  rl   retrS  rT  rU  s               r,   rV  zAsyncSearchCommands.sugget'  s     P VUC8KKKK
#KK%(D(($//N!+}cB!"a"" 0 #s$   A#B%B&B	B
BBr0   ra  rb  )rd  re  rf  r   r   r   r   r   rM   rh  r   r   r  r   r  r$  r   rC  r   r   rV  rT   r.   r,   rk  rk    s   	2 ;?
S%Z 
 3c3o 667
< ;?
S%Z 
 3c3o 667
@88s 3 4 4s 4s 4)*6 !#6#6# 6# 	6#
 6# 6# 6# 
	6#r.   rk  )Irq   r   typingr   r   r   r   redis.clientr   redis.utilsr   helpersr
   r   _utilr   aggregationr   r   r   documentr   r7   r   rH   r   rL   r   r   rj   r   r   r   r   DROP_CMDr   r   EXPLAINCLI_CMDr   r   r   r   r  r  r  r  GET_CMDr   r  r'  r+  r/  r2  r   r<  rH  rE  rR  rZ  r]  r   r   r   r   r   r   r   r   r   r   r    r"   rk  rT   r.   r,   <module>r     s"     . . ! + 9  B B    (

	

 

 

# 	
		#
@5 @5F[#. [#r.   