U
    5øiUD  ã                   @   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-gcyiijx6/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dd„ Zd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                 K   s0   |   ¡ }| dd„ | ¡ D ƒ¡ |j||f|ŽS )Nc                 S   s4   g | ],}t |d ƒr,t|jtƒr,tt|jƒƒn|‘qS )r   )r?   r   r   r   r   Úfloat)Ú.0r&   r)   r)   r*   Ú
<listcomp>i   s   þ$z7SQLiteDecimalToFloatMixin.as_sqlite.<locals>.<listcomp>)ÚcopyÚset_source_expressionsÚget_source_expressionsr4   )r"   r5   r6   r7   rM   r)   r)   r*   Ú	as_sqliteg   s
    
ýz#SQLiteDecimalToFloatMixin.as_sqliteN)r,   rB   rC   Ú__doc__rP   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$   ÚgetrS   ÚNUMERIC_TYPESrM   rN   rO   r4   )r"   r5   r6   r7   rS   Úcloner)   r)   r*   Ú	as_oraclet   s    ýzOracleToleranceMixin.as_oracleN)r,   rB   rC   rS   rW   r)   r)   r)   r*   rR   q   s   rR   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   rZ   r4   r[   r)   r)   r*   rP   ‹   s    zArea.as_sqlite)	r,   rB   rC   Úarityr   r   r4   rP   rE   r)   r)   r'   r*   rX      s
   
rX   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crsre   r$   r#   Úoptionsr'   r)   r*   r   ›   s    
zAsGeoJSON.__init__c                    s8   |   ¡ }|  ¡ }| |d d… ¡ tt|ƒj||f|ŽS )Nr   )rO   rM   rN   r   rc   r4   )r"   r5   r6   r7   r   rV   r'   r)   r*   rW   ª   s    zAsGeoJSON.as_oracle)FFrd   )r,   rB   rC   r   r   r   rW   rE   r)   r)   r'   r*   rc   ˜   s   rc   c                       s4   e Zd ZdZeƒ Zd‡ fdd„	Z‡ fdd„Z‡  ZS )	ÚAsGML)r   r`   rd   c                    s6   ||g}|d k	r$|  |  |dt¡¡ tƒ j||Ž d S ©Nre   rg   )r"   rj   Úversionre   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   rf   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr1   )rO   rM   rN   r   r   rl   r4   )r"   r5   r6   r7   r   rn   rV   r'   r)   r*   rW   »   s    zAsGML.as_oracle)r`   rd   )	r,   rB   rC   r   r   r   r   rW   rE   r)   r)   r'   r*   rl   ±   s   rl   c                       s$   e Zd Zeƒ Zd‡ fdd„	Z‡  ZS )ÚAsKMLrd   c                    s4   |g}|d k	r"|  |  |dt¡¡ tƒ j||Ž d S rm   rg   ©r"   rj   re   r$   r#   r'   r)   r*   r   Ç   s    zAsKML.__init__)rd   ©r,   rB   rC   r   r   r   rE   r)   r)   r'   r*   ro   Ä   s   ro   c                       s$   e Zd Zeƒ Zd‡ fdd„	Z‡  ZS )ÚAsSVGFrd   c                    s<   t |dƒr|nt|ƒ}|||  |dt¡g}tƒ j||Ž d S )Nr8   re   )r?   ri   rA   r   r   )r"   rj   Úrelativere   r$   r#   r'   r)   r*   r   Ñ   s    ýzAsSVG.__init__)Frd   rq   r)   r)   r'   r*   rr   Î   s   rr   c                   @   s   e Zd Zeƒ ZdZdS )ÚAsWKBr   N)r,   rB   rC   r
   r   r^   r)   r)   r)   r*   rt   Û   s   rt   c                   @   s   e Zd Zeƒ ZdZdS )ÚAsWKTr   N)r,   rB   rC   r   r   r^   r)   r)   r)   r*   ru   à   s   ru   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"   rj   Znum_segr$   r'   r)   r*   r   æ   s    zBoundingCircle.__init__c                    s2   |   ¡ }| |  ¡ d g¡ tt|ƒj||f|ŽS r.   )rM   rN   rO   r   rv   rW   ©r"   r5   r6   r7   rV   r'   r)   r*   rW   é   s    zBoundingCircle.as_oracle)rw   )r,   rB   rC   r   rW   rE   r)   r)   r'   r*   rv   å   s   rv   c                   @   s   e Zd ZdZdS )ÚCentroidr   N©r,   rB   rC   r^   r)   r)   r)   r*   ry   ï   s   ry   c                   @   s   e Zd ZdZdZdS )Ú
