
    Jia                       S SK Jr  S SKrS SKrS SKrS SKrS SKJrJrJ	r	J
r
  S SKJrJrJr  S SKJr  S SKJrJrJrJr  S SKJrJrJrJrJrJrJrJr  S SKJrJ r J!r!J"r"J#r#J$r$J%r%  \(       a'  \RL                  S	:  a  S S
K'J(r(  OS S
KJ(r(  S SK)J*r*J+r+J,r,  Sr-Sr.\" SSS9r/ " S S5      r0 " S S\05      r1SS jr2SS jr3 " S S\15      r4 " S S\45      r5 " S S\45      r6 " S S\55      r7 " S S\55      r8 " S  S!\55      r9 " S" S#\65      r: " S$ S%\65      r; " S& S'\15      r< " S( S)\15      r= " S* S+\=5      r> " S, S-\15      r? " S. S/\15      r@ " S0 S1\15      rA " S2 S3\A5      rB " S4 S5\A5      rC " S6 S7\15      rD " S8 S9\D5      rE " S: S;\D\?5      rF " S< S=\15      rG " S> S?\F5      rH " S@ SA\D5      rI " SB SC\I5      rJ " SD SE\I5      rK " SF SG\D5      rL " SH SI\D5      rM " SJ SK\D5      rN " SL SM\D5      rO " SN SO\D5      rP " SP SQ\P5      rQ " SR SS\P5      rR " ST SU\D5      rS " SV SW\D5      rT " SX SY\D5      rU " SZ S[\U5      rV " S\ S]\M5      rW " S^ S_\15      rX " S` Sa\D5      rY " Sb Sc\D5      rZ " Sd Se\D5      r[ " Sf Sg5      r\ " Sh Si\D5      r] " Sj Sk\]5      r^ " Sl Sm\^5      r_\" SnSoS9r` " Sp Sq\_5      ra " Sr Ss\_5      rb " St Su\15      rc " Sv Sw\]5      rd " Sx Sy\]5      re " Sz S{\]5      rf " S| S}\15      rg " S~ S\15      rhg)    )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                  ,    \ rS rSrSrSS jrSS jrSrg)r&   &   Nc              #     #    U v   g 7fN selfs    N/var/www/html/dynamic-report/venv/lib/python3.13/site-packages/pypika/terms.pynodes_Node.nodes_)   s
     
s   c                r    U R                  5        Vs/ s H  n[        X!5      (       d  M  UPM     sn$ s  snf r+   )r0   
isinstance)r.   typenodes      r/   find_
Node.find_,   s'    !%I*T2HIIIs   44r,   returnzIterator[NodeT])r4   ztype[NodeT]r9   zlist[NodeT])__name__
__module____qualname____firstlineno__is_aggregater0   r6   __static_attributes__r,       r/   r&   r&   &   s    LJr@   c                     \ rS rSrSrSDSES jjr\SFS j5       r\SGS j5       r	SHS jr
\ SD   SIS jj5       r\ SD   SJS	 jj5       rSKS
 jrSLS jrSMS jrSNS jrSOS jrSPS jrSQS jrSLS jrSLS jrSLS jrSLS jrSLS jrSRS jrSRS jrSRS jrSRS jrSRS jrSRS jrSSS jr SSS jr!STS jr"SUS jr#SRS  jr$SVS! jr%SWS" jr&SWS# jr'SSS$ jr(SNS% jr)SXS& jr*SXS' jr+SNS( jr,SYS) jr-SZS* jr.SXS+ jr/SXS, jr0SXS- jr1SXS. jr2S[S/ jr3S\S0 jr4SXS1 jr5SXS2 jr6SXS3 jr7SXS4 jr8SXS5 jr9SXS6 jr:SXS7 jr;SXS8 jr<SLS9 jr=SLS: jr>SLS; jr?SLS< jr@SLS= jrASLS> jrBS]S? jrCS^S@ jrDS_SA jrES`SB jrFSCrGg)aTerm0   FNc                    Xl         g r+   aliasr.   rF   s     r/   __init__Term.__init__3   s    
