3
Šãde÷Â  ã            5   @   sR  d Z ddlmZmZmZmZmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZmZ ddlmZmZmZmZmZmZ G dd	„ d	ƒZeejejejejejej ej!ej"ej#ej$ej%ej&ej'ej(ej)ej*ej+ej,ej-ej.gƒZ/ej0ej1ej2ej3ej4ej5ej6ej7ej8ej9ej:ej;ej<ej=ej>ej?ej@ejAejBejejejejej ej!ej"ej#ejejCejDejEejFejGejHejIejJejKejLejMejNejOej$ej%ej&ej'ej(ej)ej*ej+ej,ej-ej.d
œ4ZPejFej<ejIejJejKejLejHejMdœZQddddddddddddddddddddddddd d!d"d#d$d%d&d'd(d)œ!ZRd*d+d$dd,d-œZSd.d/d0d1d2d3d4d5œZTG d6d7„ d7ƒZUeed8œd9d:„ZVeed8œd;d<„ZWe	eef ed=œd>d?„ZXee ed@œdAdB„ZYedCœdDdE„ZZe[ed8œdFdG„Z\e]ed8œdHdI„Z^e]ed8œdJdK„Z_eed8œdLdM„Z`eaed8œdNdO„Zbeced8œdPdQ„Zdeed8œdRdS„ZeefeedTœdUdV„ZgefefdWœdXdY„ZhG dZd[„ d[ƒZid\S )]zExpression Parser.é    )ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚSequenceÚUnioné   )ÚDbDoc)Ú
BYTE_TYPESÚget_item_or_attr)ÚMessageÚmysqlxpb_enum)ÚBuildExprTypesÚBuildScalarTypesÚMessageTypeÚProtobufMessageCextTypeÚProtobufMessageTypeÚ
StrOrBytesc               @   st  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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.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRdQZSdRZTdSZUdTZVdUZWdVZXdWZYdXZZdYZ[dZZ\d[S )\Ú	TokenTypezToken types class.r
   é   é   é   é   é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é    é!   é"   é#   é$   é%   é&   é'   é(   é)   é*   é+   é,   é-   é.   é/   é0   é1   é2   é3   é4   é5   é6   é7   é8   é9   é:   é;   é<   é=   é>   é?   é@   éA   éB   éC   éD   éE   éF   éG   éH   éI   éJ   éK   éL   éM   éN   éO   éP   éQ   éR   éS   éT   éU   éV   éW   éX   éY   N)]Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚNOTÚANDÚORÚXORÚISÚLPARENÚRPARENÚ
LSQBRACKETÚ
RSQBRACKETÚBETWEENÚTRUEÚNULLÚFALSEÚINÚLIKEÚINTERVALÚREGEXPÚESCAPEÚIDENTÚLSTRINGÚLNUMÚDOTÚDOLLARÚCOMMAÚEQÚNEÚGTÚGEÚLTÚLEÚBITANDÚBITORÚBITXORÚLSHIFTÚRSHIFTÚPLUSÚMINUSÚMULÚDIVÚHEXÚBINÚNEGÚBANGÚMICROSECONDÚSECONDÚMINUTEÚHOURÚDAYÚWEEKÚMONTHÚQUARTERÚYEARÚEROTEMEÚ
DOUBLESTARÚMODÚCOLONÚORORÚANDANDÚLCURLYÚRCURLYÚCASTÚDOTSTARÚORDERBY_ASCÚORDERBY_DESCÚASÚARROWÚQUOTEÚBINARYÚDATETIMEÚTIMEÚCHARÚDATEÚDECIMALÚSIGNEDÚINTEGERÚUNSIGNEDÚJSONÚSECOND_MICROSECONDÚMINUTE_MICROSECONDÚMINUTE_SECONDÚHOUR_MICROSECONDÚHOUR_SECONDÚHOUR_MINUTEÚDAY_MICROSECONDÚ
DAY_SECONDÚ
DAY_MINUTEÚDAY_HOURÚ
YEAR_MONTHÚOVERLAPS© rÌ   rÌ   úB/var/www/agendate/envp3/lib/python3.6/site-packages/mysqlx/expr.pyr   /   s´   r   )4ÚandÚorÚxorÚisÚnotÚlikeÚinÚoverlapsÚregexpÚbetweenÚintervalÚescapeÚcastÚdivÚhexÚbinÚtrueÚfalseÚnullÚsecondÚminuteÚhourÚdayÚweekÚmonthZquarterÚyearÚmicrosecondZascÚdescÚasÚbinaryÚdatetimeÚtimeÚcharÚdateÚdecimalÚsignedÚunsignedÚintegerÚjsonZsecond_microsecondZminute_microsecondZminute_secondZhour_microsecondZhour_secondZhour_minuteZday_microsecondZ
day_secondZ
day_minuteZday_hourZ
year_month)rë   rÚ   rî   rï   rð   rñ   rí   rò   z==z&&rÛ   z||rÒ   rÐ   ú^rÑ   r×   rÔ   rÓ   z!=ú>z>=ú<z<=ú&ú|z<<z>>ú+ú-Ú*ú/ú~ú%rÚ   Úcont_inrÕ   )!ú=z==rÎ   rÛ   z||rÏ   rÒ   rÐ   rõ   rÑ   r×   rÔ   rÓ   z!=z<>rö   z>=r÷   z<=rø   z&&rù   z<<z>>rú   rû   rü   rý   rþ   rÿ   rÚ   r   rÕ   Z	sign_plusZ
sign_minusú!)rú   rû   rþ   rÒ   r  Úis_notZnot_betweenZ
not_regexpZnot_likeZnot_inZnot_cont_inZnot_overlaps)rÑ   r×   rÖ   rÓ   rÔ   r   rÕ   c               @   sB   e Zd ZdZdeeeddœdd„Zedœdd	„Zedœd
d„ZdS )ÚTokenzToken representation class.r
   N)Ú
