
    L0i                         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 ddl	m
Z
 ddlmZ dd	lmZ dd
lmZ  G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d d      Zy)    N)Enum)Path)fields)*   )
exceptions)jqlLexer)	jqlParser)
jqlVisitorc                   h    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y)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_EQUALSGTLT	GT_EQUALS	LT_EQUALSr   NOT_INCONTAINSDOES_NOT_CONTAINr   IS_NOTr   WAS_IN
WAS_NOT_INWAS_NOTr   r   	NOT_ILIKEr   
NOT_EXISTSr   NOT_HISTORY     ./modules/jira/jql/parser.pyr   r      sv    FJ	B	BII	BFH	BF
CFJGGEIFJGKr0   r   c                        e Zd ZdZdZdZdZdZy)OperandEMPTYVALUEFUNCTIONLISTN)r   r   r   r4   r5   r6   r7   NONEr/   r0   r1   r3   r3   +   s    EEHDDr0   r3   c                        e Zd ZdZdZdZdZdZy)FunctionNOW	MEMBERSOFCURRENTUSERSTANDARDISSUETYPESSUBTASKISSUETYPESN)r   r   r   now	membersOfcurrentUserstandardIssueTypessubTaskIssueTypesr/   r0   r1   r:   r:   3   s    
CIK-+r0   r:   c                   (    e Zd ZdZdZdZdZdZdZdZ	y)	PredicateOperatorAFTERBEFOREBYDURINGONFROMTON)
r   r   r   rG   rH   rI   rJ   rK   rL   rM   r/   r0   r1   rF   rF   ;   s%    EF	BF	BD	Br0   rF   c                       e Zd Zej                  ej
                  ej                  ej                  fZej                  fZ
ej                  ej                  fZy)PredicateOperatorsN)r   r   r   rF   rG   rH   rK   rJ   DATErI   USERrL   rM   r5   r/   r0   r1   rO   rO   E   sV        	D   "DEr0   rO   c                       e Zd ZdZdZdZy)	ValueModeFIELDUSER_PREDICATEDATE_PREDICATEN)r   r   r   rT   rU   rV   r/   r0   r1   rS   rS   S   s    E%N%Nr0   rS   c            	           e Zd Zi ddej                  j
                  ddgddddej                  j                  ddddej                  j                  ddd	d	ej                  j                  d
dddd
iddd
iddej                  j                  d
dddej                  j                  ddgddddej                  j                  ddgdddej                  j                  ddddej                  j                  ddddej                  j                  ddgdddej                  j                  dddd
g ddddej                  j                  ddgddddd
iddej                  j                   ddgdg dd i d!dd
id"dd
id#d$ej                  j"                  dd%gddd&dd
id'dd
id(dd
id)d
d*gdd+d,ej                  j$                  ddgddd-d.ej                  j$                  ddgddd/dd
id0d0ej                  j&                  ddd1d1ej                  j(                  d2gg d3dd4d5dd
id6d
d7gdd8d8ej                  j*                  ddd9dd
id:dd
ii d;dd
id<d<ej                  j,                  ddgddd=d=ej                  j.                  dd>gdd?d?ej                  j0                  ddgdd@gd dAdAej                  j2                  dBgddgdd4dCdCej                  j4                  dddDdDej                  j                  dddEdd
idFdFej                  j6                  ddGgddHdHej                  j8                  ddIgddJdd
idKdd
idLdMej                  j:                  dddNdd
idOdd
idPdd
idQdd
iZ fdRZdS Z dTe!fdUZ"e#dV        Z$dW Z%dX Z&dY Z'dZ Z(d[ Z)dd\Z*dd]Z+dd^Z,dd_Z-d` Z.da Z/db Z0dce1jd                  fddZ3dce1jh                  fdeZ5dce1jl                  fdfZ7dce1jp                  fdgZ9dce1jt                  fdhZ;dce1jx                  fdiZ=dce1j|                  fdjZ?dce1j                  fdkZAdce1j                  fdlZCdce1j                  fdmZEdce1j                  fdnZGdce1j                  fdoZIdce1j                  fdpZKdce1j                  fdqZMdce1j                  fdrZOdce1j                  fdsZQdce1j                  fdtZSdce1j                  fduZUdce1j                  fdvZWdce1j                  fdwZYdce1j                  fdxZ[dce1j                  fdyZ]dce1j                  fdzZ_dce1j                  fd{Zadce1j                  fd|Zcdce1j                  fd}Zedce1j                  fd~Zgdce1j                  fdZidce1j                  fdZkdce1j                  fdZmdce1j                  fdZodce1j                  fdZqdce1j                  fdZsdce1j                  fdZudce1j                  fdZwdce1j                  fdZydce1j                  fdZ{ xZ|S )JQLaffectedversionext_idnameT)r[   	cmf_field	search_by	supported	approvals)r[   r\   r^   assigneeattachmentsFcategoryr^   zchange-gating-typecomment	componentcreatedcreateddate)r[   r\   r^   aliasescreatordescriptiondueduedateenvironmentfilter)requestsavedfiltersearchrequest)r^   rg   
fixversionhierarchylevelissuekeycode)idissuekey)r[   r\   r]   r^   rg   	issueLinkissueLinkTypelabelstagsalias
lastViewedlevelorganizationsoriginalEstimatetimeoriginalestimateparentparent_taskz	epic linkz"epic link"parentprojectpriorityproject
CmfProject)rZ   task_code_prefixrt   r[   )r[   r\   modelsr]   r^   projecttyperemainingestimatetimeestimatereporterzrequest-channel-typezrequest-last-activity-timezrequest type
resolutionresolvedresolutiondatesprintu   спринтstatusCmfStatusCodesummarytext	timespenttype	issuetypeupdatedupdateddatevotervoteswatcher
spectatorsworklogAuthorworklogCommentworklogDate	workRatioc                     t         |           d| _        g | _        d | _        d | _        t        j                  | _        | j                          | j                          y N%)super__init__source_hasherrors_current_field_current_predicate_operatorrS   rT   _value_mode_cache_users_cache_priorities)self	__class__s    r1   r   zJQL.__init__m  sQ    "+/($?? r0   c                 \   t               | _        g dg dg}t        j                  j	                  |dg      }|D ]T  }|j
                  j                  j                         D ]+  \  }}| j                  j                  t        |      |f       - V t	        | j                        | _        y)uF   
        Кеширует приоритеты системы
        )r[   r   r   )
