3
6b2                 @   s  d dl Z d dlZd dlmZ d dlmZmZ d dlmZ d dlm	Z
mZmZ ddlmZ ddlmZmZmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZm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Z.G d0d1 d1eZ/G d2d3 d3ee,Z0G d4d5 d5eZ1G d6d7 d7e1Z2dS )8    N)OrderedDict)tokensparse)Parenthesis)UnionListOptional   )query)SQLIdentifierSQLConstIdentifierSQLComparison)SQLFuncCountFuncAll)WhereOp   )SQLDecodeError)SQLTokenSQLStatementc               @   s6   e Zd Zejed edddZdd Zdd	 Z	d
S )	Converterquery_module.SelectQueryquery_module.BaseQuery)r
   	statementc             C   s   || _ || _d | _| j  d S )N)r
   r   Zend_idr   )selfr
   r    r   Z/var/www/html/sandeepIITI/myenv/lib/python3.6/site-packages/djongo/sql2mongo/converters.py__init__   s    zConverter.__init__c             C   s   t d S )N)NotImplementedError)r   r   r   r   r      s    zConverter.parsec             C   s   t d S )N)r   )r   r   r   r   to_mongo    s    zConverter.to_mongoN)r   r   )
__name__
__module____qualname__abcabstractmethodUr   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 )ColumnSelectConverterc                s$   d| _ d| _g | _t j|| d S )NFr   )Z
select_allZnum_columns
sql_tokenssuperr   )r   r
   r   )	__class__r   r   r   %   s    zColumnSelectConverter.__init__c             C   sT   | j j }|jtjdr,t| j| j | j_n$x"tj	|| jD ]}| j
j| q<W d S )NZDISTINCT)r   nextmatchr   KeywordDistinctConverterr
   Zdistinctr   
tokens2sqlr&   append)r   tokZ	sql_tokenr   r   r   r   .   s
    
zColumnSelectConverter.parsec             C   s   dd | j D }d|iS )Nc             S   s   g | ]
}|j qS r   )column).0selectedr   r   r   
<listcomp>9   s    z2ColumnSelectConverter.to_mongo.<locals>.<listcomp>Z
projection)r&   )r   docr   r   r   r   8   s    zColumnSelectConverter.to_mongo)r   r    r!   r   r   r   __classcell__r   r   )r(   r   r%   $   s   	
r%   c               @   s   e Zd Zdd Zdd ZdS )AggColumnSelectConverterc             C   sp   i }t dd | jD r | j S t| jd trL| jd j || jd j< nx| jD ]}d||j< qTW d|igS )Nc             s   s   | ]}t |tV  qd S )N)
isinstancer   )r1   r/   r   r   r   	<genexpr>B   s    z4AggColumnSelectConverter.to_mongo.<locals>.<genexpr>r   Tz$project)anyr&   _using_group_byr7   r   r   aliasfield)r   projectr2   r   r   r   r   ?   s    z!AggColumnSelectConverter.to_mongoc             C   sb   dd i}ddi}x<| j D ]2}t|tr@|j ||j< d||j< qd||j< qW d|id|ig}|S )N_idFTz$groupz$project)r&   r7   r   r   r;   r<   )r   groupr=   r2   pipeliner   r   r   r:   O   s    

z(AggColumnSelectConverter._using_group_byN)r   r    r!   r   r:   r   r   r   r   r6   =   s   r6   c               @   s   e Zd Zdd ZdS )FromConverterc             C   s&   | j j }tj|| j}|j| j_d S )N)r   r)   r   	token2sqlr
   table
left_table)r   r/   sqlr   r   r   r   k   s    
zFromConverter.parseN)r   r    r!   r   r   r   r   r   rA   i   s   rA   c               @   s.   e Zd ZU dZddZddd Zdd ZdS )WhereConverterNr   c             C   s&   | j j}tt|| j| jjd| _d S )N)r   r
   params)r   current_tokenr   r   r
   rG   op)r   r/   r   r   r   r   u   s
    zWhereConverter.parsec             C   s   d| j j iS )Nfilter)rI   r   )r   r   r   r   r   }   s    zWhereConverter.to_mongo)r   r    r!   	nested_oprI   r   r   r   r   r   r   rF   q   s   
rF   c               @   s   e Zd Zdd ZdS )AggWhereConverterc             C   s   d| j j iS )Nz$match)rI   r   )r   r   r   r   r      s    zAggWhereConverter.to_mongoN)r   r    r!   r   r   r   r   r   rL      s   rL   c                   s2   e Zd Zej fddZdd Zdd Z  ZS )JoinConverterc                s(   d | _ d | _d | _d | _t j|  d S )N)rD   right_tableleft_columnright_columnr'   r   )r   args)r(   r   r   r      s
    zJoinConverter.__init__c             C   s   | j j }tj|| j}|j }| _| j j }|jtj	ds@t