token_typeÚvalueÚlengthÚreturnc             C   s   || _ || _|| _d S )N)r  r  r  )Úselfr  r  r  rÌ   rÌ   rÍ   Ú__init__#  s    zToken.__init__)r  c             C   s   | j ƒ S )N)Ú__str__)r	  rÌ   rÌ   rÍ   Ú__repr__(  s    zToken.__repr__c             C   s2   | j tjtjtjfkr*| j › d| j› d�S | j › S )Nú(ú))r  r   r…   r‡   r†   r  )r	  rÌ   rÌ   rÍ   r  +  s    
zToken.__str__)r
   )	ro   rp   rq   rr   ÚintÚstrr
  r  r  rÌ   rÌ   rÌ   rÍ   r     s   r  )r  r  c             C   s¤   t dƒ}t| t ƒr| S t| tƒr,| jdd�S t| ttfƒrXtdƒ|d< t| ƒjƒ |d< nHt| t	t
fƒr„tdƒ|d< t| ƒjƒ |d< ntd	ƒ|d< t| ƒjƒ |d
< |S )NzMysqlx.Expr.ExprT)ÚreparsezMysqlx.Expr.Expr.Type.OBJECTÚtypeÚobjectzMysqlx.Expr.Expr.Type.ARRAYÚarrayzMysqlx.Expr.Expr.Type.LITERALÚliteral)r   Ú
isinstanceÚ
ExprParserÚexprÚdictr   r   Úbuild_objectÚget_messageÚlistÚtupleÚbuild_arrayÚbuild_scalar)r  ÚmsgrÌ   rÌ   rÍ   Ú
build_expr8  s    

r!  c             C   s~   t | tƒrt| ƒS t | tƒr$t| ƒS t | tƒr6t| ƒS t | tƒrHt| ƒS t | t	ƒrZt
| ƒS | d krhtƒ S tdt| ƒ› �ƒ‚d S )NzUnsupported data type: )r  r  Úbuild_string_scalarr   Úbuild_bytes_scalarÚboolÚbuild_bool_scalarr  Úbuild_int_scalarÚfloatÚbuild_double_scalarÚbuild_null_scalarÚ
ValueErrorr  )r  rÌ   rÌ   rÍ   r  J  s    




r  )Úobjr  c             C   s|   t | tƒrt| jƒS tdƒ}xZ| jƒ D ]N\}}tdƒ}t |tƒrH|jƒ n||d< t|ƒj	ƒ |d< |d j
|j	ƒ gƒ q&W |S )NzMysqlx.Expr.ObjectzMysqlx.Expr.Object.ObjectFieldÚkeyr  Úfld)r  r   r  Ú__dict__r   Úitemsr  Úencoder!  r  Úextend)r+  r   r,  r  ÚpairrÌ   rÌ   rÍ   r  Z  s    

r  )r  r  c             C   s$   t dƒ}|d jdd„ | D ƒƒ |S )NzMysqlx.Expr.Arrayr  c             S   s   g | ]}t |ƒjƒ ‘qS rÌ   )r!  r  )Ú.0r  rÌ   rÌ   rÍ   ú
<listcomp>i  s    zbuild_array.<locals>.<listcomp>)r   r1  )r  r   rÌ   rÌ   rÍ   r  g  s    r  )r  c              C   s   t dƒ} tdƒ| d< | S )NzMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_NULLr  )r   r   )r   rÌ   rÌ   rÍ   r)  m  s    r)  c             C   s    t dƒ}tdƒ|d< | |d< |S )NzMysqlx.Datatypes.Scalarz%Mysqlx.Datatypes.Scalar.Type.V_DOUBLEr  Zv_double)r   r   )r  r   rÌ   rÌ   rÍ   r(  s  s    r(  c             C   s    t dƒ}tdƒ|d< | |d< |S )NzMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_SINTr  Zv_signed_int)r   r   )r  r   rÌ   rÌ   rÍ   r&  z  s    r&  c             C   s    t dƒ}tdƒ|d< | |d< |S )NzMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_UINTr  Zv_unsigned_int)r   r   )r  r   rÌ   rÌ   rÍ   Úbuild_unsigned_int_scalar�  s    r5  c             C   s@   t | tƒrtt| dƒƒ} tdƒ}tdƒ|d< td| d�|d< |S )Nzutf-8zMysqlx.Datatypes.Scalarz%Mysqlx.Datatypes.Scalar.Type.V_STRINGr  zMysqlx.Datatypes.Scalar.String)r  Zv_string)r  r  ÚbytesÚ	bytearrayr   r   )r  r   rÌ   rÌ   rÍ   r"  ˆ  s    
r"  c             C   s    t dƒ}tdƒ|d< | |d< |S )NzMysqlx.Datatypes.Scalarz#Mysqlx.Datatypes.Scalar.Type.V_BOOLr  Zv_bool)r   r   )r  r   rÌ   rÌ   rÍ   r%  ‘  s    r%  c             C   s(   t dƒ}tdƒ|d< t d| d�|d< |S )NzMysqlx.Datatypes.Scalarz%Mysqlx.Datatypes.Scalar.Type.V_OCTETSr  zMysqlx.Datatypes.Scalar.Octets)r  Zv_octets)r   r   )r  r   rÌ   rÌ   rÍ   r#  ˜  s    r#  c             C   s    t dƒ}tdƒ|d< | |d< |S )NzMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.LITERALr  r  )r   r   )r  r   rÌ   rÌ   rÍ   Úbuild_literal_exprŸ  s    r8  )ÚnameÚparamr  c             C   sF   t dƒ}t|  |d< |jƒ g|d< t dƒ}tdƒ|d< |jƒ |d< |S )NzMysqlx.Expr.Operatorr9  r:  zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.OPERATORr  Úoperator)r   Ú_UNARY_OPERATORSr  r   )r9  r:  r;  r   rÌ   rÌ   rÍ   Úbuild_unary_op¦  s    r=  )Ústringr  c             C   s   | j ddƒS )Nú"z"")Úreplace)r>  rÌ   rÌ   rÍ   Úescape_literal°  s    rA  c               @   s�  e Zd ZdZd~eeddœdd„Zedœdd	„Zddœd
d„Ze	eedœdd„Z
e	edœdd„Zde	eedœdd„Ze	edœdd„Zddœdd„Ze	ddœdd„Ze	edœdd„Ze	ed œd!d"„Ze	edœd#d$„Ze	ed œd%d&„Ze	e	ed'œd(d)„Ze	edœd*d+„Zeeeef  dœd,d-„Zedœd.d/„Zedœd0d1„Zedœd2d3„Zedœd4d5„Z edœd6d7„Z!eeeef  dœd8d9„Z"edœd:d;„Z#edœd<d=„Z$e	ddœd>d?„Z%edœd@dA„Z&edœdBdC„Z'edœdDdE„Z(edœdFdG„Z)eedHœdIdJ„Z*edœdKdL„Z+edœdMdN„Z,d€ee-e dOœdPdQ„Z.e/edœdRdS„ƒZ0edœdTdU„Z1e2e	 e3g ef edVœdWdX„Z4edœdYdZ„Z5edœd[d\„Z6edœd]d^„Z7edœd_d`„Z8edœdadb„Z9edœdcdd„Z:edœdedf„Z;edœdgdh„Z<edœdidj„Z=edœdkdl„Z>d�eedmœdndo„Z?d‚eedmœdpdq„Z@edœdrds„ZAeBdœdtdu„ZCee dœdvdw„ZDeeeef  dœdxdy„ZEeeeef  dœdzd{„ZFeeeef  dœd|d}„ZGdS )ƒr  zExpression parser class.TN)r>  Úallow_relationalr  c             C   s>   || _ g | _g | _d| _|| _i | _d| _| jƒ  | jƒ  d S )Nr   )	r>  ÚtokensÚpath_name_queueÚposÚ_allow_relational_columnsÚplaceholder_name_to_positionÚpositional_placeholder_countÚclean_expressionÚlex)r	  r>  rB  rÌ   rÌ   rÍ   r
  ·  s    zExprParser.__init__)r  c             C   s   d| j › d�S )Nz<mysqlx.ExprParser 'z'>)r>  )r	  rÌ   rÌ   rÍ   r  Â  s    zExprParser.__str__c             C   s¢   t | jtƒst| jƒ| _| jjdƒ| _t| jƒdkrR| jd	 dkrR| jdd