cmf_importr   Nchoicesrm   r   N)
setpriorities_cacher   CmfCustFieldConfFieldlistr   valueitemsaddstr)r   filter_field_configsfield_configkvs         r1   r   zJQL._cache_prioritiesx  s     !$ &&
 4499; : 
 * 	7L$,,2288: 71%%))3q61+67	7 !%T%:%: ;r0   r   c                     t        fd| j                  D        d      }||S t        fd| j                  D        d      }||S t        d d      )u  
        Получает приоритет из кеша

        Args:
            value (str): Имя или id приоритета.

        Returns:
            tuple (str, str): Кортеж, содержащий id и имя приоритета
        c              3   4   K   | ]  }|d    k(  s|  yw)r   Nr/   .0r   r   s     r1   	<genexpr>z+JQL._get_cached_priority.<locals>.<genexpr>       T(x{e?SXT   Nc              3   4   K   | ]  }|d    k(  s|  yw)r   Nr/   r   s     r1   r   z+JQL._get_cached_priority.<locals>.<genexpr>  r   r   u   Приоритет 'uP   ' не найден. Возможно он еще не импортирован.)nextr   	Exception)r   r   priority_tuples    ` r1   _get_cached_priorityzJQL._get_cached_priority  s{     Td&;&;T
 %!! Td&;&;T
 %!!.ug  6F  G  H  	Hr0   c                     | j                   j                        }|s1t        t        fd| j                   j	                               d       }|S )Nc                 ,    | j                  dg       v S )Nrg   )get)fr[   s    r1   <lambda>z JQL._get_field.<locals>.<lambda>  s    daeeIr&:: r0   )field_mappingr   r   rm   values)clsr[   fields    ` r1   
_get_fieldzJQL._get_field  sO    !!%%d+:%%,,. E r0   c                     t        t        j                  j                  |      ryt        t        j                  j                  |dz         ryy)NT_idF)hasattrr   CmfTaskdp_model)r   
field_names     r1   _is_sortablezJQL._is_sortable  s8    6>>**J7V^^,,j5.@Ar0   c                     |j                   j                   }|j                  j                  }|j                   j                         j                  ||      S N)startstopgetInputStreamgetText)r   ctxr   r   s       r1   	_get_textzJQL._get_text  s<    		xx}}yy'')11%>>r0   c                    i | _         t        t        j                        j	                  d      }|j                         sy|j                         D ]  }|j                         s|j	                  d      }|j                         s6t        |d      5 }|D ]\  }t        j                  |      }|j                  d      }|s|j                  d      }|s?|| j                   |j                   d| <   ^ 	 ddd        y# 1 sw Y   xY w)uj   
        Кэширует данные пользователей из всех дампов Jira
        jira_raw_dataNz
users.jsonzr+r[   	accountId::)users_cacher   config
UPLOAD_DIRjoinpathexistsiterdiris_diropenjsonloadsr   r[   )r   	dump_path	hash_path
users_filer   row	user_datauser_keys           r1   r   zJQL._cache_users  s	    **+44_E	!"**, 	VI##%"++L9J  "*d+ Vq  V$(JJsO	#,==#8''0}}['AH'$LU((INN+;2hZ)HIVV V	V
V Vs   A"DD
	c                 6   | j                   j                  | j                   d|       }|r|j                  d      }dddd| dgdd	|gd
