U
    j                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlT ddl	m
Z
 ddlmZ dd	lmZ dd
lmZ G dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd dZdS )    N)Enum)Path)fields)*   )
exceptions)jqlLexer)	jqlParser)
jqlVisitorc                   @   sh   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdS )Operator=!=><>=<=INzNOT IN~z!~ISzIS NOTWASzWAS INz
WAS NOT INzWAS NOTCHANGEDILIKEz	NOT ILIKEEXISTSz
NOT EXISTSHISTORYzNOT HISTORYN)__name__
__module____qualname__EQUALS
NOT_EQUALSZGTZLTZ	GT_EQUALSZ	LT_EQUALSr   NOT_INCONTAINSZDOES_NOT_CONTAINr   IS_NOTr   WAS_IN
WAS_NOT_INZWAS_NOTr   r   	NOT_ILIKEr   
NOT_EXISTSr   NOT_HISTORY r'   r'   ./modules/jira/jql/parser.pyr      s.   r   c                   @   s    e Zd ZdZdZdZdZdZdS )OperandEMPTYVALUEFUNCTIONLISTN)r   r   r   r*   r+   r,   r-   NONEr'   r'   r'   r(   r)   +   s
   r)   c                   @   s    e Zd ZdZdZdZdZdZdS )FunctionZNOWZ	MEMBERSOFZCURRENTUSERZSTANDARDISSUETYPESZSUBTASKISSUETYPESN)r   r   r   now	membersOfcurrentUserstandardIssueTypessubTaskIssueTypesr'   r'   r'   r(   r/   3   s
   r/   c                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	PredicateOperatorAFTERBEFOREBYDURINGONFROMTON)
