509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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>   ZpeeweeZ_metaclass_helper_c                 C   s   | t |fi ƒS r?   )Ú_METACLASS_)ÚmetaÚbaser@   r@   rC   Úwith_metaclasss   s    rK   é   é   )rL   é   )ÚCallable)Úreducec                 C   s
   t | tƒS r?   )Ú
isinstancerO   )Úcr@   r@   rC   Ú<lambda>}   ó    rS   Úprintc                 C   s   t |  d¡ƒS ©NZraw_unicode_escape)ÚbytesÚencode©Úsr@   r@   rC   rS   ‚   rT   c                 C   s   |j |k	r| |¡‚|‚d S r?   )Ú__traceback__Úwith_traceback)ÚtpÚvalueÚtbr@   r@   rC   Úreraise„   s    

r`   c                 C   s   t j | ¡ t j d¡ d S )NÚ
)ÚsysÚstdoutÚwriterY   r@   r@   rC   Úprint_Œ   s    re   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  )ÚmicrosecondsZsecondsZdaysÚ_M©Útr@   r@   rC   rS   •   rT   c                 C   s   |   ¡ S r?   )Útotal_secondsrj   r@   r@   rC   rS   —   rT   )Ú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   rS   ¾   rT   z"format_date_time.<locals>.<lambda>)ÚdatetimeÚstrptimeÚ
ValueError)r^   ÚformatsZpost_processZfmtr@   r@   rC   rp   ½   s    rp   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ÚmodelsZorderingÚseenr@   rC   r‚   Ë   s
    
z&sort_models_topologically.<locals>.dfsc                 S   s   | j j| j jfS r?   )rz   ÚnameÚdb_table)Úmr@   r@   rC   rS   Ò   rT   z+sort_models_topologically.<locals>.<lambda>T)ÚkeyÚreverse)ÚsetÚsortedÚlistÚreversed)rƒ   Únamesr‡   r@   r�   rC   rq   Æ   s    
rq   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)rZ   ZctÚiÚlZunbalanced_ctZrequiredr@   r@   rC   rr   ×   s6    

rr   )Ú_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ÚAssertionErrorrp   ÚSQLITE_DATETIME_FORMATSÚgetattr©Zlookup_typeZ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§   rp   r¨   Ústrftimerª   r@   r@   rC   Ú_sqlite_date_trunc&  s
    
r¯   c                 C   s   t  | |t j¡d k	S r?   )ÚreÚsearchÚI)Zregexr^   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ÚltZlteÚgtZgteÚnerÈ   rÉ   rÊ   rË   rÍ   c                 C   s   |   ¡ }| |¡ |S r?   )ÚcopyÚupdate)ÚsourceZ	overridesZ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)Z
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¶   r^   ©Ú	__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Ú_unresolvedry   )rA   Z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)Z	model_clsZ
unresolvedZdrr@   r@   rC   Úresolve½  s
    

zDeferredRelation.resolve)N)
rE   rF   rG   rŠ   r  r  r  r  Ústaticmethodr  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   ÚinstanceZinstance_typer@   r@   rC   Ú__get__Ç  s    
z_CDescriptor.__get__)N)rE   rF   rG   r$  r@   r@   r@   rC   r  Æ  s   r  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)Ú_negatedr!  Ú_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)ÚmethodZmethod_name©r÷   Úclsr…   r@   rC   Ú	decoratorÛ  s
    
zNode.extend.<locals>.decoratorr@   )r.  r…   r÷   r/  r@   r-  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?   )r1  r(  r!  r*  r)  )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?   ©r!  )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)r)  )rA   Zbtr@   r@   rC   Úbind_toö  s    zNode.bind_toc                 C   s
   d| _ d S )NZASC©r*  r  r@   r@   rC   Úascÿ  s    zNode.ascc                 C   s
   d| _ d S )NÚDESCr8  r  r@   r@   rC   Údesc  s    z	Node.descc                 C   s   |   ¡ S r?   )r9  r  r@   r@   rC   Ú__pos__  s    zNode.__pos__c                 C   s   |   ¡ S r?   )r;  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@   )rC  rB  rü   r@   rA  rC   Ú_e  s    zNode._eT)rB  c                 C   s$   |d krt | tjd ƒS t | tj|ƒS r?   )r>  ÚOPrá   rÙ   r?  r@   r@   rC   Ú__eq__'  s    zNode.__eq__c                 C   s$   |d krt | tjd ƒS t | tj|ƒS r?   )r>  rE  râ   rÞ   r?  r@   r@   rC   Ú__ne__+  s    zNode.__ne__c                 C   s   t | tj|ƒS r?   )r>  rE  rß   r?  r@   r@   rC   Úin_=  s    zNode.in_c                 C   s   t | tj|ƒS r?   )r>  rE  rà   r?  r@   r@   rC   Únot_in?  s    zNode.not_inc                 C   s    |rt | tjd ƒS t | tjd ƒS r?   )r>  rE  rá   râ   )rA   Úis_nullr@   r@   rC   rJ  A  s    zNode.is_nullc                 C   s   t | tjd| ƒS )Nz%%%s%%©r>  rE  rä   r?  r@   r@   rC   ÚcontainsE  s    zNode.containsc                 C   s   t | tjd| ƒS )Nz%s%%rK  r?  r@   r@   rC   Ú
startswithG  s    zNode.startswithc                 C   s   t | tjd| ƒS )Nz%%%srK  r?  r@   r@   rC   ÚendswithI  s    zNode.endswithc                 C   s   t | tjt|tdƒ|ƒƒS )NrÏ   )r>  rE  rå   r   r4   )rA   ZlowZhighr@   r@   rC   rÌ   K  s    zNode.betweenc                 C   s   t | tj|ƒS r?   )r>  rE  ræ   )rA   Ú
expressionr@   r@   rC   rÍ   M  s    zNode.regexpc                 C   s   t | tj|ƒS r?   )r>  rE  rç   r?  r@   r@   rC   ÚconcatO  s    zNode.concat)NF)N)F)T)LrE   rF   rG   r  r  rR   Ú
_node_typer  Úclassmethodr0  r1  r÷   rþ   r3  r6  r7  r9  r;  r<  r=  rD  rE  rÏ   Ú__and__rÐ   Ú__or__rÑ   Ú__add__rÒ   Ú__sub__rÓ   Ú__mul__rÔ   Z__div__Ú__truediv__r×   Ú__xor__Ú__radd__Ú__rsub__Ú__rmul__Z__rdiv__Ú__rtruediv__Ú__rand__Ú__ror__Ú__rxor__rF  rG  rÚ   Ú__lt__rÛ   Ú__le__rÜ   Ú__gt__rÝ   Ú__ge__rß   Ú
__lshift__rá   Ú
__rshift__rã   Ú__mod__rä   Ú__pow__rÕ   Zbin_andrÖ   Zbin_orrH  rI  rJ  rL  rM  rN  rÌ   rÍ   rP  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?   )r^   Úparamsr  r7   r  )rA   r^   rj  r  r@   rC   r  V  s    zSQL.__init__c                 C   s   t | jf| jžŽ S r?   )r7   r^   rj  r  r@   r@   rC   r1  [  s    zSQL.clone_base©rE   rF   rG   r  rQ  r  r1  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 )	r   z/A quoted-name or entity, e.g. "table"."column".Úentityc                    s   t t| ƒ ¡  || _d S r?   )r  r   r  Úpath)rA   rm  r  r@   rC   r  c  s    zEntity.__init__c                 C   s
   t | jŽ S r?   )r   rm  r  r@   r@   rC   r1  g  s    zEntity.clone_basec                 C   s   t td | j|f ƒŽ S r?   )r   Úfilterrm  rµ   r@   r@   rC   r·   j  s    zEntity.__getattr__)	rE   rF   rG   r  rQ  r  r1  r·   r  r@   r@   r  rC   r   _  s
   r   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  ro  r  )rA   r…   rr  r  r@   rC   r  r  s    zFunc.__init__Tc                 C   s
   || _ d S r?   )rt  )rA   Úcoercer@   r@   rC   ru  x  s    zFunc.coercec                 C   s   t | jf| jžŽ }| j|_|S r?   )ro  r…   rr  rt  )rA   Úresr@   r@   rC   r1  |  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_byZOVER)rQ   r=   Ú__sql__r7   r!  r   )rA   rw  rx  Úwindowri  r@   r@   rC   Úover�  s     ÿ
z	Func.overc                    s   ‡ fdd„}|S )Nc                     s   t ˆ f| ž|ŽS r?   )ro  ©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  rQ  rŠ   rs  r  rþ   ru  r1  r{  r·   r  r@   r@   r  rC   ro  m  s   

ro  c                       s.   e Zd ZdZdZd‡ fdd„	Zdd„ Z‡  ZS )	r>  z0A binary expression, e.g `foo + 1` or `bar < 7`.rO  Fc                    s*   t t| ƒ ¡  || _|| _|| _|| _d S r?   )r  r>  r  ÚlhsrC  r@  Úflat)rA   r  rC  r@  r€  r  r@   rC   r  ˜  s
    zExpression.__init__c                 C   s   t | j| j| j| jƒS r?   )r>  r  rC  r@  r€  r  r@   r@   rC   r1  Ÿ  s    zExpression.clone_base)Frk  r@   r@   r  rC   r>  ”  s   r>  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?   )r^   Úadaptr  r.   r  )rA   r^   r‚  r  r@   rC   r  ª  s    zParam.__init__c                 C   s   t | j| jƒS r?   )r.   r^   r‚  r  r@   r@   rC   r1  ¯  s    zParam.clone_base)Nrk  r@   r@   r  rC   r.   ¢  s   c                   @   s   e Zd ZdZdS )ÚPassthroughÚpassthroughN)rE   rF   rG   rQ  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   r1  Ä  s    
zClause.clone_base)
rE   rF   rG   r  rQ  r‡  rˆ  r  r1  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  rw  rx  r!  )rA   rw  rx  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)rw  r~   r   r7   r‹  rx  r�  )rA   Zover_clausesr@   r@   rC   ry  Ù  s    þþzWindow.__sql__c                 C   s   t | j| jƒS r?   )r=   rw  rx  r  r@   r@   rC   r1  å  s    zWindow.clone_base)NN)rE   rF   rG   r  ry  r1  r  r@   r@   r  rC   r=   Ò  s   c                 C   s   t d|  ƒS )Nz
CHECK (%s)©r7   )r^   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   r1  ñ  s    zDQ.clone_base)rE   rF   rG   r  r  r1  r  r@   r@   r  rC   r   ë  s   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )Ú_StripParensrr   c                    s   t t| ƒ ¡  || _d S r?   )r  r“  r  r&  )rA   r&  r  r@   rC   r  ÷  s    z_StripParens.__init__)rE   rF   rG   rQ  r  r  r@   r@   r  rC   r“  ô  s   r“  ÚJoinMetadata©Ú	src_modelÚ
dest_modelÚsrcÚdestr¶   Úprimary_keyr€   Ú
is_backrefr6  Ú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)rQ   ÚSelectQueryrz   Ú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?   )rQ   Ú
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™  rQ   Úonr%  r!  r>  ro  r7   r   Ú
FieldProxyr…   rz   r  r¤  Úto_fieldr†   r  r
  r”  )
rA   r˜  r™  Z
join_aliasr�  Zon_fieldr£  r›  rš  Z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ž  Z_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  r"  r@   r@   rC   r$  ]  s    zFieldDescriptor.__get__c                 C   s   ||j | j< |j | j¡ d S r?   )rµ  r³  Ú_dirtyry   ©rA   r#  r^   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�   rL   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ù   r2  r@   r@   rC   r1  ‡  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Útitlerz   Ú	add_fieldr+  r²  rÉ  ©rA   r}   r…   r@   r@   rC   r  œ  s    zField.add_to_classc                 C   s
   | j jjS r?   )r}   rz   Údatabaser  r@   r@   rC   Úget_database¬  s    zField.get_databasec                 C   s   |   ¡ }|  ¡  ¡  |¡S r?   )Úget_db_fieldrÐ  ÚcompilerÚget_column_type)rA   Z
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   r^   r@   r@   rC   ru  ¹  s    zField.coercec                 C   s   |dkr|S |   |¡S )z5Convert the python value for storage in the database.N©ru  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?   )r   r}   rz   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_typeZ	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Ä  r0  )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Ç  rQ  rÔ  r  r1  r  rÐ  rÓ  rÑ  rÕ  ru  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  ru  )rA   ru  rø   rù   r  r@   rC   r  ä  s    zBareField.__init__c                    s   t t| ƒjf d| ji|—ŽS )Nru  )r  r   r1  ru  ©rA   rù   r  r@   rC   r1  é  s    zBareField.clone_base)N)rE   rF   rG   rÔ  r  r1  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ë  ru  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_namerw   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ñ  ru  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ó  Z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   r1  rõ  rö  r÷  rø  rê  r  r@   rC   r1    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ß  Zquantize)rA   r^   Ú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?   )rQ   ró  rù  rß  rÖ  r@   r@   rC   rÙ  ,  s    zDecimalField.python_value)rô  rí   FN)
rE   rF   rG   rÔ  r  r1  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?   )rQ   Úunicode_typeÚstring_typeÚdecode)rZ   Ú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   r1  r  rê  r  r@   rC   r1  @  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   ru  H  s    zCharField.coerce)r  )	rE   rF   rG   rÔ  r  r1  rÕ  ru  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 r  r  rÖ  r@   r@   rC   ru  W  s    zTextField.coerceN)rE   rF   rG   rÔ  ru  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?   )	rQ   rz   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   r  c  s    zBlobField._set_constructorc                 C   s,   t |tƒr| d¡}t |tƒr(|  |¡S |S rV   )rQ   rý  rX   Ú
basestringr  rÖ  r@   r@   rC   rØ  f  s
    



zBlobField.db_value)
rE   rF   rG   rÔ  Úbinary_constructr  r  r  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?   )rQ   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?   )rQ   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}   rz   rÏ  Úextract_dater  ©Ú	date_partr@   rC   r~  ~  s    z_date_part.<locals>.decr@   )r  r~  r@   r  rC   Ú
_date_part}  s    r  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?   )rx   r  r  r  )rA   rx   rø   rù   r  r@   rC   r  „  s    z_BaseFormattedField.__init__c                    s   t t| ƒjf d| ji|—ŽS )Nrx   )r  r  r1  rx   rê  r  r@   rC   r1  ‰  s
    ÿþz_BaseFormattedField.clone_base)N)rE   rF   rG   rx   r  r1  r  r@   r@   r  rC   r  ‚  s   r  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   ru   r¡   r    r¢   c                 C   s   |rt |tƒrt|| jƒS |S r?   )rQ   r  rp   rx   rÖ  r@   r@   rC   rÙ  –  s    zDateTimeField.python_valuerš   r›   rœ   r�   rž   rŸ   N)rE   rF   rG   rÔ  rx   rÙ  r±  r  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?   )r  rs   r@   r@   rC   rS   ¬  rT   z(DateField.python_value.<locals>.<lambda>)rQ   r  rp   rx   ru   r  ©rA   r^   Zppr@   r@   rC   rÙ  ª  s    zDateField.python_valuerš   r›   rœ   N)rE   rF   rG   rÔ  rx   rÙ  r±  r  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?   )r  rs   r@   r@   rC   rS   Ã  rT   z(TimeField.python_value.<locals>.<lambda>)rQ   r  rp   rx   ru   r  Z	timedeltaÚminr  r@   r@   rC   rÙ  À  s    
zTimeField.python_valuer�   rž   rŸ   N)rE   rF   rG   rÔ  rx   rÙ  r±  r  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ß  r  r@   r@   rC   Ú	<genexpr>×  s     z*TimestampField.__init__.<locals>.<genexpr>ÚutcFrÁ  )Úpopr!  Úvalid_resolutionsrw   rÝ  r#  ru   ZutcfromtimestampZfromtimestampÚ_convZutcnowZnowÚ
setdefaultr  r:   r  )rA   rø   rù   Z_dtZ_defaultr  r@   rC   r  Ó  s    ÿzTimestampField.__init__c                 C   s   | j dkr| jS tjS ©Nr�   )r!  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�   )rQ   ru   r  rš   r›   rœ   rë  Úroundr!  r#  ÚcalendarZtimegmZutctimetupler  ÚmktimeZ	timetupleÚmicrosecond)rA   r^   Z	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�   rf   )r,  )rQ   rë  rñ  Úlongr!  Údivmodr&  Úreplace)rA   r^   Zticks_to_microsecondZticksrh   r@   r@   rC   rÙ  û  s    


zTimestampField.python_value)
rE   rF   rG   r“   r%  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Ô  r0  ru  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  r1  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#  Z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?   )r3  r  r"  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?   )rQ   r  r©   r  r¬  r…   rµ  r³  r2  r¶  r·  ry   )rA   r#  r^   Z
orig_valuer@   r@   rC   r¹  "  s     ÿ
zRelationDescriptor.__set__)N)	rE   rF   rG   r  r  r3  r$  r¹  r  r@   r@   r  rC   r1    s
   
r1  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…   r"  r@   r@   rC   r$  4  s
    
ÿz!ReverseRelationDescriptor.__get__)N)rE   rF   rG   r  r  r$  r@   r@   r@   rC   r4  .  s   r4  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¶  r8  r  r"  r@   r@   rC   r$  @  s    zObjectIdDescriptor.__get__c                 C   s   t || j|ƒ d S r?   )r+  r8  r¸  r@   r@   rC   r¹  E  s    zObjectIdDescriptor.__set__)N)rE   rF   rG   r  r  r$  r¹  r@   r@   r@   rC   r7  :  s   
r7  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")rQ   r3   r   Ú
issubclassr*   Ú	TypeErrorr  Ú_related_nameÚdeferredÚ	on_deleteÚ	on_updateÚextrar¬  r  r    r  )	rA   r  Úrelated_namer?  r@  rA  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  rB  r?  r@  rA  r¬  )	r  r    r1  r  Ú_get_related_namer?  r@  rA  r¬  rê  r  r@   rC   r1  Y  s    úùzForeignKeyField.clone_basec                 C   s   t | | jƒS r?   )r1  r  r  r@   r@   rC   Ú_get_descriptorc  s    zForeignKeyField._get_descriptorc                 C   s   t | ƒS r?   )r7  r  r@   r@   rC   Ú_get_id_descriptorf  s    z"ForeignKeyField._get_id_descriptorc                 C   s   t | ƒS r?   )r4  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)r=  Úcallabler}   rz   r…   r  r@   r@   rC   rC  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_idZ_idrÊ  r†  rA   c                    s.   |j dˆ jjˆf ˆjˆd� t| | ƒ‚d S )Nz%s.%s)r  ÚbackrefÚobj_id_name)ró   rz   r…   rB  r
  )ÚmsgÚcontext©r}   r…   rJ  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)rQ   r  r3   r	  r   r  r…   r}   rÀ  r¾  r°   rË  rÌ  rz   rÍ  rC  rB  r¬  r   r©   rš  Úvalidate_backrefsr  r{   Ú__dict__r+  rD  rE  rF  rÉ  Úrel)rA   r}   r…   r  rN  r@   rM  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.
        )rQ   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?   )rQ   r¬  r1   rÕ  r  r    r  r  r@   rC   rÕ  º  s    
zForeignKeyField.get_modifiersc                 C   s   | j  |¡S r?   )r¬  ru  rÖ  r@   r@   rC   ru  ¿  s    zForeignKeyField.coercec                 C   s    t || jƒr| ¡ }| j |¡S r?   )rQ   r  Ú_get_pk_valuer¬  rØ  rÖ  r@   r@   rC   rØ  Â  s    zForeignKeyField.db_valuec                 C   s   t || jƒr|S | j |¡S r?   )rQ   r  r¬  rÙ  rÖ  r@   r@   rC   rÙ  Ç  s    zForeignKeyField.python_value)NNNNN)rE   rF   rG   r  r1  rD  rE  rF  rC  r  rÑ  rÕ  ru  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   rS  r@   r@   rC   r  Ñ  s    zCompositeKey.__init__c                 C   s   || _ || _t||| ƒ d S r?   )r…   r}   r+  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©   ©r  Ú
field_name©r#  r@   rC   r  Û  s   ÿz(CompositeKey.__get__.<locals>.<listcomp>)ÚtuplerS  r"  r@   rV  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}   rz   r  )r  r  r^   r  r@   rC   r  ã  s   ÿz'CompositeKey.__eq__.<locals>.<listcomp>)ÚziprS  rP   ÚoperatorÚand_)rA   ÚotherÚexpressionsr@   r  rC   rF  â  s    

ÿzCompositeKey.__eq__c                 C   s   t | jj| jfƒS r?   )rç  r}   rE   rS  r  r@   r@   rC   rè  ç  s    zCompositeKey.__hash__)N)rE   rF   rG   r  rÃ  r  r  r$  r¹  rF  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 )ÚAliasMaprk   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  r6  r@   r@   rC   ry   õ  s    
zAliasMap.addc                 C   s   || j kr|  |¡ | j | S r?   )r^  ry   ©rA   r  r@   r@   rC   Ú__getitem__û  s    

zAliasMap.__getitem__c                 C   s
   || j kS r?   ra  rd  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  r6  r@   r@   rC   ró     s
    zAliasMap.update)r   )N)
rE   rF   rG   rc  r  rb  ry   re  rf  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 )–ÚQueryCompilerr  ZBIGINTZBLOBZSMALLINTZDATEZDATETIMEZDECIMALZREALZCHARÚINTEGERZVARCHARÚTEXTZTIME)ré  rì  r  r0  r  ru   ró  rò  r  rñ  rë  rš  rî  r  r
  r  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   ro  rp  Ú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)rO  r�  r„  rû   r…  rl  r  ri  Úselect_queryÚcompound_select_queryrr   )Ú_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   ru  Q  s    õzQueryCompiler.get_parse_mapc                 C   s   d| j || j f S )Nz%s%s%s)ro  )rA   rZ   r@   r@   rC   Úquoteb  s    zQueryCompiler.quotec                 C   s   || j kr| j | S | ¡ S r?   )rr  Úupper)rA   Úfr@   r@   rC   rÓ  e  s    zQueryCompiler.get_column_typec                 C   s
   | j | S r?   )rt  )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   rS   l  rT   z.QueryCompiler._sorted_fields.<locals>.<lambda>©rˆ   )r‹   rg  )rA   Ú
field_dictr@   r@   rC   Ú_sorted_fieldsk  s    zQueryCompiler._sorted_fieldsc                 C   s   | j |gfS r?   )rp  ©rA   r&  rh  Ú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))
rQ   r  r   Ú
parse_noder@  rC  rE  rß   r€  r‹  )
rA   r&  rh  r‘  r  Zlparamsr@  ZrparamsÚtemplateri  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•  r^   rp  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•  r^   rp  r�  r@   r@   rC   r}  �  s    zQueryCompiler._parse_paramc                 C   s8   |j r
|pd }|  |j||¡\}}d|jt|ƒf |fS )NrÜ  )rt  Úparse_node_listrr  r…   rr   ©rA   r&  rh  r‘  ri  rj  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ˆ  rr   r˜  r@   r@   rC   r€  �  s       ÿzQueryCompiler._parse_clausec                 C   s   d  t| j|jƒ¡g fS rå  )rÝ  rÞ  r‡  rm  r�  r@   r@   rC   r�  —  s    zQueryCompiler._parse_entityc                 C   s   |j t|jƒfS r?   )r^   rŒ   rj  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&  rh  r‘  ri  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@  rQ  r  Úalias_map_classr_  Úgenerate_selectÚcalculate_alias_maprÏ  Úcompound_select_parenthesesrY  )rA   r&  rh  r‘  ZcsqZfirst_qZsecond_qrB  Únew_mapÚfirstZfirst_prŸ   Zsecond_pr•   ZlpÚrZrpri  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_selectionrQ   r    r¬  r}   rz   rš  Ú_selectrœ  rr   )rA   r&  rh  r‘  r÷   Zselect_fieldrË  rj  r@   r@   rC   r„  Å  s    
z!QueryCompiler._parse_select_queryc                 C   s    |   |j||¡\}}t|ƒ|fS r?   )r•  r&  rr   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 )NrQ  Frš  T)r©   rv  rw  r‚  rQ   rŒ   rW  rŠ   r—  r*   rp  r    r¬  rØ  r…   rR  r
   r;  r§  rÛ  r6  r•  Ú_parser’  )rA   r&  rh  r‘  Z	node_typerº  ri  rj  r¬  r^   rl  Ú_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Ø  r  ©r‘  r@   rC   r  þ  s     z,QueryCompiler.parse_node.<locals>.<listcomp>zNOT %sr†  ÚASc                 s   s   | ]}t |tƒV  qd S r?   )rQ   r%  )r  Úpr@   r@   rC   r"    s     z+QueryCompiler.parse_node.<locals>.<genexpr>)
r¤  rQ   r%  r(  r!  rÝ  r*  ÚanyÚ	enumerater•  )rA   r&  rh  r‘  ri  rj  rº  Zclean_paramsZ	clean_sqlÚidxr�  ZcsqlZcparamsr@   r¦  rC   r•  û  s"    

zQueryCompiler.parse_noderŒ  c           
      C   sF   g }g }|D ]*}|   |||¡\}}	| |¡ | |	¡ q| |¡|fS r?   )r•  r~   r0  rÝ  )
rA   r‰  rh  r‘  r‡  ri  rj  r&  Znode_sqlZ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_  ry   r}   rz   Útable_aliasÚ_joinsrg  rQ   r™  r%  r6  ró   )rA   r‘  rh  rŸ  r–  Zjoined_modelsZjoin_objr@   r@   rC   r�    s    z!QueryCompiler.calculate_alias_mapc                 C   s   |   t|Ž |¡S r?   )r•  r   )rA   Úclausesrh  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Š   r$  ry   r™  rQ   rª  r>  ro  r   r   r÷   r6  r°  r›  r˜  r€   r©   r…   r¬  rw   r%  r~   rÛ  r¦  Újoin_mapr7   )rA   Újoinsr}   rh  r®  r„   rŠ  ÚcurrrÝ  r˜  r™  Ú
constraintr°  Zfk_modelZpk_modelÚfkr  r@  Zdest_nr¥  Z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 )NZSELECTzSELECT DISTINCT)TFr°  rŒ  ÚFROMZWINDOWc                 S   s&   g | ]}t t|jƒtd ƒ| ¡ ƒ‘qS )r§  )r   r7   r!  ry  )r  rz  r@   r@   rC   r  }  s   üýz1QueryCompiler.generate_select.<locals>.<listcomp>ÚWHEREzGROUP BYZHAVINGr�  zLIMIT %sz	OFFSET %szFOR UPDATE NOWAITz
FOR UPDATE)r}   rz   rÏ  r�  rQ   ÚCompoundSelectr“  Ú	_distinctr7   r�  r   r£  r‡  r0  Ú_fromr~   rÛ  r6  r‹  Ú_windowsr¶  r­  Ú_whereÚ	_group_byÚ_havingÚ	_order_byÚ_limitÚ_offsetÚ	limit_maxÚ_for_updater¯  )rA   r‘  rh  r   Údbr®  Zselect_clauseZjoin_clausesÚlimitÚ
for_updateZno_waitZ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 %sZUPDATEZSET©r‚  F©rÚ  T)r€  r¸  rŒ  Ú	RETURNING)r}   r›  ry   rz   r†   Ú_on_conflictr7   rÛ  r�  Ú_updaterQ   r%  r*   r.   rØ  r~   r>  rE  rÙ   r‹  r½  r0  Ú
_returningr   r‡  r¯  )
rA   r‘  r   rh  Ú	statementr®  ró   r  r^   Ú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Û  ©r  r  r@   r@   rC   r  Á  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È  ZVALUESrÊ  )rÓ  rŒ  )&r}   rz   r›  ry   r†   Ú_upsertrÏ  Ú
upsert_sqlrË  r7   rÛ  Ú_queryÚ_fieldsr~   rÔ  r“  Ú_rowsÚ
_iter_rowsr‹   ÚkeysrY  Ú
attrgetterrQ   r%  r*   r.   rØ  r�  r0  r‹  Úauto_incrementÚdefault_insert_clauseÚis_insert_returningÚget_primary_key_fieldsrÍ  r   r‡  r¯  )rA   r‘  r   rI   rh  rÎ  r®  r  Zvalue_clausesZhave_fieldsÚrow_dictr|   r  r^   rÏ  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Œ  rÊ  )	r}   r7   rÛ  r½  r0  rÍ  r   r‡  r¯  )rA   r‘  r   r®  rÏ  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 KEYZ
REFERENCESzON DELETE %szON UPDATE %s)	r7   r�  rÛ  r  r¬  r?  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@   )rç  rü   r@   ræ  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)
rz   r†   rÀ  r  rå  r   r7   rÛ  r   r‰  )rA   r}   r  r´  Z	fk_clauser@   r@   rC   Ú_create_foreign_key'  s    ý
üûz!QueryCompiler._create_foreign_keyré  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Û  ©r  r‰  ©rI   r@   rC   r  ;  s   ÿz/QueryCompiler._create_table.<locals>.<listcomp>râ  )rz   Úcomposite_keyrš  rS  r~   r   r7   r�  Údeclared_fieldsrä  rQ   r    r>  rå  rÄ  r%  rÛ  )	rA   r}   ÚsaferÎ  ÚcolumnsrÄ  Zpk_colsr  r´  r@   rë  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ÚcascaderÎ  rã  r@   r@   rC   Ú_drop_tableP  s
    zQueryCompiler._drop_tablerõ  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_tabler÷  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’   ÚhashlibZmd5rX   Z	hexdigest)rA   Útablerï  r¼  Z
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À  rê  r@   r@   rC   r  l  s     z/QueryCompiler._create_index.<locals>.<listcomp>r°  c                 S   s   g | ]}|  ¡ ‘qS r@   rÑ  rÒ  r@   r@   rC   r  r  s     )rz   r†   rý  r   r7   r   rÛ  r�  )rA   r}   r  r½  rA  Útbl_namerÎ  rý  r@   r@   rC   Ú_create_indexi  s    ûúzQueryCompiler._create_indexr   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@   rþ  rê  r@   r@   rC   r  y  s     z-QueryCompiler._drop_index.<locals>.<listcomp>)rz   r†   rý  r   r7   r   )rA   r}   r  ró  rÿ  rÎ  rý  r@   r@   rC   Ú_drop_indexv  s    zQueryCompiler._drop_indexr  c                 C   s   t tdƒt|ƒƒS )NzCREATE SEQUENCE©r   r7   r   ©rA   Zsequence_namer@   r@   rC   Ú_create_sequence}  s    zQueryCompiler._create_sequencer  c                 C   s   t tdƒt|ƒƒS )NzDROP SEQUENCEr  r  r@   r@   rC   Ú_drop_sequence�  s    zQueryCompiler._drop_sequencer  )rm  rn  NN)NN)NrŒ  )N)N)N)N)F)FF)FF)F)YrE   rF   rG   rq  rE  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ç   rs  r&   rè   rê   rë   ré   r±  r]  r›  r  ru  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é  Úcreate_foreign_keyrð  Úcreate_tablerõ  Ú
drop_tabler÷  Útruncate_tablerý  r   Úcreate_indexr  Ú
drop_indexr  Úcreate_sequencer  Údrop_sequencer@   r@   r@   rC   ri    s  ð                         ç    ü  ÿ
	
	'

	

5
?>


  ÿ

ri  c                   @   s   e Zd Zddd„ZdS )ÚSqliteQueryCompilerFc                 C   s   |  ¡  ¡ S r?   )Údeleteri  )rA   r}   rö  rô  r@   r@   rC   r	  ‡  s    z"SqliteQueryCompiler.truncate_tableN)FF)rE   rF   rG   r	  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~   ÚStopIterationrd  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  rI   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   rp  ¼  s    zQueryResultWrapper.countc                 C   s   | j S r?   )rp  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   r2  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 )NZInfr   z"Negative values are not supported.)rñ  rw   r  r  r  r  r  ©rA   Únr@   r@   rC   r!  æ  s    zQueryResultWrapper.fill_cache)N)N)rE   rF   rG   r  r  r   r±  rp  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(  Zn_colsr‘  Z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   rz   rï  r‘  r~   r…   rÙ  )rA   r…   r”   Z
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)rQ   r   r‘  r~   r!  r…   rÙ  ro  r’   rr  rt  )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 )rL   Nr¦  )r  r”   Úcolr  r@   rC   r  	  s   ÿz8TuplesQueryResultWrapper.process_row.<locals>.<listcomp>)rW  rª  r#  r@   r  rC   r%  	  s    ÿz$TuplesQueryResultWrapper.process_rowN©rE   rF   rG   r%  r@   r@   r@   rC   r0  	  s   r0  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‘  r+  Ú_prepare_instance)rA   r$  r#  r”   Úcolumnr‰  r@   r@   rC   r%  !	  s
    &z#NaiveQueryResultWrapper.process_rowNr2  r@   r@   r@   rC   r3   	  s   r3  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$  rv  r”   r5  r‰  r@   r@   rC   r%  ,	  s    "z"DictQueryResultWrapper.process_rowNr2  r@   r@   r@   rC   r6  +	  s   r6  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?   )rQ   r   )r  r1  r@   r@   rC   r"  8	  s    
ÿz5ModelQueryResultWrapper.initialize.<locals>.<genexpr>)Úgenerate_column_mapÚ
column_maprŠ   r  Ú_col_setÚgenerate_join_listÚ	join_list)rA   r(  Z	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  rQ   r   r«  Ú_model_aliasÚfield_instancerÙ  r}   r!  r…   r)  r%  r   rm  r~   ry   )	rA   r9  rƒ   r”   r&  r¶   r‘  rˆ   Úconstructorr@   r@   rC   r8  <	  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   r$  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_joinsr4  )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ª  r9  r  r(  r+  )rA   r$  rÛ  Zcollected_modelsr”   rˆ   rA  r¶   r‘  r^   r#  r@   r@   rC   rG  |	  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©   r+  r›  r~   )rA   rI  Úpreparedr°  Z
check_nullrD  rE  r2  Újoined_instZhas_fkZmpkZcan_populate_joined_pkZcan_populate_joined_fkr@   r@   rC   rH  ‹	  sX    


ÿý
ýÿþüýz$ModelQueryResultWrapper.follow_joins)N)	rE   rF   rG   r  r8  r;  r%  rG  rH  r@   r@   r@   rC   r7  5	  s   
r7  Ú	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  rQ  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 )NrP  r@   )r  rQ  r  rŠ   Ú
all_modelsr9  ry   Zmodels_with_aggregateZback_referencesÚsource_to_destZdest_to_sourcer<  r›  r€   rB  r¶   rœ  r˜  r'  r™  rO  r6  Úcolumns_to_comparerª  r~   r¶  r0  )rA   r(  rˆ   r¥  r°  r³  r›  Zkey_to_columnsr«  r}   Úcol_namer¨  ÚsourcesZjoined_modelr  r@   rC   r  Ä	  sL    
þ

ÿz&AggregateQueryResultWrapper.initializec                 C   sD   i }| j  ¡ D ]0\}}g ||< |D ]\}}||  || ¡ q"q|S r?   )rU  rg  r~   )rA   r$  rƒ   r}   Zcolumn_datar«  rV  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µ  rT  rV  r@   rC   r  
  s   ÿzHAggregateQueryResultWrapper.iterate.<locals>._get_pk.<locals>.<listcomp>)rz   rì  rW  rš  rS  rR  rV  r@   rV  rC   Ú_get_pk
  s
    þz4AggregateQueryResultWrapper.iterate.<locals>._get_pkF) rR  r$  r  r&  r  r©   r'  r  r  r  r(  rG  r   rg  r   rX  rŠ   ry   r~   rS  rµ  r|   r  rT  r™  rL  r›  rœ  r+  r€   r…   r4  )rA   r$  rY  Zidentity_mapZ_constructedZprimary_instancer¨  r#  Z
model_dataZcur_rowZduplicate_modelsZcur_row_datar}   ÚdataZdifferent_modelsZnew_instancesZall_noner^   rB  rJ  rC  rÝ  r°  r¶   Úpkr2  rN  r@   r@   rC   r  
  s¦    










ÿÿýz#AggregateQueryResultWrapper.iterate)rE   rF   rG   r  r  rX  r  r  r@   r@   r  rC   rQ  ¿	  s   6rQ  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 rK  )
r  r\  r  r}   rz   rÏ  r·  Ú
_query_ctxr­  r½  ©rA   r}   r  r@   rC   r  v
  s    
zQuery.__init__c                 C   s   |   ¡ \}}d| j||f S )Nr“  )ri  r}   ©rA   ri  rj  r@   r@   rC   rb  �
  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Œ   )r  ZmcÚjr@   r@   rC   r"  ’
  s    z%Query._clone_joins.<locals>.<genexpr>)Údictr­  rg  r  r@   r@   rC   ra  ‘
  s    ÿzQuery._clone_joinsNc                 C   s,   t tj|ƒ}|d kr|S |p tj}|||ƒS r?   )rP   rY  rZ  )rA   Úinitialr\  ZconjunctionZ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?   )rQ   r%  r~   r\  r§  r0  Úget_proxy_fieldsr
   r;  r*   rz   rí  )rA   rø   Úaccumr/  r@   r@   rC   Ú_model_shorthandœ
  s    


zQuery._model_shorthandc                 G   s   |   | j|¡| _d S r?   )re  r½  ©rA   r\  r@   r@   rC   r6  ©
  s    zQuery.wherec                 G   s   |   | j|tj¡| _d S r?   )re  r½  rY  Úor_ri  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]  rQ   r   r
   rz   Ú
rel_existsrw   r  r  r­  r'  r~   rž  )rA   r™  r¥  rª  r˜  Z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™  rm  rÝ  )rA   ÚlmÚrmrª  Zjoin_kwargsZ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    r4  r‹   rg  r}   ÚrsplitÚ
DJANGO_MAPrE  rÙ   Úsplitr©   rQ   r  r~   r>  )rA   Zqdictrg  r²  Zrelationshiprˆ   r^   r³  rC  Ú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ö   )r  r5  r@   r@   rC   r  å
  s     z Query.filter.<locals>.<listcomp>r  r@  )r%  rP   rY  rZ  r   r   rŠ   ÚpopleftrQ   r>  r  r@  rw  r‘  ró   r(  r!  r+  r~   r÷   r    r}   r  r4  r  rp  r6  )rA   rø   rù   Zdq_noderŠ  Zdq_joinsr³  Zsideru  r‘  r²  rO  r  rn  ro  Ú	field_objr@   r@   rC   rn  á
  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   ri    s    z	Query.sqlc                 C   s   |   ¡ \}}| j ||| j¡S r?   )ri  rÏ  Úexecute_sqlÚrequire_commitr_  r@   r@   rC   Ú_execute  s    zQuery._executec                 C   s   t ‚d S r?   rz  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   Zas_tupleÚconvertr$  r@   r@   rC   Úscalar  s    zQuery.scalar)N)NN)N)N)FF)rE   rF   rG   r  r|  r  rb  r÷   r`  ra  re  rh  rþ   r6  rk  rÝ  rm  rp  rw  rn  rÒ  ri  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‘  rj  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Újoiningr6  rm  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   ri  ?  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   Z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Ý  r6  rm  rþ   r  r�  ri  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 )Nr0  Fz,"extend" is the only valid keyword argument.)r$  rw   )ZorigZnew_valrù   r0  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   rz  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_rowsr!  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»  rQ   r%  r~   r÷   r¾  r¿  rÀ  r¼  rÁ  rÂ  rº  rÄ  r–  r†  r‡  r—  r!  )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}   rz   rÏ  Úcompound_operationsrw   r¹  )rA   r[  Zsupported_ops©rY  r@   rC   rü   �  s    ÿz&SelectQuery.compound_op.<locals>.innerr@   )rY  rü   r@   rš  rC   Úcompound_opŽ  s    zSelectQuery.compound_opÚUNIONÚ	INTERSECTÚEXCEPTc                 C   s4   | j  tdƒ¡ t| |@ ƒ d¡¡ ¡ }| |B | S )Nr¼   r¥  )r}   r5  r7   Úfrom_r�  r6  rx  )rA   r@  Zwrapped_rhsr@   r@   rC   rY  ›  s    ÿzSelectQuery.__xor__c                 C   s   t  d¡| |ƒS )Nú	UNION ALL)r   Ú_compound_op_staticr?  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}   rz   rí  rh  r£  ©rA   r˜  r@   r@   rC   Z__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?   )rh  r¾  r  r@   r@   rC   Úgroup_by®  s    zSelectQuery.group_byc                 G   s   |   | j|¡| _d S r?   )re  r¿  ri  r@   r@   rC   Úhaving²  s    zSelectQuery.havingc                 O   s   t | jt|ƒf|Ž| _d S r?   )r“  rÀ  rŒ   r  r@   r@   rC   rx  ¶  s    zSelectQuery.order_byc                 O   s   t | jt|ƒf|Ž| _d S r?   )r“  r¼  rŒ   )rA   Zwindowsrù   r@   r@   rC   rz  º  s    zSelectQuery.windowc                 C   s
   || _ d S r?   )rÁ  )rA   Z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   ZpageZpaginate_byr@   r@   rC   ÚpaginateÆ  s    zSelectQuery.paginateTc                 C   s
   || _ d S r?   )rº  )rA   Zis_distinctr@   r@   rC   ÚdistinctÍ  s    zSelectQuery.distinctFc                 C   s   ||f| _ d S r?   )rÄ  )rA   rÇ  Znowaitr@   r@   rC   rÇ  Ñ  s    zSelectQuery.for_updatec                 C   s
   || _ d S r?   )r–  )rA   Únaiver@   r@   rC   r¬  Õ  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?   )r—  )rA   Úaggregate_rowsr@   r@   rC   r­  á  s    zSelectQuery.aggregate_rowsNc                 C   s
   || _ d S r?   r4  )rA   r6  r@   r@   rC   r6  å  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 )Nrp  c                 S   s   g | ]}|  ¡ ‘qS r@   )r6  )r  rt   r@   r@   rC   r  ò  s     z(SelectQuery.annotate.<locals>.<listcomp>)r   ÚCountrz   rš  r6  r]  rm  r}   r÷   rp  r¾  r£  rW  )rA   r  Z
