
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    SW                 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)rdTZ=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reAjCeBjCkreAZBzd dXlDmEZE eEF  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reBUejVe. eBUejWe. eBUe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dddddddddddddddddddddddddZbeadddddZcecjdZeecjfZgecjhZidZjdEZkdFZldZmdZnebjoebjpebjqebjrebjsebjtebjuebjvebjwebjxebjydZzdd Z{dd Z|dd Z}G dd3 d3e$Z~G dd de$ZG dd de$ZG dd de$ZG dd7 d7eZeZG dd deZG dd deZedZG dd deZG dd. d.eZG dd deZG dd deZG dd deZG dd deZG dd= d=eZdd ZG dd deZG dd deZeddÃZG ddń deddǃZG ddɄ de$ZG dd deZG dd deZG dd" d"eZG dd deZG dd5 d5eZG dd1 d1eZG ddф deZG dd deZG dd deZG dd deZd_ddׄZG dd deZG dd deZG dd8 d8eZG dd deZG dd< d<eZddބ ZG dd deZG dd deZG dd deZG dd9 d9eZG dd: d:eZG dd deZG dd deZG dd de$ZG dd de$ZG dd  d eZG dd de$ZG dd de$ZG dd de$ZG dd deZG dd de$ZG dd de$ZG dd deZG dd deZeTdk	r*eZTG dd deZeRdk	rHeZRG dd deZeQdk	rfeZQG d d deZeddZG dd deZG dd deZG dd	 d	eZd
d ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZeddZeddZeddZG d d! d!eɃZG d"d! d!eʃZG d#d deʃZG d$d dẽZG d%d# d#ẽZG d&d$ d$eʃZG d'd% d%ẽZG d(d, d,ẽZG d)d- d-ẽZG d*d2 d2ẽZG d+d, d,e$ZG d-d. d.e$ZG d/d0 d0ee	jփZG d1d2 d2e$ZG d3d6 d6e؃ZG d4d/ d/e؃ZG d5d+ d+e؃ZG d6d7 d7e$ZG d8d9 d9e܃ZG d:d; d;e݃ZG d;d< d<e܃ZG d=d> d>e܃ZG d?d@ d@e܃ZG dAdB dBeZG dCdD dDeZG dEdF dFe$ZeSdkrG dGdH dHe$ZSG dId deɃZeBreِdJZndZG dKdL dLe$ZG dMdN dNeZG dOd* d*e%eZdPdQ ZdRdS ZedTdUZG dVdW dWeZdXd0 ZdYdZ Zd[d\ ZdS (`      N)bisect_left)bisect_right)deque)
namedtuple)OrderedDict)deepcopywraps)isclassz2.8.4	BareFieldBigIntegerField	BlobFieldBooleanField	CharFieldCheckClauseCompositeKeyDatabaseError	DataError	DateFieldDateTimeFieldDecimalFieldDeferredRelationDoesNotExistDoubleFieldDQFieldFixedCharField
FloatFieldfnForeignKeyFieldImproperlyConfiguredIntegerFieldIntegrityErrorInterfaceErrorInternalErrorJOIN	JOIN_FULL
JOIN_INNERJOIN_LEFT_OUTERModelMySQLDatabaseNotSupportedErrorOperationalErrorParamPostgresqlDatabaseprefetchPrimaryKeyFieldProgrammingErrorProxyRSmallIntegerFieldSqliteDatabaseSQL	TextField	TimeFieldTimestampFieldUsing	UUIDFieldWindow)NullHandlerc                   @   s   e Zd Zdd ZdS )r>   c                 C   s   d S N )selfrecordr@   r@   9/opt/alt/python38/lib64/python3.8/site-packages/peewee.pyemiti   s    zNullHandler.emitN)__name__
__module____qualname__rD   r@   r@   r@   rC   r>   h   s   r>   peewee_metaclass_helper_c                 C   s   | t |fi S r?   )_METACLASS_)metabaser@   r@   rC   with_metaclasss   s    rM         )rN      )Callable)reducec                 C   s
   t | tS r?   )
isinstancerQ   )cr@   r@   rC   <lambda>}       rU   printc                 C   s   t | dS Nraw_unicode_escape)bytesencodesr@   r@   rC   rU      rV   c                 C   s   |j |k	r|||d S r?   )__traceback__with_traceback)tpvaluetbr@   r@   rC   reraise   s    

rc   c                 C   s   t j|  t jd d S )N
)sysstdoutwriter\   r@   r@   rC   print_   s    rh   z4def reraise(tp, value, tb=None): raise tp, value, tbzUnsupported python version.@B c                 C   s&   | j d | j| jd d  t  t S )Ng           i  )microsecondssecondsdays_Mtr@   r@   rC   rU      rV   c                 C   s   |   S r?   )total_secondsro   r@   r@   rC   rU      rV   )dbapi2)compat)
extensions)format_date_time)sort_models_topologically)strip_parensc              	   C   sH   |p
dd }|D ]2}z|t j | |W   S  tk
r@   Y qX q| S )Nc                 S   s   | S r?   r@   xr@   r@   rC   rU      rV   z"format_date_time.<locals>.<lambda>)datetimestrptime
ValueError)ra   formatspost_processfmtr@   r@   rC   ru      s    ru   c                    sT   t t  g  fdd dd }t|ddD ]} | q:ttS )z@Sort models topologically so that parents will precede children.c                    sD   | kr@| kr@ |  | jj D ]} |j q&|  d S r?   )add_metareverse_relvaluesmodel_classappend)modelforeign_keydfsmodelsorderingseenr@   rC   r      s
    
z&sort_models_topologically.<locals>.dfsc                 S   s   | j j| j jfS r?   )r   namedb_table)mr@   r@   rC   rU      rV   z+sort_models_topologically.<locals>.<lambda>T)keyreverse)setsortedlistreversed)r   namesr   r@   r   rC   rv      s    
rv   c                 C   s   | r| d dkr| S d }}t | }||k rf| | dkrf| |d  dkrf|d7 }|d7 }|d8 }q$qfq$|rd}d}t||| D ]N}| | dkr|d7 }n| | dkr|d8 }|dk r|d7 }d}||kr qq||8 }|dkr| ||  S | S )Nr   (   ))lenrange)r]   ctilunbalanced_ctrequiredr@   r@   rC   rw      s6    

rw   )_DictQueryResultWrapper)_ModelQueryResultWrapper)_SortedFieldList)_TuplesQueryResultWrapperyearmonthdayhourminutesecond)%Y-%m-%d %H:%M:%S%Y-%m-%d %H:%M:%S.%f%Y-%m-%d%H:%M:%S%H:%M:%S.%f%H:%Mc                 C   s(   | t kst|sd S t|t}t|| S r?   )DATETIME_LOOKUPSAssertionErrorru   SQLITE_DATETIME_FORMATSgetattrlookup_typedatetime_stringdtr@   r@   rC   _sqlite_date_part  s
    
