
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    S¤ðWª¶ ã                3   @   s”  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ zd dlmZ W n ek
rÀ   eZY nX d dlmZ d dlmZ d d	lmZ d
Zdddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=g3Zzd d>lmZ W n( ek
�rŒ   G d?d@„ d@ejƒZY nX e  dA¡Z!e! "eƒ ¡ dBZ#e$fdCdD„Z%ej&d  dEkZ'ej&d  dFkZ(ej&ddE… dGkZ)e(�r@d dl*Z*d dHlm+Z+ d dIlm,Z, dJdK„ Z-e.Z/e0Z1e.Z2e3e*dLƒZ4dMdK„ Z5e6Z7�d]dNdO„Z8n,e'�rde9Z/e2Z1e:Z5dPdQ„ Z4e;dRƒ ne<dSƒ‚e)�r€dTZ=dUdK„ Z>ndVdK„ Z>zd dWl?m@ZA W n ek
�r²   dZAY nX zd dlBZBW n ek
�rÚ   eAZBY nX eA�rôeAjCeBjCk�rôeAZBzd dXlDmEZE eE F¡  W n ek
�r"   Y nX zd dlGZGd dYlGmHZI W n ek
�rV   dZGY nX zd dlJZKW n> ek
�r¢   zd dlLZKW n ek
�rœ   dZKY nX Y nX z(d dZlMmNZN d d[lMmOZO d d\lMmPZP W n2 ek
�rþ   �d^d]d^„ZNd_d`„ ZOdadb„ ZPY nX z4d dclMmQZQ d ddlMmRZR d delMmSZS d dflMmTZT W n& ek
�rZ   d ZQ ZR ZSZTY nX eB�rŒeB UejVe.¡ eB UejWe.¡ eB Uej
e.¡ dgdhdidjdkdlgZXeYeXƒZZdmZ[dndo„ Z\dpdqdrdsdtdudvœZ]e] ¡ Z^dwe^dk< dxe^dl< dydz„ Z_d{d|„ Z`G d}d~„ d~eƒZaeadd€d�d‚dƒd„d…d†d‡dˆd‰dŠd‹dŒd�dŽd�d�d‘d’d“d”d•d–d—d˜�Zbead™dšd›dœd��ZcecjdZeecjfZgecjhZidžZjdEZkdFZldŸZmd Znebjoebjpebjqebjrebjsebjtebjuebjvebjwebjxebjyd¡œZzd¢d£„ Z{d¤d¥„ Z|d¦d§„ Z}G d¨d3„ d3e$ƒZ~G d©d„ de$ƒZG dªd«„ d«e$ƒZ€G d¬d­„ d­e$ƒZ�G d®d7„ d7e�ƒZ‚e‚ZƒG d¯d°„ d°e�ƒZ„G d±d²„ d²e�ƒZ…e…dƒZ†G d³d´„ d´e�ƒZ‡G dµd.„ d.e�ƒZˆG d¶d·„ d·eˆƒZ‰G d¸d„ de�ƒZŠG d¹dº„ dºeŠƒZ‹G d»d¼„ d¼e‹ƒZŒG d½d=„ d=e�ƒZ�d¾d„ ZŽG d¿d„ de�ƒZ�G dÀdÁ„ dÁe�ƒZ�edÂdÃƒZ‘G dÄdÅ„ dÅedÆdÇƒƒZ’G dÈdÉ„ dÉe$ƒZ“G dÊd„ de�ƒZ”G dËd„ de”ƒZ•G dÌd"„ d"e”ƒZ–G dÍd„ de–ƒZ—G dÎd5„ d5e–ƒZ˜G dÏd1„ d1e–ƒZ™G dÐdÑ„ dÑe™ƒZšG dÒd„ de”ƒZ›G dÓd„ de›ƒZœG dÔd„ de”ƒZ��d_dÖd×„ZžG dØd„ de”ƒZŸG dÙd„ deŸƒZ G dÚd8„ d8e”ƒZ¡G dÛd„ de”ƒZ¢G dÜd<„ d<e”ƒZ£dÝdÞ„ Z¤G dßdà„ dàe”ƒZ¥G dád„ de¥ƒZ¦G dâd„ de¥ƒZ§G dãd9„ d9e¥ƒZ¨G däd:„ d:e–ƒZ©G dåd„ de”ƒZªG dædç„ dçe“ƒZ«G dèdé„ dée$ƒZ¬G dêdë„ dëe$ƒZ­G dìd „ d e–ƒZ®G díd„ de$ƒZ¯G dîdï„ dïe$ƒZ°G dðdñ„ dñe$ƒZ±G dòdó„ dóe±ƒZ²G dôdõ„ dõe$ƒZ³G död÷„ d÷e$ƒZ´G dødù„ dùe´ƒZµG dúdû„ dûeµƒZ¶eTdk�	r*e¶ZTG düdý„ dýeµƒZ·eRdk�	rHe·ZRG dþdÿ„ dÿeµƒZ¸eQdk�	rfe¸ZQG �d �d„ �de´ƒZ¹e�d�dƒZºG �d�d„ �de¹ƒZ»G �d�d„ �de�ƒZ¼G �d�d	„ �d	e¼ƒZ½�d
�d„ Z¾G �d�d„ �de¼ƒZ¿G �d�d„ �de¿ƒZÀG �d�d„ �de¿ƒZÁG �d�d„ �de¼ƒZÂG �d�d„ �deÂƒZÃG �d�d„ �deÂƒZÄG �d�d„ �deÂƒZÅe�d�dƒZÆe�d�dƒZÇe�d�dƒZÈG �d �d!„ �d!eÉƒZÊG �d"d!„ d!eÊƒZËG �d#d„ deÊƒZÌG �d$d„ deÌƒZÍG �d%d#„ d#eÌƒZÎG �d&d$„ d$eÊƒZÏG �d'd%„ d%eÌƒZÐG �d(d,„ d,eÌƒZÑG �d)d-„ d-eÌƒZÒG �d*d2„ d2eÌƒZÓG �d+�d,„ �d,e$ƒZÔG �d-�d.„ �d.e$ƒZÕG �d/�d0„ �d0eÕe	jÖƒZ×G �d1�d2„ �d2e$ƒZØG �d3d6„ d6eØƒZÙG �d4d/„ d/eØƒZÚG �d5d+„ d+eØƒZÛG �d6�d7„ �d7e$ƒZÜG �d8�d9„ �d9eÜƒZÝG �d:d;„ d;eÝƒZÞG �d;�d<„ �d<eÜƒZßG �d=�d>„ �d>eÜƒZàG �d?�d@„ �d@eÜƒZáG �dA�dB„ �dBeáƒZâG �dC�dD„ �dDe”ƒZãG �dE�dF„ �dFe$ƒZäeSdk�rÈG �dG�dH„ �dHe$ƒZSG �dId„ deÉƒZåeB�rìeÙ�dJƒZændZæG �dK�dL„ �dLe$ƒZçG �dM�dN„ �dNeèƒZéG �dOd*„ d*e%eéƒƒZê�dP�dQ„ Zë�dR�dS„ Zìe�dT�dUƒZíG �dV�dW„ �dWeíƒZî�dXd0„ Zï�dY�dZ„ Zð�d[�d\„ ZñdS (`  é    N)Úbisect_left)Úbisect_right)Údeque)Ú
namedtuple)ÚOrderedDict)Údeepcopy©Úwraps)Úisclassz2.8.4Ú	BareFieldÚBigIntegerFieldÚ	BlobFieldÚBooleanFieldÚ	CharFieldÚCheckÚClauseÚCompositeKeyÚDatabaseErrorÚ	DataErrorÚ	DateFieldÚDateTimeFieldÚDecimalFieldÚDeferredRelationÚDoesNotExistÚDoubleFieldÚDQÚFieldÚFixedCharFieldÚ
FloatFieldÚfnÚForeignKeyFieldÚImproperlyConfiguredÚIntegerFieldÚIntegrityErrorÚInterfaceErrorÚInternalErrorÚJOINÚ	JOIN_FULLÚ
JOIN_INNERÚJOIN_LEFT_OUTERÚModelÚMySQLDatabaseÚNotSupportedErrorÚOperationalErrorÚParamÚPostgresqlDatabaseÚprefetchÚPrimaryKeyFieldÚProgrammingErrorÚProxyÚRÚSmallIntegerFieldÚSqliteDatabaseÚSQLÚ	TextFieldÚ	TimeFieldÚTimestampFieldÚUsingÚ	UUIDFieldÚWindow)ÚNullHandlerc                   @   s   e Zd Zdd„ ZdS )r>   c                 C   s   d S ©N© )ÚselfÚrecordr@   r@   ú9/opt/alt/python38/lib64/python3.8/site-packages/peewee.pyÚemiti   s    zNullHandler.emitN)Ú__name__Ú
__module__Ú__qualname__rD   r@   r@   r@   rC   r>   h   s   r>   ÚpeeweeÚ_metaclass_helper_c                 C   s   | t |fi ƒS r?   )Ú_METACLASS_)ÚmetaÚbaser@   r@   rC   Úwith_metaclasss   s    rM   é   é   )rN   é   )ÚCallable)Úreducec                 C   s
   t | tƒS r?   )Ú
isinstancerQ   )Úcr@   r@   rC   Ú<lambda>}   ó    rU   Úprintc                 C   s   t |  d¡ƒS ©NÚraw_unicode_escape)ÚbytesÚencode©Úsr@   r@   rC   rU   ‚   rV   c                 C   s   |j |k	r| |¡‚|‚d S r?   )Ú__traceback__Úwith_traceback)ÚtpÚvalueÚtbr@   r@   rC   Úreraise„   s    

rc   c                 C   s   t j | ¡ t j d¡ d S )NÚ
)ÚsysÚstdoutÚwriter\   r@   r@   rC   Úprint_Œ   s    rh   z4def reraise(tp, value, tb=None): raise tp, value, tbzUnsupported python version.é@B c                 C   s&   | j d | j| jd d  t  t S )Ng        é   i  )ÚmicrosecondsÚsecondsÚdaysÚ_M©Útr@   r@   rC   rU   •   rV   c                 C   s   |   ¡ S r?   )Útotal_secondsro   r@   r@   rC   rU   —   rV   )Údbapi2)Úcompat)Ú
extensions)Úformat_date_time)Úsort_models_topologically)Ústrip_parensc              	   C   sH   |p
dd„ }|D ]2}z|t j  | |¡ƒW   S  tk
r@   Y qX q| S )Nc                 S   s   | S r?   r@   ©Úxr@   r@   rC   rU   ¾   rV   z"format_date_time.<locals>.<lambda>)ÚdatetimeÚstrptimeÚ
ValueError)ra   ÚformatsÚpost_processÚfmtr@   r@   rC   ru   ½   s    ru   c                    sT   t ˆƒ‰t ƒ ‰g ‰‡ ‡‡‡fdd„‰ dd„ }tˆ|dd�D ]}ˆ |ƒ q:ttˆƒƒS )z@Sort models topologically so that parents will precede children.c                    sD   | ˆkr@| ˆkr@ˆ  | ¡ | jj ¡ D ]}ˆ |jƒ q&ˆ | ¡ d S r?   )ÚaddÚ_metaÚreverse_relÚvaluesÚmodel_classÚappend)ÚmodelÚforeign_key©ÚdfsÚmodelsÚorderingÚseenr@   rC   r‰   Ë   s
    
z&sort_models_topologically.<locals>.dfsc                 S   s   | j j| j jfS r?   )r�   ÚnameÚdb_table)Úmr@   r@   rC   rU   Ò   rV   z+sort_models_topologically.<locals>.<lambda>T)ÚkeyÚreverse)ÚsetÚsortedÚlistÚreversed)rŠ   Únamesr�   r@   rˆ   rC   rv   Æ   s    
rv   c                 C   sò   | r| d dkr| S d }}t | ƒ}||k rf| | dkrf| |d  dkrf|d7 }|d7 }|d8 }q$qfq$|rØd}d}t||| ƒD ]N}| | dkrš|d7 }n| | dkr®|d8 }|dk rÂ|d7 }d}||kr€ qÐq€||8 }|dkrî| || … S | S )Nr   ú(é   ú))ÚlenÚrange)r]   ÚctÚiÚlÚunbalanced_ctÚrequiredr@   r@   rC   rw   ×   s6    

rw   )Ú_DictQueryResultWrapper)Ú_ModelQueryResultWrapper)Ú_SortedFieldList)Ú_TuplesQueryResultWrapperÚyearÚmonthÚdayÚhourÚminuteÚsecond)ú%Y-%m-%d %H:%M:%Sú%Y-%m-%d %H:%M:%S.%fú%Y-%m-%dú%H:%M:%Sú%H:%M:%S.%fú%H:%Mc                 C   s(   | t kst‚|sd S t|tƒ}t|| ƒS r?   )ÚDATETIME_LOOKUPSÚAssertionErrorru   ÚSQLITE_DATETIME_FORMATSÚgetattr©Úlookup_typeÚdatetime_stringÚdtr@   r@   rC   Ú_sqlite_date_part  s
    
r¹   z%Yz%Y-%mr­   z%Y-%m-%d %Hz%Y-%m-%d %H:%Mr«   )r¥   r¦   r§   r¨   r©   rª   z%Y-%m-%d %H:%iz%Y-%m-%d %H:%i:%Sc                 C   s,   | t kst‚|sd S t|tƒ}| t |  ¡S r?   )ÚSQLITE_DATE_TRUNC_MAPPINGr²   ru   r³   Ústrftimerµ   r@   r@   rC   Ú_sqlite_date_trunc&  s
    
r¼   c                 C   s   t  | |t j¡d k	S r?   )ÚreÚsearchÚI)Úregexra   r@   r@   rC   Ú_sqlite_regexp-  s    rÁ   c                   @   s   e Zd Zdd„ ZdS )Úattrdictc                 C   s   | | S r?   r@   ©rA   Úattrr@   r@   rC   Ú__getattr__1  s    zattrdict.__getattr__N)rE   rF   rG   rÅ   r@   r@   r@   rC   rÂ   0  s   rÂ   ÚandÚorú+ú-Ú*ú/ú&ú|ú^ú%ú=ú<ú<=ú>ú>=ú!=Úinznot inÚiszis notÚlikeÚilikeÚbetweenÚregexpú||)ÚANDÚORÚADDÚSUBÚMULÚDIVÚBIN_ANDÚBIN_ORÚXORÚMODÚEQÚLTÚLTEÚGTÚGTEÚNEÚINÚNOT_INÚISÚIS_NOTÚLIKEÚILIKEÚBETWEENÚREGEXPÚCONCATÚINNERz
LEFT OUTERzRIGHT OUTERÚFULL)rö   Ú
LEFT_OUTERÚRIGHT_OUTERr÷   r˜   é   é   )ÚeqÚltÚlteÚgtÚgteÚnerÖ   r×   rØ   rÙ   rÛ   c                 C   s   |   ¡ }| |¡ |S r?   )ÚcopyÚupdate)ÚsourceÚ	overridesÚmergedr@   r@   rC   Ú
merge_dictr  s    
r  c                    s   ‡ fdd„}ˆ |_ |S )zÍ
    Method decorator that will "clone" the object before applying the given
    method.  This ensures that state is mutated in a more predictable fashion,
    and promotes the use of method-chaining.
    c                    s   |   ¡ }ˆ |f|ž|Ž |S r?   ©Úclone)rA   ÚargsÚkwargsr	  ©Úfuncr@   rC   Úinner}  s    zreturns_clone.<locals>.inner)Ú
call_local©r  r  r@   r  rC   Úreturns_clonew  s    r  c                    s   ‡ fdd„}|S )zu
    Method decorator to indicate a method is not allowed to be called.  Will
    raise a `NotImplementedError`.
    c                    s   t dˆ t| ƒjf ƒ‚d S )Nz!%s is not allowed on %s instances)ÚNotImplementedErrorÚtyperE   ©rA   r
  r  r  r@   rC   r  ‰  s     ÿznot_allowed.<locals>.innerr@   r  r@   r  rC   Únot_allowed„  s    r  c                       sH   e Zd ZdZddgZdd„ Zdd„ Zdd	„ Zd
d„ Z‡ fdd„Z	‡  Z
S )r3   zg
    Proxy class useful for situations when you wish to defer the initialization
    of an object.
    ÚobjÚ
_callbacksc                 C   s   g | _ |  d ¡ d S r?   )r  Ú
initialize©rA   r@   r@   rC   Ú__init__•  s    zProxy.__init__c                 C   s   || _ | jD ]}||ƒ qd S r?   )r  r  )rA   r  Úcallbackr@   r@   rC   r  ™  s    
zProxy.initializec                 C   s   | j  |¡ |S r?   )r  r…   )rA   r  r@   r@   rC   Úattach_callbackž  s    zProxy.attach_callbackc                 C   s   | j d krtdƒ‚t| j |ƒS )NzCannot use uninitialized Proxy.)r  ÚAttributeErrorr´   rÃ   r@   r@   rC   rÅ   ¢  s    
zProxy.__getattr__c                    s$   || j krtdƒ‚tt| ƒ ||¡S )NzCannot set attribute on proxy.)Ú	__slots__r  Úsuperr3   Ú__setattr__©rA   rÄ   ra   ©Ú	__class__r@   rC   r   §  s    
zProxy.__setattr__)rE   rF   rG   Ú__doc__r  r  r  r  rÅ   r   Ú__classcell__r@   r@   r"  rC   r3   Ž  s   c                   @   s8   e Zd Zeƒ Zd
dd„Zdd„ Zdd„ Zedd	„ ƒZ	dS )r   Nc                 C   s(   g | _ |d k	r$| ¡ | _| j | ¡ d S r?   )ÚfieldsÚlowerÚ_rel_model_nameÚ_unresolvedr€   )rA   Úrel_model_namer@   r@   rC   r  ¯  s    
zDeferredRelation.__init__c                 C   s   | j  |||f¡ d S r?   )r&  r…   )rA   r„   Úfieldr�   r@   r@   rC   Ú	set_fieldµ  s    zDeferredRelation.set_fieldc                 C   s(   | j D ]\}}}||_| ||¡ qd S r?   )r&  Ú	rel_modelÚadd_to_class)rA   r-  r†   r+  r�   r@   r@   rC   Ú	set_model¸  s    zDeferredRelation.set_modelc                 C   s>   t tjƒ}|D ]*}|j| j ¡ kr| | ¡ tj |¡ qd S r?   )r”   r   r)  r(  rE   r'  r/  Údiscard)Ú	model_clsÚ
unresolvedÚdrr@   r@   rC   Úresolve½  s
    

zDeferredRelation.resolve)N)
rE   rF   rG   r’   r)  r  r,  r/  Ústaticmethodr4  r@   r@   r@   rC   r   ¬  s   
c                   @   s   e Zd Zddd„ZdS )Ú_CDescriptorNc                 C   s   |d k	rt |jƒS | S r?   )ÚEntityÚ_alias©rA   ÚinstanceÚinstance_typer@   r@   rC   Ú__get__Ç  s    
z_CDescriptor.__get__)N)rE   rF   rG   r<  r@   r@   r@   rC   r6  Æ  s   r6  c                   @   s  e Zd ZdZeƒ ZdZdd„ Zed5dd„ƒZ	d	d
„ Z
dd„ Zedd„ ƒZed6dd„ƒZedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd„ Zd7dd„ZeejƒZeejƒZeejƒZeejƒZeejƒZeej ƒ Z!Z"eej#ƒZ$eejdd�Z%eejdd�Z&eejdd�Z'eej dd� Z(Z)eejdd�Z*eejdd�Z+eej#dd�Z,dd „ Z-d!d"„ Z.eej/ƒZ0eej1ƒZ2eej3ƒZ4eej5ƒZ6eej7ƒZ8eej9ƒZ:eej;ƒZ<eej=ƒZ>eej?ƒZ@eejAƒZBd#d$„ ZCd%d&„ ZDd8d'd(„ZEd)d*„ ZFd+d,„ ZGd-d.„ ZHd/d0„ ZId1d2„ ZJd3d4„ ZKdS )9ÚNodez=Base-class for any part of a query which shall be composable.Únodec                 C   s   d| _ d | _d | _d | _d S ©NF)Ú_negatedr8  Ú_bind_toÚ	_orderingr  r@   r@   rC   r  Ó  s    zNode.__init__NFc                    s   ‡ ‡‡fdd„}|S )Nc                    s&   ˆp| j }ˆ rt| ƒ} tˆ|| ƒ | S r?   )rE   r  Úsetattr)ÚmethodÚmethod_name©r	  Úclsr�   r@   rC   Ú	decoratorÛ  s
    
zNode.extend.<locals>.decoratorr@   )rG  r�   r	  rH  r@   rF  rC   ÚextendÙ  s    zNode.extendc                 C   s
   t | ƒƒ S r?   )r  r  r@   r@   rC   Ú
clone_baseã  s    zNode.clone_basec                 C   s,   |   ¡ }| j|_| j|_| j|_| j|_|S r?   )rJ  r@  r8  rB  rA  )rA   Úinstr@   r@   rC   r	  æ  s    z
Node.clonec                 C   s   | j  | _ d S r?   )r@  r  r@   r@   rC   Ú
__invert__î  s    zNode.__invert__c                 C   s
   || _ d S r?   ©r8  )rA   Úar@   r@   rC   Úaliasò  s    z
Node.aliasc                 C   s
   || _ dS )zÓ
        Bind the results of an expression to a specific model type. Useful
        when adding expressions to a select, where the result of the expression
        should be placed on a joined instance.
        N)rA  )rA   Úbtr@   r@   rC   Úbind_toö  s    zNode.bind_toc                 C   s
   d| _ d S )NÚASC©rB  r  r@   r@   rC   Úascÿ  s    zNode.ascc                 C   s
   d| _ d S )NÚDESCrS  r  r@   r@   rC   Údesc  s    z	Node.descc                 C   s   |   ¡ S r?   )rT  r  r@   r@   rC   Ú__pos__  s    zNode.__pos__c                 C   s   |   ¡ S r?   )rV  r  r@   r@   rC   Ú__neg__
  s    zNode.__neg__c                    s   ‡ ‡fdd„}|S )zŸ
        Lightweight factory which returns a method that builds an Expression
        consisting of the left-hand and right-hand operands, using `op`.
        c                    s   ˆ rt |ˆ| ƒS t | ˆ|ƒS r?   )Ú
Expression©rA   Úrhs©ÚinvÚopr@   rC   r    s    zNode._e.<locals>.innerr@   )r^  r]  r  r@   r\  rC   Ú_e  s    zNode._eT)r]  c                 C   s$   |d krt | tjd ƒS t | tj|ƒS r?   )rY  ÚOPrï   rç   rZ  r@   r@   rC   Ú__eq__'  s    zNode.__eq__c                 C   s$   |d krt | tjd ƒS t | tj|ƒS r?   )rY  r`  rð   rì   rZ  r@   r@   rC   Ú__ne__+  s    zNode.__ne__c                 C   s   t | tj|ƒS r?   )rY  r`  rí   rZ  r@   r@   rC   Úin_=  s    zNode.in_c                 C   s   t | tj|ƒS r?   )rY  r`  rî   rZ  r@   r@   rC   Únot_in?  s    zNode.not_inc                 C   s    |rt | tjd ƒS t | tjd ƒS r?   )rY  r`  rï   rð   )rA   Úis_nullr@   r@   rC   re  A  s    zNode.is_nullc                 C   s   t | tjd| ƒS )Nz%%%s%%©rY  r`  rò   rZ  r@   r@   rC   ÚcontainsE  s    zNode.containsc                 C   s   t | tjd| ƒS )Nz%s%%rf  rZ  r@   r@   rC   Ú
startswithG  s    zNode.startswithc                 C   s   t | tjd| ƒS )Nz%%%srf  rZ  r@   r@   rC   ÚendswithI  s    zNode.endswithc                 C   s   t | tjt|tdƒ|ƒƒS )NrÝ   )rY  r`  ró   r   r4   )rA   ÚlowÚhighr@   r@   rC   rÚ   K  s    zNode.betweenc                 C   s   t | tj|ƒS r?   )rY  r`  rô   )rA   Ú
expressionr@   r@   rC   rÛ   M  s    zNode.regexpc                 C   s   t | tj|ƒS r?   )rY  r`  rõ   rZ  r@   r@   rC   ÚconcatO  s    zNode.concat)NF)N)F)T)LrE   rF   rG   r$  r6  rT   Ú
_node_typer  ÚclassmethodrI  rJ  r	  r  rL  rO  rQ  rT  rV  rW  rX  r_  r`  rÝ   Ú__and__rÞ   Ú__or__rß   Ú__add__rà   Ú__sub__rá   Ú__mul__râ   Ú__div__Ú__truediv__rå   Ú__xor__Ú__radd__Ú__rsub__Ú__rmul__Ú__rdiv__Ú__rtruediv__Ú__rand__Ú__ror__Ú__rxor__ra  rb  rè   Ú__lt__ré   Ú__le__rê   Ú__gt__rë   Ú__ge__rí   Ú
__lshift__rï   Ú
__rshift__rñ   Ú__mod__rò   Ú__pow__rã   Úbin_andrä   Úbin_orrc  rd  re  rg  rh  ri  rÚ   rÛ   rm  r@   r@   r@   rC   r=  Î  sp   	






















r=  c                       s,   e Zd ZdZdZ‡ fdd„Zdd„ Z‡  ZS )r7   z2An unescaped SQL string, with optional parameters.Úsqlc                    s   || _ || _tt| ƒ ¡  d S r?   )ra   Úparamsr  r7   r  )rA   ra   r‹  r"  r@   rC   r  V  s    zSQL.__init__c                 C   s   t | jf| jžŽ S r?   )r7   ra   r‹  r  r@   r@   rC   rJ  [  s    zSQL.clone_base©rE   rF   rG   r$  rn  r  rJ  r%  r@   r@   r"  rC   r7   R  s   c                       s4   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )	r7  z/A quoted-name or entity, e.g. "table"."column".Úentityc                    s   t t| ƒ ¡  || _d S r?   )r  r7  r  Úpath)rA   rŽ  r"  r@   rC   r  c  s    zEntity.__init__c                 C   s
   t | jŽ S r?   )r7  rŽ  r  r@   r@   rC   rJ  g  s    zEntity.clone_basec                 C   s   t td | j|f ƒŽ S r?   )r7  ÚfilterrŽ  rÃ   r@   r@   rC   rÅ   j  s    zEntity.__getattr__)	rE   rF   rG   r$  rn  r  rJ  rÅ   r%  r@   r@   r"  rC   r7  _  s
   r7  c                       sT   e Zd ZdZdZedƒZ‡ fdd„Zeddd„ƒZ	d	d
