
    PfT                        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:ZK G d; d<          ZL G 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                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Z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Zdee         fdZd^defdZ	 	 	 	 	 	 	 	 d_dZ	 d`dZ edd          	 	 	 	 	 	 	 dad 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          dbd)            Zdcd*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d0Z%	 ddd1e ee&f         d.e e!ee ee"ee#f         f         df         fd2Z'	 ddd1e ee&f         d.e!ee ee"ef         f         fd3Z(d1e ee&f         fd4Z)	 ddd1e ee&f         d.e!ee ee"ef         f         fd5Z*d6ed1e ee&e+f         d7efd8Z,	 	 ded1e ee&e+f         d9ed.ee!ee ee"ef         f                  fd:Z-dfd;Z.d<ed=ee         fd>Z/d<ed=ee         fd?Z0d<efd@Z1dAedBedCefdDZ2dAedCefdEZ3dFefdGZ4dHefdIZ5dHefdJZ6dHefdKZ7dL Z8dMedCe"fdNZ9dMedOedCe"fdPZ:	 	 	 	 dgdMedRedSedTe"dUedVedCee;         fdWZ<d^dXedYed=ee         fdZZ=d[ Z>dS )h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       P/var/www/html/env/lib/python3.11/site-packages/redis/commands/search/commands.py_parse_resultszSearchCommands._parse_resultsD   s<    ,,88J44/4SCCFCCC    c                 f    t          t          |          }t          t          ||                    S N)mapr   dictzip)r-   r/   r0   its       r1   _parse_infozSearchCommands._parse_infoJ   s'    C  CBKK   r3   c           	          t          ||d         j         |d         |d         j        |d         j        |d         j                  S )Nqueryduration)r=   has_payloadwith_scoresfield_encodings)r   _no_content_with_payloads_with_scores_return_fields_decode_asr-   r/   r0   s      r1   _parse_searchzSearchCommands._parse_searchN   sO    w++J'w6w4"7OD
 
 
 	
r3   c                 H    |                      ||d         |d                   S )Nr<   
has_cursor)_get_aggregate_resultrE   s      r1   _parse_aggregatezSearchCommands._parse_aggregateX   s#    ))#vg|@TUUUr3   c                    |d         }t          |t                    r#|                     |d         ||j                  }n0t	          |d         |j         |d         |j        |j                  }|t          |d                   fS )Nr<   r   r=   )r=   r>   r?   r   )	
isinstancer   rI   _cursorr   rA   rB   rC   r   )r-   r/   r0   r<   results        r1   _parse_profilezSearchCommands._parse_profile[   s    we-.. 		//Au}MMFFA%%
+!0!.  F }SV,,,,r3   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     r1   
<listcomp>z4SearchCommands._parse_spellcheck.<locals>.<listcomp>   s5     + + +@E%(%(;;+ + +r3   r   )rL   intlen)r-   r/   r0   corrections_corrections        r1   _parse_spellcheckz SearchCommands._parse_spellcheckj   s    !88 	 	K+s++ q0@0@;1$$q> q>!$ "+ +ITUV+ + +KA'' r3   c                 "    |rd |D             ni S )Nc                 ,    i | ]}|d          |d         S )r   r   rT   )rU   kvss     r1   
<dictcomp>z4SearchCommands._parse_config_get.<locals>.<dictcomp>   s"    ...3AA...r3   rT   rE   s      r1   _parse_config_getz SearchCommands._parse_config_get   s!    25=..#....2=r3   c                 X    fdt          dt                    d          D             S )Nc                 4    i | ]}|         |d z            S )r   rT   )rU   ir/   s     r1   r`   z1SearchCommands._parse_syndump.<locals>.<dictcomp>   s'    BBBqAAE
BBBr3   r   r
   )rangerY   rE   s    ` r1   _parse_syndumpzSearchCommands._parse_syndump   s/    BBBBE!SXXq,A,ABBBBr3   d   c                 0    |                      | |          S )zT
        Create a new batch indexer from the client with a given chunk size
        )
chunk_size)BatchIndexer)r-   ri   s     r1   batch_indexerzSearchCommands.batch_indexer   s       * ===r3   FNfieldsno_term_offsetsno_field_flags	stopwords
definitionno_highlightno_term_frequenciesskip_initial_scanc                    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  
        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              3   >   K   | ]}|                                 V  d S r5   
redis_argsrU   fs     r1   	<genexpr>z.SearchCommands.create_index.<locals>.<genexpr>   *      *J*Ja1<<>>*J*J*J*J*J*Jr3   )
CREATE_CMD
index_nameargsappendr   rL   rX   r   r   r   r   r   r!   listtuplesetr    rY   	itertoolschain	TypeErrorrx   execute_command)r-   rl   rm   rn   ro   rp   max_text_fields	temporaryrq   rr   rs   r   s               r1   create_indexzSearchCommands.create_index   s   N 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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>`_.
        ru   ADDc              3   >   K   | ]}|                                 V  d S r5   rw   ry   s     r1   r{   z2SearchCommands.alter_schema_add.<locals>.<genexpr>   r|   r3   )	ALTER_CMDr~   r   r   r   r   rx   r   )r-   rl   r   s      r1   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 )r   DROPINDEX_CMDr~   )r-   r   
