§
    ™Štj  ã                  óX   — d Z ddlmZ ddlZddlZddlmZ ddlmZ  G d„ d¦  «        Z	dS )zJSON text splitter.é    )ÚannotationsN)ÚAny)ÚDocumentc                  óº   ‡ — e Zd ZU dZdZded<   	 dZded<   	 	 d)d*ˆ fd„Zed+d„¦   «         Z	ed,d„¦   «         Z
d-d„Z	 	 d.d/d„Z	 d0d1d „Z	 	 d2d3d#„Z	 	 	 d4d5d(„Zˆ xZS )6ÚRecursiveJsonSplitteraž  Splits JSON data into smaller, structured chunks while preserving hierarchy.

    This class provides methods to split JSON data into smaller dictionaries or
    JSON-formatted strings based on configurable maximum and minimum chunk sizes.
    It supports nested JSON structures, optionally converts lists into dictionaries
    for better chunking, and allows the creation of document objects for further use.
    éÐ  ÚintÚmax_chunk_sizei  Úmin_chunk_sizeNú
int | NoneÚreturnÚNonec                óŽ   •— t          ¦   «                              ¦   «          || _        |�|nt          |dz
  d¦  «        | _        dS )a  Initialize the chunk size configuration for text processing.

        This constructor sets up the maximum and minimum chunk sizes, ensuring that
        the `min_chunk_size` defaults to a value slightly smaller than the
        `max_chunk_size` if not explicitly provided.

        Args:
            max_chunk_size: The maximum size for a chunk.
            min_chunk_size: The minimum size for a chunk.

                If `None`, defaults to the maximum chunk size minus 200, with a lower
                bound of 50.
        NéÈ   é2   )ÚsuperÚ__init__r
   Úmaxr   )Úselfr
   r   Ú	__class__s      €ú[/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_text_splitters/json.pyr   zRecursiveJsonSplitter.__init__   sR   ø€ õ  	‰Œ×ÒÑÔÐØ,ˆÔð Ð)ð ˆNå�^ cÑ)¨2Ñ.Ô.ð 	ÔÐÐó    Údataúdict[str, Any]c                óD   — t          t          j        | ¦  «        ¦  «        S )z1Calculate the size of the serialized JSON object.)ÚlenÚjsonÚdumps)r   s    r   Ú
