
 X)                 @   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 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  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)Geometry)Distance)Database)DatabaseOperations)sixz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   ^/home/ubuntu/projects/ifolica/build/django/django/contrib/gis/db/backends/oracle/operations.pyr      s   r   c               @   s   e  Z d  Z d e Z d S)SDODistancez@SDO_GEOM.SDO_DISTANCE(%%(lhs)s, %%(rhs)s, %s) %%(op)s %%(value)sN)r   r   r   DEFAULT_TOLERANCEr   r   r   r   r   r      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   r   r   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   s_   d } t  j d | | f t  j  } t | t j  sH | j |  r[ t d |   n  d  S)NzbTOUCH|OVERLAPBDYDISJOINT|OVERLAPBDYINTERSECT|EQUAL|INSIDE|COVEREDBY|CONTAINS|COVERS|ANYINTERACT|ONz^(%s)(\+(%s))*$zInvalid SDO_RELATE mask: "%s")recompileI
isinstancer
   string_typesmatch
ValueError)selfargZmasksZ
mask_regexr   r   r   check_relate_argument-   s    #zSDORelate.check_relate_argumentc                s/   | j    | d <t t |   j | | | |  S)Nmask)popsuperr   as_sql)r   
connectionlookupZtemplate_paramsZ
sql_params)	__class__r   r   r$   3   s    zSDORelate.as_sql)r   r   r   r   r    r$   r   r   )r'   r   r   *   s   r   c                   s  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 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 d d 6d d 6d d 6d d 6d	 d 6d
 d 6d d 6d d 6d
 d 6d d 6d d 6d d 6d d  6d d! 6Z d" Z i e d# d$  d% 6e d# d&  d' 6e d# d(  d) 6e    d* 6e d# d+  d, 6e d# d-  d. 6e d# d-  d/ 6e d# d0  d1 6e d# d-  d2 6e!   d3 6e d# d4  d5 6e d# d6  d7 6e" d8 d9  d: 6e" d8 d;  d< 6e" d8 d=  d> 6e" d8 d?  d@ 6e#   dA 6Z$ i dB d3 6Z% dC dD dE dF dG dH dI dJ dK dL dM dN dO dP h Z&   f dQ dR   Z'   f dS dT   Z( dU dV   Z) dW dX   Z* dY dZ   Z+ d[ d\   Z, d] d^   Z- d_ d`   Z. da db   Z/ dc dd   Z0 de df   Z1   f dg dh   Z2   S)iOracleOperationsoracleTzSDO_GEOM.SDO_AREAzSDO_UTIL.TO_GMLGEOMETRYzSDO_GEOM.SDO_CENTROIDzSDO_GEOM.SDO_DIFFERENCEzSDO_GEOM.SDO_DISTANCEZSDO_AGGR_MBRzSDO_GEOM.SDO_INTERSECTIONzSDO_GEOM.SDO_LENGTHzSDO_UTIL.GETNUMVERTICESzSDO_GEOM.SDO_POINTONSURFACEzSDO_UTIL.REVERSE_LINESTRINGzSDO_GEOM.SDO_XORzSDO_CS.TRANSFORMzSDO_GEOM.SDO_UNIONZSDO_AGGR_UNIONZSDO_GEOMETRYZAreaZCentroidZ
Differencer   ZIntersectionZLengthzSDO_UTIL.GETNUMELEMZNumGeometriesZ	NumPointsZ	PerimeterZPointOnSurfaceZReverseZSymDifferenceZ	TransformUnionzSDO_UTIL.TO_WKTGEOMETRY(%s)funcZSDO_CONTAINScontainsZSDO_COVEREDBYZ	coveredbyZ
SDO_COVERSZcoversZdisjointZSDO_OVERLAPBDYINTERSECTZ
intersectsZ	SDO_EQUALequalsexactZSDO_OVERLAPSZoverlapsZsame_asZrelateZ	SDO_TOUCHZtouchesZ
SDO_INSIDEZwithinop>Zdistance_gtz>=Zdistance_gte<Zdistance_ltz<=Zdistance_ltedwithinNZ	AsGeoJSONZAsGMLZAsKMLZAsSVGZBoundingCircleZEnvelopeZForceRHRZGeoHashZIsValidZ	MakeValidZMemSizeZScaleZ
SnapToGridZ	Translatec                s   t  t |   j |  j   S)N)r#   r(   geo_quote_nameupper)r   name)r'   r   r   r3      s    zOracleOperations.geo_quote_namec          
      su   t  t |   j |  } | j j   } d } | | k rL | j |  j  n  t | j d  rq | j |  j  n  | S)N
