
v^BB                 @   sA  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 m Z m Z 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 e e e f Z Gd d   d  Z Gd d   d e e  Z Gd d   d e  Z  Gd d   d  Z! Gd d   d  Z" Gd d   d e" e  Z# Gd d   d e  Z$ Gd d   d e  Z% Gd d   d e  Z& Gd d   d e&  Z' Gd d    d  e  Z( Gd! d"   d" e" e  Z) Gd# d$   d$ e" e   Z* Gd% d&   d& e" e   Z+ Gd' d(   d(  Z, Gd) d*   d* e, e" e  Z- Gd+ d,   d, e   Z. Gd- d.   d. e   Z/ Gd/ d0   d0 e  Z0 Gd1 d2   d2 e  Z1 Gd3 d4   d4 e" e   Z2 e j3 Gd5 d6   d6 e" e e   Z4 Gd7 d8   d8 e, e" e  Z5 Gd9 d:   d: e  Z6 Gd; d<   d< e  Z7 Gd= d>   d> e  Z8 Gd? d@   d@ e  Z9 GdA dB   dB e  Z: GdC dD   dD e, e" e  Z; GdE dF   dF e" e   Z< GdG dH   dH e  Z= GdI dJ   dJ e! e   Z> GdK dL   dL e! e   Z? GdM dN   dN e" e   Z@ GdO dP   dP e   Z GdQ dR   dR e>  ZA GdS dT   dT e" e   ZB dU S)V    )Decimal)BaseSpatialFieldGeometryField)	AreaFieldDistanceField)GEOSGeometry)
FieldError)BooleanField
FloatFieldIntegerField	TextField	Transform)FuncValue)Cast)NotSupportedError)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 d  Z   S)GeoFuncMixinNr   c                s  t    j | |   x |  j D] } |  j | } t | t  sB q y | j } Wn t k
 ri d  } Yn X| j } t | t	  s | r t | t
  r t d |  j | d f   | j r | r t d   | s t | d t
 d | j  |  j | <q Wd  S)Nz9%s function requires a geometric argument in position %d.   z$SRID is required for all geometries.output_fieldsrid)super__init__geom_param_possource_expressions
isinstancer   r   r   valuer   r   	TypeErrornamer   
ValueError)selfexpressionsextraposexprr   Zgeom)	__class__ H/tmp/pip-build-8lau8j11/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                sL   |  j  d  k r0 | d  k r0 | j j |  j  } t   j | | d | | 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 | |   } | j   } xS |  j D]H } | | } t | t  s+ t d |  j | d t |  j	 f   q+ W| j
 j } xb |  j d d   D]M } | j | } | j j }	 |	 | k r t | |  j | |   | j | <q W| 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'   r2   7   s    