r   r   r   r6   r7   r8   r9   r:   r;   r<   r'   r'   r'   r(   r5   ;   s   r5   c                   @   s4   e Zd ZejejejejfZej	fZ
ejejfZdS )PredicateOperatorsN)r   r   r   r5   r6   r7   r:   r9   DATEr8   USERr;   r<   r+   r'   r'   r'   r(   r=   E   s   r=   c                   @   s   e Zd ZdZdZdZdS )	ValueModeFIELDUSER_PREDICATEDATE_PREDICATEN)r   r   r   rA   rB   rC   r'   r'   r'   r(   r@   S   s   r@   c                4       s  e Zd Zdejjddgdddejjdddejjddd	ejjd
ddd
idd
idejj	d
ddejj
ddgdddejjddgddejjdddejjdddejjddgddejjddd
dddgddejjddgdddd
idejjdgddgddddgd dd
idd
id!ejjdd"gdddd
idd
idd
id
d#gdd$ejjddgddd%ejjddgdd&gd'dd
id(ejjddd)ejjd*gdd+ddgdd,dd
id
d-gdd.ejjdddd
idd
idd
id/ejjddgddd0ejjdd1gdd2ejjddgdd3gd'd4ejjd5gddgdd,d6ejjddd7ejjdddd
id8ejjdd9gdd:ejjdd;gddd
idd
id<ejjdddd
idd
idd
idd
id=3Z fd>d?Zd@dA Z e!dBdCdDZ"e#dEdF Z$dGdH Z%dIdJ Z&dKdL Z'dMdN Z(dOdP Z)ddRdSZ*ddTdUZ+ddVdWZ,ddXdYZ-dZd[ Z.d\d] Z/d^d_ Z0e1j2d`dadbZ3e1j4d`dcddZ5e1j6d`dedfZ7e1j8d`dgdhZ9e1j:d`didjZ;e1j<d`dkdlZ=e1j>d`dmdnZ?e1j@d`dodpZAe1jBd`dqdrZCe1jDd`dsdtZEe1jFd`dudvZGe1jHd`dwdxZIe1jJd`dydzZKe1jLd`d{d|ZMe1jNd`d}d~ZOe1jPd`ddZQe1jRd`ddZSe1jTd`ddZUe1jVd`ddZWe1jXd`ddZYe1jZd`ddZ[e1j\d`ddZ]e1j^d`ddZ_e1j`d`ddZae1jbd`ddZce1jdd`ddZee1jfd`ddZge1jhd`ddZie1jjd`ddZke1jld`ddZme1jnd`ddZoe1jpd`ddZqe1jrd`ddZse1jtd`ddZue1jvd`ddZwe1jxd`ddZye1jzd`ddZ{  Z|S )JQLaffectedversionext_idnameT)rG   	cmf_field	search_by	supported	approvals)rG   rH   rJ   assigneeattachmentsFrJ   comment	componentcreatedZcreateddate)rG   rH   rJ   aliasescreatordescriptiondueZduedateenvironmentZrequestZsavedfilterZsearchrequest)rJ   rQ   
fixversioncodeCmfTaskidZissuekey)rG   rH   modelsrI   rJ   rQ   tagsaliasZtimeoriginalestimateparent_taskz"epic link"u   ссылка на эпик)rG   rH   rI   rJ   rQ   priorityprojectZ
CmfProjecttask_code_prefix)rG   rH   r[   rI   rJ   Ztimeestimatereporter
resolutionresolvedZresolutiondatesprintu   спринтstatusZCmfStatusCodesummarytexttypeZ	issuetypeupdatedZupdateddate
spectators)3rE   rK   rL   rM   categoryzchange-gating-typerN   rO   rP   rR   rS   rT   rU   filterrV   ZhierarchylevelZissuekeyZ	issueLinkZissueLinkTypelabelsZ
lastViewedlevelZorganizationsZoriginalEstimateparentz	epic linkZparentprojectr_   r`   ZprojecttypeZremainingestimaterb   zrequest-channel-typezrequest-last-activity-timezrequest typerc   rd   re   rf   rg   rh   Z	timespentri   rj   ZvoterZvotesZwatcherZworklogAuthorZworklogCommentZworklogDateZ	workRatioc                    s>   t    d| _g | _d | _d | _tj| _| 	  | 
  d S N%)super__init__source_hasherrors_current_field_current_predicate_operatorr@   rA   _value_mode_cache_users_cache_prioritiesself	__class__r'   r(   rt   o  s    
zJQL.__init__c                 C   sr   t  | _dddgdddgg}tjj|dgd}|D ].}|jj D ]\}}| jt	||f qBq2t| j| _dS )	uF   
        Кеширует приоритеты системы
        rG   r   r_   Z
cmf_importr   Nchoicesrm   r   )
setpriorities_cacher[   ZCmfCustFieldConfFieldlistr   valueitemsaddstr)r}   filter_Zfield_configsZfield_configkvr'   r'   r(   r{   z  s    zJQL._cache_prioritiesr   c                    s`   t  fdd| jD d}|dk	r&|S t  fdd| jD d}|dk	rL|S td  ddS )u  
        Получает приоритет из кеша

        Args:
            value (str): Имя или id приоритета.

        Returns:
            tuple (str, str): Кортеж, содержащий id и имя приоритета
        c                 3   s   | ]}|d   kr|V  qdS )r   Nr'   .0r_   r   r'   r(   	<genexpr>  s      z+JQL._get_cached_priority.<locals>.<genexpr>Nc                 3   s   | ]}|d   kr|V  qdS )r   Nr'   r   r   r'   r(   r     s      u   Приоритет 'uP   ' не найден. Возможно он еще не импортирован.)nextr   	Exception)r}   r   Zpriority_tupler'   r   r(   _get_cached_priority  s    zJQL._get_cached_priorityc                    s2   | j  }|s.tt fdd| j  d }|S )Nc                    s    |  dg kS )NrQ   )get)frG   r'   r(   <lambda>      z JQL._get_field.<locals>.<lambda>)field_mappingr   r   rm   values)clsrG   fieldr'   r   r(   
_get_field  s    
zJQL._get_fieldc                 C   s0   t tjj|rdS t tjj|d r(dS dS d S )NTZ_idF)hasattrr[   rX   Zdp_model)r}   
field_namer'   r'   r(   _is_sortable  s
    zJQL._is_sortablec                 C   s"   |j j }|jj}|j  ||S N)startstopZgetInputStreamgetText)r}   ctxr   r   r'   r'   r(   	_get_text  s    zJQL._get_textc              
   C   s   i | _ ttjd}| s"dS | D ]~}| s8q*|d}| r*t|dN}|D ]B}t	
|}|d}|s|d}|sqZ|| j |j d| < qZW 5 Q R X q*dS )uj   
        Кэширует данные пользователей из всех дампов Jira
        Zjira_raw_dataNz
