3
6b6              
   @   s  d dl Z d dlZd dlmZ d dlmZ d dl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 ed
ddZG dd d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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$G d+d, d,ee$Z%G d-d. d.ee$Z&G d/d0 d0eZ'd1d2d3d4d5d6Z(d7d8d9d:d;d<ddd d=	Z)dS )>    N)chain)tokens)TokenParenthesis
ComparisonIdentifierList
IdentifierFunction   )SQLDecodeError   )SQLTokenSQLStatement)query)valuec             C   sH   t jd| t jd}|r&t|jd}nt jd| t jd}|s@td }|S )Nz%\(([0-9]+)\)s)flagsr   ZNULL)rematch
IGNORECASEintgroupr   )r   r   index r   Y/var/www/html/sandeepIITI/myenv/lib/python3.6/site-packages/djongo/sql2mongo/operators.pyre_index   s    r   c                   s8   e Zd Zdeded fddZdd Zd	d
 Z  ZS )_OpNgenericzquery.SelectQuery)	statementr   paramsc                s\   t  j  d | _d | _|d k	r&|| _n|j| _|| _|j| _|| _d| _|| _	t
| | _d S )NF)super__init__lhsrhsr   r   Z
left_tabler   
is_negated_nameOPERATOR_PRECEDENCE
precedence)selfr   r   r   name)	__class__r   r   r       s    
z_Op.__init__c             C   s   t d S )N)NotImplementedError)r'   r   r   r   negate1   s    z
_Op.negatec             C   s   t d S )N)r*   )r'   r   r   r   to_mongo4   s    z_Op.to_mongo)Nr   )	__name__
__module____qualname__r   tupler    r+   r,   __classcell__r   r   )r)   r   r      s    r   c                   s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	_UnaryOpc                s   t  j|| d | _d S )N)r   r    _op)r'   argskwargs)r)   r   r   r    :   s    z_UnaryOp.__init__c             C   s   t d S )N)r*   )r'   r   r   r   r+   >   s    z_UnaryOp.negatec             C   s   | j j  d S )N)r"   evaluate)r'   r   r   r   r6   A   s    z_UnaryOp.evaluatec             C   s
   | j j S )N)r"   r,   )r'   r   r   r   r,   D   s    z_UnaryOp.to_mongo)r-   r.   r/   r    r+   r6   r,   r1   r   r   )r)   r   r2   8   s   r2   c                   s4   e Zd Z fddZdd Zdd Zdd Z  ZS )		_BinaryOpc                s,   t  j|| tj| jj| j}|j| _d S )N)	r   r    r   	token2sqlr   
prev_tokenr   field_field)r'   r4   r5   
identifier)r)   r   r   r    J   s    z_BinaryOp.__init__c             C   s   t dd S )Nz Negating IN/NOT IN not supported)r   )r'   r   r   r   r+   O   s    z_BinaryOp.negatec             C   s   t d S )N)r*   )r'   r   r   r   r,   R   s    z_BinaryOp.to_mongoc             C   s   d S )Nr   )r'   r   r   r   r6   U   s    z_BinaryOp.evaluate)r-   r.   r/   r    r+   r,   r6   r1   r   r   )r)   r   r7   H   s   r7   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )

_InNotInOpc             C   s|   g | _ |d jtjkr8ddlm} ||| jd| j_d S x>tj	|| jD ],}|d k	rh| j j
| j|  qH| j j
d  qHW d S )Nr   )NestedInQueryConverterr   )_inttyper   DML
convertersr>   r   nested_queryr   r8   appendr   )r'   tokenr>   r   r   r   r   _fill_inZ   s    z_InNotInOp._fill_inc             C   s   t dd S )Nz Negating IN/NOT IN not supported)r   )r'   r   r   r   r+   j   s    z_InNotInOp.negatec             C   s   t d S )N)r*   )r'   r   r   r   r,   m   s    z_InNotInOp.to_mongoc             C   s6   | j jd k	r"d|d| j dgiiS | j|| jiiS d S )Nz$expr$z$_nested_in)r   rC   r;   r?   )r'   opr   r   r   	_to_mongop   s    z_InNotInOp._to_mongoN)r-   r.   r/   rF   r+   r,   rI   r   r   r   r   r=   X   s   r=   c                   s,   e Zd Z fddZdd Zdd Z  ZS )NotInOpc                sF   t  j|ddi| | jj }|jtjds2t| j| jj  d S )Nr(   zNOT ININ)	r   r    r   nextr   r   Keywordr   rF   )r'   r4   r5   tok)r)   r   r   r    ~   s
    
