
    h;              
       R   d dl Z 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 d
efdZ G d d      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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% G d* d+ee%      Z& G d, d-ee%      Z' G d. d/e      Z( G d0 d1e(      Z)d2d3d4d5d6d7Z*d8d9d:d;d<d=ddd d>	Z+y)?    N)chain)tokens)TokenParenthesis
ComparisonIdentifierList
IdentifierFunction   SQLDecodeError   )SQLTokenSQLStatement)queryvaluec                     t        j                  d| t         j                        }|rt        |j	                  d            }|S t        j                  d| t         j                        }|st
        d }|S )Nz%\(([0-9]+)\)s)flagsr   NULL)rematch
IGNORECASEintgroupr   )r   r   indexs      ]/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/djongo/sql2mongo/operators.pyre_indexr      s`    HH&R]]CEEKKN# L	 %r}}=  L    c                   >     e Zd Z	 	 ddedddef fdZd Zd Z xZS )	_Op	statementr   zquery.SelectQueryparamsc                     t         |           d | _        d | _        ||| _        n|j                  | _        || _        |j                  | _        || _        d| _        || _	        t        |   | _        y )NF)super__init__lhsrhsr"   r   
left_tabler!   
is_negated_nameOPERATOR_PRECEDENCE
precedence)selfr!   r   r"   name	__class__s        r   r%   z_Op.__init__   sk     	)-)- DK,,DK
**"
-d3r   c                     t         NNotImplementedErrorr-   s    r   negatez
_Op.negate2       !!r   c                     t         r1   r2   r4   s    r   to_mongoz_Op.to_mongo5   r6   r   )Ngeneric)	__name__
__module____qualname__r   tupler%   r5   r8   __classcell__r/   s   @r   r    r       s6     !4#4 '4 	4,""r   r    c                   0     e Zd Z fdZd Zd Zd Z xZS )_UnaryOpc                 2    t        |   |i | d | _        y r1   )r$   r%   _opr-   argskwargsr/   s      r   r%   z_UnaryOp.__init__;   s    $)&)r   c                     t         r1   r2   r4   s    r   r5   z_UnaryOp.negate?   r6   r   c                 8    | j                   j                          y r1   )r'   evaluater4   s    r   rI   z_UnaryOp.evaluateB   s    r   c                 6    | j                   j                         S r1   )r'   r8   r4   s    r   r8   z_UnaryOp.to_mongoE       xx  ""r   r:   r;   r<   r%   r5   rI   r8   r>   r?   s   @r   rA   rA   9   s    "#r   rA   c                   0     e Zd Z fdZd Zd Zd Z xZS )	_BinaryOpc                     t        |   |i | t        j                  | j                  j
                  | j                        }|j                  | _        y r1   )	r$   r%   r   	token2sqlr!   
prev_tokenr   field_field)r-   rE   rF   
identifierr/   s       r   r%   z_BinaryOp.__init__K   sB    $)&)''(A(A4::N
 &&r   c                     t        d      Nz Negating IN/NOT IN not supportedr   r4   s    r   r5   z_BinaryOp.negateP       ?@@r   c                     t         r1   r2   r4   s    r   r8   z_BinaryOp.to_mongoS   r6   r   c                      y r1    r4   s    r   rI   z_BinaryOp.evaluateV       r   )r:   r;   r<   r%   r5   r8   rI   r>   r?   s   @r   rN   rN   I   s    '
A"r   rN   c                   $    e Zd Zd Zd Zd Zd Zy)
_InNotInOpc                 |   g | _         |d   j                  t        j                  k(  r*ddlm}  ||| j                  d      | j                  _        y t        j                  || j                        D ]H  }|)| j                   j                  | j                  |          .| j                   j                  d        J y )Nr   )NestedInQueryConverterr   )_inttyper   DML
convertersr_   r   nested_queryr   rP   appendr"   )r-   tokenr_   r   s       r   _fill_inz_InNotInOp._fill_in[   s     8>>VZZ':&<UDJJPQ&RDJJ#''tzz: 	&E E 23%		&r   c                     t        d      rV   r   r4   s    r   r5   z_InNotInOp.negatek   rW   r   c                     t         r1   r2   r4   s    r   r8   z_InNotInOp.to_mongon   r6   r   c                     | j                   j                  d|d| j                  z   dgiiS | j                  || j                  iiS )N$expr$z$_nested_in)r   rd   rS   r`   r-   ops     r   	_to_mongoz_InNotInOp._to_mongoq   sP    ::"".t{{*M:  KK"dhh00r   N)r:   r;   r<   rg   r5   r8   ro   rZ   r   r   r]   r]   Y   s    & A"	1r   r]   c                   *     e Zd Z fdZd Zd Z xZS )NotInOpc                     t        |   |ddi| | j                  j                         }|j	                  t
        j                  d      st        | j                  | j                  j                                y )Nr.   NOT ININ)	r$   r%   r!   nextr   r   Keywordr   rg   )r-   rE   rF   tokr/   s       r   r%   zNotInOp.__init__   s]    8h88nn!!#yy.  dnn))+,r   c                 D    | j                   sdnd}| j                  |      S )N$nin$inr)   ro   rm   s     r   r8   zNotInOp.to_mongo   s    ??V~~b!!r   c                     d| _         y NTr)   r4   s    r   r5   zNotInOp.negate   	    r   r:   r;   r<   r%   r8   r5   r>   r?   s   @r   rq   rq   }   s    -"r   rq   c                   *     e Zd Z fdZd Zd Z xZS )InOpc                 z    t        |   |ddi| | j                  | j                  j	                                y )Nr.   rt   )r$   r%   rg   r!   ru   rD   s      r   r%   zInOp.__init__   s3    T4d4V4dnn))+,r   c                 D    | j                   sdnd}| j                  |      S )Nrz   ry   r{   rm   s     r   r8   zInOp.to_mongo   s    //Uv~~b!!r   c                     d| _         y r}   r~   r4   s    r   r5   zInOp.negate   r   r   r   r?   s   @r   r   r      s    -"r   r   c                   0     e Zd Z fdZd Zd Zd Z xZS )LikeOpc                     t        |   |ddi| d | _        | j                  | j                  j                                y )Nr.   LIKE)r$   r%   _regex_make_regexr!   ru   rD   s      r   r%   zLikeOp.__init__   s<    t6f6v6,,./r   c                     	 |}d}|D ],  }|dk(  r|j                  dd      }|j                  |d      }. t        j                  |      }t        |t              r|S |S # t
        $ r}|cY d }~S d }~ww xY w)Nz\%''" )replacejsonloads