users.jsonzr+rG   Z	accountId::)users_cacher   ZconfigZ
UPLOAD_DIRjoinpathexistsiterdiris_diropenZjsonloadsr   rG   )r}   Z	dump_pathZ	hash_pathZ
users_filer   row	user_datauser_keyr'   r'   r(   rz     s$    



zJQL._cache_usersc                 C   s   | j | j d| }|r&|d}dddd| dgdd	|gd
d	|gdd	|gg}tjj|d}|rpt|jS td| dd S )Nr   ZemailAddressORrF   LIKEz%::z::%Zloginr   ZemailrG   rm   u   Пользователь 'u%   ' не найден в системе)r   r   ru   r[   	CmfPersonr   rW   r   )r}   r   r   r   userr'   r'   r(   _get_user_code  s    

zJQL._get_user_codec                 C   s  g }d}t jg g d}d }d }|D ](}|d }	z|d }
|
t jkrX|sV|| d}n|
t jkr|d |d  |d |d  n|
t jkr|d }|d tjtjfkr|tj	krt
d	|j d
|d j d|tjkr|}W q"n|tjkr|}W q"|| W q" tk
rJ } z| jd|	 d|  W 5 d }~X Y q"X q"|d rb|| |rx|sx|| |r|s|| |std|S )NFri   ubql2bqlencodedri   Tr   r   function   Функция 'u=   ' не поддерживается с оператором ''   Операнд '$   ' удален из условия. u(   Список операндов пуст)r)   r+   r*   appendr,   r   r   r#   r/   r1   r   ClauseErrorrG   r   r3   r4   r   rv   
ValueError)r}   operatoroperandsZaggregated_operandsZhas_empty_operandZvalue_operandZstandard_issue_types_funcZsubtask_issue_types_funcoperandencoded_operandoperand_typer   excr'   r'   r(   _aggregate_list_operands  sZ    








zJQL._aggregate_list_operandsNc                 C   s   |d t jkrv|d }|tjtjfkrv|tjkrH|tjkr@tjntj}n |tjkrh|tjkrbtjntj}d|j	 dS | j
d  d|j	 }|d t jkr| d|d  }|r| dddd	 |D  }|S )
Nri   r   parent_task  EmptyrG    r   c                 S   s   g | ]}|d  qS r   r'   r   	predicater'   r'   r(   
<listcomp>4  s     z+JQL._build_ubql2_clause.<locals>.<listcomp>)r)   r,   r/   r3   r4   r   r   r   r!   r   rw   r.   join)r}   r   r   
predicatesr   opclauser'   r'   r(   _build_ubql2_clause&  s    

zJQL._build_ubql2_clausec              	   C   st  g }g }| dg }|D ]}|d tjkr:||d  q|d tjkr|d }|tjtjfkr|tjkr|tj	krztj
ntj}	n |tjkr|tj	krtjntj
}	|d|	j d q||d  q||d  q|r|| jd  d|j d	d
| d t|dkr |d }n,t|dkrL|tj	kr>dnd}
|
|}|rp| dddd |D  }|S )N
aggregatedri   r   r   r   r   rG   r   z (, )r   r    OR  AND c                 S   s   g | ]}|d  qS r   r'   r   r'   r'   r(   r   W  s     z1JQL._build_ubql2_list_clauses.<locals>.<listcomp>)r   r)   r+   extendr,   r/   r3   r4   r   r   r   r!   r   r   rw   r   len)r}   r   r   r   Zoperand_listclausessuboperands
suboperandr   r   Z	connectorr'   r'   r(   _build_ubql2_list_clauses8  s4    

*

zJQL._build_ubql2_list_clausesc                 C   sN  | j }|d }|j}d}|}	|	tjtjfkrB|	tjkr<tjntj}|d}
|d}g }|
tj	krt
|tjr||jdg}|tjkrd|||j|gg}|S |tjkrtj}n|tjkrtj}t
|d tjr|tjkrtjntj}|j}n|
tjkr|d dkrFdd	d
|ddgdd
|ddgd|j|gd|j|gg}|S t
|tjr~d}|tjkrltj}n|tjkr~tj}|tjtjfkrt|tr|n|g}|j}n|
tjkr|d }|tjkr|d }|d }n|tjtjfkrLd}|tjkr|tjkrtjntj}n$|tjkr@|tjkr:tjntj}d }|j}nNt
|tjr|tjkrntj}n|tjkrtj}|d g}n|d }|j}|	tjtjfkr*|
tjkr|rdnd}d| ||g}d| ||g}d||g}|r|S |j|	j|gg}|rJ|d dd |D  n |r4dnd}| | ||g}|S )NrH   Fri   r    r   rG   rh   rY   r   rr   rW   Tr   	argumentsr^   _code
from_valueto_valuec                 S   s   g | ]}|d  qS r   r'   r   r'   r'   r(   r     s     z)JQL._build_bql_clause.<locals>.<listcomp>z.code)rw   
class_namer   r   r&   r   r   r   r)   r*   
issubclassr   ZCmfStrr   r   r   
CmfM2MBaser%   r   r+   replaceZ
CmfRelBase
isinstancer   r,   r/   r1   r3   r4   r.   r   )r}   r   r   r   is_inner_clauser   rH   r   Zadd_field_suffixZoriginal_operatorr   Zoperand_bqlr   r   Zfield_suffixr   r   r'   r'   r(   _build_bql_clause[  s    











zJQL._build_bql_clausec                 C   s   g }| dg }|D ]}|| j||dd qt|dkrF|d }n,t|dkrr|d|tjtjfkrldnd |r|g}|dd	 |D  |tjtj	fkr| j
d
 j|j|g}|S )Nr   T)r   r   r   r   ANDc                 S   s   g | ]}|d  qS r   r'   r   r'   r'   r(   r     s     z/JQL._build_bql_list_clauses.<locals>.<listcomp>rH   )r   r   r   r   insertr   r   r   r   r&   rw   r   r   )r}   r   r   r   r   r   r   r'   r'   r(   _build_bql_list_clauses  s    
 zJQL._build_bql_list_clausesc                 C   s  |t jkrdd|d g}nx|t jkr8dd|d g}n\|t jkrbdd|d gdd|d gg}n2|t jkrddd	 |d
 D }d| d|d< dd|d
 d d gdd|d
 d d gg}n|t jkr.|d tjkr|d t	j
