3
g,                 @   s  d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZ G dd de	ZG d	d
 d
eZejG dd deZejG dd deZejG dd deZejG dd deZejG dd deZejG dd deZejG dd deZejG dd deZejG dd deZejed ejG dd deZejG d d! d!eZejG d"d# d#eZejG d$d% d%eZejG d&d' d'eZejG d(d) d)eZejG d*d+ d+eZ ejG d,d- d-eZ!ejG d.d/ d/eZ"ejG d0d1 d1eZ#ejG d2d3 d3eZ$ejG d4d5 d5eZ%ejG d6d7 d7eZ&ejG d8d9 d9eZ'ejG d:d; d;eZ(G d<d= d=eZ)ejG d>d? d?e)Z*G d@dA dAe)Z+ejG dBdC dCe+Z,ejG dDdE dEe+Z-ejG dFdG dGe+Z.ejG dHdI dIe+Z/dJS )K    )BaseSpatialField)Distance)NotSupportedError)
ExpressionLookup	Transform)Query)_lazy_re_compilec               @   s   e Zd Zdd ZdS )RasterBandTransformc             C   s   |j | jS )N)compilelhs)selfcompiler
connection r   b/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/contrib/gis/db/models/lookups.pyas_sql
   s    zRasterBandTransform.as_sqlN)__name__
__module____qualname__r   r   r   r   r   r
   	   s   r
   c                   sf   e Zd ZdZdZdZdZdZ fddZdd Z	dddZ
d	d
 Z fddZdd Zdd Z  ZS )	GISLookupNFc                s>   t |ttfr|n|g^}| _t j|| i | _| j  d S )N)
isinstancelisttuple
rhs_paramssuper__init__template_paramsprocess_rhs_params)r   r   rhs)	__class__r   r   r      s    zGISLookup.__init__c             C   sf   | j rJt| j | jdkrdndkr,| j  qbt| j dkrbtd| j nt| jtrb| jdd d S )Nrelate      zTuple too long for lookup %s.T)only_lhs)r   lenlookup_nameprocess_band_indices
ValueErrorr   r   r
   )r   r   r   r   r      s    
zGISLookup.process_rhs_paramsc             C   sP   |rd| _ | jjd | _dS t| jtr8| jjd | _nd| _| j^| _ | _dS )z
        Extract the lhs band index from the band transform class and the rhs
        band index from the input tuple.
        r#   N)band_rhsr   Z
band_indexband_lhsr   r
   r   )r   r$   r   r   r   r'   %   s    zGISLookup.process_band_indicesc             C   s   d|j j|gfS )Nz%s)opsZAdapter)r   valuer   r   r   r   get_db_prep_lookup8   s    zGISLookup.get_db_prep_lookupc                sj   t | jtrt j||S t | jtr6| jj|j| _t j||\}}|jj	| j
j| j|}|| |fS )N)r   r   r   r   process_rhsr   resolve_expressionqueryr+   Zget_geom_placeholderr   output_field)r   r   r   r   r   placeholder)r    r   r   r.   <   s    zGISLookup.process_rhsc             C   s   |j j| j S )N)r+   gis_operatorsr&   )r   r   r   r   r   r   
get_rhs_opF   s    zGISLookup.get_rhs_opc       
      C   sV   | j ||\}}| j||\}}||}||dd| j}| j||}	|	j|| ||S )Nz%s)r   r   r,   )Zprocess_lhsr.   r   r4   r   )
r   r   r   Zlhs_sqlZ
lhs_paramsrhs_sqlr   Z
sql_paramsr   Zrhs_opr   r   r   r   L   s    zGISLookup.as_sql)F)r   r   r   sql_templateZtransform_funcdistancer)   r*   r   r   r'   r-   r.   r4   r   __classcell__r   r   )r    r   r      s   


r   c               @   s   e Zd ZdZdZdS )OverlapsLeftLookupzy
    The overlaps_left operator returns true if A's bounding box overlaps or is to the
    left of B's bounding box.
    Zoverlaps_leftN)r   r   r   __doc__r&   r   r   r   r   r9   Z   s   r9   c               @   s   e Zd ZdZdZdS )OverlapsRightLookupz}
    The 'overlaps_right' operator returns true if A's bounding box overlaps or is to the
    right of B's bounding box.
    Zoverlaps_rightN)r   r   r   r:   r&   r   r   r   r   r;   c   s   r;   c               @   s   e Zd ZdZdZdS )OverlapsBelowLookupzs
    The 'overlaps_below' operator returns true if A's bounding box overlaps or is below
    B's bounding box.
    Zoverlaps_belowN)r   r   r   r:   r&   r   r   r   r   r<   l   s   r<   c               @   s   e Zd ZdZdZdS )OverlapsAboveLookupzs
    The 'overlaps_above' operator returns true if A's bounding box overlaps or is above
    B's bounding box.
    Zoverlaps_aboveN)r   r   r   r:   r&   r   r   r   r   r=   u   s   r=   c               @   s   e Zd ZdZdZdS )