… | _d| jdd… jƒ krx| jdd… | _d| jdd… jƒ krž| jdd… | _dS )zµRemoves the keywords that does not form part of the expression.

        Removes the keywords "SELECT" and "WHERE" that does not form part of
        the expression itself.
        ú r
   ú;NZSELECTr   ZWHEREr   éÿÿÿÿrM  )r  r>  r  ÚreprÚstripÚlenÚupper)r	  rÌ   rÌ   rÍ   rI  Å  s    zExprParser.clean_expression)r,  rî   r  c             C   s$   |d t | jƒk o"| j|d  |kS )Nr
   )rP  r>  )r	  r,  rî   rÌ   rÌ   rÍ   Únext_char_isÖ  s    zExprParser.next_char_is)rE  r  c             C   s‚   |}d}xX|t | jƒk r`| j| jƒ s4| j| dkr`| j| dkrV|dkrRtdƒ‚d}|d7 }q
W | j||… }ttj|t |ƒƒS )NFÚ.Tz"Invalid number. Found multiple '.'r
   )rP  r>  Úisdigitr*  r  r   r‡   )r	  rE  ÚstartZ	found_dotÚvalrÌ   rÌ   rÍ   Ú
lex_numberÙ  s    zExprParser.lex_numberF)ÚiÚallow_spacer  c             C   sä   |}xH|t | jƒk rL| j| jƒ sB| j| dksB| j| jƒ rL|rL|d7 }qW | j||… }y\|t | jƒk rš| j| dkrš|jƒ tkršttj|t |ƒƒ}ntt	|jƒ  |jƒ t |ƒƒ}W n& t
k
rÞ   ttj|t |ƒƒ}Y nX |S )NÚ_r
   r  )rP  r>  ÚisalnumÚisspaceÚlowerÚ%_SQL_FUNTION_RESERVED_WORDS_COLLISIONr  r   r…   Ú_RESERVED_WORDSÚKeyError)r	  rX  rY  rU  rV  ÚtokenrÌ   rÌ   rÍ   Ú	lex_alphaê  s      zExprParser.lex_alpha)r,  r  c             C   s  | j | }d}|d7 }|}x’|t| j ƒk r¬| j | }||krb|d t| j ƒk rb| j |d  |krbP ||dfkrš|d t| j ƒkr‚P |d7 }|| j | 7 }n||7 }|d7 }qW |t| j ƒksÊ| j | |krØtd|› �ƒ‚|dkröttj|t|ƒd ƒS ttj|t|ƒd ƒS )NÚ r
   ú\z'Unterminated quoted string starting at ú`r   )r>  rP  r*  r  r   r…   r†   )r	  r,  Ú
quote_charrV  rU  rî   rÌ   rÌ   rÍ   Úlex_quoted_token  s,    

