ó
D()Qc           @   s(  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 m Z d  d l m Z d  d l m Z d  d l m Z m Z e 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& g ƒ Z e j e j j ƒ d' e j f d( „  ƒ  YZ d) S(*   iÿÿÿÿ(   t   connections(   t   sql(   t   GeometryField(   t
   aggregates(   t	   AreaFieldt   DistanceFieldt	   GeomField(   t   GeoWhereNode(   t   Geometry(   t   Areat   Distancet
   bbcontainst
   bboverlapst	   containedt   containst   contains_properlyt	   coveredbyt   coverst   crossest   disjointt   distance_gtt   distance_gtet   distance_ltt   distance_ltet   dwithint   equalst   exactt
   intersectst   overlapst   relatet   same_ast   touchest   withint   leftt   rightt   overlaps_leftt   overlaps_rightt   overlaps_abovet   overlaps_belowt   strictly_abovet   strictly_belowt   GeoQueryc           B   s\   e  Z d  Z e Z e Z d Z e d „ Z	 d „  Z
 d „  Z d „  Z d „  Z d d „ Z RS(	   s%   
    A single spatial SQL query.
    t   GeoSQLCompilerc         C   s8   t  t |  ƒ j | | ƒ i  |  _ d  |  _ i  |  _ d  S(   N(   t   superR)   t   __init__t   custom_selectt   Nonet   transformed_sridt   extra_select_fields(   t   selft   modelt   where(    (    s?   ../Django//lib/python/django/contrib/gis/db/models/sql/query.pyR,   #   s    		c         O   sO   t  t |  ƒ j | | Ž  } |  j j ƒ  | _ |  j | _ |  j j ƒ  | _ | S(   N(   R+   R)   t   cloneR-   t   copyR/   R0   (   R1   t   argst   kwargst   obj(    (    s?   ../Django//lib/python/django/contrib/gis/db/models/sql/query.pyR4   ,   s
    c         C   së   | j  j r6 t t |  ƒ j | | p* t ƒ  | ƒ } n  | d k rE n¢ t | t ƒ rm t	 i | | j
 6  } nz t | t ƒ r• t i | | j 6  } nR t | t t f ƒ r¿ | r¿ t | ƒ } n( | d k	 rç t t |  ƒ j | | | ƒ S| S(   sÐ   
        Using the same routines that Oracle does we can convert our
        extra selection objects into Geometry and Distance objects.
        TODO: Make converted objects 'lazy' for less overhead.
        N(   t   opst   oracleR+   R)   t   convert_valuesR   R.   t
   isinstanceR   R
   t   distance_attR   R	   t   area_attR   R   (   R1   t   valuet   fieldt
   connection(    (    s?   ../Django//lib/python/django/contrib/gis/db/models/sql/query.pyR;   5   s    *c         C   s‡   t  | } xd |  j j ƒ  D]S \ } } t | t j ƒ r t | d t ƒ sW | j j	 rm t
 ƒ  |  j | <qm q q Wt t |  ƒ j | ƒ S(   Nt	   is_extent(   R    t   aggregate_selectt   itemsR<   t   gis_aggregatest   GeoAggregatet   getattrt   FalseR9   R:   R   R0   R+   R)   t   get_aggregation(   R1   t   usingRA   t   aliast	   aggregate(    (    s?   ../Django//lib/python/django/contrib/gis/db/models/sql/query.pyRI   O   s    
c         C   s‰   t  | |  j j ƒ ri | j rP | j d k r= | j j | ƒ S| j j | ƒ Sq… | j j | | j ƒ Sn t	 t
 |  ƒ j | | | ƒ Sd S(   sp   
        Overridden from GeoQuery's normalize to handle the conversion of
        GeoAggregate objects.
        t   3DN(   R<   t   aggregates_moduleRF   RB   R9   t   convert_extent3dt   convert_extentt   convert_geomt   sourceR+   R)   t   resolve_aggregate(   R1   R?   RL   RA   (    (    s?   ../Django//lib/python/django/contrib/gis/db/models/sql/query.pyRS   Y   s    	c         C   sW   | d k r= x* |  j j j D] } t | t ƒ r | Sq Wt St j |  j j | ƒ Sd S(   s  
        Returns the first Geometry field encountered; or specified via the
        `field_name` keyword.  The `field_name` may be a string specifying
        the geometry field on this GeoQuery's model, or a lookup string
        to a geometry field via a ForeignKey relation.
        N(	   R.   R2   t   _metat   fieldsR<   R   RH   R   t   _check_geo_field(   R1   t
   field_namet   fld(    (    s?   ../Django//lib/python/django/contrib/gis/db/models/sql/query.pyt
   _geo_fieldj   s     N(   t   __name__t
   __module__t   __doc__t	   ALL_TERMSt   query_termsRE   RN   t   compilerR   R,   R4   R;   RI   RS   R.   RY   (    (    (    s?   ../Django//lib/python/django/contrib/gis/db/models/sql/query.pyR)      s   					
	N(   t	   django.dbR    t   django.db.models.queryR   t#   django.contrib.gis.db.models.fieldsR   t    django.contrib.gis.db.models.sqlR   RE   t+   django.contrib.gis.db.models.sql.conversionR   R   R   t&   django.contrib.gis.db.models.sql.whereR   t#   django.contrib.gis.geometry.backendR   t   django.contrib.gis.measureR	   R
   t   setR]   t   updatet	   constantst   QUERY_TERMSt   QueryR)   (    (    (    s?   ../Django//lib/python/django/contrib/gis/db/models/sql/query.pyt   <module>   s$   	