zNotInOp.__init__c             C   s   | j s
dnd}| j|S )Nz$ninz$in)r#   rI   )r'   rH   r   r   r   r,      s    zNotInOp.to_mongoc             C   s
   d| _ d S )NT)r#   )r'   r   r   r   r+      s    zNotInOp.negate)r-   r.   r/   r    r,   r+   r1   r   r   )r)   r   rJ   |   s   rJ   c                   s,   e Zd Z fddZdd Zdd Z  ZS )InOpc                s*   t  j|ddi| | j| jj  d S )Nr(   rK   )r   r    rF   r   rL   )r'   r4   r5   )r)   r   r   r       s    zInOp.__init__c             C   s   | j s
dnd}| j|S )Nz$inz$nin)r#   rI   )r'   rH   r   r   r   r,      s    zInOp.to_mongoc             C   s
   d| _ d S )NT)r#   )r'   r   r   r   r+      s    zInOp.negate)r-   r.   r/   r    r,   r+   r1   r   r   )r)   r   rO      s   rO   c                   s,   e Zd Z fddZdd Zdd Z  ZS )LikeOpc                s0   t  j|ddi| d | _| j| jj  d S )Nr(   LIKE)r   r    _regex_make_regexr   rL   )r'   r4   r5   )r)   r   r   r       s    zLikeOp.__init__c             C   sp   t j|}| j| }t|trDtt|j \}}|  jd| 7  _t|t	sRt
|jdd}d| d | _d S )N.%z.*^rG   )r   placeholder_indexr   
isinstancedictrL   iteritemsr;   strr   replacerR   )r'   rE   r   Zto_matchZ	field_extr   r   r   rS      s    



zLikeOp._make_regexc             C   s   | j d| jiiS )Nz$regex)r;   rR   )r'   r   r   r   r,      s    zLikeOp.to_mongo)r-   r.   r/   r    rS   r,   r1   r   r   )r)   r   rP      s   rP   c               @   s   e Zd Zdd ZdS )iLikeOpc             C   s   | j | jddiS )NZim)z$regexz$options)r;   rR   )r'   r   r   r   r,      s    ziLikeOp.to_mongoN)r-   r.   r/   r,   r   r   r   r   r^      s   r^   c                   s,   e Zd Z fddZdd Zdd Z  ZS )IsOpc                sX   t  j|ddi| | j}|j }|jtjdr:d| _n|jtjdrPd| _ntd S )Nr(   ISNullTzNot nullF)	r   r    r   rL   r   r   rM   _is_nullr   )r'   r4   r5   rE   key)r)   r   r   r       s    zIsOp.__init__c             C   s
   d| _ d S )NT)r#   )r'   r   r   r   r+      s    zIsOp.negatec             C   s*   | j r| j n| j}| j|r d ndd iiS )Nz$ne)r#   rb   r;   )r'   Zis_nullr   r   r   r,      s    zIsOp.to_mongo)r-   r.   r/   r    r+   r,   r1   r   r   )r)   r   r_      s   r_   c                   s,   e Zd Z fddZdd Zdd Z  ZS )	BetweenOpc                sv   t  j|ddi| | j}|j }tj|}| j| | _|j }|jt	j
dsTt|j }tj|}| j| | _d S )Nr(   BETWEENAND)r   r    r   rL   r   rW   r   _lowerr   r   rM   r   _upper)r'   r4   r5   rE   lowerZ_andupper)r)   r   r   r       s    