r   z%Yz%Y-%mr   z%Y-%m-%d %Hz%Y-%m-%d %H:%Mr   )r   r   r   r   r   r   z%Y-%m-%d %H:%iz%Y-%m-%d %H:%i:%Sc                 C   s,   | t kst|sd S t|t}|t |  S r?   )SQLITE_DATE_TRUNC_MAPPINGr   ru   r   strftimer   r@   r@   rC   _sqlite_date_trunc&  s
    
r   c                 C   s   t | |t jd k	S r?   )researchI)regexra   r@   r@   rC   _sqlite_regexp-  s    r   c                   @   s   e Zd Zdd ZdS )attrdictc                 C   s   | | S r?   r@   rA   attrr@   r@   rC   __getattr__1  s    zattrdict.__getattr__N)rE   rF   rG   r   r@   r@   r@   rC   r   0  s   r   andor+-*/&|^%=<<=>>=!=inznot iniszis notlikeilikebetweenregexp||)ANDORADDSUBMULDIVBIN_ANDBIN_ORXORMODEQLTLTEGTGTENEINNOT_INISIS_NOTLIKEILIKEBETWEENREGEXPCONCATINNERz
LEFT OUTERzRIGHT OUTERFULL)r   
LEFT_OUTERRIGHT_OUTERr   r         )eqltltegtgtener   r   r   r   r   c                 C   s   |   }|| |S r?   )copyupdate)source	overridesmergedr@   r@   rC   
merge_dictr  s    
r  c                    s    fdd} |_ |S )z
    Method decorator that will "clone" the object before applying the given
    method.  This ensures that state is mutated in a more predictable fashion,
    and promotes the use of method-chaining.
    c                    s   |   } |f|| |S r?   clone)rA   argskwargsr	  funcr@   rC   inner}  s    zreturns_clone.<locals>.inner)
call_localr  r  r@   r  rC   returns_clonew  s    r  c                    s    fdd}|S )zu
    Method decorator to indicate a method is not allowed to be called.  Will
    raise a `NotImplementedError`.
    c                    s   t d t| jf d S )Nz!%s is not allowed on %s instances)NotImplementedErrortyperE   rA   r
  r  r  r@   rC   r    s     znot_allowed.<locals>.innerr@   r  r@   r  rC   not_allowed  s    r  c                       sH   e Zd ZdZddgZdd Zdd Zdd	 Zd
d Z fddZ	  Z
S )r3   zg
    Proxy class useful for situations when you wish to defer the initialization
    of an object.
    obj
_callbacksc                 C   s   g | _ | d  d S r?   )r  
initializerA   r@   r@   rC   __init__  s    zProxy.__init__c                 C   s   || _ | jD ]}|| qd S r?   )r  r  )rA   r  callbackr@   r@   rC   r    s    
zProxy.initializec                 C   s   | j | |S r?   )r  r   )rA   r  r@   r@   rC   attach_callback  s    zProxy.attach_callbackc                 C   s   | j d krtdt| j |S )NzCannot use uninitialized Proxy.)r  AttributeErrorr   r   r@   r@   rC   r     s    
zProxy.__getattr__c                    s$   || j krtdtt| ||S )NzCannot set attribute on proxy.)	__slots__r  superr3   __setattr__rA   r   ra   	__class__r@   rC   r     s    
zProxy.__setattr__)rE   rF   rG   __doc__r  r  r  r  r   r   __classcell__r@   r@   r"  rC   r3     s   c                   @   s8   e Zd Ze Zd
ddZdd Zdd Zedd	 Z	dS )r   Nc                 C   s(   g | _ |d k	r$| | _| j|  d S r?   )fieldslower_rel_model_name_unresolvedr   )rA   rel_model_namer@   r@   rC   r    s    
zDeferredRelation.__init__c                 C   s   | j |||f d S r?   )r&  r   )rA   r   fieldr   r@   r@   rC   	set_field  s    zDeferredRelation.set_fieldc                 C   s(   | j D ]\}}}||_||| qd S r?   )r&  	rel_modeladd_to_class)rA   r-  r   r+  r   r@   r@   rC   	set_model  s    zDeferredRelation.set_modelc                 C   s>   t tj}|D ]*}|j| j kr||  tj| qd S r?   )r   r   r)  r(  rE   r'  r/  discard)	model_cls
unresolveddrr@   r@   rC   resolve  s
    

zDeferredRelation.resolve)N)
rE   rF   rG   r   r)  r  r,  r/  staticmethodr4  r@   r@   r@   rC   r     s   
c                   @   s   e Zd ZdddZdS )_CDescriptorNc                 C   s   |d k	rt |jS | S r?   )Entity_aliasrA   instanceinstance_typer@   r@   rC   __get__  s    
z_CDescriptor.__get__)N)rE   rF   rG   r<  r@   r@   r@   rC   r6    s   r6  c                   @   s  e Zd ZdZe ZdZdd Zed5ddZ	d	d
 Z
dd Zedd Zed6ddZedd Zedd Zedd Zdd Zdd Zd7ddZeejZeejZeejZeejZeejZeej  Z!Z"eej#Z$eejddZ%eejddZ&eejddZ'eej dd Z(Z)eejddZ*eejddZ+eej#ddZ,dd  Z-d!d" Z.eej/Z0eej1Z2eej3Z4eej5Z6eej7Z8eej9Z:eej;Z<eej=Z>eej?Z@eejAZBd#d$ ZCd%d& ZDd8d'd(ZEd)d* ZFd+d, ZGd-d. ZHd/d0 ZId1d2 ZJd3d4 ZKdS )9Nodez=Base-class for any part of a query which shall be composable.nodec                 C   s   d| _ d | _d | _d | _d S NF)_negatedr8  _bind_to	_orderingr  r@   r@   rC   r    s    zNode.__init__NFc                    s    fdd}|S )Nc                    s&   p| j } rt| } t||  | S r?   )rE   r  setattr)methodmethod_namer	  clsr   r@   rC   	decorator  s
    
zNode.extend.<locals>.decoratorr@   )rG  r   r	  rH  r@   rF  rC   extend  s    zNode.extendc                 C   s
   t |  S r?   )r  r  r@   r@   rC   
clone_base  s    zNode.clone_basec                 C   s,   |   }| j|_| j|_| j|_| j|_|S r?   )rJ  r@  r8  rB  rA  )rA   instr@   r@   rC   r	    s    z
Node.clonec                 C   s   | j  | _ d S r?   )r@  r  r@   r@   rC   
__invert__  s    zNode.__invert__c                 C   s
   || _ d S r?   r8  )rA   ar@   r@   rC   alias  s    z
Node.aliasc                 C   s
   || _ dS )z
        Bind the results of an expression to a specific model type. Useful
        when adding expressions to a select, where the result of the expression
        should be placed on a joined instance.
        N)rA  )rA   btr@   r@   rC   bind_to  s    zNode.bind_toc                 C   s
   d| _ d S )NASCrB  r  r@   r@   rC   asc  s    zNode.ascc                 C   s
   d| _ d S )NDESCrS  r  r@   r@   rC   desc  s    z	Node.descc                 C   s   |   S r?   )rT  r  r@   r@   rC   __pos__  s    zNode.__pos__c                 C   s   |   S r?   )rV  r  r@   r@   rC   __neg__
  s    zNode.__neg__c                    s    fdd}|S )z
        Lightweight factory which returns a method that builds an Expression
        consisting of the left-hand and right-hand operands, using `op`.
        c                    s    rt || S t | |S r?   )