d	|gdd	|gg}t        j                  j                  |      }|rt        |j                        S t        d| d      )Nr   emailAddressORrZ   LIKEz%::z::%loginr   emailr[   rm   u   Пользователь 'u%   ' не найден в системе)r   r   r   r   	CmfPersonr   rt   r   )r   r   r   r   users        r1   _get_user_codezJQL._get_user_code  s     $$((D,<,<+=Rz)JK	 }}^4HvXJc23gx(gx(Wh'
 ##7#3tyy>!8
Bghiir0   c                    g }d}t         j                  g g d}d }d }|D ]=  }|d   }		 |d   }
|
t         j                  k(  r|s|j                  |       d}n|
t         j                  k(  r/|d   j                  |d          |d   j                  |d          n|
t         j                  k(  r|d   }|d   t
        j                  t
        j                  fv rF|t        j                  k(  r3t        j                  d	|j                   d
|d   j                   d      |t        j                  k(  r|}|t        j                  k(  r|}-|j                  |       @ |d   r|j                  |       |r|s|j                  |       |r|s|j                  |       |st%        d      |S # t         $ r,}| j"                  j                  d|	 d|        Y d }~d }~ww xY w)NFr   ubql2bqlencodedr   Tr  r  function   Функция 'u=   ' не поддерживается с оператором ''   Операнд '$   ' удален из условия. u(   Список операндов пуст)r3   r5   r4   appendr6   r   r%   r*   r:   rA   r   ClauseErrorr[   r   rC   rD   r   r   
ValueError)r   operatoroperandsaggregated_operandshas_empty_operandvalue_operandstandard_issue_types_funcsubtask_issue_types_funcoperandencoded_operandoperand_typer
  excs                r1   _aggregate_list_operandszJQL._aggregate_list_operands  s    !!(BG$(!#'  	G%i0O&v7==0,+227;,0)!W]]2!'*11''2BC!%(//?!W%5%55&z2H )hoox?R?R-SS$(:(::(44.x}}o >88@8I8O8O7PPQS   8#>#>>4;1 !X%?%??3:0 '..w77	B &&}5$-E&&'@A#,E&&'?@"GHH""!  ""&&77[\_[`a s$   D
F/5F/F//	G$8!GG$c           	         |d   t         j                  k(  r|d   }|t        j                  t        j                  fv r|t        j                  k(  r4|t
        j                  k(  rt
        j                  nt
        j                  }nF|t        j                  k(  r3|t
        j                  k(  rt
        j                  nt
        j                  }dj                   dS | j                  d    d|j                   }|d   t         j                  k7  r
| d|d    }|r'| ddj                  |D cg c]  }|d   	 c}       }|S c c}w )Nr   r
  parent_task  Emptyr[    r  )r3   r6   r:   rC   rD   r   r   r   r(   r   r   r8   join)r   r  r  
predicatesr
  opclause	predicates           r1   _build_ubql2_clausezJQL._build_ubql2_clause$  s   6?g...z*HH779S9STTx:::(0HKK(?X__B!;!;;,4,CB%bhhZv66''/0(..1AB6?gll*xq!1 23Fxqz*Z)9W+=*Z![ \]F +[s   -Ec           	      8   g }g }|j                  dg       }|D ]C  }|d   t        j                  k(  r|j                  |d          /|d   t        j                  k(  r|d   }|t
        j                  t
        j                  fv r|t
        j                  k(  r4|t        j                  k(  rt        j                  nt        j                  }	nF|t
        j                  k(  r3|t        j                  k(  rt        j                  nt        j                  }	|j                  d	j                   d       |j                  |d          0|j                  |d          F |r@|j                  | j                  d    d|j                   d	d
j                  |       d       t!        |      dk(  r|d   }n6t!        |      dkD  r(|t        j                  k(  rdnd}
|
j                  |      }|r'| ddj                  |D cg c]  }|d   	 c}       }|S c c}w )N
aggregatedr   r  r
  r  r   r[   r!  z (, )r   r    OR  AND )r   r3   r5   extendr6   r:   rC   rD   r   r   r   r(   r  r   r   r"  len)r   r  r  r#  operand_listclausessuboperands
suboperandr
  r$  	connectorr&  s               r1   _build_ubql2_list_clauseszJQL._build_ubql2_list_clauses6  s   kk,3% 	9J&!W]]2##Jw$78F#w'7'77%j1 ; ;X=W=WXX8#>#>>,4,CX[[!X%?%??08HKK0GX__X[[NN\"((6#BC ''
7(;<##Jw$78	9  NNd11&9:!HNN;K2diiXdNeMffghiw<1ajG\A"*hkk"9wInnW-G 	388Q[,\IYw-?,\#]"^_G -]s    Hc                 	   | j                   }|d   }|j                  }d}|}	|	t        j                  t        j                  fv r3|	t        j                  k(  rt        j
                  nt        j                  }|j                  d      }
|j                  d      }g }|
t        j                  k(  rt        |t        j                        r6||j                  dg}|t        j                  k(  rd|||j                  |gg}|S |t        j
                  k(  rt        j                  }n#|t        j                  k(  rt        j                  }t        |d   t        j                         r3|t        j                  k(  rt        j"                  nt        j$                  }|j                  }n}|
t        j&                  k(  r|d   dk(  rIdd	d
|j)                  dd      gdd
|j)                  dd      gd|j                  |gd|j                  |gg}|S t        |t        j*                        rId}|t        j                  k(  rt        j
                  }n#|t        j                  k(  rt        j                  }|t        j
                  t        j                  fv rt-        |t.              r|n|g}|j                  }nq|
t        j0                  k(  r]|d   }|t2        j4                  k(  r|d   }|d   }n9|t2        j6                  t2        j8                  fv rd}|t2        j6                  k(  r4|t        j
                  k(  rt        j                  nt        j                  }nF|t2        j8                  k(  r3|t        j
                  k(  rt        j                  nt        j                  }d }|j                  }nyt        |t        j*                        rN|t        j                  k(  rt        j
                  }n#|t        j                  k(  rt        j                  }|d   g}n|d   }|j                  }|	t        j                  t        j                  fv ru|
