
vÅÏ^   ã               @   s  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 m Z d d l m Z d d	 l m Z d d
 l m Z d 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 d S)aU  
 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.
é    N)ÚBaseSpatialOperations)ÚOracleSpatialAdapter)ÚSpatialOperator)Ú
aggregates)ÚGEOSGeometryÚGEOSGeometryBase)Úwkb_r)ÚDistance)ÚDatabaseOperationsz0.05c               @   s   e  Z d  Z d Z d S)ÚSDOOperatorz#%(func)s(%(lhs)s, %(rhs)s) = 'TRUE'N)Ú__name__Ú
__module__Ú__qualname__Úsql_template© r   r   úR/tmp/pip-build-8lau8j11/django/django/contrib/gis/db/backends/oracle/operations.pyr      s   r   c               @   s   e  Z d  Z d Z d S)Ú
SDODWithinz3SDO_WITHIN_DISTANCE(%(lhs)s, %(rhs)s, %%s) = 'TRUE'N)r   r   r   r   r   r   r   r   r      s   r   c               @   s   e  Z d  Z d e Z d S)ÚSDODisjointz@SDO_GEOM.RELATE(%%(lhs)s, 'DISJOINT', %%(rhs)s, %s) = 'DISJOINT'N)r   r   r   ÚDEFAULT_TOLERANCEr   r   r   r   r   r   "   s   r   c                   s4   e  Z d  Z d Z d d „  Z ‡  f d d †  Z ‡  S)Ú	SDORelatez6SDO_RELATE(%(lhs)s, %(rhs)s, 'mask=%(mask)s') = 'TRUE'c             C   sY   d } t  j d | | f t  j ƒ } t | t ƒ sE | j | ƒ rU t d | ƒ ‚ d  S)NzbTOUCH|OVERLAPBDYDISJOINT|OVERLAPBDYINTERSECT|EQUAL|INSIDE|COVEREDBY|CONTAINS|COVERS|ANYINTERACT|ONz^(%s)(\+(%s))*$zInvalid SDO_RELATE mask: "%s")ÚreÚcompileÚIÚ
isinstanceÚstrÚmatchÚ
ValueError)ÚselfÚargÚmasksZ
mask_regexr   r   r   Úcheck_relate_argument)   s     zSDORelate.check_relate_argumentc                s)   | j  ƒ  | d <t ƒ  j | | | | ƒ S)NÚmask)ÚpopÚsuperÚas_sql)r   Ú
connectionÚlookupZtemplate_paramsZ
sql_params)Ú	__class__r   r   r$   /   s    zSDORelate.as_sql)r   r   r   r   r    r$   r   r   )r'   r   r   &   s   r   c            "       s8  e  Z d  Z d Z d Z e j e j e j f Z	 e
 Z d Z d Z d Z d d d d	 d
 d d d d d d d d d d d d d d d d d d d d d d d  d! d" d# d$ d% d& i Z d' Z d( e d) d* ƒ d+ e d) d, ƒ d- e d) d. ƒ d/ e ƒ  d0 e d) d1 ƒ d2 e d) d3 ƒ d4 e d) d3 ƒ d5 e d) d6 ƒ d7 e d) d3 ƒ d8 e ƒ  d9 e d) d: ƒ d; e d) d< ƒ d= e ƒ  i Z d> d? d@ dA dB dC dD dE dF dG dH dI dJ h Z ‡  f dK dL †  Z dM dN „  Z dO dP „  Z dQ dR „  Z ‡  f dS dT †  Z dU dV „  Z dW dX „  Z dY dZ „  Z ‡  f d[ d\ †  Z d] d^ „  Z  d_ d` „  Z! ‡  S)aÚOracleOperationsÚoracleTZSDO_AGGR_MBRZSDO_AGGR_UNIONZSDO_GEOMETRYZAreazSDO_GEOM.SDO_AREAZBoundingCirclezSDO_GEOM.SDO_MBCZCentroidzSDO_GEOM.SDO_CENTROIDZ
DifferencezSDO_GEOM.SDO_DIFFERENCEr	   zSDO_GEOM.SDO_DISTANCEZEnvelopeZSDO_GEOM_MBRZIntersectionzSDO_GEOM.SDO_INTERSECTIONZIsValidz'SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXTZLengthzSDO_GEOM.SDO_LENGTHZNumGeometrieszSDO_UTIL.GETNUMELEMZ	NumPointszSDO_UTIL.GETNUMVERTICESZ	PerimeterZPointOnSurfacezSDO_GEOM.SDO_POINTONSURFACEZReversezSDO_UTIL.REVERSE_LINESTRINGZSymDifferencezSDO_GEOM.SDO_XORZ	TransformzSDO_CS.TRANSFORMÚUnionzSDO_GEOM.SDO_UNIONzSDO_UTIL.TO_WKBGEOMETRY(%s)ÚcontainsÚfuncZSDO_CONTAINSZ	coveredbyZSDO_COVEREDBYZcoversZ
SDO_COVERSZdisjointZ
intersectsZSDO_OVERLAPBDYINTERSECTÚequalsZ	SDO_EQUALÚexactÚoverlapsZSDO_OVERLAPSZsame_asZrelateZtouchesZ	SDO_TOUCHZwithinZ
SDO_INSIDEÚdwithinZ	AsGeoJSONZAsKMLZAsSVGZAzimuthZForcePolygonCWZGeoHashZGeometryDistanceZLineLocatePointZ	MakeValidZMemSizeZScaleZ
SnapToGridZ	Translatec                s   t  ƒ  j | ƒ j ƒ  S)N)r#   Úgeo_quote_nameÚupper)r   Úname)r'   r   r   r1   r   s    zOracleOperations.geo_quote_namec             C   sÖ   | rÎ t  t | j ƒ  ƒ ƒ } t | j ƒ } | d k rn | j } | d d  d … | d d  d … } } n8 | d k r– | j d  d … } | } n t d | ƒ ‚ | \ } } | \ }	 }
 | | |	 |
 f Sd  Sd  S)NZPolygonr   é   ZPointz0Unexpected geometry type returned for extent: %s)r   Ú