zExprParser.lex_quoted_tokenc             C   sò  d}d}d}�xÞ|t | jƒk �rì| j| }|jƒ r<|d7 }q|jƒ rR| j|ƒ}�n‚|jƒ sb|dkrr| j||ƒ}�nb|dkrŠttj	|ƒ}�nJ|dkr¢ttj
|ƒ}�n2|dkrºttj|ƒ}�n|dkrÒttj|ƒ}�n|d	krêttj|ƒ}�nê|d
k�r.| j|dƒ�r| �rttjddƒ}d}nttj|ƒ}�n¦|dk�rf| j|dƒ�rVttjddƒ}nttj|ƒ}�nn|dk�r€ttj|ƒ}�nT|dk�ršttj|ƒ}�n:|dk�r´ttj|ƒ}�n |dk�rî| j|dƒ�rÜttjddƒ}nttjddƒ}�næ|dk�r&| j|dƒ�rttjddƒ}nttj|ƒ}�n®|dk�r@ttj|ƒ}�n”|dk�rx| j|dƒ�rhttjddƒ}nttj|ƒ}�n\|dk�r’ttj|ƒ}�nB|dk�r¬ttj|ƒ}�n(|dk�rÆttj|ƒ}�n|dk�ràttj|ƒ}�nô|dk�rúttj |ƒ}�nÚ|d k�rttj!|ƒ}�nÀ|d!k�rL| j|dƒ�r<ttj"d"dƒ}nttj#|ƒ}�nˆ|d#k�rÀ| j|dƒ�rtttj"d$dƒ}nH| j|d#ƒ�r’ttj$d%dƒ}n*| j|dƒ�r°ttj%d&dƒ}nttj&|ƒ}�n|dk�r| j|dƒ�rèttj'd'dƒ}n*| j|dƒ�rttj(d(dƒ}nttj)|ƒ}nÀ|d)k�r~| j|dƒ�r<ttj*d*dƒ}n@|d t | jƒk �rp| j|d  jƒ �rp| j|ƒ}nttj+|ƒ}nV|d/k�r°|�r°ttj,|ƒ}|�s¦d}nd}d}n$|d0k�rÆ| j-|ƒ}nt.d.|› �ƒ‚| j/j0|ƒ ||j17 }qW d S )1Nr   Fr
   rZ  ú?ú:Ú{Ú}rú   rû   rö   z->r   Trü   z**rý   ú$rÿ   r  z==rø   z&&rõ   rù   z||r  r  ú[ú]rþ   ú,r  z!=r÷   z<>z<<z<=z>>z>=rS  z.*ú'r?  re  zUnknown character at )rp  r?  )r?  rp  re  )2rP  r>  r\  rT  rW  Úisalpharb  r  r   r§   rª   r­   r®   r–   rR  r´   r—   r¨   r˜   r™   r‰   r©   r‹   r¬   r‘   r“   r«   r’   rx   ry   rz   r{   rœ   rŠ   rŒ   r�   r”   r�   r�   r•   rŽ   r�   r°   rˆ   rµ   rg  r*  rC  Úappendr  )r	  rX  Z
arrow_lastZinside_arrowrî   ra  rÌ   rÌ   rÍ   rJ    sÄ    



















(
zExprParser.lex)r  r  c          	   C   sj   | j t| jƒkr(td|› d| j › d�ƒ‚| j| j  j|krftd|› d| j › d| j| j  › d| j› �ƒ‚d S )NzExpected token type z at pos z but no tokens leftz but found type z, on tokens )rE  rP  rC  r*  r  )r	  r  rÌ   rÌ   rÍ   Úassert_cur_token�  s    zExprParser.assert_cur_tokenc             C   s   | j | j|ƒS )N)Úpos_token_type_isrE  )r	  r  rÌ   rÌ   rÍ   Úcur_token_type_is™  s    zExprParser.cur_token_type_is)Útypesr  c             G   s"   | j t| jƒk o | j| j  j|kS )N)rE  rP  rC  r  )r	  rv  rÌ   rÌ   rÍ   Úcur_token_type_inœ  s    zExprParser.cur_token_type_inc             C   s   | j | jd |ƒS )Nr
   )rt  rE  )r	  r  rÌ   rÌ   rÍ   Únext_token_type_isŸ  s    zExprParser.next_token_type_isc             G   s&   | j t| jƒk o$| j| j d  j|kS )Nr
   )rE  rP  rC  r  )r	  rv  rÌ   rÌ   rÍ   Únext_token_type_in¢  s    zExprParser.next_token_type_in)rE  r  r  c             C   s   |t | jƒk o| j| j|kS )N)rP  rC  r  )r	  rE  r  rÌ   rÌ   rÍ   rt  ¨  s    zExprParser.pos_token_type_isc             C   s*   | j |ƒ | j| j j}|  jd7  _|S )Nr
   )rs  rC  rE  r  )r	  r  r  rÌ   rÌ   rÍ   Úconsume_token«  s    
zExprParser.consume_tokenc             C   sê   g }d}| j tjƒ | jtjƒsÌ| jƒ jƒ }t|dƒrV|jj	rV| j
jd|jj	ƒ d}n:t|dƒ r�d|kr�d|d kr�| j
jd|d d ƒ d}|j|ƒ x0| jtjƒrÊ|  jd7  _|j| jƒ jƒ ƒ qœW | j tjƒ |ræ| j
jƒ  |S )z{Parse a paren-bounded expression list for function arguments or IN
        list and return a list of Expr objects.
        FÚ
identifierr   Tr9  r
   )rz  r   rx   ru  ry   Ú_exprr  Úhasattrr{  r9  rD  Úinsertrr  rŠ   rE  Úpop)r	  ÚexprsZpath_name_addedÚmsg_exprrÌ   rÌ   rÍ   Úparen_expr_list±  s*    