LeftLookupzo
    The 'left' operator returns true if A's bounding box is strictly to the left
    of B's bounding box.
    leftN)r   r   r   r:   r&   r   r   r   r   r>   ~   s   r>   c               @   s   e Zd ZdZdZdS )RightLookupzq
    The 'right' operator returns true if A's bounding box is strictly to the right
    of B's bounding box.
    rightN)r   r   r   r:   r&   r   r   r   r   r@      s   r@   c               @   s   e Zd ZdZdZdS )StrictlyBelowLookupzp
    The 'strictly_below' operator returns true if A's bounding box is strictly below B's
    bounding box.
    Zstrictly_belowN)r   r   r   r:   r&   r   r   r   r   rB      s   rB   c               @   s   e Zd ZdZdZdS )StrictlyAboveLookupzp
    The 'strictly_above' operator returns true if A's bounding box is strictly above B's
    bounding box.
    Zstrictly_aboveN)r   r   r   r:   r&   r   r   r   r   rC      s   rC   c               @   s   e Zd ZdZdZdS )SameAsLookupz
    The "~=" operator is the "same as" operator. It tests actual geometric
    equality of two features. So if A and B are the same feature,
    vertex-by-vertex, the operator returns true.
    Zsame_asN)r   r   r   r:   r&   r   r   r   r   rD      s   rD   exactc               @   s   e Zd ZdZdZdS )BBContainsLookupzq
    The 'bbcontains' operator returns true if A's bounding box completely contains
    by B's bounding box.
    Z
bbcontainsN)r   r   r   r:   r&   r   r   r   r   rF      s   rF   c               @   s   e Zd ZdZdZdS )BBOverlapsLookupz_
    The 'bboverlaps' operator returns true if A's bounding box overlaps B's bounding box.
    Z
bboverlapsN)r   r   r   r:   r&   r   r   r   r   rG      s   rG   c               @   s   e Zd ZdZdZdS )ContainedLookupzt
    The 'contained' operator returns true if A's bounding box is completely contained
    by B's bounding box.
    Z	containedN)r   r   r   r:   r&   r   r   r   r   rH      s   rH   c               @   s   e Zd ZdZdS )ContainsLookupcontainsN)r   r   r   r&   r   r   r   r   rI      s   rI   c               @   s   e Zd ZdZdS )ContainsProperlyLookupZcontains_properlyN)r   r   r   r&   r   r   r   r   rK      s   rK   c               @   s   e Zd ZdZdS )CoveredByLookupZ	coveredbyN)r   r   r   r&   r   r   r   r   rL      s   rL   c               @   s   e Zd ZdZdS )CoversLookupZcoversN)r   r   r   r&   r   r   r   r   rM      s   rM   c               @   s   e Zd ZdZdS )CrossesLookupZcrossesN)r   r   r   r&   r   r   r   r   rN      s   rN   c               @   s   e Zd ZdZdS )DisjointLookupZdisjointN)r   r   r   r&   r   r   r   r   rO      s   rO   c               @   s   e Zd ZdZdS )EqualsLookupequalsN)r   r   r   r&   r   r   r   r   rP      s   rP   c               @   s   e Zd ZdZdS )IntersectsLookupZ
intersectsN)r   r   r   r&   r   r   r   r   rR      s   rR   c               @   s   e Zd ZdZdS )OverlapsLookupoverlapsN)r   r   r   r&   r   r   r   r   rS      s   rS   c                   s,   e Zd ZdZdZedZ fddZ  ZS )RelateLookupr!   z%(func)s(%(lhs)s, %(rhs)s, %%s)z^[012TF\*]{9}$c                st   | j d }|jj| j }t|dr.|j| n&t|t sH| jj	| rTt
d| t j||\}}|||g fS )Nr   check_relate_argumentz)Invalid intersection matrix pattern "%s".)r   r+   r3   r&   hasattrrV   r   strpattern_regexmatchr(   r   r.   )r   r   r   patternZ
backend_opsqlparams)r    r   r   r.      s    

