B
    CVvgUD  ã               @   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||Ž x¬| jD ]¢}| j| }t|tƒs0qy
|j}W n tk
rR   d }Y nX |j}t|t	ƒrr|rˆt|t
ƒsˆtd| j|d f ƒ‚|jsš|sštdƒ‚|st|t
|jd�d�| j|< qW 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-install-o3oxmrkh/Django/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   Úfield)r!   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)r,   ÚopsÚspatial_function_namer   r   Úas_sql)r!   ÚcompilerÚ
connectionr,   Úextra_context)r&   r'   r(   r/   2   s    zGeoFuncMixin.as_sqlc       
         s¬   t ƒ j||Ž}| ¡ }x>| jD ]4}|| }t|tƒstd| j|d t|ƒj	f ƒ‚qW |j
j}xH| jdd … D ]6}|j| }|jj}	|	|krnt||ƒj||Ž|j|< qnW |S )Nz<%s function requires a GeometryField in position %s, got %s.r   )r   Úresolve_expressionÚget_source_fieldsr   r   r   r   r   Útyper)   r+   r   r   r   r   )
r!   ÚargsÚkwargsÚresZsource_fieldsr$   r*   Z	base_sridr%   Z	expr_srid)r&   r'   r(   r3   7   s    

zGeoFuncMixin.resolve_expressionÚ c             C   s,   t |dƒs(|r(t||ƒs(td||f ƒ‚|S )Nr3   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)r9   N)r)   Ú
__module__Ú__qualname__r,   r   r   Úpropertyr   r   r+   r/   r3   r<   Ú__classcell__r'   r'   )r&   r(   r      s   r   c               @   s   e Zd ZdS )ÚGeoFuncN)r)   r=   r>   r'   r'   r'   r(   rA   X   s   rA   c               @   s   e Zd Zedd„ ƒZdS )ÚGeomOutputGeoFuncc             C   s   t | jjd�S )N)r   )r   r+   r   )r!   r'   r'   r(   r   ]   s    zGeomOutputGeoFunc.output_fieldN)r)   r=   r>   r   r   r'   r'   r'   r(   rB   \   s   rB   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>j   s   z7SQLiteDecimalToFloatMixin.as_sqlite.<locals>.<listcomp>)ÚcopyÚset_source_expressionsÚget_source_expressionsr/   )r!   r0   r1   r2   rG   r'   r'   r(   Ú	as_sqliteg   s
    z#SQLiteDecimalToFloatMixin.as_sqliteN)r)   r=   r>   Ú__doc__rJ   r'   r'   r'   r(   rC   b   s   rC   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   r<   r#   ÚgetrM   ÚNUMERIC_TYPESrG   rH   rI   r/   )r!   r0   r1   r2   rM   Úcloner'   r'   r(   Ú	as_oraclet   s    zOracleToleranceMixin.as_oracleN)r)   r=   r>   rM   rQ   r'   r'   r'   r(   rL   q   s   rL   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 )N)r   r+   )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_geodeticr+   Úgeodeticr	   r   r/   )r!   r0   r1   r2   )r&   r'   r(   r/   †   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)r+   rT   r/   )r!   r0   r1   r2   r'   r'   r(   rJ   ‹   s    zArea.as_sqlite)	r)   r=   r>   Úarityr   r   r/   rJ   r@   r'   r'   )r&   r(   rR      s   rR   c               @   s   e Zd Zeƒ ZdZdZdS )ÚAzimuthé   )r   r   N)r)   r=   r>   r   r   rW   r   r'   r'   r'   r(   rX   ’   s   rX   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   rY   )Úappendr<   Úintr   r   )r!   Ú
expressionZbboxZcrsr\   r#   r"   Úoptions)r&   r'   r(   r   ›   s    
zAsGeoJSON.__init__c                s8   |   ¡ }|  ¡ }| |d d… ¡ tt|ƒj||f|ŽS )Nr   )rI   rG   rH   r   rZ   r/   )r!   r0   r1   r2   r   rP   )r&   r'   r(   rQ   ª   s    zAsGeoJSON.as_oracle)FFr[   )r)   r=   r>   r   r   r   rQ   r@   r'   r'   )r&   r(   rZ   ˜   s   rZ   c                   s4   e Zd ZdZeƒ Zd‡ fdd„	Z‡ fdd„Z‡  ZS )	ÚAsGML)r   rY   r[   c                s6   ||g}|d k	r$|  |  |dt¡¡ tƒ j||Ž d S )Nr\   )r^   r<   r_   r   r   )r!   r`   Úversionr\   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   r]   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr,   )rI   rG   rH   r   r   rb   r/   )r!   r0   r1   r2   r   rc   rP   )r&   r'   r(   rQ   »   s    zAsGML.as_oracle)rY   r[   )	r)   r=   r>   r   r   r   r   rQ   r@   r'   r'   )r&   r(   rb   ±   s   rb   c                   s$   e Zd Zeƒ Zd‡ fdd„	Z‡  ZS )ÚAsKMLr[   c                s4   |g}|d k	r"|  |  |dt¡¡ tƒ j||Ž d S )Nr\   )r^   r<   r_   r   r   )r!   r`   r\   r#   r"   )r&   r'   r(   r   Ç   s    zAsKML.__init__)r[   )r)   r=   r>   r   r   r   r@   r'   r'   )r&   r(   rd   Ä   s   rd   c                   s$   e Zd Zeƒ Zd‡ fdd„	Z‡  ZS )ÚAsSVGFr[   c                s<   t |dƒr|nt|ƒ}|||  |dt¡g}tƒ j||Ž d S )Nr3   r\   )r:   r_   r<   r   r   )r!   r`   Zrelativer\   r#   r"   )r&   r'   r(   r   Ñ   s
    zAsSVG.__init__)Fr[   )r)   r=   r>   r   r   r   r@   r'   r'   )r&   r(   re   Î   s   re   c               @   s   e Zd Zeƒ ZdZdS )ÚAsWKBr   N)r)   r=   r>   r
   r   rW   r'   r'   r'   r(   rf   Û   s   rf   c               @   s   e Zd Zeƒ ZdZdS )ÚAsWKTr   N)r)   r=   r>   r   r   rW   r'   r'   r'   r(   rg   à   s   rg   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 )N)r   r   )r!   r`   Znum_segr#   )r&   r'   r(   r   æ   s    zBoundingCircle.__init__c                s2   |   ¡ }| |  ¡ d g¡ tt|ƒj||f|ŽS )Nr   )rG   rH   rI   r   rh   rQ   )r!   r0   r1   r2   rP   )r&   r'   r(   rQ   é   s    zBoundingCircle.as_oracle)ri   )r)   r=   r>   r   rQ   r@   r'   r'   )r&   r(   rh   å   s   rh   c               @   s   e Zd ZdZdS )ÚCentroidr   N)r)   r=   r>   rW   r'   r'   r'   r(   rj   ï   s   rj   c               @   s   e Zd ZdZdZdS )Ú
DifferencerY   )r   r   N)r)   r=   r>   rW   r   r'   r'   r'   r(   rk   ó   s   rk   c               @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚDistanceResultMixinc             C   s
   t | jƒS )N)r   r+   )r!   r'   r'   r(   r   ù   s    z DistanceResultMixin.output_fieldc             C   s   | j jo| j jdkS )Niæ  )r+   Ú	geographyr   )r!   r'   r'   r(   Úsource_is_geographyý   s    z'DistanceResultMixin.source_is_geographyN)r)   r=   r>   r   r   rn   r'   r'   r'   r(   rl   ø   s   rl   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 )
ÚDistance)r   r   Nc                s2   ||g}|d k	r |   |dt¡| _tƒ j||Ž d S )NrV   )r<   ÚboolrV   r   r   )r!   Úexpr1Úexpr2rV   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   rm   ZDistanceSpheroidZDistanceSpherer,   )rG   r   rn   r   rm   r   r   r   r   r   r+   rT   rV   r-   r.   r^   r   ro   r/   )r!   r0   r1   r2   rP   r,   rr   rm   )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)rU   rV   )r+   rT   r_   rp   rV   r   r/   )r!   r0   r1   r2   )r&   r'   r(   rJ   $  s    zDistance.as_sqlite)N)	r)   r=   r>   r   rV   r   rs   rJ   r@   r'   r'   )r&   r(   ro     s
   ro   c               @   s   e Zd ZdZdS )ÚEnveloper   N)r)   r=   r>   rW   r'   r'   r'   r(   rt   ,  s   rt   c               @   s   e Zd ZdZdS )ÚForcePolygonCWr   N)r)   r=   r>   rW   r'   r'   r'   r(   ru   0  s   ru   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 )Nr\   )r^   r<   r_   r   r   )r!   r`   r\   r#   r"   )r&   r'   r(   r   7  s    zGeoHash.__init__c             K   s6   |   ¡ }t|jƒdk r&|j tdƒ¡ |j||f|ŽS )NrY   éd   )rG   Úlenr   r^   r   r/   )r!   r0   r1   r2   rP   r'   r'   r(   Úas_mysql=  s    zGeoHash.as_mysql)N)r)   r=   r>   r   r   r   ry   r@   r'   r'   )r&   r(   rv   4  s   rv   c               @   s"   e Zd Zeƒ ZdZdZdZdZdS )ÚGeometryDistancerY   r9   z <-> )r   r   N)	r)   r=   r>   r   r   rW   r,   Z