kr
d|d d |d d g}ndd|d d g}ndd|d g}nf|tjjkr| jd dkrPdnd}|t jkrtd| d|d g}|t jkrd| d|d g}|j d|d }||fS )u   
        Строит ubql2 и bql выражения предикатов

        Args:
            predicate_operator (_type_): оператор предиката
            operand (_type_): операнд предиката
        cmf_created_atr   r   r   r   r   r   c                 S   s   g | ]}| d qS r   )pop)r   r   r'   r'   r(   r     s     z(JQL._build_predicate.<locals>.<listcomp>r   (r   r   r   r   ri   r   
cmf_authorr   r   zcmf_author.coderG   r_   r   r   r   r   r   )r5   r6   r7   r:   r9   r   r8   r)   r,   r/   r1   r=   r+   r   rw   r;   r<   r   )r}   predicate_operatorr   r   Zduringsuffixr   r'   r'   r(   _build_predicate  s8    



zJQL._build_predicatec                 C   sR   g }|r| | |r | | |r8ddd |D nd}dd |D }||fS )u  
        Строит ubql2 и bql выражения запроса, объединяя условия поиска и сортировки

        Args:
            where (_type_): условия поиска
            order_by (_type_): условие сортировки
        r   c                 S   s   g | ]}|d  qS r   r'   r   partr'   r'   r(   r     s     z$JQL._build_query.<locals>.<listcomp>r   c                 S   s   g | ]}|d  qS r   r'   r   r'   r'   r(   r     s     )r   r   )r}   whereorder_bypartsr   r   r'   r'   r(   _build_query  s    

zJQL._build_queryc                 C   s|   t |  }|| _|tjjkr,tj| _	n|tj
jkr@tj| _	| | }d | _tj| _	| ||\}}|||d}|S )N)r   r   r   )r5   r   upperrx   r=   r?   r   r@   rB   ry   r>   rC   visitZjqlPredicateOperandrA   r   )r}   r   operator_ctxr   r   r   r   resultr'   r'   r(   _get_predicate  s    
zJQL._get_predicate)r   c                 C   sF   g | _ | r| | nd }| r6| | nd }| ||S r   )rv   ZjqlWherer   Z
jqlOrderByr   )r}   r   r   r   r'   r'   r(   visitJqlQuery+  s    zJQL.visitJqlQueryc                    s    fdd|  D }dd |D }|s0  S ddd |D }t|dkr^|d d }n t|dkr~d	gd
d |D  }||dS )Nc                    s   g | ]}  |qS r'   r   r   r   r|   r'   r(   r   4  s     z(JQL.visitJqlOrClause.<locals>.<listcomp>c                 S   s   g | ]}|d k	r|qS r   r'   r  r'   r'   r(   r   5  s      r   c                 S   s   g | ]}|d  qS r   r'   r  r'   r'   r(   r   :  s     r   r   r   r   c                 S   s   g | ]}|d  qS r   r'   r  r'   r'   r(   r   >  s     r   r   )ZjqlAndClausedefaultResultr   r   r}   r   r   Zvalid_clausesr   r   r'   r|   r(   visitJqlOrClause3  s    zJQL.visitJqlOrClausec                    s    fdd|  D }dd |D }|s0  S ddd |D }t|dkr^|d d }n t|dkr~d	gd
d |D  }||dS )Nc                    s   g | ]}  |qS r'   r  r  r|   r'   r(   r   C  s     z)JQL.visitJqlAndClause.<locals>.<listcomp>c                 S   s   g | ]}|d k	r|qS r   r'   r  r'   r'   r(   r   D  s      r   c                 S   s   g | ]}|d  qS r   r'   r  r'   r'   r(   r   I  s     r   r   r   r   c                 S   s   g | ]}|d  qS r   r'   r  r'   r'   r(   r   M  s     r  )jqlNotClauser  r   r   r	  r'   r|   r(   visitJqlAndClauseB  s    zJQL.visitJqlAndClausec                 C   sd   |  p| p| }| |}|s.|  S |jrB|jj dnd}| |d  |d d}|S )Nr   r   r   r   r  )r  ZjqlSubClauseZjqlTerminalClauser   r  is_notrh   )r}   r   Z
clause_ctxr   prefixr  r'   r'   r(   visitJqlNotClauseQ  s    
zJQL.visitJqlNotClausec                 C   s8   |  | }|s|  S d|d  d|d d}|S )Nr   r   r   r   r  )r   ZjqlOrClauser  )r}   r   Z	or_clauser  r'   r'   r(   visitJqlSubClause_  s    zJQL.visitJqlSubClausec           
   
   C   s   z|  | | _|  | }|d }|d }|d}|dtjkrp| |d ||}| |d ||}n$| 	|d ||}| 
