
    j,g5                        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      ZMy)?    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dXd
Z	 	 	 	 	 	 	 	 	 dYd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dZdefdZ	 	 	 	 	 	 	 	 d[dZ	 d\dZ edd      	 	 	 	 	 	 	 d]d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d0Z(d.e ee&f   fd1Z)	 d`d.e ee&f   d+e!ee ee"ef   f   fd2Z*d3ed.e ee&e+f   d4efd5Z,	 	 dad.e ee&e+f   d6ed+ee!ee ee"ef   f      fd7Z-dbd8Z.d9ed:ee   fd;Z/d9ed:ee   fd<Z0d9efd=Z1d>ed?ed@efdAZ2d>ed@efdBZ3dCefdDZ4dEefdFZ5dEefdGZ6dEefdHZ7dI Z8dJed@e"fdKZ9dJedLed@e"fdMZ:	 	 	 	 dcdJedNedOedPe"dQedRed@ee;   fdSZ<dZdTedUed:ee   fdVZ=dW Z>y)d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       x/var/www/trellinator.diamondhoofcare.com/public_html/venv/lib/python3.12/site-packages/redis/commands/search/commands.py_parse_resultszSearchCommands._parse_resultsD   s5    ,8J44//4SCFCC    c                 L    t        t        |      }t        t        ||            S N)mapr   dictzip)r,   r.   r/   its       r0   _parse_infozSearchCommands._parse_infoJ   s    C CBK  r2   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.   r/   s      r0   _parse_searchzSearchCommands._parse_searchN   sQ    w+++J'w66w44"7ODD
 	
r2   c                 4    | j                  ||d   |d         S )Nr;   
has_cursor)_get_aggregate_resultrD   s      r0   _parse_aggregatezSearchCommands._parse_aggregateX   s     ))#vg|@TUUr2   c                     |d   }t        |t              r!| j                  |d   ||j                        }n5t	        |d   |j
                   |d   |j                  |j                        }|t        |d         fS )Nr;   r   r<   )r<   r=   r>   r   )	
isinstancer   rH   _cursorr   r@   rA   rB   r   )r,   r.   r/   r;   results        r0   _parse_profilezSearchCommands._parse_profile[   s    we-.//Au}}MFA%%%
+!00!..F }SV,,,r2   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)rK   intlen)r,   r.   r/   corrections_correction_items         r0   _parse_spellcheckz SearchCommands._parse_spellcheckj   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       r0   _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   )rangerS   )r,   r.   r/   is       r0   _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,   ra   s     r0   batch_indexerzSearchCommands.batch_indexer   s       * ==r2   Nfieldsno_term_offsetsno_field_flags	stopwords
definitionno_highlightno_term_frequenciesskip_initial_scanc                 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  
        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.

        r   SCHEMAc              3   <   K   | ]  }|j                           y wr4   
redis_args.0fs     r0   	<genexpr>z.SearchCommands.create_index.<locals>.<genexpr>        *Ja1<<>*J   )
CREATE_CMD
index_nameargsappendr   rK   rR   r   r   r   r   r   r    listtuplesetr   rS   	itertoolschain	TypeErrorrp   execute_command)r,   rd   re   rf   rg   rh   max_text_fields	temporaryri   rj   rk   ry   s               r0   create_indexzSearchCommands.create_index   sS   N 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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>`_.
        rm   ADDc              3   <   K   | ]  }|j                           y wr4   ro   rq   s     r0   rt   z2SearchCommands.alter_schema_add.<locals>.<genexpr>   ru   rv   )	ALTER_CMDrx   r{   r~   r   r   rp   r   )r,   rd   ry   s      r0   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 )r   DROPINDEX_CMDrx   )r,   r   
delete_strs      r0   	dropindexzSearchCommands.dropindex   s&     .T2
##M4??JOOr2   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_CMDrx   rz   r{   r~   r   itemsr   )r,   doc_idconnnosaverP   payloadreplacepartiallanguage	no_createrd   ry   s               r0   _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**r2   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_CMDrx   rz   r   )r,   r   r   rP   r   r   ry   s          r0   _add_document_hashz!SearchCommands._add_document_hash.  sc     T__fe<KK	"Z**D'4''..#t##T**r2   z2.0.0z2deprecated since redisearch 2.0, call hset instead)versionreasonr   r   rP   r   r   r   r   r   c	                 :     | j                   |fd|||||||d|	S )a  
        Add a single document to the index.

        Args:

            doc_id: the id of the saved document.
            nosave: if set to true, we just index the document, and don't
                      save a copy of it. This means that searches will just
                      return ids.
            score: the document ranking, between 0.0 and 1.0
            payload: optional inner-index payload we can save for fast
                     access in scoring functions
            replace: if True, and the document already is in the index,
                     we perform an update and reindex the document
            partial: if True, the fields specified will be added to the
                       existing document.
                       This has the added benefit that any fields specified
                       with `no_index`
                       will not be reindexed again. Implies `replace`
            language: Specify the language used for document tokenization.
            no_create: if True, the document is only updated and reindexed
                         if it already exists.
                         If the document does not exist, an error will be
                         returned. Implies `replace`
            fields: kwargs dictionary of the document fields to be saved
                    and/or indexed.
                    NOTE: Geo points shoule be encoded as strings of "lon,lat"
        N)r   r   rP   r   r   r   r   r   )r   )
