o
    vi/                     @  s  d dl mZ d dlZd dlZd dlZd dlZd dlmZmZm	Z	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m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m Z m!Z!m"Z"m#Z#m$Z$m%Z% erej&d	k rrd d
l'm(Z( nd d
lm(Z( d dl)m*Z*m+Z+m,Z, dZ-dZ.edddZ/G dd dZ0G dd de0Z1dddZ2dddZ3G dd de1Z4G dd de4Z5G d d! d!e4Z6G d"d# d#e5Z7G d$d% d%e5Z8G d&d' d'e5Z9G d(d) d)e6Z:G d*d+ d+e6Z;G d,d- d-e1Z<G d.d/ d/e1Z=G d0d1 d1e=Z>G d2d3 d3e1Z?G d4d5 d5e1Z@G d6d7 d7e1ZAG d8d9 d9eAZBG d:d; d;eAZCG d<d= d=e1ZDG d>d? d?eDZEG d@dA dAeDe?ZFG dBdC dCe1ZGG dDdE dEeFZHG dFdG dGeDZIG dHdI dIeIZJG dJdK dKeIZKG dLdM dMeDZLG dNdO dOeDZMG dPdQ dQeDZNG dRdS dSeDZOG dTdU dUeDZPG dVdW dWePZQG dXdY dYePZRG dZd[ d[eDZSG d\d] d]eDZTG d^d_ d_eDZUG d`da daeUZVG dbdc dceMZWG ddde dee1ZXG dfdg dgeDZYG dhdi dieDZZG djdk dkeDZ[G dldm dmZ\G dndo doeDZ]G dpdq dqe]Z^G drds dse^Z_edtdudZ`G dvdw dwe_ZaG dxdy dye_ZbG dzd{ d{e1ZcG d|d} d}e]ZdG d~d de]ZeG dd de]ZfG dd de1ZgG dd de1ZhdS )    )annotationsN)CallableIterableIteratorSequence)datedatetimetime)Enum)TYPE_CHECKINGAnyTypeVaroverload)
ArithmeticBoolean
ComparatorDialectsEqualityJSONOperatorsMatchingOrder)CaseExceptionFunctionExceptionbuilderformat_alias_sqlformat_quotesignore_copyresolve_is_aggregate)      )Self)QueryBuilder
SelectableTablezTimothy Heysztheys@kayak.comNodeTNode)boundc                   @  s$   e Zd ZdZdddZdd	d
ZdS )r%   NreturnIterator[NodeT]c                 c  s    | V  d S N selfr*   r*   K/home/air/biblejyuku/back/venv/lib/python3.10/site-packages/pypika/terms.pynodes_)   s   
zNode.nodes_typetype[NodeT]list[NodeT]c                   s    fdd|   D S )Nc                   s   g | ]	}t | r|qS r*   )
isinstance).0noder/   r*   r-   
<listcomp>-       zNode.find_.<locals>.<listcomp>)r.   )r,   r/   r*   r5   r-   find_,      z
Node.find_r'   r(   )r/   r0   r'   r1   )__name__
__module____qualname__is_aggregater.   r8   r*   r*   r*   r-   r%   &       
c                   @  s  e Zd ZdZddddZedd
dZedddZdddZ	e
	ddddZe
	ddddZddd Zdd$d%Zdd'd(Zdd*d+Zdd-d.Zdd2d3Zdd5d6Zdd7d8Zdd9d:Zdd;d<Zdd=d>Zdd?d@ZddBdCZddDdEZddFdGZddHdIZddJdKZddLdMZddOdPZddQdRZ ddVdWZ!dd[d\Z"dd]d^Z#dd`daZ$ddedfZ%ddgdhZ&ddidjZ'ddkdlZ(ddndoZ)ddpdqZ*ddrdsZ+ddtduZ,ddwdxZ-ddydzZ.dd{d|Z/dd}d~Z0dddZ1dddZ2dddZ3dddZ4dddZ5dddZ6dddZ7dddZ8dddZ9dddZ:dddZ;dddZ<dddZ=dddZ>dddZ?dddZ@dddZAdddZBdddZCdddZDdddZEdS )TermFNalias
str | Noner'   Nonec                 C  
   || _ d S r)   rA   r,   rA   r*   r*   r-   __init__3      
zTerm.__init__strc                 C  rD   r)   rE   rF   r*   r*   r-   as_6      
zTerm.as_
set[Table]c                 C  s   ddl m} t| |S )Nr   r#   )pypikar#   setr8   )r,   r#   r*   r*   r-   tables_:   s   zTerm.tables_
set[Field]c                 C  s   t | tS r)   )rO   r8   Fieldr+   r*   r*   r-   fields_@      zTerm.fields_wrapper_clstype[Term] | None@ValueError | NodeT | LiteralValue | Array | Tuple | ValueWrapperc                 C  sP   t | tr| S | du rt S t | trt|  S t | tr t|  S |p#t}|| S )a,  
        Used for wrapping raw inputs such as numbers in Criterions and Operator.

        For example, the expression F('abc')+1 stores the integer part in a ValueWrapper object.

        :param val:
            Any value.
        :param wrapper_cls:
            A pypika class which wraps a constant value so it can be handled as a component of the query.
        :return:
            Raw string, number, or decimal values will be returned in a ValueWrapper.  Fields and other parts of the
            querybuilder will be returned as inputted.

        N)r2   r%   	NullValuelistArraytupleTupleValueWrapper)valrU   r*   r*   r-   wrap_constantC   s   


zTerm.wrap_constantr^   -Term | QueryBuilder | None | str | int | bool5Term | QueryBuilder | NullValue | ValueWrapper | JSONc                 C  sT   ddl m} t| t|fr| S | d u rt S t| tttfr&|p!t}|| S t	| S )N   )r!   )
queriesr!   r2   r@   rX   rI   intboolr]   JSON)r^   rU   r!   r*   r*   r-   	wrap_jsonc   s   zTerm.wrap_jsoncurrent_tableTable | None	new_tablec                 C     | S )a  
        Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries.
        The base implementation returns self because not all terms have a table property.

        :param current_table:
            The table to be replaced.
        :param new_table:
            The table to replace with.
        :return:
            Self.
        r*   r,   rh   rj   r*   r*   r-   replace_tables   s   zTerm.replace_tableotherr   BasicCriterionc                 C  s   | |kS r)   r*   r,   rn   r*   r*   r-   eq      zTerm.eqNullCriterionc                 C     t | S r)   )rs   r+   r*   r*   r-   isnull   rr   zTerm.isnullNotc                 C  s   |    S r)   )ru   negater+   r*   r*   r-   notnull      zTerm.notnullNotNullCriterionc                 C  rt   r)   )rz   r+   r*   r*   r-   	isnotnull   rr   zTerm.isnotnullvaluerd   BitwiseAndCriterionc                 C     t | | |S r)   )r}   r_   r,   r|   r*   r*   r-   