r@   c                    Xl         g r+   rE   rG   s     r/   as_Term.as_6   s    
r@   c                B    SSK Jn  [        U R                  U5      5      $ )Nr   r$   )pypikar$   setr6   )r.   r$   s     r/   tables_Term.tables_:   s     4::e$%%r@   c                >    [        U R                  [        5      5      $ r+   )rP   r6   Fieldr-   s    r/   fields_Term.fields_@   s    4::e$%%r@   c                    [        U [        5      (       a  U $ U c
  [        5       $ [        U [        5      (       a  [	        U 6 $ [        U [
        5      (       a  [        U 6 $ U=(       d    [        nU" U 5      $ )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.

)r3   r&   	NullValuelistArraytupleTupleValueWrapper)valwrapper_clss     r/   wrap_constantTerm.wrap_constantC   sh    & c4  J;;c4  #;c5!!#; "1\3r@   c                    SSK Jn  [        U [        U45      (       a  U $ U c
  [	        5       $ [        U [
        [        [        45      (       a  U=(       d    [        nU" U 5      $ [        U 5      $ )N   )r"   )
queriesr"   r3   rB   rX   strintboolr]   JSON)r^   r_   r"   s      r/   	wrap_jsonTerm.wrap_jsonc   s^     	*cD,/00J;;cCd+,,%5Ks##Cyr@   c                    U $ )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.   current_table	new_tables      r/   replace_tableTerm.replace_tables   s	     r@   c                
    X:H  $ r+   r,   r.   others     r/   eqTerm.eq   
    }r@   c                    [        U 5      $ r+   )NullCriterionr-   s    r/   isnullTerm.isnull   s    T""r@   c                >    U R                  5       R                  5       $ r+   )ry   negater-   s    r/   notnullTerm.notnull   s    {{}##%%r@   c                    [        U 5      $ r+   )NotNullCriterionr-   s    r/   	isnotnullTerm.isnotnull   s    %%r@   c                6    [        X R                  U5      5      $ r+   )BitwiseAndCriterionr`   r.   values     r/   
bitwiseandTerm.bitwiseand   s    "4););E)BCCr@   c                6    [        X R                  U5      5      $ r+   )BitwiseOrCriterionr`   r   s     r/   	bitwiseorTerm.bitwiseor   s    !$(:(:5(ABBr@   c                
    X:  $ r+   r,   rr   s     r/   gtTerm.gt   
    |r@   c                
    X:  $ r+   r,   rr   s     r/   gteTerm.gte   rv   r@   c                
    X:  $ r+   r,   rr   s     r/   ltTerm.lt   r   r@   c                
    X:*  $ r+   r,   rr   s     r/   lteTerm.lte   rv   r@   c                
    X:g  $ r+   r,   rr   s     r/   neTerm.ne   rv   r@   c                T    [        [        R                  X R                  U5      5      $ r+   )BasicCriterionr   globr`   r.   exprs     r/   r   	Term.glob       hmmT3E3Ed3KLLr@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   liker`   r   s     r/   r   	Term.like   r   r@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   not_liker`   r   s     r/   r   Term.not_like   s     h//7I7I$7OPPr@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   iliker`   r   s     r/   r   
Term.ilike       hnnd4F4Ft4LMMr@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   	not_iliker`   r   s     r/   r   Term.not_ilike   s     h00$8J8J48PQQr@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   rliker`   r   s     r/   r   
Term.rlike   r   r@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   regexr`   r.   patterns     r/   r   
Term.regex   s    hnnd4F4Fw4OPPr@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   regexpr`   r   s     r/   r   Term.regexp   s    hoot5G5G5PQQr@   c                V    [        X R                  U5      U R                  U5      5      $ r+   )BetweenCriterionr`   r.   loweruppers      r/   betweenTerm.between   s&    &8&8&?ASASTYAZ[[r@   c                V    [        X R                  U5      U R                  U5      5      $ r+   )PeriodCriterionr`   )r.   startends      r/   from_toTerm.from_to   s&    t%7%7%>@R@RSV@WXXr@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   as_ofr`   r   s     r/   r   
Term.as_of   r   r@   c                    [        U 5      $ r+   )Allr-   s    r/   all_	Term.all_       4yr@   c                    [        U[        [        [        [        45      (       a1  [        U [        U Vs/ s H  o R                  U5      PM     sn6 5      $ [        X5      $ s  snf r+   )r3   rY   r[   rP   	frozensetContainsCriterionr\   r`   )r.   argr   s      r/   isin	Term.isin   sW    cD%i899$T5Z]2^Z]QV3E3Ee3LZ]2^+_`` ++ 3_s   A"c                @    U R                  U5      R                  5       $ r+   )r   r|   r.   r   s     r/   notin
Term.notin   s    yy~$$&&r@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   	bin_regexr`   r   s     r/   r   Term.bin_regex   s     h00$8J8J78STTr@   c                    [        U 5      $ r+   Notr-   s    r/   r|   Term.negate   r   r@   c                
    X-  $ r+   r,   rr   s     r/   lshiftTerm.lshift   rv   r@   c                
    X-	  $ r+   r,   rr   s     r/   rshiftTerm.rshift   rv   r@   c                    [        U 5      $ r+   r   r-   s    r/   
__invert__Term.__invert__   r   r@   c                    U $ r+   r,   r-   s    r/   __pos__Term.__pos__       r@   c                    [        U 5      $ r+   )Negativer-   s    r/   __neg__Term.__neg__   s    ~r@   c                T    [        [        R                  X R                  U5      5      $ r+   ArithmeticExpressionr   addr`   rr   s     r/   __add__Term.__add__       #JNND:L:LU:STTr@   c                T    [        [        R                  X R                  U5      5      $ r+   r   r   subr`   rr   s     r/   __sub__Term.__sub__   r   r@   c                T    [        [        R                  X R                  U5      5      $ r+   r   r   mulr`   rr   s     r/   __mul__Term.__mul__   r   r@   c                T    [        [        R                  X R                  U5      5      $ r+   r   r   divr`   rr   s     r/   __truediv__Term.__truediv__   r   r@   c                    [        X5      $ r+   )Powrr   s     r/   __pow__Term.__pow__       4r@   c                    [        X5      $ r+   )Modrr   s     r/   __mod__Term.__mod__   r  r@   c                V    [        [        R                  U R                  U5      U 5      $ r+   r   rr   s     r/   __radd__Term.__radd__        #JNND4F4Fu4MtTTr@   c                V    [        [        R                  U R                  U5      U 5      $ r+   r   rr   s     r/   __rsub__Term.__rsub__   r  r@   c                V    [        [        R                  U R                  U5      U 5      $ r+   r   rr   s     r/   __rmul__Term.__rmul__   r  r@   c                V    [        [        R                  U R                  U5      U 5      $ r+   r  rr   s     r/   __rtruediv__Term.__rtruediv__   r  r@   c                T    [        [        R                  X R                  U5      5      $ r+   r   r   r   r`   rr   s     r/   
__lshift__Term.__lshift__  !    #J$5$5t=O=OPU=VWWr@   c                T    [        [        R                  X R                  U5      5      $ r+   r   r   r   r`   rr   s     r/   
__rshift__Term.__rshift__  r#  r@   c                V    [        [        R                  U R                  U5      U 5      $ r+   r   rr   s     r/   __rlshift__Term.__rlshift__  #    #J$5$5t7I7I%7PRVWWr@   c                V    [        [        R                  U R                  U5      U 5      $ r+   r%  rr   s     r/   __rrshift__Term.__rrshift__
  r+  r@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   rt   r`   rr   s     r/   __eq__Term.__eq__      hkk41C1CE1JKKr@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   r   r`   rr   s     r/   __ne__Term.__ne__  r2  r@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   r   r`   rr   s     r/   __gt__Term.__gt__  r2  r@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   r   r`   rr   s     r/   __ge__Term.__ge__      hllD2D2DU2KLLr@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   r   r`   rr   s     r/   __lt__Term.__lt__  r2  r@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   r   r`   rr   s     r/   __le__Term.__le__  r<  r@   c                    [        U[        5      (       d  [        S5      eU R                  UR                  UR
                  5      $ )Nz"Field' object is not subscriptable)r3   slice	TypeErrorr   r   stop)r.   items     r/   __getitem__Term.__getitem__  s4    $&&@AA||DJJ		22r@   c                "    U R                  SSS9$ )N"'
quote_charsecondary_quote_charget_sqlr-   s    r/   __str__Term.__str__$  s    ||s|EEr@   c                4    [        U R                  SSS95      $ )NT)
with_aliaswith_namespace)hashrQ  r-   s    r/   __hash__Term.__hash__'  s    DLLDLFGGr@   c                    [        5       er+   NotImplementedErrorr.   kwargss     r/   rQ  Term.get_sql*      !##r@   rE   r+   rF   
str | Noner9   None)rF   re   r9   rc  )r9   z
set[Table]r9   z
set[Field])r_   ztype[Term] | Noner9   z@ValueError | NodeT | LiteralValue | Array | Tuple | ValueWrapper)r^   z-Term | QueryBuilder | None | str | int | boolr9   z5Term | QueryBuilder | NullValue | ValueWrapper | JSON)rm   Table | Nonern   re  r9   rB   rs   r   r9   r   )r9   rx   )r9   r   )r9   r   )r   rf   r9   r   )r   rf   r9   r   )r   re   r9   r   )r   re   r9   r   )r   r   r   r   r9   r   )r   r   r   r   r9   r   )r9   r   )r   z%list | tuple | set | frozenset | Termr9   r   )rs   r   r9   r   )r9   rB   )r9   r   )rs   r   r9   r
  )rs   r   r9   r  )rG  rD  r9   r   r9   re   )r9   rf   r^  r   r9   re   )Hr:   r;   r<   r=   r>   rH   r   rK   propertyrQ   rU   staticmethodr`   ri   ro   rt   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r|   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r!  r&  r)  r-  r0  r4  r7  r:  r>  rA  rH  rR  rX  rQ  r?   r,   r@   r/   rB   rB   0   s   L   & &
& .2 + 	I   > HL:	> #&&DCMMQNRNQR\YN,
'UUUUU  UUUUXXXXLLLMLM3
FH$r@   rB   c                    [        U S-   5      $ Nrc   re   idxs    r/   idx_placeholder_genrp  .  s    sQw<r@   c                    SU S-    3$ )Nparamrc   r,   rn  s    r/   named_placeholder_genrs  2  s    37)r@   c                  ^   ^  \ rS rSrSrS	U 4S jjr\S 5       rS
S jrSS jr	SS jr
SrU =r$ )	Parameteri6  Nc                .   > [         TU ]  5         Xl        g r+   )superrH   _placeholderr.   placeholder	__class__s     r/   rH   Parameter.__init__9  s    'r@   c                    U R                   $ r+   rx  r-   s    r/   rz  Parameter.placeholder=  s       r@   c                ,    [        U R                  5      $ r+   )re   rz  r]  s     r/   rQ  Parameter.get_sqlA  s    4##$$r@   c                    g r+   r,   )r.   	param_keyparam_valuer^  s       r/   update_parametersParameter.update_parametersD      r@   c                    U$ r+   r,   r.   rz  r^  s      r/   get_param_keyParameter.get_param_keyG  s    r@   r~  )rz  	str | intr9   rc  rh  )r  r   r  r   rz  r   )r:   r;   r<   r=   r>   rH   ri  rz  rQ  r  r  r?   __classcell__r{  s   @r/   ru  ru  6  s5    L( ! !% r@   ru  c                  V   ^  \ rS rSr\4SU 4S jjjr\SS j5       rS rS	S jr	Sr
U =r$ )
ListParameteriK  c                >   > [         TU ]  US9  [        5       U l        g Nrz  )rw  rH   rY   _parametersry  s     r/   rH   ListParameter.__init__L      [16r@   c                    [        U R                  5      (       a$  U R                  [        U R                  5      5      $ [	        U R                  5      $ r+   callablerx  lenr  re   r-   s    r/   rz  ListParameter.placeholderP  @    D%%&&$$S)9)9%:;;4$$%%r@   c                    U R                   $ r+   r  r]  s     r/   get_parametersListParameter.get_parametersW      r@   c                :    U R                   R                  U5        g r+   )r  appendr.   r   r^  s      r/   r  ListParameter.update_parametersZ  s    &r@   r  rz  z str | int | Callable[[int], str]r9   rc  rg  r   r   )r:   r;   r<   r=   rp  rH   ri  rz  r  r  r?   r  r  s   @r/   r  r  K  s3    GZ " " & & ' 'r@   r  c                  `   ^  \ rS rSr\4SU 4S jjjr\S	S j5       rS rS
S jr	SS jr
SrU =r$ )DictParameteri^  c                >   > [         TU ]  US9  [        5       U l        g r  )rw  rH   dictr  ry  s     r/   rH   DictParameter.__init___  r  r@   c                    [        U R                  5      (       a$  U R                  [        U R                  5      5      $ [	        U R                  5      $ r+   r  r-   s    r/   rz  DictParameter.placeholderc  r  r@   c                    U R                   $ r+   r  r]  s     r/   r  DictParameter.get_parametersj  r  r@   c                    USS  $ rl  r,   r  s      r/   r  DictParameter.get_param_keym  s    12r@   c                     X R                   U'   g r+   r  )r.   r  r   r^  s       r/   r  DictParameter.update_parametersp  s    &+#r@   r  r  rg  r  )r  r   r   r   )r:   r;   r<   r=   rs  rH   ri  rz  r  r  r  r?   r  r  s   @r/   r  r  ^  s8    G\ " " & & , ,r@   r  c                      \ rS rSrS rSrg)QmarkParameterit  c                    g)N?r,   r]  s     r/   rQ  QmarkParameter.get_sqlu  s    r@   r,   Nr:   r;   r<   r=   rQ  r?   r,   r@   r/   r  r  t  s    r@   r  c                  "    \ rS rSrSrSS jrSrg)NumericParameteriy  z0Numeric, positional style, e.g. ...WHERE name=:1c                4    SR                  U R                  S9$ Nz:{placeholder}r  formatrz  r]  s     r/   rQ  NumericParameter.get_sql|      &&43C3C&DDr@   r,   Nrh  r:   r;   r<   r=   __doc__rQ  r?   r,   r@   r/   r  r  y  s    :Er@   r  c                  "    \ rS rSrSrSS jrSrg)FormatParameteri  z1ANSI C printf format codes, e.g. ...WHERE name=%sc                    g)Nz%sr,   r]  s     r/   rQ  FormatParameter.get_sql  s    r@   r,   Nrh  r  r,   r@   r/   r  r    s
    ;r@   r  c                  "    \ rS rSrSrSS jrSrg)NamedParameteri  z%Named style, e.g. ...WHERE name=:namec                4    SR                  U R                  S9$ r  r  r]  s     r/   rQ  NamedParameter.get_sql  r  r@   r,   Nrh  r  r,   r@   r/   r  r    s    /Er@   r  c                  ,    \ rS rSrSrSS jrSS jrSrg)	PyformatParameteri  z9Python extended format codes, e.g. ...WHERE name=%(name)sc                4    SR                  U R                  S9$ )Nz%({placeholder})sr  r  r]  s     r/   rQ  PyformatParameter.get_sql  s    "))d6F6F)GGr@   c                    USS $ )N   r,   r  s      r/   r  PyformatParameter.get_param_key  s    1R  r@   r,   Nrh  r  )r:   r;   r<   r=   r  rQ  r  r?   r,   r@   r/   r  r    s    CH!r@   r  c                  J   ^  \ rS rSrSU 4S jjr\SS j5       rSS jrSrU =r	$ )	r   i  c                .   > [         TU ]  5         Xl        g r+   rw  rH   termr.   r  r{  s     r/   rH   Negative.__init__  s    	r@   c                .    U R                   R                  $ r+   r  r>   r-   s    r/   r>   Negative.is_aggregate      yy%%%r@   c                T    SR                  U R                  R                  " S0 UD6S9$ )Nz-{term}r  r,   )r  r  rQ  r]  s     r/   rQ  Negative.get_sql  s(    TYY%6%6%@%@AAr@   r  )r  rB   r9   rc  r9   zbool | Nonerh  )
r:   r;   r<   r=   rH   ri  r>   rQ  r?   r  r  s   @r/   r   r     s(     & &B Br@   r   c                     ^  \ rS rSrSrS	S
U 4S jjjrSS jr\SS j5       rSS jr	   S         SS jjr
SrU =r$ )r]   i  Nc                0   > [         TU ]  U5        Xl        g r+   rw  rH   r   r.   r   rF   r{  s      r/   rH   ValueWrapper.__init__      
r@   c                <    U R                   " U R                  40 UD6$ r+   )get_formatted_valuer   r]  s     r/   get_value_sqlValueWrapper.get_value_sql  s    ''

=f==r@   c                   UR                  S5      =(       d    Sn[        U[        5      (       a  UR                  " S0 UD6$ [        U[        5      (       a  U R
                  " UR                  40 UD6$ [        U[        [        [        45      (       a!  U R
                  " UR                  5       40 UD6$ [        U[        5      (       a  [        X5      $ [        U[        5      (       a  [        R                  [        U5      5      $ [        U[        R                   5      (       a  U R
                  " [        U5      40 UD6$ Uc  g[        U5      $ )NrO   nullr,   )getr3   rB   rQ  r   r  r   r   r	   r
   	isoformatre   r   rg   r   uuidUUID)clsr   r^  rN  s       r/   r   ValueWrapper.get_formatted_value  s   ZZ 67=2
eT""==*6**eT""**5;;A&AAedHd344**5??+<GGGeS!! 33eT""99SZ((eTYY''**3u:@@@=5zr@   c                J    UR                   " S0 UD6nUR                  US9nX44$ Nr  r,   )rQ  r  r.   	parameterr^  	param_sqlr  s        r/   _get_param_dataValueWrapper._get_param_data  s1    %%//	++	+B	##r@   c                n   Uc,  U R                   " SXS.UD6n[        XPR                  4SU0UD6$ [        U R                  [
        [        45      (       a  U R                  nOU R                   " SSU0UD6nU R                  " U40 UD6u  pxUR                  " SXS.UD6  [        XpR                  4SU0UD6$ )NrM  rN  )r  r   r,   )	r  r   rF   r3   r   rf   floatr  r  )	r.   rN  rO  r  r^  sql	value_sqlr  r  s	            r/   rQ  ValueWrapper.get_sql  s     $$p
piopC#CU
UfUU djj3,//

I**KjKFKI#33IHH	##SiSFS	::W*WPVWWr@   r   r+   r   r   rF   rb  r9   rc  rh  r  r  ru  r9   ztuple[str, str])NrL  N)
rN  rb  rO  re   r  ru  r^  r   r9   re   )r:   r;   r<   r=   r>   rH   r  classmethodr  r  rQ  r?   r  r  s   @r/   r]   r]     s|    L >  &$ "&$'#	XX "X 	X
 X 
X Xr@   r]   c                  :   ^  \ rS rSrSSU 4S jjjrSS jrSrU =r$ )ParameterValueWrapperi  c                0   > [         TU ]  X#5        Xl        g r+   )rw  rH   
_parameter)r.   r  r   rF   r{  s       r/   rH   ParameterValueWrapper.__init__  s    &#r@   c                r    U R                   R                  " S0 UD6nU R                   R                  US9nX44$ r  )r
  rQ  r  r  s        r/   r  %ParameterValueWrapper._get_param_data  s9    OO++5f5	OO11i1H	##r@   )r
  r+   )r  ru  r   r   rF   rb  r9   rc  r  )r:   r;   r<   r=   rH   r  r?   r  r  s   @r/   r  r    s    $ $$ $r@   r  c                     ^  \ rS rSr% SrS\S'   SSU 4S jjjrSS jrSS jrSS jr	\
SSS	 jj5       rSSS
 jjrSS jrSS jrSS jrSS jrS S jrS S jrS S jrS!S jrS!S jrSrU =r$ )"rh   i  Nstr | Selectable | Nonetablec                0   > [         TU ]  U5        Xl        g r+   r  r  s      r/   rH   JSON.__init__  r  r@   c                   [        U[        5      (       a  U R                  " U40 UD6$ [        U[        5      (       a  U R                  " U40 UD6$ [        U[
        5      (       a  U R                  " U40 UD6$ [        U5      $ r+   )r3   r  _get_dict_sqlrY   _get_list_sqlre   _get_str_sqlr  s      r/   _recursive_get_sqlJSON._recursive_get_sql  su    eT""%%e6v66eT""%%e6v66eS!!$$U5f555zr@   c                    UR                  5        VVs/ s H7  u  p4SR                  U R                  " U40 UD6U R                  " U40 UD6S9PM9     nnnSR                  SSR                  U5      S/5      $ s  snnf )Nz{key}:{value})keyr   r  {,})itemsr  r  join)r.   r   r^  kvpairss         r/   r  JSON._get_dict_sql  s     
% ""t'>'>q'KF'KSWSjSjklSwpvSw"x% 	 
 wwSXXe_c233	
s   >A8c                    U Vs/ s H  o0R                   " U40 UD6PM     nnSR                  SSR                  U5      S/5      $ s  snf )Nr  [r  ])r  r  )r.   r   r^  r!  r"  s        r/   r  JSON._get_list_sql  sH    ?DEu!((5f5uEwwSXXe_c233 Fs   Ac                    [        X5      $ r+   )r   )r   rN  r^  s      r/   r  JSON._get_str_sql  s    U//r@   c                x    [        U R                  U R                  5      U5      n[        X0R                  40 UD6$ r+   )r   r  r   r   rF   )r.   rO  r^  r   s       r/   rQ  JSON.get_sql
  s2    D33DJJ?AUVZZ:6::r@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   GET_JSON_VALUEr`   r.   key_or_indexs     r/   get_json_valueJSON.get_json_value  !    m::DBTBTUaBbccr@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   GET_TEXT_VALUEr`   r.  s     r/   get_text_valueJSON.get_text_value  r2  r@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   GET_PATH_JSON_VALUEri   r.   	path_jsons     r/   get_path_json_valueJSON.get_path_json_value      m??~~V_G`aar@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   GET_PATH_TEXT_VALUEri   r9  s     r/   get_path_text_valueJSON.get_path_text_value  r=  r@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   HAS_KEYri   rr   s     r/   has_keyJSON.has_key  s    m33T>>%;PQQr@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   CONTAINSri   rr   s     r/   containsJSON.contains  s    m44dNN5<QRRr@   c                T    [        [        R                  X R                  U5      5      $ r+   )r   r   CONTAINED_BYri   rr   s     r/   contained_byJSON.contained_by   s    m88$u@UVVr@   c                D    [        [        R                  U [        U6 5      $ r+   )r   r   HAS_KEYSrZ   rr   s     r/   has_keysJSON.has_keys#  s    m44dE5MJJr@   c                D    [        [        R                  U [        U6 5      $ r+   )r   r   HAS_ANY_KEYSrZ   rr   s     r/   has_any_keysJSON.has_any_keys&  s    m88$uNNr@   r  NNr  )r   r   r^  r   r9   re   )r   r  r^  r   r9   re   )r   rY   r^  r   r9   re   )rK  )r   re   rN  re   r^  r   r9   re   )rL  )rO  re   r^  r   r9   re   )r/  r  r9   r   )r:  re   r9   r   rf  )rs   r   r9   r   )r:   r;   r<   r=   r  __annotations__rH   r  r  r  rj  r  rQ  r0  r5  r;  r@  rD  rH  rL  rP  rT  r?   r  r  s   @r/   rh   rh     s|    %)E") 44 0 0;ddbbRSWKO Or@   rh   c                  :   ^  \ rS rSrSU 4S jjrSSS jjrSrU =r$ )Valuesi*  c                ~   > [         TU ]  S 5        [        U[        5      (       d  [        U5      U l        g UU l        g r+   )rw  rH   r3   rT   field)r.   r[  r{  s     r/   rH   Values.__init__+  s-    )3E5)A)AU5\
u
r@   c                X    SR                  U R                  R                  " SSU0UD6S9$ )NzVALUES({value})rN  r  r,   )r  r[  rQ  r.   rN  r^  s      r/   rQ  Values.get_sql/  s.     ''djj.@.@.aJ.aZ`.a'bbr@   )r[  )r[  zstr | Fieldr9   rc  r+   rN  rb  r^  r   r9   re   r:   r;   r<   r=   rH   rQ  r?   r  r  s   @r/   rY  rY  *  s    Mc cr@   rY  c                  :   ^  \ rS rSrSSU 4S jjjrSS jrSrU =r$ )LiteralValuei3  c                0   > [         TU ]  U5        Xl        g r+   )rw  rH   _valuer  s      r/   rH   LiteralValue.__init__4  s    r@   c                D    [        U R                  U R                  40 UD6$ r+   )r   re  rF   r]  s     r/   rQ  LiteralValue.get_sql8  s    TZZB6BBr@   )re  r+   ra  rh  ra  r  s   @r/   rc  rc  3  s     C Cr@   rc  c                  0   ^  \ rS rSrSSU 4S jjjrSrU =r$ )rX   i<  c                &   > [         TU ]  SU5        g )Nr  rw  rH   r.   rF   r{  s     r/   rH   NullValue.__init__=  s    'r@   r,   r+   ra  r:   r;   r<   r=   rH   r?   r  r  s   @r/   rX   rX   <  s    ( (r@   rX   c                  0   ^  \ rS rSrSSU 4S jjjrSrU =r$ )SystemTimeValueiA  c                &   > [         TU ]  SU5        g )NSYSTEM_TIMErk  rl  s     r/   rH   SystemTimeValue.__init__B  s    .r@   r,   r+   ra  rn  r  s   @r/   rp  rp  A  s    / /r@   rp  c                      \ rS rSr\SS j5       r\SS j5       rSS jrSS jrSS jrSS jr\	SSS	 jj5       r
\	SSS
 jj5       rSS jrSrg)	CriterioniF  c                    g r+   r,   r.   
comparatorrs   s      r/   _compareCriterion._compareG  s    ORr@   c                    g r+   r,   rw  s      r/   ry  rz  J  s    PSr@   c                H    [        U[        5      (       a  U $ [        XU5      $ r+   )r3   EmptyCriterionComplexCriterionrw  s      r/   ry  rz  M  s!    e^,,K
%88r@   c                B    U R                  [        R                  U5      $ r+   )ry  r   and_rr   s     r/   __and__Criterion.__and__R      }}W\\511r@   c                B    U R                  [        R                  U5      $ r+   )ry  r   or_rr   s     r/   __or__Criterion.__or__U  s    }}W[[%00r@   c                B    U R                  [        R                  U5      $ r+   )ry  r   xor_rr   s     r/   __xor__Criterion.__xor__X  r  r@   r,   c                4    [        5       nU  H  nX-  nM	     U$ r+   r}  termscritr  s      r/   anyCriterion.any[  "    DLD  r@   c                4    [        5       nU  H  nX-  nM	     U$ r+   r  r  s      r/   allCriterion.alld  r  r@   c                    [        5       er+   r[  r-   s    r/   rQ  Criterion.get_sqlm  r`  r@   N)rx  r   rs   r}  r9   r!   )rx  r   rs   r   r9   r~  )rx  r   rs   r   r9   Self | ComplexCriterion)rs   r   r9   r  )r,   )r  zIterable[Term]r9   z(EmptyCriterion | Term | ComplexCriterion)r  zIterable[Any]r9   z'EmptyCriterion | Any | ComplexCriterionrg  )r:   r;   r<   r=   r   ry  r  r  r  rj  r  r  rQ  r?   r,   r@   r/   ru  ru  F  s_    R RS S9
212    $r@   ru  c                  X    \ rS rSrSr\" 5       rS	S jrS
S jrS
S jr	S
S jr
SS jrSrg)r}  iq  Nc                    [        5       $ r+   )rP   r-   s    r/   rU   EmptyCriterion.fields_u  s	    ur@   c                    U$ r+   r,   rr   s     r/   r  EmptyCriterion.__and__x      r@   c                    U$ r+   r,   rr   s     r/   r  EmptyCriterion.__or__{  r  r@   c                    U$ r+   r,   rr   s     r/   r  EmptyCriterion.__xor__~  r  r@   c                    U $ r+   r,   r-   s    r/   r   EmptyCriterion.__invert__  r   r@   r,   rd  )rs   r   r9   r   )r9   r   )r:   r;   r<   r=   r>   rP   rQ   rU   r  r  r  r   r?   r,   r@   r/   r}  r}  q  s'    LeGr@   r}  c                  X   ^  \ rS rSrSSU 4S jjjrS	S jr\S
S j5       rSS jrSr	U =r
$ )rT   i  c                ~   > [         TU ]  US9  Xl        [        U[        5      (       a  SSKJn  U" U5      nX0l        g )NrE   r   rN   )rw  rH   namer3   re   pypika.queriesr$   r  )r.   r  rF   r  r$   r{  s        r/   rH   Field.__init__  s6    u%	eS!!,%LE.3
r@   c              #  x   #    U v   U R                   b#  U R                   R                  5        S h  vN   g g  N7fr+   r  r0   r-   s    r/   r0   Field.nodes_  2     
::!zz((*** "*   /:8:c                T    U R                   U:X  a  X l         gU R                   U l         ga  
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   s      r/   ro   Field.replace_table  s     #'**"=Y
4::
r@   c                   UR                  SS5      nUR                  SS5      nUR                  SS 5      n[        U R                  U5      nU R                  (       aU  U(       d  U R                  R                  (       a3  U R                  R                  5       nSR                  [        Xd5      US9n[        U SS 5      nU(       a  [        XW4SU0UD6$ U$ )NrU  FrV  rN  z{namespace}.{name})	namespacer  rF   )	popr   r  r  rF   get_table_namer  getattrr   )r.   r^  rU  rV  rN  	field_sql
table_namefield_aliass           r/   rQ  Field.get_sql  s    ZZe4
$4e<ZZd3
!$))Z8	 ::>TZZ-=-=224J,33'
? 4 I
 dGT2#I\z\U[\\r@   )r  r  rV  )r  re   rF   rb  r  r  r9   rc  r8   rm   re  rn   re  r9   rc  rh  r:   r;   r<   r=   rH   r0   r   ro   rQ  r?   r  r  s   @r/   rT   rT     s2    4 4+
 N N r@   rT   c                  >   ^  \ rS rSrSSU 4S jjjrSSS jjrSrU =r$ )Indexi  c                0   > [         TU ]  U5        Xl        g r+   rw  rH   r  )r.   r  rF   r{  s      r/   rH   Index.__init__      	r@   c                .    [        U R                  U5      $ r+   )r   r  r^  s      r/   rQ  Index.get_sql  s    TYY
33r@   r  r+   )r  re   rF   rb  r9   rc  r`  ra  r  s   @r/   r  r    s     4 4r@   r  c                  \   ^  \ rS rSrSSU 4S jjjrSS jr S	         S
S jjrSrU =r$ )Stari  c                "   > [         TU ]  SUS9  g )N*r  rk  )r.   r  r{  s     r/   rH   Star.__init__  s    E*r@   c              #  x   #    U v   U R                   b#  U R                   R                  5        S h  vN   g g  N7fr+   r  r-   s    r/   r0   Star.nodes_  r  r  c                   U R                   (       ao  U(       d  U R                   R                  (       aM  U R                   R                  =(       d    [        U R                   S5      nSR                  [	        XS5      5      $ g)N_table_namez{}.*r  )r  rF   r  r  r   )r.   rU  rV  rN  r^  r  s         r/   rQ  Star.get_sql  sO     ::>TZZ-=-=

((NGDJJ,NI==y!EFFr@   r,   r+   )r  r  r9   rc  r8   )FFN)
rU  rg   rV  rg   rN  rb  r^  r   r9   re   	r:   r;   r<   r=   rH   r0   rQ  r?   r  r  s   @r/   r  r    sK    + ++ `d8<R\or	 r@   r  c                  h   ^  \ rS rSrSU 4S jjrS	S jrS
S jr\SS j5       r\	SS j5       r
SrU =r$ )r\   i  c                x   > [         TU ]  5         U Vs/ s H  o R                  U5      PM     snU l        g s  snf r+   )rw  rH   r`   values)r.   r  r   r{  s      r/   rH   Tuple.__init__  s0    >DEfU))%0fEEs   7c              #  n   #    U v   U R                    H  nUR                  5        S h  vN   M     g  N	7fr+   )r  r0   r   s     r/   r0   Tuple.nodes_  s*     
[[E||~%% !%   '53
5c                   ^ SR                  SR                  U4S jU R                   5       5      5      n[        X R                  40 TD6$ )N({})r  c              3  F   >#    U  H  oR                   " S0 TD6v   M     g 7fNr,   rP  .0r  r^  s     r/   	<genexpr> Tuple.get_sql.<locals>.<genexpr>  s     $T\\%;F%;   !)r  r  r  r   rF   r.   r^  r   s    ` r/   rQ  Tuple.get_sql  s8    mmCHH$T$TTUZZ:6::r@   c                j    [        U R                   Vs/ s H  oR                  PM     sn5      $ s  snf r+   )r   r  r>   )r.   r^   s     r/   r>   Tuple.is_aggregate  s'    #$M#%5%5$MNN$M   0c                n    U R                    Vs/ s H  o3R                  X5      PM     snU l         gs  snf r  )r  ro   )r.   rm   rn   r   s       r/   ro   Tuple.replace_table  s0     SWR]R]^R]**=DR]^^   2)r  )r  r   r9   rc  r8   rh  r9   rg   r  )r:   r;   r<   r=   rH   r0   rQ  ri  r>   r   ro   r?   r  r  s   @r/   r\   r\     s?    F&
; O O _ _r@   r\   c                      \ rS rSrSS jrSrg)rZ   i  c                J  ^ TR                  S5      nSR                  U4S jU R                   5       5      nSR                  U5      nU[        R
                  [        R                  4;   a"  [        U5      S:  a  SR                  U5      OSn[        X@R                  40 TD6$ )Ndialectr  c              3  F   >#    U  H  oR                   " S0 TD6v   M     g 7fr  rP  r  s     r/   r   Array.get_sql.<locals>.<genexpr>  s     I[T,,00[r  z[{}]r   z	ARRAY[{}]z'{}')
r  r  r  r  r   
POSTGRESQLREDSHIFTr  r   rF   )r.   r^  r  r  r   s    `   r/   rQ  Array.get_sql  s    **Y'IT[[IImmF#x**H,=,=>>03Fa+$$V,VCZZ:6::r@   r,   Nrh  r  r,   r@   r/   rZ   rZ     s    ;r@   rZ   c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )Bracketi  c                $   > [         TU ]  U5        g r+   rk  r  s     r/   rH   Bracket.__init__  s    r@   r,   )r  r   r9   rc  rn  r  s   @r/   r  r    s     r@   r  c                     ^  \ rS rSr S             S	U 4S jjjrS
S jr\SS j5       r\SS j5       r	SSS jjr
SrU =r$ )NestedCriterioni  c                `   > [         TU ]  U5        X0l        Xl        X l        X@l        XPl        g r+   )rw  rH   leftrx  nested_comparatorrightnested)r.   rx  r  r  r  r  rF   r{  s          r/   rH   NestedCriterion.__init__  s,     		$!2
r@   c              #     #    U v   U R                   R                  5        S h  vN   U R                  R                  5        S h  vN   U R                  R                  5        S h  vN   g  NI N) N	7fr+   )r  r0   r  r  r-   s    r/   r0   NestedCriterion.nodes_  sW     
::$$&&&99##%%%;;%%''' 	'%'3   "A4A.!A4A0!A4(A2)A40A42A4c                    [        U R                  U R                  U R                  4 Vs/ s H  oR                  PM     sn5      $ s  snf r+   )r   r  r  r  r>   r.   r  s     r/   r>   NestedCriterion.is_aggregate  s;    #DIItzz[_[f[fCg$hCg4%6%6Cg$hii$hs   Ac                    U R                   R                  X5      U l         U R                  R                  X5      U l        U R                  R                  X5      U l        ga  
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  ro   r  r  rl   s      r/   ro   NestedCriterion.replace_table!  sF     II++ME	ZZ--mG
jj..}Hr@   c                T   SR                  U R                  R                  " S0 UD6U R                  R                  U R
                  R                  " S0 UD6U R                  R                  U R                  R                  " S0 UD6S9nU(       a  [        SX0R                  S.UD6$ U$ )Nz4{left}{comparator}{right}{nested_comparator}{nested})r  rx  r  r  r  )r   rF   r,   )
r  r  rQ  rx  r   r  r  r  r   rF   r.   rU  r^  r   s       r/   rQ  NestedCriterion.get_sql1  s    DKK"",V,,,**$$.v."44::;;&&00 L 
 #H::HHH
r@   )rx  r  r  r  r  r+   )rx  r   r  r~  r  r   r  r   r  r   rF   rb  r9   rc  r8   r  r  FrU  rg   r^  r   r9   re   r:   r;   r<   r=   rH   r0   ri  r>   r   ro   rQ  r?   r  r  s   @r/   r  r    s     ! , 	
    
  ( j j I I r@   r  c                  p   ^  \ rS rSrSS	U 4S jjjrS
S jr\SS j5       r\SS j5       r	SSS jjr
SrU =r$ )r   i@  c                H   > [         TU ]  U5        Xl        X l        X0l        g)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)rw  rH   rx  r  r  )r.   rx  r  r  rF   r{  s        r/   rH   BasicCriterion.__init__A  s!     	$	
r@   c              #     #    U v   U R                   R                  5        S h  vN   U R                  R                  5        S h  vN   g  N' N7fr+   )r  r0   r  r-   s    r/   r0   BasicCriterion.nodes_T  s>     
::$$&&&99##%%% 	'%!   "AA!AAAAc                    [        U R                  U R                  4 Vs/ s H  oR                  PM     sn5      $ s  snf r+   )r   r  r  r>   r  s     r/   r>   BasicCriterion.is_aggregateY  s2    #DIItzzCZ$[CZ4%6%6CZ$[\\$[s   <c                    U R                   R                  X5      U l         U R                  R                  X5      U l        gr  r  ro   r  rl   s      r/   ro   BasicCriterion.replace_table]  0     II++ME	ZZ--mG
r@   c           	         SR                  U R                  R                  U R                  R                  " SSU0UD6U R
                  R                  " SSU0UD6S9nU(       a  [        X@R                  40 UD6$ U$ )Nz{left}{comparator}{right}rN  rx  r  r  r,   )r  rx  r   r  rQ  r  r   rF   )r.   rN  rU  r^  r   s        r/   rQ  BasicCriterion.get_sqll  sv    )00,,""CjCFC**$$E
EfE 1 

 #C>v>>
r@   r  r+   )
rx  r   r  rB   r  rB   rF   rb  r9   rc  r8   r  r  )rK  F)rN  re   rU  rg   r^  r   r9   re   r  r  s   @r/   r   r   @  sH     &&
 ] ] H H r@   r   c                     ^  \ rS rSrS	S
