
    LKi%                         S SK JrJr  S SKJrJrJrJrJrJ	r	  S SK
JrJrJrJrJrJrJrJrJrJr  \ " S S5      5       r\ " S S5      5       r\ " S S	5      5       r " S
 S5      rg)    )	dataclassfield)ListDictAnyUnionSetOptional)
KNNFilterGroupByLimit
ProjectionScanRankSelectWhereKeyc                        \ rS rSr% \\S'   Srg)	CountPlan   scan N)__name__
__module____qualname____firstlineno__r   __annotations____static_attributes__r       d/var/www/html/dynamic-report/venv/lib/python3.13/site-packages/chromadb/execution/expression/plan.pyr   r      s    
Jr    r   c                   b    \ rS rSr% \\S'   \" \S9r\\S'   \" \	S9r
\	\S'   \" \S9r\\S'   Srg)	GetPlan   r   default_factoryfilterlimit
projectionr   N)r   r   r   r   r   r   r   r   r'   r   r(   r   r)   r   r   r    r!   r#   r#      s4    
J62FF2/E5/":>J
>r    r#   c                   V    \ rS rSr% \\S'   \\S'   \" \S9r	\\S'   \" \
S9r\
\S'   Srg)	KNNPlan   r   knnr%   r'   r)   r   N)r   r   r   r   r   r   r   r   r   r'   r   r)   r   r   r    r!   r+   r+      s*    
J	H62FF2":>J
>r    r+   c                      \ rS rSrSr     SS\\\\\	\
4   4      S\\\\\	\
4   4      S\\\\\	\
4   4      S\\\\\	\
4   \4      S\\\\\	\
4   \\	   \\	   4      4
S	 jjrS
\\	\
4   4S jrSS jrS\\\	4   S
S 4S jrS\\\\\	\
4   4      S
S 4S jrS\\\\\	\
4   4      S
S 4S jrS\\\\\	\
4   4      S
S 4S jrSS\S\S
S 4S jjrSrg)Search'   a   Payload for hybrid search operations.

Can be constructed by directly providing the parameters, or by using the builder pattern.

Examples:
    Direct construction with expressions:
        Search(
            where=Key("status") == "active",
            rank=Knn(query=[0.1, 0.2]),
            limit=Limit(limit=10),
            select=Select(keys={Key.DOCUMENT}),
        )

    Direct construction with dicts:
        Search(
            where={"status": "active"},
            rank={"$knn": {"query": [0.1, 0.2]}},
            limit=10,
            select=["#document", "#score"],
        )

    Builder pattern:
        (Search()
         .where(Key("status") == "active")
         .rank(Knn(query=[0.1, 0.2]))
         .limit(10)
         .select(Key.DOCUMENT))