bitwiseand      zTerm.bitwiseandBitwiseOrCriterionc                 C  r~   r)   )r   r_   r   r*   r*   r-   	bitwiseor   r   zTerm.bitwiseorc                 C  s   | |kS r)   r*   rp   r*   r*   r-   gt   rr   zTerm.gtc                 C  s   | |kS r)   r*   rp   r*   r*   r-   gte   rr   zTerm.gtec                 C  s   | |k S r)   r*   rp   r*   r*   r-   lt   rr   zTerm.ltc                 C  s   | |kS r)   r*   rp   r*   r*   r-   lte   rr   zTerm.ltec                 C  s   | |kS r)   r*   rp   r*   r*   r-   ne   rr   zTerm.neexprc                 C     t tj| | |S r)   )ro   r   globr_   r,   r   r*   r*   r-   r         z	Term.globc                 C  r   r)   )ro   r   liker_   r   r*   r*   r-   r      r   z	Term.likec                 C  r   r)   )ro   r   not_liker_   r   r*   r*   r-   r      r   zTerm.not_likec                 C  r   r)   )ro   r   iliker_   r   r*   r*   r-   r      r   z
Term.ilikec                 C  r   r)   )ro   r   	not_iliker_   r   r*   r*   r-   r      r   zTerm.not_ilikec                 C  r   r)   )ro   r   rliker_   r   r*   r*   r-   r      r   z
Term.rlikepatternc                 C  r   r)   )ro   r   regexr_   r,   r   r*   r*   r-   r      r   z
Term.regexc                 C  r   r)   )ro   r   regexpr_   r   r*   r*   r-   r      r   zTerm.regexplowerupperBetweenCriterionc                 C     t | | || |S r)   )r   r_   r,   r   r   r*   r*   r-   between      zTerm.betweenstartendPeriodCriterionc                 C  r   r)   )r   r_   )r,   r   r   r*   r*   r-   from_to   r   zTerm.from_toc                 C  r   r)   )ro   r   as_ofr_   r   r*   r*   r-   r      r   z
Term.as_ofAllc                 C  rt   r)   )r   r+   r*   r*   r-   all_   rr   z	Term.all_arg%list | tuple | set | frozenset | TermContainsCriterionc                   s8   t |ttttfrt t fdd|D  S t |S )Nc                      g | ]}  |qS r*   r_   r3   r|   r+   r*   r-   r6          zTerm.isin.<locals>.<listcomp>)r2   rY   r[   rO   	frozensetr   r\   r,   r   r*   r+   r-   isin   s   
z	Term.isinc                 C  s   |  | S r)   )r   rw   r   r*   r*   r-   notin   rT   z
Term.notinc                 C  r   r)   )ro   r   	bin_regexr_   r   r*   r*   r-   r      r   zTerm.bin_regexc                 C  rt   r)   rv   r+   r*   r*   r-   rw      rr   zTerm.negateArithmeticExpressionc                 C  s   | |> S r)   r*   rp   r*   r*   r-   lshift   rr   zTerm.lshiftc                 C  s   | |? S r)   r*   rp   r*   r*   r-   rshift   rr   zTerm.rshiftc                 C  rt   r)   r   r+   r*   r*   r-   
__invert__   rr   zTerm.__invert__c                 C  rk   r)   r*   r+   r*   r*   r-   __pos__      zTerm.__pos__Negativec                 C  rt   r)   )r   r+   r*   r*   r-   __neg__   rr   zTerm.__neg__c                 C  r   r)   r   r   addr_   rp   r*   r*   r-   __add__   r   zTerm.__add__c                 C  r   r)   r   r   subr_   rp   r*   r*   r-   __sub__   r   zTerm.__sub__c                 C  r   r)   r   r   mulr_   rp   r*   r*   r-   __mul__   r   zTerm.__mul__c                 C  r   r)   r   r   divr_   rp   r*   r*   r-   __truediv__   r   zTerm.__truediv__Powc                 C  
   t | |S r)   )r   rp   r*   r*   r-   __pow__   rH   zTerm.__pow__Modc                 C  r   r)   )r   rp   r*   r*   r-   __mod__   rH   zTerm.__mod__c                 C     t tj| || S r)   r   rp   r*   r*   r-   __radd__   r   zTerm.__radd__c                 C  r   r)   r   rp   r*   r*   r-   __rsub__   r   zTerm.__rsub__c                 C  r   r)   r   rp   r*   r*   r-   __rmul__   r   zTerm.__rmul__c                 C  r   r)   r   rp   r*   r*   r-   __rtruediv__   r   zTerm.__rtruediv__c                 C  r   r)   r   r   r   r_   rp   r*   r*   r-   
__lshift__  r   zTerm.__lshift__c                 C  r   r)   r   r   r   r_   rp   r*   r*   r-   
__rshift__  r   zTerm.__rshift__c                 C  r   r)   r   rp   r*   r*   r-   __rlshift__  r   zTerm.__rlshift__c                 C  r   r)   r   rp   r*   r*   r-   __rrshift__
  r   zTerm.__rrshift__c                 C  r   r)   )ro   r   rq   r_   rp   r*   r*   r-   __eq__  r   zTerm.__eq__c                 C  r   r)   )ro   r   r   r_   rp   r*   r*   r-   __ne__  r   zTerm.__ne__c                 C  r   r)   )ro   r   r   r_   rp   r*   r*   r-   __gt__  r   zTerm.__gt__c                 C  r   r)   )ro   r   r   r_   rp   r*   r*   r-   __ge__  r   zTerm.__ge__c                 C  r   r)   )ro   r   r   r_   rp   r*   r*   r-   __lt__  r   zTerm.__lt__c                 C  r   r)   )ro   r   r   r_   rp   r*   r*   r-   __le__  r   zTerm.__le__itemslicec                 C  s"   t |ts	td| |j|jS )Nz"Field' object is not subscriptable)r2   r   	TypeErrorr   r   stop)r,   r   r*   r*   r-   __getitem__  s   
zTerm.__getitem__c                 C  s   | j dddS )N"'
quote_charsecondary_quote_charget_sqlr+   r*   r*   r-   __str__$  rT   zTerm.__str__c                 C  s   t | jdddS )NT)
with_aliaswith_namespace)hashr   r+   r*   r*   r-   __hash__'     zTerm.__hash__kwargsc                 K     t  r)   NotImplementedErrorr,   r   r*   r*   r-   r   *     zTerm.get_sqlr)   rA   rB   r'   rC   )rA   rI   r'   rC   )r'   rL   r'   rQ   )rU   rV   r'   rW   )r^   r`   r'   ra   )rh   ri   rj   ri   r'   r@   rn   r   r'   ro   )r'   rs   )r'   rv   )r'   rz   )r|   rd   r'   r}   )r|   rd   r'   r   )r   rI   r'   ro   )r   rI   r'   ro   )r   r   r   r   r'   r   )r   r   r   r   r'   r   )r'   r   )r   r   r'   r   )rn   r   r'   r   )r'   r@   )r'   r   )rn   r   r'   r   )rn   r   r'   r   )r   r   r'   r   r'   rI   )r'   rd   r   r   r'   rI   )Fr;   r<   r=   r>   rG   r   rJ   propertyrP   rS   staticmethodr_   rg   rm   rq   ru   rx   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   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@   0   s    
























































r@   idxrd   r'   rI   c                 C  s   t | d S Nrb   rI   r   r*   r*   r-   idx_placeholder_gen.  ry   r   c                 C  s   d| d  S )Nparamrb   r*   r   r*   r*   r-   named_placeholder_gen2  rT   r  c                      sL   e Zd ZdZd fddZedd	 ZdddZdddZdddZ	  Z
S )	ParameterNplaceholder	str | intr'   rC   c                      t    || _d S r)   )superrG   _placeholderr,   r  	__class__r*   r-   rG   9     

zParameter.__init__c                 C     | j S r)   )r  r+   r*   r*   r-   r  =  s   zParameter.placeholderr   r   rI   c                 K  s
   t | jS r)   )rI   r  r   r*   r*   r-   r   A  rH   zParameter.get_sql	param_keyparam_valuec                 K     d S r)   r*   )r,   r  r  r   r*   r*   r-   update_parametersD  r   zParameter.update_parametersc                 K     |S r)   r*   r,   r  r   r*   r*   r-   get_param_keyG  r   zParameter.get_param_key)r  r  r'   rC   r   )r  r   r  r   r  r   )r;   r<   r=   r>   rG   r   r  r   r  r  __classcell__r*   r*   r	  r-   r  6  s    


r  c                      sB   e Zd Zefd fddZeddd	Zd
d ZdddZ  Z	S )ListParameterr   str | int | Callable[[int], str]r'   rC   c                      t  j|d t | _d S Nr  )r  rG   rY   _parametersr  r	  r*   r-   rG   L     zListParameter.__init__rI   c                 C  $   t | jr| t| jS t| jS r)   callabler  lenr  rI   r+   r*   r*   r-   r  P     

zListParameter.placeholderc                 K  r  r)   r  r   r*   r*   r-   get_parametersW  r   zListParameter.get_parametersr|   r   c                 K  s   | j | d S r)   )r  appendr,   r|   r   r*   r*   r-   r  Z  r   zListParameter.update_parametersr  r  r'   rC   r   r|   r   )
r;   r<   r=   r   rG   r   r  r#  r  r  r*   r*   r	  r-   r  K  s    r  c                      sL   e Zd Zefd fddZeddd	Zd
d ZdddZdddZ	  Z
S )DictParameterr  r  r'   rC   c                   r  r  )r  rG   dictr  r  r	  r*   r-   rG   _  r  zDictParameter.__init__rI   c                 C  r  r)   r  r+   r*   r*   r-   r  c  r!  zDictParameter.placeholderc                 K  r  r)   r"  r   r*   r*   r-   r#  j  r   zDictParameter.get_parametersr   c                 K  s   |dd  S r   r*   r  r*   r*   r-   r  m  ry   zDictParameter.get_param_keyr  r|   c                 K  s   || j |< d S r)   r"  )r,   r  r|   r   r*   r*   r-   r  p  rT   zDictParameter.update_parametersr&  r   r  )r  r   r|   r   )r;   r<   r=   r  rG   r   r  r#  r  r  r  r*   r*   r	  r-   r(  ^  s    
r(  c                   @  s   e Zd Zdd ZdS )QmarkParameterc                 K     dS )N?r*   r   r*   r*   r-   r   u  r   zQmarkParameter.get_sqlNr;   r<   r=   r   r*   r*   r*   r-   r*  t  s    r*  c                   @     e Zd ZdZd	ddZdS )
NumericParameterz0Numeric, positional style, e.g. ...WHERE name=:1r   r   r'   rI   c                 K     dj | jdS Nz:{placeholder}r  formatr  r   r*   r*   r-   r   |  rT   zNumericParameter.get_sqlNr   r;   r<   r=   __doc__r   r*   r*   r*   r-   r/  y      r/  c                   @  r.  )
FormatParameterz1ANSI C printf format codes, e.g. ...WHERE name=%sr   r   r'   rI   c                 K  r+  )Nz%sr*   r   r*   r*   r-   r     r   zFormatParameter.get_sqlNr   r4  r*   r*   r*   r-   r7    r6  r7  c                   @  r.  )
NamedParameterz%Named style, e.g. ...WHERE name=:namer   r   r'   rI   c                 K  r0  r1  r2  r   r*   r*   r-   r     rT   zNamedParameter.get_sqlNr   r4  r*   r*   r*   r-   r8    r6  r8  c                   @  s$   e Zd ZdZdddZdd	d
ZdS )PyformatParameterz9Python extended format codes, e.g. ...WHERE name=%(name)sr   r   r'   rI   c                 K  r0  )Nz%({placeholder})sr  r2  r   r*   r*   r-   r     rT   zPyformatParameter.get_sqlr  c                 K  s   |dd S )N   r*   r  r*   r*   r-   r    ry   zPyformatParameter.get_param_keyNr   r  )r;   r<   r=   r5  r   r  r*   r*   r*   r-   r9    r?   r9  c                      s6   e Zd Zd fddZeddd	ZdddZ  ZS )r   termr@   r'   rC   c                   r  r)   r  rG   r<  r,   r<  r	  r*   r-   rG     r  zNegative.__init__bool | Nonec                 C     | j jS r)   r<  r>   r+   r*   r*   r-   r>        zNegative.is_aggregater   r   rI   c                 K  s   dj | jjdi |dS )Nz-{term}r<  r*   )r3  r<  r   r   r*   r*   r-   r     s   zNegative.get_sql)r<  r@   r'   rC   r'   r?  r   )r;   r<   r=   rG   r   r>   r   r  r*   r*   r	  r-   r     
    r   c                      sX   e Zd ZdZdd fdd	ZdddZedddZdddZ			dd ddZ	  Z
S )!r]   Nr|   r   rA   rB   r'   rC   c                      t  | || _d S r)   r  rG   r|   r,   r|   rA   r	  r*   r-   rG        
zValueWrapper.__init__r   rI   c                 K  s   | j | jfi |S r)   )get_formatted_valuer|   r   r*   r*   r-   get_value_sql  r   zValueWrapper.get_value_sqlc                 K  s   | dpd}t|tr|jdi |S t|tr#| j|jfi |S t|ttt	fr6| j|
 fi |S t|tr@t||S t|trLtt|S t|tjr]| jt|fi |S |d u rcdS t|S )Nr    nullr*   )getr2   r@   r   r
   rJ  r|   r   r   r	   	isoformatrI   r   re   r   uuidUUID)clsr|   r   r   r*   r*   r-   rJ    s    




z ValueWrapper.get_formatted_value	parameterr  tuple[str, str]c                 K  s$   |j di |}|j|d}||fS Nr  r*   )r   r  r,   rS  r   	param_sqlr  r*   r*   r-   _get_param_data  s   zValueWrapper._get_param_datar   r   r   c           	      K  s   |d u r| j d||d|}t|| jfd|i|S t| jttfr'| j}n
| j dd|i|}| j|fi |\}}|jd||d| t|| jfd|i|S )Nr   r   )r  r|   r*   )	rK  r   rA   r2   r|   rd   floatrX  r  )	r,   r   r   rS  r   sql	value_sqlrW  r  r*   r*   r-   r     s   zValueWrapper.get_sqlr)   r|   r   rA   rB   r'   rC   r   r'  rS  r  r'   rT  )Nr   N)
r   rB   r   rI   rS  r  r   r   r'   rI   )r;   r<   r=   r>   rG   rK  classmethodrJ  rX  r   r  r*   r*   r	  r-   r]     s    

r]   c                      s*   e Zd Zdd fd
dZdddZ  ZS )ParameterValueWrapperNrS  r  r|   r   rA   rB   r'   rC   c                   s   t  || || _d S r)   )r  rG   
_parameter)r,   rS  r|   rA   r	  r*   r-   rG        
zParameterValueWrapper.__init__rT  c                 K  s(   | j jdi |}| j j|d}||fS rU  )r`  r   r  rV  r*   r*   r-   rX    s   z%ParameterValueWrapper._get_param_datar)   )rS  r  r|   r   rA   rB   r'   rC   r]  )r;   r<   r=   rG   rX  r  r*   r*   r	  r-   r_        r_  c                      s   e Zd ZdZd4d5 fdd	Zd6ddZd7ddZd8ddZed9d:ddZ	d;d<ddZ
d=dd Zd=d!d"Zd>d$d%Zd>d&d'Zd?d)d*Zd?d+d,Zd?d-d.Zd@d0d1Zd@d2d3Z  ZS )Arf   Nr|   r   rA   rB   r'   rC   c                   rF  r)   rG  rH  r	  r*   r-   rG     rI  zJSON.__init__r   rI   c                 K  s\   t |tr| j|fi |S t |tr| j|fi |S t |tr*| j|fi |S t|S r)   )r2   r)  _get_dict_sqlrY   _get_list_sqlrI   _get_str_sqlr%  r*   r*   r-   _recursive_get_sql  s   


