
­­­­­­­­­­­­­­­­­­
<!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)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 r0   )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 r0   )r   r/   r   JSONB_CONTAINS_ALL_KEYSr   r$   r8   r   r   r   contains_allK   s
    
z_JsonLookupBase.contains_all)F)T)r)   r*   r+   r    r&   r	   r/   r6   r:   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_typerA   r   r   r   r   r=   Q   s   r=   c                   @   s   e Zd ZdZdS )JsonPath	json_pathN)r)   r*   r+   rB   r   r   r   r   rC   W   s   rC   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   :)r1   slicestartstopintmapsplit)clsr   r@   r   r   r   r   create]   s    

zObjectSlice.createc                 C   s   t | |S r   rE   rO   r?   r   r   r   rA   g   s    zObjectSlice.__getitem__N)r)   r*   r+   rB   classmethodrO   rA   r   r   r   r   rE   Z   s   
	rE   c                   @   s   e Zd Zdd ZdS )_Arrayc                 C   s   || _ || _d S r   )fielditems)r   rS   rT   r   r   r   r    k   s    z_Array.__init__N)r)   r*   r+   r    r   r   r   r   rR   j   s   rR   c                 C   sD   | j jjj }t| j}|| td|| j 	 d| j j
 f S )Nz%s::%s%s[])rS   model_class_metadatabaseget_connr   rT   Zpreparer   get_column_type
dimensions)ZarrconnrT   r   r   r   adapt_arrayo   s    


r]   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   rb   argskwargsr!   r   r   r    }   s
    zIndexedFieldMixin.__init__)N)r)   r*   r+   ra   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__fieldr[   get_db_fielddb_fieldr   re   r    )r   Zfield_classr[   rc   rd   r!   r   r   r       s    zArrayField.__init__c                 C   s$   | j |}| jd| j 7  _|S )NrU   )rh   __ddl_column__r@   r[   )r   column_typesqlr   r   r   rk      s    zArrayField.__ddl_column__c                 C   s,   |d krd S t |ttfs"t|}t| |S r   )r1   r$   rR   r?   r   r   r   db_value   s
    zArrayField.db_valuec                 C   s   t | |S r   rP   r?   r   r   r   rA      s    zArrayField.__getitem__c                 G   s   t | tjt|S r   )r   r   	ACONTAINSr   r   rT   r   r   r   r6      s    zArrayField.containsc                 G   s   t | tjt|S r   )r   r   ACONTAINS_ANYr   rp   r   r   r   r:      s    zArrayField.contains_any)r)   r*   r+   ra   IntegerFieldr    rk   rn   rA   r6   r:   r,   r   r   r!   r   re      s   re   c                   @   s   e Zd ZdZdS )DateTimeTZFielddatetime_tzN)r)   r*   r+   rj   r   r   r   r   rs      s   rs   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   rA      s    zHStoreField.__getitem__c                 C   s
   t | S r   )fnZakeysr%   r   r   r   r9      s    zHStoreField.keysc                 C   s
   t | S r   )rz   Zavalsr%   r   r   r   values   s    zHStoreField.valuesc                 C   s
   t | S r   )rz   Zhstore_to_matrixr%   r   r   r   rT      s    zHStoreField.itemsc                 G   s   t | tt|S r   )rz   rH   r   r$   )r   rc   r   r   r   rH      s    zHStoreField.slicec                 C   s   t | |S r   )rz   Zexistrx   r   r   r   exists   s    zHStoreField.existsc                 C   s   t | |S r   )rz   definedrx   r   r   r   r}      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   )rz   deleter   r$   r8   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   )
r1   r2   r   r   HCONTAINS_DICTr   r$   tupleHCONTAINS_KEYSHCONTAINS_KEYr?   r   r   r   r6      s
    
zHStoreField.containsc                 G   s   t | tjtt|S r   )r   r   HCONTAINS_ANY_KEYr   r$   r8   r   r   r   r:      s    zHStoreField.contains_anyN)r)   r*   r+   rj   rA   r9   r{   rT   rH   r|   r}   r   r   r6   r:   r   r   r   r   ru      s   ru   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   rc   rd   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   )r1   r   r   r?   r   r   r   rn      s
    
zJSONField.db_valuec                 C   s   t | |gS r   )r=   r?   r   r   r   rA      s    zJSONField.__getitem__c                 G   s
   t | |S r   )rC   r8   r   r   r   path   s    zJSONField.path)N)	r)   r*   r+   rj   r    rn   rA   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jsonbrf   c                 C   s2   t |ttfr t| tjt|S t| tjt|S r   )	r1   r$   r2   r   r   r3   r   r4   r   r   r5   r   r   r   r6      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   r7   r   r$   rp   r   r   r   r:      s
    
zBinaryJSONField.contains_anyc                 G   s   t | tjtt|S r   )r   r   r;   r   r$   rp   r   r   r   r<      s
    
zBinaryJSONField.contains_allN)	r)   r*   r+   rj   ra   r6   r   r:   r<   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdd ZdS )TSVectorFieldtsvectorrf   c                 C   s   t | tjt|S r   )r   r   TS_MATCHrz   
to_tsquery)r   queryr   r   r   match  s    zTSVectorField.matchN)r)   r*   r+   rj   ra   r   r   r   r   r   r     s   r   c                 C   s   t t| tjt|S r   )r   rz   Zto_tsvectorr   r   r   )rS   r   r   r   r   Match  s    r   ry   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::)rw   r~   r   r   r   r   ro   rq   r   r3   r   r7   r;   r4   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_indexr1   r^   rb   nodesinsertr   )r   rV   fieldsuniqueclauserb   rS   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 )rg   )str).0partr   r   r   
<listcomp>4  s     z=PostgresqlExtCompiler._parse_object_slice.<locals>.<listcomp>z%s[%s]rG   )
parse_noder   r   join)r   r   	alias_mapconvrm   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   rm   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   rL   r   r   interpolation)r   r   r   r   rm   r   Zoperandr   r   r   _parse_json_pathJ  s    z&PostgresqlExtCompiler._parse_json_pathc                    s(   t t|  }|j| j| j| jd |S )N)rF   r>   rD   )r   r   get_parse_mapr   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   rc   rd   r!   r   r   r    _  s    zPostgresqlExtDatabase.__init__Nc                 C   s    |r|   j|dS |    S )Nname)rY   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
startswithexception_wrapperr   r   uuiduuid1executer   get_autocommitautorollbackrollbackcommit)r   rm   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   rX   rd   r\   r!   r   r   r     s    zPostgresqlExtDatabase._connect)N)NTF)
r)   r*   r+   r   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   rV   _clone_attributes)rN   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   )rm   rX   r   )r   rm   r   r   r   r   _execute  s       zServerSideSelectQuery._executeN)r)   r*   r+   rQ   r   r   r   r   r   r   r     s   
r   ztimestamp with time zoneZhstorer   r   r   )rt   rv   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   rX   transactionr   _qriterator)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   )lhsrhs	join_typeZ	conditionr   r   r   LateralJoin  s    
r   )r   T)E__doc__r   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=   rC   rE   objectrR   r]   r^   Fieldre   DateTimeFieldrs   ru   r   r   	TextFieldr   r   r   r   PostgresqlDatabaser   r   register_fieldsregister_opsr   r   r   r   rw   r~   ro   rq   r   r3   r   r7   r;   r4   r   r   r   r   r   r   r   <module>   s   



 )9+               