
    5j{0                     z   S SK r S SKJr  S SKJr  S SKJr  S SKJrJ	r	J
r
JrJrJr  S SKrSSKJr  SSKJr  SS	KJr  S
SKJr  S
SKJr  S
SKJrJrJr  S
SKJr  \(       a  S
SK J!r!J"r"  \ RF                   " S S5      5       r$\ RF                   " S S5      5       r%\ RF                   " S S5      5       r&S\'S\'S\&S\\   S\\(   S\(S\S\\	   4S jr)\ RF                   " S S 5      5       r*S!\	S"\RV                  4S# jr,S!\	S"\RV                  4S$ jr-S% r.S!\	S"\RV                  4S& jr/S!\	S"\RV                  4S' jr0S"\RV                  4S( jr1\*" \" \Rd                  \Rf                  5      5      r4\*" \" \Rj                  \Rf                  5      5      r6\*" \" \Rd                  \Rn                  5      5      r8S)\S"\*4S* jr9g)+    N)deepcopy)partial)product)ListAnyDictUnionCallableTYPE_CHECKING   )DFBuildType)
HeaderType)DataGridType   )make_create_adc_headers)	LayerType)get_unique_listconvert_dtypesconvert_str_to_timestamp)TimestampOrNaTHeadersCLIndexHeadersCLDateAsIndexc                       \ rS rSr% Sr\R                  " S\S9r\	\
\\   4   \S'   S\
S\\   4S jrS\
S	\4S
 jrSrg)	CacheItem   zData cache item.Finitdefault_factoryfields_by_instinstfieldsc                      X R                   U'   g)z
Add cache item as an instance:fields key-value pair.

Parameters
----------
inst : str
    Instance name.
fields : List[Any]
    Instance fields.
Nr    )selfr!   r"   s      \/root/lseg-credit/backend/venv/lib/python3.13/site-packages/lseg/data/content/_df_builder.pyaddCacheItem.add   s     %+D!    returnc                     XR                   ;   $ )z
Boolean that indicates is the instance stored in cache item or not.

Parameters
----------
inst : str
    Instance name.

Returns
-------
bool
    True if instance is already stored, False otherwise.

r$   )r%   r!   s     r&   hasCacheItem.has(   s     ****r)    N)__name__
__module____qualname____firstlineno____doc__dataclassesfielddictr    r   strr   r   __annotations__r'   boolr,   __static_attributes__r.   r)   r&   r   r      sT    +6+<+<%Y]+^NDd3i(^+ +T#Y ++ + +r)   r   c                   ~    \ rS rSr% Sr\R                  " S\S9r\	\
   \S'   S\S\	\   4S jrS\4S	 jrS
 rS rSrg)
CacheItems:   z"Container for CacheItem instances.Fr   _itemsr!   r"   c                 p    [        5       nUR                  X5        U R                  R                  U5        g)zAdd item as a key-value pair to CacheItems container.

Parameters
----------
inst : str
    Instance name.
fields : List[Any]
    Instance fields.
N)r   r'   r>   append)r%   r!   r"   items       r&   r'   CacheItems.add@   s)     {4 r)   c                 z    U R                    H  nUR                  U5      (       a  M  Us  $    [        SU S35      e)z
Gets cache item without particular instance.

Parameters
----------
inst : str
    Instance name.

Returns
-------
item : CacheItem
    CacheItem that does not contain particular instance.

zCannot get item without inst=.)r>   r,   
ValueError)r%   r!   rA   s      r&   get_item_withoutCacheItems.get_item_withoutN   s;     KKD88D>>   8a@AAr)   c                     SU l         U $ )Nr   _n)r%   s    r&   __iter__CacheItems.__iter__c   s    r)   c                     U R                   [        U R                  5      :  a0  U R                  U R                      nU =R                   S-  sl         U$ [        e)Nr   )rJ   lenr>   StopIteration)r%   results     r&   __next__CacheItems.__next__g   sA    77S%%[[)FGGqLGMr)   rI   N)r/   r0   r1   r2   r3   r4   r5   listr>   r   r   r8   r7   r   r'   rF   rK   rQ   r:   r.   r)   r&   r<   r<   :   sO    ,)//UDQFDOQ! !T#Y !BS B*r)   r<   c                       \ rS rSr% Sr\R                  " S\S9r\	\
\4   \S'   S\
S\S\4S	 jrS\
S\S
\\   4S jrS\
S\S
\\   S\S\\   S\\   4S jrSrg)	DateCacheo   a  
Cache for data items that belong to particular date.

DateCache has the following structure:

Example
-------
DateCache {
    'date_1': CacheItems [
        CacheItem {
            dict {
                'inst_A': [1, 2, 3],
                'inst_B': [1, 2, 3]
            }
        },
        CacheItem {
            dict {
                'inst_A': [1, 2, 3]
            }
        }
    ]
}
Fr   _cachedater!   r*   c                     U R                   R                  U[        5       5       H  nUR                  U5      (       a  M    g   g)aF  
Boolean that indicates can item fields be updated or not.

Parameters
----------
date : TimestampOrNaT
    Date string to retrieve a bunch of items that belong to this date.
inst : str
    Instance name to check if CacheItems has this instance or not.

Returns
-------
bool
    True if fields can be updated, False otherwise
TF)rW   getr<   r,   )r%   rX   r!   rA   s       r&   can_update_fieldsDateCache.can_update_fields   s4      KKOOD*,7D88D>> 8 r)   r"   c                 n    U R                   R                  U[        5       5      nUR                  X#5        g)zAdd items to CacheItems container in data cache during initialization.

