
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    SW4                      @   s  d Z ddlZddlT 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mZ zddlmZ e  W n ek
r   Y nX ddlmZ ddlmZ ddlmZ ddlmZ zddlmZ W n   dZY nX ejdddd ZG dd deZG dd deZG dd deZG dd deZG d d! d!eZG d"d# d#eZ d$d% Z!ee e! G d&d' d'eZ"G d(d) d)e"e#Z$G d*d+ d+e%Z&G d,d- d-e"e#Z'G d.d/ d/e#Z(G d0d1 d1e"e(Z)G d2d3 d3e"e*Z+d4d5 Z,ej-d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdE G dFdG dGe
Z.G dHdI dIe/Z0G dJdK dKeZ1e02dLdMdNdOdPdQ e03ej4dRej5dSej6dTej7dUej8dVej9dWej:dRej;dXej<dYej=dRej>dZej?dUej@dSejAdTejBdDi d[d\ ZCdad_d`ZDdS )bzr
Collection of postgres-specific extensions, currently including:

* Support for hstore, a key/value type storage
    N)*)
Expression)logger)Node)OP)Param)Passthrough)returns_clone)QueryCompiler)SelectQuery)	UUIDField)compat)adapt)AsIs)register_adapter)register_hstore)JsonF)clonec                 C   s   t | tjt|S N)r   r   CASTSQLselfZas_type r   I/opt/alt/python38/lib64/python3.8/site-packages/playhouse/postgres_ext.pycast#   s    r   c                       s,   e Zd Z fddZdd Zdd Z  ZS )_LookupNodec                    s   || _ || _tt|   d S r   )nodepartssuperr   __init__)r   r   r   	__class__r   r   r    (   s    z_LookupNode.__init__c                 C   s   t | | jt| jS r   )typer   listr   r   r   r   r   
clone_base-   s    z_LookupNode.clone_basec                 C   s   t t| ddtjt|S )NT)Zparens)r   Clauser   r   r   r   r   r   r   r   0   s    z_LookupNode.cast)__name__
__module____qualname__r    r&   r   __classcell__r   r   r!   r   r   '   s   r   c                       sL   e Zd Zd fdd	Zdd ZedddZd	d
 Zdd Zdd Z	  Z
S )_JsonLookupBaseFc                    s   t t| || || _d S r   )r   r,   r    _as_json)r   r   r   as_jsonr!   r   r   r    4   s    z_JsonLookupBase.__init__c                 C   s   t | | jt| j| jS r   )r#   r   r$   r   r-   r%   r   r   r   r&   8   s    z_JsonLookupBase.clone_baseTc                 C   s
   || _ d S r   )r-   )r   r.   r   r   r   r.   ;   s    z_JsonLookupBase.as_jsonc                 C   s8   |  d}t|ttfr*t|tjt|S t|tj|S NT)	r.   
isinstancer$   dictr   r   JSONB_CONTAINSr   JSONB_EXISTS)r   otherr   r   r   r   contains?   s    
z_JsonLookupBase.containsc                 G   s   t | dtjtt|S r/   )r   r.   r   JSONB_CONTAINS_ANY_KEYr   r$   r   keysr   r   r   contains_anyE   s
    
z_JsonLookupBase.contains_anyc                 G   s   t | dtjtt|S r/   )r   r.   r   JSONB_CONTAINS_ALL_KEYSr   r$   r7   r   r   r   contains_allK   s
    
z_JsonLookupBase.contains_all)F)T)r(   r)   r*   r    r&   r	   r.   r5   r9   r;   r+   r   r   r!   r   r,   3   s   r,   c                   @   s   e Zd ZdZdd ZdS )
JsonLookupjson_lookupc                 C   s   t | j| j|g | jS r   )r<   r   r   r-   r   valuer   r   r   __getitem__T   s    zJsonLookup.__getitem__N)r(   r)   r*   
_node_typer@   r   r   r   r   r<   Q   s   r<   c                   @   s   e Zd ZdZdS )JsonPath	json_pathN)r(   r)   r*   rA   r   r   r   r   rB   W   s   rB   c                   @   s$   e Zd ZdZedd Zdd ZdS )ObjectSliceobject_slicec                 C   sL   t |tr |jpd|jpdg}n"t |tr2|g}ntt|d}| ||S )Nr   :)r0   slicestartstopintmapsplit)clsr   r?   r   r   r   r   create]   s    

zObjectSlice.createc                 C   s   t | |S r   rD   rN   r>   r   r   r   r@   g   s    zObjectSlice.__getitem__N)r(   r)   r*   rA   classmethodrN   r@   r   r   r   r   rD   Z   s   
	rD   c                   @   s   e Zd Zdd ZdS )_Arrayc                 C   s   || _ || _d S r   )fielditems)r   rR   rS   r   r   r   r    k   s    z_Array.__init__N)r(   r)   r*   r    r   r   r   r   rQ   j   s   rQ   c                 C   sD   | j jjj }t| j}|| td|| j 	 d| j j
 f S )Nz%s::%s%s[])rR   model_classZ_metadatabaseget_connr   rS   Zpreparer   Zget_column_type
dimensions)ZarrconnrS   r   r   r   adapt_arrayo   s    


rZ   c                       s"   e Zd ZdZd fdd	Z  ZS )IndexedFieldMixinZGiSTNc                    s<   | dd tt| j|| | jr2|p,| j| _nd | _d S )NindexT)
setdefaultr   r[   r    r\   default_index_type
index_type)r   r_   argskwargsr!   r   r   r    }   s
    zIndexedFieldMixin.__init__)N)r(   r)   r*   r^   r    r+   r   r   r!   r   r[   z   s   r[   c                       sN   e Zd ZdZedf fdd	Zdd Zdd Zd	d
 Zdd Z	dd Z
  ZS )
ArrayFieldGIN   c                    s4   |||| _ || _| j  | _tt| j|| d S r   )_ArrayField__fieldrX   Zget_db_fielddb_fieldr   rb   r    )r   Zfield_classrX   r`   ra   r!   r   r   r       s    zArrayField.__init__c                 C   s$   | j |}| jd| j 7  _|S )NrT   )re   __ddl_column__r?   rX   )r   Zcolumn_typesqlr   r   r   rg      s    zArrayField.__ddl_column__c                 C   s,   |d krd S t |ttfs"t|}t| |S r   )r0   r$   rQ   r>   r   r   r   db_value   s
    zArrayField.db_valuec                 C   s   t | |S r   rO   r>   r   r   r   r@      s    zArrayField.__getitem__c                 G   s   t | tjt|S r   )r   r   	ACONTAINSr   r   rS   r   r   r   r5      s    zArrayField.containsc                 G   s   t | tjt|S r   )r   r   ACONTAINS_ANYr   rk   r   r   r   r9      s    zArrayField.contains_any)r(   r)   r*   r^   ZIntegerFieldr    rg   ri   r@   r5   r9   r+   r   r   r!   r   rb      s   rb   c                   @   s   e Zd ZdZdS )DateTimeTZFielddatetime_tzN)r(   r)   r*   rf   r   r   r   r   rm      s   rm   c                   @   sh   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )HStoreFieldhashc                 C   s   t | tjt|S r   )r   r   HKEYr   r   keyr   r   r   r@      s    zHStoreField.__getitem__c                 C   s
   t | S r   )fnZakeysr%   r   r   r   r8      s    zHStoreField.keysc                 C   s
   t | S r   )rt   Zavalsr%   r   r   r   values   s    zHStoreField.valuesc                 C   s
   t | S r   )rt   Zhstore_to_matrixr%   r   r   r   rS      s    zHStoreField.itemsc                 G   s   t | tt|S r   )rt   rG   r   r$   )r   r`   r   r   r   rG      s    zHStoreField.slicec                 C   s   t | |S r   )rt   Zexistrr   r   r   r   exists   s    zHStoreField.existsc                 C   s   t | |S r   )rt   definedrr   r   r   r   rw      s    zHStoreField.definedc                 K   s   t | tj|S r   )r   r   HUPDATE)r   datar   r   r   update   s    zHStoreField.updatec                 G   s   t | tt|S r   )rt   deleter   r$   r7   r   r   r   r{      s    zHStoreField.deletec                 C   sJ   t |trt| tjt|S t |ttfr<t| tjt|S t| tj	|S r   )
r0   r1   r   r   HCONTAINS_DICTr   r$   tupleHCONTAINS_KEYSHCONTAINS_KEYr>   r   r   r   r5      s
    
zHStoreField.containsc                 G   s   t | tjtt|S r   )r   r   HCONTAINS_ANY_KEYr   r$   r7   r   r   r   r9      s    zHStoreField.contains_anyN)r(   r)   r*   rf   r@   r8   ru   rS   rG   rv   rw   rz   r{   r5   r9   r   r   r   r   ro      s   ro   c                       s:   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Z  ZS )	JSONFieldjsonNc                    s,   t d krtd|| _tt| j|| d S )Nz/Your version of psycopg2 does not support JSON.)r   	Exceptiondumpsr   r   r    )r   r   r`   ra   r!   r   r   r       s    zJSONField.__init__c                 C   s(   |d kr|S t |ts$t|| jdS |S )N)r   )r0   r   r   r>   r   r   r   ri      s
    