| j j }t|tr\|d }tj|| j}||jkr|j| _|j| _|j| _n|j| _|j| _|j| _d S )NONr	   )r   r)   r   rB   r
   rC   rN   r*   r   r+   r   r7   r   rD   rO   rP   )r   r/   rE   rN   r   r   r   r      s"    





zJoinConverter.parsec             C   sD   | j | jj kr| j}n| j  d| j }d| j|| j| jdi}|S )N.z$lookup)fromZ
localFieldZforeignFieldas)rD   r
   rO   rN   rP   )r   Zlocal_fieldlookupr   r   r   _lookup   s    zJoinConverter._lookup)	r   r    r!   r"   r#   r   r   rW   r5   r   r   )r(   r   rM      s   rM   c                   s$   e Zd Z fddZdd Z  ZS )InnerJoinConverterc                s   t  j|  d S )N)r'   r   )r   rQ   )r(   r   r   r      s    zInnerJoinConverter.__init__c             C   sV   | j | jj kr| j}n| j  d| j }| j }d|d ddii|dd| j ig}|S )NrS   z$matchT)z$nez$existsz$unwind$)rD   r
   rO   rW   rN   )r   Zmatch_fieldrV   r@   r   r   r   r      s    
zInnerJoinConverter.to_mongo)r   r    r!   r   r   r5   r   r   )r(   r   rX      s   rX   c                   s,   e Zd Z fddZdd Zdd Z  ZS )OuterJoinConverterc                s   t  j|  d S )N)r'   r   )r   rQ   )r(   r   r   r      s    zOuterJoinConverter.__init__c             C   s@   | j jj}i }x,|D ]$}t|t r|j|krd ||j< qW |S )N)r
   selected_columnsr&   r7   r   rC   r0   )r   rC   toksfieldsr/   r   r   r   _null_fields   s    

zOuterJoinConverter._null_fieldsc             C   sJ   | j  }| j| j}|dd| j ddid| jdd| j |giiig}|S )Nz$unwindrY   T)pathZpreserveNullAndEmptyArraysz
$addFieldsz$ifNull)rW   r^   rN   )r   rV   Znull_fieldsr@   r   r   r   r      s    zOuterJoinConverter.to_mongo)r   r    r!   r   r^   r   r5   r   r   )r(   r   rZ      s   rZ   c                   s,   e Zd Z fddZdd Zdd Z  ZS )LimitConverterc                s   d | _ t j|  d S )N)limitr'   r   )r   rQ   )r(   r   r   r      s    zLimitConverter.__init__c             C   s   | j j }t|j| _d S )N)r   r)   intvaluera   )r   r/   r   r   r   r     s    
zLimitConverter.parsec             C   s
   d| j iS )Nra   )ra   )r   r   r   r   r     s    zLimitConverter.to_mongo)r   r    r!   r   r   r   r5   r   r   )r(   r   r`      s   r`   c               @   s   e Zd Zdd ZdS )AggLimitConverterc             C   s
   d| j iS )Nz$limit)ra   )r   r   r   r   r     s    zAggLimitConverter.to_mongoN)r   r    r!   r   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 )OrderConverterc                s   g | _ t j|  d S )N)columnsr'   r   )r   rQ   )r(   r   r   r     s    zOrderConverter.__init__c             C   s@   | j j }|jtjdst| j j }| jjtj	|| j
 d S )NBY)r   r)   r*   r   r+   r   rf   extendr   r-   r
   )r   r/   r   r   r   r     s
    

zOrderConverter.parsec             C   s   dd | j D }d|iS )Nc             S   s   g | ]}|j |jfqS r   )r0   order)r1   r/   r   r   r   r3     s    z+OrderConverter.to_mongo.<locals>.<listcomp>sort)rf   )r   rj   r   r   r   r     s    zOrderConverter.to_mongo)r   r    r!   r   r   r   r5   r   r   )r(   r   re     s   re   c                   s,   e Zd Z fddZdd Zdd Z  ZS )SetConverterc                s   g | _ t j|  d S )N)r&   r'   r   )r   rQ   )r(   r   r   r   $  s    zSetConverter.__init__c             C   s$   | j j }| jjtj|| j d S )N)r   r)   r&   rh   r   r-   r
   )r   r/   r   r   r   r   (  s    
zSetConverter.parsec                s   dd fdd j D iiS )Nupdatez$setc                s,   i | ]$}|j d k	r  jj|j  nd |jqS )N)Zrhs_indexesr
   rG   rO   )r1   rE   )r   r   r   