zExprParser.paren_expr_listc             C   s`   | j tjƒ tdƒ}| jtjƒr<| jtjƒ|d< | jtjƒ | j| j j	|d< |  jd7  _|S )NzMysqlx.Expr.IdentifierÚschema_namer9  r
   )
rs  r   r…   r   rx  rˆ   rz  rC  rE  r  )r	  ÚidentrÌ   rÌ   rÍ   r{  Ï  s    zExprParser.identifierc             C   sD   t dƒ}| jƒ |d< | jƒ |d< t dƒ}tdƒ|d< |jƒ |d< |S )NzMysqlx.Expr.FunctionCallr9  r:  zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.FUNC_CALLr  Úfunction_call)r   r{  r‚  r   r  )r	  r…  r�  rÌ   rÌ   rÍ   r…  Ù  s    zExprParser.function_callc             C   s°   | j tjƒ | j| j }|jtjkr`|jjdƒrL|jj	dƒrLt
|j› d�ƒ‚| j tjƒ |j}n0|jtjkr€| j tjƒ |j}nt
d| j› �ƒ‚tdƒ}tdƒ|d< ||d< |S )Nre  z* is not a valid JSON/ECMAScript identifierz?Expected token type IDENT or LSTRING in JSON path at token pos zMysqlx.Expr.DocumentPathItemz(Mysqlx.Expr.DocumentPathItem.Type.MEMBERr  r  )rz  r   rˆ   rC  rE  r  r…   r  Ú
startswithÚendswithr*  r†   r   r   )r	  ra  Úmember_nameÚdoc_path_itemrÌ   rÌ   rÍ   Údocpath_memberâ  s$    
zExprParser.docpath_memberc             C   s¼   | j tjƒ | jtjƒrH| j tjƒ | j tjƒ tdƒ}tdƒ|d< |S | jtjƒr¨t	| j tjƒƒ}|dk r|t
d| j› �ƒ‚| j tjƒ tdƒ}tdƒ|d< ||d< |S td| j› �ƒ‚d S )	NzMysqlx.Expr.DocumentPathItemz6Mysqlx.Expr.DocumentPathItem.Type.ARRAY_INDEX_ASTERISKr  r   z"Array index cannot be negative at z-Mysqlx.Expr.DocumentPathItem.Type.ARRAY_INDEXÚindexzGException token type MUL or LNUM in JSON path array index at token pos )rz  r   rz   ru  r˜   r{   r   r   r‡   r  Ú
IndexErrorrE  r*  )r	  r‰  r  rÌ   rÌ   rÍ   Údocpath_array_locü  s(    

zExprParser.docpath_array_locc             C   s¸   | j stdƒ‚| jtjƒr&| jtjƒ tdƒ}| jtjƒrrtdƒ}tdƒ|d< | jtjƒ|d< |d j	|j
ƒ gƒ |d j	| jƒ ƒ | jr˜| jd |d	< td
ƒ}tdƒ|d< ||d< |S )Nz-Empty string cannot be used as document fieldzMysqlx.Expr.ColumnIdentifierzMysqlx.Expr.DocumentPathItemz(Mysqlx.Expr.DocumentPathItem.Type.MEMBERr  r  Údocument_pathr   r9  zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.IDENTr{  )rC  r*  ru  r   r‰   rz  r   r…   r   r1  r  rŽ  rD  )r	  Úcol_idr‰  r  rÌ   rÌ   rÍ   Údocument_field  s$    
zExprParser.document_fieldc             C   s  g }x¾| j tjƒr&|j| jƒ jƒ ƒ q| j tjƒrb| jtjƒ tdƒ}t	dƒ|d< |j|jƒ ƒ q| j tj
ƒr‚|j| jƒ jƒ ƒ q| j tjƒr¾| jtjƒ tdƒ}t	dƒ|d< |j|jƒ ƒ qP qW t|ƒ}|dkrþt||d  dƒt	dƒkrþtd| j› �ƒ‚|S )z°Parse a JSON-style document path, like WL#7909, but prefix by @.
        instead of $. We parse this as a string because the protocol doesn't
        support it. (yet)
        zMysqlx.Expr.DocumentPathItemz1Mysqlx.Expr.DocumentPathItem.Type.MEMBER_ASTERISKr  z1Mysqlx.Expr.DocumentPathItem.Type.DOUBLE_ASTERISKr   r
   z!JSON path may not end in '**' at )ru  r   rˆ   rr  rŠ  r  r°   rz  r   r   rz   r�  r¨   rP  r   r*  rE  )r	  Zdoc_pathr‰  r/  rÌ   rÌ   rÍ   rŽ  +  s0    

zExprParser.document_pathc             C   sÊ  g }|j | jtjƒƒ x.| jtjƒrD| jtjƒ |j | jtjƒƒ qW t|ƒdkrbtd| j› �ƒ‚|j	ƒ  t
dƒ}xVtdt|ƒƒD ]D}|dkrœ|d |d< q‚|dkr²|d |d< q‚|dkr‚|d |d	< q‚W d
}| jtjƒrød}| jtjƒ | jƒ |d< nj| jtjƒ�rbd}| jtjƒ d
}| jtjƒ�r8d}| jtjƒ | jtjƒ | jƒ |d< |�rb| jtjƒ |�rªt|d ƒdk�rªt
dƒ}tdƒ|d< d|d< |d j|jƒ gƒ t
dƒ}tdƒ|d< ||d< |S )Nr   z Too many parts to identifier at zMysqlx.Expr.ColumnIdentifierr   r9  r
   Z
table_namer   rƒ  FTrŽ  zMysqlx.Expr.DocumentPathItemz(Mysqlx.Expr.DocumentPathItem.Type.MEMBERr  rc  r  zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.IDENTr{  )rr  rz  r   r…   ru  rˆ   rP  r*  rE  Úreverser   Úranger‰   rŽ  r´   rµ   r   r1  r  )r	  Úpartsr�  rX  Zis_docZ	is_quotedr‰  r�  rÌ   rÌ   rÍ   Úcolumn_identifierO  sT    
zExprParser.column_identifierc             C   s6   | j t| jƒkrtdƒ‚| j| j  }|  j d7  _ |S )NzUnexpected end of token streamr
   )rE  rP  rC  r*  )r	  ra  rÌ   rÌ   rÍ   Ú