zRelateLookup.process_rhs)	r   r   r   r&   r6   r	   rY   r.   r8   r   r   )r    r   rU      s   rU   c               @   s   e Zd ZdZdS )TouchesLookupZtouchesN)r   r   r   r&   r   r   r   r   r^     s   r^   c               @   s   e Zd ZdZdS )WithinLookupZwithinN)r   r   r   r&   r   r   r   r   r_     s   r_   c               @   s$   e Zd ZdZdZdd Zdd ZdS )DistanceLookupBaseTz+%(func)s(%(lhs)s, %(rhs)s) %(op)s %(value)sc             C   sz   dt | j  kodkn  s.td| j n$t | jdkrR| jd dkrRtdt | jdkrv| jd dkrv| j  d S )Nr#      z22, 3, or 4-element tuple required for '%s' lookup.r"   spheroidzHFor 4-element tuples the last argument must be the 'spheroid' directive.)r%   r   r(   r&   r'   )r   r   r   r   r     s    z%DistanceLookupBase.process_rhs_paramsc             C   sB   | j d }t|dr&|j|j|jS d|jj| jj| j | j	fS )Nr   r/   z%s)
r   rW   r   r/   r0   r+   Zget_distancer   r1   r&   )r   r   r   
dist_paramr   r   r   process_distance$  s    
z#DistanceLookupBase.process_distanceN)r   r   r   r7   r6   r   rd   r   r   r   r   r`     s   
r`   c                   s0   e Zd ZdZdZ fddZ fddZ  ZS )DWithinLookupZdwithinz%%(func)s(%(lhs)s, %(rhs)s, %(value)s)c                s@   | j d }|jj r2t|dr2t|t r2tdt j||S )Nr   r/   zXThis backend does not support expressions for specifying distance in the dwithin lookup.)	r   featuresZsupports_dwithin_distance_exprrW   r   r   r   r   rd   )r   r   r   rc   )r    r   r   rd   2  s    


zDWithinLookup.process_distancec                s8   | j ||\}}|| jd< t j||\}}||| fS )Nr,   )rd   r   r   r.   )r   r   r   dist_sqldist_paramsr5   r]   )r    r   r   r.   ?  s    
zDWithinLookup.process_rhs)r   r   r   r&   r6   rd   r.   r8   r   r   )r    r   re   -  s   re   c               @   s   e Zd Zdd ZdS )DistanceLookupFromFunctionc       	      C   sv   t | jdkr| jd dkpd }|jj| j| j|d}|j|j|j\}}| j	||\}}d|| j
|d || fS )Nr"   r#   rb   )rb   z%(func)s %(op)s %(dist)s)funcopdist)r%   r   r+   Zdistance_expr_for_lookupr   r   r   r/   r0   rd   rk   )	r   r   r   rb   Zdistance_exprr\   r]   rg   rh   r   r   r   r   G  s     z!DistanceLookupFromFunction.as_sqlN)r   r   r   r   r   r   r   r   ri   F  s   ri   c               @   s   e Zd ZdZdZdS )DistanceGTLookupZdistance_gt>N)r   r   r   r&   rk   r   r   r   r   rn   R  s   rn   c               @   s   e Zd ZdZdZdS )DistanceGTELookupZdistance_gtez>=N)r   r   r   r&   rk   r   r   r   r   rp   X  s   rp   c               @   s   e Zd ZdZdZdS )DistanceLTLookupZdistance_lt<N)r   r   r   r&   rk   r   r   r   r   rq   ^  s   rq   c               @   s   e Zd ZdZdZdS )DistanceLTELookupZdistance_ltez<=N)r   r   r   r&   rk   r   r   r   r   rs   d  s   rs   N)0Z#django.contrib.gis.db.models.fieldsr   Zdjango.contrib.gis.measurer   Z	django.dbr   Zdjango.db.modelsr   r   r   Zdjango.db.models.sql.queryr   Zdjango.utils.regex_helperr	   r
   r   Zregister_lookupr9   r;   r<   r=   r>   r@   rB   rC   rD   rF   rG   rH   rI   rK   rL   rM   rN   rO   rP   rR   rS   rU   r^   r_   r`   re   ri   rn   rp   rq   rs   r   r   r   r   <module>   s   L	