B
    f^                 @   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_prefix
logic_typeZremaining_estimateZ
cmf_authorZstatus_closed_atresolvedZlistsstatusZ	CmfStatusztimetracker_history.time_spentCmfLogicTypetypeZcmf_modified_atupdatedZ
spectators)7ZaffectedversionZ	approvalsZassigneer   categoryzchange-gating-type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 )N)startstopZgetInputStreamgetText)r-   ctxr2   r3   r0   r0   r1   	_get_text&  s    zJQL._get_textc          
   C   s   d }y| j |}W n6 tk
rJ } z| jj| d W d 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   sD   g }x(|  D ]}| |}|r|| qW |r<d|S |  S )Nz OR )ZjqlAndClauserB   appendjoindefaultResult)r-   r5   clausescZ
and_clauser0   r0   r1   visitJqlOrClauseH  s    
zJQL.visitJqlOrClausec             C   sD   g }x(|  D ]}| |}|r|| qW |r<d|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   sz   y.|  | }|  | }|d  d| S  tk
rt } z(| jj| d| | d |  S d }~X Y nX d S )Nr   rA   u   . Условие "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 )Nr   rA   )rB   ZjqlLikeOperatorrT   )r-   r5   rU   rV   r0   r0   r1   visitJqlLikeClause|  s    zJQL.visitJqlLikeClausec             C   s,   |  | }|  |d}| d| S )Nr   rA   )rB   ZjqlComparisonOperatorrT   )r-   r5   rU   rV   r0   r0   r1   visitJqlComparisonClause  s    zJQL.visitJqlComparisonClausec             C   s8   |  | }|  |d}|r0| d| S |  S )Nr   rA   )rB   ZjqlInOperatorrT   rG   )r-   r5   rU   rV   r0   r0   r1   visitJqlInClause  s    zJQL.visitJqlInClausec             C   s*   |  | }|  | }| d| S )NrA   )rB   ZjqlIsOperatorZjqlEmpty)r-   r5   rU   emptyr0   r0   r1   visitJqlIsClause  s    zJQL.visitJqlIsClausec             C   s$   |  | }td| dd S )Nu   Оператор "u#   " не поддерживается)rB   ZjqlWasOperatorr   ClauseError)r-   r5   rU   r0   r0   r1   visitJqlWasClause  s    zJQL.visitJqlWasClausec             C   s$   |  | }td| dd S )Nu   Оператор "u#   " не поддерживается)rB   ZjqlWasInOperatorr   r]   )r-   r5   rU   r0   r0   r1   visitJqlWasInClause  s    zJQL.visitJqlWasInClausec             C   s$   |  | }td| dd S )Nu   Оператор "u#   " не поддерживается)rB   ZjqlChangedOperatorr   r]   )r-   r5   rU   r0   r0   r1   visitJqlChangedClause  s    zJQL.visitJqlChangedClausec             C   s   |  S )N)r4   )r-   r5   r0   r0   r1   visitJqlEqualsOperator  s    zJQL.visitJqlEqualsOperatorc             C   s   |  S )N)r4   )r-   r5   r0   r0   r1   visitJqlLikeOperator  s    zJQL.visitJqlLikeOperatorc             C   s   |  S )N)r4   )r-   r5   r0   r0   r1   visitJqlComparisonOperator  s    zJQL.visitJqlComparisonOperatorc             C   s   |  rdS dS )NzNOT ININ)NOT)r-   r5   r0   r0   r1   visitJqlInOperator  s    zJQL.visitJqlInOperatorc             C   s   |  rdS dS )NzIS NOTZIS)re   )r-   r5   r0   r0   r1   visitJqlIsOperator  s    zJQL.visitJqlIsOperatorc             C   s   |  rdS dS )NzWAS NOTZWAS)re   )r-   r5   r0   r0   r1   visitJqlWasOperator  s    zJQL.visitJqlWasOperatorc             C   s   |  rdS dS )Nz
WAS NOT INzWAS IN)re   )r-   r5   r0   r0   r1   visitJqlWasInOperator  s    zJQL.visitJqlWasInOperatorc             C   s   |  S )N)r4   )r-   r5   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
   Поле "u#   " не поддерживаетсяZcaptionILIKEr   field_custom_type)r$   fieldsT)r   r   customu!   Неизвестное поле ")Z	jqlStringrB   replacefield_mappinggetlowerr   Z
FieldErrormodelsCmfCustFieldr*   r   rn   ZUnknownFieldErrorZjqlCustomField)r-   r5   Zstring_fieldrl   r   
cust_fieldZcustom_fieldr0   r0   r1   visitJqlNonNumberField  s.    




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 )Nz::Zcf_r>   ORr   rm   r
   rn   )r$   ro   u+   Пользовательское поле "z" (u   ) не найдено)Z	POSNUMBERr+   rt   ru   rv   rs   r   ZCustomFieldError)r-   r5   Zfield_idZfield_ext_id
