
v^m                 @   s   d  Z  d d l m Z d d l m Z d d l m Z d d l 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 d d l m Z d d l m Z Gd d   d e  Z Gd d   d e e  Z d S)z\
SQL functions reference lists:
https://www.gaia-gis.it/gaia-sins/spatialite-sql-4.3.0.html
    )BaseSpatialOperations)SpatiaLiteAdapter)SpatialOperator)
aggregates)GEOSGeometryGEOSGeometryBase)wkb_r)Distance)ImproperlyConfigured)DatabaseOperations)cached_property)get_version_tuplec                   s"   e  Z d  Z   f d d   Z   S)SpatialiteNullCheckOperatorc                s/   t    j | | | |  \ } } d | | f S)Nz%s > 0)superas_sql)self
connectionlookupZtemplate_paramsZ
sql_paramsZsqlparams)	__class__ V/tmp/pip-build-8lau8j11/django/django/contrib/gis/db/backends/spatialite/operations.pyr      s    !z"SpatialiteNullCheckOperator.as_sql)__name__
__module____qualname__r   r   r   )r   r   r      s   r   c            $   @   sM  e  Z d  Z d Z d Z e Z d Z d Z d Z	 d Z
 d Z d e d	 d
  d e d	 d  d e d	 d  d e d	 d  d e d	 d  d e d	 d  d e d	 d  d e d	 d  d e d	 d  d e d	 d  d e d	 d  d e d	 d   d! e d	 d"  d# e d	 d$  d% e d	 d
  d& e d	 d
  d' e d	 d(  i Z e j f Z d) Z d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 i Z e d: d;    Z e d< d=    Z d> d?   Z d@ dA   Z dB dC   Z dD dE   Z dF dG   Z dH dI   Z dJ dK   Z dL dM   Z dN dO   Z dP dQ   Z  dR dS   Z! dT dU   Z" dV dW   Z# dX S)YSpatiaLiteOperations
spatialiteTZCollectZExtentZMakeLineZGUnionZGeomFromTextequalsfuncZEqualsZdisjointZDisjointZtouchesZTouchesZcrossesZCrossesZwithinZWithinoverlapsZOverlapscontainsZContainsZ
intersectsZ
IntersectsZrelateZRelateZ	coveredbyZ	CoveredByZcoversZCoversZ	containedZ	MbrWithinZ
bbcontainsZMbrContainsZ
bboverlapsZMbrOverlapsZsame_asexactdwithinZPtDistWithinzCAST (AsEWKB(%s) AS BLOB)ZForcePolygonCWZST_ForceLHRZLengthZ	ST_LengthZLineLocatePointZST_Line_Locate_PointZ	NumPointsZ
ST_NPointsZReverseZ
ST_ReverseZScaleZScaleCoordsZ	TranslateZST_TranslateUnionZST_Unionc             C   s5   d d d h } |  j    s1 | d d d d h O} | S)NZBoundingCircleZGeometryDistanceZMemSizeZAzimuthZGeoHashZIsValidZ	MakeValid)lwgeom_version)r   Zunsupportedr   r   r   unsupported_functionsP   s    z*SpatiaLiteOperations.unsupported_functionsc             C   s~   y |  j    d d  } WnE t k
 ra } z% t d |  j j d f  |  WYd d } ~ Xn X| d	 k  rz t d   | S)
z0Determine the version of the SpatiaLite library.   Nz}Cannot determine the SpatiaLite version for the "%s" database. Was the SpatiaLite initialization SQL loaded on this database?NAME      r   z.GeoDjango supports SpatiaLite 4.3.0 and above.)r(   r)   r   )spatialite_version_tuple	Exceptionr
   r   Zsettings_dict)r   versionexcr   r   r   spatial_versionW   s    z$SpatiaLiteOperations.spatial_versionc             C   sc   | d k r d St  |  j } | d d d  \ } } | d d d  \ } } | | | | f S)zV
        Convert the polygon data received from SpatiaLite to min/max values.
        Nr      )r   shell)r   Zboxr0   ZxminZyminZxmaxZymaxr   r   r   convert_extentg   s    z#SpatiaLiteOperations.convert_extentc             C   s   d S)z
        Return None because geometry columns are added via the
        `AddGeometryColumn` stored procedure on SpatiaLite.
        Nr   )r   fr   r   r   geo_db_typer   s    z SpatiaLiteOperations.geo_db_typec             C   s   | s
 g  S| d } t  | t  r | j |  j  rY | d k rM t d   | j } q t | t j | j |  j    } n | } | g S)zu
        Return the distance parameters for the given geometry field,
        lookup value, and lookup type.
        r   r"   zNOnly numeric values of degree units are allowed on geographic DWithin queries.)	
