U
    gfZ                     @   sb   d dl 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ZdS )    N)*   )
exceptions)jqlLexer)	jqlParser)
jqlVisitorc                8       s  e Zd Zddddgdddddd	d
ddddgddddddddddidddddddgddddddddddd
ddddgdddddddddddddddddiddddgddddidddddgddddiddidd dd!gddddiddiddiddid"d"dddgddd"d#dddgddd$ddd%d&dd'ddgddd(ddd)ddd)ddd*d
ddddgddddiddiddid+ddd+d,ddd-dddgddd.d/ddgddddddddd0ddd(d1ddgddd(d2d1ddgddd3ddd3d4ddddiddid5d
ddddgddddiddiddiddid67Z fd7d8Zd9d: Zd;d< Zejd=d>d?Z	ej
d=d@dAZejd=dBdCZejd=dDdEZejd=dFdGZejd=dHdIZejd=dJdKZejd=dLdMZejd=dNdOZejd=dPdQZejd=dRdSZejd=dTdUZej d=dVdWZ!ej"d=dXdYZ#ej$d=dZd[Z%ej&d=d\d]Z'ej(d=d^d_Z)ej*d=d`daZ+ej,d=dbdcZ-ej.d=dddeZ/ej0d=dfdgZ1ej2d=dhdiZ3ej4d=djdkZ5ej6d=dldmZ7ej8d=dndoZ9ej:d=dpdqZ;ej<d=drdsZ=ej>d=dtduZ?ej@d=dvdwZAejBd=dxdyZCejDd=dzd{ZEejFd=d|d}ZGejHd=d~dZIejJd=ddZK  ZLS )JQLaffected_versionsZCmfListext_idnameT)fieldmodel	search_by	supportedZapprovers_for)r   r   Zresponsible	CmfPersonZloginZemailattachmentsFzparent.categoryr   ZcommentsZ
componentsZCmfComponentZcmf_created_atcreated)r   replace_field_namer   Z	cmf_ownertextZdeadlineduefix_versionscodeZCmfTask)r   r   r   r   r   ZtagsZCmfTagaliasZparent_taskz"epic link"priorityparentZ
CmfProjectZtask_code_prefixZ
logic_typeZremaining_estimateZ
cmf_authorZstatus_closed_atresolvedZlistsstatusZ	CmfStatusztimetracker_history.time_spentZCmfLogicTypetypeZcmf_modified_atupdatedZ
spectators)7ZaffectedversionZ	approvalsZassigneer   categoryzchange-gating-typeZcommentZ	componentr   ZcreateddateZcreatordescriptionr   ZduedateZenvironmentfilterZ
fixversionZhierarchylevelZissuekeyZ	issueLinkZissueLinkTypelabelsZ
lastViewedlevelZorganizationsZoriginalEstimater   z	epic linkr   ZprojectZprojecttypeZremainingestimateZtimeestimateZreporterzrequest-channel-typezrequest-last-activity-timeZ
resolutionr   ZresolutiondateZsprintr   Zsummaryr   Z	timespentr   Z	issuetyper   ZupdateddateZvoterZvotesZwatcherZworklogAuthorZworklogCommentZworklogDateZ	workRatioc                    s.   t    |j| _t| jjjj| _|| _d S N)super__init__
cmf_importstrZpluginsource_hash
api_importselfjira_import	__class__ ./modules/jira/jql/parser.pyr&      s    
zJQL.__init__c                 C   s"   |j j }|jj}|j  ||S r$   )startstopZgetInputStreamgetText)r,   ctxr2   r3   r0   r0   r1   	_get_text&  s    zJQL._get_textc              
   C   s   d }z| j |}W n6 tk