U 4S jjjrSS jr\SS j5       r\SS j5       r	S	SS jjr
\SS j5       rSrU =r$ )r   iw  c                J   > [         TU ]  U5        Xl        X l        SU l        g)aQ  
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)rw  rH   r  	container_is_negated)r.   r  r   rF   r{  s       r/   rH   ContainsCriterion.__init__x  s$     		" r@   c              #     #    U v   U R                   R                  5        S h  vN   U R                  R                  5        S h  vN   g  N' N7fr+   )r  r0   r   r-   s    r/   r0   ContainsCriterion.nodes_  s>     
99##%%%>>((*** 	&*r  c                .    U R                   R                  $ r+   r  r-   s    r/   r>   ContainsCriterion.is_aggregate  r  r@   c                D    U R                   R                  X5      U l         gr  r  ro   rl   s      r/   ro   ContainsCriterion.replace_table       II++ME	r@   c                    SR                  U R                  R                  " S0 UD6U R                  R                  " SSS0UD6U R                  (       a  SOSS9n[        X0R                  40 UD6$ )Nz{term} {not_}IN {container}subqueryTNOT r  )r  r   not_r,   )r  r  rQ  r   r!  r   rF   )r.   r,  r^  r   s       r/   rQ  ContainsCriterion.get_sql  si    +22"",V,nn,,EdEfE++ 3 

  ZZ:6::r@   c                    SU l         g NTr!  r-   s    r/   r|   ContainsCriterion.negate  s
    r@   )r!  r   r  r+   )r  r   r   rB   rF   rb  r9   rc  r8   r  r  )r,  r   r^  r   r9   re   )r9   r   )r:   r;   r<   r=   rH   r0   ri  r>   r   ro   rQ  r|   r?   r  r  s   @r/   r   r   w  sU    ! ! +
 & & F F;    r@   r   c                  8   ^  \ rS rSrSU 4S jjrS rS rSrU =r$ )ExistsCriterioni  c                >   > [         TU ]  U5        Xl        SU l        g NF)rw  rH   r   r!  )r.   r   rF   r{  s      r/   rH   ExistsCriterion.__init__  s    " r@   c                    SR                  U R                  R                  " S0 UD6U R                  (       a  SS9$ SS9$ )Nz{not_}EXISTS {container}r-  r  )r   r.  r,   )r  r   rQ  r!  r]  s     r/   rQ  ExistsCriterion.get_sql  sK    )00nn,,6v6tGWGWV 1 
 	
]_ 1 
 	
