a
    Kcòf.  ã                   @   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 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¡S ©N)ÚcompileÚlhs)ÚselfÚcompilerÚ
connection© r   úa/home/httpd/docs/test/DocsMgr/lib/python3.9/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ƒ  ||¡ i | _|  ¡  d S r   )Ú
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,|  ¡  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  |¡gfS )Nú%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ƒ  ||¡S t | jtƒr6| j |j¡| _tƒ  ||¡\}}|j 	| j
j| j|¡}|| |fS r   )r   r!   r   r   Úprocess_rhsr   Úresolve_expressionÚqueryr0   Zget_geom_placeholderr   Úoutput_field)r   r   r   r!   r   Úplaceholderr"   r   r   r3   <   s    ÿzGISLookup.process_rhsc                 C   s   |j j| j S r   )r0   Úgis_operatorsr)   )r   r   r!   r   r   r   Ú
get_rhs_opH   s    zGISLookup.get_rhs_opc           
      C   s\   |   ||¡\}}|  ||¡\}}g |¢|¢R }||ddœ| j¥}|  ||¡}	|	 || ||¡S )Nr/   )r   r!   r1   )Zprocess_lhsr3   r   r9   r   )
r   r   r   Zlhs_sqlZ
lhs_paramsÚrhs_sqlr   Z
sql_paramsr   Zrhs_opr   r   r   r   N   s    ýüzGISLookup.as_sql)F)r   r   r   Úsql_templateZtransform_funcÚdistancer-   r.   r   r    r*   r2   r3   r9   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   r>   b   s   r>   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_rightNr?   r   r   r   r   rA   l   s   rA   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_belowNr?   r   r   r   r   rB   v   s   rB   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_aboveNr?   r   r   r   r   rC   €   s   rC   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.
    ÚleftNr?   r   r   r   r   rD   Š   s   rD   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.
    ÚrightNr?   r   r   r   r   rF   ”   s   rF   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_belowNr?   r   r   r   r   rH   ž   s   rH   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_aboveNr?   r   r   r   r   rI   ¨   s   rI   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_asNr?   r   r   r   r   rJ   ²   s   rJ   Ú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
bbcontainsNr?   r   r   r   r   rL   À   s   rL   c                   @   s   e Zd ZdZdZdS )ÚBBOverlapsLookupzc
    The 'bboverlaps' operator returns true if A's bounding box overlaps B's
    bounding box.
    Z
bboverlapsNr?   r   r   r   r   rM   Ê   s   rM   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.
    Ú	containedNr?   r   r   r   r   rN   Ô   s   rN   c                   @   s   e Zd ZdZdS )ÚContainsLookupÚcontainsN©r   r   r   r)   r   r   r   r   rP   ã   s   rP   c                   @   s   e Zd ZdZdS )ÚContainsProperlyLookupZcontains_properlyNrR   r   r   r   r   rS   è   s   rS   c                   @   s   e Zd ZdZdS )ÚCoveredByLookupZ	coveredbyNrR   r   r   r   r   rT   í   s   rT   c                   @   s   e Zd ZdZdS )ÚCoversLookupZcoversNrR   r   r   r   r   rU   ò   s   rU   c                   @   s   e Zd ZdZdS )ÚCrossesLookupZcrossesNrR   r   r   r   r   rV   ÷   s   rV   c                   @   s   e Zd ZdZdS )ÚDisjointLookupZdisjointNrR   r   r   r   r   rW   ü   s   rW   c                   @   s   e Zd ZdZdS )ÚEqualsLookupÚequalsNrR   r   r   r   r   rX     s   rX   c                   @   s   e Zd ZdZdS )ÚIntersectsLookupZ
