
    NgX                    `    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dS )    )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/d0dZ		 	 d1d2d"Z
	 	 	 d3d4d'Z xZS )5RecursiveJsonSplitter  Nmax_chunk_sizeintmin_chunk_sizeOptional[int]c                    t                                                       || _        ||nt          |dz
  d          | _        d S )N   2   )super__init__r   maxr   )selfr   r   	__class__s      Y/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_text_splitters/json.pyr   zRecursiveJsonSplitter.__init__   sR     	, ) N^c)2.. 	    datar   returnc                D    t          t          j        |                     S )z1Calculate the size of the serialized JSON object.)lenjsondumps)r   s    r   
_json_sizez RecursiveJsonSplitter._json_size   s     4:d##$$$r   dpath	List[str]valuer   Nonec                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"%%AA$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>%   s-    TTTtq!At77::TTTr   c                \    i | ](\  }}t          |                              |          )S r-   )strr.   )r/   iitemr   s      r   r2   zERecursiveJsonSplitter._list_to_dict_preprocessing.<locals>.<dictcomp>(   sC       At A88>>  r   )
isinstancedictitemslist	enumerate)r   r   s   ` r   r.   z1RecursiveJsonSplitter._list_to_dict_preprocessing"   s    dD!! 	TTTTtzz||TTTTd## 	   (    Kr   Dict[str, Any]current_pathOptional[List[str]]chunksOptional[List[Dict]]
List[Dict]c                   |pg }||ni g}t          |t                    r|                                D ]\  }}||gz   }|                     |d                   }|                     ||i          }| j        |z
  }	||	k     r|                     |d         ||           k|| j        k    r|                    i            |                     |||           n|                     |d         ||           |S )zW
        Split json into maximum size dictionaries while preserving structure.
        Nr'   )	r7   r8   r9   r    r   r*   r   append_json_split)
r   r   r=   r?   r)   r$   new_path
chunk_sizesize	remainings
             r   rD   z!RecursiveJsonSplitter._json_split0   s    $)r!-B4dD!! 	B"jjll > >
U'3%/!__VBZ88
U|44 /*<	)##))&*hFFFF!T%888b))) $$UHf====>$ !!&*lDAAAr   F	json_dataconvert_listsboolc                    |r)|                      |                     |                    }n|                      |          }|d         s|                                 |S )z&Splits JSON into a list of JSON chunksr'   )rD   r.   pop)r   rI   rJ   r?   s       r   
split_jsonz RecursiveJsonSplitter.split_jsonQ   sb      	1%%d&F&Fy&Q&QRRFF%%i00F bz 	JJLLLr   Tensure_asciic                N    |                      ||          }fd|D             S )z1Splits JSON into a list of JSON formatted strings)rI   rJ   c                <    g | ]}t          j        |           S ))rO   )r   r   )r/   chunkrO   s     r   
<listcomp>z4RecursiveJsonSplitter.split_text.<locals>.<listcomp>m   s(    QQQ
5|<<<QQQr   )rN   )r   rI   rJ   rO   r?   s      ` r   
split_textz RecursiveJsonSplitter.split_textb   s7     9MRR RQQQ&QQQQr   texts	metadatasOptional[List[dict]]List[Document]c                   |pi gt          |          z  }g }t          |          D ]`\  }}|                     |||          D ]B}	t          j        ||                   }
t          |	|
          }|                    |           Ca|S )z4Create documents from a list of json objects (Dict).)rI   rJ   rO   )page_contentmetadata)r   r;   rT   copydeepcopyr   rC   )r   rU   rJ   rO   rV   
_metadatas	documentsr5   textrR   r[   new_docs               r   create_documentsz&RecursiveJsonSplitter.create_documentso   s     32$U"3
	 '' 	* 	*GAt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   )NN)r   r<   r=   r>   r?   r@   r   rA   )F)rI   r<   rJ   rK   r   rA   )FT)rI   r<   rJ   rK   rO   rK   r   r#   )FTN)
rU   rA   rJ   rK   rO   rK   rV   rW   r   rX   )__name__
__module____qualname__r   staticmethodr    r*   r.   rD   rN   rT   rb   __classcell__)r   s   @r   r
   r
   
   s#       JN	
 	
 	
 	
 	
 	
 	
 % % % \%    \   " -1'+	    H $    ( $!	R R R R R  $!*.        r   r
   )
__future__r   r\   r   typingr   r   r   r   langchain_core.documentsr   r
   r-   r   r   <module>rk      s    " " " " " "   , , , , , , , , , , , , - - - - - -v v v v v v v v v vr   