
    )Jf                        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          ZHdS )=    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dUdZ	 	 	 	 	 	 	 	 	 dVdZdee         fdZdWdefdZ	 	 	 	 	 	 	 	 dXdZ	 dYdZ edd          	 	 	 	 	 	 	 dZd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          d[d"            Zd\d#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#	 d]d*eee$f         d'eeeeee ee!f         f         df         fd+Z%	 d]d*eee$f         d'eeeee ef         f         fd,Z&d*eee$f         fd-Z'	 d]d*eee$f         d'eeeee ef         f         fd.Z(d/ed*eee$e)f         d0efd1Z*	 	 d^d*eee$e)f         d2ed'eeeeee ef         f                  fd3Z+d_d4Z,d5ed6ee         fd7Z-d5ed6ee         fd8Z.d5efd9Z/d:ed;ed<efd=Z0d:ed<efd>Z1d?efd@Z2dAefdBZ3dAefdCZ4dAefdDZ5dE Z6dFed<e fdGZ7dFedHed<e fdIZ8	 	 	 	 d`dFedKedLedMe dNedOed<ee9         fdPZ:dWdQedRed6ee         fdSZ;dT Z<dS )aSearchCommandszSearch commands.c                 Z    t          | j                  dv r|S  | j        |         |fi |S )N)3   )r
   client_RESP2_MODULE_CALLBACKS)selfcmdreskwargss       a/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/redis/commands/search/commands.py_parse_resultszSearchCommands._parse_resultsB   s<    ,,88J44/4SCCFCCC    c                 f    t          t          |          }t          t          ||                    S N)mapr   dictzip)r)   r+   r,   its       r-   _parse_infozSearchCommands._parse_infoH   s'    C  CBKK   r/   c                 z    t          ||d         j         |d         |d         j        |d         j                  S )Nquerydurationr9   has_payloadwith_scores)r   _no_content_with_payloads_with_scoresr)   r+   r,   s      r-   _parse_searchzSearchCommands._parse_searchL   sE    w++J'w6w4
 
 
 	
r/   c                 H    |                      ||d         |d                   S )Nr8   
has_cursor)_get_aggregate_resultr@   s      r-   _parse_aggregatezSearchCommands._parse_aggregateU   s#    ))#vg|@TUUUr/   c                    |d         }t          |t                    r#|                     |d         ||j                  }n0t	          |d         |j         |d         |j        |j                  }|t          |d                   fS )Nr8   r   r9   r:   r   )	
isinstancer   rD   _cursorr   r=   r>   r?   r   )r)   r+   r,   r8   results        r-   _parse_profilezSearchCommands._parse_profileX   s    we-.. 		//Au}MMFFA%%
+!0!.  F }SV,,,,r/   c                     i }|dk    r|S |D ]e}t          |t                    r|dk    rt          |          dk    r2|d         s;|d         d         sJd |d         D             ||d         <   f|S )Nr   r&   r	   c                 0    g | ]}|d          |d         dS )r   r   )score
suggestion ).0_items     r-   
<listcomp>z4SearchCommands._parse_spellcheck.<locals>.<listcomp>   s5     + + +@E%(%(;;+ + +r/   r   )rG   intlen)r)   r+   r,   corrections_corrections        r-   _parse_spellcheckz SearchCommands._parse_spellcheckg   s    !88 	 	K+s++ q0@0@;1$$q> q>!$ "+ +ITUV+ + +KA'' r/   c                 "    |rd |D             ni S )Nc                 ,    i | ]}|d          |d         S )r   r   rO   )rP   kvss     r-   
<dictcomp>z4SearchCommands._parse_config_get.<locals>.<dictcomp>   s"    ...3AA...r/   rO   r@   s      r-   _parse_config_getz SearchCommands._parse_config_get   s!    25=..#....2=r/   c                 X    fdt          dt                    d          D             S )Nc                 4    i | ]}|         |d z            S )r   rO   )rP   ir+   s     r-   r[   z1SearchCommands._parse_syndump.<locals>.<dictcomp>   s'    BBBqAAE
BBBr/   r   r	   )rangerT   r@   s    ` r-   _parse_syndumpzSearchCommands._parse_syndump   s/    BBBBE!SXXq,A,ABBBBr/   d   c                 0    |                      | |          S )zT
        Create a new batch indexer from the client with a given chunk size
        )
chunk_size)BatchIndexer)r)   rd   s     r-   batch_indexerzSearchCommands.batch_indexer   s       * ===r/   FNc                    t           | j        g}|
||j        z  }|r|                    t                     |Dt          |t                    r/|                    t                     |                    |           |r|                    t                     |r|                    t                     |r|                    t                     |	r|                    t                     |
r|                    t                     |`t          |t          t          t          f          r>|t           t#          |          gz  }t#          |          dk    r|t          |          z  }|                    d           	 |t          t%          j        d |D                        z  }n'# t(          $ r ||                                z  }Y nw xY w | j        | S )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>`_.
        Nr   SCHEMAc              3   >   K   | ]}|                                 V  d S r1   
