
    IgX                    X    d dl mZ d dlZd dlZd dlmZmZmZmZ d dl	m
Z
  G d d      Zy)    )annotationsN)AnyDictListOptional)Documentc                       e Zd Z	 d		 	 	 d
 fdZedd       Zedd       ZddZ	 	 d	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZ		 	 d	 	 	 	 	 	 	 ddZ
	 	 	 d	 	 	 	 	 	 	 	 	 ddZ xZS )RecursiveJsonSplitterc                l    t         |           || _        ||| _        y t        |dz
  d      | _        y )N   2   )super__init__max_chunk_sizemaxmin_chunk_size)selfr   r   	__class__s      Z/var/www/html/answerous/venv/lib/python3.12/site-packages/langchain_text_splitters/json.pyr   zRecursiveJsonSplitter.__init__   sF     	, )  	 ^c)2. 	    c                >    t        t        j                  |             S )z1Calculate the size of the serialized JSON object.)lenjsondumps)datas    r   
_json_sizez RecursiveJsonSplitter._json_size   s     4::d#$$r   c                L    |dd D ]  }| j                  |i       }  || |d   <   y)z;Set a value in a nested dictionary based on the given path.N)
setdefault)dpathvaluekeys       r   _set_nested_dictz&RecursiveJsonSplitter._set_nested_dict   s6     9 	&CS"%A	&$r(r   c                2   t        |t              r3|j                         D ci c]  \  }}|| j                  |       c}}S t        |t              r7t        |      D ci c]   \  }}t        |      | j                  |      " c}}S |S c c}}w c c}}w )N)
isinstancedictitems_list_to_dict_preprocessinglist	enumeratestr)r   r   kviitems         r   r)   z1RecursiveJsonSplitter._list_to_dict_preprocessing"   s    dD!GKzz|Ttq!At77::TTd#  )At A88>>  K Us   B"%Bc                   |xs g }||ni g}t        |t              r|j                         D ]  \  }}||gz   }| j                  |d         }| j                  ||i      }| j                  |z
  }	||	k  r| j                  |d   ||       ^|| j                  k\  r|j                  i        | j                  |||        |S | j                  |d   ||       |S )zW
        Split json into maximum size dictionaries while preserving structure.
        r   )	r&   r'   r(   r   r   r$   r   append_json_split)
r   r   current_pathchunksr#   r"   new_path
chunk_sizesize	remainings
             r   r3   z!RecursiveJsonSplitter._json_split0   s     $)r!-B4dD!"jjl >
U'3%/!__VBZ8
U|4 //*<	)#))&*hF!T%8%88b) $$UHf=>&  !!&*lDAr   c                    |r!| j                  | j                  |            }n| j                  |      }|d   s|j                          |S )z&Splits JSON into a list of JSON chunksr   )r3   r)   pop)r   	json_dataconvert_listsr5   s       r   
split_jsonz RecursiveJsonSplitter.split_jsonQ   sI     %%d&F&Fy&QRF%%i0F bzJJLr   c                |    | j                  ||      }|D cg c]  }t        j                  ||       c}S c c}w )z1Splits JSON into a list of JSON formatted strings)r<   r=   )ensure_ascii)r>   r   r   )r   r<   r=   r@   r5   chunks         r   
split_textz RecursiveJsonSplitter.split_textb   s9     9MR KQQ

5|<QQQs   9c                    |xs i gt        |      z  }g }t        |      D ]T  \  }}| j                  |||      D ]8  }	t        j                  ||         }
t        |	|
      }|j                  |       : V |S )z4Create documents from a list of json objects (Dict).)r<   r=   r@   )page_contentmetadata)r   r+   rB   copydeepcopyr   r2   )r   textsr=   r@   	metadatas
_metadatas	documentsr/   textrA   rE   new_docs               r   create_documentsz&RecursiveJsonSplitter.create_documentso   s     32$U"3
	 ' 	*GAtm, )  *  ==A7"I  )*	* r   )i  N)r   intr   zOptional[int])r   r   returnrO   )r    r   r!   	List[str]r"   r   rP   None)r   r   rP   r   )NN)r   Dict[str, Any]r4   zOptional[List[str]]r5   zOptional[List[Dict]]rP   
List[Dict])F)r<   rS   r=   boolrP   rT   )FT)r<   rS   r=   rU   r@   rU   rP   rQ   )FTN)
rH   rT   r=   rU   r@   rU   rI   zOptional[List[dict]]rP   zList[Document])__name__
__module____qualname__r   staticmethodr   r$   r)   r3   r>   rB   rN   __classcell__)r   s   @r   r
   r
   
   s   JN	
!	
:G	
 % %  " -1'+	 * %	
 
H $!  
	( $!	R!R R 	R
 
R  $!*.  	
 ( 
r   r
   )
__future__r   rF   r   typingr   r   r   r   langchain_core.documentsr   r
    r   r   <module>r_      s#    "   , , -v vr   