ó
ø¢TQc           @   s3  d  Z  d d l 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 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 e e f d „  ƒ  YZ d S(   sU  
 This module contains the spatial lookup types, and the `get_geo_where_clause`
 routine for Oracle Spatial.

 Please note that WKT support is broken on the XE version, and thus
 this backend will not work on such platforms.  Specifically, XE lacks
 support for an internal JVM, and Java libraries are required to use
 the WKT constructors.
iÿÿÿÿN(   t   Decimal(   t   DatabaseOperations(   t   BaseSpatialOperations(   t   OracleSpatialAdapter(   t   SpatialFunction(   t   Geometry(   t   Distance(   t   sixt   SDOOperationc           B   s   e  Z d  Z d Z d „  Z RS(   s&   Base class for SDO* Oracle operations.sA   %(function)s(%(geo_col)s, %(geometry)s) %(operator)s '%(result)s'c         K   s=   | j  d d ƒ | j  d d ƒ t t |  ƒ j | |  d  S(   Nt   operatort   =t   resultt   TRUE(   t
   setdefaultt   superR   t   __init__(   t   selft   funct   kwargs(    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyR      s    (   t   __name__t
   __module__t   __doc__t   sql_templateR   (    (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyR      s   t   SDODistancec           B   s&   e  Z d  Z d Z d Z d d „ Z RS(   s   Class for Distance queries.sN   %(function)s(%(geo_col)s, %(geometry)s, %(tolerance)s) %(operator)s %(result)ss   SDO_GEOM.SDO_DISTANCEgš™™™™™©?c         C   s/   t  t |  ƒ j |  j d | d | d d ƒd  S(   Nt	   toleranceR	   R   s   %s(   R   R   R   t	   dist_func(   R   t   opR   (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyR   #   s    (   R   R   R   R   R   R   (    (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyR      s   t
   SDODWithinc           B   s   e  Z d  Z d Z d „  Z RS(   t   SDO_WITHIN_DISTANCEs5   %(function)s(%(geo_col)s, %(geometry)s, %%s) = 'TRUE'c         C   s   t  t |  ƒ j |  j ƒ d  S(   N(   R   R   R   t   dwithin_func(   R   (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyR   +   s    (   R   R   R   R   R   (    (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyR   (   s   t   SDOGeomRelatec           B   s&   e  Z d  Z d Z d Z d d „ Z RS(   s    Class for using SDO_GEOM.RELATE.s   SDO_GEOM.RELATEsZ   %(function)s(%(geo_col)s, '%(mask)s', %(geometry)s, %(tolerance)s) %(operator)s '%(mask)s'gš™™™™™©?c         C   s/   t  t |  ƒ j |  j d d d | d | ƒd  S(   NR	   R
   t   maskR   (   R   R   R   t   relate_func(   R   R   R   (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyR   3   s    (   R   R   R   R    R   R   (    (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyR   .   s   t	   SDORelatec           B   sH   e  Z d  Z d Z e j d e e f e j ƒ Z d Z d Z	 d „  Z
 RS(   s   Class for using SDO_RELATE.sb   TOUCH|OVERLAPBDYDISJOINT|OVERLAPBDYINTERSECT|EQUAL|INSIDE|COVEREDBY|CONTAINS|COVERS|ANYINTERACT|ONs   ^(%s)(\+(%s))*$sA   %(function)s(%(geo_col)s, %(geometry)s, 'mask=%(mask)s') = 'TRUE't
   SDO_RELATEc         C   sQ   |  j  j | ƒ s. t d |  j | f ƒ ‚ n  t t |  ƒ j |  j d | ƒd  S(   Ns   Invalid %s mask: "%s"R   (   t
   mask_regext   matcht
   ValueErrorR    R   R!   R   (   R   R   (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyR   ?   s    (   R   R   R   t   maskst   ret   compilet   IR#   R   R    R   (    (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyR!   9   s   t   OracleOperationsc           B   sp  e  Z d  Z d Z e Z e g  d> D] Z e d? f ^ q" ƒ 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 e Z d Z d Z d Z d Z d Z d Z d Z i e d ƒ e  f d 6e d ƒ e  f d 6e d ƒ e  f d 6e d ƒ e  f d 6e! ƒ  e  f d 6Z" 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# d( ƒ d- 6e% e& j' f d. 6e# d/ ƒ d0 6e# d1 ƒ d2 6Z( e( j) e" ƒ d3 g Z* e* e+ e( ƒ 7Z* e g  e* D] Z, e, d? f ^ qìƒ Z* i d? d. 6Z- d4 „  Z. d5 „  Z/ d6 „  Z0 d7 „  Z1 d8 „  Z2 d9 „  Z3 d: „  Z4 d; „  Z5 d< „  Z6 d= „  Z7 RS(@   s.   django.contrib.gis.db.backends.oracle.compilert   oraclet   Uniont   Extents   SDO_GEOM.SDO_AREAs   SDO_UTIL.TO_GMLGEOMETRYs   SDO_GEOM.SDO_CENTROIDs   SDO_GEOM.SDO_DIFFERENCEs   SDO_GEOM.SDO_DISTANCEt   SDO_AGGR_MBRs   SDO_GEOM.SDO_INTERSECTIONs   SDO_GEOM.SDO_LENGTHs   SDO_UTIL.GETNUMELEMs   SDO_UTIL.GETNUMVERTICESs   SDO_GEOM.SDO_POINTONSURFACEs   SDO_UTIL.REVERSE_LINESTRINGs   SDO_GEOM.SDO_XORs   SDO_CS.TRANSFORMs   SDO_GEOM.SDO_UNIONt   SDO_AGGR_UNIONs   SDO_UTIL.TO_WKTGEOMETRY(%s)t   >t   distance_gts   >=t   distance_gtet   <t   distance_lts   <=t   distance_ltet   dwithint   SDO_CONTAINSt   containst   SDO_COVEREDBYt	   coveredbyt
   SDO_COVERSt   coverst   DISJOINTt   disjointt   SDO_OVERLAPBDYINTERSECTt
   intersectst	   SDO_EQUALt   equalst   exactt   SDO_OVERLAPSt   overlapst   same_ast   relatet	   SDO_TOUCHt   touchest
   SDO_INSIDEt   withint   isnullc         C   s¾   | r¶ t  | j ƒ  ƒ } t | j ƒ } | d k r\ | j } | d d  | d d  } } n2 | d k r~ | j d  } | } n t d | ƒ ‚ | \ } } | \ }	 }
 | | |	 |
 f Sd  Sd  S(   Nt   Polygoni    i   t   Points0   Unexpected geometry type returned for extent: %s(   R   t   readt   strt	   geom_typet   shellt   coordst	   Exceptiont   None(   R   t   clobt   ext_geomt   gtypeRR   t   llt   urt   xmint   ymint   xmaxt   ymax(    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyt   convert_extentˆ   s    	 	c         C   s$   | r t  | j ƒ  | j ƒ Sd  Sd  S(   N(   R   RO   t   sridRU   (   R   RV   t	   geo_field(    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyt   convert_geomž   s    c         C   s   d S(   s»   
        Returns the geometry database type for Oracle.  Unlike other spatial
        backends, no stored procedure is necessary and it's the same for all
        geometry types.
        s   MDSYS.SDO_GEOMETRY(    (   R   t   f(    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyt   geo_db_type¤   s    c         C   sŽ   | s
 g  S| d } t  | t ƒ rh | j |  j ƒ rA | j } qn t | t j | j |  j ƒ ƒ ƒ } n | } | d k r‡ d | } n  | g S(   s  
        Returns the distance parameters given the value and the lookup type.
        On Oracle, geometry columns with a geodetic coordinate system behave
        implicitly like a geography column, and thus meters will be used as
        the distance parameter on them.
        i    R6   s   distance=%s(   t
   isinstanceR   t   geodetict
   connectiont   mt   getattrt   unit_attnamet
   units_name(   R   Rc   t   valuet   lookup_typet
   dist_param(    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyt   get_distance¬   s    
'c         C   s¥   | d k r d Sd „  } t | d ƒ rj | | | j ƒ rS d |  j | j f } n d } | |  j | ƒ S| | | j ƒ r– d |  j | j | j f Sd | j 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
        SDO_CS.TRANSFORM() function call.
        t   NULLc         S   s   |  j  | k S(   N(   R`   (   t   valR`   (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyt   transform_valueÎ   s    t
   expressions   %s(%%s, %s)s   %ss   %s(SDO_GEOMETRY(%%s, %s), %s)s   SDO_GEOMETRY(%%s, %s)N(   RU   t   hasattrR`   t	   transformt   get_expression_column(   R   Rc   Rl   Rr   t   placeholder(    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyt   get_geom_placeholderÅ   s    	c         C   s™  | \ } } } d | | ƒ | | ƒ f }	 |  j  j | t ƒ }
 |
 rXt |
 t ƒ r9|
 \ } } | d } t | t ƒ s t d | ƒ ‚ n  t | ƒ d k r² t d | ƒ ‚ n  t | d | ƒ sè t d | t | d ƒ f ƒ ‚ n  | d k r| | d ƒ j |	 |  j	 | | ƒ ƒ S| j |	 |  j	 | | ƒ ƒ Sq|
 j |	 |  j	 | | ƒ ƒ Sn' | d	 k rd
 |	 | rwd pzd f St
 d t | ƒ ƒ ‚ d S(   sH   Returns the SQL WHERE clause for use in Oracle spatial SQL construction.s   %s.%si    s$   Tuple required for `%s` lookup type.i   s,   2-element tuple required for %s lookup type.i   s+   Argument type should be %s, got %s instead.RG   RL   s   %s IS %sNULLs   NOT t    s   Got invalid lookup_type: %sN(   t   geometry_functionst   gett   FalseRe   t   tupleR%   t   lent   typet   as_sqlRx   t	   TypeErrort   repr(   R   t   lvalueRm   Rl   t   fieldt   qnt   aliast   colt   db_typet   geo_colt   lookup_infot   sdo_opt   arg_typet   geom(    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyt   spatial_lookup_sqlß   s(    
#&c         C   sc   | j  j j ƒ  } | d k r+ | d 7} n  | j r= d } n d } t |  | ƒ } |  j | | f S(   ss   
        Returns the spatial aggregate SQL template and function for the
        given Aggregate instance.
        t   uniont   aggs   %(function)s(%(field)s)s2   %(function)s(SDOAGGRTYPE(%(field)s,%(tolerance)s))(   t	   __class__R   t   lowert	   is_extentRi   t   select(   R   R   t   agg_nameR   t   sql_function(    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyt   spatial_aggregate_sql  s     		c         C   s   d d l  m } | S(   Niÿÿÿÿ(   t   GeometryColumns(   t,   django.contrib.gis.db.backends.oracle.modelsR˜   (   R   R˜   (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyt   geometry_columns  s    c         C   s   d d l  m } | S(   Niÿÿÿÿ(   t   SpatialRefSys(   R™   R›   (   R   R›   (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyt   spatial_ref_sys   s    c         C   s[   t  | ƒ d k s t ‚ g  t j j | d | d ƒ D] \ } } | d k r6 | ^ q6 g S(   sq   Drop out insert parameters for NULL placeholder. Needed for Oracle Spatial
        backend due to #10888
        i   i    Rp   (   R~   t   AssertionErrorR   t   movest   zip(   R   t   placeholderst   paramst   pholdert   param(    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyt   modify_insert_params$  s    (   R,   R-   N(8   R   R   t   compiler_modulet   namet   TrueR+   t   dictt   aRU   t   valid_aggregatesR   t   Adaptert   Adaptort   areat   gmlt   centroidt
   differencet   distancet   extentt   intersectiont   lengtht   num_geomt
   num_pointst	   perimetert   point_on_surfacet   reverset   sym_differenceRu   R   t   unionaggR”   R   t   dtypesR   t   distance_functionsR   R   R!   R   t   string_typesRz   t   updatet	   gis_termst   listt   termt   truncate_paramsR_   Rb   Rd   Ro   Rx   RŽ   R—   Rš   Rœ   R¤   (    (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyR*   G   st   %	%						.			(   R   R'   t   decimalR    t   django.db.backends.oracle.baseR   t#   django.contrib.gis.db.backends.baseR   t-   django.contrib.gis.db.backends.oracle.adapterR   t#   django.contrib.gis.db.backends.utilR   t#   django.contrib.gis.geometry.backendR   t   django.contrib.gis.measureR   t   django.utilsR   R   R   R   R   R!   t   floatt   integer_typesR¼   R*   (    (    (    sI   ../Django//lib/python/django/contrib/gis/db/backends/oracle/operations.pyt   <module>	   s    	