annotationr‘  r@   r@   rC   Úannotateé  s    
zSelectQuery.annotatec                 C   s*   |d krt  tdƒ¡}|  ¡ }|g|_|S )Nr¼   )r   r®  r7   rx  r£  )rA   Úaggregationr‘  r@   r@   rC   Ú
_aggregateö  s
    zSelectQuery._aggregatec                 C   s   |   |¡j|d�S )N©r€  )r±  r�  )rA   r°  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_limitFr²  r   )rº  r¾  rÁ  rÂ  Úwrapped_countr³  ©rA   rµ  r@   r@   rC   rp     s    zSelectQuery.countc                 C   sJ   |   ¡ }|rd  |_|_| ¡ \}}d| }| jj|f|žŽ }| ¡ pHdS )Nz+SELECT COUNT(1) FROM (%s) AS wrapped_selectr   )rx  rÁ  rÂ  ri  r}   Úrawr�  )rA   rµ  r÷   ri  rj  ÚwrappedZrqr@   r@   rC   r¶    s    zSelectQuery.wrapped_countc                 C   s$   |   dd¡}tdƒg|_t| ¡ ƒS )Nr�   Ú1)rª  r7   r£  r0  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)rª  r  r~  r  r}   r   ri  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+  rv  rƒ   r@   r@   rC   Úpeek  s
    
