U
    AYgZ}                     @   sv   d dl Z d dl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ZdS )    N)fields)*   )
exceptions)jqlLexer)	jqlParser)
jqlVisitorc                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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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d
id,ejjdd-gdd.ejjddgddd/ejjddgddd0ejjddd1ejjdddd
id2ejjdd3gdd4ejjdd5gddd
idd
id6ejjd
ddd
idd
idd
idd
id73Z fd8d9Zd:d; Zd<d= Z d>d? Z!e"j#d@dAdBZ$e"j%d@dCdDZ&e"j'd@dEdFZ(e"j)d@dGdHZ*e"j+d@dIdJZ,e"j-d@dKdLZ.e"j/d@dMdNZ0e"j1d@dOdPZ2e"j3d@dQdRZ4e"j5d@dSdTZ6e"j7d@dUdVZ8e"j9d@dWdXZ:e"j;d@dYdZZ<e"j=d@d[d\Z>e"j?d@d]d^Z@e"jAd@d_d`ZBe"jCd@dadbZDe"jEd@dcddZFe"jGd@dedfZHe"jId@dgdhZJe"jKd@didjZLe"jMd@dkdlZNe"jOd@dmdnZPe"jQd@dodpZRe"jSd@dqdrZTe"jUd@dsdtZVe"jWd@dudvZXe"jYd@dwdxZZe"j[d@dydzZ\e"j]d@d{d|Z^e"j_d@d}d~Z`e"jad@ddZbe"jcd@ddZde"jed@ddZf  ZgS )JQLaffectedversionext_idnameT)r   	cmf_field	search_by	supported	approvals)r   r   r   assigneeattachmentsFr   comment	componentcreatedZcreateddate)r   r   r   aliasescreatordescriptiondueZduedateenvironmentZrequestZsavedfilterZsearchrequest)r   r   
fixversioncodeidZissuekey)r   r   r   r   r   tagsaliasZtimeoriginalestimateparent_taskz"epic link"priorityprojectZ
CmfProjectZtask_code_prefix)r   r   modelsr   r   ZtimeestimatereporterresolvedZresolutiondatesprintstatussummarytexttypeZ	issuetypeupdatedZupdateddatewatcher)3r
   r   r   r   categoryzchange-gating-typer   r   r   r   r   r   r   filterr   ZhierarchylevelZissuekeyZ	issueLinkZissueLinkTypelabelsZ