field_namerw   r0   r0   r1   visitJqlCustomField  s    
zJQL.visitJqlCustomFieldc             C   s   |  S )N)r4   )r-   r5   r0   r0   r1   visitJqlString  s    zJQL.visitJqlStringc             C   s   |  S )N)r4   )r-   r5   r0   r0   r1   visitJqlEmpty  s    zJQL.visitJqlEmptyc             C   s  d }|  dddd}yV|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 d 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}q|dkrddddddddddddd}d }||}|rvtjjdd|gd}|stjjdd|gd}|rt|j}n|	dkr| |}n|	r||
r|dg}x|
D ]}|d kr@|d!kr| j d"| }n,|d#kr| j d$| }n| j d%| }|d dd&| d&g n||d| g qW t|	j|d}|rt|j}nd| d}nB|d'r|d(d)kr| |}nd| d}nd| d}|st
d*| d+| d,|S )-Nrk   r@   r8   u1   Невозможно найти значение z. rl   r   r   r   r   u   Минимальныйu   Низкийu   Обычныйu   Высокийu   Критичныйu   Блокирующий)ZLowestu   Самый низкийu   НизшийZLowu   Низкийu   СреднийZMediumZHighu   Высокийu   Высшийu   НаивысшийZHighestu   Критическийr   ztask.epic:defaultztask.agile:defaultztask.userstory:defaultztask.bug:defaultztask.sub:default)u   ЭпикZEpicu   ЗадачаZTasku   ИсторияZStoryu   Ошибкаu   БагZBugu   ПодзадачаzSub-taskZSubtaskr   z==)r$   r   rm   r   ry   r
   )r	   r   z
::version:r   z%::z::%rp   r   )r=   Zusersu   Для поля "uI   " не найден вариант для замены значения "uE   ", возможно объект еще не импортирован)r4   rq   Z	parentCtx
isinstancer   JqlTerminalClauseContextrB   rR   JqlListContextr9   
ValueErrorrs   ru   r   r*   r   r?   r+   rE   ZcmfutilZget_model_by_namesget)r-   r5   Z	new_valueZcurrent_valuer   r   Zlist_parentr<   rz   r   r   objZpriority_mappingZlogic_type_mappingr   Zlogic_type_codeZfilter_Zsearch_fieldr
   r0   r0   r1   visitJqlValue  s    &







zJQL.visitJqlValuec             C   sh   |  | }|dkr| S |dkrR|  | }|rJdd| dS |  S td| dd S )NZcurrentUserZ	membersOfrO   z, rP   u   Функция "u#   " не поддерживается)rB   ZjqlFunctionNamer4   ZjqlArgumentListrF   rG   r   ZFunctionError)r-   r5   Zfunction_nameZargument_listr0   r0   r1   visitJqlFunction[  s    zJQL.visitJqlFunctionc             C   s   |  S )N)r4   )r-   r5   r0   r0   r1   visitJqlFunctionNamef  s    zJQL.visitJqlFunctionNamec             C   s2   g }x(|  D ]}| |}|r|| qW |S )N)ZjqlArgumentrB   rE   )r-   r5   argsargumentargr0   r0   r1   visitJqlArgumentListi  s    
zJQL.visitJqlArgumentListc             C   sL   g }x(|  D ]}| |}|r|| qW |rDdd| dS |  S )NrO   z, rP   )Z
jqlOperandrB   rE   rF   rG   )r-   r5   ZoperandsZoperandresultr0   r0   r1   visitJqlListr  s    
zJQL.visitJqlListc             C   s   |  S )N)r4   )r-   r5   r0   r0   r1   visitJqlArgument{  s    zJQL.visitJqlArgumentc             C   sJ   g }x(|  D ]}| |}|r|| qW |rBdd| S |  S )Nz	ORDER BY z, )ZjqlSearchSortrB   rE   rF   rG   )r-   r5   Zsearch_sortrI   r   r0   r0   r1   visitJqlOrderBy~  s    
zJQL.visitJqlOrderByc          
   C   s~   y2|  | }|d }|jr0| d|jj S |S  tk
rx } z(| jj| d| | d | 	 S d }~X Y nX d S )Nr   rA   u'   . Условие сортировки "u/   " будет удалено из запроса)
rB   rR   orderr   r9   r)   r:   r;   r6   rG   )r-   r5   r   rz   r<   r0   r0   r1   visitJqlSearchSort  s    zJQL.visitJqlSearchSort)M__name__
__module____qualname__rr   r(   r6   r?   r   ZJqlQueryContextrD   ZJqlOrClauseContextrJ   ZJqlAndClauseContextrL   ZJqlNotClauseContextrN   ZJqlSubClauseContextrQ   r   rS   ZJqlEqualsClauseContextrW   ZJqlLikeClauseContextrX   ZJqlComparisonClauseContextrY   ZJqlInClauseContextrZ   ZJqlIsClauseContextr\   ZJqlWasClauseContextr^   ZJqlWasInClauseContextr_   ZJqlChangedClauseContextr`   ZJqlEqualsOperatorContextra   ZJqlLikeOperatorContextrb   ZJqlComparisonOperatorContextrc   ZJqlInOperatorContextrf   ZJqlIsOperatorContextrg   ZJqlWasOperatorContextrh   ZJqlWasInOperatorContextri   ZJqlChangedOperatorContextrj   ZJqlNonNumberFieldContextrx   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      sR  




		&e		
r   c               @   s   e Zd Zdd Zdd ZdS )JQLNormalizerc             C   s
   || _ d S )N)_jira_import)r-   r.   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     s   r   )	r   Zcmf.includer@   r   r   r   r   r   r   r0   r0   r0   r1   <module>   s        