Parameters
----------
date : TimestampOrNaT
    Date string.
inst : str
    Instance name.
fields : List[Any]
    Instance fields, filled according template.
N)rW   
setdefaultr<   r'   )r%   rX   r!   r"   itemss        r&   r'   DateCache.add   s(     &&tZ\:		$r)   num_columnsunique_instsc                 H  ^ U R                   U   R                  U5      R                  n[        U4S jUR	                  5        5       5      nTU   nXh   n	TR                  U5      nTR                  U5      n
X-  U-   nXt-  U-   n[        X5       H	  nX7   X'   M     XU'   U	$ )ar  Updates fields in data cache and returns updated ones.

Parameters
----------
date : TimestampOrNaT
    Date string.
inst : str
    Instance name.
fields : List[Any]
    Fields list.
num_columns : int
    Data columns quantity.
unique_insts : List[str]
    List of unique instances across dataframe.

Returns
-------
cache_fields : List[Any]
    List of updated fields.
c              3   F   >#    U  H  nTR                  U5      v   M     g 7fN)index).0r!   rb   s     r&   	<genexpr>*DateCache.update_fields.<locals>.<genexpr>   s!     M7Lt,$$T**7Ls   !)rW   rF   r    maxkeysrf   range)r%   rX   r!   r"   ra   rb   r    idx
cache_instcache_fields	cache_idxleft_idx	right_idxs        `       r&   update_fieldsDateCache.update_fields   s    8 T*;;DAPPM~7J7J7LMM!#&
%1  & &&z2	*[8%3	-C &L .  ,tr)   r.   N)r/   r0   r1   r2   r3   r4   r5   r6   rW   r   r   r<   r8   r7   r9   r[   r   r   r'   intrs   r:   r.   r)   r&   rU   rU   o   s    0 0;/@/@e]a/bFD+,bn C D ,   c  49  ** * S		*
 * 3i* 
c*r)   rU   num_unique_instsra   
date_cacherf   rb   r!   rX   r"   c                    SnU S:  a  X-  n	[         R                  /U	-  n
UR                  U5      nX-  U-   nX-  n[        U[	        X5      5       H	  u  pXU'   M     U
nUR                  Xe5      (       a  SnUR                  XeXqU5      nXx4$ UR                  XeU5        UR                  U5         Xx4$ UR                  U5        Xx4$ )NTr   F)	pdNArf   ziprl   r[   rs   r'   r@   )rv   ra   rw   rf   rb   r!   rX   r"   is_addtotaltemplaterm   rr   rq   rA   s                  r&   partial_process_indexr      s     F! .EE7U?  &%3	$VU8%?@ID SM A ''33F--d&|\F > NN4v.LL
 > 	T>r)   c            	           \ rS rSr% \\\\/\S   4   \	S'   \R                  4S\SSS\R                  4S jjr\R                  S	4S\SSS
\S\R                  4S jjrSrg)ADCDFBuilderi  r   create_headersraw_dataheader_typer   r*   c                    / nU R                  [        R                  X5      nUR                  S/ 5       Hl  n[	        U5      n[        U5       H  u  pxUb  M
  [        R                  Xg'   M     UR                   H  n[        Xg   5      Xg'   M     UR                  U5        Mn     [        R                  " XER                  R                  S9n	[        U	5      n	U	$ )Ndata)r   columns)r   r   INDEXrZ   rS   	enumeratery   rz   	date_idxsr   r@   	DataFramenamesr   r   )
r%   r   r   _r   headersr"   rm   rA   dfs
             r&   build_indexADCDFBuilder.build_index  s    %%k&7&7Oll62.F&\F&v.	<"$%%FK / ((6v{C ) KK / \\t]]-B-BCB	r)   Fuse_multiindexc                 `  ^ US   (       d  [         R                  " 5       $ U R                  [        R                  X5      m/ n/ n[        TR                  5      n[        5       nUS   n	[        U4S jU	 5       5      n
[        U
5      n[        [        UUUUU
5      nU	 H  n[        U5      nUTR                     nU(       d  M&  UTR                     nUR                  TR                  5        UR                  TR                  5        U Vs/ s H!  nUS [        1;   a  [         R                   OUPM#     nnTR"                   H  n[%        UU   5      UU'   M     U" U[%        U5      U5      u  nnU=(       a    UR'                  U5        M    M     US:  a  US:  d  U(       a4  [         R(                  R+                  [-        U
TR                  5      5      nOUS:X  a9  [         R.                  " TR                  TR                  R1                  U
5      S9nO@US:X  a.  [         R.                  " U
TR                  R1                  5       S9nOTR                  n[         R.                  " UTR2                  S9n[         R                  " UUUS9n[5        U5      nUR7                  SSS9  U$ s  snf )Nr   c              3   @   >#    U  H  oTR                      v   M     g 7fre   )inst_idx)rg   r"   r   s     r&   rh   3ADCDFBuilder.build_date_as_index.<locals>.<genexpr>)  s     &ZkFg.>.>'?ks   r   )r   name)r   r   rf   T)	ascendinginplace)ry   r   r   r   DATE_AS_INDEXrN   r   rU   r   r   r   rS   date_idxr   popobjectrz   r   r   r@   
MultiIndexfrom_tuplesr   Indexget_index_name	date_namer   
sort_index)r%   r   r   r   r   r   rf   num_headers_namesrw   fields_listrb   rv   process_indexr"   date_strr!   irm   r|   r   r   r   s                        @r&   build_date_as_index ADCDFBuilder.build_date_as_index  sF    <<>!%%k&?&?W.[
v&&&Zk&ZZ|,!
 "F37<Fg../H'**+DJJw''(JJw''(CIJ6aqT6N2bee96FJ((6vc{Cs ) +41I(1SU[\NFF*t{{6**% "( q %5%9^mm//gmm0TUG"hhGMM8T8TUa8bcG!#hhLw}}7S7S7UVG mmGe'*;*;<\\tWEBB
d3	3 Ks   (J+r.   N)r/   r0   r1   r2   r
   r   r6   r   r	   r8   TITLEry   r   r   r9   r   r:   r.   r)   r&   r   r     s    k4<eDl>mmnnFPFVFV D | `b`l`l , %/$4$4$	>> "> 	> 
> >r)   r   rawr*   c                 Z   [        U 5      n / n/ nU  H,  nUR                  S5      (       a  M  UR                  U5        M.     U HM  nUR                  S5      (       a  [        US   5      US'   UR	                  SS 5        UR                  U5        MO     [
        R                  " U5      nU$ )NerrorrX   holidays)r   rZ   r@   r   r   ry   r   )r   r   add_periods_dataclean_request_itemsrA   request_item_dfs          r&   build_dates_calendars_dfr   Z  s    
3-Cxx  &&t,  ,F###;L<P#QL T*- , ,,'
(CJr)   c                 H    [        U 5      n[        R                  " U5      nU$ re   )&_dates_calendars_prepare_holidays_datary   r   )r   r   holidays_dataholidays_dfs       r&   !build_dates_calendars_holidays_dfr   o  s     :3?M,,}-Kr)   c                 z   [        U 5      n / nU  H  nUR                  S/ 5       H  nUR                  S5      (       aP  US    HE  nUR                  S5      US'   [        UR                  S5      5      US'   UR                  U5        MG     Mi  UR                  S5      US'   UR                  U5        M     M     U$ )Nr   r   tagrX   )r   rZ   r   r@   )r   r   request_item_holidayholidayholiday_names        r&   r   r   u  s    
3-CM #+//
B?G{{7##$+G$4L*>*B*B5*IL'+CGKKPVDW+XL(!((6 %5
 "6!9!9%!@$$W- @ !$ r)   c                 H    [         R                  " U 5      n[        U5      nU$ re   )ry   r   r   )r   r   r   s      r&   default_build_dfr     s    	c	B		BIr)   c                     [        U 5      n / nU R                  S5       H  nUR                  [        U5      5        M     X S'   [        R
                  " U 5      nU$ )Ndates)r   rZ   r@   r   ry   r   )r   r   _datesrX   r   s        r&   &build_dates_calendars_date_schedule_dfr     sQ    
3-CF .t45 ! L	c	BIr)   c                  ,    [         R                  " 5       $ re   )ry   r   )r   __s     r&   build_empty_dfr     s    <<>r)   data_grid_typec                     U [         R                  :X  a  [        $ U [         R                  :X  a  [        $ [        SU  S35      e)NzUnknown data grid type: rD   )r   RDPadc_dfbuilder_rdpUDFadc_dfbuilder_udfrE   )r   s    r&   get_adc_dfbuilderr     sB    )))  	<++	+   3N3C1EFFr)   ):r4   copyr   	functoolsr   	itertoolsr   typingr   r   r   r	   r
   r   pandasry   _df_build_typer   _header_typer   )fundamental_and_reference._data_grid_typer   _adc_headers._headers_factoryr   _layer_typer   _toolsr   r   r   _typesr   _adc_headers._headersr   r   	dataclassr   r<   rU   ru   r7   r   r   r   r   r   r   r   r   r   r   CONTENTr   r   r   CONTENT_FUND_AND_REF+adc_dfbuilder_fundamental_and_reference_rdpr   r.   r)   r&   <module>r      s       B B  ' $ C C # N N #L !+ !+ !+H 1 1 1h j j jZ""" " 	"
 s)" " " I"J T T Tn# r|| *3  "# r|| 	 	R\\ 	  !!89I9I9K\K\!]^  !89I9I9K\K\!]^ .:L,,i.L.LM/ +
Gl G| Gr)   