zJSON._recursive_get_sqlr)  c                   s.    fdd|  D }ddd|dgS )Nc                   s:   g | ]\}}d j j|fi  j|fi  dqS )z{key}:{value})keyr|   )r3  rf  )r3   kvr   r,   r*   r-   r6     s    (z&JSON._get_dict_sql.<locals>.<listcomp>rL  {,})itemsjoinr,   r|   r   pairsr*   rj  r-   rc    s   zJSON._get_dict_sqlrY   c                   s*    fdd|D }d dd |dgS )Nc                   s   g | ]}j |fi  qS r*   )rf  )r3   ri  rj  r*   r-   r6     s    z&JSON._get_list_sql.<locals>.<listcomp>rL  [rl  ])ro  rp  r*   rj  r-   rd    s   zJSON._get_list_sqlr   r   c                 K  r   r)   )r   )r|   r   r   r*   r*   r-   re    rK   zJSON._get_str_sqlr   r   c                 K  s&   t | | j|}t|| jfi |S r)   )r   rf  r|   r   rA   )r,   r   r   rZ  r*   r*   r-   r   
  s   zJSON.get_sqlkey_or_indexr  ro   c                 C  r   r)   )ro   r   GET_JSON_VALUEr_   r,   rt  r*   r*   r-   get_json_value  r   zJSON.get_json_valuec                 C  r   r)   )ro   r   GET_TEXT_VALUEr_   rv  r*   r*   r-   get_text_value  r   zJSON.get_text_value	path_jsonc                 C  r   r)   )ro   r   GET_PATH_JSON_VALUErg   r,   rz  r*   r*   r-   get_path_json_value  r   zJSON.get_path_json_valuec                 C  r   r)   )ro   r   GET_PATH_TEXT_VALUErg   r|  r*   r*   r-   get_path_text_value  r   zJSON.get_path_text_valuern   c                 C  r   r)   )ro   r   HAS_KEYrg   rp   r*   r*   r-   has_key  r   zJSON.has_keyc                 C  r   r)   )ro   r   CONTAINSrg   rp   r*   r*   r-   contains  r   zJSON.containsc                 C  r   r)   )ro   r   CONTAINED_BYrg   rp   r*   r*   r-   contained_by   r   zJSON.contained_byr   c                 C     t tj| t| S r)   )ro   r   HAS_KEYSrZ   rp   r*   r*   r-   has_keys#  r   zJSON.has_keysc                 C  r  r)   )ro   r   HAS_ANY_KEYSrZ   rp   r*   r*   r-   has_any_keys&  r   zJSON.has_any_keysNNr\  )r|   r   r   r   r'   rI   )r|   r)  r   r   r'   rI   )r|   rY   r   r   r'   rI   )r   )r|   rI   r   rI   r   r   r'   rI   )r   )r   rI   r   r   r'   rI   )rt  r  r'   ro   )rz  rI   r'   ro   r   )rn   r   r'   ro   )r;   r<   r=   tablerG   rf  rc  rd  r   re  r   rw  ry  r}  r  r  r  r  r  r  r  r*   r*   r	  r-   rf     s$    

	








