U
    8ÄT_ D  ã                   @   s2  d dl mZ d dlmZmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZmZmZmZmZ d dlmZ d d	lmZ eeefZG d
d„ dƒZG dd„ deeƒZG dd„ deƒZ G dd„ dƒZ!G dd„ dƒZ"G dd„ de"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(G d d!„ d!eƒZ)G d"d#„ d#eƒZ*G d$d%„ d%e"eƒZ+G d&d'„ d'e"e ƒZ,G d(d)„ d)e"e ƒZ-G d*d+„ d+ƒZ.G d,d-„ d-e.e"eƒZ/G d.d/„ d/e ƒZ0G d0d1„ d1e ƒZ1G d2d3„ d3eƒZ2G d4d5„ d5eƒZ3G d6d7„ d7e"e ƒZ4ej5G d8d9„ d9e"eeƒƒZ6G d:d;„ d;e.e"eƒZ7G d<d=„ d=eƒZ8G d>d?„ d?e ƒZ9G d@dA„ dAeƒZ:G dBdC„ dCeƒZ;G dDdE„ dEeƒZ<G dFdG„ dGe.e"eƒZ=G dHdI„ dIe"e ƒZ>G dJdK„ dKeƒZ?G dLdM„ dMe!e ƒZ@G dNdO„ dOe!e ƒZAG dPdQ„ dQe"e ƒZBG dRdS„ dSe ƒZG dTdU„ dUe@ƒZCG dVdW„ dWe"e ƒZDdXS )Yé    )ÚDecimal)ÚBaseSpatialFieldÚGeometryField)Ú	AreaFieldÚDistanceField)ÚGEOSGeometry)Ú
FieldError)ÚNotSupportedError)ÚBinaryFieldÚBooleanFieldÚ
FloatFieldÚFuncÚIntegerFieldÚ	TextFieldÚ	TransformÚValue)ÚCast)Úcached_propertyc                       s`   e Zd ZdZdZ‡ fdd„Zedd„ ƒZedd„ ƒZ	d‡ fd	d
„	Z
‡ fdd„Zddd„Z‡  ZS )ÚGeoFuncMixinN)r   c              	      s¼   t ƒ j||Ž | jD ]¢}| j| }t|tƒs.qz
|j}W n tk
rP   d }Y nX |j}t|t	ƒrp|r†t|t
ƒs†td| j|d f ƒ‚|js˜|s˜tdƒ‚|st|t
|jd�d�| j|< qd S )Nz9%s function requires a geometric argument in position %d.é   z$SRID is required for all geometries.©Úsrid)Úoutput_field)ÚsuperÚ__init__Úgeom_param_posÚsource_expressionsÚ
isinstancer   r   r   Úvaluer   r   Ú	TypeErrorÚnamer   Ú
ValueError)ÚselfÚexpressionsÚextraÚposÚexprr   Zgeom©Ú	__class__© úJ/tmp/pip-unpacked-wheel-dv63caxw/django/contrib/gis/db/models/functions.pyr      s     





zGeoFuncMixin.__init__c                 C   s   | j jS ©N)r(   Ú__name__©r"   r)   r)   r*   r    *   s    zGeoFuncMixin.namec                 C   s   | j | jd  jS ©Nr   )r   r   Úfieldr-   r)   r)   r*   Ú	geo_field.   s    zGeoFuncMixin.geo_fieldc                    s:   | j d kr |d kr |j | j¡}tƒ j||fd|i|—ŽS )NÚfunction)r1   ÚopsÚspatial_function_namer    r   Úas_sql)r"   ÚcompilerÚ
connectionr1   Úextra_contextr'   r)   r*   r4   2   s    zGeoFuncMixin.as_sqlc           
         s¤   t ƒ j||Ž}| ¡ }| jD ]4}|| }t|tƒstd| j|d t|ƒj	f ƒ‚q|j
j}| jdd … D ]6}|j| }|jj}	|	|krht||ƒj||Ž|j|< qh|S )Nz<%s function requires a GeometryField in position %s, got %s.r   )r   Úresolve_expressionÚget_source_fieldsr   r   r   r   r    Útyper,   r0   r   r   r   r   )
r"   ÚargsÚkwargsÚresZsource_fieldsr%   r/   Z	base_sridr&   Z	expr_sridr'   r)   r*   r8   7   s&    

  ÿÿ
zGeoFuncMixin.resolve_expressionÚ c                 C   s,   t |dƒs(|r(t||ƒs(td||f ƒ‚|S )Nr8   z2The %s parameter has the wrong type: should be %s.)Úhasattrr   r   )r"   r   Ú
param_nameZcheck_typesr)   r)   r*   Ú_handle_paramN   s    
 ÿÿzGeoFuncMixin._handle_param)N)r>   N)r,   Ú
__module__Ú__qualname__r1   r   r   Úpropertyr    r   r0   r4   r8   rA   Ú__classcell__r)   r)   r'   r*   r      s   

r   c                   @   s   e Zd ZdS )ÚGeoFuncN©r,   rB   rC   r)   r)   r)   r*   rF   X   s   rF   c                   @   s   e Zd Zedd„ ƒZdS )ÚGeomOutputGeoFuncc                 C   s   t | jjd�S )Nr   )r   r0   r   r-   r)   r)   r*   r   ]   s    zGeomOutputGeoFunc.output_fieldN)r,   rB   rC   r   r   r)   r)   r)   r*   rH   \   s   rH   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚSQLiteDecimalToFloatMixinz›
    By default, Decimal values are converted to str by the SQLite backend, which
    is not acceptable by the GIS functions expecting numeric values.
    c                    sB   |   ¡ D ]&}t|dƒrt|jtƒrt|jƒ|_qtƒ j||f|ŽS )Nr   )Úget_source_expressionsr?   r   r   r   Úfloatr   r4   )r"   r5   r6   r7   r&   r'   r)   r*   Ú	as_sqliteg   s    z#SQLiteDecimalToFloatMixin.as_sqlite)r,   rB   rC   Ú__doc__rL   rE   r)   r)   r'   r*   rI   b   s   rI   c                   @   s   e Zd ZdZdd„ ZdS )ÚOracleToleranceMixingš™™™™™©?c                 K   sJ   t |  | j d| j¡dt¡ƒ}|  ¡ }| |  ¡ |f•¡ |j	||f|ŽS )NÚ	tolerance)
r   rA   r$   ÚgetrO   ÚNUMERIC_TYPESÚcopyÚset_source_expressionsrJ   r4   )r"   r5   r6   r7   rO   Úcloner)   r)   r*   Ú	as_oracleq   s    ýzOracleToleranceMixin.as_oracleN)r,   rB   rC   rO   rU   r)   r)   r)   r*   rN   n   s   rN   c                       s4   e Zd ZdZedd„ ƒZ‡ fdd„Zdd„ Z‡  ZS )ÚArear   c                 C   s
   t | jƒS r+   )r   r0   r-   r)   r)   r*   r      s    zArea.output_fieldc                    s.   |j js| j |¡rtdƒ‚tƒ j||f|ŽS )Nz2Area on geodetic coordinate systems not supported.)ÚfeaturesZsupports_area_geodeticr0   Úgeodeticr	   r   r4   ©r"   r5   r6   r7   r'   r)   r*   r4   ƒ   s    zArea.as_sqlc                 K   s,   | j  |¡rd|d< d|d< | j||f|ŽS )Nz+%(function)s(%(expressions)s, %(spheroid)d)ÚtemplateTÚspheroid)r0   rX   r4   rY   r)   r)   r*   rL   ˆ   s    zArea.as_sqlite)	r,   rB   rC   Úarityr   r   r4   rL   rE   r)   r)   r'   r*   rV   |   s
   
rV   c                   @   s   e Zd Zeƒ ZdZdZdS )ÚAzimuthé   ©r   r   N©r,   rB   rC   r   r   r\   r   r)   r)   r)   r*   r]   �   s   r]   c                       s0   e Zd Zeƒ Zd‡ fdd„	Z‡ fdd„Z‡  ZS )Ú	AsGeoJSONFé   c                    sf   |g}|d k	r"|  |  |dt¡¡ d}|r4|r4d}n|r>d}n|rFd}|rT|  |¡ tƒ j||Ž d S )NÚ	precisionr   é   r   r^   ©ÚappendrA   Úintr   r   )r"   Ú
expressionZbboxZcrsrc   r$   r#   Úoptionsr'   r)   r*   r   ˜   s    
zAsGeoJSON.__init__c                    s8   |   ¡ }|  ¡ }| |d d… ¡ tt|ƒj||f|ŽS )Nr   )rJ   rR   rS   r   ra   r4   )r"   r5   r6   r7   r   rT   r'   r)   r*   rU   §   s    zAsGeoJSON.as_oracle)FFrb   )r,   rB   rC   r   r   r   rU   rE   r)   r)   r'   r*   ra   •   s   ra   c                       s4   e Zd ZdZeƒ Zd‡ fdd„	Z‡ fdd„Z‡  ZS )	ÚAsGML)r   r^   rb   c                    s6   ||g}|d k	r$|  |  |dt¡¡ tƒ j||Ž d S ©Nrc   re   )r"   rh   Úversionrc   r$   r#   r'   r)   r*   r   ²   s    zAsGML.__init__c                    sT   |   ¡ }|d }|  ¡ }| |d g¡ |jdkr6dnd|d< tt|ƒj||f|ŽS )Nr   r   rd   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr1   )rJ   rR   rS   r   r   rj   r4   )r"   r5   r6   r7   r   rl   rT   r'   r)   r*   rU   ¸   s    zAsGML.as_oracle)r^   rb   )	r,   rB   rC   r   r   r   r   rU   rE   r)   r)   r'   r*   rj   ®   s   rj   c                       s$   e Zd Zeƒ Zd‡ fdd„	Z‡  ZS )ÚAsKMLrb   c                    s4   |g}|d k	r"|  |  |dt¡¡ tƒ j||Ž d S rk   re   ©r"   rh   rc   r$   r#   r'   r)   r*   r   Ä   s    zAsKML.__init__)rb   ©r,   rB   rC   r   r   r   rE   r)   r)   r'   r*   rm   Á   s   rm   c                       s$   e Zd Zeƒ Zd‡ fdd„	Z‡  ZS )ÚAsSVGFrb   c                    s<   t |dƒr|nt|ƒ}|||  |dt¡g}tƒ j||Ž d S )Nr8   rc   )r?   rg   rA   r   r   )r"   rh   Úrelativerc   r$   r#   r'   r)   r*   r   Î   s    ýzAsSVG.__init__)Frb   ro   r)   r)   r'   r*   rp   Ë   s   rp   c                   @   s   e Zd Zeƒ ZdZdS )ÚAsWKBr   N)r,   rB   rC   r
   r   r\   r)   r)   r)   r*   rr   Ø   s   rr   c                   @   s   e Zd Zeƒ ZdZdS )ÚAsWKTr   N)r,   rB   rC   r   r   r\   r)   r)   r)   r*   rs   Ý   s   rs   c                       s*   e Zd Zd‡ fdd„	Z‡ fdd„Z‡  ZS )ÚBoundingCircleé0   c                    s   t ƒ j||f|Ž d S r+   )r   r   )r"   rh   Znum_segr$   r'   r)   r*   r   ã   s    zBoundingCircle.__init__c                    s2   |   ¡ }| |  ¡ d g¡ tt|ƒj||f|ŽS r.   )rR   rS   rJ   r   rt   rU   ©r"   r5   r6   r7   rT   r'   r)   r*   rU   æ   s    zBoundingCircle.as_oracle)ru   )r,   rB   rC   r   rU   rE   r)   r)   r'   r*   rt   â   s   rt   c                   @   s   e Zd ZdZdS )ÚCentroidr   N©r,   rB   rC   r\   r)   r)   r)   r*   rw   ì   s   rw   c                   @   s   e Zd ZdZdZdS )Ú
Differencer^   r_   N©r,   rB   rC   r\   r   r)   r)   r)   r*   ry   ð   s   ry   c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚDistanceResultMixinc                 C   s
   t | jƒS r+   )r   r0   r-   r)   r)   r*   r   ö   s    z DistanceResultMixin.output_fieldc                 C   s   | j jo| j jdkS )Niæ  )r0   Ú	geographyr   r-   r)   r)   r*   Úsource_is_geographyú   s    z'DistanceResultMixin.source_is_geographyN)r,   rB   rC   r   r   r}   r)   r)   r)   r*   r{   õ   s   
r{   c                       s>   e Zd ZdZdZd	‡ fdd„	Z‡ fdd„Z‡ fdd„Z‡  ZS )
ÚDistancer_   Nc                    s2   ||g}|d k	r |   |dt¡| _tƒ j||Ž d S )Nr[   )rA   Úboolr[   r   r   )r"   Úexpr1Úexpr2r[   r$   r#   r'   r)   r*   r     s    zDistance.__init__c                    sÀ   |   ¡ }d }|jd }|  ¡ }|jj|krZt|tƒr>||j_nt|t|jj	|d�ƒ|jd< |s¢| j
 |¡r¢| jr–|j d¡}|j t| j
 |¡ƒ¡ n|j d¡}tt|ƒj||fd|i|—ŽS )Nr   )r   r|   ZDistanceSpheroidZDistanceSpherer1   )rR   r   r}   r   r|   r   r   r   r   r   r0   rX   r[   r2   r3   rf   r   r~   r4   )r"   r5   r6   r7   rT   r1   r�   r|   r'   r)   r*   Úas_postgresql  s"    


þ
zDistance.as_postgresqlc                    s8   | j  |¡r&d|d< tt| jƒƒ|d< tƒ j||f|ŽS )Nz8COALESCE(%(function)s(%(expressions)s, %(spheroid)s), 0)rZ   r[   )r0   rX   rg   r   r[   r   r4   rY   r'   r)   r*   rL   !  s    zDistance.as_sqlite)N)	r,   rB   rC   r   r[   r   r‚   rL   rE   r)   r)   r'   r*   r~   þ   s
   r~   c                   @   s   e Zd ZdZdS )ÚEnveloper   Nrx   r)   r)   r)   r*   rƒ   )  s   rƒ   c                   @   s   e Zd ZdZdS )ÚForcePolygonCWr   Nrx   r)   r)   r)   r*   r„   -  s   r„   c                       s,   e Zd Zeƒ Zd‡ fdd„	Zdd„ Z‡  ZS )ÚGeoHashNc                    s4   |g}|d k	r"|  |  |dt¡¡ tƒ j||Ž d S rk   re   rn   r'   r)   r*   r   4  s    zGeoHash.__init__c                 K   s6   |   ¡ }t|jƒdk r&|j tdƒ¡ |j||f|ŽS )Nr^   éd   )rR   Úlenr   rf   r   r4   rv   r)   r)   r*   Úas_mysql:  s    zGeoHash.as_mysql)N)r,   rB   rC   r   r   r   rˆ   rE   r)   r)   r'   r*   r…   1  s   r…   c                   @   s"   e Zd Zeƒ ZdZdZdZdZdS )ÚGeometryDistancer^   r>   z <-> r_   N)	r,   rB   rC   r   r   r\   r1   Z
arg_joinerr   r)   r)   r)   r*   r‰   B  s
   r‰   c                   @   s   e Zd ZdZdZdS )ÚIntersectionr^   r_   Nrz   r)   r)   r)   r*   rŠ   J  s   rŠ   c                       s&   e Zd ZdZeƒ Z‡ fdd„Z‡  ZS )ÚIsValidZisvalidc                    s"   t ƒ j||f|Ž\}}d| |fS )Nz%CASE %s WHEN 'TRUE' THEN 1 ELSE 0 END)r   rU   )r"   r5   r6   r7   ZsqlÚparamsr'   r)   r*   rU   T  s    zIsValid.as_oracle)r,   rB   rC   Úlookup_namer   r   rU   rE   r)   r)   r'   r*   r‹   O  s   r‹   c                       sB   e Zd Zd
‡ fdd„	Z‡ fdd„Z‡ fdd„Z‡ fdd	„Z‡  ZS )ÚLengthTc                    s   || _ tƒ j|f|Ž d S r+   )r[   r   r   )r"   r€   r[   r$   r'   r)   r*   r   Z  s    zLength.__init__c                    s.   | j  |¡r|jjstdƒ‚tƒ j||f|ŽS )Nz6This backend doesn't support Length on geodetic fields)r0   rX   rW   Zsupports_length_geodeticr	   r   r4   rY   r'   r)   r*   r4   ^  s    zLength.as_sqlc                    sž   |   ¡ }d }|  ¡ r(|j t| jƒ¡ nX| j |¡rZ|j 	d¡}|j t| j |¡ƒ¡ n&t
dd„ |  ¡ D ƒƒ}|dkr€|jj}tt|ƒj||fd|i|—ŽS )NZLengthSpheroidc                 s   s   | ]}|r|j V  qd S r+   ©Údim©Ú.0Úfr)   r)   r*   Ú	<genexpr>m  s      z'Length.as_postgresql.<locals>.<genexpr>r^   r1   )rR   r}   r   rf   r   r[   r0   rX   r2   r3   Úminr9   Zlength3dr   rŽ   r4   )r"   r5   r6   r7   rT   r1   r�   r'   r)   r*   r‚   c  s    zLength.as_postgresqlc                    s8   d }| j  |¡r| jrdnd}tƒ j||fd|i|—ŽS )NZGeodesicLengthZGreatCircleLengthr1   )r0   rX   r[   r   r4   )r"   r5   r6   r7   r1   r'   r)   r*   rL   r  s    zLength.as_sqlite)T)r,   rB   rC   r   r4   r‚   rL   rE   r)   r)   r'   r*   rŽ   Y  s   rŽ   c                   @   s   e Zd Zeƒ ZdZdZdS )ÚLineLocatePointr^   r_   Nr`   r)   r)   r)   r*   r–   y  s   r–   c                   @   s   e Zd ZdS )Ú	MakeValidNrG   r)   r)   r)   r*   r—     s   r—   c                   @   s   e Zd Zeƒ ZdZdS )ÚMemSizer   N©r,   rB   rC   r   r   r\   r)   r)   r)   r*   r˜   ƒ  s   r˜   c                   @   s   e Zd Zeƒ ZdZdS )ÚNumGeometriesr   Nr™   r)   r)   r)   r*   rš   ˆ  s   rš   c                   @   s   e Zd Zeƒ ZdZdS )Ú	NumPointsr   Nr™   r)   r)   r)   r*   r›   �  s   r›   c                       s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )Ú	Perimeterr   c                    s`   d }| j  |¡r |  ¡ s tdƒ‚tdd„ |  ¡ D ƒƒ}|dkrF|jj}tƒ j	||fd|i|—ŽS )Nz<ST_Perimeter cannot use a non-projected non-geography field.c                 s   s   | ]}|j V  qd S r+   r�   r‘   r)   r)   r*   r”   ™  s     z*Perimeter.as_postgresql.<locals>.<genexpr>r^   r1   )
r0   rX   r}   r	   r•   r9   r2   Zperimeter3dr   r4   )r"   r5   r6   r7   r1   r�   r'   r)   r*   r‚   •  s    zPerimeter.as_postgresqlc                    s&   | j  |¡rtdƒ‚tƒ j||f|ŽS )Nz+Perimeter cannot use a non-projected field.)r0   rX   r	   r   r4   rY   r'   r)   r*   rL   ž  s    zPerimeter.as_sqlite)r,   rB   rC   r\   r‚   rL   rE   r)   r)   r'   r*   rœ   ’  s   	rœ   c                   @   s   e Zd ZdZdS )ÚPointOnSurfacer   Nrx   r)   r)   r)   r*   r�   ¤  s   r�   c                   @   s   e Zd ZdZdS )ÚReverser   Nrx   r)   r)   r)   r*   rž   ¨  s   rž   c                       s   e Zd Zd‡ fdd„	Z‡  ZS )ÚScaleç        c                    sL   ||   |dt¡|   |dt¡g}|dkr:| |   |dt¡¡ tƒ j||Ž d S )NÚxÚyr    Úz)rA   rQ   rf   r   r   )r"   rh   r¡   r¢   r£   r$   r#   r'   r)   r*   r   ­  s    ýzScale.__init__)r    ©r,   rB   rC   r   rE   r)   r)   r'   r*   rŸ   ¬  s   rŸ   c                       s   e Zd Z‡ fdd„Z‡  ZS )Ú
SnapToGridc                    sŒ   t |ƒ}|g}|dkr0| ‡ fdd„|D ƒ¡ nJ|dkrr|‡ fdd„|dd … D ƒ‡ fdd„|d	d… D ƒ•7 }ntd
ƒ‚tƒ j||Ž d S )N)r   r^   c                    s   g | ]}ˆ   |d t¡‘qS )r>   ©rA   rQ   ©r’   Úargr-   r)   r*   Ú
<listcomp>¾  s     z'SnapToGrid.__init__.<locals>.<listcomp>é   c                 3   s   | ]}ˆ   |d t¡V  qdS ©r>   Nr¦   r§   r-   r)   r*   r”   Ã  s     z&SnapToGrid.__init__.<locals>.<genexpr>r^   c                 3   s   | ]}ˆ   |d t¡V  qdS r«   r¦   r§   r-   r)   r*   r”   Ä  s     r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r‡   Úextendr!   r   r   )r"   rh   r;   r$   Únargsr#   r'   r-   r*   r   ¹  s    ÿþzSnapToGrid.__init__r¤   r)   r)   r'   r*   r¥   ¸  s   r¥   c                   @   s   e Zd ZdZdZdS )ÚSymDifferencer^   r_   Nrz   r)   r)   r)   r*   r®   Ë  s   r®   c                       s   e Zd Z‡ fdd„Z‡  ZS )r   c                    s:   ||   |dt¡g}d|kr(t|d�|d< tƒ j||Ž d S )Nr   r   r   )rA   rg   r   r   r   )r"   rh   r   r$   r#   r'   r)   r*   r   Ñ  s    þzTransform.__init__r¤   r)   r)   r'   r*   r   Ð  s   r   c                       s   e Zd Z‡ fdd„Z‡  ZS )Ú	Translatec                    s<   |   ¡ }t| jƒdk r&|j tdƒ¡ tt|ƒj||f|ŽS )Nrª   r   )rR   r‡   r   rf   r   r   r¯   rL   rv   r'   r)   r*   rL   Ü  s    zTranslate.as_sqlite)r,   rB   rC   rL   rE   r)   r)   r'   r*   r¯   Û  s   r¯   c                   @   s   e Zd ZdZdZdS )ÚUnionr^   r_   Nrz   r)   r)   r)   r*   r°   ä  s   r°   N)EÚdecimalr   Z#django.contrib.gis.db.models.fieldsr   r   Z django.contrib.gis.db.models.sqlr   r   Zdjango.contrib.gis.geosr   Zdjango.core.exceptionsr   Z	django.dbr	   Zdjango.db.modelsr
   r   r   r   r   r   r   r   Zdjango.db.models.functionsr   Zdjango.utils.functionalr   rg   rK   rQ   r   rF   rH   rI   rN   rV   r]   ra   rj   rm   rp   rr   rs   rt   rw   ry   r{   r~   rƒ   r„   r…   r‰   rŠ   Zregister_lookupr‹   rŽ   r–   r—   r˜   rš   r›   rœ   r�   rž   rŸ   r¥   r®   r¯   r°   r)   r)   r)   r*   Ú<module>   sb   (
F

	+	 	