U
    9Lf^                     @   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-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.   ctxr4   r5   r2   r2   r3   	_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_r2   r2   r3   _get_user_code+  s    &zJQL._get_user_code)r7   c                 C   sX   d}|  r| |  nd }| r4| | nd }|rD||7 }|rT|d| 7 }|S )N  )ZjqlWherevisitZ
jqlOrderBy)r.   r7   ZquerywhereZorder_byr2   r2   r3   visitJqlQuery;  s    zJQL.visitJqlQueryc                 C   s@   g }|  D ]}| |}|r|| q|r8d|S |  S )Nz OR )ZjqlAndClauserD   appendjoindefaultResult)r.   r7   clausescZ
and_clauser2   r2   r3   visitJqlOrClauseH  s    
zJQL.visitJqlOrClausec                 C   s@   g }|  D ]}| |}|r|| q|r8d|S |  S )Nz AND )jqlNotClauserD   rG   rH   rI   )r.   r7   rJ   rK   Z
not_clauser2   r2   r3   visitJqlAndClauseQ  s    
zJQL.visitJqlAndClausec                 C   sr   |  r| |  }n.| r0| | }n| rF| | }|rf|jrb|jj d| S |S |  S d S NrC   )rM   rD   ZjqlSubClauseZjqlTerminalClauseis_notr   rI   )r.   r7   Zclauser2   r2   r3   visitJqlNotClauseZ  s    zJQL.visitJqlNotClausec                 C   s&   |  | }|rd| dS |  S )N())rD   ZjqlOrClauserI   )r.   r7   Z	or_clauser2   r2   r3   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   rC   u   . Условие "/   " будет удалено из запроса)	rD   jqlFieldZjqlTerminalClauseRhsr;   r)   r<   r=   r8   rI   )r.   r7   r   t   terminal_сlauser>   r2   r2   r3   visitJqlTerminalClausek  s    zJQL.visitJqlTerminalClausec                 C   s,   |  | }|  |d}| d| S Nr   rC   )rD   ZjqlEqualsOperatorgetChildr.   r7   operatorvaluer2   r2   r3   visitJqlEqualsClausev  s    zJQL.visitJqlEqualsClausec                 C   s,   |  | }|  |d}| d| S rX   )rD   ZjqlLikeOperatorrY   rZ   r2   r2   r3   visitJqlLikeClause|  s    zJQL.visitJqlLikeClausec                 C   s,   |  | }|  |d}| d| S rX   )rD   ZjqlComparisonOperatorrY   rZ   r2   r2   r3   visitJqlComparisonClause  s    zJQL.visitJqlComparisonClausec                 C   s8   |  | }|  |d}|r0| d| S |  S rX   )rD   ZjqlInOperatorrY   rI   rZ   r2   r2   r3   visitJqlInClause  s    zJQL.visitJqlInClausec                 C   s*   |  | }|  | }| d| S rO   )rD   ZjqlIsOperatorZjqlEmpty)r.   r7   r[   emptyr2   r2   r3   visitJqlIsClause  s    zJQL.visitJqlIsClausec                 C   s$   |  | }td| dd S Nu   Оператор "#   " не поддерживается)rD   ZjqlWasOperatorr   ClauseErrorr.   r7   r[   r2   r2   r3   visitJqlWasClause  s    zJQL.visitJqlWasClausec                 C   s$   |  | }td| dd S rc   )rD   ZjqlWasInOperatorr   re   rf   r2   r2   r3   visitJqlWasInClause  s    zJQL.visitJqlWasInClausec                 C   s$   |  | }td| dd S rc   )rD   ZjqlChangedOperatorr   re   rf   r2   r2   r3   visitJqlChangedClause  s    zJQL.visitJqlChangedClausec                 C   s   |  S r&   r6   r.   r7   r2   r2   r3   visitJqlEqualsOperator  s    zJQL.visitJqlEqualsOperatorc                 C   s   |  S r&   rj   rk   r2   r2   r3   visitJqlLikeOperator  s    zJQL.visitJqlLikeOperatorc                 C   s   |  S r&   rj   rk   r2   r2   r3   visitJqlComparisonOperator  s    zJQL.visitJqlComparisonOperatorc                 C   s   |  rdS dS )NzNOT ININZNOTrk   r2   r2   r3   visitJqlInOperator  s    zJQL.visitJqlInOperatorc                 C   s   |  rdS dS )NzIS NOTZISrp   rk   r2   r2   r3   visitJqlIsOperator  s    zJQL.visitJqlIsOperatorc                 C   s   |  rdS dS )NzWAS NOTZWASrp   rk   r2   r2   r3   visitJqlWasOperator  s    zJQL.visitJqlWasOperatorc                 C   s   |  rdS dS )Nz
WAS NOT INzWAS INrp   rk   r2   r2   r3   visitJqlWasInOperator  s    zJQL.visitJqlWasInOperatorc                 C   s   |  S r&   rj   rk   r2   r2   r3   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'rB   r:   r   Fr   )r   mapped_fieldu
   Поле "rd   ZcaptionILIKEr   field_custom_typer#   ZfieldsT)r   r   customu!   Неизвестное поле ")Z	jqlStringrD   replacefield_mappinggetlowerr   Z