„ Z
ddd„Zdd„ Z‡  ZS )ÚFunczAn arbitrary SQL function call.r  )ÚcountÚsumc                    s6   || _ || _|r| ¡ | jknd| _tt| ƒ ¡  d S r?  )r�   Ú	argumentsr'  Ú
_no_coerceÚ_coercer  r�  r  )rA   r�   r“  r"  r@   rC   r  r  s    zFunc.__init__Tc                 C   s
   || _ d S r?   )r•  )rA   Úcoercer@   r@   rC   r–  x  s    zFunc.coercec                 C   s   t | jf| jžŽ }| j|_|S r?   )r�  r�   r“  r•  )rA   Úresr@   r@   rC   rJ  |  s    zFunc.clone_baseNc                 C   sJ   t |tƒr|d kr|}|d kr0t||d� ¡ }n
t|jƒ}t| tdƒ|ƒS )N)Úpartition_byÚorder_byÚOVER)rS   r=   Ú__sql__r7   r8  r   )rA   r˜  r™  ÚwindowrŠ  r@   r@   rC   Úover�  s     ÿ
z	Func.overc                    s   ‡ fdd„}|S )Nc                     s   t ˆ f| ž|ŽS r?   )r�  ©r
  r  ©rÄ   r@   rC   ÚdecŒ  s    zFunc.__getattr__.<locals>.decr@   )rA   rÄ   r   r@   rŸ  rC   rÅ   ‹  s    zFunc.__getattr__)T)NNN)rE   rF   rG   r$  rn  r’   r”  r  r  r–  rJ  r�  rÅ   r%  r@   r@   r"  rC   r�  m  s   

r�  c                       s.   e Zd ZdZdZd‡ fdd„	Zdd„ Z‡  ZS )	rY  z0A binary expression, e.g `foo + 1` or `bar < 7`.rl  Fc                    s*   t t| ƒ ¡  || _|| _|| _|| _d S r?   )r  rY  r  Úlhsr^  r[  Úflat)rA   r¡  r^  r[  r¢  r"  r@   rC   r  ˜  s
    zExpression.__init__c                 C   s   t | j| j| j| jƒS r?   )rY  r¡  r^  r[  r¢  r  r@   r@   rC   rJ  Ÿ  s    zExpression.clone_base)FrŒ  r@   r@   r"  rC   rY  ”  s   rY  c                       s.   e Zd ZdZdZd‡ fdd„	Zdd„ Z‡  ZS )	r.   zÃ
    Arbitrary parameter passed into a query. Instructs the query compiler to
    specifically treat this value as a parameter, useful for `list` which is
    special-cased for `IN` lookups.
    ÚparamNc                    s   || _ || _tt| ƒ ¡  d S r?   )ra   Úadaptr  r.   r  )rA   ra   r¤  r"  r@   rC   r  ª  s    zParam.__init__c                 C   s   t | j| jƒS r?   )r.   ra   r¤  r  r@   r@   rC   rJ  ¯  s    zParam.clone_base)NrŒ  r@   r@   r"  rC   r.   ¢  s   c                   @   s   e Zd ZdZdS )ÚPassthroughÚpassthroughN)rE   rF   rG   rn  r@   r@   r@   rC   r¥  ²  s   r¥  c                       s4   e Zd ZdZdZdZdZ‡ fdd„Zdd„ Z‡  Z	S )	r   z8A SQL clause, one or more Node objects joined by spaces.Úclauseú Fc                    s@   d|kr|d | _ d|kr$|d | _tt| ƒ ¡  t|ƒ| _d S )NÚglueÚparens)r©  rª  r  r   r  r”   Únodes)rA   r«  r  r"  r@   rC   r  ¼  s    

zClause.__init__c                 C   s   t | jŽ }| j|_| j|_|S r?   )r   r«  r©  rª  ©rA   r	  r@   r@   rC   rJ  Ä  s    
zClause.clone_base)
rE   rF   rG   r$  rn  r©  rª  r  rJ  r%  r@   r@   r"  rC   r   µ  s   c                   @   s   e Zd ZdZdZdS )ÚCommaClausez5One or more Node objects joined by commas, no parens.ú, N)rE   rF   rG   r$  r©  r@   r@   r@   rC   r­  Ê  s   r­  c                   @   s   e Zd ZdZdZdS )ÚEnclosedClausezAOne or more Node objects joined by commas and enclosed in parens.TN)rE   rF   rG   r$  rª  r@   r@   r@   rC   r¯  Î  s   r¯  c                       s.   e Zd Zd‡ fdd„	Zdd„ Zdd„ Z‡  ZS )	r=   Nc                    s*   t t| ƒ ¡  || _|| _| jp"d| _d S )NÚw)r  r=   r  r˜  r™  r8  )rA   r˜  r™  r"  r@   rC   r  Ó  s    zWindow.__init__c                 C   sP   g }| j r$| ttdƒt| j Ž ƒ¡ | jrD| ttdƒt| jŽ ƒ¡ tt|Ž ƒS )NzPARTITION BYúORDER BY)r˜  r…   r   r7   r­  r™  r¯  )rA   Úover_clausesr@   r@   rC   r›  Ù  s    þþzWindow.__sql__c                 C   s   t | j| jƒS r?   )r=   r˜  r™  r  r@   r@   rC   rJ  å  s    zWindow.clone_base)NN)rE   rF   rG   r  r›  rJ  r%  r@   r@   r"  rC   r=   Ò  s   c                 C   s   t d|  ƒS )Nz
CHECK (%s)©r7   )ra   r@   r@   rC   r   è  s    c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )r   z:A "django-style" filter expression, e.g. {'foo__eq': 'x'}.c                    s   t t| ƒ ¡  || _d S r?   )r  r   r  Úquery©rA   r´  r"  r@   rC   r  í  s    zDQ.__init__c                 C   s   t f | jŽS r?   )r   r´  r  r@   r@   rC   rJ  ñ  s    zDQ.clone_base)rE   rF   rG   r$  r  rJ  r%  r@   r@   r"  rC   r   ë  s   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )Ú_StripParensrw   c                    s   t t| ƒ ¡  || _d S r?   )r  r¶  r  r>  )rA   r>  r"  r@   rC   r  ÷  s    z_StripParens.__init__)rE   rF   rG   rn  r  r%  r@   r@   r"  rC   r¶  ô  s   r¶  ÚJoinMetadata©Ú	src_modelÚ
dest_modelÚsrcÚdestrÄ   Úprimary_keyr‡   Ú
is_backrefrO  Úis_self_joinÚis_expressionc                   @   s:   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zed
d„ ƒZdS )ÚJoinNc                 C   sX   t |tƒst |tƒrdS |j ||¡}|d k	r6|dfS |j ||¡}|d k	rT|dfS dS )N©NNFT)rS   ÚSelectQueryr�   Úrel_for_modelÚreverse_rel_for_model)rA   r  r¼  r+  Úfk_fieldr‚   r@   r@   rC   Úget_foreign_key
  s    zJoin.get_foreign_keyc                 C   s   | j p
tjS r?   )Ú	join_typer&   rö   r  r@   r@   rC   Úget_join_type  s    zJoin.get_join_typec                 C   s$   t |tƒr|jS t |tƒr |jS |S r?   )rS   Ú
ModelAliasr„   rÃ  )rA   Úmodel_or_aliasr@   r@   rC   Úmodel_from_alias  s
    

zJoin.model_from_aliasc           
      C   sB  |   | j¡}|   | j¡}t| jtƒr,| jjp.d }t| jttt	fƒ}t| jt
tfƒrX| jpZd }|rt|}|j|jjk}n6|  ||| j¡\}}|d krª| jd k	rª|  ||¡\}}|d k	rº|j}nd }|�s|d k	râ|rÚ|jj}	n|j}	n.z| jjj}	W n tk
�r   |jj}	Y nX nd }	t||| j| j|�p,|	||||||k|d�S )Nr¸  )rÌ  r»  r¼  rS   Úonr=  r8  rY  r�  r7   r   Ú
FieldProxyr�   r�   r&  rÇ  Úto_fieldrŽ   r¡  r  r·  )
rA   r»  r¼  Ú
join_aliasrÀ  Úon_fieldrÆ  r¾  r½  Útarget_attrr@   r@   rC   Ú_join_metadata  sJ    
õzJoin._join_metadatac                 C   s   t | dƒs|  ¡ | _| jS )NÚ_cached_metadata)ÚhasattrrÓ  rÔ  r  r@   r@   rC   ÚmetadataP  s    

zJoin.metadata)N)	rE   rF   rG   rÇ  rÉ  rÌ  rÓ  ÚpropertyrÖ  r@   r@   r@   rC   rÁ  	  s   
1rÁ  Ú_Join)r»  r¼  rÈ  rÍ  c                   @   s&   e Zd Zdd„ Zddd„Zdd„ ZdS )	ÚFieldDescriptorc                 C   s   || _ | j j| _d S r?   )r+  r�   Úatt_name©rA   r+  r@   r@   rC   r  Y  s    zFieldDescriptor.__init__Nc                 C   s   |d k	r|j  | j¡S | jS r?   )Ú_dataÚgetrÚ  r+  r9  r@   r@   rC   r<  ]  s    zFieldDescriptor.__get__c                 C   s   ||j | j< |j | j¡ d S r?   )rÜ  rÚ  Ú_dirtyr€   ©rA   r:  ra   r@   r@   rC   Ú__set__b  s    zFieldDescriptor.__set__)N)rE   rF   rG   r  r<  rà  r@   r@   r@   rC   rÙ  V  s   
rÙ  c                       sœ   e Zd ZdZdZdZdZdZd#‡ fdd„	Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd$dd„Zdd„ Zdd „ Zd!d"„ Z‡  ZS )%r   zA column on a table.r   r+  ÚunknownFNc                    sŒ   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _t jd7  _tj| _| jrhdpjd| jf| _d| _tt| ƒ ¡  d S )Nr˜   rN   F)ÚnullÚindexÚuniqueÚverbose_nameÚ	help_textÚ	db_columnÚdefaultÚchoicesr½  ÚsequenceÚconstraintsÚschemar   Ú_field_counterÚ_orderÚ	_sort_keyÚ	_is_boundr  r  )rA   râ  rã  rä  rå  ræ  rç  rè  ré  r½  rê  rë  rì  r"  r@   rC   r  m  s"    zField.__init__c                 K   sf   t | ƒf | j| j| j| j| j| j| j| j| j	| j
| j| jdœ|—Ž}| jrZ| j|_| j|_| j|_|S )N)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„   )rA   r  rK  r@   r@   rC   rJ  ‡  s*    ôózField.clone_basec                 C   sZ   || _ || _| jp| j | _| js4t dd|¡ ¡ | _|j | ¡ t	||t
| ƒƒ d| _dS )z±
        Hook that replaces the `Field` attribute on a class with a named
        `FieldDescriptor`. Called by the metaclass during construction of the
        `Model`.
        ú_+r¨  TN)r�   r„   rç  rå  r½   ÚsubÚtitler�   Ú	add_fieldrC  rÙ  rð  ©rA   r„   r�   r@   r@   rC   r.  œ  s    zField.add_to_classc                 C   s
   | j jjS r?   )r„   r�   Údatabaser  r@   r@   rC   Úget_database¬  s    zField.get_databasec                 C   s   |   ¡ }|  ¡  ¡  |¡S r?   )Úget_db_fieldr÷  ÚcompilerÚget_column_type)rA   Ú
field_typer@   r@   rC   rú  ¯  s    zField.get_column_typec                 C   s   | j S r?   )Údb_fieldr  r@   r@   rC   rø  ³  s    zField.get_db_fieldc                 C   s   d S r?   r@   r  r@   r@   rC   Úget_modifiers¶  s    zField.get_modifiersc                 C   s   |S r?   r@   ©rA   ra   r@   r@   rC   r–  ¹  s    zField.coercec                 C   s   |dkr|S |   |¡S )z5Convert the python value for storage in the database.N©r–  rþ  r@   r@   rC   Údb_value¼  s    zField.db_valuec                 C   s   |dkr|S |   |¡S )z/Convert the database value to a pythonic value.Nrÿ  rþ  r@   r@   rC   Úpython_valueÀ  s    zField.python_valuec                 C   s    |rt | jjj| jƒS t | jƒS r?   )r7  r„   r�   rŽ   rç  )rA   Ú
with_tabler@   r@   rC   Ú	as_entityÄ  s    zField.as_entityc                 C   s0   |   ¡ }|r(td|d tt|ƒ¡f ƒS t|ƒS )z2Return the column type, e.g. VARCHAR(255) or REAL.ú%s(%s)r®  )rý  r7   ÚjoinÚmapÚstr)rA   Úcolumn_typeÚ	modifiersr@   r@   rC   Ú__ddl_column__É  s    ÿzField.__ddl_column__c                 C   sj   |   ¡ |  |¡g}| js&| tdƒ¡ | jr:| tdƒ¡ | jrT| td| j ƒ¡ | jrf| | j¡ |S )z8Return a list of Node instances that defines the column.zNOT NULLúPRIMARY KEYzDEFAULT NEXTVAL('%s'))	r  r
  râ  r…   r7   r½  rê  rë  rI  )rA   r  Úddlr@   r@   rC   Ú__ddl__Ñ  s    zField.__ddl__c                 C   s   t | jd | jj ƒS ©NÚ.)Úhashr�   r„   rE   r  r@   r@   rC   Ú__hash__Þ  s    zField.__hash__)FFFNNNNNFNNN)F)rE   rF   rG   r$  rí  rî  rn  rü  r  rJ  r.  r÷  rú  rø  rý  r–  r   r  r  r
  r  r  r%  r@   r@   r"  rC   r   f  s:                   ý
c                       s.   e Zd ZdZd‡ fdd„	Z‡ fdd„Z‡  ZS )r   ÚbareNc                    s$   t t| ƒj||Ž |d k	r || _d S r?   )r  r   r  r–  )rA   r–  r
  r  r"  r@   rC   r  ä  s    zBareField.__init__c                    s   t t| ƒjf d| ji|—ŽS )Nr–  )r  r   rJ  r–  ©rA   r  r"  r@   rC   rJ  é  s    zBareField.clone_base)N)rE   rF   rG   rü  r  rJ  r%  r@   r@   r"  rC   r   á  s   c                   @   s   e Zd ZdZeZdS )r"   ÚintN)rE   rF   rG   rü  r  r–  r@   r@   r@   rC   r"   ì  s   c                   @   s   e Zd ZdZdS )r   ÚbigintN©rE   rF   rG   rü  r@   r@   r@   rC   r   ð  s   c                   @   s   e Zd ZdZdS )r5   ÚsmallintNr  r@   r@   r@   rC   r5   ó  s   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )r1   r½  c                    s   d|d< t t| ƒj||Ž d S )NTr½  )r  r1   r  r  r"  r@   rC   r  ù  s    zPrimaryKeyField.__init__)rE   rF   rG   rü  r  r%  r@   r@   r"  rC   r1   ö  s   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )Ú_AutoPrimaryKeyFieldNc                    s4   || j krtdt| ƒ|f ƒ‚tt| ƒ ||¡ d S )Nz%s must be named `%s`.)Ú_column_namer|   r  r  r  r.  rõ  r"  r@   rC   r.     s    
z!_AutoPrimaryKeyField.add_to_class)rE   rF   rG   r  r.  r%  r@   r@   r"  rC   r  ý  s   r  c                   @   s   e Zd ZdZeZdS )r   ÚfloatN)rE   rF   rG   rü  r  r–  r@   r@   r@   rC   r     s   c                   @   s   e Zd ZdZdS )r   ÚdoubleNr  r@   r@   r@   rC   r   	  s   c                       sF   e Zd ZdZd‡ fdd„	Z‡ fdd	„Zd
d„ Zdd„ Zdd„ Z‡  Z	S )r   Údecimalé
   rû   FNc                    s6   || _ || _|| _|ptjj| _tt| ƒj||Ž d S r?   )	Ú
max_digitsÚdecimal_placesÚ
auto_roundr  ÚDefaultContextÚroundingr  r   r  )rA   r  r  r   r"  r
  r  r"  r@   rC   r    s
    zDecimalField.__init__c                    s(   t t| ƒjf | j| j| j| jdœ|—ŽS )N)r  r  r   r"  )r  r   rJ  r  r  r   r"  r  r"  r@   rC   rJ    s    üûzDecimalField.clone_basec                 C   s   | j | jgS r?   )r  r  r  r@   r@   rC   rý    s    zDecimalField.get_modifiersc                 C   sT   t j}|s|d kr|S |dƒS | jrP|dƒ| j  }| j}|t|ƒƒj||d�S |S )Nr   r  )r"  )r  ÚDecimalr   r  r"  r  Úquantize)rA   ra   ÚDÚexpr"  r@   r@   rC   r   "  s    zDecimalField.db_valuec                 C   s*   |d k	r&t |tjƒr|S t t|ƒ¡S d S r?   )rS   r  r#  r  rþ  r@   r@   rC   r  ,  s    zDecimalField.python_value)r  rû   FN)
rE   rF   rG   rü  r  rJ  rý  r   r  r%  r@   r@   r"  rC   r     s     ÿ
úutf-8c                 C   s*   t | tƒr| S t | tƒr"|  |¡S t| ƒS r?   )rS   Úunicode_typeÚstring_typeÚdecode)r]   Úencodingr@   r@   rC   Úcoerce_to_unicode2  s
    


r,  c                       s>   e Zd ZdZd‡ fdd„	Z‡ fdd„Zdd„ Zd	d
„ Z‡  ZS )r   Ústringéÿ   c                    s   || _ tt| ƒj||Ž d S r?   )Ú
max_lengthr  r   r  )rA   r/  r
  r  r"  r@   rC   r  <  s    zCharField.__init__c                    s   t t| ƒjf d| ji|—ŽS )Nr/  )r  r   rJ  r/  r  r"  r@   rC   rJ  @  s
    ÿþzCharField.clone_basec                 C   s   | j r| j gpd S r?   )r/  r  r@   r@   rC   rý  E  s    zCharField.get_modifiersc                 C   s   t |pdƒS ©NÚ ©r,  rþ  r@   r@   rC   r–  H  s    zCharField.coerce)r.  )	rE   rF   rG   rü  r  rJ  rý  r–  r%  r@   r@   r"  rC   r   9  s
   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )r   Ú
fixed_charc                    s    t t| ƒ |¡}|r| ¡ }|S r?   )r  r   r  Ústriprþ  r"  r@   rC   r  N  s    zFixedCharField.python_value)rE   rF   rG   rü  r  r%  r@   r@   r"  rC   r   K  s   c                   @   s   e Zd ZdZdd„ ZdS )r8   Útextc                 C   s   t |pdƒS r0  r2  rþ  r@   r@   rC   r–  W  s    zTextField.coerceN)rE   rF   rG   rü  r–  r@   r@   r@   rC   r8   T  s   c                       s4   e Zd ZdZeZ‡ fdd„Zdd„ Zdd„ Z‡  Z	S )r   Úblobc                    s0   t |jjtƒr|jj | j¡ tt| ƒ ||¡S r?   )	rS   r�   rö  r3   r  Ú_set_constructorr  r   r.  rõ  r"  r@   rC   r.  ^  s    zBlobField.add_to_classc                 C   s   |  ¡ | _d S r?   )Úget_binary_typeÚ_constructor)rA   rö  r@   r@   rC   r7  c  s    zBlobField._set_constructorc                 C   s,   t |tƒr| d¡}t |tƒr(|  |¡S |S rX   )rS   r(  r[   Ú
basestringr9  rþ  r@   r@   rC   r   f  s
    



zBlobField.db_value)
rE   rF   rG   rü  Úbinary_constructr9  r.  r7  r   r%  r@   r@   r"  rC   r   Z  s
   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )r<   Úuuidc                 C   s6   t |tjƒr|jS zt |¡jW S    | Y S X d S r?   )rS   r<  ÚUUIDÚhexrþ  r@   r@   rC   r   p  s    zUUIDField.db_valuec                 C   s&   t |tjƒr|S |d krd S t |¡S r?   )rS   r<  r=  rþ  r@   r@   rC   r  x  s    zUUIDField.python_valueN)rE   rF   rG   rü  r   r  r@   r@   r@   rC   r<   m  s   c                    s   ‡ fdd„}|S )Nc                    s   | j jj ˆ | ¡S r?   )r„   r�   rö  Úextract_dater  ©Ú	date_partr@   rC   r   ~  s    z_date_part.<locals>.decr@   )rA  r   r@   r@  rC   Ú
_date_part}  s    rB  c                       s.   e Zd ZdZd‡ fdd„	Z‡ fdd„Z‡  ZS )Ú_BaseFormattedFieldNc                    s$   |d k	r|| _ tt| ƒj||Ž d S r?   )r}   r  rC  r  )rA   r}   r
  r  r"  r@   rC   r  „  s    z_BaseFormattedField.__init__c                    s   t t| ƒjf d| ji|—ŽS )Nr}   )r  rC  rJ  r}   r  r"  r@   rC   rJ  ‰  s
    ÿþz_BaseFormattedField.clone_base)N)rE   rF   rG   r}   r  rJ  r%  r@   r@   r"  rC   rC  ‚  s   rC  c                   @   sj   e Zd ZdZdddgZdd„ ZeedƒƒZeedƒƒZ	eed	ƒƒZ
eed
ƒƒZeedƒƒZeedƒƒZdS )r   rz   r¬   r«   r­   c                 C   s   |rt |tƒrt|| jƒS |S r?   )rS   r:  ru   r}   rþ  r@   r@   rC   r  –  s    zDateTimeField.python_valuer¥   r¦   r§   r¨   r©   rª   N)rE   rF   rG   rü  r}   r  r×  rB  r¥   r¦   r§   r¨   r©   rª   r@   r@   r@   rC   r   Ž  s   ýc                   @   sF   e Zd ZdZdddgZdd„ ZeedƒƒZeedƒƒZ	eed	ƒƒZ
d
S )r   Údater­   r«   r¬   c                 C   s@   |r$t |tƒr$dd„ }t|| j|ƒS |r<t |tjƒr<| ¡ S |S )Nc                 S   s   |   ¡ S r?   )rD  rx   r@   r@   rC   rU   ¬  rV   z(DateField.python_value.<locals>.<lambda>)rS   r:  ru   r}   rz   rD  ©rA   ra   Úppr@   r@   rC   r  ª  s    zDateField.python_valuer¥   r¦   r§   N)rE   rF   rG   rü  r}   r  r×  rB  r¥   r¦   r§   r@   r@   r@   rC   r   ¢  s   ýc                   @   sJ   e Zd ZdZdddddgZdd„ Zeed	ƒƒZeed
ƒƒZ	eedƒƒZ
dS )r9   Útimer¯   r®   r°   r¬   r«   c                 C   s`   |r8t |tƒr$dd„ }t|| j|ƒS t |tjƒr8| ¡ S |d k	r\t |tjƒr\tjj|  ¡ S |S )Nc                 S   s   |   ¡ S r?   )rG  rx   r@   r@   rC   rU   Ã  rV   z(TimeField.python_value.<locals>.<lambda>)rS   r:  ru   r}   rz   rG  Ú	timedeltaÚminrE  r@   r@   rC   r  À  s    
zTimeField.python_valuer¨   r©   rª   N)rE   rF   rG   rü  r}   r  r×  rB  r¨   r©   rª   r@   r@   r@   rC   r9   ¶  s   ûc                       sF   e Zd Zdd„ edƒD ƒZ‡ fdd„Zdd„ Zdd	„ Zd
d„ Z‡  Z	S )r:   c                 C   s   g | ]}d | ‘qS )r  r@   ©Ú.0r�   r@   r@   rC   Ú
<listcomp>Ñ  s     zTimestampField.<listcomp>é   c                    sœ   |  dd¡pd| _| j| jkr<tdd dd„ | jD ƒ¡ ƒ‚|  dd¡pJd| _tj}| jr`|jn|j| _	| jrt|j
n|j}| d	|¡ tt| ƒj||Ž d S )
NÚ
resolutionr˜   z,TimestampField resolution must be one of: %sr®  c                 s   s   | ]}t |ƒV  qd S r?   )r  rJ  r@   r@   rC   Ú	<genexpr>×  s     z*TimestampField.__init__.<locals>.<genexpr>ÚutcFrè  )ÚpoprN  Úvalid_resolutionsr|   r  rP  rz   ÚutcfromtimestampÚfromtimestampÚ_convÚutcnowÚnowÚ
setdefaultr  r:   r  )rA   r
  r  Ú_dtÚ_defaultr"  r@   rC   r  Ó  s    ÿzTimestampField.__init__c                 C   s   | j dkr| jS tjS ©Nr˜   )rN  rü  r   r  r@   r@   rC   rø  à  s    ÿzTimestampField.get_db_fieldc                 C   s    |d krd S t |tjƒrn4t |tjƒr<t |j|j|j¡}ntt|| j ƒƒS | j	rdt
 | ¡ ¡}nt | ¡ ¡}||jd 7 }| jdkr”|| j9 }tt|ƒƒS )Ng�íµ ÷Æ°>r˜   )rS   rz   rD  r¥   r¦   r§   r  ÚroundrN  rP  ÚcalendarÚtimegmÚutctimetuplerG  ÚmktimeÚ	timetupleÚmicrosecond)rA   ra   Ú	timestampr@   r@   rC   r   ç  s    

zTimestampField.db_valuec                 C   sp   |d k	rlt |tttfƒrl|dkr$d S | jdkrbd| j }t|| jƒ\}}|| }|  |¡j|d�S |  |¡S |S )Nr   r˜   ri   )rb  )rS   r  r  ÚlongrN  ÚdivmodrU  Úreplace)rA   ra   Úticks_to_microsecondÚticksrk   r@   r@   rC   r  û  s    


zTimestampField.python_value)
rE   rF   rG   r›   rR  r  rø  r   r  r%  r@   r@   r"  rC   r:   Ï  s
   c                   @   s   e Zd ZdZeZdS )r   ÚboolN)rE   rF   rG   rü  ri  r–  r@   r@   r@   rC   r     s   c                       s:   e Zd ZdZ‡ fdd„Zdd„ Zddd„Zd	d