isinstancedict	Exception)r-   to_match
check_dictreplace_charsces         r   check_embeddedzLikeOp.check_embedded   s    	!J"M" ;8!+!3!3C!=J!+!3!3Ar!:J	;
 J/J*d+!! 	O	s$   AA  A   	A5)A0*A50A5c                    t        j                  |      }| j                  |   }| j                  |      }t	        |t
              r |j                  dd      }d|z   dz   | _        y t	        |t              rEt        t        |j                                     \  }}| xj                  d|z   z  c_        || _        y t        )N%.*^rl   .)r   placeholder_indexr"   r   r   strr   r   r   ru   iteritemsrS   r   )r-   rf   r   r   	field_exts        r   r   zLikeOp._make_regex   s    **51;;u%&&x0h$''T2H.3.DK$'"&tHNN,<'=">IxKK3?*K"DK  r   c                 6    | j                   d| j                  iiS )N$regexrS   r   r4   s    r   r8   zLikeOp.to_mongo   s    h455r   )r:   r;   r<   r%   r   r   r8   r>   r?   s   @r   r   r      s    0
"!6r   r   c                       e Zd Zd Zy)iLikeOpc                 8    | j                   | j                  ddiS )Nim)r   z$optionsr   r4   s    r   r8   ziLikeOp.to_mongo   s"    kk
  	r   Nr:   r;   r<   r8   rZ   r   r   r   r      s    r   r   c                   *     e Zd Z fdZd Zd Z xZS )IsOpc                 
   t        |   |ddi| | j                  }|j                         }|j	                  t
        j                  d      rd| _        y |j	                  t
        j                  d      rd| _        y t        )Nr.   ISNullTzNot nullF)	r$   r%   r!   ru   r   r   rv   _is_nullr   )r-   rE   rF   rf   keyr/   s        r   r%   zIsOp.__init__   sf    T4d4V4jjl99V^^V, DMYYv~~z2!DM  r   c                     d| _         y r}   r~   r4   s    r   r5   zIsOp.negate   r   r   c                 v    | j                   r| j                   n| j                  }| j                  |rd iS dd iiS )Nz$ne)r)   r   rS   )r-   is_nulls     r   r8   zIsOp.to_mongo   s@    '+dmm#DMMKK
 	
