
TQc           @   s\  d  d l  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 d  d l m Z d e f d     YZ d e f d     YZ d e f d     YZ d e f d     YZ d e f d     YZ e e e f e j Z d   Z d e e f d     YZ d S(   iN(   t   Decimal(   t   BaseSpatialOperations(   t   SpatialOperationt   SpatialFunction(   t   SpatiaLiteAdapter(   t   Geometry(   t   Distance(   t   ImproperlyConfigured(   t   DatabaseOperations(   t   DatabaseError(   t   sixt   SpatiaLiteOperatorc           B   s   e  Z d  Z d   Z RS(   s*   For SpatiaLite operators (e.g. `&&`, `~`).c         C   s   t  t |   j d |  d  S(   Nt   operator(   t   superR   t   __init__(   t   selfR   (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyR      s    (   t   __name__t
   __module__t   __doc__R   (    (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyR      s   t   SpatiaLiteFunctionc           B   s   e  Z d  Z d   Z RS(   s   For SpatiaLite function calls.c         K   s   t  t |   j | |  d  S(   N(   R   R   R   (   R   t   functiont   kwargs(    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyR      s    (   R   R   R   R   (    (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyR      s   t   SpatiaLiteFunctionParamc           B   s   e  Z d  Z d Z RS(   s5   For SpatiaLite functions that take another parameter.s,   %(function)s(%(geo_col)s, %(geometry)s, %%s)(   R   R   R   t   sql_template(    (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyR      s   t   SpatiaLiteDistancec           B   s#   e  Z d  Z d Z d Z d   Z RS(   s#   For SpatiaLite distance operations.R   s8   %(function)s(%(geo_col)s, %(geometry)s) %(operator)s %%sc         C   s#   t  t |   j |  j d | d  S(   NR   (   R   R   R   t	   dist_func(   R   R   (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyR   !   s    (   R   R   R   R   R   R   (    (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyR      s   t   SpatiaLiteRelatec           B   s&   e  Z d  Z e j d  Z d   Z RS(   s/   For SpatiaLite Relate(<geom>, <pattern>) calls.s   ^[012TF\*]{9}$c         C   s?   |  j  j |  s% t d |   n  t t |   j d  d  S(   Ns)   Invalid intersection matrix pattern "%s".t   Relate(   t   pattern_regext   matcht
   ValueErrorR   R   R   (   R   t   pattern(    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyR   (   s    (   R   R   R   t   ret   compileR   R   (    (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyR   %   s   c         C   s   t  |   f S(   sZ   Returns operations for regular distances; spherical distances are not currently supported.(   R   (   R   (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   get_dist_ops/   s    t   SpatiaLiteOperationsc           B   s  e  Z d  Z d Z e Z e j d  Z e	 g  dI D] Z
 e
 dJ f ^ q1  Z e Z e Z d Z d Z d Z d Z d	 Z d
 Z d Z d Z d Z d Z d Z d Z d Z d Z d Z d Z d Z  d Z! d Z" d Z# d Z$ i e% d  d 6e% d  d 6e% d  d 6e% d  d  6e% d!  d" 6e% d#  d$ 6e% d%  d& 6e% d'  d( 6e& e' j( f d) 6e% d  d* 6e% d+  d, 6e% d-  d. 6e% d  d/ 6e% d  d0 6Z) i e* d1  e+ f d2 6e* d3  e+ f d4 6e* d5  e+ f d6 6e* d7  e+ f d8 6Z, e) j- e,  d9   Z. d:   Z/ d;   Z0 d<   Z1 d=   Z2 d>   Z3 d?   Z4 d@   Z5 dA   Z6 dB   Z7 dC   Z8 dD   Z9 dE   Z: dF   Z; dG   Z< dH   Z= RS(K   s)   django.contrib.gis.db.models.sql.compilert
   spatialites/   ^(?P<major>\d)\.(?P<minor1>\d)\.(?P<minor2>\d+)t   Extentt   Uniont   Areat   Centroidt	   MbrWithint
   DifferenceR   t   Envelopet   Intersectiont   GLengtht   NumGeometriest	   NumPointst   PointOnSurfacet   ScaleCoordst   AsSVGt   SymDifferencet	   Transformt   ShiftCoordst   GUniont   GeomFromTextt   GeomFromWKBs
   AsText(%s)t   Equalst   equalst   Disjointt   disjointt   Touchest   touchest   Crossest   crossest   Withint   withint   Overlapst   overlapst   Containst   containst
   Intersectst
   intersectst   relatet	   containedt   MbrContainst
   bbcontainst   MbrOverlapst
   bboverlapst   same_ast   exactt   >t   distance_gts   >=t   distance_gtet   <t   distance_lts   <=t   distance_ltec         C   s^   t  t |   j |  d g } | |  j j   7} t g  | D] } | d  f ^ q<  |  _ d  S(   Nt   isnull(   R   R   R   t   geometry_functionst   keyst   dictt   Nonet	   gis_terms(   R   t
   connectionR\   t   term(    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyR   q   s    	c         C   s   y> |  j    } | d } | d k  r4 t d   n  | |  _ WnF t k
 rT   n3 t k
 r } t d |  j j d | f   n X| d k r y# |  j d	  d
 |  _ d |  _ Wq t	 k
 r q Xn  | d k r d |  _
 n  d  S(   Ni   i   i   i    s;   GeoDjango only supports SpatiaLite versions 2.3.0 and aboves   Cannot determine the SpatiaLite version for the "%s" database (error was "%s").  Was the SpatiaLite initialization SQL loaded on this database?t   NAMEi   s!   AsGML(GeomFromText('POINT(1 1)'))t   AsGMLt   AsKMLt	   AsGeoJSON(   i   i   i    (   i   i   i    (   i   i    i    (   t   spatialite_version_tupleR   t   spatial_versiont	   ExceptionR]   t   settings_dictt   _get_spatialite_funct   gmlt   kmlR	   t   geojson(   R   t   vtupt   versiont   msg(    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt#   confirm_spatial_components_versionsy   s(    
	c         C   s   | j  j } | |  j k S(   sx   
        Checks if the given aggregate name is supported (that is, if it's
        in `self.valid_aggregates`).
        (   t	   __class__R   t   valid_aggregates(   R   t	   aggregatet   agg_name(    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   check_aggregate_support   s    c         C   s   | r t  | | j  Sd Sd S(   sM   
        Converts geometry WKT returned from a SpatiaLite aggregate.
        N(   R   t   sridR[   (   R   t   wktt	   geo_field(    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   convert_geom   s    c         C   s   d S(   s   
        Returns None because geometry columnas are added via the
        `AddGeometryColumn` stored procedure on SpatiaLite.
        N(   R[   (   R   t   f(    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   geo_db_type   s    c         C   sx   | s
 g  S| d } t  | t  rk | j |  j  rD t d   qq t | t j | j |  j    } n | } | g S(   s  
        Returns the distance parameters for the given geometry field,
        lookup value, and lookup type.  SpatiaLite only supports regular
        cartesian-based queries (no spheroid/sphere calculations for point
        geometries like PostGIS).
        i    s   SpatiaLite does not support distance queries on geometry fields with a geodetic coordinate system. Distance objects; use a numeric value of your distance in degrees instead.(   t
   isinstanceR   t   geodeticR]   R   t   getattrt   unit_attnamet
   units_name(   R   Rx   t   valuet   lookup_typet
   dist_param(    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   get_distance   s    
'c         C   s   d   } t  | d  rZ | | | j  rC d |  j | j f } n d } | |  j |  S| | | j  r d |  j |  j | j | j f Sd |  j | j f Sd S(   s   
        Provides a proper substitution value for Geometries that are not in the
        SRID of the field.  Specifically, this routine will substitute in the
        Transform() and GeomFromText() function call(s).
        c         S   s   |  d  k p |  j | k S(   N(   R[   Rt   (   R   Rt   (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   transform_value   s    t
   expressions   %s(%%s, %s)s   %ss   %s(%s(%%s,%s), %s)s
   %s(%%s,%s)N(   t   hasattrRt   t	   transformt   get_expression_columnt	   from_text(   R   Rx   R   R   t   placeholder(    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   get_geom_placeholder   s    	 c         C   sW   |  j  j   } z2 y! | j d |  | j   } Wn
   n XWd | j   X| d S(   se   
        Helper routine for calling SpatiaLite functions and returning
        their result.
        s	   SELECT %sNi    (   R]   t   _cursort   executet   fetchonet   close(   R   t   funct   cursort   row(    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyRg      s    c         C   s   |  j  d  S(   s;   Returns the version of GEOS used by SpatiaLite as a string.s   geos_version()(   Rg   (   R   (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   geos_version   s    c         C   s   |  j  d  S(   s=   Returns the version of the PROJ.4 library used by SpatiaLite.s   proj4_version()(   Rg   (   R   (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   proj4_version   s    c         C   s   |  j  d  S(   s3   Returns the SpatiaLite library version as a string.s   spatialite_version()(   Rg   (   R   (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   spatialite_version   s    c         C   s   y |  j    } Wne t k
 rw d } y( |  j d  } | d k rM d } n  Wn t k
 ra n X| d k rx   qx n X|  j j |  } | r t | j d   } t | j d   } t | j d   } n t d |   | | | | f S(	   sm   
        Returns the SpatiaLite version as a tuple (version string, major,
        minor, subminor).
        s   X(GeomFromText('POINT(1 1)'))g      ?s   2.3.0t   majort   minor1t   minor2s-   Could not parse SpatiaLite version string: %sN(	   R   R	   R[   Rg   t   version_regexR   t   intt   groupRe   (   R   Rl   t   tmpt   mR   R   R   (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyRc      s&      
c         C   sy   | j  j } |  j |  s. t d |   n  | j   } | d k rS | d 7} n  |  j d } t |  |  } | | f S(   ss   
        Returns the spatial aggregate SQL template and function for the
        given Aggregate instance.
        s8   %s spatial aggregate is not implmented for this backend.t   uniont   aggs   %(function)s(%(field)s)(   Ro   R   Rs   t   NotImplementedErrort   lowert   selectR|   (   R   R   Rr   R   t   sql_function(    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   spatial_aggregate_sql  s     c         C   s  | \ } } } d | |  | |  f }	 | |  j  k rU|  j  | }
 t |
 t  r-|
 \ } } t | t t f  s t d |   n  | d } t |  d k r t d |   n  t | d |  s t d | t | d  f   n  | d k r| | d  } q9| |  j k r9| d } q9n |
 } | } | j |	 |  j	 | |   S| d	 k r|d
 |	 | rtd pwd f St
 d t |    d S(   s   
        Returns the SpatiaLite-specific SQL for the given lookup value
        [a tuple of (alias, column, db_type)], lookup type, lookup
        value, the model field, and the quoting function.
        s   %s.%ss$   Tuple required for `%s` lookup type.i    i   s:   Incorrect number of parameters given for `%s` lookup type.i   s+   Argument type should be %s, got %s instead.RI   RW   s   %s IS %sNULLs   NOT t    s   Got invalid lookup_type: %sN(   RX   Rz   t   tuplet   listR   t   lent   typet   distance_functionst   as_sqlR   t	   TypeErrort   repr(   R   t   lvalueR   R   t   fieldt   qnt   aliast   colt   db_typet   geo_colR   t   opt   arg_typet   geom(    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   spatial_lookup_sql(  s.    
#c         C   s   d d l  m } | S(   Ni(   t   GeometryColumns(   t0   django.contrib.gis.db.backends.spatialite.modelsR   (   R   R   (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   geometry_columns`  s    c         C   s   d d l  m } | S(   Ni(   t   SpatialRefSys(   R   R   (   R   R   (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   spatial_ref_sysd  s    (   R%   R&   N(>   R   R   t   compiler_modulet   namet   TrueR$   R    R!   R   RZ   t   kR[   Rp   R   t   Adaptert   Adaptort   areat   centroidRJ   t
   differencet   distancet   envelopet   intersectiont   lengtht   num_geomt
   num_pointst   point_on_surfacet   scalet   svgt   sym_differenceR   t	   translateR   t   unionaggR   t   from_wkbR   R   R   R
   t   string_typesRX   R"   t   dtypesR   t   updateR   Rn   Rs   Rw   Ry   R   R   Rg   R   R   R   Rc   R   R   R   R   (    (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyR#   3   s   %													 		8	(    R    t   decimalR    t#   django.contrib.gis.db.backends.baseR   t#   django.contrib.gis.db.backends.utilR   R   t1   django.contrib.gis.db.backends.spatialite.adapterR   t#   django.contrib.gis.geometry.backendR   t   django.contrib.gis.measureR   t   django.core.exceptionsR   t   django.db.backends.sqlite3.baseR   t   django.db.utilsR	   t   django.utilsR
   R   R   R   R   R   t   floatt   integer_typesR   R"   R#   (    (    (    sM   ../Django//lib/python/django/contrib/gis/db/backends/spatialite/operations.pyt   <module>   s$   			