Ë
    µŒj–+  ã                  ó"  — d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
mZmZmZ ddlZddlZddlmZmZ ddlmZmZmZmZ ddlmZ  ej2                  e«      Z ej8                  dd	«      Zerdd
lmZ  G d„ de«      Z 	 d	 	 	 	 	 dd„Z!dd„Z"y)z#Wrapper around a Power BI endpoint.é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚDictÚIterableÚListÚOptionalÚUnion)ÚClientTimeoutÚServerTimeoutError)Ú	BaseModelÚ
ConfigDictÚFieldÚmodel_validator)ÚTimeoutÚPOWERBI_BASE_URLz"https://api.powerbi.com/v1.0/myorg)ÚTokenCredentialc                  ó˜  — e Zd ZU dZded<   ded<   dZded<   dZd	ed
<   dZded<   dZded<    e	ddd¬«      Z
ded<    e	e¬«      Zded<   dZded<    ed¬«      Z ed¬«      ed,d„«       «       Zed-d„«       Zed.d„«       Zd/d„Zd-d „Zed-d!„«       Z	 d0	 	 	 d1d"„Zd2d#„Zd3d$„Z	 d0	 	 	 d4d%„Z	 d0	 	 	 d4d&„Zd5d'„Zd5d(„Zd6d)„Z d7d*„Z!d7d+„Z"y)8ÚPowerBIDatasetaO  Create PowerBI engine from dataset ID and credential or token.

    Use either the credential or a supplied token to authenticate.
    If both are supplied the credential is used to generate a token.
    The impersonated_user_name is the UPN of a user to be impersonated.
    If the model is not RLS enabled, this will be ignored.
    ÚstrÚ
dataset_idú	List[str]Útable_namesNúOptional[str]Úgroup_idzOptional[TokenCredential]Ú
credentialÚtokenÚimpersonated_user_nameé   r   é
   )ÚdefaultÚgtÚleÚintÚsample_rows_in_table_info)Údefault_factoryúDict[str, str]ÚschemaszOptional[aiohttp.ClientSession]Ú