redis_argsrP   fs     r-   	<genexpr>z.SearchCommands.create_index.<locals>.<genexpr>   *      *J*Ja1<<>>*J*J*J*J*J*Jr/   )
CREATE_CMD
index_nameargsappendr   rG   rS   r   r   r   r   r   r   listtuplesetr   rT   	itertoolschain	TypeErrorrk   execute_command)r)   fieldsno_term_offsetsno_field_flags	stopwords
definitionmax_text_fields	temporaryno_highlightno_term_frequenciesskip_initial_scanrr   s               r-   create_indexzSearchCommands.create_index   s   P DO,!JO#D 	'KK&&& Z	3%?%? KK	"""KK	""" 	#KK	""" 	KK 	"KK!!! 	!KK    	)KK((( Z	D%;M%N%N YI//D9~~!!Y'H	(D*J*J6*J*J*JKLLLDD 	( 	( 	(F%%'''DDD	( $t#T**s   (F* *!GGr{   c                     t           | j        ddg}	 |t          t          j        d |D                        z  }n'# t
          $ r ||                                z  }Y nw xY 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              3   >   K   | ]}|                                 V  d S r1   rj   rl   s     r-   rn   z2SearchCommands.alter_schema_add.<locals>.<genexpr>   ro   r/   )	ALTER_CMDrq   rt   rw   rx   ry   rk   rz   )r)   r{   rr   s      r-   alter_schema_addzSearchCommands.alter_schema_add   s     4?He<	(D*J*J6*J*J*JKLLLDD 	( 	( 	(F%%'''DDD	( $t#T**s   (; !AAdelete_documentsc                 P    |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_strs      r-   	dropindexzSearchCommands.dropindex   s,     .5TT2
##M4?JOOOr/         ?c
                    |s|	rd}t           | j        ||g}|r|                    d           |*|                    d           |                    |           |rC|                    d           |r|                    d           |	r|                    d           |r|d|gz  }|                    d	           |t          t	          j        |
                                           z  }|
 |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nosaverM   payloadreplacepartiallanguage	no_creater{   rr   s               r-   _add_documentzSearchCommands._add_document  s*   "  	i 	G&%8 	"KK!!!KK	"""KK    	(KK	""" 'I&&& (J''' 	+Z**DHY_fllnn5666'4'..#t#T**r/   c                     t           | j        ||g}|r|                    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_CMDrq   rs   rz   )r)   r   r   rM   r   r   rr   s          r-   _add_document_hashz!SearchCommands._add_document_hash,  sk     T_fe< 	#KK	""" 	+Z**D'4'..#t#T**r/   z2.0.0z2deprecated since redisearch 2.0, call hset instead)versionreasonr   r   rM   r   r   r   r   r   c	                 0     | 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   rM   r   r   r   r   r   )r   )
r)   r   r   rM   r   r   r   r   r   r{   s
             r-   add_documentzSearchCommands.add_document@  sK    V "t!

 
 
 
 	
r/   c                 6    |                      |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   rM   r   r   )r   )r)   r   rM   r   r   s        r-   add_document_hashz SearchCommands.add_document_hashx  s,      &&UXw ' 
 
 	
r/   c                 z    t           | j        |g}|r|                    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_CMDrq   rs   rz   )r)   r   r   delete_actual_documentrr   s        r-   delete_documentzSearchCommands.delete_document  sR     &1! 	KK'4'..#t#T**r/   c                     | j                             |          }d |                                D             }|}	 |d= n# t          $ r Y nw xY wt	          dd|i|S ).
        Load a single document by id
        c                 N    i | ]"\  }}t          |          t          |          #S rO   r   rP   kvs      r-   r[   z0SearchCommands.load_document.<locals>.<dictcomp>  *    DDDTQillIaLLDDDr/   idrO   r'   hgetallr   KeyErrorr   r)   r   r{   f2s       r-   load_documentzSearchCommands.load_document  s     $$R((DDV\\^^DDD	t 	 	 	D	 ((2((((s   A   