|d ||}||d}|W S  tk
r }	 z0| jd| | d	|	 d
 |   W Y S d }	~	X Y nX d S )Nr   r   r   ri   r   r   r  u   Условие '&   ' удалено из запроса. .)r   jqlFieldrw   ZjqlTerminalClauseRhsr   r)   r-   r   r   r   r   r   rv   r   r   r  )
r}   r   Z
rhs_resultr   r   r   Zubql2_clauseZ
bql_clauser  r   r'   r'   r(   visitJqlTerminalClausek  s$    
 zJQL.visitJqlTerminalClausec                 C   s>   |  | }| p$| p$| }|  |}||d}|S Nr   r   )r   ZjqlEqualsOperatorjqlEmptyjqlValuejqlFunctionr}   r   r   operand_ctxr   r  r'   r'   r(   visitJqlEqualsClause  s    
zJQL.visitJqlEqualsClausec                 C   s   |  | }| p$| p$| }|  |}|d tjkr^|d tjkrRtj	ntj
|d< nd|d  d|d< ||d}|S )Nri   r   rr   r  )r   ZjqlLikeOperatorr  r  r  r)   r*   r   r   r   r   r  r'   r'   r(   visitJqlLikeClause  s    
 zJQL.visitJqlLikeClausec                 C   s6   |  | }| p| }|  |}||d}|S r  )r   ZjqlComparisonOperatorr  r  r  r'   r'   r(   visitJqlComparisonClause  s    
zJQL.visitJqlComparisonClausec                 C   s   |  | }| p| }|  |}|d tjkrP| ||d }||d< nN|d tjkr|d }|tj	kr|d t
jkrtd|j d|d j d||d	}|S )
Nri   r   r   r   r   r   :   ' не поддерживается оператором 'r   r  )r   ZjqlInOperatorjqlListr  r)   r-   r   r,   r/   r1   r   r   r   r   rG   r   )r}   r   r   r  r   r   r   r  r'   r'   r(   visitJqlInClause  s     

zJQL.visitJqlInClausec                 C   s*   |  | }|  | }||d}|S r  )r   ZjqlIsOperatorr  )r}   r   r   r   r  r'   r'   r(   visitJqlIsClause  s    zJQL.visitJqlIsClausec           	      C   sj   |  | }| p$| p$| }|  |}g }| D ]}|  |}|r<|| q<|||d}|S )Nr   r   r   )r   ZjqlWasOperatorr  r  r  jqlWasPredicater   )	r}   r   r   r  r   r   predicate_ctxr   r  r'   r'   r(   visitJqlWasClause  s    

zJQL.visitJqlWasClausec                 C   s   |  | }| p| }|  |}|d tjkrP| ||d }||d< nN|d tjkr|d }|tj	kr|d t
jkrtd|j d|d j dg }| D ]}|  |}	|	r||	 q|||d	}
|
S )
Nri   r   r   r   r   r   r  r   r#  )r   ZjqlWasInOperatorr   r  r)   r-   r   r,   r/   r1   r   r#   r   r   rG   r   r$  r   )r}   r   r   r  r   r   r   r   r%  r   r  r'   r'   r(   visitJqlWasInClause  s,    


