
    ,i۫                        d dl Z d dlZd dlmZmZmZmZmZ d dlm	Z	 d dl
mZm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 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
dl+m,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@d(ZAd)ZBd*ZCd+ZDd,ZEd-ZFd.ZGd/ZHd0ZId1ZJd2ZKd3ZLd4ZMd5ZNd6ZOd7ZPd8ZQd9ZRd:ZSd;ZTd<ZUd=ZV G d> d?      ZW G d@ dAeW      ZXy)B    N)AnyDictListOptionalUnion)pairs_to_dict)NEVER_DECODEPipeline)CombineResultsMethodHybridCursorQueryHybridPostProcessingConfigHybridQuery)HybridCursorResultHybridResult)deprecated_function   )get_protocol_version   )	to_string)AggregateRequestAggregateResultCursor)Document)Field)IndexDefinition)ProfileInformation)Query)Result)SuggestionParserNUMERICz	FT.CREATEzFT.ALTERz	FT.SEARCHzFT.ADDz
FT.ADDHASHzFT.DROPINDEXz
FT.EXPLAINzFT.EXPLAINCLIzFT.DELzFT.AGGREGATE
FT.PROFILEz	FT.CURSORzFT.SPELLCHECKz
FT.DICTADDz
FT.DICTDELzFT.DICTDUMPz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.SYNDUMPz	FT.HYBRID	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
 ZdcdZ	 	 	 	 	 	 	 	 	 ddd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ee   f   fdZdedefdZ	 	 	 	 	 	 	 	 dfdZ	 dgdZ edd      	 	 	 	 	 	 	 dhdeded ed!ee   d"ed#ed$ee   d%edee   fd&       Z edd      did'       Z edd(      djd)       Zd* Z edd(      d+        Z d, Z!d-ee"eeee#ee$f   f      fd.Z%d-ee"eeee#ee$f   f      fd/Z&	 dkd0eee'f   d-ee"eeee#ee$f   f   df   fd1Z(	 	 	 	 	 dld0e)d2ee*   d3ee+   d4ee"eeee#ee$f   f      d5ee#   d6ee,   d7ee-e.e/f   fd8Z0	 dkd0eee'f   d-ee"eeee#ee$f   f      fd9Z1d0eee'f   fd:Z2	 dkd0ee3e4f   d-ee"eeee#ee$f   f      fd;Z5d<ed0ee3e4f   d=efd>Z6	 	 dmd0ee'e3f   d?ed-ee"eeee#ee$f   f      fd@Z7dndAZ8dBedCee   fdDZ9dBedCee   fdEZ:dBefdFZ; edGdH      dIedJed7efdK       Z< edGdL      dIed7efdM       Z=dNefdOZ>dPefdQZ?dPefdRZ@dPefdSZAdT ZBdUed7e#fdVZCdUedWed7e#fdXZD	 	 	 	 dodUedYedZed[e#d\ed]ed7eeE   fd^ZFded_ed`edCee   fdaZGdb ZHy)pSearchCommandszSearch commands.c                     t        | j                        dv r|dk(  rt        |      S |S  | j                  |   |fi |S )N3   r!   )r   clientr   _RESP2_MODULE_CALLBACKS)selfcmdreskwargss       c/var/www/html/langgraph-service/venv/lib/python3.12/site-packages/redis/commands/search/commands.py_parse_resultszSearchCommands._parse_resultsP   sH    ,8.1\.A%c*JsJ44//4SCFCC    c                 L    t        t        |      }t        t        ||            S N)mapr   dictzip)r5   r7   r8   its       r9   _parse_infozSearchCommands._parse_infoV   s    C CBK  r;   c           	          t        ||d   j                   |d   |d   j                  |d   j                  |d   j                        S )Nqueryduration)rE   has_payloadwith_scoresfield_encodings)r   _no_content_with_payloads_with_scores_return_fields_decode_asr5   r7   r8   s      r9   _parse_searchzSearchCommands._parse_searchZ   sQ    w+++J'w66w44"7ODD
 	
r;   c           	         t        |d      }d|v r%t        t        |d         t        |d               S g }|d   D ]   }t        |d      }|j                  |       " t	        t        |d         ||d	   t        |d
               S )NT)decode_keyscursorSEARCHVSIM)search_cursor_idvsim_cursor_idresultstotal_resultswarningsexecution_time)rW   rV   rX   rY   )r   r   intappendr   float)r5   r7   r8   res_dictrV   res_item	item_dicts          r9   _parse_hybrid_searchz#SearchCommands._parse_hybrid_searchd   s     $7v%!$Xh%7!8"8F#34 
 )+ !+ 	&H%hDAINN9%	& h78j) *:!;<	
 	