/4dm
 	
r   r:   r;   r<   r%   r5   r8   r>   r?   s   @r   r   r      s    	!
r   r   c                   *     e Zd Z fdZd Zd Z xZS )	BetweenOpc                    t        |   |ddi| | j                  }|j                         }t	        j
                  |      }| j                  |   | _        |j                         }|j                  t        j                  d      st        |j                         }t	        j
                  |      }| j                  |   | _        y )Nr.   BETWEENAND)r$   r%   r!   ru   r   r   r"   _lowerr   r   rv   r   _upper)r-   rE   rF   rf   lower_andupperr/   s          r   r%   zBetweenOp.__init__   s    $9i9&9

**51kk%(zz|zz&..%0  

**51kk%(r   c                     d| _         y r}   r~   r4   s    r   r5   zBetweenOp.negate   r   r   c                     | j                   s%| j                  | j                  | j                  diS | j                  d| j                  | j                  diiS )N)$gte$lte$not)r)   rS   r   r   r4   s    r   r8   zBetweenOp.to_mongo   s[     KK KK   $ $ r   r   r?   s   @r   r   r      s    ) r   r   c                   *     e Zd Z fdZd Zd Z xZS )NotOpc                 (    t        |   |ddi| y )Nr.   NOTr$   r%   rD   s      r   r%   zNotOp.__init__      d5e5f5r   c                     t         r1   r   r4   s    r   r5   zNotOp.negate  s    r   c                     | j                   j                          t        | j                   t              r| j                   j	                          | j
                  | j                   | j
                  _         y y r1   )r'   r5   r   ParenthesisOprI   r&   r4   s    r   rI   zNotOp.evaluate  sL    dhh.HH8888DHHL  r   )r:   r;   r<   r%   r5   rI   r>   r?   s   @r   r   r     s    6$r   r   c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )_AndOrOpc                 2    t        |   |i | g | _        y r1   )r$   r%   _accrD   s      r   r%   z_AndOrOp.__init__  s    $)&)	r   c                     d| _         y r}   r~   r4   s    r   r5   z_AndOrOp.negate#  r   r   c                     t         r1   r2   r4   s    r   op_typez_AndOrOp.op_type&  r6   r   c                    | j                   r| j                  st        t        | j                   t              r{| j                         | j                   j                         k(  r)| j                   j                  | j                  z   | _        n| j                  j                  d| j                          nt        | j                   t              r@| j                   j                          | j                  j                  | j                          nFt        | j                   t              r&| j                  j                  | j                          nt        t        | j                  t              r| j                         | j                  j                         k(  r0| j                  j                  | j                  j                         n| j                  j                  | j                         nt        | j                  t              r@| j                  j                          | j                  j                  | j                         nFt        | j                  t              r&| j                  j                  | j                         nt        | j                   j                   | | j                   j                   _        | j                  j                  | | j                  j                  _         y y Nr   )r&   r'   r   r   r   r   r   insertr   rI   re   r    extendr4   s    r   rI   z_AndOrOp.evaluate)  s   TXX  dhh)||~!1!1!33 HHMMDII5			  DHH--0HHIITXX&#&IITXX& ! dhh)||~!1!1!33		  /		  *-0HHIITXX&#&IITXX& ! 88<<##DHHLL88<<##DHHLL $r   c                     | j                         t        k(  rd}nd}| j                  D cg c]  }|j                          }}||iS c c}w )Nz$andz$or)r   AndOpr   r8   )r-   operitmdocss       r   r8   z_AndOrOp.to_mongoR  sF    <<>U"DD*.))4344d| 5s   A)	r:   r;   r<   r%   r5   r   rI   r8   r>   r?   s   @r   r   r     s    "'$Rr   r   c                   $     e Zd Z fdZd Z xZS )r   c                 (    t        |   |ddi| y )Nr.   r   r   rD   s      r   r%   zAndOp.__init__^  r   r   c                 2    | j                   st        S t        S r1   )r)   r   OrOpr4   s    r   r   zAndOp.op_typea  s    LKr   r:   r;   r<   r%   r   r>   r?   s   @r   r   r   \  s    6r   r   c                   $     e Zd Z fdZd Z xZS )r   c                 (    t        |   |ddi| y )Nr.   ORr   rD   s      r   r%   zOrOp.__init__j  s    T4d4V4r   c                 2    | j                   st        S t        S r1   )r)   r   r   r4   s    r   r   zOrOp.op_typem  s    KLr   r   r?   s   @r   r   r   h  s    5r   r   c                   J     e Zd Z fdZdededdfdZd Zdefd	Z	d
 Z
 xZS )_StatementParserc                 N    t        |   |i | g | _        g | _        d | _        y r1   )r$   r%   _ops_cmp_opsrC   rD   s      r   r%   z_StatementParser.__init__v  s*    $)&)&(	*,r   rw   r!   returnr    c                 J   d }|| j                   d}|j                  t        j                  d      rt	        di |}|S |j                  t        j                  d      rt        di |}|S |j                  t        j                  d      rt        di |}|S |j                  t        j                  d      rU|j                  j                  t        j                  d      rt        di |}|j                  d       |S t        di |}|S |j                  t        j                  d      rt        di |}|S |j                  t        j                  d      rt        di |}|S |j                  t        j                  d	      rt        di |}|j                  d
       |S |j                  t        j                  d      rt        di |}|S t        |t               rMt        |j                  d   t"              rt%        || j                         }|S t'        || j                         }|S t        |t(              r|d   j                  t        j*                  j,                  dd      sV|d   j                  t        j                  d      s3t        |d   t.              s |d   j0                  t        j2                  k(  r	 |S t5        t7        |      | j                         }|S |j                  t        j8                  d      r	 |S t        |t:              r	 |S t<        )N)r!   r   r   r   rt   r   r   r   iLIKEr      r   r   r   T)regexr   ))(rZ   )r   r   r   rv   r   r   r   