arg_joinerr   r'   r'   r'   r(   rz   E  s
   rz   c               @   s   e Zd ZdZdZdS )ÚIntersectionrY   )r   r   N)r)   r=   r>   rW   r   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   rQ   )r!   r0   r1   r2   ZsqlÚparams)r&   r'   r(   rQ   W  s    zIsValid.as_oracle)r)   r=   r>   Úlookup_namer   r   rQ   r@   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 )N)rV   r   r   )r!   rq   rV   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)r+   rT   rS   Zsupports_length_geodeticr	   r   r/   )r!   r0   r1   r2   )r&   r'   r(   r/   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 )N)Údim)rE   Úfr'   r'   r(   ú	<genexpr>p  s    z'Length.as_postgresql.<locals>.<genexpr>rY   r,   )rG   rn   r   r^   r   rV   r+   rT   r-   r.   Úminr4   Zlength3dr   r   r/   )r!   r0   r1   r2   rP   r,   r€   )r&   r'   r(   rs   f  s    zLength.as_postgresqlc                s8   d }| j  |¡r| jrdnd}tƒ j||fd|i|—ŽS )NZGeodesicLengthZGreatCircleLengthr,   )r+   rT   rV   r   r/   )r!   r0   r1   r2   r,   )r&   r'   r(   rJ   u  s    zLength.as_sqlite)T)r)   r=   r>   r   r/   rs   rJ   r@   r'   r'   )r&   r(   r   \  s   r   c               @   s   e Zd Zeƒ ZdZdZdS )ÚLineLocatePointrY   )r   r   N)r)   r=   r>   r   r   rW   r   r'   r'   r'   r(   r„   |  s   r„   c               @   s   e Zd ZdS )Ú	MakeValidN)r)   r=   r>   r'   r'   r'   r(   r…   ‚  s   r…   c               @   s   e Zd Zeƒ ZdZdS )ÚMemSizer   N)r)   r=   r>   r   r   rW   r'   r'   r'   r(   r†   †  s   r†   c               @   s   e Zd Zeƒ ZdZdS )ÚNumGeometriesr   N)r)   r=   r>   r   r   rW   r'   r'   r'   r(   r‡   ‹  s   r‡   c               @   s   e Zd Zeƒ ZdZdS )Ú	NumPointsr   N)r)   r=   r>   r   r   rW   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 )N)r€   )rE   r�   r'   r'   r(   r‚   œ  s    z*Perimeter.as_postgresql.<locals>.<genexpr>rY   r,   )
