o
    5)i"                     @   sd   d dl Z d dlZd dlmZmZmZmZmZ d dlm	Z	m
Z
 d dlmZ eeZG dd dZdS )    N)DictListOptionalAnyUnion)ThreadPoolExecutoras_completed)
MySQLModelc                   @   s   e Zd ZdZdd Zddededee fdd	Z	d
ee deeee f fddZ
d
ee deeee f fddZ	ddeeee f dee dee fddZdeeee f dedee fddZdefddZdd ZdS )DatabaseServicez;Service for handling multi-database operations in flask-apic                 C   s2   t  | _tdd| _tt d| jj | _d S )N
   max_workers.)	r	   mysqlr   executorlogging	getLogger__name__	__class__logger)self r   ;/var/www/html/oms-prod-mcp/app/services/database_service.py__init__   s   zDatabaseService.__init__Nqueryparamsreturnc              
   C   sh   z| j d | j||W S  ty3 } z| j d|  ddt| igW  Y d}~S d}~ww )zExecute MySQL queryzExecuting MySQL queryzMySQL query error: errorzMySQL query failed: N)r   debugr   execute_query	Exceptionr   str)r   r   r   er   r   r   execute_mysql_query   s    z#DatabaseService.execute_mysql_queryqueriesc           
         sF  t  }g }| jdt| d |D ]6}|d}|d| d}|dkr:|| j| j|d|d}n
| j	d	|  q|
||f qi }|D ]D\}}z|I d
H ||< | jd| d W qP ty }	 z!| jd| d|	  dd| dt|	 ig||< W Y d
}	~	qPd
}	~	ww | jdt| d |S )z'Execute multiple queries asynchronously
Executing z queries asynchronouslydatabaseid_queryr   r   r   Unknown database type: NzAsync query  completed successfully	 failed: r   Query 
Completed z async queries)asyncioget_event_loopr   infolengetrun_in_executorr   r#   warningappendr   r    r   r!   )
r   r$   looptasksquery_configdb_typequery_idtaskresultsr"   r   r   r   execute_queries_async   s:   
*z%DatabaseService.execute_queries_asyncc           
      C   sl  i }i }| j dt| d ttt|dd}|D ]1}|d}|d| d}|dkr@|| j|d	|d
}n
| j d|  q|||< q|	 D ]E\}}z|j
dd||< | j d| d W qS ty }	 z!| j d| d|	  dd| dt|	 ig||< W Y d}	~	qSd}	~	ww W d   n1 sw   Y  | j dt| d |S )z2Execute multiple queries in parallel using threadsr%   z queries in parallelr   r   r&   r'   r(   r   r   r   r)   <   )timeoutzParallel query r*   r+   r   r,   Nr-   z parallel queries)r   r0   r1   r   minr2   submitr#   r4   itemsresultr   r    r   r!   )
r   r$   futuresr<   r   r8   r9   r:   futurer"   r   r   r   execute_parallel_queries?   s@   


z(DatabaseService.execute_parallel_queriesdatasetsjoin_configc           	   
   C   s  ze|s| j d g W S dd | D }|s | j d g W S t|dkr5| j d t| d W S |rD| j d | ||W S | j d	 g }| D ]\}}|D ]}||d
< || qVqP|W S  t	y } z| j 
d|  ddt| igW  Y d}~S d}~ww )z$Combine data from multiple databasesz$No datasets provided for combinationc                 S   s2   i | ]\}}|rt |d krd|d v s||qS )   r   r   )r1   ).0kvr   r   r   
<dictcomp>r   s    z0DatabaseService.combine_data.<locals>.<dictcomp>z.No valid datasets found after filtering errorsrI   zSingle dataset, returning as-isr   z#Joining datasets with configurationzConcatenating datasets_sourcezError combining data: r   zData combination failed: N)r   r4   rB   r1   r0   listvalues_join_datasetsr5   r    r   r!   )	r   rG   rH   valid_datasetscombineddataset_namedataitemr"   r   r   r   combine_datah   s:    zDatabaseService.combine_datac              
      s  z| d}| d | dd}||vrtd| d|| }g }| jdt| d  d	 |D ]a }| D ]Q\}}	||krGq> fd
d|	D }
|
ro|
D ]}| D ]\}}| krl||| d| < q[qUq>|dkr|	ry|	d ni }| D ]}| krd|| d| < qq>|| q4| jdt| d |W S  t	y } z| j
d|  ddt| igW  Y d}~S d}~ww )z$Join datasets based on configurationprimary
join_fieldtypeleftzPrimary dataset 'z' not foundzJoining z datasets on field ''c                    s$   g | ]}|    kr|qS r   )r2   )rJ   rowrY   primary_rowr   r   
<listcomp>   s
    z2DatabaseService._join_datasets.<locals>.<listcomp>_r   NzJoin completed with z recordszError joining datasets: r   zDataset join failed: )r2   
ValueErrorr   r0   r1   copyrB   keysr5   r    r   r!   )r   rG   rH   primary_dataset	join_typeprimary_datarC   combined_rowrT   rU   matching_rowsmatchkeyvalue
sample_rowr"   r   r^   r   rQ      sR   

 zDatabaseService._join_datasetsc              
   C   sh   z| j d | j }|ddW S  ty3 } z| j d|  t|ddW  Y d}~S d}~ww )z"Get database connection statisticsz&Getting database connection statisticsoperational)r   service_statuszError getting database stats: r   )r   ro   N)r   r0   r   test_connectionr    r   r!   )r   mysql_statsr"   r   r   r   get_database_stats   s   
z"DatabaseService.get_database_statsc              
   C   sp   z| j d | j  | jjdd | j d W dS  ty7 } z| j d|  W Y d}~dS d}~ww )zCleanup resourcesz&Cleaning up database service resourcesT)waitz"Database service cleanup completedzError during cleanup: N)r   r0   r   cleanupr   shutdownr    r   )r   r"   r   r   r   rt      s   
 zDatabaseService.cleanup)N)r   
__module____qualname____doc__r   r!   tupler   r   r#   r=   rF   r   rW   rQ   rr   rt   r   r   r   r   r
   
   s.    "	"$*
)
8r
   )r.   r   typingr   r   r   r   r   concurrent.futuresr   r   app.models.mysql_modelr	   r   r   r   r
   r   r   r   r   <module>   s    