zJQL.visitJqlWasInClausec                 C   sV   |  | }tjdg d}g }| D ]}|  |}|r(|| q(|||d}|S )Nr   r   r#  )r   ZjqlChangedOperatorr)   r.   ZjqlChangedPredicater   )r}   r   r   r   r   r%  r   r  r'   r'   r(   visitJqlChangedClause  s    
zJQL.visitJqlChangedClausec                 C   s   t | }||d}|S Nr  r   r   r}   r   r   r  r'   r'   r(   visitJqlEqualsOperator  s
    zJQL.visitJqlEqualsOperatorc                 C   s,   t | }||t jkrt jnt jd}|S r)  )r   r   r    r   r$   r+  r'   r'   r(   visitJqlLikeOperator   s
    zJQL.visitJqlLikeOperatorc                 C   s   t | }||d}|S r)  r*  r+  r'   r'   r(   visitJqlComparisonOperator(  s
    zJQL.visitJqlComparisonOperatorc                 C   s    t | | }||d}|S r)  )r   r   r   r+  r'   r'   r(   visitJqlInOperator0  s
    zJQL.visitJqlInOperatorc                 C   s2   t | | }||t jkr$t jnt jd}|S r)  )r   r   r   r   r   r   r+  r'   r'   r(   visitJqlIsOperator8  s
    zJQL.visitJqlIsOperatorc                 C   s2   t | | }||t jkr$t jnt jd}|S r)  )r   r   r   r   r   r&   r+  r'   r'   r(   visitJqlWasOperator@  s
    zJQL.visitJqlWasOperatorc                 C   s2   t | | }||t jkr$t jnt jd}|S r)  )r   r   r   r"   r   r&   r+  r'   r'   r(   visitJqlWasInOperatorH  s
    zJQL.visitJqlWasInOperatorc                 C   s"   t | | }|t jd}|S r)  )r   r   r   r   r+  r'   r'   r(   visitJqlChangedOperatorP  s
    zJQL.visitJqlChangedOperatorc                 C   s(   |  p| p| }| ||}|S r   )jqlDatePredicateOperatorjqlDateRangePredicateOperatorjqlUserPredicateOperatorr  r}   r   r  r   r'   r'   r(   visitJqlWasPredicateX  s    zJQL.visitJqlWasPredicatec                 C   s0   |  p| p| p| }| ||}|S r   )r4  r5  r6  ZjqlValuePredicateOperatorr  r7  r'   r'   r(   visitJqlChangedPredicatea  s    zJQL.visitJqlChangedPredicatec                 C   sN  |  p| }| |}t|tjr| | }|stj	j
dd| gddgd}|sjtd| d|j}|ttj|d}q|d	 std
| dn2t|tjr|ttj|d}ntd| d|d }|dg }|st|dr|jr||j |s2t|dr2|jr2||j ||d< | |j|d< |S )NZcaptionr   --rG   r   !   Неизвестное поле 'r   )rG   rH   rJ   
   Поле '#   ' не поддерживаетсяrH   r[   modelsortable)	jqlStringZjqlCustomFieldr   r   r	   JqlStringContextr   lowerr[   CmfCustFieldsgetr   UnknownFieldErrorrG   getattrrX   
FieldErrorJqlCustomFieldContextr   r   r>  r   r   r   r   )r}   r   Z	field_ctxr   r   custom_fieldrH   field_modelsr'   r'   r(   visitJqlNonNumberFieldk  s>    



zJQL.visitJqlNonNumberFieldc                 C   sv   |  }| j d| }d| d| j  }tjjddd|gdd|ggddgd	}|sptd
| d| d|jS )Nr   Zcf__r   rG   r   rF   r:  r   +   Пользовательское поле '' (   ) не найдено)	Z	POSNUMBERru   rB  r[   rC  rD  r   CustomFieldErrorrG   )r}   r   field_idfield_ext_idr   rI  r'   r'   r(   visitJqlCustomField  s    zJQL.visitJqlCustomFieldc                 C   s@   |  }|dr|ds0|dr<|dr<|dd }|S )Nr   "r   r   )r   
startswithendswith)r}   r   rh   r'   r'   r(   visitJqlString  s    zJQL.visitJqlStringc                 C   s   |  S r   )r   r}   r   r'   r'   r(   visitJqlNumber  s    zJQL.visitJqlNumberc                 C   s   t j| dd d}|S )Nr*   ri   r   r   r   )r)   r*   r   )r}   r   r  r'   r'   r(   visitJqlEmpty  s    zJQL.visitJqlEmptyc              
   C   s  d }|  p| }| |}| j}|d }|j}|dg }|d}	| j}