memoryviewÚreadr   Z	geom_typeÚshellZcoordsÚ	Exception)r   ZclobZext_geomZgtyper7   ZllÚurZxminZyminZxmaxZymaxr   r   r   Úconvert_extentu   s    	,	zOracleOperations.convert_extentc             C   s   d S)z¹
        Return the geometry database type for Oracle. Unlike other spatial
        backends, no stored procedure is necessary and it's the same for all
        geometry types.
        zMDSYS.SDO_GEOMETRYr   )r   Úfr   r   r   Úgeo_db_type‹   s    zOracleOperations.geo_db_typec             C   s‹   | s
 g  S| d } t  | t ƒ rh | j |  j ƒ rA | j } qn t | t j | j |  j ƒ ƒ ƒ } n | } | d k r„ d | } | g S)a  
        Return 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.
        r   r0   zdistance=%s)r   r	   Zgeodeticr%   ÚmÚgetattrZunit_attnameZ
units_name)r   r;   ÚvalueZlookup_typeZ
dist_paramr   r   r   Úget_distance“   s    
'
zOracleOperations.get_distancec                s&   | d  k r d St  ƒ  j | | | ƒ S)NÚNULL)r#   Úget_geom_placeholder)r   r;   r?   Úcompiler)r'   r   r   rB   ¬   s    z%OracleOperations.get_geom_placeholderc             C   s1   | j  ƒ  d k r d n	 | j  ƒ  } t |  | ƒ S)z8
        Return the spatial aggregate SQL name.
        ÚunionÚunionagg)Úlowerr>   )r   Zagg_namer   r   r   Úspatial_aggregate_name±   s    $z'OracleOperations.spatial_aggregate_namec             C   s   d d l  m } | S)Nr   )ÚOracleGeometryColumns)Ú,django.contrib.gis.db.backends.oracle.modelsrH   )r   rH   r   r   r   Úgeometry_columns¹   s    z!OracleOperations.geometry_columnsc             C   s   d d l  m } | S)Nr   )ÚOracleSpatialRefSys)rI   rK   )r   rK   r   r   r   Úspatial_ref_sys½   s    z OracleOperations.spatial_ref_sysc                s#   | d k r g  St  ƒ  j | | ƒ S)zrDrop out insert parameters for NULL placeholder. Needed for Oracle Spatial
        backend due to #10888.
        rA   )r#   Úmodify_insert_params)r   ÚplaceholderÚparams)r'   r   r   rM   Á   s    z%OracleOperations.modify_insert_paramsc                sR   t  ƒ  j ‰ | j j ‰ ˆ d k r* d  ‰ | j j ‰  ‡  ‡ ‡ f d d †  } | S)Né   c                sD   |  d  k	 r@ t  ˆ t |  j ƒ  ƒ ƒ ˆ  ƒ } ˆ r< ˆ | _ | Sd  S)N)r   r5   r6   Úsrid)r?   Ú
expressionr%   Zgeom)Ú
geom_classr6   rQ   r   r   Ú	converterÐ   s
    !	z:OracleOperations.get_geometry_converter.<locals>.converteréÿÿÿÿ)r   r6   Zoutput_fieldrQ   rS   )r   rR   rT   r   )rS   r6   rQ   r   Úget_geometry_converterÉ   s    z'OracleOperations.get_geometry_converterc             C   s   d S)NZsq_mr   )r   Úfieldr   r   r   Úget_area_att_for_fieldØ   s    z'OracleOperations.get_area_att_for_field)"r   r   r   r3   r)   r   ZCollectZExtent3DZMakeLineZdisallowed_aggregatesr   ZAdapterZextentrE   Z	from_textZfunction_namesÚselectr   r   r   r   Zgis_operatorsZunsupported_functionsr1   r:   r<   r@   rB   rG   rJ   rL   rM   rV   rX   r   r   )r'   r   r(   4   sh   		r(   )Ú__doc__r   Z.django.contrib.gis.db.backends.base.operationsr   Z-django.contrib.gis.db.backends.oracle.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.db.backends.oracle.operationsr
   r   r   r   r   r   r(   r   r   r   r   Ú<module>	   s   