delete_strs      r1   	dropindexzSearchCommands.dropindex   s,     .5TT2
##M4?JOOOr3         ?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_CMDr~   r   r   r   r   itemsr   )r-   doc_idconnnosaverR   payloadreplacepartiallanguage	no_createrl   r   s               r1   _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**r3   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_CMDr~   r   r   )r-   r   r   rR   r   r   r   s          r1   _add_document_hashz!SearchCommands._add_document_hash.  sk     T_fe< 	#KK	""" 	+Z**D'4'..#t#T**r3   z2.0.0z2deprecated since redisearch 2.0, call hset instead)versionreasonr   r   rR   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   rR   r   r   r   r   r   )r   )
r-   r   r   rR   r   r   r   r   r   rl   s
             r1   add_documentzSearchCommands.add_documentB  sK    V "t!

 
 
 
 	
r3   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   rR   r   r   )r   )r-   r   rR   r   r   s        r1   add_document_hashz SearchCommands.add_document_hashz  s,      &&UXw ' 
 
 	
r3   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_CMDr~   r   r   )r-   r   r   delete_actual_documentr   s        r1   delete_documentzSearchCommands.delete_document  sR     &1! 	KK'4'..#t#T**r3   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 rT   r   rU   kvs      r1   r`   z0SearchCommands.load_document.<locals>.<dictcomp>  *    DDDTQillIaLLDDDr3   idrT   r+   hgetallr   KeyErrorr   r-   r   rl   f2s       r1   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.

        )r   MGET_CMDr~   )r-   idss     r1   getzSearchCommands.get  s#     $t#HdoDDDDDr3   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>`_.
        r   INFO_CMDr~   r2   r-   r/   s     r1   infozSearchCommands.info  s1     ""8T_==""8S111r3   query_paramsc                 4   |g S g }t          |          dk    r~|                    d           |                    t          |          dz             |                                D ]/\  }}|                    |           |                    |           0|S )Nr   paramsr
   )rY   r   r   )r-   r   r   keyvalues        r1   get_params_argszSearchCommands.get_params_args  s     I|q  KK!!!KKL))A-...*0022 # #