next_token€  s
    zExprParser.next_tokenc             C   s$   | j ƒ }|j|kr td|› �ƒ‚d S )NzExpected token type )r•  r  r*  )r	  r  ra  rÌ   rÌ   rÍ   Úexpect_token‡  s    
zExprParser.expect_tokenc             C   s   | j | j S )N)rC  rE  )r	  rÌ   rÌ   rÍ   Ú
peek_tokenŒ  s    zExprParser.peek_tokenc             C   s    | j | j j}|  jd7  _|S )Nr
   )rC  rE  r  )r	  r  rÌ   rÌ   rÍ   Úconsume_any_token�  s    zExprParser.consume_any_tokenc             C   sŽ   t dƒ}xT| jt| jƒk r\| jtjƒ r\|d j| jƒ j	ƒ gƒ | jtj
ƒsNP | jtj
ƒ q
W | jtjƒ t dƒ}tdƒ|d< |j	ƒ |d< |S )zH
        jsonArray            ::=  "[" [ expr ("," expr)* ] "]"
        zMysqlx.Expr.Arrayr  zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.ARRAYr  r  )r   rE  rP  rC  ru  r   r{   r1  r|  r  rŠ   rz  r   )r	  r   r  rÌ   rÌ   rÍ   Úparse_json_array”  s    
zExprParser.parse_json_arrayc             C   s¾   t dƒ}x„| jt| jƒk rŒ| jtjƒ rŒt dƒ}| jtjƒ|d< | jtj	ƒ | j
ƒ jƒ |d< |d j|jƒ gƒ | jtjƒs~P | jtjƒ q
W | jtjƒ t dƒ}tdƒ|d< |jƒ |d	< |S )
z‹
        jsonDoc              ::=  "{" [jsonKeyValue ("," jsonKeyValue)*] "}"
        jsonKeyValue         ::=  STRING_DQ ":" expr
        zMysqlx.Expr.ObjectzMysqlx.Expr.Object.ObjectFieldr,  r  r-  zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.OBJECTr  r  )r   rE  rP  rC  ru  r   r®   rz  r†   rª   r|  r  r1  rŠ   r   )r	  r   Úitemr  rÌ   rÌ   rÍ   Úparse_json_doc§  s     
zExprParser.parse_json_doc)ra  r  c             C   s¶   d}| j tjƒr| jtjƒ}nB| j tjƒr8| jtjƒ}n(|jtjkrPt| jƒ}nt	d| j
› �ƒ‚tdƒ}tdƒ|d< || jkrŽ| j| |d< n$| j|d< | j| j|< |  jd7  _|S )Nrc  z&Invalid placeholder name at token pos zMysqlx.Expr.Exprz!Mysqlx.Expr.Expr.Type.PLACEHOLDERr  Úpositionr
   )ru  r   r‡   rz  r…   r  r§   r  rH  r*  rE  r   r   rG  )r	  ra  Zplace_holder_namer�  rÌ   rÌ   rÍ   Úparse_place_holder¿  s     

zExprParser.parse_place_holderc             C   s’   t ddd�}| jtjƒ |d j| jƒ jƒ gƒ | jtjƒ tt	j
| jƒ ƒƒ}|d jt|ƒjƒ gƒ | jtjƒ t d|jƒ d�}tdƒ|d< |S )	z2cast ::= CAST LPAREN expr AS cast_data_type RPARENzMysqlx.Expr.OperatorrÚ   )r9  r:  zMysqlx.Expr.Expr)r;  zMysqlx.Expr.Expr.Type.OPERATORr  )r   rz  r   rx   r1  r|  r  r³   r#  r  r0  Úcast_data_typer8  ry   r   )r	  r;  Ztype_scalarr   rÌ   rÌ   rÍ   rÚ   Ö  s    zExprParser.castc             C   sâ   | j ƒ }|jtjtjtjtjfkrB| jƒ }|r<|j› |› �S |jS |jtj	krp| jdƒ}|rj|j› |› �S |jS |jtj
tjfkr | jtjƒrš| jtjƒ |jS |jtjtjtjfkr¼|jS td|j› d| j› d|j› d�ƒ‚dS )a  cast_data_type ::= ( BINARY dimension? ) |
        ( CHAR dimension? ) |
        ( DATE ) |
        ( DATETIME dimension? ) |
        ( TIME dimension? ) |
        ( DECIMAL dimension? ) |
        ( SIGNED INTEGER? ) |
        ( UNSIGNED INTEGER? ) |
        JSON
        TzUnknown token type z at position z (r  N)r•  r  r   r¶   r¹   r·   r¸   Úcast_data_type_dimensionr  r»   r¼   r¾   ru  r½   rz  r¿   rº   r*  rE  )r	  ra  Ú	dimensionrÌ   rÌ   rÍ   rž  ä  s,    


zExprParser.cast_data_type)rð   r  c             C   s¢   | j tjƒsdS g }| jtjƒ |j| jtjƒƒ |r`| j tjƒr`| jtjƒ |j| jtjƒƒ | jtjƒ t|ƒdkrˆd|d › d�S d|d › d|d › d�S )z*dimension ::= LPAREN LNUM (, LNUM)? RPARENNr
   r  r   r  ro  )	ru  r   rx   rz  rr  r‡   rŠ   ry   rP  )r	  rð   r   rÌ   rÌ   rÍ   rŸ    s    z#ExprParser.cast_data_type_dimensionc              C   s(   t dƒ} tdƒ| d< t ddd�| d< | S )NzMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.OPERATORr  zMysqlx.Expr.Operatorrü   )r9  r;  )r   r   )r   rÌ   rÌ   rÍ   Ústar_operator  s    zExprParser.star_operatorc             C   sb  | j ƒ }|jtjtjgkr$| j|ƒS |jtjkr8| jƒ S |jtjkrL| j	ƒ S |jtj
