Ë
    lQêj”Ë  ã            
       óz  — d dl mZmZ d dlmZmZmZmZmZm	Z	m
Z
 d dlmZ d dlZd dlmZ d dlmZmZmZmZmZmZmZmZmZmZ d dlmZmZmZ e G d„ d	«      «       Z e G d
„ d«      «       Z!e G d„ de!«      «       Z"e G d„ de!«      «       Z#e G d„ de!«      «       Z$e G d„ de!«      «       Z%e G d„ de!«      «       Z&e G d„ de!«      «       Z'e G d„ de!«      «       Z(e G d„ de!«      «       Z)e G d„ de!«      «       Z*e G d„ de!«      «       Z+e G d „ d!e!«      «       Z,e G d"„ d#e!«      «       Z-e G d$„ d%e!«      «       Z.e G d&„ d'e!«      «       Z/ G d(„ d)«      Z0 e0d*«      e0_1         e0d+«      e0_2         e0d,«      e0_3         e0d-«      e0_4         e0d.«      e0_5        e0Z6e G d/„ d0«      «       Z7e G d1„ d2«      «       Z8e G d3„ d4«      «       Z9e G d5„ d6«      «       Z:e G d7„ d8«      «       Z;e G d9„ d:e;«      «       Z<e G d;„ d<e;«      «       Z=e G d=„ d>e;«      «       Z>e G d?„ d@e;«      «       Z?e G dA„ dBe;«      «       Z@e G dC„ dDe;«      «       ZAe G dE„ dFe;«      «       ZBe G dG„ dHe;«      «       ZCe G dI„ dJe;«      «       ZDe G dK„ dLe;«      «       ZEe G dM„ dNe;«      «       ZFe G dO„ dPe;«      «       ZGe G dQ„ dR«      «       ZHdSee	e0eIf      dTeeI   fdU„ZJdSe	ee   eKedVf   f   dTee	e0eIf      fdW„ZLdXeIdYeeIef   dTeKee	e0eIf      eMf   fdZ„ZNe G d[„ d\«      «       ZOe G d]„ d^eO«      «       ZPe G d_„ d`eO«      «       ZQe G da„ db«      «       ZRy)cé    )Ú	dataclassÚfield)ÚOptionalÚListÚDictÚSetÚAnyÚUnionÚcast)ÚLiteralValueN)ÚNDArray)
Ú
EmbeddingsÚIDsÚIncludeÚ	OneOrManyÚSparseVectorÚTYPE_KEYÚSPARSE_VECTOR_TYPE_VALUEÚmaybe_cast_one_to_manyÚnormalize_embeddingsÚvalidate_embeddings)Ú
CollectionÚRequestVersionContextÚSegmentc                   óL   — e Zd ZU eed<   eed<   eed<   eed<   edefd„«       Zy)ÚScanÚ
collectionÚknnÚmetadataÚrecordÚreturnc                 ól   — t        | j                  j                  | j                  j                  ¬«      S )N)Úcollection_versionÚlog_position)r   r   Úversionr$   ©Úselfs    úk/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/chromadb/execution/expression/operator.pyr%   zScan.version"   s)   € ä$Ø#Ÿ™×6Ñ6ØŸ™×5Ñ5ô
ð 	
ó    N)	Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__r   Úpropertyr   r%   © r)   r(   r   r      s2   … àÓØ	ƒLØÓØƒOàð
Ð.ò 
ó ñ
r)   r   c                   óZ   — e Zd ZdZdeeef   fd„Zedeeef   dd fd„«       Z	d	d„Z
d
d„Zy)ÚWherea?  Base class for Where expressions (algebraic data type).

    Supports logical operators for combining conditions:
        - AND: where1 & where2
        - OR: where1 | where2

    Examples:
        # Simple conditions
        where1 = Key("status") == "active"
        where2 = Key("score") > 0.5

        # Combining with AND
        combined_and = where1 & where2

        # Combining with OR
        combined_or = where1 | where2

        # Complex expressions
        complex_where = (Key("status") == "active") & ((Key("score") > 0.5) | (Key("priority") == "high"))
    r!   c                 ó   — t        d«      ‚)zCConvert the Where expression to a dictionary for JSON serializationú#Subclasses must implement to_dict()©ÚNotImplementedErrorr&   s    r(   Úto_dictzWhere.to_dictB   ó   € ä!Ð"GÓHÐHr)   Údatac                 ód
  — t        | t        «      s!t        dt        | «      j                  › �«      ‚| st        d«      ‚d| v rºt        | d   t        «      s$t        dt        | d   «      j                  › �«      ‚t        | d   «      dk(  rt        d«      ‚t        | «      dkD  rt        d«      ‚| d   D �cg c]  }t        j                  |«      ‘Œ }}t        |«      dk(  r|d   S |d   }|dd	 D ]  }||z  }Œ	 |S d