r;   c                 4    | j                  ||d   |d         S )NrD   
has_cursor)_get_aggregate_resultrM   s      r9   _parse_aggregatezSearchCommands._parse_aggregatez   s     ))#vg|@TUUr;   c                     |d   }t        |t              r!| j                  |d   ||j                        }n5t	        |d   |j
                   |d   |j                  |j                        }|t        |d         fS )NrD   r   rE   )rE   rF   rG   r   )	
isinstancer   rc   _cursorr   rI   rJ   rK   r   )r5   r7   r8   rD   results        r9   _parse_profilezSearchCommands._parse_profile}   s    we-.//Au}}MFA%%%
+!00!..F )#a&111r;   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   r2   r   r   )score
suggestion)rf   rZ   len)r5   r7   r8   corrections_correction_items         r9   _parse_spellcheckz SearchCommands._parse_spellcheck   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    )r5   r7   r8   kvss       r9   _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   )rangerm   )r5   r7   r8   is       r9   _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)r5   r{   s     r9   batch_indexerzSearchCommands.batch_indexer   s       * ==r;   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r=   
redis_args.0fs     r9   	<genexpr>z.SearchCommands.create_index.<locals>.<genexpr>        *Ja1<<>*J   )
CREATE_CMD
index_nameargsr[   r&   rf   rZ   r'   r"   r$   r#   r%   r)   listtuplesetr(   rm   	itertoolschain	TypeErrorr   execute_command)r5   r~   r   r   r   r   max_text_fields	temporaryr   r   r   r   s               r9   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>`_.
        r   ADDc              3   <   K   | ]  }|j                           y wr=   r   r   s     r9   r   z2SearchCommands.alter_schema_add.<locals>.<genexpr>  r   r   )	ALTER_CMDr   r   r   r   r   r   r   )r5   r~   r   s      r9   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                     t         | j                  g}t        |t              r|du rdnd}|r|j	                  |        | 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>`_.
        TDD )DROPINDEX_CMDr   rf   boolr[   r   )r5   r   r   
delete_strs       r9   	dropindexzSearchCommands.dropindex  sX     t/ *D16F$6N  	 KK
##t##T**r;   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_CMDr   r[   r   r   r   itemsr   )r5   doc_idconnnosaverk   payloadreplacepartiallanguage	no_creater~   r   s               r9   _add_documentzSearchCommands._add_document0  s    " iG&%8KK!KK	"KK KK	"I&J'Z**DHY__flln566'4''..#t##T**r;   c                     t         | j                  ||g}|r|j                  d       |r|d|gz  }| |j                  | S  | j                  | S )zX
        Internal add_document_hash used for both batch and single doc indexing
        r   r   )ADDHASH_CMDr   r[   r   )r5   r   r   rk   r   r   r   s          r9   _add_document_hashz!SearchCommands._add_document_hashZ  sc     T__fe<KK	"Z**D'4''..#t##T**r;   z2.0.0z2deprecated since redisearch 2.0, call hset insteadversionreasonr   r   rk   r   r   r   r   r   c	                 :     | j                   |fd|||||||d|	S )a  
        Add a single document to the index.

        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   rk   r   r   r   r   r   )r   )
r5   r   r   rk   r   r   r   r   r   r~   s
             r9   add_documentzSearchCommands.add_documentn  sD    V "t!!

 
 	
r;   c                 .    | j                  |d|||      S )a  
        Add a hash document to the index.

        ### Parameters

        - **doc_id**: the document's id. This has to be an existing HASH key
                      in Redis that will hold the fields the index needs.
        - **score**:  the document ranking, between 0.0 and 1.0
        - **replace**: if True, and the document already is in the index, we
                      perform an update and reindex the document
        - **language**: Specify the language used for document tokenization.
        N)r   rk   r   r   )r   )r5   r   rk   r   r   s        r9   add_document_hashz SearchCommands.add_document_hash  s'      &&UXw ' 
 	
r;   zdeprecated since redisearch 2.0c                     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_CMDr   r[   r   )r5   r   r   delete_actual_documentr   s        r9   delete_documentzSearchCommands.delete_document  sO     &1!KK'4''..#t##T**r;   c                     | j                   j                  |      }|j                         D ci c]  \  }}t        |      t        |       }}}|}	 |d= t        dd|i|S c c}}w # t        $ r Y w xY w).
        Load a single document by id
        idrs   r3   hgetallr   r   KeyErrorr   r5   r   r~   kvf2s         r9   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_CMDr   )r5   idss     r9   getzSearchCommands.get  s"     $t##HdooDDDr;   c                 n    | j                  t        | j                        }| j                  t        |      S )
        Get info an stats about the the current index, including the number of
        documents, memory consumption, etc

        For more information see `FT.INFO <https://redis.io/commands/ft.info>`_.
        r   INFO_CMDr   r:   r5   r7   s     r9   infozSearchCommands.info  s-     ""8T__=""8S11r;   query_paramsc                     |g S g }t        |      dkD  rh|j                  d       |j                  t        |      dz         |j                         D ]'  \  }}|j                  |       |j                  |       ) |S )Nr   PARAMSr   )rm   r[   r   )r5   r   r   keyvalues        r9   get_params_argszSearchCommands.get_params_args  s~     I|q KK!KKL)A-.*002 #
