
H`Tc           @   s:  d  Z  d d l m Z m Z d d l m Z m Z m Z d d l m Z	 m
 Z
 d d l m Z d d l m Z m Z m Z m Z m Z 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 Z e e e e e e e d  Z e j j d e d e  d e f d     Y Z e j  e j j d e! d e  d e f d     Y  Z" e j  e j j d e! d e!  d e f d     Y  Z# d e$ f d     YZ% d e f d     YZ& e j  e j' j d d  e j' j d e  d e& f d     Y   Z( e j  e j' j d e!  e j' j d d   d! e& f d"     Y   Z) d# e$ f d$     YZ* e j' j d d%  d& e& f d'     Y Z+ e j  e j' j d d(  d) e& f d*     Y  Z, e j  e j' j d d+  e j' j d e  d, e& f d-     Y   Z- d.   Z. d S(/   sW   sqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.i   (   t   exct   inspect(   t   utilt   logt   event(   R   t   visitors(   t   sqli   (   t
   attributest
   interfacesR    t   loadingt
   unitofworkR   (   t   InstanceState(   t	   _none_set(   t
   properties(   t   LoaderStrategyt   StrategizedProperty(   t   _state_sessioniNc
      !      s  |  j  } t t j | j d g   } g  } | rL | j rL | j t  n  | j | j	 j
 k r | j	 j
 | j \   | j   f d    n  | r | j t j  n  |
 j d d     r | j    f d    n  x | j D] } | | j j | j  k r t j | j | j d | d   d | d | d	 | d
 | o_| j p_| j t j k d | d | d | d |	 d | p| j d | j |
 } x | D] } | | |  qWq q Wd  S(   Nt   defaultc            s   t  j |  | j     S(   N(   t   orm_utilt   _validator_eventst   key(   t   desct   prop(   t   optst   fn(    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   <lambda>5   s   t   backrefc            s   t  j |      S(   N(   R   t   backref_listeners(   R   R   (   t   uselistR   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   B   s   t   parent_tokenR   t   compare_functiont	   useobjectt	   extensiont   trackparentt   typecallablet	   callable_t   active_historyt
   impl_classt   send_modified_eventst   doc(   t   parent_propertyt   listR   t   to_listR    t   single_parentt   appendt   single_parent_validatorR   t   parentt
   validatorsR
   t   track_cascade_eventst   popt   Nonet   self_and_descendantst   _propst   getR   t   register_attribute_implt   class_t	   directionR   t	   ONETOMANYt   viewonlyR'   (   t   strategyt   mapperR   R   R"   R   R#   t   proxy_propertyR$   R%   t   kwR   t   attribute_extt   listen_hookst   mR   t   hook(    (   R   R   R   R   s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   _register_attribute   sJ    				t
   instrumentt   deferredt   UninstrumentedColumnLoaderc           B   s,   e  Z d  Z d   Z d d  Z d   Z RS(   s   Represent the a non-instrumented MapperProperty.

    The polymorphic_on argument of mapper() often results in this,
    if the argument is against the with_polymorphic selectable.

    c         C   s)   t  t |   j |  |  j j |  _ d  S(   N(   t   superRF   t   __init__R(   t   columns(   t   selfR.   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRH   l   s    c   	      K   s;   x4 |  j  D]) } | r& | j  | } n  | j |  q
 Wd  S(   N(   RI   R,   (	   RJ   t   contextt   entityt   patht   loadoptt   adaptert   column_collectiont   kwargst   c(    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   setup_queryp   s    c         C   s   d S(   N(   NNN(   R2   (   RJ   RK   RM   RN   R<   t   rowRO   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   create_row_processorx   s    N(   t   __name__t
   __module__t   __doc__RH   R2   RS   RU   (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRF   d   s   	t   ColumnLoaderc           B   s2   e  Z d  Z d   Z d   Z d   Z d   Z RS(   s8   Provide loading behavior for a :class:`.ColumnProperty`.c         C   s>   t  t |   j |  |  j j |  _ t |  j d  |  _ d  S(   Nt   composite_class(   RG   RY   RH   R(   RI   t   hasattrt   is_composite(   RJ   R.   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRH      s    c   	      K   s;   x4 |  j  D]) } | r& | j  | } n  | j |  q
 Wd  S(   N(   RI   R,   (	   RJ   RK   RL   RM   RN   RO   RP   RQ   RR   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRS      s    c         C   ss   t  |  _ |  j d j } |  j j pJ |  j d j pJ | j t |  j  k } t	 |  | d t
 d | j d | d  S(   Ni    R   R   R$   (   t   Truet   is_class_levelRI   t   typeR(   R$   t   primary_keyt   version_id_colt   setRC   t   Falset   compare_values(   RJ   R<   t   coltypeR$   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   init_class_attribute   s    		c   	         s   |  j    xz |  j D]S  | r/ | j   n   d  k	 r  | k r    f d   } | d  d  f Sq W  f d   } | d  d  f Sd  S(   Nc            s   |   |  <d  S(   N(    (   t   statet   dict_RT   (   t   colR   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt	   fetch_col   s    c            s   |  j  |    d  S(   N(   t   _expire_attribute_pre_commit(   Rg   Rh   RT   (   R   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   expire_for_non_present_col   s    (   R   RI   R2   (	   RJ   RK   RM   RN   R<   RT   RO   Rj   Rl   (    (   R   Ri   s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRU      s    	(   RV   RW   RX   RH   RS   Rf   RU   (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRY   ~   s
   			t   DeferredColumnLoaderc           B   s>   e  Z d  Z d   Z d   Z d   Z d d  Z d   Z RS(   sA   Provide loading behavior for a deferred :class:`.ColumnProperty`.c         C   sY   t  t |   j |  t |  j d  r7 t d   n  |  j j |  _ |  j j |  _ d  S(   NRZ   s8   Deferred loading for composite types not implemented yet(   RG   Rm   RH   R[   R(   t   NotImplementedErrorRI   t   group(   RJ   R.   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRH      s
    c   
         s   |  j  d } | r# | j  | } n  |  j   | | k r` |  j j t  j | | | | | |  S|  j s t j | j	 t
       } | d  d  f S  f d   }	 |	 d  d  f Sd  S(   Ni    c            s   |  j  |    d  S(   N(   t   _reset(   Rg   Rh   RT   (   R   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   reset_col_for_deferred   s    (   RI   R   R(   t   _get_strategy_by_clsRY   RU   R^   R   t   _row_processort   class_managert   LoadDeferredColumnsR2   (
   RJ   RK   RM   RN   R<   RT   RO   Ri   t   set_deferred_for_local_stateRq   (    (   R   s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRU      s    		c         C   sB   t  |  _ t |  | d t d |  j d j j d |  j d t d  S(   NR   R   i    R#   t   expire_missing(   R]   R^   RC   Rc   RI   R_   Rd   t   _load_for_state(   RJ   R<   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRf      s    		c         K   s   | r3 d | j  k r3 t |  j  j |  j j  su | r` |  j r` | j  j d t  |  j k su | r |  j	 | k r |  j
 j t  j | | | | | |  n  d  S(   Nt   undefer_pkst   undefer_group(   t
   local_optsRb   RI   t   intersectionR.   R`   Ro   R5   Rc   R   R(   Rr   RY   RS   (   RJ   RK   RL   RM   RN   RO   t   only_load_propsRQ   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRS      s    	c   
      C   sQ  | j  s t j S| t j @s$ t j S| j j } |  j r g  | j D]B } t	 | t
  rC t	 | j t  rC | j |  j k rC | j  ^ qC } n |  j  g } g  | D] } | | j k r | ^ q } t |  } | d  k rt j d t j |  |  j  f   n  | j |  }	 t j |	 | j  d | d | d  k rJt j |   n  t j S(   Nsf   Parent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceedR}   t   refresh_state(   R   R   t
   ATTR_EMPTYt   SQL_OKt   PASSIVE_NO_RESULTt   managerR<   Ro   t   iterate_propertiest
   isinstanceR   R;   Rm   t
   unmodifiedR   R2   t   orm_exct   DetachedInstanceErrorR   t	   state_strt   queryR	   t   load_on_identt   ObjectDeletedErrort   ATTR_WAS_SET(
   RJ   Rg   t   passivet   localparentt   pt   toloadt   kRo   t   sessionR   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRx      s0    		$(N(	   RV   RW   RX   RH   RU   Rf   R2   RS   Rx   (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRm      s   			Ru   c           B   s&   e  Z d  Z d   Z e j d  Z RS(   s7   serializable loader object used by DeferredColumnLoaderc         C   s   | |  _  d  S(   N(   R   (   RJ   R   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRH   %  s    c         C   s?   |  j  } | j j } | j | } | j t } | j | |  S(   N(   R   R   R<   R4   t   _strategiesRm   Rx   (   RJ   Rg   R   R   R   R   R;   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   __call__(  s
    	(   RV   RW   RX   RH   R   t   PASSIVE_OFFR   (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRu   "  s   	t   AbstractRelationshipLoaderc           B   s   e  Z d  Z d   Z RS(   s0   LoaderStratgies which deal with related objects.c         C   sG   t  t |   j |  |  j j |  _ |  j j |  _ |  j j |  _ d  S(   N(   RG   R   RH   R(   R<   t   targetR   (   RJ   R.   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRH   4  s    (   RV   RW   RX   RH   (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   1  s   t   lazyt   noloadt   NoLoaderc           B   s    e  Z d  Z d   Z d   Z RS(   sY   Provide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=None".

    c      	   C   s8   t  |  _ t |  | d t  d |  j j d |  j j d  S(   NR   R   R"   (   R]   R^   RC   R(   R   t   collection_class(   RJ   R<   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRf   D  s    		c            s     f d   } | d  d  f S(   Nc            s   |  j    j  d  S(   N(   t   _initializeR   (   Rg   Rh   RT   (   RJ   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   invoke_no_loadQ  s    (   R2   (   RJ   RK   RM   RN   R<   RT   RO   R   (    (   RJ   s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRU   N  s    (   RV   RW   RX   Rf   RU   (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   ;  s   	
t   selectt
   LazyLoaderc           B   sw   e  Z d  Z d   Z d   Z e e d
 d
 d  Z e d
 d  Z d   Z	 d   Z
 e j d  d    Z d	   Z RS(   s|   Provide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=True", that is loads when first accessed.

    c         C   s:  t  t |   j |  |  j j } | j   \ |  _ |  _ |  _ | j d t	  \ |  _
 |  _ |  _ |  j j d |  |  j  |  j o |  j j d j |  j d t	 d |  j j |  _ |  j r6x[ t |  j  D]J } | |  j j k r x/ |  j j | D] } |  j | |  j | <q Wq q W|  j j d |   n  d  S(   Nt   reverse_directions   %s lazy loading clause %si    t   use_proxiest   equivalentss2   %s will use query.get() to optimize instance loads(   RG   R   RH   R(   t   _join_conditiont   create_lazy_clauset
   _lazywheret   _bind_to_colt   _equated_columnsR]   t   _rev_lazywheret   _rev_bind_to_colt   _rev_equated_columnst   loggert   infoR   R<   t   _get_clauset   comparet   _equivalent_columnst   use_getR)   (   RJ   R.   t   join_conditionRi   RR   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRH   _  s$    	
		c         C   s~   t  |  _ |  j j p1 |  j j t j k	 p1 |  j } t |  | d t  d |  j	 d |  j j
 d |  j j d |  j j d | d  S(   NR   R#   R   R   R"   R$   (   R]   R^   R(   R$   R8   R   t	   MANYTOONER   RC   Rx   R   t   back_populatesR   (   RJ   R<   R$   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRf     s    	
		c   	         sD   d  k r |  j | d | S| s; |  j |  j }  n |  j |  j }  | rc |  j j   n |  j j    j	   } t
 j |   | r | t
 j @r      f d   } n      f d   } |  j j d  k	 r| rt j |  j j j    j |  } n  t j | i  i | d 6 } | r@| |  } n  | S(   Nt   adapt_sourcec            s4     j   k r0       f d     _ n  d  S(   Nc              s     j      j  S(   N(   t#   _get_committed_state_attr_by_columnt   _identifying_key(    (   R<   Rg   t   bind_to_colRh   t	   bindparam(    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s   (   R   t   callable(   R   (   Rh   R<   Rg   R   (   R   s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   visit_bindparam  s    c            s4     j   k r0       f d     _ n  d  S(   Nc              s     j      j  S(   N(   t   _get_state_attr_by_columnR   (    (   R<   Rg   R   Rh   R   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s   (   R   R   (   R   (   Rh   R<   Rg   R   (   R   s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s    R   (   R2   t   _lazy_none_clauseR   R   R   R   R(   R<   R.   t   objR   t   instance_dictt   LOAD_AGAINST_COMMITTEDt	   secondaryt   sql_utilt   ClauseAdaptert   aliast   traverseR   t   cloned_traverse(	   RJ   Rg   R   t   alias_secondaryR   R   t	   criteriont   oR   (    (   R<   Rg   R   Rh   s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   lazy_clause  s4    c         C   sZ   | s |  j  |  j } } n |  j |  j } } t j | |  } | rV | |  } n  | S(   N(   R   R   R   R   R   t   adapt_criterion_to_null(   RJ   R   R   R   R   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s    c         C   s  | j  r2 |  j j r! | j s+ | j r2 t j S| j  } d  } | t j @rZ |  j	 sn | t j
 @ru | ru t j St |  } | s t j d t j |  |  j  f   n  |  j	 ri|  j | | |  } t j | k r t j St j | k r t j St j |  rd  S|  j j |  } t j | | |  } | d  k	 rC| S| t j @s_| t j @rit j Sn  |  j | | | |  S(   Nsb   Parent instance %s is not bound to a Session; lazy load operation of attribute '%s' cannot proceed(   R   R(   t   load_on_pendingt   _load_pendingt
   session_idR   R   R2   R   R   t   NON_PERSISTENT_OKR   R   R   R   R   R   t   _get_ident_for_use_gett	   NEVER_SETR   t
   issupersetR<   t   identity_key_from_primary_keyR	   t   get_from_identityt   RELATED_OBJECT_OKt   _emit_lazyload(   RJ   Rg   R   t   pendingt	   ident_keyR   t   identt   instance(    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRx     sD    



		
c         C   sm   | j  j } | t j @r% | j } n	 | j } | j } g  |  j j D]% } | | | |  j | d | ^ qD S(   NR   (	   R   R<   R   R   R   R   t   dictR`   R   (   RJ   R   Rg   R   t   instance_mappert   get_attrRh   t   pk(    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s    		s   sqlalchemy.orm.strategy_optionsc         C   s(  | j  |  j  j   } |  j j d  k	 rH | j |  j |  j j  } n  | j t  } | j	 } | st | t
 j @r | j t  } n  | j r | j | j |  j  } n  | j r | j | j   } n  |  j r t j | |  S|  j j r| j t j |  j j    } n  xl |  j j D]^ } | j t j k r| j rt | j t  r| j | j  | j!  j" | j	   } qqW|  j# | d | }	 | rt$ j% |	  }
 d  |
 k rd  Sn  | j& |	  } | j'   } |  j( r| St) |  } | r | d k rt j* d |  j  n  | d Sd  Sd  S(   NR   i   sK   Multiple rows returned with uselist=False for lazily-loaded attribute '%s' i    (+   R   R<   t   _adapt_all_clausesR(   R   R2   t   select_fromt   _with_invoke_all_eagersRc   R   R   t   NO_AUTOFLUSHt	   autoflusht	   load_patht   _with_current_patht   load_optionst   _conditional_optionsR   R	   R   t   order_byR   R*   t   _reverse_propertyR8   R   R   t   _use_getR   R;   R   t   optionst   LoadR.   t   lazyloadR   R   t   bind_valuest   filtert   allR   t   lent   warn(   RJ   t   strategy_optionsR   Rg   R   R   t   qR   t   revR   R   t   resultt   l(    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   +  sN    
			!		c   	         s]   |  j    |  j s= t j | j t       } | d  d  f S  f d   } | d  d  f Sd  S(   Nc            s   |  j  |    d  S(   N(   Rp   (   Rg   Rh   RT   (   R   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   reset_for_lazy_callable~  s    	(   R   R^   R   Rs   Rt   t   LoadLazyAttributeR2   (	   RJ   RK   RM   RN   R<   RT   RO   t   set_lazy_callableR   (    (   R   s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRU   k  s    			N(   RV   RW   RX   RH   Rf   Rc   R2   R   R   Rx   R   R   t   dependenciesR   RU   (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   V  s   	 	5	6	@R   c           B   s&   e  Z d  Z d   Z e j d  Z RS(   s-   serializable loader object used by LazyLoaderc         C   s   | |  _  d  S(   N(   R   (   RJ   R   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRH     s    c         C   s?   |  j  } | j j } | j | } | j t } | j | |  S(   N(   R   R   R<   R4   R   R   Rx   (   RJ   Rg   R   R   R   R   R;   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s
    	(   RV   RW   RX   RH   R   R   R   (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s   	t	   immediatet   ImmediateLoaderc           B   s)   e  Z d    Z d d d  Z d   Z RS(   c         C   s   |  j  j t  j |  d  S(   N(   R(   Rr   R   Rf   (   RJ   R<   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRf     s    		c   	      K   s   d  S(   N(    (	   RJ   RK   RL   RM   RN   RO   RP   t   parentmapperRQ   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRS     s    c            s     f d   } d  d  | f S(   Nc            s    |  j    j  j |  |  d  S(   N(   t   get_implR   R5   (   Rg   Rh   RT   (   RJ   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   load_immediate  s    (   R2   (   RJ   RK   RM   RN   R<   RT   RO   R   (    (   RJ   s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRU     s    N(   RV   RW   Rf   R2   RS   RU   (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s   	t   subqueryt   SubqueryLoaderc           B   s   e  Z d    Z d   Z d d d  Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z d	 e f d
     YZ d   Z d   Z d   Z RS(   c         C   s)   t  t |   j |  |  j j |  _ d  S(   N(   RG   R  RH   R(   t
   join_depth(   RJ   R.   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRH     s    c         C   s   |  j  j t  j |  d  S(   N(   R(   Rr   R   Rf   (   RJ   R<   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRf     s    		c         K   s  | j  j s d  S| |  j } | j | j d d   }	 |	 d  k	 rM |	 j }
 n	 |  j }
 | j j d t j	 j
  } | | } | j | j d  s |  j r | j d |  j k r d  Sq | j |  j  r d  Sn  |  j |  \ } } } | j j d t f | j   } |  j | | | | | j  } | j j  |
  } i | d t f 6| d 6| _ | j t  } |  j | |  \ } } } | j |   } | j |   } |  j | | | | |
  } |  j | | | |
  } |  j |  } | j | j d |  d  S(	   Nt   path_with_polymorphict   subquery_patht   loaderi   t
   orig_queryR   (   R  N(   R  N(   R   t   _enable_eagerloadsR(   R5   R   R2   RL   R<   R   t   PathRegistryt   roott   containsR  t   lengtht   contains_mappert   _get_leftmostR  t   _generate_from_original_queryt   entity_zeroR   t   _attributest   _set_enable_single_critRc   t   _prep_for_joinsR   t   add_columnst   _apply_joinst   _setup_optionst   _setup_outermost_orderbyRb   (   RJ   RK   RL   RM   RN   RO   RP   R   RQ   t   with_poly_infot   effective_entityt	   subq_patht   leftmost_mappert   leftmost_attrt   leftmost_relationshipR  t
   left_aliasR   t   to_joint
   local_attrt   parent_alias(    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRS     sR    		
				c         C   s   | j  } t j | d  } |  j j |  rW |  j | d k rW |  j |  j } } n | | d } } | j } g  | D]& } t | d j | j	 | j
  ^ qx } | | | f S(   Ni    i   (   RM   R   t   _class_to_mapperR.   t   isaR(   t   local_columnst   getattrRL   t   _columntopropertyR   (   RJ   R  t   subq_mapperR  t   leftmost_propt   leftmost_colsRR   R  (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s    		0c         C   sO  | j    j d   } | j rG | j j |  rG | j | g t  n  | j |  } | j	 |  | j
 } | t k r t | _ nU | d  k r xF t d   | D  D]+ }	 t |  j |	 j  s t | _ Pq q Wn  | j t k r | j | _ n  | j d  k r!| j d  k r!d  | _ n  | j   j   }
 t j | |
 d t } | S(   Nc         s   s   |  ] } | j  Vq d  S(   N(   t   table(   t   .0RR   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pys	   <genexpr>=  s    t   use_mapper_path(   t   _clonet	   correlateR2   t	   _from_objR<   R"  t   _set_select_fromRc   t   _adapt_col_listt   _set_entitiest   distinct_target_keyR]   t	   _distinctRb   R   R`   t	   _order_byR   t   _limitt   _offsett   with_labelsR   R   t   AliasedClass(   RJ   R  R  R  R  t   orig_entityR   t   target_colsR2  t   tt   embed_qR  (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR  $  s,    				c         C   so  g  } t  | j    } x{ t |  D]m \ } \ } } | d k rv | | d d j } | j |  rm | n | }	 n | }	 | j |	 | j f  q% Wt |  d k r t | d d  }
 n  t |  d k  r | } nM |
 j j |  j	  rt
 j | d d d t } n t
 j |  j	 d t } |  j j } g  | D]" } t | |  j	 j | j  ^ q:} | | | f S(   Ni    i   ii   R+  (   R)   t   pairst	   enumerateR<   R"  R,   R   R   R   R.   R   R8  R]   R(   R#  R$  R%  (   RJ   R  R  R  R=  t   iR<   R   t   prev_mappert	   to_appendR   R   t
   local_colsRR   R  (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR  R  s.    			,c         C   s2  x+t  |  D]\ } \ } } | d k }	 | t |  d k  }
 | t |  d k } | t |  d k } |	 r t | |  } | r | |  j k	 r | j |  } q nB | r | |  j k	 r t | |  j |  } n t | j |  } | r| j | | d t } q | j | d |
 d t } q W| S(   Ni    i   i   t   from_joinpointt   aliased(   R>  R   R$  R<   t   of_typeRL   t   joinR]   (   RJ   R   R  R  R   R  R?  R<   R   t   firstt   middlet   second_to_lastt   lastt   attr(    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s"    	c         C   s=   | j  |  } | j | j   } | j r9 | j | _ n  | S(   N(   R   R   t   _with_optionst   _populate_existing(   RJ   R   R  R  R  (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s
    	c         C   sP   |  j  j rL | j d } | j j t j |  j  j   } | j |   } n  | S(   Ni    (   R(   R   R.  t   _target_adaptert   copy_and_processR   R*   (   RJ   R   t	   eagerjoint   eager_order_by(    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s    	t   _SubqCollectionsc           B   s8   e  Z d  Z d Z d   Z d   Z d   Z d   Z RS(   s   Given a :class:`.Query` used to emit the "subquery load",
        provide a load interface that executes the query at the
        first moment a value is needed.

        c         C   s   | |  _  d  S(   N(   t   subq(   RJ   RS  (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRH     s    c         C   s/   |  j  d  k r |  j   n  |  j  j | |  S(   N(   t   _dataR2   t   _loadR5   (   RJ   R   R   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR5     s    c         C   s/   t  d   t j |  j d    D  |  _ d  S(   Nc         s   s8   |  ]. \ } } | g  | D] } | d  ^ q f Vq d S(   i    N(    (   R*  R   t   vt   vv(    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pys	   <genexpr>  s   c         S   s   |  d S(   Ni   (    (   t   x(    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s    (   R   t	   itertoolst   groupbyRS  RT  (   RJ   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRU    s
    c         C   s    |  j  d  k r |  j   n  d  S(   N(   RT  R2   RU  (   RJ   Rg   Rh   RT   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s    N(	   RV   RW   RX   R2   RT  RH   R5   RU  R  (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRR    s   				c         C   s  |  j  j |  j j j s/ t j d |    n  | |  j } | j | j	 d  } | d  k ra d S|  j j } | j | j	 d  }	 |	 d  k r |  j |  }	 | j | j	 d |	  n  | r g  | D] }
 | j |
 ^ q } n  |  j r |  j |	 |  S|  j |	 |  Sd  S(   NsJ   '%s' does not support object population - eager loading cannot be applied.R   t   collections(   NNN(   R.   Rt   R   t   implt   supports_populationt   sa_exct   InvalidRequestErrorR(   R5   R   R2   R#  RR  Rb   RI   R   t   _create_collection_loadert   _create_scalar_loader(   RJ   RK   RM   RN   R<   RT   RO   RS  RB  R[  RR   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRU     s$    #	c            s(       f d   } | d  d   j f S(   Nc            sR    j  t g   D] } | | ^ q  d  } |  j   j  j |  | |  d  S(   N(    (   R5   t   tupleR   R   t   set_committed_value(   Rg   Rh   RT   Ri   t
   collection(   RJ   R[  RB  (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   load_collection_from_subq  s
     	(   R2   R  (   RJ   R[  RB  Re  (    (   RJ   R[  RB  s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR`    s    c            s(       f d   } | d  d   j f S(   Nc            s    j  t g   D] } | | ^ q  d  } t |  d k rU t j d    n  | d } |  j   j  j |  | |  d  S(   Ni   sL   Multiple rows returned with uselist=False for eagerly-loaded attribute '%s' i    (   N(	   R5   Rb  R2   R   R   R   R   R   Rc  (   Rg   Rh   RT   Ri   Rd  t   scalar(   RJ   R[  RB  (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   load_scalar_from_subq  s     	
(   R2   R  (   RJ   R[  RB  Rg  (    (   RJ   R[  RB  s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRa    s    N(   RV   RW   RH   Rf   R2   RS   R  R  R  R  R  R  t   objectRR  RU   R`  Ra  (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s   		J		.	6	"	
		"	t   joinedt   JoinedLoaderc           B   sz   e  Z d  Z d   Z d   Z d d e d  Z d   Z d   Z	 d   Z
 d   Z d   Z d	   Z d
   Z d   Z RS(   sc   Provide loading behavior for a :class:`.RelationshipProperty`
    using joined eager loading.

    c         C   s)   t  t |   j |  |  j j |  _ d  S(   N(   RG   Rj  RH   R(   R  (   RJ   R.   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRH   +  s    c         C   s   |  j  j t  j |  d  S(   N(   R(   Rr   R   Rf   (   RJ   R<   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRf   /  s    	c	         K   s  | j  j s d S| |  j } d }
 | r; |  j | |  n t } | t k	 rt |  j | | | | |  \ } } } n | j | j d  s |  j	 r | j
 d |  j	 k r d Sq | j |  j  r d Sn  |  j | | | | | | | |  \ } } } } | j | j d d  } | d k	 r(| j }
 n d }
 | |  j } xH |  j j d |
  D]1 } | j | | | | d |  j d | d | qQW| d k	 rd t | j  k rt j d	   n  d S(
   s@   Add a left outer join to the statement that's being constructed.NR  i   R  t   mappersR   RP   t   chained_from_outerjoins   Detected unaliased columns when generating joined load.  Make sure to use aliased=True or flat=True when using joined loading with with_polymorphic().(   R   R  R(   R2   t   _init_user_defined_eager_procRc   t$   _setup_query_on_user_defined_adapterR
  R   R  R  R  R<   t   _generate_row_adapterR5   t   with_polymorphic_mapperst   _iterate_polymorphic_propertiest   setupRb   t   secondary_columnsR^  R_  (   RJ   RK   RL   RM   RN   RO   RP   R   Rl  RQ   t   with_polymorphict   user_defined_adaptert   clausest   add_to_collectionR  t   value(    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRS   3  sP    			c   	      C   s2  d | j  k r t S| j j } | j | j d t  } | t k	 rG | S| j  d } | d \ } } | d  k	 r t | t  r | j	 j
 |  } n  t j | d | j j } nf | j | j d  r | j | j d  } t j | j d | j j } n | j j j | j d   } | j | j d |  | S(   Nt   eager_from_aliast    user_defined_eager_row_processoriR   R  (   R{   Rc   RM   R.   R5   R   R2   R   t   strR   R   R   t   ColumnAdapterR<   R   R
  R   t
   ORMAdapterRL   R   t   _polymorphic_adaptersRb   (	   RJ   RN   RK   RM   RO   R   t   root_mapperR   R  (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRm  y  s<    		c         C   s   | j  | j |  } | rI | rI | j |  } | j | j d |  n% | rn | } | j | j d |  n  | j } | | | f S(   NRz  (   t   _get_entity_clausesR   t   wrapRb   R   t   primary_columns(   RJ   RK   RL   RM   RO   Ru  Rw  (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRn    s    	
	
	c	      
   C   s>  | j  | j d d   }	 |	 r* |	 j }
 n t j |  j d t d t }
 t j |
 d |  j j	 d t } | j
 d  k	 s~ t  |  j j t j k r t | _ n  | d  k	 r | j j  d |  j j  n	 |  j j } | s t } n  | j j |  j | | | | | | | | f	  | j } | j | j d |  | | | | f S(   NR  t   flatR+  R   t   adapt_requiredt	   innerjoint   eager_row_processor(   R5   R   R2   RL   R   R8  R<   R]   R}  R   t   aliased_classt   AssertionErrorR(   R8   R   R   t   multi_row_eager_loadersR{   R  t   create_eager_joinsR,   t   _create_eager_joinRs  Rb   (   RJ   RK   RL   RM   RN   RO   RP   R   Rl  R  t   to_adaptRv  R  Rw  (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRo    s8    				'					c	         C   s  | d  k r | j }	 n | }	 | j o0 | j j }
 d  } | | j k r |
 r | j r t j | j | j	  \ } } | d  k	 r | | } } q n  | d  k r | | j	 } } n  | j j
 | |  } | r2t | d d   r t | j |  j |  j  } q;t t j |  j | j	 d t |  j |  j  } n	 |  j } | j d  k	 sPt  | ont | t j  on| j } | r| r| d k rt j | j | j | d t } t j | j | | j d t } | j | _ n. | rt } n  t j | | j | d | } | | j | <| j	 | _ |  j j d  k r| rx^ t j  |  j j!  D]D } |	 j" j# j$ |  rP| r| j% | } n  | j& j' |  qPqPWn  |  j j( r| j) | j j* t+ j, |  j j(   7_) n  d  S(   NR  R+  t   nestedt   isouter(-   R2   R<   R  R   t   _should_nest_selectablet   eager_joinst   from_clauseR   t   find_join_sourcet
   selectablet
   setdefaultR$  R  R   R(   R   R8  R.   R]   R  R   R   t   JoinR  RF  t   rightRc   t   leftt   onclauseRN  t   stop_onR   t   _find_columnst   primaryjoint   mapped_tableRR   t   contains_columnRI   R  R,   R   RQ  RO  R   R*   (   RJ   RK   RL   RM   RO   R   Rv  R  Rl  R   t   should_nest_selectablet
   entity_keyt   indext   clauset   default_towrapt   towrapR  t   join_to_outert   innerRP  Ri   (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s    									
	c         C   s   | r |  j  | |  n t } | t k	 rl | } | j rT | rT | j | j  } q | j r | j } q n% | j | j d  } | d  k r t Sy |  j j | |  | SWn t	 k
 r t SXd  S(   NR  (
   Rm  Rc   RO   R  R5   R   R2   R<   t   identity_key_from_rowt   KeyError(   RJ   RK   RT   RO   RM   RN   Ru  t	   decorator(    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   _create_eager_adapterd  s    	c         C   s   |  j  j |  j j j s/ t j d |    n  | |  j } |  j | | | | |  } | t	 k	 r |  j }	 t
 j |  j | | |  j |  }
 |  j s |  j | |	 |
  S|  j | |	 |
  Sn( |  j j t  j | | | | | |  Sd  S(   NsJ   '%s' does not support object population - eager loading cannot be applied.(   R.   Rt   R   R\  R]  R^  R_  R(   R  Rc   R	   t   instance_processorR<   R   Ra  R`  Rr   R   RU   (   RJ   RK   RM   RN   R<   RT   RO   t   our_patht   eager_adapterR   t	   _instance(    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRU   ~  s,    	
			c            sI       f d   }     f d   }  f d   } | | d  | f S(   Nc            sK   t  j |  |   } t j | d  } |   j  |   f < | |  d  S(   Nt   append_without_event(   R   t   init_state_collectionR   t   UniqueAppender(   Rg   Rh   RT   Rd  t   result_list(   RK   R  R   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt#   load_collection_from_joined_new_row  s    		c            sv   |    f  j  k r+  j  |    f } n: t  j |  |    } t j | d  } |  j  |    f < | |  d  S(   NR  (   R   R  R   R  (   Rg   Rh   RT   R  Rd  (   R   R  RK   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt(   load_collection_from_joined_existing_row  s    	c            s     | d   d  S(   N(   R2   (   Rg   Rh   RT   (   R  (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt    load_collection_from_joined_exec  s    (   R2   (   RJ   RK   R   R  R  R  R  (    (   RK   R  R   s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR`    s    c            sF      f d   }     f d   }   f d   } | | d  | f S(   Nc            s     | d   |  <d  S(   N(   R2   (   Rg   Rh   RT   (   R  R   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   load_scalar_from_joined_new_row  s    c            sO     | d   } | d  k	 rK  | k rK | |  k	 rK t j d   n  d  S(   NsL   Multiple rows returned with uselist=False for eagerly-loaded attribute '%s' (   R2   R   R   (   Rg   Rh   RT   t   existing(   R  R   RJ   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt$   load_scalar_from_joined_existing_row  s    c            s     | d   d  S(   N(   R2   (   Rg   Rh   RT   (   R  (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   load_scalar_from_joined_exec  s    (   R2   (   RJ   RK   R   R  R  R  R  (    (   R  RJ   R   s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRa    s    N(   RV   RW   RX   RH   Rf   R2   Rc   RS   Rm  Rn  Ro  R  R  RU   R`  Ra  (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRj  #  s   		C	4		2	o		$	 c      
      s{     f d     f d   }  f d   } t  j |  d | d t d t d t t  j |  d | d t d t d t d  S(	   Nc            sz   | d  k	 rv | j   j k rv | j t j |   } | rv | | k	 rv t j d t j |  |  j	   f   qv n  | S(   Nss   Instance %s is already associated with an instance of %s via its %s attribute, and is only allowed a single parent.(
   R2   R   t	   hasparentR   t   instance_stateR^  R_  R   t   instance_strR7   (   Rg   Rx  t   oldvaluet	   initiatorR  (   R   (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt	   _do_check  s    %c            s     |  | d  |  S(   N(   R2   (   Rg   Rx  R  (   R  (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR,     s    c            s     |  | | |  S(   N(    (   Rg   Rx  R  R  (   R  (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   set_  s    R,   t   rawt   retvalR$   Rb   (   R   t   listenR]   (   R   R   R,   R  (    (   R   R  s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR-     s    (/   RX   t    R    R^  R   R   R   R   R   R   R   R   R   R   R	   R
   R   Rg   R   R   R   R   R   R   R   RY  R2   Rc   RC   t   ColumnPropertyt   strategy_forRF   t   class_loggerR]   RY   Rm   Rh  Ru   R   t   RelationshipPropertyR   R   R   R   R  Rj  R-   (    (    (    s_   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   <module>	   sd   .?1o
 4 q 