r@   c                    SU l         U $ r1  r2  r-   s    r/   r|   ExistsCriterion.negate  s    r@   )r!  r   r+   )	r:   r;   r<   r=   rH   rQ  r|   r?   r  r  s   @r/   r5  r5    s    !


 r@   r5  c                  N   ^  \ rS rSrSSU 4S jjjrSS jr\S	S j5       rSrU =r	$ )
RangeCriterioni  c                H   > [         TU ]  U5        Xl        X l        X0l        g r+   )rw  rH   r  r   r   )r.   r  r   r   rF   r{  s        r/   rH   RangeCriterion.__init__  s    	
r@   c              #     #    U v   U R                   R                  5        S h  vN   U R                  R                  5        S h  vN   U R                  R                  5        S h  vN   g  NI N) N	7fr+   )r  r0   r   r   r-   s    r/   r0   RangeCriterion.nodes_  sU     
99##%%%::$$&&&88??$$$ 	&&$r  c                .    U R                   R                  $ r+   r  r-   s    r/   r>   RangeCriterion.is_aggregate  r  r@   )r   r   r  r+   )
r  rB   r   r   r   r   rF   rb  r9   re   r8   r  )
r:   r;   r<   r=   rH   r0   ri  r>   r?   r  r  s   @r/   r>  r>    s&     % & &r@   r>  c                  2    \ rS rSr\SS j5       rSS jrSrg)r   i  c                D    U R                   R                  X5      U l         gr  r(  rl   s      r/   ro   BetweenCriterion.replace_table  r*  r@   c           	         SR                  U R                  R                  " S0 UD6U R                  R                  " S0 UD6U R                  R                  " S0 UD6S9n[        X R                  40 UD6$ )Nz {term} BETWEEN {start} AND {end}r  r   r   r,   r  r  rQ  r   r   r   rF   r  s      r/   rQ  BetweenCriterion.get_sql  sl    077"",V,**$$.v.  *6* 8 

  ZZ:6::r@   r  Nr  rh  )r:   r;   r<   r=   r   ro   rQ  r?   r,   r@   r/   r   r     s    F F;r@   r   c                      \ rS rSrSS jrSrg)r   i  c           	         SR                  U R                  R                  " S0 UD6U R                  R                  " S0 UD6U R                  R                  " S0 UD6S9n[        X R                  40 UD6$ )Nz{term} FROM {start} TO {end}rI  r,   rJ  r  s      r/   rQ  PeriodCriterion.get_sql  sl    ,33"",V,**$$.v.  *6* 4 

  ZZ:6::r@   r,   Nrh  r  r,   r@   r/   r   r     s    ;r@   r   c                  X   ^  \ rS rSrSSU 4S jjjrS	S jr\S