rf   c                      s*   e Zd Zd fddZddddZ  ZS )Valuesfieldstr | Fieldr'   rC   c                   s.   t  d  t|tst|| _d S || _d S r)   )r  rG   r2   rR   r  )r,   r  r	  r*   r-   rG   +  s   "zValues.__init__Nr   rB   r   r   rI   c                 K  s   dj | jjdd|i|dS )NzVALUES({value})r   r|   r*   )r3  r  r   r,   r   r   r*   r*   r-   r   /  s   zValues.get_sql)r  r  r'   rC   r)   r   rB   r   r   r'   rI   r;   r<   r=   rG   r   r  r*   r*   r	  r-   r  *  s    r  c                      s*   e Zd Zdd fddZdddZ  ZS )LiteralValueNrA   rB   r'   rC   c                   rF  r)   )r  rG   _valuerH  r	  r*   r-   rG   4  rI  zLiteralValue.__init__r   r   rI   c                 K  s   t | j| jfi |S r)   )r   r  rA   r   r*   r*   r-   r   8  r9   zLiteralValue.get_sqlr)   r   r   r  r*   r*   r	  r-   r  3  rb  r  c                          e Zd Zdd	 fddZ  ZS )
rX   NrA   rB   r'   rC   c                      t  d| d S )NrM  r  rG   rF   r	  r*   r-   rG   =  r   zNullValue.__init__r)   r   r;   r<   r=   rG   r  r*   r*   r	  r-   rX   <      rX   c                      r  )
SystemTimeValueNrA   rB   r'   rC   c                   r  )NSYSTEM_TIMEr  rF   r	  r*   r-   rG   B  r   zSystemTimeValue.__init__r)   r   r  r*   r*   r	  r-   r  A  r  r  c                   @  sz   e Zd Zed"ddZed#ddZd$ddZd%ddZd%ddZd%ddZed&d'ddZ	ed&d(ddZ
d)dd Zd!S )*	Criterion
comparatorr   rn   EmptyCriterionr'   r    c                 C  r  r)   r*   r,   r  rn   r*   r*   r-   _compareG  r   zCriterion._comparer   ComplexCriterionc                 C  r  r)   r*   r  r*   r*   r-   r  J  r   Self | ComplexCriterionc                 C  s   t |tr| S t|| |S r)   )r2   r  r  r  r*   r*   r-   r  M  s   
c                 C     |  tj|S r)   )r  r   and_rp   r*   r*   r-   __and__R  rT   zCriterion.__and__c                 C  r  r)   )r  r   or_rp   r*   r*   r-   __or__U  rT   zCriterion.__or__c                 C  r  r)   )r  r   xor_rp   r*   r*   r-   __xor__X  rT   zCriterion.__xor__r*   termsIterable[Term](EmptyCriterion | Term | ComplexCriterionc                 C  s   t  }| D ]}||O }q|S r)   r  r  critr<  r*   r*   r-   any[     
zCriterion.anyIterable[Any]'EmptyCriterion | Any | ComplexCriterionc                 C  s   t  }| D ]}||M }q|S r)   r  r  r*   r*   r-   alld  r  zCriterion.allrI   c                 C  r   r)   r   r+   r*   r*   r-   r   m  r   zCriterion.get_sqlN)r  r   rn   r  r'   r    )r  r   rn   r   r'   r  )r  r   rn   r   r'   r  )rn   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  F  s    



r  c                   @  sH   e Zd ZdZe ZdddZddd	Zdd
dZdddZ	dddZ
dS )r  Nr'   rQ   c                 C  s   t  S r)   )rO   r+   r*   r*   r-   rS   u  r   zEmptyCriterion.fields_rn   r   c                 C  r  r)   r*   rp   r*   r*   r-   r  x  r   zEmptyCriterion.__and__c                 C  r  r)   r*   rp   r*   r*   r-   r  {  r   zEmptyCriterion.__or__c                 C  r  r)   r*   rp   r*   r*   r-   r  ~  r   zEmptyCriterion.__xor__c                 C  rk   r)   r*   r+   r*   r*   r-   r     r   zEmptyCriterion.__invert__r   )rn   r   r'   r   )r'   r   )r;   r<   r=   r>   rO   rP   rS   r  r  r  r   r*   r*   r*   r-   r  q  s    



r  c                      B   e Zd Zdd fd
dZdddZedddZdddZ  ZS )rR   NnamerI   rA   rB   r  str | Selectable | Noner'   rC   c                   s<   t  j|d || _t|trddlm} ||}|| _d S )NrE   r   rM   )r  rG   r  r2   rI   pypika.queriesr#   r  )r,   r  rA   r  r#   r	  r*   r-   rG     s   

zField.__init__r(   c                 c  *    | V  | j d ur| j  E d H  d S d S r)   r  r.   r+   r*   r*   r-   r.     
   
zField.nodes_rh   ri   rj   c                 C  s    | j |kr
|| _ dS | j | _ dS )Q  
        Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries.

        :param current_table:
            The table to be replaced.
        :param new_table:
            The table to replace with.
        :return:
            A copy of the field with the tables replaced.
        Nr  rl   r*   r*   r-   rm     s    zField.replace_tabler   r   c                 K  s   | dd}| dd}| dd }t| j|}| jr0|s!| jjr0| j }djt|||d}t| dd }|rCt||fd|i|S |S )Nr   Fr   r   z{namespace}.{name})	namespacer  rA   )	popr   r  r  rA   get_table_namer3  getattrr   )r,   r   r   r   r   	field_sql
table_namefield_aliasr*   r*   r-   r     s   
zField.get_sqlr  )r  rI   rA   rB   r  r  r'   rC   r:   rh   ri   rj   ri   r'   rC   r   	r;   r<   r=   rG   r.   r   rm   r   r  r*   r*   r	  r-   rR     s    

rR   c                      s,   e Zd Zdd fdd	ZddddZ  ZS )IndexNr  rI   rA   rB   r'   rC   c                   rF  r)   r  rG   r  )r,   r  rA   r	  r*   r-   rG     rI  zIndex.__init__r   r   r   c                 K  s   t | j|S r)   )r   r  r  r*   r*   r-   r     ry   zIndex.get_sqlr)   )r  rI   rA   rB   r'   rC   r  r  r*   r*   r	  r-   r    s    r  c                      s8   e Zd Zdd fddZdd	d
Z	ddddZ  ZS )StarNr  r  r'   rC   c                   s   t  jd|d d S )N*r  r  )r,   r  r	  r*   r-   rG     r   zStar.__init__r(   c                 c  r  r)   r  r+   r*   r*   r-   r.     r  zStar.nodes_Fr   re   r   r   rB   r   r   rI   c                 K  s:   | j r|s	| j jr| j jpt| j d}dt||S dS )N_table_namez{}.*r  )r  rA   r  r3  r   )r,   r   r   r   r   r  r*   r*   r-   r     s   zStar.get_sqlr)   )r  r  r'   rC   r:   )FFN)
r   re   r   re   r   rB   r   r   r'   rI   r;   r<   r=   rG   r.   r   r  r*   r*   r	  r-   r    s
    
r  c                      sN   e Zd Zd fddZddd	ZdddZedddZedddZ	  Z
S )r\   valuesr   r'   rC   c                   s"   t     fdd|D  _d S )Nc                   r   r*   r   r   r+   r*   r-   r6     r   z"Tuple.__init__.<locals>.<listcomp>)r  rG   r  )r,   r  r	  r+   r-   rG     s   
zTuple.__init__r(   c                 c  &    | V  | j D ]	}| E d H  qd S r)   )r  r.   r   r*   r*   r-   r.     
   
zTuple.nodes_r   rI   c                   s4   d d fdd| jD }t|| jfi  S )N({})rl  c                 3       | ]}|j di  V  qd S Nr*   r   r3   r<  r   r*   r-   	<genexpr>      z Tuple.get_sql.<locals>.<genexpr>)r3  ro  r  r   rA   r,   r   rZ  r*   r  r-   r     s    zTuple.get_sqlre   c                 C     t dd | jD S )Nc                 S     g | ]}|j qS r*   r>   )r3   r^   r*   r*   r-   r6         z&Tuple.is_aggregate.<locals>.<listcomp>)r   r  r+   r*   r*   r-   r>     s   zTuple.is_aggregaterh   ri   rj   c                       fdd| j D | _ dS )r  c                      g | ]}|  qS r*   rm   r   rh   rj   r*   r-   r6         z'Tuple.replace_table.<locals>.<listcomp>N)r  rl   r*   r  r-   rm        zTuple.replace_table)r  r   r'   rC   r:   r   r'   re   r  )r;   r<   r=   rG   r.   r   r   r>   r   rm   r  r*   r*   r	  r-   r\     s    

r\   c                   @     e Zd ZdddZdS )	rZ   r   r   r'   rI   c                   sl     d}d fdd| jD }d|}|tjtjfv r,t|dkr*d|nd}t|| j	fi  S )	Ndialectrl  c                 3  r  r  r   r  r  r*   r-   r    r  z Array.get_sql.<locals>.<genexpr>z[{}]r   z	ARRAY[{}]z'{}')
rN  ro  r  r3  r   
POSTGRESQLREDSHIFTr   r   rA   )r,   r   r  r  rZ  r*   r  r-   r     s   

