
    B>qj"                    l   d dl mZ d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dl
mZ d d	lm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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%Z%e#re#jL                  e%jL                  k\  re#Z%	 	 d dl'm(Z(  e(jR                          	 d d
l*Z*d dl*m+Z, d dl-m.Z/ d dl-m0Z1  e/        	 d d
l2Z2d dl3m4Z4 d dl5m0Z6 d dl5m7Z8 	 d d
l9Z:dZ<g dZ= ej|                  d      Z?e?j                   ej                                d ZBeCeDeEeFeGej                  fZIdKdZJd ZKej                  dk  r-ej"                  j                  ZMej"                  j                  ZNnd ZMd ZNe%r e%j                  ej                  eQ        e%j                  ej                  eQ        e%j                  ej:                  eQ       ej                  dk\  rLd ZSd ZTd ZU e%j                  ej"                  eS        e%j                  deT        e%j                  deU       e%jL                  ZWnd ZW eFd!      ZXd"ZYd#d$d%d&d'd(d!ZZeZj                         Z[d)e[d*<   d+e[d,<   d- Z\d. Z]d/ Z^d0 Z_d1 Z`dLd2Zad3 Zbd4 Zc G d5 d6ed      Ze ef       Zg eedMi d7d7d8d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdUdVdWdXdXdYdZd[d[d\d\d]d]d^d^d_d_d`dadbdcZh eei ddej                  deej                  dfej                  dgej                  dhej                  diej                  djej                  dkdl dmdn dodp dqdr dsdt dudv dwdx dydz d{d| d}d~ d d d      Zp eedMi ddddddddddddddddddddddddddddddddddddddZq eeddddddddd	      Zr eeddddd      Zs eeddd      ZtdZudZvdZwdZxdZyd ZzdZ{dZ|dZ}d Z~dZdZ ej                  d      Z ej                  d      Z ej                  d      Zd Zd Zd Zd Zd Zd Zd Zd Z G d def      Z G d def      Z G d de      Z G d def      Z G d def      Z G d d ej$                  ddë            ZdĄ Z G dń def      ZdǄ ZdȄ Z G dɄ def      Z G d˄ def      Z G d̈́ def      Z G dτ def      Z G dф de      Z G dӄ de      Z G dՄ def      Zdׄ Zerj@                  dfdلZ G dڄ de      Z G d܄ def      Z G dބ dee      Z G d de      Z G d dee      Z G d dee      Z G d de      Z G d de      Z G d de      Z G d def      Z G d def      Z G d de      Z G d de      Z G d de      Z G d def      Z G d dee      Z G d de      Z G d de      ZdNdZ G d d e      Z G d de      ZdOdZdOdZ G d de      Z G d de      Z G d	 d
e      Z G d de      ZdNdZd Z G d de      Z ed
d
      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      ZƐd Zǐd Z G d d e      Z G d! d"e      Z eɐd#      Z G d$ d%e      Z̐d& Z G d' d(e      Zΐd) Z G d* d+e      ZАd, Z G d- d.e      Z G d/ d0eҫ      Z G d1 d2eҫ      ZԐdPd3Z G d4 d5eԫ      Z G d6 d7eee֫      Z G d8 d9e׫      Z G d: d;e׫      Z G d< d=eԫ      Z G d> d?eګ      Z G d@ dAeګ      Z G dB dCeګ      Z G dD dEe      Z G dF dGeޫ      ZߐdQdHZ G dI dJef      Z G dK dLe      Z G dM dNe      Z G dO dPe      Z G dQ dRe      Z G dS dTe      Z G dU dVe      Z G dW dXe      Z G dY dZe      Z G d[ d\e      Z G d] d^e      Z G d_ d`e      Z G da dbe      Z G dc dde      Z G de dfef      Zi dgedVedXedhedZed\edied^ed`edbedjeddedkedledmedneZ ee      Z ej$                  dodp      Z ej$                  dqdrdst      Z ej$                  dudvdwt      Z ej$                  dxdy      Z G dz d{ef      Z G d| d}eej                        Z G d~ def      Z G d def      Z G d de      Zd Z G d de      Z G d def      Z G d de      Z  G d de      Z G d de      Z G d de      Z G d def      Z G d def      Z G d def      Z G d def      Z G d def      Z G d de      Z	 G d de      Z
 G d de	      Z G d def      Z G d def      Z G d de      Z G d def      Z G d def      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G dÄ dĐe      Z G dń dƐe      Z G dǄ dȐe      Z G dɄ dʐe      Z  G d˄ def      Z! G d̈́ dΐe!e      Z" G dτ dee      Z# G dф def      Z$ G dӄ dԐe      Z% G dՄ d֐e"      Z& G dׄ dؐe      Z' G dل dڐe"      Z(dۄ Z)ej"                  jT                  Z+dNd܄Z,d݄ Z- G dބ dߐe      Z. G d de.      Z/ G d de.      Z0 G d de.      Z1d Z2 G d de      Z3 G d de      Z4 G d de      Z5 G d de      Z6 G d de!e      Z7 G d de      Z8 G d de      Z9 G d de      Z: G d def      Z; G d de      Z< G d de      Z= G d de<      Z> G d d e<      Z? G d de<      Z@ G d def      ZA G d def      ZB G d def      ZC G d	 d
eC      ZD G d de      ZE G d deF      ZG G d def      ZH G d deeG      ZI G d de      ZJ G d de      ZKd ZL G d def      ZM G d deMeӫ      ZN G d deM      ZO G d d eOeث      ZPd! ZQ G d" d#eOe٫      ZR G d$ d%eR      ZS G d& d'eM      ZT G d( d)eTe۫      ZU G d* d+eTeܫ      ZV G d, d-eTeݫ      ZW G d. d/eR      ZXd0 ZYd1 ZZ G d2 d3e	      Z[ G d4 d5e[      Z\ G d6 d7e[      Z] G d8 d9e]      Z^ G d: d;e\      Z_ G d< d=e[      Z` G d> d? ej$                  d@dA            ZadB ZbdC ZcdD ZddE ZedF ZfdG Zg G dH dIe      ZhdRdJZiy
# e$$ r d
Z#Y w xY w# e$$ r e#Z%Y w xY w# e$$ r Y w xY w# e$$ r d
xZ*Z1Y w xY w# e$$ r
 d
xZ2xZ6Z8Y w xY w# e$$ r 	 d d
l;Z:n# e$$ r d
Z:Y nw xY wY w xY w(S      )bisect_left)bisect_right)Callable)Mappingcontextmanager)deepcopy)reducewraps)isclassN)dbapi2)compat)
extensions)register_uuid)Json)TransactionStatus)Jsonbz4.3.0)OAnyFieldAsIs	AutoField	BareFieldBigAutoFieldBigBitFieldBigIntegerFieldBinaryUUIDFieldBitField	BlobFieldBooleanFieldCaseCast	CharFieldCheckchunkedColumnCompositeKeyContextDatabaseDatabaseErrorDatabaseProxy	DataError	DateFieldDateTimeFieldDecimalFieldDefaultDeferredForeignKeyDeferredThroughModel
DJANGO_MAPDoesNotExistDoubleFieldDQEntityEXCLUDEDFieldFixedCharField
FloatFieldfnForeignKeyFieldIdentityFieldImproperlyConfiguredIndexIntegerFieldIntegrityErrorInterfaceErrorInternalErrorIPFieldJOIN	JSONFieldLoadManyToManyFieldModel
ModelIndexMySQLDatabaseNotSupportedErrorOPOperationalErrorPostgresqlDatabasePrimaryKeyFieldprefetchPREFETCH_TYPEProgrammingErrorProxyQualifiedNamesSchemaManagerSmallIntegerFieldSelectSQLSqliteDatabaseTable	TextField	TimeFieldTimestampFieldTuple	UUIDFieldValue
ValuesListWindowpeeweec                 "    t        | t              S N)
isinstancer   )cs    E/opt/rentech/trading_bot/.venv/lib/python3.12/site-packages/peewee.py<lambda>rj      s    jH-     c                 ,    | j                  |||z         S rf   )replace)sqs     ri   qescrp      s    99QArk   c                 |    | j                         } t        j                  d|       r| dd j                  dd      S | S )Nz^"(?:[^"]|"")*"$   """)striprematchrm   )parts    ri   unqescrz      s:    ::<D	xx#T*Abz!!$,,Krk   )      c                     t         j                   j                  | t         j                  j                        j	                  d       S )N)tztzinfo)datetimefromtimestamptimezoneutcrm   )tss    ri   utcfromtimestampr      s6    !!rh&7&7&;&;<%	'rk   c                      t         j                   j                  t         j                  j                        j	                  d       S )Nr   )r   nowr   r   rm    rk   ri   utcnowr      s2    !!X&&**+%	'rk   c                 $    | j                  d      S N )	isoformatds    ri   datetime_adapterr      s    C(8!8rk   c                 `    t        j                  t        t        | j	                  d             S )N   -)r   datemapintsplitr   s    ri   convert_dater      s    HMM3sAGGDM3J$KKrk   c           	         d| v r| j                  d      n| j                  d      \  }}t        t        |j                  d            \  }}} |j                   d      }t        t        |d   j                  d            \  }}}	t        |      dk(  r,t        dj	                  |d	   j                                     }
nd}
t        j                  ||||||	|
      S )
N   T    r      .r      :   z{:0<6.6}rr   )r   r   r   lenformatdecoder   )tr   timeymr   t_fullhourminutesecondusecs              ri   convert_timestampr      s    *.!)JD$#tzz$/0GAq!TZZ%F#&sF1IOOD,A#B D&&6{a:,,VAY-=-=-?@A$$Q1dFFDIIrk   r   	timestampr   r   r   )yearmonthdayr   r   r   )%Y-%m-%d %H:%M:%S%Y-%m-%d %H:%M:%S.%f%Y-%m-%d%H:%M:%S%H:%M:%S.%f%H:%Mz%Y-01-01 00:00:00z%Y-%m-01 00:00:00z%Y-%m-%d 00:00:00z%Y-%m-%d %H:00:00z%Y-%m-%d %H:%M:00r   z%Y-%m-%d %H:%i:00r   z%Y-%m-%d %H:%i:%Sr   c                 T    | t         v sJ |sy t        |t              }t        ||       S rf   )__date_parts__format_date_time__sqlite_datetime_formats__getattrlookup_typedatetime_stringdts      ri   _sqlite_date_partr      s0    .(((	/+F	GB2{##rk   c                 l    | t         v sJ |sy t        |t              }|j                  t         |          S rf   )__sqlite_date_trunc__r   r   strftimer   s      ri   _sqlite_date_truncr      s9    ////	/+F	GB;;,[9::rk   c                 8    |yt        j                  | |      d uS NF)rw   search)regexvalues     ri   _sqlite_regexpr      s     }99UE"$..rk   c                 T    t        | t              st        |t              r| |u S | |k(  S rf   )rg   bool)abs     ri   _json_scalar_eqr      s'     D)Z4-@16MqAvMrk   c                     t        t        t        f      rt        fd| D              S t        fd| D              S )Nc              3   8   K   | ]  }t        |d         ywFN_json_document_contains.0xr   s     ri   	<genexpr>z"_json_array_has.<locals>.<genexpr>  s     CA*1a7Cs   c              3   h   K   | ])  }t        |t        t        f       xr t        |       + y wrf   )rg   dictlistr   r   s     ri   r   z"_json_array_has.<locals>.<genexpr>  s6       a$..H?1a3HH s   /2)rg   r   r   any)r   r   s    `ri   _json_array_hasr     s<    !dD\"CCCC   rk   c                 ~    t        |t              r4t         t              xr" t         fd|j                         D              S t        |t              r&t         t              xr t         fd|D              S |rt         t              rt         |      S t         t        t        f       xr t         |      S )Nc              3   P   K   | ]  \  }}|v xr t        |   |d         ywr   r   )r   kvr   s      ri   r   z*_json_document_contains.<locals>.<genexpr>
  s7      +#1 F>.qtQ>>+#s   #&c              3   6   K   | ]  }t        |        y wrf   )r   )r   r   r   s     ri   r   z*_json_document_contains.<locals>.<genexpr>  s     *LQ?1a+@*Ls   )rg   r   allitemsr   r   r   )r   r   tops   `  ri   r   r     s    !T!T" #s +#	+# (# 	# !T!T"Ls*L!*L'LL
z!T"q!$$!dD\**Dq!/DDrk   c                     	 t        j                  |       }t        j                  |      }t	        ||      rdS dS # t        t        f$ r Y y w xY wNrr   r   )jsonloads	TypeError
ValueErrorr   )haystackneedlehns       ri   _sqlite_json_containsr     sR    JJx JJv (1-1414 z" s   *< AAc                 8    t        j                  | t               y rf   )warningswarnDeprecationWarning)rn   s    ri   __deprecated__r     s    MM!'(rk   c                   $    e Zd Zd Zd Zd Zd Zy)attrdictc                 >    	 | |   S # t         $ r t        |      w xY wrf   )KeyErrorAttributeErrorselfattrs     ri   __getattr__zattrdict.__getattr__!  s+    	': 	' &&	's    c                     || |<   y rf   r   r   r   r   s      ri   __setattr__zattrdict.__setattr__&  s
    UT
rk   c                 (    | j                  |       | S rf   updater   rhss     ri   __iadd__zattrdict.__iadd__'  s    T[[-d{rk   c                 >    t        |       }|j                  |       |S rf   )r   r  )r   r  r   s      ri   __add__zattrdict.__add__(  s    Aaxrk   N)__name__
__module____qualname__r   r  r  r	  r   rk   ri   r   r      s    '
 ;:Grk   r   ANDORADD+SUB-MUL*DIV/BIN_AND&BIN_OR|XOR#MOD%EQ=LT<LTEz<=GT>GTEz>=NEz!=INNOT_INzNOT INISIS_NOTzIS NOTLIKEILIKEBETWEENREGEXPIREGEXPCONCAT||BITWISE_NEGATION~eqltltegtgteneinnot_inc                 $    | j                  |      S rf   )r<  lrs     ri   rj   rj   T  s    188A; rk   isc                 8    t        | t        j                  |      S rf   )
ExpressionrM   r*  r>  s     ri   rj   rj   U  s    z!RUUA. rk   is_notc                 8    t        | t        j                  |      S rf   )rC  rM   r+  r>  s     ri   rj   rj   V      :aA6 rk   likec                 8    t        | t        j                  |      S rf   )rC  rM   r,  r>  s     ri   rj   rj   W  s    Arww2 rk   ilikec                 8    t        | t        j                  |      S rf   )rC  rM   r-  r>  s     ri   rj   rj   X  s    *Q!4 rk   regexpc                 8    t        | t        j                  |      S rf   )rC  rM   r/  r>  s     ri   rj   rj   Y  rF  rk   iregexpc                 $    | j                  |      S rf   )rM  r>  s     ri   rj   rj   Z      AIIaL rk   containsc                 $    | j                  |      S rf   )rP  r>  s     ri   rj   rj   [      QZZ] rk   
startswithc                 $    | j                  |      S rf   rS  r>  s     ri   rj   rj   \  s    q||A rk   endswithc                 $    | j                  |      S rf   )rV  r>  s     ri   rj   rj   ]  rR  rk   c                       | j                   | S rf   )betweenr>  s     ri   rj   rj   ^  s    IAIIqM rk   c                 $    | j                  |      S rf   )is_nullr>  s     ri   rj   rj   _  rO  rk   )rY  r[  AUTOINTEGERBIGAUTOBIGINTBLOBBOOLSMALLINTCHARDATEDATETIMEDECIMALDEFAULT DOUBLEREALFLOATINTTEXTTIMEUUIDUUIDBVARCHARz
INNER JOINzLEFT OUTER JOINzRIGHT OUTER JOINz	FULL JOINzFULL OUTER JOINz
CROSS JOINzNATURAL JOINzJOIN LATERALzLEFT JOIN LATERAL)	INNER
LEFT_OUTERRIGHT_OUTERFULL
FULL_OUTERCROSSNATURALLATERALLEFT_LATERALrr   r   r{         )TUPLEDICTNAMED_TUPLECONSTRUCTORMODEL)WHERErE   MATERIALIZE      z(.)_*([A-Z][a-z]+)z([a-z0-9])_*([A-Z])z[A-Za-z_][A-Za-z0-9_]*c                 L    | j                         }|r|j                  |       |S rf   )copyr  )source	overridesmergeds      ri   
merge_dictr    s!    [[]Fi Mrk   c                     t        |       dk(  r| d   j                  |      S dj                  | D cg c]  }|j                  |       c}      S c c}w )Nrr   r   .)r   join)pathquote_charsry   s      ri   quoter    sF    
4yA~Aw||K((88=TYY{+=>>=s   Ac                 <    t        |       xr t        | t              S rf   )r   
issubclassrI   )os    ri   rj   rj     s    WQZ8Jq%$8 rk   c                 >    | t        | t        t        f      r| S | fS y rf   )rg   r   tupler   s    ri   ensure_tupler    s'    "54-8uFuhF rk   c                 B    | t        | t              r| S t        |       S y rf   )rg   Noder6   r  s    ri   ensure_entityr    s%    "5$/uBVE]B rk   c                 v    t         j                  d|       }t        j                  d|      j                         S )Nz\1_\2)SNAKE_CASE_STEP1subSNAKE_CASE_STEP2lower)rn   firsts     ri   make_snake_caser    s0      1-E%06688rk   c                 z    t         j                  | j                  dd      d         }||j                         S | S )Nr  rr   rs   )IDENTIFIER_REr   rsplitgroup)rn   	match_objs     ri   make_identifierr    s:    $$QXXc1%5b%9:I  Hrk   c              #      K   t               }t        j                  t        |       g|z  d|i}d |D        D ])  }|r!|d   |u r|j	                          |r|d   |u r| + y w)N	fillvaluec              3   2   K   | ]  }t        |        y wrf   )r   )r   gs     ri   r   zchunked.<locals>.<genexpr>  s     *a$q'*   rs   )object	itertoolszip_longestiterpop)itr   markergroupsr  s        ri   r$   r$     sl     XF""T"XJNEfEF*6* b	V+IIK b	V+s   AA%A%c                       e Zd Zd Zy)_callable_context_managerc                 2     t               fd       }|S )Nc                  D    5   | i |cd d d        S # 1 sw Y   y xY wrf   r   argskwargsr;   r   s     ri   innerz1_callable_context_manager.__call__.<locals>.inner  s(     +4*6*+ + +s   r   r   r;   r  s   `` ri   __call__z"_callable_context_manager.__call__       	r	+ 
	+ rk   N)r
  r  r  r  r   rk   ri   r  r    s    rk   r  c                   `     e Zd ZdZd Zd Zd Zd Z ed      Z ed      Z	d Z
 fd	Z xZS )
rT   obj
_callbacksc                 4    g | _         | j                  d        y rf   )r  
initializer   s    ri   __init__zProxy.__init__  s    rk   c                 D    || _         | j                  D ]
  } ||        y rf   r  )r   r  callbacks      ri   r  zProxy.initialize  s#     	HSM	rk   c                 <    | j                   j                  |       |S rf   )r  append)r   r  s     ri   attach_callbackzProxy.attach_callback  s    x(rk   c                       fd}|S )Nc                 j    | j                   t        d       t        | j                         |i |S NzCannot use uninitialized Proxy.r  r   r   )r   r  r  methods      ri   r  z Proxy.passthrough.<locals>.inner  s6    xx$%FGG,7488V,d=f==rk   r   r  r  s   ` ri   passthroughzProxy.passthrough  s    	> rk   	__enter____exit__c                 \    | j                   t        d      t        | j                   |      S r  r  r   s     ri   r   zProxy.__getattr__  s)    88 !BCCtxx&&rk   c                 ^    || j                   vrt        d      t        t        |   ||      S )NzCannot set attribute on proxy.)	__slots__r   superrT   r  )r   r   r   	__class__s      ri   r  zProxy.__setattr__  s/    t~~% !ABBUD-dE::rk   )r
  r  r  r  r  r  r  r  r  r  r   r  __classcell__r  s   @ri   rT   rT     sA    %I
 K(I:&H'
; ;rk   rT   c                   >    e Zd ZdZd Zd Zd Zd Zd Ze	d        Z
y)	r*   )r  r  _Modelc                     t        |       S rf   ConnectionContextr  s    ri   connection_contextz DatabaseProxy.connection_context
       &&rk   c                      t        | g|i |S rf   _atomicr   r  r  s      ri   atomiczDatabaseProxy.atomic      t-d-f--rk   c                     t        |       S rf   _manualr  s    ri   manual_commitzDatabaseProxy.manual_commit      t}rk   c                      t        | g|i |S rf   _transactionr  s      ri   transactionzDatabaseProxy.transaction      D242622rk   c                     t        |       S rf   
_savepointr  s    ri   	savepointzDatabaseProxy.savepoint      $rk   c                 ~     t         d      s% G  fdd      }t        dt        fd|i       _         j                  S )Nr  c                       e Zd ZW  Zy)!DatabaseProxy.Model.<locals>.MetaNr
  r  r  databaser  s   ri   Metar        4rk   r  	BaseModelhasattrtyperI   r  r   r  s   ` ri   rI   zDatabaseProxy.Model  3    tX&''{UHvtnEDK{{rk   N)r
  r  r  r  r  r  r  r  r  propertyrI   r   rk   ri   r*   r*     s2    /I'.3  rk   r*   c                       e Zd Zy)ModelDescriptorNr
  r  r  r   rk   ri   r	  r	        rk   r	  c                   L    e Zd ZdZd Zed        Zd ZddZd Z	d Z
d Zd	 Zy
)AliasManager)_counter_current_index_mappingc                 N    d| _         d| _        g | _        | j                          y Nr   )r  r  r  pushr  s    ri   r  zAliasManager.__init__%  s!    		rk   c                 :    | j                   | j                  dz
     S Nrr   )r  r  r  s    ri   mappingzAliasManager.mapping,  s    }}T001455rk   c                     || j                   vr'| xj                  dz  c_        d| j                  z  | |<   | j                   |   S )Nrr   zt%d)r  r  r   r  s     ri   addzAliasManager.add0  s=    %MMQM 4==0DL||F##rk   c                     |rHt        t        | j                              D ]'  }|| j                  |   v s| j                  |   |   c S  | j	                  |      S rf   )reversedranger  r  r  )r   r  	any_depthidxs       ri   getzAliasManager.get6  sZ    d&9&9 :; 6T]]3//==-f556 xxrk   c                 $    | j                  |      S rf   )r  r  s     ri   __getitem__zAliasManager.__getitem__=  s    xxrk   c                 "    || j                   |<   y rf   )r  )r   r  aliass      ri   __setitem__zAliasManager.__setitem__@  s    $Vrk   c                     | xj                   dz  c_         | j                   t        | j                        kD  r| j                  j                  i        y y r  )r  r   r  r  r  s    ri   r  zAliasManager.pushC  sA    q T]]!33MM  $ 4rk   c                     | j                   dk(  rt        d      | j                  | j                   dz
     j                          | xj                   dz  c_         y )Nrr   z&Cannot pop() from empty alias manager.)r  r   r  clearr  s    ri   r  zAliasManager.popH  sM    !#EFFd))A-.446q rk   NF)r
  r  r  r  r  r  r  r  r  r!  r$  r  r  r   rk   ri   r  r  "  s>    :I 6 6$  %%
!rk   r  c                   2     e Zd Zedf fd	ZddZd Z xZS )StateFc                 0    t         t        |   | |||      S rf   )r  r*  __new__)clsscopeparenthesesr  r  s       ri   r,  zState.__new__Q  s    UC(e[&IIrk   c                     || j                   n|}|r8| j                  r,| j                  j                         }|j                  |       n|r|}n| j                  }t	        ||fi |S rf   )r.  settingsr  r  r*  )r   r.  r/  r  r1  s        ri   r  zState.__call__T  s]    #m

 dmm}}))+HOOF#H}}HUK4844rk   c                 8    | j                   j                  |      S rf   )r1  r  )r   	attr_names     ri   r   zState.__getattr__b  s    }}  ++rk   NN)r
  r  r  SCOPE_NORMALr,  r  r   r  r  s   @ri   r*  r*  O  s    'U J5,rk   r*  _State)r.  r/  r1  c                 $     t          fd       }|S )Nc              ;   T   K    | ddi|5  |  d d d        y # 1 sw Y   y xY wwNr.  r   r   )r   r  r.  s     ri   r  z __scope_context__.<locals>.innerg  s0     ((( 	J	 	 	s   (	(%(r   )r.  r  s   ` ri   __scope_context__r:  f  s      Lrk   c                       e Zd ZdZd Zd Zd Zed        Zed        Z	ed        Z
d Z ee      Z ee      Z ee      Z ee      Z ee      Zd	 Zd
 Zed        Zd Zd ZddZd Zd Zd Z y)r'   )stack_sql_valuesalias_managerstatec                 l    g | _         g | _        g | _        t               | _        t        di || _        y Nr   )r<  r=  r>  r  r?  r*  r@  )r   r1  s     ri   r  zContext.__init__q  s0    
	)^&X&
rk   c                 @    t        di | j                  j                  S rB  )r'   r@  r1  r  s    ri   as_newzContext.as_newx  s    -,,--rk   c                 *    |d   j                  |       S r  get_sort_keyr   items     ri   column_sort_keyzContext.column_sort_key{  s    Aw##D))rk   c                 .    | j                   j                  S rf   )r@  r.  r  s    ri   r.  zContext.scope~  s    zzrk   c                 .    | j                   j                  S rf   )r@  r/  r  s    ri   r/  zContext.parentheses  s    zz%%%rk   c                 .    | j                   j                  S rf   )r@  subqueryr  s    ri   rN  zContext.subquery  s    zz"""rk   c                     |r!|j                  d      | j                  k(  r|d= | j                  j                  | j                          | j                  di || _        | S r9  )r  r.  r<  r  r@  )r   r  s     ri   r  zContext.__call__  sQ    w/4::='"

$**%TZZ,),
rk   c                 @    | j                   r| j                  d       | S )N()r/  literalr  s    ri   r  zContext.__enter__  s    LLrk   c                 |    | j                   r| j                  d       | j                  j                         | _        y )N))r/  rR  r<  r  r@  r   exc_typeexc_valexc_tbs       ri   r  zContext.__exit__  s)    LLZZ^^%
rk   c              #   |   K   | j                   j                          d  | j                   j                          y wrf   )r?  r  r  r  s    ri   
push_aliaszContext.push_alias  s-     ! s   :<c                     t        |t        t        f      r|j                  |       S t	        |      r%|j
                  j                  j                  |       S | j                  t        |            S rf   )	rg   r  r'   __sql__is_model_metatablesqlra   r   r  s     ri   r`  zContext.sql  sR    cD'?+;;t$$c]99??**40088E#J''rk   c                 <    | j                   j                  |       | S rf   )r=  r  )r   keywords     ri   rR  zContext.literal  s    		!rk   Nc                 r   |r	 ||      }n3|1| j                   j                  r| j                   j                  |      }t        |t              r$ | d       5  | j	                  |      cd d d        S t        |      r+| j                         5  | j	                  |      cd d d        S | j                   j                  r| j                  t        |            S | j                  j                  |       |r)| j                  | j                   j                  xs d      S | S # 1 sw Y   xY w# 1 sw Y   xY w)N	converter?)r@  rf  rg   r  r`  r]  scope_columnvalue_literalsrR  _query_val_transformr>  r  param)r   r   rf  	add_params       ri   r   zContext.value  s   e$E4::#7#7 JJ((/EeT"% 'xx' 'e_
 ""$ 'xx' ' ::$$<< 4U ;<<E"8At||DJJ,,34KtK' '' 's   D!D-!D*-D6c                     |j                   j                  | j                          |j                  j                  | j                         |S rf   )r=  extendr>  r   ctxs     ri   r\  zContext.__sql__  s1    		"4<<(
rk   c                 @    | j                  |      j                         S rf   )r`  queryr   nodes     ri   parsezContext.parse  s    xx~##%%rk   c                 P    dj                  | j                        | j                  fS )Nrh  )r  r=  r>  r  s    ri   rr  zContext.query  s    wwtyy!4<<//rk   NT)!r
  r  r  r  r  rD  rJ  r  r.  r/  rN  r  r:  r5  scope_normalSCOPE_SOURCEscope_sourceSCOPE_VALUESscope_values	SCOPE_CTE	scope_cteSCOPE_COLUMNrh  r  r  r   rZ  r`  rR  r   r\  ru  rr  r   rk   ri   r'   r'   n  s    FI'.*     & & # # %\2L$\2L$\2L!),I$\2L
&
 ! !
(L2
&0rk   r'   c                 <   t        | dd       }||j                         }n
t               }|j                  |       j	                         \  }}|s|S |j
                  j                  xs d}|dk(  r|j                  dd      }|t        t        t        |            z  S )N	_databaserg  %s)r   get_sql_contextr'   r`  rr  r@  rk  rm   r  r   rj  )rr  dbrp  r`  paramsrk  s         ri   query_to_stringr    s     
T	*B	~  "i''%.&&(KC
IIOO"sE|kk#t$s/8999rk   c                    t        | t        t        j                  t        j                  t        j                  f      r dt        |       j                  dd      z  } | S t        | t              r)	 | j                  d      } d| j                  dd      z  } | S t        | t              rdt        |       z  } | S | d} | S t        |       } | S # t        $ r | j                  d      } Y fw xY w)Nz'%s''''utf8raw_unicode_escaper  NULL)
rg   strr   r   r   rm   bytesr   UnicodeDecodeErrorr   r   s    ri   rj  rj    s    !c8,,hmmmm% &SV^^C.. H 
Au		/ A QYYsD)) H 
As	3q6M
 H	 
 H FH " 	/-.A	/s   0C C('C(c                   D    e Zd ZdZdZd Zd Zed        Zd
dZ	d Z
d Zy	)r  TFc                     | j                   j                  | j                         }| j                  j                         |_        |S rf   )r  r,  __dict__r  ra  s     ri   clonez
Node.clone  s3    nn$$T^^4}}))+
rk   c                     t         rf   NotImplementedErrorro  s     ri   r\  zNode.__sql__      !!rk   c                       fd}|S )Nc                 @    | j                         } |g|i | |S rf   )r  )r   r  r  r  r  s       ri   r  zNode.copy.<locals>.inner  s%    JJLE5*4*6*Lrk   r   r  s   ` ri   r  z	Node.copy  s    	 rk   c                 V    || j                   k7  r| j                         }||_         |S | S rf   )_coercer  )r   r  r  s      ri   coercezNode.coerce  s*    dll"JJLE#EMLrk   c                      yr   r   r  s    ri   is_aliaszNode.is_alias  s    rk   c                     | S rf   r   r  s    ri   unwrapzNode.unwrap"      rk   NT)r
  r  r  r  __isabstractmethod__r  r\  staticmethodr  r  r  r  r   rk   ri   r  r    s:    G 
"  rk   r  c                        e Zd ZdZd Zd ZeZy)ColumnFactoryrt  c                     || _         y rf   r  rs  s     ri   r  zColumnFactory.__init__)  	    	rk   c                 .    t        | j                  |      S rf   )r%   rt  r   s     ri   r   zColumnFactory.__getattr__,      dii&&rk   Nr
  r  r  r  r  r   r!  r   rk   ri   r  r  &  s    I'Krk   r  c                       e Zd ZdZddZy)_DynamicColumnr   Nc                      |t        |      S | S rf   )r  r   instanceinstance_types      ri   __get__z_DynamicColumn.__get__4  s     **rk   rf   r
  r  r  r  r  r   rk   ri   r  r  1  s    Irk   r  c                       e Zd ZdZddZy)_ExplicitColumnr   Nc                 &    |t        d|z        | S )NzM%s specifies columns explicitly, and does not support dynamic column lookups.r   r  s      ri   r  z_ExplicitColumn.__get__=  s)     *,456 6 rk   rf   r  r   rk   ri   r  r  :  s    Irk   r  c                       e Zd Zd Zd Zy)Starc                     || _         y rf   )r  r  s     ri   r  zStar.__init__F  	    rk   c                 h    |j                  t        | j                              j                  d      S )Nz.*)r`  rU   r  rR  ro  s     ri   r\  zStar.__sql__H  s%    ww~dkk23;;DAArk   Nr
  r  r  r  r\  r   rk   ri   r  r  E  s    Brk   r  c                        e Zd Z e       Zd fd	Zej                  d        Zd Z	e
d        Zej                  dfdZddZddZd	 Zd
 Zd Z xZS )SourceNc                 8    t         t        |           || _        y rf   )r  r  r  _alias)r   r#  r  s     ri   r  zSource.__init__O  s    fd$&rk   c                     || _         y rf   r  r   names     ri   r#  zSource.aliasS  	    rk   c                 8    |st        d      f}t        | f|      S Nr  )rY   rX   r   columnss     ri   selectzSource.selectW  s    3xkGtgw''rk   c                     t        |       S rf   )r  r  s    ri   __star__zSource.__star__\  s    Dzrk   c                     t        | |||      S rf   Join)r   dest	join_typeons       ri   r  zSource.join`  s    D$	2..rk   c                 :    t        | |t        j                  |      S rf   )r  rE   rs  r   r  r  s      ri   left_outer_joinzSource.left_outer_joinc  s    D$44rk   c                 "    t        || |||      S N)	recursiver  materializedCTEr   r  r  r  r  s        ri   ctez
Source.ctef      4G ,. 	.rk   c                 T    | j                   r| j                   fS |j                  |    fS rf   )r  r?  ro  s     ri   rG  zSource.get_sort_keyj  s)    ;;KK>!!!$'))rk   c                     |j                   t        k(  r[| j                  r| j                  |j                  | <   |j	                  d      j                  t        |j                  |                 |S N AS )r.  ry  r  r?  rR  r`  r6   ro  s     ri   apply_aliaszSource.apply_aliaso  sW     99${{*.++!!$'KK##F3+<+<T+B$CD
rk   c                     | j                   r| j                   |j                  | <   |j                  t        |j                  |                S rf   )r  r?  r`  r6   ro  s     ri   apply_columnzSource.apply_columnx  s<    ;;&*kkCd#wwvc//5677rk   rf   FNN)r
  r  r  r  rh   r  r  r  r#  r  r  r  rE   rr  r  r  r  rG  r  r  r  r  s   @ri   r  r  L  sj    A 
YY (
   $(::$ /5.*
8rk   r  c                        e Zd Z fdZej
                  d        Z fdZd Zd Z	d Z
d Zd Zd	 Z eej                        Z eej"                        Z eej&                        Z eej*                        Z xZS )
_HashableSourcec                 L    t        t        | 
  |i | | j                          y rf   )r  r  r  _update_hashr   r  r  r  s      ri   r  z_HashableSource.__init__  s#    ot-t>v>rk   c                 2    || _         | j                          y rf   )r  r  r  s     ri   r#  z_HashableSource.alias  s    rk   c                 L    t         t        |          }|j                          |S rf   )r  r  r  r  r   r  r  s     ri   r  z_HashableSource.clone  s#    ot24rk   c                 .    | j                         | _        y rf   )	_get_hash_hashr  s    ri   r  z_HashableSource._update_hash  s    ^^%
rk   c                 Z    t        | j                  | j                  | j                  f      S rf   )hashr  _pathr  r  s    ri   r  z_HashableSource._get_hash  s     T^^TZZ=>>rk   c                     | j                   S rf   )r  r  s    ri   __hash__z_HashableSource.__hash__  s    zzrk   c                     t        |t              r| j                  |j                  k(  S t        | t        j
                  |      S rf   )rg   r  r  rC  rM   r  r   others     ri   __eq__z_HashableSource.__eq__  2    e_-::,,$u--rk   c                     t        |t              r| j                  |j                  k7  S t        | t        j
                  |      S rf   )rg   r  r  rC  rM   r'  r  s     ri   __ne__z_HashableSource.__ne__  r  rk   c                       fd}|S )Nc                     t        | |      S rf   rC  r   r  ops     ri   r  z!_HashableSource._e.<locals>.inner  s    dB,,rk   r   )r  r  s   ` ri   _ez_HashableSource._e  s    	-rk   )r
  r  r  r  r  r  r#  r  r  r  r  r  r   r  rM   r!  __lt__r#  __le__r$  __gt__r&  __ge__r  r  s   @ri   r  r  ~  sy     
YY &?.
.
 YFZFYFZFrk   r  c                 .     t                fd       }|S )Nc                 n     | g|i |}| j                   r|j                  | j                         S |S rf   )r  bind)r   r  r  resultmeths       ri   r  z __bind_database__.<locals>.inner  s6    d,T,V,>>;;t~~..rk   r   )r  r  s   ` ri   __bind_database__r    s     
4[ 
 Lrk   Fc                       fd}|S )Nc                 ,    r|| }} t        | |      S )N)r  r  )r   r  invertedr  s     ri   r  z__join__.<locals>.method  s    %DD%955rk   r   )r  r  r  s   `` ri   __join__r    s    6 Mrk   c                      e Z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
                  d      Z eej                  d      Z eej                  d      Z eej                  d      Z eej                  d      Zy)	BaseTableTr  N)r
  r  r  r  rE   rr  __and__rs  r	  rt  __sub__rv  __or__rw  __mul____rand____radd____rsub____ror____rmul__r   rk   ri   r  r    s    tzz"Gt'Gt''(Gdoo&Ftzz"G

T2H$7H((48Ht6G

T2Hrk   r  c                   $    e Zd Zd Zd Zd Zd Zy)_BoundTableContextc                      || _         || _        y rf   )r_  r  )r   r_  r  s      ri   r  z_BoundTableContext.__init__  s    
 rk   c                 2     t               fd       }|S )Nc                      t        j                  j                        5   | i |cd d d        S # 1 sw Y   y xY wrf   )r"  r_  r  r  s     ri   r  z*_BoundTableContext.__call__.<locals>.inner  s7    #DJJ> +4*6*+ + +s   4=r   r  s   `` ri   r  z_BoundTableContext.__call__  r  rk   c                 $   | j                   j                  | _        | j                   j                  | j                         | j                   j
                  /| j                   j
                  j                  | j                         | j                   S rf   )r_  r  _orig_databaser  r  _modelr  s    ri   r  z_BoundTableContext.__enter__  s^    "jj22

&::(JJ""4==1zzrk   c                     | j                   j                  | j                         | j                   j                  0| j                   j                  j                  | j                         y y rf   )r_  r  r'  r(  rU  s       ri   r  z_BoundTableContext.__exit__  sK    

++,::(JJ""4#6#67 )rk   Nr
  r  r  r  r  r  r  r   rk   ri   r"  r"    s    !8rk   r"  c                        e Zd Z	 	 d fd	Zd ZddZddZd Zed        Z	edd       Z
edd       Zedd	       Zed
        Zd Z xZS )r[   c           	      f   || _         || _        || _        || _        |r||fn|f| _        || _        || _        t        t        | '  |       |-t               | _        |D ]  }t        | |t        | |              |r,| j                  r| n| j                  }	t        |	|      | _        y d | _        y Nr#  )r
  _columns_primary_key_schemar  r(  r  r  r[   r  r  rh   setattrr%   r   primary_key)r   r  r  r3  schemar#  r(  r  columncol_srcr  s             ri   r  zTable.__init__  s    ''-fd^D7
"eT#%#0 $&DF! <ffT6&:;< "mmdG&w<D#Drk   c           	          t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                        S )N)r  r3  r4  r#  r(  r  )r[   r
  r/  r0  r1  r  r(  r  r  s    ri   r  zTable.clone  sB    MMMM))<<++;;nn& 	&rk   c                     || _         | S rf   r  r   r  s     ri   r  z
Table.bind      !rk   c                     t        | |      S rf   )r"  r:  s     ri   bind_ctxzTable.bind_ctx
  s    !$11rk   c                 p    t        | j                  | j                  | j                  | j                  f      S rf   )r  r  r  r  r(  r  s    ri   r  zTable._get_hash  s&    T^^TZZdkkJKKrk   c                     |s<| j                   r$| j                   D cg c]  }t        | |       c}nt        d      f}t        | f|      S c c}w r  )r/  r%   rY   rX   )r   r  r5  s      ri   r  zTable.select  sK    -- <@==ItV,I.1#h[ tgw'' Js   Ac                     |rG|i n|}| j                   r| n| j                  }|j                         D ]  \  }}||t        ||      <    t	        | ||      S Ninsertr  )r/  rh   r   r   Insert)r   rC  r  r  srckeyr   s          ri   rC  zTable.insert  sZ    !>RvF--$TVVC$lln 2
U,1wsC()2d67;;rk   c                 J     | j                   d||d|j                  d      S )NrB  REPLACEr   rC  on_conflict)r   rC  r  r  s       ri   rm   zTable.replace   s7    B%wB:@BY'	)rk   c                     |rG|i n|}| j                   r| n| j                  }|j                         D ]  \  }}||t        ||      <    t	        | |      S )Nr  )r/  rh   r   r   Update)r   r  r  rE  rF  r   s         ri   r  zTable.update&  sX    !>RvF--$TVVC$lln 2
U,1wsC()2d6**rk   c                     t        |       S rf   )Deleter  s    ri   deletezTable.delete/  s    d|rk   c                 \   |j                   t        k(  r!|j                  t        | j                         S | j
                  r| j
                  |j                  | <   |j                   t        k(  r0| j                  |j                  t        | j                               S | j                  |      S rf   )
r.  r{  r`  r6   r  r  r?  ry  r  r  ro  s     ri   r\  zTable.__sql__3  s    99$7764::.//;;&*kkCd#99$##CGGFDJJ,?$@AA $$S))rk   )NNNNNNrf   r4  )r
  r  r  r  r  r  r=  r  r  r  rC  rm   r  rO  r\  r  r  s   @ri   r[   r[     s    DH48$.	&2L ( ( < < ) )
 + +  *rk   r[   c                   F     e Zd Zej                  ddf fd	Zd Zd Z xZS )r  Nc                 f    t         t        |   |       || _        || _        || _        || _        y r-  )r  r  r  lhsr  r  _on)r   rS  r  r  r  r#  r  s         ri   r  zJoin.__init__D  s1    dD""/"rk   c                     || _         | S rf   )rT  )r   	predicates     ri   r  zJoin.onK  s    rk   c                    |j                  | j                        j                  d| j                  z        j                  | j                         | j
                  *|j                  d      j                  | j
                         |S )N %s  ON )r`  rS  rR  r  r  rT  ro  s     ri   r\  zJoin.__sql__O  s\    	
#dhh-
'&4>>)
*
#dhh-88KK##DHH-
rk   )	r
  r  r  rE   rr  r  r  r\  r  r  s   @ri   r  r  C  s    +/::$d rk   r  c                   P     e Zd Zd fd	Zd Zej                  d        Zd Z xZ	S )rb   c                 J    || _         || _        t        t        |   |       y r-  )r>  r/  r  rb   r  )r   valuesr  r#  r  s       ri   r  zValuesList.__init__Z  s#    j$(u(5rk   c                 l    t        | j                  t        | j                        | j                  f      S rf   )r  r  idr>  r  r  s    ri   r  zValuesList._get_hash_  s%    T^^R%5t{{CDDrk   c                     || _         y rf   )r/  )r   namess     ri   r  zValuesList.columnsb  s	    rk   c                 <   | j                   r| j                   |j                  | <   |j                  t        k(  s|j                  t        k(  r ||j
                   xs |j                  j                        5  |j                  d      j                  t        | j                  D cg c]  }t        |       c}            }d d d        |j                  t        k(  r~|j                  d      j                  t        |j                  |                 | j                  r<| j                  D cg c]  }t        |       }}|j                  t        |             |S |j                  t        |j                  |                 |S c c}w # 1 sw Y   xY wc c}w )Nr/  zVALUES r  )r  r?  r.  ry  r5  r/  r@  in_exprrR  r`  CommaNodeListr>  EnclosedNodeListr6   r/  )r   rp  rowrh   entitiess        ri   r\  zValuesList.__sql__f  sM   ;;&*kkCd#99$		\(Acoo"5!K#)):K:KL M	*M<@LL+J58+C0+J K L M yyL(F#''s/@/@/F(GH==37==Aaq	AHAGG,X67 
 GGF3,,T234
+JM M  Bs$   9.F'F9F/FFFr4  )
r
  r  r  r  r  r  r  r  r\  r  r  s   @ri   rb   rb   Y  s+    6
E 
YY rk   rb   c                   J     e Zd Z	 	 d fd	Zd Zd Zd ZeZd ZeZ	d Z
 xZS )r  c                    || _         |j                         x| _        }|| _        || _        |*|D cg c]  }t        |t              rt        |      n|! }}|| _        d|_	        t        t        | 3  |       y c c}w )Nr   r.  )r  r  _query
_recursive_materializedrg   r  r6   r/  	_cte_listr  r  r  )r   r  rr  r  r  r  rh   r  s          ri   r  zCTE.__init__}  s    #kkm+e#) ') %/q#$6vayA= )G )c4!!-	)s   $A=c                 P   |st        d      t        | j                  d      rC | j                  j                  j                  | j                  |       j                  |       }|S t        | f|      j                  |       j                  | j                  j                        }|S )NzFselect_from() must specify one or more columns from the CTE to select.model)
r   r  rj  ro  r  from_with_cterX   r  r  r   r  rr  s      ri   select_fromzCTE.select_from  s     7 8 8 4;;(T[[&&fg'eDkhtn   TGW-htnd4;;001  rk   c                 l    t        | j                  | j                  t        | j                        f      S rf   )r  r  r  r^  rj  r  s    ri   r  zCTE._get_hash  s$    T^^T[["T[[/BCCrk   c                     | j                   j                         }t        | j                  ||z   | j                  | j
                  | j                        S rf   rj  r  r  r  rk  r/  rl  r   r  r  s      ri   	union_allzCTE.union_all  B    !!#4;;T__dmm%%' 	'rk   c                     | j                   j                         }t        | j                  ||z  | j                  | j
                  | j                        S rf   rv  rw  s      ri   unionz	CTE.union  ry  rk   c                    |j                   t        k7  r$|j                  t        | j                              S |j                         5  | j                  |j                  | <   |j                  t        | j                               | j                  r3|j                  d      j                  t        | j                               |j                  d       | j                  r|j                  d       n| j                  du r|j                  d       |j                  d      5  |j                  | j                         d d d        d d d        |S # 1 sw Y   xY w# 1 sw Y   |S xY w)Nr   r  zMATERIALIZED FzNOT MATERIALIZED Trb  )r.  r}  r`  r6   r  rZ  r?  r/  rR  re  rl  rx  rj  ro  s     ri   r\  zCTE.__sql__  s   99	!776$++.//^^ 	%&*kkCd#GGF4;;'(}}C $$%5dmm%DEKK!!O,##u,/0!!d!3 %$%	% 
% %	% 
s%   CE%EEE	EE)r  )r
  r  r  r  rs  r  rx  r	  r{  r  r\  r  r  s   @ri   r  r  |  s6    =A". D' G' Frk   r  c                      e Zd ZdZej
                  dd       Zd Zd Zd Z	d Z
ddZeZddZeZd	 Zdd
Z eej$                        Z eej(                        Z eej,                        Z eej0                        Z eej4                        Z eej8                        Z eej<                        Z eej,                  d      Z  eej0                  d      Z! eej4                  d      Z" eej8                  d      Z# eej$                  d      Z$ eej(                  d      Z% eej<                  d      Z&d Z'd Z( eejR                        Z* eejV                        Z, eejZ                        Z. eej^                        Z0 eejb                        Z2 eejf                        Z4 eejj                        Z6 eejn                        Z8 eejj                        Z9 eejn                        Z: eejv                        Z< eejz                        Z> eejb                        Z? eej                        ZA eej                        ZC eej                        ZEddZFd ZGd ZHd ZId ZJd ZKd ZLd ZMdZNd ZOd ZPd ZQy)
ColumnBaseNc                     || _         y rf   )
_converter)r   rf  s     ri   rf  zColumnBase.converter  s	    #rk   c                 "    |rt        | |      S | S rf   )Aliasr   r#  s     ri   r#  zColumnBase.alias  s    u%%rk   c                     | S rf   r   r  s    ri   unaliaszColumnBase.unalias  r  rk   c                     t        | |      S rf   )BindTo)r   r  s     ri   bind_tozColumnBase.bind_to  s    dD!!rk   c                     t        | |      S rf   )r!   )r   as_types     ri   castzColumnBase.cast  s    D'""rk   c                     t        | ||      S N)	collationnulls)Ascr   r  r  s      ri   asczColumnBase.asc  s    49E::rk   c                     t        | ||      S r  )Descr  s      ri   desczColumnBase.desc  s    DIU;;rk   c                     t        |       S rf   )Negatedr  s    ri   
__invert__zColumnBase.__invert__  r  rk   c                       fd}|S )Nc                 <    rt        ||       S t        | |      S rf   r  )r   r  invr  s     ri   r  zColumnBase._e.<locals>.inner  s$    !#r400dB,,rk   r   )r  r  r  s   `` ri   r  zColumnBase._e  s    	- rk   T)r  c                 `    |t         j                  nt         j                  }t        | ||      S rf   )rM   r*  r  rC  r  s      ri   r  zColumnBase.__eq__  s$    kRUUruu$C((rk   c                 `    |t         j                  nt         j                  }t        | ||      S rf   )rM   r+  r'  rC  r  s      ri   r   zColumnBase.__ne__  s$    +RYY255$C((rk   c                 `    |rt         j                  nt         j                  }t        | |d       S rf   )rM   r*  r+  rC  )r   r[  r  s      ri   r[  zColumnBase.is_null  s"    RUU299$D))rk   c                 H   |j                  d      dk\  s(|j                  d      dk\  s|j                  d      dk\  rb|j                  dd      j                  dd      j                  dd      }t        t        ||z  d	      t	        d
      t        dd	      f      S ||z  S )N_r   r  \\\z\_z\%Fre  ESCAPE)findrm   NodeListra   rY   )r   rn   templates      ri   _escape_like_exprzColumnBase._escape_like_expr  s    66#;!qvvc{a/166$<13D		$'//U;CCCOA hle4Hde,. / / !|rk   c           	          t        |t              r5t        dt        j                  t        |t        j                  d            }n| j                  |d      }t        | t        j                  |      S )Nr  z%%%s%%rg   r  rC  rM   r1  r  r-  r  s     ri   rP  zColumnBase.contains  sU    c4 S"))'RYY<>C ((h7C$#..rk   c                     t        |t              rt        |t        j                  d      }n| j                  |d      }t        | t        j                  |      S )Nr  z%s%%r  r  s     ri   rS  zColumnBase.startswith&  C    c4 S"))S1C((f5C$#..rk   c                     t        |t              rt        dt        j                  |      }n| j                  |d      }t        | t        j                  |      S )Nr  z%%%sr  r  s     ri   rV  zColumnBase.endswith,  r  rk   c           
      b    t        | t        j                  t        |t	        d      |f            S )Nr  )rC  rM   r.  r  rY   )r   lohis      ri   rY  zColumnBase.between2  s%    $

Hb#e*b5I,JKKrk   c                 8    t        | t        j                  |      S rf   StringExpressionrM   r1  r  s     ri   concatzColumnBase.concat4  s    bii55rk   c                     t        |t              rI|j                  |j                  t	        d      | j                  |j                  |j                        S | |k(  S )Nz4BETWEEN range must have both a start- and end-point.)rg   slicestartstopr   rY  rH  s     ri   r!  zColumnBase.__getitem__6  sT    dE"zz!TYY%6  ". / /<<

DII66t|rk   c                 .    t        t        d      | f      S )NDISTINCTr  rY   r  s    ri   distinctzColumnBase.distinct?  s    Z$/00rk   c                 4    t        | t        d|z        f      S )N
COLLATE %sr  r   r  s     ri   collatezColumnBase.collateB  s    s<)#;<=>>rk   c                      yrB  r   ro  s     ri   rG  zColumnBase.get_sort_keyE  s    rk   rf   r4  r(  r  )Rr
  r  r  r  r  r  rf  r#  r  r  r  r  __pos__r  __neg__r  r  rM   r  r  r  r  r  r	  r  r  r  r  r  __truediv__r  __xor__r  r  r   __rtruediv__r  r  __rxor__r  r   r!  r  r#  r  r$  r	  r&  r
  r(  
__lshift__r*  
__rshift__r,  __mod__r-  __pow__rG  rI  r  bin_andr  bin_orin_r)  r<  r/  rK  r0  rM  r[  r  rP  rS  rV  rY  r  r!  __iter__r  r  rG  r   rk   ri   r~  r~    s7   J	YY$ $
"#;G<G jGYFjGjGjGRVV*KjG"&&d#H"&&d#H"&&d#Hbff$'L"&&d#HD!G"&&d#H)) YFZFYFZFBEEJBEEJkGlGbgg;DrxxLEnG		]F
RUU)C		]F		]FnG*
///L6 H1?rk   r~  c                   $    e Zd Zd Zd Zd Zd Zy)r%   c                      || _         || _        y rf   )r  r  )r   r  r  s      ri   r  zColumn.__init__J  s    	rk   c                     |j                   t        k(  r| j                  fS | j                  j	                  |      | j                  fz   S rf   )r.  r{  r  r  rG  ro  s     ri   rG  zColumn.get_sort_keyN  s:    99$II<;;++C0DII<??rk   c                 D    t        | j                  | j                  f      S rf   )r  r  r  r  s    ri   r  zColumn.__hash__T  s    T[[$)),--rk   c                 T   |j                   t        k(  r$|j                  t        | j                              S |j                         5  |j                  | j                        j                  d      j                  t        | j                              cd d d        S # 1 sw Y   y xY wNr  )r.  r{  r`  r6   r  rh  r  rR  ro  s     ri   r\  zColumn.__sql__W  sz    99$776$)),--!!# Pwwt{{+33C8<<VDII=NOP P Ps   ABB'N)r
  r  r  r  rG  r  r\  r   rk   ri   r%   r%   I  s    @.Prk   r%   c                       e Zd Zd Zd Zd Zy)WrappedNodec                 Z    || _         t        |dd      | _        t        |dd       | _        y )Nr  Tr  )rt  r   r  r  rs  s     ri   r  zWrappedNode.__init__`  s)    	tY5!$d;rk   c                 6    | j                   j                         S rf   )rt  r  r  s    ri   r  zWrappedNode.is_aliase  s    yy!!##rk   c                 6    | j                   j                         S rf   )rt  r  r  s    ri   r  zWrappedNode.unwraph  s    yy!!rk   N)r
  r  r  r  r  r  r   rk   ri   r  r  _  s    <
$"rk   r  c                       e Zd ZdZd Zd Zy)EntityFactoryr  c                     || _         y rf   r  rs  s     ri   r  zEntityFactory.__init__n  r  rk   c                 .    t        | j                  |      S rf   )r6   rt  r   s     ri   r   zEntityFactory.__getattr__p  r  rk   N)r
  r  r  r  r  r   r   rk   ri   r  r  l  s    I'rk   r  c                       e Zd ZdZddZy)_DynamicEntityr   Nc                 4    |t        |j                        S | S rf   )r  r  r  s      ri   r  z_DynamicEntity.__get__v  s     11rk   rf   r  r   rk   ri   r  r  t  s    Irk   r  c                        e Zd Z e       Z fdZd Zed        Zej                  d        Zd	dZ
d Zd Zd Z xZS )
r  c                 :    t         t        |   |       || _        y rf   )r  r  r  r  )r   rt  r#  r  s      ri   r  zAlias.__init__  s    eT#D)rk   c                 ,    t        | j                        S rf   )r  r  r  s    ri   r  zAlias.__hash__      DKK  rk   c                     | j                   S rf   r  r  s    ri   r  z
Alias.name  s    {{rk   c                     || _         y rf   r  r   r   s     ri   r  z
Alias.name  	    rk   c                 J    || j                   S t        | j                   |      S rf   )rt  r  r  s     ri   r#  zAlias.alias  s"    =99E**rk   c                     | j                   S rf   r  r  s    ri   r  zAlias.unalias      yyrk   c                      yrw  r   r  s    ri   r  zAlias.is_alias  s    rk   c                    |j                   t        k(  rL|j                  | j                        j	                  d      j                  t        | j                              S |j                  t        | j                              S r  )r.  ry  r`  rt  rR  r6   r  ro  s     ri   r\  zAlias.__sql__  sY    99$S^WV_S,-/
 776$++.//rk   rf   )r
  r  r  r  rh   r  r  r  r  setterr#  r  r  r\  r  r  s   @ri   r  r  |  sS    A!  	[[ +0rk   r  c                   $     e Zd Z fdZd Z xZS )r  c                 :    t         t        |   |       || _        y rf   )r  r  r  r  )r   rt  r  r  s      ri   r  zBindTo.__init__  s    fd$T*	rk   c                 8    |j                  | j                        S rf   r`  rt  ro  s     ri   r\  zBindTo.__sql__  s    wwtyy!!rk   r
  r  r  r  r\  r  r  s   @ri   r  r    s    "rk   r  c                       e Zd Zd Zd Zy)r  c                     | j                   S rf   r  r  s    ri   r  zNegated.__invert__  r  rk   c                 V    |j                  d      j                  | j                        S )NzNOT )rR  r`  rt  ro  s     ri   r\  zNegated.__sql__  s     {{6"&&tyy11rk   N)r
  r  r  r  r\  r   rk   ri   r  r    s    2rk   r  c                   $    e Zd Zd Zd Zd Zd Zy)BitwiseMixinc                 $    | j                  |      S rf   )r  r  s     ri   r  zBitwiseMixin.__and__  s    ||E""rk   c                 $    | j                  |      S rf   )r  r  s     ri   r  zBitwiseMixin.__or__  s    {{5!!rk   c                 6    | j                  t        |            S rf   )r  BitwiseNegatedr  s     ri   r  zBitwiseMixin.__sub__  s    ||N5122rk   c                     t        |       S rf   )r  r  s    ri   r  zBitwiseMixin.__invert__  s    d##rk   N)r
  r  r  r  r  r  r  r   rk   ri   r  r    s    #"3$rk   r  c                   0    e Zd Zej                  Zd Zd Zy)r  c                     | j                   S rf   r  r  s    ri   r  zBitwiseNegated.__invert__  r  rk   c                    |j                   j                  r;|j                   j                  j                  | j                  | j                        }n| j                  }|j	                  |      j                  | j                        S rf   )r@  
operationsr  r  rR  r`  rt  )r   rp  op_sqls      ri   r\  zBitwiseNegated.__sql__  sZ    99YY))--dggtww?FWWF{{6"&&tyy11rk   N)r
  r  r  rM   r3  r  r  r\  r   rk   ri   r  r    s    			B2rk   r  c                       e Zd ZddZd Zy)ra   Nc                 t   || _         || _        |xr t        | j                   t              | _        | j                  rtg | _        | j                   D ]]  }t        |t              r| j
                  j                  |       /| j
                  j                  t        || j                               _ y d | _        y rf   )	r   rf  rg   multi_typesmultir\  r  r  ra   )r   r   rf  unpackrI  s        ri   r  zValue.__init__  s    
"C
4::{ C
::DK

 DdD)KK&&t,KK&&uT4>>'BC	D DKrk   c                     | j                   r$|j                  t        | j                              S |j	                  | j                  | j
                        S rf   )r  r`  re  r\  r   rf  ro  s     ri   r\  zValue.__sql__  s;    ::77+DKK899yyT^^44rk   rw  r  r   rk   ri   ra   ra     s    5rk   ra   c                       e Zd Zd Zy)ValueLiteralsc                 v     |d      5  |j                  | j                        cd d d        S # 1 sw Y   y xY w)NT)ri  r  ro  s     ri   r\  zValueLiterals.__sql__  s/    % 	&77499%	& 	& 	&s   /8N)r
  r  r  r\  r   rk   ri   r
  r
    s    &rk   r
  c                     t        | |d      S NFr  )ra   )r   rf  s     ri   r   r     s    	%00rk   c                   $     e Zd Z fdZd Z xZS )r!   c                 H    t         t        |   |       || _        d| _        y r   )r  r!   r  _castr  )r   rt  r  r  s      ri   r  zCast.__init__  s     dD"4(
rk   c                     |j                  d      j                  | j                        j                  d| j                  z        S )NzCAST(z AS %s))rR  r`  rt  r  ro  s     ri   r\  zCast.__sql__  s4    !TYYTZZ/0	2rk   r  r  s   @ri   r!   r!     s    
2rk   r!   c                   R     e Zd Zd fd	Zej
                  dd       Zd Zd Z xZ	S )Orderingc                     t         t        |   |       || _        || _        || _        |r!|j                         dvrt        d|z        y y )N)r  lastz<Ordering nulls= parameter must be "first" or "last", got: %s)r  r  r  	directionr  r  r  r   )r   rt  r  r  r  r  s        ri   r  zOrdering.__init__  sY    h&t,""
U[[]*;; /167 8 8 <5rk   c                     || _         y rf   )r  r  s     ri   r  zOrdering.collate  s	    "rk   c                     |j                         dk(  rd\  }}nd\  }}t        d | j                  j                         |ff|      S )Nr  )rr   r   )r   rr   )r  r    rt  r[  )r   r  ifnullnotnulls       ri   _null_ordering_casezOrdering._null_ordering_case  sF    ;;=F""OFG"OFGDDII--/8:GDDrk   c                    | j                   rO|j                  j                  s9|j                  | j	                  | j                               j                  d       |j                  | j                         | j                  r|j                  d| j                  z         |j                  d| j                  z         | j                   r4|j                  j                  r|j                  d| j                   z         |S )N, z COLLATE %s %sz	 NULLS %s)	r  r@  nulls_orderingr`  r  rR  rt  r  r  ro  s     ri   r\  zOrdering.__sql__  s    ::cii66GGD,,TZZ89AA$G		>>KK67EDNN*+::#))22KKdjj01
rk   r4  rf   )
r
  r  r  r  r  r  r  r  r\  r  r  s   @ri   r  r    s+    8 
YY# #E
rk   r  c                     t        | d||      S )NASCr  rt  r  r  s      ri   r  r     s    D%E22rk   c                     t        | d||      S )NDESCr#  r$  s      ri   r  r  $  s    D&)U33rk   c                        e Zd ZddZd Zd Zy)rC  c                     || _         || _        |t        j                  t        j                  fv r%t        |t        j                        rt        |      }|| _	        || _
        y rf   )rS  r  rM   r(  r)  rg   typesGeneratorTyper  r  flat)r   rS  r  r  r+  s        ri   r  zExpression.__init__)  sK    "%%##
38K8K(L*C	rk   c                 ,   | j                    dd}| j                  x}}t        |t              r|j	                         }t        |t
              r/|j                  r#|j                  |d<   t        |t              |d<   nd |d<   |j                  j                  r;|j                  j                  j                  | j                  | j                        }n| j                  } |d	i |5  | j                  t        j                  k(  xs | j                  t        j                  k(  }| j                   }|rK| j#                  ||      r9|j%                  | j                  t        j                  k(  rdnd      cd d d        S |E| j                  t        j&                  k(  s| j                  t        j(                  k(  rt+        d      }|j-                  | j                        j%                  d|z        j-                  |      cd d d        S # 1 sw Y   y xY w)
NT)r/  rc  rf  
is_fk_exprz0 = 1z1 = 1r  rX  r   )r+  rS  rg   r  r  r8   r  db_valuer<   r@  r  r  r  rM   r(  r)  r  _is_rhs_emptyrR  r*  r+  rY   r`  )r   rp  r  rt  raw_noder  op_inr  s           ri   r\  zExpression.__sql__1  s   (,		MdC	 (("xh,??$D dE"x'7'7%)]]Ik"&0&GIl#%)Ik"99YY))--dggtww?FWWF9 	 GGruu$<299(<E((C++C5{{dgg.>7GL	 	 {255 0DGGryy4H&kS]WVf_-SX	 	 	s   (BH
>BH

Hc                     t        |t              rt        |       S t        |t              r|j                  xr |j
                   S |j                         j                  |      d   dk(  S )Nr   ())rg   r  r   ra   r  r\  rD  ru  )r   r  rp  s      ri   r/  zExpression._is_rhs_emptyU  sX    c;'Cy= U#II0cjj.1::<%%c*1-55rk   Nr(  )r
  r  r  r  r\  r/  r   rk   ri   rC  rC  (  s    "H6rk   rC  c                       e Zd Zd Zd Zy)r  c                 $    | j                  |      S rf   )r  r  s     ri   r	  zStringExpression.__add___  s    {{3rk   c                 8    t        |t        j                  |       S rf   r  )r   rS  s     ri   r  zStringExpression.__radd__a  s    RYY55rk   N)r
  r  r  r	  r  r   rk   ri   r  r  ^  s     6rk   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)r6   c                 >    |D cg c]  }|s|	 c}| _         y c c}w rf   )r  )r   r  ps      ri   r  zEntity.__init__f  s    !%+Aa+
+s   c                 .    t        | j                  |gz    S rf   )r6   r  r   s     ri   r   zEntity.__getattr__i  s    tzzTF*++rk   c                 ,    t        | j                        S rf   )r  r  ro  s     ri   rG  zEntity.get_sort_keyl  s    TZZ  rk   c                 j    t        | j                  j                  t        | j                        f      S rf   )r  r  r
  r  r  r  s    ri   r  zEntity.__hash__o  s%    T^^,,eDJJ.?@AArk   c                     |j                   j                  xs d}|d   }| j                  D cg c]  }|j                  ||       }}|j	                  t        ||            S c c}w )Nrt   r   )r@  r  r  rm   rR  )r   rp  r  ro   r9  escapeds         ri   r\  zEntity.__sql__r  s[    iioo-N6:jjA199Q,AA{{5+677 Bs   A$N)r
  r  r  r  r   rG  r  r\  r   rk   ri   r6   r6   e  s    ,,!B8rk   r6   c                       e Zd ZddZd Zy)rY   Nc                      || _         || _        y rf   r`  r  r   r`  r  s      ri   r  zSQL.__init__z  s    rk   c                     |j                  | j                         | j                  r%| j                  D ]  }|j                  |dd        |S NF)rl  )rR  r`  r  r   r   rp  rk  s      ri   r\  zSQL.__sql__~  sC    DHH;; 9		%%	89
rk   rf   r  r   rk   ri   rY   rY   y  s    rk   rY   c                 f    t        d| z        }|s|S t        t        d      t        |      |f      S )Nz
CHECK (%s)
CONSTRAINT)rY   r  r6   )
constraintr  checks      ri   r#   r#     s4    z)*ES&te<==rk   c                     t        d| z        S )Nz
DEFAULT %srY   r  s    ri   r/   r/     s    |e#$$rk   c                       e Zd Z ed      Zd
dZd Zej                  dd       Z	ej                  d        Z
ej                  dd       Z	 	 ddZd	 Zy)Function)sumcountavgr  	array_aggNc                     || _         || _        d | _        d | _        || _        |r$|j                         | j                  v rd| _        y || _        y r   )r  	arguments_filter	_order_by_python_valuer  no_coerce_functionsr  )r   r  rS  r  python_values        ri   r  zFunction.__init__  sJ    	")DJJLD$<$<< DL!DLrk   c                     fd}|S )Nc                      t        | fi |S rf   )rM  )r  r  r   s     ri   	decoratorz'Function.__getattr__.<locals>.decorator  s    D$1&11rk   r   )r   r   r[  s    ` ri   r   zFunction.__getattr__  s    	2rk   c                     || _         y rf   )rT  )r   wheres     ri   filterzFunction.filter  	    rk   c                     || _         y rf   rU  )r   orderings     ri   order_byzFunction.order_by  	    !rk   c                     || _         y rf   )rV  )r   funcs     ri   rX  zFunction.python_value  s
    !rk   c           	          t        |t              r||}|t        |      }nt        ||||||d      }t        | t	        d      |f      S )NT)partition_byrc  r  end
frame_typeexclude_inlineOVER)rg   rc   WindowAliasr  rY   )	r   rh  rc  r  ri  rj  windowrk  rt  s	            ri   overzFunction.over  sW    lF+!Fv&D|h %3:")49D s6{D122rk   c                    |j                  | j                         t        | j                        s|j                  d       n| j                  }| j                  r;t        |      }t        |d   t        d      t        | j                        f      |d<    |dt        | j                              5  |j                  t        |D cg c]   }t        |t              r|nt        |d      " c}             d d d        | j                  r9|j                  d      j                  | j                        j                  d       |S c c}w # 1 sw Y   UxY w)	Nr3  rs   ORDER BYTin_functionfunction_arg_countFz FILTER (WHERE rT  )rR  r  r   rS  rU  r   r  rY   rd  r`  re  rg   r  ra   rT  )r   rp  r  args       ri   r\  zFunction.__sql__  s   DII4>>"KK>>D ~~Dz#T"Xs:%24>>%B%D ER #dnn:MN '(#*% 'sD1SuS%7HH*% & ''
 <<KK)*..t||<DDSI
*%' 's   3E%E-EEE)TNrf   NNNNNNN)r
  r  r  setrW  r  r   r  r  r^  rc  rX  rp  r\  r   rk   ri   rM  rM    st    JK	"
 
YY  
YY" " 
YY" " FJ373rk   rM  c                   \    e Zd Z ed      Z ed      Z ed      Z ed      ZdZdZ	dZ
	 	 	 d fd	Zdd	Zej                  d
        Zej                  d        Zej                  d        Zej                  dd       Zej                  dd       Zedd       Zedd       Zd Z xZS )rc   zCURRENT ROWGROUPTIESz	NO OTHERSGROUPSRANGEROWSc
                    t         t        |           |t        |t              st	        |      }|t        |t              st	        |      }t        |t
              rt	        |      }t        |      | _        t        |      | _        || _	        || _
        | j                  | j                  t        d      |xs d| _        |	| _        || _        || _        || _        y )Nz(Cannot specify WINDOW end without start.w)r  rc   r  rg   rY   r  r  rh  rc  r  ri  r   r  rl  rj  _extends_exclude)r   rh  rc  r  ri  rj  extendsrk  r#  rl  r  s             ri   r  zWindow.__init__  s     	fd$&Zs%;JE?:c3#7c(Cgs#'lG(6$X.
::$(("6GHHls$rk   c                     |xs d| _         | S Nr  r  r  s     ri   r#  zWindow.alias  s    lsrk   c                 .    t         j                  | _        y rf   )rc   r}  rj  r  s    ri   as_rangezWindow.as_range  s     ,,rk   c                 .    t         j                  | _        y rf   )rc   r~  rj  r  s    ri   as_rowszWindow.as_rows  s     ++rk   c                 .    t         j                  | _        y rf   )rc   r|  rj  r  s    ri   	as_groupszWindow.as_groups	  s     --rk   c                     || _         y rf   )r  r   ro  s     ri   r  zWindow.extends  s	    rk   c                 H    t        |t              rt        |      }|| _        y rf   )rg   r  rY   r  )r   frame_exclusions     ri   rk  zWindow.exclude  s    os+!/2O'rk   c                 8    | t        d      S t        d| z        S )NzUNBOUNDED FOLLOWINGz%d FOLLOWINGrK  r  s    ri   	followingzWindow.following  #    =,-->E)**rk   c                 8    | t        d      S t        d| z        S )NzUNBOUNDED PRECEDINGz%d PRECEDINGrK  r  s    ri   	precedingzWindow.preceding  r  rk   c                    |j                   t        k7  rA| j                  s5|j                  t	        | j
                               |j                  d        |d      5  g }| j                  ^| j                  }t        |t              rt	        |j
                        }nt        |t              rt	        |      }|j                  |       | j                  r/|j                  t        d      t        | j                        f       | j                   r/|j                  t        d      t        | j                         f       | j"                  [| j$                  O| j&                  xs d}|j                  t        d|z        | j"                  t        d      | j$                  f       nt| j"                  5|j                  t        | j&                  xs d      | j"                  f       n3| j&                  '|j                  t        d	| j&                  z               | j(                  &|j                  t        d
      | j(                  f       |j                  t+        |             d d d        |S # 1 sw Y   |S xY w)Nr  Trb  zPARTITION BYrr  r~  z
%s BETWEENr  z%s UNBOUNDED PRECEDINGEXCLUDE)r.  ry  rl  r`  r6   r  rR  r  rg   rc   r  r  rh  rn  rY   rd  rc  r  ri  rj  r  r  )r   rp  partsextframes        ri   r\  zWindow.__sql__#  s   99$T\\GGF4;;'(KKT" 	%E}}(mmc6* ,CS) +CS!  '!$"3"346 7 }}
O!$--02 3 zz%$((*>16u,-JJJHH	 
 'c$//";V<djjIJ,S!9DOO!KLM}}(c)ndmm<=GGHUO$=	%> 
?	%> 
s   H
I22I<)	NNNNNNNNFrf   )r
  r  r  rY   CURRENT_ROWrz  r{  	NO_OTHERSr|  r}  r~  r  r#  r  r  r  r  r  r  rk  r  r  r  r\  r  r  s   @ri   rc   rc     s    m$KLEv;DK I FEDIMDH . 
YY' ' 
YY& & 
YY( ( 
YY  
YY( (
 + +
 + +
$rk   rc   c                       e Zd Zd Zd Zd Zy)rn  c                     || _         y rf   )ro  r  s     ri   r  zWindowAlias.__init__K  r  rk   c                 (    || j                   _        | S rf   )ro  r  )r   window_aliass     ri   r#  zWindowAlias.aliasN  s    )rk   c                 f    |j                  t        | j                  j                  xs d            S r  )r`  r6   ro  r  ro  s     ri   r\  zWindowAlias.__sql__R  s%    wwvdkk007C899rk   N)r
  r  r  r  r#  r\  r   rk   ri   rn  rn  J  s    :rk   rn  c                       e Zd ZddZd Zy)_InFunctionc                      || _         || _        y rf   )rt  rt  )r   rt  rt  s      ri   r  z_InFunction.__init__W  s    	&rk   c                      || j                   d      5  |j                  | j                        cd d d        S # 1 sw Y   y xY w)Nr   rs  )rt  r`  rt  ro  s     ri   r\  z_InFunction.__sql__[  s7    T--!D 	&77499%	& 	& 	&s	   :ANr  r  r   rk   ri   r  r  V  s    '&rk   r  c                       e Zd ZddZd Zy)r    Nc                 .    || _         || _        || _        y rf   )rV  expression_tuplesdefault)r   rV  r  r  s       ri   r  zCase.__init__a  s    "!2rk   c           	         t        d      g}| j                  |j                  | j                         | j                  D ]5  \  }}|j	                  t        d      |t        d      t        |      f       7 | j                  /|j	                  t        d      t        | j                        f       |j                  t        d              |d      5  |j                  t        |            cd d d        S # 1 sw Y   y xY w)NCASEWHENTHENELSEENDF)rt  )	rY   rV  r  r  rn  r  r  r`  r  )r   rp  clausesexprr   s        ri   r\  zCase.__sql__f  s    v;->>%NN4>>*11 	>KD%NNCKKU);= >	> <<#NNCKT\\)BCDs5z"U# 	.778G,-	. 	. 	.s   C::Drf   r  r   rk   ri   r    r    `  s    
.rk   r    c                       e Zd ZddZd Zy)	ForUpdateNc                 D   |du rdn|}|j                         j                  d      r|d d }d}n&|j                         j                  d      r|d d }d}|r|rt        d      || _        |t	        |t
        t        t        f      s|f}|| _        || _	        || _
        y )NTz
FOR UPDATEnowaitizskip lockedizFOnly one of nowait and skip_locked may be used in a FOR UPDATE clause.)r  rV  r   _exprrg   r   rx  r  _of_nowait_skip_locked)r   r  ofr  skip_lockeds        ri   r  zForUpdate.__init__u  s    #t||::<  *9DFZZ\""=1:DKk 7 8 8 
>*R$U1C"DB'rk   c                 2   |j                  | j                         | j                  3|j                  d      j                  t	        | j                               | j
                  r|j                  d       |S | j                  r|j                  d       |S )Nz OF z NOWAITz SKIP LOCKED)rR  r  r  r`  rd  r  r  ro  s     ri   r\  zForUpdate.__sql__  sr    DJJ88KK##M$(($;<<<KK	" 
 KK'
rk   NNNr  r   rk   ri   r  r  t  s    ((rk   r  c                       e Zd ZddZd Zy)r  c                 .    || _         || _        || _        y rf   )nodesglueparens)r   r  r  r  s       ri   r  zNodeList.__init__  s    
	rk   c                 t   t        | j                        }|dk(  r| j                  r|j                  d      S |S | j                  rd|dk(  r_t	        | j                  d   t
              rB| j                  d   j                  s)| j                  d   j                         f}d|d   _        n| j                  } || j                        5  t        |dz
        D ]1  }|j                  ||          |j                  | j                         3 |j                  ||dz
            d d d        |S # 1 sw Y   |S xY w)Nr   r3  rr   Trb  )r   r  r  rR  rg   rC  r+  r  r  r`  r  )r   rp  n_nodesr  is        ri   r\  zNodeList.__sql__  s   djj/a<(,3;;t$<<[[W\djjmZ0zz!}!!ZZ]((*,E E!HMJJET[[) 	(7Q;' 'a!DII&' GGE'A+&'		(
 
	(
 
s   	AD--D7N)r   Fr  r   rk   ri   r  r    s    
rk   r  c                     t        | d      S Nr  r  r  s    ri   rd  rd    s    E4  rk   c                     t        | dd      S )Nr  Tr  r  s    ri   re  re    s    E4&&rk   c                        e Zd ZdZd Zd ZeZy)
_Namespace_namec                     || _         y rf   r  r  s     ri   r  z_Namespace.__init__  s	    
rk   c                     t        | |      S rf   )NamespaceAttributer   s     ri   r   z_Namespace.__getattr__  s    !$--rk   Nr  r   rk   ri   r  r    s    I.Krk   r  c                       e Zd Zd Zd Zy)r  c                      || _         || _        y rf   )
_namespace
_attribute)r   	namespace	attributes      ri   r  zNamespaceAttribute.__init__  s    ##rk   c                     |j                  | j                  j                  dz         j                  t	        | j
                              S r  )rR  r  r  r`  r6   r  ro  s     ri   r\  zNamespaceAttribute.__sql__  s6    ..45VDOO,-	/rk   Nr  r   rk   ri   r  r    s    $/rk   r  r7   c                   H     e Zd Z fdZej
                  d        Zd Z xZS )r5   c                 F    t         t        |           || _        d| _        y r   )r  r5   r  rr  _negatedr   rr  r  s     ri   r  zDQ.__init__  s    b$ "
rk   c                 (    | j                    | _         y rf   )r  r  s    ri   r  zDQ.__invert__  s     MM)rk   c                 R    t        di | j                  }| j                  |_        |S rB  )r5   rr  r  rs  s     ri   r  zDQ.clone  s#    DJJrk   )	r
  r  r  r  r  r  r  r  r  r  s   @ri   r5   r5     s%    
 
YY* *rk   r5   c                      t        |       S rf   )re  )r   s    ri   rj   rj     s    #A& rk   c                   (     e Zd Zef fd	Zd Z xZS )rU   c                 :    t         t        |   |       || _        y rf   )r  rU   r  _scope)r   rt  r.  r  s      ri   r  zQualifiedNames.__init__  s    nd,T2rk   c                      || j                         5  |j                  | j                        cd d d        S # 1 sw Y   y xY w)N)r.  )r  r`  rt  ro  s     ri   r\  zQualifiedNames.__sql__  s3    t{{# 	&77499%	& 	& 	&s	   9A)r
  r  r  r  r  r\  r  r  s   @ri   rU   rU     s    #/ &rk   rU   c                 F    t        | t              rt        | t              S | S rf   )rg   r~  rU   r5  r  s    ri   qualify_namesr    s      $
#dL11Krk   c                       e Zd Z	 	 	 ddZd Zd Zej                  d        Zej                  dd       Z	ej                  d        Z
ej                  d        Zej                  d	        Zej                  d
        Zy)
OnConflictNc                     || _         || _        t        |      | _        || _        ||t        d      t        |      | _        || _        || _        y )NzIonly one of "conflict_target" and "conflict_constraint" may be specified.)	_action_updater  	_preserve_wherer   _conflict_target_conflict_where_conflict_constraint)r   actionr  preserver]  conflict_targetconflict_whereconflict_constraints           ri   r  zOnConflict.__init__  sc     %h/&+>+J G H H ,_ =-$7!rk   c                 :    |j                   j                  | |      S rf   )r@  conflict_statementr   rp  rr  s      ri   get_conflict_statementz!OnConflict.get_conflict_statement   s    yy++D%88rk   c                 :    |j                   j                  | |      S rf   )r@  conflict_updater  s      ri   get_conflict_updatezOnConflict.get_conflict_update  s    yy((u55rk   c                     || _         y rf   )r  r  s     ri   r  zOnConflict.preserve  s	     rk   c                     |r|rt        |t              st        d      |xs i }|r|j                  |       || _        y )NzGCannot mix data with keyword arguments in the OnConflict update method.)rg   r   r   r  r  )r   _datar  s      ri   r  zOnConflict.update
  sA    VJud$; 9 : :LL rk   c                 z    | j                   | j                   f|z   }t        t        j                  |      | _         y rf   r  r
   operatorand_r   expressionss     ri   r]  zOnConflict.where  .    ;;";;.;6KX]]K8rk   c                      d | _         || _        y rf   r  r  )r   constraintss     ri   r  zOnConflict.conflict_target  s    $(! +rk   c                 z    | j                   | j                   f|z   }t        t        j                  |      | _         y rf   )r  r
   r   r  r  s     ri   r  zOnConflict.conflict_where  s4    +//1K?K%hmm[Ark   c                      || _         d | _        y rf   r  )r   rH  s     ri   r  zOnConflict.conflict_constraint%  s    $.! $rk   rw  rf   )r
  r  r  r  r  r  r  r  r  r  r]  r  r  r  r   rk   ri   r  r    s    FJ6:%)896 
YY! ! 
YY  
YY9 9
 
YY, , 
YYB B
 
YY% %rk   r  c                 0     t               d fd	       }|S )Nc                 r    || j                   n|}|st        dj                  z         | |g|i |S )Nz8Query must be bound to a database in order to call "%s".)r  rB   r
  )r   r  r  r  r  s       ri   r  z database_required.<locals>.inner,  sN    %-%54>>8  "139??"C D DdH6t6v66rk   rf   r   r  s   ` ri   database_requiredr  +  s     
6]7 7 Lrk   c                   8    e Zd Zej                  Zd fd	ZddZ fdZe	j                  dd       Ze	j                  dd       Ze	j                  dd       Ze	j                  dd       Zd Zd	 Zd
 Zed        ZddZd ZddZd Zd Zd Zd Zd Z xZS )	BaseQueryc                 d    || _         d | _        d | _        d | _        t	        t
        |   di | y rB  )r  _cursor_wrapper	_row_type_constructorr  r  r  )r   r  r  r  s      ri   r  zBaseQuery.__init__:  s3    "# i'1&1rk   c                     || _         | S rf   r9  r:  s     ri   r  zBaseQuery.bindA  r;  rk   c                 :    t         t        |          }d |_        |S rf   )r  r  r  r  r  s     ri   r  zBaseQuery.cloneE  s    i,. $rk   c                 B    |rt         j                  | _        y d | _        y rf   )ROWr~  r  )r   as_dicts     ri   dictszBaseQuery.dictsJ  s    %,$rk   c                 B    |rt         j                  | _        y d | _        y rf   )r  r}  r  )r   as_tuples     ri   tupleszBaseQuery.tuplesN  s    &.Drk   c                 B    |rt         j                  | _        y d | _        y rf   )r  r  r  )r   as_namedtuples     ri   namedtupleszBaseQuery.namedtuplesR  s    ,9trk   c                 D    |rt         j                  nd | _        || _        y rf   )r  r  r  r  r   constructors     ri   objectszBaseQuery.objectsV  s    ,7T'rk   c                 X   | j                   xs | j                  }|t        j                  k(  rt	        |      S |t        j
                  k(  rt        |      S |t        j                  k(  rt        |      S |t        j                  k(  rt        || j                        S t        d|z        NzUnrecognized row type: "%s".)r  default_row_typer  r~  DictCursorWrapperr}  CursorWrapperr  NamedTupleCursorWrapperr  ObjectCursorWrapperr  r   r   cursorrow_types      ri   _get_cursor_wrapperzBaseQuery._get_cursor_wrapper[  s    >>:T%:%:sxx$V,," (((*622(&vt/@/@AA;hFGGrk   c                     t         rf   r  ro  s     ri   r\  zBaseQuery.__sql__i  r  rk   c                     | j                   r| j                   j                         }n
t               }|j                  |       S rf   )r  r  r'   ru  )r   contexts     ri   r`  zBaseQuery.sqll  s1    >>nn446GiG}}T""rk   c                 $    | j                  |      S rf   )_executer:  s     ri   executezBaseQuery.executes  s    }}X&&rk   c                    K   || j                   n|}|st        d      |j                  | j                  |       d {   S 7 w)Nz>Query must be bound to a database in order to call "aexecute".)r  rB   runr3  r:  s     ri   aexecutezBaseQuery.aexecutew  sF     %-%54>>8  "7 8 8\\$,,9999s   =AA Ac                     | j                   '|j                  |       }| j                  |      | _         | j                   S rf   )r  r3  r-  r   r  r+  s      ri   r2  zBaseQuery._execute~  s=    '%%d+F#'#;#;F#CD ###rk   c                 R    t        | j                  |      j                               S rf   )r  r3  iteratorr:  s     ri   r:  zBaseQuery.iterator  s    DLL*33566rk   c                 l    | j                   (| j                  st        d      | j                          y y )NzQuery has not been executed.)r  r  r   r3  r  s    ri   _ensure_executionzBaseQuery._ensure_execution  s/    '>> !?@@LLN (rk   c                 L    | j                          t        | j                        S rf   )r<  r  r  r  s    ri   r  zBaseQuery.__iter__  s     D(())rk   c                     | j                          t        |t              r|j                  }n|}||dk\  r|dz   nd}| j                  j                  |       | j                  j                  |   S Nr   rr   )r<  rg   r  r  r  
fill_cache	row_cache)r   r   indexs      ri   r!  zBaseQuery.__getitem__  sh     eU#JJEE!&!EAIE''.##--e44rk   c                 L    | j                          t        | j                        S rf   )r<  r   r  r  s    ri   __len__zBaseQuery.__len__  s     4''((rk   c                     t        |       S rf   )r  r  s    ri   __str__zBaseQuery.__str__  s    t$$rk   rf   r  )r
  r  r  r  r~  r%  r  r  r  r  r  r  r  r  r"  r-  r\  r`  r  r3  r6  r2  r:  r<  r  r!  rD  rF  r  r  s   @ri   r  r  7  s    xx2
 
YY7 7 
YY9 9 
YYD D 
YY( (H"# ' ':$7*	5)%rk   r  c                   &     e Zd Zd fd	Zd Z xZS )RawQueryc                 H    t        t        | 
  di | || _        || _        y rB  )r  rH  r  r=  _params)r   r`  r  r  r  s       ri   r  zRawQuery.__init__  s#    h&00	rk   c                     |j                  | j                         | j                  r$| j                  D ]  }|j                  |d        |S rD  )rR  r=  rJ  r   rE  s      ri   r\  zRawQuery.__sql__  sA    DII<< 2		%5	12
rk   r4  r  r  s   @ri   rH  rH    s    
rk   rH  c                   R    e Zd Zd fd	Zej
                  d        Zej
                  d        Zej
                  d        Zej
                  d        Z	ej
                  d        Z
ej
                  dd       Zej
                  dd       Zej
                  dd	       Zd
 Zd Z xZS )Queryc                 r    t        t        | 
  di | || _        || _        || _        || _        d | _        y rB  )r  rM  r  r  rU  _limit_offsetrm  )r   r]  rc  limitoffsetr  r  s         ri   r  zQuery.__init__  s8    eT#-f-!rk   c                     || _         y rf   )rm  )r   cte_lists     ri   rq  zQuery.with_cte  rd  rk   c                 z    | j                   | j                   f|z   }t        t        j                  |      | _         y rf   r  r  s     ri   r]  zQuery.where  r  rk   c                 z    | j                   | j                   f|z   }t        t        j                  |      | _         y rf   )r  r
   r   or_r  s     ri   orwherezQuery.orwhere  s.    ;;";;.;6KX\\;7rk   c                     || _         y rf   ra  r   r\  s     ri   rc  zQuery.order_by  s	    rk   c                 <    | j                   xs d|z   xs d | _         y rB  ra  rZ  s     ri   order_by_extendzQuery.order_by_extend  s    >>/R69Bdrk   c                     || _         y rf   )rO  r  s     ri   rQ  zQuery.limit  r  rk   c                     || _         y rf   )rP  r  s     ri   rR  zQuery.offset  r_  rk   c                 >    |dkD  r|dz
  nd}|| _         ||z  | _        y r?  )rO  rP  )r   pagepaginate_bys      ri   paginatezQuery.paginate  s&    !8tax!k)rk   c                    | j                   r3|j                  d      j                  t        | j                                | j                  "| j
                  d|j                  j                  rN| j                  |j                  j                  n| j                  }|j                  d      j                  |       | j
                  *|j                  d      j                  | j
                         |S )Nz
 ORDER BY z LIMIT z OFFSET )rU  rR  r`  rd  rO  rP  r@  	limit_max)r   rp  rQ  s      ri   _apply_orderingzQuery._apply_ordering  s    >>gl#c-/0;;"t||'?'*yy':':+/;;+>CII''DKKEKK	"&&u-<<#KK
#''5
rk   c                 6   | j                   rt        d | j                   D              }|j                  d      5  |j                  |rdnd      j	                  t        | j                               j                  d       d d d        |S |S # 1 sw Y   |S xY w)Nc              3   4   K   | ]  }|j                     y wrf   )rk  )r   r  s     ri   r   z Query.__sql__.<locals>.<genexpr>  s     EsCNNEs   FrN  zWITH RECURSIVE zWITH r   )rm  r   r~  rR  r`  rd  )r   rp  r  s      ri   r\  zQuery.__sql__  s    >> EdnnEEI .  'y+gF#mDNN34'#,	 
 
s
 
 
s   ABBNNNNrf   )   )r
  r  r  r  r  r  rq  r]  rX  rc  r\  rQ  rR  rb  re  r\  r  r  s   @ri   rM  rM    s     
YY" " 
YY9 9
 
YY8 8
 
YY    
YYC C 
YY  
YY  
YY* *
rk   rM  c                 (     t          fd       }|S )Nc                 *    r|| }} t        | |      S rf   )CompoundSelectQuery)r   r  r  	operations     ri   r  z#__compound_select__.<locals>.method	  s    %D"4E::rk   )r  )rn  r  r  s   `` ri   __compound_select__ro   	  s    ; ; Mrk   c                       e Zd Z ed      xZZ ed      xZZ ed      xZZ	 ed      xZ
Z edd      Z edd      Z edd      Z edd      Zd Zy)	SelectQuery	UNION ALLUNION	INTERSECTEXCEPTTr  c                     |st        d      t        | f|      j                  | j                        }t	        | dd       |j                  | j                        }|S )Nz/select_from() must specify one or more columns.ro  )r   rX   r  r  r   r"  ro  rr  s      ri   rs  zSelectQuery.select_from	  sV    NOO)$t~~& 	4$'3MM$**-Erk   N)r
  r  r  ro  rx  r	  r{  r  	intersectr  except_r  r  r  r  r  rs  r   rk   ri   rq  rq  		  ss    -k::I(11EF-k::I+H55Gg";>H!'D9G";>H"8d;H	rk   rq  c                       e Zd Zd Zedd       Zedd       Zedd       Zed        Zedd       Z	ed        Z
ed        Zd	 Zd
 Zy)
SelectBasec                 ^    t        | j                  | j                  xs t        |       f      S rf   )r  r  r  r^  r  s    ri   r  zSelectBase._get_hash 	  s#    T^^T[[%<BtH=>>rk   c                 H    | j                  |      d | }|r|dk(  r|d   S |S y r   )r3  )r   r  r   rowss       ri   peekzSelectBase.peek#	  s4    ||H%bq)1f47.$. rk   c                 b    | j                   |k7  r|| _         d | _        | j                  ||      S )N)r   )rO  r  r~  )r   r  r   s      ri   r  zSelectBase.first)	  s0    ;;!DK#'D yyQy''rk   c                     |r| j                         j                  |      S | j                         j                  |      }|r|s|d   S |S r  )r  r~  r  )r   r  r  r  rf  s        ri   scalarzSelectBase.scalar0	  sE    ::<$$X..kkm  *Xs1v636rk   c              #   b   K   | j                         j                  |      D ]	  }|d     y wr  )r  r3  )r   r  rf  s      ri   scalarszSelectBase.scalars7	  s/     ;;=((2 	Ca&L	s   -/c                    | j                         j                  d      }|rd x|_        |_        	 |j                  L|j
                  @|j                  4|j                  (|j                  dur|j                  t        d            }t        |gt        j                  t        d            g      j                  |      S # t        $ r Y Dw xY w)N_wrappedT1)rc  r#  rO  rP  _having	_group_by_windows	_distinct_simple_distinctr  rY   r   rX   r;   COUNTr  )r   r  clear_limitr  s       ri   rO  zSelectBase.count<	  s    %%j1+//EL5=	}}$)@~~%%//*A%%T1SX. ugS 234;;HEE  		s   AC 	CCc                     | j                  t        d            }d|_        d |_        t	        |j                  |            S )Nr  rr   )r  rY   rO  rP  r   r  )r   r  r  s      ri   existszSelectBase.existsJ	  s6    SX&ELL*++rk   c                 X    d | _         	 | j                  |      d   S # t        $ r Y y w xY wr  )r  r3  
IndexErrorr:  s     ri   r  zSelectBase.getQ	  s5    #	<<)!,, 		s    	))c                     |j                   j                  r|j                   j                  dk(  ry|j                  xs |j                  t
        k(  S Nrr   F)r@  rt  ru  rN  r.  ry  ro  s     ri   _subquery_parenszSelectBase._subquery_parensY	  s;    99  SYY%A%AQ%F||:		\ 9:rk   c                     |j                   j                  s8| j                  .|j                   j                  s|j                   j                  r|S | j                  |      S rf   )r@  rt  r  rc  in_projectionr  ro  s     ri   _apply_subquery_aliasz SelectBase._apply_subquery_alias_	  sG    99  T[[%8		!!SYY%<%<J$$rk   N)rr   FFr(  )r
  r  r  r  r  r~  r  r  r  rO  r  r  r  r  r   rk   ri   rz  rz  	  s    ? / /
 ( ( 7 7   F F , ,  ;%rk   rz  c                   l     e Zd Z fdZed        Zed        Zd Zd
dZ	d Z
d
dZd
dZ fd	Z xZS )rm  c                 T    t         t        |           || _        || _        || _        y rf   )r  rm  r  rS  r  r  )r   rS  r  r  r  s       ri   r  zCompoundSelectQuery.__init__k	  s&    !413rk   c                 .    | j                   j                  S rf   )rS  
_returningr  s    ri   r  zCompoundSelectQuery._returningq	  s    xx"""rk   c                     t        | j                  d      ft        d      f      j                  |      }t	        |j                               S )Nrr   r  )rX   rQ  rY   r  r   r  )r   r  rr  s      ri   r  zCompoundSelectQuery.existsu	  s;    

1'#c(5::8DELLN##rk   c                 l    t        |j                        xs |j                  d uxs |j                  d uS rf   )r   rU  rO  rP  r   subqs     ri   _self_wrapszCompoundSelectQuery._self_wrapsz	  s4    T^^$ ,4(? ,<<t+	-rk   c                 x   | j                  |      ry|r*| j                  dk(  xr |j                  | j                  k7  S | j                  dk(  ry|}t        |t              rZ|j                  | j                  k7  ry|j                  }t        |t              r| j                  |      r	 yt        |t              rZy)NTrt  ru  F)r  r  rg   rm  rS  )r   r  rS  rt  s       ri   _needs_groupz CompoundSelectQuery._needs_group	  s    
 D!77k)@dgg.@@77h 23ww$''!88D4!45((. 23 rk   c                     t        |t              sy|j                  dvs| j                  |      ry| j	                  |j
                        xr | j	                  |j                        S )NTrs  rr  F)rg   rm  r  r  _union_onlyrS  r  r  s     ri   r  zCompoundSelectQuery._union_only	  sV    $ 347700D4D4DT4J)Hd.>.>txx.HHrk   c                    |j                   j                  }|r	|t        k(  rEt        |t              r| j                  ||      rt        S | j                  |      rt        S t        S |t        k(  rt        S |t        k(  rN|j                   j                  s|j                   j                  rt        S t        |t              st        S t        S |t        k(  rt        |t              ro|j                   j                  s|j                   j                  r%| j                  dv r| j!                  |      rt        S | j                  ||      rt        S t        S |j                   j                  s|j                   j                  st        S t        S )Nr  )r@  compound_select_parenthesesCSQ_PARENTHESES_NEVERrg   rm  r  CSQ_WRAPr  CSQ_PARENTHESES_ALWAYS
CSQ_PARENSCSQ_PARENTHESES_UNNESTEDrc  rt  CSQ_FLATCSQ_PARENTHESES_GROUPEDr  r  )r   rp  r  rS  csq_settings        ri   _member_stylez!CompoundSelectQuery._member_style	  sB   ii;;k-BB
 $ 34$$T3/#O!!$'< ; 2244yy  CII$9$9  
 d$78!!" ! 33 $ 34YY&&#))*?*? GG'== ,,T2
 $O$$T3/%%  ii''399+@+@!!rk   c                     | j                  |||      }|t        k(  r|j                  d       |j                  |t        k7  d      5  |j                  |       d d d        y # 1 sw Y   y xY w)NzSELECT * FROM F)r/  rN  )r  r  rR  rx  r  r`  )r   rp  r  rS  styles        ri   _member_sqlzCompoundSelectQuery._member_sql	  sc    ""3c2HKK()%8*;eL 	GGDM	 	 	s   A##A,c                    |j                   t        k(  r| j                  |      S t        t        |   |        || j                  |            5  t        |j                  j                        }| j                  || j                  d       |j                  d| j                  z         |j                         5  |j                  j                  j                  |       | j                  || j                          d d d        |j#                         5  | j%                  |       d d d        d d d        | j'                  |      S # 1 sw Y   LxY w# 1 sw Y   .xY w# 1 sw Y   2xY w)Nrb  T)rS  rX  )r.  r  r  r  rm  r\  r  r   r?  r  r  rS  rR  r  rZ  r  r  r|  re  r  )r   rp  outer_aliasesr  s      ri   r\  zCompoundSelectQuery.__sql__	  s/   99$$$S)) 	!405T22378 	* !2!2!:!:;MS$((5KK()! 0!!))00?  dhh/0 !!# *$$S)*	*$ ))#..0 0* *	* 	*s>   A,E"=AE
?E"E)E"
E	E"E	E""E+r(  )r
  r  r  r  r  r  r  r  r  r  r  r  r  r\  r  r  s   @ri   rm  rm  j	  sU     # # $ $-
0I*X/ /rk   rm  c                       e Zd Z	 	 	 d fd	Z fdZej                  d        ZeZej                  d        Z	e
d        Zej                  d        Zej                  d        Zej                  ej                  dfd	       Zdd
Zej                  d        Zd Zej                  d        Zej                  d        Zej                  d        Zej                  	 	 dd       Zej                  dd       ZddZ fdZ xZS )rX   Nc	                 `   t        t        | 
  di |	 t        |t              rt        |      n|xs g | _        || _        || _        || _	        |rt	        |      nd | _
        || _        || _        d x| _        | _        |r&t        |t              r|| _        d | _        y || _        d | _        y rB  )r  rX   r  rg   r  r   
_from_listr  r  r  r  _for_update_lateralr  r  r   r  )r   	from_listr  group_byhavingr  windows
for_updatelateralr  r  s             ri   r  zSelect.__init__	  s     	fd$.v..8E.J4	? )1.0 	!!*1gt%155.(D)(0%  $ "*#rk   c                 x    t         t        |          }|j                  rt	        |j                        |_        |S rf   )r  rX   r  r  r   r  s     ri   r  zSelect.clone
  s3    fd)+#E$4$45Erk   c                     || _         y rf   r  r  s     ri   r  zSelect.columns
  s	    !rk   c                 >    t        | j                        |z   | _        y rf   )r  r  r  s     ri   select_extendzSelect.select_extend
  s    07:rk   c                     | j                   S rf   r  r  s    ri   selected_columnszSelect.selected_columns
  s    rk   c                     || _         y rf   r  r  s     ri   r  zSelect.selected_columns
  s	    rk   c                 $    t        |      | _        y rf   )r   r  r   sourcess     ri   rp  zSelect.from_
  s    w-rk   c                 H   | j                   st        d      | j                   j                         }|H|t        j                  k(  s3|t        j
                  k(  s |t        j                  k7  rt        |dd      rd}| j                   j                  t        ||||             y )NNo sources to join on.r  FT)
r  r   r  rE   ry  rz  rw  r   r  r  )r   r  r  r  rI  s        ri   r  zSelect.join
  s    566""$:T\\)T...djj(z51BtD$	2>?rk   c                 D    | j                  |t        j                  |      S rf   r  rE   rs  r  s      ri   r  zSelect.left_outer_join-
  s    yyt33rk   c           
         g }|D ]n  }t        |t              rK|j                  st        d      |j	                  |j                  D cg c]  }t        ||       c}       ^|j                  |       p || _        y c c}w NzQCannot pass a table to group_by() that does not have columns explicitly declared.)rg   r[   r/  r   rn  r   r  r  r   r  groupingr5  col_names        ri   r  zSelect.group_by0
  s     		(F&%($ &1 2 2 17!B%- ")!: !B C '		( "	!Bs   A>
c                 X    t        | j                  xs d      |z   } | j                  | S rB  )r  r  r  )r   r\  r  s      ri   group_by_extendzSelect.group_by_extend?
  s+    -2.7t}}h''rk   c                 z    | j                   | j                   f|z   }t        t        j                  |      | _         y rf   )r  r
   r   r  r  s     ri   r  zSelect.havingC
  s.    <<#<</K7Khmm[9rk   c                 |    t        |      dk(  r |d   du s|d   du r|d   | _        d | _        y d| _        || _        y )Nrr   r   TF)r   r  r  r  s     ri   r  zSelect.distinctI
  sF    w<1'!*"4
e8K$+AJD!!DN$)D!$DNrk   c                 &    |r|| _         y d | _         y rf   )r  )r   r  s     ri   ro  zSelect.windowR
  s    #*rk   c                 R    |s||s|rd}|sd | _         y t        ||||      | _         y rw  )r  r  )r   r  r  r  r  s        ri   r  zSelect.for_updateV
  s2     r~;J#D(RMDrk   c                     || _         y rf   )r  )r   r  s     ri   r  zSelect.laterala
  	    rk   c                 J    |j                  t        | j                              S rf   )r`  rd  r  r   rp  is_subquerys      ri   __sql_selection__zSelect.__sql_selection__e
  s    ww}T__566rk   c                    |j                   t        k(  r| j                  |      S | j                  r$|j                   t        k(  r|j                  d       |j                  }|j                   t        k(  xr |j                  j                   }d ddd| j                  |      dd} |j                  di |5  t        t        | 7  |       |j                  d       | j                  s| j                  _|j                  d       | j                  rB|j                  d      j!                  t#        | j                              j                  d       |j%                  d	      5  | j'                  ||xr |       }d d d        | j(                  rN|j%                  d
      5  |j                  d      j!                  t+        | j(                               d d d        | j,                  *|j                  d      j!                  | j,                         | j.                  r3|j                  d      j!                  t+        | j.                               | j0                  *|j                  d      j!                  | j0                         | j2                  5|j                  d       |j!                  t+        | j2                               | j5                  |       | j6                  M|j                  j8                  st;        d      |j                  d       |j!                  | j6                         d d d        | j=                  |      S # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   4xY w)NzLATERAL FT)rf  rc  rt  r  r/  rN  zSELECT z	DISTINCT zON r   )r  rb   FROM  WHERE z
 GROUP BY z HAVING z WINDOW z3FOR UPDATE specified but not supported by database.r   )r.  r  r  r  ry  rR  rN  r@  r  r  rx  r  rX   r\  r  r  r`  re  rz  r  r  rd  r  r  r  r  re  r  r  r   r  )r   rp  r  	is_sourcer@  r  s        ri   r\  zSelect.__sql__h
  s   99$$$S))==SYY,6KK
#ll II-Mcii6M6M2M	 "005
 S&& ,	* &$',KK	"$$(BK(>>genc*4>>:;gcl!!!5 <,,S+ 3;1:]<< %%%%8 NKK)--mDOO.LMN {{&I&**4;;7~~L)--mDNN.KL||'J'++DLL9}}(J'dmm45   %+yy++$ &4 5 5C (()Y,	*\ ))#..?< <
N N),	* ,	*s>   8B.M)&M>&M)$4MEM)M	M)M&	!M))M2)NNNNNNNNrf   )TNNNr  r(  )r
  r  r  r  r  r  r  r  r  r  r  r  r  rp  rE   rr  r  r  r  r  r  r  ro  r  r  r  r\  r  r  s   @ri   rX   rX   	  sc   >BFJ$, 
YY" "F	YY; ;      
YY( ( 
YY#'::$ @ @4 
YY" "( 
YY: :
 
YY% % 
YY5 5 
YY:>#N N 
YY   7B/ B/rk   rX   c                   x     e Zd Zd
 fd	ZddZej                  d        Zd Zd Z	 fdZ
d Zd Z fd	Z xZS )_WriteQueryc                 ^    || _         || _        |rdnd| _        t        t        |   di | y )NTFr   )r_  r  _return_cursorr  r  r  )r   r_  	returningr  r  s       ri   r  z_WriteQuery.__init__
  s/    
#&/dUk4)3F3rk   c                 "    t        || |||      S r  r  r  s        ri   r  z_WriteQuery.cte
  r  rk   c                 4    || _         |rd| _        y d| _        y NTF)r  r  )r   r  s     ri   r  z_WriteQuery.returning
  s    #&/dUrk   c                     | j                   rN|j                         5  |j                  d      j                  t	        | j                                d d d        |S |S # 1 sw Y   |S xY w)Nz RETURNING )r  rz  rR  r`  rd  ro  s     ri   apply_returningz_WriteQuery.apply_returning
  sV    ??!!# OM*..}T__/MNO
s
O
s   4AA'c                     | j                   r| j                  |      }n|j                  |       }| j                  ||      S rf   )r  execute_returningr3  handle_resultr8  s      ri   r2  z_WriteQuery._execute
  s<    ??++H5F%%d+F!!(F33rk   c                 *    t         t        |   |      S rf   )r  r  r2  r   r  r  s     ri   r  z_WriteQuery.execute_returning
  s    [$0::rk   c                 @    | j                   r|S |j                  |      S rf   )r  rows_affectedr8  s      ri   r  z_WriteQuery.handle_result
  s!    M%%f--rk   c                 ^    | j                   j                  |j                  | j                   <   y rf   )r_  r
  r?  ro  s     ri   _set_table_aliasz_WriteQuery._set_table_alias
  s     (,

(;(;$**%rk   c                 P    t         t        |   |       | j                  |       |S rf   )r  r  r\  r  r   rp  r  s     ri   r\  z_WriteQuery.__sql__
  s'    k4(- 	c"
rk   rf   r  )r
  r  r  r  r  r  r  r  r  r2  r  r  r  r\  r  r  s   @ri   r  r  
  sH    4. 
YY; ;4;.
< rk   r  c                   N     e Zd Zd fd	Zej
                  d        Z fdZ xZS )rL  c                 J    t        t        | 
  |fi | || _        d | _        y rf   )r  rL  r  r  _from)r   r_  r  r  r  s       ri   r  zUpdate.__init__
  s%    fd$U5f5
rk   c                     || _         y rf   )r  r  s     ri   rp  zUpdate.from_
  s	    
rk   c           
         t         t        |   |       |j                  d      5  |j	                  d       g }t        | j                  j                         |j                        D ]  \  }}t        |t              s0t        |t              r|j                  |      }n?t        |d      }n1t        |t              r!t        |t              r|j                  |      }t        |t              st!        |      }|j#                  t%        |t'        d      |f              |j)                  | j*                        j	                  d      j)                  t-        |             | j.                  rN|j1                  d	      5  |j	                  d
      j)                  t-        | j.                               d d d        | j2                  rC|j5                         5  |j	                  d      j)                  | j2                         d d d        | j7                  |       | j9                  |      cd d d        S # 1 sw Y   xY w# 1 sw Y   @xY w# 1 sw Y   y xY w)NTrh  zUPDATE rF  Fr  r   z SET rb  r  r  )r  rL  r\  r|  rR  sortedr  r   rJ  rg   r  r8   to_valuera   rI   r<   r  r  r  rY   r`  r_  rd  r  rz  r  rx  re  r  )r   rp  r  r   r   r  s        ri   r\  zUpdate.__sql__
  s   fd#C(t, "	-KK	"Kt||1139L9LM ?1!!T*!!U+JJqM!!E25)jO.L 

1A!!U+%a(A""8QC!,<#=>?" c$**oggc-,-zz%%%%8 IKK)--mDJJ.GHI {{%%' <KK	*..t{{;<  %'',E"	- "	-6I I< <?"	- "	-s<   EI4H:8$I+I)I:I	?II	IIrf   )	r
  r  r  r  r  r  rp  r\  r  r  s   @ri   rL  rL  
  s*    
 
YY %- %-rk   rL  c                       e Zd ZdZdZdZ G d de      Zd fd	Zd Z	e
j                  dd       Ze
j                  dd	       Ze
j                  dd
       Ze
j                  d        Zd Zd Zd Zd Zd Zd Z fdZ fdZd Z xZS )rD  r   rr   r   c                       e Zd Zy)Insert.DefaultValuesExceptionNr
  r   rk   ri   DefaultValuesExceptionr    r  rk   r  c                 t    t        t        | 
  |fi | || _        || _        || _        d | _        d| _        y r   )r  rD  r  _insertr/  _on_conflict_query_type_as_rowcount)r   r_  rC  r  rJ  r  r  s         ri   r  zInsert.__init__  s=    fd$U5f5'!rk   c                     t        d      )Nz*INSERT queries cannot have a WHERE clause.r  r  s     ri   r]  zInsert.where  s    !"NOOrk   c                     || _         y rf   )r  )r   r  s     ri   as_rowcountzInsert.as_rowcount"  s
    (rk   c                 8    |rt        d      | _        y d | _        y )NIGNOREr  r	  )r   ignores     ri   on_conflict_ignorezInsert.on_conflict_ignore&  s    4:Jx0rk   c                 8    |rt        d      | _        y d | _        y NrH  r  )r   rm   s     ri   on_conflict_replacezInsert.on_conflict_replace*  s    5<Jy1$rk   c                 <    |s|rt        |i || _        y d | _        y rf   r  r  s      ri   rJ  zInsert.on_conflict.  s#    =AVZ88"& 	rk   c                     | j                   s!| j                         s| j                  d      | j                  | j                   f|      S )NError: no data to insert.)r  get_default_datar  _generate_insertro  s     ri   _simple_insertzInsert._simple_insert3  s?    ||D$9$9$;--.IJJ$$dll_c::rk   c                     i S rf   r   r  s    ri   r  zInsert.get_default_data8  s    	rk   c                     | j                   j                  rQ| j                   j                  D cg c]1  }|| j                   j                  k7  rt        | j                   |      3 c}S y c c}w rf   )r_  r/  r0  r   )r   cols     ri   get_default_columnszInsert.get_default_columns;  sZ    ::8<

8K8K 7djj555 DJJ, 7 7 7s   6A)c                 8   t        |      }| j                  }| j                         }|s	 t        |      }t        |t              s| j                         }|t        d      g }|D ]9  }t        |t              rt        | j                  |      }|j                  |       ; t        |      }	t        |      |	z
  D ]  }
|j                  |
        t        |fd      }t!        j"                  t        |f      |      }ng }t               }|D ]M  }t        |t              rt        | j                  |      }n|}|j                  |       |j%                  |       O |}t        |fd      D ]  }
|
|vs|j                  |
        t               }t               }i }|D ]  }||j&                  g}t        |t(              rr|j&                  |j*                  k7  r|j                  |j*                         |j,                  r|j%                  |       t        |t.              r|j%                  |       |||<    j1                  t3        |            j5                  d       |D cg c]"  }|t        |t(              r|j6                  nd f$ }}g }|D ]  }g }t        |t              }t9        |      D ]j  \  }\  }}	 |r||   D ]	  }	 ||   } n t:        ||   }t        |t@              rt        |tB              r||v rtE        ||d	      }|j                  |       l |j                  t3        |              |s| j                  d
      jG                  d      5  j1                  tI        |            cd d d        S # t        $ r | j                  d      w xY wc c}w # t:        $ r Y w xY w# t:        t<        f$ r? ||v r||   }t?        |      r' |       }n||v rd }nt        d|j&                  z        Y )w xY w# 1 sw Y   y xY w)NzError: no rows to insert.z!Bulk insert must specify columns.c                 &    | j                        S rf   rF  r  rp  s    ri   rj   z)Insert._generate_insert.<locals>.<lambda>a      8H8H8M rk   r   c                 &    | j                        S rf   rF  r#  s    ri   rj   z)Insert._generate_insert.<locals>.<lambda>o  r$  rk   z VALUES zMissing value for %s.F)rf  r  r  Trh  )%r  r/  r  nextStopIterationr  rg   r   r   r   r  r   r_  r  rx  r  r  chainr  r  r8   column_namenullr<   r`  re  rR  r.  	enumerater   r  	callable_r  rI   ra   r|  rd  )r   rC  rp  	rows_iterr  defaultsrf  accumr5  
column_setr  clean_columnsseen
column_obj	fk_fieldsnullable_columnsvalue_lookupslookupscolumns_converters
all_valuesr\  is_dictr  rf  lookupvals     `                       ri   r  zInsert._generate_insert@  s    L	-- ((* O9o c7+224?$%HII ! )F!&#.!(V!<LL() !Z
MJ6 &CLL%& !,MN!cVi@IM5D! %fc*!(V!<J!'J$$Z0$% $Gh,MN (d?NN3'( E	5 		,Fv{{+G&%(;;&"4"44NN6#5#56;;$((0fo6MM&)$+M&!		, 	 )*22:> "# 
65(AV__tL# # 
 #	8CF g.G*34F*G #&&FIP '4F&; +F(&)&k"'	+ #+N!!f "#t,C1G1791DyGCc"=#@ .v67G#	8J --.IJJt, 	677=45	6 	6G ! O112MNNOl#& $,1T1 !*- P)&v.$S>"%%C#33"()@6;;)NOOP(	6 	6sT   N .'N+
N?N0N?)PN(0	N<	9N?;N<	<N??A
PPPc                     | j                   r3|j                  t        | j                               j                  d       |j                  | j                        S r   )r/  r`  re  rR  r  ro  s     ri   _query_insertzInsert._query_insert  s=    ==GG$T]]34<<SAwwt||$$rk   c                 r    | j                   s|j                  d      S | j                   j                  |      S NzDEFAULT VALUES)r  rR  default_values_insertro  s     ri   _default_valueszInsert._default_values  s.    ~~;;/00~~33C88rk   c                 @   t         t        |   |       |j                         5  d }| j                  | j                  j                  ||       }|j                  |xs t        d            j                  d      j                  | j                        j                  d       t        | j                  t              r4| j                  s(	 | j                  |       t        j"                  | _        nxt        | j                  t&        t        f      r'| j)                  |       t        j*                  | _        n1| j-                  | j                  |       t        j.                  | _        | j                  P| j                  j1                  ||       }|2 |d      5  |j                  d      j                  |       d d d        | j3                  |      cd d d        S # | j                  $ r | j!                  |       Y 'w xY w# 1 sw Y   JxY w# 1 sw Y   y xY w)NINSERTz INTO r   Trh  )r  rD  r\  r|  r	  r  r`  rY   rR  r_  rg   r  r   r/  r  r  rB  SIMPLEr
  rq  r>  QUERYr  MULTIr  r  )r   rp  stmtr  r  s       ri   r\  zInsert.__sql__  s   fd#C( 	-D  ,((??TJc$'#h-(ghc$**ogcl$,,0.'', $*== DLL;*<=""3'#)<< %%dllC8#)<<   ,**>>sDI%d+ 5C(,,V45 '',=	- 	- 22 .((-.5 57	- 	-sI   B&HG!CH!H?H! HHHHH	HHc                 T   | j                   r| j                  sgd | _        n_| j                  S|j                  rG| j                  j
                  r1| j                  j                  f| _        t        j                  | _	        	 t        t        | 3  |      S # | j                  $ r Y y w xY wrf   )r  r  r  returning_clauser_  r0  r3  r  r}  r  r  rD  r2  r  r  s     ri   r2  zInsert._execute  s    &&"&__$)B)B((#zz557DO YYDN	/99** 		s   B B'&B'c                     | j                   r|S | j                  r|j                  |      S |j                  || j                        S rf   )r  r  r  last_insert_idr
  r8  s      ri   r  zInsert.handle_result  sC    M))&11&&vt/?/?@@rk   r  r  )r
  r  r  rE  rF  rG  	Exceptionr  r  r]  r  r  r  r  r  rJ  r  r  r   r  r>  rB  r\  r2  r  r  r  s   @ri   rD  rD    s    FEE11"P 
YY) ) 
YYE E 
YYG G 
YY( (;
7
p6d%
9
 -DArk   rD  c                        e Zd Z fdZ xZS )rN  c                    t         t        |   |       |j                  d      5  |j	                  d      j                  | j                         | j                  C|j                         5  |j	                  d      j                  | j                         d d d        | j                  |       | j                  |      cd d d        S # 1 sw Y   4xY w# 1 sw Y   y xY w)NTrh  DELETE FROM r  )r  rN  r\  r|  rR  r`  r_  r  rx  re  r  r  s     ri   r\  zDelete.__sql__  s    fd#C(t, 	-KK'++DJJ7{{&%%' <KK	*..t{{;<   %'',	- 	-< <	- 	-s$   AC.+C)CC	CC!)r
  r  r  r\  r  r  s   @ri   rN  rN    s    
- 
-rk   rN  c                       e Zd Z	 	 ddZej
                  d	d       Zej
                  d        Zej
                  d
d       Zej
                  d
d       Z	d Z
y)r?   Nc	                     || _         t        |t              st        |      n|| _        || _        || _        || _        || _        || _	        || _
        | j                  | j                  st        d      y y Nz-NULLS DISTINCT is only available with UNIQUE.)r  rg   r[   r6   _table_expressionsr  _unique_safe_using_nulls_distinctr   )	r   r  r_  r  uniquesafer]  usingnulls_distincts	            ri   r  zIndex.__init__  sr    
+5eU+CfUm'
-+DLLLMM 5A+rk   c                     || _         y rf   )rW  )r   rW  s     ri   r[  z
Index.safe  s	    
rk   c                 z    | j                   | j                   f|z   }t        t        j                  |      | _         y rf   r  r  s     ri   r]  zIndex.where  r  rk   c                     || _         y rf   )rX  )r   rX  s     ri   r\  zIndex.using  s	    rk   c                 D    || j                   st        d      || _        y rS  )rV  r   rY  )r   r]  s     ri   r]  zIndex.nulls_distinct  s"    %dllLMM-rk   c                    | j                   rdnd}|j                  d      5  |j                  |       | j                  r|j                  d       |j                  j
                  rzt        | j                  t              r`| j                  j                  rJt        | j                  j                  | j                        }t        | j                  j                        }n!t        | j                        }| j                  }|j                  |       | j                  4|j                  j                  r|j                  d| j                  z         |j                  d      j                  |      j                  d       | j                  4|j                  j                  s|j                  d	| j                  z         |j                  t!        | j"                  D cg c]  }t        |t$              rt'        |      n|! c}             | j(                  |j                  | j(                  rd
nd       | j*                  *|j                  d      j                  | j*                         d d d        |S c c}w # 1 sw Y   |S xY w)NzCREATE UNIQUE INDEX zCREATE INDEX Trh  IF NOT EXISTS z	 USING %srY  r   z	USING %s z NULLS DISTINCTz NULLS NOT DISTINCTr  )rV  r|  rR  rW  r@  index_schema_prefixrg   rT  r[   r1  r6   r  r
  r`  rX  index_using_precedes_tablere  rU  r  rY   rY  r  )r   rp  	statement
index_name
table_namer  s         ri   r\  zIndex.__sql__$  s   .2ll*	t, %	8KK	"zz,- yy,,$++u-$++2E2E#DKK$7$7D
#DKK$8$89
#DJJ/
![[
GGJ{{&yy33K$++56gfoc*ogcl{{&yy33K$++56GG$ --&/ (c2D	<&/ 0 1 ##/1E1E-13{{&I&**4;;7K%	8N 
&/;%	8N 
s   F>J !$I;A,J ;J  J
)FFNNNr  rf   )r
  r  r  r  r  r  r[  r]  r\  r]  r\  r   rk   ri   r?   r?     ss    DI8<N 
YY  
YY9 9
 
YY  
YY. .
)rk   r?   c                   *     e Zd Z	 	 d fd	Zd Z xZS )rJ   c	           
          || _         || j                  ||      }|1|D ],  }	t        |	t              st	        |	d      s!|	j
                  }. t        t        | #  ||j                  j                  ||||||       y )N
index_type)r  r_  r  rZ  r[  r]  r\  r]  )r(  _generate_name_from_fieldsrg   r8   r  rk  r  rJ   r  r^  r_  )r   ro  fieldsrZ  r[  r]  r\  r  r]  fieldr  s             ri   r  zModelIndex.__init__Q  s    <225&AD= -eU+|0L!,,E- 	j$(++##) 	) 	+rk   c                 0   g }|D ]  }t        |t              r#|j                  |j                         d          6t        |t              r t        |t
              s|j                         }t        |t
              sw|j                  |j                          |st        d      t        j                  dddj                  |            }|j                  }|j                  r|j                  n|j                  }t!        dj                  ||f            S )Nr   zJUnable to generate a name for the index, please explicitly specify a name.[^\w]+rh  r  )rg   r  r  r   r  r8   r  r)  r   rw   r  r  r^  legacy_table_namesr  rh  _truncate_constraint_name)r   ro  rm  r/  rn  clean_field_namesmetaprefixs           ri   rl  z%ModelIndex._generate_name_from_fieldsd  s     	4E%%U[[]1-.eT*:eU3K!LLNEeU+LL!2!23	4  : ; ; FF9b#((5/B{{"554??(6;L2M)NOOrk   )FTNNNN)r
  r  r  r  rl  r  r  s   @ri   rJ   rJ   P  s    EI7;+&Prk   rJ   c                     t        |       |kD  rBt        j                  | j                  d            j	                         }| d |dz
   d|d d } | S )Nutf-8r  r     )r   hashlibmd5encode	hexdigest)rH  maxlen	name_hashs      ri   rr  rr  y  sQ    
:KK
 1 1' :;EEG	 *=VaZ 99Ra=I
rk   c                       e Zd Zd Zd Zd Zd Zed        ZddZ	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)BaseJSONMethodsc                     || _         y rf   r  r:  s     ri   r  zBaseJSONMethods.__init__  s	     rk   c                     fd}|S )Nc                 f    t        | t              r		  |       S | S # t        t        f$ r Y | S w xY wrf   )rg   r  r   r   )r   r   s    ri   readerz1BaseJSONMethods.make_value_reader.<locals>.reader  sA    %% <' L ":. Ls    00r   )r   r   r  s    ` ri   make_value_readerz!BaseJSONMethods.make_value_reader  s    	 rk   c                 $    |j                  |      S rf   )r.  r   rn  r   s      ri   compare_valuezBaseJSONMethods.compare_value  s    ~~e$$rk   c                 :    t        |j                  |      d      S NFre  )ra   _dumpsr  s      ri   _contains_valuezBaseJSONMethods._contains_value  s    U\\%(E::rk   c                      | dk  rd| z  S d| z  S )Nr   z[#%d][%d]r   r  s    ri   _path_indexzBaseJSONMethods._path_index  s     #aw}9Vc\9rk   c                 P   dg}|D ]r  }t        |t              r!|j                  | j                  |             4t	        |      j                  dd      j                  dd      }|j                  d|z         t |j                  |       t        dj                  |      d	      S )
N$r  r  ru   z\"z."%s"rh  Fre  )rg   r   r  r  r  rm   ra   r  )r   keyssuffixr  r   s        ri   r  zBaseJSONMethods._path  s     	*A!S!T--a01FNN4088eDWq[)	* 	VRWWU^u55rk   c                     t         rf   r  r   rn  r  s      ri   extractzBaseJSONMethods.extract  r  rk   c                     t         rf   r  r  s      ri   extract_textzBaseJSONMethods.extract_text  r  rk   c                     t         rf   r  r   r   s     ri   	cast_typezBaseJSONMethods.cast_type  r  rk   c                      y rf   r   r  s      ri   cast_for_casezBaseJSONMethods.cast_for_case  s     rk   c                     t         rf   r  r   rn  r  r   s       ri   rx  zBaseJSONMethods.set  r  rk   c                     t         rf   r  r  s       ri   rC  zBaseJSONMethods.insert  r  rk   c                     t         rf   r  r  s       ri   rm   zBaseJSONMethods.replace  r  rk   c                     t         rf   r  r  s       ri   r  zBaseJSONMethods.append  r  rk   c                     t         rf   r  r  s      ri   removezBaseJSONMethods.remove  r  rk   c                     t         rf   r  r  s      ri   r  zBaseJSONMethods.update  r  rk   c                     t         rf   r  r  s      ri   lengthzBaseJSONMethods.length  r  rk   c                     t         rf   r  r  s       ri   rP  zBaseJSONMethods.contains  r  rk   c                     t         rf   r  r  s       ri   contained_byzBaseJSONMethods.contained_by  r  rk   c                     t         rf   r  )r   rn  r  rF  s       ri   has_keyzBaseJSONMethods.has_key  r  rk   c                     t         rf   r  r   rn  r  key_lists       ri   has_keyszBaseJSONMethods.has_keys  r  rk   c                     t         rf   r  r  s       ri   has_any_keyszBaseJSONMethods.has_any_keys  r  rk   N)rh  )r
  r  r  r  r  r  r  r  r  r  r  r  r  r  rx  rC  rm   r  r  r  r  rP  r  r  r  r  r   rk   ri   r  r    s    !%; : :	6"""
""""""""""""rk   r  c                        e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )SqliteJSONMethodsc                 T    t         t        |   |       t        dk  rt	        d      y )N)r{   &   r   z!JSONField requires Sqlite >= 3.38)r  r  r  __sqlite_version__rL   r  s     ri   r  zSqliteJSONMethods.__init__  s,    /9
*#$GHH +rk   c                     fd}|S )Nc                 :    t         j                   |             S rf   )r;   r   )r   dumpss    ri   wrapperz5SqliteJSONMethods.make_value_wrapper.<locals>.wrapper  s    775<((rk   r   r   r  r  s    ` ri   make_value_wrapperz$SqliteJSONMethods.make_value_wrapper  s    	)rk   c                     | t         j                  t        dd            S t        |t        t
        t        f      r$t         j                  |j                  |            S |S )Nr*  Fre  )r;   r   ra   rg   r   r   r   r  r  s      ri   _wrap_valuezSqliteJSONMethods._wrap_value  sM    
 =77559::edD$/0775<<.//rk   c                 B    |rt        |d| j                  |            S |S )Nz->rC  r  r  s      ri   r  zSqliteJSONMethods.extract  s!    <@z%tzz$'78KeKrk   c                 B    |rt        |d| j                  |            S |S )Nz->>r  r  s      ri   r  zSqliteJSONMethods.extract_text  s!    =Az%

4(89LuLrk   c                     ddd|   S )Nr]  rj  r   floatr   r  s     ri   r  zSqliteJSONMethods.cast_type  s     62155rk   c                 n    t         j                  || j                  |      | j                  ||            S rf   r;   json_setr  r  r  s       ri   rx  zSqliteJSONMethods.set  s2    {{JJtUE*, 	,rk   c                 n    t         j                  || j                  |      | j                  ||            S rf   )r;   json_insertr  r  r  s       ri   rC  zSqliteJSONMethods.insert  s2    ~~JJtUE*, 	,rk   c                 n    t         j                  || j                  |      | j                  ||            S rf   )r;   json_replacer  r  r  s       ri   rm   zSqliteJSONMethods.replace  s2    JJtUE*, 	,rk   c                 p    t         j                  || j                  |d      | j                  ||            S )Nz[#]r  r  s       ri   r  zSqliteJSONMethods.append  s4    {{JJtU#UE*, 	,rk   c                 L    t         j                  || j                  |            S rf   )r;   json_remover  r  s      ri   r  zSqliteJSONMethods.remove      ~~eTZZ%566rk   c                 z    |r%t         j                  || j                  |            S t         j                  |      S rf   )r;   json_array_lengthr  r  s      ri   r  zSqliteJSONMethods.length  s2    ''tzz$/?@@##E**rk   c                 r    t         j                  |t         j                  |j                  |                  S rf   )r;   
json_patchr   r  r  s      ri   r  zSqliteJSONMethods.update
  s%    }}UBGGELL,?$@AArk   c                     t         j                  | j                  ||      | j                  ||            }t	        |t
        j                  d      S r  )r;   _pw_json_containsr  r  rC  rM   r  r   rn  r  r   calls        ri   rP  zSqliteJSONMethods.contains  sC    ##DLL$=$($8$8$FH$q))rk   c                     t         j                  | j                  ||      | j                  ||            }t	        |t
        j                  d      S r  )r;   r  r  r  rC  rM   r  r  s        ri   r  zSqliteJSONMethods.contained_by  sB    ##D$8$8$F$(LL$=?$q))rk   c                     | j                  t        |      |fz         }t        t        j	                  ||      t
        j                  d       S rf   )r  r  rC  r;   	json_typerM   r+  )r   rn  r  rF  r  s        ri   r  zSqliteJSONMethods.has_key  s9    zz%+./",,ud3RYYEErk   c                 ~    t        t        j                  |D cg c]  }| j                  |||       c}      S c c}w rf   )r
   r   r  r  r   rn  r  r  r   s        ri   r  zSqliteJSONMethods.has_keys  s5    hmm=EFt||E43FH 	HF   :
c                 ~    t        t        j                  |D cg c]  }| j                  |||       c}      S c c}w rf   )r
   r   rW  r  r  s        ri   r  zSqliteJSONMethods.has_any_keys!  s5    hll=EFt||E43FH 	HFr  )r
  r  r  r  r  r  r  r  r  rx  rC  rm   r  r  r  r  rP  r  r  r  r  r  r  s   @ri   r  r    sd    I

	LM6,,,,7+
B*
*
F
HHrk   r  c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)PostgresqlJSONMethodsc                     | j                   }|j                  }|j                  |j                  f|j                  fd}|S )Nc                 4    t        |       r| S  |       S N)r  )rg   )r   r  
json_types	jsonb_clss    ri   r  z9PostgresqlJSONMethods.make_value_wrapper.<locals>.wrapper+  s    %,U%00rk   )r  _adapterr  
jsonb_type)r   r  r  adapterr  r  r  s    `   @@ri   r  z(PostgresqlJSONMethods.make_value_wrapper&  sB    ]]++''););<
&&		1 rk   c                     d S )Nc                     | S rf   r   r  s    ri   rj   z9PostgresqlJSONMethods.make_value_reader.<locals>.<lambda>4  s     rk   r   r   r   s     ri   r  z'PostgresqlJSONMethods.make_value_reader1  s
     rk   c                     | j                   j                  }|j                  }t        ||j                  |f      r|S  |||j
                        S r  )r  r  r  rg   r  r  )r   rn  r   r  r  s        ri   _jsonb_wrapz!PostgresqlJSONMethods._jsonb_wrap6  sG    --((&&	eg//;<Lell33rk   c                 h    |D cg c]  }t        |       }}t        t        |d      d      S c c}w )NFztext[])r  r!   r   )r   r  r   r  s       ri   _path_arrayz!PostgresqlJSONMethods._path_array=  s2    !%&AQ&&D&11 's   /c                 B    |s|S t        |d| j                  |            S )Nz#>rC  r  r  s      ri   r  zPostgresqlJSONMethods.extractB  s$    L%t'7'7'=>>rk   c                 B    |s|S t        |d| j                  |            S )Nz#>>r  r  s      ri   r  z"PostgresqlJSONMethods.extract_textG  s$    L%(8(8(>??rk   c                     ddd|   S )Nr]  DOUBLE PRECISIONr  r   r  s     ri   r  zPostgresqlJSONMethods.cast_typeL  s     +=>qAArk   c                 J    t        t        |j                  |            d      S )NJSONB)r!   ra   r  r  s      ri   r  z#PostgresqlJSONMethods.cast_for_caseO  s    E%,,u-.88rk   c                 p    t         j                  || j                  |      | j                  ||      d      S rw  r;   	jsonb_setr  r  r  s       ri   rx  zPostgresqlJSONMethods.setR  s7    ||T"UE*	 	rk   c                     t        d | j                  ||      j                         t        j	                  || j                  |      | j                  ||      d      fg|      S rw  )r    r  r[  r;   r  r  r  r  s       ri   rC  zPostgresqlJSONMethods.insertZ  sh     D\\%&..0\\%!1!1$!7**5%8$@A
 	 	rk   c                 p    t         j                  || j                  |      | j                  ||      d      S r   r  r  s       ri   rm   zPostgresqlJSONMethods.replacec  s7    ||T"UE*	 	rk   c                     t         j                  || j                  t        |      dgz         | j	                  ||      d      S )Nz-1T)r;   jsonb_insertr  r   r  r  s       ri   r  zPostgresqlJSONMethods.appendj  sB    T$Z4&01UE*	 	rk   c                 :    t        |d| j                  |            S )Nz#-r  r  s      ri   r  zPostgresqlJSONMethods.removeq  s    %t'7'7'=>>rk   c                 z    |r%t         j                  | j                  ||            S t         j                  |      S rf   )r;   jsonb_array_lengthr  r  s      ri   r  zPostgresqlJSONMethods.lengtht  s2    ((eT)BCC$$U++rk   c                 <    t        |d| j                  ||            S )Nr2  )rC  r  r  s      ri   r  zPostgresqlJSONMethods.updatey  s    %t'7'7u'EFFrk   c                 `    | j                  ||      }t        |d| j                  ||            S )Nz@>r  rC  r  r   rn  r  r   rS  s        ri   rP  zPostgresqlJSONMethods.contains}  .    ll5$'#tT%5%5eU%CDDrk   c                 `    | j                  ||      }t        |d| j                  ||            S )Nz<@r  r  s        ri   r  z"PostgresqlJSONMethods.contained_by  r  rk   c                 V    | j                  ||      }t        |dt        |d            S )Nrg  Fre  )r  rC  ra   )r   rn  r  rF  rS  s        ri   r  zPostgresqlJSONMethods.has_key  s(    ll5$'#sE#$?@@rk   c           	      f    | j                  ||      }t        |dt        t        |      d            S )Nz?&Fr  rC  r   r   r   rn  r  r  rS  s        ri   r  zPostgresqlJSONMethods.has_keys  ,    ll5$'#tT$x.%%@AArk   c           	      f    | j                  ||      }t        |dt        t        |      d            S )Nz?|Fr  r  s        ri   r  z"PostgresqlJSONMethods.has_any_keys  r  rk   N)r
  r  r  r  r  r  r  r  r  r  r  rx  rC  rm   r  r  r  r  rP  r  r  r  r  r   rk   ri   r  r  %  sn    	
42
?
@
B9?,
GEEABBrk   r  c                       e Zd ZddZd Zed        Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)MySQLJSONMethodsc                 x    | j                   j                  r|rt        j                  |      S |S t	        |d      S )NJSON)r  mariadbr;   JSON_COMPACTr!   )r   rt  compacts      ri   _as_jsonzMySQLJSONMethods._as_json  s2    ==  ,32??4(==D&!!rk   c                       fd}|S )Nc                 L    j                  t         |       d      d      S )NFre  )r  )r  ra   )r   r  r   s    ri   r  z4MySQLJSONMethods.make_value_wrapper.<locals>.wrapper  s)    ==uU|u!E). ! 0 0rk   r   r  s   `` ri   r  z#MySQLJSONMethods.make_value_wrapper  s    	0 rk   c                 4    | dk  r| dk(  rdS d| dz   z  S d| z  S )Nr   rs   z[last]z[last%d]rr   r  r   r  s    ri   r  zMySQLJSONMethods._path_index  s-    7"by8DjC!G.DD|rk   c                 r    |s|S | j                  t        j                  || j                  |                  S rf   )r  r;   json_extractr  r  s      ri   r  zMySQLJSONMethods.extract  s-    L}}R__UDJJt4DEFFrk   c                 z    |s|S t         j                  t         j                  || j                  |                  S rf   )r;   json_unquoter  r  r  s      ri   r  zMySQLJSONMethods.extract_text  s-    Lrudjj6FGHHrk   c                     ddd|   S )NSIGNEDri  r  r   r  s     ri   r  zMySQLJSONMethods.cast_type  s    (3A66rk   c                     | t        |t        t        t        t        f      r!| j                  | j                  ||            S t        |d      S r  )rg   r   r   r   r  r  r  ra   r  s      ri   _json_valuezMySQLJSONMethods._json_value  sD    
 =JutT4.GH==!5!5eU!CDDUe,,rk   c                 l    |t        |t              r|S | j                  | j                  ||            S rf   )rg   r  r  r  r  s      ri   r  zMySQLJSONMethods.compare_value  s3     =Jud3L}}T11%?@@rk   c                 n    t         j                  || j                  |      | j                  ||            S rf   )r;   JSON_SETr  r"  r  s       ri   rx  zMySQLJSONMethods.set  s0    {{5$**T"2++E59; 	;rk   c                 n    t         j                  || j                  |      | j                  ||            S rf   )r;   JSON_INSERTr  r"  r  s       ri   rC  zMySQLJSONMethods.insert  s0    ~~eTZZ%5"..ue<> 	>rk   c                 n    t         j                  || j                  |      | j                  ||            S rf   )r;   JSON_REPLACEr  r"  r  s       ri   rm   zMySQLJSONMethods.replace  s0    udjj&6#//u=? 	?rk   c                 n    t         j                  || j                  |      | j                  ||            S rf   )r;   JSON_ARRAY_APPENDr  r"  r  s       ri   r  zMySQLJSONMethods.append  s4    ##E4::d+;$($4$4UE$BD 	Drk   c                 L    t         j                  || j                  |            S rf   )r;   JSON_REMOVEr  r  s      ri   r  zMySQLJSONMethods.remove  r  rk   c                 z    |r%t         j                  || j                  |            S t         j                  |      S rf   )r;   JSON_LENGTHr  r  s      ri   r  zMySQLJSONMethods.length  s.    >>%D)9::~~e$$rk   c                 N    t         j                  || j                  ||            S rf   )r;   JSON_MERGE_PATCHr"  r  s      ri   r  zMySQLJSONMethods.update  s$     ""5$*:*:5%*HIIrk   c                     |r| j                  |      fnd}t        j                  || j                  ||      g| }t	        |t
        j                  d      S )Nr   rr   )r  r;   JSON_CONTAINSr  rC  rM   r  )r   rn  r  r   	path_argsr  s         ri   rP  zMySQLJSONMethods.contains  sU     ,0TZZ%'R	t';';E5'I ,!*,$q))rk   c                     |r| j                  ||      n|}t        j                  | j                  ||      |      }t	        |t
        j                  d      S r  )r  r;   r3  r  rC  rM   r  )r   rn  r  r   rS  r  s         ri   r  zMySQLJSONMethods.contained_by  sH    +/dll5$'U 4 4UE BCH$q))rk   c                     | j                  t        |      |fz         }t        j                  |d|      }t	        |t
        j                  d      S Nonerr   r  r  r;   JSON_CONTAINS_PATHrC  rM   r  )r   rn  r  rF  r  r  s         ri   r  zMySQLJSONMethods.has_key  sB    zz%+./$$UE48$q))rk   c                     |D cg c]   }| j                  t        |      |fz         " }}t        j                  |dg| }t	        |t
        j                  d      S c c}w )Nr   rr   r9  r   rn  r  r  r   pathsr  s          ri   r  zMySQLJSONMethods.has_keys  Y    9ABAE$K1$./BB$$UE:E:$q)) C   %Ac                     |D cg c]   }| j                  t        |      |fz         " }}t        j                  |dg| }t	        |t
        j                  d      S c c}w r7  r9  r<  s          ri   r  zMySQLJSONMethods.has_any_keys  r>  r?  Nr  )r
  r  r  r  r  r  r  r  r  r  r"  r  rx  rC  rm   r  r  r  r  rP  r  r  r  r  r   rk   ri   r  r    sz    "  
GI
7-A;>?D7%
J
**
*
*
*rk   r  c                        e Zd Z fdZ xZS )PeeweeExceptionc                 p    |r#t        |d   t              r|d   |dd  c| _        }t        t        |   |  y r?  )rg   rM  origr  rB  r  )r   r  r  s     ri   r  zPeeweeException.__init__   s9    JtAw	2"1gtABxODItot-t4rk   r
  r  r  r  r  r  s   @ri   rB  rB    s    5 5rk   rB  c                       e Zd Zy)r>   Nr
  r   rk   ri   r>   r>     r  rk   r>   c                       e Zd Zy)r)   Nr
  r   rk   ri   r)   r)     r  rk   r)   c                       e Zd Zy)r+   Nr
  r   rk   ri   r+   r+     r  rk   r+   c                       e Zd Zy)rA   Nr
  r   rk   ri   rA   rA     r  rk   rA   c                       e Zd Zy)rB   Nr
  r   rk   ri   rB   rB     r  rk   rB   c                       e Zd Zy)rC   Nr
  r   rk   ri   rC   rC   	  r  rk   rC   c                       e Zd Zy)rL   Nr
  r   rk   ri   rL   rL   
  r  rk   rL   c                       e Zd Zy)rN   Nr
  r   rk   ri   rN   rN     r  rk   rN   c                       e Zd Zy)rS   Nr
  r   rk   ri   rS   rS     r  rk   rS   c                   "    e Zd ZdZd Zd Zd Zy)ExceptionWrapper
exceptionsc                     || _         y rf   rQ  )r   rR  s     ri   r  zExceptionWrapper.__init__  s	    $rk   c                      y rf   r   r  s    ri   r  zExceptionWrapper.__enter__      rk   c                    |y |j                   | j                  vr|j                  d   }|j                   | j                  v r=| j                  |j                      }|j                  } ||g| j	                  |      y r  )r
  rR  	__bases__r  with_traceback)r   rV  	exc_value	tracebacknew_typeexc_argss         ri   r  zExceptionWrapper.__exit__  s|    DOO3))!,H/x'8'89H ~~H90x0??	JJ 0rk   N)r
  r  r  r  r  r  r  r   rk   ri   rP  rP    s    I%Krk   rP  ConstraintError!IntegrityConstraintViolationErrorInternalClientErrorPostgresConnectionErrorSyntaxOrAccessErrorTransactionRollbackErrorUndefinedFunctionUniqueViolationIndexMetadata)r  r`  r  rZ  r_  ColumnMetadata)r  	data_typer*  r3  r_  r  	full_typeidentityr   )r.  ForeignKeyMetadata)r5  
dest_tabledest_columnr_  r  	on_delete	on_updater  ViewMetadata)r  r`  c                   *     e Zd Z fdZd Zd Z xZS )_ConnectionStatec                 L    t        t        | 
  di | | j                          y rB  )r  rq  r  reset)r   r  r  s     ri   r  z_ConnectionState.__init__F  s    .88

rk   c                 <    d| _         d | _        g | _        g | _        y rw  )closedconnrp  transactionsr  s    ri   rs  z_ConnectionState.resetJ  s    	rk   c                 <    || _         d| _        g | _        g | _        y r   )rv  ru  rp  rw  r   rv  s     ri   set_connectionz_ConnectionState.set_connectionP  s    	rk   )r
  r  r  r  rs  rz  r  r  s   @ri   rq  rq  E  s    rk   rq  c                       e Zd Zy)_ConnectionLocalNr
  r   rk   ri   r|  r|  W  r  rk   r|  c                       e Zd ZdZd Zd Zy)	_NoopLockr   c                     | S rf   r   r  s    ri   r  z_NoopLock.__enter__Z  s    rk   c                      y rf   r   rU  s       ri   r  z_NoopLock.__exit__[  rU  rk   N)r
  r  r  r  r  r  r   rk   ri   r~  r~  X  s    I$7rk   r~  c                   (    e Zd ZdZd Zd Zd Zd Zy)r  r  c                     || _         y rf   r  r   r  s     ri   r  zConnectionContext.__init__`  	    rk   c                     | j                   j                         r| j                   j                          | j                   j                  j                  j                  |        y rf   )r  	is_closedconnect_staterp  r  r  s    ri   r  zConnectionContext.__enter__b  s<    77GGOO!!$'rk   c                     | j                   j                  j                  j                          | j                   j                  j                  s| j                   j	                          y y rf   )r  r  rp  r  closerU  s       ri   r  zConnectionContext.__exit__f  s?     ww~~!!GGMMO "rk   c                 2     t               fd       }|S )Nc                  j    t        j                        5   | i |cd d d        S # 1 sw Y   y xY wrf   )r  r  r  s     ri   r  z)ConnectionContext.__call__.<locals>.innerk  s1    "477+ +4*6*+ + +   )2r   r  s   `` ri   r  zConnectionContext.__call__j  r  rk   N)r
  r  r  r  r  r  r  r  r   rk   ri   r  r  ^  s    I(rk   r  c                      e Zd ZeZi Zi ZdZdZdZ	e
ZeZdZdZdZdZdZdZdZdZdZdZdZ	 	 	 dEdZd Zd Zd	 Zd
 Zd Zd ZdFdZ d Z!d Z"d Z#d Z$d Z%d Z&d Z'dGdZ(dGdZ)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2dGd Z3d! Z4d" Z5d# Z6d$ Z7d% Z8d& Z9d' Z:d( Z;d) Z<d* Z=d+ Z>d, Z?d- Z@d. ZAd/ ZBd0 ZCd1 ZDd2 ZEdGd3ZFdGd4ZGdGd5ZHdGd6ZIdGd7ZJdGd8ZKd9 ZLd: ZMd; ZNd< ZOd= ZPd> ZQd? ZRd@ ZSdHdAZTdHdBZUdC ZVeWdD        ZXy)Ir(   rg  rt   NFTc                 
   t        t        | j                        | _        t        t        | j
                        | _        |r| j                  j                  |       |r| j                  j                  |       || _        || _	        |r)t               | _        t        j                         | _        nt               | _        t!               | _        |rt#        d       |t#        d       i | _         | j&                  |fi | y )NzPeewee no longer uses the "autorollback" option, as we always run in autocommit-mode now. This changes psycopg2's semantics so that the conn is not left in a transaction-aborted state.a^  Peewee no longer uses the "autocommit" option, as the semantics now require it to always be True. Because some database-drivers also use the "autocommit" parameter, you are receiving a warning so you may update your code and remove the parameter, as in the future, specifying autocommit could impact the behavior of the database driver you are using.)r  FIELDfield_types_field_typesrM   r  _operationsr  autoconnectthread_safer|  r  	threadingLock_lockrq  r~  r   connect_paramsinit)	r   r  r  autorollbackr  r  
autocommitr  r  s	            ri   r  zDatabase.__init__  s     'ud.>.>?%b$//:$$[1##J/&&*,DK")DJ*,DK"DJ I J
 ! < = !		(%f%rk   c                     | j                         s| j                          || _        | j                  j	                  |       t        |       | _        y rf   )r  r  r  r  r  r   deferred)r   r  r  s      ri   r  zDatabase.init  s>    ~~JJL ""6* N*rk   c                     | S rf   r   r   memos     ri   __deepcopy__zDatabase.__deepcopy__  s    rk   c                     | j                         r| j                          | j                         }| j                  j                  j                  |       |j                          | S rf   )r  r  r  r  rp  r  r  ro  s     ri   r  zDatabase.__enter__  sD    >>LLNkkms#rk   c                    | j                   j                  j                         }	 |j                  |||       | j                   j                  s| j	                          y y # | j                   j                  s| j	                          w w xY wrf   )r  rp  r  r  r  )r   rV  rW  rX  rp  s        ri   r  zDatabase.__exit__  s`    kkoo!!#	LL7F3;;??

 #4;;??

 #s   A! !)B
c                     t        |       S rf   r  r  s    ri   r  zDatabase.connection_context  r  rk   c                     t         rf   r  r  s    ri   _connectzDatabase._connect  r  rk   c                 6   | j                   5  | j                  rt        d      | j                  j                  s|r
	 d d d        yt        d      | j                  j                          t        5  | j                  j                  | j                                | j                  %| j                  | j                  j                         | j                  | j                  j                         d d d        d d d        y# 1 sw Y   xY w# 1 sw Y   yxY w)N@Error, database must be initialized before opening a connection.FzConnection already opened.T)r  r  rB   r  ru  rN   rs  __exception_wrapper__rz  r  server_version_set_server_versionrv  _initialize_connection)r   reuse_if_opens     ri   r  zDatabase.connect  s    ZZ 	>}}$ &D E E;;%%  	> 	> ''CDDKK& >**4==?;&&.,,T[[-=-=>++DKK,<,<=	>	> > >	> s*   1D+D2B D2DD	DDc                      y rf   r   ry  s     ri   r  zDatabase._initialize_connection      rk   c                     d| _         y r  r  ry  s     ri   r  zDatabase._set_server_version  s
    rk   c                    | j                   5  | j                  rt        d      | j                         rt	        d      | j
                  j                   }	 |r4t        5  | j                  | j
                  j                         d d d        | j
                  j                          |cd d d        S # 1 sw Y   .xY w# | j
                  j                          w xY w# 1 sw Y   y xY w)Nr  z7Attempting to close database while transaction is open.)r  r  rB   in_transactionrN   r  ru  r  _closerv  rs  )r   is_opens     ri   r  zDatabase.close  s    ZZ 	}}$ &D E E""$& (> ? ?++,,,G$. 6DKK$4$456 !!#	 	6 6 !!#	 	s<   A
CB? &B3B?C3B<	8B??CCC'c                 $    |j                          y rf   )r  ry  s     ri   r  zDatabase._close  s    

rk   c                 .    | j                   j                  S rf   r  ru  r  s    ri   r  zDatabase.is_closed  s    {{!!!rk   c                 0    | j                   j                   S rf   r  r  s    ri   is_connection_usablezDatabase.is_connection_usable  s    ;;%%%%rk   c                 n    | j                         r| j                          | j                  j                  S rf   )r  r  r  rv  r  s    ri   
connectionzDatabase.connection  s%    >>LLN{{rk   c                     | j                         r(| j                  r| j                          nt        d      | j                  j
                  j                         S )Nz&Error, database connection not opened.)r  r  r  rB   r  rv  r+  )r   named_cursors     ri   r+  zDatabase.cursor  sC    >>$%MNN{{&&((rk   c                     t         j                  t        j                        rt         j	                  ||f       t
        5  | j                         }|j                  ||xs d       d d d        |S # 1 sw Y   S xY wrB  )loggerisEnabledForloggingDEBUGdebugr  r+  r3  )r   r`  r  r+  s       ri   execute_sqlzDatabase.execute_sql  sb    w}}-LL#v'" 	.[[]FNN3"-	. 	. s   'A22A<c                      | j                   di |}|j                  |      j                         \  }}| j                  ||      S rB  )r  r`  rr  r  )r   rr  context_optionsrp  r`  r  s         ri   r3  zDatabase.execute  sD    "d""5_5ggen**,VV,,rk   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                  dS )N)r  r  rk  r  r  r  r  r  rd  re  rd  r   )r  r  rk  r  r  r  r  r  rd  re  rd  r   r  s    ri   get_context_optionszDatabase.get_context_options  sp    ,,**ZZZZ+/+K+K"&"9"9#33//#'#;#;*.*I*I"11
 	
rk   c                 l    | j                         }|r|j                  |        | j                  di |S rB  )r  r  context_class)r   r  r0  s      ri   r  zDatabase.get_sql_context,  s5    **,NN?+!t!!,G,,rk   c                     t         rf   r  r   rJ  rr  s      ri   r  zDatabase.conflict_statement2  r  rk   c                     t         rf   r  r  s      ri   r  zDatabase.conflict_update5  r  rk   c           	         g }|j                   j                         D ]  \  }}t        |t              sVt        |t              rt        |j                  |      }t        |t              r|j                  |      }nt        |d      }n|rt        |      }|j                  t        t        |      t        d      |f              |S )NFr  r   )r  r   rg   r  r  r   r_  r8   r  ra   r  r  r  r  rY   )r   rJ  rr  qualifyr   r   r   s          ri   _conflict_update_itemszDatabase._conflict_update_items8  s    ''--/ 	DDAqa& a%Q/Aa'

1Aa.A!!$LL=#3SXq"ABC	D rk   c           	         |j                   rt        |j                   D cg c]  }t        |t              rt	        |      n|! c}      }|j
                  !t        |t        d      |j
                  g      }t        t        d      |g      S |j                  r=|j                  }t        |t              rt	        |      }t        t        d      |g      S t        d      S c c}w )Nr  zON CONFLICTzON CONFLICT ON CONSTRAINT)	r  re  rg   r  r6   r  r  rY   r  )r   rJ  r  targetrH  s        ri   _build_on_conflict_targetz"Database._build_on_conflict_targetI  s    ''%&77'9  *#s3s<'9 :F **6!63w<#.#>#>#@ AS/899--$99J*c*#J/
S!<=zJKK=!!'9s   $C"c                    g }|j                   rc|j                   D ]T  }t        t        d      t        |      fd      }t        t        |      t        d      |f      }|j	                  |       V |j
                  r#|j                  | j                  ||d             | j                  |      t        d      t        |      g}|j                  r/|j                  t        d      t        |j                        f       t        |      S )	Nr7   r  r  r   Tr  zDO UPDATE SETr  )r  r  rY   r  r  r  rn  r  r  rd  r  r  )r   rJ  rr  updatesr5  excluded
expressionr  s           ri   _build_on_conflict_updatez"Database._build_on_conflict_updateY  s      %// +#S_mF6K$L),.%}V'<c#h'/'1 2
z*+ NN466{E?C 7 E F //<_%}W'=?LL#g,k6H6H(IJKrk   c                     |j                   S rf   )	lastrowidr   r+  s     ri   _last_insert_rowidzDatabase._last_insert_rowidn  s    rk   c                     | j                   s| j                  |      S |t        j                  k(  r+	 |d   }t	        |t
              rt        |      dkD  r|S |d   S |S # t        t        t        t        f$ r Y y w xY wr?  )rJ  r  rD  rE  rg   r  r   r   r  r   r   )r   r+  
query_typerf  s       ri   rL  zDatabase.last_insert_idq  s|    $$**6226==(Qic5)c#hlJ1v  #J)D s   $A A A:9A:c                 f    	 |j                   S # t        $ r |j                  j                   cY S w xY wrf   )rowcountr   r+  r  s     ri   r  zDatabase.rows_affected~  s0    	*??" 	*==)))	*s    00c                 $    |j                  d      S r@  rR  ro  s     ri   rA  zDatabase.default_values_insert  s    {{+,,rk   c                 >    | j                         j                         S rf   )r  r  r  s    ri   session_startzDatabase.session_start  s    !++--rk   c                     	 | j                         }|j                  | j                                y# t        $ r Y yw xY wNFbeginT)pop_transactionr  commitr  r   txns     ri   session_commitzDatabase.session_commit  sE    	&&(C 	

,,.
/  		   3 	??c                     	 | j                         }|j                  | j                                y# t        $ r Y yw xY wr  )r  r  rollbackr  r  s     ri   session_rollbackzDatabase.session_rollback  sE    	&&(C 	4..01  		r  c                 @    t        | j                  j                        S rf   )r   r  rw  r  s    ri   r  zDatabase.in_transaction  s    DKK,,--rk   c                 N    | j                   j                  j                  |       y rf   )r  rw  r  )r   r  s     ri   push_transactionzDatabase.push_transaction  s      ''4rk   c                 J    | j                   j                  j                         S rf   )r  rw  r  r  s    ri   r  zDatabase.pop_transaction  s    {{''++--rk   c                 @    t        | j                  j                        S rf   )r   r  rw  r  s    ri   transaction_depthzDatabase.transaction_depth  s    4;;++,,rk   c                 b    | j                   j                  r| j                   j                  d   S y Nrs   )r  rw  r  s    ri   top_transactionzDatabase.top_transaction  s)    ;;##;;++B// $rk   c                      t        | g|i |S rf   r  r  s      ri   r  zDatabase.atomic  r  rk   c                     t        |       S rf   r  r  s    ri   r  zDatabase.manual_commit  r  rk   c                      t        | g|i |S rf   r  r  s      ri   r  zDatabase.transaction  r  rk   c                     t        |       S rf   r  r  s    ri   r  zDatabase.savepoint  r  rk   c                     | j                         r| j                          t        5  | j                         j	                  d       d d d        y # 1 sw Y   y xY w)NBEGINr  r  r  r+  r3  r  s    ri   r  zDatabase.begin  sA    >>LLN" 	+KKM!!'*	+ 	+ 	+s    AAc                 x    t         5  | j                         j                  d       d d d        y # 1 sw Y   y xY wNROLLBACKr  r+  r3  r  s    ri   r  zDatabase.rollback  s.    " 	.KKM!!*-	. 	. 	.    09c                 x    t         5  | j                         j                  d       d d d        y # 1 sw Y   y xY wNCOMMITr
  r  s    ri   r  zDatabase.commit  s.    " 	,KKM!!(+	, 	, 	,r  c              #      K   t        ||      D ]'  }| j                         5  |D ]  }|  	 d d d        ) y # 1 sw Y   4xY wwrf   )r$   r  )r   r  r   r  r  s        ri   batch_commitzDatabase.batch_commit  sQ     R^ 	E   CI 	 s    A:AA	Ac                     t        |      r.|}|j                  j                  }|j                  j                  }|| j	                  |      v S )N)r4  )r]  r^  rh  r4  
get_tables)r   rh  r4  ro  s       ri   table_existszDatabase.table_exists  sC    JE//J[[''FT__F_;;;rk   c                     t         rf   r  )r   r4  s     ri   r  zDatabase.get_tables  r  rk   c                     t         rf   r  r   r_  r4  s      ri   get_indexeszDatabase.get_indexes  r  rk   c                     t         rf   r  r  s      ri   get_columnszDatabase.get_columns  r  rk   c                     t         rf   r  r  s      ri   get_primary_keyszDatabase.get_primary_keys  r  rk   c                     t         rf   r  r  s      ri   get_foreign_keyszDatabase.get_foreign_keys  r  rk   c                     t         rf   r  )r   seqs     ri   sequence_existszDatabase.sequence_exists  r  rk   c                 H    t        |      D ]  } |j                  di |  y rB  )sort_modelscreate_table)r   modelsoptionsro  s       ri   create_tableszDatabase.create_tables  s)     ( 	*EE))	*rk   c                 Z    t        t        |            D ]  } |j                  di |  y rB  )r  r"  
drop_table)r   r$  r  ro  s       ri   drop_tableszDatabase.drop_tables  s.    k&12 	'EE&v&	'rk   c                     t         rf   r  r   	date_part
date_fields      ri   extract_datezDatabase.extract_date  r  rk   c                     t         rf   r  r+  s      ri   truncate_datezDatabase.truncate_date  r  rk   c                     t         rf   r  r   r-  s     ri   to_timestampzDatabase.to_timestamp  r  rk   c                     t         rf   r  r2  s     ri   from_timestampzDatabase.from_timestamp  r  rk   c                 *    t         j                         S rf   )r;   randomr  s    ri   r7  zDatabase.random  s    yy{rk   c                 :    |D ]  }|j                  | ||        y )N)	bind_refsbind_backrefs)r  )r   r$  r9  r:  ro  s        ri   r  zDatabase.bind  s%     	OEJJtyJN	Ork   c                     t        || ||      S rf   _BoundModelsContext)r   r$  r9  r:  s       ri   r=  zDatabase.bind_ctx  s    "64MJJrk   c                 $    |j                  d      S )NzSELECT 0 WHERE 0r  ro  s     ri   get_noop_selectzDatabase.get_noop_select  s    {{-..rk   c                 ~     t         d      s% G  fdd      }t        dt        fd|i       _         j                  S )Nr  c                       e Zd ZW  Zy)Database.Model.<locals>.MetaNr  r  s   ri   r  rB    r   rk   r  r  r  r  s   ` ri   rI   zDatabase.Model  r  rk   )TFNNNTr(  rf   TT)Yr
  r  r  r'   r  r  r  rk  r  r  r  json_methodsr  r  r  rd  re  index_value_literalsrd  r   rJ  safe_create_indexsafe_drop_index	sequencestruncate_tabler  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r+  r  r3  r  r  r  r  r  r  r  r  rL  r  rA  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r&  r)  r.  r0  r3  r5  r7  r  r=  r?  r  rI   r   rk   ri   r(   r(   r  s   MKJEEN"L #8J!& INOIN@E?C!$&L+'"$ ""& 
)-

 -"""" * *-..5.-0.3 +.,<""""""*'""""OK/  rk   r(   c                 0      fd} fd}t        ||      S )Nc                 &    | j                        S rf   pragmar  s    ri   r  z__pragma__.<locals>.__get__  s    {{4  rk   c                 (    | j                  |      S rf   rL  )r   r   r  s     ri   __set__z__pragma__.<locals>.__set__  s    {{4''rk   )r  )r  r  rO  s   `  ri   
__pragma__rP    s    !(GW%%rk   c                       e Zd Zej                  ej
                  ej
                  ej                  dej
                  ej                  dZdddZ	dZ
dZdZeZdZeZ	 	 dD fd
	ZdE fd	Zd Zd Zd Zd Zedd	fdZ ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z  ed      Z! ed      Z" ed      Z# ed      Z$ ed      Z% ed      Z&e'd        Z(e(jR                  d        Z(d Z*d  Z+d! Z,d" Z-dFd#Z.dFd$Z/dGd%Z0dGd&Z1	 	 dHd'Z2dHd(Z3dFd)Z4dFd*Z5d+ Z6d, Z7d- Z8d. Z9d/ Z:d0 Z;d1 Z<d2 Z=d3 Z>dGd4Z?d5 Z@d6 ZAdGd7ZBdGd8ZCdGd9ZDdGd:ZEdGd;ZFdGd<ZGd= ZHd> ZId? ZJd@ ZKdA ZLdB ZMdC ZN xZOS )IrZ   rm  )r^  r_  ra  ri  r  rb  ro  GLOBr,  )r,  r-  Trs   FNc                    |j                  dd       }|t        d      |xs d| _        t        t        |   |g|i | i | _        i | _        i | _        i | _	        t               | _        i | _        | j                  dk\  | _        | j                  t         dd       | j                  t"        dd       | j                  t$        dd       |r| j                  t&        d	d       |rd
dlm}m}	  || |	       y y )Nisolation_levelz/isolation_level must be None when using peewee.r   )r{      r   r,  r   
date_truncr  rK  r   )register_udf_groupsRANK)r  r>   _pragmasr  rZ   r  _aggregates_collations
_functions_window_functionsrx  _extensions	_attachedr  r   register_functionr   r   r   r   playhouse.sqlite_udfrW  rX  )r   r  pragmasregexp_functionrank_functionsr  r  	isolationrW  rX  r  s             ri   r  zSqliteDatabase.__init__'  s    JJ0$7	 & (7 8 8  2nd,XGGG!#5"11Z?0+qA1<C46I1M"">8Q?Fd+ rk   c                     ||| _         t        | j                   t              r(t        | j                   j	                               | _         |%t
        dk  rt        j                  d       || _        || _	        t        t        | 2  |fi | y )N)r{   #   r   z.RETURNING clause requires Sqlite 3.35 or newer)rY  rg   r   r   r   r  r   r   rJ  _timeoutr  rZ   r  )r   r  rb  timeoutrJ  r  r  s         ri   r  zSqliteDatabase.init@  su    #DMdmmT* !4!4!67DM'!J.NO$4D!nd(<V<rk   c                     t         t        d      t        j                  | j                  f| j                  d d| j
                  }	 | j                  |       |S # t        $ r |j                           w xY w)NzSQLite driver not installed!)ri  rT  )	sqlite3r>   r  r  rh  r  _add_conn_hooksrM  r  ry  s     ri   r  zSqliteDatabase._connectM  s}    ?&'EFFt}} Ldmm/3L7;7J7JL	  &   	JJL	s   
A A8c                 Z   | j                   r| j                  |       | j                  r| j                  |       | j	                  |       | j                  |       | j                  |       | j                  dk\  r| j                  |       | j                  r| j                  |       y y )N)r{      r   )r_  _attach_databasesrY  _set_pragmas_load_aggregates_load_collations_load_functionsr  _load_window_functionsr^  _load_extensionsry  s     ri   rl  zSqliteDatabase._add_conn_hooksY  s    >>""4(==d#d#d#T"*,''-!!$' rk   c                     |j                         }| j                  D ]  \  }}|j                  d|d|d        |j                          y )NzPRAGMA z = ;)r+  rY  r3  r  )r   rv  r+  rM  r   s        ri   rp  zSqliteDatabase._set_pragmasf  s@    !]] 	@MFENN>?	@rk   c                     |j                         }| j                  j                         D ]  \  }}|j                  d|d|d        |j	                          y )NzATTACH DATABASE "z" AS "ru   )r+  r_  r   r3  r  )r   rv  r+  r  r  s        ri   ro  z SqliteDatabase._attach_databasesl  sI    ,,. 	HHD"NNRFG	Hrk   c                 .   |d|d|}d|z  }|t         urK|d|xs dz  z  }|rJt        | j                  xs d      }|||<   t        |j	                               | _        n|rt        d      | j                  |      j                         }|r|d   S y )Nru   ".z	PRAGMA %sz = %sr   r   z/Cannot specify a permanent pragma without value)SENTINELr   rY  r   r   r   r  fetchone)r   rF  r   	permanentr4  r`  rb  rf  s           ri   rM  zSqliteDatabase.pragmar  s    %s+CC 7ejq))Ct}}23$ $W]]_ 5NOOs#,,.q6M rk   
cache_sizeforeign_keysjournal_modejournal_size_limit	mmap_size	page_sizeread_uncommittedsynchronouswal_autocheckpointapplication_iduser_versiondata_versionc                     | j                   S rf   )rh  r  s    ri   ri  zSqliteDatabase.timeout  s    }}rk   c                     | j                   |k(  ry || _         | j                         s| j                  d|dz  z         y y )NzPRAGMA busy_timeout=%d;i  )rh  r  r  )r   secondss     ri   ri  zSqliteDatabase.timeout  sA    ==G#~~ 6'D.IJ  rk   c                 t    | j                   j                         D ]  \  }\  }}|j                  |||        y rf   )rZ  r   create_aggregater   rv  r  klass
num_paramss        ri   rq  zSqliteDatabase._load_aggregates  s<    )-)9)9)?)?)A 	;%D%5*!!$
E:	;rk   c                 l    | j                   j                         D ]  \  }}|j                  ||        y rf   )r[  r   create_collation)r   rv  r  r;   s       ri   rr  zSqliteDatabase._load_collations  s4    ((..0 	,HD"!!$+	,rk   c                     | j                   j                         D ]&  \  }\  }}}|rd|ini } |j                  |||fi | ( y )Ndeterministic)r\  r   create_function)r   rv  r  r;   n_paramsr  r  s          ri   rs  zSqliteDatabase._load_functions  sQ    37??3H3H3J 	?/D/2x9Fo}5BF D  x>v>	?rk   c                 t    | j                   j                         D ]  \  }\  }}|j                  |||        y rf   )r]  r   create_window_functionr  s        ri   rt  z%SqliteDatabase._load_window_functions  s>    )-)?)?)E)E)G 	A%D%5*''j%@	Ark   c                     ||f| j                   |xs |j                  j                         <   | j                         s | j	                  | j                                y y rf   )rZ  r
  r  r  rq  r  r   r  r  r  s       ri   register_aggregatez!SqliteDatabase.register_aggregate  sM    <A:;N7!5!5!78~~!!$//"34  rk   c                       fd}|S )Nc                 .    j                  |        | S rf   )r  r  r  r  r   s    ri   r[  z+SqliteDatabase.aggregate.<locals>.decorator  s    ##E4<Lrk   r   r   r  r  r[  s   ``` ri   	aggregatezSqliteDatabase.aggregate      	 rk   c                     xs |j                   fd}||_        || j                  <   | j                         s | j	                  | j                                y y )Nc                  >    | t        dz        fz   }t        |      S )Nz
collate %s)rY   r  )r  r  r  s     ri   
_collationz5SqliteDatabase.register_collation.<locals>._collation  s%    #lT&9":!<<KK((rk   )r
  r  r[  r  rr  r  )r   r;   r  r  s     ` ri   register_collationz!SqliteDatabase.register_collation  sS    "r{{	) "!#~~!!$//"34  rk   c                       fd}|S )Nc                 ,    j                  |        | S rf   )r  )r;   r  r   s    ri   r[  z+SqliteDatabase.collation.<locals>.decorator  s    ##B-Irk   r   )r   r  r[  s   `` ri   r  zSqliteDatabase.collation  s    	 rk   c                     |||f| j                   |xs |j                  <   | j                         s | j                  | j	                                y y rf   )r\  r
  r  rs  r  )r   r;   r  r  r  s        ri   r`  z SqliteDatabase.register_function  sD    02J/N+,~~  !23  rk   c                       fd}|S )Nc                 0    j                  |        | S rf   )r`  )r;   r  r  r  r   s    ri   r[  z&SqliteDatabase.func.<locals>.decorator  s    ""2tZGIrk   r   )r   r  r  r  r[  s   ```` ri   rf  zSqliteDatabase.func  s    	 rk   c                     |xs |j                   j                         }||f| j                  |<   | j                         s | j	                  | j                                y y rf   )r
  r  r]  r  rt  r  r  s       ri   register_window_functionz'SqliteDatabase.register_window_function  sR    -u~~++-(-z':t$~~''(9:  rk   c                       fd}|S )Nc                 .    j                  |        | S rf   )r  r  s    ri   r[  z1SqliteDatabase.window_function.<locals>.decorator  s    ))%zBLrk   r   r  s   ``` ri   window_functionzSqliteDatabase.window_function  r  rk   c                     | j                   |= y rf   )rZ  r  s     ri   unregister_aggregatez#SqliteDatabase.unregister_aggregate      T"rk   c                     | j                   |= y rf   )r[  r  s     ri   unregister_collationz#SqliteDatabase.unregister_collation  r  rk   c                     | j                   |= y rf   )r\  r  s     ri   unregister_functionz"SqliteDatabase.unregister_function  s    OOD!rk   c                     | j                   |= y rf   )r]  r  s     ri   unregister_window_functionz)SqliteDatabase.unregister_window_function  s    ""4(rk   c                 j    |j                  d       | j                  D ]  }|j                  |        y rw  )enable_load_extensionr^  load_extension)r   rv  	extensions      ri   ru  zSqliteDatabase._load_extensions  s3    ""4()) 	+I	*	+rk   c                     | j                   j                  |       | j                         s3| j                         }|j	                  d       |j                  |       y y rw  )r^  r  r  r  r  r  )r   r  rv  s      ri   r  zSqliteDatabase.load_extension  sM    Y'~~??$D&&t,	*  rk   c                 :    | j                   j                  |       y rf   )r^  r  )r   r  s     ri   unload_extensionzSqliteDatabase.unload_extension  s    	*rk   c                     || j                   v r!| j                   |   |k(  ryt        d|z        || j                   |<   | j                         s| j                  d||f       y)NFzschema "%s" already attached.zATTACH DATABASE ? AS ?T)r_  rN   r  r  )r   filenamer  s      ri   attachzSqliteDatabase.attach  sd    4>>!~~d#x/"#BT#IJJ't~~5$7GHrk   c                     || j                   vry| j                   |= | j                         s| j                  d|f       y)NFzDETACH DATABASE ?T)r_  r  r  r  s     ri   detachzSqliteDatabase.detach  s=    t~~%NN4 ~~04':rk   c                 8    |rd|z  nd}| j                  |       y )NzBEGIN %sr  r  )r   	lock_typerf  s      ri   r  zSqliteDatabase.begin  s    .7J*W	#rk   c                 \    t         5  | j                  d      cd d d        S # 1 sw Y   y xY wr  r  r  r  s    ri   r  zSqliteDatabase.commit  s(    " 	.##H-	. 	. 	.   "+c                 \    t         5  | j                  d      cd d d        S # 1 sw Y   y xY wr  r  r  s    ri   r  zSqliteDatabase.rollback  s(    " 	0##J/	0 	0 	0r  c                     t        |xs d      }| j                  d|z  d      }|j                         D cg c]  \  }| c}S c c}w )Nmainz>SELECT name FROM "%s".sqlite_master WHERE type=? ORDER BY name)r_  )rp   r  fetchall)r   r4  r+  rf  s       ri   r  zSqliteDatabase.get_tables  sP    f&'!! #9;A#BCMO & 12222s   Ac                     t        |xs d      }d|z  }| j                  |d      D cg c]
  }t        |  c}S c c}w )Nr  zCSELECT name, sql FROM "%s".sqlite_master WHERE type=? ORDER BY name)view)rp   r  ro  )r   r4  r`  rf  s       ri   	get_viewszSqliteDatabase.get_views#  sF    f&'"().2.>.>sI.NOsc"OOOs   ;c           
      v   t        |xs d      }d|z  }| j                  ||df      }t        |j                               }t	               }| j                  d|dt        |      d      }|j                         D ],  }|d   }t        |d         dk(  }	|	s|j                  |       . i }
t        |      D ]G  }| j                  d|d	t        |      d      }|j                         D cg c]  }|d   	 c}|
|<   I t        |      D cg c]  }t        |||   |
|   ||v |       c}S c c}w c c}w )
Nr  zVSELECT name, sql FROM "%s".sqlite_master WHERE tbl_name = ? AND type = ? ORDER BY namerB  PRAGMA "z".index_list("")rr   r   z".index_info(")	rp   r  r   r  rx  r   r  r  re  )r   r_  r4  rr  r+  index_to_sqlunique_indexesrf  r  	is_uniqueindex_columnsrg  s               ri   r  zSqliteDatabase.get_indexes)  sc   f&'ADJK!!%%)9:FOO-. !!#)4;#8 9??$ 	)Cq6DCFq(I""4(		)  . 	NJ%%'-tJ/?'A BF;A??;L(MCQ(MM*%	N |,.  T"d#&. 	. )N.s   /D1D6c                    t        |xs d      }| j                  d|dt        |      d      j                         }|D cg c]
  }|d   s	| }}t        |      dk(  xr |d   d   xs d	j	                         d
k(  }|D cg c]@  }t        |d   |d   |d    t        |d         ||d   |d   t        |d         xr |      B c}S c c}w c c}w )Nr  r  ".table_info("r  r|  rr   r   r   rh  r]  r{   r{  )rp   r  r  r   upperrf  r   )r   r_  r4  r}  r@  pksis_rowids          ri   r  zSqliteDatabase.get_columnsJ  s    f&'!'e!6 77?xz 	'Q!A$q''s8q=Kc!fQio2%<%<%>)%K  qtQqTqt8T!A$Z! tT!A$Z%<H>  	 (s   
CCACc                     t        |xs d      }| j                  d|dt        |      d      }t        d |j                               D cg c]  }|d   	 c}S c c}w )Nr  r  r  r  c                     | d   S r  r   )r@  s    ri   rj   z1SqliteDatabase.get_primary_keys.<locals>.<lambda>X  s
    1R5 rk   rr   )rp   r  r^  r  r   r_  r4  r+  rf  s        ri   r  zSqliteDatabase.get_primary_keysT  sU    f&'!!#)4;#8 9"(&//:K"LM3AMMMs   Ac                     t        |xs d      }| j                  d|dt        |      d      }|j                         D cg c]"  }t        |d   |d   |d   |d |d   |d	         $ c}S c c}w )
Nr  r  z".foreign_key_list("r  r{   r   r{     r|  )rp   r  r  rj  r  s        ri   r  zSqliteDatabase.get_foreign_keysZ  s    f&'!!#)4;#8 9 "??,. #3q63q63q65$#&q63q63 . 	. .s   'A-c                 "    t         j                  S rf   )rk  Binaryr  s    ri   get_binary_typezSqliteDatabase.get_binary_typeb      ~~rk   c                     |j                   r|j                   j                         nd}|r+|dvr&t        d|j                   j                         z        S y y )Nrh  nothingr  zINSERT OR %s)r  r  rY   r  r   rJ  rr  r  s       ri   r  z!SqliteDatabase.conflict_statemente  sQ    0;0C0C$$**,f$99~(;(;(A(A(CCDD :6rk   c                 `   | j                   dk  rMt        |j                  |j                  |j                  |j
                  |j                  f      rt        d      |j                  r|j                  j                         nd}|r|dvry |dk(  r<|j                  rt        d      t        | j                  |      t        d      g      S |j                  s|j                  st        d      |j                  rt        d      |j
                  st        d	      | j                  ||      S )
N)r{      r   zFSQLite does not support specifying which values to preserve or update.rh  r  r  zMSQLite does not support specifying named constraints for conflict resolution.
DO NOTHINGzIf you are not performing any updates (or preserving any INSERTed values), then the conflict resolution action should be set to "NOTHING".zISQLite requires that a conflict target be specified when doing an upsert.)r  r   r  r  r  r  r  r   r  r  r  r  rY   r  r   ocrr  r  s       ri   r  zSqliteDatabase.conflict_updatej  s:   +bjj"))R5H5H'') * 6 7 7 (*zz!!#rf$99Y&&  "H I IT;;B? .0 1 1BLL * + + $$ D E E$$ ? @ @ --b%88rk   c                 :    t         j                  ||t              S N)rX  )r;   r,  r   r+  s      ri   r.  zSqliteDatabase.extract_date  s    ||Iz|DDrk   c                 :    t         j                  ||t              S r  )r;   rV  simple_date_timer+  s      ri   r0  zSqliteDatabase.truncate_date  s    }}Y
*:  < 	<rk   c                 L    t         j                  d|      j                  d      S )Nr  integer)r;   r   r  r2  s     ri   r3  zSqliteDatabase.to_timestamp  s    {{4,11)<<rk   c                 .    t         j                  |d      S )N	unixepoch)r;   r   r2  s     ri   r5  zSqliteDatabase.from_timestamp  s    {{:{33rk   )NFF)Nr|  Nr  rf   )Nrs   N)Pr
  r  r  r  r\  rl  rk  rm  r  r  rd  rE  rd  r  r  rI  r  rD  r  r  r  rl  rp  ro  r{  rM  rP  r~  r  r  r  r  r  r  r  r  r  r  r  r  ri  r  rq  rr  rs  rt  r  r  r  r  r`  rf  r  r  r  r  r  r  ru  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r.  r0  r3  r5  r  r  s   @ri   rZ   rZ     s   ::))		++II

K J I'NN$L?D %,2=
( !)E$   L)Jn-Ln-L#$89;'I;'I!"45]+K#$89 01Nn-Ln-L  ^^K K;,?
A5
5 ;=(,4;$$#*+
++	$.03P.BN.E
9@E<=4rk   rZ   c                   (    e Zd Zi Zd Zd Zd Zd Zy)_BasePsycopgAdapterc                 v    | j                   j                         D ci c]  \  }}||
 c}}| _        y c c}}w rf   )isolation_levelsr   isolation_levels_inv)r   r   r   s      ri   r  z_BasePsycopgAdapter.__init__  s6    !2288:%<QAqD%<! %<s   5c                 D    t        |t              r| j                  |   S |S rf   )rg   r  r  r   rT  s     ri   isolation_level_intz'_BasePsycopgAdapter.isolation_level_int  s#    os+,,_==rk   c                 D    t        |t              r| j                  |   S |S rf   )rg   r   r  r  s     ri   isolation_level_strz'_BasePsycopgAdapter.isolation_level_str  s#    os+((99rk   c                 ^    |j                  t        t        j                               d      S )NT)r  withhold)r+  r  uuiduuid1ry  s     ri   server_side_cursorz&_BasePsycopgAdapter.server_side_cursor  s"     {{DJJL 1D{AArk   N)r
  r  r  r  r  r 	  r	  r	  r   rk   ri   r  r    s    <

Brk   r  c                   V     e Zd ZdddddZ fdZd Zd Zd	 Zd
 Zd Z	d Z
d Z xZS )Psycopg2AdapterREAD COMMITTEDREPEATABLE READSERIALIZABLEREAD UNCOMMITTEDrr   r   r{   r{  c                 d    t         t        |           t        | _        t        | _        d| _        y rw  )r  r		  r  Json_pg2r  r  cast_json_caser   r  s    ri   r  zPsycopg2Adapter.__init__  s&    ot-/!""rk   c                 &    t         t        d      y )Nz#psycopg2 postgres driver not found.)psycopg2r>   r  s    ri   check_driverzPsycopg2Adapter.check_driver  s    &'LMM rk   c                 "    t         j                  S rf   )r	  r  r  s    ri   r  zPsycopg2Adapter.get_binary_type  s    rk   c                    |j                   j                  d      r|j                  d|j                          n|j                  d|j                          t        j                  di |}|j
                  rHt        j                  t        j                  |       t        j                  t        j                  |       |j                  r|j                  |j                         |S )Npostgresql://dsndbnamer   )r  rS  
setdefaultr	  r  _register_unicodepg_extensionsregister_typeUNICODEUNICODEARRAY	_encodingset_client_encoding)r   r  r  rv  s       ri   r  zPsycopg2Adapter.connect  s    ;;!!/2eR[[1h4)&)''(=(=tD''(B(BDI<<$$R\\2rk   c                     |j                   S rf   r  ry  s     ri   get_server_versionz"Psycopg2Adapter.get_server_version  s    """rk   c                 H    |j                         }|t        j                  k  S rf   )get_transaction_statusr	  TRANSACTION_STATUS_INERRORr   rv  
txn_statuss      ri   r  z$Psycopg2Adapter.is_connection_usable  s!    002
MDDDDrk   c                     |j                         }|t        j                  k(  ry|t        j                  k7  r!	 |j	                         j                  d       yy# t        $ r Y yw xY w)NFr	  Tr&	  r	  TRANSACTION_STATUS_UNKNOWNTRANSACTION_STATUS_IDLEr+  r3  rM  r(	  s      ri   is_connection_reusablez&Psycopg2Adapter.is_connection_reusable  sc     002
AAA=@@@%%j1   s   A 	A&%A&c                    |j                         }|t        j                  k(  ry	 |t        j                  k7  r |j	                         j                  d       y|j	                         j                  d       	 y# t        $ r Y yw xY w)NTr	  SELECT 1Fr+	  r(	  s      ri   is_connection_closedz$Psycopg2Adapter.is_connection_closed  s|    002
AAA		]BBB%%j1  %%j1   		s   2A: A: :	BBr
  r  r  r  r  r	  r  r  r$	  r  r.	  r1	  r  r  s   @ri   r		  r		    sA    	#N#Erk   r		  c                   V     e Zd ZdddddZ fdZd Zd Zd	 Zd
 Zd Z	d Z
d Z xZS )Psycopg3Adapterr	  r
	  r	  r	  r	  c                 d    t         t        |           t        | _        t
        | _        d| _        y r   )r  r4	  r  Json_pg3r  	Jsonb_pg3r  r	  r	  s    ri   r  zPsycopg3Adapter.__init__  s&    ot-/!##rk   c                 &    t         t        d      y )Nz"psycopg postgres driver not found.)psycopgr>   r  s    ri   r	  zPsycopg3Adapter.check_driver  s    ?&'KLL rk   c                 "    t         j                  S rf   )r9	  r  r  s    ri   r  zPsycopg3Adapter.get_binary_type  r  rk   c                 $   |j                   r|j                  d|j                          |j                  j                  d      r|j                  d|j                         n|j                  d|j                         t	        j
                  di |S )Nclient_encodingr	  conninfor	  r   )r!	  r	  r  rS  r9	  r  )r   r  r  s      ri   r  zPsycopg3Adapter.connect  sj    <</>;;!!/2j"++6h4(((rk   c                 .    |j                   j                  S rf   )pgconnr  ry  s     ri   r$	  z"Psycopg3Adapter.get_server_version  s    {{)))rk   c                 P    |j                   j                  t        j                  k  S rf   )r?	  transaction_statusr   INERRORry  s     ri   r  z$Psycopg3Adapter.is_connection_usable  s    {{--0A0I0IIIrk   c                     |j                   j                  }|t        j                  k(  ry|t        j                  k7  r	 |j                          yy# t        $ r Y yw xY w)NFT)r?	  rA	  r   UNKNOWNIDLEr  rM  r(	  s      ri   r.	  z&Psycopg3Adapter.is_connection_reusable  s[     [[33
*222,111   s   A 	AAc                     |j                   j                  }|t        j                  k(  ry	 |t        j                  k7  r|j                          y|j                  d       	 y# t        $ r Y yw xY w)NTr0	  F)r?	  rA	  r   rD	  rE	  r  r3  rM  r(	  s      ri   r1	  z$Psycopg3Adapter.is_connection_closed,  sl    [[33
*222	.333  Z(   		s   #A# A# #	A/.A/r2	  r  s   @ri   r4	  r4	    sA    	$M)*Jrk   r4	  c                        e Zd Zddddddddd	dd

ZdddZdZeZeZ	dZ
dZdZdZeZeZ	 	 d' fd	Zd 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 Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z( xZ)S ))rO   SERIAL	BIGSERIALBYTEABOOLEAN	TIMESTAMPNUMERICr  r  ro  )
r\  r^  r`  ra  re  rf  ri  r  ro  rp  r4  z~*)r/  r0  r  Tc                     || _         || _        |j                  dd      }t        |st        | j                         | _        n| j                         | _        | j                  j                  |      | _	        t        t        | 2  |fi | y )Nprefer_psycopg3F)r	  r!	  r  r9	  r	  psycopg3_adapterr  psycopg2_adapterr 	  _isolation_levelr  rO   r  )r   r  register_unicodeencodingrT  r  rO	  r  s          ri   r  zPostgresqlDatabase.initU  s    !1! **%6>Ox7G 113DM 113DM !% A A! 	 $,X@@rk   c                     | j                   j                           | j                   j                  | fi | j                  }| j                  r|j                  | j                         d|_        |S rw  )r  r	  r  r  rR	  set_isolation_levelr  ry  s     ri   r  zPostgresqlDatabase._connectg  s^    ""$ %t}}$$TAT-@-@A  $$T%:%:;rk   c                 D    | j                   j                  |      | _        y rf   )r  r$	  r  ry  s     ri   r  z&PostgresqlDatabase._set_server_versiont  s    "mm>>tDrk   c                     | j                   j                  ry| j                  j                  | j                   j                        S r   )r  ru  r  r  rv  r  s    ri   r  z'PostgresqlDatabase.is_connection_usablew  s3    ;;
 }}11$++2B2BCCrk   c                    | j                         r| j                          || j                  }|r!| j                  j	                  |      }d|z  }nd}t
        5  | j                         j                  |       d d d        y # 1 sw Y   y xY w)Nz$BEGIN TRANSACTION ISOLATION LEVEL %sr  )r  r  rR	  r  r	  r  r+  r3  )r   rT  txn_typerH  s       ri   r  zPostgresqlDatabase.begin  sx    >>LLN""33O}}88IH9HDDD" 	(KKM!!$'	( 	( 	(s    BBc                 ~    d}| j                  ||xs df      }|j                         D cg c]  \  }| c}S c c}w )NzSSELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = %s ORDER BY tablenamepublicr  r  )r   r4  rr  r+  r_  s        ri   r  zPostgresqlDatabase.get_tables  s@    <!!%&*<H)>?$*OO$56&%666s   :c           
          d}| j                  ||xs df      }|j                         D cg c]   \  }}t        ||j                  d            " c}}S c c}}w )Nz\SELECT viewname, definition FROM pg_catalog.pg_views WHERE schemaname = %s ORDER BY viewnamer\	  z 	;)r  r  ro  rv   )r   r4  rr  r+  	view_namer`  s         ri   r  zPostgresqlDatabase.get_views  s^    ;!!%&*<H)>?(.(9;$Y Y		&(9: ; 	; ;s   %Ac                    d}| j                  ||d|xs df      }|j                         D 	cg c]<  \  }}}}t        ||j                  d      |D 	cg c]  }	t	        |	       c}	||      > c}	}}}}S c c}	w c c}	}}}}w )Na\  
            SELECT
                i.relname, idxs.indexdef, idx.indisunique,
                ARRAY(
                    SELECT pg_get_indexdef(idx.indexrelid, k + 1, TRUE)
                    FROM generate_subscripts(idx.indkey, 1) AS k
                    ORDER BY k)
            FROM pg_catalog.pg_class AS t
            INNER JOIN pg_catalog.pg_namespace AS n ON t.relnamespace = n.oid
            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
                AND idxs.schemaname = n.nspname)
            WHERE t.relname = %s AND t.relkind = %s AND n.nspname = %s
            ORDER BY idx.indisunique DESC, i.relname;r@  r\	  z ;)r  r  re  rstriprz   )
r   r_  r4  rr  r+  r  r`  rZ  colsrh   s
             ri   r  zPostgresqlDatabase.get_indexes  s    9" !!%%f6H)IJ 06/@B B+D#vt dCJJt$4267Qvay7H B 	B7Bs   $A?A:(A?:A?c                    d}| j                  |||xs df      }t        | j                  ||            }d }|j                         D 	
cg c]'  \  }}}	}
}}t	        ||	|dk(  ||v ||
| |||
            ) c}}}
}	}}S c c}}}
}	}}w )Na  
            SELECT c.column_name, c.is_nullable, c.data_type,
                c.column_default,
                pg_catalog.format_type(a.atttypid, a.atttypmod),
                c.is_identity
            FROM information_schema.columns AS c
            INNER JOIN pg_catalog.pg_namespace AS n
                ON (n.nspname = c.table_schema)
            INNER JOIN pg_catalog.pg_class AS t
                ON (t.relname = c.table_name AND t.relnamespace = n.oid)
            INNER JOIN pg_catalog.pg_attribute AS a
                ON (a.attrelid = t.oid AND a.attname = c.column_name)
            WHERE c.table_name = %s AND c.table_schema = %s
                AND NOT a.attisdropped
            ORDER BY c.ordinal_positionr\	  c                 :    | dk(  xs |xs dj                  d      S )NYESrh  )znextval(zunique_rowid(rU  )identdfs     ri   is_identz0PostgresqlDatabase.get_columns.<locals>.is_ident  s'    E> /bhB%:%:-&/ /rk   re	  )r  rx  r  r  rf  )r   r_  r4  rr  r+  r  rh	  r  r*  r   rg	  ftrf	  s                ri   r  zPostgresqlDatabase.get_columns  s    + !!%%1C8)DE$''v67	/
 6<__5FH H1D$BE tRU!2xr':< H 	H Hs   ,Bc                     d}d}| j                  ||||xs df      }|j                         D cg c]  \  }| c}S c c}w )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 = %sPRIMARY KEYr\	  r]	  )r   r_  r4  rr  ctyper+  pks          ri   r  z#PostgresqlDatabase.get_primary_keys  sK    
( !!%%8J()KL$oo/0sr000s   >c                     d}| j                  |||xs df      }|j                         D cg c]%  }t        |d   |d   |d   ||d   |d   |d         ' c}S c c}w )	Na,  
            SELECT DISTINCT
                kcu.column_name, ccu.table_name, ccu.column_name,
                tc.constraint_name, rc.delete_rule, rc.update_rule
            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 AND
                    tc.table_name = kcu.table_name AND
                    tc.table_schema = kcu.table_schema)
            JOIN information_schema.constraint_column_usage AS ccu
                ON (ccu.constraint_name = tc.constraint_name AND
                    ccu.constraint_schema = tc.constraint_schema)
            JOIN information_schema.referential_constraints AS rc
                ON (rc.constraint_name = tc.constraint_name AND
                    rc.constraint_schema = tc.constraint_schema)
            WHERE
                tc.constraint_type = 'FOREIGN KEY' AND
                tc.table_name = %s AND
                tc.table_schema = %sr\	  r   rr   r   r{   r{  r|  r  r  rj  )r   r_  r4  r`  r+  rf  s         ri   r  z#PostgresqlDatabase.get_foreign_keys  s|    (( !!#v/A'BC "??,. #3q63q63q65#a&#&q63q63 . 	. .s   *Ac                 `    | j                  d|f      }t        |j                         d         S )Nz
            SELECT COUNT(*) FROM pg_class, pg_namespace
            WHERE relkind='S'
                AND pg_class.relnamespace = pg_namespace.oid
                AND relname=%sr   )r  r   r|  )r   sequenceress      ri   r   z"PostgresqlDatabase.sequence_exists  s6      " %-;	0
 CLLN1%&&rk   c                 h    	 | j                   j                         S # t        $ r t        d      w xY w)NzPostgres driver not installed.)r  r  r   r>   r  s    ri   r  z"PostgresqlDatabase.get_binary_type  s8    	I==0022 	I&'GHH	Is    1c                      y rf   r   r  s      ri   r  z%PostgresqlDatabase.conflict_statement      rk   c                 x   |j                   r|j                   j                         nd}|dv r%t        | j                  |      t	        d      g      S |r|dk7  rt        d      |j                  s|j                  st        d      |j                  s|j                  st        d      | j                  ||      S )Nrh  )r  r  r  r  z\The only supported actions for conflict resolution with Postgresql are "ignore" or "update".zIf you are not performing any updates (or preserving any INSERTed values), then the conflict resolution action should be set to "IGNORE".zKPostgres requires that a conflict target be specified when doing an upsert.)r  r  r  r  rY   r   r  r  r  r  r  r  s       ri   r  z"PostgresqlDatabase.conflict_update  s    ')zz!!#r**T;;B? .0 1 1(* ) * * BLL ) * * %%)@)@ ? @ @ --b%88rk   c                 h    t         j                  t        t        |      t        d      |f            S NFROMr;   EXTRACTr  rY   r+  s      ri   r.  zPostgresqlDatabase.extract_date  %    zz(C	NCK#LMNNrk   c                 .    t         j                  ||      S rf   )r;   
DATE_TRUNCr+  s      ri   r0  z PostgresqlDatabase.truncate_date  s    }}Y
33rk   c                 .    t        t        d      |f      S )Nintervalr  r   r<  s     ri   r	  zPostgresqlDatabase.interval  s    Z#.//rk   c                 &    | j                  d|      S )NEPOCH)r.  r2  s     ri   r3  zPostgresqlDatabase.to_timestamp"  s      *55rk   c                 ,    t         j                  |      S rf   )r;   r3  r2  s     ri   r5  z!PostgresqlDatabase.from_timestamp%  s    z**rk   c                 $    |j                  d      S )NzSELECT 0 WHERE falser  ro  s     ri   r?  z"PostgresqlDatabase.get_noop_select)  s    {{122rk   c                 L    | j                  d|j                  dd      z         y )Nzset time zone '%s';r  r  )r  rm   )r   r   s     ri   set_time_zonez PostgresqlDatabase.set_time_zone,  s#    083C3CC3NNOrk   c                 D    | j                   j                  |      | _        y rf   )r  r 	  rR	  r  s     ri   rV	  z&PostgresqlDatabase.set_isolation_level/  s     $ A A!rk   )TNNrf   )*r
  r  r  r  r  rk  r  rD  r  r  r  r   rJ  rH  r		  rQ	  r4	  rP	  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r.  r0  r	  r3  r5  r?  r	  rV	  r  r  s   @ri   rO   rO   <  s    $
K  D1JE(L"8JNI&&=A!A$ED(7;B.H21 .4'I9(O406+3Prk   rO   c            
           e Zd Zddddddddd	d
	ZddddddZdZdZeZdZ	e
ZdZdZdZdZdZdZd/ fd	Zd Zd Zd Zd Zd Zd Zd/dZd/dZd/d Zd! Zd/d"Zd/d#Zd/d$Zd/d%Z d& Z!d' Z"d( Z#d) Z$d* Z%d+ Z&d, Z'd- Z(d. Z) xZ*S )0rK   zINTEGER AUTO_INCREMENTzBIGINT AUTO_INCREMENTra  rM	  r  rk  r  zVARCHAR(40)zVARBINARY(16))	r\  r^  ra  rf  ri  rk  r  ro  rp  zLIKE BINARYr,  zREGEXP BINARYr/  r  )r,  r-  r/  r0  r  r  z``FTl    PIPES_AS_CONCATc                     ||| _         d| j                  dd}|j                  |       t        t        |   |fi | y )Nr  T)charsetsql_modeuse_unicode)r  r	  r  r  rK   r  )r   r  r  r  r  r  s        ri   r  zMySQLDatabase.initR  sF    "DL! 	fmT';F;rk   c                     t         t        d      t        j                  d| j                  dd| j                  }|S )NzMySQL driver not installed!T)r  r  r   )mysqlr>   r  r  r  ry  s     ri   r  zMySQLDatabase._connect\  sA    =&'DEE}} 4dmm 4#224rk   c                    	 |j                   }| j                  |      | _         | j	                  | j
                  xs, dt        |      j                         v xs | j                   dk\         y # t        $ r |j                         }Y {w xY w)Nmaria)
   )r  r   get_server_info_extract_server_version_set_csq_groupedr  r  r  )r   rv  version_raws      ri   r  z!MySQLDatabase._set_server_versionc  s    	1--K #::;Gdll >!(C,<,B,B,D!D>!%!4!4!=	?	  	1..0K	1s   A. .B
	B
c                     |r| j                   dk\  n| j                   dk\  }|r | j                  t        k(  rt        | _        y y y )N)r	  r{  )r  r      )r  r  r  r  )r   
is_mariadb	supporteds      ri   r	  zMySQLDatabase._set_csq_groupedn  sJ    7AT((G3--; 	$::()
 0GD,)Irk   c                 B   t        |t              r|S |j                         }d|v rt        j                  d|      }nt        j                  d|      }|2t        d |j                         d   j                  d      D              S t        j                  d|z         y)	Nr	  z(1\d\.\d+\.\d+)z(\d{1,2}\.\d+\.\d+)c              3   2   K   | ]  }t        |        y wrf   )r   )r   nums     ri   r   z8MySQLDatabase._extract_server_version.<locals>.<genexpr>  s     NcSNr  r   r  z'Unable to determine MySQL version: "%s"r   )	rg   r  r  rw   r   r  r   r   r   )r   versionr  s      ri   r	  z%MySQLDatabase._extract_server_versionx  s    gu%N--/g		"4g>I		"8'BI NY-=-=-?-B-H-H-MNNN?'IJrk   c                     | j                   j                  ry| j                   j                  }t        |d      r(| j                  d   dk\  rd}nd}	  |j
                  |  yy# t        $ r Y yw xY w)NFpingr   r  r   r(  T)r  ru  rv  r  r  r	  rM  )r   rv  r  s      ri   r  z"MySQLDatabase.is_connection_usable  st    ;;{{4 ""1%*		4    s   A# #	A/.A/c                 $    |j                  d      S )Nz() VALUES ()r  ro  s     ri   rA  z#MySQLDatabase.default_values_insert  s    {{>**rk   c                     | j                         r| j                          t        5  | j                         }|r|j	                  d|z         |j	                  d       d d d        y # 1 sw Y   y xY w)Nz"SET TRANSACTION ISOLATION LEVEL %sr  r  )r   rT  curss      ri   r  zMySQLDatabase.begin  s^    >>LLN" 	";;=DA,- .LL!	" 	" 	"s   8A((A1c                 X    d}| j                  ||df      D cg c]  \  }| c}S c c}w )NzSELECT table_name FROM information_schema.tables WHERE table_schema = COALESCE(%s, DATABASE()) AND table_type != %s ORDER BY table_nameVIEWr  )r   r4  rr  r_  s       ri   r  zMySQLDatabase.get_tables  s3    < %)$4$4UVV<L$MN&%NNNs   'c                 ~    d}| j                  ||f      }|j                         D cg c]
  }t        |  c}S c c}w )NzSELECT table_name, view_definition FROM information_schema.views WHERE table_schema = COALESCE(%s, DATABASE()) ORDER BY table_name)r  r  ro  )r   r4  rr  r+  rf  s        ri   r  zMySQLDatabase.get_views  s?    ' !!%&3.4oo.?@sc"@@@s   :c                 N    t        |d      }|rdt        |d      d|dS d|z  S )N`z`.`z`%s`)rp   r  s      ri   _show_index_targetz MySQLDatabase._show_index_target  s-    UC "&vs"3U;;~rk   c           
      j   | j                  d| j                  ||      z        }t               }i }|j                         D ]J  }|d   s|j	                  |d          |j                  |d   g        ||d      j                  |d          L |D cg c]  }t        |d ||   ||v |       c}S c c}w )NSHOW INDEX FROM %srr   r   r{  )r  r	  rx  r  r  r	  r  re  )r   r_  r4  r+  rZ  indexesrf  r  s           ri   r  zMySQLDatabase.get_indexes  s    !!"6"&"9"9%"H#I J??$ 	+Cq6

3q6"s1vr*CFO""3q6*		+ $% dD'$-O % 	% %s   B0c                    d}| j                  |||f      }t        | j                  ||            }g }|j                         D ]@  \  }}}	}
}}|dk(  }|r|
dk(  rd }
|j	                  t        ||	|||v ||
|d|xs dv              B |S )Na  
            SELECT column_name, is_nullable, data_type, column_default,
                column_type, extra
            FROM information_schema.columns
            WHERE table_name = %s AND table_schema = COALESCE(%s, DATABASE())
            ORDER BY ordinal_positionre	  r  auto_incrementrh  )r  rx  r  r  r  rf  )r   r_  r4  r`  r+  r  r/  r  r*  r   rg	  ri	  extras                ri   r  zMySQLDatabase.get_columns  s    ) !!#v7$''v67-3__-> 	4)D$BE5=D fLLb$UB U[b13 4	4 rk   c                     | j                  d| j                  ||      z        }t        d |j                               D cg c]  }|d   	 c}S c c}w )Nr	  c                     | d   dk(  S )Nr   PRIMARYr   )rf  s    ri   rj   z0MySQLDatabase.get_primary_keys.<locals>.<lambda>  s    3q6Y#6 rk   r{  )r  r	  r^  r  r  s        ri   r  zMySQLDatabase.get_primary_keys  sa    !!"6"&"9"9%"H#I J 68IJL3A L 	L Ls   Ac                     d}| j                  |||f      }|j                         D cg c]%  }t        |d   |d   |d   ||d   |d   |d         ' c}S c c}w )Na  
            SELECT kcu.column_name, kcu.referenced_table_name,
                kcu.referenced_column_name, kcu.constraint_name,
                rc.delete_rule, rc.update_rule
            FROM information_schema.key_column_usage AS kcu
            INNER JOIN information_schema.referential_constraints AS rc
                ON (rc.constraint_schema = kcu.constraint_schema AND
                    rc.constraint_name = kcu.constraint_name AND
                    rc.table_name = kcu.table_name)
            WHERE kcu.table_name = %s
                AND kcu.table_schema = COALESCE(%s, DATABASE())
                AND kcu.referenced_table_name IS NOT NULL
                AND kcu.referenced_column_name IS NOT NULLr   rr   r   r{   r{  r|  ro	  )r   r_  r4  rr  r+  rf  s         ri   r  zMySQLDatabase.get_foreign_keys  sv    > !!%%9 "??,. #3q63q63q65#a&#&q63q63 . 	. .s   *Ac                 "    t         j                  S rf   )r	  r  r  s    ri   r  zMySQLDatabase.get_binary_type  s    ||rk   c                     |j                   sy |j                   j                         }|dk(  rt        d      S |dk(  rt        d      S |dk7  rt        d      y )Nrm   rH  r  zINSERT IGNOREr  zWUn-supported action for conflict resolution. MySQL supports REPLACE, IGNORE and UPDATE.)r  r  rY   r   r  s       ri   r  z MySQLDatabase.conflict_statement  sh    ""F$$**,Yy>!x''x J K K  rk   c                 0   |j                   s|j                  s|j                  rt        d      g }|j                  r| j
                  xs d}|dk\  rt        j                  }nt        j                  }|j                  D ]D  }t        |      }t        t        |      t        d       ||      f      }|j                  |       F |j                  r#|j                  | j                  ||d             |rt        t        d      t!        |      f      S y )NzfMySQL does not support the specification of where clauses or conflict targets for conflict resolution.r   )r	  r{   r{   r   Fr  zON DUPLICATE KEY UPDATE)r  r  r  r   r  r  r;   VALUEVALUESr  r  rY   r  r  rn  r  rd  )	r   rJ  rr  r  r	  VALUE_FNr5  entityr  s	            ri   r  zMySQLDatabase.conflict_update  s   !=!=++ + , ,    ))1TG*$8899%// +&v.%!&)HV$'& '
 z*+ NN466{E?D 7 F G S!:;*735 6 6 rk   c                 h    t         j                  t        t        |      t        d      |f            S rx	  rz	  r+  s      ri   r.  zMySQLDatabase.extract_date#  r|	  rk   c                 H    t         j                  |t        |   t              S r  )r;   DATE_FORMAT__mysql_date_trunc__r  r+  s      ri   r0  zMySQLDatabase.truncate_date&  s%    ~~j*>y*I+;  = 	=rk   c                 ,    t         j                  |      S rf   )r;   UNIX_TIMESTAMPr2  s     ri   r3  zMySQLDatabase.to_timestamp*  s      ,,rk   c                 ,    t         j                  |      S rf   )r;   FROM_UNIXTIMEr2  s     ri   r5  zMySQLDatabase.from_timestamp-  s    
++rk   c                 *    t         j                         S rf   )r;   randr  s    ri   r7  zMySQLDatabase.random0  s    wwyrk   c                 $    |j                  d      S )NzSELECT 0 WHERE 0=1r  ro  s     ri   r?  zMySQLDatabase.get_noop_select3  s    {{/00rk   rf   )+r
  r  r  r  r  rk  r  r  rD  r  r  r  r  re  rd  rF  rG  r	  r  r  r  r	  r	  r  rA  r  r  r  r	  r  r  r  r  r  r  r  r.  r0  r3  r5  r7  r?  r  r  s   @ri   rK   rK   4  s    (*$ 	"K !J EE#LG":J!%IO H<	?G +"OA%*L.&
K 6DO=-,1rk   rK   c                   $    e Zd Zd Zd Zd Zd Zy)r  c                     || _         y rf   r  r  s     ri   r  z_manual.__init__;  r  rk   c                 2     t               fd       }|S )Nc                  j    t        j                        5   | i |cd d d        S # 1 sw Y   y xY wrf   )r  r  r  s     ri   r  z_manual.__call__.<locals>.inner?  s1    ! +4*6*+ + +r  r   r  s   `` ri   r  z_manual.__call__>  r  rk   c                     | j                   j                         }|t        |t              st	        d      | j                   j                  |        y )Nz?Cannot enter manual commit block while a transaction is active.)r  r  rg   r  r   r  )r   r   s     ri   r  z_manual.__enter__E  sF    gg%%'?:c7#; 6 7 7  &rk   c                 R    | j                   j                         | urt        d      y )Nz>Transaction stack corrupted while exiting manual commit block.)r  r  r   rU  s       ri   r  z_manual.__exit__L  s.    77""$D0 4 5 5 1rk   Nr*  r   rk   ri   r  r  :  s    '5rk   r  c                   $    e Zd Zd Zd Zd Zd Zy)r  c                 $    || _         ||f| _        y rf   )r  _transaction_argsr   r  r  r  s       ri   r  z_atomic.__init__S  s    "&rk   c                 2     t               fd       }|S )Nc                      j                   \  }}t        j                  g|i |5   | i |cd d d        S # 1 sw Y   y xY wrf   )r	  r  r  r  r  r   r   r;   r   s       ri   r  z_atomic.__call__.<locals>.innerX  sJ    ))DAq*1** +4*6*+ + +	   <Ar   r  s   `` ri   r  z_atomic.__call__W       	r	+ 
	+ rk   c                 v   | j                   j                         dk(  r1| j                  \  }} | j                   j                  |i || _        nRt        | j                   j                         t              rt        d      | j                   j                         | _        | j                  j                         S )Nr   z=Cannot enter atomic commit block while in manual commit mode.)r  r  r	  r  _helperrg   r  r  r   r  r  r  s      ri   r  z_atomic.__enter___  s    77$$&!+11LD&.477..??DL//17; 3 4 4  77,,.DL||%%''rk   c                 <    | j                   j                  |||      S rf   )r	  r  rU  s       ri   r  z_atomic.__exit__j  s    ||$$Xw??rk   Nr*  r   rk   ri   r  r  R  s    0	(@rk   r  c                   :    e Zd Zd Zd Zd Zd	dZd	dZd Zd Z	y)
r  c                 $    || _         ||f| _        y rf   )r  _begin_argsr	  s       ri   r  z_transaction.__init__o  s     &>rk   c                 2     t               fd       }|S )Nc                      j                   \  }}t        j                  g|i |5   | i |cd d d        S # 1 sw Y   y xY wrf   )r	  r  r  r	  s       ri   r  z$_transaction.__call__.<locals>.innert  sJ    ##DAqdgg//Q/ +4*6*+ + +r	  r   r  s   `` ri   r  z_transaction.__call__s  r	  rk   c                 Z    | j                   \  }} | j                  j                  |i | y rf   )r	  r  r  r  s      ri   _beginz_transaction._begin{  s(    ''ft&v&rk   c                 ^    | j                   j                          |r| j                          y y rf   )r  r  r	  r   r  s     ri   r  z_transaction.commit  s!    KKM rk   c                 ^    | j                   j                          |r| j                          y y rf   )r  r  r	  r	  s     ri   r  z_transaction.rollback  s#    KKM rk   c                     | j                   j                         dk(  r| j                          | j                   j                  |        | S r  )r  r  r	  r  r  s    ri   r  z_transaction.__enter__  s7    77$$&!+KKM  &rk   c                    | j                   j                         }| j                   j                          |r|dk(  r| j                  d       y |dk(  r	 | j	                  d       y y # t
        $ r | j                  d        w xY wr  )r  r  r  r  r  rM  )r   rV  rW  rX  depths        ri   r  z_transaction.__exit__  sv    ))+!
MM% aZE"   e$s   A' 'BNr  
r
  r  r  r  r  r	  r  r  r  r  r   rk   ri   r  r  n  s%    *'


rk   r  c                   <    e Zd Zd	dZd Zd Zd
dZd
dZd Zd Z	y)r  Nc                     || _         |xs! dt        j                         j                  z   | _        | j                  j                  | j                   j                        | _        y )Nrn   )r  r	  uuid4hexsidr  r  
quoted_sid)r   r  r	  s      ri   r  z_savepoint.__init__  sB    0#

 0 00((--6rk   c                 2     t               fd       }|S )Nc                  j    t        j                        5   | i |cd d d        S # 1 sw Y   y xY wrf   )r  r  r  s     ri   r  z"_savepoint.__call__.<locals>.inner  s1    DGG$ +4*6*+ + +r  r   r  s   `` ri   r  z_savepoint.__call__  r  rk   c                 T    | j                   j                  d| j                  z         y )NzSAVEPOINT %s;)r  r  r	  r  s    ri   r	  z_savepoint._begin  s    Odoo=>rk   c                 z    | j                   j                  d| j                  z         |r| j                          y y )NzRELEASE SAVEPOINT %s;r  r  r	  r	  r	  s     ri   r  z_savepoint.commit  s+    3dooEF$++-5rk   c                 z    | j                   j                  d| j                  z         |r| j                          y y )NzROLLBACK TO SAVEPOINT %s;r	  r	  s     ri   r  z_savepoint.rollback  s+    7$//IJ$++-5rk   c                 &    | j                          | S rf   )r	  r  s    ri   r  z_savepoint.__enter__  s    rk   c                     |r| j                  d       y 	 | j                  d       y # t        $ r | j                  d        w xY w)NFr  )r  r  rM  rU  s       ri   r  z_savepoint.__exit__  sD    MM% %( E*s	   ) Arf   r  r	  r   rk   ri   r  r    s%    7
?  rk   r  c                   N    e Zd Zd Zd Zd Zd Zd ZddZd Z	d Z
dd	Zdd
Zy)r'  c                 X    || _         d| _        d| _        d| _        d| _        g | _        y )Nr   F)r+  rO  rB  initialized	populatedrA  r  s     ri   r  zCursorWrapper.__init__  s-    

 rk   c                 Z    | j                   rt        | j                        S t        |       S rf   )r	  r  rA  ResultIteratorr  s    ri   r  zCursorWrapper.__iter__  s#    >>''d##rk   c                 4   t        |t              rD|j                  }||dk  r| j                          n| j                  |       | j                  |   S t        |t
              r*| j                  |dk\  r|dz   nd       | j                  |   S t        d      )Nr   rr   z6CursorWrapper only supports integer and slice indexes.)rg   r  r  r@  rA  r   r   )r   rI  r  s      ri   r!  zCursorWrapper.__getitem__  s    dE"99D|tax!%>>$''c"OO	D1Hq9>>$'' ( ) )rk   c                 :    | j                          | j                  S rf   )r@  rO  r  s    ri   rD  zCursorWrapper.__len__  s    zzrk   c                      y rf   r   r  s    ri   r  zCursorWrapper.initialize  r  rk   c                 X   | j                   j                         }|'d| _        | j                   j                          t        | j
                  s| j                          d| _        | xj                  dz  c_        | j                  |      }|r| j                  j                  |       |S )NTrr   )r+  r|  r	  r  r'  r	  r  rO  process_rowrA  r  )r   cacherf  r  s       ri   iteratezCursorWrapper.iterate  s    kk""$;!DNKK!!OO#D

a
!!#&NN!!&)rk   c                     |S rf   r   r   rf  s     ri   r 
  zCursorWrapper.process_row  s    
rk   c              #   T   K   	 	 | j                  d       # t        $ r Y y w xY wwr   )r
  r'  r  s    ri   r:  zCursorWrapper.iterator  s5     ll5))  ! s   ( (	%(%(c                 f   |xs t        d      }|dk  rt        d      | j                  s|| j                  k  ry t	        |       }| j                  |_        | j                  s?|| j                  kD  r/	 |j                          | j                  s|| j                  kD  r-y y y y # t        $ r Y y w xY w)NInfr   z"Negative values are not supported.)r  r   r	  rO  r	  rB  r&  r'  )r   r   r:  s      ri   r@  zCursorWrapper.fill_cache  s    uq5ABB>>Q$**_!$'..a$**n ..a$**n.n. ! s   4B$ $	B0/B0c                     g }i }|D ]A  }|rt        |      }||v r||xx   dz  cc<   |d||   }nd||<   |j                  |       C |S )Nrr   r  )r  r  )r   r  valid_identifiersidentifiers
duplicatesr5  s         ri   dedupe_columnszCursorWrapper.dedupe_columns  sq    
 
 		'F (0#6"a'"$*Jv,>?%&
6"v&		' rk   Nr  r	  )r
  r  r  r  r  r!  rD  r  r
  r 
  r:  r@  r
  r   rk   ri   r'  r'    s4    $
) rk   r'  c                       e Zd Zd Zd ZeZy)r&  c                     | j                  | j                  j                  D cg c]  }|d   	 c}d      | _        t	        | j                        | _        y c c}w )Nr   Fr	
  r
  r+  descriptionr  r   ncolsr   col_specs     ri   r  zDictCursorWrapper.initialize(  sP    **)-)@)@AXXa[A# + % &
 B   Ac                 t    t        | j                        D ci c]  }| j                  |   ||    c}S c c}w rf   )r  r
  r  )r   rf  r  s      ri   _row_to_dictzDictCursorWrapper._row_to_dict.  s0    16tzz1BCAQQ'CCCs   5N)r
  r  r  r  r
  r 
  r   rk   ri   r&  r&  '  s    'D Krk   r&  c                       e Zd Zd Zd Zy)r(  c                     | j                  | j                  j                  D cg c]  }|d   	 c}      }t        j                  d|d      | _        y c c}w )Nr   RowTrename)r
  r+  r
  collections
namedtupletuple_class)r   r
  r

  s      ri   r  z"NamedTupleCursorWrapper.initialize4  sO    )))-)@)@AXXa[AC&11%9=? Bs   Ac                       | j                   | S rf   )r
  r
  s     ri   r 
  z#NamedTupleCursorWrapper.process_row:  s    t%%rk   N)r
  r  r  r  r 
  r   rk   ri   r(  r(  3  s    ?&rk   r(  c                   *     e Zd Z fdZd Zd Z xZS )r)  c                 :    t         t        |   |       || _        y rf   )r  r)  r  r!  )r   r+  r!  r  s      ri   r  zObjectCursorWrapper.__init__?  s    !41&9&rk   c                     | j                  | j                  j                  D cg c]  }|d   	 c}d      | _        t	        | j                        | _        y c c}w )Nr   Tr
  r
  r
  s     ri   r  zObjectCursorWrapper.initializeC  sP    **)-)@)@AXXa[A" + $ &
 Br
  c                 H    | j                  |      } | j                  di |S rB  )r
  r!  )r   rf  row_dicts      ri   r 
  zObjectCursorWrapper.process_rowI  s(    $$S)t+(++rk   r
  r  r  r  r  r 
  r  r  s   @ri   r)  r)  >  s    '',rk   r)  c                   "    e Zd Zd Zd Zd ZeZy)r	  c                      || _         d| _        y r  )cursor_wrapperrB  )r   r)
  s     ri   r  zResultIterator.__init__O  s    ,
rk   c                     | S rf   r   r  s    ri   r  zResultIterator.__iter__S  r  rk   c                 r   | j                   | j                  j                  k  r$| j                  j                  | j                      }nZ| j                  j                  s>| j                  j                          | j                  j                  | j                      }nt        | xj                   dz  c_         |S r  )rB  r)
  rO  rA  r	  r
  r'  ra  s     ri   r&  zResultIterator.nextV  s    ::++111%%//

;C$$..'')%%//

;C

a

rk   N)r
  r  r  r  r  r&  __next__r   rk   ri   r	  r	  N  s    	 Hrk   r	  c                        e Zd Zd ZddZd Zy)FieldAccessorc                 .    || _         || _        || _        y rf   )ro  rn  r  r   ro  rn  r  s       ri   r  zFieldAccessor.__init__f  s    

	rk   Nc                 p    |	 |j                   | j                     S | j                  S # t        $ r Y y w xY wrf   )__data__r  r   rn  r  s      ri   r  zFieldAccessor.__get__k  sB    ((33 zz  s   ) 	55c                     ||j                   | j                  <   |j                  j                  | j                         y rf   )r2
  r  _dirtyr  r   r  r   s      ri   rO  zFieldAccessor.__set__s  s,    ',$))$DII&rk   rf   r
  r  r  r  r  rO  r   rk   ri   r.
  r.
  e  s    
'rk   r.
  c                   2     e Zd Z fdZd ZddZd Z xZS )ForeignKeyAccessorc                 R    t         t        |   |||       |j                  | _        y rf   )r  r8
  r  	rel_model)r   ro  rn  r  r  s       ri   r  zForeignKeyAccessor.__init__y  s"     $0tDrk   c                 F   |j                   j                  | j                        }|| j                  |j                  v r| j                  |j                  vra| j                  j
                  rK| j                  j                  | j                  j                  |k(        }||j                  | j                  <   |j                  j                  | j                  |      S | j                  j                  s,| j                  j
                  r| j                  j                  |S rf   )
r2
  r  r  __rel__rn  	lazy_loadr:
  	rel_fieldr*  r3   )r   r  r   r  s       ri   get_rel_instancez#ForeignKeyAccessor.get_rel_instance}  s    !!%%dii0		X-=-= =yy 0 00TZZ5I5Inn(()=)=)FG.1  +##''		599TZZ%9%9..---rk   c                 @    || j                  |      S | j                  S rf   )r?
  rn  r  s      ri   r  zForeignKeyAccessor.__get__  s#    ((22zzrk   c                 ^   t        || j                        r[t        || j                  j                  j
                        |j                  | j
                  <   ||j                  | j
                  <   n|j                  j                  | j
                        }||j                  | j
                  <   | j
                  |j                  v rA|d uxr" ||k(  xr |j                  | j
                     d u}|s|j                  | j
                  = |j                  j                  | j
                         y rf   )rg   r:
  r   rn  r>
  r  r2
  r<
  r  r4
  r  )r   r  r  fk_valuekeeps        ri   rO  zForeignKeyAccessor.__set__  s    c4>>*+23

8L8L8Q8Q+RHdii(*-HTYY'((,,TYY7H+.Hdii(yyH,,,4 @C8O @ ((34?  ((3DII&rk   rf   )r
  r  r  r  r?
  r  rO  r  r  s   @ri   r8
  r8
  x  s    )	
'rk   r8
  c                       e Zd Zd ZddZy)BackrefAccessorc                 V    || _         |j                  | _        |j                  | _        y rf   )rn  r:
  ro  r   rn  s     ri   r  zBackrefAccessor.__init__  s    
__
rk   Nc                     |`| j                   j                  j                  }| j                  j	                         j                  | j                   t        ||      k(        S | S rf   )rn  r>
  r  r:
  r  r]  r   )r   r  r  r  s       ri   r  zBackrefAccessor.__get__  sR    ::'',,DNNVXU4::4)@@AC rk   rf   )r
  r  r  r  r  r   rk   ri   rE
  rE
    s    %
rk   rE
  c                        e Zd Zd ZddZd Zy)ObjectIdAccessorc                     || _         y rf   )rn  rG
  s     ri   r  zObjectIdAccessor.__init__  s	    
rk   Nc                 :   ||j                   j                  | j                  j                        }|[|j                  j                  | j                  j                        }|*t        || j                  j                  j                        }|S | j                  S rf   )r2
  r  rn  r  r<
  r   r>
  )r   r  r  r   rel_objs        ri   r  zObjectIdAccessor.__get__  sz    %%))$**//:E}"**..tzz?&#GTZZ-A-A-F-FGELzzrk   c                 F    t        || j                  j                  |       y rf   )r2  rn  r  r5
  s      ri   rO  zObjectIdAccessor.__set__  s    $**//51rk   rf   r6
  r   rk   ri   rJ
  rJ
    s    	2rk   rJ
  c                       e Zd ZdZdZeZdZdZdZ		 	 	 	 	 ddZ
d Zd ZddZed	        Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)r8   r   FNrg  c                    |t        d       |}|| _        || _        || _        || _        || _        || _        || _        || _        |	| _	        |
| _
        || _        || _        || _        |xs | j                  | _        || _        t"        xj$                  dz  c_        t"        j$                  | _        | j                  xr dxs d| j&                  f| _        y )NzL"db_column" has been deprecated in favor of "column_name" for Field objects.rr   r   )r   r*  rB  rZ  r)  r  r3  r  rq	  r  	unindexedchoices	help_textverbose_namedefault_index_typerk  _hiddenr8   _field_counter_order	_sort_key)r   r*  rB  rZ  r)  r  r3  r  rq	  r  rQ
  rR
  rS
  rT
  rk  	db_columnrV
  s                    ri   r  zField.__init__  s    
   > ?#K	
&&& """($?(?(? 	!****0q5ACrk   c                 D    t        | j                  | j                  f      S rf   )r  ro  r  r  s    ri   r  zField.__hash__  s    TZZ+,,rk   c                     t        | d      rJt        | dd       r=dt        |       j                  d| j                  j                  d| j
                  dS dt        |       j                  z  S )Nro  r  r"  : r  r%  z<%s: (unbound)>)r  r   r  r
  ro  r  r  s    ri   __repr__zField.__repr__  sY    4!gdFD&A$(J$7$7$(JJ$7$7$(II/ / !4:#6#666rk   c           	          || _         |x| _        | _        | j                  xs || _        |rt	        ||| j                  || |             y y rf   )ro  r  	safe_namer)  r2  accessor_classr   ro  r  set_attributes       ri   r  z
Field.bind  sM    
%))	DN++3tE4!4!4UD$!GH rk   c                 j    t        | j                  j                  j                  | j                        S rf   )r%   ro  r^  r_  r)  r  s    ri   r5  zField.column  s%    djj&&,,d.>.>??rk   c                     |S rf   r   r  s     ri   adaptzField.adapt  s    rk   c                 ,    ||S | j                  |      S rf   rf
  r  s     ri   r.  zField.db_value       u<4::e+<<rk   c                 ,    ||S | j                  |      S rf   rh
  r  s     ri   rX  zField.python_value  ri
  rk   c                 2    t        || j                  d      S r  )ra   r.  r  s     ri   r  zField.to_value  s    UDMM%88rk   c                 $    | j                  |      S rf   )r  r  s     ri   
case_valuezField.case_value	  s    }}U##rk   c                     | j                   S rf   )rY
  ro  s     ri   rG  zField.get_sort_key  s    ~~rk   c                 8    |j                  | j                        S rf   )r`  r5  ro  s     ri   r\  zField.__sql__  s    wwt{{##rk   c                      y rf   r   r  s    ri   get_modifierszField.get_modifiers  r  rk   c                 z   |rQ|j                   j                  r;|j                   j                  j                  | j                  | j                        }n| j                  }| j	                         }|r;|r9dj                  |D cg c]  }t        |       c}      }t        |d|d      S t        |      S c c}w )Nr  rQ  rT  )r@  r  r  
field_typerq
  r  r  rY   )r   rp  column_type	modifiersr   modifier_literals         ri   ddl_datatypezField.ddl_datatype  s    399(())//33DOO48OOEK //K&&(	9#yy))DQ#a&)DE;0@ABB{## *Es   B8c                    t        | j                        g}| j                  |      }|r|j                  |       | j                  r|j                  t        d             | j                  s|j                  t        d             | j                  r|j                  t        d             | j                  r'|j                  t        d| j                  z               | j                  r|j                  | j                         | j                  r'|j                  t        d| j                  z               t        |      S )N	UNINDEXEDzNOT NULLrk	  zDEFAULT NEXTVAL('%s')r  )r6   r)  rw
  r  rQ
  rY   r*  r3  rq	  r  rn  r  r  )r   rp  r/  rg  s       ri   ddlz	Field.ddl$  s    (()*%%c*	LL#>>LL[)*yyLLZ)LL]+,==LL4t}}DEFLL))*>>LL\DNN:;<rk   )FFFNNFNNNFNNNNNFr  )r
  r  r  rW
  rX
  r.
  ra
  r	  rU
  rs
  r  r  r^
  r  r  r5  rf
  r.  rX  r  rm
  rG  r\  rq
  rw
  rz
  r   rk   ri   r8   r8     s    NF"NNJJN>BIM?C).	D@-7I @ @==9$$$rk   r8   c                       e Zd ZdZy)r   ANYNr
  r  r  rs
  r   rk   ri   r   r   8  s    Jrk   r   c                       e Zd ZdZd Zy)r@   rl  c                 H    	 t        |      S # t        t        f$ r |cY S w xY wrf   )r   r   r   r  s     ri   rf
  zIntegerField.adapt?  s*    	u:I& 	L	   
 !!Nr
  r  r  rs
  rf
  r   rk   ri   r@   r@   <  s    Jrk   r@   c                       e Zd ZdZy)r   r_  Nr}
  r   rk   ri   r   r   F      Jrk   r   c                       e Zd ZdZy)rW   rb  Nr}
  r   rk   ri   rW   rW   J  s    Jrk   rW   c                   &     e Zd ZdZdZ fdZ xZS )r   Tr\  c                     |j                  d      du rt        dt        |       z        d|d<   t        t        |   |i | y )Nr3  Fz %s must always be a primary key.T)r  r   r  r  r   r  r  s      ri   r  zAutoField.__init__R  sG    ::m$-?$t*LMM $}i'88rk   )r
  r  r  r	  rs
  r  r  r  s   @ri   r   r   N  s    NJ9 9rk   r   c                       e Zd ZdZy)r   r^  Nr}
  r   rk   ri   r   r   Y  s    Jrk   r   c                   $     e Zd ZdZd fd	Z xZS )r=   z$INT GENERATED BY DEFAULT AS IDENTITYc                 >    |rd| _         t        t        |   di | y )Nz INT GENERATED ALWAYS AS IDENTITYr   )rs
  r  r=   r  )r   generate_alwaysr  r  s      ri   r  zIdentityField.__init__`  s    @DOmT+5f5rk   r(  )r
  r  r  rs
  r  r  r  s   @ri   r=   r=   ]  s    7J6 6rk   r=   c                        e Zd Z fdZ xZS )rP   c                 B    t        d       t        t        |   |i | y )Nz"PrimaryKeyField" has been renamed to "AutoField". Please update your code accordingly as this will be completely removed in a subsequent release.)r   r  rP   r  r  s      ri   r  zPrimaryKeyField.__init__g  s(     E 	F 	ot-t>v>rk   rE  r  s   @ri   rP   rP   f  s    ? ?rk   rP   c                       e Zd ZdZd Zy)r:   rk  c                 H    	 t        |      S # t        t        f$ r |cY S w xY wrf   )r  r   r   r  s     ri   rf
  zFloatField.adaptq  s*    	<I& 	L	r
  Nr
  r   rk   ri   r:   r:   n  s    Jrk   r:   c                       e Zd ZdZy)r4   ri  Nr}
  r   rk   ri   r4   r4   x  r
  rk   r4   c                   :     e Zd ZdZ	 	 d fd	Zd Zd Zd Z xZS )r.   rf  c                     || _         || _        || _        |xs t        j                  j
                  | _        t        j                  d      | j                   z  | _        t        t        | *  |i | y )Nr	  )
max_digitsdecimal_places
auto_rounddecimalDefaultContextroundingDecimal_expr  r.   r  )r   r
  r
  r
  r
  r  r  r  s          ri   r  zDecimalField.__init__  sc    $,$ CG$:$:$C$COOB'T-@-@,@A	lD*D;F;rk   c                 2    | j                   | j                  gS rf   )r
  r
  r  s    ri   rq
  zDecimalField.get_modifiers  s    !4!455rk   c                     t         j                  }|s||S  |d      S | j                  r8 |t        |            }|j	                  | j
                  | j                        S |S )Nr   )r
  )r
  r
  r
  r  quantizer
  r
  )r   r   Ddecimal_values       ri   r.  zDecimalField.db_value  sX    OO!M53qt3??c%jMM ))$))dmm)LLrk   c                 |    |:t        |t        j                        r|S t        j                  t        |            S y rf   )rg   r
  r
  r  r  s     ri   rX  zDecimalField.python_value  s3    %1??3u:.. rk   )r	  r|  FN)	r
  r  r  rs
  r  rq
  r.  rX  r  r  s   @ri   r.   r.   |  s"    JCH<6/rk   r.   c                       e Zd Zd Zd Zd Zy)_StringFieldc                 ~    t        |t              r|S t        |t              r|j                  d      S t        |      S )Nrw  )rg   r  r  r   r  s     ri   rf
  z_StringField.adapt  s4    eS!Lu%<<((5zrk   c                 8    t        | t        j                  |      S rf   r  r  s     ri   r	  z_StringField.__add__  s    %5dBIIu%MMrk   c                 8    t        |t        j                  |       S rf   r  r  s     ri   r  z_StringField.__radd__  s    &6ubii&NNrk   N)r
  r  r  rf
  r	  r  r   rk   ri   r
  r
    s     NNrk   r
  c                   *     e Zd ZdZd fd	Zd Z xZS )r"   rq  c                 :    || _         t        t        |   |i | y rf   )
max_lengthr  r"   r  )r   r
  r  r  r  s       ri   r  zCharField.__init__  s    $i'88rk   c                 @    | j                   xr | j                   gxs d S rf   )r
  r  s    ri   rq
  zCharField.get_modifiers  s    4DOO#4<<rk   )   )r
  r  r  rs
  r  rq
  r  r  s   @ri   r"   r"     s    J9=rk   r"   c                   "     e Zd ZdZ fdZ xZS )r9   rc  c                     t         t        |   |      }|r+|j                         d | j                   j                         }|S rf   )r  r9   rf
  rv   r
  )r   r   r  s     ri   rf
  zFixedCharField.adapt  s<    nd1%8KKM"24??399;Erk   )r
  r  r  rs
  rf
  r  r  s   @ri   r9   r9     s    J rk   r9   c                       e Zd ZdZy)r\   rm  Nr}
  r   rk   ri   r\   r\     s    Jrk   r\   c                   &     e Zd Zd Zd fd	Z xZS )FieldDatabaseHookc                     t        d      )NzSubclasses must implementr  r:  s     ri   _db_hookzFieldDatabaseHook._db_hook  s    !"=>>rk   c                    |j                   j                  t        |j                   j                  t              rA|j                   j                  j	                  | j
                         | j                  d        n7| j                  |j                   j                         n| j                  d        |j                   j                  j                  | j
                         t        t        | +  |||      S rf   )r^  r  rg   rT   r  r
  	_db_hooksr  r  r
  r  r   ro  r  rc
  r  s       ri   r  zFieldDatabaseHook.bind  s    ;;+%++..6$$44T]]Cd#ekk223MM$
 	$$T]]3&25$NNrk   r  )r
  r  r  r
  r  r  r  s   @ri   r
  r
    s    ?O Ork   r
  c                       e Zd ZdZd Zd Zy)r   r`  c                 J    |t         | _        y |j                         | _        y rf   )	bytearrayr  r  r:  s     ri   r
  zBlobField._db_hook  s!     )D ( 8 8 :Drk   c                     t        |t              r|j                  d      }n t        |t              r|j	                         }t        |t
              r| j                  |      S |S )Nr  )rg   r  r{  
memoryviewtobytesr  r  r  s     ri   r.  zBlobField.db_value  sO    eS!LL(Ez*MMOEeU#$$U++rk   N)r
  r  r  rs
  r
  r.  r   rk   ri   r   r     s    J;rk   r   c                   &     e Zd Z fdZddZ xZS )r   c                 ^    |j                  dd       t        t        |   |i | d| _        y )Nr  r   rr   )r	  r  r   r  _BitField__current_flagr  s      ri   r  zBitField.__init__  s/    )Q'h&77rk   c                     |"| j                   }| xj                   dz  c_         n
|dz  | _          G fddt               | |      S )Nrr   c                   B     e Zd Z fdZd Zd ZddZd Zd Z xZ	S )%BitField.flag.<locals>.FlagDescriptorc                 >    || _         || _        t        |           y rf   )_field_valuer  r  )r   rn  r   FlagDescriptorr  s      ri   r  z.BitField.flag.<locals>.FlagDescriptor.__init__  s    ##nd46rk   c                 N    | j                   j                  | j                         S rf   )r
  r  r
  r  s    ri   r'  z+BitField.flag.<locals>.FlagDescriptor.clear  s    {{**DKK<88rk   c                 L    | j                   j                  | j                        S rf   )r
  r  r
  r  s    ri   rx  z)BitField.flag.<locals>.FlagDescriptor.set  s    {{))$++66rk   c                 v    || S t        || j                  j                        xs d}|| j                  z  dk7  S r  )r   r
  r  r
  )r   r  r  r   s       ri   r  z-BitField.flag.<locals>.FlagDescriptor.__get__  s<    #K$++*:*:;@q+11rk   c                     |dvrt        d      t        || j                  j                        xs d}|r|| j                  z  }n|| j                   z  }t        || j                  j                  |       y )NTFz"Value must be either True or Falser   )r   r   r
  r  r
  r2  )r   r  is_setr   s       ri   rO  z-BitField.flag.<locals>.FlagDescriptor.__set__  sh    .$%IJJ$++*:*:;@qT[[(Edkk\)E$++"2"2E:rk   c                 p    |j                  | j                  j                  | j                        dk7        S r  )r`  r
  r  r
  ro  s     ri   r\  z-BitField.flag.<locals>.FlagDescriptor.__sql__  s)    wwt{{224;;?1DEErk   rf   )
r
  r  r  r  r'  rx  r  rO  r\  r  )r  r
  s   @ri   r
  r
    s"    7972
;Frk   r
  )r
  r~  )r   r   r
  s     @ri   flagzBitField.flag  sM    =''EA%"'1*D	FZ 	F2 dE**rk   rf   )r
  r  r  r  r
  r  r  s   @ri   r   r     s     
 +rk   r   c                   t    e Zd Zd Zd Zd Zd Zd Zd Zd Z	e	Z
d ZeZd	 Zd
 Zd Zd Zd Zd Zd Zd Zy)BigBitFieldDatac                 "   || _         || _        | j                   j                  j                  | j                        }|st	               }nt        |t              st	        |      }|x| _        | j                   j                  | j                  <   y rf   )r  r  r2
  r  r
  rg   _buffer)r   r  r  r   s       ri   r  zBigBitFieldData.__init__  sk     	&&**4995KEE9-e$E;@@t}}--dii8rk   c                 8    | j                   j                          y rf   )r
  r'  r  s    ri   r'  zBigBitFieldData.clear  s    rk   c                     t        |d      \  }}t        | j                        }||k  r$| j                  j                  d|dz   |z
  z         ||fS )Nr      rr   )divmodr   r
  rn  r   r  byte_numbyte_offsetcur_sizes        ri   _ensure_lengthzBigBitFieldData._ensure_length  sS     &sA+t||$xLLHqLH+D EF$$rk   c                 `    | j                  |      \  }}| j                  |xx   d|z  z  cc<   y r  r
  r
  r   r  r
  r
  s       ri   set_bitzBigBitFieldData.set_bit&  s0     $ 3 3C 8+X1#34rk   c                 b    | j                  |      \  }}| j                  |xx   d|z   z  cc<   y r  r
  r
  s       ri   	clear_bitzBigBitFieldData.clear_bit*  s3     $ 3 3C 8+XA$4"55rk   c                     | j                  |      \  }}| j                  |xx   d|z  z  cc<   t        | j                  |   d|z  z        S r  )r
  r
  r   r
  s       ri   
toggle_bitzBigBitFieldData.toggle_bit.  sN     $ 3 3C 8+X1#34DLL*a;.>?@@rk   c                     t        |d      \  }}t        | j                        }||k  ryt        | j                  |   d|z  z        S )Nr  Frr   )r
  r   r
  r   r
  s        ri   r
  zBigBitFieldData.is_set3  sI     &sA+t||$xDLL*a;.>?@@rk   c                 N    |r| j                  |       y | j                  |       y rf   )r
  r
  )r   rI  r   s      ri   r$  zBigBitFieldData.__setitem__;  s    #T)=rk   c                 ,    t        | j                        S rf   )r   r
  r  s    ri   rD  zBigBitFieldData.__len__?  s    4<<  rk   c           	      n   t        |t              r|j                  }n)t        |t        t        t
        f      r|}nt        d      t	        dt        t        |       t        |            z        }t        j                  | j                  |d      }t        |      D ]  \  }\  }} |||      ||<    |S )NzIncompatible data-typer
  r   )r  )rg   r
  r
  r  r
  r
  r   maxr   r  r  r+  )	r   r  r  databufr  r  r   r   s	            ri   _bitwise_opzBigBitFieldData._bitwise_opB  s    e_-==Dy*=>D566#c$iU"<<=""4<<C"2 	IAv11XCF	
rk   c                 B    | j                  |t        j                        S rf   )r
  r   r  r  s     ri   r  zBigBitFieldData.__and__O  s    x}}55rk   c                 B    | j                  |t        j                        S rf   )r
  r   rW  r  s     ri   r  zBigBitFieldData.__or__Q      x||44rk   c                 B    | j                  |t        j                        S rf   )r
  r   xorr  s     ri   r  zBigBitFieldData.__xor__S  r
  rk   c              #   j   K   | j                   D ]   }t        d      D ]  }|d|z  z  rdnd  " y w)Nr  rr   r   )r
  r  )r   r   js      ri   r  zBigBitFieldData.__iter__V  s>      	1A1X 1aLaq01	1s   13c                 ,    t        | j                        S rf   )reprr
  r  s    ri   r^
  zBigBitFieldData.__repr__[  s    DLL!!rk   c                 ,    t        | j                        S rf   )r  r
  r  s    ri   	__bytes__zBigBitFieldData.__bytes__^  s    T\\""rk   N)r
  r  r  r  r'  r
  r
  r
  r
  r
  r!  r$  __delitem__rD  r
  r  r  r  r  r^
  r
  r   rk   ri   r
  r
    sa    A%56A
A K>K!6551
"#rk   r
  c                   &     e Zd ZddZ fdZ xZS )BigBitFieldAccessorc                 J    || j                   S t        || j                        S rf   )rn  r
  r  r  s      ri   r  zBigBitFieldAccessor.__get__c  s#    ::x33rk   c                 t   |nt        |t              r|j                         }nt        |t              rt	        |      }nct        |t
              rt	        |j                        }n=t        |t              r|j                  d      }nt        |t              st        d      t        t        | 3  ||       y )Nrw  zEValue must be either a bytes, memoryview or BigBitFieldData instance.)rg   r
  r
  r
  r  r
  r
  r  r{  r   r  r
  rO  )r   r  r   r  s      ri   rO  zBigBitFieldAccessor.__set__g  s    =z*MMOEy)%LE/%--(Es#LL)EE5) 9 : :!405Ark   rf   )r
  r  r  r  rO  r  r  s   @ri   r
  r
  b  s    4B Brk   r
  c                   (     e Zd ZeZ fdZd Z xZS )r   c                 X    |j                  dt               t        t        |   |i | y )Nr  )r	  r  r  r   r  r  s      ri   r  zBigBitField.__init__{  s'    )U+k4)4:6:rk   c                      |t        |      S |S rf   r  r  s     ri   r.  zBigBitField.db_value  s    $0uU|;e;rk   )r
  r  r  r
  ra
  r  r.  r  r  s   @ri   r   r   x  s    (N;<rk   r   c                       e Zd ZdZd Zd Zy)r`   ro  c                 X   t        |t              rt        |      dk(  r|S t        |t              r$t        |      dk(  rt	        j
                  |      }t        |t        j
                        r|j                  S 	 t	        j
                  |      j                  S # t        $ r |cY S w xY w)N    r  r
  )rg   r  r   r  r	  ro  r	  rM  r  s     ri   r.  zUUIDField.db_value  s    eS!c%jB&6Lu%#e**:IIE*EeTYY'99	99U#''' 	L	s   <B B)(B)c                 l    t        |t        j                        r|S |t        j                  |      S d S rf   )rg   r	  ro  r  s     ri   rX  zUUIDField.python_value  s.    eTYY'L#(#4tyy>$>rk   Nr
  r  r  rs
  r.  rX  r   rk   ri   r`   r`     s    J?rk   r`   c                       e Zd ZdZd Zd Zy)r   rp  c                 N   t        |t              rt        |      dk(  r| j                  |      S t        |t              r$t        |      dk(  rt        j                  |      }t        |t
        j                        r| j                  |j                        S |t        d      y )Nr  r
  )r	  zTvalue for binary UUID field must be UUID(), a hexadecimal string, or a bytes object.)rg   r  r   r  r  r	  ro  r   r  s     ri   r.  zBinaryUUIDField.db_value  s    eU#E
b(8$$U++s#E
b(8II%(EeTYY'$$U[[11 H I I rk   c                     t        |t        j                        r|S t        |t              r|j	                         }n|rt        |t
              st        |      }|t        j                  |      S d S )Nr
  )rg   r	  ro  r
  r
  r  r  s     ri   rX  zBinaryUUIDField.python_value  sX    eTYY'Lz*MMOE:eU3%LE).):tyyu%DDrk   Nr  r   rk   ri   r   r     s    JIErk   r   c                       fd}|S )Nc                 d    | j                   j                  j                  j                  |       S rf   )ro  r^  r  r.  )r   r,  s    ri   decz_date_part.<locals>.dec  s&    zz((55iFFrk   r   r,  r  s   ` ri   
_date_partr	    s    GJrk   c                 N   |xs d }| rH| }t        |      dkD  r|d   dk(  r|d d dz   |dd  z   }|dd  dk(  r|d d dz   }	  |t        |            S |D ]*  }	  |t        j                  j                  | |            c S  | S # t        t        f$ r Y Bw xY w# t        $ r Y Ow xY w)	Nc                     | S rf   r   r   s    ri   rj   z"format_date_time.<locals>.<lambda>  s    a rk   r	  r   T   rs   Zz+00:00)r   _fromisoformatr   r   r   strptime)r   formatspost_processrn   fmts        ri   r   r     s    0KLq6B;1R5C<#2qv%ARS6S=#2!A	q 122  	 1 1 : :5# FGG
 L :& 		
  		s$   B %BBB	B$#B$c                 r    	 t         j                   j                  | d      S # t        t        f$ r | cY S w xY w)Nr   )r   r  r   r   r  s    ri   r  r    s:      ))%1DEEz" s   " 66c                   $     e Zd ZdZd fd	Z xZS )_BaseFormattedFieldNc                 >    ||| _         t        t        |   |i | y rf   )r  r  r  r  )r   r  r  r  r  s       ri   r  z_BaseFormattedField.__init__  s%    "DL!414B6Brk   rf   )r
  r  r  r  r  r  r  s   @ri   r  r    s    GC Crk   r  c                       e Zd ZdZg dZd Zd Z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y)r-   re  )r   r   z%Y-%m-%d %H:%M:%S.%f%zz%Y-%m-%d %H:%M:%S%zr   c                 V    |r&t        |t              rt        || j                        S |S rf   )rg   r  r   r  r  s     ri   rf
  zDateTimeField.adapt  s$    Zs+#E4<<88rk   c                 `    | j                   j                  j                  j                  |       S rf   ro  r^  r  r3  r  s    ri   r3  zDateTimeField.to_timestamp  #    zz((55d;;rk   c                 b    | j                   j                  j                  j                  ||       S rf   ro  r^  r  r0  r   ry   s     ri   truncatezDateTimeField.truncate  %    zz((66tTBBrk   r   r   r   r   r   r   N)r
  r  r  rs
  r  rf
  r3  r!  r  r	  r   r   r   r   r   r   r   rk   ri   r-   r-     sz    JG
<C Jv&'DZ()E
:e$
%CJv&'Dj*+Fj*+Frk   r-   c                   ~    e Zd ZdZg dZd Zd Zd Z e e	d            Z
 e e	d            Z e e	d            Zy	)
r,   rd  )r   r   r   c                     |r*t        |t              rd }t        || j                  |      S |r*t        |t        j                        r|j                         S |S )Nc                 "    | j                         S rf   )r   r  s    ri   rj   z!DateField.adapt.<locals>.<lambda>  s    1668 rk   )rg   r  r   r  r   r   r   r   pps      ri   rf
  zDateField.adapt  sI    Zs+#B#E4<<<<z%):):;::<rk   c                 `    | j                   j                  j                  j                  |       S rf   r  r  s    ri   r3  zDateField.to_timestamp  r  rk   c                 b    | j                   j                  j                  j                  ||       S rf   r  r   s     ri   r!  zDateField.truncate  r"  rk   r   r   r   N)r
  r  r  rs
  r  rf
  r3  r!  r  r	  r   r   r   r   rk   ri   r,   r,     sM    JG<C Jv&'DZ()E
:e$
%Crk   r,   c                   r    e Zd ZdZg dZd Z e ed            Z e ed            Z	 e ed            Z
y)r]   rn  )r   r   r   r   r   c                 @   |rTt        |t              rd }t        || j                  |      S t        |t        j                        r|j                         S |Et        |t        j                        r+t        j                  j                  |z   j                         S |S )Nc                 "    | j                         S rf   )r   r  s    ri   rj   z!TimeField.adapt.<locals>.<lambda>&  s    qvvx rk   )rg   r  r   r  r   r   	timedeltaminr&  s      ri   rf
  zTimeField.adapt#  s}    %%''t||R@@E8#4#45zz|#E83E3E!F%%))E17799rk   r   r   r   N)r
  r  r  rs
  r  rf
  r  r	  r   r   r   r   rk   ri   r]   r]     sB    JG	 Jv&'Dj*+Fj*+Frk   r]   c                       fd}|S )Nc                     | j                   j                  j                  }| j                  dkD  r| t	        | j                  d      z  n| }|j                  |j                  |            S Nrr   Fre  )ro  r^  r  
resolutionra   r.  r5  )r   r  r  r,  s      ri   r  z!_timestamp_date_part.<locals>.dec4  s]    ZZ&&??Q& doo??,0 	y"*;*;D*ABBrk   r   r  s   ` ri   _timestamp_date_partr3  3  s    C
 Jrk   c                   D   e Zd Z ed      D  cg c]  }d|z  	 c}} Z eej                        ZfdZd Z	d Z
d Z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xZS c c}} w )r^   rx  r	  c                 B   |j                  dd       | _        | j                  sd| _        ns| j                  t        dd      v rd| j                  z  | _        nF| j                  | j                  vr.t	        ddj                  d | j                  D              z        d	| j                  z  | _        |j                  d
d      xs d| _        | j                  rt        nt        j                  j                  }|j                  d|       t        t        | :  |i | y )Nr2  rr   r   rx  r	  z,TimestampField resolution must be one of: %sr  c              3   2   K   | ]  }t        |        y wrf   )r  )r   r  s     ri   r   z*TimestampField.__init__.<locals>.<genexpr>J  s     &N!s1v&Nr  i@B r   Fr  )r  r2  r  valid_resolutionsr   r  ticks_to_microsecondr   r   r   r   r	  r  r^   r  )r   r  r  dfltr  s       ri   r  zTimestampField.__init__A  s     **\48DO__a+ DOO3DO__D$:$::K!YY&Nt7M7M&NNO P P$+t$>!::eU+4uvx'8'8'<'<)T*nd,d=f=rk   c                     | j                   s|j                  #t        j                  |j	                               S t        j                  |j                               S rf   )r   r   calendartimegmutctimetupler   mktime	timetupler  s     ri   get_timestampzTimestampField.get_timestampR  sB    88u||/ ??5#5#5#788;;u011rk   c                    |y t        |t              rt        || j                        }t        |t        j                        rnqt        |t        j
                        r6t	        j                  |j                  |j                  |j                        }n!t        t        || j                  z              S | j                  |      }| j                  dkD  r!||j                  dz  z  }|| j                  z  }t        t        |            S )Nrr   gư>)rg   r  r   r  r   r   r   r   r   r   roundr2  r@  microsecond)r   r   r   s      ri   r.  zTimestampField.db_valueZ  s    =eS!$UDLL9EeX../x}}-%%ejj%++uyyIEuUT__4566&&u-	??Q%++g56I(I5#$$rk   c                 R   |t        |t        t        f      r| j                  dkD  r2t	        || j                        \  }}t        || j
                  z        }nd}| j                  rt        |      }nt        j                  j                  |      }|r|j                  |      }|S )Nrr   r   )rC  )rg   r   r  r2  r
  r8  r   r   r   r   rm   )r   r   ticksmicrosecondss       ri   rX  zTimestampField.python_valuen  s    EC<!@"%eT__=u"54+D+D#DE xx(/ ))77>,?rk   c                     | j                   dkD  r| t        | j                   d      z  n| }| j                  j                  j                  j                  |      S r1  )r2  ra   ro  r^  r  r5  )r   r  s     ri   r5  zTimestampField.from_timestamp  sL    ??Q& doo??,0 	zz((77==rk   r   r   r   r   r   r   )r
  r  r  r  r7  r   r-   r  r  r@  r.  rX  r5  r  r3  r   r   r   r   r   r   r  )r   r  r  s   00@ri   r^   r^   <  s    (-a11Q1=(()G>"2%($>
 (01D)'23E
'.
/C(01D*845F*845FY 2s   Br^   c                       e Zd Zd Zd Zy)rD   c                 `    |,t        j                  dt        j                  |            d   S y )N!Ir   )structr  socket	inet_atonr	  s     ri   r.  zIPField.db_value  s-    ?==v'7'7'<=a@@ rk   c                 Z    |)t        j                  t        j                  d|            S y )NrJ  )rL  	inet_ntoarK  packr	  s     ri   rX  zIPField.python_value  s(    ?##FKKc$:;; rk   N)r
  r  r  r.  rX  r   rk   ri   rD   rD     s    A<rk   rD   c                       e Zd ZdZeZy)r   ra  N)r
  r  r  rs
  r   rf
  r   rk   ri   r   r     s    JErk   r   c                   H    e Zd Zd) fd	Zd Zd Zd Zej                  d*d       Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd*dZej&                  Zd Zd Zd Zd Zd Zd Zd Zd Zd Z fdZd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d  Z&d! Z'd" Z(d# Z)d$ Z*d% Z+d& Z,d' Z-d( Z. xZ/S )+JSONPathc                 f    t         t        |           || _        t	        |      | _        || _        y rf   )r  rS  r  r
  r  _keys_as_text)r   rn  r  as_textr  s       ri   r  zJSONPath.__init__  s)    h&(4[
rk   c                 d     t        |       | j                  | j                  | j                        S rf   r  r
  rU  rV  r  s    ri   r  zJSONPath.clone  s#    tDz$++tzz4==AArk   c                 l     t        |       | j                  | j                  |fz   | j                        S rf   rY  r   rF  s     ri   r!  zJSONPath.__getitem__  s*    tDz$++tzzSF':DMMJJrk   c                 j     t        |       | j                  | j                  |z   | j                        S rf   rY  r   r  s     ri   r  zJSONPath.path  s(    tDz$++tzzD'8$--HHrk   c                     || _         y rf   )rV  )r   rW  s     ri   rW  zJSONPath.as_text  r  rk   c                     | j                   j                  j                  | j                   | j                        }| j                   j                  j	                  |      }t        ||      S rf   )r
  r	  r  rU  r  r!   )r   r   r  typ_names       ri   _typed_castzJSONPath._typed_cast  sM    {{""//TZZH;;&&003D(##rk   c                 $    | j                  d      S )Nr   ra  r  s    ri   as_intzJSONPath.as_int  s    &&rk   c                 $    | j                  d      S )Nr  rc  r  s    ri   as_floatzJSONPath.as_float  s    ((rk   c                 &   | j                   r;| j                  j                  j                  | j                  | j                        }n:| j                  j                  j                  | j                  | j                        }|j                  |      S rf   )rV  r
  r	  r  rU  r  r`  )r   rp  r  s      ri   r\  zJSONPath.__sql__  s_    ==;;&&33DKKLD;;&&..t{{DJJGDwwt}rk   c                 X    | j                   s||S | j                  j                  |      S rf   )rV  r
  rX  r  s     ri   r  zJSONPath._converter  s'    ==EML{{''..rk   c                     | j                   j                  | t        j                  t        j                  || j
                        S rf   )r
  _comparerM   r  r*  rV  r  s     ri   r  zJSONPath.__eq__  s+    {{##D"%%T]]KKrk   c                     | j                   j                  | t        j                  t        j                  || j
                        S rf   )r
  rj  rM   r'  r+  rV  r  s     ri   r   zJSONPath.__ne__  s+    {{##D"%%COOrk   c                     |rt         j                  nt         j                  }| j                  j	                  | t         j
                  |d | j                        S rf   )rM   r*  r+  r
  rj  r  rV  )r   r[  is_ops      ri   r[  zJSONPath.is_null  s:     !bii{{##D"%%dmmLLrk   c                     | j                   j                  }||j                  | j                   |      S | j                   j                  |      S rf   )r
  r	  r  r.  )r   r   helpers      ri   _compare_valuezJSONPath._compare_value  sC    $$''U;;{{##E**rk   c                    t        |t              rt        | ||      S | j                  rt        | |t	        |            S |D cg c]%  }t        |t              r|n| j                  |      ' }}t        | ||      S c c}w rf   )rg   r  rC  rV  r   rp  )r   r  r  r@  s       ri   
_in_helperzJSONPath._in_helper  s    c4 dB,,==dBS	22 q$'qT-@-@-CC  $C((s   *A=c                 B    | j                  t        j                  |      S rf   )rr  rM   r(  r  s     ri   r  zJSONPath.in_  s    ruuc**rk   c                 B    | j                  t        j                  |      S rf   )rr  rM   r)  r  s     ri   r<  zJSONPath.not_in  s    ryy#..rk   c                     | j                   st        |t              rt        | ||      S t        | || j	                  |            S rf   )rV  rg   r  rC  rp  )r   r  r  s      ri   _cmpzJSONPath._cmp  s;    ==JsD1dB,,$D$7$7$<==rk   c                 B    | j                  t        j                  |      S rf   )rv  rM   r!  r  s     ri   r  zJSONPath.__lt__      $))BEE3"77rk   c                 B    | j                  t        j                  |      S rf   )rv  rM   r#  r  s     ri   r  zJSONPath.__le__      $))BFFC"88rk   c                 B    | j                  t        j                  |      S rf   )rv  rM   r$  r  s     ri   r	  zJSONPath.__gt__  rx  rk   c                 B    | j                  t        j                  |      S rf   )rv  rM   r&  r  s     ri   r
  zJSONPath.__ge__  rz  rk   c                     | j                   sBt        |t              s| j                  |      }t        |t              s| j                  |      }t        t
        |   ||      S rf   )rV  rg   r  rp  r  rS  rY  )r   r  r  r  s      ri   rY  zJSONPath.between  sR    }}b$'((,b$'((,Xt,R44rk   c                 L    t         j                  | j                  d      |      S rw  )r~  rG  rW  r  s     ri   rG  zJSONPath.like  s    t||D1377rk   c                 L    t         j                  | j                  d      |      S rw  )r~  rI  rW  r  s     ri   rI  zJSONPath.ilike  s    T 2C88rk   c                 L    t         j                  | j                  d      |      S rw  )r~  rK  rW  r  s     ri   rK  zJSONPath.regexp  s      d!3S99rk   c                 L    t         j                  | j                  d      |      S rw  )r~  rM  rW  r  s     ri   rM  zJSONPath.iregexp  s    !!$,,t"4c::rk   c                 L    t         j                  | j                  d      |      S rw  )r~  rS  rW  r  s     ri   rS  zJSONPath.startswith   s    $$T\\$%7==rk   c                 L    t         j                  | j                  d      |      S rw  )r~  rV  rW  r  s     ri   rV  zJSONPath.endswith  s    ""4<<#5s;;rk   c                     | j                   rt        j                  | |      S | j                  j                  j                  | j                  | j
                  |      S rf   )rV  r~  rP  r
  r	  rU  r  s     ri   rP  zJSONPath.contains  sC    ==&&tS11{{""++DKKSIIrk   c                 x    | j                   j                  j                  | j                   | j                  |      S rf   )r
  r	  rx  rU  r  s     ri   rx  zJSONPath.set
  s)    {{""&&t{{DJJFFrk   c                 x    | j                   j                  j                  | j                   | j                  |      S rf   )r
  r	  rC  rU  r  s     ri   rC  zJSONPath.insert  )    {{""))$++tzz5IIrk   c                 x    | j                   j                  j                  | j                   | j                  |      S rf   )r
  r	  rm   rU  r  s     ri   rm   zJSONPath.replace  s)    {{""**4;;

EJJrk   c                 x    | j                   j                  j                  | j                   | j                  |      S rf   )r
  r	  r  rU  r  s     ri   r  zJSONPath.append  r  rk   c                 v    | j                   j                  j                  | j                   | j                        S rf   )r
  r	  r  rU  r  s    ri   r  zJSONPath.remove  '    {{""))$++tzzBBrk   c                 v    | j                   j                  j                  | j                   | j                        S rf   )r
  r	  r  rU  r  s    ri   r  zJSONPath.length  r  rk   c                 x    | j                   j                  j                  | j                   | j                  |      S rf   )r
  r	  r  rU  r  s     ri   r  zJSONPath.contained_by  s)    {{""//TZZOOrk   c                 x    | j                   j                  j                  | j                   | j                  |      S rf   )r
  r	  r  rU  r[  s     ri   r  zJSONPath.has_key  s)    {{""**4;;

CHHrk   c                 x    | j                   j                  j                  | j                   | j                  |      S rf   )r
  r	  r  rU  r   r  s     ri   r  zJSONPath.has_keys"  s)    {{""++DKKXNNrk   c                 x    | j                   j                  j                  | j                   | j                  |      S rf   )r
  r	  r  rU  r  s     ri   r  zJSONPath.has_any_keys%  s.    {{""//TZZ08: 	:rk   )r   Fr  )0r
  r  r  r  r  r!  r  r  r  rW  ra  rd  rf  r\  r  r  r   r[  r  r  rp  rr  r  r<  rv  r  r  r	  r
  rY  rG  rI  rK  rM  rS  rV  rP  rx  rC  rm   r  r  r  r  r  r  r  r  r  s   @ri   rS  rS    s     BKI 
YY   $
')/
LPM H+)+/>
 8878589:;><J
GJKJCCPIO:rk   rS  c                        e Zd ZdZd fd	Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zej                   Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )rF   r  c                     |xs t         j                  | _        |xs t         j                  | _        d | _        d | _        d | _        t        t        | *  di | y rB  )r   r  r  r   _loadsr	  _wrap_readr  rF   r  )r   r  r   r  r  s       ri   r  zJSONField.__init__-  sJ    )tzz)tzz

i'1&1rk   c                    |d x| _         x| _        | _        y |j                  } ||      | _         | j                   j	                  | j
                        | _        | j                   j                  | j                        | _        y rf   )r	  r  r  rD  r  r  r  r  )r   r  r-  s      ri   r
  zJSONField._db_hook5  sj    599DL94:
##8}\\44T[[A
\\33DKK@
rk   c                 h    |t        |t              r|S | j                  | j                  |      S |S rf   )rg   r  r  r  s     ri   r.  zJSONField.db_value?  s2    =Jud3L$(JJ$:tzz% EErk   c                 H    ||S | j                   | j                  |      S |S rf   )r  r  s     ri   rX  zJSONField.python_valueD  s)    =L$(JJ$:tzz% EErk   c                 L    |t        |t              r|S | j                  |      S rf   )rg   r  r.  r  s     ri   r  zJSONField.to_valueI  s$    =Jud3L}}U##rk   c                     | j                   2|0t        |t              s | j                   j                  | |      }||S | j	                  |      S rf   )r	  rg   r  r  r  )r   r   r  s      ri   rm
  zJSONField.case_valueN  sK    <<#(9ud+<<--dE:D}}U##rk   c                     t        | |f      S rf   rS  r[  s     ri   r!  zJSONField.__getitem__V  s    sf%%rk   c                     t        | |      S rf   r  r]  s     ri   r  zJSONField.pathY  s    d##rk   c                    |ht        |t              rK|j                  s?| j                  3| j                  j	                  | |j
                        }t        ||d       S t        ||d       S |st        |t              rt        |||      S t        |t              r)| j                  | j                  j                  | |      }n| j                  |      }t        |||      S rf   )
rg   rS  rV  r	  r  rU  rC  r  r  r.  )r   rS  eq_oprm  r  rW  r  s          ri   rj  zJSONField._compare\  s    ; #x(||'||00syyA!$t44c5$//jd+c5#..c8$)A,,,,T37C--$C#uc**rk   c                 d    | j                  | t        j                  t        j                  |d      S r   )rj  rM   r  r*  r  s     ri   r  zJSONField.__eq__o  s!    }}T255"%%e<<rk   c                 d    | j                  | t        j                  t        j                  |d      S r   )rj  rM   r'  r+  r  s     ri   r   zJSONField.__ne__q  s!    }}T255"))S%@@rk   c                 :    | j                   j                  | d      S rB  )r	  r  r  s    ri   r  zJSONField.lengthu  s    ||""4,,rk   c                 <    | j                   j                  | d|      S rB  )r	  r  r  s     ri   r  zJSONField.appendx  s    ||""4U33rk   c                 :    | j                   j                  | |      S rf   )r	  r  r  s     ri   r  zJSONField.update|  s     ||""4//rk   c                 <    | j                   j                  | d|      S rB  )r	  rP  r  s     ri   rP  zJSONField.contains  s    ||$$T2u55rk   c                 <    | j                   j                  | d|      S rB  )r	  r  r  s     ri   r  zJSONField.contained_by  s    ||((r599rk   c                 <    | j                   j                  | d|      S rB  )r	  r  r[  s     ri   r  zJSONField.has_key  s    ||##D"c22rk   c                 <    | j                   j                  | d|      S rB  )r	  r  r  s     ri   r  zJSONField.has_keys  s    ||$$T2x88rk   c                 <    | j                   j                  | d|      S rB  )r	  r  r  s     ri   r  zJSONField.has_any_keys  s    ||((r8<<rk   r4  )r
  r  r  rs
  r  r
  r.  rX  r  rm
  r!  r  rj  r  r   r8   r  r  r  r  rP  r  r  r  r  r  r  s   @ri   rF   rF   *  st    J2AF
F
$
$&$+&=A~~H-40
6:39=rk   rF   c                   &     e Zd Zd fd	Zd Z xZS )r   c                 @    t        t        | 
  |i | ||| _        y y rf   )r  r   r  rf
  )r   rf
  r  r  r  s       ri   r  zBareField.__init__  s)    i'88DJ rk   c                      y rf   r   ro  s     ri   rw
  zBareField.ddl_datatype  ru	  rk   rf   )r
  r  r  r  rw
  r  r  s   @ri   r   r     s    
rk   r   c                   |     e Zd ZeZeZ	 	 	 	 d fd	Zed        Z	 fdZ
d Zd Zd Zd Zd fd	Zdd	Zd
 Z xZS )r<   c                 |   |j                  dd       t        t        |   |i | |t	        d       |}|	t	        d       |	}|t	        d       |}t        |t              xr |dk(  | _        || _        || _	        || _
        d | _        || _        || _        || _        || _        |
| _        || _        || _        y )NrB  TzP"rel_model" has been deprecated in favor of "model" for ForeignKeyField objects.zO"to_field" has been deprecated in favor of "field" for ForeignKeyField objects.zK"related_name" has been deprecated in favor of "backref" for Field objects.r   )r	  r  r<   r  r   rg   r  _is_self_referencer:
  r>
  declared_backrefbackrefrm  rn  
deferrabler  object_id_namer=
  constraint_name)r   ro  rn  r  rm  rn  r  	_deferredr:
  to_fieldr  r=
  r  related_namer  r  r  s                   ri   r  zForeignKeyField.__init__  s    
 	'4(ot-t>v>  B CE B CE# : ;"G",UC"8"LUf_ '""$!,".rk   c                     t        | j                  t              rt        j                  S t        | j                  t
              s| j                  j                  S t        j                  S rf   )rg   r>
  r   r   rs
  r   r@   r  s    ri   rs
  zForeignKeyField.field_type  sF    dnnl3"---DNNI6>>,,,&&&rk   c                     t        | j                  t              s| j                  j                         S t        t
        |          S rf   )rg   r>
  r   rq
  r  r<   r	  s    ri   rq
  zForeignKeyField.get_modifiers  s4    $..)4>>//11_d9;;rk   c                     | j                   xsQ d| j                  j                  j                  d| j                  d| j
                  j                  j                  S )Nfk_r  _refs_)r  ro  r^  rh  r)  r:
  r  s    ri   get_constraint_namez#ForeignKeyField.get_constraint_name  sI    ## -JJ''NN  ++(- 	-rk   c                 8    | j                   j                  |      S rf   )r>
  rf
  r  s     ri   rf
  zForeignKeyField.adapt  s    ~~##E**rk   c                     t        || j                        r t        || j                  j                        }| j                  j                  |      S rf   )rg   r:
  r   r>
  r  r.  r  s     ri   r.  zForeignKeyField.db_value  s;    eT^^,E4>>#6#67E~~&&u--rk   c                 h    t        || j                        r|S | j                  j                  |      S rf   )rg   r:
  r>
  rX  r  s     ri   rX  zForeignKeyField.python_value  s*    eT^^,L~~**511rk   c                 <   | j                   s|j                  d      r|n|dz   | _         | j                  s6| j                   | _        | j                  |k(  rK| xj                  dz  c_        n5| j                  |k(  r&t        d|j                  j
                  d|d      | j                  r|| _        t        | j                  t              r&t        | j                  | j                        | _	        n1| j                  %| j                  j                  j                  | _	        t        t        | ?  |||       | j                  | _        t#        | j$                        r| j%                  |       | _        n| j$                  d c| _        | _        | j&                  sd|j                  j
                  z  | _        |r`t)        || j                  t+        |              | j&                  dvr1t)        | j                  | j&                  | j-                  |              y y y )N_idzForeignKeyField "z"."zA" specifies an object_id_name that conflicts with its field name.z%s_setr  !)r)  rV  r  r   r^  r  r  r:
  rg   r>
  r  r   r3  r  r<   r  r`
  r,  r  r  r2  rJ
  backref_accessor_classr
  s       ri   r  zForeignKeyField.bind  s   '+}}U';tD"""&"2"2D""d*##u,#  D((-(8(8$@ A A """DNdnnc*$T^^T^^DDN^^#!^^11==DN 	ot)%}E,,T**+006DL262G2G/DL$/||#ekk&6&66DLE4..0@0FG||:-33D9; . rk   c           	         g }| j                   s|r>| j                         }|j                  t        d      t	        t        |            g       |j                  t        d      t        | f      t        d      | j                  t        | j                  f      g       | j                  r'|j                  t        d| j                  z               | j                  r'|j                  t        d| j                  z               | j                  r'|j                  t        d| j                  z               t        |      S )NrG  zFOREIGN KEY
REFERENCESzON DELETE %szON UPDATE %szDEFERRABLE %s)r  r  rn  rY   r6   rr  re  r:
  r>
  rm  r  rn  r  r  )r   explicit_namer  r  s       ri   foreign_key_constraintz&ForeignKeyField.foreign_key_constraint  s    =++-DLLL!0679 : 	dW%NNdnn./1 	2 >>LL^dnn<=>>>LL^dnn<=>??LL_t>?@rk   c                     |j                  d      rt        d      || j                  j                  j                  v r#| j                  j                  j                  |   S t        d|z        )N__z)Cannot look-up non-existant "__" methods.zNForeign-key has no attribute %s, nor is it a valid field on the related model.)rS  r   r:
  r^  rm  r   s     ri   r   zForeignKeyField.__getattr__  sk    ??4  !LMM4>>''...>>''..t44 ACGH I 	Irk   )NNNNNNNNNTNNr  r(  )r
  r  r  r8
  ra
  rE
  r  r  r  rs
  rq
  r  rf
  r.  rX  r  r  r   r  r  s   @ri   r<   r<     s^    'N,BF<@?CDH!/F ' '<
-+.
2
";H,Irk   r<   c                   b     e Zd Z e       Z fdZej                  ZddZd Z	e
d        Z xZS )r0   c                    || _         |j                         | _        t        j                  j                  |        t        t        |   |j                  d      |j                  d      |j                  d             y )Nr)  r*  r3  )r)  r*  r3  )	field_kwargsr  rel_model_namer0   _unresolvedr  r  r  r  )r   r  r  r  s      ri   r  zDeferredForeignKey.__init__)  si    ",224&&**40 $0

=1F#

=1 	1 	3rk   c                 B    t        | j                  fi | j                  S rf   )r0   r  r  r  s     ri   r  zDeferredForeignKey.__deepcopy__4  s    !$"5"5K9J9JKKrk   c                    t        |fddi| j                  }|j                  r1| j                  j                  j                  | j                  |       y | j                  j                  j                  | j                  |       y )Nr  T)r<   r  r3  ro  r^  set_primary_keyr  	add_field)r   r:
  rn  s      ri   	set_modelzDeferredForeignKey.set_model7  sa    	OTOT=N=NOJJ,,TYY>JJ&&tyy%8rk   c                    t        t        j                  t        j                  d            }|D ]Z  }|j
                  | j                  j                         k(  s+|j                  |        t        j                  j                  |       \ y )NrX
  r   )
r  r0   r  r   
attrgetterr  r
  r  r  discard)	model_cls
unresolveddrs      ri   resolvezDeferredForeignKey.resolve?  so    .:: ( 3 3H =?
 	;B  I$6$6$<$<$>>Y'"..66r:	;rk   rf   )r
  r  r  rx  r  r  r  r  r  r  r  r  r  r  s   @ri   r0   r0   &  s9    %K3 HL9 ; ;rk   r0   c                       e Zd Zd Zd Zd Zy)r1   c                     g | _         y rf   )_refsr  s    ri   r  zDeferredThroughModel.__init__J  s	    
rk   c                 @    | j                   j                  |||f       y rf   )r  r  r0
  s       ri   	set_fieldzDeferredThroughModel.set_fieldM  s    

5%./rk   c                 t    | j                   D ])  \  }}}||_        |j                  j                  ||       + y rf   )r  through_modelr^  r  )r   r  	src_modelm2mfieldr  s        ri   r  zDeferredThroughModel.set_modelP  s8    )- 	6%Ix%2H"OO%%dH5	6rk   N)r
  r  r  r  r  r  r   rk   ri   r1   r1   I  s    06rk   r1   c                        e Zd ZdxZxZxZZdZy)	MetaFieldNF)r
  r  r  r)  r  ro  r  r3  r   rk   ri   r  r  V  s    +//K/'/EDKrk   r  c                   ,     e Zd Z fdZddZd Z xZS )ManyToManyFieldAccessorc                    t         t        |   |||       |j                  | _        |j                  | _        |j
                  | _        | j
                  j                  j                  | j                     }| j
                  j                  j                  | j                     }|s&t        d| j                  d| j
                  d      |s&t        d| j                  d| j
                  d      |d   | _	        |d   | _
        y )NzCannot find foreign-key to "z" on "z" model.r   )r  r  r  ro  r:
  r  r^  
model_refsr   src_fkdest_fk)r   ro  rn  r  src_fksdest_fksr  s         ri   r  z ManyToManyFieldAccessor.__init__\  s    %t5eUDI[[
"00$$**55djjA%%++66t~~F"jj$*<*<> ? ?"nnd.@.@B C Caj{rk   c                    |;|sv| j                   j                  dvr^t        || j                   j                        }t        |t              r.|D cg c]"  }t        || j
                  j                        $ c}S t        || j                   j                  j                        }|2| j                  j                  rt        d| j                  d|d      t        || | j                        j                  | j                        j                  | j                        j!                  | j                   |k(        S | j                  S c c}w )Nr  zCannot get many-to-many "" for unsaved instance "rz  )r  r  r   rg   r   r  r  r>
  rn  _prevent_unsavedr   ManyToManyQueryr:
  r  r  ro  r]  )r   r  r  force_queryr  r  src_ids          ri   r  zManyToManyFieldAccessor.__get__l  s   4;;#6#6j#H!(DKK,?,?@gt,GNOGC):):;OOXt{{'<'<'A'ABF~$**"="= 59ZZ"K L L#HdDNNCT$,,-T$**%U4;;&013
 zz Ps   'Ec                    t        || j                  j                  j                        }|2| j                  j
                  rt        d| j                  d|d      | j                  |d      }|j                  |d       y )NzCannot set many-to-many "r  rz  T)r  )clear_existing)	r   r  r>
  r  rn  r  r   r  r  )r   r  r   r  rr  s        ri   rO  zManyToManyFieldAccessor.__set__~  so    4;;#8#8#=#=>>djj9915XG H HX48		%	-rk   r   )r
  r  r  r  r  rO  r  r  s   @ri   r  r  [  s    # $.rk   r  c                   v     e Zd ZeZ	 	 ddZd	 fd	Zd Zed        Z	e	j                  d        Z	d Zd Z xZS )
rH   c                     |7t        |t              st        |      st        d      |s||t	        d      || _        || _        || _        || _        || _	        || _
        || _        y )NzKUnexpected value for through_model. Expected Model or DeferredThroughModel.zFCannot specify on_delete or on_update when through_model is specified.)rg   r1   r]  r   r   r:
  r  _through_model
_on_delete
_on_updater  _is_backref)r   ro  r  r  rm  rn  prevent_unsavedr  s           ri   r  zManyToManyField.__init__  s    $}.BC]+ !A B BI$9Y=R  "? @ @+## /&rk   c                    t        | j                  t              r| j                  j                  || |       y t        t
        |   |||       | j                  s| j                  xs |j                  j                  dz   | _        | j                  dvrjt        | j                  || j                  | j                  | j                  d      }| j                  j                  j!                  | j                  |       y y y )Nrn   r  T)r  r  rm  rn  r  )rg   r  r1   r  r  rH   r  r  r  r^  r  ro  r  r  r  r:
  r  )r   ro  r  rc
  many_to_many_fieldr  s        ri   r  zManyToManyField.bind  s    d))+?@))%t<ot)%}E<<A5;;+;+;c+ADL||:-%4JJ "&"4"4"oo"oo $&&" $$..t||=OP .  rk   c                     t        | j                  | j                  f| j                   | j                  ff      D cg c]  \  }}|	 c}}S c c}}w rf   )r  r  ro  r:
  )r   r  ro  s      ri   
get_modelszManyToManyField.get_models  sS    &,tzz*!!!4>>2.4 '5 6(!U 6 	6 6s   Ac                 \    | j                   | j                         | _         | j                   S rf   )r  _create_through_modelr  s    ri   r  zManyToManyField.through_model  s+    &"&"<"<">D"""rk   c                     || _         y rf   )r  r  s     ri   r  zManyToManyField.through_model  s
    #rk   c                      j                         \  fD cg c]  }|j                  j                   c} G  fdd      } j                   j                  d}j                  j
                  t        fi |j                  j
                  t        fi |d|i}j                  j                  d}t        |t        f|      S c c}w )Nc                      e Zd ZW j                  j                  j
                  ZW j                  j                  j                  Zd eW       z  ZW  j                  j                  W j                  j                  fdffZ
y)3ManyToManyField._create_through_model.<locals>.Metaz%s_%s_throughTN)r
  r  r  ro  r^  r  r4  r  rh  r  r	  )rS  r  r   tabless   ri   r  r	    sb    zz''00HZZ%%,,F(5=8J))..#))..1Grk   r  )rm  rn  Through)
r  r^  rh  r  r  r  r<   r
  r  rI   )	r   ro  r  r  attrs
klass_namerS  r  r
  s	   `     @@@ri   r  z%ManyToManyField._create_through_model  s    ??$S7:CjAU%++((A	 	  $T__MIINNOC:6:IINNOC:6:D
 '*llCLLA
J%00# Bs   Cc                     | j                   S rf   )r  r  s    ri   get_through_modelz!ManyToManyField.get_through_model  s    !!!rk   )NNNNTFr  )r
  r  r  r  ra
  r  r  r  r  r  r  r  r  r  r  s   @ri   rH   rH     sV    ,NJNCH'$Q&6
 # #
 $ $1*"rk   rH   c                   8     e Zd ZdZd fd	Zd Zd ZddZ xZS )VirtualFieldNc                 l    ||n| j                   }| |       nd | _        t        t        |   |i | y rf   )field_classfield_instancer  r  r  )r   r  r  r  r8   r  s        ri   r  zVirtualField.__init__  s:    *6D<L<L).):eglD*D;F;rk   c                 T    | j                   | j                   j                  |      S |S rf   )r  r.  r  s     ri   r.  zVirtualField.db_value  s*    *&&//66rk   c                 T    | j                   | j                   j                  |      S |S rf   )r  rX  r  s     ri   rX  zVirtualField.python_value  s*    *&&33E::rk   c           	      x    || _         |x| _        x| _        | _        t	        ||| j                  || |             y rf   )ro  r)  r  r`
  r2  ra
  rb
  s       ri   r  zVirtualField.bind  s:    
8<<<49t~tT00dCDrk   rf   r  )	r
  r  r  r  r  r.  rX  r  r  r  s   @ri   r  r    s    K<


Erk   r  c                   T    e Zd ZdZd Zed        ZddZd Zd Z	d Z
d Zd	 Zdd
Zy)r&   Nc                      || _         d | _        y rf   )field_names_safe_field_names)r   r  s     ri   r  zCompositeKey.__init__  s    &!%rk   c                     | j                   b| j                  | j                  S | j                  D cg c]/  }| j                  j                  j                  |   j
                  1 c}| _         | j                   S c c}w rf   )r  ro  r  r^  rm  r`
  r   fs     ri   safe_field_nameszCompositeKey.safe_field_names  sv    !!)zz!''' 04/?/?&A*+ '+jj&6&6&=&=a&@&J&J &AD"%%%&As   4A;c           	      n    |-t        | j                  D cg c]  }t        ||       c}      S | S c c}w rf   )r  r  r   )r   r  r  r  s       ri   r  zCompositeKey.__get__   s6    8M8MN1'(A.NOO Os   2c                     t        |t        t        f      st        d      t	        |      t	        | j
                        k7  rt        d      t        |      D ]  \  }}t        || j
                  |   |       ! y )NzIA list or tuple must be used to set the value of a composite primary key.VThe length of the value must equal the number of columns of the composite primary key.)	rg   r   r  r   r   r  r   r+  r2  )r   r  r   r  field_values        ri   rO  zCompositeKey.__set__  s    %$/ 7 8 8u:T--.. H I I )% 0 	BCHd..s3[A	Brk   c                 ~   t        |t              s7t        |t        t        f      r,t	        |      t	        | j
                        k7  rt        d      t        | j
                  |      D cg c]+  \  }}| j                  j                  j                  |   |k(  - }}}t        t        j                  |      S c c}}w )Nr"  )rg   r  r   r  r   r  r   zipro  r^  rm  r
   r   r  )r   r  rn  r   r  s        ri   r  zCompositeKey.__eq__  s    eS!ju&F&)%jC8H8H4I&I H I I ,/t/?/?+GI'5% 

((//6%? I Ihmm[11Is   ,0B9c                     | |k(   S rf   r   r  s     ri   r   zCompositeKey.__ne__  s    rk   c                 X    t        | j                  j                  | j                  f      S rf   )r  ro  r
  r  r  s    ri   r  zCompositeKey.__hash__  s"    TZZ(($*:*:;<<rk   c           	          |j                   t        k7  }|j                  t        | j                  D cg c]%  }| j
                  j                  j                  |   ' c}d|            S c c}w r  )r.  ry  r`  r  r  ro  r^  rm  )r   rp  r  rn  s       ri   r\  zCompositeKey.__sql__  sk     l*wwx.2.>.>!@%* "&!1!1!8!8!? !@AEvO P 	P !@s   *A)c                 j    || _         |x| _        x| _        | _        t	        || j                  |        y rf   )ro  r)  r  r`
  r2  rb
  s       ri   r  zCompositeKey.bind&  s/    
8<<<49t~tyy$'rk   rf   r  )r
  r  r  rq	  r  r  r  r  rO  r  r   r  r\  r  r   rk   ri   r&   r&     sE    H& & &
B2 =P(rk   r&   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
_SortedFieldListrU  _itemsc                      g | _         g | _        y rf   r,  r  s    ri   r  z_SortedFieldList.__init__/  s    
rk   c                      | j                   |   S rf   )r-  )r   r  s     ri   r!  z_SortedFieldList.__getitem__3  s    {{1~rk   c                 ,    t        | j                        S rf   )r  r-  r  s    ri   r  z_SortedFieldList.__iter__6  r  rk   c                     |j                   }t        | j                  |      }t        | j                  |      }|| j                  || v S rf   )rY
  r   rU  r   r-  )r   rI  r   r  r
  s        ri   __contains__z_SortedFieldList.__contains__9  sA    NN

A&Q't{{1Q'''rk   c                 L    | j                   j                  |j                        S rf   )rU  rB  rY
  rG
  s     ri   rB  z_SortedFieldList.index?  s    zz00rk   c                     |j                   }t        | j                  |      }| j                  j                  ||       | j                  j                  ||       y rf   )rY
  r   rU  rC  r-  )r   rI  r   r  s       ri   rC  z_SortedFieldList.insertB  sC    NN

A&

!Q1d#rk   c                 Z    | j                  |      }| j                  |= | j                  |= y rf   )rB  r-  rU  )r   rI  r  s      ri   r  z_SortedFieldList.removeH  s'    jjKKJJsOrk   N)r
  r  r  r  r  r!  r  r2  rB  rC  r  r   rk   ri   r+  r+  ,  s*    #I!(1$rk   r+  c                      e Zd Zd"dZed        Zej                  d        Zd Zd#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#dZd#dZd#dZd#dZd Zd%dZd#dZd Zd Zd Zd Zd Zd Zd Zd Zd Z d#dZ!d  Z"d&d!Z#y)'rV   Nc                 Z    || _         || _        |j                  dt               || _        y )Nr.  )ro  r  r	  r{  r  )r   ro  r  r  s       ri   r  zSchemaManager.__init__R  s(    
!""7L9.rk   c                     | j                   xs  | j                  j                  j                  }|t	        d| j                  z        |S )Nz=database attribute does not appear to be set on the model: %s)r  ro  r^  r  r>   r  s     ri   r  zSchemaManager.databaseX  sL    ^^8tzz//88:& (ACG::(N O O	rk   c                     || _         y rf   r9  r  s     ri   r  zSchemaManager.database`  s	    rk   c                 N     | j                   j                  di | j                  S rB  )r  r  r  r  s    ri   _create_contextzSchemaManager._create_contextd  s"    ,t}},,Dt/C/CDDrk   c                 @   |j                  dd      }| j                         }|j                  |rdnd       |r|j                  d       |j                  | j                        j                  d       g }g }| j                  j
                  }|j                  rh|j                  j                  D cg c]  }|j                  |   j                   }	}|j                  t        t        d      t        |	      f             |j                  D ]_  }
|j                  |
j!                  |             t#        |
t$              s4|
j&                  rA|j                  |
j)                                a |j*                  r|j-                  |j*                         |j-                  | j/                  |             |j                  t        ||z                |j0                  Wt3        |j0                        }|D ]=  }t#        |t4              st7        d      |j                  d      j                  |       ? g }|j8                  r|j                  d	       |j:                  r|j                  d
       |r#|j                  ddj=                  |      z         |S c c}w )N	temporaryFCREATE TEMPORARY TABLE CREATE TABLE rc  r   rk	  ztable_settings must be stringsSTRICTzWITHOUT ROWIDr  r  )r  r;  rR  r`  ro  r^  composite_keyr3  r  rm  r5  r  r  rY   re  sorted_fieldsrz
  rg   r<   r  r  r  rn  _create_table_option_sqltable_settingsr  r  r   strict_tableswithout_rowidr  )r   r[  r%  is_temprp  r  r  rt  
field_name
pk_columnsrn  rD  setting
extra_optss                 ri   _create_tablezSchemaManager._create_tableg  s;   ++k51""$-oNKK()

##C(zz,0,<,<,H,HJ( ++j188 JJ Jx]);)9*)E)G  H I '' 	CENN599S>*%1%..""5#?#?#AB	C
 t//0488AB ;!678*)$*=*=>N) 2!'3/$%EFFC ((12
 
z00:z00AKK		* 556
9Js   3 Jc                    g }t        | j                  j                  j                  xs i |      }|s|S t	        |j                               D ]r  \  }}t        |t              s6t        |      r|j                  j                  }nt        t        |            }|j                  t        t        |      |fd             t |S )Nr   r  )r  ro  r^  r%  r  r   rg   r  r]  r_  rY   r  r  r  )r   r%  r/  rF  r   s        ri   rC  z&SchemaManager._create_table_option_sql  s    TZZ--55;WEL 1 	@JCeT*E?!KK--EE
OELL3s8U"3#>?	@ rk   c                 ^    | j                   j                   | j                  dd|i|       y Nr[  r   )r  r3  rL  r   r[  r%  s      ri   r#  zSchemaManager.create_table  s*    0d00FdFgFGrk   c                    | j                         j                  |j                  d      rdnd      }|r|j                  d       |j                  t	        t        |             j                  d      j                  |      S )Nr=  r>  r?  rc  r  )r;  rR  r  r`  r6   r  r   rh  rr  r[  rt  rp  s         ri   _create_table_aszSchemaManager._create_table_as  sr    ##%88K0 26EG 	 KK()V\*567U	rk   c                 f     | j                   ||fd|i|}| j                  j                  |       y )Nr[  )rS  r  r3  rR  s         ri   create_table_aszSchemaManager.create_table_as  s2    #d##JIDIDIc"rk   c                 
   | j                         j                  |rdnd      j                  | j                        }|j	                  d      r|j                  d      }|S |j	                  d      r|j                  d      }|S )NzDROP TABLE IF EXISTS zDROP TABLE cascade CASCADErestrictz	 RESTRICT)r;  rR  r`  ro  r  )r   r[  r%  rp  s       ri   _drop_tablezSchemaManager._drop_table  ss    ##%4/]KDJJ 	 ;;y!++j)C 
 [[$++k*C
rk   c                 ^    | j                   j                   | j                  dd|i|       y rO  )r  r3  rZ  rP  s      ri   r(  zSchemaManager.drop_table  s*    .d..DDDGDErk   c                 b   | j                   }|j                  s8| j                         j                  d      j	                  | j
                        S | j                         j                  d      j	                  | j
                        }|r|j                  d      }|r|j                  d      }|S )NrP  zTRUNCATE TABLE z RESTART IDENTITYrX  )r  rI  r;  rR  r`  ro  )r   restart_identityrW  r  rp  s        ri   _truncate_tablezSchemaManager._truncate_table  s    ]]  ((*W^,SS_> ""$,,->?CCDJJO++12C++j)C
rk   c                 Z    | j                   j                  | j                  ||             y rf   )r  r3  r^  )r   r]  rW  s      ri   rI  zSchemaManager.truncate_table  s"    d223CWMNrk   c                     | j                   j                  j                         D cg c]  }| j                  ||       c}S c c}w rf   )ro  r^  fields_to_index_create_indexr   r[  rB  s      ri   _create_indexeszSchemaManager._create_indexes  sF    !ZZ--==?A ""5$/ A 	A As   Ac                 2   t        |t              ri| j                  j                  s|j	                  d      }n |j
                  |k7  r|j	                  |      }| j                  j                  rt        |      }| j                         j                  |      S r   )
rg   r?   r  rF  r[  rW  rE  r
  r;  r`  )r   rB  r[  s      ri   rb  zSchemaManager._create_index  st    eU#==22

5)$

4(}}11 &e,##%))%00rk   c                 h    | j                  |      D ]  }| j                  j                  |        y Nr[  )rd  r  r3  r   r[  rr  s      ri   create_indexeszSchemaManager.create_indexes  s1    ))t)4 	)EMM!!%(	)rk   c                     | j                   j                  j                         D cg c]$  }t        |t              r| j                  ||      & c}S c c}w rf   )ro  r^  ra  rg   r?   _drop_indexrc  s      ri   _drop_indexeszSchemaManager._drop_indexes  sL    !ZZ--==?-eU+   - - 	- -s   )Ac                 |   d}|r| j                   j                  r|dz  }t        |j                  t              rA|j                  j
                  r+t        |j                  j
                  |j                        }nt        |j                        }| j                         j                  |      j                  |      S )NzDROP INDEX z
IF EXISTS )r  rG  rg   rT  r[   r1  r6   r  r;  rR  r`  )r   rB  r[  rf  rg  s        ri   rl  zSchemaManager._drop_index  s    !	DMM11%IellE*u||/C/C 4 4ekkBJ,J "#Z	"rk   c                     ||t        d      |r.t        | j                  |f|j                  |j                        }| j
                  j                  | j                  ||            S )Nz!field or index must be specified.rZ  r\  rh  )r   rJ   ro  rZ  rk  r  r3  rl  )r   rn  rB  r[  s       ri   
drop_indexzSchemaManager.drop_index  sb    =U]@AAtzzE8ELL%*%5%57E}}$$T%5%5e$%5%GHHrk   c                 h    | j                  |      D ]  }| j                  j                  |        y rg  )rm  r  r3  ri  s      ri   drop_indexeszSchemaManager.drop_indexes  s1    ''T'2 	)EMM!!%(	)rk   c                 x    |j                   r| j                  j                  st        d|j                  z        y )Nz@Sequences are either not supported, or are not defined for "%s".)rq	  r  rH  r   r  rG
  s     ri   _check_sequenceszSchemaManager._check_sequences  s8    ~~T]]%<%< 138::> ? ? &=rk   c                     |j                   j                  j                  r4t        |j                   j                  j                  |j                        S t        |j                        S rf   )ro  r^  r4  r6   rq	  rG
  s     ri   _sequence_for_fieldz!SchemaManager._sequence_for_field  sE    ;;##%++++22ENNCC%..))rk   c                     | j                  |       | j                  j                  |j                        s=| j	                         j                  d      j                  | j                  |            S y )NzCREATE SEQUENCE ru  r  r   rq	  r;  rR  r`  rw  rG
  s     ri   _create_sequencezSchemaManager._create_sequence  s[    e$}},,U^^<$_&W/0S11%89; =rk   c                 b    | j                  |      }|| j                  j                  |       y y rf   )rz  r  r3  r   rn  seq_ctxs      ri   create_sequencezSchemaManager.create_sequence  s/    ''.MM!!'* rk   c                     | j                  |       | j                  j                  |j                        r=| j	                         j                  d      j                  | j                  |            S y )NzDROP SEQUENCE ry  rG
  s     ri   _drop_sequencezSchemaManager._drop_sequence  s[    e$==((8$_&W-.S11%89; 9rk   c                 b    | j                  |      }|| j                  j                  |       y y rf   )r  r  r3  r|  s      ri   drop_sequencezSchemaManager.drop_sequence!  s/    %%e,MM!!'* rk   c                     | j                         j                  d      j                  |j                        j                  d      j                  |j	                  d            S )NzALTER TABLE z ADD T)r;  rR  r`  ro  r  rG
  s     ri   _create_foreign_keyz!SchemaManager._create_foreign_key&  sI     "(U[[!!U11$78	:rk   c                 X    | j                   j                  | j                  |             y rf   )r  r3  r  rG
  s     ri   create_foreign_keyz SchemaManager.create_foreign_key.  s    d66u=>rk   c                     | j                   j                  rD| j                  j                  j                  D ]   }|j
                  s| j                  |       " y y rf   )r  rH  ro  r^  rB  rq	  r~  rG
  s     ri   create_sequenceszSchemaManager.create_sequences1  sH    ==""))77 0>>((/0 #rk   c                 n    | j                           | j                  |fi | | j                  |       y rg  )r  r#  rj  )r   r[  table_optionss      ri   
create_allzSchemaManager.create_all7  s4    $0-0&rk   c                     | j                   j                  rD| j                  j                  j                  D ]   }|j
                  s| j                  |       " y y rf   )r  rH  ro  r^  rB  rq	  r  rG
  s     ri   drop_sequenceszSchemaManager.drop_sequences<  sH    ==""))77 .>>&&u-. #rk   c                 P     | j                   |fi | |r| j                          y y rf   )r(  r  )r   r[  r  r%  s       ri   drop_allzSchemaManager.drop_allB  s)    ((! rk   rf   r  r  )NNTrC  )$r
  r  r  r  r  r  r  r;  rL  rC  r#  rS  rU  rZ  r(  r^  rI  rd  rb  rj  rm  rl  rq  rs  ru  rw  rz  r~  r  r  r  r  r  r  r  r  r   rk   ri   rV   rV   Q  s    /   __ E(TH	#FOA
1)-
"I)?
*;+
;+
:?0'
."rk   rV   c                      e Zd Z	 	 	 	 	 	 ddZd ZddZd Zd Zd Zd Z	e
d	        Zej                  d
        Zej                  d        Ze
d        Zej                  d        Ze
d        Zd ZddZd Zd Zd Zd Zd Zd Zd Zy)MetadataNc                    |t        d       |}|| _        || _        i | _        i | _        i | _        t               | _        g | _        g | _	        i | _
        i | _        g | _        |j                  j                         | _        || _        || _        |s-| j                   r| j!                  |      n| j%                         }|| _        d | _        |rt+        |      ng | _        || _        || _        || _        d x| _        | _        || _        |	| _        || _        || _        || _         || _!        i | _"        i | _#        tI        jJ                  t*              | _&        tI        jJ                  t*              | _'        i | _(        |
xs i | _)        |jU                         D ]  \  }}tW        | ||        tY        |j[                               | _.        g | _/        y )NzC"db_table" has been deprecated in favor of "table_name" for Models.)0r   ro  r  rm  r  combinedr+  _sorted_field_listrB  sorted_field_namesr.  _default_by_name_default_callable_listr
  r  r  table_functionrq  make_table_namerh  rT  r   r	  r  r1  r3  rA  r	  only_save_dirty
depends_onrD  rF  rE  r=  refsbackrefsr
  defaultdictr  model_backrefs
manytomanyr%  r   r2  rx  r  _additional_keysr
  )r   ro  r  rh  r	  r3  r  r4  r  r  r%  db_tabler  rD  rF  r=  rE  rq  r  rF  r   s                        ri   r  zMetadata.__init__I  s     6 7!J
 "2"4"$ "&(#NN((*	,"4!00 --e4#335  %(/tG}R&&377T0.$,**"	%11$7)55d;}" ,,. 	&JCD#u%	& #FKKM 2 rk   c                     | j                   r!t        j                  dd| j                        S t	        | j
                  j                        S )Nrp  r  )rq  rw   r  r  r  ro  r
  r  s    ri   r  zMetadata.make_table_name  s7    ""66)S$))44tzz2233rk   c                 H   |s|st        d      d | j                  d fg}t               }t        j                  | f      }|r|j
                  n|j                  }|r |       }||v r|j                  |       |rQ|j                  j                         D ]4  \  }	}
|j                  |	|
df       |j                  |
j                         6 |rQ|j                  j                         D ]4  \  }	}
|j                  |	|
df       |j                  |
j                         6 |r|S )Nz)One of `refs` or `backrefs` must be True.FT)r   ro  rx  r
  dequer  popleftr  r  r   r  r^  r  )r   r  r  depth_firstr/  r2  queuer  currfkro  s              ri   model_graphzMetadata.model_graph  s   HHII

D)*u!!4'*)u}}8Dt|XHHTN!%!2 .IBLL"eU!34LL-. !%!4!4!6 .IBLL"eT!23LL-.  rk   c                     |j                   }|| j                  |<   | j                  |   j                  |       | j                  |j
                  j                  |<   |j
                  j                  | j                     j                  |       y rf   )r:
  r  r  r  ro  r^  r  r  )r   rn  rels      ri   add_refzMetadata.add_ref  si    oo		%##E*$(JJ		5!		  ,33E:rk   c                 \   |j                   }| j                  |= | j                  |   D cg c]  }||ur|
 c}| j                  |<   |j                  j                  |= |j                  j
                  }|| j                     D cg c]  }||ur|
 c}|| j                  <   y c c}w c c}w rf   )r:
  r  r  r^  r  r  ro  )r   rn  r  r  r  s        ri   
remove_refzMetadata.remove_ref  s    ooIIe+/??3+?  3a#$E> !"  3IIu%111?

1K &9A)*% '( &9tzz"	 3&9s   B$B)c                 6    || j                   |j                  <   y rf   r  r  rG
  s     ri   add_manytomanyzMetadata.add_manytomany  s    &+

#rk   c                 2    | j                   |j                  = y rf   r  rG
  s     ri   remove_manytomanyzMetadata.remove_manytomany  s    OOEJJ'rk   c                     | j                   _t        | j                  | j                  D cg c]  }|j                   c}| j
                  | j                  | j                        | _         | j                   S c c}w )N)r4  r(  r  )rT  r[   rh  rB  r)  r4  ro  r  rG
  s     ri   r_  zMetadata.table  s`    ;;040B0BCu""C{{zz--)DK {{	 Ds   A8
c                     t        d      )NzCannot set the "table".r  r  s     ri   r_  zMetadata.table  s    677rk   c                     d | _         y rf   )rT  r  s    ri   r_  zMetadata.table  r  rk   c                     | j                   S rf   )r1  r  s    ri   r4  zMetadata.schema  s    ||rk   c                     || _         | `y rf   )r1  r_  r  s     ri   r4  zMetadata.schema  s    Jrk   c                     | j                   r t        | j                   | j                        S t        | j                        S rf   )r1  r6   rh  r  s    ri   r	  zMetadata.entity  s-    <<$,,88$//**rk   c                     t        | j                        | _        | j                  D cg c]  }|j                   c}| _        y c c}w rf   )r   r  rB  r  r  r  s     ri   _update_sorted_fieldszMetadata._update_sorted_fields  s5    !$"9"9:373E3E"Fa166"F"Fs   Ac                    || j                   v r| j                  |       n,|| j                  v r| j                  | j                  |          t	        |t
              s>| `|j                  | j                  ||       || j                   |j                  <   || j                  |j                  <   || j                  |j                  <   || j                  |j                  <   | j                  j                  |       | j                          |j                   |j                   | j"                  |<   t%        |j                         r2| j&                  j)                  |j                  |j                   f       nA|j                   | j*                  |j                  <   n|j                  | j                  ||       t	        |t,              r| j/                  |       y t	        |t0              r|j                  r| j3                  |       y y y rf   )rm  remove_fieldr  r  rg   r  r_  r  ro  r  r  r)  r  r  rC  r  r  r.  r,  r  r  r  r<   r  rH   r  )r   rH  rn  rc
  s       ri   r  zMetadata.add_field  s   $j)4??*""4??:#>?%+
JJtzz:}=&+DKK

#.3DLL**+(-DMM%**%/4DMM%++,##**51&&(}}(',}}e$U]]+//66

8=8G H 9>D))%**5JJtzz:}=e_-LL/EJJ& 5?/rk   c                    || j                   vry | `| j                   j                  |      }| j                  |j                  = | j
                  |= 	 | j
                  |j                  = | j                  j                  |       | j                          |j                  | j                  |= t        |j                        rCt        | j                        D ]*  \  }\  }}||k(  s| j                  j                  |        n( n&| j                  j                  |j                   d        t#        |t$              r| j'                  |       y y # t        $ r Y w xY wrf   )rm  r_  r  r  r)  r  r   r  r  r  r  r.  r,  r+  r  r  r  rg   r<   r  )r   rH  originalr  r  r  s         ri   r  zMetadata.remove_field  s1   T[[(J;;??:.LL--.MM*%	h223 	&&x0""$'h'))*$-d.I.I$J LAyaz)3377:
 %%))(-->h0OOH% 1  		s   E 	EEc                     t        |t              | _        | j                  ||       || _        |j
                  xs t        |j                        | _        y rf   )rg   r&   rA  r  r3  r	  r   rq	  )r   r  rn  s      ri   r  zMetadata.set_primary_key#  sI    '|<tU#    !  	rk   c                     | j                   r:t        | j                  j                  D cg c]  }| j                  |    c}      S | j                  dur| j                  fS dS c c}w )NFr   )rA  r  r3  r  rm  )r   rH  s     ri   r  zMetadata.get_primary_keys+  sp    ,0,<,<,H,HJ( ++j1 J K K +/*:*:%*GD$$&OROJs   A$c                 v    | j                   j                         }| j                  D ]  \  }} |       ||<    |S rf   )r  r  r  )r   ddrH  r  s       ri   get_default_dictzMetadata.get_default_dict2  s@    ""'')#'#>#> 	'J$YBzN	'	rk   c           	         g }| j                   D ]e  }|j                  r|j                  s|j                  s)|j	                  t        | j                  |f|j                  |j                               g | j                  D ]  }t        |t              r|j	                  |       %t        |t        t        f      s<|\  }}g }|D ]`  }t        |t              r|j	                  | j                  |          2t        |t              r|j	                  |       Tt        d|z         |j	                  t        | j                  ||              |S )Nrp  z;Expected either a field name or a subclass of Node. Got: %s)rZ  )rB  r3  rB  rZ  r  rJ   ro  rk  r	  rg   r  r   r  r  r  r   )r   r	  r  	index_objindex_partsrZ  rm  ry   s           ri   ra  zMetadata.fields_to_index8  s-   ## 	?A}}ww!((z$**qd18801 > ?		?  	NI)T*y)Ie}5&/#V' MD!$,dmmD&9:#D$/d+( *EGK*L M MM z$**fVLM	N  rk   c                     || _         || j                  j                  _        | `t        |t              r|j                  d }| j                  D ]
  } ||        y rf   )	r  ro  r1  r  r_  rg   rT   r  r
  )r   r  hooks      ri   set_databasezMetadata.set_databaseS  sT     '/

$J h&8<<+?HNN 	DN	rk   c                     || _         | `y rf   )rh  r_  )r   rh  s     ri   set_table_namezMetadata.set_table_name`  s    $Jrk   )NNNNNNFNNNNNFFNT)TTTr  )r
  r  r  r  r  r  r  r  r  r  r  r_  r  deleterr4  r	  r  r  r  r  r  r  ra  r  r  r   rk   ri   r  r  H  s    FJ<@AEDHEI$(?B4
2;9,(   \\8 8 ]]    ]]  + +G'B&8"P6rk   r  c                   (     e Zd Zg Z fdZd Z xZS )SubclassAwareMetadatac                 j    t        t        | 
  |g|i | | j                  j	                  |       y rf   )r  r  r  r$  r  r   ro  r  r  r  s       ri   r  zSubclassAwareMetadata.__init__h  s/    #T3EKDKFK5!rk   c                 6    | j                   D ]
  } ||        y rf   )r$  )r   r;   ro  s      ri   
map_modelsz SubclassAwareMetadata.map_modelsl  s    [[ 	EuI	rk   )r
  r  r  r$  r  r  r  r  s   @ri   r  r  e  s    F"rk   r  c                       e Zd Zy)r3   Nr
  r   rk   ri   r3   r3   q  r  rk   r3   c                   h     e Zd Z eg d      Z fdZd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Z xZS )	ModelBase)r  r  r	  r3  r%  r4  r  r=  r  rq  rD  rE  c                 J    t        d |D              st        t            |||fi |S i }|j	                  dd       }|r9|j
                  j                         D ]  \  }}|j                  d      r|||<    t        |dd       }	d x}
}|D ]  }t        |d      s|j                  }|t        |j                        } j                  |j                  z  }|j
                  D ]  }||v s||vs|j
                  |   ||<     |j                  d|j                          |j                  d|j"                         |j
                  j                         D ]J  \  }}||v rt%        |t&              s|j(                  j                  r3t        |j(                        ||<   L  |j	                  dd       xs i }|j+                  d	t,              }|j+                  d
t.              }t        t            |||fi | d x _         _         | fi | _
         | fi | _        g } j
                  j                         D ]V  \  }}t%        |t6              s|j                  r|	rt9        d|z        |j                  r||}
}	D|j;                  ||f       X |	'|dur |||j<                  fnt?               df\  }	}
n&d}	n#t%        |	t@              rd}
d j                  _!        |	dur j                  jE                  |
|	       |D ]!  \  }} j                  jG                  ||       # d|vrtI         d fd       d jJ                  z  }d jL                  i}tO        |tP        f|      }| _(         jS                          tT        jW                           S )Nc              3   <   K   | ]  }t        |t                y wrf   )rg   r  )r   r   s     ri   r   z$ModelBase.__new__.<locals>.<genexpr>|  s     ;:a+;s   r  r  r3  r^  r  r4  schema_optionsmodel_metadata_classschema_manager_classzover-determined primary key %s.Fr^  __composite_key__Tr^
  c                 F    dj                   d| j                         dS )Nr"  r]
  r%  )r
  rF  )r   r-  s    ri   rj   z#ModelBase.__new__.<locals>.<lambda>  s    dlln3. rk   z%sDoesNotExistr  ),r   r  r  r,  r  r  r   rS  r   r  r^  r	   r3  inheritabler  r	  r  r4  rg   r.
  rn  r  r  rV   r2
  r<
  r1  r8   r   r  r  r   r&   rA  r  r  r2  r
  r  r  r3   validate_modelr0   r  )r-  r  basesr  r  meta_optionsrt  r   r   rm	  pk_name	parent_pkr   	base_metaall_inheritablesoptsr  Schemarm  rF  r   rn  exc_name	exc_attrsexception_classr  s   `                        ri   r,  zModelBase.__new__z  s   ;U;;C0dE5 ;39; ; yy&++- (1||C(&'LO( T=$/"")
  	1A1g&I $Y%:%:;	!oo	0J0JJO'' <'A\,A&/&8&8&;LO< ##J	0B0BC##Hi.>.>?****, 1A:xa/8K8K'0E!H	1	1(   !148>B 6A!!"8-H Is+CueNvN%))s{--	S*E*,,,,. 	0JC%'$$$%F%MNN&&"'BMM3,/	0 :%"+"7 !*9>>: )T2 G L))G&*CII#U?II%%gr2! 	-KD%IIe,	- U"C &. / $cll2!3>>2	x,)D* 	""3'
rk   c                      d| j                   z  S )Nz<Model: %s>)r
  r  s    ri   r^
  zModelBase.__repr__  s    t}},,rk   c                 4    t        | j                               S rf   )r  r  r  s    ri   r  zModelBase.__iter__  s    DKKM""rk   c                 $    | j                  |      S rf   )	get_by_idr[  s     ri   r!  zModelBase.__getitem__  s    ~~c""rk   c                 (    | j                  ||       y rf   )	set_by_id)r   rF  r   s      ri   r$  zModelBase.__setitem__  s    sE"rk   c                 &    | j                  |       y rf   )delete_by_idr[  s     ri   r
  zModelBase.__delitem__  s    #rk   c                 R    	 | j                  |       y# | j                  $ r Y yw xY wr  )r  r3   r[  s     ri   r2  zModelBase.__contains__  s2    	NN3     		s    &&c                 >    | j                         j                         S rf   )r  rO  r  s    ri   rD  zModelBase.__len__  s    {{}""$$rk   c                      yrw  r   r  s    ri   __bool__zModelBase.__bool__  s    trk   c                 L    |j                  | j                  j                        S rf   )r`  r^  r_  ro  s     ri   r\  zModelBase.__sql__  s    wwtzz''((rk   )r
  r  r  rx  r  r,  r^
  r  r!  r$  r
  r2  rD  r  r\  r  r  s   @ri   r  r  t  sD     : ;K
Zx-###%#)rk   r  c                       e Zd Zd Zd Zd Zy)r=  c                 <    || _         || _        || _        || _        y rf   )r$  r  r9  r:  )r   r$  r  r9  r:  s        ri   r  z_BoundModelsContext.__init__  s     "*rk   c           	      4   g | _         | j                  D ]w  }| j                   j                  |j                  j                         |j                  | j                  | j                  | j                  t        | j                               y | j                  S N)r  )	r'  r$  r  r^  r  r  r9  r:  rx  )r   ro  s     ri   r  z_BoundModelsContext.__enter__  sx     [[ 	2E&&u{{';';<JJt}}dnnd6H6H #DKK 0  2	2 {{rk   c           	          t        | j                  | j                        D ]A  \  }}|j                  || j                  | j
                  t        | j                               C y r  )r%  r$  r'  r  r9  r:  rx  )r   rV  rW  rX  ro  r  s         ri   r  z_BoundModelsContext.__exit__  sS    T[[$*=*=> 	2IE2JJr4>>4+=+= #DKK 0  2	2rk   N)r
  r  r  r  r  r  r   rk   ri   r=  r=    s    +2rk   r=  c                      e Zd Zd Zd Zed        Zed2d       Zed        Zed        Z	ed2d       Z
ed2d	       Zed2d
       Zed        Zed2d       Zed2d       Zed        Zed        Zed        Zed2d       Zed2d       Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zd Z ee      Zej@                  d        Zd Z!d Z"d Z#d3d Z$d! Z%ed"        Z&ed#        Z'd4d$Z(d5d%Z)d& Z*d' Z+d( Z,d) Z-ed6d*       Z.ed7d+       Z/ed,        Z0ed8d-       Z1ed7d.       Z2ed/        Z3ed0        Z4ed1        Z5y)9rI   c                    |j                  dd       ri | _        t               | _        n9| j                  j                         | _        t        | j                        | _        i | _        |D ]  }t        | |||           y )N__no_default__)r  r2
  rx  r4
  r^  r  r<
  r2  )r   r  r  r   s       ri   r  zModel.__init__  sk    ::&-DM%DK JJ779DMdmm,DK 	(AD!VAY'	(rk   c                 `    | j                   j                  durt        | j                        S dS )NFzn/a)r^  r3  r  _pkr  s    ri   rF  zModel.__str__  s&     $

 6 6e Cs488}NNrk   c                      y rf   r   r-  s    ri   r  zModel.validate_model  s    rk   Nc                     t        | |      S rf   )
ModelAlias)r-  r#  s     ri   r#  zModel.alias  s    #u%%rk   c                 T    | }|s| j                   j                  }t        | ||      S )N)
is_default)r^  rB  ModelSelect)r-  rm  r	  s      ri   r  zModel.select"  s*    Z
YY,,F3:>>rk   c           	         i }|r]t        |t              s|rt        d|z        |S |D ]6  }	 t        |t              r|n| j                  j
                  |   }||   ||<   8 |r'|D ]"  }	 ||   || j                  j
                  |   <   $ |S # t        $ r' t        |t              st        d|d|d      |}Y dw xY w# t        $ r ||   |t        | |      <   Y ww xY w)Nz/Data cannot be mixed with keyword arguments: %szUnrecognized field name: "z" in r  )	rg   r   r   r8   r^  r  r   r  r   )r-  r
  r  
normalizedrF  rn  s         ri   _normalize_datazModel._normalize_data)  s   
dD)$ &57;&< = = 	. $.sE$:S"%))"4"4S"9  %)I
5!	.  @@:@+Jsyy11#67@
     %c40(,/*7 8 8E	    @4:3KJwsC01@s#   +B*C -B=<B= CCc                 :    t        | | j                  ||            S rf   )ModelUpdater  )r-  _Model__datar  s      ri   r  zModel.updateD      3 3 3FF CDDrk   c                 :    t        | | j                  ||            S rf   )ModelInsertr  r-  r  rC  s      ri   rC  zModel.insertH  r  rk   c                     t        | ||      S rA  )r  r-  r}  rm  s      ri   insert_manyzModel.insert_manyL  s    3tV<<rk   c                 ~    |D cg c]   }t        |t              rt        | |      n|" }}t        | ||      S c c}w rA  )rg   r  r   r  )r-  rr  rm  rn  r  s        ri   insert_fromzModel.insert_fromP  sM     ,23"' +5UC*@73& 3 33ug>>3s   %:c                 F     | j                   |fi |j                  d      S r  rI  r  s      ri   rm   zModel.replaceV  s#    szz&+F+77	BBrk   c                 F    | j                  ||      j                  d      S )N)r}  rm  rH  )r  rJ  r  s      ri   replace_manyzModel.replace_manyZ  s"    $v6Y'	)rk   c                     t        | ||      S rf   )ModelRaw)r-  r`  r  s      ri   rawz	Model.raw`  s    S&))rk   c                     t        |       S rf   )ModelDeleter  s    ri   rO  zModel.deleted  s    3rk   c                 :     | di |}|j                  d       |S )NT)force_insertr   )save)r-  rr  insts      ri   createzModel.createh  s     |U|		t	$rk   c                    |t        ||      }n|g}t        | j                  j                        }| j                  j                  r1| j                  j
                  j                  }|j                  |       | j                  j                  j                  r3| j                  j
                  dur| j                  j                         }nd }|D cg c]  }| j                  j                  |    }}g |D ]I  }	t        |	t              rj                  |	j                         /j                  |	j                         K |D ]s  }
fd|
D        }| j!                  ||      j#                         }|s2|5t%        ||
      D ]0  \  }}t%        ||      D ]  \  }}t'        ||j                  |        2 u y c c}w )NFc              3   \   K   | ]  }D cg c]  }t        ||       c}   y c c}w wrf   )r   )r   ro  r  r  s      ri   r   z$Model.bulk_create.<locals>.<genexpr>  s.      ) 277AgeQ'7 )7s   	,',)rm  )r$   r   r^  r  r	  r3  r  r  r  rJ  r  rm  rg   r<   r  r  r  r3  r%  r2  )r-  
model_list
batch_sizebatchesr  r  	pk_fieldsrH  rm  rn  batchr/  rr	  rf  ro  pk_fieldobj_idr  s                    @ri   bulk_createzModel.bulk_createn  s   !j*5G!lG39977899##ii++00Gw'99..99  -		224IIALM:#))"":.MM 	)E%1U112UZZ(		)  	>E)"')E//%/7??ACS_"%c5/ >JC.1)S.A >*6x}}f=>>	> Ns    F>c                    t        | j                  j                  t              rt	        d      |D cg c]-  }t        |t
              r| j                  j                  |   n|/ }}|D cg c]*  }t        |t              r|j                  n|j                  , }}|t        ||      }n|g}d}| j                  j                  }	|D ]  }
|
D cg c]  }|j                   }}i }t        ||      D ]x  \  }}g }|
D ][  }t        ||      }t        |t              s|j                  |      }|j!                  |	j#                  |j                        |f       ] t%        |	|      }|||<   z || j'                  |      j)                  | j                  j                  j+                  |            j-                         z  } |S c c}w c c}w c c}w )NzGbulk_update() is not supported for models with a composite primary key.r   )rg   r^  r3  r&   r   r  rm  r<   r  r  r$   r  r%  r   r  rm
  r  r  r    r  r]  r  r3  )r-  r)  rm  r*  r  rn  r  r+  r   rm	  r-  ro  id_listr  r   r/  r   cases                     ri   bulk_updatezModel.bulk_update  s   cii++\: 8 9 9
 "# *4As);#))""1%B # # /56%* *4E?)K%%jj! 6 6 !j*5G!lGYY"" 	E.34Uuyy4G4F"651 %t" BE#E40E%eT2 % 0 0 7LL"++eii"8%!@A	B
 B $u% #**V$5..227;<79A	  =#6 5s   2G,/GGc                     t        | d      S rB  )NoopModelSelectr  s    ri   noopz
Model.noop  s    sB''rk   c                 R   | j                         }|rrt        |      dk(  rUt        |d   t              rB| j                  j
                  r,|j                  | j                  j                  |d   k(        }n |j                  | }|r |j                  di |}|j                         S )Nrr   r   r   )
r  r   rg   r   r^  r	  r]  r3  r^  r  )r-  rr  filterssqs       ri   r  z	Model.get  s    ZZ\5zQ:eAh#<yy''XXcii33uQx?@RXXu%%W%Bvvxrk   c                 F    	  | j                   |i |S # t        $ r Y y w xY wrf   )r  r3   )r-  rr  r9  s      ri   get_or_nonezModel.get_or_none  s/    	377E-W-- 		s    	  c                 R    | j                  | j                  j                  |k(        S rf   )r  r^  r3  r-  rm	  s     ri   r  zModel.get_by_id  s     wwsyy,,233rk   c                     || j                  |      j                         S | j                  |      j                  | j                  j
                  |k(        j                         S rf   )rC  r3  r  r]  r^  r3  )r-  rF  r   s      ri   r  zModel.set_by_id  sP    ;::e$,,..JJu%U39900C78Drk   c                     | j                         j                  | j                  j                  |k(        j	                         S rf   )rO  r]  r^  r3  r3  r>  s     ri   r  zModel.delete_by_id  s1    zz|!!#))"7"72"=>FFHHrk   c                 J   |j                  di       }| j                         }|j                         D ]#  \  }}|j                  t	        | |      |k(        }% 	 |j                         dfS # | j                  $ r 	 |r|j                  |       | j                  j                  j                         5   | j                  di |dfcd d d        cY S # 1 sw Y   nxY wY y # t        $ r4}	 |j                         dfcY d }~cY S # | j                  $ r |w xY wd }~ww xY ww xY w)Nr.  FTr   )r  r  r   r]  r   r  r3   r  r^  r  r  r&  rA   )r-  r  r.  rr  rn  r   excs          ri   get_or_createzModel.get_or_create  s   ::j"-

"LLN 	>LE5KKU 3u <=E	>	99;%% 
		MM(+YY''..0 6%3:://56 6 6 6!  99;--'' I
	s`   A, ,D"<7C!3C	C!D"C	C!!	D+D<D=D"DDDD"c                 B     | j                         j                  |i |S rf   )r  r^  )r-  dq_nodesr9  s      ri   r^  zModel.filter  s     "szz|""H888rk   c                     | j                   j                  dur*t        | | j                   j                  j                        S y r   )r^  r3  r   r`
  r  s    ri   get_idzModel.get_id  s8    
 ::!!.4!7!7!A!ABB /rk   c                 Z    t        | | j                  j                  j                  |       y rf   )r2  r^  r3  r  r  s     ri   r  z	Model._pk  s    djj,,1159rk   c                 H    | j                   j                  | j                  k(  S rf   )r^  r3  r  r  s    ri   _pk_exprzModel._pk_expr  s    zz%%11rk   c                     i }|D ]V  }t        |t              r| j                  j                  |   }|j                  |v s;||j                     ||j                  <   X |S rf   )rg   r  r^  r  r  )r   
field_dictonlynew_datarn  s        ri   _prune_fieldszModel._prune_fields  s^     	>E%%

++E2zzZ''1%**'=$		>
 rk   c           	         | j                   j                  D ]f  }|j                  }||v xr& ||   d u xr | j                  j	                  |      d u}|s>t        | |t        | |             | j                  |   ||<   h y rf   )r^  r  r  r<
  r  r2  r   r2
  )r   rL  foreign_key_fieldforeign_key
conditionss        ri   _populate_unsaved_relationsz!Model._populate_unsaved_relations  s    !% 	E+00Kz) :;'4/:  -T9  k74+EF*.--*D
;'	Erk   c                    | j                   j                         }| j                  j                  dur#| j                  j                  }| j                  }nd x}}|| j                  ||      }nQ| j                  j                  r;|s9| j                  || j                        }|s| j                  j                          y| j                  |       d}| j                  j                  r||j                  |j                  d        ||s| j                  j                  r$|j                  D ]  }|j                  |d         n|j                  |j                  d        |st!        d       | j"                  di |j%                  | j'                               j)                         }n|g | j*                  di |j)                         }|e| j                  j                  s|M|| _        | j                  j-                  |j                         n  | j*                  di |j)                          | xj                  t/        |      z  c_        |S )NFrr   zno data to save!r   )r2
  r  r^  r3  r  rO  r  dirty_fieldsr4
  r'  rT  r	  r  r  rA  r  r   r  r]  rJ  r3  rC  r  rx  )	r   r#  rM  rL  r.  pk_valuer}  pk_part_namerm	  s	            ri   r$  z
Model.save  s   ]]'')
::!!.zz--HxxH"&&Hx++J=JZZ''++J8I8IJJ!!#((4::$$)9NN8==$/zz''$,$8$8 7LNN<67 x}}d3 !3444;;,,224==?CKKMD!*z*224B~4::#<#<#+#3##HMM2DKK%*%--/s:&rk   c                 ,    t        | j                        S rf   )r   r4
  r  s    ri   is_dirtyzModel.is_dirtyJ  r  rk   c                     | j                   j                  D cg c]  }|j                  | j                  v s| c}S c c}w rf   )r^  rB  r  r4
  r  s     ri   rV  zModel.dirty_fieldsM  s/    ::33Maqvv7LMMMs   >>c                 T    | j                   D cg c]  }|j                   c}S c c}w rf   )rV  r  r  s     ri   dirty_field_nameszModel.dirty_field_namesQ  s      $ 1 121222s   %c              #     K   t        |       }t        |       d fg}i }t               }|r|j                         \  }}||v r|j                  |       |j                  j
                  j                         D ]  \  }	}
|
|u s|'|	| j                  |	j                  j                     k(  }n|	|z  }|
j                  |
j                  j                        j                  |      }|	j                  r|s{|j                  |
g       j                  ||	f       |	j                  r|r|j                  |
|f        |rt!        t#        t%        |                  D ]"  }|j'                  |d      D ]  \  }}||f  $ y wrB  )r  rx  r  r  r^  r  r   r2
  r>
  r  r  r3  r]  r*  r	  r  r  r"  r   r  )r   search_nullableexclude_null_childrenmodel_classr<  queriesr2  r  rr  r  r:
  rt  rN  r   r:  ro   s                   ri   dependencieszModel.dependenciesU  sa    4jt*d#$u 99;LE5}HHUO!&!5!5!;!;!= <I+u}$--0A0A"BBD;D%,,Y__-H-HI"U4[ ww/&&y"5<<dBZH GG(=i%:;< & +d7m45 	A Q+ A!e	s   C0F31F%F>AFc                    |r| j                  |       D ]  \  }}|j                  }|j                  r>|s< |j                  di |j                  d ij                  |      j                          \|j                         j                  |      j                           t        |       j                         j                  | j                               j                         S )N)r`  r   )
rc  ro  r*  r  r  r]  r3  rO  r  rJ  )r   r  delete_nullablerr  r  ro  s         ri   delete_instancezModel.delete_instancer  s    !..EX.Y :	r77? ELL3BGGT?399%@HHJLLN((/779: Dz  "((9AACCrk   c                 D    t        | j                  | j                  f      S rf   )r  r  r  r  s    ri   r  zModel.__hash__|  s    T^^TXX.//rk   c                     |j                   | j                   k(  xr) | j                  d uxr | j                  |j                  k(  S rf   )r  r  r  s     ri   r  zModel.__eq__  s=    OOt~~- "HHD "HH		!	#rk   c                     | |k(   S rf   r   r  s     ri   r   zModel.__ne__  s    5=  rk   c                    |j                   j                  G|j                   j                  r1	 |j                  t	        | |j                   j                              S |j                  t	        t        | | j                  j                  j                        | j                  j                  j                              S # t
        t        f$ r Y sw xY w)Nre  )r@  rf  r-  r`  ra   r   r   r   r^  r3  r  r.  ro  s     ri   r\  zModel.__sql__  s     99*syy/C/CwwuTSYY5H5HIJJ wwuWT4::+A+A+F+FG'+zz'='='F'FH I 	I z* s   /C   CCc                 >   | j                   j                  |u}| j                   j                  |       |s|re|
t               }| j                   j	                  ||      }|D ]7  \  }}}	||vs|j                   j                  |       |j                  |       9 |S )N)r  r  )r^  r  r  rx  r  r  )
r-  r  r9  r:  r  is_differentGr  ro  
is_backrefs
             ri   r  z
Model.bind  s    yy))9		x(5		%%9}%MA() ($5*(KK,,X6LL'( rk   c                      t        | f|||      S rf   r<  )r-  r  r9  r:  s       ri   r=  zModel.bind_ctx  s    "C68YNNrk   c                     | j                   }| j                  j                  j                  |j                  j
                  |j                        S rf   )r^  r1  r  r  r_  r
  r4  )r-  Ms     ri   r  zModel.table_exists  s6    II{{##001A1A188LLrk   c                 \   d|v rt        d       |j                  d      }|r1| j                  j                  j                  s| j                         ry | j                  j                  r&|j                  d| j                  j                          | j                  j                  |fi | y )Nfail_silentlyzU"fail_silently" has been deprecated in favor of "safe" for the create_table() method.r=  )
r   r  r1  r  rF  r  r^  r=  r	  r  )r-  r[  r%  s      ri   r#  zModel.create_table  s    g% C D;;/D,,>>!99{CII,?,?@t/w/rk   c                    |r1| j                   j                  j                  s| j                         sy | j                  j
                  r&|j                  d| j                  j
                          | j                   j                  ||fi | y )Nr=  )r1  r  rG  r  r^  r=  r	  r  )r-  r[  r  r%  s       ri   r(  zModel.drop_table  sh    ,,<<##%99{CII,?,?@T>=W=rk   c                 <     | j                   j                  di | y rB  )r1  rI  )r-  r%  s     ri   rI  zModel.truncate_table  s    """-W-rk   c                     t        | |fi |S rf   )rJ   r-  rm  r  s      ri   rB  zModel.index  s    #v000rk   c                    t        |      dk(  rBt        |d   t        t        f      r)| j                  j
                  j                  |d          y | j                  j
                  j                  t        | |fi |       y r   )r   rg   rY   r?   r^  r	  r  rJ   rw  s      ri   	add_indexzModel.add_index  s_    v;!
6!9sEl CII$$VAY/II$$ZV%Fv%FGrk   rf   r   r
  r  )TTNrC  r  )6r
  r  r  r  rF  classmethodr  r#  r  r  r  rC  r  r  rm   r  r  rO  r&  r0  r4  r7  r  r<  r  r  r  rC  r^  rG  r  r  r  rJ  rO  rT  r$  rZ  rV  r]  rc  rf  r  r  r   r\  r  r=  r  r#  r(  rI  rB  ry  r   rk   ri   rI   rI   
  s   
(O   & & ? ?  4 E E E E = = ? ?
 C C ) )
 * *      
  >  >D $ $L ( (     4 4 D D I I  ( 9 9C 6
CZZ: :2	E)V! N N 3 3:D0#!I(   O O M M 0 0 > > . . 1 1 H Hrk   rI   )	metaclassc                   8    e Zd Zd	dZd Zd Zd Zd Zd Zd Z	y)
r  Nc                 @    || j                   d<   || j                   d<   y )Nro  r#  )r  )r   ro  r#  s      ri   r  zModelAlias.__init__  s    !&g!&grk   c                    | j                   f| j                   j                  z   D ]6  }	 |j                  |   }t        |t              r|j                  d |       c S 8 t        | j                   |      }t        |t              r2t        j                  | |      | j                  |<   | j                  |   S |S # t        $ r Y w xY wrf   )ro  rW  r  rg   r	  r  r   r   r8   
FieldAliasr&  )r   r   r   r  
model_attrs        ri   r   zModelAlias.__getattr__  s    
 **!5!55 	Ajj&c?3;;tT22 4	 TZZ.
j%(","3"3D*"EDMM$==&&  s   0B88	CCc                     t        d      )Nz'Cannot set attributes on model aliases.r  r   s      ri   r  zModelAlias.__setattr__  s    FGGrk   c                 |    | j                   j                  j                  D cg c]  }t        | |       c}S c c}w rf   )ro  r^  r  r   )r   r   s     ri   get_field_aliaseszModelAlias.get_field_aliases  s-    *.***:*:*M*MNQa NNNs   9c                 >    |s| j                         }t        | |      S rf   )r  r
  )r   	selections     ri   r  zModelAlias.select  s     ..0I4++rk   c                 &     | j                   di |S rB  )ro  )r   r  s     ri   r  zModelAlias.__call__  s    tzz#F##rk   c                    |j                   t        k(  r|j                  | j                        S | j                  r| j                  |j
                  | <   |j                   t        k(  rc|j                  | j                  j                  j                        j                  d      j                  t        |j
                  |                S |j                  t        |j
                  |                S r  )r.  r{  r`  ro  r#  r?  ry  r^  r	  rR  r6   ro  s     ri   r\  zModelAlias.__sql__    s    99$774::&&::&*jjCd#99$S))001WV_S 1 1$ 789; 776#"3"3D"9:;;rk   rf   )
r
  r  r  r  r   r  r  r  r  r\  r   rk   ri   r  r    s'    '&HO,
$<rk   r  c                   F    e Zd Zd Zed        Zd Zd Zd Zd Z	d Z
d Zy	)
r  c                 .    || _         || _        || _        y rf   )r  ro  rn  )r   r  rn  s      ri   r  zFieldAlias.__init__   s    

rk   c                 >     G d d| t        |            } |||      S )Nc                       e Zd Zy)&FieldAlias.create.<locals>._FieldAliasNr
  r   rk   ri   _FieldAliasr     s    rk   r  )r  )r-  r  rn  r  s       ri   r&  zFieldAlias.create   s!    	#tE{ 	65))rk   c                 B    t        | j                  | j                        S rf   )r  r  rn  r  s    ri   r  zFieldAlias.clone   s    $++tzz22rk   c                 8    | j                   j                  |      S rf   )rn  rf
  r  s     ri   rf
  zFieldAlias.adapt"   s    4::#3#3E#::rk   c                 8    | j                   j                  |      S rf   )rn  rX  r  s     ri   rX  zFieldAlias.python_value#   s    $***A*A%*H#Hrk   c                 8    | j                   j                  |      S rf   )rn  r.  r  s     ri   r.  zFieldAlias.db_value$   s    djj&9&9%&@@rk   c                 P    |dk(  r| j                   S t        | j                  |      S )Nro  )r  r   rn  r   s     ri   r   zFieldAlias.__getattr__%   s"    "got{{L74::t3LLrk   c                 t    |j                  t        | j                  | j                  j                              S rf   )r`  r%   r  rn  r)  ro  s     ri   r\  zFieldAlias.__sql__(   s&    wwvdkk4::+A+ABCCrk   N)r
  r  r  r  rz  r&  r  rf
  rX  r.  r   r\  r   rk   ri   r  r     s7    
 * *
3 ;H@MDrk   r  c                      t                t               g  fdd }t         |      D ]
  } |        S )Nc                 R   | v r| vrj                  |        | j                  j                  j                         D ]  \  }}|j                  r |        | j                  j
                  r#| j                  j
                  D ]
  } |        j                  |        y y y rf   )r  r^  r  r   r  r  r  )ro  rR  r:
  
dependencydfsr$  rb  r2  s       ri   r  zsort_models.<locals>.dfs0   s    F?uD0HHUO*/++*:*:*@*@*B #&Y #++	N	#
 {{%%"'++"8"8 $J
O$OOE"  1?rk   c                 Z    | j                   j                  | j                   j                  fS rf   )r^  r  rh  )r   s    ri   rj   zsort_models.<locals>.<lambda>=   s    qww||QWW%7%78 rk   r   )rx  r  )r$  r`  r   r  rb  r2  s   `  @@@ri   r"  r"  ,   sF    [F5DH# 9EF& AOrk   c                        e Zd Zej                  Z fdZej                  dd       Z	ej                  d        Z
d Zd Z xZS )_ModelQueryHelperc                     t        t        | 
  |i | | j                  s&| j                  j
                  j                  | _        y y rf   )r  r  r  r  ro  r^  r  r  s      ri   r  z_ModelQueryHelper.__init__F   s;    /@@~~!ZZ--66DN rk   c                 d    t         j                  | _        || j                  | _        y || _        y rf   )r  r  r  ro  r  r   s     ri   r"  z_ModelQueryHelper.objectsK   s%    *5*=DJJ;rk   c                 .    t         j                  | _        y rf   )r  r  r  r  s    ri   r$  z_ModelQueryHelper.modelsP   s    rk   c                 P   | j                   xs | j                  }|t        j                  k(  r| j	                  |      S |t        j
                  k(  r!t        || j                  | j                        S |t        j                  k(  r!t        || j                  | j                        S |t        j                  k(  r!t        || j                  | j                        S |t        j                  k(  r,t        || j                  | j                  | j                        S t!        d|z        r$  )r  r%  r  r  _get_model_cursor_wrapperr~  ModelDictCursorWrapperro  r  r}  ModelTupleCursorWrapperr  ModelNamedTupleCursorWrapperr  ModelObjectCursorWrapperr  r   r*  s      ri   r-  z%_ModelQueryHelper._get_cursor_wrapperT   s    >>:T%:%:syy 11&99!)&$**dooNN"*64::tOO(/

04A A(+FDJJ,0OOT=N=NP P ;hFGGrk   c                 F    t        || j                  g | j                        S rf   )r  ro  r  s     ri   r  z+_ModelQueryHelper._get_model_cursor_wrappere   s    '

B

KKrk   rf   )r
  r  r  r  r  r%  r  r  r  r"  r$  r-  r  r  r  s   @ri   r  r  C   sP    yy7
 
YYO O 
YY# #H"Lrk   r  c                   $     e Zd Z fdZd Z xZS )r  c                 N    || _         d| _        t        t        |   d||d| y )Nr   rA  )ro  r  r  r  r  )r   ro  r`  r  r  r  s        ri   r  zModelRaw.__init__j   s*    
h&H3vHHrk   c                     	 | j                         d   S # t        $ rA | j                         \  }}| j                  j	                  | j                  d|d|      w xY w)Nr   . instance matching query does not exist:
SQL: 	
Params: )r3  r  r`  ro  r3   rB  s      ri   r  zModelRaw.geto   sc    	E<<>!$$ 	E((*KC**))+/::sF+D E E	Es
    A
A)r
  r  r  r  r  r  r  s   @ri   r  r  i   s    I
Erk   r  c                        e Zd ZdZd ZeZd ZeZd ZeZ	d Z
e
Zd Zd Z fdZd fd		Zd
 Zej$                  d        ZddZddZej$                  d        Z xZS )BaseModelSelectNc                 2    t        | j                  | d|      S )Nrr  ModelCompoundSelectQueryro  r  s     ri   rx  zBaseModelSelect.union_all|       '

D+sKKrk   c                 2    t        | j                  | d|      S )Nrs  r  r  s     ri   r{  zBaseModelSelect.union   s    '

D'3GGrk   c                 2    t        | j                  | d|      S )Nrt  r  r  s     ri   rw  zBaseModelSelect.intersect   r  rk   c                 2    t        | j                  | d|      S )Nru  r  r  s     ri   rx  zBaseModelSelect.except_   s    '

D(CHHrk   c                 d    | j                   s| j                          t        | j                         S rf   )r  r3  r  r  s    ri   r  zBaseModelSelect.__iter__   s%    ##LLND(())rk   c                     | j                   d t        j                  fv ry| j                   t        j                  k(  xr6 t	        | j
                  t              xr t        | j
                  t              S rw  )	r  r  r  r  rg   r  r  r  rI   r  s    ri   _model_rowszBaseModelSelect._model_rows   sY    >>dCII..#//1 54,,d354,,e4	6rk   c                     | j                   d u }t        t        |   |      }|r>| j                  r2| j                         r"t        t        |      | | j                  |       |S Nr  )r  r  r  r2  
_load_treer  _load_relatedr   )r   r  	first_runr)
  r  s       ri   r2  zBaseModelSelect._execute   sX    ((D0	>xHT-=-=-?$~.doo#+-rk   c                 X    | j                   rt        d      t        t        |   |      S )Nz/with_related() is incompatible with iterator().)r  r   r  r  r:  r  s     ri   r:  zBaseModelSelect.iterator   s.    ??AC C_d4X>>rk   c                      t        | g|i |S rf   )rQ   )r   
subqueriesr  s      ri   rQ   zBaseModelSelect.prefetch   s    4z4V44rk   c                 2    t        d |D              | _        y )Nc              3   V   K   | ]!  }t        |t              r|n
t        |       # y wrf   rg   rG   )r   r?  s     ri   r   z/BaseModelSelect.with_related.<locals>.<genexpr>   s*       0$% &04%8d1g E  0   '))r  r  r  s     ri   with_relatedzBaseModelSelect.with_related   s        0). 0 0rk   c                     | j                  dd      }d |_        	 |j                  |      d   S # t        $ rA |j	                         \  }}| j
                  j                  |j
                  d|d|      w xY w)Nrr   r   r  r  )rb  r  r3  r  r`  ro  r3   )r   r  r  r`  r  s        ri   r  zBaseModelSelect.get   s~    a# $	F==*1-- 	F))+KC**))+0;;V+E F F	Fs
   / A
A9c                 f    	 | j                  |      S # | j                  j                  $ r Y y w xY wr  )r  ro  r3   r:  s     ri   r<  zBaseModelSelect.get_or_none   s4    	88X8..zz&& 		s    00c           
      h   g }|D ]  }t        |      r&|j                  |j                  j                         4t	        |t
              rK|j                  st        d      |j                  |j                  D cg c]  }t        ||       c}       |j                  |        || _
        y c c}w r  )r]  rn  r^  rB  rg   r[   r/  r   r   r  r  r  s        ri   r  zBaseModelSelect.group_by   s     	(F : :;FE*$ &1 2 2 17!B%- ")!: !B C '	( "	!Bs   9B/
rf   )r
  r  r  r  rx  r	  r{  r  rw  r  rx  r  r  r  r2  r:  rQ   r  r  r  r  r<  r  r  r  s   @ri   r  r  y   s    JLGHFLGIG*
6?5 
YY0 0
	F 
YY" "rk   r  c                   $     e Zd Z fdZd Z xZS )r  c                 :    || _         t        t        |   |i | y rf   )ro  r  r  r  r  s       ri   r  z!ModelCompoundSelectQuery.__init__   s    
&6GGrk   c                 8    | j                   j                  |      S rf   )rS  r  r  s     ri   r  z2ModelCompoundSelectQuery._get_model_cursor_wrapper   s    xx11&99rk   )r
  r  r  r  r  r  r  s   @ri   r  r     s    H:rk   r  c           
         g }| D ]  }t        |      r&|j                  |j                  j                         4t	        |t
              r |j                  |j                                dt	        |t              r@|j                  r4|j                  |j                  D cg c]  }t        ||       c}       |j                  |        |S c c}w rf   )r]  rn  r^  rB  rg   r  r  r[   r/  r   r  )fields_or_modelsrm  fmr  s       ri   _normalize_model_selectr     s    F B<MM"((001J'MM"..01E"r{{MMr{{C72s+CDMM" M Ds   C
c                        e Zd Zd fd	Z fdZ fdZ fdZddZd Zd Z	dd	Z
ej                  ej                  dddfd
       ZddZej                  ddfdZd ZddZd Zd ZddZddZ xZS )r
  c                 ~    |x| _         | _        i | _        || _        t	        |      }t
        t        |   |g|       y rf   )ro  	_join_ctx_joins_is_defaultr  r  r
  r  )r   ro  r  r	  rm  r  s        ri   r  zModelSelect.__init__   s>    &++
T^%()9:k4)5'6:rk   c                     t         t        |          }|j                  j	                         D ci c]  \  }}|t        |       c}}|_        |S c c}}w rf   )r  r
  r  r  r   r   )r   r  rE  joinsr  s       ri   r  zModelSelect.clone   sN    k4.0 !<<--/1ZS%T%[( 11s   Ac                 l    |s| j                   s$t        |      }t        t        |   | }d|_         |S | S r   )r  r  r  r
  r  )r   r  rm  r  r  s       ri   r  zModelSelect.select   s<    4#3#3,-=>F+t3V<E %ELrk   c                 L    t        |      }t        t        |   | }d|_        |S r   )r  r  r
  r  r  )r   r  rm  r  r  s       ri   r  zModelSelect.select_extend!  s+    (1k46?!rk   Nc                 >    || j                   | _        | S || _        | S rf   )ro  r  ro  s     ri   switchzModelSelect.switch
!  s$    '*{ 9<rk   c                     t        |      r|dfS t        |t              r|j                  r|j                  dfS t        |t              r|j
                  dfS t        |t              r|j
                  dfS y)NTFr   )r]  rg   r[   r(  r  ro  r
  )r   rE  s     ri   
_get_modelzModelSelect._get_model!  sg    C=9U#

::u$$Z(99e##[)99e##rk   c           	         t        |t              }|r |xs |j                  }|j                         }| j	                  |      \  }}| j	                  |      \  }}	|r|r|| _        |}
|r|	st        |t              r||j                  |u r$|j                  j                  |j                     }nG|j                  |u r$|j                  j                  |j                     }nt        d|d|d|d      d }nt        |t              r|}d }nd }| j                  ||||      \  }}||rdnd}|	rdnd}|r7t        |t        ||            }t        |t        |j                  |            }n6t        |t        ||            }t        |t        |j                  |            }||k(  }|s(||s|j                  }n|j                  j                  }n|r|||j                   k(  r~|s|t#        d|d|d	      t        |t$              r5t&        }
|xs |j                  }|sBt        |t(              r2|j*                  }n%|r#|| _        |}
|xs |j                  j                  }||
fS )
Nz"on" clause Column z does not belong to z or r  r  r)  zCannot assign join alias to "zF", as this attribute is the object_id_name for the foreign-key field "ru   )rg   r  r  r#  r  r  r%   r  r^  r  r  r   r8   _generate_on_clauser   r>
  r  r   r  r   r[   r
  )r   rE  r  r  r   on_aliasr  src_is_model
dest_modeldest_is_modelr!  r  fk_fieldrn  src_attr	dest_attrrS  r  s                     ri   _normalize_joinzModelSelect._normalize_join!  sU    b%($299DB #'//#"6	<$(OOD$9!
M!DN$K !]
2v8N99#(66rww?HYY$&)//77@H(*,i*E F F B&#'#;#;:x$5 Hj z%16}&3F	!$)(DEC!#wx/A/A8'LMC!#wx'BCC!$0B0BI(NOCSj'
#==D%++00Dh2H333J =A8"M N N f%K&4;;DJtU3}} "DN$K0:++00DD+&&rk   c                 R   |j                   }dx}}||j                  v r|j                  |   }n||j                  v r|j                  |   }d}|s|yt        d|d|d      |At	        |t
              r|j                  n|}|D 	cg c]  }	|	|u s|r|	j                  |u r|	 }}	t        |      dk(  r|d   |fS |B|D ]+  }
|
j                  |j                   j                  k(  s'|
|fc S  t        d	|d|d
      d }t	        |t              r|j                  |j                  }}t        |      }t	        |t              r$t	        |t
              r|j                  n|}||v r|}|4t	        |t              r$t	        |t
              r|j                  n|}||v r|}|dfS c c}	w )NFTr   z#Unable to find foreign key between z and z,. Please specify an explicit join condition.rr   r   z"More than one foreign key between z*. Please specify which you are joining on.)r^  r  r  r   rg   r  rn  r>
  r   r  rC  rS  r  rx  r8   )r   rE  r  r  r  rt  rn  r4  r  r  r  rS  r  fk_setlhs_frhs_fs                   ri   r  zModelSelect._generate_on_clauseb!  s   yy!&&
Y 4??"-IT(((++D1IJ~"!4) * * ! )38Z(Hhnn# $- Dqv+$)@  DI D y>QQ<++:   *77djjoo-z>)* !4) * * b*%vvrvvC ^F#u%%/Z%@		cF?$HJsE$:%/Z%@		cF?$HQDs   	F$c                 >   || j                   n|}|t        j                  k(  s|t        j                  k(  r|d}n|t        j                  k7  rj|t        |dd      rd}| j                  ||||      \  }}}|rL| j                  j                  |g        | j                  |   j                  ||||f       n|t        d      | j                  st        d      | j                  j                         }| j                  j                  t        ||||             y )NTr  Fz)Cannot specify on clause with cross join.r  )r  rE   ry  rz  rw  r   r  r  r	  r  r   r  r  r  )r   r  r  r  rE  r   r!  rI  s           ri   r  zModelSelect.join!  s     #dnn$	T5F5F(Fz$**$zgdJ>$($8$8dB$M!Bk&&sB/C ''t[)(LM^HII566""$tD$	2>?rk   c                 H    | j                  |t        j                  |||      S rf   r  )r   r  r  rE  r   s        ri   r  zModelSelect.left_outer_join!  s    yytC>>rk   c                 ,    | j                  |||||      S rf   )r  )r   rE  r  r  r  r   s         ri   	join_fromzModelSelect.join_from!  s    yyy"c488rk   c                    t        | j                        dk(  r8| j                  s,t        || j                  | j
                  | j                        S t        || j                  | j
                  | j                  | j                        S r  )r   r  r  r  ro  r  ModelCursorWrapperr  s     ri   r  z%ModelSelect._get_model_cursor_wrapper!  sg    t1$T[[+FDJJ,0OOTZZI I!&$**doo"&//4;;@ 	@rk   c                     | j                   }| j                  j                  |g       D ]  \  }}}}||k(  s| c S   | j                  |      j                  |fd|i|j                  |      S )Nr  )r  r  r  r  r  )	r   lmrmr  join_kwargsjoin_ctxr  r  r!  s	            ri   ensure_joinzModelSelect.ensure_join!  sp    >>'+{{r2'> 	#D![!rz	 $t{{2##B=2==DDXNNrk   c                    g }g }t         t        f}t        |j                               D ]9  \  }}| j                  }d|v r:|j                  dd      d   t        v r|j                  dd      \  }}t        |   }n|
t        d   }n	t        d   }d|vrt        ||      }	n|j                  d      D ]  }
| j                  j                  |d      D ]=  \  }}}}t        ||
d       }	||
k(  s!t        |t              s+|j                  |
k(  s;|} ^ t        ||
      }	|nt        |	|      s{|	j                  }|j!                  |	        |j!                   |	|             < ||fS # t        $ r Y w xY w)Nr  rr   rA  r5  r   )r<   rE
  r  r   ro  r  r2   r   r   r  r  rM  rg   r  r#  r:
  r  )r   qdictr/  r  fksrF  r   r  r  r  piecer  r   r  s                 ri   convert_dict_to_nodez ModelSelect.convert_dict_to_node!  sz   0 / 	0JC::Ds{szz$215C**T1-R^%%3 %T3/
 YYt_ 5E,0KKOOD",E 5(dAq*1$t*DZ5=Zj-I-1ZZ5-@#'D!5 &-T5%9
 ,J1L#-#7#7D!LL45 LLJ./9	0: e|  ).$.s   E++	E7	6E7	c                    |rE|rCt        t        j                  |D cg c]  }|j                          c}      t	        di |z  }nm|rBt        t        j                  |D cg c]  }|j                          c}      t               z  }n)|rt	        di |t               z  }n| j                         S t        j                  |g      }g }t               }|r|j                         }t        |t              s#d|j                  fd|j                  ffD ]  \  }	}
t        |
t              r| j                  |
j                        \  }}|D ])  }||vs|j!                  |       |j#                  |       + t        t        j                  |      }|
j$                  rt'        |      }t)        ||	|       |j!                  |
        |r|r|s|j                  }| j                         }|D ]t  }t        |t*              r|j,                  |j.                  }}|}n4t        |t0              r$|j,                  |j.                  }}|j2                  }|j5                        }v |j7                  |      S c c}w c c}w )NrS  r  r   )r
   r   r  r  r5   r~  r
  r  rx  r  rg   rC  rS  r  r  rr  r  r  r  r  r2  r<   ro  r:
  rE
  rn  r  r]  )r   r  r  r   dq_nodero   dq_joins
seen_joinsr  sider  rr  r  r  r  rn  r  r  	field_objs                      ri   r^  zModelSelect.filter!  s   Fhmm-FAaggi-FG|F|$Ghmm-FAaggi-FG!|$Gl6lZ\1G::< wi(U
99;DdJ/!& 1E4883DE $eeR(#'#<#<U[[#ILE5 % 1z1$OOD1&NN401 "(u!=J~~%,Z%8
D$
3HHUO$	 & 6kkG

 	9E%1eooB!	E?3eooB!KK	%%b"i8E	9 {{7##[ .G .Gs   I7
"I<
c                 T     | j                   j                  j                  || |fi |S rf   )ro  r1  rU  )r   r  r[  rt  s       ri   r#  zModelSelect.create_table$"  s(    1tzz!!11$dKdKKrk   c                 8   | j                   rk|rit        | j                        dkD  rQ| j                  j                  j
                  dur/|j                  | j                  j                  j
                        S |j                  t        | j                              S r  )r  r   r  ro  r^  r3  r`  rd  r  s      ri   r  zModelSelect.__sql_selection__'"  sl    DOO0Dq0H::''u4774::++7788ww}T__566rk   r(  rf   r4  r  r  )r
  r  r  r  r  r  r  r  r  r  r  r  r  rE   rr  r  r  r  r  r  r  r^  r#  r  r  r  s   @ri   r
  r
     s    ;	G'R?B 
YY#'::$Dt @ @.? .2ZZDt 9@O!F0$dL7rk   r
  c                       e Zd Zd Zd Zy)r6  c                 `    | j                   j                  j                  j                  |      S rf   )ro  r^  r  r?  ro  s     ri   r\  zNoopModelSelect.__sql__0"  s#    zz((88==rk   c                     t        |      S rf   )r'  r  s     ri   r-  z#NoopModelSelect._get_cursor_wrapper3"  s    V$$rk   N)r
  r  r  r\  r-  r   rk   ri   r6  r6  /"  s    >%rk   r6  c                   .     e Zd Z fdZ fdZd Z xZS )_ModelWriteQueryHelperc                 B    || _         t        t        |   |g|i | y rf   )ro  r  r  r  r  s       ri   r  z_ModelWriteQueryHelper.__init__8"  s$    
$d4ULTLVLrk   c                     g }|D ]D  }t        |      r&|j                  |j                  j                         4|j	                  |       F t        t        |   | S rf   )r]  rn  r^  rB  r  r  r  r  )r   r  r/  rI  r  s       ri   r  z _ModelWriteQueryHelper.returning<"  sU     	#D~TZZ556T"		#
 +T<eDDrk   c                 v    | j                   j                  j                  }|j                  |j                  |<   y rf   )ro  r^  r_  r
  r?  )r   rp  r_  s      ri   r  z'_ModelWriteQueryHelper._set_table_aliasE"  s+    

  &&#(>>% rk   )r
  r  r  r  r  r  r  r  s   @ri   r  r  7"  s    ME2rk   r  c                       e Zd Zy)r  Nr
  r   rk   ri   r  r  J"      rk   r  c                   L     e Zd Zej                  Z fdZ fdZd Zd Z	 xZ
S )r  c                 0   t        t        | 
  |i | | j                  v| j                  j
                  j                  U| j                  j
                  j                  j                  r*| j                  j
                  j                         | _        y y y y rf   )	r  r  r  r  ro  r^  r  rJ  r  r  s      ri   r  zModelInsert.__init__Q"  sw    k4)4:6:??"tzz'7'7'@'@'Lzz((99"&**"2"2"C"C"E : (M"rk   c                 j    |r!| j                   t        j                  | _         t        t        |   | S rf   )r  r  r  r  r  r  )r   r  r  s     ri   r  zModelInsert.returningW"  s.    
 / YYDN[$19==rk   c                 B    | j                   j                  j                  S rf   )ro  r^  r.  r  s    ri   r  zModelInsert.get_default_data`"  s    zz(((rk   c                     | j                   j                  j                  }| j                   j                  j                  r|dd  S |S r  )ro  r^  rB  r	  )r   rm  s     ri   r   zModelInsert.get_default_columnsc"  s:    !!//!ZZ--<<vabzH&Hrk   )r
  r  r  r  r}  r%  r  r  r  r   r  r  s   @ri   r  r  N"  s#    yyF>)Irk   r  c                       e Zd Zy)r!  Nr
  r   rk   ri   r!  r!  h"  r
  rk   r!  c                   8     e Zd Z fdZd ZddZd Zd Z xZS )r  c                     || _         || _        |j                  j                  j                  | _        |j                  j                  j                  | _        t        t        | *  ||fg|i | y rf   )	_instance	_accessorr  r>
  r  	_src_attrr  
_dest_attrr  r  r  )r   r  accessorr  r  r  r  s         ri   r  zManyToManyQuery.__init__m"  s^    !!!2277"**4499ot-cC6KDKFKrk   c                 ~    t        |d   t              r$|D cg c]  }t        || j                         c}S |S c c}w r  )rg   rI   r   r  )r   model_or_id_listr  s      ri   _id_listzManyToManyQuery._id_listt"  s:    &q)51=MNcGC1NN Os   :c                    |r| j                          | j                  }t        | j                  | j                        }t        |t              rq|j                  t        |      |j                  j                        }|j                  j                  |j                  |j                  g|      j                          y t        |      }|sy | j!                  |      D cg c]0  }|j                  j"                  ||j                  j"                  |i2 }}|j                  j%                  |      j                          y c c}w )N)rm  rr  )r'  r  r   r  r  rg   rq  r  ra   r  r>
  r  r  r  r3  r  r  r  r  )r   r   r  r  r  rr  rel_idinsertss           ri   r  zManyToManyQuery.addy"  s   JJL>>8e[)MMf  **,E "".. )9)9: / $WY 'E&
 #mmE24  $$f  %%v/ 4G 4 ""..w7??A	4s   !5Ec                    t        | j                  | j                        }t        |t              rt        |j
                  | j                        }|j                  |      }| j                  j                  j                         j                  | j                  j                  |z  | j                  j                  |k(  z        j                         S t        |      }|sy | j                  j                  j                         j                  | j                  j                  | j!                  |      z  | j                  j                  |k(  z        j                         S rf   )r   r  r  rg   rq  ro  r  r  r  r  rO  r]  r  r  r3  r  r  )r   r   r  r5  rN  s        ri   r  zManyToManyQuery.remove"  s   8e[)U[[$//:F}}V,HNN00VXU//8;..&8:; WY  !'ENN00VXU//4==3GG..&8:; WY rk   c                     t        | j                  | j                        }| j                  j                  j                         j                  | j                  j                  |k(        j                         S rf   )	r   r  r  r  r  rO  r]  r  r3  )r   r  s     ri   r'  zManyToManyQuery.clear"  sO    8,,t~~,,67	rk   r(  )	r
  r  r  r  r  r  r  r'  r  r  s   @ri   r  r  l"  s    L 
B. ,rk   r  c                       fd}|S )Nc                 D    	  |       S # t         t        f$ r | cY S w xY wrf   )r   r   )r   	conv_funcs    ri   validatez#safe_python_value.<locals>.validate"  s,    	U##:& 	L	s    r   )r"  r#  s   ` ri   safe_python_valuer$  "  s    
 Ork   c                    |j                   j                  }|j                   j                  }| j                  }t	        |      }g }d g|z  }d g|z  }	t        |      D ]'  \  }
}|d   x}}|j                  d      }|dk7  r||dz   d  }|j                  d      }|j                  |       	 ||
   }|j                         }|j                         }|r|||
<   t        |t              r3|j                  r|j                  ||
<   ||	|
<   |r|j                   ||
<   t        |t"              r|j$                  r|j$                  ||
<   t        |t&              r|j                  r|j                  du r|j(                  |j(                  ||
<   3|j*                  sAt        |j*                  d   t,              s`|j*                  d   j                         }t        |t.              r |j0                  d   }|j3                  |      }t        |t              st5        |j                        ||
<   ||v s|j                  r||   j                  ||
<   t        |t6              s|j8                  |k(  s ||   |	|
<   * g }g }t;        |      D ]*  }||   |j                  |       |j                  |       , ||	|||fS # t        $ r ||v r||   x}}nY Y %w xY w)Nr   r  rs   rr   z()"`F)r^  r  r_  r
  r   r+  rfindrv   r  r  r  r  rg   r8   r  rX  r  r~  r  rM  rV  rS  r  r6   r  r  r$  r%   r  r  )r+  ro  r  r  r_  r
  r
  r  
convertersrm  r  description_itemr5  orig_column	dot_indexr0  rt  r  r  r  
no_convertconvertr  s                          ri   _resolve_model_columnsr-  "  s    {{##HKKE$$KEG%JVe^F!*;!7 ?//22
 LL%	?IMN+Ff%v
	%c{H ??$D $$&&GCL
 dE""&"3"3
3F3K#yyj)h.A.A&11JsOh'DLL5(##/"&"4"4
3Jt~~a/@$$G q)002eV, ;;r?D$LL.EeU+&78J8J&KJsOx||"*6"2"?"?
3$'DKK5,@&v.s?/B JG5\ !a=$NN1a 	! FJ
G;;q  	!"*6"224  	s   ,KK'&K'c                   *     e Zd Z fdZd Zd Z xZS )BaseModelCursorWrapperc                 P    t         t        |   |       || _        |xs g | _        y rf   )r  r/  r  ro  r  )r   r+  ro  r  r  s       ri   r  zBaseModelCursorWrapper.__init__#  s%    $d4V<
mrk   c                     t        | j                  | j                  | j                        \  | _        | _        | _        | _        | _        t        | j                        | _
        y rf   )r-  r+  ro  r  r  rm  r'  r+  r,  r   r
  r  s    ri   r  z!BaseModelCursorWrapper.initialize#  sG    *@KKT[[+2	(t{DO	$,&
rk   c                     t         rf   r  r
  s     ri   r 
  z"BaseModelCursorWrapper.process_row#  r  rk   r&
  r  s   @ri   r/  r/  #  s    $
'"rk   r/  c                   $     e Zd Z fdZd Z xZS )r  c                 n    t         t        |           | j                  | j                  d      | _        y )NFr
  )r  r  r  r
  r  unique_columnsr	  s    ri   r  z!ModelDictCursorWrapper.initialize##  s3    $d68"11LL# 2 %rk   c                     i }| j                   }| j                  D ]  }||   |||   <    | j                  D ]   } | j                  |   ||         |||   <   " |S rf   )r5  r+  r,  r'  )r   rf  r  r  r  s        ri   r 
  z"ModelDictCursorWrapper.process_row)#  sq    %% 	(A!$QF71:	( 	<A!3!3CF!;F71:	<rk   )r
  r  r  r  r 
  r  r  s   @ri   r  r  "#  s    %rk   r  c                       e Zd ZeZd Zy)r  c           	          | j                   }| j                  t        | j                        D cg c]  }||    ||   ||         n||    c}      S c c}w rf   )r'  r!  r  r
  )r   rf  r'  r  s       ri   r 
  z#ModelTupleCursorWrapper.process_row6#  sc    __
4::&!( '1m&?]Z]3q6"SVK!( ) 	) !(s   AN)r
  r  r  r  r!  r 
  r   rk   ri   r  r  3#  s    K)rk   r  c                        e Zd Z fdZ xZS )r  c                      t         t                    j                   j                        }t        j                  d|d       _         fd _        y )Nr
  Tr
  c                 "     j                   |  S rf   )impl)rf  r   s    ri   rj   z9ModelNamedTupleCursorWrapper.initialize.<locals>.<lambda>B#  s    ytyy# rk   )	r  r  r  r
  r  r
  r
  r<  r!  )r   r

  r  s   ` ri   r  z'ModelNamedTupleCursorWrapper.initialize>#  sC    *D<>))$,,7**5+dK	6rk   )r
  r  r  r  r  r  s   @ri   r  r  =#  s    7 7rk   r  c                   .     e Zd Z fdZ fdZd Z xZS )r  c                 ^    || _         t        |      | _        t        t        |   |||       y rf   )r!  r]  r  r  r  )r   r+  ro  r  r!  r  s        ri   r  z!ModelObjectCursorWrapper.__init__F#  s+    & -&6vufMrk   c                 j    t         t        |           | j                  | j                        | _        y rf   )r  r  r  r
  r  r

  r	  s    ri   r  z#ModelObjectCursorWrapper.initializeK#  s(    &8:..t||<rk   c                 P   i }| j                   }| j                  D ]  }||   |||   <    | j                  D ]   } | j                  |   ||         |||   <   " | j                  r0 | j
                  dddi|}|j                  j                          |S  | j
                  di |S )Nr  rr   r   )r

  r+  r,  r'  r]  r!  r4
  r'  )r   rf  r  r  r  r  s         ri   r 
  z$ModelObjectCursorWrapper.process_rowO#  s    "" 	(A!$QF71:	( 	<A!3!3CF!;F71:	< =="$"">!>v>CJJJ#4##-f--rk   r&
  r  s   @ri   r  r  E#  s    N
=.rk   r  c                   .     e Zd Z fdZ fdZd Z xZS )r  c                 L    t         t        |   |||       || _        || _        y rf   )r  r  r  r  r  )r   r+  ro  r  r  r  r  s         ri   r  zModelCursorWrapper.__init__a#  s%     $0G"
rk   c           	      	    t         t                   t         j                  D cg c]  }||j
                   c}      } j                  } j                  D cg c]  }t        |       c} j
                   j
                  dfi _	        g  _
        t        j                   j                        }|rN|j                         }t        |t               r7|j#                  |j$                         |j#                  |j&                         Z| j(                  vri j(                  |   D ]  \  }}}	}
| j                  vs|	t+        |	      f j                  |<    j                  j-                  |      }|d uxr= |d   xr6 t        |d   j.                  j                  j-                  |      t0              } j                  j#                  ||||d uxr |d    d|
v xs d|
v |f       |j#                  |        |rN|D ]Z  }| j                  vst+        |      r|df j                  |<   /t        |t2              s@|j
                  df j                  |<   \ g  _        t7        |      D ]  \  }} j
                  } j                  |   }|*t        |t8              r|j:                  }n|j
                  }nt        |t<              r[|j>                   j                  vr6tA        |jC                         d|j>                  d|j>                  d      |j>                  }n<t        |tD              r|jC                         }t        |tF              r|j:                  } j4                  j#                  |        tI         fd	tK         jL                        D               _'         j                  jQ                         D cg c]  \  }\  }}|||f c}}} _)        i  _*         j                  D ]  \  }}}}}}| j(                  vrt               }t        j                  |g      }|r\|j                         }| j(                  v r; j(                  |   D ])  \  }}}}|jW                  |       |j#                  |       + |r\tY        |       jT                  |<    y c c}w c c}w c c}}}w )
NTrr   r   LEFTru  z specifies bind-to z, but z# is not among the selected sources.c              3   d   K   | ]'  }|j                   |   |   j                  |   f ) y wrf   )column_keysr'  )r   r  r  r   s     ri   r   z0ModelCursorWrapper.initialize.<locals>.<genexpr>#  s:      (   #WQZ1CD(s   -0)-r  r  r  rx  rm  ro  r  r  r  key_to_constructorsrc_to_destr
  r  r  r  rg   r  r  rS  r  r  r]  r  r^  r<   r  rF  r+  r  r  r  r  r   r  r  r%   r  r  r
  	_row_specr   _constructor_list_dest_reachabler  	frozenset)r   rn  selected_srcr  rh   r/  r  rF  r   r!  r  src_ctoris_fkrE  r  rt  	construct	_is_modelr  r  	reachablero   _keyr  r  s   `                      @ri   r  zModelCursorWrapper.initializef#  sk    $24T[[ 2E$0 "KK 2 3/3||<!?1%<#'::

D/A"B!!$..1==?D$%TXX&TXX&4::%59ZZ5E &1T;	d5554?4<[4I4KD++C0  $66::4@H%T1 9hqk 9'(9(9(@(@(D(DT(J(79 
 $$++ ,@Xa[)+Bv/B-   LL%'& @   	EC$111C=47;D++C0Z047IIt3DD++C0	E "6* 	)IC**CKK$E eZ0,,C++CD&)99D$;$;;$&*kkmTYY		&K L L iidD);;=DdF+++C##C()	).  (4::&( ( 04/F/F/L/L/N"P "P++i )Y'"P
  "#'#3#3 	>Aq$1a4::%I!!4&)Ayy{4::%)-D)9 'aA!d+'  *39)=D  &	>g2 =T"Ps   R:R?Sc                 Z   i }g }| j                   D ]3  \  }}}|r! |d      ||<   |j                  ||          * |       ||<   5 || j                     }t               }| j                  D ]^  \  }	}}
}|j                  ||      }||	   }||j                  |       | ||      }t        |t              r|||
<   Rt        ||
|       ` | j                  D ]  \  }}}}}}|j                  |      }|j                  |      }|||vr3d}||vr)|| j                  v rt        | j                  |   |z        }||vr|s|rd }nn||vr||vr|ry|r|||<   |r|d |j                  |<   t        |||        |D ]  }|j                  j                           || j                     S )NT)r  F)rJ  r  ro  rx  rI  r  r  rg   r   r2  rH  rK  r   r<
  r4
  r'  )r   rf  r"  r)  rF  r!  rQ  default_instanceset_keysr  r5  rf  r  r   rE  r   r  r:  is_outerrO  joined_instanceassigns                         ri   r 
  zModelCursorWrapper.process_row#  s   
+/+A+A 	-'Ci*$?!!'#,/*}	- #4::.5+/>> 	1'Cfi {{3(89HHE S!$!%((D)#( &%0	1  <@;K;K 	97S$gx{{3'H%kk$/O&4w+> F8#0D0D(Dd22488CD 8#F&*O ("t8';!0?2)-  &$8=	9B # 	$HOO!!#	$ tzz""rk   r&
  r  s   @ri   r  r  `#  s    
a>FA#rk   r  c                   0     e Zd Z	 	 d fd	Zd Zd Z xZS )PrefetchQueryc           	         |r|r?||D cg c]  }|j                    }}|D cg c]  }|j                  j                   }}n4||D cg c]  }|j                   }}|D cg c]  }|j                   }}t	        t        ||            }|j                   }t        t        | #  | ||||||      S c c}w c c}w c c}w c c}w rf   )	ro  r>
  r  r:
  r   r%  r  r[  r,  )
r-  rr  rm  rn  
rel_modelsfield_to_namern  foreign_key_attrsro  r  s
            ri   r,  zPrefetchQuery.__new__$  s    %;A!B%%++!BJ!BGM$NeU__%9%9$N!$N%?E!Fe%//!FJ!F=C$DEUZZ$D!$D V->!?@M]C0
JuN 	N "C$N "G$Ds   B3B8B=$Cc                 &   | j                   rs| j                  D ]c  }|j                  |j                     }||f}||v s%t	        ||j                  ||          |j
                  j                  |j                         e y | j                  D ]  \  }}|j                  |j                  j                     }||f}|j                  |g       }|D ])  }t	        |||       |j
                  j                          + t	        ||j                  |        y rf   )rn  rm  r2
  r  r2  r4
  r  r^  r>
  r  r'  r  )	r   r  id_maprn  
identifierrF  attnamerel_instancesr%  s	            ri   populate_instancezPrefetchQuery.populate_instance$  s    ?? 8%..uzz:
j)&=Hejj&+> OO++EJJ78 #'"4"4 @w%..u/C/CD
j) &

3 3) (DD'84KK%%'( %--?@rk   c                     | j                   D ]i  \  }}|j                  j                  |j                  |         }||f}| j                  r|||<   D|j                  |g        ||   j                  |       k y rf   )r^  r>
  rX  r2
  rn  r	  r  )r   r  ra  rn  rc  ri  rF  s          ri   store_instancezPrefetchQuery.store_instance3$  sv    "00 	-NE733H4E4Eg4NOH(#C&s!!#r*s""8,	-rk   ri  )r
  r  r  r,  re  rg  r  r  s   @ri   r[  r[  $  s    EI"N @(-rk   r[  _PrefetchQuery)rr  rm  rn  r]  r^  ro  c           
         t        | t              rJ| j                  d      }t        |f|D cg c]"  }t	        |j
                  |j                        $ c}      S  | j                  | }| j                  | j                  J|j                  d      }t        |f|D cg c]"  }t	        |j
                  |j                        $ c}      S |S c c}w c c}w )N	_compound_limited)
rg   rm  r#  rX   r   rh   r)  r  rO  rP  )parent_queryrb	  r  rh   s       ri   _parent_keysrm  >$  s    , 34   -sfdKwsuuamm<KLL
,

t
$C&,*>*>*Jii
#sfdKwsuuamm<KLLJ L
 Ls   'C
'C
c                 \   |t         j                  k(  rt        ||D ch c]  \  }}|	 c}}      j                         j	                         }t        t        j                  |D cg c](  \  }}t        |j                  |j                        |k(  * c}}      }| j                  ||      } t        |      dkD  r| j	                         } | S t        t        j                  |D cg c]  \  }}|t        ||f      z   c}}      }	| j                  |	      S c c}}w c c}}w c c}}w Nr  rr   rR   rE   rm  rc  r  r
   r   rW  r   rh   r)  r  r   r]  )
rr  rl  pairsstrategyr  rm	  r  r  r  r  s
             ri   _relate_childrenrt  L$  s   =%%%
 L5*A%!R2*AB
88: 	HLL16#8'-r2 $+355"..#AR#G #8 9

32
&u:> NN$E(,,/4!6%+R "$|L2%'H!H !6 7D;;t +B#8!6   D(-D")D(c                 \   |t         j                  k(  rt        ||D cg c]  \  }}|	 c}}      j                         j	                         }t        t        j                  |D cg c](  \  }}|t        |j                  |j                        k(  * c}}      }| j                  ||      } t        |      dkD  r| j	                         } | S t        t        j                  |D cg c]  \  }}|t        ||f      z   c}}      }	| j                  |	      S c c}}w c c}}w c c}}w ro  rq  )
rr  rl  rr  rs  r  r  r  refr  r  s
             ri   _relate_parentrx  a$  s    =%%%L5*A%!R2*AB
88: 	HLL27#9'.sB $''#%%*H#H #9 :

32
&u:>NN$E(,,05!7%,S" "%\B5(I!I !7 8D;;t +B#9!7ru  c                    t        |       g}t        |      D ]?  \  }}t        |t              r|\  }}nd }t        |t              st        |      st        |t              r|j                         }|j                  }t        t        |dz               D ]  }d x}	}
||   }|j                  }|j                  x}}t        |t              r|j                  }|j                  j                  j                  |g       }|rQ|D cg c]  }t        ||j                          }	}|D cg c]"  }t        ||j"                  j                         $ }}n%|j                  j$                  j                  |      }
|	s|
s||u s| n |rd|z  nd}t'        d||      |r|fnd }|	r@t)        ||t+        t-        |	            |      }|j/                  t        ||	d|             |
s|
D cg c]8  }t        ||j"                  j                         t        ||j                         f: }}t1        ||||      }|j/                  t        ||
d|             B |S c c}w c c}w c c}w )Nrr   z	 using %srh  z-Error: unable to find foreign key for query: FT)r[  r+  rg   r  rM  r]  r  r  ro  r  r  rr  r^  r  r  r   r  r>
  r  r   rt  r   r%  r  rx  )r:  r  prefetch_typefixed_queriesr  rN  target_modelsubquery_modelr
  r  r  fixed
last_query
last_modellast_objrelsr  r  tgt_errr  r  rr  s                         ri   prefetch_add_subqueryr  p$  sb   "2&'M , )P8h&%-"HlL(E*x/Ah
+(H!%A,' 	FA!!C(!!$EJ$)KK/J*j1'--
!''2266z2FDBFGBw~rww7GGFJKwx):):;KK)//>>BB:Nx|x'?'3';	F$ 5AkL0bG 2:G"E F F #/D'*(,Sc](;]LH  xeT!JKFNP;B ng.?.?.D.DEh57 PE P%h
E=QH  x4!NOS)PV 3 HK&Ps   I&'I".=I'c                 
   |s| S |j                  dt        j                        }|rt        d|z        |t        j                  k(  rt        d      |t        j                         vrt        d      t        | ||      }i }i }t        |      D ]  }|j                  }|j                  r7|j                  D ](  }	|j                  |	g        ||	   j                  |       * |j                  |i        ||   }
t        |j                  |            }|j                  D ]L  }|j                  r|j!                  ||
       |s$||   D ]!  }|j#                  |||j                            # N  t%        j                        S )Nrz  zUnrecognized arguments: %szwPREFETCH_TYPE.MATERIALIZE is not supported by prefetch(). Use Model.select().with_related() with a Load() node instead.z,prefetch_type must be a PREFETCH_TYPE value.)r  rR   r  r   r  r\  r  r  ro  rm  r]  r	  r  r   r  rr  rg  re  r   )r:  r  r  rz  r{  depsrel_mappqquery_modelr:
  ra  has_relationsr  r  s                 ri   rQ   rQ   $  s   	JJ0C0CDM5>??111 2 3 	3 
m224	4GHH)"j-HMDG}% Ehh99]] .	""9b1	"))"-. 	R(k"W[[56 	EHyy!!(F3";/ EC))(DODE		EE$ >rk   c                    | j                   | j                  j                   }}|ri }|D ]0  }|j                  |j                  |   g       j	                  |       2 | j
                  }|D ]D  }	|j                  |	j                  |   g       }
|
D ]  }|	|j                  |<    t        |	||
       F y i }|D ]  }|||j                  |   <    |D ](  }	|	j                  |   }||v s||   |	j                  |<   * y rf   )	r  r>
  r	  r2
  r  r  r  r<
  r2  )rn  rn  childrenparentsr  rel_namebucketschildr  parentr  r%  ra  rF  s                 ri   _bucketr  $  s    ZZ!5!5(D 	GEu~~d3R8??F	G-- 	*F++fooh7<C ,%+T",FGS)		*  	5E/4F5>>(+,	5 	3F//$'Cf}'-c{t$	3rk   c                       e Zd Zdej                  dfdZed        Zej                  d        Z
d Zed        Zd Zd Zdd	Zed
        ZddZy)rG   Nc                    | j                  |      \  | _        | _        | j                  r| j                  j                  n| j                  j                  }|*|j                  |urt        d|d|j                  d      ||j                         st        d      |t        j                         vrt        d      || _	        || _
        || _        d| _        y )NzLoad() query must select from z, got r  zGLoad() query must return model instances, not dicts/tuples/namedtuples.z.Load() strategy must be a PREFETCH_TYPE value.r   )_resolver
  r  ro  r:
  r   r  rR   r\  rj  	_strategy_per_parent	_children)r   r  rr  rs  
per_parentr:
  s         ri   r  zLoad.__init__$  s    (,c(:%T%*.*:*:T[[&&++// 	I!='6 7 7U%6%6%8 9 : :=//11MNN!%rk   c                     t        | t              r| j                  } t        | t              r| j                  dfS t        | t              r| dfS t        d| z        )NTFz:Load() expects a foreign-key or backref reference, got %r.)rg   r  rn  rE
  r<   r   )r  s    ri   r  zLoad._resolve$  s[    c:&))Cc?+99d?"_-: #%() * 	*rk   c                 L    | j                   t        d |D              z   | _         y )Nc              3   V   K   | ]!  }t        |t              r|n
t        |       # y wrf   r  )r   rh   s     ri   r   zLoad.then.<locals>.<genexpr>$  s)      0E67At$A$q'10Er  )r  r  )r   r  s     ri   thenz	Load.then$  s*    % 0E;C0E +E Erk   c                 R    | j                   | j                   S |j                         S rf   )rj  r  )r   r:
  s     ri   _basez
Load._base%  s#    "kk5t{{M9;K;K;MMrk   c                     g t               }}| D ]4  } ||      }|||vs|j                  |       |j                  |       6 |S rf   )rx  r  r  )r  get_keyr  r2  r  rF  s         ri   r  zLoad._distinct%  sN    d 	!F&/C3d?C 		!
 rk   c                 2   | j                   | j                  t        j                  k(  r)| j	                  |fd      }|j                  |z        S t        |j                  j                  j                        }t        |||fg| j                        S )Nc                 D    t        | j                  j                        S rf   )r   r>
  r  r9  rn  s    ri   rj   z%Load._link_children.<locals>.<lambda>%  s    GAu7K7K,L rk   )r
  r  rR   r  r  r]  r   ro  r>
  r  rt  )r   rr  rl  r  r  rm	  rn  s         @ri   _link_childrenzLoad._link_children%  s    >>]666>>'"LND;;u}-- \'')=)=>|ubk] $0 	0rk   c                 F   | j                   | j                  t        j                  k(  r3| j	                  |fd      }|j                  j                  |z        S t        |j                  j                        }t        ||j                  |fg| j                        S )Nc                 N    | j                   j                  j                        S rf   )r2
  r  r  r  s    ri   rj   z#Load._link_parent.<locals>.<lambda>!%  s    AJJNN5::,F rk   )r
  r  rR   r  r  r]  r>
  r   ro  r  rx  )r   rr  rl  r  r  r  rn  s         @ri   _link_parentzLoad._link_parent%  s    >>]666>>'"FHD;;u$677\''4e\U__b4I3J"nn. 	.rk   c                    | j                   }| j                  rM| j                  | j                  |||      }nY| j	                  | j                  |j                        ||      }n,| j                  | j                  |j                        ||      }t        |j                  |            }t        || j                  ||       ||fS rf   )r
  r  r  	_windowedr  r  ro  r  r:
  r   r3  r  )r   r  rl  r	  r  rn  child_queryr  s           ri   _runz	Load._run'%  s    +"nn\7EJ"11$**U[[2I2>I ++DJJu,G,8'CK ++H56t''7;$$rk   c                    t        | t              r| n
t        |       }|j                  j	                         t        t
              rt        d      |u st        fd|D              r| S d|j                  j                         v rt        j                        nt        j                        }t        ||j                  |j                  |j                        S )NzRper_parent cannot rank by a SQL() literal, order by a field or expression instead.c              3   &   K   | ]  }|u  
 y wrf   r   )r   rm	  rt  s     ri   r   z"Load._rank_term.<locals>.<genexpr>@%  s     9r
9s   r&  )rg   r  r  rt  r  rY   r   r   r  r  r;   MAXMINr  r  )termr  rn  r  aggrt  s        @ri   
_rank_termzLoad._rank_term7%  s     tX.DCIvv}}dC  G H H5=C9S99K$(9(9(;;bffTlQ[[!++qww??rk   c                    | j                   }|j                  }| j                  |      }|j                  t	        d      |j
                  j                         }|j                  xs |D cg c]  }| j                  |||       }	}t        j                         j                  |g|	      j                  d      }
  |j                  g ||
 j                         j                  d       j!                  d       j"                  g || }| j%                  |||      j'                  d|z        }t)        t*        j,                  |D cg c]%  }|t/        |j0                  |j2                        k(  ' c}      }|j4                  r|j                         }n/|j                  d       j!                  d       j7                  |      }|j9                  ||      j;                  |j0                  j<                  | j>                  k        jA                  |      j                  |j0                  j<                        S c c}w c c}w )NzGper_parent is not supported with a grouped or aggregate relation query.)rh  rc  _rnz_load_ranked_%drp  )!r
  ro  r  r  r   r^  r  rU  r  r;   
ROW_NUMBERrp  r#  r  rc  rQ  rR  r  r  r  r
   r   r  r   rh   r)  r  r  r  r]  r  r  rq  )r   rl  r  r	  rn  r:
  baser  r  orderrnr  r  rm	  r  outers                   ri   r  zLoad._windowedE%  s    KK	zz)$>>% 9 : :oo..0>>0S3 C/ 3 3mmot%5t9uU| 	&c&2&//177=DDTJ(((!&( ""5,@%-. 	HMMDGHbR7355"..99HJ $$&EJJt$++D188CE

32
&suuyyD$4$445##%%))$	&'3 Is   -H?*I
r   Nr	  )r
  r  r  rR   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   rk   ri   rG   rG   $  s    "&1D1D $ * * 
YYE EN  0.%  @ @ &rk   rG   c                     | sy |D ]B  }|j                  | |||      \  }}|j                  s't        |||j                  |dz   |       D y r  )r  r  r  )r  rl  r   r	  r  rt  r  r  s           ri   r  r  h%  sU     $ $		'<*2!4+>>(K"$	$rk   )ru   r  r   rf   r4  r(  )@   r  (j  bisectr   r   collections.abcr   r   
contextlibr   r  r	   	functoolsr
   r   inspectr   r;  r
  r   r
  ry  r  r   r  r   rw   rL  rK  sysr  r   r)  r	  r   	pysqlite3r   pysq3ImportErrorrk  sqlite_version_infopsycopg2cffir   registerr	  r   r	  psycopg2.extrasr   pg_register_uuidr   r	  r9	  
psycopg.pqr   psycopg.types.jsonr6	  r   r7	  pymysqlr	  MySQLdb__version____all__	getLoggerr  
addHandlerNullHandlerr,  r   r  rL  rx  r  r*  r  rp   rz   version_infor   r   register_adapterr
  r  r   r   r   r   register_converterr  r   r   r   r	  r   r   r   r   r   r   r   r   r   r   r  r{  rM   r5  r6  ler8  ger:  lshiftr2   r  rE   r  rR   r5  ry  r{  r}  r  r  r  r  r  r  r  r  compiler  r  r  r  r  r]  r  r  r  r  r$   r  rT   r*   r	  r  r
  r*  r:  r'   r  rj  r  r  r  r  r  r  r  r  rr  r  r  r"  r[   r  rb   r  r~  r%   r  r  r  r  r  r  r  r  ra   r
  r   r!   r  r  r  rC  r  r6   rY   r#   r/   rM  r;   rc   rn  r  r    r  r  rd  re  r  r  r7   r5   r_   rU   r  r  r  r  rH  rM  ro  rq  rz  rm  rX   r  rL  rD  rN  r?   rJ   rr  r  r  r  r  rM  rB  r>   r)   r+   rA   rB   rC   rL   rN   rS   rP  
EXCEPTIONSr  re  rf  rj  ro  rq  localr|  r~  r  r(   rP  rZ   r  r		  r4	  rO   rK   r  r  r  r  r'  r&  r(  r)  r	  r.
  r8
  rE
  rJ
  r8   r   r@   r   rW   r   r   r=   rP   r:   r4   r.   r
  r"   r9   r\   r
  r   r   r
  r
  r   r`   r   r	  fromisoformatr  r   r  r  r-   r,   r]   r3  r^   rD   r   rS  rF   r   r<   r0   r1   r  r  rH   r  r&   r+  rV   r  r  r3   r  r  r=  rI   r  r  r"  r  r  r  r  r  r
  r6  r  r  r  r!  r  r$  r-  r/  r  r  r  r  r  r[  rm  rt  rx  r  rQ   r  rG   r  r   rk   ri   <module>r     s     $ # %              	   
     ) **g.I.II	#FOO4A0*,35 Pd 
		8	$   %'%%' ( .	UIsE53F3FG g((99%%F'' GW__c2GX]]C0GX]]C0
7"8K		J 	!  !2!24DE"""6<8""";0AB 44" IJ    !!#  -113 !4 X !4 X $;/
N	E5)Ht H 8   	 		
 	 	   	 	   	  	  !" #$ %& '( )* 
+, -. /0 12 34 56 7>  (++(++ 
8;; 	(++	
 
8;; 	(++ 	(// & 	
. 6 2 4 6 ( *  .!" *#$ *(' 
0 	 				 	 
		
 
	 
	 
	 	 	 	 	 	 		 	 
	  
!	" 
#	$ %	& '	. 
 "	 
$	& 
	

 
	

 	      
 2::23 2::34  

45?
 9GC9 #;F #;LE * $f #*!6 *!Z,"K""8 .: ; ,.h0f h0V:(.6 DF V f B4 B/8T /8d*f *Z zzE 
3 
38 82]*OY ]*@9 , )  F@/6 @FG GTPZ P,
"* 
"'F 'V $0K $0N"[ "2k 2$6 $2\; 25J 5.&K &1
2; 
2{ D3436 36l6z 68Z 8(
* 
>%Cz CL dDmT m`	:$ 	:&$ &.: .( @z 6!' / / j!   	'&[ &7% 7%tj% j%Zy KI K\% ,E%&+ E%VA/* A/H|/Z |/~.% .b/-[ /-daA[ aAH-[ -KD K\&P &PRI"f I"VXH XHtjBO jBXh* h*\5i 5
 2? 1 *O * $ $ )] ) +_ + (M ( , , +} + +} +Kv K '~']' ' (	'
 n' n' =' ]' *' (' /' (' +'  0' )'  ~!'
$ )4  '&&13 (''(57 ,[++.0  &{%%noFv $ @' ?8 8 (W( Wt&A4X A4HB& B.G) GT@) @Fu up@1H @1L5f 50@f @8+6 +\$ $T^F ^B
 
&m &,+ , V .'F '&"' "'Jf 2v 2&vJ vru 5 l  9 99 6I 6?i ? * /5 />	O5 	O= =Y  O O*!5 &&+|_ &+RN#f N#bB- B,<) <? ?.Ei E4 ""00&C% C,' ,:&# &6,# ,4N6_ N6b<o <5 
K:z K:\d=!5 d=N HIe HIV ;  ;F
66 
6 
).m ).XM"i M"`E9 E0:(9 :(zv Jt"F t"nZv Zz	H 	 $9 #~) ~)B2& 2*MHDI MH`6< 6<rD D2.#L #LLE ( E W"' W"t:0C :B7/6 B7J
%k %2. 2&	(& 	I(& I4	(& 	?k ?DX<v". " 3 ")4 )7#: 7.5 .6j#/ j#Z.-*K**+; >M N .-b*-`"J34F&4 F&R	$Sj  E  G  		  Hx  *%))G)h*
   s    } } *}) }5  ~ 7~ }}}&%}&)}21}25	~~~~~3~"!~3"~,)~3+~,,~32~3