_json_sizez RecursiveJsonSplitter._json_size5   s   € õ •4”:˜dÑ#Ô#Ñ$Ô$Ð$r   ÚdÚpathú	list[str]Úvaluer   c                ób   — |dd…         D ]}|                       |i ¦  «        } Œ|| |d         <   dS )z;Set a value in a nested dictionary based on the given path.Néÿÿÿÿ)Ú
setdefault)r    r!   r#   Úkeys       r   Ú_set_nested_dictz&RecursiveJsonSplitter._set_nested_dict:   sA   € ð ˜˜˜”9ð 	&ð 	&ˆCØ—’˜S "Ñ%Ô%ˆAˆAØˆˆ$ˆrŒ(‰ˆˆr   c                óÒ   ‡ — t          |t          ¦  «        r ˆ fd„|                     ¦   «         D ¦   «         S t          |t          ¦  «        rˆ fd„t	          |¦  «        D ¦   «         S |S )Nc                óB   •— i | ]\  }}|‰                      |¦  «        “ŒS © )Ú_list_to_dict_preprocessing)Ú.0ÚkÚvr   s      €r   ú
<dictcomp>zERecursiveJsonSplitter._list_to_dict_preprocessing.<locals>.<dictcomp>K   s-   ø€ ÐTÐTÐT¹t¸qÀ!�A�t×7Ò7¸Ñ:Ô:ÐTÐTÐTr   c                ó\   •— i | ](\  }}t          |¦  «        ‰                     |¦  «        “Œ)S r+   )Ústrr,   )r-   ÚiÚitemr   s      €r   r0   zERecursiveJsonSplitter._list_to_dict_preprocessing.<locals>.<dictcomp>N   sC   ø€ ð ð ð á�A�tõ �A‘”˜×8Ò8¸Ñ>Ô>ðð ð r   )Ú
isinstanceÚdictÚitemsÚlistÚ	enumerate)r   r   s   ` r   r,   z1RecursiveJsonSplitter._list_to_dict_preprocessingE   s„   ø€ õ �d�DÑ!Ô!ð 	UàTÐTÐTÐTÀtÇzÂzÁ|Ä|ÐTÑTÔTÐTÝ�d�DÑ!Ô!ð 	ðð ð ð å(¨™œðñ ô ð ð
 ˆr   Úcurrent_pathúlist[str] | NoneÚchunksúlist[dict[str, Any]] | Noneúlist[dict[str, Any]]c                óø  — |pg }|�|ni g}t          |t          ¦  «        rº|r¸|                     ¦   «         D ]¢\  }}g |¢|‘}|                      |d         ¦  «        }|                      ||i¦  «        }| j        |z
  }	||	k     r|                      |d         ||¦  «         Œk|| j        k    r|                     i ¦  «         |                      |||¦  «         Œ£n|r|                      |d         ||¦  «         |S )zESplit json into maximum size dictionaries while preserving structure.Nr%   )	r5   r6   r7   r   r
   r(   r   ÚappendÚ_json_split)
r   r   r:   r<   r'   r#   Únew_pathÚ
chunk_sizeÚsizeÚ	remainings
             r   rA   z!RecursiveJsonSplitter._json_splitU   s2  € ð $Ð) rˆØ!Ð-��°B°4ˆÝ�d�DÑ!Ô!ð 	B dð 	BØ"Ÿjšj™lœlð >ð >‘
��UØ/˜\Ð/¨3Ð/�Ø!Ÿ_š_¨V°B¬ZÑ8Ô8�
Ø—’¨¨U |Ñ4Ô4�Ø Ô/°*Ñ<�	à˜)Ò#Ð#à×)Ò)¨&°¬*°hÀÑFÔFÐFÐFà! TÔ%8Ò8Ð8àŸš bÑ)Ô)Ð)ð ×$Ò$ U¨H°fÑ=Ô=Ð=Ð=ð>ð" ð 	BØ×!Ò! &¨¤*¨l¸DÑAÔAÐAØˆr   FÚ	json_dataÚconvert_listsÚboolc                ó¾   — |r)|                       |                      |¦  «        ¦  «        }n|                       |¦  «        }|d         s|                     ¦   «          |S )a  Splits JSON into a list of JSON chunks.

        Args:
            json_data: The JSON data to be split.
            convert_lists: Whether to convert lists in the JSON to dictionaries
                before splitting.

        Returns:
            A list of JSON chunks.
        r%   )rA   r,   Úpop)r   rF   rG   r<   s       r   Ú
split_jsonz RecursiveJsonSplitter.split_jsont   sb   € ð ð 	1Ø×%Ò% d×&FÒ&FÀyÑ&QÔ&QÑRÔRˆFˆFà×%Ò% iÑ0Ô0ˆFð �bŒzð 	Ø�JŠJ‰LŒLˆLØˆr   TÚensure_asciic                óN   ‡— |                       ||¬¦  «        }ˆfd„|D ¦   «         S )a~  Splits JSON into a list of JSON formatted strings.

        Args:
            json_data: The JSON data to be split.
            convert_lists: Whether to convert lists in the JSON to dictionaries
                before splitting.
            ensure_ascii: Whether to ensure ASCII encoding in the JSON strings.

        Returns:
            A list of JSON formatted strings.
        )rF   rG   c                ó<   •— g | ]}t          j        |‰¬ ¦  «        ‘ŒS ))rL   )r   r   )r-   ÚchunkrL   s     €r   ú
<listcomp>z4RecursiveJsonSplitter.split_text.<locals>.<listcomp>¡   s(   ø€ ÐQÐQÐQÀ•”
˜5¨|Ð<Ñ<Ô<ÐQÐQÐQr   )rK   )r   rF   rG   rL   r<   s      ` r   Ú
split_textz RecursiveJsonSplitter.split_text�   s7   ø€ ð" —’¨9ÀM�ÑRÔRˆð RÐQÐQÐQÈ&ÐQÑQÔQÐQr   ÚtextsÚ	metadatasúlist[dict[Any, Any]] | Noneúlist[Document]c                ó  — |pi gt          |¦  «        z  }g }t          |¦  «        D ]`\  }}|                      |||¬¦  «        D ]B}	t          j        ||         ¦  «        }
t          |	|
¬¦  «        }|                     |¦  «         ŒCŒa|S )aæ  Create a list of `Document` objects from a list of json objects (`dict`).

        Args:
            texts: A list of JSON data to be split and converted into documents.
            convert_lists: Whether to convert lists to dictionaries before splitting.
            ensure_ascii: Whether to ensure ASCII encoding in the JSON strings.
            metadatas: Optional list of metadata to associate with each document.

        Returns:
            A list of `Document` objects.
        )rF   rG   rL   )Úpage_contentÚmetadata)r   r9   rQ   ÚcopyÚdeepcopyr   r@   )r   rR   rG   rL   rS   Ú
metadatas_Ú	documentsr3   ÚtextrO   rX   Únew_docs               r   Úcreate_documentsz&RecursiveJsonSplitter.create_documents£   s¯   € ð$ Ð3 2 $­¨U©¬Ñ"3ˆ
Øˆ	Ý  Ñ'Ô'ð 	*ð 	*‰GˆAˆtØŸšØ¨mÈ,ð )ñ ô ð *ð *�õ  œ=¨°A¬Ñ7Ô7�Ý"°ÀÐIÑIÔI�Ø× Ò  Ñ)Ô)Ð)Ð)ð*ð Ðr   )r   N)r
   r	   r   r   r   r   )r   r   r   r	   )r    r   r!   r"   r#   r   r   r   )r   r   r   r   )NN)r   r   r:   r;   r<   r=   r   r>   )F)rF   r   rG   rH   r   r>   )FT)rF   r   rG   rH   rL   rH   r   r"   )FTN)
rR   r>   rG   rH   rL   rH   rS   rT   r   rU   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   Ú__annotations__r   r   Ústaticmethodr   r(   r,   rA   rK   rQ   r_   Ú__classcell__)r   s   @r   r   r      s_  ø€ € € € € € ðð ð €NÐÐÐÑØ*à€NÐÐÐÑðð
 HLð
ð 
ð 
ð 
ð 
ð 
ð 
ð0 ð%ð %ð %ñ „\ð%ð ðð ð ñ „\ððð ð ð ð& *.Ø.2ð	ð ð ð ð ðD $ðð ð ð ð ð8 $Ø!ð	Rð Rð Rð Rð Rð2 $Ø!Ø15ðð ð ð ð ð ð ð ð r   r   )
rc   Ú
__future__r   rY   r   Útypingr   Úlangchain_core.documentsr   r   r+   r   r   ú<module>rj      s�   ðØ Ð à "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð à -Ð -Ð -Ð -Ð -Ð -ðrð rð rð rð rñ rô rð rð rð rr   