next_tokenrq   skipr   r   r   r   r   r   r   r
   FuncOpCmpOpr   NamePlaceholderr   ra   rb   r   r   Punctuationr	   r   )r-   rw   r!   rn   kws        r   	_token2opz_StatementParser._token2op|  s    $tzz:99V^^U+Bh 	e YYv~~t,Bb 	_ YYv~~t,B\ 	Y YYv~~u-##))&..$?]r]q!R 	O [R[N 	K YYv~~v."BH 	E YYv~~w/2BB 	? YYv~~y1RBNN1: 	7 YYv~~t,B4 	1 Z(#**Q-2C,, 	) 3

+( 	% [)AV[[44d$G1v||FNNF;!#a&.91v||vzz1 	 #<#4djjA 	 YYv)):6 	 Z( 	 ! r   c                    fd}| j                   }d d |D ]r  }| j                  ||      s |        t        t              r| j                  j                         t        t        t        f      s| j                         t j                  3t        t        t        f      r| j                  j                         y y y )Nc                  (     _          _        y y r1   )r'   r&   )rn   prev_ops   r   link_opz0_StatementParser._statement2ops.<locals>.link_op  s    "   #r   )
r!   r   r   r   r   re   r   _op_precedencer&   r   )r-   r  r!   rw   rn   r  s       @@r   _statement2opsz_StatementParser._statement2ops  s    	!
 NN	 		CY/BI"e$$$R(b5-"89##B'G		 ;;'E=#9:		  ) ; r   operatorc                     | j                   }|s|j                  |       y t        t        |            D ]2  }|j                  ||   j                  kD  s |j                  ||        y  |j                  |       y r1   )r   re   rangelenr,   r   )r-   r  opsis       r   r  z_StatementParser._op_precedence  sk    iiJJx s3x 	!A""SV%6%66

1h'	!
 JJx r   c                     | j                   y | j                  st        d }| j                  r8| j                  j                  d      }|j	                          | j                  r8|| _         y r   )rC   r   r   poprI   rm   s     r   rI   z_StatementParser.evaluate  sU    88yy  iiq!BKKM ii r   )r:   r;   r<   r%   r   r   r   r  r    r  rI   r>   r?   s   @r   r   r   t  s<    ::):.3:x*2!s !r   r   c                   *     e Zd Z fdZd Zd Z xZS )WhereOpc                     t        |   |i | | j                  j                  d       | j	                          | j                          y )Nr   )r$   r%   r!   r   r  rI   rD   s      r   r%   zWhereOp.__init__  s<    $)&)Ar   c                     t         r1   r2   r4   s    r   r5   zWhereOp.negate  r6   r   c                 6    | j                   j                         S r1   rC   r8   r4   s    r   r8   zWhereOp.to_mongo  rK   r   r   r?   s   @r   r  r    s    "#r   r  c                   *     e Zd Zd Z fdZd Z xZS )r   c                 6    | j                   j                         S r1   r  r4   s    r   r8   zParenthesisOp.to_mongo  rK   r   c                 D    t        |   |i | | j                          y r1   )r$   r%   r  rD   s      r   r%   zParenthesisOp.__init__  s!    $)&)r   c                 n    t        | j                  | j                        D ]  }|j                           y r1   )r   r   r   r5   rm   s     r   r5   zParenthesisOp.negate  s)    		4==1 	BIIK	r   )r:   r;   r<   r8   r%   r5   r>   r?   s   @r   r   r     s    #