t        j:                  k7  r|rdnd}d| ||g}d| ||g}d||g}|r|S |j                  |	j                  |gg}|r%|d   j=                  |D cg c]  }|d   	 c}       |S |rdnd}| | ||g}|S c c}w )Nr\   Fr   r   r   r[   r   ru   r   r   rt   Tr
  	argumentsr   _code
from_valueto_valuez.code)r   
class_namer   r   r.   r   r%   r   r3   r4   
issubclassr   CmfStrr   r   r    
CmfM2MBaser-   r   r5   replace
CmfRelBase
isinstancer   r6   r:   rA   rC   rD   r8   r.  )r   r  r  r#  is_inner_clauser   r\   r   add_field_suffixoriginal_operatorr  operand_bqlr%  r
  field_suffixr:  r;  r&  s                     r1   _build_bql_clausezJQL._build_bql_clauseY  s#   ##+&	))
 $!1!183G3G HH&78;K;K&Kx{{QYQ`Q`H{{6*kk%(7==()V]]3$hnnb9x.#X^^[AF
 x{{*'H0'22HeK0&2C2CD6>(//6Qx22W_WfWfH#>>W]]*V}&3 3 3C <=S+"5"5c2">?X^^[9X^^[9 i):):;'+$8??2#+;;!X%8%88#+??X__==1;K1N+U`TaK#>>W---z*H8---&z2)+6h998;U;UVV*
x:::2:hkk2IxxObObH!;!;;6>(++6Mx22S[SbSbH"#>>i):):;8??2#+;;!X%8%88#+??#.z#:";K"-j"9K#>>!1!183G3G HHw||+*:w *<.98[Q
&|n5xM#Z:"&&**,=,C,Ck]SFr
!!Z"P	9U#3"PQ
  '77BL#\N3X{KF #Qs   "Sc                    g }|j                  dg       }|D ]%  }|j                  | j                  ||d             ' t        |      dk(  r|d   }nDt        |      dkD  r6|j	                  d|t
        j                  t
        j                  fv rdnd       |r%|g}|j                  |D cg c]  }|d   	 c}       |t
        j                  t
        j                  fv r&| j                  d	   j                  |j                  |g}|S c c}w )
Nr)  T)rD  r   r   r   ANDr  r\   )r   r  rI  r/  insertr   r   r   r.  r.   r   r=  r   )r   r  r  r#  r1  r2  r3  r&  s           r1   _build_bql_list_clauseszJQL._build_bql_list_clauses  s    kk,3% 	_JNN411(JX\1]^	_ w<1ajG\ANN1h8;;@P@P2Q&QdW\]iGNNjIIe,IJ(((*>*>??**;7BBHNNT[\G Js   +Dc                    |t         j                  k(  r
dd|d   g}n|t         j                  k(  r
dd|d   g}nc|t         j                  k(  rdd|d   gdd|d   gg}n>|t         j                  k(  rWdj                  |d   D cg c]  }|j                  d	       c}      }d
| d|d	<   dd|d   d   d   gdd|d   d   d   gg}n|t         j                  k(  rS|d   t        j                  k(  r4|d   t        j                  k(  rd|d   d   |d   d   g}ndd|d   d   g}nwdd|d   g}nn|t        j                  j                  v rR| j                  d   dk7  rdnd}|t         j                   k(  rd| d|d   g}|t         j"                  k(  rd| d|d   g}|j                   d|j                  d	       }|fS c c}w )u   
        Строит ubql2 и bql выражения предикатов

        Args:
            predicate_operator (_type_): оператор предиката
            operand (_type_): операнд предиката
        cmf_created_atr   r  r   r   r   r*  r  r  (r+  r   r   r   r
  
cmf_authorr8  r   zcmf_author.coder[   r   r9  r7  r:  r;  r!  )rF   rG   rH   rK   rJ   r"  poprI   r3   r6   r:   rA   rO   r5   r   r   rL   rM   )r   predicate_operatorr  r  r$  duringsuffixr  s           r1   _build_predicatezJQL._build_predicate  s    !2!8!88#S'%.9C#4#;#;;#S'%.9C#4#7#77!48!48C  #4#;#;;YY'*:MNBwNOF!"6(!}GG!4)<Q)?)FG!4)<Q)?)FGC  #4#7#77v'"2"22:&(*<*<<'
)CWU^T_E`aC'genZ.HIC(#wu~>#5#;#;#A#AA $ 3 3F ;z IWrF!%6%;%;;#F8,c75>B!%6%9%99!&*C@%++,Agkk'.B-CDcz/  Os   Gc                     g }|r|j                  |       |r|j                  |       |r"dj                  |D cg c]  }|d   	 c}      nd}|D cg c]  }|d   	 }}||fS c c}w c c}w )u  
        Строит ubql2 и bql выражения запроса, объединяя условия поиска и сортировки

        Args:
            where (_type_): условия поиска
            order_by (_type_): условие сортировки
        r!  r  r7  r  )r  r"  )r   whereorder_bypartspartr  r  s          r1   _build_queryzJQL._build_query  sq     LLLL"?DE:D$w-:;"',-ttE{--cz ;-s   A%A*c                    t        |j                         j                               }|| _        |t        j
                  j                  v rt        j                  | _	        n1|t        j                  j                  v rt        j                  | _	        | j                  |j                               }d | _        t        j                  | _	        | j                  ||      \  }}|||d}|S )N)r  r  r  )rF   r   upperr   rO   rQ   r   rS   rU   r   rP   rV   visitjqlPredicateOperandrT   rV  )r   r   operator_ctxrS  r  r  r  results           r1   _get_predicatezJQL._get_predicate  s    .|/C/C/E/K/K/MN ,>(!3!8!8!>!>>(77D#5#:#:#@#@@(77D**S4467 ,0($?? **+=wG
s +
 r0   r   c                     g | _         |j                         r| j                  |j                               nd }|j                         r| j                  |j                               nd }| j	                  ||      S r   )r   jqlWherer_  
jqlOrderByr\  )r   r   rX  rY  s       r1   visitJqlQueryzJQL.visitJqlQuery)  sZ    .1lln

3<<>*$36>>3C4::cnn./  11r0   c                    |j                         D cg c]  }| j                  |       }}|D cg c]  }||	 }}|s| j                         S dj                  |D cg c]  }|d   	 c}      }t	        |      dk(  r	|d   d   }n%t	        |      dkD  rdg|D cg c]  }|d   	 c}z   }|dS c c}w c c}w c c}w c c}w )Nr,  r  r   r   r  r   r  r  )jqlAndClauser_  defaultResultr"  r/  r   r   r%  r1  valid_clausesr  r  s          r1   visitJqlOrClausezJQL.visitJqlOrClause1  s    474D4D4FG&4::f%GG.5LF9KLL%%''=IVG_IJ}""5)C!#&FfF5MFFCs++ HL
 J G   B4B9B9 B>Cc                    |j                         D cg c]  }| j                  |       }}|D cg c]  }||	 }}|s| j                         S dj                  |D cg c]  }|d   	 c}      }t	        |      dk(  r	|d   d   }n%t	        |      dkD  rdg|D cg c]  }|d   	 c}z   }|dS c c}w c c}w c c}w c c}w )Nr-  r  r   r   r  rK  ri  )jqlNotClauser_  rk  r"  r/  rl  s          r1   visitJqlAndClausezJQL.visitJqlAndClause@  s    474D4D4FG&4::f%GG.5LF9KLL%%''MJ&fWoJK}""5)C!#'GvVE]GGCs++ HL
 K Hro  c                     |j                         xs" |j                         xs |j                         }| j                  |      }|s| j	                         S |j
                  r|j
                  j                   dnd}| |d    |d   d}|S )Nr!  r7  r  r  ri  )rq  jqlSubClausejqlTerminalClauser_  rk  is_notr   )r   r   
clause_ctxr%  prefixrb  s         r1   visitJqlNotClausezJQL.visitJqlNotClauseO  s    %%'X3+;+;+=XAVAVAX
J'%%''*-**CJJOO$A&"xw01%=
 r0   c                     | j                  |j                               }|s| j                         S d|d    d|d   d}|S )NrP  r  r+  r  ri  )r_  jqlOrClauserk  )r   r   	or_clauserb  s       r1   visitJqlSubClausezJQL.visitJqlSubClause]  sS    JJs01	%%'' 7+,A.U#

 r0   c                 r   	 | j                  |j                               | _        | j                  |j                               }|d   }|d   }|j	                  d      }|j	                  d      t
        j                  k(  r-| j                  |d   ||      }| j                  |d   ||      }n,| j                  |d   ||      }| j                  |d   ||      }||d}|S # t        $ rK}	| j                  j                  d| j                  |       d	|	 d
       | j                         cY d }	~	S d }	~	ww xY w)Nr  r  r#  r   r  r  ri  u   Условие '&   ' удалено из запроса. .)r_  jqlFieldr   jqlTerminalClauseRhsr   r3   r7   r5  rM  r'  rI  r   r   r  r   rk  )
r   r   
rhs_resultr  r  r#  ubql2_clause
bql_clauserb  r  s
             r1   visitJqlTerminalClausezJQL.visitJqlTerminalClausei  s7   	("&**S\\^"<DC$<$<$>?J!*-H +G#5J{{6"gll2#==hw>OQXZde!99(5/7T^_
#778I7T^_!33HUOWjY
 &!F
 M 	(KK!1$..2E1FFlmplqqrst%%''	(s   CC" "	D6+A D1+D61D6c                     | j                  |j                               }|j                         xs" |j                         xs |j	                         }| j                  |      }||d}|S Nr  r  )r_  jqlEqualsOperatorjqlEmptyjqlValuejqlFunctionr   r   r  operand_ctxr  rb  s         r1   visitJqlEqualsClausezJQL.visitJqlEqualsClause  s_    ::c3356llnKK#//:K**[) !

 r0   c                    | j                  |j                               }|j                         xs" |j                         xs |j	                         }| j                  |      }|d   t
        j                  k(  r:|d   t        j                  k(  rt        j                  nt        j                  |d<   nd|d    d|d<   ||d}|S )Nr   r  r   r  )r_  jqlLikeOperatorr  r  r  r3   r4   r   r   r   r    r  s         r1   visitJqlLikeClausezJQL.visitJqlLikeClause  s    ::c1134llnKK#//:K**[)6?gmm+19%HNN1RhooX`XkXkHUO  02GEN !

 r0   c                     | j                  |j                               }|j                         xs |j                         }| j                  |      }||d}|S r  )r_  jqlComparisonOperatorr  r  r  s         r1   visitJqlComparisonClausezJQL.visitJqlComparisonClause  sT    ::c779:lln9(9**[) !

 r0   c                    | j                  |j                               }|j                         xs |j                         }| j                  |      }|d   t        j
                  k(  r| j                  ||d         }||d<   nw|d   t        j                  k(  ra|d   }|t        j                  k(  rI|d   t        j                  k(  r3t        j                  d|j                   d|d   j                   d      ||d	}|S )
