Ë
    èË€h7  ã                  ó   — 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 erd dlmZmZ d dlmZmZmZmZmZ  G d	„ d
«      Zy)é    )Úannotations)ÚTYPE_CHECKING)Úparse_into_expression)Úscale_bytes)Ú	wrap_expr)Úparse_into_datatype_expr)ÚDataTypeExprÚExpr)Ú
EndiannessÚIntoExprÚPolarsDataTypeÚSizeUnitÚTransferEncodingc                  ól   — e Zd ZdZdZdd„Zdd„Zdd„Zdd„Zddœdd	„Z	dd
„Z
ddd„Zddœ	 	 	 	 	 dd„Zy)ÚExprBinaryNameSpacez&Namespace for bin related expressions.Úbinc                ó&   — |j                   | _         y )N)Ú_pyexpr)ÚselfÚexprs     ún/var/www/html/wine-match-dev/backend/winematch-backend/venv/lib/python3.12/site-packages/polars/expr/binary.pyÚ__init__zExprBinaryNameSpace.__init__   s   € Ø—|‘|ˆó    c                ód   — t        |d¬«      }t        | j                  j                  |«      «      S )u€  
        Check if binaries in Series contain a binary substring.

        Parameters
        ----------
        literal
            The binary substring to look for

        Returns
        -------
        Expr
            Expression of data type :class:`Boolean`.

        See Also
        --------
        starts_with : Check if the binary substring exists at the start
        ends_with : Check if the binary substring exists at the end

        Examples
        --------
        >>> colors = pl.DataFrame(
        ...     {
        ...         "name": ["black", "yellow", "blue"],
        ...         "code": [b"\x00\x00\x00", b"\xff\xff\x00", b"\x00\x00\xff"],
        ...         "lit": [b"\x00", b"\xff\x00", b"\xff\xff"],
        ...     }
        ... )
        >>> colors.select(
        ...     "name",
        ...     pl.col("code").bin.contains(b"\xff").alias("contains_with_lit"),
        ...     pl.col("code").bin.contains(pl.col("lit")).alias("contains_with_expr"),
        ... )
        shape: (3, 3)
        â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”
        â”‚ name   â”† contains_with_lit â”† contains_with_expr â”‚
        â”‚ ---    â”† ---               â”† ---                â”‚
        â”‚ str    â”† bool              â”† bool               â”‚
        â•žâ•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•¡
        â”‚ black  â”† false             â”† true               â”‚
        â”‚ yellow â”† true              â”† true               â”‚
        â”‚ blue   â”† true              â”† false              â”‚
        â””â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        T©Ú