S j5       rSS jrSr	U =r
$ )r   i  c                <   > [         TU ]  U5        Xl        X l        g r+   rw  rH   r  r   r.   r  r   rF   r{  s       r/   rH   BitwiseAndCriterion.__init__      	
r@   c              #     #    U v   U R                   R                  5        S h  vN   U R                  R                  5        S h  vN   g  N' N7fr+   r  r0   r   r-   s    r/   r0   BitwiseAndCriterion.nodes_  >     
99##%%%::$$&&& 	&&r  c                D    U R                   R                  X5      U l         gr  r(  rl   s      r/   ro   !BitwiseAndCriterion.replace_table  r*  r@   c                    SR                  U R                  R                  " S0 UD6U R                  S9n[	        X R
                  40 UD6$ )Nz({term} & {value})r  r   r,   r  r  rQ  r   r   rF   r  s      r/   rQ  BitwiseAndCriterion.get_sql	  I    "))"",V,** * 
  ZZ:6::r@   r\  r+   r  rB   r   r   rF   rb  r9   rc  r8   r  rh  r  r  s   @r/   r   r     2     
'
 F F; ;r@   r   c                  X   ^  \ rS rSrSSU 4S jjjrS	S jr\S
S j5       rSS jrSr	U =r
$ )r   i  c                <   > [         TU ]  U5        Xl        X l        g r+   rQ  rR  s       r/   rH   BitwiseOrCriterion.__init__  rT  r@   c              #     #    U v   U R                   R                  5        S h  vN   U R                  R                  5        S h  vN   g  N' N7fr+   rV  r-   s    r/   r0   BitwiseOrCriterion.nodes_  rX  r  c                D    U R                   R                  X5      U l         gr  r(  rl   s      r/   ro    BitwiseOrCriterion.replace_table  r*  r@   c                    SR                  U R                  R                  " S0 UD6U R                  S9n[	        X R
                  40 UD6$ )Nz({term} | {value})r\  r,   r]  r  s      r/   rQ  BitwiseOrCriterion.get_sql*  r_  r@   r\  r+   r`  r8   r  rh  r  r  s   @r/   r   r     ra  r@   r   c                  \   ^  \ rS rSrSSU 4S jjjrS	S jr\S
S j5       rSSS jjrSr	U =r
$ )rx   i2  c                0   > [         TU ]  U5        Xl        g r+   r  r.   r  rF   r{  s      r/   rH   NullCriterion.__init__3  r  r@   c              #  \   #    U v   U R                   R                  5        S h  vN   g  N7fr+   r  r0   r-   s    r/   r0   NullCriterion.nodes_7        
99##%%%   ",*,c                D    U R                   R                  X5      U l         gr  r(  rl   s      r/   ro   NullCriterion.replace_table;  r*  r@   c                    SR                  U R                  R                  " S0 UD6S9n[        X0R                  40 UD6$ )Nz{term} IS NULLr  r,   r  r  rQ  r   rF   r
  s       r/   rQ  NullCriterion.get_sqlI  sB    %%"",V, & 
  ZZ:6::r@   r  r+   )r  rB   rF   rb  r9   rc  r8   r  r  r  r  r  s   @r/   rx   rx   2  s2     & F F; ;r@   rx   c                  "    \ rS rSrSSS jjrSrg)r   iP  c                    SR                  U R                  R                  " S0 UD6S9n[        X0R                  40 UD6$ )Nz{term} IS NOT NULLr  r,   rw  r
  s       r/   rQ  NotNullCriterion.get_sqlQ  sB    "))"",V, * 
  ZZ:6::r@   r,   Nr  r  r  r,   r@   r/   r   r   P  s    ; ;r@   r   c                  ,    \ rS rSrSSS jjrSS jrSrg)	r~  iX  c                P   SR                  U R                  R                  U R                  R                  " SSU R                  U R                  5      0UD6U R                  R                  " SSU R                  U R                  5      0UD6S9nU(       a  SR                  US9$ U$ )Nz{left} {comparator} {right}subcriterionr  z({criterion}))	criterionr,   )r  rx  r   r  rQ  needs_bracketsr  )r.   r~  r^  r   s       r/   rQ  ComplexCriterion.get_sqlY  s    +22,,""Y0C0CDII0NYRXY**$$\$2E2Edjj2Q\U[\ 3 
 "))C)88
r@   c                d    [        U[        5      =(       a    UR                  U R                  :X  + $ r+   )r3   r~  rx  r  s     r/   r  ComplexCriterion.needs_bracketse  s"    $ 01\$//T__6\\r@   r,   Nr  )r~  rg   r^  r   r9   re   )r  rB   r9   rg   )r:   r;   r<   r=   rQ  r  r?   r,   r@   r/   r~  r~  X  s    
]r@   r~  c                     ^  \ rS rSrSr\R                  \R                  /rSSU 4S jjjr	SS jr
\SS j5       r\SS j5       rSS jrSS jrSSS	 jjrS
rU =r$ )r   ii  z
Wrapper for an arithmetic function.  Can be simple with two terms or complex with nested terms. Order of operations
are also preserved.
c                H   > [         TU ]  U5        Xl        X l        X0l        g)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)rw  rH   operatorr  r  )r.   r  r  r  rF   r{  s        r/   rH   ArithmeticExpression.__init__q  s!      	 	
r@   c              #     #    U v   U R                   R                  5        S h  vN   U R                  R                  5        S h  vN   g  N' N7fr+   )r  r0   r  r-   s    r/   r0   ArithmeticExpression.nodes_  rX  r  c                l    [        U R                  R                  U R                  R                  /5      $ r+   )r   r  r>   r  r-   s    r/   r>   !ArithmeticExpression.is_aggregate  s(     $TYY%;%;TZZ=T=T$UVVr@   c                    U R                   R                  X5      U l         U R                  R                  X5      U l        ga  
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   s      r/   ro   "ArithmeticExpression.replace_table  r  r@   c                F    Uc  gXR                   ;   a  gX R                   ;   $ )z
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.
F)	add_order)r.   curr_opleft_ops      r/   left_needs_parens&ArithmeticExpression.left_needs_parens  s(     ?nn$
 ..((r@   c                z    Uc  gU[         R                  :X  a  gU[         R                  :X  a  gX R                  ;   $ )z
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.
FT)r   r   r  r  )r.   r  right_ops      r/   right_needs_parens'ArithmeticExpression.right_needs_parens  s:     jnn$jnn$
 >>))r@   c                0   U R                   U R                  4 Vs/ s H  n[        USS 5      PM     snu  pESR                  U R                  R
                  U R                  U R                  U5      (       a  SOSR                  U R                   R                  " S0 UD65      U R                  U R                  U5      (       a  SOSR                  U R                  R                  " S0 UD65      S9nU(       a  [        X`R                  40 UD6$ U$ s  snf )Nr  z{left}{operator}{right}r  z{})r  r  r  r,   )r  r  r  r  r  r   r  rQ  r  r   rF   )r.   rU  r^  sider  r  arithmetic_sqls          r/   rQ  ArithmeticExpression.get_sql  s    JN))UYU_U_I`aI`WT:t<I`a299]](( 224=='JJ&PT\\		!!+F+ "44T]]HMM6SW__

"",V, : 
 #NJJI&II bs   D)r  r  r  r+   )
r  r   r  r   r  r   rF   rb  r9   rc  r8   r  r  r  r  r  )r:   r;   r<   r=   r  r   r   r   r  rH   r0   ri  r>   r   ro   r  r  rQ  r?   r  r  s   @r/   r   r   i  sk    
 0I *'
 W W H H)**, r@   r   c                     ^  \ rS rSrS
SU 4S jjjrSS jr\SS j5       r\SS j5       r	\SS j5       r
\SS j5       rSSS jjrS	rU =r$ )Casei  c                <   > [         TU ]  US9  / U l        S U l        g NrE   )rw  rH   _cases_elserl  s     r/   rH   Case.__init__  s!    u%
r@   c              #  
  #    U v   U R                    H5  u  pUR                  5        S h  vN   UR                  5        S h  vN   M7     U R                  b#  U R                  R                  5        S h  vN   g g  NQ N; N
7fr+   )r  r0   r  r.   r  r  s      r/   r0   Case.nodes_  so     
#{{OI ''))){{}$$  + ::!zz((*** " *$ +s3   )BA=BA?2B6B7B?BBc                    [        U R                   VVs/ s H$  u  pUR                  =(       d    UR                  PM&     snnU R                  (       a  U R                  R                  /-   5      $ S /-   5      $ s  snnf r+   )r   r  r>   r  r  s      r/   r>   Case.is_aggregate  sv     $PTP[P[\P[_YY##8t'8'88P[\*.**tzz&&?@
 	
:>?@
 	
\s   +A:
c                Z    U R                   R                  XR                  U5      45        g r+   )r  r  r`   r  s      r/   when	Case.when  s"    I'9'9$'?@Ar@   c           	        U R                    VVs/ s H'  u  p4UR                  X5      UR                  X5      /PM)     snnU l         U R                  (       a!  U R                  R                  X5      U l        gSU l        gs  snnf r  )r  ro   r  )r.   rm   rn   r  r  s        r/   ro   Case.replace_table  sw    " $(;;

 $/	 ''A""=< $/
 LP::TZZ--mG
[_

s   .Bc                2    U R                  U5      U l        U $ r+   )r`   r  r  s     r/   else_
Case.else_  s    ''-
r@   c                P  ^ U R                   (       d  [        S5      eSR                  U4S jU R                    5       5      nU R                  (       a+  SR	                  U R                  R
                  " S0 TD65      OSnSU U S3nU(       a  [        XPR                  40 TD6$ U$ )	Nz:At least one 'when' case is required for a CASE statement. c           	   3     >#    U  H7  u  pS R                  UR                  " S0 TD6UR                  " S0 TD6S9v   M9     g7f)zWHEN {when} THEN {then})r  thenNr,   )r  rQ  )r  r  r  r^  s      r/   r  Case.get_sql.<locals>.<genexpr>  sH      
#.	 &,,)2C2C2Mf2MTXT`T`TjciTj,k#.s   ?Az ELSE {}r  zCASE z ENDr,   )r  r   r  r  r  rQ  r   rF   )r.   rU  r^  casesr  case_sqls     `   r/   rQ  Case.get_sql  s    {{ \]] 
#';;
 
 DH::
!!$**"4"4">v">?SU5'%-#HjjCFCCr@   )r  r  r+   ra  r8   r  )r  r   r  r   r9   rc  r  )r  r   r9   r  r  r  )r:   r;   r<   r=   rH   r0   ri  r>   r   r  ro   r  rQ  r?   r  r  s   @r/   r  r    sp     
+ 
 
 B B ` `(   r@   r  c                  l   ^  \ rS rSrSS	U 4S jjjrS
S jrSS jr\SS j5       r\	SS j5       r
SrU =r$ )r   i%  c                ,   > [         TU ]  US9  Xl        g r  r  rm  s      r/   rH   Not.__init__&      u%	r@   c              #  \   #    U v   U R                   R                  5        S h  vN   g  N7fr+   rp  r-   s    r/   r0   
Not.nodes_*  rr  rs  c                    SUS'   SR                  U R                  R                  " S0 UD6S9n[        X R                  40 UD6$ )NTr~  z
NOT {term}r  r,   rw  r  s      r/   rQ  Not.get_sql.  sE    !%~!!tyy'8'8'B6'B!CZZ:6::r@   c                z   ^ [        U R                  U5      m[        R                  " T5      (       d  T$ U4S jnU$ )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                b   > T" U /UQ70 UD6n[        U[        45      (       a  [        U5      $ U$ r+   )r3   rB   r   )
inner_selfargsr^  result	item_funcs       r/   innerNot.__getattr__.<locals>.inner>  s5    z;D;F;F&4'**6{"Mr@   )r  r  inspectismethod)r.   r  r  r  s      @r/   __getattr__Not.__getattr__3  s8     DIIt,		**	 r@   c                D    U R                   R                  X5      U l         gr  r(  rl   s      r/   ro   Not.replace_tableF  r*  r@   r  r+   r  r   rF   rb  r9   rc  r8   rh  )r  re   r9   r   r  )r:   r;   r<   r=   rH   r0   rQ  r   r  r   ro   r?   r  r  s   @r/   r   r   %  sA     &;
  $ F Fr@   r   c                  D   ^  \ rS rSrSSU 4S jjjrSS jrS	S jrSrU =r$ )
r   iU  c                ,   > [         TU ]  US9  Xl        g r  r  rm  s      r/   rH   All.__init__V  r  r@   c              #  \   #    U v   U R                   R                  5        S h  vN   g  N7fr+   rp  r-   s    r/   r0   
All.nodes_Z  rr  rs  c                    SR                  U R                  R                  " S0 UD6S9n[        X R                  40 UD6$ )Nz
{term} ALLr  r,   rw  r  s      r/   rQ  All.get_sql^  s;    !!tyy'8'8'B6'B!CZZ:6::r@   r  r+   r  r8   rh  r  r  s   @r/   r   r   U  s     &; ;r@   r   c                  8    \ rS rSrSS	S jjrS
S jrS rS rSrg)CustomFunctionic  Nc                    Xl         X l        g r+   r  params)r.   r  r  s      r/   rH   CustomFunction.__init__d  s    	r@   c           
        U R                  5       (       d#  [        U R                  UR                  S5      S9$ U R                  " U6 (       dZ  [        SR                  U R                  SR                  S U R                   5       5      SR                  S U 5       5      S95      e[        U R                  /UQ7SUR                  S5      06$ )NrF   rE   zCFunction {name} require these arguments ({params}), ({args}) passedz, c              3  8   #    U  H  n[        U5      v   M     g 7fr+   rm  r  ps     r/   r  *CustomFunction.__call__.<locals>.<genexpr>p  s     $A[SVV[   c              3  8   #    U  H  n[        U5      v   M     g 7fr+   rm  r  s     r/   r  r  q  s     "84a3q664r  )r  r  r  )	_has_paramsFunctionr  r  _is_valid_function_callr   r  r  r  )r.   r  r^  s      r/   __call__CustomFunction.__call__h  s    !!DIIVZZ-@AA++T2#U\\99$AT[[$AA"84"88 ]   		DDD

70CDDr@   c                    U R                   S L$ r+   )r  r-   s    r/   r  CustomFunction._has_paramsw  s    {{$&&r@   c                D    [        U5      [        U R                  5      :H  $ r+   )r  r  )r.   r  s     r/   r  &CustomFunction._is_valid_function_callz  s    4yC,,,r@   r  r+   )r  re   r  zSequence | Noner9   rc  )r  r   r^  r   r9   r  )	r:   r;   r<   r=   rH   r  r  r  r?   r,   r@   r/   r  r  c  s    E'-r@   r  c                     ^  \ rS rSrSU 4S jjrSS jr\SS j5       r\SS j5       r	SS jr
\S 5       rSS jrSS	 jrS
rU =r$ )r  i~  c                   > [         TU ]  UR                  S5      5        Xl        U Vs/ s H  o@R	                  U5      PM     snU l        UR                  S5      U l        g s  snf )NrF   schema)rw  rH   r  r  r`   r  r  )r.   r  r  r^  rr  r{  s        r/   rH   Function.__init__  sS    G,-	<@AD5''.DA	jj* Bs   A#c              #  n   #    U v   U R                    H  nUR                  5        S h  vN   M     g  N	7fr+   )r  r0   r   s     r/   r0   Function.nodes_  s*     
99Czz|## #r  c                j    [        U R                   Vs/ s H  oR                  PM     sn5      $ s  snf )a9  
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.
)r   r  r>   r   s     r/   r>   Function.is_aggregate  s)     $$K#%5%5$KLL$Kr  c                n    U R                    Vs/ s H  o3R                  X5      PM     snU l         gs  snf r  )r  ro   )r.   rm   rn   rr  s       r/   ro   Function.replace_table  s0     QUPYPYZPYu((BPYZ	Zr  c                    g r+   r,   r]  s     r/   get_special_params_sqlFunction.get_special_params_sql  r  r@   c                b    [        U S5      (       a  U R                  " SSS0UD6$ [        U 5      $ )NrQ  rU  Fr,   hasattrrQ  re   )r   r^  s     r/   get_arg_sqlFunction.get_arg_sql  s1    :A#y:Q:Qs{{6e6v6_WZ[^W__r@   c                   ^ ^ T R                   " S0 TD6nSR                  T R                  SR                  UU 4S jT R                   5       5      U(       a  SU-   S9$ SS9$ )Nz{name}({args}{special})r  c              3     >#    U  H>  n[        US 5      (       a  UR                  " SSSS.TD6OTR                  " U40 TD6v   M@     g7f)rQ  FT)rU  r,  Nr,   )r  rQ  r  )r  r  r^  r.   s     r/   r  ,Function.get_function_sql.<locals>.<genexpr>  sV       #A q),, IIHHH))!6v67 #s   AA	r  r  )r  r  specialr,   )r  r  r  r  r  )r.   r^  special_params_sqls   `` r/   get_function_sqlFunction.get_function_sql  sy    !88B6B(//    3ES-- 0 
 	
 KM 0 
 	
r@   c                f   UR                  SS5      nUR                  SS5      nUR                  SS 5      nUR                  SS 5      nU R                  X4US9nU R                  b,  SR                  U R                  R                  " S
XES.UD6US	9nU(       a  [        X`R                  4SU0UD6$ U$ )NrU  FrV  rN  r  )rV  rN  r  z{schema}.{function})rN  r  )r  functionr,   )r  r  r  r  rQ  r   rF   )r.   r^  rU  rV  rN  r  function_sqls          r/   rQ  Function.get_sql  s    ZZe4
$4e<ZZd3
**Y- ,,Nkr,s;;"077{{**\j\U[\% 8 L
 #L**^^W]^^r@   )r  r  r  r  re   r  r   r^  r   r9   rc  r8   r  r  )r^  r   r9   r   rh  )r:   r;   r<   r=   rH   r0   ri  r>   r   ro   r  rj  r  r  rQ  r?   r  r  s   @r/   r  r  ~  sc    +$
 M M [ [ ` `
  r@   r  c                  Z   ^  \ rS rSrSrU 4S jr\SS j5       rS	S jrS
U 4S jjr	Sr
U =r$ )AggregateFunctioni  Tc                J   > [         TU ]  " U/UQ70 UD6  / U l        SU l        g r7  )rw  rH   _filters_include_filterr.   r  r  r^  r{  s       r/   rH   AggregateFunction.__init__  s)    ///$r@   c                <    SU l         U =R                  U-  sl        g r1  )r  r  )r.   filterss     r/   filterAggregateFunction.filter  s    # r@   c                    U R                   (       a<  SR                  [        R                  U R                  5      R
                  " S0 UD6S9$ g )NzWHERE {criterions})
criterionsr,   )r  r  ru  r  r  rQ  r]  s     r/   get_filter_sql AggregateFunction.get_filter_sql  s@    '..)--:V:^:^:hag:h.ii  r@   c                   > [         TU ]  " S0 UD6nU R                  " S0 UD6nU R                  (       a  USR	                  US9-  nU$ )Nz FILTER({filter_sql}))
filter_sqlr,   )rw  r  r  r  r  )r.   r^  r   r  r{  s       r/   r  "AggregateFunction.get_function_sql  sO    g&00((262
*11Z1HHC
r@   )r  r  )r  r   r9   rc  rh  )r^  r   )r:   r;   r<   r=   r>   rH   r   r  r  r  r?   r  r  s   @r/   r  r    s1    L% ! !j r@   r  c                     ^  \ rS rSrSrSrSU 4S jjr\SS j5       r\SS j5       r	SS jr
SS jrSU 4S	 jjrS
rU =r$ )AnalyticFunctioni  FTc                t   > [         TU ]  " U/UQ70 UD6  / U l        / U l        / U l        SU l        SU l        g r7  )rw  rH   r  
_partition	_orderbysr  _include_overr  s       r/   rH   AnalyticFunction.__init__  s?    ///$"r@   c                <    SU l         U =R                  U-  sl        g r1  )r"  r   )r.   r  s     r/   overAnalyticFunction.over  s    !5 r@   c           	         SU l         U =R                  U Vs/ s H  o3UR                  S5      4PM     sn-  sl        g s  snf )NTorder)r"  r!  r  )r.   r  r^  r  s       r/   orderbyAnalyticFunction.orderby  s6    !5I54&**W"565IIIs   ?c                    Uc  UR                   " S0 UD6$ SR                  UR                   " S0 UD6UR                  S9$ )Nz{field} {orient})r[  orientr,   )rQ  r  r   )r.   r[  r,  r^  s       r/   _orderby_fieldAnalyticFunction._orderby_field   sG    >==*6**!((--)&)<< ) 
 	