Nr   r  r)  r
  r  r  :   ' не поддерживается оператором 'r  r  )r_  jqlInOperatorjqlListr  r3   r7   r  r6   r:   rA   r   r%   r   r  r[   r   )r   r   r  r  r  r)  r
  rb  s           r1   visitJqlInClausezJQL.visitJqlInClause  s    ::c//12kkm8s'8**[)6?gll*66xATUJ$.GL!V_ 0 00z*H8---(5/X__2T ,,&x}}o 6--5e_-B-B,C1F  !

 r0   c                     | j                  |j                               }| j                  |j                               }||d}|S r  )r_  jqlIsOperatorr  )r   r   r  r  rb  s        r1   visitJqlIsClausezJQL.visitJqlIsClause  sC    ::c//12**S\\^, !

 r0   c                 R   | j                  |j                               }|j                         xs" |j                         xs |j	                         }| j                  |      }g }|j                         D ]'  }| j                  |      }|s|j                  |       ) |||d}|S )Nr  r  r#  )r_  jqlWasOperatorr  r  r  jqlWasPredicater  )	r   r   r  r  r  r#  predicate_ctxr&  rb  s	            r1   visitJqlWasClausezJQL.visitJqlWasClause  s    ::c0023llnKK#//:K**[)
 002 	-M

=1I!!),	- !$
 r0   c                 ~   | j                  |j                               }|j                         xs |j                         }| j                  |      }|d   t        j
                  k(  r| j                  ||d         }||d<   nw|d   t        j                  k(  ra|d   }|t        j                  k(  rI|d   t        j                  k(  r3t        j                  d|j                   d|d   j                   d      g }|j!                         D ]'  }| j                  |      }	|	s|j#                  |	       ) |||d	}
|
S )
Nr   r  r)  r
  r  r  r  r  r  )r_  jqlWasInOperatorr  r  r3   r7   r  r6   r:   rA   r   r*   r   r  r[   r   r  r  )r   r   r  r  r  r)  r
  r#  r  r&  rb  s              r1   visitJqlWasInClausezJQL.visitJqlWasInClause  s>   ::c2245kkm8s'8**[)6?gll*66xATUJ$.GL!V_ 0 00z*H8---(72CxGZGZ2Z ,,&x}}o 6--5g->-D-D,EQH 
 
 002 	-M

=1I!!),	- !$
 r0   c                     | j                  |j                               }t        j                  dg d}g }|j	                         D ]'  }| j                  |      }|s|j                  |       ) |||d}|S )Nr7  r  r  )r_  jqlChangedOperatorr3   r8   jqlChangedPredicater  )r   r   r  r  r#  r  r&  rb  s           r1   visitJqlChangedClausezJQL.visitJqlChangedClause   s    ::c4467LL
 
 446 	-M