zSelectQuery.peekc                 C   s"   | j |kr|| _ d| _| j|d�S )NT)r+  )rÁ  r·  r½  r*  r@   r@   rC   r   &  s    
zSelectQuery.firstc                 C   s   |   ¡  | ¡S r?   )rÒ  rœ  r  r@   r@   rC   ri  ,  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£  rQ   r   r%  r)  )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�  r–  r­  r¾  r‘  r—  Ú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}   r¿  rÂ  r}  )rA   r}   Z
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 r©  )r~  rQ   ÚsliceÚstopr!  r  )rA   r^   rv  r¼  r@   r@   rC   re  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__)r¨  )T)TF)T)T)T)T)N)N)N)NT)F)F)r�   )r�   )5rE   rF   rG   rQ  r  r`  r›  r  r¡  rT  rS  rV  rY  r¢  r•  rþ   r5  rŸ  r¤  r¥  rx  rz  rÆ  r§  rª  r«  rÇ  r¬  r  r�  r­  r6  r¯  r±  r³  rp  r¶  r»  r¶  r½  r   ri  r¾  r¿  rÂ  r~  r   r)  re  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   ri  l  s    zNoopSelectQuery.sqlc                 C   s   dS )NrŸ  r@   r  r@   r@   rC   r¿  o  s    zNoopSelectQuery.get_query_metac                 C   s   | j  t¡S r?   )rÏ  rŽ  r�  r  r@   r@   rC   rÂ  r  s    z#NoopSelectQuery._get_result_wrapperN)rE   rF   rG   ri  r¿  rÂ  r@   r@   r@   rC   rÉ  k  s   rÉ  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  rY  r@  r  r¹  r  )rA   r}   r  rY  r@  r  r@   rC   r  x  s    zCompoundSelect.__init__c                    s,   t t| ƒ |¡}| j|_| j|_| j|_|S r?   )r  r¹  r`  r  rY  r@  r’  r  r@   rC   r`  ~  s
    z CompoundSelect._clone_attributesFc                 C   s   | j |d�S )Nr´  )r¶  r·  r@   r@   rC   rp  …  s    zCompoundSelect.countc                 C   s
   | j  ¡ S r?   )r  r¿  r  r@   r@   rC   r¿  ˆ  s    zCompoundSelect.get_query_metac                 C   s   | j  ¡ o| j ¡ S r?   )r  r¾  r@  r  r@   r@   rC   r¾  ‹  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�  r—  rÀ  r  r­  r@  r–  r¾  r‘  rÁ  )rA   Z	has_joinsZis_naiver@   r@   rC   rÂ  Ž  s    z"CompoundSelect._get_result_wrapper)NNN)F)rE   rF   rG   rQ  r  r`  rp  r¿  r¾  rÂ  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'  )rÍ  r†  r‡  r…  r  rÌ  r  r^  r  r@   rC   r  ž  s
    z_WriteQuery.__init__c                    s6   t t| ƒ |¡}| jr2t| jƒ|_| j|_| j|_|S r?   )r  rÌ  r`  rÍ  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}   rz   rÏ  rÏ  rw   r   )rA   rø   rù   rÅ  ©r,  r@   rC   rü   ®  s    
ÿz-_WriteQuery.requires_returning.<locals>.innerr@   )r,  rü   r@   rÍ  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 r¼  )r’   rÍ  r}   rz   rí  rh  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?   )rÍ  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Ž  rÍ  r}   r}  r…  )rA   rÃ  rI   r@   r@   rC   Ú_execute_with_result_wrapperÒ  s    z(_WriteQuery._execute_with_result_wrapper)T)T)rE   rF   rG   r  r`  rÎ  rþ   rÏ  r  r�  rŽ  rÐ  r  r@   r@   r  rC   rÌ  �  s   	rÌ  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?   )rÌ  rË  r  rÑ  r  )rA   r}   ró   r  r@   rC   r  Ú  s    zUpdateQuery.__init__c                    s(   t t| ƒ |¡}t| jƒ|_| j|_|S r?   )r  rÑ  r`  rc  rÌ  rË  r’  r  r@   rC   r`  ß  s    zUpdateQuery._clone_attributesc                 C   s
   || _ d S r?   ©rË  ©rA   Úactionr@   r@   rC   Úon_conflictå  s    zUpdateQuery.on_conflictrˆ  c                 C   s   |   ¡  | ¡S r?   )rÒ  rÐ  r  r@   r@   rC   ri  ë  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?   ©rÍ  r…  rÐ  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}   rz   rÏ  rÏ  rw   r  r~  r  r@   r@   rC   r   ö  s    zUpdateQuery.__iter__c                 C   s   t |  ¡  ¡ ƒS r?   rÄ  r  r@   r@   rC   r)  ý  s    zUpdateQuery.iterator)N)N)rE   rF   rG   r  r`  rþ   rÕ  r  rÝ  ri  r~  r   r)  r  r@   r@   r  rC   rÑ  Ù  s   rÑ  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_fieldsrË  )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.)rL  )r  ©Úvalid_fieldsr@   rC   Úvalidate_field  s    z.InsertQuery._iter_rows.<locals>.validate_field)r}   rz   rÛ  rß  Ú_default_dictÚ_default_callablesrÙ  rò   rŠ   r  ry   )
rA   Z
model_metarà  ÚdefaultsZ	callablesrá  Z	field_rowr„   rˆ   r  r@   rÞ  rC   rÚ    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Û  rË  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?   rÒ  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   rß  J  s    zInsertQuery.is_insert_returningc                 C   s   |   ¡  | ¡S r?   )rÒ  râ  r  r@   r@   rC   ri  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   Zid_listZ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Ù  )r  r  r5  r@   r@   rC   r  w  s   ÿz'InsertQuery.execute.<locals>.<listcomp>r   T)rÙ  r×  rÍ  rÏ  Úinsert_manyrè  r…  rÐ  r}  rç  r&  r}   rz   rX  rà  rì  Úlast_insert_idrÚ  rÞ  rY  Ú
itemgetterÚfetchall)rA   Zinsert_with_loopr  Zpk_rowrI   Z
clean_datar@   r@   rC   r~  d  s8    ÿþü
ý
zInsertQuery.execute)NNNNF)T)N)T)rE   rF   rG   r  rÚ  r`  r  rÝ  r6  rþ   rä  rÕ  rå  r±  rß  ri  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Ò  rã  r  r@   r@   rC   ri  ‡  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Ý  ri  r~  r@   r@   r@   rC   rí  „  s   rí  ÚIndexMetadata)r…   ri  rï  r½  rü  ÚColumnMetadata)r…   Z	data_typer»  rš  rü  ÚForeignKeyMetadata)r5  Ú
dest_tableÚdest_columnrü  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__°  rT   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ø   r`   )rA   Úexc_typeÚ	exc_valueÚ	tracebackZnew_typeZ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 rK  )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 )�ÚDatabaseFrœ  r�  rž  r   Trn  Nrm  )	Z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õ   rx  ry  )	rA   rÏ  Z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'  r>  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
  r>  Ú	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
  r>  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?   rz  )rA   rÏ  rù   r@   r@   rC   r  2  s    zDatabase._connectc                 C   s   t | j|ƒ| _d S r?   )rõ   rx  )r.  r  r@   r@   rC   Úregister_fields5  s    zDatabase.register_fieldsc                 C   s   t | j|ƒ| _d S r?   )rõ   ry  )r.  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—   r3  rÁ  r7  r�  r™   r0  r�  r–   r6  rÀ  rQ  )rA   Zwrapper_typer@   r@   rC   rŽ  =  s&    
ÿ
ÿ
ÿ
ÿzDatabase.get_result_wrapperc                 C   s   |j jr|jS d S r?   )rz   rÝ  Z	lastrowid)rA   r  r   r@   r@   rC   rê  O  s    zDatabase.last_insert_idc                 C   s   |j S r?   )Zrowcount)rA   r  r@   r@   rC   r×  S  s    zDatabase.rows_affectedc                 C   s   |   | j| j| j| j¡S r?   )Úcompiler_classro  rp  rx  ry  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 rÊ  )
ÚloggerÚdebugr  r  r~  r  Úget_autocommitr  ÚrollbackÚcommit)rA   ri  rj  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  r$  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  r$  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   r2  �  s    zDatabase.savepointc                 C   s   t | ƒS r?   )Ú_atomicr  r@   r@   rC   Úatomic¢  s    zDatabase.atomicc                 C   s   t ‚d S r?   rz  ©rA   rÅ  r@   r@   rC   Ú
get_tables¥  s    zDatabase.get_tablesc                 C   s   t ‚d S r?   rz  ©rA   rü  rÅ  r@   r@   rC   Úget_indexes¨  s    zDatabase.get_indexesc                 C   s   t ‚d S r?   rz  r9  r@   r@   rC   Úget_columns«  s    zDatabase.get_columnsc                 C   s   t ‚d S r?   rz  r9  r@   r@   rC   Úget_primary_keys®  s    zDatabase.get_primary_keysc                 C   s   t ‚d S r?   rz  r9  r@   r@   rC   Úget_foreign_keys±  s    zDatabase.get_foreign_keysc                 C   s   t ‚d S r?   rz  )rA   Úseqr@   r@   rC   Úsequence_exists´  s    zDatabase.sequence_existsc                 C   s   |   ¡ }| j| ||¡Ž S r?   )rÒ  r{  r  )rA   r}   rî  Úqcr@   r@   rC   r  ·  s    zDatabase.create_tablec                 C   s   t ||d� d S )N)ró  )Úcreate_model_tables)rA   rƒ   rî  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@   ©rQ   r  rz   r  rê  ©r}   r@   rC   r  Ã  s   ÿz)Database.create_index.<locals>.<listcomp>)rÒ  rQ   rŒ   rW  rw   r{  r
  )rA   r}   r  r½  r@  Úfobjsr@   rD  rC   r
  ¾  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@   rC  rê  rD  r@   rC   r  Í  s   ÿz'Database.drop_index.<locals>.<listcomp>)rÒ  rQ   rŒ   rW  rw   r{  r  )rA   r}   r  rî  r@  rE  r@   rD  rC   r  È  s    ÿ
þzDatabase.drop_indexc                 C   s   |   ¡ }| j| |||¡Ž S r?   )rÒ  r{  r  )rA   r}   r  r´  r@  r@   r@   rC   r  Ò  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{  r  )rA   r}   ró  rô  r@  r@   r@   rC   r  Ü  s      ÿzDatabase.drop_tablec                 C   s   t |||d� d S )N)ró  rô  )Údrop_model_tables)rA   rƒ   rî  rô  r@   r@   rC   Údrop_tablesá  s    zDatabase.drop_tablesc                 C   s   |   ¡ }| j| |||¡Ž S r?   )rÒ  r{  r	  )rA   r}   rö  rô  r@  r@   r@   rC   r	  ä  s      ÿzDatabase.truncate_tablec                 C   s"   t t|ƒƒD ]}| ||¡ qd S r?   )r�   rq   r	  )rA   rƒ   rö  rô  r   r@   r@   rC   Útruncate_tablesê  s    zDatabase.truncate_tablesc                 C   s"   | j r|  ¡ }| j| |¡Ž S d S r?   )rF  rÒ  r{  r  rG  r@   r@   rC   r  î  s    zDatabase.drop_sequencec                 C   s   t  t|tdƒ|ƒ¡S ©Nr·  ©r   ZEXTRACTr   r4   ©rA   r  Z
date_fieldr@   r@   rC   r  ó  s    zDatabase.extract_datec                 C   s   t  ||¡S r?   )r   Z
DATE_TRUNCrM  r@   r@   rC   Útruncate_dateö  s    zDatabase.truncate_datec                 C   s   t dƒS )NzDEFAULT VALUESr�  r^  r@   r@   rC   rÞ  ù  s    zDatabase.default_insert_clausec                 C   s   dS )NzSELECT 0 WHERE 0r@   r  r@   r@   rC   rË  ü  s    zDatabase.get_noop_sqlc                 C   s   t S r?   )r  r  r@   r@   rC   r  ÿ  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”  ri  r  r™  rž  Údistinct_onÚdrop_cascaderx  Úforeign_keysrÇ  Úfor_update_nowaitré  rç  rp  rÃ  ry  ro  Úreserved_tablesrÏ  r1  rF  Ú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  rR  r  r  rŽ  rê  r×  rÒ  r~  r{  r!  r   r  r"  r  r%  r&  r'  r*  r+  r,  r-  r$  r0  r2  r6  r8  r:  r;  r<  r=  r?  r  rB  r
  r  r  r  r  rI  r	  rJ  r  r  rN  rÞ  rË  r  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   rj  rk  )r0  rî  r  F)rM   r   é   r   r>  ZGLOBrã   zINSERT OR REPLACE INTONc                    sF   |pg | _ | dd ¡}|r*| j  d|f¡ tt| ƒj|f|ž|Ž d S )NÚjournal_mode)Ú_pragmasr$  r~   r  r6   r  )rA   rÏ  Zpragmasrø   rù   rW  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 )Nr  rL   Z
date_truncrÍ   )Ú_set_pragmasZ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;)rX  r  r~  r'  )rA   r   r  Zpragmar^   r@   r@   rC   r\  ,  s
    zSqliteDatabase._set_pragmasÚDEFERREDc                 C   s   | j d| dd� d S )NzBEGIN %sF©r|  ©r{  )rA   Z	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   r  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;©rü  c                 S   s   g | ]}|d  ‘qS )r   r@   ©r  r$  r@   r@   rC   r  =  s     z-SqliteDatabase.get_tables.<locals>.<listcomp>©r{  rì  )rA   rÅ  r  r@   r@   rC   r8  :  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�   rL   zPRAGMA index_info("%s")c                 S   s   g | ]}|d  ‘qS )rL   r@   ra  r@   r@   rC   r  R  s     z.SqliteDatabase.get_indexes.<locals>.<listcomp>c                    s(   g | ] }t |ˆ| ˆ | |ˆkˆƒ‘qS r@   ©rî  ©r  r…   ©Zindex_columnsZindex_to_sqlrü  Zunique_indexesr@   rC   r  T  s   úû)r{  rc  rì  rŠ   rë  ry   r‹   )	rA   rü  rÅ  r‘  r  r$  r…   Ú	is_uniquerý  r@   re  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�   rL   rM   rí   )rï  r0  ra  r`  r@   rC   r  _  s   ÿz.SqliteDatabase.get_columns.<locals>.<listcomp>rb  ©rA   rü  rÅ  r  r@   r`  rC   r;  ]  s    
ÿzSqliteDatabase.get_columnsc                 C   s    |   d| ¡}dd„ | ¡ D ƒS )Nrg  c                 S   s   g | ]}|d  r|d ‘qS )r>  r�   r@   ra  r@   r@   rC   r  d  s      z3SqliteDatabase.get_primary_keys.<locals>.<listcomp>rb  rh  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 )rM   rL   rì   ©rð  ra  r`  r@   rC   r  h  s   ÿz3SqliteDatabase.get_foreign_keys.<locals>.<listcomp>rb  rh  r@   r`  rC   r=  f  s    
ÿzSqliteDatabase.get_foreign_keysc                 C   s
   t | |ƒS r?   )Úsavepoint_sqliter3  r@   r@   rC   r2  k  s    zSqliteDatabase.savepointc                 C   s   t  ||¡S r?   )r   r  rM  r@   r@   rC   r  n  s    zSqliteDatabase.extract_datec                 C   s   t  t| |¡S r?   )r   r®   r­   rM  r@   r@   rC   rN  q  s    zSqliteDatabase.truncate_datec                 C   s   t jS r?   )rY  ÚBinaryr  r@   r@   rC   r  t  s    zSqliteDatabase.get_binary_type)N)r]  )N)N)N)N)N)N)N) rE   rF   rG   r  r  rx  rQ  rY  Úsqlite_version_inforé  rÃ  rE  rã   rä   ry  rÖ  r  r  r[  r\  r!  r  r8  r:  r;  r<  r=  r2  r  rN  r  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/   TZBYTEAZBOOLEANÚ	TIMESTAMPÚNUMERICúDOUBLE PRECISIONZSERIALr  )r  r0  ru   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_extensionsZregister_typeÚUNICODEZUNICODEARRAYZ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)rz   rš  rÃ  rÝ  r†   rÀ  )rA   r   rI   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.r  zSELECT CURRVAL('%s"%s"')r   )rw  rz   rÅ  r~  r&  r  r   )rA   r  r   rÃ  rI   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@   )r  r¡  r@   r@   rC   r  ¹  s     z1PostgresqlDatabase.get_tables.<locals>.<listcomp>rb  )rA   rÅ  r‘  r@   r@   rC   r8  ¶  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�   rM   ú,rL   )rî  rt  ra  r`  r@   rC   r  Ë  s   ÿz2PostgresqlDatabase.get_indexes.<locals>.<listcomp>rb  ©rA   rü  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 ©ZYES©rï  ©r  r…   r»  r«   ©Úpksrü  r@   rC   r  Ö  s   ÿz2PostgresqlDatabase.get_columns.<locals>.<listcomp>©r{  rŠ   r<  rì  r{  r@   r  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@   ra  r@   r@   rC   r  æ  s     z7PostgresqlDatabase.get_primary_keys.<locals>.<listcomp>rb  r{  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�   rL   ri  ra  r`  r@   rC   r  ø  s   ÿz7PostgresqlDatabase.get_foreign_keys.<locals>.<listcomp>rb  ©rA   rü  rÅ  ri  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{  r0  r&  )rA   rÃ  rv  r@   r@   rC   r?  û  s    üz"PostgresqlDatabase.sequence_existsc                 G   s(   d  dgt|ƒ ¡}|  d| |¡ d S )Nrz  rp  zSET search_path TO %s)rÝ  r’   r{  )rA   Úsearch_pathZ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   rË    s    zPostgresqlDatabase.get_noop_sqlc                 C   s   t jS r?   )rs  rk  r  r@   r@   rC   r  
  s    z"PostgresqlDatabase.get_binary_type)N)ry  )ry  )ry  )ry  )ry  ) rE   rF   rG   r”  rž  rO  rP  rx  rÇ  rR  rç  rp  rE  ræ   ry  rS  rÏ  rF  rU  rt  r  rw  rê  r8  r:  r;  r<  r=  r?  r„  rË  r  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+   Trœ  r   ZBOOLrn  ro  ZFLOATzINTEGER AUTO_INCREMENTZLONGTEXTzVARCHAR(40))r0  ró  rò  rñ  rš  r
  r  rp  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)ÚcharsetZuse_unicodeZpasswordZpasswdrÅ  )Úmysqlr!   ró   r$  r  )rA   rÏ  rù   Zconn_kwargsr@   r@   rC   r  %  s    þ
zMySQLDatabase._connectNc                 C   s   dd„ |   d¡D ƒS )Nc                 S   s   g | ]
\}|‘qS r@   r@   ra  r@   r@   rC   r  2  s     z,MySQLDatabase.get_tables.<locals>.<listcomp>zSHOW TABLESr_  r7  r@   r@   rC   r8  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�   rL   rì   c                    s$   g | ]}t |d ˆ | |ˆkˆƒ‘qS r?   rc  rd  ©Úindexesrü  r½  r@   rC   r  =  s   ÿz-MySQLDatabase.get_indexes.<locals>.<listcomp>)r{  rŠ   rì  ry   r'  r~   )rA   rü  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 r|  r}  r~  r  r@   rC   r  G  s   ÿz-MySQLDatabase.get_columns.<locals>.<listcomp>r�  r‚  r@   r  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 )rL   ZPRIMARYrì   r@   ra  r@   r@   rC   r  L  s      z2MySQLDatabase.get_primary_keys.<locals>.<listcomp>rb  rh  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@   ri  )r  r5  rñ  rò  r`  r@   rC   r  W  s   ÿz2MySQLDatabase.get_foreign_keys.<locals>.<listcomp>rb  r{  r@   r`  rC   r=  N  s
    
þzMySQLDatabase.get_foreign_keysc                 C   s   t  tt|ƒtdƒ|ƒ¡S rK  rL  rM  r@   r@   rC   r  [  s    zMySQLDatabase.extract_datec                 C   s   t  |t| ¡S r?   )r   ZDATE_FORMATÚMYSQL_DATE_TRUNC_MAPPINGrM  r@   r@   rC   rN  ^  s    zMySQLDatabase.truncate_datec                 C   s   t t|jjƒtdƒƒS )NzVALUES (DEFAULT))r   r�  rz   rš  r7   r^  r@   r@   rC   rÞ  a  s    
þz#MySQLDatabase.default_insert_clausec                 C   s   dS )NzDO 0r@   r  r@   r@   rC   rË  f  s    zMySQLDatabase.get_noop_sqlc                 C   s   t jS r?   )rˆ  rk  r  r@   r@   rC   r  i  s    zMySQLDatabase.get_binary_type)N)N)N)N)N)rE   rF   rG   r”  r™  rx  rÇ  rp  rÃ  rE  rã   rä   r×   ry  ro  rT  rÖ  r  r8  r:  r;  r<  r=  r  rN  rÞ  rË  r  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@   rŽ  rC   Ú__call__n  s    z"_callable_context_manager.__call__N)rE   rF   rG   r�  r@   r@   r@   rC   r�  m  s   r�  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(  r�  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~   rz   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ƒ   r•  rz   rÏ  )rA   rù  r’  r“  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 )r5  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$  Ú_helperr2  r÷  r  r@   r@   rC   r÷  ©  s    z_atomic.__enter__c                 C   s   | j  |||¡S r?   )r™  rü  r‘  r@   r@   rC   rü  °  s    z_atomic.__exit__Nr”  r@   r@   r@   rC   r5  ¥  s   r5  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?   r—  r˜  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   rš  ©rA   r!  r@   r@   rC   r   º  s    
ztransaction.commitc                 C   s   | j  ¡  |r|  ¡  d S r?   )rÅ  r  rš  r›  r@   r@   rC   r  ¿  s    
ztransaction.rollbackc                 C   s>   | j  ¡ | _| j  d¡ | j  ¡ dkr.|  ¡  | j  | ¡ | S )NFr   )rÅ  r  r•  r"  r-  rš  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"  r•  r,  r  r-  r   r‘  r@   r@   rC   rü  Ì  s    
ztransaction.__exit__N)T)T)	rE   rF   rG   r  rš  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 )r2  Nc                 C   s4   || _ | ¡ }|pdt ¡ j | _| | j¡| _d S )NrZ   )rÅ  rÒ  r  Zuuid4r  r4  r‡  Ú
quoted_sid)rA   rÅ  r4  Z	_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}  r�  r  r@   r@   rC   r   ä  s    zsavepoint.commitc                 C   s   |   d| j ¡ d S )NzROLLBACK TO SAVEPOINT %s;rž  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}  r�  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"  rŸ  r  r   r‘  r@   r@   rC   rü  ð  s    
zsavepoint.__exit__)N)	rE   rF   rG   r  r}  r   r  r÷  rü  r@   r@   r@   rC   r2  Ú  s   
r2  c                       s(   e Zd Z‡ fdd„Z‡ fdd„Z‡  ZS )rj  c                    s8   | j  ¡ }|jd k	r$|j| _d |_nd | _tt| ƒ ¡ S r?   )rÅ  r  rZ  Ú_orig_isolation_levelr  rj  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?   )r   rÅ  r  rZ  r  rj  rü  r‘  r  r@   rC   rü  
  s    
  ÿ
zsavepoint_sqlite.__exit__)rE   rF   rG   r÷  rü  r  r@   r@   r  rC   rj  ý  s   rj  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   r6  r@  r@   r@   rC   r    s    
zFieldProxy.__init__c                 C   s   t | j| jƒS r?   )r«  r?  r@  r  r@   r@   rC   r1    s    zFieldProxy.clone_basec                 C   s   | j  |¡S r?   )r@  ru  rÖ  r@   r@   rC   ru    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  r1  ru  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 r¡  )rP  r^  r@   r@   rC   r  *  s    zModelAlias.__init__c                 C   s$   t | j|ƒ}t|tƒr t| |ƒS |S r?   )r©   r}   rQ   r   r«  )rA   r¶   rv  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«  rê  r  r@   rC   r  9  s     z/ModelAlias.get_proxy_fields.<locals>.<listcomp>)r}   rz   rí  Úsorted_fields)rA   rí  Zmmr  r@   r  rC   rf  6  s    zModelAlias.get_proxy_fieldsc                 G   s4   |s|   ¡ }t| f|žŽ }| jjr0|j| jjŽ }|S r?   )rf  r   rz   rx  )rA   r˜  r‘  r@   r@   rC   r5  ;  s    zModelAlias.selectc                 K   s   | j f |ŽS r?   rD  rê  r@   r@   rC   r�  C  s    zModelAlias.__call__N)F)	rE   rF   rG   r  r·   r  rf  r5  r�  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   re  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”   rb  r@   r@   rC   rf  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  re  r   rf  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  rï  rã  Ú_default_by_namerá  râ  Ú_default_callable_listr˜   Ú_sorted_field_listr¢  Úsorted_field_namesrŠ   rß  rí  Údefault_databaserÏ  r†   Údb_table_funcrŒ   r‹  rx  rš  r¬  rÄ  rÅ  rO  Úonly_save_dirtyrÝ  rì  rQ  r{   rg  r+  rÛ  Ú_additional_keys)rA   r.  rÏ  r†   r°  r‹  rx  rš  r¬  rÄ  rÅ  rO  r±  rù   rˆ   r^   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   rb  ›  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 )Nr:  r»   r  )rx  rQ   r   r*  r…   r  ÚlstriprM  r~   r;  r9  )rA   Znorm_order_byr¦  rc  r  r@   r@   rC   rM  ž  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…   rê  r@   r@   rC   r  ®  s     z4ModelOptions._update_field_lists.<locals>.<listcomp>c                 S   s   g | ]}t |tƒs|‘qS r@   )rQ   rï  rÒ  r@   r@   rC   r  ²  s    
ÿ)rŒ   r­  r¢  r®  rŠ   r  rÛ  r|   rš  rß  rí  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  rï  rÀ  r­  r¨  rµ  rÁ  rã  rG  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  r$  rï  rÀ  r­  r©  rµ  rÁ  rã  râ  rª  r¬  rá  r«  r…   )rA   rU  Zoriginalr”   r…   r¥  r@   r@   rC   r¶  Æ  s    


zModelOptions.remove_fieldc                 C   s(   | j  ¡ }| jD ]\}}|ƒ ||< q|S r?   )r«  rò   r¬  )rA   ZddrU  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¼  rw   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  rT  r  r@   rC   r  ç  s   ÿz7ModelOptions.get_primary_key_fields.<locals>.<listcomp>)rì  rš  rS  r  r@   r  rC   rà  å  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?   )	rQ   r   r%  r¢  r    r  r…   r!  r~   )	rA   r   ry  ÚmultiZis_fieldZis_noderg  r  Zis_matchr@   r@   rC   r¡  ì  s"    

ÿýzModelOptions.rel_for_modelc                 C   s   |j  | j||¡S r?   )rz   r¡  r}   )rA   r   ry  r¹  r@   r@   rC   r¢  þ  s    z"ModelOptions.reverse_rel_for_modelc                 C   s   |   |¡p|  |¡S r?   )r¡  r¢  r–  r@   r@   rC   rl    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}   r$  r~   rz   rQ  r|   r  r{   )rA   Úbackrefsrƒ   rB  r   rµ  r@   r@   rC   Úrelated_models  s    
zModelOptions.related_models)NNNNNNNNNTF)NF)NF)F)rE   rF   rG   r  rb  rM  rµ  rÍ  r¶  r·  r¸  rà  r¡  r¢  rl  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‹  rx  rš  rÅ  rO  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   ZMetar¥  rš  rz   Zmodel_options_basez[^\w]+zprimary key is overdetermined.FT)rš  rÇ  Z_composite_keyÚ__unicode__rb  c                    s   dˆ j |  ¡ f S )Nz<%s: %r>)rE   r½  r  ©r.  r@   rC   rS   i  s    ÿz#BaseModel.__new__.<locals>.<lambda>z%sDoesNotExistrF   Úvalidate_model)/rH   rE   r  r¼  Ú__new__r$  rP  rg  rM  r©   r¯  r   rš  Úinheritabler²  rQ   r²  r  r¶  rª  rz   rµ  rŒ   r‹  r†   r°   rË  r  r   rw   r~   r…   r1   r   r  r0  rÃ  rÝ  rì  r+  rF   r   r   rM  r¿  r   r  )r.  r…   ÚbasesZattrsZmeta_optionsrI   r§  ÚvZmodel_pkZ	parent_pkÚbÚ	base_metaZall_inheritableZModelOptionsBaser  r¶   Zpk_namerì  r  Zexc_nameZ	exc_attrsZexception_classr  r¾  rC   rÀ    sŠ    










þ



zBaseModel.__new__c                 C   s   t |  ¡ ƒS r?   )r  r5  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?   )rz   r·  rµ  rŠ   r·  r2  rg  r+  )rA   rø   rù   r§  rÃ  r@   r@   rC   r  }  s
    zModel.__init__c                 C   s   t | ƒS r?   )r§  r¾  r@   r@   rC   r6  …  s    zModel.aliasc                 G   s(   t | f|žŽ }| jjr$|j| jjŽ }|S r?   )r   rz   rx  )r.  r˜  r‘  r@   r@   rC   r5  ‰  s    zModel.selectNc                    s,   |pi }|  ‡ ‡fdd„ˆD ƒ¡ tˆ |ƒS )Nc                    s    g | ]}ˆ j j| ˆ| f‘qS r@   ©rz   r  rê  ©r.  ró   r@   rC   r  “  s     z Model.update.<locals>.<listcomp>)ró   rÑ  )r.  Ú_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Æ  rê  ©r.  r¨  r@   rC   r  ™  s     z Model.insert.<locals>.<listcomp>)ró   rØ  )r.  rÈ  r¨  rÉ  r@   rÊ  rC   r¨  –  s    zModel.insertTc                 C   s   t | ||d�S )N)rÜ  rÝ  ©rØ  )r.  rÜ  rÝ  r@   r@   rC   ré  œ  s    zModel.insert_manyc                 C   s   t | ||d�S )N)r  r‘  rË  )r.  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‚  )r.  ri  rj  r@   r@   rC   r¸  ¨  s    z	Model.rawc                 K   s"   | f |Ž}|j dd� | ¡  |S )NT)Úforce_insert)Úsaver4  )r.  r‘  r2  r@   r@   rC   Úcreate¬  s    
zModel.createc                 O   s2   |   ¡  ¡ }|r|j|Ž }|r*|jf |Ž}| ¡ S r?   )r5  r¬  r6  rn  r¶  )r.  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ã  rq  Fc                 s   s"   | ]\}}d |kr||fV  qdS )rq  Nr@   )r  r§  rÃ  r@   r@   rC   r"  Ê  s    ÿz&Model.get_or_create.<locals>.<genexpr>T)r$  r5  rg  rn  r6  r©   r¶  r   rc  ró   rz   rÏ  r6  rÏ  r#   )r.  rù   rã  r‘  r  r^   rj  Ú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æ  )rz   rÏ  r6  rÏ  r#   rg  r©   r½  rš  r~   r¶  )r.  rù   r‘  rU  r^   r  r@   r@   rC   Úcreate_or_getÕ  s    (
zModel.create_or_getc                 O   s   |   ¡ j||ŽS r?   )r5  rn  )r.  Zdqr‘  r@   r@   rC   rn  â  s    zModel.filterc                 C   s0   i }| j jr| j j|d< | j j| j jjf |ŽkS )NrÅ  )rz   rÅ  r†   rÏ  r8  )r.  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Ô  rz   rÏ  rš  rF  rÃ  r?  r  r  Ú_create_indexes)r.  ró  rÅ  r[  r@   r@   rC   r  í  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?   )	rz   r¢  rš  r©  r¼  r½  rQ   r    r~   )r.  r  r  Z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½  rÒ  r@   r@   rC   r    s     z%Model._index_data.<locals>.<listcomp>r@   )Ú	itertoolsÚchainrÖ  rz   r‹  r¾  r@   r@   rC   Ú_index_data	  s    
þzModel._index_datac                 C   s(   |   ¡ D ]\}}| jj | ||¡ qd S r?   )rÙ  rz   rÏ  r
  )r.  Ú
field_listrf  r@   r@   rC   rÕ    s    zModel._create_indexesc                 C   s(   |   ¡ D ]\}}| jj | ||¡ qd S r?   )rÙ  rz   rÏ  r  )r.  rî  rÚ  rf  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Æ  rê  r¾  r@   rC   r  %  s     z Model.sqlall.<locals>.<listcomp>c                 S   s   g | ]\}}|‘qS r@   r@   )r  ri  r¥  r@   r@   rC   r  '  s     )rz   rÏ  rÒ  rš  rF  rÃ  r~   r  r  rÖ  r
  r½  r‹  )r.  ZqueriesrÒ  r[  r  rS  r½  r  r@   r¾  rC   Úsqlall  s    zModel.sqlallc                 C   s   | j j | ||¡ d S r?   )rz   rÏ  r  )r.  ró  rô  r@   r@   rC   r  )  s    zModel.drop_tablec                 C   s   | j j | ||¡ d S r?   )rz   rÏ  r	  )r.  rö  rô  r@   r@   rC   r	  -  s    zModel.truncate_tablec                 C   s&   | j jrt| j j| j jƒS t| j jƒS r?   )rz   rÅ  r   r†   r¾  r@   r@   rC   rÛ  1  s    zModel.as_entityc                 O   s   t | f|ž|ŽS r?   )rÉ  )r.  rø   rù   r@   r@   rC   Únoop7  s    z
Model.noopc                 C   s   t | | jjjƒS r?   )r©   rz   rš  r…   r  r@   r@   rC   rR  ;  s    zModel._get_pk_valuec                 C   s   | j jst| | j jj|ƒ d S r?   )rz   rì  r+  rš  r…   rÖ  r@   r@   rC   Ú_set_pk_value?  s    zModel._set_pk_valuec                 C   s   | j j|  ¡ kS r?   )rz   rš  rR  r  r@   r@   rC   Ú_pk_exprD  s    zModel._pk_exprc                 C   s   | j  ¡  |  ¡  d S r?   )r·  ÚclearrM  r  r@   r@   rC   r4  G  s    
zModel._prepare_instancec                 C   s   d S r?   r@   r  r@   r@   rC   rM  K  s    zModel.preparedc                 C   s,   i }|D ]}|j |kr||j  ||j < q|S r?   r´  )rA   rŽ  ÚonlyZ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?   )rz   rQ  r·  r2  r¶  r+  r©   rµ  )rA   rŽ  rˆ   Z
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 rœ  )rc  rµ  rz   rš  rR  râ  r±  Údirty_fieldsr·  rà  rã  rì  rS  r$  r…   ró   r6  rß  r~  r¨  rÞ  )	rA   rÍ  rá  rŽ  Zpk_fieldZpk_valueZpk_part_namerÜ  Zpk_from_cursorr@   r@   rC   rÎ  `  s@    

þ





z
Model.savec                 C   s
   t | jƒS r?   )r0  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·  rê  r  r@   rC   r  Š  s      z&Model.dirty_fields.<locals>.<listcomp>)rz   r¢  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   r5  r6  rß  rŠ   r$  ry   rz   r{   rg  r}   r  rµ  r¬  r…   r»  r~   )rA   Zsearch_nullabler}   r‘  rB  r„   ÚklassZ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…   r6  r~  r  rß  )rA   Ú	recursiveZdelete_nullablerè  r‘  rµ  r   r@   r@   rC   Údelete_instance£  s    