AAc                 4     | 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)   idss     r-   getzSearchCommands.get  s#     $t#HdoDDDDDr/   c                 x    |                      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   r.   r)   r+   s     r-   infozSearchCommands.info  s1     ""8T_==""8S111r/   query_paramsc                 4   |g S g }t          |          dk    r~|                    d           |                    t          |          dz             |                                D ]/\  }}|                    |           |                    |           0|S )Nr   paramsr	   )rT   rs   r   )r)   r   rr   keyvalues        r-   get_params_argszSearchCommands.get_params_args  s     I|q  KK!!!KKL))A-...*0022 # #
UC   E""""r/   c                 (   | j         g}t          |t                    rt          |          }t          |t                    st	          dt          |                     ||                                z  }||                     |          z  }||fS )NzBad query type )rq   rG   strr   
ValueErrortypeget_argsr   )r)   r8   r   rr   s       r-   _mk_query_argszSearchCommands._mk_query_args  s      eS!! 	!%LLE%'' 	><tE{{<<===   $$\222U{r/   r8   c                    |                      ||          \  }}t          j                    } | j        t          g|R  }t	          |t
                    r|S |                     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        @@r8   r9   r   timerz   
SEARCH_CMDrG   r   r.   r)   r8   r   rr   str+   s         r-   searchzSearchCommands.search  s      ))%l)KKeY[["d":5555c8$$ 	J""5DIKK"4D3N # 
 
 	
r/   c                 \    |                      ||          \  }} | 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   rz   EXPLAIN_CMD)r)   r8   r   rr   
query_texts        r-   explainzSearchCommands.explain  s<      ..u<.PPj#t#K7$7777r/   c                      t          d          )Nz#EXPLAINCLI will not be implemented.)NotImplementedError)r)   r8   s     r-   explain_clizSearchCommands.explain_cli
  s    !"GHHHr/   c                    t          |t                    r8t          |j                  }t          | j        g|                                z   }nLt          |t                    r'd}t          d| j        g|                                z   }nt          d|          || 
                    |          z  } | 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r8   rC   rG   r   boolrH   AGGREGATE_CMDrq   
build_argsr   
CURSOR_CMDr   r   rz   r.   r)   r8   r   rC   r*   raws         r-   	aggregatezSearchCommands.aggregate  s    " e-.. 	1em,,J $/2U5E5E5G5GGCCv&& 	1Jvt7%:J:J:L:LLCC[%000t##L111"d"C(""3e
 # 
 
 	
r/   r   rC   c                 (   |rCt          |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	   )rG   r   cidr   _with_schemar   )r)   r   r8   rC   cursorschemarowss          r-   rD   z$SearchCommands._get_aggregate_result-  s      	%(( (F	Aa&CCFe-.. 	53E 	VFqrr7DDFqrr7DtVV444r/   limitedc                 2   t          j                     }t          | j        dg}|r|                    d           |                    d           t	          |t
                    rd|d<   ||                                z  }nYt	          |t                    r5d|d<   ||                                z  }|| 	                    |          z  }nt          d           | 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_CMDrq   rs   rG   r   r   r   r   r   r   rz   r.   )r)   r8   r   r   r   r*   r+   s          r-   profilezSearchCommands.profileC  s   $ Y[[DOR0 	"JJy!!!

7e-.. 	V CF5##%%%CCu%% 	VCF5>>###C4''555CCTUUU"d"C(""ETY[[25E4O # 
 
 	
r/   c                    t           | j        |g}|r|                    d|g           |r|                    dd|g           |r|                    dd|g            | 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_CMDrq   extendrz   r.   r)   r8   distanceincludeexcluder*   r+   s          r-   
spellcheckzSearchCommands.spellcheckk  s     t6 	/JJ
H-... 	6JJG4555 	6JJG4555"d"C("">3777r/   nametermsc                 R    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  rz   r)   r  r  r*   s       r-   dict_addzSearchCommands.dict_add  0     T"

5#t#S))r/   c                 R    t           |g}|                    |            | j        | S )a  Deletes terms from a dictionary.

        ### Parameters

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

        For more information see `FT.DICTDEL <https://redis.io/commands/ft.dictdel>`_.
        )DICT_DEL_CMDr  rz   r  s       r-   dict_delzSearchCommands.dict_del  r  r/   c                 (    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_CMDrz   )r)   r  r*   s      r-   	dict_dumpzSearchCommands.dict_dump  s     d##t#S))r/   optionr   returnc                 8    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   s        r-   
config_setzSearchCommands.config_set  s+     5&%0"d"C(d{r/   c                 `    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   r.   r)   r  r*   r+   s       r-   
config_getzSearchCommands.config_get  s5     5&)"d"C("":s333r/   tagfieldc                 D    |                      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/  s     r-   tagvalszSearchCommands.tagvals  s     ##K(KKKr/   aliasc                 D    |                      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)   r3  s     r-   aliasaddzSearchCommands.aliasadd  s     ##M5$/JJJr/   c                 D    |                      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>`_.
        )rz   ALIAS_UPDATE_CMDrq   r6  s     r-   aliasupdatezSearchCommands.aliasupdate  s     ##$4eT_MMMr/   c                 8    |                      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_CMDr6  s     r-   aliasdelzSearchCommands.aliasdel  s     ##M5999r/   c                 j   |                      d          }|D ]}t          ||j        |j        g}|                    d          r|                    d           |j        r/|                    d           |                    |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stringrM   r   rs   r   rz   executer)   r   suggestionsr,   pipesugrr   s          r-   sugaddzSearchCommands.sugadd  s     }}}// 	( 	(C"CSY?Dzz+&& $F###{ )I&&&CK((( D $'''||~~b!!r/   r   c                 8    |                      t          |          S )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   s     r-   suglenzSearchCommands.suglen  s     ##NC888r/   rG  c                 :    |                      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   rG  s      r-   sugdelzSearchCommands.sugdel  s     ##NC@@@r/   
   prefixfuzzynumr<   with_payloadsc                    t           ||d|g}|r|                    t                     |r|                    t                     |r|                    t                      | j        | }g }	|s|	S t          |||          }
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                     g | ]}|S rO   rO   rP   ss     r-   rR   z)SearchCommands.sugget.<locals>.<listcomp>[      """a"""r/   SUGGET_COMMANDrs   r    r   r!   rz   r   )r)   r   rU  rV  rW  r<   rX  rr   r+   resultsparsers              r-   suggetzSearchCommands.sugget%  s    P VUC8 	KK 	$KK
### 	&KK%%%"d"D) 	N!+}cBB""6""""r/   groupidskipinitialc                     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)   re  rf  r  r*   s        r-   	synupdatezSearchCommands.synupdate]  sR    $ dow7 	,JJ)*+++