„ Z‡  ZS )ÚRelationDescriptorzEForeign-key abstraction to replace a related PK with a related model.c                    s   || _ tt| ƒ |¡ d S r?   )r-  r  rj  r  )rA   r+  r-  r"  r@   rC   r    s    zRelationDescriptor.__init__c                 C   sn   |j  | j¡}|d k	s"| j|jkrZ| j|jkrN| j | jj|k¡}||j| j< |j| j S | jjsj| jj‚|S r?   )	rÜ  rÝ  rÚ  Ú
_obj_cacher-  r+  rÏ  râ  r   )rA   r:  Úrel_idr  r@   r@   rC   Úget_object_or_id  s    z#RelationDescriptor.get_object_or_idNc                 C   s   |d k	r|   |¡S | jS r?   )rm  r+  r9  r@   r@   rC   r<    s    
zRelationDescriptor.__get__c                 C   s|   t || jƒr2t|| jjjƒ|j| j< ||j| j< n8|j 	| j¡}||j| j< ||krj| j|jkrj|j| j= |j
 | j¡ d S r?   )rS   r-  r´   r+  rÏ  r�   rÜ  rÚ  rk  rÝ  rÞ  r€   )rA   r:  ra   Ú
orig_valuer@   r@   rC   rà  "  s     ÿ
zRelationDescriptor.__set__)N)	rE   rF   rG   r$  r  rm  r<  rà  r%  r@   r@   r"  rC   rj    s
   
rj  c                   @   s"   e Zd ZdZdd„ Zddd„ZdS )ÚReverseRelationDescriptorz<Back-reference to expose related objects as a `SelectQuery`.c                 C   s   || _ |j| _d S r?   )r+  r„   r-  rÛ  r@   r@   rC   r  0  s    z"ReverseRelationDescriptor.__init__Nc                 C   s.   |d k	r*| j  ¡  | jt|| jjjƒk¡S | S r?   )r-  ÚselectÚwherer+  r´   rÏ  r�   r9  r@   r@   rC   r<  4  s
    
ÿz!ReverseRelationDescriptor.__get__)N)rE   rF   rG   r$  r  r<  r@   r@   r@   rC   ro  .  s   ro  c                   @   s*   e Zd ZdZdd„ Zd	dd„Zdd„ ZdS )
ÚObjectIdDescriptorz(Gives direct access to the underlying idc                 C   s   |j | _t |¡| _d S r?   )r�   Ú	attr_nameÚweakrefÚrefr+  rÛ  r@   r@   rC   r  <  s    zObjectIdDescriptor.__init__Nc                 C   s   |d k	r|j  | j¡S |  ¡ S r?   )rÜ  rÝ  rs  r+  r9  r@   r@   rC   r<  @  s    zObjectIdDescriptor.__get__c                 C   s   t || j|ƒ d S r?   )rC  rs  rß  r@   r@   rC   rà  E  s    zObjectIdDescriptor.__set__)N)rE   rF   rG   r$  r  r<  rà  r@   r@   r@   rC   rr  :  s   
rr  c                       s‚   e Zd Zd‡ fdd„	Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	‡ fdd„Z
‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )r    Nc           	         sr   |dkr(t |ttfƒs(t|tƒs(tdƒ‚|| _|| _t |ttfƒ| _|| _	|| _
|| _|| _tt| ƒj||Ž d S )NrA   z[Unexpected value for `rel_model`.  Expected `Model`, `Proxy`, `DeferredRelation`, or "self")rS   r3   r   Ú
issubclassr*   Ú	TypeErrorr-  Ú_related_nameÚdeferredÚ	on_deleteÚ	on_updateÚextrarÏ  r  r    r  )	rA   r-  Úrelated_namerz  r{  r|  rÏ  r
  r  r"  r@   rC   r  I  s    ÿþzForeignKeyField.__init__c              	      s2   t t| ƒjf | j|  ¡ | j| j| j| jdœ|—ŽS )N)r-  r}  rz  r{  r|  rÏ  )	r  r    rJ  r-  Ú_get_related_namerz  r{  r|  rÏ  r  r"  r@   rC   rJ  Y  s    úùzForeignKeyField.clone_basec                 C   s   t | | jƒS r?   )rj  r-  r  r@   r@   rC   Ú_get_descriptorc  s    zForeignKeyField._get_descriptorc                 C   s   t | ƒS r?   )rr  r  r@   r@   rC   Ú_get_id_descriptorf  s    z"ForeignKeyField._get_id_descriptorc                 C   s   t | ƒS r?   )ro  r  r@   r@   rC   Ú_get_backref_descriptori  s    z'ForeignKeyField._get_backref_descriptorc                 C   s.   | j rt| j ƒr|   | ¡S | j p,d| jjj S )Nz%s_set)rx  Úcallabler„   r�   r�   r  r@   r@   rC   r~  l  s    
z!ForeignKeyField._get_related_namec                    sÐ  t ˆjtƒr,‡ ‡‡fdd„}ˆj |¡ d S t ˆjtƒrLˆj ˆ ˆˆ¡ d S ˆˆ_ˆ ˆ_ˆjpfdˆj  ˆ_‰ˆˆjkr€ˆd7 ‰ˆj	sšt
 ddˆ¡ ¡ ˆ_	ˆ j ˆ¡ ˆ ¡ ˆ_ˆjdkrÂˆjˆ_ˆjd k	rêt ˆjtƒsötˆjˆjƒˆ_nˆjjjˆ_ˆ jj�rt‡ ‡‡‡fdd	„}ˆjˆjjjk�r.|d
ƒ nˆjˆjjjk�rH|dƒ ˆˆ jjk�r`|dƒ nˆˆ jk�rt|dƒ tˆ ˆˆ ¡ ƒ tˆ ˆˆ ¡ ƒ tˆjˆjˆ ¡ ƒ dˆ_ˆˆ jjˆj< ˆˆjjjˆj< d S )Nc                    s   | ˆ_ ˆ ˆ ˆ¡ d S r?   )r-  r.  ©r-  )r„   r�   rA   r@   rC   r  s  s    z.ForeignKeyField.add_to_class.<locals>.callbackz%s_idÚ_idrñ  r¨  rA   c                    s.   |j dˆ jjˆf ˆjˆd� t| | ƒ‚d S )Nz%s.%s)r+  ÚbackrefÚobj_id_name)r  r�   r�   r}  r  )ÚmsgÚcontext©r„   r�   r†  rA   r@   rC   Úinvalid’  s    ýz-ForeignKeyField.add_to_class.<locals>.invalidzVThe related_name of %(field)s ("%(backref)s") conflicts with a field of the same name.zWThe related_name of %(field)s ("%(backref)s") is already in use by another foreign key.zRThe object id descriptor of %(field)s conflicts with a field named %(obj_id_name)sz]Model attribute "%(obj_id_name)s" would be shadowed by the object id descriptor of %(field)s.T)rS   r-  r3   r  r   r,  r�   r„   rç  rå  r½   rò  ró  r�   rô  r~  r}  rÏ  r   r´   r½  Úvalidate_backrefsr&  r‚   Ú__dict__rC  r  r€  r�  rð  Úrel)rA   r„   r�   r  rŠ  r@   r‰  rC   r.  q  sR    






þzForeignKeyField.add_to_classc                    s$   t | jtƒs| j ¡ S tt| ƒ ¡ S )zr
        Overridden to ensure Foreign Keys use same column type as the primary
        key they point to.
        )rS   rÏ  r1   rø  r  r    r  r"  r@   rC   rø  ±  s    
zForeignKeyField.get_db_fieldc                    s$   t | jtƒs| j ¡ S tt| ƒ ¡ S r?   )rS   rÏ  r1   rý  r  r    r  r"  r@   rC   rý  º  s    
zForeignKeyField.get_modifiersc                 C   s   | j  |¡S r?   )rÏ  r–  rþ  r@   r@   rC   r–  ¿  s    zForeignKeyField.coercec                 C   s    t || jƒr| ¡ }| j |¡S r?   )rS   r-  Ú_get_pk_valuerÏ  r   rþ  r@   r@   rC   r   Â  s    zForeignKeyField.db_valuec                 C   s   t || jƒr|S | j |¡S r?   )rS   r-  rÏ  r  rþ  r@   r@   rC   r  Ç  s    zForeignKeyField.python_value)NNNNN)rE   rF   rG   r  rJ  r  r€  r�  r~  r.  rø  rý  r–  r   r  r%  r@   r@   r"  rC   r    H  s          ÿ
@	c                   @   sF   e Zd ZdZdZdd„ Zdd„ Zddd„Zd	d
„ Zdd„ Z	dd„ Z
dS )r   z+A primary key composed of multiple columns.Nc                 G   s
   || _ d S r?   )Úfield_names)rA   r�  r@   r@   rC   r  Ñ  s    zCompositeKey.__init__c                 C   s   || _ || _t||| ƒ d S r?   )r�   r„   rC  rõ  r@   r@   rC   r.  Ô  s    zCompositeKey.add_to_classc                    s$   ˆ d k	r t ‡ fdd„| jD ƒƒS | S )Nc                    s   g | ]}t ˆ |ƒ‘qS r@   )r´   ©rK  Ú
field_name©r:  r@   rC   rL  Û  s   ÿz(CompositeKey.__get__.<locals>.<listcomp>)Útupler�  r9  r@   r’  rC   r<  Ù  s
    ÿzCompositeKey.__get__c                 C   s   d S r?   r@   rß  r@   r@   rC   rà  ß  s    zCompositeKey.__set__c                    s&   ‡ fdd„t ˆ j|ƒD ƒ}ttj|ƒS )Nc                    s"   g | ]\}}ˆ j jj| |k‘qS r@   )r„   r�   r&  )rK  r+  ra   r  r@   rC   rL  ã  s   ÿz'CompositeKey.__eq__.<locals>.<listcomp>)Úzipr�  rR   ÚoperatorÚand_)rA   ÚotherÚexpressionsr@   r  rC   ra  â  s    

ÿzCompositeKey.__eq__c                 C   s   t | jj| jfƒS r?   )r  r„   rE   r�  r  r@   r@   rC   r  ç  s    zCompositeKey.__hash__)N)rE   rF   rG   r$  rê  r  r.  r<  rà  ra  r  r@   r@   r@   rC   r   Í  s   
c                   @   sD   e Zd ZdZddd„Zdd„ Zddd	„Zd
d„ Zdd„ Zdd„ Z	dS )ÚAliasMaprp   r   c                 C   s   i | _ || _d S r?   )Ú
_alias_mapÚ_counter)rA   Ústartr@   r@   rC   r  î  s    zAliasMap.__init__c                 C   s
   d| j  S )Nz<AliasMap: %s>©rš  r  r@   r@   rC   Ú__repr__ò  s    zAliasMap.__repr__Nc                 C   s:   || j krd S |  jd7  _|p.d| j| jf | j |< d S )Nr˜   z%s%s)rš  r›  Úprefix)rA   r  rO  r@   r@   rC   r€   õ  s    
zAliasMap.addc                 C   s   || j kr|  |¡ | j | S r?   )rš  r€   ©rA   r  r@   r@   rC   Ú__getitem__û  s    

zAliasMap.__getitem__c                 C   s
   || j kS r?   r�  r   r@   r@   rC   Ú__contains__   s    zAliasMap.__contains__c                 C   s.   |r*|j  ¡ D ]\}}|| kr|| j |< q| S r?   )rš  Úitems)rA   Ú	alias_mapr  rO  r@   r@   rC   r    s
    zAliasMap.update)r   )N)
rE   rF   rG   rŸ  r  rž  r€   r¡  r¢  r  r@   r@   r@   rC   r™  ë  s   

r™  c                2   @   sŽ  e Zd Zddddddddd	dd
d
dddddœZejdejdejdejdej	dej
dejdejdejdejdejdejdejdejdejdejdejdejd ejd!ejd"ejd#ejd$ejd%ejd&ejd'iZej d(ej!d)ej"d*ej#d+iZ$e%Z&d‹d/d0„Z'd1d2„ Z(d3d4„ Z)d5d6„ Z*d7d8„ Z+d9d:„ Z,d;d<„ Z-d=d>„ Z.d?d@„ Z/dAdB„ Z0dCdD„ Z1dEdF„ Z2dGdH„ Z3dIdJ„ Z4dKdL„ Z5dMdN„ Z6dOdP„ Z7dQdR„ Z8dSdT„ Z9dŒdUdV„Z:d�dXdY„Z;dŽdZd[„Z<d�d\d]„Z=d^d_„ Z>d�d`da„Z?dbdc„ Z@eAfddde„ZBdfdg„ ZCdhdi„ ZDdjdk„ ZEdldm„ ZFdndo„ ZGd‘dpdq„ZHeGdrƒZId’dtdu„ZJeGdvƒZKd“dwdx„ZLeGdyƒZMd”dzd{„ZNeGd|ƒZOd}d~„ ZPdd€„ ZQeGd�ƒZRd•d‚dƒ„ZSeGd„ƒZTd…d†„ ZUeGd‡ƒZVdˆd‰„ ZWeGdŠƒZXd.S )–ÚQueryCompilerr1  ÚBIGINTÚBLOBÚSMALLINTÚDATEÚDATETIMEÚDECIMALÚREALÚCHARÚINTEGERÚVARCHARÚTEXTÚTIME)r  r  r6  ri  rD  rz   r  r  r3  r  r  r½  r  r-  r5  rG  rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rí   zNOT INrï   zIS NOTrÌ   rÍ   rñ   rò   ró   rÈ   rÉ   rÊ   rË   ú#rÝ   rÞ   rÏ   rô   rÜ   z
INNER JOINzLEFT OUTER JOINzRIGHT OUTER JOINz	FULL JOINú"ú?Nc                 C   sJ   || _ || _t| j|pi ƒ| _t| j|p*i ƒ| _|  ¡ | _t	dgƒ| _
d S )Nr£  )Ú
quote_charÚinterpolationr  Ú	field_mapÚ
_field_mapÚop_mapÚ_op_mapÚget_parse_mapÚ
_parse_mapr’   Ú_unknown_types)rA   rµ  r¶  Úfield_overridesÚop_overridesr@   r@   rC   r  H  s    
zQueryCompiler.__init__c                 C   s2   | j | j| j| j| j| j| j| j| j| j	| j
dœS )N)rl  r£  r¦  r  r§  r�  r+  rŠ  Úselect_queryÚcompound_select_queryrw   )Ú_parse_expressionÚ_parse_paramÚ_parse_passthroughÚ_parse_funcÚ_parse_clauseÚ_parse_entityÚ_parse_fieldÚ
_parse_sqlÚ_parse_select_queryÚ_parse_compound_select_queryÚ_parse_strip_parensr  r@   r@   rC   r»  Q  s    õzQueryCompiler.get_parse_mapc                 C   s   d| j || j f S )Nz%s%s%s)rµ  )rA   r]   r@   r@   rC   Úquoteb  s    zQueryCompiler.quotec                 C   s   || j kr| j | S | ¡ S r?   )r¸  Úupper)rA   Úfr@   r@   rC   rú  e  s    zQueryCompiler.get_column_typec                 C   s
   | j | S r?   )rº  )rA   Úqr@   r@   rC   Úget_oph  s    zQueryCompiler.get_opc                 C   s   t | ¡ dd„ d�S )Nc                 S   s
   | d j S ©Nr   )rï  )r�   r@   r@   rC   rU   l  rV   z.QueryCompiler._sorted_fields.<locals>.<lambda>©r�   )r“   r£  )rA   Ú
field_dictr@   r@   rC   Ú_sorted_fieldsk  s    zQueryCompiler._sorted_fieldsc                 C   s   | j |gfS r?   )r¶  ©rA   r>  r¤  Úconvr@   r@   rC   Ú_parse_defaultn  s    zQueryCompiler._parse_defaultc           
      C   s”   t |jtƒr|j}|  |j||¡\}}|  |j||¡\}}|jtjkrd|dkrd|sd|jr\dndg fS |jrndnd}|||  	|j¡|f }	|	|| fS )Nz()z0 = 1z(0 = 1)ú%s %s %sú
(%s %s %s))
rS   r¡  r   Ú
parse_noder[  r^  r`  rí   r¢  rÑ  )
rA   r>  r¤  r×  r¡  Úlparamsr[  ÚrparamsÚtemplaterŠ  r@   r@   rC   rÂ  q  s    zQueryCompiler._parse_expressionc                 C   s*   |j r|  |  |j¡|d ¡S | j|jgfS r?   )r¤  rÛ  ra   r¶  rÖ  r@   r@   rC   rÄ  |  s    z QueryCompiler._parse_passthroughc                 C   s^   |j r0|r|j|j krd }|  |  |j¡||¡S |d k	rL|  | |j¡|¡S | j|jgfS d S r?   )r¤  r   rÛ  ra   r¶  rÖ  r@   r@   rC   rÃ  �  s    zQueryCompiler._parse_paramc                 C   s8   |j r
|pd }|  |j||¡\}}d|jt|ƒf |fS )Nr  )r•  Úparse_node_listr“  r�   rw   ©rA   r>  r¤  r×  rŠ  r‹  r@   r@   rC   rÅ  ‹  s    zQueryCompiler._parse_funcc                 C   s2   |   |j|||j¡\}}|jr*dt|ƒ }||fS ©Nú(%s))rß  r«  r©  rª  rw   rà  r@   r@   rC   rÆ  �  s       ÿzQueryCompiler._parse_clausec                 C   s   d  t| j|jƒ¡g fS r  )r  r  rÍ  rŽ  rÖ  r@   r@   rC   rÇ  —  s    zQueryCompiler._parse_entityc                 C   s   |j t|jƒfS r?   )ra   r”   r‹  rÖ  r@   r@   rC   rÉ  š  s    zQueryCompiler._parse_sqlc                 C   s<   |r(d  |  ||j ¡|  |j¡f¡}n|  |j¡}|g fS r  )r  rÍ  r„   rç  )rA   r>  r¤  r×  rŠ  r@   r@   rC   rÈ  �  s    
þzQueryCompiler._parse_fieldc                 C   sè   d}|j j|kr0|jj|kr0|j |j }}d}n|j|j  }}d}|  ¡ }|j|kr\|j|_|  ||¡\}	}
|  ||  ||¡¡\}}|rž|||	|
f\}}}}n|	|
||f\}}}}|jjrÌd||j	|f }nd||j	|f }||| fS )NrÁ  TFz((%s) %s (%s))rÚ  )
r[  rn  r¡  Úalias_map_classr›  Úgenerate_selectÚcalculate_alias_maprö  Úcompound_select_parenthesesr•  )rA   r>  r¤  r×  ÚcsqÚfirst_qÚsecond_qr]  Únew_mapÚfirstÚfirst_prª   Úsecond_prž   ÚlpÚrÚrprŠ  r@   r@   rC   rË  ¦  s*    

þz*QueryCompiler._parse_compound_select_queryc                 C   sV   |  ¡ }|js6|r$t|tƒr$|j}n
|jjj}|f|_|  	||¡\}}dt
|ƒ |fS rá  )r	  Ú_explicit_selectionrS   r    rÏ  r„   r�   r½  Ú_selecträ  rw   )rA   r>  r¤  r×  r	  Úselect_fieldrò  r‹  r@   r@   rC   rÊ  Å  s    
z!QueryCompiler._parse_select_queryc                 C   s    |   |j||¡\}}t|ƒ|fS r?   )rÛ  r>  rw   rà  r@   r@   rC   rÌ  Ð  s    z!QueryCompiler._parse_strip_parensc                 C   sh  t |dd ƒ}d}|| jkrP| j| |||ƒ\}}|| jkoJ|jd koJ|d k}�nt|tttfƒr||  |||¡\}}d| }nât|t	ƒrÚ| j
}|rÊt|tƒrÊ|j}t|tƒr¶| |¡}	qÒ| t ||jƒ¡}	n| ¡ }	|	g}n„t|ƒrìt|t	ƒsøt|tƒ�r| ¡  || ¡}
|  |
||¡\}}n@|d k	�rH| |¡}	|  |	|d ¡\}}}n|  ||d ¡\}}d}|||fS )Nrn  Frâ  T)r´   r¼  r½  r¤  rS   r”   r“  r’   rß  r*   r¶  r    rÏ  r   r�   rŽ  r
   rv  rÊ  r  rO  rÛ  Ú_parserØ  )rA   r>  r¤  r×  Ú	node_typerá  rŠ  r‹  rÏ  ra   r�  Ú_r@   r@   rC   rô  Ô  s@    

ÿþ


ÿ

zQueryCompiler._parsec                    sÌ   |   ||ˆ ¡\}}}|r6ˆ d k	r6|r6‡ fdd„|D ƒ}t|tƒr||jrNd| }|jrfd |d|jf¡}|jr|d ||jf¡}|rÄtdd„ |D ƒƒrÄg }g }t|ƒD ] \}	}
t|
tƒr¢|  	|
¡\}}q¢||fS )Nc                    s   g | ]}ˆ   |¡‘qS r@   )r   rJ  ©r×  r@   rC   rL  þ  s     z,QueryCompiler.parse_node.<locals>.<listcomp>zNOT %sr¨  ÚASc                 s   s   | ]}t |tƒV  qd S r?   )rS   r=  )rK  Úpr@   r@   rC   rO    s     z+QueryCompiler.parse_node.<locals>.<genexpr>)
rô  rS   r=  r@  r8  r  rB  ÚanyÚ	enumeraterÛ  )rA   r>  r¤  r×  rŠ  r‹  rá  Úclean_paramsÚ	clean_sqlÚidxr£  ÚcsqlÚcparamsr@   r÷  rC   rÛ  û  s"    

zQueryCompiler.parse_noder®  c           
      C   sF   g }g }|D ]*}|   |||¡\}}	| |¡ | |	¡ q| |¡|fS r?   )rÛ  r…   rI  r  )
rA   r«  r¤  r×  r©  rŠ  r‹  r>  Únode_sqlÚnode_paramsr@   r@   rC   rß    s    
zQueryCompiler.parse_node_listc                 C   s˜   |   ¡ }|d k	r|j|_| |j|jjj¡ |j ¡ D ]V\}}| ||jj¡ |D ]8}t|j	t
ƒrv| |j	|j	j¡ qR| |j	|j	jj¡ qRq6| |¡S r?   )rã  r›  r€   r„   r�   Útable_aliasÚ_joinsr£  rS   r¼  r=  rO  r  )rA   r´  r¤  rê  r¹  Újoined_modelsÚjoin_objr@   r@   rC   rå    s    z!QueryCompiler.calculate_alias_mapc                 C   s   |   t|Ž |¡S r?   )rÛ  r   )rA   Úclausesr¤  r@   r@   rC   Úbuild_query*  s    zQueryCompiler.build_queryc                 C   sZ  g }t ƒ }|g}|�rV| ¡ }||ks||kr0q| |¡ || D �]}|}	|j}
t|jtttt	fƒrv|j 
¡  ¡ }nl|j}|jr�|j}|j}n|j}|j}|j}|rÚt||jƒ}t||jjƒ}|jrÐ|| }}||k}ntdƒ‚t|
tƒrò|
}n| |
¡ |
 ¡  ||
 ¡}| ¡ }|| jk�r2t| j| ƒ}nt|ƒ}| t||tdƒ|ƒ¡ qBq|S )Nz Missing required join predicate.ÚON)r’   rQ  r€   r¼  rS   rÍ  rY  r�  r   r7  r	  rO  rÖ  r¾  r»  r‡   r´   r�   rÏ  r|   r=  r…   r  rÉ  Újoin_mapr7   )rA   Újoinsr„   r¤  r  rŒ   rÐ  Úcurrr  r»  r¼  Ú
constraintrÖ  Úfk_modelÚpk_modelÚfkr¡  r[  Údest_nrÈ  Újoin_sqlr@   r@   rC   Úgenerate_joins-  sN    




ÿzQueryCompiler.generate_joinsc                 C   s.  |j }|jj}|  ||¡}t|tƒr0t|ƒg}n’|jsBtdƒg}n*tdƒg}|jdkrl|tdƒt	|jŽ g7 }t
|jŽ }d|_| |tdƒf¡ |jd kr²| | ¡  || ¡¡ n| t|jŽ ¡ |jd k	rô| tdƒ¡ | tdd	„ |jD ƒŽ ¡ |  |j||¡}|�r| |¡ |jd k	�r4| td
ƒ|jg¡ |j�rT| tdƒt|jŽ g¡ |j�rp| tdƒ|jg¡ |j�r�| tdƒt|jŽ g¡ |jd k	�s¬|j�rÖ|j�rÖ|jd k	�r¾|jn|j}| td| ƒ¡ |jd k	�rö| td|j ƒ¡ |j\}	}
|	�r"|
�rdnd}| t|ƒ¡ |  ||¡S )NÚSELECTzSELECT DISTINCT)TFr	  r®  ÚFROMÚWINDOWc                 S   s&   g | ]}t t|jƒtd ƒ| ¡ ƒ‘qS )rø  )r   r7   r8  r›  )rK  rœ  r@   r@   rC   rL  }  s   üýz1QueryCompiler.generate_select.<locals>.<listcomp>ÚWHEREzGROUP BYÚHAVINGr±  zLIMIT %sz	OFFSET %szFOR UPDATE NOWAITz
FOR UPDATE)r„   r�   rö  rå  rS   ÚCompoundSelectr¶  Ú	_distinctr7   r¯  r   rò  r©  rI  Ú_fromr…   r  rO  r­  Ú_windowsr  r  Ú_whereÚ	_group_byÚ_havingÚ	_order_byÚ_limitÚ_offsetÚ	limit_maxÚ_for_updater  )rA   r´  r¤  r†   Údbr  Úselect_clauseÚjoin_clausesÚlimitÚ
for_updateÚno_waitÚstmtr@   r@   rC   rä  b  sT    





û


zQueryCompiler.generate_selectc           
   	   C   s   |j }|  ¡ }| ||jj¡ |jr0d|j }nd}t|ƒ| ¡ tdƒg}g }|  |j	¡D ]D\}}t
|ttfƒs~t||jd�}| t|jdd�tj|dd�¡ qZ| t|Ž ¡ |jrÈ| td	ƒ|jg¡ |jd k	rôt|jŽ }	d
|	_| tdƒ|	g¡ |  ||¡S )NzUPDATE OR %sÚUPDATEÚSET©r¤  F©r  T)r¢  r  r®  Ú	RETURNING)r„   rã  r€   r�   rŽ   Ú_on_conflictr7   r  rÕ  Ú_updaterS   r=  r*   r.   r   r…   rY  r`  rç   r­  r  rI  Ú
_returningr   r©  r  )
rA   r´  r†   r¤  Ú	statementr  r  r+  ra   Úreturning_clauser@   r@   rC   Úgenerate_update¡  s2    
ü