ExpressionrA   rhsinvopr@   rC   r    s    zNode._e.<locals>.innerr@   )r^  r]  r  r@   r\  rC   _e  s    zNode._eT)r]  c                 C   s$   |d krt | tjd S t | tj|S r?   )rY  OPr   r   rZ  r@   r@   rC   __eq__'  s    zNode.__eq__c                 C   s$   |d krt | tjd S t | tj|S r?   )rY  r`  r   r   rZ  r@   r@   rC   __ne__+  s    zNode.__ne__c                 C   s   t | tj|S r?   )rY  r`  r   rZ  r@   r@   rC   in_=  s    zNode.in_c                 C   s   t | tj|S r?   )rY  r`  r   rZ  r@   r@   rC   not_in?  s    zNode.not_inc                 C   s    |rt | tjd S t | tjd S r?   )rY  r`  r   r   )rA   is_nullr@   r@   rC   re  A  s    zNode.is_nullc                 C   s   t | tjd| S )Nz%%%s%%rY  r`  r   rZ  r@   r@   rC   containsE  s    zNode.containsc                 C   s   t | tjd| S )Nz%s%%rf  rZ  r@   r@   rC   
startswithG  s    zNode.startswithc                 C   s   t | tjd| S )Nz%%%srf  rZ  r@   r@   rC   endswithI  s    zNode.endswithc                 C   s   t | tjt|td|S )Nr   )rY  r`  r   r   r4   )rA   lowhighr@   r@   rC   r   K  s    zNode.betweenc                 C   s   t | tj|S r?   )rY  r`  r   )rA   
expressionr@   r@   rC   r   M  s    zNode.regexpc                 C   s   t | tj|S r?   )rY  r`  r   rZ  r@   r@   rC   concatO  s    zNode.concat)NF)N)F)T)LrE   rF   rG   r$  r6  rT   
_node_typer  classmethodrI  rJ  r	  r  rL  rO  rQ  rT  rV  rW  rX  r_  r`  r   __and__r   __or__r   __add__r   __sub__r   __mul__r   __div____truediv__r   __xor____radd____rsub____rmul____rdiv____rtruediv____rand____ror____rxor__ra  rb  r   __lt__r   __le__r   __gt__r   __ge__r   
__lshift__r   
__rshift__r   __mod__r   __pow__r   bin_andr   bin_orrc  rd  re  rg  rh  ri  r   r   rm  r@   r@   r@   rC   r=    sp   	






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

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

	


r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )NoopSelectQueryc                 C   s   | j  dfS Nr@   )r  get_noop_sqlr  r@   r@   rC   r  l  s    zNoopSelectQuery.sqlc                 C   s   dS )Nr  r@   r  r@   r@   rC   rd  o  s    zNoopSelectQuery.get_query_metac                 C   s   | j tS r?   )r  r%  r&  r  r@   r@   rC   rg  r  s    z#NoopSelectQuery._get_result_wrapperN)rE   rF   rG   r  rd  rg  r@   r@   r@   rC   ro  k  s   ro  c                       sP   e Zd ZdZd fdd	Z fddZddd	Zd
d Zdd Zdd Z	  Z
S )r  r  Nc                    s(   || _ || _|| _tt| |g  d S r?   )r  r  r[  r  r  r  )rA   r   r  r  r[  r"  r@   rC   r  x  s    zCompoundSelect.__init__c                    s,   t t| |}| j|_| j|_| j|_|S r?   )r  r  r  r  r  r[  r  r"  r@   rC   r  ~  s
    z CompoundSelect._clone_attributesFc                 C   s   | j |dS )NrX  )rZ  r[  r@   r@   rC   r    s    zCompoundSelect.countc                 C   s
   | j  S r?   )r  rd  r  r@   r@   rC   rd    s    zCompoundSelect.get_query_metac                 C   s   | j  o| j S r?   )r  rc  r[  r  r@   r@   rC   rc    s    zCompoundSelect.verify_naivec                 C   s   | j r| jtS | jr$| jtS | jr6| jtS | jj	pD| j
j	}| jjpZ| j
jpZ| j}|sl|rl|  rx| jtS | jtS d S r?   )r  r  r%  r&  r  r'  r1  re  r  r  r[  r0  rc  r(  rf  )rA   	has_joinsis_naiver@   r@   rC   rg    s    z"CompoundSelect._get_result_wrapper)NNN)F)rE   rF   rG   rn  r  r  r  rd  rc  rg  r%  r@   r@   r"  rC   r  u  s   
r  c                       st   e Zd Z fddZ fddZdd Zeedd Zeedd
dZeedddZ	dd Z
dd Z  ZS )_WriteQueryc                    s,   d | _ d| _d| _d | _tt| | d S r?  )r3  r  r  r  r  rt  r  r  r"  r@   rC   r    s
    z_WriteQuery.__init__c                    s6   t t| |}| jr2t| j|_| j|_| j|_|S r?   )r  rt  r  r3  r   r  r  r  r"  r@   rC   r    s    z_WriteQuery._clone_attributesc                    s    fdd}|S )Nc                    s0   | j jj}|js tdt|  | f||S )Nz/RETURNING is not supported by your database: %s)r   r   r  r5  r|   r  )rA   r
  r  r%  rD  r@   rC   r    s    
z-_WriteQuery.requires_returning.<locals>.innerr@   )rD  r  r@   ru  rC   requires_returning  s    z_WriteQuery.requires_returningc                 G   s>   t |dkr |d d kr d | _n|s.| jjj}| || _d S ra  )r   r3  r   r   rX  r  r?  r@   r@   rC   	returning  s
    
z_WriteQuery.returningTc                 C   s
   || _ d S r?   r   r!  r@   r@   rC   r    s    z_WriteQuery.tuplesc                 C   s
   || _ d S r?   r"  r#  r@   r@   rC   r$    s    z_WriteQuery.dictsc                 C   s:   | j d k	r.| jr| jtS | jr.| jtS | jtS r?   )r3  r  r  r%  r&  r  r'  r(  r  r@   r@   rC   r%    s    
z_WriteQuery.get_result_wrapperc                 C   s2   |   }| j| jg if}|| j|  || _| jS r?   )r%  r3  r   r  r  )rA   ri  rK   r@   r@   rC   _execute_with_result_wrapper  s    z(_WriteQuery._execute_with_result_wrapper)T)T)rE   rF   rG   r  r  rv  r  rw  r  r$  r%  rx  r%  r@   r@   r"  rC   rt    s   	rt  c                       s`   e Zd Zd fdd	Z fddZedddZedZd	d
 Z	dd Z