r,   r   r   rP   r   r   r   r   r   rd   s
             r0   add_documentzSearchCommands.add_documentB  sD    V "t!!

 
 	
r2   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   rP   r   r   )r   )r,   r   rP   r   r   s        r0   add_document_hashz SearchCommands.add_document_hashz  s'      &&UXw ' 
 	
r2   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_CMDrx   rz   r   )r,   r   r   delete_actual_documentry   s        r0   delete_documentzSearchCommands.delete_document  sO     &1!KK'4''..#t##T**r2   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
        idrY   r*   hgetallr   r   KeyErrorr   r,   r   rd   kvf2s         r0   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.

        )r   MGET_CMDrx   )r,   idss     r0   getzSearchCommands.get  s"     $t##HdooDDDr2   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>`_.
        r   INFO_CMDrx   r1   r,   r.   s     r0   infozSearchCommands.info  s-     ""8T__=""8S11r2   query_paramsc                     |g S g }t        |      dkD  rh|j                  d       |j                  t        |      dz         |j                         D ]'  \  }}|j                  |       |j                  |       ) |S )Nr   paramsr
   )rS   rz   r   )r,   r   ry   keyvalues        r0   get_params_argszSearchCommands.get_params_args  s~     I|q KK!KKL)A-.*002 #
UC E"# r2   c                     | j                   g}t        |t              rt        |      }t        |t              st	        dt        |             ||j                         z  }|| j                  |      z  }||fS )NzBad query type )rx   rK   strr   
ValueErrortypeget_argsr   )r,   r;   r   ry   s       r0   _mk_query_argszSearchCommands._mk_query_args  ss      eS!%LE%'tE{m<==  $$\22U{r2   r;   c                 T   | j                  ||      \  }}t        j                         }i }t        | j                        dvr	d|t        <    | j
                  t        g|i |}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   r'   T     @@r;   r<   
r   timer   r*   r   r   
SEARCH_CMDrK   r   r1   r,   r;   r   ry   stoptionsr.   s          r0   searchzSearchCommands.search  s      ))%l)KeYY[,H<$(GL!"d"":@@@c8$J""5DIIK"4D3N # 
 	
r2   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   r   EXPLAIN_CMD)r,   r;   r   ry   
query_texts        r0   explainzSearchCommands.explain  s6      ..u<.Pj#t##K7$77r2   c                     t        d      )Nz#EXPLAINCLI will not be implemented.)NotImplementedError)r,   r;   s     r0   explain_clizSearchCommands.explain_cli  s    !"GHHr2   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r;   rG   rK   r   boolrL   AGGREGATE_CMDrx   
build_argsr   
CURSOR_CMDr   r   r   r1   r,   r;   r   rG   r-   raws         r0   	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
 # 
 	
r2   r   rG   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
   )rK   r   cidr   _with_schemar   )r,   r   r;   rG   cursorschemarowss          r0   rH   z$SearchCommands._get_aggregate_result4  s     %(F	Aa&CFe-.53E3EVFqr7DFqr7DtVV44r2   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_CMDrx   rz   rK   r   r   r   r   r   r   r   r1   )r,   r;   r   r   r   r-   r.   s          r0   profilezSearchCommands.profileJ  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 # 
 	
r2   c                     t         | j                  |g}|r|j                  d|g       |r|j                  dd|g       |r|j                  dd|g        | j                  | }| j	                  t         |      S )a  
        Issue a spellcheck query

        Args:

            query: search query.
            distance: the maximal Levenshtein distance for spelling
                       suggestions (default: 1, max: 4).
            include: specifies an inclusion custom dictionary.
            exclude: specifies an exclusion custom dictionary.

        For more information see `FT.SPELLCHECK <https://redis.io/commands/ft.spellcheck>`_.
        DISTANCETERMSINCLUDEEXCLUDESPELLCHECK_CMDrx   extendr   r1   r,   r;   distanceincludeexcluder-   r.   s          r0   
spellcheckzSearchCommands.spellcheckr  sy     t6JJ
H-.JJG45JJG45"d""C("">377r2   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  r   r,   r  r  r-   s       r0   dict_addzSearchCommands.dict_add  -     T"