aiosessionT)Úarbitrary_types_allowedÚbefore)Úmodec                ó’   — |j                  dg «      }|D �cg c]  }t        |«      ‘Œ c}|d<   d|v sd|v r|S t        d«      ‚c c}w )z?Validate that at least one of token and credentials is present.r   r   r   z.Please provide either a credential or a token.)ÚgetÚfix_table_nameÚ
ValueError)ÚclsÚvaluesr   Útables       úo/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/utilities/powerbi.pyÚvalidate_paramszPowerBIDataset.validate_params4   sX   € ð —j‘j °Ó3ˆÙDOÓ PÁK¸5¤°Õ!6ÀKÑ Pˆˆ}ÑØ�fÑ °Ñ 6ØˆMÜÐIÓJÐJùò !Qs   —Ac                óŒ   — | j                   r#t        › d| j                   › d| j                  › d�S t        › d| j                  › d�S )zGet the request url.z/groups/z
/datasets/z/executeQueries)r   ÚBASE_URLr   ©Úselfs    r4   Úrequest_urlzPowerBIDataset.request_url>   sF   € ð �=Š=Ü�Z˜x¨¯© °jÀÇÁÐ@QÐQ`ÐaÐaÜ�˜: d§o¡oÐ%6°oÐFÐFó    c                ó  — | j                   rdd| j                   z   dœS ddlm} | j                  r.	 | j                  j	                  d«      j                   }dd|z   dœS  |d	«      ‚# t
        $ r} |d«      |‚d}~ww xY w)
zGet the token.zapplication/jsonzBearer )zContent-TypeÚAuthorizationr   )ÚClientAuthenticationErrorz1https://analysis.windows.net/powerbi/api/.defaultz4Could not get a token from the supplied credentials.Nz No credential or token supplied.)r   Úazure.core.exceptionsr>   r   Ú	get_tokenÚ	Exception)r9   r>   r   Úexcs       r4   ÚheaderszPowerBIDataset.headersE   s    € ð �:Š:à 2Ø!*¨T¯Z©ZÑ!7ñð õ	
ð �?Š?ðØŸ™×1Ñ1ØGóç‘%ð ð %7Ø%.°Ñ%6ñð ñ (Ð(JÓKÐKøô	 ò Ù/ØJóàðûðús   ²,A' Á'	A>Á0	A9Á9A>c                ó   — | j                   S )zGet names of tables available.)r   r8   s    r4   Úget_table_nameszPowerBIDataset.get_table_names`   s   € à×ÑÐr;   c           	     óª   — | j                   rAdj                  | j                   j                  «       D ��cg c]  \  }}|› d|› �‘Œ c}}«      S yc c}}w )zGet the available schema's.ú, z: z9No known schema's yet. Use the schema_powerbi tool first.)r(   ÚjoinÚitems)r9   ÚkeyÚvalues      r4   Úget_schemaszPowerBIDataset.get_schemasd   sN   € à�<Š<Ø—9‘9À$Ç,Á,×BTÑBTÔBVÔWÑBV±J°C¸   R¨ wÒ/ÐBVÒWÓXÐXØJùó Xs   µA
c                ó"   — | j                  «       S )z-Information about all tables in the database.)Úget_table_infor8   s    r4   Ú
table_infozPowerBIDataset.table_infoj   s   € ð ×"Ñ"Ó$Ð$r;   c                ó  — |�ãt        |t        «      r�t        |«      dkD  r|d   dk7  rw|D �cg c]  }t        |«      ‘Œ }}|D �cg c]  }|| j                  vsŒ|‘Œ }}|r%t
        j                  ddj                  |«      «       |D �cg c]	  }||vsŒ|‘Œ }}|r|S dS t        |t        «      r6|dk7  r1|| j                  vrt
        j                  d|«       yt        |«      gS | j                  S c c}w c c}w c c}w )zHGet the tables names that need to be queried, after checking they exist.Nr   Ú z!Table(s) %s not found in dataset.rG   zTable %s not found in dataset.)	Ú
isinstanceÚlistÚlenr/   r   ÚloggerÚwarningrH   r   )r9   r   r3   Úfixed_tablesÚnon_existing_tablesÚtabless         r4   Ú_get_tables_to_queryz#PowerBIDataset._get_tables_to_queryo   s   € ð Ð"ä˜;¬Ô-Ü˜Ó$ qÒ(Ø ‘N bÒ(áCNÓOÁ;¸%¤¨uÕ 5À;�ÐOá'3ó'Ù'3˜e°uÀD×DTÑDTÒ7T’E |ð $ð 'ñ 'Ü—N‘NØ;ØŸ	™	Ð"5Ó6ôñ
 (4óÙ'3˜e°uÐDWÒ7W’E |ð ð ñ "(�vÐ1¨TÐ1Ü˜+¤sÔ+°¸rÒ0AØ d×&6Ñ&6Ñ6Ü—N‘NÐ#CÀ[ÔQØÜ& {Ó3Ð4Ð4Ø×ÑÐùò%  Pùò'ùòs   ­C2ÁC7ÁC7Â
	C<ÂC<c                óJ   — |D �cg c]  }|| j                   vsŒ|‘Œ c}S c c}w )z-Get the tables that still need to be queried.)r(   )r9   Útables_todor3   s      r4   Ú_get_tables_todozPowerBIDataset._get_tables_todo�   s%   € á#.ÓL¡;˜%°%¸t¿|¹|Ò2K’ ;ÑLÐLùÒLs   … ™ c                ó’   — | j                   j                  «       D ��cg c]  \  }}||v sŒ|‘Œ }}}dj                  |«      S c c}}w )z=Create a string of the table schemas for the supplied tables.rG   )r(   rI   rH   )r9   r   r3   Úschemar(   s        r4   Ú_get_schema_for_tablesz%PowerBIDataset._get_schema_for_tables‘   sO   € ð )-¯©×(:Ñ(:Ô(<ô