dd Zdd Z  ZS )UpdateQueryNc                    s    || _ d | _tt| | d S r?   )r2  r1  r  ry  r  )rA   r   r  r"  r@   rC   r    s    zUpdateQuery.__init__c                    s(   t t| |}t| j|_| j|_|S r?   )r  ry  r  r  r2  r1  r  r"  r@   rC   r    s    zUpdateQuery._clone_attributesc                 C   s
   || _ d S r?   r1  rA   actionr@   r@   rC   on_conflict  s    zUpdateQuery.on_conflictr  c                 C   s   |   | S r?   )r  r6  r  r@   r@   rC   r    s    zUpdateQuery.sqlc                 C   s@   | j d k	r| jd kr|  S | jd k	r,| jS | j|  S d S r?   r3  r  rx  r  rows_affectedr  r  r@   r@   rC   r    s
    
zUpdateQuery.executec                 C   s    | j jjjstdt|  S )NzwUPDATE queries cannot be iterated over unless they specify a RETURNING clause, which is not supported by your database.)r   r   r  r5  r|   r  r  r  r@   r@   rC   r    s    zUpdateQuery.__iter__c                 C   s   t |   S r?   rj  r  r@   r@   rC   r    s    zUpdateQuery.iterator)N)N)rE   rF   rG   r  r  r  r}  r  r  r  r  r  r  r%  r@   r@   r"  rC   ry    s   ry  c                       s   e Zd Zd fdd	Zdd Z fddZed	Zed
Ze	dddZ
e	dddZe	dddZedd Zdd Zdd Zdd Z  ZS )InsertQueryNFc                    sf   t t| | d| _|d k	p$|d k	| _d| _|d k	r>|| _n|pDi g| _|| _|| _|| _	d | _
d S r?  )r  r  r  r<  _is_multi_row_insert_return_id_listr@  r?  r>  _validate_fieldsr1  )rA   r   r  rowsr&  r  validate_fieldsr"  r@   rC   r    s    zInsertQuery.__init__c           
      #   s   | j j}| jr |j  fdd}|j}|j}| jD ]}| }t }|D ]B}| jrZ|| ||j	krp|j	| }	n|}	|| ||	< |
|	 qH|r|D ]}	|	|kr||	  ||	< q|V  q2d S )Nc                    s   |  krt d|  d S )Nz"%s" is not a recognized field.)r  )r+  valid_fieldsr@   rC   validate_field  s    z.InsertQuery._iter_rows.<locals>.validate_field)r   r   r  r  _default_dict_default_callablesr@  r  r   r&  r   )
rA   
model_metar  defaults	callablesrJ  	field_rowr   r   r+  r@   r  rC   rA    s,    

zInsertQuery._iter_rowsc                    sT   t t| |}| j|_| j|_| j|_| j|_| j|_| j|_| j	|_	| j
|_
|S r?   )r  r  r  r@  r<  r  r?  r>  r  r  r1  r  r"  r@   rC   r  /  s    zInsertQuery._clone_attributesr  zwhere clauseTc                 C   s
   || _ d S r?   )r<  )rA   upsertr@   r@   rC   r  >  s    zInsertQuery.upsertc                 C   s
   || _ d S r?   rz  r{  r@   r@   rC   r}  B  s    zInsertQuery.on_conflictc                 C   s
   || _ d S r?   )r  )rA   return_id_listr@   r@   rC   r  F  s    zInsertQuery.return_id_listc                 C   s   | j jr| jr| jrdS dS NTF)r  insert_returningr  r  r  r@   r@   rC   rF  J  s    zInsertQuery.is_insert_returningc                 C   s   |   | S r?   )r  rK  r  r@   r@   rC   r  Q  s    zInsertQuery.sqlc                 C   sP   g }d }| j }| jD ]*}t| j|| j }|r|| q|rH|S |S d S r?   )r  r@  r  r   r  r<  r  r   )rA   id_listlast_idr  r  r@   r@   rC   _insert_with_loopT  s    
zInsertQuery._insert_with_loopc                 C   s   | j o"| jd ko"| jd ko"| jj }|r0|  S | jd k	rL| jd krL|  S | jd k	r\| jS |  }| j s| jj	r|
 }| jj}dd t| |D }| jjjr|S |d S | j|| jS | jrttd| S dS d S )Nc                 S   s   g | ]\}}| |qS r@   )r  )rK  r+  r  r@   r@   rC   rL  w  s   z'InsertQuery.execute.<locals>.<listcomp>r   T)r  r>  r3  r  insert_manyr  r  rx  r  r  r  r   r   r  rG  rW  last_insert_idr  r  r  
itemgetterfetchall)rA   insert_with_loopr  pk_rowrK   
clean_datar@   r@   rC   r  d  s8    

zInsertQuery.execute)NNNNF)T)N)T)rE   rF   rG   r  rA  r  r  r  rq  r  r  r}  r  r  rF  r  r  r  r%  r@   r@   r"  rC   r     s(         
r  c                   @   s$   e Zd ZedZdd Zdd ZdS )DeleteQueryr  c                 C   s   |   | S r?   )r  rL  r  r@   r@   rC   r    s    zDeleteQuery.sqlc                 C   s@   | j d k	r| jd kr|  S | jd k	r,| jS | j|  S d S r?   r~  r  r@   r@   rC   r    s
    
zDeleteQuery.executeN)rE   rF   rG   r  r  r  r  r@   r@   r@   rC   r    s   r  IndexMetadata)r   r  rZ  r  rj  ColumnMetadata)r   	data_typer  r  rj  ForeignKeyMetadata)r  
dest_tabledest_columnrj  c                   @   s   e Zd ZdS )PeeweeExceptionNrE   rF   rG   r@   r@   r@   rC   r    s    r  c                   @   s   e Zd ZdS )r!   Nr  r@   r@   r@   rC   r!     s    c                   @   s   e Zd ZdS )r   Nr  r@   r@   r@   rC   r     s    c                   @   s   e Zd ZdS )r   Nr  r@   r@   r@   rC   r     s    c                   @   s   e Zd ZdS )r#   Nr  r@   r@   r@   rC   r#     s    c                   @   s   e Zd ZdS )r$   Nr  r@   r@   r@   rC   r$     s    c                   @   s   e Zd ZdS )r%   Nr  r@   r@   r@   rC   r%     s    c                   @   s   e Zd ZdS )r,   Nr  r@   r@   r@   rC   r,     s    c                   @   s   e Zd ZdS )r-   Nr  r@   r@   r@   rC   r-     s    c                   @   s   e Zd ZdS )r2   Nr  r@   r@   r@   rC   r2     s    c                   @   s*   e Zd ZdgZdd Zdd Zdd ZdS )	ExceptionWrapper
exceptionsc                 C   s
   || _ d S r?   )r  )rA   r  r@   r@   rC   r    s    zExceptionWrapper.__init__c                 C   s   d S r?   r@   r  r@   r@   rC   	__enter__  rV   zExceptionWrapper.__enter__c                 C   sH   |d krd S |j | jkrD| j|j  }tr.|}n|j}t||| | d S r?   )rE   r  PY26r
  rc   )rA   exc_type	exc_value	tracebacknew_typeexc_argsr@   r@   rC   __exit__  s    zExceptionWrapper.__exit__N)rE   rF   rG   r  r  r  r  r@   r@   r@   rC   r    s   r  c                       s   e Zd Z fddZ  ZS )_BaseConnectionLocalc                    s4   t t| jf | d | _d| _d | _g | _g | _d S r  )r  r  r  