zQueryCompiler.generate_updatec                 C   s   |dd„ |D ƒŽ S )Nc                 S   s   g | ]}|j d d�‘qS )Fr/  ©r  ©rK  r+  r@   r@   rC   rL  Á  s    z3QueryCompiler._get_field_clause.<locals>.<listcomp>r@   )rA   r&  Úclause_typer@   r@   rC   Ú_get_field_clauseÀ  s    ÿzQueryCompiler._get_field_clausec                 C   sÊ  |j }|j}|  ¡ }| ||jj¡ |jr4|jj}n|jrFd|j }nd}t	|ƒ| 
¡ g}|jd k	rŽ|jr|| |  |j¡¡ | t|jƒ¡ nØ|jd k	�rfg g  }}d}	| ¡ D ]n}
|	sÒt|
 ¡ t d¡d�}d}	g }|D ]4}|
| }t|ttfƒ�st||jd�}| |¡ qÚ| t|Ž ¡ q°|�rF| |  |¡t	dƒt|Ž g¡ n |j jj�rf| |j |j ¡¡ |j �r�| t	d	ƒ| j| !¡ td
�g¡ n.|j"d k	�r¾t#|j"Ž }d|_$| t	d	ƒ|g¡ |  %||¡S )NzINSERT OR %s INTOzINSERT INTOFrï  rÓ  Tr.  ÚVALUESr0  )r9  r®  )&r„   r�   rã  r€   rŽ   Ú_upsertrö  Ú
upsert_sqlr1  r7   r  Ú_queryÚ_fieldsr…   r:  r¶  Ú_rowsÚ
_iter_rowsr“   Úkeysr•  Ú
attrgetterrS   r=  r*   r.   r   r¯  rI  r­  Úauto_incrementÚdefault_insert_clauseÚis_insert_returningÚget_primary_key_fieldsr3  r   r©  r  )rA   r´  r†   rK   r¤  r4  r  r&  Úvalue_clausesÚhave_fieldsÚrow_dictrƒ   r+  ra   r5  r@   r@   rC   Úgenerate_insertÄ  sl    


 ÿý
ÿþþ
zQueryCompiler.generate_insertc                 C   sf   |j }tdƒ| ¡ g}|jr0| tdƒ|jg¡ |jd k	r\t|jŽ }d|_| tdƒ|g¡ |  |¡S )NzDELETE FROMr  r®  r0  )	r„   r7   r  r  rI  r3  r   r©  r  )rA   r´  r†   r  r5  r@   r@   rC   Úgenerate_delete  s    

zQueryCompiler.generate_deletec                 C   s    |   | ¡ ¡}| |¡}t|Ž S r?   )rú  rø  r  r   )rA   r+  r  r  r@   r@   rC   Úfield_definition  s    
zQueryCompiler.field_definitionc                 C   sj   t dƒt| ¡ ƒt dƒ|j ¡ t|j ¡ ƒg}|jrH| t d|j ƒ¡ |jrb| t d|j ƒ¡ t|Ž S )NzFOREIGN KEYÚ
REFERENCESzON DELETE %szON UPDATE %s)	r7   r¯  r  r-  rÏ  rz  r…   r{  r   )rA   r+  r  r@   r@   rC   Úforeign_key_constraint  s    
ûz$QueryCompiler.foreign_key_constraintc                    s   ‡ fdd„}|S )Nc                    s   t | ˆ ƒ}|  |||Ž¡S r?   )r´   rÛ  )rA   r
  r  r   ©Úfunction_namer@   rC   r  "  s    
z/QueryCompiler.return_parsed_node.<locals>.innerr@   )rQ  r  r@   rP  rC   Úreturn_parsed_node  s    z QueryCompiler.return_parsed_nodec                 C   sN   |pd|j j|j|jj jf }|  |¡}ttdƒ| ¡ tdƒt|ƒf|j	žŽ S )Nzfk_%s_%s_refs_%szALTER TABLEzADD CONSTRAINT)
r�   rŽ   rç  r-  rO  r   r7   r  r7  r«  )rA   r„   r+  r  Ú	fk_clauser@   r@   rC   Ú_create_foreign_key'  s    ý
üûz!QueryCompiler._create_foreign_keyrT  Fc           	         sÚ   |rdnd}|j ‰ g g  }}ˆ jrP‡ fdd„ˆ jjD ƒ}| ttdƒt|Ž ƒ¡ ˆ jD ]4}| |  	|¡¡ t
|tƒrV|jsV| |  |¡¡ qV|j jr¾|j jD ] }t
|tƒs²t|ƒ}| |¡ qœtt|ƒ| ¡ t|| Ž ƒS )NzCREATE TABLE IF NOT EXISTSzCREATE TABLEc                    s   g | ]}ˆ j |  ¡ ‘qS r@   )r&  r  ©rK  rÏ  ©rK   r@   rC   rL  ;  s   ÿz/QueryCompiler._create_table.<locals>.<listcomp>r  )r�   Úcomposite_keyr½  r�  r…   r   r7   r¯  Údeclared_fieldsrM  rS   r    ry  rO  rë  r=  r  )	rA   r„   Úsafer4  Úcolumnsrë  Úpk_colsr+  r  r@   rV  rC   Ú_create_table5  s2    

ÿ ÿ


ýzQueryCompiler._create_tabler\  c                 C   s6   |rdnd}t |ƒ| ¡ g}|r.| t dƒ¡ t|Ž S )NzDROP TABLE IF EXISTSz
DROP TABLEÚCASCADE©r7   r  r…   r   )rA   r„   Úfail_silentlyÚcascader4  r  r@   r@   rC   Ú_drop_tableP  s
    zQueryCompiler._drop_tablera  c                 C   s<   t dƒ| ¡ g}|r"| t dƒ¡ |r4| t dƒ¡ t|Ž S )NzTRUNCATE TABLEzRESTART IDENTITYr]  r^  )rA   r„   Úrestart_identityr`  r  r@   r@   rC   Ú_truncate_tableX  s    zQueryCompiler._truncate_tablerc  c                 C   sR   d|d  |¡f }t|ƒdkrNt | d¡¡ ¡ }d|d d… |d d… f }|S )Nz%s_%srö  é@   r'  é7   é   )r  rš   ÚhashlibÚmd5r[   Ú	hexdigest)rA   ÚtablerZ  rã  Ú
index_hashr@   r@   rC   Ú
index_nameb  s
    zQueryCompiler.index_namec                 G   s^   |j j}|rdnd}|  |dd„ |D ƒ¡}tt|ƒt|ƒtdƒ| ¡ tdd„ |D ƒŽ f|žŽ S )NzCREATE UNIQUE INDEXzCREATE INDEXc                 S   s   g | ]
}|j ‘qS r@   ©rç  rU  r@   r@   rC   rL  l  s     z/QueryCompiler._create_index.<locals>.<listcomp>r	  c                 S   s   g | ]}|  ¡ ‘qS r@   r7  r8  r@   r@   rC   rL  r  s     )r�   rŽ   rl  r   r7   r7  r  r¯  )rA   r„   r&  rä  r|  Útbl_namer4  rl  r@   r@   rC   Ú_create_indexi  s    ûúzQueryCompiler._create_indexro  c                 C   s<   |j j}|rdnd}|  |dd„ |D ƒ¡}tt|ƒt|ƒƒS )NzDROP INDEX IF EXISTSz
DROP INDEXc                 S   s   g | ]
}|j ‘qS r@   rm  rU  r@   r@   rC   rL  y  s     z-QueryCompiler._drop_index.<locals>.<listcomp>)r�   rŽ   rl  r   r7   r7  )rA   r„   r&  r_  rn  r4  rl  r@   r@   rC   Ú_drop_indexv  s    zQueryCompiler._drop_indexrp  c                 C   s   t tdƒt|ƒƒS )NzCREATE SEQUENCE©r   r7   r7  ©rA   Úsequence_namer@   r@   rC   Ú_create_sequence}  s    zQueryCompiler._create_sequencert  c                 C   s   t tdƒt|ƒƒS )NzDROP SEQUENCErq  rr  r@   r@   rC   Ú_drop_sequence�  s    zQueryCompiler._drop_sequenceru  )r³  r´  NN)NN)Nr®  )N)N)N)N)F)FF)FF)F)YrE   rF   rG   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Â  rÄ  rÃ  rÅ  rÆ  rÇ  rÉ  rÈ  rË  rÊ  rÌ  rô  rÛ  rß  rå  r  r  rä  r6  r¯  r:  rK  rL  rM  rO  rR  rT  Úcreate_foreign_keyr\  Úcreate_tablera  Ú
drop_tablerc  Útruncate_tablerl  ro  Úcreate_indexrp  Ú
drop_indexrt  Úcreate_sequenceru  Údrop_sequencer@   r@   r@   rC   r¥    s  ð                         ç    ü  ÿ
	
	'

	

5
?>


  ÿ

r¥  c                   @   s   e Zd Zddd„ZdS )ÚSqliteQueryCompilerFc                 C   s   |  ¡  ¡ S r?   )ÚdeleterŠ  )rA   r„   rb  r`  r@   r@   rC   ry  ‡  s    z"SqliteQueryCompiler.truncate_tableN)FF)rE   rF   rG   ry  r@   r@   r@   rC   r~  †  s     ÿr~  c                   @   s    e Zd Zdd„ Zdd„ ZeZdS )ÚResultIteratorc                 C   s   || _ d| _d S rÒ  )ÚqrwÚ_idx)rA   r�  r@   r@   rC   r  �  s    zResultIterator.__init__c                 C   sf   | j | jjk r| jj| j  }n6| jjsP| j ¡ }| jj |¡ | j jd7  _nt‚|  j d7  _ |S r[  )r‚  r�  Ú_ctÚ_result_cacheÚ
_populatedÚiterater…   ÚStopIterationr   r@   r@   rC   Únext‘  s    
zResultIterator.nextN)rE   rF   rG   r  rˆ  Ú__next__r@   r@   r@   rC   r€  Œ  s   r€  c                   @   sd   e Zd ZdZddd„Zdd„ Zedd„ ƒZd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZeZddd„ZdS )ÚQueryResultWrapperzí
    Provides an iterator over the results of a raw Query, additionally doing
    two things:
    - converts rows from the database into python representations
    - ensures that multiple iterations do not result in multiple queries
    Nc                 C   sP   || _ || _d| _d| _g | _d| _d| _|d k	r@|\| _| _nd  | _| _d S )Nr   F)	r†   Úcursorrƒ  r‚  r„  r…  Ú_initializedÚcolumn_metaÚ	join_meta)rA   r†   r‹  rK   r@   r@   rC   r  ¦  s    zQueryResultWrapper.__init__c                 C   s   | j rt| jƒS t| ƒS d S r?   )r…  Úiterr„  r€  r  r@   r@   rC   Ú__iter__¶  s    
zQueryResultWrapper.__iter__c                 C   s   |   ¡  | jS r?   )Ú
fill_cacherƒ  r  r@   r@   rC   r‘  ¼  s    zQueryResultWrapper.countc                 C   s   | j S r?   )r‘  r  r@   r@   rC   Ú__len__Á  s    zQueryResultWrapper.__len__c                 C   s   |S r?   r@   ©rA   Úrowr@   r@   rC   Úprocess_rowÄ  s    zQueryResultWrapper.process_rowc                 C   sV   | j  ¡ }|s2d| _t| j dd ƒs,| j  ¡  t‚n| jsL|  | j j¡ d| _|  	|¡S )NTr�   )
r‹  Úfetchoner…  r´   Úcloser‡  rŒ  r  Údescriptionr•  r“  r@   r@   rC   r†  Ç  s    

zQueryResultWrapper.iteratec                 c   s   |   ¡ V  q d S r?   )r†  r  r@   r@   rC   ÚiteratorÓ  s    zQueryResultWrapper.iteratorc                 C   sh   | j | jk r*| j| j  }|  j d7  _ |S | jr4t‚|  ¡ }| j |¡ |  jd7  _|  j d7  _ |S r[  )r‚  rƒ  r„  r…  r‡  r†  r…   )rA   rK  r  r@   r@   rC   rˆ  ×  s    zQueryResultWrapper.nextc                 C   s`   |p
t dƒ}|dk rtdƒ‚| j| _| js\|| jkr\zt| ƒ W q$ tk
rX   Y q\Y q$X q$d S )NÚInfr   z"Negative values are not supported.)r  r|   rƒ  r‚  r…  rˆ  r‡  ©rA   Únr@   r@   rC   r‘  æ  s    zQueryResultWrapper.fill_cache)N)N)rE   rF   rG   r$  r  r�  r×  r‘  r’  r•  r†  r™  rˆ  r‰  r‘  r@   r@   r@   rC   rŠ  Ÿ  s   

rŠ  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚExtQueryResultWrapperc                 C   s”   t |ƒ}g  | _}| jd k	rht | jƒ}t| jƒD ](\}}|  ||¡s0|  || d |¡ q0||krld S nd}t||ƒD ]}|  || d |¡ qvd S rÒ  )rš   r×  r�  rû  Ú_initialize_nodeÚ_initialize_by_namer›   )rA   r˜  Ún_colsr×  Ún_metar�   r>  r@   r@   rC   r  ò  s    


z ExtQueryResultWrapper.initializec                 C   sH   | j jj}||kr2|| }| j ||j|jf¡ n| j ||d f¡ d S r?   )r†   r�   rZ  r×  r…   r�   r  )rA   r�   r�   Ú
model_colsr+  r@   r@   rC   rŸ  	  s
    
z)ExtQueryResultWrapper._initialize_by_namec                 C   sŽ   t |tƒr*| j ||jp|j|jf¡ dS t |tƒrŠt|j	ƒrŠ|j	d }t |tƒrŠ|jpb|jpb|j}|j
rp|jprd }| j |||f¡ dS dS )NTr   F)rS   r   r×  r…   r8  r�   r  r�  rš   r“  r•  )rA   r>  r�   Úargr�   r  r@   r@   rC   rž  
	  s    


z&ExtQueryResultWrapper._initialize_nodeN)rE   rF   rG   r  rŸ  rž  r@   r@   r@   rC   r�  ñ  s   r�  c                   @   s   e Zd Zdd„ ZdS )ÚTuplesQueryResultWrapperc                    s   t ‡ fdd„t|ƒD ƒƒS )Nc                    s8   g | ]0\}}ˆ j | d  dkr"|nˆ j | d  |ƒ‘qS )rN   Nr÷  )rK  r�   Úcolr  r@   rC   rL  	  s   ÿz8TuplesQueryResultWrapper.process_row.<locals>.<listcomp>)r“  rû  r“  r@   r  rC   r•  	  s    ÿz$TuplesQueryResultWrapper.process_rowN©rE   rF   rG   r•  r@   r@   r@   rC   r¤  	  s   r¤  c                   @   s   e Zd Zdd„ ZdS )ÚNaiveQueryResultWrapperc                 C   sJ   |   ¡ }| jD ].\}}}t|||d k	r2||| ƒn|| ƒ q| ¡  |S r?   )r†   r×  rC  Ú_prepare_instance)rA   r”  r:  r�   ÚcolumnrÏ  r@   r@   rC   r•  !	  s
    &z#NaiveQueryResultWrapper.process_rowNr¦  r@   r@   r@   rC   r§   	  s   r§  c                   @   s   e Zd Zdd„ ZdS )ÚDictQueryResultWrapperc                 C   s:   i }| j D ]*\}}}|d k	r(||| ƒn|| ||< q
|S r?   r÷  )rA   r”  r—  r�   r©  rÏ  r@   r@   rC   r•  ,	  s    "z"DictQueryResultWrapper.process_rowNr¦  r@   r@   r@   rC   rª  +	  s   rª  c                   @   s>   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zdd
d„Zdd„ Zd	S )ÚModelQueryResultWrapperc                 C   s4   |   ¡ \| _}tdd„ | jD ƒƒ| _|  |¡| _d S )Nc                 s   s   | ]}t |tƒr|V  qd S r?   )rS   r   )rK  r¥  r@   r@   rC   rO  8	  s    
ÿz5ModelQueryResultWrapper.initialize.<locals>.<genexpr>)Úgenerate_column_mapÚ
column_mapr’   r�  Ú_col_setÚgenerate_join_listÚ	join_list)rA   r˜  Ú	model_setr@   r@   rC   r  6	  s    z"ModelQueryResultWrapper.initializec           	      C   sä   g }t | jgƒ}t| jƒD ]À\}}d  }}t|tƒrrt|tƒrT|j}|j}|jj	}n|j
 }}|j	}|jpn|j}nL|jd krˆ| j }}n
|j }}t|tƒrª|jrª|j}nt|tƒr¾|jd }| ||||f¡ | |¡ q||fS ©Néÿÿÿÿ)r’   r†   rû  r�  rS   r   rÎ  Ú_model_aliasÚfield_instancer  r„   r8  r�   rA  r=  r7  rŽ  r…   r€   )	rA   r­  rŠ   r�   r>  rÄ   r×  r�   Úconstructorr@   r@   rC   r¬  <	  s,    







z+ModelQueryResultWrapper.generate_column_mapc                 C   s´   g }| j }| jg}|r°| ¡ }||kr(q|| D ]|}|j}|j|ksN|j|kr0|jd k	r‚|j| jk}|j| jk}	|jj	o~|p~|	}
nd }
 }}	| 
||
||	f¡ | 
|j¡ q0q|S r?  )rŽ  r†   rQ  rÖ  r¼  rº  r‡   r®  r½  râ  r…   )rA   rŠ   r°  r  ÚstackÚcurrentr  rÖ  Ú
fk_presentÚ
pk_presentÚcheckr@   r@   rC   r¯  X	  s2    
ÿüz*ModelQueryResultWrapper.generate_join_listc                 C   s.   |   |¡}|  |¡}|D ]}| ¡  q|d S rÒ  )Úconstruct_instancesÚfollow_joinsr¨  )rA   r”  Ú	collectedÚ	instancesr�   r@   r@   rC   r•  u	  s
    


z#ModelQueryResultWrapper.process_rowNc                 C   sŒ   i }t | jƒD ]x\}\}}}}|d k	r0||kr0q|| }	||krJ|ƒ ||< || }
|d krj| jj| d }t|
||d kr||	n||	ƒƒ q|S rÒ  )rû  r­  r‹  r˜  rC  )rA   r”  rB  Úcollected_modelsr�   r�   r¶  rÄ   r×  ra   r:  r@   r@   rC   r¼  |	  s    
z+ModelQueryResultWrapper.construct_instancesc              	   C   sN  || j  g}| jD �]4\}}}}||j }z||j }W n tk
rV   ||j }Y nX d}	|rŠ|rv|j |jj	¡}	n|rŠ|j |j
j	¡}	|	s�q|j
d k	}
|
oº|j|jkoºt||j
j	ƒd k}|rØt||j
j	|j|j ƒ |j�r0|
�o|jd k	�ot||j
j	ƒd k	�o|j |jj	¡d k}|�r0t||jj	|ƒ t||j|ƒ | |¡ q|S ©NT)r†   r°  r»  r¼  ÚKeyErrorrº  rÜ  rÝ  r‡   r�   r½  rÄ   r´   rC  r¾  r…   )rA   r¾  ÚpreparedrÖ  Ú
check_nullr¹  rº  rK  Újoined_instÚhas_fkÚmpkÚcan_populate_joined_pkÚcan_populate_joined_fkr@   r@   rC   r½  ‹	  sX    


ÿý
ýÿþüýz$ModelQueryResultWrapper.follow_joins)N)	rE   rF   rG   r  r¬  r¯  r•  r¼  r½  r@   r@   r@   rC   r«  5	  s   
r«  Ú	JoinCache©rÖ  rÄ   c                       s8   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )	ÚAggregateQueryResultWrapperc                    s   g | _ tt| ƒj||Ž d S r?   )Ú_rowr  rÌ  r  r  r"  r@   rC   r  À	  s    z$AggregateQueryResultWrapper.__init__c                    s¶  t t| ƒ |¡ tƒ | _| jD ]\}}}}| j |¡ qtƒ | _i | _i | _	i | _
| jD ]˜\}}}}|jrt|jj}n|j}|jp„|j}|rš| j |j¡ n&| j
 |jtƒ ¡ | j
|j  |j¡ | j	 |ji ¡ t||jpÜ|d�| j	|j |j< qXi | _i }t| jƒD ]^\}\}}	}
}|| jk�rD| j |g ¡ | j|  ||
f¡ | |g ¡ ||  ||
f¡ �q| jD ]D}|| jk�r€�ql| j
 |d¡}|D ]}| j|  || ¡ �q’�qld S )NrË  r@   )r  rÌ  r  r’   Ú
all_modelsr­  r€   Úmodels_with_aggregateÚback_referencesÚsource_to_destÚdest_to_sourcer°  r¾  r‡   r}  rÄ   r¿  r»  rX  r¼  rÊ  rO  Úcolumns_to_comparerû  r…   rÝ  rI  )rA   r˜  r�   rö  rÖ  rÚ  r¾  Úkey_to_columnsrþ  r„   Úcol_namerË  ÚsourcesÚjoined_modelr"  r@   rC   r  Ä	  sL    
þ

ÿz&AggregateQueryResultWrapper.initializec                 C   sD   i }| j  ¡ D ]0\}}g ||< |D ]\}}||  || ¡ q"q|S r?   )rÓ  r£  r…   )rA   r”  rŠ   r„   Úcolumn_datarþ  rÕ  r@   r@   rC   Úread_model_dataú	  s    z+AggregateQueryResultWrapper.read_model_datac              
   C   s8  | j r| j  ¡ }n
| j ¡ }|sDd| _t| jdd ƒs>| j ¡  t‚n| js^|  	| jj
¡ d| _dd„ }i }|  |¡}|| j }| ¡ D ]"\}}tƒ ||< ||| ||ƒ< q†|  |¡}| j ¡ }	|	d krÊ�q~tƒ }
|  |	¡}| ¡ D ]\}}|| |krâ|
 |¡ qâ|
�s| j  |	¡ �q~| j|
 }|  |	|¡}| ¡ D ]D\}}d}|j ¡ D ]}|d k	�rLd}�qL|�s6||| ||ƒ< �q6q´| jg}|g}|�r | ¡ }|| jk�rª�qŒ| j| D �]d}z| j| |j \}}W n tk
�rî   Y �q´Y nX |j�s |j�r¬||  ¡ D ]}t||g ƒ �q|j|k�r0�q´||j  ¡ D ]j\}}|d k�rT�q>z|| |j|jj  }W n tk
�rŠ   Y �q>Y nX t||ƒ |¡ | |¡ �q>n`|�r|j|k�rÂ�q´||  ¡ D ]<\}}||j |j|jj  }t||jj|ƒ | |¡ �qÎ| |j¡ �q´�qŒ|D ]}| ¡  �q$|S )NTr�   c                    s,   ˆ j jr$t‡ fdd„ˆ j jjD ƒƒS ˆ  ¡ S )Nc                    s   g | ]}ˆ j | ‘qS r@   )rÜ  r�  r’  r@   rC   rL  
  s   ÿzHAggregateQueryResultWrapper.iterate.<locals>._get_pk.<locals>.<listcomp>)r�   rW  r“  r½  r�  rŽ  r’  r@   r’  rC   Ú_get_pk
  s
    þz4AggregateQueryResultWrapper.iterate.<locals>._get_pkF) rÍ  rQ  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¿  rC  r‡   r�   r¨  )rA   r”  rÚ  Úidentity_mapÚ_constructedÚprimary_instancerË  r:  Ú
model_dataÚcur_rowÚduplicate_modelsÚcur_row_datar„   ÚdataÚdifferent_modelsÚnew_instancesÚall_nonera   r·  r¿  r¸  r  rÖ  rÄ   ÚpkrK  rÅ  r@   r@   rC   r†  
  s¦    










ÿÿýz#AggregateQueryResultWrapper.iterate)rE   rF   rG   r  r  rÙ  r†  r%  r@   r@   r"  rC   rÌ  ¿	  s   6rÌ  c                       sÎ   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	d+dd„Z
dd„ Zedd„ ƒZedd„ ƒZed,dd„ƒZed-dd„ƒZd.dd„Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd/d)d*„Z‡  ZS )0ÚQueryz?Base class representing a database query on one or more tables.Tc                    s@   t t| ƒ ¡  || _|jj| _d| _|| _| jg i| _d | _	d S rÁ  )
r  rç  r  r„   r�   rö  rÞ  Ú
_query_ctxr  r  ©rA   r„   r"  r@   rC   r  v
  s    
zQuery.__init__c                 C   s   |   ¡ \}}d| j||f S )NrÙ  )rŠ  r„   ©rA   rŠ  r‹  r@   r@   rC   rž  �
  s    zQuery.__repr__c                 C   s    t | ƒ| jƒ}| j|_|  |¡S r?   )r  r„   rö  Ú_clone_attributesrµ  r@   r@   rC   r	  …
  s    zQuery.clonec                 C   s,   | j d k	r| j  ¡ |_ |  ¡ |_| j|_|S r?   )r  r	  Ú_clone_joinsr  rè  rµ  r@   r@   rC   rë  Š
  s
    

zQuery._clone_attributesc                 C   s   t dd„ | j ¡ D ƒƒS )Nc                 s   s   | ]\}}|t |ƒfV  qd S r?   )r”   )rK  ÚmcÚjr@   r@   rC   rO  ’
  s    z%Query._clone_joins.<locals>.<genexpr>)Údictr  r£  r  r@   r@   rC   rì  ‘
  s    ÿzQuery._clone_joinsNc                 C   s,   t tj|ƒ}|d kr|S |p tj}|||ƒS r?   )rR   r•  r–  )rA   Úinitialr˜  ÚconjunctionÚreducedr@   r@   rC   Ú_add_query_clauses•
  s
    
zQuery._add_query_clausesc                 C   sx   g }|D ]j}t |tƒr"| |¡ qt |tƒr8| |¡ qt |tƒrR| | ¡ ¡ qt|ƒrt|t	ƒr| |j
j¡ q|S r?   )rS   r=  r…   rç  rÊ  rI  Úget_proxy_fieldsr
   rv  r*   r�   rX  )rA   r
  Úaccumr£  r@   r@   rC   Ú_model_shorthandœ
  s    


zQuery._model_shorthandc                 G   s   |   | j|¡| _d S r?   )ró  r  ©rA   r˜  r@   r@   rC   rq  ©
  s    zQuery.wherec                 G   s   |   | j|tj¡| _d S r?   )ró  r  r•  Úor_r÷  r@   r@   rC   Úorwhere­
  s
      ÿzQuery.orwherec                 C   sŠ   | j }|s8t|tƒp(t|ƒo(|j |¡ }|rNtdƒ‚nt|tƒrN|jj| }| j	 
|g ¡ | j	|  t||||ƒ¡ t|tƒs†|| _ d S )Nz#A join condition must be specified.)rè  rS   rÃ  r
   r�   Ú
rel_existsr|   r:  r&  r  rX  r…   rÁ  )rA   r¼  rÈ  rÍ  r»  Úrequire_join_conditionr@   r@   rC   r  ²
  s    
þ


z
Query.joinc                 C   s   |p| j | _dS )z"Change or reset the query context.N)r„   rè  ré  r@   r@   rC   ÚswitchÂ
  s    zQuery.switchc                 K   sN   | j }| j |g ¡D ]}|j|kr|   S q|  |¡j|fd|i|—Ž |¡S )NrÍ  )rè  r  rÝ  r¼  rü  r  )rA   ÚlmÚrmrÍ  Újoin_kwargsÚctxr  r@   r@   rC   Úensure_joinÇ
  s
    

zQuery.ensure_joinc                 C   s¶   g }g }t tf}t| ¡ ƒD ]�\}}| j}d|kr`| dd¡d tkr`| dd¡\}}t| }ntj}| 	d¡D ](}	t
||	ƒ}
t|
|ƒrp|
j}| |
¡ qp| t|
||ƒ¡ q||fS )NÚ__r˜   )r    ro  r“   r£  r„   ÚrsplitÚ
DJANGO_MAPr`  rç   Úsplitr´   rS   r-  r…   rY  )rA   Úqdictrõ  r  Úrelationshipr�   ra   r  r^  ÚpieceÚ
model_attrr@   r@   rC   Úconvert_dict_to_nodeÎ
  s     