Differencer`   ra   N©r,   rB   rC   r^   r   r)   r)   r)   r*   r{   ó   s   r{   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 )
ÚDistancera   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   )rM   r   r   r   r~   r   r   r   r   r   r0   rZ   r]   r2   r3   rh   r   r€   r4   )r"   r5   r6   r7   rV   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)r\   r]   )r0   rZ   ri   r�   r]   r   r4   r[   r'   r)   r*   rP   $  s    zDistance.as_sqlite)N)	r,   rB   rC   r   r]   r   r„   rP   rE   r)   r)   r'   r*   r€     s
   r€   c                   @   s   e Zd ZdZdS )ÚEnveloper   Nrz   r)   r)   r)   r*   r…   ,  s   r…   c                   @   s   e Zd ZdZdS )ÚForcePolygonCWr   Nrz   r)   r)   r)   r*   r†   0  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 rm   rg   rp   r'   r)   r*   r   7  s    zGeoHash.__init__c                 K   s6   |   ¡ }t|jƒdk r&|j tdƒ¡ |j||f|ŽS )Nr`   éd   )rM   Úlenr   rh   r   r4   rx   r)   r)   r*   Úas_mysql=  s    zGeoHash.as_mysql)N)r,   rB   rC   r   r   r   rŠ   rE   r)   r)   r'   r*   r‡   4  s   r‡   c                   @   s"   e Zd Zeƒ ZdZdZdZdZdS )ÚGeometryDistancer`   r>   z <-> ra   N)	r,   rB   rC   r   r   r^   r1   Z
arg_joinerr   r)   r)   r)   r*   r‹   E  s
   r‹   c                   @   s   e Zd ZdZdZdS )ÚIntersectionr`   ra   Nr|   r)   r)   r)   r*   rŒ   M  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   rW   )r"   r5   r6   r7   ZsqlÚparamsr'   r)   r*   rW   W  s    zIsValid.as_oracle)r,   rB   rC   Úlookup_namer   r   rW   rE   r)   r)   r'   r*   r�   R  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   ]  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   rZ   rY   Zsupports_length_geodeticr	   r   r4   r[   r'   r)   r*   r4   a  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©rK   Úfr)   r)   r*   Ú	<genexpr>p  s      z'Length.as_postgresql.<locals>.<genexpr>r`   r1   )rM   r   r   rh   r   r]   r0   rZ   r2   r3   Úminr9   Zlength3dr   r�   r4   )r"   r5   r6   r7   rV   r1   r’   r'   r)   r*   r„   f  s    zLength.as_postgresqlc                    s8   d }| j  |¡r| jrdnd}tƒ j||fd|i|—ŽS )NZGeodesicLengthZGreatCircleLengthr1   )r0   rZ   r]   r   r4   )r"   r5   r6   r7   r1   r'   r)   r*   rP   u  s    zLength.as_sqlite)T)r,   rB   rC   r   r4   r„   rP   rE   r)   r)   r'   r*   r�   \  s   r�   c                   @   s   e Zd Zeƒ ZdZdZdS )ÚLineLocatePointr`   ra   Nrb   r)   r)   r)   r*   r—   |  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   rZ   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   rZ   r	   r   r4   r[   r'   r)   r*   rP   ¡  s    zPerimeter.as_sqlite)r,   rB   rC   r^   r„   rP   rE   r)   r)   r'   r*   r�   •  s   	r�   c                   @   s   e Zd ZdZdS )ÚPointOnSurfacer   Nrz   r)   r)   r)   r*   rž   §  s   rž   c                   @   s   e Zd ZdZdS )ÚReverser   Nrz   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   rU   rh   r   r   )r"   rj   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   rU   ©rK   Úargr-   r)   r*   rL   Á  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"   rj   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`   ra   Nr|   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   ri   r   r   r   )r"   rj   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   )rM   r‰   r   rh   r   r   r¯   rP   rx   r'   r)   r*   rP   ß  s    zTranslate.as_sqlite)r,   rB   rC   rP   rE   r)   r)   r'   r*   r¯   Þ  s   r¯   c                   @   s   e Zd ZdZdZdS )ÚUnionr`   ra   Nr|   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   ri   rJ   rU   r   rF   rH   rI   rR   rX   r_   rc   rl   ro   rr   rt   ru   rv   ry   r{   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

	+	 	