PointFieldGeometryFieldLineStringFieldPolygonFieldMultiPointFieldMultiLineStringFieldMultiPolygonFieldGeometryCollectionField	GeomFieldGMLField	geom_type)
r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   )	r#   r(   get_db_convertersZoutput_fieldZget_internal_typeappendZconvert_textfield_valuehasattrconvert_geometry)r   
expressionZ
convertersZinternal_typeZgeometry_fields)r'   r   r   rA      s       z"OracleOperations.get_db_convertersc             C   s5   | r1 t  |  } d | k r1 | d | _ q1 n  | S)NZtransformed_srid)r   srid)r   valuerE   r%   contextr   r   r   rD      s
    z!OracleOperations.convert_geometryc             C   s   | r t  | j   |  } t | j  } | d k rk | 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   readstrr@   shellZcoords	Exception)r   ZclobrF   Zext_geomZgtyperL   ZllurZxminZyminZxmaxZymaxr   r   r   convert_extent   s    	,	zOracleOperations.convert_extentc             C   s?   | r7 t  | t j  r' | j   } n  t | | j  Sd  Sd  S)N)r   r   ZLOBrJ   r   rF   )r   rG   Z	geo_fieldr   r   r   convert_geom   s
    zOracleOperations.convert_geomc             C   s   d S)z
        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.
        zMDSYS.SDO_GEOMETRYr   )r   fr   r   r   geo_db_type   s    zOracleOperations.geo_db_typec             K   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)a  
        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.
        r   r2   zdistance=%s)r   r   Zgeodeticr%   mgetattrZunit_attnameZ
units_name)r   rQ   rG   Zlookup_typekwargsZ
dist_paramr   r   r   get_distance   s    
'zOracleOperations.get_distancec             C   s   | d k r d Sd d   } t  | d  ry | | | j  rV d |  j | j f } n d } | j |  \ } } | | S| | | j  r d |  j | j | j f Sd	 | j Sd S)
z
        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.
        NNULLc             S   s   |  j  | k S)N)rF   )valrF   r   r   r   transform_value   s    z>OracleOperations.get_geom_placeholder.<locals>.transform_valuer$   z%s(%%s, %s)z%sz%s(SDO_GEOMETRY(%%s, %s), %s)zSDO_GEOMETRY(%%s, %s))rC   rF   	transformr   )r   rQ   rG   compilerrY   placeholderZsql_r   r   r   get_geom_placeholder   s    z%OracleOperations.get_geom_placeholderc             C   s1   | j    d k r d n	 | j    } t |  |  S)z9
        Returns the spatial aggregate SQL name.
        unionunionagg)lowerrT   )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.modelsrc   )r   rc   r   r   r   geometry_columns  s    z!OracleOperations.geometry_columnsc             C   s   d d l  m } | S)Nr   )OracleSpatialRefSys)rd   rf   )r   rf   r   r   r   spatial_ref_sys  s    z OracleOperations.spatial_ref_sysc                s)   | d k r g  St  t |   j | |  S)zrDrop out insert parameters for NULL placeholder. Needed for Oracle Spatial
        backend due to #10888.
        rW   )r#   r(   modify_insert_params)r   r\   params)r'   r   r   rh     s    z%OracleOperations.modify_insert_params)3r   r   r   r5   r)   r   ZCollectZExtent3DZMakeLineZdisallowed_aggregatesr   ZAdapterareaZgmlZcentroid
differenceZdistanceZextentintersectionlengthZ
num_pointsZ	perimeterZpoint_on_surfacereverseZsym_differencerZ   r_   r`   Z	from_textZfunction_namesselectr   r   r   r   r   Zgis_operatorsZtruncate_paramsZunsupported_functionsr3   rA   rD   rO   rP   rR   rV   r^   rb   re   rg   rh   r   r   )r'   r   r(   8   s   


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.geometry.backendr   Zdjango.contrib.gis.measurer   Zdjango.db.backends.oracle.baser   Z$django.db.backends.oracle.operationsr	   Zdjango.utilsr
   r   r   r   r   r   r   r(   r   r   r   r   <module>	   s"   