autocommitclosedconncontext_stacktransactionsr  r"  r@   rC   r    s    z_BaseConnectionLocal.__init__)rE   rF   rG   r  r%  r@   r@   r"  rC   r    s   r  c                   @   s   e Zd ZdS )_ConnectionLocalNr  r@   r@   r@   rC   r    s   r  c                
   @   s|  e Zd ZdZeZddddgZdZdZdZ	i Z
dZdZdZdZdZdZdZi Zd	Zg ZdZdZdZdZdZdZeeeeeee e!e"d
	Z#d}ddZ$dd Z%dd Z&dd Z'dd Z(dd Z)dd Z*dd Z+dd Z,dd Z-dd  Z.e/d!d" Z0e/d#d$ Z1d%d& Z2d'd( Z3d)d* Z4d+d, Z5d-d. Z6d~d/d0Z7d1d2 Z8d3d4 Z9d5d6 Z:d7d8 Z;d9d: Z<d;d< Z=d=d> Z>d?d@ Z?ddAdBZ@dCdD ZAdEdF ZBdGdH ZCdIdJ ZDdKdL ZEddMdNZFdOdP ZGddQdRZHddSdTZIddUdVZJddWdXZKddYdZZLd[d\ ZMdd]d^ZNdd_d`ZOddadbZPddcddZQddedfZRdgdh ZSddidjZTddkdlZUddmdnZVddodpZWdqdr ZXdsdt ZYdudv ZZdwdx Z[dydz Z\d{d| Z]dS )DatabaseFr7  r8  r9  r<  Tr  Nr  )	ConstraintErrorr   r   r#   r$   r%   r,   r-   r2   c           	      K   sn   i | _ |rt | _nt | _| j|f| t | _|| _|| _	|| _
t| j|pRi | _t| j|pdi | _d S r?   )connect_kwargsr  _localr  init	threadingLock
_conn_lockr  autorollbackuse_speedupsr  r  r  )	rA   r  threadlocalsr  r&  opsr  r  r  r@   r@   rC   r    s    

zDatabase.__init__c                 K   s0   |   s|   |d k| _|| _| j| d S r?   )	is_closedr  ry  r  r  r  )rA   r  r  r@   r@   rC   r    s
    
zDatabase.initc                 C   s
   t | jS r?   )r  r  r  r@   r@   rC   exception_wrapper  s    zDatabase.exception_wrapperc              
   C   sd   | j T | jrtd|  2 | j| jf| j| j_d| j_	| 
| jj W 5 Q R X W 5 Q R X d S )NzBError, database not properly initialized before opening connectionF)r  ry  	Exceptionr  _connectr  r  r  r  r  initialize_connectionr  r@   r@   rC   connect  s    
zDatabase.connectc                 C   s   d S r?   r@   rA   r  r@   r@   rC   r    s    zDatabase.initialize_connectionc              
   C   sN   | j > | jrtd|   | | jj d| j_W 5 Q R X W 5 Q R X d S )NzBError, database not properly initialized before closing connectionT)r  ry  r  r  _closer  r  r  r  r@   r@   rC   r    s    