lastViewedlevelZorganizationsZoriginalEstimateparentz	epic linkZparentprojectr"   r#   ZprojecttypeZremainingestimater%   zrequest-channel-typezrequest-last-activity-timezrequest typeZ
resolutionr&   r'   r(   r)   r*   Z	timespentr+   r,   ZvoterZvotesr-   ZworklogAuthorZworklogCommentZworklogDateZ	workRatioc                    s"   t    |j| _|| _|| _d S N)super__init__
cmf_importsource_hash
api_import)selfr8   r7   	__class__ ./modules/jira/jql/parser.pyr5     s    
zJQL.__init__c                    s2   | j  }|s.tt fdd| j  d }|S )Nc                    s    |  dg kS )Nr   )get)fr   r<   r=   <lambda>(      z JQL._get_field.<locals>.<lambda>)field_mappingr>   nextr/   values)r9   r   fieldr<   r@   r=   
_get_field#  s    
zJQL._get_fieldc                 C   s"   |j j }|jj}|j  ||S r3   )startstopZgetInputStreamgetText)r9   ctxrH   rI   r<   r<   r=   	_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 n:X | j j|ddd\}}|rn|j}n| jjd| d |S )NuG   . Возможно пользователь был удален в JiraF)Zcreateupdateu   Пользователь "u%   " не найден в системе)r8   Z_get_user_info_from_dump	Exceptionr6   loggerwarningZ_process_personr   )r9   Zuser_keyZ	user_codeZ	user_infoexcuser_r<   r<   r=   _get_user_code4  s    &zJQL._get_user_code)rK   c                 C   s   d}g }|  r| |  nd }| r8| | nd }|rZ||d 7 }||d  |r||d|d  7 }||d  ||fS )N ubql2bql )ZjqlWherevisitZ
jqlOrderByappend)r9   rK   rV   rW   whereorder_byr<   r<   r=   visitJqlQueryD  s    zJQL.visitJqlQueryc                 C   s   g }|  D ]}| |}|r|| q|s6|  S ddd |D }t|dkrd|d d }n0t|dkrdg}|dd |D  n|  }||d	S )
Nz OR c                 S   s   g | ]}|d  qS rV   r<   .0clauser<   r<   r=   
<listcomp>^  s     z(JQL.visitJqlOrClause.<locals>.<listcomp>r   r   rW   ORc                 S   s   g | ]}|d  qS rW   r<   r_   r<   r<   r=   rb   c  s     rV   rW   )ZjqlAndClauserY   rZ   defaultResultjoinlenextend)r9   rK   clausescZ
and_clauserV   rW   r<   r<   r=   visitJqlOrClauseT  s    
zJQL.visitJqlOrClausec                 C   s   g }|  D ]}| |}|r|| q|s6|  S ddd |D }t|dkrd|d d }n0t|dkrdg}|dd |D  n|  }||d	S )
Nz AND c                 S   s   g | ]}|d  qS r^   r<   r_   r<   r<   r=   rb   s  s     z)JQL.visitJqlAndClause.<locals>.<listcomp>r   r   rW   ZANDc                 S   s   g | ]}|d  qS rd   r<   r_   r<   r<   r=   rb   x  s     re   )jqlNotClauserY   rZ   rf   rg   rh   ri   )r9   rK   rj   rk   Z
not_clauserV   rW   r<   r<   r=   visitJqlAndClausei  s    
zJQL.visitJqlAndClausec                 C   s   |  r| |  }n.| r0| | }n| rF| | }|sR|  S |jrn|jj d|d  n|d |d d}|S )NrX   rV   rW   re   )rm   rY   ZjqlSubClauseZjqlTerminalClauserf   is_notr*   )r9   rK   ra   resultr<   r<   r=   visitJqlNotClause~  s    "zJQL.visitJqlNotClausec                 C   s8   |  | }|s|  S d|d  d|d d}|S )N(rV   )rW   re   )rY   ZjqlOrClauserf   )r9   rK   Z	or_clauserp   r<   r<   r=   visitJqlSubClause  s    zJQL.visitJqlSubClausec              
   C   sF  z|  | }|  | }|d }|j}t|tjrXt| dt	j
sX| d}|d  d|d  ||d d |d d	 gd
}|d dkr|d d	 }|d d }ddd|ddgdd|ddgd||gd||gg}	|	|d< |W S  tk
r@ }
 z0| jj|
 d| | d |   W Y S d }
~
X Y nX d S )Nr   r   z.coder   rX   rV   rW   operatorvaluere   r*   rc   r   =%rU   r   u   . Условие "/   " будет удалено из запроса)rY   jqlFieldZjqlTerminalClauseRhs
class_name
issubclassr   Z
CmfRelBase
isinstancegetChildr   JqlFunctionContextreplacerN   r6   rO   rP   rL   rf   )r9   rK   rF   t   terminal_сlauser   
field_namerp   Z	bql_valueZbql_operatorrW   rQ   r<   r<   r=   visitJqlTerminalClause  s@    



	zJQL.visitJqlTerminalClausec                 C   sD   |  | }|  |d}| d|d  ||d dd}|S Nr   rX   rV   rW   ru   rv   re   )rY   ZjqlEqualsOperatorr~   r9   rK   ru   rv   rp   r<   r<   r=   visitJqlEqualsClause  s    zJQL.visitJqlEqualsClausec                 C   sT   |  | }|  |d}|d  d|d  |d d|d  ddd}|S )Nr   rV   rX   rW   rx   r   re   )rY   ZjqlLikeOperatorr~   r   r<   r<   r=   visitJqlLikeClause  s    zJQL.visitJqlLikeClausec                 C   sD   |  | }|  |d}| d|d  ||d dd}|S r   )rY   ZjqlComparisonOperatorr~   r   r<   r<   r=   visitJqlComparisonClause  s    zJQL.visitJqlComparisonClausec                 C   sx   |  | }|  |d}| d|d  ||d dd}t|dtjrt|  |  dkrtd|d d	< |S )