=1I!!),	- !$
 r0   c                 B    t        |j                               }||d}|S Nri  r   r   r   r   r  rb  s       r1   visitJqlEqualsOperatorzJQL.visitJqlEqualsOperator  &    CKKM*
 r0   c                     t        |j                               }||t         j                  k(  rt         j                  nt         j                  d}|S r  )r   r   r&   r   r,   r  s       r1   visitJqlLikeOperatorzJQL.visitJqlLikeOperator  s?    CKKM*%-1B1B%B8>>HZHZ
 r0   c                 B    t        |j                               }||d}|S r  r  r  s       r1   visitJqlComparisonOperatorzJQL.visitJqlComparisonOperator&  r  r0   c                 `    t        | j                  |      j                               }||d}|S r  )r   r   r^  r  s       r1   visitJqlInOperatorzJQL.visitJqlInOperator.  s2    DNN3/5578
 r0   c                     t        | j                  |      j                               }||t         j                  k(  rt         j                  nt         j
                  d}|S r  )r   r   r^  r   r   r    r  s       r1   visitJqlIsOperatorzJQL.visitJqlIsOperator6  sI    DNN3/5578&.(++&=8??8CVCV
 r0   c                     t        | j                  |      j                               }||t         j                  k(  rt         j                  nt         j
                  d}|S r  )r   r   r^  r   r   r.   r  s       r1   visitJqlWasOperatorzJQL.visitJqlWasOperator>  sK    DNN3/5578'/8<<'?8##XEYEY
 r0   c                     t        | j                  |      j                               }||t         j                  k(  rt         j                  nt         j
                  d}|S r  )r   r   r^  r)   r   r.   r  s       r1   visitJqlWasInOperatorzJQL.visitJqlWasInOperatorF  sK    DNN3/5578'/8??'B8##H\H\
 r0   c                 |    t        | j                  |      j                               }|t         j                  d}|S r  )r   r   r^  r   r  s       r1   visitJqlChangedOperatorzJQL.visitJqlChangedOperatorN  s8    DNN3/5578##
 r0   c                     |j                         xs" |j                         xs |j                         }| j                  ||      }|S r   )jqlDatePredicateOperatorjqlDateRangePredicateOperatorjqlUserPredicateOperatorrc  r   r   ra  r&  s       r1   visitJqlWasPredicatezJQL.visitJqlWasPredicateV  sO    ((* .002.++- 	
 ''\:	r0   c                     |j                         xs4 |j                         xs" |j                         xs |j                         }| j	                  ||      }|S r   )r  r  r  jqlValuePredicateOperatorrc  r  s       r1   visitJqlChangedPredicatezJQL.visitJqlChangedPredicate_  sb    ((* /002/++-/ ,,.	 	 ''\:	r0   c                    |j                         xs |j                         }| j                  |      }t        |t        j
                        r| j                  |j                               }|slt        j                  j                  dd| gddg      }|st        j                  d| d      |j                  }|t        t        j                  |      d}no|d	   sjt        j                   d
| d      t        |t        j"                        r|t        t        j                  |      d}nt        j                  d| d      |d   }|j%                  dg       }|s3t'        |d      r'|j(                  r|j+                  |j(                         |s3t'        |d      r'|j                  r|j-                  |j                         ||d<   | j/                  |j0                        |d<   |S )Ncaptionr   --r[   r   !   Неизвестное поле 'r  )r[   r\   r^   
   Поле '#   ' не поддерживаетсяr\   r   modelsortable)	jqlStringjqlCustomFieldr_  rC  r
   JqlStringContextr   lowerr   CmfCustFieldsgetr   UnknownFieldErrorr[   getattrr   
FieldErrorJqlCustomFieldContextr   r   r  r  r.  r   r=  )r   r   	field_ctxr   r   custom_fieldr\   field_modelss           r1   visitJqlNonNumberFieldzJQL.visitJqlNonNumberFieldi  s   MMO;s'9'9';	ZZ	*
i!;!;<OOJ$4$4$67E%2277%w:,@ &>  8   $$669Z[eZffg7hii)..
&!(!D ;' ++jDg,hii	9#B#BC"$V^^Z@E
 ..1RS]R^^_/`aa+&	yy2.G!<	0H!=)BRBR	 0 01&h --i.B.BCjr0   c                 0   |j                         }| j                   d| }d| d| j                  j                          }t        j                  j                  ddd|gdd|ggddg	      }|st        j                  d
| d| d      |j                  S )Nr   cf__r   r[   r   rZ   r  r   +   Пользовательское поле '' (   ) не найдено)		POSNUMBERr   r  r   r  r  r   CustomFieldErrorr[   )r   r   field_idfield_ext_idr   r  s         r1   visitJqlCustomFieldzJQL.visitJqlCustomField  s    ==?**+2hZ88*Ad&6&6&<&<&>%?@
**//*-7L1
 &> 0 
 --=j\XJVkl     r0   c                     |j                         }|j                  d      r|j                  d      s"|j                  d      r|j                  d      r|dd }|S )Nr  "r   r<  )r   
startswithendswith)r   r   r   s      r1   visitJqlStringzJQL.visitJqlString  sK    {{}__S!dmmC&8$s);":Dr0   c                 "    |j                         S r   )r   r   r   s     r1   visitJqlNumberzJQL.visitJqlNumber  s    {{}r0   c                 L    t         j                  |j                         dd d}|S )Nr4   r   r	  r  r  )r3   r4   r   )r   r   rb  s      r1   visitJqlEmptyzJQL.visitJqlEmpty  s&    MM{{}	
 r0   c           	         d }|j                         xs |j                         }| j                  |      }| j                  }|d   }|j                  }|j                  dg       }|j                  d      }	| j                  }
	 | j                  t        j                  k(  r| j                  |      }nu| j                  t        j                  k(  r5t        j                  d|      r|d| d}|d   dk7  r1d	| |d
<   n'|}n#| j                  t        j                  k(  r|dk(  r| j                  |      \  }}d| d|d}n|dk(  rnt         j"                  j                  dd|gg dg      }|s+t         j"                  j                  ddd| dgg dg      }|rt%        |j&                        }nnt)        |t*        j,                  t*        j.                  t*        j0                  f      r5t        j                  d|      r|d| d}|d   dk7  rd	| |d
<   n|}n d|v r| j                  |      }n|r|	rd }dg}|D ]  }|	D ]\  }|dk(  r@|dv r| j2                   d| }n| j2                   d| }|j5                  ddd| dg       H|j5                  |d| g       ^ t6        j9                  |      j;                  |      }|s|j&                  } nE nC|j<                  r5|j>                  dv r'|rt6        jA                  |dd      }n|}d| d|d}n|}|stC        d       	 tF        jH                  | jK                  |      tM        |      tN        urd| dn|d%   tM        |      tN        urt%        |      n|d
   d&}|S # tB        $ r/}|
rtE        d!| d"|
 d#|       tE        d!| d$| d#|       d }~ww xY w)'Nr\   r   r]   z^-?[0-9]+(w|d|h|m?)( +)?$now()ri  r   -znow()+r  r   r  