zQuery.convert_dict_to_nodec                 O   sH  t ƒ }|r$|ttjdd„ |D ƒƒM }|r6|tf |ŽM }t|gƒ}tƒ }|rÖ| ¡ }t|t	ƒs^qFd|j
fd|jffD ]`\}}t|tƒrÈ|  |j¡\}	}
| |
¡ ttj|	ƒ}|j|_|j|_t|||ƒ qr| |¡ qrqF|j}|  ¡ }	|D ]T}t|tƒ�r|j|j }}|}n"t|tƒ�r.|jj|j }}|j}|	 |||¡}	qè|	 |¡S )Nc                 S   s   g | ]}|  ¡ ‘qS r@   r  )rK  rN  r@   r@   rC   rL  å
  s     z Query.filter.<locals>.<listcomp>r¡  r[  )r=  rR   r•  r–  r   r   r’   ÚpopleftrS   rY  r¡  r[  r
  r´  r  r@  r8  rC  r…   r	  r    r„   r-  ro  r+  r  rq  )rA   r
  r  Údq_noderÐ  Údq_joinsr  Úsider  r´  r  rl  r+  rý  rþ  Ú	field_objr@   r@   rC   r�  á
  s>    



zQuery.filterc                 C   s
   | j  ¡ S r?   )rö  rù  r  r@   r@   rC   rù  	  s    zQuery.compilerc                 C   s   t ‚d S r?   ©r  r  r@   r@   rC   rŠ    s    z	Query.sqlc                 C   s   |   ¡ \}}| j ||| j¡S r?   )rŠ  rö  Úexecute_sqlÚrequire_commitrê  r@   r@   rC   Ú_execute  s    zQuery._executec                 C   s   t ‚d S r?   r  r  r@   r@   rC   Úexecute  s    zQuery.executeFc                 C   s6   |r|   ¡  ¡ }n|  ¡  ¡ }|r.|s.|d S |S d S rÒ  )Útuplesrë  r  r–  )rA   Úas_tupleÚconvertr”  r@   r@   rC   Úscalar  s    zQuery.scalar)N)NN)N)N)FF)rE   rF   rG   r$  r  r  rž  r	  rë  rì  ró  rö  r  rq  rù  r  rü  r  r
  r�  rù  rŠ  r  r  r  r%  r@   r@   r"  rC   rç  r
  s2   



(rç  c                       st   e Zd ZdZ‡ fdd„Zdd„ ZedƒZedƒZedƒZ	e
dd
d„ƒZe
ddd„ƒZdd„ Zdd„ Zdd„ Z‡  ZS )ÚRawQueryzh
    Execute a SQL query, returning a standard iterable interface that returns
    model instances.
    c                    s6   || _ t|ƒ| _d | _d| _d| _tt| ƒ |¡ d S r?  )	Ú_sqlr”   Ú_paramsÚ_qrÚ_tuplesÚ_dictsr  r  r  )rA   r†   r´  r‹  r"  r@   rC   r  %  s    
zRawQuery.__init__c                 C   s*   t | j| jf| jžŽ }| j|_| j|_|S r?   )r  r„   r  r  r  r  rµ  r@   r@   rC   r	  -  s    zRawQuery.cloneÚjoiningrq  rü  Tc                 C   s
   || _ d S r?   ©r  ©rA   r  r@   r@   rC   r  7  s    zRawQuery.tuplesc                 C   s
   || _ d S r?   ©r  ©rA   Údictsr@   r@   rC   r$  ;  s    zRawQuery.dictsc                 C   s   | j | jfS r?   )r  r  r  r@   r@   rC   rŠ  ?  s    zRawQuery.sqlc                 C   sX   | j d krR| jr| j t¡}n | jr2| j t¡}n| j t¡}|| j|  	¡ d ƒ| _ | j S r?   )
r  r  rö  Úget_result_wrapperÚRESULTS_TUPLESr  ÚRESULTS_DICTSÚRESULTS_NAIVEr„   r  )rA   ÚQRWr@   r@   rC   r  B  s    
zRawQuery.executec                 C   s   t |  ¡ ƒS r?   ©r�  r  r  r@   r@   rC   r�  M  s    zRawQuery.__iter__)T)T)rE   rF   rG   r$  r  r	  r  r  rq  rü  r  r  r$  rŠ  r  r�  r%  r@   r@   r"  rC   r     s   r  c                 K   s8   |  dd¡}|rtdƒ‚|r,| p"g | p*d S |r4|S d S )NrI  Fz,"extend" is the only valid keyword argument.)rQ  r|   )ÚorigÚnew_valr  rI  r@   r@   rC   Úallow_extendP  s    r-  c                       sä  e Zd ZdZ‡ fdd„Z‡ fdd„Zdd„ ZeeƒZedƒZ	ed	ƒZ
ed
ƒZdd„ Zdd„ Zdd„ ZeeƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedZd d!„ƒZed[d#d$„ƒZed\d&d'„ƒZed]d(d)„ƒZed^d*d+„ƒZed_d,d-„ƒZed`d.d/„ƒZedad1d2„ƒZdbd3d4„Z dcd5d6„Z!ddd7d8„Z"ded9d:„Z#dfd;d<„Z$d=d>„ Z%d?d@„ Z&dgdBdC„Z'dhdDdE„Z(dFdG„ Z)dHdI„ Z*dJdK„ Z+dLdM„ Z,dNdO„ Z-dPdQ„ Z.dRdS„ Z/dTdU„ Z0dVdW„ Z1e2�rÜdXdY„ Z3‡  Z4S )irÃ  rÀ  c                    s‚   t t| ƒ |¡ | jj| _| j|Ž  d | _d | _d | _	d | _
d | _d | _d | _d| _d| _d| _d| _d| _d| _d | _d | _d S )NF)FF)r  rÃ  r  rö  Úcommit_selectr  Ú_SelectQuery__selectr  r  r  r   r  r!  r"  r  r$  Ú_naiver  r  Ú_aggregate_rowsr8  r  )rA   r„   Ú	selectionr"  r@   rC   r  \  s$    

zSelectQuery.__init__c                    s  t t| ƒ |¡}| j|_t| jƒ|_| jd k	rhg |_| jD ],}t|tƒrZ|j 	| 
¡ ¡ q:|j 	|¡ q:| jd k	r~t| jƒ|_| jr�| j 
¡ |_| jd k	r¦t| jƒ|_| jd k	r¼t| jƒ|_| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j|_|S r?   )r  rÃ  rë  rñ  r”   rò  r  rS   r=  r…   r	  r  r  r   r  r!  r"  r  r$  r0  r  r  r1  r8  )rA   r´  rÏ  r"  r@   rC   rë  p  s6    





zSelectQuery._clone_attributesc                    s   ‡ fdd„}|S )Nc                    s0   | j jjj}ˆ |kr tdˆ  ƒ‚t| j | ˆ |ƒS )Nz!Your database does not support %s)r„   r�   rö  Úcompound_operationsr|   r  )rA   r—  Úsupported_ops©r•  r@   rC   r  �  s    ÿz&SelectQuery.compound_op.<locals>.innerr@   )r•  r  r@   r5  rC   Úcompound_opŽ  s    zSelectQuery.compound_opÚUNIONÚ	INTERSECTÚEXCEPTc                 C   s4   | j  tdƒ¡ t| |@ ƒ d¡¡ ¡ }| |B | S )NrÊ   rö  )r„   rp  r7   Úfrom_r¯  rO  r™  )rA   r[  Úwrapped_rhsr@   r@   rC   rw  ›  s    ÿzSelectQuery.__xor__c                 C   s   t  d¡| |ƒS )Nú	UNION ALL)rÃ  Ú_compound_op_staticrZ  r@   r@   rC   Ú	union_all¡  s    zSelectQuery.union_allc                 G   s,   t |ƒdk| _|p| jjj}|  |¡| _d S rÒ  )rš   rñ  r„   r�   rX  rö  rò  ©rA   r2  r@   r@   rC   Ú__select¤  s    zSelectQuery.__selectc                 G   s   |rt |ƒnd | _d S r?   )r”   r  )rA   r
  r@   r@   rC   r:  ª  s    zSelectQuery.from_c                 O   s   |r|   |¡nd | _d S r?   )rö  r  r  r@   r@   rC   Úgroup_by®  s    zSelectQuery.group_byc                 G   s   |   | j|¡| _d S r?   )ró  r  r÷  r@   r@   rC   Úhaving²  s    zSelectQuery.havingc                 O   s   t | jt|ƒf|Ž| _d S r?   )r-  r   r”   r  r@   r@   rC   r™  ¶  s    zSelectQuery.order_byc                 O   s   t | jt|ƒf|Ž| _d S r?   )r-  r  r”   )rA   Úwindowsr  r@   r@   rC   rœ  º  s    zSelectQuery.windowc                 C   s
   || _ d S r?   )r!  )rA   Úlimr@   r@   rC   r(  ¾  s    zSelectQuery.limitc                 C   s
   || _ d S r?   )r"  )rA   Úoffr@   r@   rC   ÚoffsetÂ  s    zSelectQuery.offseté   c                 C   s$   |dkr|d8 }|| _ || | _d S ©Nr   r˜   )r!  r"  )rA   ÚpageÚpaginate_byr@   r@   rC   ÚpaginateÆ  s    zSelectQuery.paginateTc                 C   s
   || _ d S r?   )r  )rA   Úis_distinctr@   r@   rC   ÚdistinctÍ  s    zSelectQuery.distinctFc                 C   s   ||f| _ d S r?   )r$  )rA   r)  Únowaitr@   r@   rC   r)  Ñ  s    zSelectQuery.for_updatec                 C   s
   || _ d S r?   )r0  )rA   Únaiver@   r@   rC   rO  Õ  s    zSelectQuery.naivec                 C   s
   || _ d S r?   r   r!  r@   r@   rC   r  Ù  s    zSelectQuery.tuplesc                 C   s
   || _ d S r?   r"  r#  r@   r@   rC   r$  Ý  s    zSelectQuery.dictsc                 C   s
   || _ d S r?   )r1  )rA   Úaggregate_rowsr@   r@   rC   rP  á  s    zSelectQuery.aggregate_rowsNc                 C   s
   || _ d S r?   rM  )rA   rO  r@   r@   rC   rO  å  s    zSelectQuery.aliasc                 C   sx   |d krt  |jj¡ d¡}| j|kr4|  | j¡}n|  ¡ }| 	|j|¡}|j
sbdd„ |jD ƒ|_
t|jƒ|f |_|S )Nr‘  c                 S   s   g | ]}|  ¡ ‘qS r@   )rO  )rK  ry   r@   r@   rC   rL  ò  s     z(SelectQuery.annotate.<locals>.<listcomp>)r   ÚCountr�   r½  rO  rè  rü  r„   r	  r  r  rò  r“  )rA   r-  Ú
annotationr´  r@   r@   rC   Úannotateé  s    
zSelectQuery.annotatec                 C   s*   |d krt  tdƒ¡}|  ¡ }|g|_|S )NrÊ   )r   rQ  r7   r™  rò  )rA   Úaggregationr´  r@   r@   rC   Ú
_aggregateö  s
    zSelectQuery._aggregatec                 C   s   |   |¡j|d�S )N©r  )rU  r  )rA   rT  r  r@   r@   rC   Ú	aggregateý  s    zSelectQuery.aggregatec                 C   s4   | j s| js| js| jr$| j|d�S | jdd�p2dS )N©Úclear_limitFrV  r   )r  r  r!  r"  Úwrapped_countrW  ©rA   rY  r@   r@   rC   r‘     s    zSelectQuery.countc                 C   sJ   |   ¡ }|rd  |_|_| ¡ \}}d| }| jj|f|žŽ }| ¡ pHdS )Nz+SELECT COUNT(1) FROM (%s) AS wrapped_selectr   )r™  r!  r"  rŠ  r„   Úrawr  )rA   rY  r	  rŠ  r‹  ÚwrappedÚrqr@   r@   rC   rZ    s    zSelectQuery.wrapped_countc                 C   s$   |   dd¡}tdƒg|_t| ¡ ƒS )Nr˜   Ú1)rK  r7   rò  ri  r  r¬  r@   r@   rC   Úexists  s    zSelectQuery.existsc                 C   sH   |   dd¡}zt| ¡ ƒW S  tk
rB   | j d|  ¡  ¡‚Y nX d S )Nr˜   z:Instance matching query does not exist:
SQL: %s
PARAMS: %s)rK  rˆ  r  r‡  r„   r   rŠ  r¬  r@   r@   rC   rÝ    s    ÿÿzSelectQuery.getr˜   c                 C   s<   |   ¡ }| |¡ |jd |… }|r8|dkr4|d S |S d S ©Nr˜   r   )r  r‘  r„  )rA   rœ  r—  rŠ   r@   r@   rC   Úpeek  s
    
zSelectQuery.peekc                 C   s"   | j |kr|| _ d| _| j|d�S )NT)rœ  )r!  rÞ  rb  r›  r@   r@   rC   rë  &  s    
zSelectQuery.firstc                 C   s   |   ¡  | ¡S r?   )rù  rä  r  r@   r@   rC   rŠ  ,  s    zSelectQuery.sqlc                 C   sT   | j }| jD ]B}t|tƒr*|j |kr* dS t|tƒr|jd k	r|j|kr dS qdS )NFT)r„   rò  rS   r   r=  rA  )rA   r„   r>  r@   r@   rC   Úverify_naive/  s    

zSelectQuery.verify_naivec                 C   s   | j | jfS r?   )rò  r  r  r@   r@   rC   Úget_query_meta9  s    zSelectQuery.get_query_metac                 C   sf   | j r| j t¡S | jr$| j t¡S | js8| jr8|  ¡ rD| j t	¡S | j
rV| j t¡S | j t¡S d S r?   )r  rö  r%  r&  r  r'  r0  r  rc  r(  r1  ÚRESULTS_AGGREGATE_MODELSÚRESULTS_MODELSr  r@   r@   rC   Ú_get_result_wrapper<  s    zSelectQuery._get_result_wrapperc                 C   sN   | j s| jd krD| j}|  ¡ }|  ¡ }|||  ¡ |ƒ| _d| _ | jS | jS d S r?  )rÞ  r  r„   rd  rg  r  )rA   r„   Ú
query_metaÚResultWrapperr@   r@   rC   r  H  s    zSelectQuery.executec                 C   s   t |  ¡ ƒS r?   r*  r  r@   r@   rC   r�  S  s    zSelectQuery.__iter__c                 C   s   t |  ¡  ¡ ƒS r?   ©r�  r  r™  r  r@   r@   rC   r™  V  s    zSelectQuery.iteratorc                 C   sN   |   ¡ }t|tƒr|j}n|}|d k	r:|dkr6|d nd }| |¡ |j| S rH  )r  rS   ÚsliceÚstopr‘  r„  )rA   ra   r—  rã  r@   r@   rC   r¡  Y  s    

zSelectQuery.__getitem__c                 C   s   t |  ¡ ƒS r?   )rš   r  r  r@   r@   rC   r’  d  s    zSelectQuery.__len__c                 C   s   t | ƒS r?   )Úidr  r@   r@   rC   r  h  s    zSelectQuery.__hash__)rG  )T)TF)T)T)T)T)N)N)N)NT)F)F)r˜   )r˜   )5rE   rF   rG   rn  r  rë  r6  r5  r=  rq  rp  rs  rw  r>  r/  r  rp  r:  rA  rB  r™  rœ  r(  rF  rK  rM  r)  rO  r  r$  rP  rO  rS  rU  rW  r‘  rZ  r`  rÝ  rb  rë  rŠ  rc  rd  rg  r  r�  r™  r¡  r’  ÚPY3r  r%  r@   r@   r"  rC   rÃ  Y  s|   












	


rÃ  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚNoopSelectQueryc                 C   s   | j  ¡ dfS ©Nr@   )rö  Úget_noop_sqlr  r@   r@   rC   rŠ  l  s    zNoopSelectQuery.sqlc                 C   s   dS )NrÂ  r@   r  r@   r@   rC   rd  o  s    zNoopSelectQuery.get_query_metac                 C   s   | j  t¡S r?   )rö  r%  r&  r  r@   r@   rC   rg  r  s    z#NoopSelectQuery._get_result_wrapperN)rE   rF   rG   rŠ  rd  rg  r@   r@   r@   rC   ro  k  s   ro  c                       sP   e Zd ZdZd‡ fdd„	Z‡ fdd„Zddd	„Zd
d„ Zdd„ Zdd„ Z	‡  Z
S )r  rÁ  Nc                    s(   || _ || _|| _tt| ƒ |g ¡ d S r?   )r¡  r•  r[  r  r  r  )rA   r„   r¡  r•  r[  r"  r@   rC   r  x  s    zCompoundSelect.__init__c                    s,   t t| ƒ |¡}| j|_| j|_| j|_|S r?   )r  r  rë  r¡  r•  r[  rµ  r"  r@   rC   rë  ~  s
    z CompoundSelect._clone_attributesFc                 C   s   | j |d�S )NrX  )rZ  r[  r@   r@   rC   r‘  …  s    zCompoundSelect.countc                 C   s
   | j  ¡ S r?   )r¡  rd  r  r@   r@   rC   rd  ˆ  s    zCompoundSelect.get_query_metac                 C   s   | j  ¡ o| j ¡ S r?   )r¡  rc  r[  r  r@   r@   rC   rc  ‹  s    zCompoundSelect.verify_naivec                 C   sˆ   | j r| j t¡S | jr$| j t¡S | jr6| j t¡S | jj	pD| j
j	}| jjpZ| j
jpZ| j}|sl|rl|  ¡ rx| j t¡S | j t¡S d S r?   )r  rö  r%  r&  r  r'  r1  re  r¡  r  r[  r0  rc  r(  rf  )rA   Ú	has_joinsÚis_naiver@   r@   rC   rg  Ž  s    z"CompoundSelect._get_result_wrapper)NNN)F)rE   rF   rG   rn  r  rë  r‘  rd  rc  rg  r%  r@   r@   r"  rC   r  u  s   
r  c                       st   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Zeedd„ ƒƒZeedd
d„ƒƒZeeddd„ƒƒZ	dd„ Z
dd„ Z‡  ZS )Ú_WriteQueryc                    s,   d | _ d| _d| _d | _tt| ƒ |¡ d S r?  )r3  r  r  r  r  rt  r  ré  r"  r@   rC   r  ž  s
    z_WriteQuery.__init__c                    s6   t t| ƒ |¡}| jr2t| jƒ|_| j|_| j|_|S r?   )r  rt  rë  r3  r”   r  r  rµ  r"  r@   rC   rë  ¥  s    z_WriteQuery._clone_attributesc                    s   ‡ fdd„}|S )Nc                    s0   | j jj}|js tdt|ƒ ƒ‚ˆ | f|ž|ŽS )Nz/RETURNING is not supported by your database: %s)r„   r�   rö  r5  r|   r  )rA   r
  r  r%  ©rD  r@   rC   r  ®  s    
ÿz-_WriteQuery.requires_returning.<locals>.innerr@   )rD  r  r@   ru  rC   Úrequires_returning­  s    z_WriteQuery.requires_returningc                 G   s>   t |ƒdkr |d d kr d | _n|s.| jjj}|  |¡| _d S ra  )rš   r3  r„   r�   rX  rö  r?  r@   r@   rC   Ú	returning¶  s
    
z_WriteQuery.returningTc                 C   s
   || _ d S r?   r   r!  r@   r@   rC   r  À  s    z_WriteQuery.tuplesc                 C   s
   || _ d S r?   r"  r#  r@   r@   rC   r$  Å  s    z_WriteQuery.dictsc                 C   s:   | j d k	r.| jr| j t¡S | jr.| j t¡S | j t¡S r?   )r3  r  rö  r%  r&  r  r'  r(  r  r@   r@   rC   r%  Ê  s    
z_WriteQuery.get_result_wrapperc                 C   s2   |   ¡ }| j| jg if}|| j|  ¡ |ƒ| _| jS r?   )r%  r3  r„   r  r  )rA   ri  rK   r@   r@   rC   Ú_execute_with_result_wrapperÒ  s    z(_WriteQuery._execute_with_result_wrapper)T)T)rE   rF   rG   r  rë  rv  r  rw  r  r$  r%  rx  r%  r@   r@   r"  rC   rt  �  s   	rt  c                       s`   e Zd Zd‡ fdd„	Z‡ fdd„Zeddd„ƒZedƒZd	d
„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )ÚUpdateQueryNc                    s    || _ d | _tt| ƒ |¡ d S r?   )r2  r1  r  ry  r  )rA   r„   r  r"  r@   rC   r  Ú  s    zUpdateQuery.__init__c                    s(   t t| ƒ |¡}t| jƒ|_| j|_|S r?   )r  ry  rë  rï  r2  r1  rµ  r"  r@   rC   rë  ß  s    zUpdateQuery._clone_attributesc                 C   s
   || _ d S r?   ©r1  ©rA   Úactionr@   r@   rC   Úon_conflictå  s    zUpdateQuery.on_conflictr  c                 C   s   |   ¡  | ¡S r?   )rù  r6  r  r@   r@   rC   rŠ  ë  s    zUpdateQuery.sqlc                 C   s@   | j d k	r| jd kr|  ¡ S | jd k	r,| jS | j |  ¡ ¡S d S r?   ©r3  r  rx  rö  Úrows_affectedr  r  r@   r@   rC   r  î  s
    
zUpdateQuery.executec                 C   s    | j jjjstdƒ‚t|  ¡ ƒS )NzwUPDATE queries cannot be iterated over unless they specify a RETURNING clause, which is not supported by your database.)r„   r�   rö  r5  r|   r�  r  r  r@   r@   rC   r�  ö  s    zUpdateQuery.__iter__c                 C   s   t |  ¡  ¡ ƒS r?   rj  r  r@   r@   rC   r™  ý  s    zUpdateQuery.iterator)N)N)rE   rF   rG   r  rë  r  r}  r  r  rŠ  r  r�  r™  r%  r@   r@   r"  rC   ry  Ù  s   ry  c                       s�   e Zd Zd‡ fdd„	Zdd„ Z‡ fdd„Zed	ƒZed
ƒZe	ddd„ƒZ
e	ddd„ƒZe	ddd„ƒZedd„ ƒZdd„ Zdd„ Zdd„ Z‡  ZS )ÚInsertQueryNFc                    sf   t t| ƒ |¡ d| _|d k	p$|d k	| _d| _|d k	r>|| _n|pDi g| _|| _|| _|| _	d | _
d S r?  )r  r€  r  r<  Ú_is_multi_row_insertÚ_return_id_listr@  r?  r>  Ú_validate_fieldsr1  )rA   r„   rÔ  Úrowsr&  r´  Úvalidate_fieldsr"  r@   rC   r    s    zInsertQuery.__init__c           
      #   s¼   | j j}| jr |j‰ ‡ fdd„}|j}|j}| jD ]„}| ¡ }tƒ }|D ]B}| jrZ||ƒ ||j	krp|j	| }	n|}	|| ||	< | 
|	¡ qH|r°|D ]}	|	|kr”||	 ƒ ||	< q”|V  q2d S )Nc                    s   | ˆ krt d|  ƒ‚d S )Nz"%s" is not a recognized field.)rÂ  )r+  ©Úvalid_fieldsr@   rC   Úvalidate_field  s    z.InsertQuery._iter_rows.<locals>.validate_field)r„   r�   rƒ  r‡  Ú_default_dictÚ_default_callablesr@  r  r’   r&  r€   )
rA   Ú
model_metarˆ  ÚdefaultsÚ	callablesrJ  Ú	field_rowrŒ   r�   r+  r@   r†  rC   rA    s,    

zInsertQuery._iter_rowsc                    sT   t t| ƒ |¡}| j|_| j|_| j|_| j|_| j|_| j|_| j	|_	| j
|_
|S r?   )r  r€  rë  r@  r<  r�  r?  r>  r‚  rƒ  r1  rµ  r"  r@   rC   rë  /  s    zInsertQuery._clone_attributesr  zwhere clauseTc                 C   s
   || _ d S r?   )r<  )rA   Úupsertr@   r@   rC   r�  >  s    zInsertQuery.upsertc                 C   s
   || _ d S r?   rz  r{  r@   r@   rC   r}  B  s    zInsertQuery.on_conflictc                 C   s
   || _ d S r?   )r‚  )rA   Úreturn_id_listr@   r@   rC   r�  F  s    zInsertQuery.return_id_listc                 C   s   | j jr| jr| jrdS dS ©NTF)rö  Úinsert_returningr�  r‚  r  r@   r@   rC   rF  J  s    zInsertQuery.is_insert_returningc                 C   s   |   ¡  | ¡S r?   )rù  rK  r  r@   r@   rC   rŠ  Q  s    zInsertQuery.sqlc                 C   sP   g }d }| j }| jD ]*}t| j|ƒ | j¡ ¡ }|r| |¡ q|rH|S |S d S r?   )r‚  r@  r€  r„   r�  r<  r  r…   )rA   Úid_listÚlast_idr�  r”  r@   r@   rC   Ú_insert_with_loopT  s    