r+   rT   rn   r	   rƒ   r4   r-   Zperimeter3dr   r/   )r!   r0   r1   r2   r,   r€   )r&   r'   r(   rs   ˜  s    zPerimeter.as_postgresqlc                s&   | j  |¡rtdƒ‚tƒ j||f|ŽS )Nz+Perimeter cannot use a non-projected field.)r+   rT   r	   r   r/   )r!   r0   r1   r2   )r&   r'   r(   rJ   ¡  s    zPerimeter.as_sqlite)r)   r=   r>   rW   rs   rJ   r@   r'   r'   )r&   r(   r‰   •  s   	r‰   c               @   s   e Zd ZdZdS )ÚPointOnSurfacer   N)r)   r=   r>   rW   r'   r'   r'   r(   rŠ   §  s   rŠ   c               @   s   e Zd ZdZdS )ÚReverser   N)r)   r=   r>   rW   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Úyg        Úz)r<   rO   r^   r   r   )r!   r`   rŽ   r�   r�   r#   r"   )r&   r'   r(   r   °  s    zScale.__init__)r�   )r)   r=   r>   r   r@   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   rY   c                s   g | ]}ˆ   |d t¡‘qS )r9   )r<   rO   )rE   Úarg)r!   r'   r(   rF   Á  s    z'SnapToGrid.__init__.<locals>.<listcomp>é   c             3   s   | ]}ˆ   |d t¡V  qdS )r9   N)r<   rO   )rE   r’   )r!   r'   r(   r‚   Æ  s    z&SnapToGrid.__init__.<locals>.<genexpr>rY   c             3   s   | ]}ˆ   |d t¡V  qdS )r9   N)r<   rO   )rE   r’   )r!   r'   r(   r‚   Ç  s    r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)rx   Úextendr    r   r   )r!   r`   r6   r#   Únargsr"   )r&   )r!   r(   r   ¼  s     zSnapToGrid.__init__)r)   r=   r>   r   r@   r'   r'   )r&   r(   r‘   »  s   r‘   c               @   s   e Zd ZdZdZdS )ÚSymDifferencerY   )r   r   N)r)   r=   r>   rW   r   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   )r<   r_   r   r   r   )r!   r`   r   r#   r"   )r&   r'   r(   r   Ô  s
    zTransform.__init__)r)   r=   r>   r   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   )rG   rx   r   r^   r   r   r—   rJ   )r!   r0   r1   r2   rP   )r&   r'   r(   rJ   ß  s    zTranslate.as_sqlite)r)   r=   r>   rJ   r@   r'   r'   )r&   r(   r—   Þ  s   r—   c               @   s   e Zd ZdZdZdS )ÚUnionrY   )r   r   N)r)   r=   r>   rW   r   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   r_   rD   rO   r   rA   rB   rC   rL   rR   rX   rZ   rb   rd   re   rf   rg   rh   rj   rk   rl   ro   rt   ru   rv   rz   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

	+	 	