UC E"# r;   c                     | j                   g}t        |t              rt        |      }t        |t              st	        dt        |             ||j                         z  }|| j                  |      z  }||fS )NzBad query type )r   rf   strr   
ValueErrortypeget_argsr   )r5   rD   r   r   s       r9   _mk_query_argszSearchCommands._mk_query_args  ss      eS!%LE%'tE{m<==  $$\22U{r;   rD   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   r0   T     @@rD   rE   r   time	monotonicr   r3   r	   r   
SEARCH_CMDrf   r
   r:   r5   rD   r   r   stoptionsr7   s          r9   searchzSearchCommands.search  s      ))%l)Ke^^,H<$(GL!"d"":@@@c8$J""5DNN4Dr4IV3S # 
 	
r;   combine_methodpost_processingparams_substitutiontimeoutrQ   returnc                 b   | j                   }i }t        |g}	|	j                  |j                                |r|	j                  |j                                |r|	j                  |j	                                |r |	j                  | j                  |             |r|	j                  d|f       |r$d|d<   |	j                  |j	                                t        | j                        dvr	d|t        <    | j                  |	i |}
t        |
t              r|
S  | j                  t        |
fi |S )M  
        Execute a hybrid search using both text and vector queries

        Args:
            - **query**: HybridQuery object
                        Contains the text and vector queries
            - **combine_method**: CombineResultsMethod object
                        Contains the combine method and parameters
            - **post_processing**: HybridPostProcessingConfig object
                        Contains the post processing configuration
            - **params_substitution**: Dict[str, Union[str, int, float, bytes]]
                        Contains the parameters substitution
            - **timeout**: int - contains the timeout in milliseconds
            - **cursor**: HybridCursorQuery object - contains the cursor configuration


        For more information see `FT.SEARCH <https://redis.io/commands/ft.hybrid>`.
        TIMEOUTTrQ   r0   r   
HYBRID_CMDextendr   
build_argsr   r   r3   r	   r   rf   r
   r:   r5   rD   r   r   r   r   rQ   indexr   piecesr7   s              r9   hybrid_searchzSearchCommands.hybrid_search3  s   6 e$enn&'MM.1134MM/4467MM$../BCDMM9g./ $GHMM&++-.,H<$(GL!"d""F6g6c8$J"t"":s>g>>r;   c                 \    | j                  ||      \  }} | j                  t        g| S )zReturns the execution plan for a complex query.

        For more information see `FT.EXPLAIN <https://redis.io/commands/ft.explain>`_.
        r   )r   r   EXPLAIN_CMD)r5   rD   r   r   
query_texts        r9   explainzSearchCommands.explainh  s6      ..u<.Pj#t##K7$77r;   c                     t        d      )Nz#EXPLAINCLI will not be implemented.)NotImplementedError)r5   rD   s     r9   explain_clizSearchCommands.explain_clit  s    !"GHHr;   c                    t        |t              r9t        |j                        }t        | j
                  g|j                         z   }nCt        |t              r'd}t        d| j
                  g|j                         z   }nt        d|      || j                  |      z  } | j                  | }| j                  t        |||      S )  
        Issue an aggregation query.

        ### Parameters

        **query**: This can be either an `AggregateRequest`, or a `Cursor`

        An `AggregateResult` object is returned. You can access the rows from
        its `rows` property, which will always yield the rows of the result.

        For more information see `FT.AGGREGATE <https://redis.io/commands/ft.aggregate>`_.
        TREAD	Bad queryrD   rb   rf   r   r   rg   AGGREGATE_CMDr   r  r   
