
b]c        	   @@  s  d  Z  d d l m Z d d l 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 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 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! 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* f d$     Y  Z+ e j( e j% j& d e) d e)  e j% j& d% e)  d& e f d'     Y   Z, d( e- f d)     YZ. d* e f d+     YZ/ e j( e j0 j& d% e)  d, e f d-     Y  Z1 e j( e j0 j& d. d/  e j0 j& d. e"  d0 e/ f d1     Y   Z2 e j( e j0 j& d. e)  e j0 j& d. d2  e j0 j& d. d3  e j0 j& d. d4  e j0 j& d. d5  d6 e/ e j3 f d7     Y      Z4 d8 e- f d9     YZ5 e j0 j& d. d:  d; e/ f d<     Y Z6 e j( e j0 j& d. d=  d> e/ f d?     Y  Z7 e j( e j0 j& d. d@  e j0 j& d. e#  dA e/ f dB     Y   Z8 e j( e j0 j& d. dC  dD e/ e j3 f dE     Y  Z9 dF   Z: d S(G   sW   sqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.i    (   t   absolute_importNi   (   t
   attributes(   t   exc(   t
   interfaces(   t   loading(   t
   properties(   t   query(   t
   unitofwork(   t   util(   t   _DEFER_FOR_STATE(   t   _SET_DEFERRED_EXPIRED(   t   LoaderStrategy(   t   StrategizedProperty(   t   _state_session(   t   InstanceState(   t	   _none_set(   t   aliasedi   (   t   event(   t   inspect(   t   log(   t   sql(   t   visitorsc	         @  s  t  t j |  j d g   }
 g  } | o0 |  j  | rR |  j rR | j t  n  |  j |  j	 j
 k r |  j	 j
 |  j \   | j   f d    n  | r | j t j  n  | r |  j     r | j    f d    q n  x | j D] } |  | j j |  j  k r | j j |  j  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   fnt   opts(    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   <lambda>B   s   c         @  s   t  j |      S(   N(   R   t   backref_listeners(   R   R   (   t   backreft   uselist(    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   P   s   t   parent_tokenR!   t   compare_functiont	   useobjectt	   extensiont   trackparentt   typecallablet	   callable_t   active_historyt
   impl_classt   send_modified_eventst   doc(   t   listR   t   to_listR%   R!   t   single_parentt   appendt   single_parent_validatorR   t   parentt
   validatorsR   t   track_cascade_eventst   back_populatest   self_and_descendantst   _propst   gett   class_managert   _attr_has_implR   t   register_attribute_implt   class_t	   directionR   t	   ONETOMANYt   viewonlyR,   (   R   t   mapperR$   R#   R'   R(   t   proxy_propertyR)   R*   t   kwt   attribute_extt   listen_hookst   mR   t   hook(    (   R    R   R   R!   s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   _register_attribute)   sP    				t
   instrumentt   deferredt   UninstrumentedColumnLoaderc           B@  s2   e  Z d  Z d Z d   Z d d  Z d   Z RS(   s   Represent a non-instrumented MapperProperty.

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

    t   columnsc         C@  s,   t  t |   j | |  |  j j |  _ d  S(   N(   t   superRJ   t   __init__t   parent_propertyRK   (   t   selfR2   t   strategy_key(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRM      s    c   	      K@  s;   x4 |  j  D]) } | r& | j  | } n  | j |  q
 Wd  S(   N(   RK   R0   (	   RO   t   contextt   query_entityt   patht   loadoptt   adaptert   column_collectiont   kwargst   c(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   setup_query   s    
c         C@  s   d  S(   N(    (   RO   RQ   RS   RT   R@   t   resultRU   t
   populators(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   create_row_processor   s    (   RK   N(   t   __name__t
   __module__t   __doc__t	   __slots__RM   t   NoneRY   R\   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRJ      s
   	t   ColumnLoaderc           B@  s8   e  Z d  Z d Z d   Z d   Z d   Z d   Z RS(   s8   Provide loading behavior for a :class:`.ColumnProperty`.RK   t   is_compositec         C@  sA   t  t |   j | |  |  j j |  _ t |  j d  |  _ d  S(   Nt   composite_class(   RL   Rb   RM   RN   RK   t   hasattrRc   (   RO   R2   RP   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRM      s    c         K@  sk   x4 |  j  D]) }	 | r& | j  |	 }	 n  | j |	  q
 W|  j  d }
 | rZ | j  |
 }
 n  |
 | |  j <d  S(   Ni    (   RK   R0   RN   (   RO   RQ   RR   RS   RT   RU   RV   t   memoized_populatorsRW   RX   t   fetch(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRY      s    c      	   C@  sv   t  |  _ |  j d j } |  j j pJ |  j d j pJ | j t |  j  k } t	 |  j | d t
 d | j d | d  S(   Ni    R$   R#   R)   (   t   Truet   is_class_levelRK   t   typeRN   R)   t   primary_keyt   version_id_colt   setRG   t   Falset   compare_values(   RO   R@   t   coltypeR)   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   init_class_attribute   s    		c   
      C@  s~   xw |  j  D]R } | r& | j  | } n  | j | t  }	 |	 r
 | d j |  j |	 f  Pq
 q
 W| d j |  j t f  d  S(   Nt   quickt   expire(   RK   t   _getterRn   R0   R   Rh   (
   RO   RQ   RS   RT   R@   RZ   RU   R[   t   colt   getter(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR\      s    (   RK   Rc   (   R]   R^   R_   R`   RM   RY   Rq   R\   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRb      s   			t   query_expressiont   ExpressionColumnLoaderc           B@  s,   e  Z d    Z d   Z d   Z d   Z RS(   c         C@  s   t  t |   j | |  d  S(   N(   RL   Rx   RM   (   RO   R2   RP   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRM      s    c         K@  s   | r d | j  k r | j  d g }	 x1 |	 D]) }
 | rH | j |
 }
 n  | j |
  q, W|	 d } | ry | j | } n  | | |  j <n  d  S(   Nt
   expressioni    (   t
   local_optsRK   R0   RN   (   RO   RQ   RR   RS   RT   RU   RV   Rf   RW   RK   RX   Rg   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRY      s    
c         C@  s   | r d | j  k r | j  d g } xw | D]R }	 | rH | j |	 }	 n  | j |	 t  }
 |
 r, | d j |  j |
 f  Pq, q, W| d j |  j t f  n  d  S(   NRy   Rr   Rs   (   Rz   RK   Rt   Rn   R0   R   Rh   (   RO   RQ   RS   RT   R@   RZ   RU   R[   RK   Ru   Rv   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR\     s    c      	   C@  s<   t  |  _ t |  j | d t d |  j d j j d t d  S(   NR$   R#   i    t   accepts_scalar_loader(   Rh   Ri   RG   RN   Rn   RK   Rj   Ro   (   RO   R@   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRq     s    	(   R]   R^   RM   RY   R\   Rq   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRx      s   			t
   do_nothingt   DeferredColumnLoaderc           B@  sD   e  Z d  Z d Z d   Z d   Z d   Z d	 d  Z d   Z	 RS(
   sA   Provide loading behavior for a deferred :class:`.ColumnProperty`.RK   t   groupc         C@  s\   t  t |   j | |  t |  j d  r: t d   n  |  j j |  _ |  j j |  _ d  S(   NRd   s8   Deferred loading for composite types not implemented yet(   RL   R}   RM   Re   RN   t   NotImplementedErrorRK   R~   (   RO   R2   RP   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRM   ,  s    c   	      C@  sP   |  j  s2 |  j j } | d j |  j | f  n | d j |  j t f  d  S(   Nt   newRs   (   Ri   RN   t   _deferred_column_loaderR0   R   Rn   (	   RO   RQ   RS   RT   R@   RZ   RU   R[   t   set_deferred_for_local_state(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR\   5  s    	c         C@  sE   t  |  _ t |  j | d t d |  j d j j d |  j d t d  S(   NR$   R#   i    R(   t   expire_missing(	   Rh   Ri   RG   RN   Rn   RK   Rj   Ro   t   _load_for_state(   RO   R@   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRq   E  s    		c	   
   	   K@  s   | r3 d | j  k r3 t |  j  j |  j j  ss | r^ |  j r^ | j  j d |  j t  ss | r |  j	 | k r |  j
 j d t f d t f f  j | | | | | | | |	  n& |  j r t | |  j
 <n t | |  j
 <d  S(   Nt   undefer_pkss   undefer_group_%sRI   RH   (   Rz   Rm   RK   t   intersectionR2   t   _should_undefer_in_wildcardR~   R8   Rn   R   RN   t   _get_strategyRh   RY   Ri   R
   R	   (
   RO   RQ   RR   RS   RT   RU   RV   Rf   t   only_load_propsRB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRY   Q  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@   R~   t   iterate_propertiest
   isinstanceR   t   strategyR}   t
   unmodifiedR   Ra   t   orm_exct   DetachedInstanceErrorR   t	   state_strR   R   t   load_on_identt   ObjectDeletedErrort   ATTR_WAS_SET(
   RO   t   statet   passivet   localparentt   pt   toloadt   kR~   t   sessionR   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s0    		$(	(   RK   R~   N(
   R]   R^   R_   R`   RM   R\   Rq   Ra   RY   R   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR}   $  s   				&t   LoadDeferredColumnsc           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   (   RO   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRM     s    c         C@  s?   |  j  } | j j } | j | } | j t } | j | |  S(   N(   R   R   R@   R7   t   _strategiesR}   R   (   RO   R   R   R   R   R   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   __call__  s
    	(   R]   R^   R_   RM   R   t   PASSIVE_OFFR   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s   	t   AbstractRelationshipLoaderc           B@  s   e  Z d  Z d Z d   Z RS(   s0   LoaderStratgies which deal with related objects.R@   t   targetR!   t   entityc         C@  sY   t  t |   j | |  |  j j |  _ |  j j |  _ |  j j |  _ |  j j |  _ d  S(   N(   RL   R   RM   RN   R@   R   R   R!   (   RO   R2   RP   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRM     s
    (   R@   R   R!   R   (   R]   R^   R_   R`   RM   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s   t   DoNothingLoaderc           B@  s   e  Z d  Z RS(   s   Relationship loader that makes no change to the object's state.

    Compared to NoLoader, this loader does not initialize the
    collection/attribute to empty/none; the usual default LazyLoader will
    take effect.

    (   R]   R^   R_   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s   	t   lazyt   noloadt   NoLoaderc           B@  s&   e  Z d  Z d Z d   Z d   Z RS(   sY   Provide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=None".

    c         C@  s/   t  |  _ t |  j | d t  d |  j j d  S(   NR$   R'   (   Rh   Ri   RG   RN   t   collection_class(   RO   R@   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRq     s    	c   	      @  s-     f d   } | d j    j | f  d  S(   Nc         @  s<     j  r+ |  j j   j  j |  |  n d  |   j <d  S(   N(   R!   R   t   get_implR   t
   initializeRa   (   R   t   dict_t   row(   RO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   invoke_no_load  s    	"R   (   R0   R   (	   RO   RQ   RS   RT   R@   RZ   RU   R[   R   (    (   RO   s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR\     s    (    (   R]   R^   R_   R`   Rq   R\   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s   	
t   selectt   raiset   raise_on_sqlt   baked_selectt
   LazyLoaderc           B@  s   e  Z d  Z d Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 e j d  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.

    t
   _lazywheret   _rev_lazywheret   use_gett   is_aliased_classt   _bind_to_colt   _equated_columnst   _rev_bind_to_colt   _rev_equated_columnst   _simple_lazy_clauset   _raise_alwayst   _raise_on_sqlt   _bakeryc         C@  s  t  t |   j | |  |  j d d k |  _ |  j d d k |  _ t |  j  j |  _ |  j	 j
 } | j   \ |  _ |  _ |  _ | j d t  \ |  _ |  _ |  _ |  j j d |  |  j  |  j o |  j o |  j j d j |  j d t d |  j j |  _ |  j rx[ t |  j  D]J } | |  j j k rx/ |  j j | D] } |  j | |  j | <qHWqqW|  j j d	 |   n  d  S(
   NR   R   R   t   reverse_directions   %s lazy loading clause %si    t   use_proxiest   equivalentss2   %s will use query.get() to optimize instance loads(   RL   R   RM   t   strategy_optsR   R   R   R   R   RN   t   _join_conditiont   create_lazy_clauseR   R   R   Rh   R   R   R   t   loggert   infoR!   t   _get_clauset   compareR@   t   _equivalent_columnsR   R-   (   RO   R2   RP   t   join_conditionRu   RX   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRM     s*    $


			c         C@  si   t  |  _ |  j j p1 |  j j t j k	 p1 |  j } t |  j | d t  d |  j	 d |  j j
 d | d  S(   NR$   R(   R'   R)   (   Rh   Ri   RN   R)   R=   R   t	   MANYTOONER   RG   R   R   (   RO   R@   R)   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRq   >  s    	
		c         @  st   |  j  |  j }   g   d   } t j | i  i | d 6    f d   } t j | i  i | d 6 } |  f S(   Nc         S@  s   t  |  _ d  S(   N(   Rn   t   unique(   t	   bindparam(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   visit_bindparam[  s    R   c         @  sd   |  j    k r2  j |  j   |  j  d  f  n. |  j d  k r`  j |  j d  |  j f  n  d  S(   N(   t   _identifying_keyR0   R   Ra   t   callablet   value(   R   (   t   bind_to_colt   params(    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   `  s    
(   R   R   R   t   traverset   cloned_traverse(   RO   t	   criterionR   (    (   R   R   s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt"   _memoized_attr__simple_lazy_clauseV  s    	c         C@  s  |  j  \ } } | d  k rG t j | g  | D] \ } } } | ^ q+  S|  j j } | j   }	 t j |	  }
 | t j	 @r | t j	 N} n  i  } xv | D]n \ } } } | d  k	 r | r | t j
 @r | j | |
 | |  } q | j | |
 | |  } n  | | | <q W| | f S(   N(   R   Ra   t   sql_utilt   adapt_criterion_to_nullRN   R2   t   objR   t   instance_dictt   INIT_OKt   LOAD_AGAINST_COMMITTEDt#   _get_committed_state_attr_by_columnt   _get_state_attr_by_column(   RO   R   R   R   t
   param_keysR   t   identR   R@   t   oR   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   _generate_lazy_clauser  s&    &c         C@  s   t  j d |  | f   d  S(   Ns&   '%s' is not available due to lazy='%s'(   t   sa_exct   InvalidRequestError(   RO   R   R   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   _invoke_raise_load  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 S|  j r | t j @r |  j | | d  n  t |  } | s | t j @r t j St j d t j |  |  j  f   n  |  j	 r|  j | | |  } t j | k r$t j St j | k r:t j St j |  rMd  S| j   j |  j | d | d | } | d  k	 r| S| t j @s| t j @rt j Sn  |  j | | | |  S(   NR   sb   Parent instance %s is not bound to a Session; lazy load operation of attribute '%s' cannot proceedR   t   lazy_loaded_from(   R   RN   t   load_on_pendingt   _load_pendingt
   session_idR   R   Ra   R   R   t   NON_PERSISTENT_OKR   R   t   NO_RAISER   R   R   R   R   R   t   _get_ident_for_use_gett	   NEVER_SETR   t
   issupersetR   t   _identity_lookupR   t   RELATED_OBJECT_OKt   _emit_lazyload(   RO   R   R   t   pendingt   primary_key_identityR   t   instance(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     sP    



		
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   dictRk   R   (   RO   R   R   R   t   instance_mappert   get_attrR   t   pk(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s    		s   sqlalchemy.ext.bakedc         C@  s   | j  d d  S(   Nt   sizei2   (   t   bakery(   RO   t   baked(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   _memoized_attr__bakery  s    s   sqlalchemy.orm.strategy_optionsc         @  s   j   f d     } | j d    j   j j sP | j d t  n   j j d  k	 r{ | j  f d    n   j } | s | t	 j
 @r | j d    n   j r  j  j } | j  j |  n   j r6 j r j  | d  n  | |  j  f d    j | j  j  |  S j j r[| j  f d    n  x^  j j D]P   j t j k rh j rht  j t  rh| j   f d	    qhqhW j  |  \    | rt j  t! j"  j#    rd  Sn t j  t! j$  j#    rd  S j r: j  | d  n  | j   f d
     f d   }	 | |  j  f d    j |	  j%   }
  j& r|
 St' |
  } | r| d k rt j( d  j  n  |
 d Sd  Sd  S(   Nc         @  s   |  j    j  S(   N(   R   R   (   R   (   RO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     t    c         S@  s   |  j    j t  S(   N(   t   _adapt_all_clausest   _with_invoke_all_eagersRn   (   t   q(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     R  t   fullc         @  s   |  j    j   j j  S(   N(   t   select_fromR@   RN   t	   secondary(   R  (   RO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s   c         S@  s   |  j  t  S(   N(   t	   autoflushRn   (   R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR      R  R   c         @  s   |  j     S(   N(   t   _set_lazyload_from(   R  (   R   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   2  R  c         @  s   |  j  t j   j j     S(   N(   t   order_byR   R.   RN   (   R  (   RO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   :  s   c         @  s/   |  j   j j |  j   j  j   j   S(   N(   t   optionst   Loadt   for_existing_patht   _current_pathR2   t   lazyloadR   (   R  (   t   revt   strategy_options(    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   I  s   	c         @  s   |  j     S(   N(   t   filter(   R  (   t   lazy_clause(    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   \  R  c         @  s     j  |  j    |  _ |  S(   N(   t   updatet   _params(   R  (   R   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   set_default_params`  s    	c         @  s   |  j     S(   N(   R	  (   R  (   R   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   g  R  i   sK   Multiple rows returned with uselist=False for lazily-loaded attribute '%s' i    ()   R   t   add_criteriaRN   t   bake_queriest   spoilRh   R  Ra   R   R   t   NO_AUTOFLUSHt   load_optionst	   load_patht   _add_lazyload_optionsR   R   R   t   with_post_criteriat   _load_on_pk_identityR   R@   R
  t   _reverse_propertyR=   R   R   t   _use_getR   R   R   R   R   t   has_intersectionR   R   t   valuest
   _never_sett   allR!   t   lent   warn(   RO   R  R   R   R   R   R  R   t   effective_pathR  RZ   t   l(    (   R  R   R  RO   R   R  s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     sj    

						c   
      @  s   |  j    |  j sP t j | j t   |      } | d j |  j  | f  n> | j sb | j r   f d   }	 | d j |  j  |	 f  n  d  S(   NR   c         @  s   |  j  |    d  S(   N(   t   _reset(   R   R   R   (   R   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   reset_for_lazy_callable  s    	(	   R   Ri   R   t"   _instance_level_callable_processorR9   t   LoadLazyAttributeR0   t   populate_existingt   always_refresh(
   RO   RQ   RS   RT   R@   RZ   RU   R[   t   set_lazy_callableR+  (    (   R   s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR\   {  s    		
(   R   R   R   R   R   R   R   R   R   R   R   R   (   R]   R^   R_   R`   RM   Rq   R   R   R   R   R   R   t   dependenciesR   R   R\   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s.   
           	/			 		F	R-  c           B@  s&   e  Z d  Z d   Z e j d  Z RS(   s-   serializable loader object used by LazyLoaderc         C@  s   | |  _  | j |  _ d  S(   N(   R   RP   (   RO   R   t   initiating_strategy(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRM     s    	c         C@  sB   |  j  } | j j } | j | } | j |  j } | j | |  S(   N(   R   R   R@   R7   R   RP   R   (   RO   R   R   R   R   R   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s
    	(   R]   R^   R_   RM   R   R   R   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR-    s   	t	   immediatet   ImmediateLoaderc           B@  s/   e  Z d Z d    Z d d d  Z d   Z RS(   c         C@  s   |  j  j d  j |  d  S(   NR   R   (   R   R   (   (   R   R   (   RN   R   Rq   (   RO   R@   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRq     s    		c   	      K@  s   d  S(   N(    (	   RO   RQ   R   RS   RT   RU   RV   t   parentmapperRW   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRY     s    c   	      @  s-     f d   } | d j    j | f  d  S(   Nc         @  s    |  j    j  j |  |  d  S(   N(   R   R   R8   (   R   R   R   (   RO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   load_immediate  s    t   delayed(   R0   R   (	   RO   RQ   RS   RT   R@   RZ   RU   R[   R6  (    (   RO   s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR\     s    (    N(   R]   R^   R`   Rq   Ra   RY   R\   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR4    s
   	t   subqueryt   SubqueryLoaderc           B@  s   e  Z d 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(   t
   join_depthc         C@  s,   t  t |   j | |  |  j j |  _ d  S(   N(   RL   R9  RM   RN   R:  (   RO   R2   RP   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRM     s    c         C@  s   |  j  j d  j |  d  S(   NR   R   (   R   R   (   (   R   R   (   RN   R   Rq   (   RO   R@   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRq     s    		c         K@  s4  | j  j s d  S| j  j r/ | j  j d  n  | |  j } | j | j d d   }	 |	 d  k	 rl |	 j }
 n	 |  j }
 | j j d t	 j
 j  } | | } | j | j d  s|  j r | j  j r | j  j j n d | 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(
   NR8  t   path_with_polymorphict   subquery_patht   loaderi    i   t
   orig_query(   R<  N(   R<  N(!   R   t   _enable_eagerloadst
   _yield_pert   _no_yield_perRN   R8   R   Ra   R   R   t   PathRegistryt   roott   containsR:  R  t   lengtht   contains_mapperR@   t   _get_leftmostR9  t   _generate_from_original_queryt   entity_zeroR   t   _attributest   _set_enable_single_critRn   t   _prep_for_joinsR
  t   add_columnst   _apply_joinst   _setup_optionst   _setup_outermost_orderbyRm   (   RO   RQ   R   RS   RT   RU   RV   R5  RW   t   with_poly_infot   effective_entityt	   subq_patht   leftmost_mappert   leftmost_attrt   leftmost_relationshipR>  t
   left_aliasR  t   to_joint
   local_attrt   parent_alias(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRY     sZ    		
		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   (   RS   R   t   _class_to_mapperR2   t   isaRN   t   local_columnst   getattrR   t   _columntopropertyR   (   RO   RS  t   subq_mapperRT  t   leftmost_propt   leftmost_colsRX   RU  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRG  >  s    		0c         C@  so  | j    j d   } | j sg | j t t g  | j D]  } | d d  k	 r4 | d ^ q4   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 rA| j d  k rAd  | _ n  | j   j   } t j | | d t } | S(   NR   c         s@  s   |  ] } | j  Vq d  S(   N(   t   table(   t   .0RX   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pys	   <genexpr>  s    t   use_mapper_path(   t   _clonet	   correlateRa   t	   _from_objt   _set_select_fromR-   Rm   t   column_descriptionsRn   t   _adapt_col_listt   _set_entitiest   distinct_target_keyRh   t	   _distinctR   Rk   t	   _order_byR
  t   _limitt   _offsett   with_labelsR8  R   t   AliasedClass(   RO   R>  RT  RU  RV  t   orig_entityR  t   entt   target_colsRm  t   tt   embed_qRW  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRH  V  s6    
	#
		c         C@  s:  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 | }
 nA t | d d  } | j	 r | j
 }
 n t j | j
 d t }
 |  j j } g  | D]" } t |
 |  j j | j  ^ q} | | |
 f S(   Ni    i   i   iRe  (   R-   t   pairst	   enumerateR@   R\  R0   R   R&  R   R   R   R   Rs  Rh   RN   R]  R^  R2   R_  (   RO   RW  RS  RX  Ry  t   iR@   R   t   prev_mappert	   to_appendRZ  R   t
   local_colsRX   RY  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRL    s&    		,c         C@  s  t  |  } | d k r> t | | d d  j |  g } ny| d k r t | | d d  j |  t | | d d  j |  g } n*| d k rg  | d d !D]C } t | d  j s t j | d  n
 | d j | d f ^ q } g  }	 xl | rd| j d  } t | d | d  }
 | rE|
 j | d d  }
 n |
 j |  }
 |	 j	 |
  q Wt | | d d  j |	 d j
  g |	 t | | d d  j |  g } n  x# | D] }
 | j |
 d t } qW| S(   Ni   i    i   it   from_joinpoint(   R&  R^  t   of_typeR   R   R   Rs  R   t   popR0   R2   t   joinRh   (   RO   R  RX  RW  RZ  RR  t   ltjt   itemt   middlet   innert   attr(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRN    s0    &T	+c         C@  s=   | j  |  } | j | j   } | j r9 | j | _ n  | S(   N(   t   _with_current_patht   _conditional_optionst   _with_optionst   _populate_existing(   RO   R  RS  R>  RR  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRO    s
    	c         C@  sP   |  j  j rL | j d } | j j t j |  j  j   } | j |   } n  | S(   Ni    (   RN   R
  Rh  t   _target_adaptert   copy_and_processR   R.   (   RO   R  t	   eagerjoint   eager_order_by(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRP    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(   RO   R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRM     s    c         C@  s/   |  j  d  k r |  j   n  |  j  j | |  S(   N(   t   _dataRa   t   _loadR8   (   RO   R   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR8     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(    (   Rd  R   t   vt   vv(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pys	   <genexpr>%  s   c         S@  s   |  d S(   Ni   (    (   t   x(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   &  R  (   R   t	   itertoolst   groupbyR  R  (   RO   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR  #  s    c         C@  s    |  j  d  k r |  j   n  d  S(   N(   R  Ra   R  (   RO   R   R   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR=  )  s    N(	   R]   R^   R_   Ra   R  RM   R8   R  R=  (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s   			c         C@  s9  |  j  j |  j j j s/ t j d |    n  | |  j } | j | j	 d  } | d  k ra d  S| j | j k s t d   |  j j }	 | j | j	 d  }
 |
 d  k r |  j |  }
 | j | j	 d |
  n  | r g  |	 D] } | j | ^ q }	 n  |  j r|  j | |
 |	 |  n |  j | |
 |	 |  d  S(   NsJ   '%s' does not support object population - eager loading cannot be applied.R8  sl   Subquery session doesn't refer to that of our context.  Are there broken context caching schemes being used?t   collections(   R2   R9   R   t   implt   supports_populationR   R   RN   R8   R   Ra   R   t   AssertionErrorR]  R  Rm   RK   R!   t   _create_collection_loadert   _create_scalar_loader(   RO   RQ   RS   RT   R@   RZ   RU   R[   R  R~  R  RX   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR\   -  s,    	#	c         @  s       f d      f d   } | d j   j  f  | d j   j | f  | j r | d j   j   j f  n  d  S(   Nc         @  sR     j  t g   D] } | | ^ q  d  } |  j  j  j |  | |  d  S(   N(    (   R8   t   tupleR   R   t   set_committed_value(   R   R   R   Ru   t
   collection(   R  R~  RO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   load_collection_from_subq\  s    )c         @  s&    j  | k r"   |  | |  n  d  S(   N(   R   (   R   R   R   (   R  RO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt&   load_collection_from_subq_existing_rowd  s    R   t   existingt   eager(   R0   R   t   invoke_all_eagersR=  (   RO   RQ   R  R~  R[   R  (    (   R  R  R~  RO   s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR  Y  s    
	c         @  s       f d      f d   } | d j   j  f  | d j   j | f  | j r | d j   j   j f  n  d  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(	   R8   R  Ra   R&  R   R'  R   R   R  (   R   R   R   Ru   R  t   scalar(   R  R~  RO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   load_scalar_from_subqs  s    )
c         @  s&    j  | k r"   |  | |  n  d  S(   N(   R   (   R   R   R   (   R  RO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt"   load_scalar_from_subq_existing_row  s    R   R  R  (   R0   R   R  R=  (   RO   RQ   R  R~  R[   R  (    (   R  R  R~  RO   s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR  p  s    
	(   R:  N(   R]   R^   R`   RM   Rq   Ra   RY   RG  RH  RL  RN  RO  RP  t   objectR  R\   R  R  (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR9    s   		[		A	/	4	
		,	t   joinedt   JoinedLoaderc           B@  s   e  Z d  Z d Z d   Z d   Z d d e d  Z d   Z	 d   Z
 d   Z d	   Z d
   Z e d  Z d   Z d   Z d   Z d   Z RS(   sc   Provide loading behavior for a :class:`.RelationshipProperty`
    using joined eager loading.

    R:  t   _aliased_class_poolc         C@  s5   t  t |   j | |  |  j j |  _ g  |  _ d  S(   N(   RL   R  RM   RN   R:  R  (   RO   R2   RP   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRM     s    c         C@  s   |  j  j d  j |  d  S(   NR   R   (   R   R   (   (   R   R   (   RN   R   Rq   (   RO   R@   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRq     s    		c	         K@  s  | j  j s d S| j  j r8 |  j r8 | j  j d  n  | |  j } d }
 | rc |  j | |  n t } | t k	 r |  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	 rP| j }
 n d }
 | |  j } t j | |  j | | | | d |
 d |  j d | | 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.Ns   joined collectionR=  i   R;  t   with_polymorphicR5  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@  R!   RA  RN   Ra   t   _init_user_defined_eager_procRn   t$   _setup_query_on_user_defined_adapterRD  R   R:  RE  RF  R@   t   _generate_row_adapterR8   t   with_polymorphic_mappersR   R   t   _setup_entity_queryRm   t   secondary_columnsR   R   (   RO   RQ   RR   RS   RT   RU   RV   R5  R  RW   R  t   user_defined_adaptert   clausest   add_to_collectionRQ  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRY     s\    !		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;  (   Rz   Rn   RS   R2   R8   R   Ra   R   t   strR   t   aliasR   t   ColumnAdapterR@   R   RD  R   t
   ORMAdapterR   R   t   _polymorphic_adaptersRm   (	   RO   RT   RQ   RS   RU   R  t   root_mapperR   RQ  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s2    	c         C@  s   | j  | j |  } | rI | rI | j |  } | j | j d |  n% | rn | } | j | j d |  n  | j } | | | f S(   NR  (   t   _get_entity_clausesR   t   wrapRm   R   t   primary_columns(   RO   RQ   R   RS   RU   R  R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR  /  s    

	c         C@  s   t  |  j  j r' t  |  j  j } n d  } d |  f } | | j k r\ d | j | <} n | j | d | j | <} | t |  j  k r t j	 |  j
 d | d  k	 r | j d t  n d  d t d t } t  |  j j |  j j |  n  |  j | S(   Nt   joinedloader_aci    i   R  t   flatRe  (   R   R   R   t
   selectableRa   R   R&  R  R   Rs  R@   R  Rh   RX   R0   (   RO   RQ   t   alt_selectableR   t   idxt   to_adapt(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   _gen_pooled_aliased_classI  s"    		c	         C@  sG  | j  | j d d   }	 |	 r* |	 j }
 n |  j |  }
 t |
  j d |  f t j |
 d |  j	 j
 d t d t d t } | j d  k	 s t  |  j j 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   joinedloader_ormadapterR   t   adapt_requiredt   allow_label_resolvet   anonymize_labelst	   innerjoint   eager_row_processor(   R8   R   Ra   R   R  R   t   _memoR   R  R@   R   Rh   Rn   t   aliased_classR  RN   R!   t   multi_row_eager_loadersRz   R  t   create_eager_joinsR0   t   _create_eager_joinR  Rm   (   RO   RQ   R   RS   RT   RU   RV   R5  R  RQ  R  R  R  R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR  l  sB    		'		
	c	      
   C@  s	  | d  k r | j }	 n | }	 | j o0 | j j }
 d  } | | j k r |
 r | j r t j | j | j	  } t
 |  d k r t j d   n  | r | j | d } | d | } } q n  | d  k r | | j	 } } n  | j j | |  } | rt | d d   r_t | j  j |	 j |  j  r5|	 n |  j  } t | j |  j |  j  } qt t j |  j | j	 d t |  j |  j  } n	 |  j } | j d  k	 st  | p| p| d k p| j j } | r4t j | | j | d | p| j j p| ot | t j   d |  j d	 |  j } n |  j! | | | |  } | | j | <| j	 | _" | sx^ t j# |  j j$  D]D } |	 j% j& j' |  r| r| j( | } n  | j) j* |  qqWn  |  j j+ r| j, | j- j. t/ j0 |  j j+   7_, n  d  S(
   Ni   s   Can't identify which query entity in which to joined eager load from.   Please use an exact match when specifying the join path.i    R  Re  t   unnestedt   isoutert
   _left_memot   _right_memo(1   Ra   R@   R  R   t   _should_nest_selectablet   eager_joinst   from_clauseR   t#   find_left_clause_that_matches_givenR  R&  R   R   t
   setdefaultR^  R   R  t   _entity_for_mapperR\  R2   R   R   RN   R   Rs  Rh   R  RI  t   represents_outer_joint   _ORMJoinR   R   t   Joint   _splice_nested_inner_joint   stop_ont   _find_columnst   primaryjoint   persist_selectableRX   t   contains_columnRK   R  R0   R
  R  R  R  R   R.   (   RO   RQ   RR   RS   RU   R5  R  R  R  R   t   should_nest_selectablet   query_entity_keyt   indexest   clauset   default_towrapt   towrapt   efmt   onclauset   attach_on_outsideR  Ru   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s    							c   	      C@  s  | t  k r' t | t j  s t  n t | t j j  rX |  j | | j	 | | |  St | t j  s | d | k r t j | | j
 | d t  d | d | d j Sd  Sn  |  j | | j | | | j  } | d  k r/t  } |  j | | j | | | j  } | d  k r5| t  k	 s(t d   d  Sn t } | r| j ra| j ra| j |  } qt j | j | | j d | j d | j } n- t j | | j | j d | j d | j } | j | _ | S(   NiR  R  R  is9   assertion failed attempting to produce joined eager loads(   Rn   R   R   R  R  R   R  t   FromGroupingR  t   elementR  R@   Ra   t   rightR  t   leftR  Rh   R  t   _splice_into_centerR  R  (	   RO   RS   t   join_objR  R  t   splicingt   target_joint   right_spliceR  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR  ;  sV    					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 S|  j j | |  r | St Sd  S(   NR  (	   R  Rn   RU   R  R8   R   Ra   R@   t   _result_has_identity_key(   RO   RQ   RZ   RU   RS   RT   R  t	   decorator(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   _create_eager_adapter  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 | |
 | |  q |  j | |
 | |  n+ |  j j d  j | | | | | | |  d  S(   NsJ   '%s' does not support object population - eager loading cannot be applied.R   R   (   R   R   (   (   R   R   (   R2   R9   R   R  R  R   R   RN   R  Rn   R   t   _instance_processorR@   R   R!   R  R  R   R\   (   RO   RQ   RS   RT   R@   RZ   RU   R[   t   our_patht   eager_adapterR   t	   _instance(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR\     s,    	
				c         @  s       f d   }     f d   }   f d   } | d j  |  j | f  | d j  |  j | f   j r | d j  |  j | f  n  d  S(   Nc         @  sf   t  j |  |   } t j | d  } |  j  |   f <  |  } | d  k	 rb | j |  n  d  S(   Nt   append_without_event(   R   t   init_state_collectionR   t   UniqueAppenderRa   R0   (   R   R   R   R  t   result_listt   inst(   R  RQ   R   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt#   load_collection_from_joined_new_row  s    c         @  s   |   f  j  k r+  j  |   f } n: t  j |  |   } t j | d  } |  j  |   f <  |  } | d  k	 r | j |  n  d  S(   NR  (   R   R  R   R  Ra   R0   (   R   R   R   R  R  R  (   R  RQ   R   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt(   load_collection_from_joined_existing_row  s    c         @  s     |  d  S(   N(    (   R   R   R   (   R  (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt    load_collection_from_joined_exec  s    R   R  R  (   R0   R   R  (   RO   RQ   R   R  R[   R  R  R	  (    (   R  RQ   R   s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s    


	
c         @  s      f d   }     f d   }   f d   } | d j   j | f  | d j   j | f  | j r | d j   j | f  n  d  S(   Nc         @  s     |  |  <d  S(   N(    (   R   R   R   (   R  R   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   load_scalar_from_joined_new_row  s    c         @  sM     |  }  | k r? | |  k	 rI t  j d   qI n
 | |  <d  S(   NsL   Multiple rows returned with uselist=False for eagerly-loaded attribute '%s' (   R   R'  (   R   R   R   R  (   R  R   RO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt$   load_scalar_from_joined_existing_row  s    c         @  s     |  d  S(   N(    (   R   R   R   (   R  (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   load_scalar_from_joined_exec	  s    R   R  R  (   R0   R   R  (   RO   RQ   R   R  R[   R
  R  R  (    (   R  R   RO   s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s    
	
(   R:  R  N(   R]   R^   R_   R`   RM   Rq   Ra   Rn   RY   R  R  R  R  R  R  R  R\   R  R  (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s"   		U	0		#	@	E		'	,t   selectint   SelectInLoaderc           B@  s   e  Z d Z e j d d d d	 d
 d d g  Z d Z d   Z d   Z d   Z	 d   Z
 d   Z e j d  d    Z d   Z e j d  d    Z d   Z d   Z RS(   R:  t	   omit_joint   _parent_aliast   _query_infot   _fallback_query_infoR   t	   queryinfot   load_only_childt   load_with_joint   in_exprt   pk_colst   zero_idxt   child_lookup_colsi  c         C@  s  t  t |   j | |  |  j j |  _ |  j j t j k } |  j j d  k	 ra |  j j |  _ nX |  j j
 d  } | r | j |  _ n1 |  j j d j | j d t d |  j j |  _ |  j r | r |  j   |  _ |  j   |  _ q
|  j   |  _ n |  j   |  _ d  S(   NR   R   i    R   R   (   R   R   (   (   R   R   (   RL   R  RM   RN   R:  R=   R   R   R  Ra   R   R   R2   R   R   R   Rh   R   t   _init_for_omit_join_m2oR  t   _init_for_joinR  t   _init_for_omit_join(   RO   R2   RP   t   is_m2ot
   lazyloader(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRM   0  s&    				c         @  s   t   j j j      j    f d   t    D  g   j j D] } |   k rH   | ^ qH } } t |  d k r t	 j
 |   } t } n | d } t }  j t t | | | d   S(   Nc         3@  s>   |  ]4 }  j  j j | d  D] } |   | f Vq q d  S(   N(    (   R2   R   R8   (   Rd  R   t   equiv(   t   pk_to_fkRO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pys	   <genexpr>Q  s   i   i    (   R   RN   R   t   local_remote_pairsR  R-   R2   Rk   R&  R   t   tuple_Rn   Rh   t
   query_infoRa   (   RO   Ru   R  t   fk_colsR  R  (    (   R   RO   s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR  L  s    3	
c         C@  s   |  j  j } t |  d k r6 t j |   } t } n | d } t } |  j j d  } g  | D] } | j	 | ^ q_ } |  j
 t t | | | |  S(   Ni   i    R   R   (   R   R   (   (   R   R   (   R@   Rk   R&  R   R"  Rn   Rh   RN   R   R   R#  (   RO   R  R  R  R  R   t   lookup_cols(    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR  b  s    	
 c         C@  s   t  |  j j  |  _ t |  j  } g  |  j j D] } | j |  ^ q1 } t |  d k rv t j	 |   } t
 } n | d } t } |  j t
 t | | | d   S(   Ni   i    (   R   R2   R<   R  R   Rk   t   _adapt_elementR&  R   R"  Rn   Rh   R#  Ra   (   RO   t   pa_inspRu   R  R  R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR  r  s    (	
c         C@  s   |  j  j d  j |  d  S(   NR   R   (   R   R   (   (   R   R   (   RN   R   Rq   (   RO   R@   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRq     s    		s   sqlalchemy.ext.bakedc         C@  s   | j  d d  S(   NR   i2   (   R   (   RO   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s    c         C@  sZ  |  j  j |  j j j s/ t j d |    n  | j j pD t	 j
 j | } t	 j | d |  j   sh d  St j j | | |  j  r d  S| |  j }	 | |  j }
 |	 j | j d d   } | d  k	 r | j } n	 |  j } |	 j | j d  s.|  j r|
 j d |  j k r+d  Sq.|
 j |  j  r.d  Sn  t j j | | |  j  |  j |  j |  d  S(   NsJ   '%s' does not support object population - eager loading cannot be applied.iR;  R=  i   (   R2   R9   R   R  R  R   R   R   R  R   RB  RC  t   _entity_isaR   t   PostLoadt   path_existsRN   R8   R   Ra   R   RD  R:  RE  RF  R@   t   callable_for_patht   _load_for_path(   RO   RQ   RS   RT   R@   RZ   RU   R[   t   selectin_patht   path_w_propt   selectin_path_w_propRQ  RR  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR\     s<    			c         @  s[  | r  j  | k r d  S j } | j r t j t  } g  }	  j  x | D] \  }
  j  t    f d   | j	 D  } t
 j | k r  j } Pn  d  | k r | | j   |
 f  qP |	 j   |
 f  qP Wn  | j s-g  | D]( \  }
  j  d   j |
 f ^ q } n  | j  | j  | j st   } | j rg   D] } | j |  ^ qd | j    g   D] } | j |  ^ q qn   j   f d     } | j s| j  f d    n%  j  | j    f d    | j r=| j  f d    n | j   f d    | j } | j | j |  j  | j r| j d    n   j j r| j s j j   | j rg    D] } | j |  ^ q  n  | j   f d	    q f d
   } | j |  n  | j rA j | |	 | | |  n  j | | | |  d  S(   Nc         3@  s-   |  ]# }   j    | d  t j Vq d S(   R   N(   R   R   t   PASSIVE_NO_FETCH(   Rd  t   lk(   R@   R   t
   state_dict(    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pys	   <genexpr>  s   i   c         @  s   |  j  t  j d      S(   NR   (   R   t   Bundle(   R   (   RR  R  (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR     s   c         @  s   |  j     S(   N(   R  (   R  (   RR  (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   	  R  c         @  s.   |  j    j t   j j  j     S(   N(   R  R  R^  RN   R   R  (   R  (   RR  t   paRO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   	  s   c         @  s%   |  j    j t j d d t   S(   Nt   primary_keyst	   expanding(   R  t   in_R   R   Rh   (   R  (   R  (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   	  s   c         @  s.   |  j    j t j d d t   j    S(   NR5  R6  (   R  R7  R   R   Rh   R
  (   R  (   R  R  (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   !	  s   !c         S@  s
   |  j    S(   N(   R.  (   R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   -	  R  c         @  s   |  j      S(   N(   R
  (   R  (   R  (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   6	  R  c         @  s5   |  j  d } |  j | j j t j   j j     S(   Ni    (   Rh  R
  R  R  R   R.   RN   (   R  R  (   RO   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyRP  9	  s    	(    R   R  R  R  t   defaultdictR-   R2   R   R  R  R   R   R  Ra   R0   R  R  R  R   R   R&  R   R  R  R   R  R  RN   R  R
  t   _load_via_childt   _load_via_parent(   RO   R   RQ   RS   t   statest	   load_onlyRR  R#  t
   our_statest   none_statest	   overwritet   related_identt   inspRu   R  R>  t   elemRP  (    (	   R  RR  R  R@   R4  R  RO   R   R2  s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR,    sx    					
	5				"(								%	c         C@  sn  |  j  } t |  } x | r| d |  j !} | |  j } d   | | j  j d g  | D] }	 | j rs |	 d n |	 ^ qZ  D }
 x | D] }	 |
 j |	 d   } xe | |	 D]Y \ } } } | r |  j | k r q n  | j	 |  j  j
 | | | s | n | g  q Wq Wq WxR | D]J \ } } } | rG|  j | k rGqn  | j	 |  j  j
 | | d   qWd  S(   Ni    c         S@  s   i  |  ] \ } } | |  q S(    (    (   Rd  R   R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pys
   <dictcomp>V	  s   	R5  (   R!   t   sortedt
   _chunksizeR   R   R  R8   Ra   R   R   R  (   RO   R=  R>  R#  R  RQ   R!   t   our_keyst   chunkR   t   datat   related_objR   R   R?  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR9  M	  s*    		3"c         C@  sx  |  j  } | r d n d  } xV| rs| d |  j !} | |  j } g  | D]+ \ } }	 }
 } | j rm | d n | ^ qH } d   t j | | j  j d |  d    D } x | D] \ } }	 }
 } | r |  j |
 k r q n  | j	 | |  } | rM| rMt
 |  d k r't j d |   n  |	 j |  j  j |	 |
 | d  q |	 j |  j  j |	 |
 |  q Wq Wd  S(   Ni    c         S@  s6   i  |  ], \ } } g  | D] } | d  ^ q |  q S(   i   (    (   Rd  R   R  R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pys
   <dictcomp>	  s   	R5  c         S@  s   |  d S(   Ni    (    (   R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR   	  R  i   sL   Multiple rows returned with uselist=False for eagerly-loaded attribute '%s' (    (   R!   Ra   RD  R  R  R  R   R   R   R8   R&  R   R'  R   R  (   RO   R=  R#  R  RQ   R!   t   _empty_resultRF  R   R   R2  R?  R5  RG  R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR:  w	  s0    		5(   R:  R  R  R  R  R   (   R]   R^   R`   R  t
   namedtupleR#  RD  RM   R  R  R  Rq   R   R1  R   R\   R,  R9  R:  (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR    s2        						1	*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.(
   Ra   R   t	   hasparentR   t   instance_stateR   R   R   t   instance_strR<   (   R   R   t   oldvaluet	   initiatorRK  (   R   (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt	   _do_check	  s    %c         @  s     |  | d  |  S(   N(   Ra   (   R   R   RO  (   RP  (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR0   	  s    c         @  s     |  | | |  S(   N(    (   R   R   RN  RO  (   RP  (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   set_	  s    R0   t   rawt   retvalR)   Rm   (   R   t   listenRh   (   R   R   R0   RQ  (    (   RP  R   s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyR1   	  s    (;   R_   t
   __future__R    R  R  R  R   R   R   R   R   R   R   R   R   R   t   baseR	   R
   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   Ra   Rn   RG   t   ColumnPropertyt   strategy_forRJ   t   class_loggerRh   Rb   Rx   R}   R  R   R   t   RelationshipPropertyR   R   t   MemoizedSlotsR   R-  R4  R9  R  R  R1   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/orm/strategies.pyt   <module>	   s   M#B;
+     