rJ } z| jj| d W 5 d }~X Y nBX | j j|ddd\}}|rvd|j d}n| jjd| d |S )NuG   . Возможно пользователь был удален в JiraF)Zcreateupdate"u   Пользователь "u%   " не найден в системе)r*   Z_get_user_info_from_dump	Exceptionr'   loggerwarningZ_process_personr   )r,   Zuser_keyZ	user_codeZ	user_infoexcuser_r0   r0   r1   _get_user_code+  s    &zJQL._get_user_code)r5   c                 C   sX   d}|  r| |  nd }| r4| | nd }|rD||7 }|rT|d| 7 }|S )N  )ZjqlWherevisitZ
jqlOrderBy)r,   r5   ZquerywhereZorder_byr0   r0   r1   visitJqlQuery;  s    zJQL.visitJqlQueryc                 C   s@   g }|  D ]}| |}|r|| q|r8d|S |  S )Nz OR )ZjqlAndClauserB   appendjoindefaultResult)r,   r5   clausescZ
and_clauser0   r0   r1   visitJqlOrClauseH  s    
zJQL.visitJqlOrClausec                 C   s@   g }|  D ]}| |}|r|| q|r8d|S |  S )Nz AND )jqlNotClauserB   rE   rF   rG   )r,   r5   rH   rI   Z
not_clauser0   r0   r1   visitJqlAndClauseQ  s    
zJQL.visitJqlAndClausec                 C   sr   |  r| |  }n.| r0| | }n| rF| | }|rf|jrb|jj d| S |S |  S d S NrA   )rK   rB   ZjqlSubClauseZjqlTerminalClauseis_notr   rG   )r,   r5   Zclauser0   r0   r1   visitJqlNotClauseZ  s    zJQL.visitJqlNotClausec                 C   s&   |  | }|rd| dS |  S )N())rB   ZjqlOrClauserG   )r,   r5   Z	or_clauser0   r0   r1   visitJqlSubClauseg  s    zJQL.visitJqlSubClausec              
   C   s   z0|  | }|  | }|d  d| W S  tk
r~ } z0| jj| d| | d |   W Y S d }~X Y nX d S )Nr   rA   u   . Условие "/   " будет удалено из запроса)	rB   jqlFieldZjqlTerminalClauseRhsr9   r'   r:   r;   r6   rG   )r,   r5   r   t   terminal_сlauser<   r0   r0   r1   visitJqlTerminalClausek  s    zJQL.visitJqlTerminalClausec                 C   s,   |  | }|  |d}| d| S Nr   rA   )rB   ZjqlEqualsOperatorgetChildr,   r5   operatorvaluer0   r0   r1   visitJqlEqualsClausev  s    zJQL.visitJqlEqualsClausec                 C   s,   |  | }|  |d}| d| S rV   )rB   ZjqlLikeOperatorrW   rX   r0   r0   r1   visitJqlLikeClause|  s    zJQL.visitJqlLikeClausec                 C   s,   |  | }|  |d}| d| S rV   )rB   ZjqlComparisonOperatorrW   rX   r0   r0   r1   visitJqlComparisonClause  s    zJQL.visitJqlComparisonClausec                 C   s8   |  | }|  |d}|r0| d| S |  S rV   )rB   ZjqlInOperatorrW   rG   rX   r0   r0   r1   visitJqlInClause  s    zJQL.visitJqlInClausec                 C   s*   |  | }|  | }| d| S rM   )rB   ZjqlIsOperatorZjqlEmpty)r,   r5   rY   emptyr0   r0   r1   visitJqlIsClause  s    zJQL.visitJqlIsClausec                 C   s$   |  | }td| dd S Nu   Оператор "#   " не поддерживается)rB   ZjqlWasOperatorr   ClauseErrorr,   r5   rY   r0   r0   r1   visitJqlWasClause  s    zJQL.visitJqlWasClausec                 C   s$   |  | }td| dd S ra   )rB   ZjqlWasInOperatorr   rc   rd   r0   r0   r1   visitJqlWasInClause  s    zJQL.visitJqlWasInClausec                 C   s$   |  | }td| dd S ra   )rB   ZjqlChangedOperatorr   rc   rd   r0   r0   r1   visitJqlChangedClause  s    zJQL.visitJqlChangedClausec                 C   s   |  S r$   r4   r,   r5   r0   r0   r1   visitJqlEqualsOperator  s    zJQL.visitJqlEqualsOperatorc                 C   s   |  S r$   rh   ri   r0   r0   r1   visitJqlLikeOperator  s    zJQL.visitJqlLikeOperatorc                 C   s   |  S r$   rh   ri   r0   r0   r1   visitJqlComparisonOperator  s    zJQL.visitJqlComparisonOperatorc                 C   s   |  rdS dS )NzNOT ININZNOTri   r0   r0   r1   visitJqlInOperator  s    zJQL.visitJqlInOperatorc                 C   s   |  rdS dS )NzIS NOTZISrn   ri   r0   r0   r1   visitJqlIsOperator  s    zJQL.visitJqlIsOperatorc                 C   s   |  rdS dS )NzWAS NOTZWASrn   ri   r0   r0   r1   visitJqlWasOperator  s    zJQL.visitJqlWasOperatorc                 C   s   |  rdS dS )Nz
WAS NOT INzWAS INrn   ri   r0   r0   r1   visitJqlWasInOperator  s    zJQL.visitJqlWasInOperatorc                 C   s   |  S r$   rh   ri   r0   r0   r1   visitJqlChangedOperator  s    zJQL.visitJqlChangedOperatorc                 C   s  |  r| |  dddd}| j| }|rn|ddrZ|d||d}qtd| d	qtj	jd
d| gddgd}|rt
|jt
|jdd}qtd| dnB| r| | }t
|jt
|jdd}ntd| d|S )N'r@   r8   r   Fr   )r   mapped_fieldu
   Поле "rb   ZcaptionILIKEr   field_custom_typer!   ZfieldsT)r   r   customu!   Неизвестное поле ")Z	jqlStringrB   replacefield_mappinggetlowerr   Z