intersectsNrR   r   r   r   r   rZ     s   rZ   c                   @   s   e Zd ZdZdS )ÚOverlapsLookupÚoverlapsNrR   r   r   r   r   r[     s   r[   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                    sp   | j d }|jj| j }t|dƒr.| |¡ n"t|tƒrD| j 	|¡sPt
d| ƒ‚tƒ  ||¡\}}|||g fS )Nr   Úcheck_relate_argumentz)Invalid intersection matrix pattern "%s".)r   r0   r8   r)   Úhasattrr^   r   ÚstrÚpattern_regexÚmatchr+   r   r3   )r   r   r   ÚpatternZ
backend_opÚsqlÚparamsr"   r   r   r3     s    

zRelateLookup.process_rhs)	r   r   r   r)   r;   r	   ra   r3   r=   r   r   r"   r   r]     s   r]   c                   @   s   e Zd ZdZdS )ÚTouchesLookupZtouchesNrR   r   r   r   r   rf   "  s   rf   c                   @   s   e Zd ZdZdS )ÚWithinLookupZwithinNrR   r   r   r   r   rg   '  s   rg   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   sx   dt | jƒ  krdks,n td| j ƒ‚n$t | jƒdkrP| jd dkrPtdƒ‚t | jƒdkrt| jd dkrt|  ¡  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    0  s    ÿÿz%DistanceLookupBase.process_rhs_paramsc                 C   sB   | j d }t|dƒr&| | |j¡¡S d|j | jj| j | j	¡fS )Nr   r4   r/   )
r   r_   r   r4   r5   r0   Zget_distancer   r6   r)   ©r   r   r   Z
dist_paramr   r   r   Úprocess_distance?  s    
ÿÿþýz#DistanceLookupBase.process_distanceN)r   r   r   r<   r;   r    rl   r   r   r   r   rh   ,  s   rh   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s.t|dƒr.t|tƒs.tdƒ‚tƒ  ||¡S )Nr   r4   zXThis backend does not support expressions for specifying distance in the dwithin lookup.)	r   ÚfeaturesZsupports_dwithin_distance_exprr_   r   r   r   r   rl   rk   r"   r   r   rl   R  s    
ÿþýÿzDWithinLookup.process_distancec                    s8   |   ||¡\}}|| jd< tƒ  ||¡\}}||| fS )Nr1   )rl   r   r   r3   )r   r   r   Údist_sqlÚdist_paramsr:   re   r"   r   r   r3   _  s    
zDWithinLookup.process_rhs)r   r   r   r)   r;   rl   r3   r=   r   r   r"   r   rm   M  s   rm   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¡¡\}}|  	||¡\}}d|| j
|dœ || fS )Nr%   éÿÿÿÿrj   )rj   z%(func)s %(op)s %(dist)s)ÚfuncÚopÚdist)r(   r   r0   Zdistance_expr_for_lookupr   r!   r   r4   r5   rl   rt   )	r   r   r   rj   Zdistance_exprrd   re   ro   rp   r   r   r   r   g  s    ÿþ
ÿþz!DistanceLookupFromFunction.as_sqlNr   r   r   r   r   rq   f  s   rq   c                   @   s   e Zd ZdZdZdS )ÚDistanceGTLookupZdistance_gtú>N©r   r   r   r)   rt   r   r   r   r   rv   v  s   rv   c                   @   s   e Zd ZdZdZdS )ÚDistanceGTELookupZdistance_gtez>=Nrx   r   r   r   r   ry   |  s   ry   c                   @   s   e Zd ZdZdZdS )ÚDistanceLTLookupZdistance_ltú<Nrx   r   r   r   r   rz   ‚  s   rz   c                   @   s   e Zd ZdZdZdS )ÚDistanceLTELookupZdistance_ltez<=Nrx   r   r   r   r   r|   ˆ  s   r|   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_lookupr>   rA   rB   rC   rD   rF   rH   rI   rJ   rL   rM   rN   rP   rS   rT   rU   rV   rW   rX   rZ   r[   r]   rf   rg   rh   rm   rq   rv   ry   rz   r|   r   r   r   r   Ú<module>   sˆ   T								
		!