Nwhererankgroup_byr(   selectc                    Uc  SU l         On[        U[        5      (       a  Xl         OR[        U[        5      (       a  [        R                  " U5      U l         O![        S[        U5      R                   35      eUc  SU l        On[        U[        5      (       a  X l        OR[        U[        5      (       a  [        R                  " U5      U l        O![        S[        U5      R                   35      eUc  [        5       U l        On[        U[        5      (       a  X0l        OR[        U[        5      (       a  [        R                  " U5      U l        O![        S[        U5      R                   35      eUc  [        5       U l        O[        U[        5      (       a  X@l        O[        U[        5      (       a  [        R                  " USS.5      U l        OR[        U[        5      (       a  [        R                  " U5      U l        O![        S[        U5      R                   35      eUc  [        5       U l        g[        U[        5      (       a  XPl        g[        U[        5      (       a  [        R                  " U5      U l        g[        U["        [$        45      (       a'  [        R                  " S[#        U5      05      U l        g[        S	[        U5      R                   35      e)
a  Initialize a Search payload.

Args:
    where: Where expression or dict for filtering results (defaults to None - no filtering)
           Dict will be converted using Where.from_dict()
    rank: Rank expression or dict for scoring (defaults to None - no ranking)
          Dict will be converted using Rank.from_dict()
          Note: Primitive numbers are not accepted - use {"$val": number} for constant ranks
    group_by: GroupBy configuration for grouping and aggregating results (defaults to None)
              Dict will be converted using GroupBy.from_dict()
    limit: Limit configuration for pagination (defaults to no limit)
           Can be a Limit object, a dict for Limit.from_dict(), or an int
           When passing an int, it creates Limit(limit=value, offset=0)
    select: Select configuration for keys (defaults to empty selection)
            Can be a Select object, a dict for Select.from_dict(),
            or a list/set of strings (e.g., ["#document", "#score"])
Nz1where must be a Where object, dict, or None, got z/rank must be a Rank object, dict, or None, got z6group_by must be a GroupBy object, dict, or None, got r   )r(   offsetz6limit must be a Limit object, dict, int, or None, got keysz>select must be a Select object, dict, list, set, or None, got )_where
isinstancer   dict	from_dict	TypeErrortyper   _rankr   r   	_group_byr   _limitintr   _selectlistset)selfr1   r2   r3   r(   r4   s         r!   __init__Search.__init__E   s9   4 =DKu%%Kt$$//%0DKCDKDXDXCYZ 
 <DJd##Jd##-DJA$t*BUBUAVW 
 $YDN'**%N$''$..x8DNHhI`I`Hab 
 ='DKu%%Ks##//EQ*GHDKt$$//%0DKHeI]I]H^_ 
 >!8DL''!L%%!++F3DLs,,!++VT&\,BCDLPQUV\Q]QfQfPgh r    returnc                 >   U R                   b  U R                   R                  5       OSU R                  b  U R                  R                  5       OSU R                  R                  5       U R                  R                  5       U R
                  R                  5       S.$ )z5Return a JSON-serializable dictionary representation.N)r'   r2   r3   r(   r4   )r8   to_dictr>   r?   r@   rB   )rE   s    r!   rJ   Search.to_dict   st     04{{/Fdkk))+D,0JJ,BDJJ&&(..0[[((*ll**,
 	
r    c                     [        [        R                  [        R                  [        R                  [        R
                  1S9n[        U R                  U R                  U R                  U R                  US9$ )zBSelect all predefined keys (document, embedding, metadata, score).r7   r1   r2   r3   r(   r4   )r   r   DOCUMENT	EMBEDDINGMETADATASCOREr/   r8   r>   r?   r@   )rE   
new_selects     r!   
select_allSearch.select_all   sQ    #,,s||SYY!WX
++^^++
 	
r    r7   c                     [        [        U5      S9n[        U R                  U R                  U R
                  U R                  US9$ )zSelect specific keys to return.

Args:
    *keys: Key objects or string key names.

Returns:
    Search: A new Search with updated selection.
rM   rN   )r   rD   r/   r8   r>   r?   r@   )rE   r7   rS   s      r!   r4   Search.select   s>     T+
++^^++
 	
r    c                 l    [        UU R                  U R                  U R                  U R                  S9$ )a  Set the where clause for filtering.

Args:
    where: Where expression, dict, or None.

Example:
    search.where((Key("status") == "active") & (Key("score") > 0.5))
    search.where({"status": "active"})
    search.where({"$and": [{"status": "active"}, {"score": {"$gt": 0.5}}]})
rN   )r/   r>   r?   r@   rB   )rE   r1   s     r!   r1   Search.where   s0     ^^++<<
 	
r    	rank_exprc                 l    [        U R                  UU R                  U R                  U R                  S9$ )a  Set the ranking expression.

Args:
    rank_expr: A Rank expression, dict, or None for scoring
               Dicts will be converted using Rank.from_dict()
               Note: Primitive numbers are not accepted - use {"$val": number} for constant ranks

Example:
    search.rank(Knn(query=[0.1, 0.2]) * 0.8 + Val(0.5) * 0.2)
    search.rank({"$knn": {"query": [0.1, 0.2]}})
    search.rank({"$sum": [{"$knn": {"query": [0.1, 0.2]}}, {"$val": 0.5}]})
rN   )r/   r8   r?   r@   rB   )rE   rZ   s     r!   r2   Search.rank   s0     ++^^++<<
 	
r    c                 l    [        U R                  U R                  UU R                  U R                  S9$ )a  Set the group_by configuration for grouping and aggregating results

Args:
    group_by: A GroupBy object, dict, or None for grouping
              Dicts will be converted using GroupBy.from_dict()

Example:
    search.group_by(GroupBy(
        keys=[Key("category")],
        aggregate=MinK(keys=[Key.SCORE], k=3)
    ))
    search.group_by({
        "keys": ["category"],
        "aggregate": {"$min_k": {"keys": ["#score"], "k": 3}}
    })
rN   )r/   r8   r>   r@   rB   )rE   r3   s     r!   r3   Search.group_by   s0    " ++++<<
 	
r    r6   c                 ~    [        X!S9n[        U R                  U R                  U R                  UU R
                  S9$ )zSet the limit and offset for pagination

Args:
    limit: Maximum number of results to return
    offset: Number of results to skip (default: 0)

Example:
    search.limit(20, offset=10)
)r6   r(   rN   )r   r/   r8   r>   r?   rB   )rE   r(   r6   	new_limits       r!   r(   Search.limit  s:     5	++^^<<
 	
r    )r?   r@   r>   rB   r8   )NNNNN)rH   r/   )r   )r   r   r   r   __doc__r
   r   r   r   strr   r   r   r   rA   r   r   r	   rF   rJ   rT   r   r4   r1   r2   r3   r(   r   r   r    r!   r/   r/   '   s   > 9=6:=A=AOSXeT#s(^345X uT4S>123X 5$sCx.!89:	X
 eT#s(^S89:X vtCH~tCy#c(JKLXt
c3h 
	

E#s(O 
 
$
8E%c3h*?$@A 
h 
&
huT4S>-A'BC 
 
*
%c3h0G*H!I 
h 
2
3 
 
H 
 
r    r/   N)dataclassesr   r   typingr   r   r   r   r	   r
   &chromadb.execution.expression.operatorr   r   r   r   r   r   r   r   r   r   r   r#   r+   r/   r   r    r!   <module>rg      st    ( 8 8      ? ? ? ? ? ?r
 r
r    