Nr   rX   rV   rW   r   re   	membersOfZ	MEMBER_OFru   )rY   ZjqlInOperatorr~   r}   r   r   ZjqlFunctionjqlFunctionNamer   r<   r<   r=   visitJqlInClause  s    zJQL.visitJqlInClausec                 C   sJ   |  | }|  | }|d  d|d  |d |d dd}|S )NrV   rX   rW   r   re   )rY   ZjqlIsOperatorZjqlEmpty)r9   rK   ru   emptyrp   r<   r<   r=   visitJqlIsClause   s    zJQL.visitJqlIsClausec                 C   s$   |  | }td| dd S Nu   Оператор "#   " не поддерживается)rY   ZjqlWasOperatorr   ClauseErrorr9   rK   ru   r<   r<   r=   visitJqlWasClause  s    zJQL.visitJqlWasClausec                 C   s$   |  | }td| dd S r   )rY   ZjqlWasInOperatorr   r   r   r<   r<   r=   visitJqlWasInClause  s    zJQL.visitJqlWasInClausec                 C   s$   |  | }td| dd S r   )rY   ZjqlChangedOperatorr   r   r   r<   r<   r=   visitJqlChangedClause  s    zJQL.visitJqlChangedClausec                 C   s   |  S r3   rJ   r9   rK   r<   r<   r=   visitJqlEqualsOperator  s    zJQL.visitJqlEqualsOperatorc                 C   s&   ddd}|  ||  d}|S )NILIKEz	NOT ILIKE)~z!~re   )rJ   r>   )r9   rK   Zoperator_mappingrp   r<   r<   r=   visitJqlLikeOperator  s    zJQL.visitJqlLikeOperatorc                 C   s   |  S r3   r   r   r<   r<   r=   visitJqlComparisonOperator(  s    zJQL.visitJqlComparisonOperatorc                 C   s   |  rdS dS )NzNOT ININZNOTr   r<   r<   r=   visitJqlInOperator+  s    zJQL.visitJqlInOperatorc                 C   s&   |  rdnd|  rdndd}|S )NzIS NOTZISz!=rw   re   r   r9   rK   rp   r<   r<   r=   visitJqlIsOperator.  s    zJQL.visitJqlIsOperatorc                 C   s   |  rdS dS )NzWAS NOTZWASr   r   r<   r<   r=   visitJqlWasOperator5  s    zJQL.visitJqlWasOperatorc                 C   s   |  rdS dS )Nz
WAS NOT INzWAS INr   r   r<   r<   r=   visitJqlWasInOperator8  s    zJQL.visitJqlWasInOperatorc                 C   s   |  S r3   r   r   r<   r<   r=   visitJqlChangedOperator;  s    zJQL.visitJqlChangedOperatorc                 C   s\  |  r| |  dddd}| | }|rT|d std| dqtjj	dd| gd	d
gd}|rt
|jttjt
|jd}qtd| dnH| r| | }t
|jttjt
|jd}ntd| d|d }|	dg }|s*t|dr*|jr*||j |sPt|drP|jrP||j ||d< |S )N'rU   "r   u
   Поле "r   Zcaptionr   r   field_custom_typer/   r   )r   r   u!   Неизвестное поле "r   r$   model)Z	jqlStringrY   r   rG   lowerr   Z