CURSOR_CMDr   r   r   r:   r5   rD   r   rb   r6   raws         r9   	aggregatezSearchCommands.aggregatew  s    " e-.emm,J $//2U5E5E5GGCv&Jvt7%:J:J:LLC[%00t##L11"d""C(""3e
 # 
 	
r;   r  rb   c                     |r1t        |t              r|d   |_        |}nt        |d         }|d   }nd }t        |t              r|j                  r|d   }|dd  }nd }|dd  }t        |||      S )Nr   r   r   )rf   r   cidr   _with_schemar   )r5   r  rD   rb   rQ   schemarowss          r9   rc   z$SearchCommands._get_aggregate_result  s     %(F	Aa&CFe-.53E3EVFqr7DFqr7DtVV44r;   limitedc                    t        j                         }t        | j                  dg}|r|j	                  d       |j	                  d       t        |t              rd|d<   ||j                         z  }nHt        |t              r-d|d<   ||j                         z  }|| j                  |      z  }nt        d       | j                  | }| j                  t        ||t        j                         |z
  dz  	      S )
a  
        Performs a search or aggregate command and collects performance
        information.

        ### Parameters

        **query**: This can be either an `AggregateRequest` or `Query`.
        **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   rR   z5Must provide AggregateRequest object or Query object.r   r   )r   r   PROFILE_CMDr   r[   rf   r   r  r   r   r   r   r   r:   )r5   rD   r!  r   r   r6   r7   s          r9   profilezSearchCommands.profile  s    $ ^^DOOR0JJy!

7e-. CF5##%%Cu%CF5>>##C4''55CTUU"d""C(""ET^^5E5Jf4T # 
 	
r;   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_CMDr   r  r   r:   r5   rD   distanceincludeexcluder6   r7   s          r9   
spellcheckzSearchCommands.spellcheck  sy     t6JJ
H-.JJG45JJG45"d""C("">377r;   nametermsc                 R    t         |g}|j                  |        | j                  | S )zAdds terms to a dictionary.

        ### Parameters

        - **name**: Dictionary name.
        - **terms**: List of items for adding to the dictionary.

        For more information see `FT.DICTADD <https://redis.io/commands/ft.dictadd>`_.
        )DICT_ADD_CMDr  r   r5   r4  r5  r6   s       r9   dict_addzSearchCommands.dict_add  -     T"

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

        ### Parameters

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

        For more information see `FT.DICTDEL <https://redis.io/commands/ft.dictdel>`_.
        )DICT_DEL_CMDr  r   r8  s       r9   dict_delzSearchCommands.dict_del  r:  r;   c                 0    t         |g} | j                  | S )zDumps all terms in the given dictionary.

        ### Parameters

        - **name**: Dictionary name.

        For more information see `FT.DICTDUMP <https://redis.io/commands/ft.dictdump>`_.
        )DICT_DUMP_CMDr   )r5   r4  r6   s      r9   	dict_dumpzSearchCommands.dict_dump  s!     d##t##S))r;   8.0.0Ddeprecated since Redis 8.0, call config_set from core module insteadoptionr   c                 >    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   r5   rC  r   r6   r  s        r9   