5#t##S))r2   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  r   r  s       r0   dict_delzSearchCommands.dict_del  r  r2   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_CMDr   )r,   r  r-   s      r0   	dict_dumpzSearchCommands.dict_dump  s!     d##t##S))r2   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_CMDr   r,   r  r   r-   r   s        r0   
config_setzSearchCommands.config_set  s.     5&%0"d""C(d{r2   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!  r   r1   r,   r  r-   r.   s       r0   
config_getzSearchCommands.config_get  s5     5&)"d""C("":s33r2   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>`_.
        )r   TAGVALS_CMDrx   )r,   r*  s     r0   tagvalszSearchCommands.tagvals  s     ##K(KKr2   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>`_.
        )r   ALIAS_ADD_CMDrx   r,   r.  s     r0   aliasaddzSearchCommands.aliasadd  s     ##M5$//JJr2   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>`_.
        )r   ALIAS_UPDATE_CMDrx   r1  s     r0   aliasupdatezSearchCommands.aliasupdate  s     ##$4eT__MMr2   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>`_.
        )r   ALIAS_DEL_CMDr1  s     r0   aliasdelzSearchCommands.aliasdel  s     ##M599r2   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stringrP   r   rz   r   r   executer,   r   suggestionsr/   pipesugry   s          r0   sugaddzSearchCommands.sugadd  s     }}}/ 	(C"CSYY?Dzz+&F#{{I&CKK( D  $'	( ||~b!!r2   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>`_.
        )r   SUGLEN_COMMAND)r,   r   s     r0   suglenzSearchCommands.suglen  s     ##NC88r2   rB  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>`_.
        )r   SUGDEL_COMMAND)r,   r   rB  s      r0   sugdelzSearchCommands.sugdel#  s     ##NC@@r2   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_COMMANDrz   r"   r!   r#   r   r   )r,   r   rO  rP  rQ  r>   rR  ry   r.   resultsparserss               r0   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_CMDrx   r  r   )r,   r\  r]  r  r-   s        r0   	synupdatezSearchCommands.synupdated  sF    $ doow7JJ)*+

5#t##S))r2   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>`_.
        )r   SYNDUMP_CMDrx   r1   r   s     r0   syndumpzSearchCommands.syndump|  s-     "";@"";44r2   )d   )	FFNNFNFFF)F)NF      ?NFFNF)Nre  NF)Fre  NFFNF)re  NF)NFr4   )FNNNNF
   FF)?__name__
__module____qualname____doc__r1   r9   rE   rI   rN   rW   r[   r_   rc   r   r   r   r   r   r   r   r   r   r   r   r	   floatr   r   r   r   r   r   r   r   rR   bytesr   r   r   r   r   r   r   r   rH   r   r  r  r  r  r#  r)  r-  r2  r5  r8  rH  rK  rN  r   r[  r`  rc  rY   r2   r0   r%   r%   A   s   D!
V-#J>C> !&$)-04"$)"'D+UD+ D+ 	D+
 DI&D+ _-D+ D+ "D+  D+L+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
F ;?
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
5r2   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     r0   r   zAsyncSearchCommands.info  s:      ((4??CC""8S11 Ds   $AAANr;   r   c                 p  K   | j                  ||      \  }}t        j                         }i }t        | j                        dvr	d|t        <    | j
                  t        g|i | d{   }t        |t              r|S | j                  t        ||t        j                         |z
  dz        S 7 Gw)r   r   r'   TNr   r   r   r   s          r0   r   zAsyncSearchCommands.search  s       ))%l)KeYY[,H<$(GL!(D((FdFgFFc8$J""5DIIK"4D3N # 
 	
 Gs   A*B6,B4-AB6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         r0   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)a  
        Issue a spellcheck query

        ### Parameters

        **query**: search query.
        **distance***: the maximal Levenshtein distance for spelling
                       suggestions (default: 1, max: 4).
        **include**: specifies an inclusion custom dictionary.
        **exclude**: specifies an exclusion custom dictionary.

        For more information see `FT.SPELLCHECK <https://redis.io/commands/ft.spellcheck>`_.
        r  r  r  r  Nr  r  s          r0   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        r0   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       r0   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   rY   r   r   s         r0   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>`_.
        Fr:  r<  r=  r   Nr>  r?  rD  s          r0   rH  zAsyncSearchCommands.sugadd  s      }}}/ 	(C"CSYY?Dzz+&F#{{I&CKK( D  $'	( lln$b))$s   B4C 6B>7C r   rO  rP  rQ  r>   rR  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)rT  rU  NrV  )r,   r   rO  rP  rQ  r>   rR  ry   retrX  rY  rZ  s               r0   r[  zAsyncSearchCommands.sugget3  s     P VUC8KKKK
#KK%(D(($//N!+}cB!"a"" 0 #s$   A#B%B&B	B
BBr4   rf  rg  )ri  rj  rk  r   r   r   r   r   rR   rm  r   r   r  r   r#  r)  r   rH  r   r   r[  rY   r2   r0   rp  rp    s   	2 ;?
S%Z 
 3c3o 667
F ;?
S%Z 
 3c3o 667
@88s 3 4 4s 4s 4)*6 !#6#6# 6# 	6#
 6# 6# 6# 
	6#r2   rp  )Nr~   r   typingr   r   r   r   redis.clientr   r   redis.utilsr	   helpersr   r   _utilr   aggregationr   r   r   documentr   fieldr   indexDefinitionr   r;   r   rM   r   rQ   r   r   rw   r   r   r   r   DROP_CMDr   r   EXPLAINCLI_CMDr   r   r   r   r  r  r  r  GET_CMDr   r!  r,  r0  r4  r7  r   rA  rM  rJ  rW  r_  rb  r   r   r   r   r   r   r   r    r!   r"   r#   r%   rp  rY   r2   r0   <module>r     s(     . . / + 9  B B   ,   (

	

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