'&zGeoFuncMixin.resolve_expression c             C   s?   t  | d  s; | r; t | |  r; t d | | f   | S)Nr2   z2The %s parameter has the wrong type: should be %s.)hasattrr   r   )r    r   Z
param_nameZcheck_typesr&   r&   r'   _handle_paramN   s    zGeoFuncMixin._handle_param)r   )r(   
__module____qualname__r+   r   r   propertyr   r   r*   r.   r2   r:   r&   r&   )r%   r'   r      s   r   c               @   s   e  Z d  Z d S)GeoFuncN)r(   r;   r<   r&   r&   r&   r'   r>   X   s   r>   c               @   s"   e  Z d  Z e d d    Z d S)GeomOutputGeoFuncc             C   s   t  d |  j j  S)Nr   )r   r*   r   )r    r&   r&   r'   r   ]   s    zGeomOutputGeoFunc.output_fieldN)r(   r;   r<   r   r   r&   r&   r&   r'   r?   \   s   r?   c                   s(   e  Z d  Z d Z   f d d   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                s`   xG |  j    D]9 } t | d  r t | j t  r t | j  | _ q Wt   j | | |  S)Nr   )get_source_expressionsr9   r   r   r   floatr   r.   )r    r/   r0   r1   r$   )r%   r&   r'   	as_sqliteg   s    !z#SQLiteDecimalToFloatMixin.as_sqlite)r(   r;   r<   __doc__rC   r&   r&   )r%   r'   r@   b   s   r@   c               @   s"   e  Z d  Z d Z d d   Z d S)OracleToleranceMixing?c             K   sh   t  |  j |  j j d |  j  d t   } |  j   } | j |  j   | f   | j	 | | |  S)N	tolerance)
r   r:   r"   getrF   NUMERIC_TYPEScopyset_source_expressionsrA   r.   )r    r/   r0   r1   rF   cloner&   r&   r'   	as_oracleq   s    	zOracleToleranceMixin.as_oracleN)r(   r;   r<   rF   rL   r&   r&   r&   r'   rE   n   s   rE   c                   sF   e  Z d  Z d Z e d d    Z   f d d   Z d d   Z   S)Arear   c             C   s   t  |  j  S)N)r   r*   )r    r&   r&   r'   r      s    zArea.output_fieldc                sA   | j  j r+ |  j j |  r+ t d   t   j | | |  S)Nz2Area on geodetic coordinate systems not supported.)featuresZsupports_area_geodeticr*   geodeticr   r   r.   )r    r/   r0   r1   )r%   r&   r'   r.      s    zArea.as_sqlc             K   s9   |  j  j |  r& d | d <d | d <|  j | | |  S)Nz+%(function)s(%(expressions)s, %(spheroid)d)templateTspheroid)r*   rO   r.   )r    r/   r0   r1   r&   r&   r'   rC      s    

zArea.as_sqlite)r(   r;   r<   arityr   r   r.   rC   r&   r&   )r%   r'   rM   |   s   rM   c               @   s%   e  Z d  Z e   Z d Z d Z d S)Azimuth   r   r   N)r   r   )r(   r;   r<   r
   r   rR   r   r&   r&   r&   r'   rS      s   	rS   c                   s4   e  Z d  Z e   Z d d d   f d d  Z   S)	AsGeoJSONF   c                s   | g } | d  k	 r1 | j  |  j | d t   d } | rL | rL d } n | r[ d } n | rg d } | rz | j  |  t   j | |   d  S)N	precisionr      r   rT   )appendr:   intr   r   )r    