z| jtj	krl| 
|}n| jtjkrtd|r|d| d}|d dkrd	| |d
< n|}n| jtjkr8|dkr| |\}}d| d|d}nF|dkrZtjjdd|gddd ggd}|sFtjjddd| dgddd ggd}|r8t|j}nt|tjtjtjfrtd|r|d| d}|d dkrd	| |d
< n|}nd|kr| 
|}nj|r|	rd }dg}|D ]}|	D ]}|dkrD|dkr| j d| }n| j d| }|ddd| dg nH|dkrz|ddd| dg ||d| g n||d| g qt|j|d}|r|j} q8qn~|jr|jd kr|rtj |dd!d"}n|}d| d|d}n:|jr4|jd#kr4t|j!j|d$}|r8|j"}n|}|sFt#d%W n` t#k
r } z@|
r~t$d&| d'|
 d(| nt$d&| d)| d(| W 5 d }~X Y nX t%j&| '|t(|t)k	rd| dn|d* t(|t)k	rt|n|d
 d+}|S ),NrH   r[   rI   z^-?[0-9]+(w|d|h|m?)( +)?$now()r  r   -znow()+r   r_   rT  
logic_typerG   r   rF   r   r   r]   r   z%"z"%r   r   )affected_versionsfix_versionsz
::version:r   rr   )rW   ra   Zimport_raw_jsonz%"key":"Z	CmfChoice    )seplengthZCmfM2Mr   u;   Возможно объект не импортированu&   Не найдено значение 'u   ' в предикате 'z'. u   ' для поля 'r   rZ  )*r@  	jqlNumberr   rw   r   r   rx   ry   r@   rB   r   rC   rematchrA   r   r[   ZCmfLogicTyper   rW   r   r   ZCmfDateTimeZCmfDateZCmfTimeru   r   ZcmfutilZget_model_by_namerD  ZcustomZwidgetZtranslit_stripr>  rY   r   r   r)   r+   r   ri   dict)r}   r   Z	new_value	value_ctxr   r   rH   r   rJ  rI   r   Zpriority_idZpriority_namer^  objr   Zfield_modelZsearch_fieldrF   Z
choice_keyr   r  r'   r'   r(   visitJqlValue  s    









, zJQL.visitJqlValuec              
   C   s  z|  | }W n2 tk
rD } ztd| W 5 d }~X Y nX | r\|  | ng }| |}d }g }|tjkrd}n|tj	krd}n|tj
krl| j}t|d tjrtd|j d|d j dg }	|D ]Z}
tjjdd	d
|
gdd
|
ggdd	gd}|r|	|j q| jd|
 d|j d q|	sRtd|j ddd|	 d}d}|	}tj||| ||||dd}|S )Nu2   Функция не поддерживается. r\  Z__G_CURRENT_USERrH   r   u0   ' не поддерживается полем 'z' (M2M)r   rW   r   rG   r:  r   u&   Не найдена аргумент 'u   ' функции 'r   u,   ' не содержит аргументовz
membersOf(r   r   Z	MEMBER_OF)r   r   )ri   r   r   r   r   r   )r   ZjqlFunctionNamer   r   ZFunctionErrorZjqlArgumentListr   r/   r0   r2   r1   rw   r   r   r   rG   r   r[   ZCmfPersonGrouprD  r   rW   rv   r   r)   r,   )r}   r   r   r   r   r   Zbql_functionZbql_argumentsr   groupsargumentgroupr  r'   r'   r(   visitJqlFunction8  s^    "


zJQL.visitJqlFunctionc                 C   s   t |  S r   )r/   r   r   rX  r'   r'   r(   visitJqlFunctionNamet  s    zJQL.visitJqlFunctionNamec                 C   s.   g }|  D ]}| |}|r|| q|S r   )ZjqlArgumentr   r   )r}   r   r   Zargument_ctxrl  r'   r'   r(   visitJqlArgumentListw  s    
zJQL.visitJqlArgumentListc           	      C   s   |  |}g }| D ]}|  |}z6| |}|d tjkrN||d  n
|| W q tk
r } z| jd| d|  W 5 d }~X Y qX q|st	d| dtj||d}|S )Nri   r   r   r   u   Для операндов 'u   ' не найдены варианты для замены, возможно объекты еще не импортированы)ri   r   r   )
r   Z
jqlOperandr   r)   r-   r   r   r   rv   r   )	r}   r   r   r   r  r   r   r   r  r'   r'   r(   visitJqlList  s,    



zJQL.visitJqlListc                 C   s   |  p| }| |S r   )r@  rd  r   )r}   r   rh  r'   r'   r(   visitJqlArgument  s    zJQL.visitJqlArgumentc                 C   sj   g }|  D ]}| |}|r|| q|s6|  S dddd |D  dddd |D gd}|S )	Nz	ORDER BY r   c                 S   s   g | ]}|d  qS r   r'   r   r   r'   r'   r(   r     s     z'JQL.visitJqlOrderBy.<locals>.<listcomp>r   r   c                 S   s   g | ]}|d  qS r   r'   rs  r'   r'   r(   r     s     r  )ZjqlSearchSortr   r   r  r   )r}   r   r   cr  r'   r'   r(   visitJqlOrderBy  s    
zJQL.visitJqlOrderByc              
   C   s   z|  | }|d }|d }|d s:td| d|jrR| d|jj n||jrr|jjdkrrd|j n|jd	}|W S  tk