logic_typer[   r   )rZ   r   Nr  r|   r   z%"z"%r  r   rZ   )affected_versionsfix_versionsz
::version:r   r   	CmfChoice    )seplengthu;   Возможно объект не импортированu&   Не найдено значение 'u   ' в предикате 'z'. u   ' для поля 'r  r  )(r  	jqlNumberr_  r   r=  r   r   r   rS   rU   r  rV   rematchrT   r   r   CmfLogicTyper   rt   r>  r   CmfDateTimeCmfDateCmfTimer   r  cmfutilget_model_by_namer  customwidgettranslit_stripr   r  r3   r5   r   r   dict)r   r   	new_value	value_ctxr   r   r\   r   r  r]   rS  priority_idpriority_namer  objr   field_modelsearch_fieldrZ   
choice_keyr  rb  s                         r1   visitJqlValuezJQL.visitJqlValue  sD   	MMO6s}}	

9%##+&	))
yy2.IIk*	!==^	z9#;#;; //6	!!Y%=%==888%@!&!&ug!I Qx3-3E7+;	%( %I!!Y__4+151J1J51Q.K#$]O1!5*!I  </!'!4!4!8!8#We42  "9 "J &%+%8%8%<%<!(&BugR. A 6$ &= &
 "$'
$8		F,>,>PVP^P^+_`xx <eD%*%*5'?%	 !8s?17w/?Ie,$)	 L0 $ 3 3E :I!iC#fG'3 ",5 TL+x7#-1V#V040@0@/AE7-SF040@0@/AE7-KF ''Qvha=/Q R 'g%/R ST &77DIIQXIY(+I!" %%)*:*:{*K%,%;%;! ##% &< &
 &+
#$UG1)!I
 !&I ]^^  MM~~c*)-i)Dq1%)T[J\%))_D%@3y>iPUFV	
   	z! <UGC\]o\ppstwsxy  !#I%Pcdncoorsvrw!xyy	zs    IN A N 	O*OOc                 ,   	 | j                  |j                               }|j                         r| j                  |j                               ng }| j                  |      }d }g }|t        j                  k(  rd}nD|t        j                  k(  rd}n-|t        j                  k(  r| j                  }t        |d   t        j                        r3t        j                  d|j                   d|d   j                    d      g }	|D ]x  }
t"        j$                  j'                  dd	d
|
gdd
|
ggdd	g      }|r|	j)                  |j*                         M| j,                  j)                  d|
 d|j                   d       z |	s#t        j                  d|j                   d      ddj/                  |	       d}d}|	}t0        j2                  ||| j                  |      |||dd}|S # t        $ r}t        j                  d|       d }~ww xY w)Nu2   Функция не поддерживается. r  __G_CURRENT_USERr\   r  u0   ' не поддерживается полем 'z' (M2M)r   rt   r   r[   r  r   u&   Не найдена аргумент 'u   ' функции 'r  u,   ' не содержит аргументовz
membersOf(r*  r+  	MEMBER_OF)r
  r8  )r   r
  r8  r	  r  r  )r_  jqlFunctionNamer   r   FunctionErrorjqlArgumentListr   r:   r@   rB   rA   r   r>  r   r@  r[   r=  r   CmfPersonGroupr  r  rt   r   r"  r3   r6   )r   r   r
  r  r8  r  bql_functionbql_argumentsr   groupsargumentgrouprb  s                r1   visitJqlFunctionzJQL.visitJqlFunction/  s5   	gzz#"5"5"78H :=9L9L9NDJJs2245TV	s#x||#"L----L+++''E%,f.?.?@ ..&x}}o 6##(#5#@#@"AJ  F% --22(3(3
 !&> 3  MM%**-KK&&@
J\]e]j]j\kklm  ..1A(--P|/}~~ 6!2 315E&L"M $$ "~~c*(*

 o  	g**-_`c_d+eff	gs   G- -	H6HHc                 P    t        |j                         j                               S r   )r:   r   r^  r  s     r1   visitJqlFunctionNamezJQL.visitJqlFunctionNamek  s    ++-..r0   c                 ~    g }|j                         D ]'  }| j                  |      }|s|j                  |       ) |S r   )jqlArgumentr_  r  )r   r   r8  argument_ctxr  s        r1   visitJqlArgumentListzJQL.visitJqlArgumentListn  sD    	OO- 	+Lzz,/H  *	+
 r0   c                    | j                  |      }g }|j                         D ]a  }| j                  |      }	 | j                  |      }|d   t        j                  k(  r|j                  |d          n|j                  |       c |st        d| d      t        j                  ||d}|S # t        $ r+}| j                  j                  d| d|        Y d }~d }~ww xY w)Nr   r  r  r  u   Для операндов 'u   ' не найдены варианты для замены, возможно объекты еще не импортированы)r   r	  r  )