5#t#S))r/   c                 x    |                      t          | j                  }|                     t          |          S )a  
        Dumps the contents of a synonym group.

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

        For more information see `FT.SYNDUMP <https://redis.io/commands/ft.syndump>`_.
        )rz   SYNDUMP_CMDrq   r.   r   s     r-   syndumpzSearchCommands.syndumpu  s1     "";@@"";444r/   )rb   )	FFNNFNFFF)F)NFr   NFFNF)Nr   NF)Fr   NFFNF)r   NF)NFr1   )FNNNNFrT  FF)=__name__
__module____qualname____doc__r.   r6   rA   rE   rJ   rW   r\   ra   rf   r   r   r   r   r   r   r   r   r   floatr   r   r   r   r   r   r   r   r   rS   bytesr   r   r   r   r   r   r   r   rD   r  r  r  r  r  r(  r.  r2  r7  r:  r=  rM  rP  rS  r   rd  ri  rl  rO   r/   r-   r#   r#   ?   s?       D D D! ! !
 
 
V V V- - -# # #J> > >C C C> > > > !E+ E+ E+ E+N+tCy + + + +(P P$ P P P P$ (+ (+ (+ (+V DI+ + + +(  T   "&3
 3
3
 3
 	3

 3
 3
 3
 3-3
 3
 s)3
 3
 3
 3
j  T  
 
 
 
"+ + + +&) ) )
E 
E 
E	2 	2 	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 
8S%Z 
8 3c3o 667
8 
8 
8 
8IsEz!2 I I I I ;?
 
S%Z 
 3c3o 667
 
 
 
@55 %c52B&B C5QU5 5 5 52 DH	&
 &
S%!112&
 &
 tCsC)?$?@A	&
 &
 &
 &
P8 8 8 88*S *$s) * * * **S *$s) * * * *
*c 
* 
* 
* 
* S T    4 4 4 4 4 4L L L L LKc K K K KN N N N N
:c 
: 
: 
: 
:" " ".9# 9# 9 9 9 9A# As As A A A A !#6# 6#6# 6# 	6#
 6# 6# 6# 
	6# 6# 6# 6#p* * *4 *c * * * *0