zJSONField.db_valuec                 C   s   t | |gS r   )r<   r>   r   r   r   r@      s    zJSONField.__getitem__c                 G   s
   t | |S r   )rB   r7   r   r   r   path   s    zJSONField.path)N)	r(   r)   r*   rf   r    ri   r@   r   r+   r   r   r!   r   r      s
   r   c                   @   s4   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdS )BinaryJSONFieldjsonbrc   c                 C   s2   t |ttfr t| tjt|S t| tjt|S r   )	r0   r$   r1   r   r   r2   r   r3   r   r   r4   r   r   r   r5      s    zBinaryJSONField.containsc                 C   s   t | tjt|S r   )r   r   JSONB_CONTAINED_BYr   r   r   r   r   contained_by   s    zBinaryJSONField.contained_byc                 G   s   t | tjtt|S r   )r   r   r6   r   r$   rk   r   r   r   r9      s
    
zBinaryJSONField.contains_anyc                 G   s   t | tjtt|S r   )r   r   r:   r   r$   rk   r   r   r   r;      s
    
zBinaryJSONField.contains_allN)	r(   r)   r*   rf   r^   r5   r   r9   r;   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdd ZdS )TSVectorFieldtsvectorrc   c                 C   s   t | tjt|S r   )r   r   TS_MATCHrt   
to_tsquery)r   queryr   r   r   match  s    zTSVectorField.matchN)r(   r)   r*   rf   r^   r   r   r   r   r   r     s   r   c                 C   s   t t| tjt|S r   )r   rt   Zto_tsvectorr   r   r   )rR   r   r   r   r   Match  s    r   rs   zH@>zH?&zH?zH?|zH||zA@>zA||zT@@zJB@>zJB<@zJB?|zJB?&zJB?z::)rq   rx   r|   r~   r   r   rj   rl   r   r2   r   r6   r:   r3   r   c                       sB   e Zd Zd fdd	Zdd Zdd Zdd	 Z fd
dZ  ZS )PostgresqlExtCompilerFc                    sP   t t| |||}d }|D ]}t|tr|j}q|rL|jdtd|  |S )NzUSING %s)	r   r   _create_indexr0   r[   r_   Znodesinsertr   )r   rU   ZfieldsuniqueZclauser_   rR   r!   r   r   r   $  s    
  