zDatabase.closec                 C   s:   | j jr"| j jd j}|d k	r"|S | j jr2|   | j jS r  )r  r  
connectionr  r  r  r  r@   r@   rC   get_conn   s    zDatabase.get_connc                 C   s   | j jS r?   )r  r  r  r@   r@   rC   r  )  s    zDatabase.is_closedc                 C   s   |    S r?   )r  r  r  r@   r@   rC   
get_cursor,  s    zDatabase.get_cursorc                 C   s   |   d S r?   )r  r  r@   r@   rC   r  /  s    zDatabase._closec                 K   s   t d S r?   r  )rA   r  r  r@   r@   rC   r  2  s    zDatabase._connectc                 C   s   t | j|| _d S r?   )r  r  )rG  r&  r@   r@   rC   register_fields5  s    zDatabase.register_fieldsc                 C   s   t | j|| _d S r?   )r  r  )rG  r  r@   r@   rC   register_ops9  s    zDatabase.register_opsc                 C   sl   |t kr| jrtS tS |tkr"tS |tkr8| jr4tS tS |t	krN| jrJt
S tS |tkrZtS | jrdtS tS d S r?   )r(  r  r   r  rf  r  r&  r   r  r'  r   r  re  r  )rA   wrapper_typer@   r@   rC   r%  =  s&    



zDatabase.get_result_wrapperc                 C   s   |j jr|jS d S r?   )r   rD  	lastrowid)rA   r  r   r@   r@   rC   r  O  s    zDatabase.last_insert_idc                 C   s   |j S r?   )rowcount)rA   r  r@   r@   rC   r  S  s    zDatabase.rows_affectedc                 C   s   |  | j| j| j| jS r?   )compiler_classr  r  r  r  r  r@   r@   rC   r  V  s      zDatabase.compilerc                 C   s   | j |  | S r?   )r  r  r  )rA   r  r@   r@   rC   r  [  s    zDatabase.executec              	   C   s   t ||f |  d |  }z|||p.d W n, tk
r`   |  rZ| jrZ|    Y nX |rv|  rv| 	  W 5 Q R X |S rp  )
loggerdebugr  r  r  r  get_autocommitr  rollbackcommit)rA   r  r  r  r  r@   r@   rC   r  ^  s    
zDatabase.execute_sqlc                 C   s   d S r?   r@   r  r@   r@   rC   beginm  s    zDatabase.beginc                 C   s   |     d S r?   )r  r  r  r@   r@   rC   r  p  s    zDatabase.commitc                 C   s   |     d S r?   )r  r  r  r@   r@   rC   r  s  s    zDatabase.rollbackc                 C   s   || j _d S r?   )r  r  )rA   r  r@   r@   rC   set_autocommitv  s    zDatabase.set_autocommitc                 C   s    | j jd kr| | j | j jS r?   )r  r  r  r  r@   r@   rC   r  y  s    zDatabase.get_autocommitc                 C   s   | j j| d S r?   )r  r  r   rA   transactionr@   r@   rC   push_execution_context~  s    zDatabase.push_execution_contextc                 C   s   | j j  d S r?   )r  r  rQ  r  r@   r@   rC   pop_execution_context  s    zDatabase.pop_execution_contextc                 C   s   t | jjS r?   )r   r  r  r  r@   r@   rC   execution_context_depth  s    z Database.execution_context_depthc                 C   s   t | |dS )N)with_transaction)ExecutionContext)rA   r  r@   r@   rC   execution_context  s    zDatabase.execution_contextc                 C   s   | j j| d S r?   )r  r  r   r  r@   r@   rC   push_transaction  s    zDatabase.push_transactionc                 C   s   | j j  d S r?   )r  r  rQ  r  r@   r@   rC   pop_transaction  s    zDatabase.pop_transactionc                 C   s   t | jjS r?   )r   r  r  r  r@   r@   rC   transaction_depth  s    zDatabase.transaction_depthc                 C   s   t | S r?   r  r  r@   r@   rC   r    s    zDatabase.transactionc                    s   t   fdd}|S )Nc               
      s*       | |W  5 Q R  S Q R X d S r?   r  r  r  rA   r@   rC   r    s    
z)Database.commit_on_success.<locals>.innerr   )rA   r  r  r@   r  rC   commit_on_success  s    zDatabase.commit_on_successc                 C   s   | j s
tt| |S r?   )
savepointsr  	savepointrA   sidr@   r@   rC   r    s    zDatabase.savepointc                 C   s   t | S r?   )_atomicr  r@   r@   rC   atomic  s    zDatabase.atomicc                 C   s   t d S r?   r  rA   r  r@   r@   rC   
get_tables  s    zDatabase.get_tablesc                 C   s   t d S r?   r  rA   rj  r  r@   r@   rC   get_indexes  s    zDatabase.get_indexesc                 C   s   t d S r?   r  r  r@   r@   rC   get_columns  s    zDatabase.get_columnsc                 C   s   t d S r?   r  r  r@   r@   rC   get_primary_keys  s    zDatabase.get_primary_keysc                 C   s   t d S r?   r  r  r@   r@   rC   get_foreign_keys  s    zDatabase.get_foreign_keysc                 C   s   t d S r?   r  )rA   seqr@   r@   rC   sequence_exists  s    zDatabase.sequence_existsc                 C   s   |   }| j||| S r?   )r  r  rw  )rA   r   rY  qcr@   r@   rC   rw    s    zDatabase.create_tablec                 C   s   t ||d d S )N)r_  )create_model_tables)rA   r   rY  r@   r@   rC   create_tables  s    zDatabase.create_tablesc                    sH   |   }t|ttfs"td|  fdd|D }| j| || S )Nz=Fields passed to "create_index" must be a list or tuple: "%s"c                    s&   g | ]}t |tr jj| n|qS r@   rS   r:  r   r&  rU  r   r@   rC   rL    s   z)Database.create_index.<locals>.<listcomp>)r  rS   r   r  r|   r  rz  )rA   r   r&  r  r  fobjsr@   r  rC   rz    s    
zDatabase.create_indexc                    sH   |   }t|ttfs"td|  fdd|D }| j| || S )Nz;Fields passed to "drop_index" must be a list or tuple: "%s"c                    s&   g | ]}t |tr jj| n|qS r@   r  rU  r  r@   rC   rL    s   z'Database.drop_index.<locals>.<listcomp>)r  rS   r   r  r|   r  r{  )rA   r   r&  rY  r  r  r@   r  rC   r{    s    
zDatabase.drop_indexc                 C   s   |   }| j|||| S r?   )r  r  rv  )rA   r   r+  r  r  r@   r@   rC   rv    s      zDatabase.create_foreign_keyc                 C   s"   | j r|  }| j|| S d S r?   )	sequencesr  r  r|  rA   r  r  r@   r@   rC   r|    s    zDatabase.create_sequencec                 C   s   |   }| j|||| S r?   )r  r  rx  )rA   r   r_  r`  r  r@   r@   rC   rx    s      zDatabase.drop_tablec                 C   s   t |||d d S )N)r_  r`  )drop_model_tables)rA   r   rY  r`  r@   r@   rC   drop_tables  s    zDatabase.drop_tablesc                 C   s   |   }| j|||| S r?   )r  r  ry  )rA   r   rb  r`  r  r@   r@   rC   ry    s      zDatabase.truncate_tablec                 C   s"   t t|D ]}||| qd S r?   )r   rv   ry  )rA   r   rb  r`  r   r@   r@   rC   truncate_tables  s    zDatabase.truncate_tablesc                 C   s"   | j r|  }| j|| S d S r?   )r  r  r  r}  r  r@   r@   rC   r}    s    zDatabase.drop_sequencec                 C   s   t t|td|S Nr  r   EXTRACTr   r4   rA   rA  
date_fieldr@   r@   rC   r?    s    zDatabase.extract_datec                 C   s   t ||S r?   )r   
DATE_TRUNCr  r@   r@   rC   truncate_date  s    zDatabase.truncate_datec                 C   s   t dS )NzDEFAULT VALUESr  r  r@   r@   rC   rE    s    zDatabase.default_insert_clausec                 C   s   dS )NzSELECT 0 WHERE 0r@   r  r@   r@   rC   rq    s    zDatabase.get_noop_sqlc                 C   s   t S r?   )r;  r  r@   r@   rC   r8    s    zDatabase.get_binary_type)TTNNFT)NT)T)N)N)N)N)N)N)F)F)F)F)N)FF)FF)FF)FF)^rE   rF   rG   r.  r  r  r3  r  distinct_ondrop_cascader  foreign_keysr)  for_update_nowaitr  r  r  r#  r  r  reserved_tablesr5  r  r  subquery_delete_same_tabler=  window_functionsr#   r   r   r$   r%   r,   r-   r2   r  r  r  r  r  r  r  r  r  r  r  r  ro  r  r  r%  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rw  r  rz  r{  rv  r|  rx  r  ry  r  r}  r?  r	  rE  rq  r8  r@   r@   r@   rC   r    s           
		


















  

r  c                       s   e Zd ZeZddddZdZeo(ejdkZ	dZ
ejdejdiZd	Zd* fdd	Zdd Zdd Zdd Zd+ddZd,ddZd-ddZd.ddZd/ddZd0ddZd1d d!Zd2d"d#Zd$d% Zd&d' Zd(d) Z  ZS )3r6   r  r  )ri  r  r<  F)rO   rM     r   r  GLOBr   zINSERT OR REPLACE INTONc                    sF   |pg | _ |dd }|r*| j d|f tt| j|f|| d S )Njournal_mode)_pragmasrQ  r   r  r6   r  )rA   r  pragmasr
  r  r  r"  r@   rC   r    s
    
zSqliteDatabase.__init__c                 K   sJ   t stdt j|f|}d |_z| | W n   |   Y nX |S )Nz&pysqlite or sqlite3 must be installed.)sqlite3r!   r  isolation_level_add_conn_hooksr  )rA   r  r  r  r@   r@   rC   r    s    zSqliteDatabase._connectc                 C   s8   |  | |ddt |ddt |ddt d S )NrA  rN   
date_truncr   )_set_pragmascreate_functionr   r   r   r  r@   r@   rC   r  &  s    
zSqliteDatabase._add_conn_hooksc                 C   s<   | j r8| }| j D ]\}}|d||f  q|  d S )NzPRAGMA %s = %s;)r  r  r  r  )rA   r  r  pragmara   r@   r@   rC   r  ,  s
    zSqliteDatabase._set_pragmasDEFERREDc                 C   s   | j d| dd d S )NzBEGIN %sFr  r  )rA   	lock_typer@   r@   rC   r  3  s    zSqliteDatabase.beginc                 C   s   t dd S )NzBSQLite does not support ALTER TABLE statements to add constraints.)r-   )rA   r   r+  r  r@   r@   rC   rv  6  s    z!SqliteDatabase.create_foreign_keyc                 C   s   |  dd}dd | D S )Nz<SELECT name FROM sqlite_master WHERE type = ? ORDER BY name;rj  c                 S   s   g | ]}|d  qS )r   r@   rK  r  r@   r@   rC   rL  =  s     z-SqliteDatabase.get_tables.<locals>.<listcomp>r  r  )rA   r  r  r@   r@   rC   r  :  s    zSqliteDatabase.get_tablesc           	         s   d}|  |df}t| t |  d }| D ]*}|d }t|d dk}|r<| q<i  tD ](}|  d| }dd | D  |< qt fd	dtD S )