FieldErrormodelsCmfCustFieldr(   r   rw   ZUnknownFieldErrorZjqlCustomField)r,   r5   Zstring_fieldru   r   
cust_fieldZcustom_fieldr0   r0   r1   visitJqlNonNumberField  s6    

zJQL.visitJqlNonNumberFieldc                 C   st   |  }| j d| }d| d| j  }tjjddd|gdd|ggddgd	}|sptd
| d| d|S )N::Zcf_r>   ORr   rv   r
   rw   rx   u+   Пользовательское поле "z" (u   ) не найдено)Z	POSNUMBERr)   r}   r~   r   r|   r   ZCustomFieldError)r,   r5   Zfield_idZfield_ext_id
field_namer   r0   r0   r1   visitJqlCustomField  s    zJQL.visitJqlCustomFieldc                 C   s   |  S r$   rh   ri   r0   r0   r1   visitJqlString  s    zJQL.visitJqlStringc                 C   s   |  S r$   rh   ri   r0   r0   r1   visitJqlEmpty  s    zJQL.visitJqlEmptyc                 C   sj  d }|  dddd}zV|jj}t|tjrB| | }n.t|tjrp|jj}t|tjrp| | }W n6 t	k
r } zt
d| d| W 5 d }~X Y nX |dr|d d}|d d}	|d d	}
d }|d
kr$dddddddddddddd}d||| d}n|	dkr:| |}n|	r|
rdg}|
D ]}|dkr|dkrz| j d| }n,|dkr| j d| }n| j d| }|ddd| dg n||d| g qPt|	j|d}|rt|j}nd| d}nB|dr>|ddkr0| |}nd| d}nd| d}|sft
d | d!| d"|S )#Nrt   r@   r8   u1   Невозможно найти значение z. ru   r   r   r   r   u   Минимальный   Низкийu   Обычный   Высокийu   Критичныйu   Блокирующий)ZLowestu   Самый низкийu   НизшийZLowr   u   СреднийZMediumZHighr   u   Высшийu   НаивысшийZHighestu   Критическийr   r   r
   )r	   r   z
::version:r   z%::r   rv   %)r!   ry   r   )r=   Zusersu   Для поля "uI   " не найден вариант для замены значения "uE   ", возможно объект еще не импортирован)r4   rz   Z	parentCtx
isinstancer   JqlTerminalClauseContextrB   rT   JqlListContextr9   
ValueErrorr|   r?   r)   rE   ZcmfutilZget_model_by_namesgetr(   r   )r,   r5   Z	new_valueZcurrent_valuer   r   Zlist_parentr<   r   r   r   objZpriority_mappingZfilter_Zsearch_fieldr
   r0   r0   r1   visitJqlValue  sx    &