<dictcomp>/  s   z)SetConverter.to_mongo.<locals>.<dictcomp>)r&   )r   r   )r   r   r   ,  s    zSetConverter.to_mongo)r   r    r!   r   r   r   r5   r   r   )r(   r   rk   "  s   rk   c               @   s   e Zd Zdd ZdS )AggOrderConverterc             C   s*   t  }x| jD ]}|j||j< qW d|iS )Nz$sort)r   rf   ri   r<   )r   rj   r/   r   r   r   r   9  s    zAggOrderConverter.to_mongoN)r   r    r!   r   r   r   r   r   rn   7  s   rn   c               @   s.   e Zd ZU eeeef  ed dd Z	dS )
_Tokens2Idquery_module.SelectQueryquery_module.BaseQueryc             C   s   i }xx| j D ]n}|j|jkr0d|j ||j< qyd|j ||j |j< W q tk
rx   |jd|j i||j< Y qX qW |S )NrY   )r&   r0   r<   rC   KeyError)r   r>   Zidenr   r   r   to_idH  s    "
z_Tokens2Id.to_idN)rp   rq   )
r   r    r!   r   r$   r   r   r&   r
   rs   r   r   r   r   ro   A  s
   
ro   c                   s$   e Zd Z fddZdd Z  ZS )r,   c                s   t  j|  d S )N)r'   r   )r   rQ   )r(   r   r   r   _  s    zDistinctConverter.__init__c             C   s    | j  }dd|iidddiigS )Nz$groupr>   z$replaceRootZnewRootz$_id)rs   )r   r>   r   r   r   r   b  s
    zDistinctConverter.to_mongo)r   r    r!   r   r   r5   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 )NestedInQueryConverterc                s   || _ d | _t j|  d S )N)_token	_in_queryr'   r   )r   tokenrQ   )r(   r   r   r   u  s    zNestedInQueryConverter.__init__c             C   s@   ddl m} || j j| j jt| jjdd d | j j| _d S )Nr	   )SelectQueryr   )	r
   rx   dbZconnection_propertiessqlparseru   rc   rG   rv   )r   rx   r   r   r   r   z  s    zNestedInQueryConverter.parsec          	   C   sF   d| j j| j j ddidddddd| j jjd	 j d
iiig}|S )Nz$lookupZ
_nested_in)rT   r@   rU   z
$addFieldsz$mapz$_nested_inZlookup_resultz$$lookup_result.r   )inputrU   in)rv   rD   Z_make_pipeliner[   r&   r0   )r   r@   r   r   r   r     s     zNestedInQueryConverter.to_mongo)r   r    r!   r   r   r   r5   r   r   )r(   r   rt   s  s   
rt   c                   sJ   e Zd ZU dZddZded ed fddZdd	 Zd
d Z	  Z
S )HavingConverterNr   query_module.SelectQueryquery_module.BaseQuery)r
   r   c                s   t  j|| d S )N)r'   r   )r   r
   r   )r(   r   r   r     s    zHavingConverter.__init__c             C   s4   | j d d }t|| j| jjd| _| j jd d S )N   )r   r
   rG   r   )r   r   r
   rG   rI   skip)r   r/   r   r   r   r     s    zHavingConverter.parsec             C   s   d| j j iS )Nz$match)rI   r   )r   r   r   r   r     s    zHavingConverter.to_mongo)r   r   )r   r    r!   rK   rI   r$   r   r   r   r   r5   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 )GroupbyConverterc                s   g | _ t j|  d S )N)r&   r'   r   )r   rQ   )r(   r   r   r     s    zGroupbyConverter.__init__c             C   s@   | j j }|jtjdst| j j }| jjtj	|| j
 d S )Nrg   )r   r)   r*   r   r+   r   r&   rh   r   r-   r
   )r   r/   r   r   r   r     s
    

zGroupbyConverter.parsec             C   sv   | j  }d|i}ddi}xH| jjjD ]:}t|trFd|j ||j< q$d||j< |j ||j< q$W d|id|ig}|S )Nr>   Fz$_id.Tz$groupz$project)	rs   r
   r[   r&   r7   r   r<   r;   r   )r   r>   r?   r=   r2   r@   r   r   r   r     s    


zGroupbyConverter.to_mongo)r   r    r!   r   r   r   r5   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 )OffsetConverterc                s   d | _ t j|  d S )N)offsetr'   r   )r   rQ   )r(   r   r   r     s    zOffsetConverter.__init__c             C   s   | j j }t|j| _d S )N)r   r)   rb   rc   r   )r   r/   r   r   r   r     s    
zOffsetConverter.parsec             C   s
   d| j iS )Nr   )r   )r   r   r   r   r     s    zOffsetConverter.to_mongo)r   r    r!   r   r   r   r5   r   r   )r(   r   r     s   r   c               @   s   e Zd Zdd ZdS )AggOffsetConverterc             C   s
   d| j iS )Nz$skip)r   )r   r   r   r   r     s    zAggOffsetConverter.to_mongoN)r   r    r!   r   r   r   r   r   r     s   r   )3r"   typingcollectionsr   r{   r   r   Zsqlparse.sqlr   r   r$   r   r   O r
   Zquery_moduler&   r   r   r   Z	functionsr   r   	operatorsr   
exceptionsr   r   r   r   r%   r6   rA   rF   rL   rM   rX   rZ   r`   rd   re   rk   rn   ro   r,   rt   r~   r   r   r   r   r   r   r   <module>   s@   ,3%
))