r@   c                v  ^ ^ / nT R                   (       aA  UR                  SR                  SR                  U4S jT R                    5       5      S95        T R                  (       aB  UR                  SR                  SR                  UU 4S jT R                   5       5      S95        SR                  U5      $ )	NzPARTITION BY {args}r  c              3     >#    U  H3  n[        US 5      (       a  UR                  " S0 TD6O
[        U5      v   M5     g7f)rQ  Nr,   r  )r  r  r^  s     r/   r  5AnalyticFunction.get_partition_sql.<locals>.<genexpr>  s8     !tds_`I9N9N!))"5f"5TWXYTZ"Zdss   ;>)r  zORDER BY {orderby}c              3  N   >#    U  H  u  pTR                   " X40 TD6v   M     g 7fr+   )r-  )r  r[  r,  r^  r.   s      r/   r  r1    s'     $vguVcV[T%8%8%Q&%Qgus   "%)r)  r  )r   r  r  r  r!  )r.   r^  r  s   `` r/   get_partition_sql"AnalyticFunction.get_partition_sql	  s    ??LL%,,!tdhdsds!tt -  >>LL$++HH$vgkgugu$vv ,  xxr@   c                   > [         TU ]  " S0 UD6nU R                  " S0 UD6nUnU R                  (       a	  USU S3-  nU$ )Nz OVER()r,   )rw  r  r3  r"  )r.   r^  r  partition_sqlr   r{  s        r/   r  !AnalyticFunction.get_function_sql  sN    w/9&9..88VM?!,,C
r@   )r  r  r"  r!  r   r
  r  r   r9   rc  )r  r   r^  r   r9   rc  )r[  rT   r,  zOrder | Noner^  r   r9   re   rh  )r:   r;   r<   r=   r>   is_analyticrH   r   r%  r)  r-  r3  r  r?   r  r  s   @r/   r  r    sP    LK# ! ! J J
$ r@   r  EdgeT WindowFrameAnalyticFunction.Edgec                     ^  \ rS rSr " S S5      rSU 4S jjrSS jr\SSS jj5       r\SSS jj5       r	SS jr
SU 4S	 jjrS
rU =r$ )WindowFrameAnalyticFunctioni)  c                  ,    \ rS rSrSSS jjrSS jrSrg)	r<  i*  Nc                    Xl         g r+   r  r   s     r/   rH   )WindowFrameAnalyticFunction.Edge.__init__+  s    Jr@   c                \    SR                  U R                  =(       d    SU R                  S9$ )Nz{value} {modifier}	UNBOUNDED)r   modifier)r  r   rD  r-   s    r/   rR  (WindowFrameAnalyticFunction.Edge.__str__.  s-    '..jj/K /  r@   r  r+   )r   zstr | int | Noner9   rc  rg  )r:   r;   r<   r=   rH   rR  r?   r,   r@   r/   Edge WindowFrameAnalyticFunction.Edge*  s    		r@   rF  c                J   > [         TU ]  " U/UQ70 UD6  S U l        S U l        g r+   )rw  rH   framer'   r  s       r/   rH   $WindowFrameAnalyticFunction.__init__4  s(    ///

r@   c                    U R                   (       d  U R                  (       a
  [        5       eXl         U(       a	  X#4U l        g UU l        g r+   )rI  r'   AttributeError)r.   rI  r'   	and_bounds       r/   _set_frame_and_bounds1WindowFrameAnalyticFunction._set_frame_and_bounds9  s/    :: ""
+4e'
%
r@   c                (    U R                  SX5        g )NROWSrN  r.   r'   rM  s      r/   rows WindowFrameAnalyticFunction.rows@  s    ""65<r@   c                (    U R                  SX5        g )NRANGErR  rS  s      r/   range!WindowFrameAnalyticFunction.rangeD  s    ""7E=r@   c                    [        U R                  [        5      (       d$  SR                  U R                  U R                  S9$ U R                  u  pSR                  U R                  UUS9$ )Nz{frame} {bound})rI  r'   z#{frame} BETWEEN {lower} AND {upper})rI  r   r   )r3   r'   r[   r  rI  r   s      r/   get_frame_sql)WindowFrameAnalyticFunction.get_frame_sqlH  sa    $**e,,$++$**DJJ+OOzz4;;** < 
 	
r@   c                   > [         TU ]  " S0 UD6nU R                  (       d  U R                  (       d  U$ SR	                  X R                  5       S9$ )Nz{over} {frame})r%  rI  r,   )rw  r3  rI  r'   r  r[  )r.   r^  r7  r{  s      r/   r3  -WindowFrameAnalyticFunction.get_partition_sqlS  sE    1;F;zz$**  &&MASASAU&VVr@   )r'   rI  r
  )rI  re   r'   re   rM  EdgeT | Noner9   rc  r+   )r'   zstr | EdgeTrM  r_  r9   rc  rg  rh  )r:   r;   r<   r=   rF  rH   rN  r   rT  rX  r[  r3  r?   r  r  s   @r/   r>  r>  )  sQ     
@ = = > >	
W Wr@   r>  c                  J   ^  \ rS rSrSU 4S jjr\SS j5       rSS jrSrU =r	$ )	IgnoreNullsAnalyticFunctioni\  c                <   > [         TU ]  " U/UQ70 UD6  SU l        g r7  )rw  rH   _ignore_nullsr  s       r/   rH   $IgnoreNullsAnalyticFunction.__init__]  s"    ///"r@   c                    SU l         g r1  rc  r-   s    r/   ignore_nulls(IgnoreNullsAnalyticFunction.ignore_nullsa  s
    !r@   c                (    U R                   (       a  gg )NzIGNORE NULLSrf  r]  s     r/   r  2IgnoreNullsAnalyticFunction.get_special_params_sqle  s    ! r@   rf  r
  )r9   rc  )r^  r   r9   rb  )
r:   r;   r<   r=   rH   r   rg  r  r?   r  r  s   @r/   ra  ra  \  s&    # " " r@   ra  c            
          \ rS rSr\R
                  S\R                  S\R                  S\R                  S\R                  S0r
/ SQr/ SQr\R                  " S5      r          S                   SS jjrSS	 jrSS
 jrSrg)Intervalim  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\-.: ]+$)Nc                h   Xl         S U l        S U l        SU l        U(       a  Xl        g U	(       a  Xl        g [        U R                  U R                  XX4XVU/5       HR  u  pnU(       d  M  [        U5      n[        X[        U5      5        U R                  c  Xl        US:  U l        Xl        MT     g )NFr   )r  largestsmallestis_negativequartersweekszipunitslabelsrf   setattrabs)r.   ro  rp  rq  rr  rs  rt  ru  r  r  r  unitlabelr   	int_values                  r/   rH   Interval.__init__}  s      $MJ"%JJKKD<H#
D
 uJ	C	N3<<'#(L'01}D$ %#
r@   c                "    U R                  5       $ r+   rP  r-   s    r/   rR  Interval.__str__  s    ||~r@   c                $   U R                   =(       d    UR                  S5      nU R                  S:X  a  [        U S5      nSnGO$[	        U S5      (       a  [        U S5      nSnGO[	        U S5      (       a  [        U S5      nSnOSR                  [        U S	S
5      [        U SS
5      [        U SS
5      [        U SS
5      [        U SS
5      [        U SS
5      [        U SS
5      S9nU R                  R                  SU5      nU R                  (       a  SU-   nU R                  U R                  :w  a$  SR                  U R                  U R                  S9OU R                  nUc  SnU R                  R                  US5      R                  X4S9$ )Nr  r|  ru  r  QUARTERr  WEEKzB{years}-{months}-{days} {hours}:{minutes}:{seconds}.{microseconds}ro  r   rp  rq  rr  rs  rt  rn  r  -z{largest}_{smallest})r~  r  rx  rm  )r   r  )r  r  r~  r  r  r  trim_patternr   r  r  	templates)r.   r^  r  r   r  s        r/   rQ  Interval.get_sql  s   ,,7&**Y"7<<=(40D DT:&&4,DDT7##4)DD X^^dGQ/tXq1T61-dGQ/i3i3$T>1= _ D $$((T2DTz <<4==0	 '-- LL!]] . 
 \\  |~~!!'+EFMMSWMccr@   )r  r  r~  r  r  r  )
r   r   r   r   r   r   r   r   r   N)ro  rf   rp  rf   rq  rf   rr  rf   rs  rf   rt  rf   ru  rf   r  rf   r  rf   r  zDialects | Nonerg  rh  )r:   r;   r<   r=   r   r  r  VERTICAORACLEMYSQLr  r  r  recompiler  rH   rR  rQ  r?   r,   r@   r/   rl  rl  m  s     	75432I WEPF::WXL #'%&%& %& 	%&
 %& %& %& %& %& %& !%&N+dr@   rl  c                  0   ^  \ rS rSrSSU 4S jjjrSrU =r$ )r
  i  c                $   > [         TU ]  SXUS9  g )NPOWrE   rk  )r.   r  exponentrF   r{  s       r/   rH   Pow.__init__  s    e<r@   r,   r+   )r  rB   r  r  rF   rb  r9   rc  rn  r  s   @r/   r
  r
    s    = =r@   r
  c                  0   ^  \ rS rSrSSU 4S jjjrSrU =r$ )r  i  c                $   > [         TU ]  SXUS9  g )NMODrE   rk  )r.   r  modulusrF   r{  s       r/   rH   Mod.__init__  s    U;r@   r,   r+   )r  rB   r  r  rF   rb  r9   rc  rn  r  s   @r/   r  r    s    < <r@   r  c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )Rollupi  c                (   > [         TU ]  " S/UQ76   g )NROLLUPrk  )r.   r  r{  s     r/   rH   Rollup.__init__  s    *E*r@   r,   r9  rn  r  s   @r/   r  r    s    + +r@   r  c                  :   ^  \ rS rSrSrSU 4S jjrSS jrSrU =r$ )PseudoColumni  zu
Represents a pseudo column (a "column" which yields a value when selected
but is not actually a real table column).
c                ,   > [         TU ]  S S9  Xl        g r  r  )r.   r  r{  s     r/   rH   PseudoColumn.__init__  s    t$	r@   c                    U R                   $ r+   r  r]  s     r/   rQ  PseudoColumn.get_sql  s    yyr@   r  )r  re   r9   rc  rh  )	r:   r;   r<   r=   r  rH   rQ  r?   r  r  s   @r/   r  r    s    
 r@   r  c                  :   ^  \ rS rSrSrSrSU 4S jjrS rSrU =r	$ )
AtTimezonei  zh
Generates AT TIME ZONE SQL.
Examples:
    AT TIME ZONE 'US/Eastern'
    AT TIME ZONE INTERVAL '-06:00'
Nc                   > [         TU ]  U5        [        U[        5      (       d  [        U5      OUU l        X l        X0l        g r+   )rw  rH   r3   rT   r[  zoneinterval)r.   r[  r  r  rF   r{  s        r/   rH   AtTimezone.__init__  s3    )3E5)A)AU5\u
	 r@   c                    SR                  U R                  R                  " S0 UD6U R                  (       a  SOSU R                  S9n[        X R                  40 UD6$ )Nz&{name} AT TIME ZONE {interval}'{zone}'z	INTERVAL r  )r  r  r  r,   )r  r[  rQ  r  r  r   rF   r  s      r/   rQ  AtTimezone.get_sql  sU    8??##-f-$(MM[r @ 

  ZZ:6::r@   )r[  r  r  )FN)
r:   r;   r<   r=   r  r>   rH   rQ  r?   r  r  s   @r/   r  r    s     L!; ;r@   r  )ro  rf   r9   re   )i
__future__r   r  r  sysr  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&   rB   rp  rs  ru  r  r  r  r  r  r  r  r   r]   r  rh   rY  rc  rX   rp  ru  r}  rT   r  r  r\   rZ   r  r  r   r   r5  r>  r   r   r   r   rx   r   r~  r   r  r   r   r  r  r  r  r;  r>  ra  rl  r
  r  r  r  r  r,   r@   r/   <module>r     sR   "  	 
  B B ) )  8 8 l l l   
'!*>> 
	 	v&J J{$4 {$| *'I '&,I ,,] 
E} Em E] E! !
Bt 
B7X4 7Xt	$L 	$<O4 <O~cT cC4 C( (
/l /
($ ($VY (0It 0f4D 45 &_I _B	;E 	;e 
7i 7t4Y 4n2 	 2 ji  &Y &$;~ ;0;n ;;) ;B; ;B;I ;<;} ;]~ ]"q4 qhE9 EP-F) -F`;) ;- -6My M` 89( 9x 	AB0W"2 0Wf"2 "edt edP=( =
<( <
+X +
4 ; ;r@   