FieldErrorr$   CmfCustFieldr>   strr   getattrCmfTaskZUnknownFieldErrorZjqlCustomFieldhasattrr   rZ   ri   )r9   rK   Zstring_fieldrF   custom_fieldr   field_modelsr<   r<   r=   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 )N::Zcf_rS   rc   r   r   r   r   r   u+   Пользовательское поле "z" (   ) не найдено)Z	POSNUMBERr7   r   r$   r   r>   r   ZCustomFieldError)r9   rK   field_idfield_ext_idr   r   r<   r<   r=   visitJqlCustomFielde  s    zJQL.visitJqlCustomFieldc                 C   s   |  S r3   r   r   r<   r<   r=   visitJqlStringw  s    zJQL.visitJqlStringc                 C   s   dd d}|S )NZEMPTYre   r<   r   r<   r<   r=   visitJqlEmptyz  s    zJQL.visitJqlEmptyc                 C   sD  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 }|j}	|dg }
|d}d }|	d	kr"d
d
d
ddddddddddd}|||d f}|d |d d}n|	dkrddddddddddddd}d }||}|rrtjjdd|gd}|stjjdd|gd}|rt|j}nBt|tjtjtjfrtd |r|d!| d}|d d"krd#| |d$< n|}nd%|
kr| |}n|
r|rd&g}|
D ]}|D ]}|d'kr|	d(krX| j d)| }n,|	d*krt| j d+| }n| j d,| }|d'dd-| d-g n||d| g q.t|j|d}|r&|j} qq&n|}|st
d.|	 d/| d0t|tk	rd| dn|d1 t|tk	r4t|n|d$ d}|S )2Nr   rU   r   u1   Невозможно найти значение z. r   r$   r   r"   )u   Минимальныйz-2)   Низкийz-1)u   Обычный0)   Высокий1)u   Критичный2)u   Блокирующий3)ZLowestu   Самый низкийu   НизшийZLowr   u   СреднийZMediumZHighr   u   Высшийu   НаивысшийZHighestu   Критическийr   r   re   
logic_typez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   r   z^-?[0-9]+(w|d|h|m?)( +)?$now()-znow()+rW   Z	CmfPersonrc   r   )affected_versionsfix_versionsz
::version:r(   z%::r   rx   u   Для поля "uI   " не найден вариант для замены значения "uE   ", возможно объект еще не импортированrV   ) rJ   r   Z	parentCtxr}   r   JqlTerminalClauseContextrY   rz   JqlListContextrN   
ValueErrorr{   r>   r$   ZCmfLogicTyper   r   r|   r   ZCmfDateTimeZCmfDateZCmfTimerematchrT   r7   rZ   ZcmfutilZget_model_by_namesgetr+   dict)r9   rK   Z	new_valueZcurrent_valuer2   rF   Zlist_parentrQ   r   r   r   r   objZpriority_mappingr"   Zlogic_type_mappingr   Zlogic_type_codeZfilter_Zfield_modelZsearch_fieldr   rp   r<   r<   r=   visitJqlValue  s    &








 zJQL.visitJqlValuec                 C   s   |  | }|dkr&| dd}np|dkrl|  | }|rRdd| dn|  dd	 |D d}n*|d