expressionZbboxZcrsrW   r"   r!   options)r%   r&   r'   r      s    			zAsGeoJSON.__init__)r(   r;   r<   r   r   r   r&   r&   )r%   r'   rU      s   	rU   c                   sI   e  Z d  Z d Z e   Z d d   f d d  Z   f d d   Z   S)	AsGMLr   rT   rV   c                sK   | | g } | d  k	 r4 | j  |  j | d t   t   j | |   d  S)NrW   )rY   r:   rZ   r   r   )r    r[   versionrW   r"   r!   )r%   r&   r'   r      s    zAsGML.__init__c                sq   |  j    } | d } |  j   } | j | d g  | j d k rK d n d | d <t t |  j | | |  S)Nr   r   rX   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr+   )rA   rI   rJ   r   r   r]   r.   )r    r/   r0   r1   r   r^   rK   )r%   r&   r'   rL      s    
zAsGML.as_oracle)r   )r(   r;   r<   r   r   r   r   rL   r&   r&   )r%   r'   r]      s   	r]   c               @   s   e  Z d  Z d d   Z d S)AsKMLc             K   s<   |  j    } | j |  j   d d    | j | | |  S)Nr   )rI   rJ   rA   r.   )r    r/   r0   r1   rK   r&   r&   r'   rC      s    zAsKML.as_sqliteN)r(   r;   r<   rC   r&   r&   r&   r'   r_      s   r_   c                   s1   e  Z d  Z e   Z d d   f d d  Z   S)AsSVGFrV   c                sV   t  | d  r | n	 t |  } | | |  j | d t  g } t   j | |   d  S)Nr2   rW   )r9   rZ   r:   r   r   )r    r[   ZrelativerW   r"   r!   )r%   r&   r'   r      s
    !zAsSVG.__init__)r(   r;   r<   r   r   r   r&   r&   )r%   r'   r`      s   	r`   c                   s7   e  Z d  Z d   f d d  Z   f d d   Z   S)BoundingCircle0   c                s   t    j | | |  d  S)N)r   r   )r    r[   Znum_segr"   )r%   r&   r'   r      s    zBoundingCircle.__init__c                sB   |  j    } | j |  j   d g  t t |  j | | |  S)Nr   )rI   rJ   rA   r   ra   rL   )r    r/   r0   r1   rK   )r%   r&   r'   rL      s    zBoundingCircle.as_oracle)r(   r;   r<   r   rL   r&   r&   )r%   r'   ra      s   ra   c               @   s   e  Z d  Z d Z d S)Centroidr   N)r(   r;   r<   rR   r&   r&   r&   r'   rc      s   rc   c               @   s   e  Z d  Z d Z d Z d S)
DifferencerT   r   r   N)r   r   )r(   r;   r<   rR   r   r&   r&   r&   r'   rd      s   rd   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   rg   r&   r&   r&   r'   re      s   re   c                   sU   e  Z d  Z d
 Z d Z d   f d d  Z   f d d   Z   f d d	   Z   S)Distancer   r   Nc                sG   | | g } | d  k	 r0 |  j  | d t  |  _ t   j | |   d  S)NrQ   )r:   boolrQ   r   r   )r    expr1expr2rQ   r"   r!   )r%   r&   r'   r      s    zDistance.__init__c                s  |  j    } d  } | j d } |  j   } | j j | k r t | t  r[ | | j _ n+ t | t d | j j	 d |   | j d <| r |  j
 j |  r |  j r | j j d  } | j j t |  j
 j |    n | j j d  } t t |  j | | d | | S)Nr   r   rf   ZDistanceSpheroidZDistanceSpherer+   )rI   r   rg   r   rf   r   r   r   r   r   r*   rO   rQ   r,   r-   rY   r   rh   r.   )r    r/   r0   r1   rK   r+   rk   rf   )r%   r&   r'   as_postgresql   s     %	%zDistance.as_postgresqlc                sK   |  j  j |  r5 d | d <t t |  j   | d <t   j | | |  S)Nz8COALESCE(%(function)s(%(expressions)s, %(spheroid)s), 0)rP   rQ   )r*   rO   rZ   ri   rQ   r   r.   )r    r/   r0   r1   )r%   r&   r'   rC     s    
zDistance.as_sqlite)r   r   )r(   r;   r<   r   rQ   r   rl   rC   r&   r&   )r%   r'   rh      s
   rh   c               @   s   e  Z d  Z d Z d S)Enveloper   N)r(   r;   r<   rR   r&   r&   r&   r'   rm     s   rm   c               @   s   e  Z d  Z d Z d S)ForcePolygonCWr   N)r(   r;   r<   rR   r&   r&   r&   r'   rn     s   rn   c                   s:   e  Z d  Z e   Z d   f d d  Z d d   Z   S)GeoHashNc                sH   | g } | d  k	 r1 | j  |  j | d t   t   j | |   d  S)NrW   )rY   r:   rZ   r   r   )r    r[   rW   r"   r!   )r%   r&   r'   r   "  s    	zGeoHash.__init__c             K   sJ   |  j    } t | j  d k  r7 | j j t d   | j | | |  S)NrT   d   )rI   lenr   rY   r   r.   )r    r/   r0   r1   rK   r&   r&   r'   as_mysql(  s    zGeoHash.as_mysql)r(   r;   r<   r   r   r   rr   r&   r&   )r%   r'   ro     s   	ro   c               @   s1   e  Z d  Z e   Z d Z d Z d Z d Z d S)GeometryDistancerT   r8   z <-> r   r   N)r   r   )	r(   r;   r<   r
   r   rR   r+   Z
arg_joinerr   r&   r&   r&   r'   rs   0  s
   	rs   c               @   s   e  Z d  Z d Z d Z d S)IntersectionrT   r   r   N)r   r   )r(   r;   r<   rR   r   r&   r&   r&   r'   rt   8  s   rt   c                   s1   e  Z d  Z d Z e   Z   f d d   Z   S)IsValidZisvalidc                s,   t    j | | |  \ } } d | | f S)Nz%CASE %s WHEN 'TRUE' THEN 1 ELSE 0 END)r   rL   )r    r/   r0   r1   Zsqlparams)r%   r&   r'   rL   B  s    zIsValid.as_oracle)r(   r;   r<   lookup_namer	   r   rL   r&   r&   )r%   r'   ru   =  s   	ru   c                   s[   e  Z d  Z d   f d d  Z   f d d   Z   f d d   Z   f d d	   Z   S)