Ù(<‘}�u˜fÀÈÒ@TŠFÐ(<ð 	ñ 
ð �y‰y˜Ó!Ð!ùó
s
   žA«Ac                óž   — | j                  |«      }|€y| j                  |«      }|D ]  }| j                  |«       Œ | j                  |«      S )ú'Get information about specified tables.úNo (valid) tables requested.)rZ   r]   Ú_get_schemar`   ©r9   r   Útables_requestedr\   r3   s        r4   rN   zPowerBIDataset.get_table_info˜   sY   € ð  ×4Ñ4°[ÓAÐØÐ#Ø1Ø×+Ñ+Ð,<Ó=ˆÛ ˆEØ×Ñ˜UÕ#ð !à×*Ñ*Ð+;Ó<Ð<r;   c              ƒ  óò   K  — | j                  |«      }|€y| j                  |«      }t        j                  |D �cg c]  }| j	                  |«      ‘Œ c}Ž ƒ d{  –—†  | j                  |«      S c c}w 7 Œ­w)rb   Nrc   )rZ   r]   ÚasyncioÚgatherÚ_aget_schemar`   re   s        r4   Úaget_table_infozPowerBIDataset.aget_table_info¤   sz   è ø€ ð  ×4Ñ4°[ÓAÐØÐ#Ø1Ø×+Ñ+Ð,<Ó=ˆÜ�n‰nÁ[ÓQÁ[¸E˜t×0Ñ0°Õ7À[ÑQÐR×RÐRØ×*Ñ*Ð+;Ó<Ð<ùò RÐRús   ‚9A7»A0ÁA7ÁA5ÁA7c                ón  — 	 | j                  d| j                  › d|› d�«      }t        |d   d   d   d   d   «      | j                  |<   y# t        $ r( t
        j                  d|«       d	| j                  |<   Y yt        $ r0}t
        j                  d
||«       d	| j                  |<   Y d}~yd}~ww xY w)úGet the schema for a table.úEVALUATE TOPN(rG   Ú)Úresultsr   rY   Úrowsú'Timeout while getting table info for %sÚunknownú)Error while getting table info for %s: %sN)Úrunr%   Ú
json_to_mdr(   r   rU   rV   rA   ©r9   r3   ÚresultrB   s       r4   rd   zPowerBIDataset._get_schema¯   s°   € ð
	,Ø—X‘XØ  ×!?Ñ!?Ð @ÀÀ5À'ÈÐKóˆFô #-¨V°IÑ->¸qÑ-AÀ(Ñ-KÈAÑ-NÈvÑ-VÓ"WˆD�L‰L˜ÒøÜò 	,Ü�N‰NÐDÀeÔLØ"+ˆD�L‰L˜ÓÜò 	,Ü�N‰NÐFÈÈsÔSØ"+ˆD�L‰L˜Öûð	,ús   ‚A	A Á.B4Á<B4Â&B/Â/B4c              ƒ  óŠ  K  — 	 | j                  d| j                  › d|› d�«      ƒ d{  –—† }t        |d   d   d   d   d   «      | j                  |<   y7 Œ,# t        $ r( t
        j                  d	|«       d
| j                  |<   Y yt        $ r0}t
        j                  d||«       d