kr`| jƒ S |jtjkr„| jƒ }| jtjƒ |S |jtjtjgkrØ| jƒ }|jtjkrÈ|j|j | j| j _| jƒ S t|j| jƒ ƒS |jtjtjtjfkrþt|j| jƒ ƒS |jtjk�rtt|jƒƒS |jtjk�r2tt ƒ ƒS |jtjk�rpd|jk�r^tt!t"|jƒƒƒS tt#t$|jƒƒƒS |jtj%tj&gk�r˜tt'|jtj%kƒƒS |jtj(k�r®| j)ƒ S |jtj*k�rÄ| j+ƒ S |jtj,k�rF| jd | _| j-tjƒ�s&| j-tj.ƒ�r.| j/| jd tj,ƒ�r.| j/| jd tjƒ�r.| j0ƒ S | j1�s>| j)ƒ S | j2ƒ S t3d|j› d| j› �ƒ‚dS )z<Parse an atomic expression and return a protobuf Expr objectrS  r
   r   r   zUnknown token type = z&  when expecting atomic expression at N)4r•  r  r   r§   rª   r�  r­   r›  rz   r™  r¯   rÚ   rx   r|  r–  ry   r–   r—   r—  r‡   r  rC  rE  Úatomic_exprr=  rs   rœ   r�   r†   r8  r"  r~   r)  r(  r'  r&  r  r}   r   r%  r‰   r�  r˜   r¡  r…   rx  rˆ   rt  r…  rF  r”  r*  )r	  ra  r  ÚpeekrÌ   rÌ   rÍ   r¢  %  s^    

zExprParser.atomic_expr)rv  Úinner_parserr  c             C   s¢   |ƒ }x–| j t| jƒk rœ| j| j  j|krœtdƒ}tdƒ|d< tdƒ}t| j| j  j |d< |jƒ g|d< |  j d7  _ |d j	|ƒ jƒ gƒ ||d< |}qW |S )	z}Given a `set' of types and an Expr-returning inner parser function,
        parse a left associate binary operator expressionzMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.OPERATORr  zMysqlx.Expr.Operatorr9  r:  r
   r;  )