5 
5 
5 
5 
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dS )AsyncSearchCommandsc                    K   |                      t          | j                   d{V }|                     t          |          S )r   Nr   r   s     r-   r   zAsyncSearchCommands.info  sG       ((4?CCCCCCCC""8S111r/   Nr8   r   c                 *  K   |                      ||          \  }}t          j                    } | j        t          g|R   d{V }t	          |t
                    r|S |                     t          ||t          j                    |z
  dz            S )r   r   Nr   r   r   r   s         r-   r   zAsyncSearchCommands.search  s        ))%l)KKeY[[(D(;d;;;;;;;;;c8$$ 	J""5DIKK"4D3N # 
 
 	
r/   c                   K   t          |t                    r8t          |j                  }t          | j        g|                                z   }nLt          |t                    r'd}t          d| j        g|                                z   }nt          d|          || 
                    |          z  } | j        |  d{V }|                     t          |||          S )r   Tr   r   Nr   r   r   s         r-   r   zAsyncSearchCommands.aggregate  s      " e-.. 	1em,,J $/2U5E5E5G5GGCCv&& 	1Jvt7%:J:J:L:LLCC[%000t##L111(D(#.......""3e
 # 
 
 	
r/   c                   K   t           | j        |g}|r|                    d|g           |r|                    dd|g           |r|                    dd|g            | j        |  d{V }|                     t           |          S )r  r  r  r  r	  Nr
  r  s          r-   r  zAsyncSearchCommands.spellcheck  s       t6 	/JJ
H-... 	6JJG4555 	6JJG4555(D(#......."">3777r/   r  r   r   c                 H   K   t           d||g} | j        |  d{V }|dk    S )r"  r#  Nr$  r%  r'  s        r-   r(  zAsyncSearchCommands.config_set  sA       5&%0(D(#.......d{r/   c                 t   K   t           d|g}i } | j        |  d{V }|                     t           |          S )r*  r+  Nr,  r-  s       r-   r.  zAsyncSearchCommands.config_get  sP       5&)(D(#......."":s333r/   c                    K   | j                             |           d{V }d |                                D             }|}	 |d= n# t          $ r Y nw xY wt	          dd|i|S )r   Nc                 N    i | ]"\  }}t          |          t          |          #S rO   r   r   s      r-   r[   z5AsyncSearchCommands.load_document.<locals>.<dictcomp>  r   r/   r   rO   r   r   s       r-   r   z!AsyncSearchCommands.load_document  s       {**2........DDV\\^^DDD	t 	 	 	D	 ((2((((s   A 
AAc                 z  K   |                      d          }|D ]}t          ||j        |j        g}|                    d          r|                    d           |j        r/|                    d           |                    |j                    |j        |  |                                 d{V 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?  rA  rB  r   NrC  rD  rI  s          r-   rM  zAsyncSearchCommands.sugadd  s       }}}// 	( 	(C"CSY?Dzz+&& $F###{ )I&&&CK((( D $'''llnn$$$$$$b))r/   FrT  r   rU  rV  rW  r<   rX  c                 ,  K   t           ||d|g}|r|                    t                     |r|                    t                     |r|                    t                      | j        |  d{V }g }	|s|	S t          |||          }
d |
D             S )rZ  r[  Nc                     g | ]}|S rO   rO   r]  s     r-   rR   z.AsyncSearchCommands.sugget.<locals>.<listcomp>]  r_  r/   r`  )r)   r   rU  rV  rW  r<   rX  rr   retrb  rc  s              r-   rd  zAsyncSearchCommands.sugget'  s      P VUC8 	KK 	$KK
### 	&KK%%%(D($/////// 	N!+}cBB""6""""r/   r1   rm  rn  )ro  rp  rq  r   r   r   r   r   rS   rs  r   r   r  r   r(  r.  r   rM  r   r   rd  rO   r/   r-   rv  rv    s       	2 	2 	2 ;?
 
S%Z 
 3c3o 667
 
 
 
< ;?
 
S%Z 
 3c3o 667
 
 
 
@8 8 8 88s 3 4    4s 4s 4 4 4 4) ) )* * *6 !#6# 6#6# 6# 	6#
 6# 6# 6# 
	6# 6# 6# 6# 6# 6#r/   rv  )Irw   r   typingr   r   r   r   redis.clientr   redis.utilsr   helpersr
   r   _utilr   aggregationr   r   r   documentr   r8   r   rI   r   rN   r   r   rp   r   r   r   r   DROP_CMDr   r   EXPLAINCLI_CMDr   r   r  r   r  r  r  r  GET_CMDr   r&  r1  r5  r9  r<  r   rF  rR  rO  ra  rh  rk  r   r   r   r   r   r   r   r   r   r    r!   r#   rv  rO   r/   r-   <module>r     s9        . . . . . . . . . . . . ! ! ! ! ! ! + + + + + + 9 9 9 9 9 9 9 9       B B B B B B B B B B                   ( ( ( ( ( (

	

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