zArray.get_sqlNr   r-  r*   r*   r*   r-   rZ         rZ   c                         e Zd Zd fddZ  ZS )Bracketr<  r   r'   rC   c                   s   t  | d S r)   r  r>  r	  r*   r-   rG     r   zBracket.__init__)r<  r   r'   rC   r  r*   r*   r	  r-   r        r  c                      sT   e Zd Z	d"d# fddZd$ddZed%ddZed&ddZd'd(d d!Z	  Z
S ))NestedCriterionNr  r   nested_comparatorr  leftr   rightnestedrA   rB   r'   rC   c                   s.   t  | || _|| _|| _|| _|| _d S r)   )r  rG   r  r  r  r  r  )r,   r  r  r  r  r  rA   r	  r*   r-   rG     s   	
zNestedCriterion.__init__r(   c                 c  <    | V  | j  E d H  | j E d H  | j E d H  d S r)   )r  r.   r  r  r+   r*   r*   r-   r.     
   zNestedCriterion.nodes_r?  c                 C  s   t dd | j| j| jfD S )Nc                 S  r  r*   r  r  r*   r*   r-   r6     r  z0NestedCriterion.is_aggregate.<locals>.<listcomp>)r   r  r  r  r+   r*   r*   r-   r>     s   zNestedCriterion.is_aggregaterh   ri   rj   c                 C  s4   | j ||| _ | j||| _| j||| _dS U  
        Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries.

        :param current_table:
            The table to be replaced.
        :param new_table:
            The table to replace with.
        :return:
            A copy of the criterion with the tables replaced.
        N)r  rm   r  r  rl   r*   r*   r-   rm   !  s   zNestedCriterion.replace_tableFr   re   r   rI   c              	   K  sd   dj | jjdi || jj| jjdi || jj| jjdi |d}|r0td|| j	d|S |S )Nz4{left}{comparator}{right}{nested_comparator}{nested})r  r  r  r  r  )rZ  rA   r*   )
r3  r  r   r  r|   r  r  r  r   rA   r,   r   r   rZ  r*   r*   r-   r   1  s   zNestedCriterion.get_sqlr)   )r  r   r  r  r  r   r  r   r  r   rA   rB   r'   rC   r:   rD  r  Fr   re   r   r   r'   rI   r;   r<   r=   rG   r.   r   r>   r   rm   r   r  r*   r*   r	  r-   r    s    
r  c                      sR   e Zd Zd"d# fddZd$ddZed%ddZed&ddZd'd(d d!Z	  Z
S ))ro   Nr  r   r  r@   r  rA   rB   r'   rC   c                   "   t  | || _|| _|| _dS )a  
        A wrapper for a basic criterion such as equality or inequality. This wraps three parts, a left and right term
        and a comparator which defines the type of comparison.


        :param comparator:
            Type: Comparator
            This defines the type of comparison, such as {quote}={quote} or {quote}>{quote}.
        :param left:
            The term on the left side of the expression.
        :param right:
            The term on the right side of the expression.
        N)r  rG   r  r  r  )r,   r  r  r  rA   r	  r*   r-   rG   A  s   
