U
    fH                     @   sj  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Z4G d8d9 d9eZ5G d:d; d;e"e Z6ej7G d<d= d=eeZ8ej7G d>d? d?e"eeZ9G d@dA dAe.e"eZ:G dBdC dCeZ;G dDdE dEe Z<G dFdG dGeZ=G dHdI dIeZ>G dJdK dKeZ?G dLdM dMe.e"eZ@G dNdO dOe"e ZAG dPdQ dQeZBG dRdS dSe!e ZCG dTdU dUe!e ZDG dVdW dWe"e ZEG dXdY dYe ZG dZd[ d[eCZFG d\d] d]e"e ZGd^S )_    )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|rt|t
std| j|d f |js|st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-_jot26k8/django/contrib/gis/db/models/functions.pyr      s8    





 
zGeoFuncMixin.__init__c                 C   s   | j jS N)r(   __name__r"   r)   r)   r*   r    9   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   A   s    zGeoFuncMixin.as_sqlc           
         s   t  j||}| js|S | }| 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rrt||j|||j|< qr|S )Nz<%s function requires a GeometryField in position %s, got %s.r   )r   resolve_expressionr   get_source_fieldsr   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   F   s8    

	
  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_paramd   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   n   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   s    zGeomOutputGeoFunc.output_fieldN)r,   rB   rC   r   r   r)   r)   r)   r*   rH   r   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>   s   
z7SQLiteDecimalToFloatMixin.as_sqlite.<locals>.<listcomp>)copyset_source_expressionsget_source_expressionsr4   )r"   r5   r6   r7   rM   r)   r)   r*   	as_sqlite~   s    z#SQLiteDecimalToFloatMixin.as_sqliteN)r,   rB   rC   __doc__rP   r)   r)   r)   r*   rI   x   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_oracle   s    zOracleToleranceMixin.as_oracleN)r,   rB   rC   rS   rW   r)   r)   r)   r*   rR      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 )BoundingCircle0   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_postgresql3  s4    




 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   R  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   `  s   r   c                   @   s   e Zd ZeddZdZdZdS )FromWKBr   r   r   r)   Nr,   rB   rC   r   r   r^   r   r)   r)   r)   r*   r   d  s   
r   c                   @   s   e Zd ZeddZdZdZdS )FromWKTr   r   r   r)   Nr   r)   r)   r)   r*   r   j  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   s  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_mysqly  s    zGeoHash.as_mysql)N)r,   rB   rC   r   r   r   r   rE   r)   r)   r'   r*   r   p  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     s
   r   c                   @   s   e Zd ZdZdZdS )Intersectionr`   ra   Nr|   r)   r)   r)   r*   r     s   r   c                   @   s   e Zd ZdZe ZdS )IsEmptyZisemptyN)r,   rB   rC   lookup_namer   r   r)   r)   r)   r*   r     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     s    zIsValid.as_oracle)r,   rB   rC   r   r   r   rW   rE   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     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>  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     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     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   2  s   r   N)H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   r   r   Zregister_lookupr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r)   r)   r)   r*   <module>   sj   (

V
	3	'	