| j                  |<   Y d}~yd}~ww xY w­w)rm   rn   rG   ro   Nrp   r   rY   rq   rr   rs   rt   )Úarunr%   rv   r(   r   rU   rV   rA   rw   s       r4   rj   zPowerBIDataset._aget_schema½   s¿   è ø€ ð
	,ØŸ9™9Ø  ×!?Ñ!?Ð @ÀÀ5À'ÈÐKó÷ ˆFô #-¨V°IÑ->¸qÑ-AÀ(Ñ-KÈAÑ-NÈvÑ-VÓ"WˆD�L‰L˜Òðùô "ò 	,Ü�N‰NÐDÀeÔLØ"+ˆD�L‰L˜ÓÜò 	,Ü�N‰NÐFÈÈsÔSØ"+ˆD�L‰L˜Öûð	,üsJ   ‚C„%A ©Aª+A ÁCÁA Á.C ÂCÂC Â&B;Â6CÂ;C Ã Cc                ó.   — d|› ig| j                   ddidœS )z(Create the json content for the request.ÚqueryÚincludeNullsT)ÚqueriesÚimpersonatedUserNameÚserializerSettings)r   )r9   Úcommands     r4   Ú_create_json_contentz#PowerBIDataset._create_json_contentË   s,   € ð ! g YÐ0Ð1Ø$(×$?Ñ$?Ø#1°4Ð"8ñ
ð 	
r;   c                óè   — t         j                  d|«       t        j                  | j                  | j                  |«      | j                  d¬«      }|j                  dk(  r	 y|j                  «       S )zAExecute a DAX command and return a json representing the results.úRunning command: %sr    )ÚjsonrC   Útimeouté“  úFTokenError: Could not login to PowerBI, please check your credentials.)	rU   ÚdebugÚrequestsÚpostr:   r‚   rC   Ústatus_coder…   )r9   r�   Úresponses      r4   ru   zPowerBIDataset.runÓ   sf   € ä�‰Ð*¨GÔ4Ü—=‘=Ø×ÑØ×*Ñ*¨7Ó3Ø—L‘LØô	
ˆð ×Ñ 3Ò&àXðð �}‰}‹Ðr;   c           	   ƒ  ó<  K  — t         j                  d|«       | j                  r­| j                  j                  | j                  | j
                  | j                  |«      t        d¬«      ¬«      4 ƒd{  –—† }|j                  dk(  r	 ddd«      ƒd{  –—†  y|j                  |j                  ¬«      ƒ d{  –—† }|cddd«      ƒd{  –—†  S t        j                  «       4 ƒd{  –—† }|j                  | j                  | j
                  | j                  |«      t        d¬«      ¬«      4 ƒd{  –—† }|j                  dk(  r"	 ddd«      ƒd{  –—†  ddd«      ƒd{  –—†  y|j                  |j                  ¬«      ƒ d{  –—† }|cddd«      ƒd{  –—†  cddd«      ƒd{  –—†  S 7 �Œ>7 �Œ!7 Œþ7 Œî# 1 ƒd{  –—†7  sw Y   ŒýxY w7 Œç7 Œž7 Œ€7 Œr7 ŒO7 Œ?7 Œ0# 1 ƒd{  –—†7  sw Y   nxY wddd«      ƒd{  –—†7   y# 1 ƒd{  –—†7  sw Y   yxY w­w)	z;Execute a DAX command and return the result asynchronously.r„   r    )Útotal)rC   r…   r†   Nr‡   rˆ   )Úcontent_type)rU   r‰   r)   r‹   r:   rC   r‚   r   Ústatusr…   r�   ÚaiohttpÚClientSession)r9   r�   r�   Úresponse_jsonÚsessions        r4   rz   zPowerBIDataset.arunâ   sÓ  è ø€ ä�‰Ð*¨GÔ4Ø�?Š?Ø—‘×+Ñ+Ø× Ñ ØŸ™Ø×.Ñ.¨wÓ7Ü%¨BÔ/ð	 ,÷ ô ð
 Ø—?‘? cÒ)Øc÷÷ ð ð '/§m¡mÀ×AVÑAV mÓ&W× W�Ø$÷÷ ñ ô ×(Ñ(×*Ô*¨gØ—|‘|Ø× Ñ ØŸ™Ø×.Ñ.¨wÓ7Ü%¨BÔ/ð	 $÷ ô ð
 Ø—?‘? cÒ)Øc÷÷ ÷ +×*Ð*ð '/§m¡mÀ×AVÑAV mÓ&W× W�Ø$÷÷ ð ÷ +×*Ñ*ðùð ùð !Xøðø÷ ÷ ñ úð +øðøð øð +øð !Xøðøð +ø÷÷ ñ ú÷ +×*×*×*Ó*üs]  ‚A3HÁ5F3Á6HÁ9F=Â
HÂF6ÂHÂF=Â:F9Â;F=Ã HÃF;ÃHÃ*GÃ+HÃ.AHÄ5GÄ6HÄ9G Å
HÅGÅHÅHÅ%GÅ&HÅ+G Æ
GÆG ÆHÆGÆHÆ!HÆ-GÆ.HÆ6HÆ9F=Æ;HÆ=GÇGÇGÇHÇHÇHÇHÇG ÇHÇHÇ G2	Ç&G)Ç'G2	Ç.HÇ5HÈ HÈHÈHÈHÈHÈH)r2   zDict[str, Any]Úreturnr   )r–   r   )r–   r'   )r–   zIterable[str]©N)r   úOptional[Union[List[str], str]]r–   zOptional[List[str]])r\   r   r–   r   )r   r   r–   r   )r   r˜   r–   r   )r3   r   r–   ÚNone)r�   r   r–   zdict[str, Any])r�   r   r–   r   )#Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   r%   Údictr(   r)   r   Úmodel_configr   Úclassmethodr5   Úpropertyr:   rC   rE   rL   rO   rZ   r]   r`   rN   rk   rd   rj   r‚   ru   rz   © r;   r4   r   r      s\  … ñð ƒOØÓØ"€HˆmÓ"Ø,0€JÐ)Ó0Ø€Eˆ=ÓØ,0Ð˜MÓ0Ù%*°1¸¸rÔ%BÐ˜sÓBÙ#°DÔ9€Gˆ^Ó9Ø26€JÐ/Ó6áØ $ô€Lñ ˜(Ô#ØòKó ó $ðKð òGó ðGð òLó ðLó4 óKð ò%ó ð%ð
 >Bð Ø:ð à	ó ó<Mó"ð >Bð