zBetweenOp.__init__c             C   s
   d| _ d S )NT)r#   )r'   r   r   r   r+      s    zBetweenOp.negatec             C   s6   | j s| j| j| jdiS | jd| j| jdiiS d S )N)z$gtez$ltez$not)r#   r;   rg   rh   )r'   r   r   r   r,      s    zBetweenOp.to_mongo)r-   r.   r/   r    r+   r,   r1   r   r   )r)   r   rd      s   rd   c                   s,   e Zd Z fddZdd Zdd Z  ZS )NotOpc                s   t  j|ddi| d S )Nr(   NOT)r   r    )r'   r4   r5   )r)   r   r   r       s    zNotOp.__init__c             C   s   t d S )N)r   )r'   r   r   r   r+      s    zNotOp.negatec             C   s8   | j j  t| j tr | j j  | jd k	r4| j | j_ d S )N)r"   r+   rX   ParenthesisOpr6   r!   )r'   r   r   r   r6     s
    


zNotOp.evaluate)r-   r.   r/   r    r+   r6   r1   r   r   )r)   r   rk      s   rk   c                   s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )_AndOrOpc                s   t  j|| g | _d S )N)r   r    _acc)r'   r4   r5   )r)   r   r   r      s    z_AndOrOp.__init__c             C   s
   d| _ d S )NT)r#   )r'   r   r   r   r+     s    z_AndOrOp.negatec             C   s   t d S )N)r*   )r'   r   r   r   op_type  s    z_AndOrOp.op_typec             C   sV  | j o
| jstt| j trR| j | j j kr@| j j| j | _q| jjd| j  nFt| j trx| j j	  | jj
| j  n t| j tr| jj
| j  ntt| jtr| j | jj kr| jj| jj n| jj
| j nJt| jtr | jj	  | jj
| j n"t| jtr| jj
| j nt| j j d k	r:| | j j _| jjd k	rR| | jj_ d S )Nr   )r!   r"   r   rX   rn   rp   ro   insertrm   r6   rD   r   extend)r'   r   r   r   r6     s4    


z_AndOrOp.evaluatec             C   s.   | j  tkrd}nd}dd | jD }||iS )Nz$andz$orc             S   s   g | ]}|j  qS r   )r,   ).0Zitmr   r   r   
<listcomp>D  s    z%_AndOrOp.to_mongo.<locals>.<listcomp>)rp   AndOpro   )r'   operZdocsr   r   r   r,   >  s
    z_AndOrOp.to_mongo)	r-   r.   r/   r    r+   rp   r6   r,   r1   r   r   )r)   r   rn   	  s
   )rn   c                   s$   e Zd Z fddZdd Z  ZS )ru   c                s   t  j|ddi| d S )Nr(   rf   )r   r    )r'   r4   r5   )r)   r   r   r    J  s    zAndOp.__init__c             C   s   | j s
tS tS d S )N)r#   ru   OrOp)r'   r   r   r   rp   M  s    zAndOp.op_type)r-   r.   r/   r    rp   r1   r   r   )r)   r   ru   H  s   ru   c                   s$   e Zd Z fddZdd Z  ZS )rw   c                s   t  j|ddi| d S )Nr(   OR)r   r    )r'   r4   r5   )r)   r   r   r    V  s    zOrOp.__init__c             C   s   | j s
tS tS d S )N)r#   rw   ru   )r'   r   r   r   rp   Y  s    zOrOp.op_type)r-   r.   r/   r    rp   r1   r   r   )r)   r   rw   T  s   rw   c                   sL   e Zd Z fddZeeddddZdd Zed	d
dZ	dd Z
  ZS )_StatementParserc                s$   t  j|| g | _g | _d | _d S )N)r   r    _ops_cmp_opsr3   )r'   r4   r5   )r)   r   r   r    b  s    z_StatementParser.__init__r   )rN   r   returnc             C   s  d }|| j d}|jtjdr,tf |}n|jtjdrHtf |}n|jtjdrdtf |}nh|jtjdr|jjtjdrtf |}|j	d n