zModel.delete_instancec                 C   s   t | j|  ¡ fƒS r?   )rç  r  rR  r  r@   r@   rC   rè  ®  s    zModel.__hash__c                 C   s(   |j | j ko&|  ¡ d k	o&| ¡ |  ¡ kS r?   )r  rR  ©rA   r[  r@   r@   rC   rF  ±  s
    
ÿýzModel.__eq__c                 C   s
   | |k S r?   r@   rë  r@   r@   rC   rG  ·  s    zModel.__ne__)N)N)T)F)F)FF)FF)FN)F)FF)/rE   rF   rG   r  rR  r6  r5  ró   r¨  ré  rÌ  r  r¸  rÏ  r¶  rÒ  rÓ  rn  rÔ  r  rÖ  rÙ  rÕ  rÛ  rÜ  r  r	  rÛ  rÝ  rR  Zget_idrÞ  Zset_idrß  r4  rM  râ  rã  rÎ  rå  r±  rä  rè  rê  rè  rF  rG  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…   ©r  rµ  )Úsubquery_modelr@   rC   r  Ð  s     z)prefetch_add_subquery.<locals>.<listcomp>c                    s   g | ]}t ˆ |jjƒ‘qS r@   )r©   r¬  r…   rí  )Ú
last_modelr@   rC   r  Ñ  s     z	 using %sr  z1Error: unable to find foreign key for query: %s%sc                    s   g | ]\}}|ˆ   |¡> ‘qS r@   )r5  )r  rµ  r[  ©Úcleanedr@   rC   r  â  s   ÿFc                    s   g | ]}|j ˆ  |¡> ‘qS r@   )r¬  r5  )r  rI  rð  r@   rC   r  é  s   ÿ)ÚPrefetchResultrª  rQ   rW  r\  r;  r*   r5  r}   r�   r“   r‘  r   rz   r¡  r
  rì  rP   rY  rj  rX  r6  r~   )rÐ  Ú