NzQSELECT name, sql FROM sqlite_master WHERE tbl_name = ? AND type = ? ORDER BY namer  zPRAGMA index_list("%s")r   rN   zPRAGMA index_info("%s")c                 S   s   g | ]}|d  qS )rN   r@   r"  r@   r@   rC   rL  R  s     z.SqliteDatabase.get_indexes.<locals>.<listcomp>c                    s(   g | ] }t ||  | |kqS r@   r  rK  r   index_columnsindex_to_sqlrj  unique_indexesr@   rC   rL  T  s   )r  r  r  r   r  r   r   )	rA   rj  r  r  r  r  r   	is_uniquerl  r@   r&  rC   r  ?  s"    zSqliteDatabase.get_indexesc                    s$   |  d  } fdd| D S )NPRAGMA table_info("%s")c              	      s2   g | ]*}t |d  |d |d  t|d  qS )r   rN   rO   r   )r  ri  r"  r!  r@   rC   rL  _  s   z.SqliteDatabase.get_columns.<locals>.<listcomp>r#  rA   rj  r  r  r@   r!  rC   r  ]  s    
zSqliteDatabase.get_columnsc                 C   s    |  d| }dd | D S )Nr+  c                 S   s   g | ]}|d  r|d qS )r  r   r@   r"  r@   r@   rC   rL  d  s      z3SqliteDatabase.get_primary_keys.<locals>.<listcomp>r#  r,  r@   r@   rC   r  b  s    zSqliteDatabase.get_primary_keysc                    s$   |  d  } fdd| D S )NzPRAGMA foreign_key_list("%s")c                    s&   g | ]}t |d  |d |d  qS )rO   rN   r   r  r"  r!  r@   rC   rL  h  s   z3SqliteDatabase.get_foreign_keys.<locals>.<listcomp>r#  r,  r@   r!  rC   r  f  s    
zSqliteDatabase.get_foreign_keysc                 C   s
   t | |S r?   )savepoint_sqliter  r@   r@   rC   r  k  s    zSqliteDatabase.savepointc                 C   s   t ||S r?   )r   rA  r  r@   r@   rC   r?  n  s    zSqliteDatabase.extract_datec                 C   s   t t| |S r?   )r   r   r   r  r@   r@   rC   r	  q  s    zSqliteDatabase.truncate_datec                 C   s   t jS r?   )r  Binaryr  r@   r@   rC   r8  t  s    zSqliteDatabase.get_binary_type)N)r  )N)N)N)N)N)N)N) rE   rF   rG   r~  r  r  r  r  sqlite_version_infor  r#  r`  r   r   r  r=  r  r  r  r  r  rv  r  r  r  r  r  r  r?  r	  r8  r%  r@   r@   r"  rC   r6     s:     







c                   @   s   e Zd ZdZdZdZdZdddddddd	ZdZdZ	dZ
d
ZejdiZdgZdZdZdZdZd'ddZdd Zdd Zd(ddZd)ddZd*ddZd+ddZd,ddZdd  Zd!d" Zd#d$ Zd%d& ZdS )-r/   TBYTEABOOLEAN	TIMESTAMPNUMERICDOUBLE PRECISIONSERIALr=  )r6  ri  rz   r  r  r  r<  %s~userNc                 K   sT   t stdt jf d|i|}| jrBttj| ttj| |rP|| |S )Nzpsycopg2 must be installed.r  )	psycopg2r!   r  register_unicodepg_extensionsregister_typeUNICODEUNICODEARRAYset_client_encoding)rA   r  r+  r  r  r@   r@   rC   r    s    
zPostgresqlDatabase._connectc                 C   s<   |j }|jdk	r |jjr |jjS |jr8d|j|jjf S d S )NFz	%s_%s_seq)r   r  r  rD  r   r  )rA   r   rK   r@   r@   rC   _get_pk_sequence  s
    z#PostgresqlDatabase._get_pk_sequencec                 C   s`   |  |}|sd S |j}|jr*d|j }nd}|d||f  | d }|  r\|   |S )Nz%s.r1  zSELECT CURRVAL('%s"%s"')r   )rA  r   r  r  r  r  r  )rA   r  r   r  rK   r  resultr@   r@   rC   r    s    
z!PostgresqlDatabase.last_insert_idpublicc                 C   s    d}dd |  ||f D S )NzSSELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = %s ORDER BY tablenamec                 S   s   g | ]
\}|qS r@   r@   )rK  r  r@   r@   rC   rL    s     z1PostgresqlDatabase.get_tables.<locals>.<listcomp>r#  )rA   r  r  r@   r@   rC   r    s    zPostgresqlDatabase.get_tablesc                    s,   d}|  | d|f} fdd| D S )Na  
            SELECT
                i.relname, idxs.indexdef, idx.indisunique,
                array_to_string(array_agg(cols.attname), ',')
            FROM pg_catalog.pg_class AS t
            INNER JOIN pg_catalog.pg_index AS idx ON t.oid = idx.indrelid
            INNER JOIN pg_catalog.pg_class AS i ON idx.indexrelid = i.oid
            INNER JOIN pg_catalog.pg_indexes AS idxs ON
                (idxs.tablename = t.relname AND idxs.indexname = i.relname)
            LEFT OUTER JOIN pg_catalog.pg_attribute AS cols ON
                (cols.attrelid = t.oid AND cols.attnum = ANY(idx.indkey))
            WHERE t.relname = %s AND t.relkind = %s AND idxs.schemaname = %s
            GROUP BY i.relname, idxs.indexdef, idx.indisunique
            ORDER BY idx.indisunique DESC, i.relname;r  c                    s2   g | ]*}t |d  |d |d d|d  qS )r   r   rO   ,rN   )r  r  r"  r!  r@   rC   rL    s   z2PostgresqlDatabase.get_indexes.<locals>.<listcomp>r#  rA   rj  r  r  r  r@   r!  rC   r    s
    
zPostgresqlDatabase.get_indexesc                    s<   d}|  ||f}t| |  fdd| D S )Nz
            SELECT column_name, is_nullable, data_type
            FROM information_schema.columns
            WHERE table_name = %s AND table_schema = %s
            ORDER BY ordinal_positionc                    s*   g | ]"\}}}t |||d k| kqS YESr  rK  r   r  r   pksrj  r@   rC   rL    s   z2PostgresqlDatabase.get_columns.<locals>.<listcomp>r  r   r  r  rE  r@   rJ  rC   r    s    zPostgresqlDatabase.get_columnsc                 C   s(   d}|  |d||f}dd | D S )Na  
            SELECT kc.column_name
            FROM information_schema.table_constraints AS tc
            INNER JOIN information_schema.key_column_usage AS kc ON (
                tc.table_name = kc.table_name AND
                tc.table_schema = kc.table_schema AND
                tc.constraint_name = kc.constraint_name)
            WHERE
                tc.constraint_type = %s AND
                tc.table_name = %s AND
                tc.table_schema = %sr  c                 S   s   g | ]