config_setzSearchCommands.config_set  s.     5&%0"d""C(d{r;   Ddeprecated since Redis 8.0, call config_get from core module insteadc                 ^    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rI  r   r:   r5   rC  r6   r7   s       r9   
config_getzSearchCommands.config_get+  s5     5&)"d""C("":s33r;   tagfieldc                 D    | j                  t        | j                  |      S )z
        Return a list of all possible tag values

        ### Parameters

        - **tagfield**: Tag field name

        For more information see `FT.TAGVALS <https://redis.io/commands/ft.tagvals>`_.
        )r   TAGVALS_CMDr   )r5   rS  s     r9   tagvalszSearchCommands.tagvals<  s     ##K(KKr;   aliasc                 D    | j                  t        || j                        S )z
        Alias a search index - will fail if alias already exists

        ### Parameters

        - **alias**: Name of the alias to create

        For more information see `FT.ALIASADD <https://redis.io/commands/ft.aliasadd>`_.
        )r   ALIAS_ADD_CMDr   r5   rW  s     r9   aliasaddzSearchCommands.aliasaddI  s     ##M5$//JJr;   c                 D    | j                  t        || j                        S )z
        Updates an alias - will fail if alias does not already exist

        ### Parameters

        - **alias**: Name of the alias to create

        For more information see `FT.ALIASUPDATE <https://redis.io/commands/ft.aliasupdate>`_.
        )r   ALIAS_UPDATE_CMDr   rZ  s     r9   aliasupdatezSearchCommands.aliasupdateV  s     ##$4eT__MMr;   c                 .    | j                  t        |      S )z
        Removes an alias to a search index

        ### Parameters

        - **alias**: Name of the alias to delete

        For more information see `FT.ALIASDEL <https://redis.io/commands/ft.aliasdel>`_.
        )r   ALIAS_DEL_CMDrZ  s     r9   aliasdelzSearchCommands.aliasdelc  s     ##M599r;   c                 h   | j                  d      }|D ]  }t        ||j                  |j                  g}|j	                  d      r|j                  d       |j                  r,|j                  d       |j                  |j                          |j                  |   |j                         d   S )aJ  
        Add suggestion terms to the AutoCompleter engine. Each suggestion has
        a score and string.
        If kwargs["increment"] is true and the terms are already in the
        server's dictionary, we increment their scores.

        For more information see `FT.SUGADD <https://redis.io/commands/ft.sugadd/>`_.
        Ftransaction	incrementINCRr   	pipelineSUGADD_COMMANDstringrk   r   r[   r   r   executer5   r   suggestionsr8   pipesugr   s          r9   sugaddzSearchCommands.sugaddo  s     }}}/ 	(C"CSYY?Dzz+&F#{{I&CKK( D  $'	( ||~b!!r;   r   c                 .    | j                  t        |      S )z
        Return the number of entries in the AutoCompleter index.

        For more information see `FT.SUGLEN <https://redis.io/commands/ft.suglen>`_.
        )r   SUGLEN_COMMAND)r5   r   s     r9   suglenzSearchCommands.suglen  s     ##NC88r;   rk  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)r5   r   rk  s      r9   sugdelzSearchCommands.sugdel  s     ##NC@@r;   prefixfuzzynumrG   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_COMMANDr[   r+   r*   r,   r   r   )r5   r   rx  ry  rz  rG   r{  r   r7   rV   parserss               r9   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_CMDr   r  r   )r5   r  r  r5  r6   s        r9   	synupdatezSearchCommands.synupdate  sF    $ doow7JJ)*+

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

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

        For more information see `FT.SYNDUMP <https://redis.io/commands/ft.syndump>`_.
        )r   SYNDUMP_CMDr   r:   r   s     r9   syndumpzSearchCommands.syndump  s-     "";@"";44r;   )d   )	FFNNFNFFF)F)NF      ?NFFNF)Nr  NF)Fr  NFFNF)r  NF)NFr=   NNNNN)FNNNNF
   FF)I__name__