ÿzInsertQuery._insert_with_loopc                 C   sâ   | j o"| jd ko"| jd ko"| jj }|r0|  ¡ S | jd k	rL| jd krL|  ¡ S | jd k	r\| jS |  ¡ }| j sÀ| jj	r°| 
¡ }| jj}dd„ t| ¡ |ƒD ƒ}| jjjr¨|S |d S | j || j¡S | jrÚtt d¡| ¡ ƒS dS d S )Nc                 S   s   g | ]\}}|  |¡‘qS r@   )r  )rK  r+  r©  r@   r@   rC   rL  w  s   ÿz'InsertQuery.execute.<locals>.<listcomp>r   T)r�  r>  r3  rö  Úinsert_manyr•  r  rx  r  r’  r–  r„   r�   r”  rG  rW  Úlast_insert_idr‚  r  r•  Ú
itemgetterÚfetchall)rA   Úinsert_with_loopr‹  Úpk_rowrK   Ú
clean_datar@   r@   rC   r  d  s8    ÿþü
ý
zInsertQuery.execute)NNNNF)T)N)T)rE   rF   rG   r  rA  rë  r  r  rq  r  r�  r}  r�  r×  rF  rŠ  r•  r  r%  r@   r@   r"  rC   r€     s(         ÿ
r€  c                   @   s$   e Zd ZedƒZdd„ Zdd„ ZdS )ÚDeleteQueryr  c                 C   s   |   ¡  | ¡S r?   )rù  rL  r  r@   r@   rC   rŠ  ‡  s    zDeleteQuery.sqlc                 C   s@   | j d k	r| jd kr|  ¡ S | jd k	r,| jS | j |  ¡ ¡S d S r?   r~  r  r@   r@   rC   r  Š  s
    
zDeleteQuery.executeN)rE   rF   rG   r  r  rŠ  r  r@   r@   r@   rC   r�  „  s   r�  ÚIndexMetadata)r�   rŠ  rZ  rä  rj  ÚColumnMetadata)r�   Ú	data_typerâ  r½  rj  ÚForeignKeyMetadata)r©  Ú
dest_tableÚdest_columnrj  c                   @   s   e Zd ZdS )ÚPeeweeExceptionN©rE   rF   rG   r@   r@   r@   rC   r¤  ž  s    r¤  c                   @   s   e Zd ZdS )r!   Nr¥  r@   r@   r@   rC   r!   Ÿ  s    c                   @   s   e Zd ZdS )r   Nr¥  r@   r@   r@   rC   r      s    c                   @   s   e Zd ZdS )r   Nr¥  r@   r@   r@   rC   r   ¡  s    c                   @   s   e Zd ZdS )r#   Nr¥  r@   r@   r@   rC   r#   ¢  s    c                   @   s   e Zd ZdS )r$   Nr¥  r@   r@   r@   rC   r$   £  s    c                   @   s   e Zd ZdS )r%   Nr¥  r@   r@   r@   rC   r%   ¤  s    c                   @   s   e Zd ZdS )r,   Nr¥  r@   r@   r@   rC   r,   ¥  s    c                   @   s   e Zd ZdS )r-   Nr¥  r@   r@   r@   rC   r-   ¦  s    c                   @   s   e Zd ZdS )r2   Nr¥  r@   r@   r@   rC   r2   §  s    c                   @   s*   e Zd ZdgZdd„ Zdd„ Zdd„ ZdS )	ÚExceptionWrapperÚ
exceptionsc                 C   s
   || _ d S r?   )r§  )rA   r§  r@   r@   rC   r  ­  s    zExceptionWrapper.__init__c                 C   s   d S r?   r@   r  r@   r@   rC   Ú	__enter__°  rV   zExceptionWrapper.__enter__c                 C   sH   |d krd S |j | jkrD| j|j  }tr.|}n|j}t|||Ž |ƒ d S r?   )rE   r§  ÚPY26r
  rc   )rA   Úexc_typeÚ	exc_valueÚ	tracebackÚnew_typeÚexc_argsr@   r@   rC   Ú__exit__±  s    zExceptionWrapper.__exit__N)rE   rF   rG   r  r  r¨  r¯  r@   r@   r@   rC   r¦  ª  s   r¦  c                       s   e Zd Z‡ fdd„Z‡  ZS )Ú_BaseConnectionLocalc                    s4   t t| ƒjf |Ž d | _d| _d | _g | _g | _d S rÁ  )r  r°  r  Ú
autocommitÚclosedÚconnÚcontext_stackÚtransactionsr  r"  r@   rC   r  ½  s    z_BaseConnectionLocal.__init__)rE   rF   rG   r  r%  r@   r@   r"  rC   r°  ¼  s   r°  c                   @   s   e Zd ZdS )Ú_ConnectionLocalNr¥  r@   r@   r@   rC   r¶  Å  s   r¶  c                
   @   s|  e Zd ZdZeZddddgZdZdZdZ	i Z
dZdZdZdZdZdZdZi Zd	Zg ZdZdZdZdZdZdZeeeeeee e!e"d
œ	Z#d}dd„Z$dd„ Z%dd„ Z&dd„ Z'dd„ Z(dd„ Z)dd„ Z*dd„ Z+dd„ Z,dd„ Z-dd „ Z.e/d!d"„ ƒZ0e/d#d$„ ƒZ1d%d&„ Z2d'd(„ Z3d)d*„ Z4d+d,„ Z5d-d.„ Z6d~d/d0„Z7d1d2„ Z8d3d4„ Z9d5d6„ Z:d7d8„ Z;d9d:„ Z<d;d<„ Z=d=d>„ Z>d?d@„ Z?ddAdB„Z@dCdD„ ZAdEdF„ ZBdGdH„ ZCdIdJ„ ZDdKdL„ ZEd€dMdN„ZFdOdP„ ZGd�dQdR„ZHd‚dSdT„ZIdƒdUdV„ZJd„dWdX„ZKd…dYdZ„ZLd[d\„ ZMd†d]d^„ZNd‡d_d`„ZOdˆdadb„ZPd‰dcdd„ZQdŠdedf„ZRdgdh„ ZSd‹didj„ZTdŒdkdl„ZUd�dmdn„ZVdŽdodp„ZWdqdr„ ZXdsdt„ ZYdudv„ ZZdwdx„ Z[dydz„ Z\d{d|„ Z]dS )�ÚDatabaseFr7  r8  r9  r<  Tr´  Nr³  )	ÚConstraintErrorr   r   r#   r$   r%   r,   r-   r2   c           	      K   sn   i | _ |rtƒ | _ntƒ | _| j|f|Ž t ¡ | _|| _|| _	|| _
t| j|pRi ƒ| _t| j|pdi ƒ| _d S r?   )Úconnect_kwargsr¶  Ú_localr°  ÚinitÚ	threadingÚLockÚ
_conn_lockr±  ÚautorollbackÚuse_speedupsr  r¾  r¿  )	rA   rö  Úthreadlocalsr±  r&  Úopsr¿  rÀ  r¹  r@   r@   rC   r  ì  s    

zDatabase.__init__c                 K   s0   |   ¡ s|  ¡  |d k| _|| _| j |¡ d S r?   )Ú	is_closedr—  ry  rö  r¹  r  )rA   rö  r¹  r@   r@   rC   r»  þ  s
    
zDatabase.initc                 C   s
   t | jƒS r?   )r¦  r§  r  r@   r@   rC   Úexception_wrapper  s    zDatabase.exception_wrapperc              
   C   sd   | j �T | jrtdƒ‚|  ¡ �2 | j| jf| jŽ| j_d| j_	|  
| jj¡ W 5 Q R X W 5 Q R X d S )NzBError, database not properly initialized before opening connectionF)r¾  ry  Ú	ExceptionrÄ  Ú_connectrö  r¹  rº  r³  r²  Úinitialize_connectionr  r@   r@   rC   Úconnect  s    
ÿþzDatabase.connectc                 C   s   d S r?   r@   ©rA   r³  r@   r@   rC   rÇ    s    zDatabase.initialize_connectionc              
   C   sN   | j �> | jrtdƒ‚|  ¡ � |  | jj¡ d| j_W 5 Q R X W 5 Q R X d S )NzBError, database not properly initialized before closing connectionT)r¾  ry  rÅ  rÄ  Ú_closerº  r³  r²  r  r@   r@   rC   r—    s    
zDatabase.closec                 C   s:   | j jr"| j jd j}|d k	r"|S | j jr2|  ¡  | j jS r²  )rº  r´  Ú
connectionr²  rÈ  r³  rÉ  r@   r@   rC   Úget_conn   s    zDatabase.get_connc                 C   s   | j jS r?   )rº  r²  r  r@   r@   rC   rÃ  )  s    zDatabase.is_closedc                 C   s   |   ¡  ¡ S r?   )rÌ  r‹  r  r@   r@   rC   Ú
get_cursor,  s    zDatabase.get_cursorc                 C   s   |  ¡  d S r?   )r—  rÉ  r@   r@   rC   rÊ  /  s    zDatabase._closec                 K   s   t ‚d S r?   r  )rA   rö  r  r@   r@   rC   rÆ  2  s    zDatabase._connectc                 C   s   t | j|ƒ| _d S r?   )r  r¾  )rG  r&  r@   r@   rC   Úregister_fields5  s    zDatabase.register_fieldsc                 C   s   t | j|ƒ| _d S r?   )r  r¿  )rG  rÂ  r@   r@   rC   Úregister_ops9  s    zDatabase.register_opsc                 C   sl   |t kr| jrtS tS |tkr"tS |tkr8| jr4tS tS |t	krN| jrJt
S tS |tkrZtS | jrdtS tS d S r?   )r(  rÀ  r¢   r§  rf  r«  r&  r¤   r¤  r'  r¡   rª  re  rÌ  )rA   Úwrapper_typer@   r@   rC   r%  =  s&    
ÿ
ÿ
ÿ
ÿzDatabase.get_result_wrapperc                 C   s   |j jr|jS d S r?   )r�   rD  Ú	lastrowid)rA   r‹  r†   r@   r@   rC   r—  O  s    zDatabase.last_insert_idc                 C   s   |j S r?   )Úrowcount)rA   r‹  r@   r@   rC   r  S  s    zDatabase.rows_affectedc                 C   s   |   | j| j| j| j¡S r?   )Úcompiler_classrµ  r¶  r¾  r¿  r  r@   r@   rC   rù  V  s      þzDatabase.compilerc                 C   s   | j |  ¡  |¡Ž S r?   )r  rù  rÛ  )rA   r§  r@   r@   rC   r  [  s    zDatabase.executec              	   C   s„   t  ||f¡ |  ¡ �d |  ¡ }z| ||p.d¡ W n, tk
r`   |  ¡ rZ| jrZ|  ¡  ‚ Y nX |rv|  ¡ rv|  	¡  W 5 Q R X |S rp  )
ÚloggerÚdebugrÄ  rÍ  r  rÅ  Úget_autocommitr¿  ÚrollbackÚcommit)rA   rŠ  r‹  r  r‹  r@   r@   rC   r  ^  s    
zDatabase.execute_sqlc                 C   s   d S r?   r@   r  r@   r@   rC   Úbeginm  s    zDatabase.beginc                 C   s   |   ¡  ¡  d S r?   )rÌ  rØ  r  r@   r@   rC   rØ  p  s    zDatabase.commitc                 C   s   |   ¡  ¡  d S r?   )rÌ  r×  r  r@   r@   rC   r×  s  s    zDatabase.rollbackc                 C   s   || j _d S r?   )rº  r±  )rA   r±  r@   r@   rC   Úset_autocommitv  s    zDatabase.set_autocommitc                 C   s    | j jd kr|  | j¡ | j jS r?   )rº  r±  rÚ  r  r@   r@   rC   rÖ  y  s    zDatabase.get_autocommitc                 C   s   | j j |¡ d S r?   )rº  r´  r…   ©rA   Útransactionr@   r@   rC   Úpush_execution_context~  s    zDatabase.push_execution_contextc                 C   s   | j j ¡  d S r?   )rº  r´  rQ  r  r@   r@   rC   Úpop_execution_context�  s    zDatabase.pop_execution_contextc                 C   s   t | jjƒS r?   )rš   rº  r´  r  r@   r@   rC   Úexecution_context_depth„  s    z Database.execution_context_depthc                 C   s   t | |d�S )N)Úwith_transaction)ÚExecutionContext)rA   rà  r@   r@   rC   Úexecution_context‡  s    zDatabase.execution_contextc                 C   s   | j j |¡ d S r?   )rº  rµ  r…   rÛ  r@   r@   rC   Úpush_transactionŠ  s    zDatabase.push_transactionc                 C   s   | j j ¡  d S r?   )rº  rµ  rQ  r  r@   r@   rC   Úpop_transaction�  s    zDatabase.pop_transactionc                 C   s   t | jjƒS r?   )rš   rº  rµ  r  r@   r@   rC   Útransaction_depth�  s    zDatabase.transaction_depthc                 C   s   t | ƒS r?   ©rÜ  r  r@   r@   rC   rÜ  “  s    zDatabase.transactionc                    s   t ˆ ƒ‡ ‡fdd„ƒ}|S )Nc               
      s*   ˆ  ¡ � ˆ | |ŽW  5 Q R £ S Q R X d S r?   ræ  rž  ©r  rA   r@   rC   r  —  s    
z)Database.commit_on_success.<locals>.innerr   )rA   r  r  r@   rç  rC   Úcommit_on_success–  s    zDatabase.commit_on_successc                 C   s   | j s
t‚t| |ƒS r?   )Ú
savepointsr  Ú	savepoint©rA   Úsidr@   r@   rC   rê  �  s    zDatabase.savepointc                 C   s   t | ƒS r?   )Ú_atomicr  r@   r@   rC   Úatomic¢  s    zDatabase.atomicc                 C   s   t ‚d S r?   r  ©rA   rì  r@   r@   rC   Ú
get_tables¥  s    zDatabase.get_tablesc                 C   s   t ‚d S r?   r  ©rA   rj  rì  r@   r@   rC   Úget_indexes¨  s    zDatabase.get_indexesc                 C   s   t ‚d S r?   r  rñ  r@   r@   rC   Úget_columns«  s    zDatabase.get_columnsc                 C   s   t ‚d S r?   r  rñ  r@   r@   rC   Úget_primary_keys®  s    zDatabase.get_primary_keysc                 C   s   t ‚d S r?   r  rñ  r@   r@   rC   Úget_foreign_keys±  s    zDatabase.get_foreign_keysc                 C   s   t ‚d S r?   r  )rA   Úseqr@   r@   rC   Úsequence_exists´  s    zDatabase.sequence_existsc                 C   s   |   ¡ }| j| ||¡Ž S r?   )rù  r  rw  )rA   r„   rY  Úqcr@   r@   rC   rw  ·  s    zDatabase.create_tablec                 C   s   t ||d� d S )N)r_  )Úcreate_model_tables)rA   rŠ   rY  r@   r@   rC   Úcreate_tables»  s    zDatabase.create_tablesc                    sH   |   ¡ }t|ttfƒs"td| ƒ‚‡ fdd„|D ƒ}| j| ˆ ||¡Ž S )Nz=Fields passed to "create_index" must be a list or tuple: "%s"c                    s&   g | ]}t |tƒrˆ jj| n|‘qS r@   ©rS   r:  r�   r&  rU  ©r„   r@   rC   rL  Ã  s   ÿz)Database.create_index.<locals>.<listcomp>)rù  rS   r”   r“  r|   r  rz  )rA   r„   r&  rä  rø  Úfobjsr@   rü  rC   rz  ¾  s    ÿ
þzDatabase.create_indexc                    sH   |   ¡ }t|ttfƒs"td| ƒ‚‡ fdd„|D ƒ}| j| ˆ ||¡Ž S )Nz;Fields passed to "drop_index" must be a list or tuple: "%s"c                    s&   g | ]}t |tƒrˆ jj| n|‘qS r@   rû  rU  rü  r@   rC   rL  Í  s   ÿz'Database.drop_index.<locals>.<listcomp>)rù  rS   r”   r“  r|   r  r{  )rA   r„   r&  rY  rø  rý  r@   rü  rC   r{  È  s    ÿ
þzDatabase.drop_indexc                 C   s   |   ¡ }| j| |||¡Ž S r?   )rù  r  rv  )rA   r„   r+  r  rø  r@   r@   rC   rv  Ò  s      ÿzDatabase.create_foreign_keyc                 C   s"   | j r|  ¡ }| j| |¡Ž S d S r?   )Ú	sequencesrù  r  r|  ©rA   rö  rø  r@   r@   rC   r|  ×  s    zDatabase.create_sequencec                 C   s   |   ¡ }| j| |||¡Ž S r?   )rù  r  rx  )rA   r„   r_  r`  rø  r@   r@   rC   rx  Ü  s      ÿzDatabase.drop_tablec                 C   s   t |||d� d S )N)r_  r`  )Údrop_model_tables)rA   rŠ   rY  r`  r@   r@   rC   Údrop_tablesá  s    zDatabase.drop_tablesc                 C   s   |   ¡ }| j| |||¡Ž S r?   )rù  r  ry  )rA   r„   rb  r`  rø  r@   r@   rC   ry  ä  s      ÿzDatabase.truncate_tablec                 C   s"   t t|ƒƒD ]}| ||¡ qd S r?   )r•   rv   ry  )rA   rŠ   rb  r`  r†   r@   r@   rC   Útruncate_tablesê  s    zDatabase.truncate_tablesc                 C   s"   | j r|  ¡ }| j| |¡Ž S d S r?   )rþ  rù  r  r}  rÿ  r@   r@   rC   r}  î  s    zDatabase.drop_sequencec                 C   s   t  t|tdƒ|ƒ¡S ©Nr  ©r   ÚEXTRACTr   r4   ©rA   rA  Ú
date_fieldr@   r@   rC   r?  ó  s    zDatabase.extract_datec                 C   s   t  ||¡S r?   )r   Ú
DATE_TRUNCr  r@   r@   rC   Útruncate_dateö  s    zDatabase.truncate_datec                 C   s   t dƒS )NzDEFAULT VALUESr³  ré  r@   r@   rC   rE  ù  s    zDatabase.default_insert_clausec                 C   s   dS )NzSELECT 0 WHERE 0r@   r  r@   r@   rC   rq  ü  s    zDatabase.get_noop_sqlc                 C   s   t S r?   )r;  r  r@   r@   rC   r8  ÿ  s    zDatabase.get_binary_type)TTNNFT)NT)T)N)N)N)N)N)N)F)F)F)F)N)FF)FF)FF)FF)^rE   rF   rG   r.  r¥  rÓ  r3  ræ  Údistinct_onÚdrop_cascader¾  Úforeign_keysr)  Úfor_update_nowaitr–  r’  r¶  r#  r¿  rµ  Úreserved_tablesr5  ré  rþ  Úsubquery_delete_same_tabler=  Úwindow_functionsr#   r   r   r$   r%   r,   r-   r2   r§  r  r»  rÄ  rÈ  rÇ  r—  rÌ  rÃ  rÍ  rÊ  rÆ  ro  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÷  rw  rú  rz  r{  rv  r|  rx  r  ry  r  r}  r?  r	  rE  rq  r8  r@   r@   r@   rC   r·  È  sÆ   ÷        ÿ
		


















  ÿ

r·  c                       sØ   e Zd ZeZddddœZdZeo(ejdkZ	dZ
ejdejdiZd	Zd*‡ fdd„	Zdd„ Zdd„ Zdd„ Zd+dd„Zd,dd„Zd-dd„Zd.dd„Zd/dd„Zd0dd„Zd1d d!„Zd2d"d#„Zd$d%„ Zd&d'„ Zd(d)„ Z‡  ZS )3r6   r®  r°  )ri  r  r<  F)rO   rM  é   r   r³  ÚGLOBrñ   zINSERT OR REPLACE INTONc                    sF   |pg | _ | dd ¡}|r*| j  d|f¡ tt| ƒj|f|ž|Ž d S )NÚjournal_mode)Ú_pragmasrQ  r…   r  r6   r  )rA   rö  Úpragmasr
  r  r  r"  r@   rC   r    s
    
zSqliteDatabase.__init__c                 K   sJ   t stdƒ‚t j|f|Ž}d |_z|  |¡ W n   | ¡  ‚ Y nX |S )Nz&pysqlite or sqlite3 must be installed.)Úsqlite3r!   rÈ  Úisolation_levelÚ_add_conn_hooksr—  )rA   rö  r  r³  r@   r@   rC   rÆ    s    zSqliteDatabase._connectc                 C   s8   |   |¡ | ddt¡ | ddt¡ | ddt¡ d S )NrA  rN   Ú
date_truncrÛ   )Ú_set_pragmasÚcreate_functionr¹   r¼   rÁ   rÉ  r@   r@   rC   r  &  s    
zSqliteDatabase._add_conn_hooksc                 C   s<   | j r8| ¡ }| j D ]\}}| d||f ¡ q| ¡  d S )NzPRAGMA %s = %s;)r  r‹  r  r—  )rA   r³  r‹  Úpragmara   r@   r@   rC   r  ,  s
    zSqliteDatabase._set_pragmasÚDEFERREDc                 C   s   | j d| dd� d S )NzBEGIN %sF©r  ©r  )rA   Ú	lock_typer@   r@   rC   rÙ  3  s    zSqliteDatabase.beginc                 C   s   t dƒ‚d S )NzBSQLite does not support ALTER TABLE statements to add constraints.)r-   )rA   r„   r+  r  r@   r@   rC   rv  6  s    z!SqliteDatabase.create_foreign_keyc                 C   s   |   dd¡}dd„ | ¡ D ƒS )Nz<SELECT name FROM sqlite_master WHERE type = ? ORDER BY name;©rj  c                 S   s   g | ]}|d  ‘qS )r   r@   ©rK  r”  r@   r@   rC   rL  =  s     z-SqliteDatabase.get_tables.<locals>.<listcomp>©r  r™  )rA   rì  r‹  r@   r@   rC   rð  :  s    ÿzSqliteDatabase.get_tablesc           	         sº   d}|   |ˆdf¡}t| ¡ ƒ‰tƒ ‰|   dˆ ¡}| ¡ D ]*}|d }t|d ƒdk}|r<ˆ |¡ q<i ‰ tˆƒD ](}|   d| ¡}dd„ | ¡ D ƒˆ |< qt‡ ‡‡‡fd	d„tˆƒD ƒS )
NzQSELECT name, sql FROM sqlite_master WHERE tbl_name = ? AND type = ? ORDER BY namerã  zPRAGMA index_list("%s")r˜   rN   zPRAGMA index_info("%s")c                 S   s   g | ]}|d  ‘qS )rN   r@   r"  r@   r@   rC   rL  R  s     z.SqliteDatabase.get_indexes.<locals>.<listcomp>c                    s(   g | ] }t |ˆ| ˆ | |ˆkˆƒ‘qS r@   ©rž  ©rK  r�   ©Úindex_columnsÚindex_to_sqlrj  Úunique_indexesr@   rC   rL  T  s   úû)r  rï  r™  r’   r  r€   r“   )	rA   rj  rì  r´  r‹  r”  r�   Ú	is_uniquerl  r@   r&  rC   rò  ?  s"    ùzSqliteDatabase.get_indexesc                    s$   |   dˆ  ¡}‡ fdd„| ¡ D ƒS )NúPRAGMA table_info("%s")c              	      s2   g | ]*}t |d  |d |d  t|d ƒˆ ƒ‘qS )r˜   rN   rO   rû   )rŸ  ri  r"  r!  r@   rC   rL  _  s   ÿz.SqliteDatabase.get_columns.<locals>.<listcomp>r#  ©rA   rj  rì  r‹  r@   r!  rC   ró  ]  s    
ÿzSqliteDatabase.get_columnsc                 C   s    |   d| ¡}dd„ | ¡ D ƒS )Nr+  c                 S   s   g | ]}|d  r|d ‘qS )r³  r˜   r@   r"  r@   r@   rC   rL  d  s      z3SqliteDatabase.get_primary_keys.<locals>.<listcomp>r#  r,  r@   r@   rC   rô  b  s    zSqliteDatabase.get_primary_keysc                    s$   |   dˆ  ¡}‡ fdd„| ¡ D ƒS )NzPRAGMA foreign_key_list("%s")c                    s&   g | ]}t |d  |d |d ˆ ƒ‘qS )rO   rN   rú   ©r¡  r"  r!  r@   rC   rL  h  s   ÿz3SqliteDatabase.get_foreign_keys.<locals>.<listcomp>r#  r,  r@   r!  rC   rõ  f  s    
ÿzSqliteDatabase.get_foreign_keysc                 C   s
   t | |ƒS r?   )Úsavepoint_sqliterë  r@   r@   rC   rê  k  s    zSqliteDatabase.savepointc                 C   s   t  ||¡S r?   )r   rA  r  r@   r@   rC   r?  n  s    zSqliteDatabase.extract_datec                 C   s   t  t| |¡S r?   )r   r»   rº   r  r@   r@   rC   r	  q  s    zSqliteDatabase.truncate_datec                 C   s   t jS r?   )r  ÚBinaryr  r@   r@   rC   r8  t  s    zSqliteDatabase.get_binary_type)N)r  )N)N)N)N)N)N)N) rE   rF   rG   r~  rÓ  r¾  r  r  Úsqlite_version_infor–  r#  r`  rñ   rò   r¿  r=  r  rÆ  r  r  rÙ  rv  rð  rò  ró  rô  rõ  rê  r?  r	  r8  r%  r@   r@   r"  rC   r6     s:   ý  þ







c                   @   sÌ   e Zd ZdZdZdZdZdddddddd	œZdZdZ	dZ
d
ZejdiZdgZdZdZdZdZd'dd„Zdd„ Z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 „ Zd!d"„ Zd#d$„ Zd%d&„ ZdS )-r/   TÚBYTEAÚBOOLEANÚ	TIMESTAMPÚNUMERICúDOUBLE PRECISIONÚSERIALr=  )r6  ri  rz   r  r  r½  r<  ú%sú~ÚuserNc                 K   sT   t stdƒ‚t jf d|i|—Ž}| jrBt tj|¡ t tj|¡ |rP| |¡ |S )Nzpsycopg2 must be installed.rö  )	Úpsycopg2r!   rÈ  Úregister_unicodeÚpg_extensionsÚregister_typeÚUNICODEÚUNICODEARRAYÚset_client_encoding)rA   rö  r+  r  r³  r@   r@   rC   rÆ  “  s    
zPostgresqlDatabase._connectc                 C   s<   |j }|jdk	r |jjr |jjS |jr8d|j|jjf S d S )NFz	%s_%s_seq)r�   r½  rê  rD  rŽ   rç  )rA   r†   rK   r@   r@   rC   Ú_get_pk_sequencež  s
    z#PostgresqlDatabase._get_pk_sequencec                 C   s`   |   |¡}|sd S |j}|jr*d|j }nd}| d||f ¡ | ¡ d }|  ¡ r\|  ¡  |S )Nz%s.r1  zSELECT CURRVAL('%s"%s"')r   )rA  r�   rì  r  r–  rÖ  rØ  )rA   r‹  r†   rê  rK   rì  Úresultr@   r@   rC   r—  ¥  s    