r   
jqlOperandr_  r3   r7   r.  r  r   r   r  )	r   r   r	  r  r  r  r  r  rb  s	            r1   visitJqlListzJQL.visitJqlListw  s    ..%>>+ 	K"nn[9O	**[16?gll2OOGJ$78OOG,	 -gY 7Y Z  LL 

 !  ""&&77[\_[`a s   AB//	C#8!CC#c                 h    |j                         xs |j                         }| j                  |      S r   )r  r  r_  )r   r   r  s      r1   visitJqlArgumentzJQL.visitJqlArgument  s'    MMO6s}}	zz)$$r0   c                 0   g }|j                         D ](  }| j                  |      }|s |j                  |       * |s| j                         S ddj	                  |D cg c]  }|d   	 c}       dd|D cg c]  }|d   	 c}gd}|S c c}w c c}w )Nz	ORDER BY r*  r  rY  r   r  ri  )jqlSearchSortr_  r  rk  r"  )r   r   r   crb  r   s         r1   visitJqlOrderByzJQL.visitJqlOrderBy  s    ""$ 	&AZZ]Ff%	&
 %%'' !+OuE'N+O!P QR%GueEl%GH

 	 ,P%Gs    B
:B
c                    	 | j                  |j                               }|d   }|d   }|d   st        j                  d| d      |j                  r| d|j                  j
                   n||j                  r(|j                  j
                  dk(  rd|j                   n|j                  d	}|S # t        $ rJ}| j                  j                  d
| j                  |       d|        | j                         cY d }~S d }~ww xY w)Nr[   r\   r  r  u4   ' не поддерживает сортировкуr!  DESCr  ri  u%   Условие сортировки 'r  )r_  r  r   r  orderr   r=  r   r   r  r   rk  )r   r   r   r   r\   rb  r  s          r1   visitJqlSearchSortzJQL.visitJqlSearchSort  s   	(JJs||~.EvJk*I$ ++jDx,yzz >AYYJ<q(89J58YY399>>U[C[9//01ajauauF
 M 	(KK7s8K7LLrsvrwx %%''		(s   B2B5 5	D>?D=DDr   )NF)}r   r   r   r   r   r  approvers_forresponsiblera   comments
componentsrO  rQ  r   deadliner  rt   r{   r   r   r   	cmf_ownerr   status_closed_atlistsr   r[   r  cmf_modified_atr   r   r   r   r   r   classmethodr   r   r   r   r  r  r'  r5  rI  rM  rV  r\  rc  r
   JqlQueryContextrg  JqlOrClauseContextrn  JqlAndClauseContextrr  JqlNotClauseContextry  JqlSubClauseContextr}  JqlTerminalClauseContextr  JqlEqualsClauseContextr  JqlLikeClauseContextr  JqlComparisonClauseContextr  JqlInClauseContextr  JqlIsClauseContextr  JqlWasClauseContextr  JqlWasInClauseContextr  JqlChangedClauseContextr  JqlEqualsOperatorContextr  JqlLikeOperatorContextr  JqlComparisonOperatorContextr  JqlInOperatorContextr  JqlIsOperatorContextr  JqlWasOperatorContextr  JqlWasInOperatorContextr  JqlChangedOperatorContextr  JqlWasPredicateContextr  JqlChangedPredicateContextr  JqlNonNumberFieldContextr  r  r  r  r  JqlNumberContextr  JqlEmptyContextr  JqlValueContextr  JqlFunctionContextr!  JqlFunctionNameContextr#  JqlArgumentListContextr'  JqlListContextr*  JqlArgumentContextr,  JqlOrderByContextr0  JqlSearchSortContextr4  __classcell__)r   s   @r1   rX   rX   Y   s	   Q%99"F+	
Q 	55
Q 	33
Q* 	!33
+Q6 	
7Q< 	
=QD 	00
EQP 	22"F+	
QQ^ 	66%	
_Ql 	22
mQx 	!,,
yQD 	00!{	
EQR 	!,,
SQ\ 	
]Qn 	 44"F+	
oQz 	
{QB 	,,"F+

CQX 	
YQ^ 	
_Qf 	,, '*	
gQr 	
sQx 	
yQ~ 	
QD 	./
EQN 	!33"F+	
OQZ 	!33"F+	
[Qf 	
gQn 	00
oQz 	//#nG
{QL 	
MQT 	&'
UQ^ 	11
_Qh 	!
iQn 	%'
oQt 	
uQ| 	 22"F+	
}QJ 	88()	
KQX 	--"F+&'
YQh 	..&'"F+
iQx 	,,
yQD 	,,
EQP 	
QQX 	22#}	
YQf 	77%	
gQr 	
sQx 	
yQ@ 	 22
AQJ 	
KQP 	
QQV 	
WQ\ 	
]QMf	!<(H# H8 
 
?
V2j&4#l$!F`D*)V&62!:!: 2,I$@$@ ,,Y%B%B ,Y%B%B 
Y%B%B 
()*L*L (6
	(H(H 
i&D&D "
I,P,P 
I$@$@ .	I$@$@ 	Y%B%B &y'F'F <)J)J ,)*L*L 	(H(H i.T.T i&D&D i&D&D y'F'F )J)J 9+N+N 	(H(H I,P,P &)*L*L &P!y'F'F !()"<"< )"<"< !:!: s!:!: sj:I$@$@ :x/	(H(H /	(H(H 	 8 8 <%I$@$@ %9#>#> $(i&D&D (r0   rX   c                   6    e Zd Zd ZddZeddedefd       Zy)JQLNormalizerc                 0    t               | _        g | _        y r   )rX   visitorr   )r   s    r1   r   zJQLNormalizer.__init__  s    ur0   Nc                 <   |xs d| j                   _        t        j                  |      }t	        |      }t        j
                  |      }t        |      }|j                         }| j                   j                  |      }| j                   j                  | _	        |S r   )
rf  r   antlr4InputStreamr	   CommonTokenStreamr
   jqlQueryr_  r   )	r   jqlr   input_streamlexerstreamparsertreerb  s	            r1   get_modifiedzJQLNormalizer.get_modified  s}    #.#5# ))#.&))%06" ##D)ll))r0   r   r   c                 8   |xs d}|j                  d      r|j                  dd      }|j                  d      \  }}| d| }| d|j                          }t        j
                  j                  ddd	|gd
d	|gg      }|st        j                  d| d| d      |S t        j                  |j                               }|st        j                  d| d      |j                  d      st        j                  d| d      |d   j                  }|S )Nr   customfield_customfieldcfr  r   r   r[   r   rZ   r  r  r  r  r  r  r^   r  r  r\   )r  rA  splitr  r   r  r  r   r  rX   r   r  r   r  r=  )	r   r   r   r  r  r  r   r  mapped_fields	            r1   convert_fieldzJQLNormalizer.convert_field  sH   !(SN+MM-6E++c*KAx)]"XJ7L!7!K$5$5$7#89J!..33Wj1w5 4 L   11A*SQYPZZop   >>%++-8L 225VW\V]]^3_``!%%k2 ++j?b,cdd)+6AA
r0   r   )r   r   r   r   rr  r>  r   ry  r/   r0   r1   rd  rd    s.    
 3 S  r0   rd  )r   rh  enumr   pathlibr   cmfr   cmf.includer7  r   r	   r
   r   r   r3   r:   rF   rO   rS   rX   rd  r/   r0   r1   <module>r~     s    	          " t  4d ,t ,  & &e(* e(P+0 0r0   