r   r   c                   0     e Zd Z fdZd Zd Zd Z xZS )r   c                    t        |   |i | t        j                  | j                  j
                  | j                        | _        t        | j                  j                  t              rt        d      t        | j                  j                  d      d   j                     | _        t!        | j                  j                  j                        }|| j"                  |   nd | _        t        | j$                  t&              r:t)        t+        | j$                  j-                                     \  | _        | _        y d | _        y )NzJoin using WHERE not supportedr   r   )r$   r%   r   rP   r!   leftr   _identifierr   rightr	   r   OPERATOR_MAP
token_nextr   	_operatorr   r"   	_constantr   ru   r   r   
_field_ext)r-   rE   rF   r   r/   s       r   r%   zCmpOp.__init__  s    $)&)#--dnn.A.A4::Ndnn**J7 !ABB%dnn&?&?&B1&E&K&KL--334/4/@U+ddnnd+.248L8L8N3O.P+DOT^"DOr   c                     d| _         y r}   r~   r4   s    r   r5   zCmpOp.negate  r   r   c                      y r1   rZ   r4   s    r   rI   zCmpOp.evaluate   r[   r   c                     | j                   j                  }| j                  r|d| j                  z   z  }| j                  s|| j                  | j
                  iiS |d| j                  | j
                  iiiS )Nr   r   )r  rR   r   r)   r  r  )r-   rR   s     r   r8   zCmpOp.to_mongo#  si      &&??S4??**EDNNDNN;<<FT^^T^^$DEFFr   rL   r?   s   @r   r   r     s    # Gr   r   c                       e Zd Zd Zy)r   c                 *   | j                   j                  }| j                  r|d| j                  z   z  }| j                  j                  d   j                         j                         }|dk(  rd}d| j                  d|z   d|z   i| j                  giiS )Nr   r   day
dayOfMonthrk   rl   )	r  rR   r   r!   r   get_namer   r  r  )r-   rR   funcs      r   r8   zFuncOp.to_mongo0  s      &&??S4??**E~~$$Q'00288:5=D4Zu-NN!
 	
r   Nr   rZ   r   r   r   r   .  s    
r   r   z$eqz$gtz$ltr   r   )=><z>=z<=               r   )	r   r   r   rt   rs   r   r   r   r9   ),r   typingr   	itertoolsr   sqlparser   sqlparse.sqlr   r   r   r   r	   r
   
exceptionsr   
sql_tokensr   r   r   r   r   r   r    rA   rN   r]   rq   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r  r+   rZ   r   r   <module>r8     s\   	     ] ] ' . 	C 	" ">#s #   !1 !1Hj ": (6Y (6Vf 
9 
.%	 %P$H $<s <~	H 		8 	u up#c# # C)  GC  GF
U 
( 
		

 


 r   