zBasicCriterion.__init__r(   c                 c  ,    | V  | j  E d H  | j E d H  d S r)   )r  r.   r  r+   r*   r*   r-   r.   T     zBasicCriterion.nodes_r?  c                 C  s   t dd | j| jfD S )Nc                 S  r  r*   r  r  r*   r*   r-   r6   [  r  z/BasicCriterion.is_aggregate.<locals>.<listcomp>)r   r  r  r+   r*   r*   r-   r>   Y     zBasicCriterion.is_aggregaterh   ri   rj   c                 C  $   | j ||| _ | j||| _dS r  r  rm   r  rl   r*   r*   r-   rm   ]     zBasicCriterion.replace_tabler   Fr   rI   r   re   r   r   c                 K  sT   dj | jj| jjdd|i|| jjdd|i|d}|r(t|| jfi |S |S )Nz{left}{comparator}{right}r   r  r  r  r*   )r3  r  r|   r  r   r  r   rA   )r,   r   r   r   rZ  r*   r*   r-   r   l  s   zBasicCriterion.get_sqlr)   )
r  r   r  r@   r  r@   rA   rB   r'   rC   r:   rD  r  )r   F)r   rI   r   re   r   r   r'   rI   r  r*   r*   r	  r-   ro   @  s    
ro   c                      s`   e Zd Zdd fd
dZd ddZed!ddZed"ddZdd#ddZ	ed$ddZ
  ZS )%r   Nr<  r   	containerr@   rA   rB   r'   rC   c                   s"   t  | || _|| _d| _dS )a  
        A wrapper for a "IN" criterion.  This wraps two parts, a term and a container.  The term is the part of the
        expression that is checked for membership in the container.  The container can either be a list or a subquery.


        :param term:
            The term to assert membership for within the container.
        :param container:
            A list or subquery.
        FN)r  rG   r<  r  _is_negated)r,   r<  r  rA   r	  r*   r-   rG   x  s   
zContainsCriterion.__init__r(   c                 c  r  r)   )r<  r.   r  r+   r*   r*   r-   r.     r  zContainsCriterion.nodes_r?  c                 C  r@  r)   rA  r+   r*   r*   r-   r>     rB  zContainsCriterion.is_aggregaterh   ri   rj   c                 C     | j ||| _ dS r  r<  rm   rl   r*   r*   r-   rm        zContainsCriterion.replace_tablesubqueryr   rI   c                 K  sN   dj | jjdi || jjdddi|| jrdndd}t|| jfi |S )Nz{term} {not_}IN {container}r  TNOT rL  )r<  r  not_r*   )r3  r<  r   r  r  r   rA   )r,   r  r   rZ  r*   r*   r-   r     s   zContainsCriterion.get_sqlc                 C  
   d| _ d S NTr  r+   r*   r*   r-   rw     rK   zContainsCriterion.negater)   )r<  r   r  r@   rA   rB   r'   rC   r:   rD  r  )r  r   r   r   r'   rI   )r'   r   )r;   r<   r=   rG   r.   r   r>   r   rm   r   rw   r  r*   r*   r	  r-   r   w  s    
r   c                      s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	ExistsCriterionNc                   s   t  | || _d| _d S NF)r  rG   r  r  )r,   r  rA   r	  r*   r-   rG        
zExistsCriterion.__init__c                 K  s*   dj | jjdi || jrddS ddS )Nz{not_}EXISTS {container}r  rL  )r  r  r*   )r3  r  r   r  r   r*   r*   r-   r     s
   zExistsCriterion.get_sqlc                 C  s
   d| _ | S r
  r  r+   r*   r*   r-   rw     s   zExistsCriterion.negater)   )r;   r<   r=   rG   r   rw   r  r*   r*   r	  r-   r    s    r  c                      s8   e Zd Zdd fddZdddZedddZ  ZS )RangeCriterionNr<  r@   r   r   r   rA   rB   r'   rI   c                   s"   t  | || _|| _|| _d S r)   )r  rG   r<  r   r   )r,   r<  r   r   rA   r	  r*   r-   rG     s   
zRangeCriterion.__init__r(   c                 c  r  r)   )r<  r.   r   r   r+   r*   r*   r-   r.     r  zRangeCriterion.nodes_r?  c                 C  r@  r)   rA  r+   r*   r*   r-   r>     rB  zRangeCriterion.is_aggregater)   )
r<  r@   r   r   r   r   rA   rB   r'   rI   r:   rD  )r;   r<   r=   rG   r.   r   r>   r  r*   r*   r	  r-   r    s
    
r  c                   @  s$   e Zd ZedddZdddZdS )r   rh   ri   rj   r'   rC   c                 C  r  r  r  rl   r*   r*   r-   rm     r  zBetweenCriterion.replace_tabler   r   rI   c                 K  N   dj | jjdi || jjdi || jjdi |d}t|| jfi |S )Nz {term} BETWEEN {start} AND {end}r<  r   r   r*   r3  r<  r   r   r   r   rA   r  r*   r*   r-   r        zBetweenCriterion.get_sqlNr  r   )r;   r<   r=   r   rm   r   r*   r*   r*   r-   r     s    r   c                   @  r  )	r   r   r   r'   rI   c                 K  r  )Nz{term} FROM {start} TO {end}r  r*   r  r  r*   r*   r-   r     r  zPeriodCriterion.get_sqlNr   r-  r*   r*   r*   r-   r     r  r   c                      r  )r}   Nr<  r@   r|   r   rA   rB   r'   rC   c                      t  | || _|| _d S r)   r  rG   r<  r|   r,   r<  r|   rA   r	  r*   r-   rG     r  zBitwiseAndCriterion.__init__r(   c                 c  r  r)   r<  r.   r|   r+   r*   r*   r-   r.     r  zBitwiseAndCriterion.nodes_rh   ri   rj   c                 C  r  r  r  rl   r*   r*   r-   rm     r  z!BitwiseAndCriterion.replace_tabler   rI   c                 K  2   dj | jjdi || jd}t|| jfi |S )Nz({term} & {value})r<  r|   r*   r3  r<  r   r|   r   rA   r  r*   r*   r-   r   	  
   zBitwiseAndCriterion.get_sqlr)   r<  r@   r|   r   rA   rB   r'   rC   r:   r  r   r  r*   r*   r	  r-   r}         
r}   c                      r  )r   Nr<  r@   r|   r   rA   rB   r'   rC   c                   r  r)   r  r  r	  r*   r-   rG     r  zBitwiseOrCriterion.__init__r(   c                 c  r  r)   r  r+   r*   r*   r-   r.     r  zBitwiseOrCriterion.nodes_rh   ri   rj   c                 C  r  r  r  rl   r*   r*   r-   rm     r  z BitwiseOrCriterion.replace_tabler   rI   c                 K  r  )Nz({term} | {value})r  r*   r  r  r*   r*   r-   r   *  r  zBitwiseOrCriterion.get_sqlr)   r  r:   r  r   r  r*   r*   r	  r-   r     r  r   c                      sD   e Zd Zdd fdd	ZdddZedddZddddZ  ZS ) rs   Nr<  r@   rA   rB   r'   rC   c                   rF  r)   r=  r,   r<  rA   r	  r*   r-   rG   3  rI  zNullCriterion.__init__r(   c                 c      | V  | j  E d H  d S r)   r<  r.   r+   r*   r*   r-   r.   7     zNullCriterion.nodes_rh   ri   rj   c                 C  r  r  r  rl   r*   r*   r-   rm   ;  r  zNullCriterion.replace_tableFr   re   r   r   rI   c                 K  .   dj | jjdi |d}t|| jfi |S )Nz{term} IS NULLrC  r*   r3  r<  r   r   rA   r  r*   r*   r-   r   I     zNullCriterion.get_sqlr)   )r<  r@   rA   rB   r'   rC   r:   r  r  r  r  r*   r*   r	  r-   rs   2  s    
rs   c                   @  s   e Zd Zdddd	Zd
S )rz   Fr   re   r   r   r'   rI   c                 K  r"  )Nz{term} IS NOT NULLrC  r*   r#  r  r*   r*   r-   r   Q  r$  zNotNullCriterion.get_sqlNr  r  r-  r*   r*   r*   r-   rz   P  s    rz   c                   @  s"   e Zd Zdddd	ZdddZdS )r  Fsubcriterionre   r   r   r'   rI   c              	   K  s\   dj | jj| jjdd| | ji|| jjdd| | ji|d}|r,dj |dS |S )Nz{left} {comparator} {right}r%  r   z({criterion}))	criterionr*   )r3  r  r|   r  r   needs_bracketsr  )r,   r%  r   rZ  r*   r*   r-   r   Y  s   zComplexCriterion.get_sqlr<  r@   c                 C  s   t |to|j| jk S r)   )r2   r  r  r>  r*   r*   r-   r'  e  r   zComplexCriterion.needs_bracketsNr  )r%  re   r   r   r'   rI   )r<  r@   r'   re   )r;   r<   r=   r   r'  r*   r*   r*   r-   r  X  s    r  c                      sv   e Zd ZdZejejgZd$d% fddZd&ddZ	e
d'ddZed(ddZd)ddZd)ddZd*d+d"d#Z  ZS ),r   z
    Wrapper for an arithmetic function.  Can be simple with two terms or complex with nested terms. Order of operations
    are also preserved.
    Noperatorr   r  r   r  rA   rB   r'   rC   c                   r  )a  
        Wrapper for an arithmetic expression.

        :param operator:
            Type: Arithmetic
            An operator for the expression such as {quote}+{quote} or {quote}/{quote}

        :param left:
            The term on the left side of the expression.
        :param right:
            The term on the right side of the expression.
        :param alias:
            (Optional) an alias for the term which can be used inside a select statement.
        :return:
        N)r  rG   r(  r  r  )r,   r(  r  r  rA   r	  r*   r-   rG   q  s   
zArithmeticExpression.__init__r(   c                 c  r  r)   )r  r.   r  r+   r*   r*   r-   r.     r  zArithmeticExpression.nodes_r?  c                 C  s   t | jj| jjgS r)   )r   r  r>   r  r+   r*   r*   r-   r>     s   z!ArithmeticExpression.is_aggregaterh   ri   rj   c                 C  r  )P  
        Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries.

        :param current_table:
            The table to be replaced.
        :param new_table:
            The table to replace with.
        :return:
            A copy of the term with the tables replaced.
        Nr  rl   r*   r*   r-   rm     r  z"ArithmeticExpression.replace_tablere   c                 C  s$   |du rdS || j v rdS || j v S )a  
        Returns true if the expression on the left of the current operator needs to be enclosed in parentheses.

        :param current_op:
            The current operator.
        :param left_op:
            The highest level operator of the left expression.
        NF)	add_order)r,   curr_opleft_opr*   r*   r-   left_needs_parens  s
   	

z&ArithmeticExpression.left_needs_parensc                 C  s2   |du rdS |t jkrdS |t jkrdS || jv S )a  
        Returns true if the expression on the right of the current operator needs to be enclosed in parentheses.

        :param current_op:
            The current operator.
        :param right_op:
            The highest level operator of the right expression.
        NFT)r   r   r   r*  )r,   r+  right_opr*   r*   r-   right_needs_parens  s   	


z'ArithmeticExpression.right_needs_parensFr   r   rI   c              	   K  s   dd | j | jfD \}}dj| jj| | j|rdnd| j jdi || | j|r/dnd| jjdi |d}|rIt|| j	fi |S |S )Nc                 S  s   g | ]}t |d dqS )r(  N)r  )r3   sider*   r*   r-   r6     r  z0ArithmeticExpression.get_sql.<locals>.<listcomp>z{left}{operator}{right}r  z{})r(  r  r  r*   )
r  r  r3  r(  r|   r-  r   r/  r   rA   )r,   r   r   r,  r.  arithmetic_sqlr*   r*   r-   r     s   
zArithmeticExpression.get_sqlr)   )
r(  r   r  r   r  r   rA   rB   r'   rC   r:   rD  r  r  r  r  )r;   r<   r=   r5  r   r   r   r*  rG   r.   r   r>   r   rm   r-  r/  r   r  r*   r*   r	  r-   r   i  s    


r   c                      sn   e Zd Zd!d" fddZd#d	d
Zed$ddZed%ddZed&ddZ	ed'ddZ
d(d)dd Z  ZS )*CaseNrA   rB   r'   rC   c                   s   t  j|d g | _d | _d S NrE   )r  rG   _cases_elserF   r	  r*   r-   rG     s   
zCase.__init__r(   c                 c  sV    | V  | j D ]\}}| E d H  | E d H  q| jd ur)| j E d H  d S d S r)   )r4  r.   r5  r,   r&  r<  r*   r*   r-   r.     s   
zCase.nodes_r?  c                 C  s.   t dd | jD | jr| jjg S d g S )Nc                 S  s   g | ]
\}}|j p|j qS r*   r  r3   r&  r<  r*   r*   r-   r6     s    z%Case.is_aggregate.<locals>.<listcomp>)r   r4  r5  r>   r+   r*   r*   r-   r>     s   zCase.is_aggregater&  r   r<  c                 C  s   | j || |f d S r)   )r4  r$  r_   r6  r*   r*   r-   when  r  z	Case.whenrh   ri   rj   c                   s<    fdd| j D | _ | jr| j | _dS d| _dS )r)  c                   s(   g | ]\}}|  |  gqS r*   r  r7  r  r*   r-   r6     s    

z&Case.replace_table.<locals>.<listcomp>N)r4  r5  rm   rl   r*   r  r-   rm     s   $zCase.replace_tablec                 C  s   |  || _| S r)   )r_   r5  r>  r*   r*   r-   else_  s   z
Case.else_Fr   re   r   rI   c                   sv   | j stdd fdd| j D }| jr#d| jjd	i  nd}d| | d}|r9t|| jfi  S |S )
Nz:At least one 'when' case is required for a CASE statement. c                 3  s:    | ]\}}d j |jdi  |jdi  dV  qdS )zWHEN {when} THEN {then})r8  thenNr*   )r3  r   r7  r  r*   r-   r    s
    $
zCase.get_sql.<locals>.<genexpr>z ELSE {}rL  zCASE z ENDr*   )r4  r   ro  r5  r3  r   r   rA   )r,   r   r   casesr9  case_sqlr*   r  r-   r     s   "zCase.get_sqlr)   r   r:   rD  )r&  r   r<  r   r'   rC   r  )r<  r   r'   r2  r  r  )r;   r<   r=   rG   r.   r   r>   r   r8  rm   r9  r   r  r*   r*   r	  r-   r2    s    

r2  c                      sP   e Zd Zdd fdd	ZdddZdddZedddZedddZ	  Z
S )rv   Nr<  r   rA   rB   r'   rC   c                      t  j|d || _d S r3  r=  r  r	  r*   r-   rG   &  ra  zNot.__init__r(   c                 c  r  r)   r   r+   r*   r*   r-   r.   *  r!  z
Not.nodes_r   rI   c                 K  s6   d|d< dj | jjdi |d}t|| jfi |S )NTr%  z
NOT {term}rC  r*   r#  r  r*   r*   r-   r   .  s   zNot.get_sqlr  c                   s*   t | j| t s S  fdd}|S )z
        Delegate method calls to the class wrapped by Not().
        Re-wrap methods on child classes of Term (e.g. isin, eg...) to retain 'NOT <term>' output.
        c                   s.    | g|R i |}t |tfrt|S |S r)   )r2   r@   rv   )
inner_selfargsr   result	item_funcr*   r-   inner>  s   zNot.__getattr__.<locals>.inner)r  r<  inspectismethod)r,   r  rD  r*   rB  r-   __getattr__3  s
   
zNot.__getattr__rh   ri   rj   c                 C  r  r  r  rl   r*   r*   r-   rm   F  r  zNot.replace_tabler)   r<  r   rA   rB   r'   rC   r:   r   )r  rI   r'   r   r  )r;   r<   r=   rG   r.   r   r   rG  r   rm   r  r*   r*   r	  r-   rv   %  s    

rv   c                      s4   e Zd Zdd fdd	ZdddZdddZ  ZS )r   Nr<  r   rA   rB   r'   rC   c                   r>  r3  r=  r  r	  r*   r-   rG   V  ra  zAll.__init__r(   c                 c  r  r)   r   r+   r*   r*   r-   r.   Z  r!  z
All.nodes_r   rI   c                 K  s.   dj | jjdi |d}t|| jfi |S )Nz
{term} ALLrC  r*   r#  r  r*   r*   r-   r   ^  s   zAll.get_sqlr)   rH  r:   r   r  r*   r*   r	  r-   r   U  s    
r   c                   @  s2   e Zd Zdddd	ZdddZdd Zdd ZdS )CustomFunctionNr  rI   paramsSequence | Noner'   rC   c                 C  s   || _ || _d S r)   )r  rJ  )r,   r  rJ  r*   r*   r-   rG   d  s   
zCustomFunction.__init__r@  r   r   Functionc                 O  s|   |   st| j|ddS | j| s/tdj| jddd | jD ddd |D dt| jg|R d|diS )	NrA   rE   zCFunction {name} require these arguments ({params}), ({args}) passedz, c                 s      | ]}t |V  qd S r)   r   r3   pr*   r*   r-   r  p      z*CustomFunction.__call__.<locals>.<genexpr>c                 s  rM  r)   r   rN  r*   r*   r-   r  q  rP  )r  rJ  r@  )	_has_paramsrL  r  rN  _is_valid_function_callr   r3  ro  rJ  )r,   r@  r   r*   r*   r-   __call__h  s   
zCustomFunction.__call__c                 C  s
   | j d uS r)   )rJ  r+   r*   r*   r-   rQ  w  rH   zCustomFunction._has_paramsc                 G  s   t |t | jkS r)   )r   rJ  )r,   r@  r*   r*   r-   rR  z  r   z&CustomFunction._is_valid_function_callr)   )r  rI   rJ  rK  r'   rC   )r@  r   r   r   r'   rL  )r;   r<   r=   rG   rS  rQ  rR  r*   r*   r*   r-   rI  c  s
    
rI  c                      sn   e Zd Zd fdd	ZdddZedddZed ddZd!ddZ	e
dd Zd"ddZd"ddZ  ZS )#rL  r  rI   r@  r   r   r'   rC   c                   s<   t  |d | _ fdd|D  _|d _d S )NrA   c                   r   r*   r   r3   r   r+   r*   r-   r6     r   z%Function.__init__.<locals>.<listcomp>schema)r  rG   rN  r  r@  rU  r,   r  r@  r   r	  r+   r-   rG     s   zFunction.__init__r(   c                 c  r  r)   )r@  r.   r   r*   r*   r-   r.     r  zFunction.nodes_r?  c                 C  r  )aa  
        This is a shortcut that assumes if a function has a single argument and that argument is aggregated, then this
        function is also aggregated. A more sophisticated approach is needed, however it is unclear how that might work.
        :returns:
            True if the function accepts one argument and that argument is aggregate.
        c                 S  r  r*   r  )r3   r   r*   r*   r-   r6     r  z)Function.is_aggregate.<locals>.<listcomp>)r   r@  r+   r*   r*   r-   r>     s   zFunction.is_aggregaterh   ri   rj   c                   r  )r  c                   r  r*   r  rT  r  r*   r-   r6     r  z*Function.replace_table.<locals>.<listcomp>Nr@  rl   r*   r  r-   rm     r  zFunction.replace_tablec                 K  r  r)   r*   r   r*   r*   r-   get_special_params_sql  r   zFunction.get_special_params_sqlc                 K  s&   t | dr| jdddi|S t| S )Nr   r   Fr*   hasattrr   rI   )r   r   r*   r*   r-   get_arg_sql  s   &zFunction.get_arg_sqlc                   sJ   j di  }djjd fddjD |r!d| dS ddS )	Nz{name}({args}{special})rl  c                 3  sB    | ]}t |d r|jdddd nj|fi  V  qdS )r   FT)r   r  Nr*   )rZ  r   r[  rN  rj  r*   r-   r    s    
z,Function.get_function_sql.<locals>.<genexpr>r:  rL  )r  r@  specialr*   )rX  r3  r  ro  r@  )r,   r   special_params_sqlr*   rj  r-   get_function_sql  s   

zFunction.get_function_sqlc                 K  s   | dd}| dd}| dd }| dd }| j|||d}| jd ur6dj| jjd
||d||d	}|rDt|| jfd|i|S |S )Nr   Fr   r   r  )r   r   r  z{schema}.{function})r   r  )rU  functionr*   )r  r^  rU  r3  r   r   rA   )r,   r   r   r   r   r  function_sqlr*   r*   r-   r     s   
zFunction.get_sqlr  rI   r@  r   r   r   r'   rC   r:   rD  r  )r   r   r'   r   r   )r;   r<   r=   rG   r.   r   r>   r   rm   rX  r   r[  r^  r   r  r*   r*   r	  r-   rL  ~  s    
	


rL  c                      sF   e Zd ZdZ fddZeddd	ZdddZd fddZ  Z	S )AggregateFunctionTc                   s*   t  j|g|R i | g | _d| _d S r  )r  rG   _filters_include_filterrV  r	  r*   r-   rG     s   
zAggregateFunction.__init__filtersr   r'   rC   c                 G     d| _ |  j|7  _d S r
  )rd  rc  )r,   re  r*   r*   r-   filter     zAggregateFunction.filterr   rI   c                 K  s*   | j rdjt| jjdi |dS d S )NzWHERE {criterions})
criterionsr*   )rd  r3  r  r  rc  r   r   r*   r*   r-   get_filter_sql  s    z AggregateFunction.get_filter_sqlc                   s<   t  jdi |}| jdi |}| jr|dj|d7 }|S )Nz FILTER({filter_sql}))
filter_sqlr*   )r  r^  rj  rd  r3  )r,   r   rZ  rk  r	  r*   r-   r^    s
   z"AggregateFunction.get_function_sql)re  r   r'   rC   r   )r   r   )
r;   r<   r=   r>   rG   r   rg  rj  r^  r  r*   r*   r	  r-   rb    s    
rb  c                      sd   e Zd ZdZdZd fd
dZedddZedddZdddZ	dddZ
d fddZ  ZS ) AnalyticFunctionFTr  rI   r@  r   r   r'   rC   c                   s<   t  j|g|R i | g | _g | _g | _d| _d| _d S r  )r  rG   rc  
_partition	_orderbysrd  _include_overrV  r	  r*   r-   rG     s   
zAnalyticFunction.__init__r  c                 G  rf  r
  )ro  rm  r,   r  r*   r*   r-   over  rh  zAnalyticFunction.overc                   s&   d| _ |  j fdd|D 7  _d S )NTc                   s   g | ]	}|  d fqS )order)rN  r  r  r*   r-   r6     r7   z,AnalyticFunction.orderby.<locals>.<listcomp>)ro  rn  )r,   r  r   r*   r  r-   orderby  s    zAnalyticFunction.orderbyr  rR   orientOrder | Nonec                 K  s4   |d u r|j di |S dj|j di ||jdS )Nz{field} {orient})r  rt  r*   )r   r3  r|   )r,   r  rt  r   r*   r*   r-   _orderby_field   s   zAnalyticFunction._orderby_fieldc                   sl   g }j r|djd fddj D d jr1|djd fddjD d d	|S )
NzPARTITION BY {args}rl  c                 3  s2    | ]}t |d r|jdi  nt|V  qdS )r   Nr*   rY  rN  r  r*   r-   r    s   0 z5AnalyticFunction.get_partition_sql.<locals>.<genexpr>rW  zORDER BY {orderby}c                 3  s(    | ]\}}j ||fi  V  qd S r)   )rv  )r3   r  rt  rj  r*   r-   r    s   & )rs  r:  )rm  r$  r3  ro  rn  )r,   r   r  r*   rj  r-   get_partition_sql	  s   
z"AnalyticFunction.get_partition_sqlc                   s@   t  jdi |}| jdi |}|}| jr|d| d7 }|S )Nz OVER()r*   )r  r^  rw  ro  )r,   r   r`  partition_sqlrZ  r	  r*   r-   r^    s   z!AnalyticFunction.get_function_sqlra  r  r   r'   rC   )r  r   r   r   r'   rC   )r  rR   rt  ru  r   r   r'   rI   r   )r;   r<   r=   r>   is_analyticrG   r   rq  rs  rv  rw  r^  r  r*   r*   r	  r-   rl    s    

	rl  EdgeT WindowFrameAnalyticFunction.Edgec                      sn   e Zd ZG dd dZd fd