str_as_lit)r   r   r   Úbin_contains)r   Úliterals     r   ÚcontainszExprBinaryNameSpace.contains   s+   € ôX (¨¸DÔAˆÜ˜Ÿ™×2Ñ2°7Ó;Ó<Ð<r   c                ód   — t        |d¬«      }t        | j                  j                  |«      «      S )uñ  
        Check if string values end with a binary substring.

        Parameters
        ----------
        suffix
            Suffix substring.

        Returns
        -------
        Expr
            Expression of data type :class:`Boolean`.

        See Also
        --------
        starts_with : Check if the binary substring exists at the start
        contains : Check if the binary substring exists anywhere

        Examples
        --------
        >>> colors = pl.DataFrame(
        ...     {
        ...         "name": ["black", "yellow", "blue"],
        ...         "code": [b"\x00\x00\x00", b"\xff\xff\x00", b"\x00\x00\xff"],
        ...         "suffix": [b"\x00", b"\xff\x00", b"\x00\x00"],
        ...     }
        ... )
        >>> colors.select(
        ...     "name",
        ...     pl.col("code").bin.ends_with(b"\xff").alias("ends_with_lit"),
        ...     pl.col("code").bin.ends_with(pl.col("suffix")).alias("ends_with_expr"),
        ... )
        shape: (3, 3)
        â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”
        â”‚ name   â”† ends_with_lit â”† ends_with_expr â”‚
        â”‚ ---    â”† ---           â”† ---            â”‚
        â”‚ str    â”† bool          â”† bool           â”‚
        â•žâ•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•¡
        â”‚ black  â”† false         â”† true           â”‚
        â”‚ yellow â”† false         â”† true           â”‚
        â”‚ blue   â”† true          â”† false          â”‚
        â””â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        Tr   )r   r   r   Úbin_ends_with)r   Úsuffixs     r   Ú	ends_withzExprBinaryNameSpace.ends_withL   s+   € ôX ' v¸$Ô?ˆÜ˜Ÿ™×3Ñ3°FÓ;Ó<Ð<r   c                ód   — t        |d¬«      }t        | j                  j                  |«      «      S )uN  
        Check if values start with a binary substring.

        Parameters
        ----------
        prefix
            Prefix substring.

        Returns
        -------
        Expr
            Expression of data type :class:`Boolean`.

        See Also
        --------
        ends_with : Check if the binary substring exists at the end
        contains : Check if the binary substring exists anywhere

        Examples
        --------
        >>> colors = pl.DataFrame(
        ...     {
        ...         "name": ["black", "yellow", "blue"],
        ...         "code": [b"\x00\x00\x00", b"\xff\xff\x00", b"\x00\x00\xff"],
        ...         "prefix": [b"\x00", b"\xff\x00", b"\x00\x00"],
        ...     }
        ... )
        >>> colors.select(
        ...     "name",
        ...     pl.col("code").bin.starts_with(b"\xff").alias("starts_with_lit"),
        ...     pl.col("code")
        ...     .bin.starts_with(pl.col("prefix"))
        ...     .alias("starts_with_expr"),
        ... )
        shape: (3, 3)
        â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”
        â”‚ name   â”† starts_with_lit â”† starts_with_expr â”‚
        â”‚ ---    â”† ---             â”† ---              â”‚
        â”‚ str    â”† bool            â”† bool             â”‚
        â•žâ•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•¡
        â”‚ black  â”† false           â”† true             â”‚
        â”‚ yellow â”† true            â”† false            â”‚
        â”‚ blue   â”† false           â”† true             â”‚
        â””â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        Tr   )r   r   r   Úbin_starts_with)r   Úprefixs     r   Ústarts_withzExprBinaryNameSpace.starts_with{   s+   € ô\ ' v¸$Ô?ˆÜ˜Ÿ™×5Ñ5°fÓ=Ó>Ð>r   T)Ústrictc               óÆ   — |dk(  r$t        | j                  j                  |«      «      S |dk(  r$t        | j                  j                  |«      «      S d|›}t	        |«      ‚)uç  
        Decode values using the provided encoding.

        Parameters
        ----------
        encoding : {'hex', 'base64'}
            The encoding to use.
        strict
            Raise an error if the underlying value cannot be decoded,
            otherwise mask out with a null value.

        Returns
        -------
        Expr
            Expression of data type :class:`Binary`.

        Examples
        --------
        >>> colors = pl.DataFrame(
        ...     {
        ...         "name": ["black", "yellow", "blue"],
        ...         "encoded": [b"000000", b"ffff00", b"0000ff"],
        ...     }
        ... )
        >>> colors.with_columns(
        ...     pl.col("encoded").bin.decode("hex").alias("code"),
        ... )
        shape: (3, 3)
        â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”
        â”‚ name   â”† encoded   â”† code            â”‚
        â”‚ ---    â”† ---       â”† ---             â”‚
        â”‚ str    â”† binary    â”† binary          â”‚
        â•žâ•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•¡
        â”‚ black  â”† b"000000" â”† b"\x00\x00\x00" â”‚
        â”‚ yellow â”† b"ffff00" â”† b"\xff\xff\x00" â”‚
        â”‚ blue   â”† b"0000ff" â”† b"\x00\x00\xff" â”‚
        â””â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        ÚhexÚbase64ú1`encoding` must be one of {'hex', 'base64'}, got )r   r   Úbin_hex_decodeÚbin_base64_decodeÚ