zJQL.visitJqlValuec                 C   sh   |  | }|dkr| S |dkrR|  | }|rJdd| dS |  S td| dd S )NZcurrentUserZ	membersOfrP   , rQ   u   Функция "rb   )rB   ZjqlFunctionNamer4   ZjqlArgumentListrF   rG   r   ZFunctionError)r,   r5   Zfunction_nameZargument_listr0   r0   r1   visitJqlFunctionA  s    zJQL.visitJqlFunctionc                 C   s   |  S r$   rh   ri   r0   r0   r1   visitJqlFunctionNameL  s    zJQL.visitJqlFunctionNamec                 C   s.   g }|  D ]}| |}|r|| q|S r$   )ZjqlArgumentrB   rE   )r,   r5   argsargumentargr0   r0   r1   visitJqlArgumentListO  s    
zJQL.visitJqlArgumentListc                 C   sH   g }|  D ]}| |}|r|| q|r@dd| dS |  S )NrP   r   rQ   )Z
jqlOperandrB   rE   rF   rG   )r,   r5   ZoperandsZoperandresultr0   r0   r1   visitJqlListX  s    
zJQL.visitJqlListc                 C   s   |  S r$   rh   ri   r0   r0   r1   visitJqlArgumenta  s    zJQL.visitJqlArgumentc                 C   sF   g }|  D ]}| |}|r|| q|r>dd| S |  S )Nz	ORDER BY r   )ZjqlSearchSortrB   rE   rF   rG   )r,   r5   Zsearch_sortrI   r   r0   r0   r1   visitJqlOrderByd  s    
zJQL.visitJqlOrderByc              
   C   s   z4|  | }|d }|jr0| d|jj n|W S  tk
r } z0| jj| d| | d | 	  W Y S d }~X Y nX d S )Nr   rA   u'   . Условие сортировки "rS   )
rB   rT   orderr   r9   r'   r:   r;   r6   rG   )r,   r5   r   r   r<   r0   r0   r1   visitJqlSearchSortn  s    zJQL.visitJqlSearchSort)M__name__
__module____qualname__r{   r&   r6   r?   r   ZJqlQueryContextrD   ZJqlOrClauseContextrJ   ZJqlAndClauseContextrL   ZJqlNotClauseContextrO   ZJqlSubClauseContextrR   r   rU   ZJqlEqualsClauseContextr[   ZJqlLikeClauseContextr\   ZJqlComparisonClauseContextr]   ZJqlInClauseContextr^   ZJqlIsClauseContextr`   ZJqlWasClauseContextre   ZJqlWasInClauseContextrf   ZJqlChangedClauseContextrg   ZJqlEqualsOperatorContextrj   ZJqlLikeOperatorContextrk   ZJqlComparisonOperatorContextrl   ZJqlInOperatorContextro   ZJqlIsOperatorContextrp   ZJqlWasOperatorContextrq   ZJqlWasInOperatorContextrr   ZJqlChangedOperatorContextrs   ZJqlNonNumberFieldContextr   ZJqlCustomFieldContextr   ZJqlStringContextr   ZJqlEmptyContextr   ZJqlValueContextr   ZJqlFunctionContextr   ZJqlFunctionNameContextr   ZJqlArgumentListContextr   r   r   ZJqlArgumentContextr   ZJqlOrderByContextr   ZJqlSearchSortContextr   __classcell__r0   r0   r.   r1   r      s  
 
        	

   	  
        		&K		
r   c                   @   s   e Zd Zdd Zdd ZdS )JQLNormalizerc                 C   s
   || _ d S r$   )_jira_importr+   r0   r0   r1   r&   {  s    zJQLNormalizer.__init__c           	      C   sF   t |}t|}t |}t|}| }t| jd}||}|S )N)r-   )	antlr4ZInputStreamr   ZCommonTokenStreamr   ZjqlQueryr   r   rB   )	r,   ZjqlZinput_streamZlexerstreamparserZtreeZvisitorr   r0   r0   r1   get_modified~  s    


zJQLNormalizer.get_modifiedN)r   r   r   r&   r   r0   r0   r0   r1   r   z  s   r   )	r   Zcmf.includer@   r   r   r   r   r   r   r0   r0   r0   r1   <module>   s       s