__module____qualname____doc__r:   rB   rN   r`   rd   ri   rq   ru   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r\   r   r   r   r   r   r   r   rZ   bytesr   r   r   r   r   r   r   r   r   r   r
   r	  r  r  r   r   r  rc   r'  r3  r9  r=  r@  rK  rR  rV  r[  r^  ra  rq  rt  rw  r   r  r  r  rs   r;   r9   r.   r.   M   s   D!

,V2#J>C> !&$)-04"$)"'D+UD+ D+ 	D+
 DI&D+ _-D+ D+ "D+  D+L+uUDK-?'@ +(+$ +8 (+V DI+(  T "&"&3
3
 3
 	3

 $3
 3
 3
 3-3
 3
 s)3
3
j  T

" 1RS+ T+&) 1RS
E T
E	2$T#uS#ue5K/L*L%MN#+DeCeU<R6S1S,T#U& OS
S%Z 
 DeCeU,B&C!CDdJK
F :>@DRV!%.23?3? !!563? ""<=	3?
 &d3c3u6L0M+M&NO3? #3? *+3? 
|/9	:3?p LP
8S%Z 
8 tCsC/E)F$FGH
8IsEz!2 I LP
%v-.
 tCsC/E)F$FGH
@55 %&6&> ?5MQ52 KO	&
U,,-&
 &
 tCsC/E)F$FGH	&
P88*S *$s) **S *$s) *
*c 
* U S T 	 U4 4 4	4L LKc KN N
:c 
:".9# 9# 9A# As As A !#6#6# 6# 	6#
 6# 6# 6# 
	6#p* *4 *c *0
5r;   r.   c                      e Zd Zd Z	 d deeef   deeeeee	e
ef   f      fdZ	 	 	 	 	 d!dedee   dee   deeeeee	e
ef   f      d	ee	   d
ee   deeeef   fdZ	 d deeef   deeeeee	e
ef   f      fdZd"dZ edd      dededefd       Z edd      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     r9   r   zAsyncSearchCommands.info  s:      ((4??CC""8S11 Ds   $AAANrD   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   r0   TNr   r   r   r   s          r9   r   zAsyncSearchCommands.search   s       ))%l)Ke^^,H<$(GL!(D((FdFgFFc8$J""5DNN4Dr4IV3S # 
 	
 Gs   A*B6,B4-AB6r   r   r   r   rQ   r   c                 ~  K   | j                   }i }t        |g}	|	j                  |j                                |r|	j                  |j                                |r|	j                  |j	                                |r |	j                  | j                  |             |r|	j                  d|f       |r$d|d<   |	j                  |j	                                t        | j                        dvr	d|t        <    | j                  |	i | d{   }
t        |
t              r|
S  | j                  t        |
fi |S 7 .w)r   r  TrQ   r0   Nr  r  s              r9   r	  z!AsyncSearchCommands.hybrid_search   s    6 e$enn&'MM.1134MM/4467MM$../BCDMM9g./ $GHMM&++-.,H<$(GL!(D((&<G<<c8$J"t"":s>g>> =s   D
D=D;/D=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         r9   r  zAsyncSearchCommands.aggregateU  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          r9   r3  zAsyncSearchCommands.spellchecku  s      t6JJ
H-.JJG45JJG45(D((#.."">377 /s   A'B)B*BrA  rB  r   rC  r   c                 Z   K   t         d||g} | j                  |  d{   }|dk(  S 7 	w)rE  rF  NrG  rH  rJ  s        r9   rK  zAsyncSearchCommands.config_set  s:      5&%0(D((#..d{ /s   +)
+rL  c                 ~   K   t         d|g}i } | j                  |  d{   }| j                  t         |      S 7 w)rN  rO  NrP  rQ  s       r9   rR  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   rs   r   r   s         r9   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>`_.
        Frc  re  rf  r   Nrg  rh  rm  s          r9   rq  zAsyncSearchCommands.sugadd  s      }}}/ 	(C"CSYY?Dzz+&F#{{I&CKK( D  $'	( lln$b))$s   B4C 6B>7C r   rx  ry  rz  rG   r{  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)r}  r~  Nr  )r5   r   rx  ry  rz  rG   r{  r   retrV   r  r  s               r9   r  zAsyncSearchCommands.sugget  s     P VUC8KKKK
#KK%(D(($//N!+}cB!"a"" 0 #s$   A#B%B&B	B
BBr=   r  r  r  )"r  r  r  r   r   r   r   r   r   rZ   r\   r  r   r   r   r   r   r   r   r
   r	  r   r   r  r3  r   r   rK  rR  r   rq  r   r   r  rs   r;   r9   r  r    s   	2 LP
S%Z 
 tCsC/E)F$FGH
F :>@DRV!%.23?3? !!563? ""<=	3?
 &d3c3u6L0M+M&NO3? #3? *+3? 
|/9	:3?p LP
_f,-
 tCsC/E)F$FGH
@88 Us 3 4 	 U4s 4s 4	4)*6 !#6#6# 6# 	6#
 6# 6# 6# 
	6#r;   r  )Yr   r   typingr   r   r   r   r   redis._parsers.helpersr   redis.clientr	   r
   "redis.commands.search.hybrid_queryr   r   r   r   #redis.commands.search.hybrid_resultr   r   redis.utilsr   helpersr   _utilr   aggregationr   r   r   documentr   fieldr   index_definitionr   profile_informationr   rD   r   rh   r   rl   r   r    r   r   r   r   r   r   r  EXPLAINCLI_CMDr   r  r&  r  r.  r7  r<  r?  r   rI  rU  rY  r]  r`  r   rj  rv  rs  r  r  r  r  r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r.   r  rs   r;   r9   <module>r     s?     3 3 0 /  Q + *  
   - 3   (

	

 

 
# 
	
		#
d5 d5N]#. ]#r;   