r } z.| j	d
| 
| d|  |   W Y S d }~X Y nX d S )NrG   rH   r?  r<  u4   ' не поддерживает сортировкуr   ZDESCr]  r  u%   Условие сортировки 'r  )r   r  r   rG  orderrh   r   r   rv   r   r   r  )r}   r   r   r   rH   r  r   r'   r'   r(   visitJqlSearchSort  s    "zJQL.visitJqlSearchSort)N)N)NF)N)}r   r   r   r[   rX   r_  Zapprovers_forZresponsiblerM   Zcomments
componentsr   r   rh   Zdeadliner`  rW   r\   r^   r_   r`   Z	cmf_ownerrc   Zstatus_closed_atZlistsrf   rG   r^  Zcmf_modified_atrk   r   rt   r{   r   r   classmethodr   r   r   rz   r   r   r   r   r   r   r   r   r  r	   ZJqlQueryContextr  ZJqlOrClauseContextr
  ZJqlAndClauseContextr  ZJqlNotClauseContextr  ZJqlSubClauseContextr  ZJqlTerminalClauseContextr  ZJqlEqualsClauseContextr  ZJqlLikeClauseContextr  ZJqlComparisonClauseContextr  ZJqlInClauseContextr!  ZJqlIsClauseContextr"  ZJqlWasClauseContextr&  ZJqlWasInClauseContextr'  ZJqlChangedClauseContextr(  ZJqlEqualsOperatorContextr,  ZJqlLikeOperatorContextr-  ZJqlComparisonOperatorContextr.  ZJqlInOperatorContextr/  ZJqlIsOperatorContextr0  ZJqlWasOperatorContextr1  ZJqlWasInOperatorContextr2  ZJqlChangedOperatorContextr3  ZJqlWasPredicateContextr8  ZJqlChangedPredicateContextr9  ZJqlNonNumberFieldContextrK  rH  rS  rA  rW  ZJqlNumberContextrY  ZJqlEmptyContextr[  ZJqlValueContextrj  ZJqlFunctionContextrn  ZJqlFunctionNameContextro  ZJqlArgumentListContextrp  ZJqlListContextrq  ZJqlArgumentContextrr  ZJqlOrderByContextru  ZJqlSearchSortContextrw  __classcell__r'   r'   r~   r(   rD   Y   s    
       

    		           
6

#
b
+	
(		|<	rD   c                   @   s4   e Zd Zdd Zd	ddZed
eedddZdS )JQLNormalizerc                 C   s   t  | _g | _d S r   )rD   visitorrv   r|   r'   r'   r(   rt     s    zJQLNormalizer.__init__Nc           	      C   sR   |pd| j _t|}t|}t|}t|}| }| j |}| j j	| _	|S rq   )
r|  ru   antlr4ZInputStreamr   ZCommonTokenStreamr	   ZjqlQueryr   rv   )	r}   Zjqlru   Zinput_streamZlexerstreamparserZtreer  r'   r'   r(   get_modified  s    


zJQLNormalizer.get_modified)r   ru   c           	      C   s   |pd}| dr|dd}|d\}}| d| }| d|  }tjjddd	|gd
d	|ggd}|std| d| dnNt	
| }|std| dn(|dstd| dn
|d j}|S )Nrr   Zcustomfield_ZcustomfieldcfrL  r   r   rG   r   rF   r   rM  rN  rO  r;  r   rJ   r<  r=  rH   )rU  r   splitrB  r[   rC  rD  r   rP  rD   r   rE  r   rG  r   )	r}   r   ru   rL  rQ  rR  r   rI  Zmapped_fieldr'   r'   r(   convert_field  s.    


zJQLNormalizer.convert_field)N)N)r   r   r   rt   r  ry  r   r  r'   r'   r'   r(   r{    s   
r{  )re  r}  enumr   pathlibr   Zcmfr   Zcmf.includer   r   r   r	   r
   r   r)   r/   r5   r=   r@   rD   r{  r'   r'   r'   r(   <module>   s6   
          {