LengthTc                s    | |  _  t   j | |  d  S)N)rQ   r   r   )r    rj   rQ   r"   )r%   r&   r'   r   H  s    	zLength.__init__c                sA   |  j  j |  r+ | j j r+ t d   t   j | | |  S)Nz6This backend doesn't support Length on geodetic fields)r*   rO   rN   Zsupports_length_geodeticr   r   r.   )r    r/   r0   r1   )r%   r&   r'   r.   L  s    zLength.as_sqlc                s   |  j    } d  } |  j   r: | j j t |  j   n |  j j |  r | j j	 d  } | j j t |  j j |    n7 t
 d d   |  j   D  } | d k r | j j } t t |  j | | d | | S)NZLengthSpheroidc             s   s   |  ] } | r | j  Vq d  S)N)dim).0fr&   r&   r'   	<genexpr>[  s    z'Length.as_postgresql.<locals>.<genexpr>rT   r+   )rI   rg   r   rY   r   rQ   r*   rO   r,   r-   minr3   Zlength3dr   rx   r.   )r    r/   r0   r1   rK   r+   ry   )r%   r&   r'   rl   Q  s    %zLength.as_postgresqlc                sI   d  } |  j  j |  r- |  j r' d n d } t   j | | d | | S)NZGeodesicLengthZGreatCircleLengthr+   )r*   rO   rQ   r   r.   )r    r/   r0   r1   r+   )r%   r&   r'   rC   `  s    zLength.as_sqlite)r(   r;   r<   r   r.   rl   rC   r&   r&   )r%   r'   rx   G  s   rx   c               @   s%   e  Z d  Z e   Z d Z d Z d S)LineLocatePointrT   r   r   N)r   r   )r(   r;   r<   r
   r   rR   r   r&   r&   r&   r'   r~   g  s   	r~   c               @   s   e  Z d  Z d S)	MakeValidN)r(   r;   r<   r&   r&   r&   r'   r   m  s   r   c               @   s   e  Z d  Z e   Z d Z d S)MemSizer   N)r(   r;   r<   r   r   rR   r&   r&   r&   r'   r   q  s   	r   c               @   s   e  Z d  Z e   Z d Z d S)NumGeometriesr   N)r(   r;   r<   r   r   rR   r&   r&   r&   r'   r   v  s   	r   c               @   s   e  Z d  Z e   Z d Z d S)	NumPointsr   N)r(   r;   r<   r   r   rR   r&   r&   r&   r'   r   {  s   	r   c                   s:   e  Z d  Z d Z   f d d   Z   f d d   Z   S)	Perimeterr   c                s   d  } |  j  j |  r1 |  j   r1 t d   t d d   |  j   D  } | d k rh | j j } t   j	 | | d | | S)Nz<ST_Perimeter cannot use a non-projected non-geography field.c             s   s   |  ] } | j  Vq d  S)N)ry   )rz   r{   r&   r&   r'   r|     s    z*Perimeter.as_postgresql.<locals>.<genexpr>rT   r+   )
