o
    GY)j                     @  sr   d Z ddlmZ ddlmZmZmZmZmZ d"dd	Z	d#ddZ
d$ddZd%ddZd&ddZddd'dd Zd!S )(zWMcube Classic group resolution: callhistory often uses gid, names live in {bid}_groups.    )annotations)AnyDictListOptionalTuple
table_namestrreturnboolc                 C  s   |  d|f |  d uS )NzSHOW TABLES LIKE %sexecutefetchone)cursorr    r   ;/home/aiteam/pcaa-dev/dashboard-backend/mcube_group_util.py_table_exists   s   r   column_namec                 C  s"   |  d| d|f |  d uS )NzSHOW COLUMNS FROM `z	` LIKE %sr   )r   r   r   r   r   r   _column_exists   s   r   source_colsDict[str, str]
candidatesOptional[str]c                 G  s*   |D ]}|  }|| v r| |   S qd S )N)lower)r   r   	candidatekeyr   r   r   
_first_col   s   r   src_bidcallhistory_tableList[Dict[str, Any]]c                 C  s   t | }|rt| |sg S t| |dr(| d| d|f t|  p&g S | d}t| |dr5dnd}|rat| |rat| |dra| d| d| d	| d
| d	||f t|  p_g S g S )z?Distinct group names with call counts from Mcube source tables.	groupnamezH
            SELECT groupname, COUNT(*) AS call_count
            FROM `z`
            WHERE bid = %s
              AND groupname IS NOT NULL
              AND TRIM(groupname) != ''
            GROUP BY groupname
            ORDER BY call_count DESC, groupname
            _groupsgidNz*
            SELECT g.groupname, COUNT(c.`z#`) AS call_count
            FROM `z` g
            LEFT JOIN `z` c
              ON c.`z` = g.gid AND c.bid = %s
            WHERE g.bid = %s
              AND g.groupname IS NOT NULL
              AND TRIM(g.groupname) != ''
            GROUP BY g.groupname
            ORDER BY call_count DESC, g.groupname
            )r	   stripr   r   r   _rows_to_groupsfetchall)r   r   r   groups_tablegid_colr   r   r   fetch_mcube_source_groups   s8   	
r(   c                 C  s~   g }| D ]8}t |tr t|dpd }t|dpd}nt|d p&d }t|d p0d}|r<|||d q|S )Nr     
call_countr      )r    r*   )
isinstancedictr	   getr#   intappend)rowsgroupsrownamecountr   r   r   r$   E   s   
r$   c)
call_aliassource_tabler7   )Tuple[str, List[Any], str, Optional[str]]c                C  s   t | }t|ddd}|r | d| d}dg | d|fS t|dd	}| d
}|rOt| |rOt| |drOd| d| d| d}	d}
d}|	|g|
|fS |rcd| d| d}dg | d|fS dg ddfS )z
    Return (join_sql, join_params, groupname_select_sql, group_filter_expr).

    group_filter_expr is used in WHERE for allowed group names.
    r    
group_namegroupz.``r)   z AS groupnamer"   gidsr!   zLEFT JOIN `z` g ON z` = g.gid AND g.bid = %sz&COALESCE(g.groupname, '') AS groupnamezg.groupnamezCAST(z
` AS CHAR)z'' AS groupnameN)r	   r#   r   r   r   )r   r   r8   r   r7   	group_colexprr'   r&   join_sqlgroupname_sqlfilter_exprr   r   r   resolve_mcube_group_sqlS   s4   

rC   N)r   r	   r
   r   )r   r	   r   r	   r
   r   )r   r   r   r	   r
   r   )r   r	   r   r	   r
   r   )r
   r   )
r   r	   r8   r	   r   r   r7   r	   r
   r9   )__doc__
__future__r   typingr   r   r   r   r   r   r   r   r(   r$   rC   r   r   r   r   <module>   s    




+