isinstancer	   Zgeodeticr   
ValueErrormgetattrZunit_attnameZ
units_name)r   r2   valueZlookup_typeZ
dist_paramr   r   r   get_distancey   s    
	'z!SpatiaLiteOperations.get_distancec          
   C   sF   |  j  j   } z! | j d |  | j   } Wd | j   X| d S)z
        Helper routine for calling SpatiaLite functions and returning
        their result.
        Any error occurring in this method should be handled by the caller.
        z	SELECT %sNr   )r   Z_cursorexecuteZfetchoneclose)r   r   cursorrowr   r   r   _get_spatialite_func   s    z)SpatiaLiteOperations._get_spatialite_funcc             C   s   |  j  d  S)z:Return the version of GEOS used by SpatiaLite as a string.zgeos_version())r>   )r   r   r   r   geos_version   s    z!SpatiaLiteOperations.geos_versionc             C   s   |  j  d  S)z<Return the version of the PROJ.4 library used by SpatiaLite.zproj4_version())r>   )r   r   r   r   proj4_version   s    z"SpatiaLiteOperations.proj4_versionc             C   s   |  j  d  S)z8Return the version of LWGEOM library used by SpatiaLite.zlwgeom_version())r>   )r   r   r   r   r$      s    z#SpatiaLiteOperations.lwgeom_versionc             C   s   |  j  d  S)z2Return the SpatiaLite library version as a string.zspatialite_version())r>   )r   r   r   r   spatialite_version   s    z'SpatiaLiteOperations.spatialite_versionc             C   s   |  j    } | f t |  S)zl
        Return the SpatiaLite version as a tuple (version string, major,
        minor, subminor).
        )rA   r   )r   r,   r   r   r   r*      s    z-SpatiaLiteOperations.spatialite_version_tuplec             C   s1   | j    d k r d n	 | j    } t |  |  S)zr
        Return the spatial aggregate SQL template and function for the
        given Aggregate instance.
        unionunionagg)lowerr7   )r   Zagg_namer   r   r   spatial_aggregate_name   s    $z+SpatiaLiteOperations.spatial_aggregate_namec             C   s   d d l  m } | S)Nr   )SpatialiteGeometryColumns)0django.contrib.gis.db.backends.spatialite.modelsrF   )r   rF   r   r   r   geometry_columns   s    z%SpatiaLiteOperations.geometry_columnsc             C   s   d d l  m } | S)Nr   )SpatialiteSpatialRefSys)rG   rI   )r   rI   r   r   r   spatial_ref_sys   s    z$SpatiaLiteOperations.spatial_ref_sysc                s1   | j  j   t   j     f d d   } | S)Nc                s#   |  d  k r d  St   |      S)N)r   )r8   
expressionr   )
geom_classreadr   r   	converter   s    z>SpatiaLiteOperations.get_geometry_converter.<locals>.converter)Zoutput_fieldrL   r   rM   )r   rK   rN   r   )rL   rM   r   get_geometry_converter   s    z+SpatiaLiteOperations.get_geometry_converterN)$r   r   r   namer   r   ZAdapterZcollectZextentZmakelinerC   Z	from_textr   r   Zgis_operatorsr   ZExtent3DZdisallowed_aggregatesselectZfunction_namesr   r%   r.   r1   r3   r9   r>   r?   r@   r$   rA   r*   rE   rH   rJ   rO   r   r   r   r   r      sd   	r   N)__doc__Z.django.contrib.gis.db.backends.base.operationsr   Z1django.contrib.gis.db.backends.spatialite.adapterr   Z$django.contrib.gis.db.backends.utilsr   Zdjango.contrib.gis.db.modelsr   Z django.contrib.gis.geos.geometryr   r   Z%django.contrib.gis.geos.prototypes.ior   Zdjango.contrib.gis.measurer	   Zdjango.core.exceptionsr
   Z%django.db.backends.sqlite3.operationsr   Zdjango.utils.functionalr   Zdjango.utils.versionr   r   r   r   r   r   r   <module>   s   