z#PostgresqlExtCompiler._create_indexc                 C   s>   |  |j||\}}dd |jD }d|d|f }||fS )Nc                 S   s   g | ]}t |d  qS )rd   )str).0partr   r   r   
<listcomp>4  s     z=PostgresqlExtCompiler._parse_object_slice.<locals>.<listcomp>z%s[%s]rF   )
parse_noder   r   join)r   r   	alias_mapconvrh   paramsr   r   r   r   _parse_object_slice1  s    z)PostgresqlExtCompiler._parse_object_slicec                 C   s   |  |j||\}}|g}|jD ]*}|  |||\}}	|| ||	 q |jr^d|}n*|d d |d  }
}dd|
|f}||fS )N->r   z->>)r   r   r   appendextendr-   r   )r   r   r   r   rh   r   Zlookupsr   Zpart_sqlZpart_paramsheadtailr   r   r   _parse_json_lookup8  s    
  
z(PostgresqlExtCompiler._parse_json_lookupc                 C   sT   |  |j||\}}|jr d}nd}|ddtt|j  ||| jf|fS )Nz#>z#>>z{%s},)	r   r   r-   r   r   rK   r   r   Zinterpolation)r   r   r   r   rh   r   Zoperandr   r   r   _parse_json_pathJ  s    z&PostgresqlExtCompiler._parse_json_pathc                    s(   t t|  }|j| j| j| jd |S )N)rE   r=   rC   )r   r   get_parse_maprz   r   r   r   )r   Z	parse_mapr!   r   r   r   S  s    z#PostgresqlExtCompiler.get_parse_map)F)	r(   r)   r*   r   r   r   r   r   r+   r   r   r!   r   r   #  s
   	r   c                       s@   e Zd ZeZ fddZdddZddd	Z fd