z!PostgresqlDatabase.last_insert_idÚpublicc                 C   s    d}dd„ |   ||f¡ ¡ D ƒS )NzSSELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = %s ORDER BY tablenamec                 S   s   g | ]
\}|‘qS r@   r@   )rK  rï  r@   r@   rC   rL  ¹  s     z1PostgresqlDatabase.get_tables.<locals>.<listcomp>r#  )rA   rì  r´  r@   r@   rC   rð  ¶  s    zPostgresqlDatabase.get_tablesc                    s,   d}|   |ˆ d|f¡}‡ fdd„| ¡ D ƒS )Na  
            SELECT
                i.relname, idxs.indexdef, idx.indisunique,
                array_to_string(array_agg(cols.attname), ',')
            FROM pg_catalog.pg_class AS t
            INNER JOIN pg_catalog.pg_index AS idx ON t.oid = idx.indrelid
            INNER JOIN pg_catalog.pg_class AS i ON idx.indexrelid = i.oid
            INNER JOIN pg_catalog.pg_indexes AS idxs ON
                (idxs.tablename = t.relname AND idxs.indexname = i.relname)
            LEFT OUTER JOIN pg_catalog.pg_attribute AS cols ON
                (cols.attrelid = t.oid AND cols.attnum = ANY(idx.indkey))
            WHERE t.relname = %s AND t.relkind = %s AND idxs.schemaname = %s
            GROUP BY i.relname, idxs.indexdef, idx.indisunique
            ORDER BY idx.indisunique DESC, i.relname;rï  c                    s2   g | ]*}t |d  |d |d  d¡|d ˆ ƒ‘qS )r   r˜   rO   ú,rN   )rž  r  r"  r!  r@   rC   rL  Ë  s   ÿz2PostgresqlDatabase.get_indexes.<locals>.<listcomp>r#  ©rA   rj  rì  r´  r‹  r@   r!  rC   rò  »  s
    
ÿzPostgresqlDatabase.get_indexesc                    s<   d}|   |ˆ|f¡}t|  ˆ|¡ƒ‰ ‡ ‡fdd„| ¡ D ƒS )NzÁ
            SELECT column_name, is_nullable, data_type
            FROM information_schema.columns
            WHERE table_name = %s AND table_schema = %s
            ORDER BY ordinal_positionc                    s*   g | ]"\}}}t |||d k|ˆ kˆƒ‘qS ©ÚYES©rŸ  ©rK  r�   râ  r¸   ©Úpksrj  r@   rC   rL  Ö  s   ÿz2PostgresqlDatabase.get_columns.<locals>.<listcomp>©r  r’   rô  r™  rE  r@   rJ  rC   ró  Î  s    ÿzPostgresqlDatabase.get_columnsc                 C   s(   d}|   |d||f¡}dd„ | ¡ D ƒS )NaÏ  
            SELECT kc.column_name
            FROM information_schema.table_constraints AS tc
            INNER JOIN information_schema.key_column_usage AS kc ON (
                tc.table_name = kc.table_name AND
                tc.table_schema = kc.table_schema AND
                tc.constraint_name = kc.constraint_name)
            WHERE
                tc.constraint_type = %s AND
                tc.table_name = %s AND
                tc.table_schema = %sr  c                 S   s   g | ]
\}|‘qS r@   r@   r"  r@   r@   rC   rL  æ  s     z7PostgresqlDatabase.get_primary_keys.<locals>.<listcomp>r#  rE  r@   r@   rC   rô  Ù  s    z#PostgresqlDatabase.get_primary_keysc                    s*   d}|   |ˆ |f¡}‡ fdd„| ¡ D ƒS )Naª  
            SELECT
                kcu.column_name, ccu.table_name, ccu.column_name
            FROM information_schema.table_constraints AS tc
            JOIN information_schema.key_column_usage AS kcu
                ON (tc.constraint_name = kcu.constraint_name AND
                    tc.constraint_schema = kcu.constraint_schema)
            JOIN information_schema.constraint_column_usage AS ccu
                ON (ccu.constraint_name = tc.constraint_name AND
                    ccu.constraint_schema = tc.constraint_schema)
            WHERE
                tc.constraint_type = 'FOREIGN KEY' AND
                tc.table_name = %s AND
                tc.table_schema = %sc                    s&   g | ]}t |d  |d |d ˆ ƒ‘qS )r   r˜   rN   r-  r"  r!  r@   rC   rL  ø  s   ÿz7PostgresqlDatabase.get_foreign_keys.<locals>.<listcomp>r#  ©rA   rj  rì  rŠ  r‹  r@   r!  rC   rõ  è  s
    
ÿz#PostgresqlDatabase.get_foreign_keysc                 C   s   |   d|f¡}t| ¡ d ƒS )Nz²
            SELECT COUNT(*) FROM pg_class, pg_namespace
            WHERE relkind='S'
                AND pg_class.relnamespace = pg_namespace.oid
                AND relname=%sr   )r  ri  r–  )rA   rê  r—  r@   r@   rC   r÷  û  s    üz"PostgresqlDatabase.sequence_existsc                 G   s(   d  dgt|ƒ ¡}|  d| |¡ d S )NrD  r7  zSET search_path TO %s)r  rš   r  )rA   Úsearch_pathÚpath_paramsr@   r@   rC   Úset_search_path  s    z"PostgresqlDatabase.set_search_pathc                 C   s   dS )NzSELECT 0 WHERE falser@   r  r@   r@   rC   rq    s    zPostgresqlDatabase.get_noop_sqlc                 C   s   t jS r?   )r:  r/  r  r@   r@   rC   r8  
  s    z"PostgresqlDatabase.get_binary_type)N)rC  )rC  )rC  )rC  )rC  ) rE   rF   rG   r.  ræ  r
  r  r¾  r)  r  r’  r¶  r`  rô   r¿  r  r5  rþ  r  r;  rÆ  rA  r—  rð  rò  ró  rô  rõ  r÷  rP  rq  r8  r@   r@   r@   rC   r/   w  sH   ù	 ÿ





c                   @   s¼   e Zd ZdZddgZdddddd	d
dœZdZdZdZe	j
de	jde	jdiZdZdZdZ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"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ ZdS )0r+   Tr7  r<  ÚBOOLr4  r5  ÚFLOATzINTEGER AUTO_INCREMENTÚLONGTEXTzVARCHAR(40))ri  r  r  r  r½  r5  r<  r7  l   ÿÿÿÿ zLIKE BINARYrñ   rå   ú`FzREPLACE INTOc                 K   sJ   t stdƒ‚dddœ}| |¡ d|kr6| d¡|d< t jf d|i|—ŽS )Nz%MySQLdb or PyMySQL must be installed.Úutf8T)ÚcharsetÚuse_unicodeÚpasswordÚpasswdr%  )Úmysqlr!   r  rQ  rÈ  )rA   rö  r  Úconn_kwargsr@   r@   rC   rÆ  %  s    þ
zMySQLDatabase._connectNc                 C   s   dd„ |   d¡D ƒS )Nc                 S   s   g | ]
\}|‘qS r@   r@   r"  r@   r@   rC   rL  2  s     z,MySQLDatabase.get_tables.<locals>.<listcomp>zSHOW TABLESr  rï  r@   r@   rC   rð  1  s    zMySQLDatabase.get_tablesc                    sx   |   dˆ ¡}tƒ ‰i ‰ | ¡ D ]@}|d s:ˆ |d ¡ ˆ  |d g ¡ ˆ |d   |d ¡ q ‡ ‡‡fdd„ˆ D ƒS )NúSHOW INDEX FROM `%s`r˜   rN   rú   c                    s$   g | ]}t |d ˆ | |ˆkˆƒ‘qS r?   r$  r%  ©Úindexesrj  rä  r@   rC   rL  =  s   ÿz-MySQLDatabase.get_indexes.<locals>.<listcomp>)r  r’   r™  r€   rX  r…   )rA   rj  rì  r‹  r”  r@   r]  rC   rò  4  s    ÿzMySQLDatabase.get_indexesc                    s8   d}|   |ˆf¡}t|  ˆ¡ƒ‰ ‡ ‡fdd„| ¡ D ƒS )Nz£
            SELECT column_name, is_nullable, data_type
            FROM information_schema.columns
            WHERE table_name = %s AND table_schema = DATABASE()c                    s*   g | ]"\}}}t |||d k|ˆ kˆƒ‘qS rF  rH  rI  rJ  r@   rC   rL  G  s   ÿz-MySQLDatabase.get_columns.<locals>.<listcomp>rL  rM  r@   rJ  rC   ró  @  s    ÿzMySQLDatabase.get_columnsc                 C   s    |   d| ¡}dd„ | ¡ D ƒS )Nr\  c                 S   s    g | ]}|d  dkr|d ‘qS )rN   ÚPRIMARYrú   r@   r"  r@   r@   rC   rL  L  s      z2MySQLDatabase.get_primary_keys.<locals>.<listcomp>r#  r,  r@   r@   rC   rô  J  s    zMySQLDatabase.get_primary_keysc                    s(   d}|   |ˆ f¡}‡ fdd„| ¡ D ƒS )Na@  
            SELECT column_name, referenced_table_name, referenced_column_name
            FROM information_schema.key_column_usage
            WHERE table_name = %s
                AND table_schema = DATABASE()
                AND referenced_table_name IS NOT NULL
                AND referenced_column_name IS NOT NULLc                    s    g | ]\}}}t |||ˆ ƒ‘qS r@   r-  )rK  r©  r¢  r£  r!  r@   rC   rL  W  s   ÿz2MySQLDatabase.get_foreign_keys.<locals>.<listcomp>r#  rE  r@   r!  rC   rõ  N  s
    
þzMySQLDatabase.get_foreign_keysc                 C   s   t  tt|ƒtdƒ|ƒ¡S r  r  r  r@   r@   rC   r?  [  s    zMySQLDatabase.extract_datec                 C   s   t  |t| ¡S r?   )r   ÚDATE_FORMATÚMYSQL_DATE_TRUNC_MAPPINGr  r@   r@   rC   r	  ^  s    zMySQLDatabase.truncate_datec                 C   s   t t|jjƒtdƒƒS )NzVALUES (DEFAULT))r   r¯  r�   r½  r7   ré  r@   r@   rC   rE  a  s    
þz#MySQLDatabase.default_insert_clausec                 C   s   dS )NzDO 0r@   r  r@   r@   rC   rq  f  s    zMySQLDatabase.get_noop_sqlc                 C   s   t jS r?   )rZ  r/  r  r@   r@   rC   r8  i  s    zMySQLDatabase.get_binary_type)N)N)N)N)N)rE   rF   rG   r.  r3  r¾  r)  r¶  r#  r`  rñ   rò   rå   r¿  rµ  r  r=  rÆ  rð  rò  ró  rô  rõ  r?  r	  rE  rq  r8  r@   r@   r@   rC   r+     sD   ù	   ý





c                   @   s   e Zd Zdd„ ZdS )Ú_callable_context_managerc                    s   t ˆ ƒ‡ ‡fdd„ƒ}|S )Nc               
      s&   ˆ� ˆ | |ŽW  5 Q R £ S Q R X d S r?   r@   rž  ©r   rA   r@   rC   r  o  s    z1_callable_context_manager.__call__.<locals>.innerr   )rA   r   r  r@   rc  rC   Ú__call__n  s    z"_callable_context_manager.__call__N)rE   rF   rG   rd  r@   r@   r@   rC   rb  m  s   rb  c                   @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
rá  Tc                 C   s   || _ || _d | _d S r?   )rö  rà  rË  )rA   rö  rà  r@   r@   rC   r  v  s    zExecutionContext.__init__c              	   C   sZ   | j j�H | j  | ¡ | j j| j j f| j jŽ| _| jrL| j  ¡ | _| j 	¡  W 5 Q R X | S r?   )
rö  r¾  rÝ  rÆ  r¹  rË  rà  rÜ  Útxnr¨  r  r@   r@   rC   r¨  {  s    
ÿþzExecutionContext.__enter__c              
   C   st   | j j�b | jd kr | j  ¡  nFz*| jrH|s8| j d¡ | j |||¡ W 5 | j  ¡  | j  | j¡ X W 5 Q R X d S r?  )	rö  r¾  rË  rÞ  rÊ  rà  re  rØ  r¯  ©rA   rª  Úexc_valÚexc_tbr@   r@   rC   r¯  †  s    


zExecutionContext.__exit__N)T©rE   rF   rG   r  r¨  r¯  r@   r@   r@   rC   rá  u  s   
rá  c                       s6   e Zd Zd‡ fdd„	Z‡ fdd„Z‡ fdd„Z‡  ZS )	r;   Tc                    s   t t| ƒ ||¡ || _d S r?   )r  r;   r  rŠ   )rA   rö  rŠ   rà  r"  r@   rC   r  •  s    zUsing.__init__c                    s:   g | _ | jD ]}| j  |jj¡ | j|j_qtt| ƒ ¡ S r?   )Ú_origrŠ   r…   r�   rö  r  r;   r¨  ©rA   r†   r"  r@   rC   r¨  ™  s
    
zUsing.__enter__c                    s:   t t| ƒ |||¡ t| jƒD ]\}}| j| |j_qd S r?   )r  r;   r¯  rû  rŠ   rj  r�   rö  )rA   rª  rg  rh  r�   r†   r"  r@   rC   r¯     s    zUsing.__exit__)T)rE   rF   rG   r  r¨  r¯  r%  r@   r@   r"  rC   r;   ”  s   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )rí  c                 C   s
   || _ d S r?   ©r%  ©rA   r%  r@   r@   rC   r  ¦  s    z_atomic.__init__c                 C   s2   | j  ¡ dkr| j  ¡ | _n| j  ¡ | _| j ¡ S rÒ  )r%  rå  rÜ  Ú_helperrê  r¨  r  r@   r@   rC   r¨  ©  s    z_atomic.__enter__c                 C   s   | j  |||¡S r?   )rn  r¯  rf  r@   r@   rC   r¯  °  s    z_atomic.__exit__Nri  r@   r@   r@   rC   rí  ¥  s   rí  c                   @   s@   e Zd Zdd„ Zdd„ Zddd„Zddd	„Zd
d„ Zdd„ ZdS )rÜ  c                 C   s
   || _ d S r?   rl  rm  r@   r@   rC   r  ´  s    ztransaction.__init__c                 C   s   | j  ¡  d S r?   )r%  rÙ  r  r@   r@   rC   Ú_begin·  s    ztransaction._beginTc                 C   s   | j  ¡  |r|  ¡  d S r?   )r%  rØ  ro  ©rA   rÙ  r@   r@   rC   rØ  º  s    
ztransaction.commitc                 C   s   | j  ¡  |r|  ¡  d S r?   )r%  r×  ro  rp  r@   r@   rC   r×  ¿  s    
ztransaction.rollbackc                 C   s>   | j  ¡ | _| j  d¡ | j  ¡ dkr.|  ¡  | j  | ¡ | S )NFr   )r%  rÖ  rj  rÚ  rå  ro  rã  r  r@   r@   rC   r¨  Ä  s    ztransaction.__enter__c              	   C   sj   zJ|r|  d¡ n6| j  ¡ dkrHz|  d¡ W n   |  d¡ ‚ Y nX W 5 | j  | j¡ | j  ¡  X d S ©NFr˜   )r%  rÚ  rj  rä  r×  rå  rØ  rf  r@   r@   rC   r¯  Ì  s    
ztransaction.__exit__N)T)T)	rE   rF   rG   r  ro  rØ  r×  r¨  r¯  r@   r@   r@   rC   rÜ  ³  s   

rÜ  c                   @   s>   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )rê  Nc                 C   s4   || _ | ¡ }|pdt ¡ j | _| | j¡| _d S )Nr]   )r%  rù  r<  Úuuid4r>  rì  rÍ  Ú
quoted_sid)rA   r%  rì  Ú	_compilerr@   r@   rC   r  Û  s    zsavepoint.__init__c                 C   s   | j j|dd� d S )NFr  )r%  r  rµ  r@   r@   rC   r  á  s    zsavepoint._executec                 C   s   |   d| j ¡ d S )NzRELEASE SAVEPOINT %s;©r  rs  r  r@   r@   rC   rØ  ä  s    zsavepoint.commitc                 C   s   |   d| j ¡ d S )NzROLLBACK TO SAVEPOINT %s;ru  r  r@   r@   rC   r×  ç  s    zsavepoint.rollbackc                 C   s,   | j  ¡ | _| j  d¡ |  d| j ¡ | S )NFzSAVEPOINT %s;)r%  rÖ  Ú_orig_autocommitrÚ  r  rs  r  r@   r@   rC   r¨  ê  s    zsavepoint.__enter__c              	   C   sL   z6|r|  ¡  n$z|  ¡  W n   |  ¡  ‚ Y nX W 5 | j  | j¡ X d S r?   )r%  rÚ  rv  r×  rØ  rf  r@   r@   rC   r¯  ð  s    
zsavepoint.__exit__)N)	rE   rF   rG   r  r  rØ  r×  r¨  r¯  r@   r@   r@   rC   rê  Ú  s   
rê  c                       s(   e Zd Z‡ fdd„Z‡ fdd„Z‡  ZS )r.  c                    s8   | j  ¡ }|jd k	r$|j| _d |_nd | _tt| ƒ ¡ S r?   )r%  rÌ  r  Ú_orig_isolation_levelr  r.  r¨  rÉ  r"  r@   rC   r¨  þ  s    

zsavepoint_sqlite.__enter__c              	      s8   ztt| ƒ |||¡W ¢S | j d k	r2| j | j ¡ _X d S r?   )rw  r%  rÌ  r  r  r.  r¯  rf  r"  r@   rC   r¯  
  s    
  ÿ
zsavepoint_sqlite.__exit__)rE   rF   rG   r¨  r¯  r%  r@   r@   r"  rC   r.  ý  s   r.  c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )rÎ  c                 C   s   || _ | j j| _|| _d S r?   )r´  r„   r†   rµ  )rA   rO  rµ  r@   r@   rC   r    s    
zFieldProxy.__init__c                 C   s   t | j| jƒS r?   )rÎ  r´  rµ  r  r@   r@   rC   rJ    s    zFieldProxy.clone_basec                 C   s   | j  |¡S r?   )rµ  r–  rþ  r@   r@   rC   r–    s    zFieldProxy.coercec                 C   s   | j  |¡S r?   )rµ  r  rþ  r@   r@   rC   r    s    zFieldProxy.python_valuec                 C   s   | j  |¡S r?   )rµ  r   rþ  r@   r@   rC   r   !  s    zFieldProxy.db_valuec                 C   s   |dkr| j S t| j|ƒS ©Nr„   )r´  r´   rµ  rÃ   r@   r@   rC   rÅ   $  s    zFieldProxy.__getattr__N)	rE   rF   rG   r  rJ  r–  r  r   rÅ   r@   r@   r@   rC   rÎ    s   rÎ  c                   @   s>   e Zd Zdd„ Zdd„ Zdd„ Zddd	„Zd
d„ Zdd„ ZdS )rÊ  c                 C   s   || j d< d S rx  )rŒ  ré  r@   r@   rC   r  *  s    zModelAlias.__init__c                 C   s$   t | j|ƒ}t|tƒr t| |ƒS |S r?   )r´   r„   rS   r   rÎ  )rA   rÄ   r	  r@   r@   rC   rÅ   -  s    

zModelAlias.__getattr__c                 C   s   t dƒ‚d S )Nz-Cannot set attributes on ModelAlias instances)r  r!  r@   r@   rC   r   3  s    zModelAlias.__setattr__Fc                    s*   ˆ j j}|r|jn|j}‡ fdd„|D ƒS )Nc                    s   g | ]}t ˆ |ƒ‘qS r@   )rÎ  rU  r  r@   rC   rL  9  s     z/ModelAlias.get_proxy_fields.<locals>.<listcomp>)r„   r�   rX  Úsorted_fields)rA   rX  Úmmr&  r@   r  rC   rô  6  s    zModelAlias.get_proxy_fieldsc                 G   s4   |s|   ¡ }t| f|žŽ }| jjr0|j| jjŽ }|S r?   )rô  rÃ  r�   r™  )rA   r2  r´  r@   r@   rC   rp  ;  s    zModelAlias.selectc                 K   s   | j f |ŽS r?   rü  r  r@   r@   rC   rd  C  s    zModelAlias.__call__N)F)	rE   rF   rG   r  rÅ   r   rô  rp  rd  r@   r@   r@   rC   rÊ  )  s   
rÊ  c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )r£   ©Ú_keysÚ_itemsc                 C   s   g | _ g | _d S r?   r{  r  r@   r@   rC   r  J  s    z_SortedFieldList.__init__c                 C   s
   | j | S r?   )r}  )rA   r�   r@   r@   rC   r¡  N  s    z_SortedFieldList.__getitem__c                 C   s
   t | jƒS r?   )r�  r}  r  r@   r@   rC   r�  Q  s    z_SortedFieldList.__iter__c                 C   s0   |j }t| j|ƒ}t| j|ƒ}|| j||… kS r?   )rï  r   r|  r   r}  )rA   ÚitemÚkr�   rî  r@   r@   rC   r¢  T  s    z_SortedFieldList.__contains__c                 C   s   | j  |j¡S r?   )r|  rã  rï  rÛ  r@   r@   rC   rã  Z  s    z_SortedFieldList.indexc                 C   s2   |j }t| j|ƒ}| j ||¡ | j ||¡ d S r?   )rï  r   r|  Úinsertr}  )rA   r~  r  r�   r@   r@   rC   r€  ]  s    z_SortedFieldList.insertc                 C   s   |   |¡}| j|= | j|= d S r?   )rã  r}  r|  )rA   r~  rþ  r@   r@   rC   Úremovec  s    
z_SortedFieldList.removeN)rE   rF   rG   r  r  r¡  r�  r¢  rã  r€  r�  r@   r@   r@   rC   r£   G  s   r£   c                   @   s   e Zd ZdS )r   Nr¥  r@   r@   r@   rC   r   h  s    z	peewee.dbc                   @   s|   e Zd Zddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zddd„Zd dd„Zdd„ Zd!dd„ZdS )"ÚModelOptionsNTFc                 K   s  || _ |j ¡ | _i | _i | _i | _i | _i | _i | _	g | _
tƒ | _g | _g | _tƒ | _g | _|d k	rj|nt| _|| _|| _t|p„g ƒ| _|| _|| _|| _|	| _|
| _|| _|| _d | _d| _ i | _!i | _"| #¡ D ]\}}t$| ||ƒ qÔt| %¡ ƒ| _&| j�r| j�s|  |¡| _d S r?  )'r„   rE   r'  r�   r&  rZ  rŒ  Ú_default_by_namer‰  rŠ  Ú_default_callable_listr£   Ú_sorted_field_listry  Úsorted_field_namesr’   r‡  rX  Údefault_databaserö  rŽ   Údb_table_funcr”   r^  r™  r½  r  rë  rì  r‹  Úonly_save_dirtyrD  rW  r�  r‚   r£  rC  rB  Ú_additional_keys)rA   rG  rö  rŽ   rˆ  r^  r™  r½  r  rë  rì  r‹  r‰  r  r�   ra   r@   r@   rC   r  p  sD    zModelOptions.__init__c                 C   s   d| j j| jf S )Nz<%s: %s>)r#  rE   r�   r  r@   r@   rC   rž  ›  s    zModelOptions.__repr__c                 C   s~   | j rzg }| j D ]b}t|tƒr:|jdkr,dnd}||j }| j| d¡ }| d¡rd| | 	¡ ¡ q| | 
¡ ¡ q|| _ d S )NrU  rÉ   r1  )r™  rS   r   rB  r�   r&  Úlstriprh  r…   rV  rT  )rA   Únorm_order_byr~  rŸ  r+  r@   r@   rC   rÃ  ž  s    



zModelOptions.preparedc                 C   s^   t | jƒ| _dd„ | jD ƒ| _t| j ¡ ƒt| j ¡ ƒB t| jfƒB | _	dd„ | jD ƒ| _
d S )Nc                 S   s   g | ]
}|j ‘qS r@   ©r�   rU  r@   r@   rC   rL  ®  s     z4ModelOptions._update_field_lists.<locals>.<listcomp>c                 S   s   g | ]}t |tƒs|‘qS r@   )rS   r  r8  r@   r@   rC   rL  ²  s    
ÿ)r”   r…  ry  r†  r’   r&  rB  rƒ   r½  r‡  rX  r  r@   r@   rC   Ú_update_field_lists¬  s    ÿ
þz ModelOptions._update_field_listsc                 C   s˜   |   |j¡ || j|j< || j|j< | j |¡ |  ¡  |jd k	r”|j| j	|< t
|jƒrz|j| j|< | j |j|jf¡ n|j| j|< |j| j|j< d S r?   )Úremove_fieldr�   r&  rZ  rç  r…  r€  rŽ  rè  rŒ  r‚  rŠ  r„  r…   r‰  rƒ  rÛ  r@   r@   rC   rô  µ  s    

zModelOptions.add_fieldc                 C   s¬   || j krd S | j  |¡}| j|j= | j |¡ |  ¡  |jd k	r¨| j|= | j	 |d ¡rŠt
| jƒD ]$\}\}}||krb| j |¡  q¨qbn| j |d ¡ | j |jd ¡ d S r?   )r&  rQ  rZ  rç  r…  r�  rŽ  rè  rŒ  rŠ  rû  r„  r‰  rƒ  r�   )rA   r‘  Úoriginalr�   r�   rö  r@   r@   rC   r�  Æ  s    