| v rºt        | d
   t        «      s$t        dt        | d
   «      j                  › �«      ‚t        | d
   «      dk(  rt        d«      ‚t        | «      dkD  rt        d«      ‚| d
   D �cg c]  }t        j                  |«      ‘Œ }}t        |«      dk(  r|d   S |d   }|dd	 D ]  }||z  }Œ	 |S t        | «      dk7  rt        dt        | «      › �«      ‚t        t        | j                  «       «      «      \  }}t        |t        «      s!t        dt        |«      j                  › �«      ‚t        |t        «      �rÓ|st        d|› d�«      ‚t        |«      dk7  rt        d|› d�«      ‚t        t        |j                  «       «      «      \  }}|dk(  rt        |«      |k(  S |dk(  rt        |«      |k7  S |dk(  rt        |«      |kD  S |dk(  rt        |«      |k\  S |dk(  rt        |«      |k  S |dk(  rt        |«      |k  S |dk(  rKt        |t        «      s!t        dt        |«      j                  › �«      ‚t        |«      j                  |«      S |dk(  rKt        |t        «      s!t        dt        |«      j                  › �«      ‚t        |«      j!                  |«      S |dk(  r[t        |t        t"        t$        t&        f«      s!t        dt        |«      j                  › �«      ‚t        |«      j)                  |«      S |dk(  r[t        |t        t"        t$        t&        f«      s!t        d t        |«      j                  › �«      ‚t        |«      j+                  |«      S |d!k(  rKt        |t        «      s!t        d"t        |«      j                  › �«      ‚t        |«      j-                  |«      S |d#k(  rKt        |t        «      s!t        d$t        |«      j                  › �«      ‚t        |«      j/                  |«      S t        d%|› �«      ‚t        |«      |k(  S c c}w c c}w )&at  Create Where expression from dictionary.

        Supports MongoDB-style query operators:
        - {"field": "value"} -> Key("field") == "value" (shorthand for equality)
        - {"field": {"$eq": value}} -> Key("field") == value
        - {"field": {"$ne": value}} -> Key("field") != value
        - {"field": {"$gt": value}} -> Key("field") > value
        - {"field": {"$gte": value}} -> Key("field") >= value
        - {"field": {"$lt": value}} -> Key("field") < value
        - {"field": {"$lte": value}} -> Key("field") <= value
        - {"field": {"$in": [values]}} -> Key("field").is_in([values])
        - {"field": {"$nin": [values]}} -> Key("field").not_in([values])
        - {"field": {"$contains": "text"}} -> Key("field").contains("text")
        - {"field": {"$not_contains": "text"}} -> Key("field").not_contains("text")
        - {"field": {"$regex": "pattern"}} -> Key("field").regex("pattern")
        - {"field": {"$not_regex": "pattern"}} -> Key("field").not_regex("pattern")
        - {"$and": [conditions]} -> condition1 & condition2 & ...
        - {"$or": [conditions]} -> condition1 | condition2 | ...
        zExpected dict for Where, got zWhere dict cannot be emptyú$andz$and must be a list, got r   z$$and requires at least one conditioné   z:$and cannot be combined with other fields in the same dictNú$orz$or must be a list, got z#$or requires at least one conditionz9$or cannot be combined with other fields in the same dictz/Where dict must contain exactly one field, got z!Field name must be a string, got zOperator dict for field 'z' cannot be emptyz#' must contain exactly one operatorú$eqú$neú$gtú$gteú$ltú$lteú$inz$in requires a list, got ú$ninz$nin requires a list, got ú	$containsz3$contains requires a str, int, float, or bool, got ú$not_containsz7$not_contains requires a str, int, float, or bool, got ú$regexz&$regex requires a string pattern, got ú
$not_regexz*$not_regex requires a string pattern, got zUnknown operator: )Ú
isinstanceÚdictÚ	TypeErrorÚtyper*   Ú
ValueErrorÚlistÚlenr1   Ú	from_dictÚnextÚiterÚitemsÚstrÚKeyÚis_inÚnot_inÚintÚfloatÚboolÚcontainsÚnot_containsÚregexÚ	not_regex)r8   ÚcÚ
conditionsÚresultr   Ú	conditionÚopÚvalues           r(   rP   zWhere.from_dictF   sT  € ô* ˜$¤Ô%ÜÐ;¼DÀ»J×<OÑ<OÐ;PÐQÓRÐRáÜÐ9Ó:Ð:ð �T‰>Ü˜d 6™l¬DÔ1ÜØ/´°T¸&±\Ó0B×0KÑ0KÐ/LÐMóð ô �4˜‘<Ó  AÒ%Ü Ð!GÓHÐHÜ�4‹y˜1Š}Ü ØPóð ð 7;¸6±lÖC°œ%Ÿ/™/¨!Õ,ÐCˆJÐCÜ�:‹ !Ò#Ø! !‘}Ð$Ø ‘]ˆFØ  �^ò $�Ø !™‘ð$àˆMà�d‰]Ü˜d 5™k¬4Ô0ÜÐ":¼4ÀÀUÁÓ;L×;UÑ;UÐ:VÐ WÓXÐXÜ�4˜‘;Ó 1Ò$Ü Ð!FÓGÐGÜ�4‹y˜1Š}Ü ØOóð ð 7;¸5±kÖB°œ%Ÿ/™/¨!Õ,ÐBˆJÐBÜ�:‹ !Ò#Ø! !‘}Ð$Ø ‘]ˆFØ  �^ò $�Ø !™‘ð$àˆMô �4‹y˜AŠ~Ü ØEÄcÈ$ÃiÀ[ÐQóð ô  $¤D¨¯©«Ó$6Ó7ÑˆE�9ä˜e¤SÔ)ÜØ7¼¸U»×8LÑ8LÐ7MÐNóð ô ˜)¤TÕ*á Ü$Ø3°E°7Ð:KÐLóð ô �y“> QÒ&Ü$Ø3°E°7Ð:]Ð^óð ô !¤ i§o¡oÓ&7Ó!8Ó9‘	��Eà˜’;Ü˜u›:¨Ñ.Ð.Ø˜5’[Ü˜u›:¨Ñ.Ð.Ø˜5’[Ü˜u›:¨Ñ-Ð-Ø˜6’\Ü˜u›:¨Ñ.Ð.Ø˜5’[Ü˜u›:¨Ñ-Ð-Ø˜6’\Ü˜u›:¨Ñ.Ð.Ø˜5’[Ü% e¬TÔ2Ü'Ø7¼¸U»×8LÑ8LÐ7MÐNóð ô ˜u›:×+Ñ+¨EÓ2Ð2Ø˜6’\Ü% e¬TÔ2Ü'Ø8¼¸e»×9MÑ9MÐ8NÐOóð ô ˜u›:×,Ñ,¨UÓ3Ð3Ø˜;Ò&Ü% e¬c´3¼¼tÐ-DÔEÜ'ØQÔRVÐW\ÓR]×RfÑRfÐQgÐhóð ô ˜u›:×.Ñ.¨uÓ5Ð5Ø˜?Ò*Ü% e¬c´3¼¼tÐ-DÔEÜ'ØUÔVZÐ[`ÓVa×VjÑVjÐUkÐlóð ô ˜u›:×2Ñ2°5Ó9Ð9Ø˜8’^Ü% e¬SÔ1Ü'ØDÄTÈ%Ã[×EYÑEYÐDZÐ[óð ô ˜u›:×+Ñ+¨EÓ2Ð2Ø˜<Ò'Ü% e¬SÔ1Ü'ØHÌÈeË×I]ÑI]ÐH^Ð_óð ô ˜u›:×/Ñ/°Ó6Ð6ä$Ð'9¸"¸Ð%>Ó?Ð?ô ˜5“z YÑ.Ð.ùòS Dùò$ Cs   Â6T(Å4T-c                 ó$  — t        | t        «      rKt        |t        «      r"t        | j                  |j                  z   «      S t        | j                  |gz   «      S t        |t        «      rt        | g|j                  z   «      S t        | |g«      S )zOverload & operator for AND)rI   ÚAndr`   ©r'   Úothers     r(   Ú__and__zWhere.__and__Ù   sy   € ô �dœCÔ ä˜%¤Ô%Ü˜4Ÿ?™?¨U×-=Ñ-=Ñ=Ó>Ð>Ü�t—‘¨%¨Ñ0Ó1Ð1ä˜œsÔ#Ü˜�v × 0Ñ 0Ñ0Ó1Ð1ä�D˜%�=Ó!Ð!r)   c                 ó$  — t        | t        «      rKt        |t        «      r"t        | j                  |j                  z   «      S t        | j                  |gz   «      S t        |t        «      rt        | g|j                  z   «      S t        | |g«      S )zOverload | operator for OR)rI   ÚOrr`   rg   s     r(   Ú__or__zWhere.__or__ç   sy   € ô �dœBÔä˜%¤Ô$Ü˜$Ÿ/™/¨E×,<Ñ,<Ñ<Ó=Ð=Ü�d—o‘o¨¨Ñ/Ó0Ð0ä˜œrÔ"Ü�t�f˜u×/Ñ/Ñ/Ó0Ð0ä�4˜�-Ó Ð r)   N)rh   r1   r!   rf   )rh   r1   r!   rk   )r*   r+   r,   Ú__doc__r   rT   r	   r6   ÚstaticmethodrP   ri   rl   r/   r)   r(   r1   r1   +   sV   „ ñð*I˜˜c 3˜h™ó Ið ðP/˜˜S #˜X™ð P/¨7ò P/ó ðP/ód"ô!r)   r1   c                   ó8   — e Zd ZU dZee   ed<   deee	f   fd„Z
y)rf   z(Logical AND of multiple where conditionsr`   r!   c                 ó`   — d| j                   D �cg c]  }|j                  «       ‘Œ c}iS c c}w )Nr:   ©r`   r6   ©r'   r_   s     r(   r6   zAnd.to_dictü   s%   € Ø¨d¯o©oÖ>¨˜Ÿ™�Ò>Ð?Ð?ùÒ>ó   �+N©r*   r+   r,   rm   r   r1   r-   r   rT   r	   r6   r/   r)   r(   rf   rf   ö   s%   … á2à�U‘Óð@˜˜c 3˜h™ô @r)   rf   c                   ó8   — e Zd ZU dZee   ed<   deee	f   fd„Z
y)rk   z'Logical OR of multiple where conditionsr`   r!   c                 ó`   — d| j                   D �cg c]  }|j                  «       ‘Œ c}iS c c}w )Nr<   rq   rr   s     r(   r6   z
Or.to_dict  s%   € Ø¨T¯_©_Ö=¨˜Ÿ	™	�Ò=Ð>Ð>ùÒ=rs   Nrt   r/   r)   r(   rk   rk      s#   … á1à�U‘Óð?˜˜c 3˜h™ô ?r)   rk   c                   ó<   — e Zd ZU dZeed<   eed<   deeef   fd„Zy)ÚEqzEquality comparisonÚkeyrd   r!   c                 ó6   — | j                   d| j                  iiS )Nr=   ©ry   rd   r&   s    r(   r6   z
Eq.to_dict  ó   € Ø—‘˜5 $§*¡*Ð-Ð.Ð.r)   N©	r*   r+   r,   rm   rT   r-   r	   r   r6   r/   r)   r(   rx   rx   
  s#   … áà	ƒHØƒJð/˜˜c 3˜h™ô /r)   rx   c                   ó<   — e Zd ZU dZeed<   eed<   deeef   fd„Zy)ÚNezNot equal comparisonry   rd   r!   c                 ó6   — | j                   d| j                  iiS )Nr>   r{   r&   s    r(   r6   z
Ne.to_dict  r|   r)   Nr}   r/   r)   r(   r   r     ó#   … áà	ƒHØƒJð/˜˜c 3˜h™ô /r)   r   c                   ó<   — e Zd ZU dZeed<   eed<   deeef   fd„Zy)ÚGtzGreater than comparisonry   rd   r!   c                 ó6   — | j                   d| j                  iiS )Nr?   r{   r&   s    r(   r6   z
Gt.to_dict'  r|   r)   Nr}   r/   r)   r(   rƒ   rƒ      s#   … á!à	ƒHØƒJð/˜˜c 3˜h™ô /r)   rƒ   c                   ó<   — e Zd ZU dZeed<   eed<   deeef   fd„Zy)ÚGtez Greater than or equal comparisonry   rd   r!   c                 ó6   — | j                   d| j                  iiS )Nr@   r{   r&   s    r(   r6   zGte.to_dict2  ó   € Ø—‘˜6 4§:¡:Ð.Ð/Ð/r)   Nr}   r/   r)   r(   r†   r†   +  s#   … á*à	ƒHØƒJð0˜˜c 3˜h™ô 0r)   r†   c                   ó<   — e Zd ZU dZeed<   eed<   deeef   fd„Zy)ÚLtzLess than comparisonry   rd   r!   c                 ó6   — | j                   d| j                  iiS )NrA   r{   r&   s    r(   r6   z
Lt.to_dict=  r|   r)   Nr}   r/   r)   r(   rŠ   rŠ   6  r�   r)   rŠ   c                   ó<   — e Zd ZU dZeed<   eed<   deeef   fd„Zy)ÚLtezLess than or equal comparisonry   rd   r!   c                 ó6   — | j                   d| j                  iiS )NrB   r{   r&   s    r(   r6   zLte.to_dictH  rˆ   r)   Nr}   r/   r)   r(   r�   r�   A  s#   … á'à	ƒHØƒJð0˜˜c 3˜h™ô 0r)   r�   c                   óB   — e Zd ZU dZeed<   ee   ed<   deeef   fd„Z	y)ÚInz"In comparison - value is in a listry   Úvaluesr!   c                 ó6   — | j                   d| j                  iiS )NrC   ©ry   r‘   r&   s    r(   r6   z
In.to_dictS  s   € Ø—‘˜5 $§+¡+Ð.Ð/Ð/r)   N©
r*   r+   r,   rm   rT   r-   r   r	   r   r6   r/   r)   r(   r�   r�   L  s(   … á,à	ƒHØ�‰IÓð0˜˜c 3˜h™ô 0r)   r�   c                   óB   — e Zd ZU dZeed<   ee   ed<   deeef   fd„Z	y)ÚNinz*Not in comparison - value is not in a listry   r‘   r!   c                 ó6   — | j                   d| j                  iiS )NrD   r“   r&   s    r(   r6   zNin.to_dict^  s   € Ø—‘˜6 4§;¡;Ð/Ð0Ð0r)   Nr”   r/   r)   r(   r–   r–   W  s(   … á4à	ƒHØ�‰IÓð1˜˜c 3˜h™ô 1r)   r–   c                   ó<   — e Zd ZU dZeed<   eed<   deeef   fd„Z	y)ÚContainszEContains comparison for document content or metadata array membershipry   rd   r!   c                 ó6   — | j                   d| j                  iiS )NrE   r{   r&   s    r(   r6   zContains.to_dicti  s   € Ø—‘˜;¨¯
©
Ð3Ð4Ð4r)   N©
r*   r+   r,   rm   rT   r-   r   r   r	   r6   r/   r)   r(   r™   r™   b  s$   … áOà	ƒHØÓð5˜˜c 3˜h™ô 5r)   r™   c                   ó<   — e Zd ZU dZeed<   eed<   deeef   fd„Z	y)ÚNotContainszINot-contains comparison for document content or metadata array membershipry   rd   r!   c                 ó6   — | j                   d| j                  iiS )NrF   r{   r&   s    r(   r6   zNotContains.to_dictt  s   € Ø—‘˜?¨D¯J©JÐ7Ð8Ð8r)   Nr›   r/   r)   r(   r�   r�   m  s$   … áSà	ƒHØÓð9˜˜c 3˜h™ô 9r)   r�   c                   ó<   — e Zd ZU dZeed<   eed<   deeef   fd„Zy)ÚRegexzRegular expression matchingry   Úpatternr!   c                 ó6   — | j                   d| j                  iiS )NrG   ©ry   r¡   r&   s    r(   r6   zRegex.to_dict  s   € Ø—‘˜8 T§\¡\Ð2Ð3Ð3r)   N©	r*   r+   r,   rm   rT   r-   r   r	   r6   r/   r)   r(   r    r    x  s#   … á%à	ƒHØƒLð4˜˜c 3˜h™ô 4r)   r    c                   ó<   — e Zd ZU dZeed<   eed<   deeef   fd„Zy)ÚNotRegexz$Negative regular expression matchingry   r¡   r!   c                 ó6   — | j                   d| j                  iiS )NrH   r£   r&   s    r(   r6   zNotRegex.to_dictŠ  s   € Ø—‘˜<¨¯©Ð6Ð7Ð7r)   Nr¤   r/   r)   r(   r¦   r¦   ƒ  s#   … á.à	ƒHØƒLð8˜˜c 3˜h™ô 8r)   r¦   c                   ó(  — e Zd ZU dZd ed<   d ed<   d ed<   d ed<   d ed<   defd„Zd	efd
„Zde	d	e
fd„Zde	d	efd„Zde	d	efd„Zde	d	efd„Zde	d	efd„Zde	d	efd„Zdee	   d	efd„Zdee	   d	efd„Zded	efd„Zded	efd„Zded	e fd„Z!ded	e"fd„Z#y)rU   a£  Field proxy for building Where filter expressions.

    The Key class allows for readable field references using either:
    1. Predefined constants for special fields: K.EMBEDDING, K.DOCUMENT, K.SCORE, etc.
    2. String literals with # prefix for special fields: Key("#embedding")
    3. Metadata field names without # prefix: Key("my_metadata_field")

    Predefined field constants (special fields with # prefix):
        Key.ID - ID field (equivalent to Key("#id"))
        Key.DOCUMENT - Document field (equivalent to Key("#document"))
        Key.EMBEDDING - Embedding field (equivalent to Key("#embedding"))
        Key.METADATA - Metadata field (equivalent to Key("#metadata"))
        Key.SCORE - Score field (equivalent to Key("#score"))

    Note: K is an alias for Key, so you can use K.DOCUMENT or Key.DOCUMENT interchangeably.

    Examples:
        # Using predefined keys with K alias for special fields
        from chromadb.execution.expression import K
        K.DOCUMENT.contains("search text")  # Searches document field

        # Custom metadata field names (without # prefix)
        K("status") == "active"  # Metadata field named "status"
        K("category").is_in(["science", "tech"])  # Metadata field named "category"
        K("sparse_embedding")  # Example: metadata field (could store anything)

        # Using with Knn for different fields
        Knn(query=[0.1, 0.2])  # Default: searches "#embedding"
        Knn(query=[0.1, 0.2], key=K.EMBEDDING)  # Explicit: searches "#embedding"
        Knn(query=sparse, key="sparse_embedding")  # Example: searches a metadata field

        # Combining conditions
        (K("status") == "active") & (K.SCORE > 0.5)
    ÚIDÚDOCUMENTÚ	EMBEDDINGÚMETADATAÚSCOREÚnamec                 ó   — || _         y )N)r®   )r'   r®   s     r(   Ú__init__zKey.__init__º  s	   € Øˆ�	r)   r!   c                 ó,   — t        | j                  «      S )z!Make Key hashable for use in sets)Úhashr®   r&   s    r(   Ú__hash__zKey.__hash__½  s   € ä�D—I‘I‹Ðr)   rd   c                 ó.   — t        | j                  |«      S )zEquality: Key('field') == value)rx   r®   ©r'   rd   s     r(   Ú__eq__z
Key.__eq__Â  ó   € ä�$—)‘)˜UÓ#Ð#r)   c                 ó.   — t        | j                  |«      S )z Not equal: Key('field') != value)r   r®   rµ   s     r(   Ú__ne__z
Key.__ne__Æ  r·   r)   c                 ó.   — t        | j                  |«      S )z"Greater than: Key('field') > value)rƒ   r®   rµ   s     r(   Ú__gt__z
Key.__gt__Ê  r·   r)   c                 ó.   — t        | j                  |«      S )z,Greater than or equal: Key('field') >= value)r†   r®   rµ   s     r(   Ú__ge__z
Key.__ge__Î  ó   € ä�4—9‘9˜eÓ$Ð$r)   c                 ó.   — t        | j                  |«      S )zLess than: Key('field') < value)rŠ   r®   rµ   s     r(   Ú__lt__z
Key.__lt__Ò  r·   r)   c                 ó.   — t        | j                  |«      S )z)Less than or equal: Key('field') <= value)r�   r®   rµ   s     r(   Ú__le__z
Key.__le__Ö  r¾   r)   r‘   c                 ó.   — t        | j                  |«      S )z?Check if field value is in list: Key('field').is_in(['a', 'b']))r�   r®   ©r'   r‘   s     r(   rV   z	Key.is_inÛ  s   € ä�$—)‘)˜VÓ$Ð$r)   c                 ó.   — t        | j                  |«      S )zDCheck if field value is not in list: Key('field').not_in(['a', 'b']))r–   r®   rÄ   s     r(   rW   z
Key.not_inß  s   € ä�4—9‘9˜fÓ%Ð%r)   r¡   c                 ó.   — t        | j                  |«      S )z9Match field against regex: Key('field').regex('^pattern'))r    r®   ©r'   r¡   s     r(   r]   z	Key.regexã  s   € ä�T—Y‘Y Ó(Ð(r)   c                 ó.   — t        | j                  |«      S )z@Field should not match regex: Key('field').not_regex('^pattern'))r¦   r®   rÇ   s     r(   r^   zKey.not_regexç  s   € ä˜Ÿ	™	 7Ó+Ð+r)   c                 ó‚   — | j                   dk(  rt        |t        «      st        d«      ‚t	        | j                   |«      S )aÂ  Check if field contains a value.

        On Key.DOCUMENT: substring search (value must be a string).
        On metadata fields: checks if the array field contains the scalar value.

        Examples:
            Key.DOCUMENT.contains("machine learning")  # document substring
            Key("tags").contains("action")              # metadata array contains
            Key("scores").contains(42)                  # metadata array contains
        ú	#documentz0$contains on #document requires a string pattern)r®   rI   rT   rK   r™   rµ   s     r(   r[   zKey.containsë  s6   € ð �9‰9˜Ò#¬J°u¼cÔ,BÜÐNÓOÐOÜ˜Ÿ	™	 5Ó)Ð)r)   c                 ó‚   — | j                   dk(  rt        |t        «      st        d«      ‚t	        | j                   |«      S )aŽ  Check if field does not contain a value.

        On Key.DOCUMENT: excludes documents containing the substring.
        On metadata fields: checks that the array field does not contain the scalar value.

        Examples:
            Key.DOCUMENT.not_contains("deprecated")  # document substring exclusion
            Key("tags").not_contains("draft")         # metadata array not-contains
        rÊ   z4$not_contains on #document requires a string pattern)r®   rI   rT   rK   r�   rµ   s     r(   r\   zKey.not_containsú  s6   € ð �9‰9˜Ò#¬J°u¼cÔ,BÜÐRÓSÐSÜ˜4Ÿ9™9 eÓ,Ð,r)   N)$r*   r+   r,   rm   r-   rT   r°   rX   r³   r	   rx   r¶   r   r¹   rƒ   r»   r†   r½   rŠ   rÀ   r�   rÂ   r   r�   rV   r–   rW   r    r]   r¦   r^   r   r™   r[   r�   r\   r/   r)   r(   rU   rU   �  s(  … ñ!ðH 	ƒIØƒOØÓØƒOØƒLð˜Só ð˜#ó ð
$˜Cð $ Bó $ð$˜Cð $ Bó $ð$˜Cð $ Bó $ð%˜Cð % Có %ð$˜Cð $ Bó $ð%˜Cð % Có %ð
%˜D ™Ið %¨"ó %ð&˜T #™Yð &¨3ó &ð)˜Sð ) Uó )ð, ð ,¨ó ,ð*˜lð *¨xó *ð- ,ð -°;ô -r)   rU   ú#idrÊ   ú
#embeddingú	#metadataú#scorec                   óJ   — e Zd ZU dZee   ed<   dZee   ed<   dZ	ee   ed<   y)ÚFilterNÚuser_idsÚwhereÚwhere_document)
r*   r+   r,   rÒ   r   r   r-   rÓ   r	   rÔ   r/   r)   r(   rÑ   rÑ     s,   … à"€Hˆh�s‰mÓ"Ø€Eˆ8�C‰=ÓØ$(€N�H˜S‘MÔ(r)   rÑ   c                   ó"   — e Zd ZU eed<   eed<   y)ÚKNNÚ
embeddingsÚfetchN)r*   r+   r,   r   r-   rX   r/   r)   r(   rÖ   rÖ     s   … àÓØ„Jr)   rÖ   c                   ój   — e Zd ZU dZeed<   dZee   ed<   dee	e
f   fd„Zedee	e
f   dd fd„«       Zy)	ÚLimitr   ÚoffsetNÚlimitr!   c                 óX   — d| j                   i}| j                  �| j                  |d<   |S )z8Convert the Limit to a dictionary for JSON serializationrÛ   rÜ   ©rÛ   rÜ   ©r'   ra   s     r(   r6   zLimit.to_dict&  s,   € à˜DŸK™KÐ(ˆØ�:‰:Ð!Ø"Ÿj™jˆF�7‰OØˆr)   r8   c                 ó8  — t        | t        «      s!t        dt        | «      j                  › �«      ‚| j                  dd«      }t        |t        «      s!t        dt        |«      j                  › �«      ‚|dk  rt        d|› �«      ‚| j                  d«      }|�Dt        |t        «      s!t        dt        |«      j                  › �«      ‚|dk  rt        d|› �«      ‚ddh}t        | j                  «       «      |z
  }|rt        d	|› �«      ‚t        ||¬
«      S )zßCreate Limit from dictionary.

        Examples:
        - {"offset": 10} -> Limit(offset=10)
        - {"offset": 10, "limit": 20} -> Limit(offset=10, limit=20)
        - {"limit": 20} -> Limit(offset=0, limit=20)
        zExpected dict for Limit, got rÛ   r   z%Limit offset must be an integer, got z'Limit offset must be non-negative, got rÜ   z$Limit limit must be an integer, got z"Limit limit must be positive, got zUnexpected keys in Limit dict: rÞ   )rI   rJ   rK   rL   r*   ÚgetrX   rM   ÚsetÚkeysrÚ   )r8   rÛ   rÜ   Úallowed_keysÚunexpected_keyss        r(   rP   zLimit.from_dict-  s%  € ô ˜$¤Ô%ÜÐ;¼DÀ»J×<OÑ<OÐ;PÐQÓRÐRà—‘˜( AÓ&ˆÜ˜&¤#Ô&ÜØ7¼¸V»×8MÑ8MÐ7NÐOóð ð �AŠ:ÜÐFÀvÀhÐOÓPÐPà—‘˜Ó!ˆØÐÜ˜e¤SÔ)ÜØ:¼4À»;×;OÑ;OÐ:PÐQóð ð ˜ŠzÜ Ð#EÀeÀWÐ!MÓNÐNð ! 'Ð*ˆÜ˜dŸi™i›kÓ*¨\Ñ9ˆÙÜÐ>¸Ð>OÐPÓQÐQä˜F¨%Ô0Ð0r)   )r*   r+   r,   rÛ   rX   r-   rÜ   r   r   rT   r	   r6   rn   rP   r/   r)   r(   rÚ   rÚ   !  sW   … à€FˆCƒOØ€Eˆ8�C‰=Óð˜˜c 3˜h™ó ð ð"1˜˜S #˜X™ð "1¨7ò "1ó ñ"1r)   rÚ   c                   ój   — e Zd ZU dZeed<   dZeed<   dZeed<   dZeed<   dZ	eed<   e
defd„«       Zy	)
Ú
ProjectionFÚdocumentÚ	embeddingr   ÚrankÚurir!   c                 ó<  — t        «       }| j                  r|j                  d«       | j                  r|j                  d«       | j                  r|j                  d«       | j
                  r|j                  d«       | j                  r|j                  d«       |S )NÚ	documentsr×   Ú	metadatasÚ	distancesÚuris)rN   rè   Úappendré   r   rê   rë   )r'   Úincludess     r(   ÚincludedzProjection.included[  sm   € ä“6ˆØ�=Š=Ø�O‰O˜KÔ(Ø�>Š>Ø�O‰O˜LÔ)Ø�=Š=Ø�O‰O˜KÔ(Ø�9Š9Ø�O‰O˜KÔ(Ø�8Š8Ø�O‰O˜FÔ#Øˆr)   N)r*   r+   r,   rè   rZ   r-   ré   r   rê   rë   r.   r   ró   r/   r)   r(   rç   rç   S  sM   … à€HˆdÓØ€IˆtÓØ€HˆdÓØ€Dˆ$ÓØ€CˆÓàð˜'ò ó ñr)   rç   c                   ó‚  — e Zd ZdZdeeef   fd„Zedeeef   dd fd„«       Z	de
d eef   ddfd„Zde
eef   ddfd	„Zde
d eef   dd
fd„Zde
eef   dd
fd„Zde
d eef   ddfd„Zde
eef   ddfd„Zde
d eef   ddfd„Zde
eef   ddfd„Zdd„Zdd„Zdd„Zdd„Zd d„Zde
d eef   ddfd„Zde
d eef   ddfd„Zy)!ÚRanka   Base class for rank expressions.

    Supports arithmetic operations for combining rank expressions:
        - Addition: rank1 + rank2, rank + 0.5
        - Subtraction: rank1 - rank2, rank - 0.5
        - Multiplication: rank1 * rank2, rank * 0.8
        - Division: rank1 / rank2, rank / 2.0
        - Negation: -rank
        - Absolute value: abs(rank)

    Supports mathematical functions:
        - Exponential: rank.exp()
        - Logarithm: rank.log()
        - Maximum: rank.max(other)
        - Minimum: rank.min(other)

    Examples:
        # Weighted combination
        Knn(query=[0.1, 0.2]) * 0.8 + Val(0.5) * 0.2

        # Normalization
        Knn(query=[0.1, 0.2]) / Val(10.0)

        # Clamping
        Knn(query=[0.1, 0.2]).min(1.0).max(0.0)
    r!   c                 ó   — t        d«      ‚)zCConvert the Score expression to a dictionary for JSON serializationr3   r4   r&   s    r(   r6   zRank.to_dict‰  r7   r)   r8   c                 óŠ  — t        | t        «      s!t        dt        | «      j                  › �«      ‚| st        d«      ‚t        | «      dk7  rt        dt        | «      › �«      ‚t        t        | j                  «       «      «      }|dk(  rG| d   }t        |t        t        f«      s!t        dt        |«      j                  › �«      ‚t        |«      S |dk(  �r | d   }t        |t        «      s!t        dt        |«      j                  › �«      ‚d	|vrt        d
«      ‚|d	   }t        |t        «      rN|j                  t        «      t        k(  rt!        j"                  |«      }n™t        dt        › dt        › d|› �«      ‚t        |t$        t&        t(        j*                  f«      r7t-        |«      }|rt        |«      dkD  rt        d«      ‚t/        |«       |d   }n!t        dt        |«      j                  › �«      ‚|j                  dd«      }t        |t0        «      s!t        dt        |«      j                  › �«      ‚|j                  dd«      }t        |t        «      s!t        dt        |«      j                  › �«      ‚|dk  rt        d|› �«      ‚|j                  dd«      }t        |t2        «      s!t        dt        |«      j                  › �«      ‚t5        ||||j                  d«      |¬«      S |dk(  r™| d   }	t        |	t$        t&        f«      s!t        dt        |	«      j                  › �«      ‚t        |	«      dk  rt        d t        |	«      › �«      ‚|	D �
cg c]  }
t6        j#                  |
«      ‘Œ }}
|d   }|dd! D ]  }
||
z   }Œ	 |S |d"k(  r~| d"   }t        |t        «      s!t        d#t        |«      j                  › �«      ‚d$|vsd%|vrt        d&«      ‚t6        j#                  |d$   «      }t6        j#                  |d%   «      }||z
  S |d'k(  r™| d'   }	t        |	t$        t&        f«      s!t        d(t        |	«      j                  › �«      ‚t        |	«      dk  rt        d)t        |	«      › �«      ‚|	D �
cg c]  }
t6        j#                  |
«      ‘Œ }}
|d   }|dd! D ]  }
||
z  }Œ	 |S |d*k(  r~| d*   }t        |t        «      s!t        d+t        |«      j                  › �«      ‚d$|vsd%|vrt        d,«      ‚t6        j#                  |d$   «      }t6        j#                  |d%   «      }||z  S |d-k(  rT| d-   }t        |t        «      s!t        d.t        |«      j                  › �«      ‚t9        t6        j#                  |«      «      S |d/k(  rY| d/   }t        |t        «      s!t        d0t        |«      j                  › �«      ‚t6        j#                  |«      j;                  «       S |d1k(  rY| d1   }t        |t        «      s!t        d2t        |«      j                  › �«      ‚t6        j#                  |«      j=                  «       S |d3k(  r¥| d3   }	t        |	t$        t&        f«      s!t        d4t        |	«      j                  › �«      ‚t        |	«      dk  rt        d5t        |	«      › �«      ‚|	D �
cg c]  }
t6        j#                  |
«      ‘Œ }}
|d   }|dd! D ]  }
|j?                  |
«      }Œ |S |d6k(  r¥| d6   }	t        |	t$        t&        f«      s!t        d7t        |	«      j                  › �«      ‚t        |	«      dk  rt        d8t        |	«      › �«      ‚|	D �
cg c]  }
t6        j#                  |
«      ‘Œ }}
|d   }|dd! D ]  }
|jA                  |
«      }Œ |S t        d9|› �«      ‚c c}
w c c}
w c c}
w c c}
w ):as  Create Rank expression from dictionary.

        Supports operators:
        - {"$val": number} -> Val(number)
        - {"$knn": {...}} -> Knn(...)
        - {"$sum": [ranks]} -> rank1 + rank2 + ...
        - {"$sub": {"left": ..., "right": ...}} -> left - right
        - {"$mul": [ranks]} -> rank1 * rank2 * ...
        - {"$div": {"left": ..., "right": ...}} -> left / right
        - {"$abs": rank} -> abs(rank)
        - {"$exp": rank} -> rank.exp()
        - {"$log": rank} -> rank.log()
        - {"$max": [ranks]} -> rank1.max(rank2).max(rank3)...
        - {"$min": [ranks]} -> rank1.min(rank2).min(rank3)...
        zExpected dict for Rank, got zRank dict cannot be emptyr;   z1Rank dict must contain exactly one operator, got ú$valz$val requires a number, got ú$knnz$knn requires a dict, got Úqueryz$knn requires 'query' fieldzExpected dict with z='z', got z)$knn requires exactly one query embeddingr   zB$knn query must be a list, numpy array, or SparseVector dict, got ry   rÍ   z$knn key must be a string, got rÜ   é   z#$knn limit must be an integer, got z!$knn limit must be positive, got Úreturn_rankFz($knn return_rank must be a boolean, got Údefault)rú   ry   rÜ   rý   rü   ú$sumz$sum requires a list, got é   z$$sum requires at least 2 ranks, got Nú$subz2$sub requires a dict with 'left' and 'right', got ÚleftÚrightz'$sub requires 'left' and 'right' fieldsú$mulz$mul requires a list, got z$$mul requires at least 2 ranks, got ú$divz2$div requires a dict with 'left' and 'right', got z'$div requires 'left' and 'right' fieldsú$absz$abs requires a rank dict, got ú$expz$exp requires a rank dict, got ú$logz$log requires a rank dict, got ú$maxz$max requires a list, got z$$max requires at least 2 ranks, got ú$minz$min requires a list, got z$$min requires at least 2 ranks, got zUnknown rank operator: )!rI   rJ   rK   rL   r*   rM   rO   rQ   rR   rã   rX   rY   ÚValrá   r   r   r   rP   rN   ÚtupleÚnpÚndarrayr   r   rT   rZ   ÚKnnrõ   ÚabsÚexpÚlogÚmaxÚmin)r8   rc   rd   Úknn_datarú   Ú
normalizedry   rÜ   rü   Ú
ranks_dataÚrÚranksra   Úsub_datar  r  Údiv_dataÚ
child_datas                     r(   rP   zRank.from_dict�  sñ  € ô" ˜$¤Ô%ÜÐ:¼4À»:×;NÑ;NÐ:OÐPÓQÐQáÜÐ8Ó9Ð9äˆt‹9˜Š>ÜØCÄCÈÃIÀ;ÐOóð ô ”$�t—y‘y“{Ó#Ó$ˆà�Š<Ø˜‘LˆEÜ˜e¤c¬5 \Ô2ÜÐ">¼tÀE»{×?SÑ?SÐ>TÐ UÓVÐVÜ�u“:Ðà�6‹\Ø˜F‘|ˆHÜ˜h¬Ô-ÜÐ"<¼TÀ(»^×=TÑ=TÐ<UÐ VÓWÐWà˜hÑ&Ü Ð!>Ó?Ð?à˜WÑ%ˆEä˜%¤Ô&à—9‘9œXÓ&Ô*BÒBÜ(×2Ñ2°5Ó9‘Eô %Ø-¬h¨Z°rÔ:RÐ9SÐSZÐ[`ÐZaÐbóð ô ˜E¤D¬%´·±Ð#<Ô=ä1°%Ó8�
Ù!¤S¨£_°qÒ%8Ü$Ð%PÓQÐQô $ JÔ/à" 1™‘ô  ØXÔY]Ð^cÓYd×YmÑYmÐXnÐoóð ð —,‘,˜u lÓ3ˆCÜ˜c¤3Ô'ÜÐ"AÄ$ÀsÃ)×BTÑBTÐAUÐ VÓWÐWà—L‘L ¨"Ó-ˆEÜ˜e¤SÔ)ÜØ9¼$¸u»+×:NÑ:NÐ9OÐPóð ð ˜ŠzÜ Ð#DÀUÀGÐ!LÓMÐMà"Ÿ,™, }°eÓ<ˆKÜ˜k¬4Ô0ÜØ>¼tÀKÓ?P×?YÑ?YÐ>ZÐ[óð ô ØØØØ Ÿ™ YÓ/Ø'ôð ð �6Š\Ø˜f™ˆJÜ˜j¬4´¨-Ô8ÜØ0´°jÓ1A×1JÑ1JÐ0KÐLóð ô �:‹ Ò"Ü Ø:¼3¸z»?Ð:KÐLóð ð 1;Ö;¨1”T—^‘^ AÕ&Ð;ˆEÐ;Ø˜1‘XˆFØ˜1˜2�Yò $�Ø !™‘ð$àˆMà�6Š\Ø˜F‘|ˆHÜ˜h¬Ô-ÜØHÌÈhË×I`ÑI`ÐHaÐbóð ð ˜XÑ%¨¸Ñ)@Ü Ð!JÓKÐKä—>‘> (¨6Ñ"2Ó3ˆDÜ—N‘N 8¨GÑ#4Ó5ˆEØ˜%‘<Ðà�6Š\Ø˜f™ˆJÜ˜j¬4´¨-Ô8ÜØ0´°jÓ1A×1JÑ1JÐ0KÐLóð ô �:‹ Ò"Ü Ø:¼3¸z»?Ð:KÐLóð ð 1;Ö;¨1”T—^‘^ AÕ&Ð;ˆEÐ;Ø˜1‘XˆFØ˜1˜2�Yò $�Ø !™‘ð$àˆMà�6Š\Ø˜F‘|ˆHÜ˜h¬Ô-ÜØHÌÈhË×I`ÑI`ÐHaÐbóð ð ˜XÑ%¨¸Ñ)@Ü Ð!JÓKÐKä—>‘> (¨6Ñ"2Ó3ˆDÜ—N‘N 8¨GÑ#4Ó5ˆEØ˜%‘<Ðà�6Š\Ø˜f™ˆJÜ˜j¬$Ô/ÜØ5´d¸:Ó6F×6OÑ6OÐ5PÐQóð ô ”t—~‘~ jÓ1Ó2Ð2à�6Š\Ø˜f™ˆJÜ˜j¬$Ô/ÜØ5´d¸:Ó6F×6OÑ6OÐ5PÐQóð ô —>‘> *Ó-×1Ñ1Ó3Ð3à�6Š\Ø˜f™ˆJÜ˜j¬$Ô/ÜØ5´d¸:Ó6F×6OÑ6OÐ5PÐQóð ô —>‘> *Ó-×1Ñ1Ó3Ð3à�6Š\Ø˜f™ˆJÜ˜j¬4´¨-Ô8ÜØ0´°jÓ1A×1JÑ1JÐ0KÐLóð ô �:‹ Ò"Ü Ø:¼3¸z»?Ð:KÐLóð ð 1;Ö;¨1”T—^‘^ AÕ&Ð;ˆEÐ;Ø˜1‘XˆFØ˜1˜2�Yò '�ØŸ™ A›‘ð'àˆMà�6Š\Ø˜f™ˆJÜ˜j¬4´¨-Ô8ÜØ0´°jÓ1A×1JÑ1JÐ0KÐLóð ô �:‹ Ò"Ü Ø:¼3¸z»?Ð:KÐLóð ð 1;Ö;¨1”T—^‘^ AÕ&Ð;ˆEÐ;Ø˜1‘XˆFØ˜1˜2�Yò '�ØŸ™ A›‘ð'àˆMô Ð6°r°dÐ;Ó<Ð<ùòY <ùò< <ùòl <ùò" <s   Í"^1Ò^6Ú9^;Ý#_ rh   ÚSumc                 ój  — t        |t        t        f«      rt        |«      n|}t        | t        «      rKt        |t        «      r"t	        | j
                  |j
                  z   «      S t	        | j
                  |gz   «      S t        |t        «      rt	        | g|j
                  z   «      S t	        | |g«      S )z'Addition: rank1 + rank2 or rank + value)rI   rX   rY   r
  r  r  ©r'   rh   Ú
other_ranks      r(   Ú__add__zRank.__add__i  ó�   € ä#-¨e´c¼5°\Ô#B”S˜”ZÈˆ
ä�dœCÔ Ü˜*¤cÔ*Ü˜4Ÿ:™:¨
×(8Ñ(8Ñ8Ó9Ð9Ü�t—z‘z Z LÑ0Ó1Ð1Ü˜
¤CÔ(Ü˜�v 
× 0Ñ 0Ñ0Ó1Ð1Ü�D˜*Ð%Ó&Ð&r)   c                 ó   — t        |«      | z   S )zRight addition: value + rank©r
  rg   s     r(   Ú__radd__zRank.__radd__u  ó   € ä�5‹z˜DÑ Ð r)   ÚSubc                 ó`   — t        |t        t        f«      rt        |«      n|}t	        | |«      S )z*Subtraction: rank1 - rank2 or rank - value)rI   rX   rY   r
  r&  r  s      r(   Ú__sub__zRank.__sub__y  ó'   € ä#-¨e´c¼5°\Ô#B”S˜”ZÈˆ
Ü�4˜Ó$Ð$r)   c                 ó,   — t        t        |«      | «      S )zRight subtraction: value - rank)r&  r
  rg   s     r(   Ú__rsub__zRank.__rsub__~  ó   € ä”3�u“:˜tÓ$Ð$r)   ÚMulc                 ój  — t        |t        t        f«      rt        |«      n|}t        | t        «      rKt        |t        «      r"t	        | j
                  |j
                  z   «      S t	        | j
                  |gz   «      S t        |t        «      rt	        | g|j
                  z   «      S t	        | |g«      S )z-Multiplication: rank1 * rank2 or rank * value)rI   rX   rY   r
  r-  r  r  s      r(   Ú__mul__zRank.__mul__‚  r!  r)   c                 ó   — t        |«      | z  S )z"Right multiplication: value * rankr#  rg   s     r(   Ú__rmul__zRank.__rmul__Ž  r%  r)   ÚDivc                 ó`   — t        |t        t        f«      rt        |«      n|}t	        | |«      S )z'Division: rank1 / rank2 or rank / value)rI   rX   rY   r
  r2  r  s      r(   Ú__truediv__zRank.__truediv__’  r)  r)   c                 ó,   — t        t        |«      | «      S )zRight division: value / rank)r2  r
  rg   s     r(   Ú__rtruediv__zRank.__rtruediv__—  r,  r)   c                 ó.   — t        t        d«      | g«      S )z)Negation: -rank (equivalent to -1 * rank)éÿÿÿÿ)r-  r
  r&   s    r(   Ú__neg__zRank.__neg__›  s   € ä”C˜“G˜T�?Ó#Ð#r)   c                 ó   — t        | «      S )zAbsolute value: abs(rank)©ÚAbsr&   s    r(   Ú__abs__zRank.__abs__Ÿ  ó   € ä�4‹yÐr)   c                 ó   — t        | «      S )z"Absolute value builder: rank.abs()r;  r&   s    r(   r  zRank.abs£  r>  r)   c                 ó   — t        | «      S )zExponential: e^rank)ÚExpr&   s    r(   r  zRank.exp¨  r>  r)   c                 ó   — t        | «      S )zNatural logarithm: ln(rank))ÚLogr&   s    r(   r  zRank.log¬  r>  r)   ÚMaxc                 ój  — t        |t        t        f«      rt        |«      n|}t        | t        «      rKt        |t        «      r"t	        | j
                  |j
                  z   «      S t	        | j
                  |gz   «      S t        |t        «      rt	        | g|j
                  z   «      S t	        | |g«      S )z1Maximum of this rank and another: rank.max(rank2))rI   rX   rY   r
  rD  r  r  s      r(   r  zRank.max°  ó’   € ä#-¨e´c¼5°\Ô#B”S˜”ZÈˆ
ô �dœCÔ Ü˜*¤cÔ*Ü˜4Ÿ:™:¨
×(8Ñ(8Ñ8Ó9Ð9Ü�t—z‘z Z LÑ0Ó1Ð1Ü˜
¤CÔ(Ü˜�v 
× 0Ñ 0Ñ0Ó1Ð1Ü�D˜*Ð%Ó&Ð&r)   ÚMinc                 ój  — t        |t        t        f«      rt        |«      n|}t        | t        «      rKt        |t        «      r"t	        | j
                  |j
                  z   «      S t	        | j
                  |gz   «      S t        |t        «      rt	        | g|j
                  z   «      S t	        | |g«      S )z1Minimum of this rank and another: rank.min(rank2))rI   rX   rY   r
  rG  r  r  s      r(   r  zRank.min½  rF  r)   N)r!   r-  )r!   r<  )r!   rA  )r!   rC  )r*   r+   r,   rm   r   rT   r	   r6   rn   rP   r
   rY   rX   r   r$  r(  r+  r/  r1  r4  r6  r9  r=  r  r  r  r  r  r/   r)   r(   rõ   rõ   l  s�  „ ñð6I˜˜c 3˜h™ó Ið ðX=˜˜S #˜X™ð X=¨6ò X=ó ðX=ðv
'˜U 6¨5°#Ð#5Ñ6ð 
'¸5ó 
'ð!˜e E¨3 JÑ/ð !°Eó !ð%˜U 6¨5°#Ð#5Ñ6ð %¸5ó %ð
%˜e E¨3 JÑ/ð %°Eó %ð
'˜U 6¨5°#Ð#5Ñ6ð 
'¸5ó 
'ð!˜e E¨3 JÑ/ð !°Eó !ð%  v¨u°cÐ'9Ñ!:ð %¸uó %ð
% %¨¨s¨
Ñ"3ð %¸ó %ó$óóó
óð'˜˜v u¨cÐ1Ñ2ð '°uó 'ð'˜˜v u¨cÐ1Ñ2ð '°uô 'r)   rõ   c                   ó2   — e Zd ZU dZeed<   deeef   fd„Z	y)r<  zAbsolute value of a rankrê   r!   c                 ó:   — d| j                   j                  «       iS )Nr  ©rê   r6   r&   s    r(   r6   zAbs.to_dictÑ  ó   € Ø˜Ÿ	™	×)Ñ)Ó+Ð,Ð,r)   N©
r*   r+   r,   rm   rõ   r-   r   rT   r	   r6   r/   r)   r(   r<  r<  Ë  ó   … á"à
ƒJð-˜˜c 3˜h™ô -r)   r<  c                   ó<   — e Zd ZU dZeed<   eed<   deeef   fd„Z	y)r2  zDivision of two ranksr  r  r!   c                 óp   — d| j                   j                  «       | j                  j                  «       dœiS )Nr  ©r  r  ©r  r6   r  r&   s    r(   r6   zDiv.to_dictÜ  ó,   € Ø §¡×!2Ñ!2Ó!4¸t¿z¹z×?QÑ?QÓ?SÑTÐUÐUr)   NrM  r/   r)   r(   r2  r2  Õ  s%   … áà
ƒJØƒKðV˜˜c 3˜h™ô Vr)   r2  c                   ó2   — e Zd ZU dZeed<   deeef   fd„Z	y)rA  zExponentiation of a rankrê   r!   c                 ó:   — d| j                   j                  «       iS )Nr  rK  r&   s    r(   r6   zExp.to_dictæ  rL  r)   NrM  r/   r)   r(   rA  rA  à  rN  r)   rA  c                   ó2   — e Zd ZU dZeed<   deeef   fd„Z	y)rC  zLogarithm of a rankrê   r!   c                 ó:   — d| j                   j                  «       iS )Nr  rK  r&   s    r(   r6   zLog.to_dictð  rL  r)   NrM  r/   r)   r(   rC  rC  ê  s   … áà
ƒJð-˜˜c 3˜h™ô -r)   rC  c                   ó8   — e Zd ZU dZee   ed<   deee	f   fd„Z
y)rD  zMaximum of multiple ranksr  r!   c                 ó`   — d| j                   D �cg c]  }|j                  «       ‘Œ c}iS c c}w )Nr  ©r  r6   ©r'   r  s     r(   r6   zMax.to_dictú  ó%   € Ø¨d¯j©jÖ9¨˜Ÿ™�Ò9Ð:Ð:ùÒ9rs   N©r*   r+   r,   rm   r   rõ   r-   r   rT   r	   r6   r/   r)   r(   rD  rD  ô  ó#   … á#à�‰:Óð;˜˜c 3˜h™ô ;r)   rD  c                   ó8   — e Zd ZU dZee   ed<   deee	f   fd„Z
y)rG  zMinimum of multiple ranksr  r!   c                 ó`   — d| j                   D �cg c]  }|j                  «       ‘Œ c}iS c c}w )Nr	  rZ  r[  s     r(   r6   zMin.to_dict  r\  rs   Nr]  r/   r)   r(   rG  rG  þ  r^  r)   rG  c                   ó8   — e Zd ZU dZee   ed<   deee	f   fd„Z
y)r-  z Multiplication of multiple ranksr  r!   c                 ó`   — d| j                   D �cg c]  }|j                  «       ‘Œ c}iS c c}w )Nr  rZ  r[  s     r(   r6   zMul.to_dict  r\  rs   Nr]  r/   r)   r(   r-  r-    s#   … á*à�‰:Óð;˜˜c 3˜h™ô ;r)   r-  c                   ó¦   — e Zd ZU dZeeee   edddf   e	d<   e
j                  Zeeef   e	d<   dZee	d<   d	Zee   e	d
<   dZee	d<   deeef   fd„Zy	)r  aÇ  KNN-based ranking expression.

    Args:
        query: The query for KNN search. Can be:
               - A string (will be automatically embedded using the collection's embedding function)
               - A dense vector (list or numpy array)
               - A sparse vector (SparseVector dict)
        key: The embedding key to search against. Can be:
             - Key.EMBEDDING (default) - searches the main embedding field
             - A metadata field name (e.g., "my_custom_field") - searches that metadata field
        limit: Maximum number of results to consider (default: 16)
        default: Default score for records not in KNN results (default: None)
        return_rank: If True, return the rank position (0, 1, 2, ...) instead of distance (default: False)

    Examples:
        # Search with string query (automatically embedded)
        Knn(query="hello world")  # Will use collection's embedding function

        # Search main embeddings with vectors (equivalent forms)
        Knn(query=[0.1, 0.2])  # Uses default key="#embedding"
        Knn(query=[0.1, 0.2], key=K.EMBEDDING)
        Knn(query=[0.1, 0.2], key="#embedding")

        # Search sparse embeddings stored in metadata with string
        Knn(query="hello world", key="custom_embedding")  # Will use schema's embedding function

        # Search sparse embeddings stored in metadata with vector
        Knn(query=my_vector, key="custom_embedding")  # Example: searches a metadata field
    zNDArray[np.float32]zNDArray[np.float64]zNDArray[np.int32]rú   ry   rû   rÜ   Nrý   Frü   r!   c                 ó”  — | j                   }t        |t        «      r|j                  «       }n*t        |t        j
                  «      r|j                  «       }| j                  }t        |t        «      r|j                  }||| j                  dœ}| j                  �| j                  |d<   | j                  r| j                  |d<   d|iS )N)rú   ry   rÜ   rý   rü   rù   )rú   rI   r   r6   r  r  Útolistry   rU   r®   rÜ   rý   rü   )r'   Úquery_valueÚ	key_valuera   s       r(   r6   zKnn.to_dict?  s«   € à—j‘jˆÜ�k¤<Ô0à%×-Ñ-Ó/‰KÜ˜¤R§Z¡ZÔ0à%×,Ñ,Ó.ˆKà—H‘Hˆ	Ü�i¤Ô%Ø!Ÿ™ˆIð '¨yÀ4Ç:Á:ÑNˆð �<‰<Ð#Ø $§¡ˆF�9ÑØ×ÒØ$(×$4Ñ$4ˆF�=Ñ!à˜ÐÐr)   )r*   r+   r,   rm   r
   rT   r   rY   r   r-   ÚKr«   ry   rU   rÜ   rX   rý   r   rü   rZ   r   r	   r6   r/   r)   r(   r  r    s~   … ñð< ØØˆU‰ØØØØð	ñó ð Ÿ;™;€Cˆˆs�Cˆx‰Ó&Ø€Eˆ3ƒOØ#€GˆX�e‰_Ó#Ø€K�Óð ˜˜c 3˜h™ô  r)   r  c                   ó<   — e Zd ZU dZeed<   eed<   deeef   fd„Z	y)r&  zSubtraction of two ranksr  r  r!   c                 óp   — d| j                   j                  «       | j                  j                  «       dœiS )Nr   rQ  rR  r&   s    r(   r6   zSub.to_dict`  rS  r)   NrM  r/   r)   r(   r&  r&  Y  s%   … á"à
ƒJØƒKðV˜˜c 3˜h™ô Vr)   r&  c                   ó8   — e Zd ZU dZee   ed<   deee	f   fd„Z
y)r  zSummation of multiple ranksr  r!   c                 ó`   — d| j                   D �cg c]  }|j                  «       ‘Œ c}iS c c}w )Nrþ   rZ  r[  s     r(   r6   zSum.to_dictj  r\  rs   Nr]  r/   r)   r(   r  r  d  s#   … á%à�‰:Óð;˜˜c 3˜h™ô ;r)   r  c                   ó2   — e Zd ZU dZeed<   deeef   fd„Z	y)r
  zConstant rank valuerd   r!   c                 ó   — d| j                   iS )Nrø   )rd   r&   s    r(   r6   zVal.to_dictt  s   € Ø˜Ÿ
™
Ð#Ð#r)   N)
r*   r+   r,   rm   rY   r-   r   rT   r	   r6   r/   r)   r(   r
  r
  n  s   … áàƒLð$˜˜c 3˜h™ô $r)   r
  c                   ón   — e Zd ZU dZee   ed<   dZeed<   dZ	e
ee      ed<   dZeed<   d	eeef   fd
„Zy)ÚRrfaå  Reciprocal Rank Fusion for combining ranking strategies.

    RRF formula: score = -sum(weight_i / (k + rank_i)) for each ranking strategy
    The negative is used because RRF produces higher scores for better results,
    but Chroma uses ascending order (lower scores = better results).

    Args:
        ranks: List of Rank expressions to fuse (must have at least one)
        k: Smoothing constant (default: 60, standard in literature)
        weights: Optional weights for each ranking strategy. If not provided,
                all ranks are weighted equally (weight=1.0 each).
        normalize: If True, normalize weights to sum to 1.0 (default: False).
                  When False, weights are used as-is for relative importance.
                  When True, weights are scaled so they sum to 1.0.

    Examples:
        # Note: metadata fields (like "sparse_embedding" below) are user-defined and can store any data.
        # The field name is just an example - use whatever name matches your metadata structure.
        # Basic RRF combining KNN rankings (equal weight)
        Rrf([
            Knn(query=[0.1, 0.2], return_rank=True),
            Knn(query=another_vector, key="custom_embedding", return_rank=True)  # Example metadata field
        ])

        # Weighted RRF with relative weights (not normalized)
        Rrf(
            ranks=[
                Knn(query=[0.1, 0.2], return_rank=True),
                Knn(query=another_vector, key="custom_embedding", return_rank=True)  # Example metadata field
            weights=[2.0, 1.0],  # First ranking is 2x more important
            k=100
        )

        # Weighted RRF with normalized weights
        Rrf(
            ranks=[
                Knn(query=[0.1, 0.2], return_rank=True),
                Knn(query=another_vector, key="custom_embedding", return_rank=True)  # Example metadata field
            ],
            weights=[3.0, 1.0],  # Will be normalized to [0.75, 0.25]
            normalize=True,
            k=100
        )
    r  é<   ÚkNÚweightsFÚ	normalizer!   c                 óN  — | j                   st        d«      ‚| j                  dk  rt        d| j                  › �«      ‚| j                  �Št	        | j                  «      t	        | j                   «      k7  r8t        dt	        | j                  «      › dt	        | j                   «      › d�«      ‚t        d„ | j                  D «       «      rt        d	«      ‚| j                  r| j                  nd
gt	        | j                   «      z  }| j                  r-t        |«      }|dk(  rt        d«      ‚|D �cg c]  }||z  ‘Œ	 }}t        || j                   «      D ��cg c]  \  }}|| j                  |z   z  ‘Œ }}}|d   }|dd D ]  }||z   }Œ	 | j                  «       S c c}w c c}}w )zÂConvert RRF to a composition of existing expression operators.

        Builds: -sum(weight_i / (k + rank_i)) for each rank
        Using Python's overloaded operators for cleaner code.
        zRRF requires at least one rankr   zk must be positive, got NzNumber of weights (z) must match number of ranks (ú)c              3   ó&   K  — | ]	  }|d k  –— Œ y­w)g        Nr/   )Ú.0Úws     r(   ú	<genexpr>zRrf.to_dict.<locals>.<genexpr>¾  s   è ø€ Ò1˜q�1�s•7Ñ1ùs   ‚z All weights must be non-negativeg      ð?z3Sum of weights must be positive when normalize=Truer;   )
r  rM   rr  rs  rO   Úanyrt  ÚsumÚzipr6   )r'   rs  Ú
weight_sumry  rê   ÚtermsÚrrf_sumÚterms           r(   r6   zRrf.to_dict¬  s�  € ð �zŠzÜÐ=Ó>Ð>Ø�6‰6�QŠ;ÜÐ7¸¿¹°xÐ@ÓAÐAð �<‰<Ð#Ü�4—<‘<Ó ¤C¨¯
©
£OÒ3Ü Ø)¬#¨d¯l©lÓ*;Ð)<Ð<ZÔ[^Ð_c×_iÑ_iÓ[jÐZkÐklÐmóð ô Ñ1 D§L¡LÔ1Ô1Ü Ð!CÓDÐDð #'§,¢,�$—,’,°S°E¼CÀÇ
Á
»OÑ4Kˆð �>Š>Ü˜W›ˆJØ˜QŠÜ Ð!VÓWÐWØ/6Ö7¨!�q˜:“~Ð7ˆGÐ7ô 58¸ÀÇÁÓ4L×M©¨¨D��d—f‘f˜t‘mÓ$ÐMˆÑMð ˜a™ˆØ˜!˜"�Iò 	%ˆDØ ‘n‰Gð	%ð �×!Ñ!Ó#Ð#ùò 8ùó Ns   Ä1FÅF!)r*   r+   r,   rm   r   rõ   r-   rr  rX   rs  r   rY   rt  rZ   r   rT   r	   r6   r/   r)   r(   rp  rp  x  sN   … ñ+ðZ �‰:ÓØ€A€sƒKØ%)€GˆX�d˜5‘kÑ"Ó)Ø€IˆtÓð($˜˜c 3˜h™ô ($r)   rp  c                   óx   — e Zd ZU dZ ee¬«      Zeee	e
f      ed<   dee
ef   fd„Zedee
ef   dd fd„«       Zy)	ÚSelecta  Selection configuration for search results.

    Fields can be:
    - Key.DOCUMENT - Select document key (equivalent to Key("#document"))
    - Key.EMBEDDING - Select embedding key (equivalent to Key("#embedding"))
    - Key.SCORE - Select score key (equivalent to Key("#score"))
    - Any other string - Select specific metadata property

    Note: You can use K as an alias for Key for more concise code.

    Examples:
        # Select predefined keys using K alias (K is shorthand for Key)
        from chromadb.execution.expression import K
        Select(keys={K.DOCUMENT, K.SCORE})

        # Select specific metadata properties
        Select(keys={"title", "author", "date"})

        # Mixed selection
        Select(keys={K.DOCUMENT, "title", "author"})
    ©Údefault_factoryrã   r!   c                 óâ   — g }| j                   D ]?  }t        |t        «      r|j                  |j                  «       Œ/|j                  |«       ŒA dt        t        j                  |«      «      iS )z9Convert the Select to a dictionary for JSON serializationrã   )rã   rI   rU   rñ   r®   rN   rJ   Úfromkeys)r'   Úkey_stringsrr  s      r(   r6   zSelect.to_dictñ  sa   € ð ˆØ—‘ò 	&ˆAÜ˜!œSÔ!Ø×"Ñ" 1§6¡6Õ*à×"Ñ" 1Õ%ð		&ð œœTŸ]™]¨;Ó7Ó8Ð9Ð9r)   r8   c                 ó¦  — t        | t        «      s!t        dt        | «      j                  › �«      ‚| j                  dg «      }t        |t        t        t        f«      s!t        dt        |«      j                  › �«      ‚g }|D �]  }t        |t        «      s!t        dt        |«      j                  › �«      ‚|dk(  r |j                  t        j                  «       ŒZ|dk(  r |j                  t        j                  «       Œ|dk(  r |j                  t        j                  «       Œ¤|dk(  r |j                  t        j                  «       ŒÉ|d	k(  r |j                  t        j                   «       Œî|j                  t        |«      «       �Œ
 dh}t        | j#                  «       «      |z
  }|rt%        d
|› �«      ‚t'        t        |«      ¬«      S )zÜCreate Select from dictionary.

        Examples:
        - {"keys": ["#document", "#score"]} -> Select(keys={Key.DOCUMENT, Key.SCORE})
        - {"keys": ["title", "author"]} -> Select(keys={"title", "author"})
        zExpected dict for Select, got rã   z*Select keys must be a list/tuple/set, got z!Select key must be a string, got rÌ   rÊ   rÍ   rÎ   rÏ   z Unexpected keys in Select dict: )rã   )rI   rJ   rK   rL   r*   rá   rN   r  râ   rT   rñ   rU   r©   rª   r«   r¬   r­   rã   rM   rƒ  )r8   rã   Úkey_listrr  rä   rå   s         r(   rP   zSelect.from_dictý  s}  € ô ˜$¤Ô%ÜÐ<¼TÀ$»Z×=PÑ=PÐ<QÐRÓSÐSà�x‰x˜ Ó#ˆÜ˜$¤¤u¬cÐ 2Ô3ÜØ<¼TÀ$»Z×=PÑ=PÐ<QÐRóð ð
 ˆØó 	(ˆAÜ˜a¤Ô%ÜÐ"CÄDÈÃG×DTÑDTÐCUÐ VÓWÐWð �EŠzØ—‘¤§¡Õ'Ø�kÒ!Ø—‘¤§¡Õ-Ø�lÒ"Ø—‘¤§¡Õ.Ø�kÒ!Ø—‘¤§¡Õ-Ø�h’Ø—‘¤§	¡	Õ*ð —‘¤ A£Ö'ð#	(ð( �xˆÜ˜dŸi™i›kÓ*¨\Ñ9ˆÙÜÐ?ÀÐ?PÐQÓRÐRô œ3˜x›=Ô)Ð)r)   N)r*   r+   r,   rm   r   râ   rã   r   r
   rU   rT   r-   r   r	   r6   rn   rP   r/   r)   r(   rƒ  rƒ  ×  sc   … ññ, "'°sÔ!;€Dˆ#ˆe�C˜�H‰oÑ
Ó;ð
:˜˜c 3˜h™ó 
:ð ð,*˜˜S #˜X™ð ,*¨8ò ,*ó ñ,*r)   rƒ  rã   r!   c                 ó¾   — t        t        t        t        t        f      t        | «      «      }|D �cg c]   }t        |t        «      r|j                  n|‘Œ" c}S c c}w )z:Convert OneOrMany[Key|str] to List[str] for serialization.)r   r   r
   rU   rT   r   rI   r®   )rã   Ú	keys_listrr  s      r(   Ú_keys_to_stringsr�  0  sG   € ä”Tœ%¤¤S ™/Ñ*Ô,BÀ4Ó,HÓI€IØ9BÖC°A”j ¤CÔ(ˆA�FŠF¨aÑ/ÒCÐCùÒCs   ²%A.c                 ób   — | D �cg c]  }t        |t        «      rt        |«      n|‘Œ! c}S c c}w )z3Convert List[str] to List[Key] for deserialization.)rI   rT   rU   ©rã   rr  s     r(   Ú_strings_to_keysr�  6  s(   € à9=Ö>°A”j ¤CÔ(ŒC�ŒF¨aÑ/Ò>Ð>ùÒ>s   …$,rc   r8   c                 ó
  — ||    }t        |t        «      s#t        | › dt        |«      j                  › �«      ‚d|vrt        | › d�«      ‚d|vrt        | › d�«      ‚|d   }t        |t        t        f«      s#t        | › dt        |«      j                  › �«      ‚|st        | › d�«      ‚|d   }t        |t        «      s#t        | › dt        |«      j                  › �«      ‚|d	k  rt        | › d
|› �«      ‚t        |«      |fS )ax  Parse common fields for MinK/MaxK from dict.

    Args:
        op: The operator name (e.g., "$min_k" or "$max_k")
        data: The dict containing the operator

    Returns:
        Tuple of (keys, k) where keys is List[Union[Key, str]] and k is int

    Raises:
        TypeError: If data types are invalid
        ValueError: If required fields are missing or invalid
    z requires a dict, got rã   z requires 'keys' fieldrr  z requires 'k' fieldz keys must be a list, got z keys cannot be emptyz k must be an integer, got r   z k must be positive, got )
rI   rJ   rK   rL   r*   rM   rN   r  rX   r�  )rc   r8   Úagg_datarã   rr  s        r(   Ú_parse_k_aggregater“  ;  s"  € ð  �B‰x€HÜ�h¤Ô%Ü˜2˜$Ð4´T¸(³^×5LÑ5LÐ4MÐNÓOÐOØ�XÑÜ˜B˜4Ð5Ð6Ó7Ð7Ø
�(ÑÜ˜B˜4Ð2Ð3Ó4Ð4à�FÑ€DÜ�dœT¤5˜MÔ*Ü˜2˜$Ð8¼¸d»×9LÑ9LÐ8MÐNÓOÐOÙÜ˜B˜4Ð4Ð5Ó6Ð6à�‰€AÜ�aœÔÜ˜2˜$Ð9¼$¸q»'×:JÑ:JÐ9KÐLÓMÐMØˆA‚vÜ˜B˜4Ð8¸¸Ð<Ó=Ð=ä˜DÓ! 1Ð$Ð$r)   c                   óJ   — e Zd ZdZdeeef   fd„Zedeeef   dd fd„«       Z	y)Ú	Aggregatea5  Base class for aggregation expressions within groups.

    Aggregations determine which records to keep from each group:
    - MinK: Keep k records with minimum values (ascending order)
    - MaxK: Keep k records with maximum values (descending order)

    Examples:
        # Keep top 3 by score per group (single key)
        MinK(keys=Key.SCORE, k=3)

        # Keep top 5 by priority, then score as tiebreaker (multiple keys)
        MinK(keys=[Key("priority"), Key.SCORE], k=5)

        # Keep bottom 2 by score per group
        MaxK(keys=Key.SCORE, k=2)
    r!   c                 ó   — t        d«      ‚)zGConvert the Aggregate expression to a dictionary for JSON serializationr3   r4   r&   s    r(   r6   zAggregate.to_dictu  r7   r)   r8   c                 ó¬  — t        | t        «      s!t        dt        | «      j                  › �«      ‚| st        d«      ‚t        | «      dk7  rt        dt        | «      › �«      ‚t        t        | j                  «       «      «      }|dk(  rt        || «      \  }}t        ||¬«      S |dk(  rt        || «      \  }}t        ||¬«      S t        d|› �«      ‚)	zÖCreate Aggregate expression from dictionary.

        Supports:
        - {"$min_k": {"keys": [...], "k": n}} -> MinK(keys=[...], k=n)
        - {"$max_k": {"keys": [...], "k": n}} -> MaxK(keys=[...], k=n)
        z!Expected dict for Aggregate, got zAggregate dict cannot be emptyr;   z6Aggregate dict must contain exactly one operator, got ú$min_kr�  ú$max_kzUnknown aggregate operator: )rI   rJ   rK   rL   r*   rM   rO   rQ   rR   rã   r“  ÚMinKÚMaxK)r8   rc   rã   rr  s       r(   rP   zAggregate.from_dicty  sÓ   € ô ˜$¤Ô%ÜÐ?ÄÀTÃ
×@SÑ@SÐ?TÐUÓVÐVáÜÐ=Ó>Ð>äˆt‹9˜Š>ÜØHÌÈTËÈÐTóð ô ”$�t—y‘y“{Ó#Ó$ˆà�Š>Ü(¨¨TÓ2‰GˆD�!Ü˜T QÔ'Ð'Ø�8Š^Ü(¨¨TÓ2‰GˆD�!Ü˜T QÔ'Ð'äÐ;¸B¸4Ð@ÓAÐAr)   N)
r*   r+   r,   rm   r   rT   r	   r6   rn   rP   r/   r)   r(   r•  r•  b  sK   „ ñð"I˜˜c 3˜h™ó Ið ðB˜˜S #˜X™ð B¨;ò Bó ñBr)   r•  c                   óL   — e Zd ZU dZeeeef      ed<   e	ed<   de
eef   fd„Zy)rš  z:Keep k records with minimum aggregate key values per grouprã   rr  r!   c                 óJ   — dt        | j                  «      | j                  dœiS )Nr˜  r�  ©r�  rã   rr  r&   s    r(   r6   zMinK.to_dictŸ  ó    € ØÔ#3°D·I±IÓ#>ÀTÇVÁVÑLÐMÐMr)   N©r*   r+   r,   rm   r   r
   rU   rT   r-   rX   r   r	   r6   r/   r)   r(   rš  rš  ˜  ó3   … áDà
�E˜#˜s˜(‘OÑ
$Ó$Ø
ƒFðN˜˜c 3˜h™ô Nr)   rš  c                   óL   — e Zd ZU dZeeeef      ed<   e	ed<   de
eef   fd„Zy)r›  z:Keep k records with maximum aggregate key values per grouprã   rr  r!   c                 óJ   — dt        | j                  «      | j                  dœiS )Nr™  r�  rž  r&   s    r(   r6   zMaxK.to_dictª  rŸ  r)   Nr   r/   r)   r(   r›  r›  £  r¡  r)   r›  c                   óŒ   — e Zd ZU dZ ee¬«      Zeee	e
f      ed<   dZee   ed<   dee
ef   fd„Zedee
ef   dd fd	„«       Zy)
ÚGroupByad  Group results by metadata keys and aggregate within each group.

    Groups search results by one or more metadata fields, then applies an
    aggregation (MinK or MaxK) to select records within each group.
    The final output is flattened and sorted by score.

    Args:
        keys: Metadata key(s) to group by. Can be a single key or a list of keys.
              E.g., Key("category") or [Key("category"), Key("author")]
        aggregate: Aggregation to apply within each group (MinK or MaxK)

    Note: Both keys and aggregate must be specified together.

    Examples:
        # Top 3 documents per category (single key)
        GroupBy(
            keys=Key("category"),
            aggregate=MinK(keys=Key.SCORE, k=3)
        )

        # Top 2 per (year, category) combination (multiple keys)
        GroupBy(
            keys=[Key("year"), Key("category")],
            aggregate=MinK(keys=Key.SCORE, k=2)
        )

        # Top 1 per category by priority, score as tiebreaker
        GroupBy(
            keys=Key("category"),
            aggregate=MinK(keys=[Key("priority"), Key.SCORE], k=1)
        )
    r„  rã   NÚ	aggregater!   c                 ó¢   — | j                   r| j                  €i S dt        | j                   «      i}| j                  j                  «       |d<   |S )z:Convert the GroupBy to a dictionary for JSON serializationrã   r¦  )rã   r¦  r�  r6   rß   s     r(   r6   zGroupBy.to_dictÔ  sI   € ð �yŠy˜DŸN™NÐ2ØˆIØ"(Ô*:¸4¿9¹9Ó*EÐ!FˆØ"Ÿn™n×4Ñ4Ó6ˆˆ{ÑØˆr)   r8   c                 ó  — t        | t        «      s!t        dt        | «      j                  › �«      ‚| s
t        «       S d| vrt        d«      ‚d| vrt        d«      ‚| d   }t        |t        t        f«      s!t        dt        |«      j                  › �«      ‚|st        d«      ‚| d   }t        |t        «      s!t        dt        |«      j                  › �«      ‚t        j                  |«      }t        t        |«      |¬	«      S )
zÄCreate GroupBy from dictionary.

        Examples:
        - {} -> GroupBy() (default, no grouping)
        - {"keys": ["category"], "aggregate": {"$min_k": {"keys": ["#score"], "k": 3}}}
        zExpected dict for GroupBy, got rã   zGroupBy requires 'keys' fieldr¦  z"GroupBy requires 'aggregate' fieldz!GroupBy keys must be a list, got zGroupBy keys cannot be emptyz&GroupBy aggregate must be a dict, got )rã   r¦  )rI   rJ   rK   rL   r*   r¥  rM   rN   r  r•  rP   r�  )r8   rã   Úaggregate_datar¦  s       r(   rP   zGroupBy.from_dictÝ  s  € ô ˜$¤Ô%ÜÐ=¼dÀ4»j×>QÑ>QÐ=RÐSÓTÐTñ Ü“9Ðð ˜ÑÜÐ<Ó=Ð=Ø˜dÑ"ÜÐAÓBÐBà�F‰|ˆÜ˜$¤¤u Ô.ÜÐ?ÄÀTÃ
×@SÑ@SÐ?TÐUÓVÐVÙÜÐ;Ó<Ð<à˜kÑ*ˆÜ˜.¬$Ô/ÜØ8¼¸nÓ9M×9VÑ9VÐ8WÐXóð ô ×'Ñ'¨Ó7ˆ	äÔ,¨TÓ2¸iÔHÐHr)   )r*   r+   r,   rm   r   rN   rã   r   r
   rU   rT   r-   r¦  r   r•  r   r	   r6   rn   rP   r/   r)   r(   r¥  r¥  ®  sw   … ññB (-¸TÔ'B€Dˆ)�E˜#˜s˜(‘OÑ
$ÓBØ%)€Iˆx˜	Ñ"Ó)ð˜˜c 3˜h™ó ð ð!I˜˜S #˜X™ð !I¨9ò !Ió ñ!Ir)   r¥  )SÚdataclassesr   r   Útypingr   r   r   r   r	   r
   r   Úchromadb.base_typesr   Únumpyr  Únumpy.typingr   Úchromadb.api.typesr   r   r   r   r   r   r   r   r   r   Úchromadb.typesr   r   r   r   r1   rf   rk   rx   r   rƒ   r†   rŠ   r�   r�   r–   r™   r�   r    r¦   rU   r©   rª   r«   r¬   r­   rh  rÑ   rÖ   rÚ   rç   rõ   r<  r2  rA  rC  rD  rG  r-  r  r&  r  r
  rp  rƒ  rT   r�  r  r�  rX   r“  r•  rš  r›  r¥  r/   r)   r(   ú<module>r±     s:  ðß (ß >× >Ñ >å ,ã Ý  ÷÷ ÷ ÷ñ ð ÷
ð 
ó ð
ð ÷G!ð G!ó ðG!ðT ô@ˆ%ó @ó ð@ð ô?ˆó ?ó ð?ð ô/ˆó /ó ð/ð ô/ˆó /ó ð/ð ô/ˆó /ó ð/ð ô0ˆ%ó 0ó ð0ð ô/ˆó /ó ð/ð ô0ˆ%ó 0ó ð0ð ô0ˆó 0ó ð0ð ô1ˆ%ó 1ó ð1ð ô5ˆuó 5ó ð5ð ô9�%ó 9ó ð9ð ô4ˆEó 4ó ð4ð ô8ˆuó 8ó ð8÷w-ñ w-ñv 
ˆU‹€„Ù�;Ó€„Ù�LÓ!€„Ù�;Ó€„Ù�‹M€„	ð €ð ÷)ð )ó ð)ð ÷ð ó ðð
 ÷.1ð .1ó ð.1ðb ÷ð ó ðð0 ÷['ð ['ó ð['ð|
 ô-ˆ$ó -ó ð-ð ôVˆ$ó Vó ðVð ô-ˆ$ó -ó ð-ð ô-ˆ$ó -ó ð-ð ô;ˆ$ó ;ó ð;ð ô;ˆ$ó ;ó ð;ð ô;ˆ$ó ;ó ð;ð ôC ˆ$ó C ó ðC ðL ôVˆ$ó Vó ðVð ô;ˆ$ó ;ó ð;ð ô$ˆ$ó $ó ð$ð ô[$ˆ$ó [$ó ð[$ð| ÷R*ð R*ó ðR*ðpD˜9 U¨3°¨8¡_Ñ5ð D¸$¸s¹)ó Dð?˜5  c¡¨E°#°s°(©OÐ!;Ñ<ð ?ÀÀeÈCÐQTÈHÁoÑAVó ?ð
$%Øð$%Ø˜˜S˜‘>ð$%à
ˆ4��c˜3�h‘Ñ  #Ð%Ñ&ó$%ðN ÷2Bð 2Bó ð2Bðj ôNˆ9ó Nó ðNð ôNˆ9ó Nó ðNð ÷PIð PIó ñPIr)   