ValueError)r   Úencodingr(   Úmsgs       r   ÚdecodezExprBinaryNameSpace.decode¬   s_   € ðN uÒÜ˜TŸ\™\×8Ñ8¸Ó@ÓAÐAØ˜Ò!Ü˜TŸ\™\×;Ñ;¸FÓCÓDÐDàGÈÀ|ÐTˆCÜ˜S“/Ð!r   c                óÂ   — |dk(  r#t        | j                  j                  «       «      S |dk(  r#t        | j                  j                  «       «      S d|›}t	        |«      ‚)uS  
        Encode a value using the provided encoding.

        Parameters
        ----------
        encoding : {'hex', 'base64'}
            The encoding to use.

        Returns
        -------
        Expr
            Expression of data type :class:`Binary`.

        Examples
        --------
        >>> colors = pl.DataFrame(
        ...     {
        ...         "color": ["black", "yellow", "blue"],
        ...         "code": [b"\x00\x00\x00", b"\xff\xff\x00", b"\x00\x00\xff"],
        ...     }
        ... )
        >>> colors.with_columns(
        ...     pl.col("code").bin.encode("hex").alias("encoded"),
        ... )
        shape: (3, 3)
        â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”
        â”‚ color  â”† code            â”† encoded â”‚
        â”‚ ---    â”† ---             â”† ---     â”‚
        â”‚ str    â”† binary          â”† str     â”‚
        â•žâ•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•¡
        â”‚ black  â”† b"\x00\x00\x00" â”† 000000  â”‚
        â”‚ yellow â”† b"\xff\xff\x00" â”† ffff00  â”‚
        â”‚ blue   â”† b"\x00\x00\xff" â”† 0000ff  â”‚
        â””â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        r*   r+   r,   )r   r   Úbin_hex_encodeÚbin_base64_encoder/   )r   r0   r1   s      r   ÚencodezExprBinaryNameSpace.encodeÛ   s[   € ðH uÒÜ˜TŸ\™\×8Ñ8Ó:Ó;Ð;Ø˜Ò!Ü˜TŸ\™\×;Ñ;Ó=Ó>Ð>àGÈÀ|ÐTˆCÜ˜S“/Ð!r   c                ód   — t        | j                  j                  «       «      }t        ||«      }|S )u™  
        Get the size of binary values in the given unit.

        Parameters
        ----------
        unit : {'b', 'kb', 'mb', 'gb', 'tb'}
            Scale the returned size to the given unit.

        Returns
        -------
        Expr
            Expression of data type :class:`UInt32` or `Float64`.

        Examples
        --------
        >>> from os import urandom
        >>> df = pl.DataFrame({"data": [urandom(n) for n in (512, 256, 1024)]})
        >>> df.with_columns(  # doctest: +IGNORE_RESULT
        ...     n_bytes=pl.col("data").bin.size(),
        ...     n_kilobytes=pl.col("data").bin.size("kb"),
        ... )
        shape: (4, 3)
        â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”
        â”‚ data                            â”† n_bytes â”† n_kilobytes â”‚
        â”‚ ---                             â”† ---     â”† ---         â”‚
        â”‚ binary                          â”† u32     â”† f64         â”‚
        â•žâ•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•â•â•¡
        â”‚ b"y?~B\x83\xf4V\x07\xd3\xfb\xbâ€¦ â”† 512     â”† 0.5         â”‚
        â”‚ b"\xee$4@f\xc14\x07\x8e\x88\x1â€¦ â”† 256     â”† 0.25        â”‚
        â”‚ b"\x80\xbd\xb9nEq;2\x99$\xf9\xâ€¦ â”† 1024    â”† 1.0         â”‚
        â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        )r   r   Úbin_size_bytesr   )r   ÚunitÚszs      r   ÚsizezExprBinaryNameSpace.size  s-   € ôB t—|‘|×2Ñ2Ó4Ó5ˆÜ˜˜TÓ"ˆØˆ	r   Úlittle)Ú
endiannessc               óv   — t        |«      }t        | j                  j                  |j                  |«      «      S )u±  
        Interpret a buffer as a numerical Polars type.

        Parameters
        ----------
        dtype : PolarsDataType
            Which type to interpret binary column into.
        endianness : {"big", "little"}, optional
            Which endianness to use when interpreting bytes, by default "little".

        Returns
        -------
        Expr
            Expression of data type `dtype`.
            Note that if binary array is too short value will be null.
            If binary array is too long, remainder will be ignored.

        Examples
        --------
        >>> df = pl.DataFrame({"data": [b"\x05\x00\x00\x00", b"\x10\x00\x01\x00"]})
        >>> df.with_columns(  # doctest: +IGNORE_RESULT
        ...     bin2int=pl.col("data").bin.reinterpret(
        ...         dtype=pl.Int32, endianness="little"
        ...     ),
        ... )
        shape: (2, 2)
        â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”
        â”‚ data                â”† bin2int â”‚
        â”‚ ---                 â”† ---     â”‚
        â”‚ binary              â”† i32     â”‚
        â•žâ•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•¡
        â”‚ b"\x05\x00\x00\x00" â”† 5       â”‚
        â”‚ b"\x10\x00\x01\x00" â”† 65552   â”‚
        â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        )r   r   r   Úfrom_bufferÚ_pydatatype_expr)r   Údtyper=   s      r   ÚreinterpretzExprBinaryNameSpace.reinterpret,  s1   € ôL )¨Ó/ˆä˜Ÿ™×1Ñ1°%×2HÑ2HÈ*ÓUÓVÐVr   N)r   r
   ÚreturnÚNone)r   r   rC   r
   )r"   r   rC   r
   )r&   r   rC   r
   )r0   r   r(   ÚboolrC   r
   )r0   r   rC   r
   )Úb)r9   r   rC   r
   )rA   zPolarsDataType | DataTypeExprr=   r   rC   r
   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	_accessorr   r   r#   r'   r2   r6   r;   rB   © r   r   r   r      sb   „ Ù0à€Ió$ó-=ó^-=ó^/?ðb DHõ -"ó^*"ôX#ðL QYñ(WØ5ð(WØCMð(Wà	ô(Wr   r   N)Ú
__future__r   Útypingr   Úpolars._utils.parser   Úpolars._utils.variousr   Úpolars._utils.wrapr   Úpolars.datatypesr   Úpolarsr	   r
   Úpolars._typingr   r   r   r   r   r   rL   r   r   ú<module>rU      s5   ðÝ "å  å 5Ý -Ý (Ý 5áß)÷õ ÷Wò Wr   