=Ø:ð
=à	ó
=ð >Bð	=Ø:ð	=à	ó	=ó,ó,ó
óô%r;   r   c                ó>  — t        | «      dk(  ryd}| d   j                  «       }|D ]D  }|j                  dd«      j                  dd«       |r|j                  |› d�d«       |d|› d�z  }ŒF |dz  }| D ]%  }|j                  «       D ]  }|d|› d�z  }Œ |dz  }Œ' |S )	z*Convert a JSON object to a markdown table.r   rQ   Ú[Ú.Ú]z| Ú z|
)rT   ÚkeysÚreplacer2   )Újson_contentsÚ
table_nameÚ	output_mdrC   ÚheaderÚrowrK   s          r4   rv   rv   ý   sÅ   € ô
 ˆ=Ó˜QÒØØ€IØ˜AÑ×#Ñ#Ó%€GÛˆØ�‰�s˜CÓ ×(Ñ(¨¨bÔ1ÙØ�N‰N˜j˜\¨Ð+¨RÔ0Ø�r˜&˜ �^Ñ#‰	ð	 ð
 �Ñ€IÛˆØ—Z‘Z–\ˆEØ˜2˜e˜W A˜Ñ&‰Ið "à�UÑ‰	ð ð Ðr;   c                ó^   — d| v r(| j                  d«      s| j                  d«      sd| › d�S | S )z9Add single quotes around table names that contain spaces.r¨   Ú')Ú
startswithÚendswith)r3   s    r4   r/   r/     s4   € à
ˆe�|˜E×,Ñ,¨SÔ1¸%¿.¹.ÈÔ:MØ�5�'˜ˆ|ÐØ€Lr;   r—   )r«   z'List[Dict[str, Union[str, int, float]]]r¬   r   r–   r   )r3   r   r–   r   )#r�   Ú
__future__r   rh   ÚloggingÚosÚtypingr   r   r   r   r   r	   r
   r’   rŠ   r   r   Úpydanticr   r   r   r   Úrequests.exceptionsr   Ú	getLoggerrš   rU   Úgetenvr7   Úazure.core.credentialsr   r   rv   r/   r£   r;   r4   Ú<module>r½      s™   ðÙ )å "ã Û Û 	ß L× LÑ Lã Û ß 5÷ó õ (à	ˆ×	Ñ	˜8Ó	$€àˆ2�9‰9Ð'Ð)MÓN€áÝ6ô]%�Yô ]%ðD !%ðØ:ðàðð 	óô,r;   