kr| dd}ntd| d|S )NZcurrentUserZ__G_CURRENT_USERre   r   z
membersOf(, rs   c                 S   s    g | ]}| d d ddqS )r   rU   r   )r   )r`   argr<   r<   r=   rb     s     z(JQL.visitJqlFunction.<locals>.<listcomp>Znowr   u   Функция "r   )rY   r   rJ   ZjqlArgumentListrg   rf   r   ZFunctionError)r9   rK   Zfunction_namerp   Zargument_listr<   r<   r=   visitJqlFunction  s     zJQL.visitJqlFunctionc                 C   s   |  S r3   r   r   r<   r<   r=   visitJqlFunctionName  s    zJQL.visitJqlFunctionNamec                 C   s.   g }|  D ]}| |}|r|| q|S r3   )ZjqlArgumentrY   rZ   )r9   rK   argsargumentr   r<   r<   r=   visitJqlArgumentList  s    
zJQL.visitJqlArgumentListc                 C   s   g }|  D ]d}z| |}|r*|| W q tk
rn } z$| jj| d| | d W 5 d }~X Y qX q|std| | ddd	dd |D  d	d
d |D d}|S )Nu   . Операнд "u-   " будет удален из условияu   Для операндов 'u   ' не найдены варианты для замены, возможно объекты еще не импортированыrr   r   c                 S   s   g | ]}|d  qS r^   r<   r`   operandr<   r<   r=   rb   *  s     z$JQL.visitJqlList.<locals>.<listcomp>rs   c                 S   s   g | ]}|d  qS rd   r<   r   r<   r<   r=   rb   +  s     re   )
Z
jqlOperandrY   rZ   rN   r6   rO   rP   rL   r   rg   )r9   rK   ZoperandsZjql_operandr   rQ   rp   r<   r<   r=   visitJqlList  s$    
zJQL.visitJqlListc                 C   s   |  S r3   r   r   r<   r<   r=   visitJqlArgument0  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`   rF   r<   r<   r=   rb   ?  s     z'JQL.visitJqlOrderBy.<locals>.<listcomp>r\   rw   c                 S   s   g | ]}|d  qS rd   r<   r   r<   r<   r=   rb   @  s     re   )ZjqlSearchSortrY   rZ   rf   rg   )r9   rK   r   rk   rp   r<   r<   r=   visitJqlOrderBy3  s    
zJQL.visitJqlOrderByc              
   C   s   zf|  | }|d }|d }|jr8| d|jj n||jrX|jjdkrXd|j n|jd}|W S  tk
r } z0| jj| d| 	| d | 
  W Y S d }~X Y nX d S )	Nr   r   rX   ZDESCr   re   u'   . Условие сортировки "ry   )rY   rz   orderr*   r{   rN   r6   rO   rP   rL   rf   )r9   rK   rF   r   r   rp   rQ   r<   r<   r=   visitJqlSearchSortE  s    "zJQL.visitJqlSearchSort)h__name__
__module____qualname__r$   r   r   Zapprovers_forZresponsibler   Zcomments
componentsZcmf_created_atZ
cmf_authorr*   Zdeadliner   r   r   r!   r"   r#   Z	cmf_ownerZstatus_closed_atZlistsr(   r   r   Zcmf_modified_atZ
spectatorsrC   r5   rG   rL   rT   r   ZJqlQueryContextr]   ZJqlOrClauseContextrl   ZJqlAndClauseContextrn   ZJqlNotClauseContextrq   ZJqlSubClauseContextrt   r   r   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JqlIsOperatorContextr   ZJqlWasOperatorContextr   ZJqlWasInOperatorContextr   ZJqlChangedOperatorContextr   ZJqlNonNumberFieldContextr   ZJqlCustomFieldContextr   ZJqlStringContextr   ZJqlEmptyContextr   ZJqlValueContextr   r   r   ZJqlFunctionNameContextr   ZJqlArgumentListContextr   r   r   ZJqlArgumentContextr   ZJqlOrderByContextr   ZJqlSearchSortContextr   __classcell__r<   r<   r:   r=   r	      s    
       

                )'r	r	   c                   @   s.   e Zd Zdd Zdd Zd	eedddZdS )
JQLNormalizerc                 C   s
   || _ d S r3   )_api_import)r9   r8   r<   r<   r=   r5   Y  s    zJQLNormalizer.__init__c           
      C   sH   t |}t|}t |}t|}| }t| j|d}||}	|	S )Nr8   r7   )	antlr4ZInputStreamr   ZCommonTokenStreamr   ZjqlQueryr	   r   rY   )
r9   jqlr7   Zinput_streamZlexerstreamparserZtreeZvisitorrp   r<   r<   r=   get_modified\  s    


zJQLNormalizer.get_modifiedN)r   r7   c                 C   s  |pd}t | j|d}g }|D ]}|dr|dd}|d\}}| d| }| d|  }	tjjdd	d
|	gdd
|ggd}
|
r|	|	 n| jj
jd|	 d| d q|| }|r|d r|	|d j n| jj
jd| d q| jj
jd| d q|S )Nrx   r   Zcustomfield_ZcustomfieldcfrS   r   rc   r   r   r   r   u+   Пользовательское поле 'z' (r   r   r   u
   Поле 'u#   ' не поддерживаетсяu!   Неизвестное поле 'r   )r	   r   
startswithr   splitr   r$   r   r   rZ   r6   rO   rP   rG   r{   )r9   r   r7   r   Zsupported_fieldsrF   rS   r   r   r   r   Zmapped_fieldr<   r<   r=   convert_fieldsk  sD    





zJQLNormalizer.convert_fields)N)r   r   r   r5   r   listr   r   r<   r<   r<   r=   r   X  s   r   )r   r   Zcmfr   Zcmf.includerU   r   r   r   r   r	   r   r<   r<   r<   r=   <module>   s         P