FieldErrormodelsCmfCustFieldr*   r   ry   ZUnknownFieldErrorZjqlCustomField)r.   r7   Zstring_fieldrw   r   
cust_fieldZcustom_fieldr2   r2   r3   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   rx   r
   ry   rz   u+   Пользовательское поле "z" (u   ) не найдено)Z	POSNUMBERr+   r   r   r   r~   r   ZCustomFieldError)r.   r7   Zfield_idZfield_ext_id
field_namer   r2   r2   r3   visitJqlCustomField  s    zJQL.visitJqlCustomFieldc                 C   s   |  S r&   rj   rk   r2   r2   r3   visitJqlString  s    zJQL.visitJqlStringc                 C   s   |  S r&   rj   rk   r2   r2   r3   visitJqlEmpty  s    zJQL.visitJqlEmptyc                 C   s  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}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|	rx|
rxdg}|
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 qt|	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 )-Nrv   rB   r:   u1   Невозможно найти значение z. rw   r   r   r   r   u   Минимальный   Низкийu   Обычный   Высокийu   Критичныйu   Блокирующий)ZLowestu   Самый низкийu   НизшийZLowr   u   СреднийZMediumZHighr   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   rx   r   r   r
   )r	   r   z
::version:r   z%::r   %r{   r   )r?   Zusersu   Для поля "uI   " не найден вариант для замены значения "uE   ", возможно объект еще не импортирован)r6   r|   Z	parentCtx
isinstancer   JqlTerminalClauseContextrD   rV   JqlListContextr;   
ValueErrorr~   r   r   r*   r   rA   r+   rG   ZcmfutilZget_model_by_namesget)r.   r7   Z	new_valueZcurrent_valuer   r   Zlist_parentr>   r   r   r   objZpriority_mappingZlogic_type_mappingr   Zlogic_type_codeZfilter_Zsearch_fieldr
   r2   r2   r3   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	membersOfrR   , rS   u   Функция "rd   )rD   ZjqlFunctionNamer6   ZjqlArgumentListrH   rI   r   ZFunctionError)r.   r7   Zfunction_nameZargument_listr2   r2   r3   visitJqlFunction[  s    zJQL.visitJqlFunctionc                 C   s   |  S r&   rj   rk   r2   r2   r3   visitJqlFunctionNamef  s    zJQL.visitJqlFunctionNamec                 C   s.   g }|  D ]}| |}|r|| q|S r&   )ZjqlArgumentrD   rG   )r.   r7   argsargumentargr2   r2   r3   visitJqlArgumentListi  s    
zJQL.visitJqlArgumentListc                 C   sH   g }|  D ]}| |}|r|| q|r@dd| dS |  S )NrR   r   rS   )Z
jqlOperandrD   rG   rH   rI   )r.   r7   ZoperandsZoperandresultr2   r2   r3   visitJqlListr  s    
zJQL.visitJqlListc                 C   s   |  S r&   rj   rk   r2   r2   r3   visitJqlArgument{  s    zJQL.visitJqlArgumentc                 C   sF   g }|  D ]}| |}|r|| q|r>dd| S |  S )Nz	ORDER BY r   )ZjqlSearchSortrD   rG   rH   rI   )r.   r7   Zsearch_sortrK   r   r2   r2   r3   visitJqlOrderBy~  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   rC   u'   . Условие сортировки "rU   )
rD   rV   orderr   r;   r)   r<   r=   r8   rI   )r.   r7   r   r   r>   r2   r2   r3   visitJqlSearchSort  s    zJQL.visitJqlSearchSort)M__name__
__module____qualname__r}   r(   r8   rA   r   ZJqlQueryContextrF   ZJqlOrClauseContextrL   ZJqlAndClauseContextrN   ZJqlNotClauseContextrQ   ZJqlSubClauseContextrT   r   rW   ZJqlEqualsClauseContextr]   ZJqlLikeClauseContextr^   ZJqlComparisonClauseContextr_   ZJqlInClauseContextr`   ZJqlIsClauseContextrb   ZJqlWasClauseContextrg   ZJqlWasInClauseContextrh   ZJqlChangedClauseContextri   ZJqlEqualsOperatorContextrl   ZJqlLikeOperatorContextrm   ZJqlComparisonOperatorContextrn   ZJqlInOperatorContextrq   ZJqlIsOperatorContextrr   ZJqlWasOperatorContextrs   ZJqlWasInOperatorContextrt   ZJqlChangedOperatorContextru   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__r2   r2   r0   r3   r      s  
 
        	

   	  
        		&e		
r   c                   @   s   e Zd Zdd Zdd ZdS )JQLNormalizerc                 C   s
   || _ d S r&   )_jira_importr-   r2   r2   r3   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   rD   )	r.   ZjqlZinput_streamZlexerstreamparserZtreeZvisitorr   r2   r2   r3   get_modified  s    


zJQLNormalizer.get_modifiedN)r   r   r   r(   r   r2   r2   r2   r3   r     s   r   )	r   Zcmf.includerB   r   r   r   r   r   r   r2   r2   r2   r3   <module>   s        