UC   E""""r3   c                 (   | j         g}t          |t                    rt          |          }t          |t                    st	          dt          |                     ||                                z  }||                     |          z  }||fS )NzBad query type )r~   rL   strr   
ValueErrortypeget_argsr   )r-   r<   r   r   s       r1   _mk_query_argszSearchCommands._mk_query_args  s      eS!! 	!%LLE%'' 	><tE{{<<===   $$\222U{r3   r<   c                 d   |                      ||          \  }}t          j                    }i }t          | j                  dvr
d|t          <    | j        t          g|R i |}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   r(   T     @@r<   r=   
r   timer   r+   r   r   
SEARCH_CMDrL   r   r2   r-   r<   r   r   stoptionsr/   s          r1   searchzSearchCommands.search  s      ))%l)KKeY[[,,H<<$(GL!"d":@@@@@@c8$$ 	J""5DIKK"4D3N # 
 
 	
r3   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   r   EXPLAIN_CMD)r-   r<   r   r   
query_texts        r1   explainzSearchCommands.explain  s<      ..u<.PPj#t#K7$7777r3   c                      t          d          )Nz#EXPLAINCLI will not be implemented.)NotImplementedError)r-   r<   s     r1   explain_clizSearchCommands.explain_cli  s    !"GHHHr3   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r<   rH   rL   r   boolrM   AGGREGATE_CMDr~   
build_argsr   
CURSOR_CMDr   r   r   r2   r-   r<   r   rH   r.   raws         r1   	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
 # 
 
 	
r3   r   rH   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
   )rL   r   cidr   _with_schemar   )r-   r   r<   rH   cursorschemarowss          r1   rI   z$SearchCommands._get_aggregate_result4  s      	%(( (F	Aa&CCFe-.. 	53E 	VFqrr7DDFqrr7DtVV444r3   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_CMDr~   r   rL   r   r   r   r   r   r   r   r2   )r-   r<   r  r   r   r.   r/   s          r1   profilezSearchCommands.profileJ  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 # 
 
 	
r3   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_CMDr~   extendr   r2   r-   r<   distanceincludeexcluder.   r/   s          r1   
spellcheckzSearchCommands.spellcheckr  s     t6 	/JJ
H-... 	6JJG4555 	6JJG4555"d"C("">3777r3   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  r   r-   r  r  r.   s       r1   dict_addzSearchCommands.dict_add  0     T"

5#t#S))r3   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  r   r  s       r1   dict_delzSearchCommands.dict_del  r  r3   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_CMDr   )r-   r  r.   s      r1   	dict_dumpzSearchCommands.dict_dump  s     d##t#S))r3   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_CMDr   r-   r%  r   r.   r   s        r1   
config_setzSearchCommands.config_set  s+     5&%0"d"C(d{r3   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,  r   r2   r-   r%  r.   r/   s       r1   
config_getzSearchCommands.config_get  s5     5&)"d"C("":s333r3   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>`_.
        )r   TAGVALS_CMDr~   )r-   r5  s     r1   tagvalszSearchCommands.tagvals  s     ##K(KKKr3   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>`_.
        )r   ALIAS_ADD_CMDr~   r-   r9  s     r1   aliasaddzSearchCommands.aliasadd  s     ##M5$/JJJr3   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>`_.
        )r   ALIAS_UPDATE_CMDr~   r<  s     r1   aliasupdatezSearchCommands.aliasupdate  s     ##$4eT_MMMr3   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>`_.
        )r   ALIAS_DEL_CMDr<  s     r1   aliasdelzSearchCommands.aliasdel  s     ##M5999r3   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stringrR   r   r   r   r   executer-   r   suggestionsr0   pipesugr   s          r1   sugaddzSearchCommands.sugadd  s     }}}// 	( 	(C"CSY?Dzz+&& $F###{ )I&&&CK((( D $'''||~~b!!r3   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>`_.
        )r   SUGLEN_COMMAND)r-   r   s     r1   suglenzSearchCommands.suglen  s     ##NC888r3   rM  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>`_.
        )r   SUGDEL_COMMAND)r-   r   rM  s      r1   sugdelzSearchCommands.sugdel#  s     ##NC@@@r3   
   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 rT   rT   rU   ss     r1   rW   z)SearchCommands.sugget.<locals>.<listcomp>b      """a"""r3   SUGGET_COMMANDr   r#   r"   r$   r   r   )r-   r   r[  r\  r]  r?   r^  r   r/   resultsparsers              r1   suggetzSearchCommands.sugget,  s    P VUC8 	KK 	$KK
### 	&KK%%%"d"D) 	N!+}cBB""6""""r3   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_CMDr~   r  r   )r-   rk  rl  r  r.   s        r1   	synupdatezSearchCommands.synupdated  sR    $ dow7 	,JJ)*+++

5#t#S))r3   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>`_.
        )r   SYNDUMP_CMDr~   r2   r   s     r1   syndumpzSearchCommands.syndump|  s1     "";@@"";444r3   )rg   )	FFNNFNFFF)F)NFr   NFFNF)Nr   NF)Fr   NFFNF)r   NF)NFr5   )FNNNNFrZ  FF)?__name__