t
f |}n&|jtjdrtf |}n
|jtjdrtf |}n|jtjd	rtf |}|j	d
 n|jtjdrtf |}nt|tr8t|| j }nt|tr|d jtjjddds|d jtjdst|d ts|d jtjkrntt|| j }n$|jtjdrnt|trnt|S )N)r   r   rf   rx   rK   rl   r   rQ   ZiLIKEre      r`   z.*T)regexra   )()r   r   )r   r   r   rM   ru   rw   rO   Z
next_tokenrJ   skiprk   rP   r^   rd   r_   rX   r   CmpOpr   NameZPlaceholderr   r@   rA   rm   r   ZPunctuationr   r   )r'   rN   r   rH   kwr   r   r   	_token2oph  sJ    

z_StatementParser._token2opc                s    fdd}| j }d d  xV|D ]N}| j||  s8q"|  t trT| jj  t ttfsl| j   q"W jd krtttfr| j	j d S )Nc                  s   d k	r _  _d S )N)r"   r!   r   )rH   prev_opr   r   link_op  s    z0_StatementParser._statement2ops.<locals>.link_op)
r   r   rX   r   r{   rD   rm   _op_precedencer!   rz   )r'   r   r   rN   r   )rH   r   r   _statement2ops  s"    



z_StatementParser._statement2ops)operatorc             C   sZ   | j }|s|j| d S x<tt|D ]"}|j|| jkr&|j|| P q&W |j| d S )N)rz   rD   rangelenr&   rq   )r'   r   opsir   r   r   r     s    
z_StatementParser._op_precedencec             C   sF   | j d k	rd S | jstd }x| jr:| jjd}|j  qW || _ d S )Nr   )r3   rz   r   popr6   )r'   rH   r   r   r   r6     s    
z_StatementParser.evaluate)r-   r.   r/   r    r   r   r   r   r   r   r6   r1   r   r   )r)   r   ry   `  s   7ry   c                   s,   e Zd Z fddZdd Zdd Z  ZS )WhereOpc                s.   t  j|| | jjd | j  | j  d S )Nr
   )r   r    r   r   r   r6   )r'   r4   r5   )r)   r   r   r      s    zWhereOp.__init__c             C   s   t d S )N)r*   )r'   r   r   r   r+     s    zWhereOp.negatec             C   s
   | j j S )N)r3   r,   )r'   r   r   r   r,     s    zWhereOp.to_mongo)r-   r.   r/   r    r+   r,   r1   r   r   )r)   r   r     s   r   c                   s,   e Zd Zdd Z fddZdd Z  ZS )rm   c             C   s
   | j j S )N)r3   r,   )r'   r   r   r   r,     s    zParenthesisOp.to_mongoc                s   t  j|| | j  d S )N)r   r    r   )r'   r4   r5   )r)   r   r   r      s    zParenthesisOp.__init__c             C   s$   xt | j| jD ]}|j  qW d S )N)r   rz   r{   r+   )r'   rH   r   r   r   r+     s    zParenthesisOp.negate)r-   r.   r/   r,   r    r+   r1   r   r   )r)   r   rm     s   rm   c                   s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	r   c                s   t  j|| tj| jj| j| _t| jj	t
r8tdt| jjdd j | _t| jj	j}|d k	rp| j| nd | _t| jtrtt| jj \| _| _nd | _d S )NzJoin using WHERE not supportedr   r   )r   r    r   r8   r   leftr   _identifierrX   rightr   r   OPERATOR_MAPZ
token_nextr   	_operatorr   r   	_constantrY   rL   rZ   r[   
_field_ext)r'   r4   r5   r   )r)   r   r   r      s    zCmpOp.__init__c             C   s
   d| _ d S )NT)r#   )r'   r   r   r   r+     s    zCmpOp.negatec             C   s   d S )Nr   )r'   r   r   r   r6   	  s    zCmpOp.evaluatec             C   sJ   | j j}| jr|d| j 7 }| js2|| j| jiiS |d| j| jiiiS d S )NrT   z$not)r   r:   r   r#   r   r   )r'   r:   r   r   r   r,     s    zCmpOp.to_mongo)r-   r.   r/   r    r+   r6   r,   r1   r   r   )r)   r   r     s   r   z$eqz$gtz$ltz$gtez$lte)=><z>=z<=               r}   )	r`   re   rQ   rK   zNOT INrl   rf   rx   r   )*r   typing	itertoolsr   Zsqlparser   Zsqlparse.sqlr   r   r   r   r   r	   
exceptionsr   Z
sql_tokensr   r    r   r\   r   r   r2   r7   r=   rJ   rO   rP   r^   r_   rd   rk   rn   ru   rw   ry   r   rm   r   r   r%   r   r   r   r   <module>   sP    $(?u$