\}|qS r@   r@   r"  r@   r@   rC   rL    s     z7PostgresqlDatabase.get_primary_keys.<locals>.<listcomp>r#  rE  r@   r@   rC   r    s    z#PostgresqlDatabase.get_primary_keysc                    s*   d}|  | |f} fdd| D S )Na  
            SELECT
                kcu.column_name, ccu.table_name, ccu.column_name
            FROM information_schema.table_constraints AS tc
            JOIN information_schema.key_column_usage AS kcu
                ON (tc.constraint_name = kcu.constraint_name AND
                    tc.constraint_schema = kcu.constraint_schema)
            JOIN information_schema.constraint_column_usage AS ccu
                ON (ccu.constraint_name = tc.constraint_name AND
                    ccu.constraint_schema = tc.constraint_schema)
            WHERE
                tc.constraint_type = 'FOREIGN KEY' AND
                tc.table_name = %s AND
                tc.table_schema = %sc                    s&   g | ]}t |d  |d |d  qS )r   r   rN   r-  r"  r!  r@   rC   rL    s   z7PostgresqlDatabase.get_foreign_keys.<locals>.<listcomp>r#  rA   rj  r  r  r  r@   r!  rC   r    s
    
z#PostgresqlDatabase.get_foreign_keysc                 C   s   |  d|f}t| d S )Nz
            SELECT COUNT(*) FROM pg_class, pg_namespace
            WHERE relkind='S'
                AND pg_class.relnamespace = pg_namespace.oid
                AND relname=%sr   )r  ri  r  )rA   r  r  r@   r@   rC   r    s    z"PostgresqlDatabase.sequence_existsc                 G   s(   d dgt| }| d| | d S )NrD  r7  zSET search_path TO %s)r  r   r  )rA   search_pathpath_paramsr@   r@   rC   set_search_path  s    z"PostgresqlDatabase.set_search_pathc                 C   s   dS )NzSELECT 0 WHERE falser@   r  r@   r@   rC   rq    s    zPostgresqlDatabase.get_noop_sqlc                 C   s   t jS r?   )r:  r/  r  r@   r@   rC   r8  
  s    z"PostgresqlDatabase.get_binary_type)N)rC  )rC  )rC  )rC  )rC  ) rE   rF   rG   r.  r  r
  r  r  r)  r  r  r  r`  r   r  r  r5  r  r  r;  r  rA  r  r  r  r  r  r  r  rP  rq  r8  r@   r@   r@   rC   r/   w  sH   	 





c                   @   s   e Zd ZdZddgZdddddd	d
dZdZdZdZe	j
de	jde	jdiZdZdZdZdd Zd+ddZd,ddZd-ddZd.ddZd/dd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* ZdS )0r+   Tr7  r<  BOOLr4  r5  FLOATzINTEGER AUTO_INCREMENTLONGTEXTzVARCHAR(40))ri  r  r  r  r  r5  r<  r7  l    zLIKE BINARYr   r   `FzREPLACE INTOc                 K   sJ   t stdddd}|| d|kr6|d|d< t jf d|i|S )Nz%MySQLdb or PyMySQL must be installed.utf8T)charsetuse_unicodepasswordpasswdr%  )mysqlr!   r  rQ  r  )rA   r  r  conn_kwargsr@   r@   rC   r  %  s    
zMySQLDatabase._connectNc                 C   s   dd |  dD S )Nc                 S   s   g | ]
\}|qS r@   r@   r"  r@   r@   rC   rL  2  s     z,MySQLDatabase.get_tables.<locals>.<listcomp>zSHOW TABLESr  r  r@   r@   rC   r  1  s    zMySQLDatabase.get_tablesc                    sx   |  d }t i  | D ]@}|d s:|d   |d g   |d  |d  q  fdd D S )NSHOW INDEX FROM `%s`r   rN   r   c                    s$   g | ]}t |d  | |kqS r?   r$  r%  indexesrj  r  r@   rC   rL  =  s   z-MySQLDatabase.get_indexes.<locals>.<listcomp>)r  r   r  r   rX  r   )rA   rj  r  r  r  r@   r]  rC   r  4  s    zMySQLDatabase.get_indexesc                    s8   d}|  |f}t|   fdd| D S )Nz
            SELECT column_name, is_nullable, data_type
            FROM information_schema.columns
            WHERE table_name = %s AND table_schema = DATABASE()c                    s*   g | ]"\}}}t |||d k| kqS rF  rH  rI  rJ  r@   rC   rL  G  s   z-MySQLDatabase.get_columns.<locals>.<listcomp>rL  rM  r@   rJ  rC   r  @  s    zMySQLDatabase.get_columnsc                 C   s    |  d| }dd | D S )Nr\  c                 S   s    g | ]}|d  dkr|d qS )rN   PRIMARYr   r@   r"  r@   r@   rC   rL  L  s      z2MySQLDatabase.get_primary_keys.<locals>.<listcomp>r#  r,  r@   r@   rC   r  J  s    zMySQLDatabase.get_primary_keysc                    s(   d}|  | f} fdd| D S )Na@  
            SELECT column_name, referenced_table_name, referenced_column_name
            FROM information_schema.key_column_usage
            WHERE table_name = %s
                AND table_schema = DATABASE()
                AND referenced_table_name IS NOT NULL
                AND referenced_column_name IS NOT NULLc                    s    g | ]\}}}t ||| qS r@   r-  )rK  r  r  r  r!  r@   rC   rL  W  s   z2MySQLDatabase.get_foreign_keys.<locals>.<listcomp>r#  rE  r@   r!  rC   r  N  s
    
zMySQLDatabase.get_foreign_keysc                 C   s   t tt|td|S r  r  r  r@   r@   rC   r?  [  s    zMySQLDatabase.extract_datec                 C   s   t |t| S r?   )r   DATE_FORMATMYSQL_DATE_TRUNC_MAPPINGr  r@   r@   rC   r	  ^  s    zMySQLDatabase.truncate_datec                 C   s   t t|jjtdS )NzVALUES (DEFAULT))r   r  r   r  r7   r  r@   r@   rC   rE  a  s    
z#MySQLDatabase.default_insert_clausec                 C   s   dS )NzDO 0r@   r  r@   r@   rC   rq  f  s    zMySQLDatabase.get_noop_sqlc                 C   s   t jS r?   )rZ  r/  r  r@   r@   rC   r8  i  s    zMySQLDatabase.get_binary_type)N)N)N)N)N)rE   rF   rG   r.  r3  r  r)  r  r#  r`  r   r   r   r  r  r  r=  r  r  r  r  r  r  r?  r	  rE  rq  r8  r@   r@   r@   rC   r+     sD   	   




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