r*   rO   rg   r   r}   r3   r,   Zperimeter3dr   r.   )r    r/   r0   r1   r+   ry   )r%   r&   r'   rl     s    zPerimeter.as_postgresqlc                s4   |  j  j |  r t d   t   j | | |  S)Nz+Perimeter cannot use a non-projected field.)r*   rO   r   r   r.   )r    r/   r0   r1   )r%   r&   r'   rC     s    zPerimeter.as_sqlite)r(   r;   r<   rR   rl   rC   r&   r&   )r%   r'   r     s   	r   c               @   s   e  Z d  Z d Z d S)PointOnSurfacer   N)r(   r;   r<   rR   r&   r&   r&   r'   r     s   r   c               @   s   e  Z d  Z d Z d S)Reverser   N)r(   r;   r<   rR   r&   r&   r&   r'   r     s   r   c                   s%   e  Z d  Z d   f d d  Z   S)Scaleg        c                sl   | |  j  | d t  |  j  | d t  g } | d k rU | j |  j  | d t   t   j | |   d  S)Nxyg        z)r:   rH   rY   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     s   r   c                   s"   e  Z d  Z   f d d   Z   S)
SnapToGridc                s   t  |  } | g } | d k rD | j   f d d   | D  ne | d k r |   f d d   | d d   D   f d d   | d	 d  D  7} n t d
   t   j | |   d  S)Nr   rT   c                s%   g  |  ] }   j  | d  t   q S)r8   )r:   rH   )rz   arg)r    r&   r'   
<listcomp>  s   	 z'SnapToGrid.__init__.<locals>.<listcomp>   c             3   s$   |  ] }   j  | d  t  Vq d S)r8   N)r:   rH   )rz   r   )r    r&   r'   r|     s    z&SnapToGrid.__init__.<locals>.<genexpr>c             3   s$   |  ] }   j  | d  t  Vq d S)r8   N)r:   rH   )rz   r   )r    r&   r'   r|     s    r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r   rT   )rq   extendr   r   r   )r    r[   r5   r"   nargsr!   )r%   )r    r'   r     s    	 *zSnapToGrid.__init__)r(   r;   r<   r   r&   r&   )r%   r'   r     s   r   c               @   s   e  Z d  Z d Z d Z d S)SymDifferencerT   r   r   N)r   r   )r(   r;   r<   rR   r   r&   r&   r&   r'   r     s   r   c                   s"   e  Z d  Z   f d d   Z   S)r   c                sQ   | |  j  | d t  g } d | k r: t d |  | d <t   j | |   d  S)Nr   r   )r:   rZ   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     s   r   c                   s"   e  Z d  Z   f d d   Z   S)	Translatec                sS   |  j    } t |  j  d k  r7 | j j t d   t t |  j | | |  S)Nr   r   )rI   rq   r   rY   r   r   r   rC   )r    r/   r0   r1   rK   )r%   r&   r'   rC     s    zTranslate.as_sqlite)r(   r;   r<   rC   r&   r&   )r%   r'   r     s   r   c               @   s   e  Z d  Z d Z d Z d S)UnionrT   r   r   N)r   r   )r(   r;   r<   rR   r   r&   r&   r&   r'   r     s   r   N)C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.db.modelsr	   r
   r   r   r   Zdjango.db.models.expressionsr   r   Zdjango.db.models.functionsr   Zdjango.db.utilsr   Zdjango.utils.functionalr   rZ   rB   rH   r   r>   r?   r@   rE   rM   rS   rU   r]   r_   r`   ra   rc   rd   re   rh   rm   rn   ro   rs   rt   Zregister_lookupru   rx   r~   r   r   r   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   <module>   s`   (F
	+	 	