dZ  Z	S )PostgresqlExtDatabasec                    s2   | dd| _| dd| _tt| j|| d S )Nserver_side_cursorsFr   T)popr   r   r   r   r    )r   r`   ra   r!   r   r   r    _  s    zPostgresqlExtDatabase.__init__Nc                 C   s    |r|   j|dS |    S )Nname)rW   cursor)r   r   r   r   r   
get_cursord  s    z PostgresqlExtDatabase.get_cursorTFc                 C   s   t ||f |p$| jo$| d}|   |rN| jtt	 d}d}n|  }z|
||pdd W n: tk
r } z|  r| jr|    W 5 d }~X Y nX |r|  r|   W 5 Q R X |S )Nselectr   Fr   )r   debugr   lower
startswithZexception_wrapperr   r   uuidZuuid1executer   Zget_autocommitZautorollbackZrollbackZcommit)r   rh   r   require_commitnamed_cursorZuse_named_cursorr   excr   r   r   execute_sqli  s&    
z!PostgresqlExtDatabase.execute_sqlc                    s*   t t| j|f|}| jr&t|dd |S )NT)Zglobally)r   r   _connectr   )r   rV   ra   rY   r!   r   r   r     s    zPostgresqlExtDatabase._connect)N)NTF)
r(   r)   r*   r   Zcompiler_classr    r   r   r   r+   r   r   r!   r   r   \  s   
  
r   c                   @   s    e Zd Zedd Zdd ZdS )ServerSideSelectQueryc                 C   s   t |j}||S r   )r   rU   Z_clone_attributes)rM   r   r   r   r   r   clone_from_query  s    
z&ServerSideSelectQuery.clone_from_queryc                 C   s    |   \}}| jj||dddS )NFT)r   r   )rh   rV   r   )r   rh   r   r   r   r   _execute  s       zServerSideSelectQuery._executeN)r(   r)   r*   rP   r   r   r   r   r   r   r     s   
r   ztimestamp with time zoneZhstorer   r   r   )rn   rp   r   r   r   z@>z?&?z?|r   z||z&&z@@z<@c              	   c   sF   t | }|j ( | }|| _| D ]
}|V  q,W 5 Q R X d S r   )r   r   rV   Ztransactionr   Z_qriterator)Zselect_queryr   Zquery_resultobjr   r   r   
ServerSide  s    
r   LEFTTc                 C   s   t | td| |td|S )Nz%s JOIN LATERALzON %s)r'   r   )ZlhsZrhsZ	join_typeZ	conditionr   r   r   LateralJoin  s    
r   )r   T)E__doc__r   Zpeeweer   r   r   r   r   r   r	   r
   r   r   Zpsycopg2cffir   registerImportErrorZpsycopg2.extensionsr   r   r   Zpsycopg2.extrasr   r   r   r   r   r,   r<   rB   rD   objectrQ   rZ   r[   ZFieldrb   ZDateTimeFieldrm   ro   r   r   Z	TextFieldr   r   rz   r   ZPostgresqlDatabaser   r   Zregister_fieldsZregister_opsr|   r~   r   r   rq   rx   rj   rl   r   r2   r   r6   r:   r3   r   r   r   r   r   r   r   <module>   s   



 )9+               