subqueriesÚfixed_queriesr”   rç  Ztarget_modelZfksrº  rb  Úprefetch_resultZ
last_queryZrelsr€  Ztgt_errÚexprr@   )rñ  rï  rî  rC   Úprefetch_add_subquery¿  sZ    


þÿÿþ
þ
r÷  Ú__prefetched)r‘  r  rI  Ú
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@   rD  rÒ  r@   r@   rC   r  ù  s     z*PrefetchResult.__new__.<locals>.<listcomp>c                 S   s   g | ]}|j j‘qS r@   )r¬  r…   rÒ  r@   r@   rC   r  ú  s     c                 S   s   g | ]
}|j ‘qS r@   rH  rÒ  r@   r@   rC   r  ü  s     c                 S   s   g | ]
}|j ‘qS r@   r´  rÒ  r@   r@   rC   r  ý  s     )rŒ   rX  r}   r  rò  rÀ  )r.  r‘  r  rI  rù  rú  r   Z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)	rI  r  rµ  r…   r+  rú  r¬  r¶  rB  )
rA   r#  Úid_mapr  Z
identifierrˆ   ÚattnameZrel_instancesr™  r2  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µ  rI  r'  r~   )rA   r#  rû  r  rü  Z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ù  r'  r~   r0  r¶  r‘  rþ  rý  )rÐ  ró  rô  ZdepsZrel_maprõ  Zquery_modelr  rû  Zhas_relationsr#  rQ  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)rq   r  )rƒ   Zcreate_table_kwargsr‡   r@   r@   rC   rA  ;  s    rA  c                 K   s"   t t| ƒƒD ]}|jf |Ž qdS )z6Drop tables for all given models (in the right order).N)r�   rq   r  )rƒ   Zdrop_table_kwargsr‡   r@   r@   rC   rH  @  s    rH  )N)N)rü  )òr*  ru   ró  rû  r×  ZloggingrY  r°   rb   r  r  r  r9  Zbisectr   r   Úcollectionsr   r   r   ÚImportErrorrc  rò   r   Ú	functoolsr	   Úinspectr
   Ú__version__Ú__all__r>   ZHandlerZ	getLoggerr  Z