zModelOptions.remove_fieldc                 C   s(   | j  ¡ }| jD ]\}}|ƒ ||< q|S r?   )rƒ  r  r„  )rA   Úddr‘  rè  r@   r@   rC   Úget_default_dictÙ  s    
zModelOptions.get_default_dictc                 C   s*   z| j  |¡W S  tk
r$   Y dS X d S r²  )r…  rã  r|   rÛ  r@   r@   rC   Úget_field_indexß  s    zModelOptions.get_field_indexc                    s$   ˆ j r‡ fdd„ˆ jjD ƒS ˆ jgS )Nc                    s   g | ]}ˆ j | ‘qS r@   )r&  r�  r  r@   rC   rL  ç  s   ÿz7ModelOptions.get_primary_key_fields.<locals>.<listcomp>)rW  r½  r�  r  r@   r  rC   rG  å  s
    
þz#ModelOptions.get_primary_key_fieldsc           	      C   s�   t |tƒ}| ot |tƒ}|r"g }| jD ]Z}t |tƒr(|j|kr(|d kpf|rX|j|jkpf|of|j|jk}|r(|sx|  S | |¡ q(|rŒ|S d S r?   )	rS   r   r=  ry  r    r-  r�   r8  r…   )	rA   r†   r  ÚmultiÚis_fieldÚis_noderõ  r+  Úis_matchr@   r@   rC   rÄ  ì  s"    

ÿýzModelOptions.rel_for_modelc                 C   s   |j  | j||¡S r?   )r�   rÄ  r„   )rA   r†   r  r”  r@   r@   rC   rÅ  þ  s    z"ModelOptions.reverse_rel_for_modelc                 C   s   |   |¡p|  |¡S r?   )rÄ  rÅ  rk  r@   r@   rC   rú    s    zModelOptions.rel_existsc                 C   sr   g }| j g}|rn| ¡ }||kr"q| |¡ |jj ¡ D ]}| |j¡ q8|r|jj ¡ D ]}| |j ¡ qZq|S r?   )r„   rQ  r…   r�   r�  rƒ   r-  r‚   )rA   ÚbackrefsrŠ   r·  r†   r  r@   r@   rC   Úrelated_models  s    
zModelOptions.related_models)NNNNNNNNNTF)NF)NF)F)rE   rF   rG   r  rž  rÃ  rŽ  rô  r�  r’  r“  rG  rÄ  rÅ  rú  r™  r@   r@   r@   rC   r‚  o  s,                 ý
+	

r‚  c                
       s>   e Zd Zeddddddddd	g	ƒZ‡ fd
d„Zdd„ Z‡  ZS )Ú	BaseModelrë  rö  rˆ  r^  r™  r½  rì  r‹  r‰  c                    sþ  |t ks|d jt kr,ttˆ ƒ ˆ |||¡S i }| dd ¡}|rf|j ¡ D ]\}}| d¡sJ|||< qJt	|dd ƒ}d }	|D ]¢}
t
|
dƒsŠqzt	|
dƒ}|	d kr¦t|jƒ}	ˆ j|jB }|j ¡ D ] \}}||kr¼||kr¼|||< q¼|
j ¡ D ]2\}}||krúqèt|tƒrè|jjsèt|jƒ||< qèqzttˆ ƒ ˆ |||¡‰ | dt¡}|ˆ f|Žˆ _d ˆ _tˆ jjƒˆ j_ˆ jj�s†t ddˆ j ¡ ¡ˆ j_g }ˆ j ¡ D ]P\}}t|tƒ�r”|j�rÀ|�rÀtdƒ‚n"|j�rÔ|| }}n| ||f¡ �q”d	}|d k�r|	�r|	|	j }}nt d
d�d }}nt|t!ƒ�r.d}d
}|d	k	�rn| "ˆ |¡ |ˆ j_t|t ƒ�p`t#|j$ƒˆ j_%|ˆ j_&|D ]\}}| "ˆ |¡ �qrt
ˆ dƒ�rªt'ˆ d‡ fdd„ƒ dˆ j }dˆ j(i}t)|t*f|ƒ}|ˆ _*ˆ j +¡  t
ˆ dƒ�rðˆ  ,¡  t- .ˆ ¡ ˆ S )Nr   ÚMetarö  r½  r�   Úmodel_options_basez[^\w]+zprimary key is overdetermined.FT)r½  rm  Ú_composite_keyÚ__unicode__rž  c                    s   dˆ j |  ¡ f S )Nz<%s: %r>)rE   rž  r  ©rG  r@   rC   rU   i  s    ÿz#BaseModel.__new__.<locals>.<lambda>z%sDoesNotExistrF   Úvalidate_model)/rJ   rE   r  rš  Ú__new__rQ  rŒ  r£  rh  r´   rÕ  r   r½  ÚinheritablerŠ  rS   rÙ  r+  rÝ  r‚  r�   rÜ  r”   r^  rŽ   r½   rò  r'  r   r|   r…   r�   r1   r   r.  ri  rê  rD  rW  rC  rF   r  r   rÃ  r   r   r4  )rG  r�   ÚbasesÚattrsÚmeta_optionsrK   r  ÚvÚmodel_pkÚ	parent_pkÚbÚ	base_metaÚall_inheritableÚModelOptionsBaser&  rÄ   Úpk_namerW  r+  Úexc_nameÚ	exc_attrsÚexception_classr"  rŸ  rC   r¡    sŠ    










þ



zBaseModel.__new__c                 C   s   t |  ¡ ƒS r?   )r�  rp  r  r@   r@   rC   r�  y  s    zBaseModel.__iter__)rE   rF   rG   r’   r¢  r¡  r�  r%  r@   r@   r"  rC   rš    s          þ`rš  c                   @   sÌ  e Zd Zdd„ Zedd„ ƒZedd„ ƒZedTdd	„ƒZedUd
d„ƒZedVdd„ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd „ ƒZedWd"d#„ƒZed$d%„ ƒZed&d'„ ƒZed(d)„ ƒZedXd*d+„ƒZed,d-„ ƒZedYd.d/„ƒZedZd0d1„ƒZed2d3„ ƒZed4d5„ ƒZd6d7„ ZeZd8d9„ ZeZ d:d;„ Z!d<d=„ Z"d>d?„ Z#d@dA„ Z$dBdC„ Z%d[dDdE„Z&dFdG„ Z'e(dHdI„ ƒZ)d\dJdK„Z*d]dLdM„Z+dNdO„ Z,dPdQ„ Z-dRdS„ Z.dS )^r*   c                 O   s@   | j  ¡ | _t| jƒ| _i | _| ¡ D ]\}}t| ||ƒ q&d S r?   )r�   r’  rÜ  r’   rÞ  rk  r£  rC  )rA   r
  r  r  r¦  r@   r@   rC   r  }  s
    zModel.__init__c                 C   s   t | ƒS r?   )rÊ  rŸ  r@   r@   rC   rO  …  s    zModel.aliasc                 G   s(   t | f|žŽ }| jjr$|j| jjŽ }|S r?   )rÃ  r�   r™  )rG  r2  r´  r@   r@   rC   rp  ‰  s    zModel.selectNc                    s,   |pi }|  ‡ ‡fdd„ˆD ƒ¡ tˆ |ƒS )Nc                    s    g | ]}ˆ j j| ˆ| f‘qS r@   ©r�   r&  rU  ©rG  r  r@   rC   rL  “  s     z Model.update.<locals>.<listcomp>)r  ry  )rG  Ú_Model__datar  Úfdictr@   r²  rC   r  �  s    zModel.updatec                    s,   |pi }|  ‡ ‡fdd„ˆD ƒ¡ tˆ |ƒS )Nc                    s    g | ]}ˆ j j| ˆ| f‘qS r@   r±  rU  ©rG  r€  r@   rC   rL  ™  s     z Model.insert.<locals>.<listcomp>)r  r€  )rG  r³  r€  r´  r@   rµ  rC   r€  –  s    zModel.insertTc                 C   s   t | ||d�S )N)r„  r…  ©r€  )rG  r„  r…  r@   r@   rC   r–  œ  s    zModel.insert_manyc                 C   s   t | ||d�S )N)r&  r´  r¶  )rG  r&  r´  r@   r@   rC   Úinsert_from   s    zModel.insert_fromc                 C   s   t | ƒS r?   )r�  rŸ  r@   r@   rC   r  ¤  s    zModel.deletec                 G   s   t | |f|žŽ S r?   )r  )rG  rŠ  r‹  r@   r@   rC   r\  ¨  s    z	Model.rawc                 K   s"   | f |Ž}|j dd� | ¡  |S )NT)Úforce_insert)Úsaver¨  )rG  r´  rK  r@   r@   rC   Úcreate¬  s    
zModel.createc                 O   s2   |   ¡  ¡ }|r|j|Ž }|r*|jf |Ž}| ¡ S r?   )rp  rO  rq  r�  rÝ  )rG  r´  r  Úsqr@   r@   rC   rÝ  ³  s    
z	Model.getc                 K   s8  |  di ¡}|  ¡ }| ¡ D ]6\}}d|kr>|jf ||iŽ}q| t| |ƒ|k¡}qz| ¡ dfW S  | jk
�r2   zZtdd„ | ¡ D ƒƒ}| 	|¡ | j
j ¡ �$ | jf |ŽdfW  5 Q R £ W  Y S Q R X W n\ tk
�r, } z<z| ¡ dfW  W Y ¢& Y S  | jk
�r   |‚Y nX W 5 d }~X Y nX Y nX d S )NrŒ  r  Fc                 s   s"   | ]\}}d |kr||fV  qdS )r  Nr@   )rK  r  r¦  r@   r@   rC   rO  Ê  s    ÿz&Model.get_or_create.<locals>.<genexpr>T)rQ  rp  r£  r�  rq  r´   rÝ  r   rï  r  r�   rö  rî  rº  r#   )rG  r  rŒ  r´  r+  ra   r‹  Úexcr@   r@   rC   Úget_or_create¼  s&    
,zModel.get_or_createc              
   K   s˜   z6| j j ¡ �  | jf |ŽdfW  5 Q R £ W S Q R X W n\ tk
r’   g }| ¡ D ],\}}t| |ƒ}|jsp|jrR| 	||k¡ qR| j
|Ž df Y S X d S r‘  )r�   rö  rî  rº  r#   r£  r´   rä  r½  r…   rÝ  )rG  r  r´  r‘  ra   r+  r@   r@   rC   Úcreate_or_getÕ  s    (
zModel.create_or_getc                 O   s   |   ¡ j||ŽS r?   )rp  r�  )rG  Údqr´  r@   r@   rC   r�  â  s    zModel.filterc                 C   s0   i }| j jr| j j|d< | j j| j jjf |ŽkS )Nrì  )r�   rì  rŽ   rö  rð  )rG  r  r@   r@   rC   Útable_existsæ  s    zModel.table_existsFc                 C   sb   |r|   ¡ rd S | jj}| jj}|jrL|dk	rL|jrL| |j¡sL| |j¡ | | ¡ |  	¡  d S r?  )
rÀ  r�   rö  r½  rþ  rê  r÷  r|  rw  Ú_create_indexes)rG  r_  r%  ræ  r@   r@   rC   rw  í  s    
zModel.create_tablec                 C   sD   g }| j jD ]2}|jrqt|j|jt|tƒfƒ}|r| |¡ q|S r?   )	r�   ry  r½  rú  rã  rä  rS   r    r…   )rG  r&  r+  Úrequires_indexr@   r@   rC   Ú_fields_to_indexû  s    ýzModel._fields_to_indexc                 C   s"   t  dd„ |  ¡ D ƒ| jjpd¡S )Nc                 S   s   g | ]}|f|j f‘qS r@   )rä  r8  r@   r@   rC   rL    s     z%Model._index_data.<locals>.<listcomp>r@   )Ú	itertoolsÚchainrÃ  r�   r^  rŸ  r@   r@   rC   Ú_index_data	  s    
þzModel._index_datac                 C   s(   |   ¡ D ]\}}| jj | ||¡ qd S r?   )rÆ  r�   rö  rz  )rG  Ú
field_listr*  r@   r@   rC   rÁ    s    zModel._create_indexesc                 C   s(   |   ¡ D ]\}}| jj | ||¡ qd S r?   )rÆ  r�   rö  r{  )rG  rY  rÇ  r*  r@   r@   rC   Ú_drop_indexes  s    zModel._drop_indexesc                    s¾   g }ˆ j j ¡ }ˆ j j}ˆ j jjr:|jr:| | |j¡¡ | | ˆ ¡¡ ˆ  	¡ D ]}| | 
ˆ |g|j¡¡ qRˆ j jr°ˆ j jD ].\}}‡ fdd„|D ƒ}| | 
ˆ ||¡¡ q€dd„ |D ƒS )Nc                    s   g | ]}ˆ j j| ‘qS r@   r±  rU  rŸ  r@   rC   rL  %  s     z Model.sqlall.<locals>.<listcomp>c                 S   s   g | ]\}}|‘qS r@   r@   )rK  rŠ  rö  r@   r@   rC   rL  '  s     )r�   rö  rù  r½  rþ  rê  r…   r|  rw  rÃ  rz  rä  r^  )rG  Úqueriesrù  ræ  r+  r�  rä  r&  r@   rŸ  rC   Úsqlall  s    zModel.sqlallc                 C   s   | j j | ||¡ d S r?   )r�   rö  rx  )rG  r_  r`  r@   r@   rC   rx  )  s    zModel.drop_tablec                 C   s   | j j | ||¡ d S r?   )r�   rö  ry  )rG  rb  r`  r@   r@   rC   ry  -  s    zModel.truncate_tablec                 C   s&   | j jrt| j j| j jƒS t| j jƒS r?   )r�   rì  r7  rŽ   rŸ  r@   r@   rC   r  1  s    zModel.as_entityc                 O   s   t | f|ž|ŽS r?   )ro  )rG  r
  r  r@   r@   rC   Únoop7  s    z
Model.noopc                 C   s   t | | jjjƒS r?   )r´   r�   r½  r�   r  r@   r@   rC   rŽ  ;  s    zModel._get_pk_valuec                 C   s   | j jst| | j jj|ƒ d S r?   )r�   rW  rC  r½  r�   rþ  r@   r@   rC   Ú_set_pk_value?  s    zModel._set_pk_valuec                 C   s   | j j|  ¡ kS r?   )r�   r½  rŽ  r  r@   r@   rC   Ú_pk_exprD  s    zModel._pk_exprc                 C   s   | j  ¡  |  ¡  d S r?   )rÞ  ÚclearrÃ  r  r@   r@   rC   r¨  G  s    
zModel._prepare_instancec                 C   s   d S r?   r@   r  r@   r@   rC   rÃ  K  s    zModel.preparedc                 C   s,   i }|D ]}|j |kr||j  ||j < q|S r?   r�  )rA   rÔ  ÚonlyÚnew_datar+  r@   r@   rC   Ú_prune_fieldsN  s
    
zModel._prune_fieldsc                 C   sd   | j jD ]V}|| jko8||ko8|| d ko8| j |¡d k	}|rt| |t| |ƒƒ | j| ||< qd S r?   )r�   r�  rÞ  rk  rÝ  rC  r´   rÜ  )rA   rÔ  r�   Ú
conditionsr@   r@   rC   Ú_populate_unsaved_relationsU  s    
ÿ
þüz!Model._populate_unsaved_relationsc           	      C   s(  t | jƒ}| jjdk	r(| jj}|  ¡ }nd  }}|rB|  ||¡}n,| jjrn|sn|  || j¡}|sn| j 	¡  dS |  
|¡ |d k	rÐ|sÐ| jjr¦|jD ]}| |d ¡ q’n| |jd ¡ | jf |Ž |  ¡ ¡ ¡ }nJ|d krî| jf |Ž ¡  d}n,| jf |Ž ¡ }|d k	�r|}|  |¡ d}| j 	¡  |S rq  )rï  rÜ  r�   r½  rŽ  rÑ  r‰  Údirty_fieldsrÞ  rÎ  rÓ  rW  r�  rQ  r�   r  rq  rÍ  r  r€  rÌ  )	rA   r¸  rÏ  rÔ  Úpk_fieldÚpk_valueÚpk_part_namer„  Úpk_from_cursorr@   r@   rC   r¹  `  s@    

þ





z
Model.savec                 C   s
   t | jƒS r?   )ri  rÞ  r  r@   r@   rC   Úis_dirty…  s    zModel.is_dirtyc                    s   ‡ fdd„ˆ j jD ƒS )Nc                    s   g | ]}|j ˆ jkr|‘qS r@   )r�   rÞ  rU  r  r@   rC   rL  Š  s      z&Model.dirty_fields.<locals>.<listcomp>)r�   ry  r  r@   r  rC   rÔ  ˆ  s    zModel.dirty_fieldsc                 c   sØ   t | ƒ}|  ¡  |  ¡ ¡}t | ƒ|fg}tƒ }|rÔ| ¡ \}}||krHq.| |¡ |jj 	¡ D ]r\}}|j
}	|j|kr˜|| j|jj k}
|	 ¡  |
¡}n||> }
|	 ¡  |
¡}|jr¸|rÆ| |	|f¡ |
|fV  q^q.d S r?   )r  rp  rq  rÍ  r’   rQ  r€   r�   r‚   r£  r„   r-  rÜ  rÏ  r�   râ  r…   )rA   Úsearch_nullabler„   r´  r·  rŒ   ÚklassÚrel_namer  r-  r>  Úsubqueryr@   r@   rC   ÚdependenciesŒ  s&    


zModel.dependenciesc                 C   sz   |rd|   |¡}tt|ƒƒD ]H\}}|j}|jrP|sP|jf |jd iŽ |¡ ¡  q| 	¡  |¡ ¡  q|  	¡  |  
¡ ¡ ¡ S r?   )rÞ  r•   r”   r„   râ  r  r�   rq  r  r  rÍ  )rA   Ú	recursiveÚdelete_nullablerÞ  r´  r  r†   r@   r@   rC   Údelete_instance£  s    

zModel.delete_instancec                 C   s   t | j|  ¡ fƒS r?   )r  r#  rŽ  r  r@   r@   rC   r  ®  s    zModel.__hash__c                 C   s(   |j | j ko&|  ¡ d k	o&| ¡ |  ¡ kS r?   )r#  rŽ  ©rA   r—  r@   r@   rC   ra  ±  s
    
ÿýzModel.__eq__c                 C   s
   | |k S r?   r@   râ  r@   r@   rC   rb  ·  s    zModel.__ne__)N)N)T)F)F)FF)FF)FN)F)FF)/rE   rF   rG   r  ro  rO  rp  r  r€  r–  r·  r  r\  rº  rÝ  r½  r¾  r�  rÀ  rw  rÃ  rÆ  rÁ  rÈ  rÊ  rx  ry  r  rË  rŽ  Úget_idrÌ  Úset_idrÍ  r¨  rÃ  rÑ  rÓ  r¹  rÙ  r×  rÔ  rÞ  rá  r  ra  rb  r@   r@   r@   rC   r*   |  s†   

















%


c                 C   s   |   ¡ } d  | _| _| S r?   )r	  r  r  )r´  r@   r@   rC   Úclean_prefetch_subqueryº  s    rå  c                    s°  t | ƒg}t|ƒD �]–\}}t|tƒr0|\}}nd }t|tƒsPt|tƒrP| ¡ }|j‰d  }}t	t
|d ƒƒD ]~}|| }	|	j}
|	j‰ˆjjˆdd�}|rÀ‡fdd„|D ƒ}‡fdd„|D ƒ}nˆjjˆdd�}|sØ|rn|ˆksè|d krn qîqn|�s|�s|�rd| nd}td	||f ƒ‚|�rht|
ƒ‰ ttj‡ fd
d„t||ƒD ƒƒ}| |¡}| t ||dƒ¡ q|rt|
ƒ‰ ttj‡ fdd„|D ƒƒ}| |¡}| t ||dƒ¡ q|S )Nr˜   T)r”  c                    s   g | ]}t ˆ |jƒ‘qS r@   )r´   r�   ©rK  r  )Úsubquery_modelr@   rC   rL  Ð  s     z)prefetch_add_subquery.<locals>.<listcomp>c                    s   g | ]}t ˆ |jjƒ‘qS r@   )r´   rÏ  r�   ræ  )Ú
last_modelr@   rC   rL  Ñ  s     z	 using %sr1  z1Error: unable to find foreign key for query: %s%sc                    s   g | ]\}}|ˆ   |¡> ‘qS r@   )rp  )rK  r  ræ  ©Úcleanedr@   rC   rL  â  s   ÿFc                    s   g | ]}|j ˆ  |¡> ‘qS r@   )rÏ  rp  )rK  r…  ré  r@   rC   rL  é  s   ÿ)ÚPrefetchResultrû  rS   r“  rç  rv  r*   rp  r„   r•   r›   r´  r†   r�   rÄ  r  rå  rR   r•  rø  r”  rq  r…   )r»  Ú
subqueriesÚfixed_queriesr�   rÝ  Útarget_modelÚfksr˜  rî  Úprefetch_resultÚ
last_queryÚrelsrK  Útgt_errÚexprr@   )rê  rè  rç  rC   Úprefetch_add_subquery¿  sZ    


þÿÿþ
þ
rõ  Ú__prefetched)r´  r&  r…  Ú
rel_modelsÚfield_to_namer†   c                       s.   e Zd Zd‡ fdd„	Zdd„ Zdd„ Z‡  ZS )	rë  Nc              	      sr   |rP|r&dd„ |D ƒ}dd„ |D ƒ}ndd„ |D ƒ}dd„ |D ƒ}t t||ƒƒ}|j}tt| ƒ | ||||||¡S )Nc                 S   s   g | ]
}|j ‘qS r@   rü  r8  r@   r@   rC   rL  ù  s     z*PrefetchResult.__new__.<locals>.<listcomp>c                 S   s   g | ]}|j j‘qS r@   )rÏ  r�   r8  r@   r@   rC   rL  ú  s     c                 S   s   g | ]
}|j ‘qS r@   rƒ  r8  r@   r@   rC   rL  ü  s     c                 S   s   g | ]
}|j ‘qS r@   r�  r8  r@   r@   rC   rL  ý  s     )r”   r”  r„   r  rë  r¡  )rG  r´  r&  r…  r÷  rø  r†   Úforeign_key_attrsr"  r@   rC   r¡  õ  s"    
      ÿzPrefetchResult.__new__c           
      C   s¤   | j rB| jD ]2}|j|j }||f}||krt||j|| ƒ qn^| jD ]V\}}|j|jj }||f}| |g ¡}d|j }|D ]}	t|	||ƒ q€t|||ƒ qHd S )Nz%s_prefetch)	r…  r&  rÜ  r�   rC  rø  rÏ  rÝ  r}  )
rA   r:  Úid_mapr+  Ú
identifierr�   ÚattnameÚrel_instancesr¼  rK  r@   r@   rC   Úpopulate_instance  s    

z PrefetchResult.populate_instancec                 C   sX   | j D ]L\}}|j |j| ¡}||f}| jr8|||< q| |g ¡ ||  |¡ qd S r?   )rø  rÏ  r  rÜ  r…  rX  r…   )rA   r:  rú  r+  rü  Úidentityr�   r@   r@   rC   Ústore_instance  s    
zPrefetchResult.store_instance)NNNNN)rE   rF   rG   r¡  rþ  r   r%  r@   r@   r"  rC   rë  ô  s       ÿrë  c                 G   sÀ   |s| S t | |ƒ}i }i }t|ƒD ]–}|j}|jrX|jD ]}| |g ¡ ||  |¡ q8i ||< || }t| |¡ƒ}	|j	D ]:}
|jr’| 
|
|¡ |	r||| D ]}| |
||j ¡ qžq|q"|j	S r?   )rõ  r•   r†   r&  r÷  rX  r…   ri  rÝ  r´  r   rþ  )r»  rì  rí  ÚdepsÚrel_maprð  Úquery_modelr-  rú  Úhas_relationsr:  r�  r@   r@   rC   r0     s*    


c                 K   s   t | ƒD ]}|jf |Ž qdS )z8Create tables for all given models (in the right order).N)rv   rw  )rŠ   Úcreate_table_kwargsr�   r@   r@   rC   rù  ;  s    rù  c                 K   s"   t t| ƒƒD ]}|jf |Ž qdS )z6Drop tables for all given models (in the right order).N)r•   rv   rx  )rŠ   Údrop_table_kwargsr�   r@   r@   rC   r   @  s    r   )N)N)r'  )òr]  rz   r  rg  rÄ  Úloggingr•  r½   re   r¼  rG  r<  rt  Úbisectr   r   Úcollectionsr   r   r   ÚImportErrorrï  r  r   Ú	functoolsr	   Úinspectr
   Ú__version__Ú__all__r>   ÚHandlerÚ	getLoggerrÔ  Ú
addHandlerrJ   ÚobjectrM   Úversion_infoÚPY2rn  r©  ÚbuiltinsrQ   rR   r‚  r  r(  rZ   r)  r:  r´   rh   r;  r  rd  rc   ÚunicodeÚbufferÚexecÚRuntimeErrorrn   rq   Z	pysqlite2rr   Úpysq3r  r0  Zpsycopg2cffirs   Úregisterr:  rt   r<  ZMySQLdbrZ  ZpymysqlZplayhouse._speedupsru   rv   rw   r¡   r¢   r£   r¤   Úregister_adapterr#  rD  ÚDATETIME_PARTSr’   r±   r³   r¹   rº   ra  r¼   rÁ   rÂ   r`  r&   rö   r(   rø   r)   r÷   r'   r(  rf  r&  r'  re  rç   rè   ré   rê   rë   rì   rí   rï   rñ   rò   rô   r  r  r  r  r3   r   r6  r=  r7   r4   r7  r�  r   rY  r.   r¥  r   r­  r¯  r=   r   r   r¶  r·  rÁ  rÙ  r   r   r"   r   r5   r1   r  r   r   r   r,  r   r   r8   r   r<   rB  rC  r   r   r9   r:   r   rj  ro  rr  r    r   r™  r¥  r~  r€  rŠ  r�  r¤  r§  rª  r«  rÊ  rÌ  rç  r  r-  rÃ  ro  r  rt  ry  r€  r�  rž  rŸ  r¡  rÅ  r¤  r!   r   r   r#   r$   r%   r,   r-   r2   r¦  r°  Úlocalr¶  r·  r6   r/   r+   rb  rá  r;   rí  rÜ  rê  r.  rÎ  rÊ  r   r‡  r‚  r  rš  r*   rå  rõ  rö  rë  r0   rù  r   r@   r@   r@   rC   Ú<module>   sþ  
Í8






	"ÿÿúçüõ
 %	
M{&	9"        R'


  4 /0	  
(<' þþþ	  <u `'#
! &h  @2+
