U
    +h                     @   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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,ejjddgddd-ejjdd.gdd/ejjddgddd0ejjddgddd1ejjddd2ejjdddd
id3ejjdd4gdd5ejjdd6gddd
idd
id7ejjdddd
idd
idd
idd
id83Z fd9d:Zd;d< Z e!d=d>d?Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(ddMdNZ)ddOdPZ*ddQdRZ+ddSdTZ,dUdV Z-dWdX Z.dYdZ Z/e0j1d[d\d]Z2e0j3d[d^d_Z4e0j5d[d`daZ6e0j7d[dbdcZ8e0j9d[dddeZ:e0j;d[dfdgZ<e0j=d[dhdiZ>e0j?d[djdkZ@e0jAd[dldmZBe0jCd[dndoZDe0jEd[dpdqZFe0jGd[drdsZHe0jId[dtduZJe0jKd[dvdwZLe0jMd[dxdyZNe0jOd[dzd{ZPe0jQd[d|d}ZRe0jSd[d~dZTe0jUd[ddZVe0jWd[ddZXe0jYd[ddZZe0j[d[ddZ\e0j]d[ddZ^e0j_d[ddZ`e0jad[ddZbe0jcd[ddZde0jed[ddZfe0jgd[ddZhe0jid[ddZje0jkd[ddZle0jmd[ddZne0jod[ddZpe0jqd[ddZre0jsd[ddZte0jud[ddZve0jwd[ddZxe0jyd[ddZz  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idZissuekey)rG   rH   rI   rJ   rQ   tagsaliasZtimeoriginalestimateparent_taskz"epic link"priorityprojectZ
CmfProjectZtask_code_prefix)rG   rH   modelsrI   rJ   Ztimeestimatereporter
resolutionresolvedZresolutiondatesprintstatus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remainingestimater`   zrequest-channel-typezrequest-last-activity-timezrequest typera   rb   rc   rd   re   rf   Z	timespentrg   rh   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(   rr   k  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rk   r   )
setpriorities_cacher_   ZCmfCustFieldConfFieldlistr~   valueitemsaddstr)r{   filter_Zfield_configsZfield_configkvr'   r'   r(   ry   v  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   rk   values)r{   rG   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_   CmfTaskZ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}| D ]~}| s,q|d}| rt|dN}|D ]B}t	
|}|d}|st|d}|szqN|| j |j d| < qNW 5 Q R X qdS )uj   
        Кэширует данные пользователей из всех дампов Jira
        Zjira_raw_dataz
users.jsonzr+rG   Z	accountId::N)users_cacher   ZconfigZ
UPLOAD_DIRjoinpathiterdiris_direxistsopenZjsonloadsr   rG   )r{   Z	dump_pathZ	hash_pathZ
users_filer   row	user_datauser_keyr'   r'   r(   rx     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   LIKE%::z::%Zloginr   ZemailrG   rk   u   Пользователь 'u%   ' не найден в системе)r   r   rs   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rg   ubql2bqlencodedrg   Tr   r   function   Функция 'u=   ' не поддерживается с оператором ''   Операнд '$   ' удален из условия. u(   Список операндов пуст)r)   r+   r*   appendr,   r   r   r#   r/   r1   r   ClauseErrorrG   r   r3   r4   r   rt   
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 )
Nrg   r   parent_task  EmptyrG    r   c                 S   s   g | ]}|d  qS r   r'   r   	predicater'   r'   r(   
<listcomp>,  s     z+JQL._build_ubql2_clause.<locals>.<listcomp>)r)   r,   r/   r3   r4   r   r   r   r!   r   ru   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
aggregatedrg   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   O  s     z1JQL._build_ubql2_list_clauses.<locals>.<listcomp>)r   r)   r+   extendr,   r/   r3   r4   r   r   r   r!   r   r   ru   r   len)r{   r   r   r   Zoperand_listclausessuboperands
suboperandr   r   Z	connectorr'   r'   r(   _build_ubql2_list_clauses0  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   Frg   r    r   rG   rf   rX   r   rp   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)ru   
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_clauseS  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&   ru   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   rg   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   ru   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   upperrv   r=   r?   r   r@   rB   rw   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   )rt   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   rz   r'   r(   r   ,  s     z(JQL.visitJqlOrClause.<locals>.<listcomp>c                 S   s   g | ]}|d k	r|qS r   r'   r  r'   r'   r(   r   -  s      r   c                 S   s   g | ]}|d  qS r   r'   r  r'   r'   r(   r   2  s     r   r   r   r   c                 S   s   g | ]}|d  qS r   r'   r  r'   r'   r(   r   6  s     r   r   )ZjqlAndClausedefaultResultr   r   r{   r   r   Zvalid_clausesr   r   r'   rz   r(   visitJqlOrClause+  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  rz   r'   r(   r   ;  s     z)JQL.visitJqlAndClause.<locals>.<listcomp>c                 S   s   g | ]}|d k	r|qS r   r'   r  r'   r'   r(   r   <  s      r   c                 S   s   g | ]}|d  qS r   r'   r  r'   r'   r(   r   A  s     r   r   r   r   c                 S   s   g | ]}|d  qS r   r'   r  r'   r'   r(   r   E  s     r  )jqlNotClauser  r   r   r  r'   rz   r(   visitJqlAndClause:  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_notrf   )r{   r   Z
clause_ctxr   prefixr  r'   r'   r(   visitJqlNotClauseI  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(   visitJqlSubClauseW  s    zJQL.visitJqlSubClausec           
   
   C   s   z|  | | _|  | }|d }|d }|d}|dtjkrn| |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   rg   r   r   r  u   Условие '&   ' удалено из запроса. .)r   jqlFieldru   ZjqlTerminalClauseRhsr   r)   r-   r   r   r   r   r   rt   r   r   r  )
r{   r   Z
rhs_resultr   r   r   Zubql2_clauseZ
bql_clauser  r   r'   r'   r(   visitJqlTerminalClausec  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 )Nrg   r   rp   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 )
Nrg   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 )
Nrg   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(   visitJqlInOperator(  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(   visitJqlIsOperator0  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(   visitJqlWasOperator8  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(   visitJqlWasInOperator@  s
    zJQL.visitJqlWasInOperatorc                 C   s"   t | | }|t jd}|S r(  )r   r   r   r   r*  r'   r'   r(   visitJqlChangedOperatorH  s
    zJQL.visitJqlChangedOperatorc                 C   s(   |  p| p| }| ||}|S r   )jqlDatePredicateOperatorjqlDateRangePredicateOperatorjqlUserPredicateOperatorr  r{   r   r   r   r'   r'   r(   visitJqlWasPredicateP  s    zJQL.visitJqlWasPredicatec                 C   s0   |  p| p| p| }| ||}|S r   )r3  r4  r5  ZjqlValuePredicateOperatorr  r6  r'   r'   r(   visitJqlChangedPredicateY  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   ZUnknownFieldErrorrG   getattrr   
FieldErrorJqlCustomFieldContextr   r   r=  r   r   r   r   )r{   r   Z	field_ctxr   r   custom_fieldrH   field_modelsr'   r'   r(   visitJqlNonNumberFieldc  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   r9  r   +   Пользовательское поле '' (   ) не найдено)	Z	POSNUMBERrs   rA  r_   rB  rC  r   ZCustomFieldErrorrG   )r{   r   field_idfield_ext_idr   rG  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   rf   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*   rg   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|}n0| jtjkr|dkr| |\}}d| d|d}n|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}|rt|j}nt|tjtjtjfrtd|r|d| d}|d dkrd	| |d
< n|}n2d|kr| 
|}n|r|	rd }dg}|D ]}|	D ]}|dkr`|dkr| j d| }n,|dkr6| j d| }n| j d| }|ddd| dg n||d| g qt|j|d}|r|j} qqnH|jr|jdkr|rtj |dd d!}n|}d| d|d}n|}|st!d"W n` t!k
rX } 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]   rQ  
logic_typerG   r   rF   r   r   r[   r   z%"z"%r   r   )affected_versionsfix_versionsz
::version:rd   r   r   rp   Z	CmfChoice    )seplengthu;   Возможно объект не импортированu&   Не найдено значение 'u   ' в предикате 'z'. u   ' для поля 'r   rW  )(r?  	jqlNumberr   ru   r   r   rv   rw   r@   rB   r   rC   rematchrA   r   r_   ZCmfLogicTyper   rW   r   r   ZCmfDateTimeZCmfDateZCmfTimers   r   ZcmfutilZget_model_by_namerC  ZcustomZwidgetZtranslit_stripr   r   r)   r+   r   rg   dict)r{   r   Z	new_value	value_ctxr   r   rH   r   rH  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   Функция не поддерживается. rY  Z__G_CURRENT_USERrH   r   u0   ' не поддерживается полем 'z' (M2M)r   rW   r   rG   r9  r   u&   Не найдена аргумент 'u   ' функции 'r   u,   ' не содержит аргументовz
membersOf(r   r   Z	MEMBER_OF)r   r   )rg   r   r   r   r   r   )r   ZjqlFunctionNamer   r   ZFunctionErrorZjqlArgumentListr   r/   r0   r2   r1   ru   r   r   r   rG   r   r_   ZCmfPersonGrouprC  r   rW   rt   r   r)   r,   )r{   r   r   r   r   r   Zbql_functionZbql_argumentsr   groupsargumentgroupr  r'   r'   r(   visitJqlFunction+  s^    "


zJQL.visitJqlFunctionc                 C   s   t |  S r   )r/   r   r   rU  r'   r'   r(   visitJqlFunctionNameg  s    zJQL.visitJqlFunctionNamec                 C   s.   g }|  D ]}| |}|r|| q|S r   )ZjqlArgumentr   r   )r{   r   r   Zargument_ctxri  r'   r'   r(   visitJqlArgumentListj  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 )Nrg   r   r   r   u   Для операндов 'u   ' не найдены варианты для замены, возможно объекты еще не импортированы)rg   r   r   )
r   Z
jqlOperandr   r)   r-   r   r   r   rt   r   )	r{   r   r   r   r  r   r   r   r  r'   r'   r(   visitJqlLists  s,    



zJQL.visitJqlListc                 C   s   |  p| }| |S r   )r?  ra  r   )r{   r   re  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'   rp  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DESCrZ  r  u%   Условие сортировки 'r  )r   r  r   rE  orderrf   r   r   rt   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_   r   r\  Zapprovers_forZresponsiblerM   Zcomments
componentsr   r   rf   Zdeadliner]  rW   rZ   r\   r]   r^   Z	cmf_ownerra   Zstatus_closed_atZlistsrd   rG   r[  Zcmf_modified_atri   r   rr   ry   r   r   r   r   r   rx   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JqlIsOperatorContextr/  ZJqlWasOperatorContextr0  ZJqlWasInOperatorContextr1  ZJqlChangedOperatorContextr2  ZJqlWasPredicateContextr7  ZJqlChangedPredicateContextr8  ZJqlNonNumberFieldContextrI  rF  rP  r@  rT  ZJqlNumberContextrV  ZJqlEmptyContextrX  ZJqlValueContextrg  ZJqlFunctionContextrk  ZJqlFunctionNameContextrl  ZJqlArgumentListContextrm  ZJqlListContextrn  ZJqlArgumentContextro  ZJqlOrderByContextrr  ZJqlSearchSortContextrt  __classcell__r'   r'   r|   r(   rD   Y   s    
       

               6

#
b
+	
(		w<	rD   c                   @   s0   e Zd Zdd Zd	ddZd
eedddZdS )JQLNormalizerc                 C   s   t  | _g | _d S r   )rD   visitorrt   rz   r'   r'   r(   rr     s    zJQLNormalizer.__init__Nc           	      C   sR   |pd| j _t|}t|}t|}t|}| }| j |}| j j	| _	|S ro   )
rx  rs   antlr4ZInputStreamr   ZCommonTokenStreamr	   ZjqlQueryr   rt   )	r{   Zjqlrs   Zinput_streamZlexerstreamparserZtreer  r'   r'   r(   get_modified  s    


zJQLNormalizer.get_modified)r   rs   c                 C   s  g | _ |p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 d| d| d q| j	
| }
|
r|
d r||
d j n| j d| d q| j d| d q|S )Nrp   Zcustomfield_ZcustomfieldcfrJ  r   r   rG   r   rF   r   rK  rL  rM  rJ   rH   r;  r<  r:  r   )rt   rR  r   splitrA  r_   rB  rC  r   rx  r   r   )r{   r   rs   Zsupported_fieldsr   rJ  rN  rO  r   rG  Zmapped_fieldr'   r'   r(   convert_fields  s6    
zJQLNormalizer.convert_fields)N)N)r   r   r   rr   r|  r   r   r  r'   r'   r'   r(   rw    s   
rw  )rb  ry  enumr   pathlibr   Zcmfr   Zcmf.includer   r   r   r	   r
   r   r)   r/   r5   r=   r@   rD   rw  r'   r'   r'   r(   <module>   s6   
          n