__module____qualname____doc__r2   r:   rF   rJ   rO   r\   ra   rf   rk   r   r   r   r   r   r   r   r   r   r   r   r	   floatr   r   r   r   r   r   r   r   rX   bytesr   r   r   r   r   r   r   r   rI   r	  r  r  r!  r$  r.  r4  r8  r=  r@  rC  rS  rV  rY  r   rj  ro  rr  rT   r3   r1   r&   r&   A   s       D D D! ! !
 
 
V V V- - -# # #J> > >C C C> > > > !&$)-04"$)"'D+ D+UD+ D+ 	D+
 DI&D+ _-D+ D+ "D+  D+ D+ D+ D+L+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
 
 
 
F ;?
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 
5r3   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     r1   r   zAsyncSearchCommands.info  sG       ((4?CCCCCCCC""8S111r3   Nr<   r   c                 t  K   |                      ||          \  }}t          j                    }i }t          | j                  dvr
d|t          <    | j        t          g|R i | d{V }t          |t                    r|S | 	                    t          ||t          j                    |z
  dz            S )r   r   r(   TNr   r   r   r   s          r1   r   zAsyncSearchCommands.search  s        ))%l)KKeY[[,,H<<$(GL!(D(FdFFFgFFFFFFFFc8$$ 	J""5DIKK"4D3N # 
 
 	
r3   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         r1   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
 # 
 
 	
r3   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          r1   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7r3   r%  r   r&  c                 H   K   t           d||g} | j        |  d{V }|dk    S )r(  r)  Nr*  r+  r-  s        r1   r.  zAsyncSearchCommands.config_set  sA       5&%0(D(#.......d{r3   c                 t   K   t           d|g}i } | j        |  d{V }|                     t           |          S )r0  r1  Nr2  r3  s       r1   r4  zAsyncSearchCommands.config_get  sP       5&)(D(#......."":s333r3   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 rT   r   r   s      r1   r`   z5AsyncSearchCommands.load_document.<locals>.<dictcomp>  r   r3   r   rT   r   r   s       r1   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>`_.
        FrE  rG  rH  r   NrI  rJ  rO  s          r1   rS  zAsyncSearchCommands.sugadd  s       }}}// 	( 	(C"CSY?Dzz+&& $F###{ )I&&&CK((( D $'''llnn$$$$$$b))r3   FrZ  r   r[  r\  r]  r?   r^  c                 ,  K   t           ||d|g}|r|                    t                     |r|                    t                     |r|                    t                      | j        |  d{V }g }	|s|	S t          |||          }
d |
D             S )r`  ra  Nc                     g | ]}|S rT   rT   rc  s     r1   rW   z.AsyncSearchCommands.sugget.<locals>.<listcomp>i  re  r3   rf  )r-   r   r[  r\  r]  r?   r^  r   retrh  ri  s              r1   rj  zAsyncSearchCommands.sugget3  s      P VUC8 	KK 	$KK
### 	&KK%%%(D($/////// 	N!+}cBB""6""""r3   r5   rs  rt  )ru  rv  rw  r   r   r   r   r   rX   ry  r   r   r  r   r.  r4  r   rS  r   r   rj  rT   r3   r1   r|  r|    s       	2 	2 	2 ;?
 
S%Z 
 3c3o 667
 
 
 
F ;?
 
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#r3   r|  )Nr   r   typingr   r   r   r   redis.clientr   r   redis.utilsr	   helpersr   r   _utilr   aggregationr   r   r   documentr   fieldr   indexDefinitionr   r<   r   rN   r   rS   r   r   r}   r   r   r   r   DROP_CMDr   r   EXPLAINCLI_CMDr   r   r  r   r  r  r   r#  GET_CMDr   r,  r7  r;  r?  rB  r   rL  rX  rU  rg  rn  rq  r   r   r   r   r   r   r    r!   r"   r#   r$   r&   r|  rT   r3   r1   <module>r     sc        . . . . . . . . . . . . / / / / / / / / + + + + + + 9 9 9 9 9 9 9 9       B B B B B B B B B B             , , , , , ,             ( ( ( ( ( (

	

 

 

# 	
		#
E5 E5 E5 E5 E5 E5 E5 E5P`# `# `# `# `#. `# `# `# `# `#r3   