addHandlerrH   ÚobjectrK   Úversion_infoZPY2rÈ  rø  ÚbuiltinsrO   rP   rG  rß  rý  rW   rþ  r  r©   re   r  rë  r-  r`   ZunicodeÚbufferÚexecÚRuntimeErrorri   rl   Z	pysqlite2rm   Zpysq3rY  rl  Zpsycopg2cffirn   Úregisterrs  ro   ru  ZMySQLdbrˆ  ZpymysqlZplayhouse._speedupsrp   rq   rr   r–   r—   r˜   r™   Zregister_adapterrù  r  ZDATETIME_PARTSrŠ   r¦   r¨   r¬   r­   rŒ  r¯   r³   r´   rE  r&   rè   r(   rê   r)   ré   r'   r‘  rÁ  r�  r�  rÀ  rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rá   rã   rä   ræ   rs  rõ   rþ   r  r3   r   r  r%  r7   r4   r   ro  r   r>  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<   r  r  r   r   r9   r:   r   r1  r4  r7  r    r   r]  ri  r  r  r  r,  r0  r3  r6  r7  rO  rQ  r\  r‚  r“  r   rÉ  r¹  rÌ  rÑ  rØ  rí  rî  rï  rð  r  ró  r!   r   r   r#   r$   r%   r,   r-   r2   rõ  rý  Úlocalr  r  r6   r/   r+   r�  r)  r;   r5  r$  r2  rj  r«  r§  r   r¯  rª  r   r¼  r*   rì  r÷  rø  rò  r0   rA  rH  r@   r@   r@   rC   Ú<module>   sþ  
Í8






	"ÿÿúçüõ
 %	
M{&	9"        R'


  4 /0	  
(<' þþþ	  <u `'#
! &h  @2+