rE  rP  rC  r  r   r   Ú
_OPERATORSr  r  r1  )r	  rv  r¤  Úlhsr   r;  rÌ   rÌ   rÍ   Úparse_left_assoc_binary_op_expra  s    $z*ExprParser.parse_left_assoc_binary_op_exprc             C   sè   | j ƒ }| jtjtjƒrä| jtjƒrä| jƒ }tdƒ}|d j	|j
ƒ gƒ |jtjkrXdnd|d< | jtjƒ |d j	| jƒ j
ƒ gƒ | jtŽ sžtd| j› �ƒ‚tj| jƒ jƒ ƒ}|d j	tt|ƒƒj
ƒ gƒ td|d�}td	ƒ|d
< |S )NzMysqlx.Expr.Operatorr:  Zdate_addZdate_subr9  z#Expected interval type at position zMysqlx.Expr.Expr)r;  zMysqlx.Expr.Expr.Type.OPERATORr  )r¢  rw  r   r–   r—   rx  r‚   r•  r   r1  r  r  rz  Úbit_exprÚ_INTERVAL_UNITSr*  rE  r  r0  r˜  rQ  r8  r#  r   )r	  r¦  ra  r;  rÌ   rÌ   rÍ   Úadd_sub_intervalt  s$    
zExprParser.add_sub_intervalc             C   s   | j ttjtjtjgƒ| jƒS )N)r§  Úsetr   r˜   r™   r©   rª  )r	  rÌ   rÌ   rÍ   Úmul_div_expr‘  s    zExprParser.mul_div_exprc             C   s   | j ttjtjgƒ| jƒS )N)r§  r«  r   r–   r—   r¬  )r	  rÌ   rÌ   rÍ   Úadd_sub_expr—  s    zExprParser.add_sub_exprc             C   s   | j ttjtjgƒ| jƒS )N)r§  r«  r   r”   r•   r­  )r	  rÌ   rÌ   rÍ   Ú
shift_exprœ  s    zExprParser.shift_exprc             C   s   | j ttjtjtjgƒ| jƒS )N)r§  r«  r   r‘   r’   r“   r®  )r	  rÌ   rÌ   rÍ   r¨  ¡  s    zExprParser.bit_exprc             C   s*   | j ttjtjtjtjtjtjgƒ| j	ƒS )N)
r§  r«  r   rŽ   r�   r�   r�   r‹   rŒ   r¨  )r	  rÌ   rÌ   rÍ   Ú	comp_expr§  s    zExprParser.comp_exprc             C   sb  g }| j ƒ }d}| jtjƒr,d}| jtjƒ | jt| jƒk �r^|j|j	ƒ ƒ | j| j j
}| jtjƒr¤| jtjƒ | jtjƒrŽd}| jtjƒ |j| j ƒ j	ƒ ƒ �nj| jtjƒrò| jtjƒ | jtjƒrØ|j| jƒ ƒ nd}|j| j ƒ j	ƒ ƒ �n| jtjƒ�r | jtjƒ |j| j ƒ j	ƒ ƒ nî| jtjƒ�rz| jtjƒ |j| j ƒ j	ƒ ƒ | jtjƒ�r| jtjƒ |j| j ƒ j	ƒ ƒ n”| jtjƒ�rÆ| jtjƒ |j| j ƒ j	ƒ ƒ | jtjƒ |j| j ƒ j	ƒ ƒ nH| jtjƒ�rô| jtjƒ |j| j ƒ j	ƒ ƒ n|�r
td| j› �ƒ‚d }|�r^tdƒ}|�r*t| n||d< ||d< tdƒ}td	ƒ|d
< |j	ƒ |d< |}|S )NFTr   zUnknown token after NOT as pos zMysqlx.Expr.Operatorr9  r:  zMysqlx.Expr.ExprzMysqlx.Expr.Expr.Type.OPERATORr  r;  )r¯  ru  r   rs   rz  rE  rP  rC  rr  r  r  rw   r€   rx   r1  r‚  rË   r�   r„   r|   rt   rƒ   r*  r   Ú	_NEGATIONr   )r	  Úparamsr¦  r  Zop_namer;  r�  rÌ   rÌ   rÍ   Ú	ilri_expr¶  sd    zExprParser.ilri_exprc             C   s   | j ttjtjgƒ| jƒS )N)r§  r«  r   rt   r¬   r²  )r	  rÌ   rÌ   rÍ   Úand_exprî  s    zExprParser.and_exprc             C   s   | j ttjgƒ| jƒS )N)r§  r«  r   rv   r³  )r	  rÌ   rÌ   rÍ   Úxor_expró  s    zExprParser.xor_exprc             C   s   | j ttjtjgƒ| jƒS )N)r§  r«  r   ru   r«   r´  )r	  rÌ   rÌ   rÍ   Úor_exprö  s    zExprParser.or_expr)r  r  c             C   s,   |r$g | _ d| _i | _d| _| jƒ  | jƒ S )Nr   )rC  rE  rG  rH  rJ  rµ  )r	  r  rÌ   rÌ   rÍ   r|  û  s    zExprParser._exprc             C   sd   | j |ƒ}| j}| jt| jƒd tjƒr0|d7 }|t| jƒk r`td| j| jd … › d| j› �ƒ‚|S )Nr   zUnused token types z" found in expression at position: )r|  rE  rt  rP  rC  r   r³   r*  )r	  r  Z
expressionZused_tokensrÌ   rÌ   rÍ   r    s    
 zExprParser.exprc             C   s   t d| jtjƒd�S )NzMysqlx.Crud.Column)r9  )r   rz  r   r…   )r	  rÌ   rÌ   rÍ   Úparse_table_insert_field  s    z#ExprParser.parse_table_insert_fieldc             C   s
   | j ƒ jS )N)r”  r{  )r	  rÌ   rÌ   rÍ   Úparse_table_update_field  s    z#ExprParser.parse_table_update_fieldc             C   s�   g }| j jdƒ}|jƒ  xr|rŠ|jƒ }xR|jdƒ|jdƒksd|jdƒ|jdƒksd|jdƒ|jdƒkrx|jƒ › d|› �}q(W |j|jƒ ƒ qW |S )Nro  r  r  rm  rn  rj  rk  )r>  Úsplitr‘  r  Úcountrr  rO  )r	  ÚfieldsÚtempÚfieldrÌ   rÌ   rÍ   Ú_table_fields  s    zExprParser._table_fieldsc             C   s–   g }d}| j ƒ }x€| jt| jƒk r�|s2| jtjƒ d}td| jƒ d�}| j	tj
ƒrp| jtj
ƒ | jtjƒ|d< n|t|ƒ |d< |j|jƒ ƒ qW |S )NTFzMysqlx.Crud.Projection)ÚsourceÚalias)r½  rE  rP  rC  rz  r   rŠ   r   r|  ru  r³   r…   rr  r  )r	  Zproject_exprÚfirstrº  Z
projectionrÌ   rÌ   rÍ   Úparse_table_select_projection%  s    z(ExprParser.parse_table_select_projectionc             C   sž   g }d}x�| j t| jƒk r˜|s*| jtjƒ d}td| jƒ d�}| jtj	ƒrdt
dƒ|d< | jtj	ƒ n$| jtjƒrˆt
dƒ|d< | jtjƒ |j|jƒ ƒ q
W |S )NTFzMysqlx.Crud.Order)r  zMysqlx.Crud.Order.Direction.ASCÚ	directionz Mysqlx.Crud.Order.Direction.DESC)rE  rP  rC  rz  r   rŠ   r   r|  ru  r±   r   r²   rr  r  )r	  Zorder_specsrÀ  ÚorderrÌ   rÌ   rÍ   Úparse_order_spec9  s    zExprParser.parse_order_specc             C   sH   g }d}x:| j t| jƒk rB|s*| jtjƒ d}|j| jƒ jƒ ƒ q
W |S )NTF)	rE  rP  rC  rz  r   rŠ   rr  r|  r  )r	  Z	expr_listrÀ  rÌ   rÌ   rÍ   Úparse_expr_listL  s    zExprParser.parse_expr_list)T)F)F)F)F)Hro   rp   rq   rr   r  r$  r
  r  rI  r  rR  r  rW  rb  rg  rJ  rs  ru  rw  rx  ry  rt  rz  r   r	   r   r   r‚  r   r{  r…  rŠ  r�  r�  rŽ  r”  r•  r–  r—  r˜  r™  r›  r�  rÚ   rž  r   rŸ  Ústaticmethodr¡  r¢  r   r   r§  rª  r¬  r­  r®  r¨  r¯  r²  r³  r´  rµ  r|  r  r¶  r   r·  r½  rÁ  rÄ  rÅ  rÌ   rÌ   rÌ   rÍ   r  ´  sr   o
	"1'=8	r  N)jrr   Útypingr   r   r   r   r   r   r   r	   Zdbdocr   Zhelpersr   r   Zprotobufr   r   rv  r   r   r   r   r   r   r   r«  rž   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   rÊ   r©  rt   ru   rv   rw   rs   r�   r€   rË   rƒ   r|   r‚   r„   r¯   r™   rš   r›   r}   r   r~   r±   r²   r³   r¶   r·   r¸   r¹   rº   r»   r¼   r¾   r½   r¿   r_  r^  r¥  r<  r°  r  r!  r  r  r  r)  r'  r(  r  r&  r5  r"  r$  r%  r6  r#  r8  r  r=  rA  r  rÌ   rÌ   rÌ   rÍ   Ú<module>   s(  ( ^


	