dZdddZeddddZeddddZd ddZ	d! fddZ
  ZS )"WindowFrameAnalyticFunctionc                   @  s"   e Zd ZddddZdd	d
ZdS )r}  Nr|   str | int | Noner'   rC   c                 C  rD   r)   r  r   r*   r*   r-   rG   +  rH   z)WindowFrameAnalyticFunction.Edge.__init__rI   c                 C  s   dj | jpd| jdS )Nz{value} {modifier}	UNBOUNDED)r|   modifier)r3  r|   r  r+   r*   r*   r-   r   .  s   z(WindowFrameAnalyticFunction.Edge.__str__r)   )r|   r  r'   rC   r   )r;   r<   r=   rG   r   r*   r*   r*   r-   Edge*  s    r  r  rI   r@  r   r   r'   rC   c                   s*   t  j|g|R i | d | _d | _d S r)   )r  rG   framer&   rV  r	  r*   r-   rG   4  s   
z$WindowFrameAnalyticFunction.__init__r  r&   	and_boundEdgeT | Nonec                 C  s4   | j s| jr	t || _ |r||f| _d S || _d S r)   )r  r&   AttributeError)r,   r  r&   r  r*   r*   r-   _set_frame_and_bounds9  s   z1WindowFrameAnalyticFunction._set_frame_and_boundsNstr | EdgeTc                 C     |  d|| d S )NROWSr  r,   r&   r  r*   r*   r-   rows@     z WindowFrameAnalyticFunction.rowsc                 C  r  )NRANGEr  r  r*   r*   r-   rangeD  r  z!WindowFrameAnalyticFunction.rangec                 C  s:   t | jtsdj| j| jdS | j\}}dj| j||dS )Nz{frame} {bound})r  r&   z#{frame} BETWEEN {lower} AND {upper})r  r   r   )r2   r&   r[   r3  r  r   r*   r*   r-   get_frame_sqlH  s   
z)WindowFrameAnalyticFunction.get_frame_sqlc                   s4   t  jdi |}| js| js|S dj||  dS )Nz{over} {frame})rq  r  r*   )r  rw  r  r&   r3  r  )r,   r   ry  r	  r*   r-   rw  S  s   z-WindowFrameAnalyticFunction.get_partition_sqlra  )r  rI   r&   rI   r  r  r'   rC   r)   )r&   r  r  r  r'   rC   r   r   )r;   r<   r=   r  rG   r  r   r  r  r  rw  r  r*   r*   r	  r-   r~  )  s    


r~  c                      s6   e Zd Zd fdd	Zedd
dZdddZ  ZS )IgnoreNullsAnalyticFunctionr  rI   r@  r   r   r'   rC   c                   s$   t  j|g|R i | d| _d S r  )r  rG   _ignore_nullsrV  r	  r*   r-   rG   ]  s   
z$IgnoreNullsAnalyticFunction.__init__c                 C  r	  r
  r  r+   r*   r*   r-   ignore_nullsa  rK   z(IgnoreNullsAnalyticFunction.ignore_nullsrB   c                 K  s   | j rdS d S )NzIGNORE NULLSr  r   r*   r*   r-   rX  e  s   z2IgnoreNullsAnalyticFunction.get_special_params_sqlra  )r'   rC   )r   r   r'   rB   )r;   r<   r=   rG   r   r  rX  r  r*   r*   r	  r-   r  \  rE  r  c                
   @  s|   e Zd ZejdejdejdejdejdiZ	g dZ
g dZedZ										ddddZd ddZd!ddZdS )"IntervalINTERVAL '{expr} {unit}'zINTERVAL '{expr}' {unit}yearsmonthsdayshoursminutessecondsmicroseconds)YEARMONTHDAYHOURMINUTESECONDMICROSECONDz6(^0+\.)|(\.0+$)|(^[0\-.: ]+[\-: ])|([\-:. ][0\-.: ]+$)r   Nr  rd   r  r  r  r  r  r  quartersweeksr  Dialects | Nonec              
   C  s   |
| _ d | _d | _d| _|r|| _d S |	r|	| _d S t| j| j|||||||gD ]#\}}}|rLt	|}t
| |t| | jd u rI|| _|dk | _|| _q)d S )NFr   )r  largestsmallestis_negativer  r  zipunitslabelsrd   setattrabs)r,   r  r  r  r  r  r  r  r  r  r  unitlabelr|   	int_valuer*   r*   r-   rG   }  s0   

zInterval.__init__r'   rI   c                 C  s   |   S r)   r   r+   r*   r*   r-   r     rr   zInterval.__str__r   r   c                 K  s  | j p|d}| jdkrt| d}d}nht| dr"t| d}d}n[t| dr/t| d}d}nNdjt| d	d
t| dd
t| dd
t| dd
t| dd
t| dd
t| dd
d}| jd|}| jred| }| j| j	krtdj| j| j	dn| j}|d u r}d}| j
|dj||dS )Nr  r  r  r  QUARTERr  WEEKzB{years}-{months}-{days} {hours}:{minutes}:{seconds}.{microseconds}r  r   r  r  r  r  r  r  rL  -z{largest}_{smallest})r  r  r  r  )r   r  )r  rN  r  r  rZ  r3  trim_patternr   r  r  	templates)r,   r   r  r   r  r*   r*   r-   r     s@   












	
zInterval.get_sql)
r   r   r   r   r   r   r   r   r   N)r  rd   r  rd   r  rd   r  rd   r  rd   r  rd   r  rd   r  rd   r  rd   r  r  r   r   )r;   r<   r=   r   r  r  VERTICAORACLEMYSQLr  r  r  recompiler  rG   r   r   r*   r*   r*   r-   r  m  s.    


'r  c                          e Zd Zdd fd
dZ  ZS )r   Nr<  r@   exponentrY  rA   rB   r'   rC   c                      t  jd|||d d S )NPOWrE   r  )r,   r<  r  rA   r	  r*   r-   rG     r   zPow.__init__r)   )r<  r@   r  rY  rA   rB   r'   rC   r  r*   r*   r	  r-   r     r  r   c                      r  )r   Nr<  r@   modulusrY  rA   rB   r'   rC   c                   r  )NMODrE   r  )r,   r<  r  rA   r	  r*   r-   rG     r   zMod.__init__r)   )r<  r@   r  rY  rA   rB   r'   rC   r  r*   r*   r	  r-   r     r  r   c                      r  )Rollupr  r   r'   rC   c                   s   t  jdg|R   d S )NROLLUPr  rp  r	  r*   r-   rG     r   zRollup.__init__rz  r  r*   r*   r	  r-   r    r  r  c                      s,   e Zd ZdZd fddZdd
dZ  ZS )PseudoColumnz
    Represents a pseudo column (a "column" which yields a value when selected
    but is not actually a real table column).
    r  rI   r'   rC   c                   s   t  jd d || _d S r3  r  )r,   r  r	  r*   r-   rG     ra  zPseudoColumn.__init__r   r   c                 K  r  r)   )r  r   r*   r*   r-   r     r   zPseudoColumn.get_sql)r  rI   r'   rC   r   )r;   r<   r=   r5  rG   r   r  r*   r*   r	  r-   r    s    r  c                      s.   e Zd ZdZdZd fdd	Zdd Z  ZS )	
AtTimezonez|
    Generates AT TIME ZONE SQL.
    Examples:
        AT TIME ZONE 'US/Eastern'
        AT TIME ZONE INTERVAL '-06:00'
    NFc                   s4   t  | t|tst|n|| _|| _|| _d S r)   )r  rG   r2   rR   r  zoneinterval)r,   r  r  r  rA   r	  r*   r-   rG     s   
zAtTimezone.__init__c                 K  s>   dj | jjdi || jrdnd| jd}t|| jfi |S )Nz&{name} AT TIME ZONE {interval}'{zone}'z	INTERVAL rL  )r  r  r  r*   )r3  r  r   r  r  r   rA   r  r*   r*   r-   r     s   zAtTimezone.get_sql)FN)r;   r<   r=   r5  r>   rG   r   r  r*   r*   r	  r-   r    s
    r  )r   rd   r'   rI   )i
__future__r   rE  r  sysrP  collections.abcr   r   r   r   r   r   r	   enumr
   typingr   r   r   r   pypika.enumsr   r   r   r   r   r   r   r   pypika.utilsr   r   r   r   r   r   r   version_infotyping_extensionsr    r  r!   r"   r#   
__author__	__email__r$   r%   r@   r   r  r  r  r(  r*  r/  r7  r8  r9  r   r]   r_  rf   r  r  rX   r  r  r  rR   r  r  r\   rZ   r  r  ro   r   r  r  r   r   r}   r   rs   rz   r  r   r2  rv   r   rI  rL  rb  rl  r|  r~  r  r  r   r   r  r  r  r*   r*   r*   r-   <module>   s    ($


 


:?		+3	!:75
!!tH0P<3h