
b]c           @@  s  d  Z  d d l m 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 e j   Z d   Z e j d  e d   Z d   Z e e e d  Z e e e e d  Z e e e d  Z e e e e d  Z d   Z d   Z  d   Z! d   Z" d   Z# d e$ f d     YZ% d   Z& d S(   s   private module containing functions used to convert database
rows into object instances and associated state.

the functions here are called primarily by Query, Mapper,
as well as some of the attribute loading strategies.

i    (   t   absolute_importNi   (   t
   attributes(   t   exc(   t   path_registry(   t   strategy_options(   t   _DEFER_FOR_STATE(   t   _SET_DEFERRED_EXPIRED(   t	   _none_set(   t	   state_stri   (   t   utilc         #@  s#  t    | _ i  | _   j }   j oJ t   j  d k oJ   j d j } | rt | rb t } qt   f d   } n  y~t	 t
 g    j D] } | j   | |  ^ q    \ } } | s t j d |  }	 n  xt ri  | _   j r	| j   j  }
 |
 sPqn | j   }
 | rG| d } g  |
 D] } | |  ^ q,} n8 g  |
 D]+ } |	 g  | D] } | |  ^ q^ ^ qN} x- | j j   D] \ } } | j | |  qW| rt j | |  } n  x | D] } | VqW  j s Pq q WWn* t k
 r} | j   t j |  n Xd S(   s$   Return an ORM result as an iterator.i   i    c         @  s    t  d   t   j |   D  S(   Nc         s@  s0   |  ]& \ } } | j  r$ t |  n | Vq d  S(   N(   t   use_id_for_hasht   id(   t   .0t   entt   item(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pys	   <genexpr>8   s   (   t   tuplet   zipt	   _entities(   t   row(   t   query(    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt	   filter_fn6   s    t   resultN(   t
   _new_runidt   runidt   post_load_pathst   _has_mapper_entitiest   _only_return_tuplest   lenR   t   supports_single_entityR   t   listR   t   row_processorR	   t   lightweight_named_tuplet   Truet   partialst
   _yield_pert	   fetchmanyt   fetchallt   itemst   invoket   unique_listt	   Exceptiont   closet   raise_from_cause(   R   t   cursort   contextt   filteredt   single_entityR   t   query_entityt   processt   labelst   keyed_tuplet   fetcht   procR   t   rowst   patht	   post_loadt   err(    (   R   s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt	   instances#   sP    		
	4			
"5		
s   sqlalchemy.orm.queryc         C@  s  | j  } | r | j   n  | j } zt | _ t | j  d k } | r t | j d |  j  r g  | D]< } | j t	 j
 |  t	 j |  d | d i  d i  ^ ql } qt |  } ng  t | j  D]$ \ }	 }
 t |
 |  j  r |	 ^ q } g  } g  | j D] } | j ^ q
} t j d |  } x | D] } t |  } xc | D][ }	 | |	 d k	 rQ| j t	 j
 | |	  t	 j | |	  d | d i  d i  | |	 <qQqQW| j | |   q8Wt |  SWd | | _ Xd S(   s:   Merge a result into this :class:`.Query` object's Session.i   i    t   loadt
   _recursivet   _resolve_conflict_mapR   N(   t   sessiont
   _autoflusht	   autoflusht   FalseR   R   t
   isinstancet   _MapperEntityt   _mergeR   t   instance_statet   instance_dictR   t	   enumeratet   _label_nameR	   R   t   Nonet   appendt   iter(   t   querylibR   t   iteratorR:   R=   R?   R.   t   instanceR   t   it   et   mapped_entitiesR   t   keysR2   R   t   newrow(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   merge_resultl   s>    			Ic         C@  s   |  j  j |  } | d k	 r t j |  } | j r | t j @sJ t j S| t j @s[ | Sy | j	 | |  Wq t
 j k
 r |  j | g  d SXn  | Sd Sd S(   sq   Look up the given key in the given session's identity map,
    check the object for expired state if found.

    N(   t   identity_mapt   getRH   R   RD   t   expiredt   SQL_OKt   PASSIVE_NO_RESULTt   RELATED_OBJECT_OKt   _load_expiredt   orm_exct   ObjectDeletedErrort   _remove_newly_deleted(   R=   t   keyt   passiveRM   t   state(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   get_from_identity   s    	c         C@  sR   | d k	 r# | d } | d } n
 d } } t |  | d | d | d | d | S(   s.   Load the given identity key from the database.i   i   t   refresh_statet   with_for_updatet   only_load_propst   identity_tokenN(   RH   t   load_on_pk_identity(   R   R^   Rb   Rc   Rd   t   identRe   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   load_on_ident   s    

c         C@  s  | d k r% |  j   } | j   n |  j   } | d k	 r%|  j   } | j \ } }	 d | k r t g  t | j |  D]% \ }
 } | d k rz |	 |
 j ^ qz  } t	 j
 | |  } n  | j | t t  } | | _ t g  t | | j  D] \ } } |	 | j | f ^ q  } | | _ n  | d k	 rCt } | | _ n* |  j d k	 rgt } |  j | _ n t } | j d t |  d | d | d | d |  d | _ y | j   SWn t j k
 rd SXd S(   s6   Load the given primary key identity from the database.t   populate_existingt   version_checkRd   Rb   Re   N(   RH   t   _clonet   _get_conditiont   _mapper_zerot   _get_clauset   setR   t   primary_keyR^   t   sql_utilt   adapt_criterion_to_nullt   _adapt_clauseR    R@   t
   _criteriont   dictt   _paramst   _for_update_argt   _get_optionst   boolt	   _order_byt   oneR[   t   NoResultFound(   R   t   primary_key_identityRb   Rc   Rd   Re   t   qt   mapperRn   t   _get_paramst   colt   valuet   nonest   id_valRp   t   paramsRj   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyRf      sN    "	5		c	         K@  s   | r | j  |  }
 n	 | j }
 i  } | j |  j d |  xT |
 D]L } | re | j | k re qD n  | j |  | | | d | d | d | |	 qD W| d  k	 r | | j k	 r | r | j | } n | } | j	 |  n  d  S(   Nt   memoized_setupsRd   t   column_collectiont   memoized_populators(
   t   _iterate_polymorphic_propertiest   _polymorphic_propertiesRo   R   R^   t   setupRH   t   polymorphic_ont   columnsRI   (   R,   R   R/   R6   t   adapterR   t   with_polymorphicRd   t   polymorphic_discriminatort   kwt   poly_propertiest   quick_populatorsR   t   pd(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   _setup_entity_query  s0    	c	         @  s  
 j     r2 g   D] }	   j |	 ^ q  n  
 j  t j t   
 j }
  d
 k	 r |
 j 
 f d    D  }
 n  | j	  j
 d t  } x/|
 D]'} | | k r| | } | t k r  d j | j | j f  q| t k r d j | j t f  qd
 }   rN  j | } | d
 k	 rN| j | t  } qNn  | si| j | t  } n  | r d j | j | f  q| j  | 
 |     q | j  | 
 |     q W j   j j j r j j | n |   j j   j p
 j  t 
 j j j   t 
 j j j    t  j j j!    rn j j j! 	 n  t
 j"  t
 j#   j j$   j%   j&   j'   r| d
 k	 rd | j f } |  j
 k r j
 | j( d t) f f k r
 j*  j
 | j+ d |  } n 
 j* d
 |  } | r| | k	 r d
 k sPt,  t-  | |  } t. j/   | j0 | | |  qn  t. j1       r j   d
 k r
 j2    qn d
  
 j3 rt j4  n	 t j            	 
               f d	   } 
 j5 r| r rt6 |  
 | | |    } n  | S(   s`   Produce a mapper level row processor callable
       which processes rows into mapped instances.c         3@  s   |  ] }   j  | Vq d  S(   N(   t   _props(   R   t   k(   R   (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pys	   <genexpr>p  s    R   t   newt   expiret   quickt   loadert   selectinload_polymorphict   entitiesc      
   @  s7   rB  } | j    }  |  } | j  k } t } t } n t g   D] } |  | ^ qO   f }  j |  } | d  k	 r  |  }  |  } | j  k } | } t }  r^| r^t 
 | | |     q^nx  | d  r d  St } t } t } 
 j j	   }  |  }  |  } | | _
  | _  | _  j | |  | sj r| r s} r | _  | _ n  t  |  | | |  |   	 | rg| r r| j j j |   n   r#	  j | j     q#n"  r#| j j j |    n   s2| j rg rQ rQ| j |   qd| j |   qgn   r3 j | t  q3n | j }	 |  j k } | s|	 s d rt  |  | | |  |	   }
 | r r| j j j |  |
  n  | j | |
  qn   r3 j r3 j | t  n  | S(   Ni   t   eager(   t   objR   R    R@   R   RU   RH   t   _validate_version_idt   class_managert   new_instanceR^   Re   t
   session_idt   _add_unpresentt   load_optionst	   load_patht   _populate_fullt   managert   dispatchR:   R=   t   refresht   modifiedt   _committ   _commit_allt	   add_statet   unloadedR!   t   _populate_partialt   invoke_all_eagers(   R   R`   RM   t   dict_t   isnewt   currentloadt   loaded_instancet   columnt   identitykeyR   t   to_load(   R   R,   t   identity_classRe   RE   RD   t   is_not_primary_keyt   load_evtR   t   loaded_as_persistentR   Rd   t   persistent_evtt   pk_colsRi   t
   populatorsR7   t   propagate_optionst   refresh_evtt   refresh_identity_keyRb   R   R   t   session_identity_mapRj   (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt	   _instance  s    	 							N(7   Rp   R   t   _identity_classt   collectionst   defaultdictR   t	   _prop_setRH   t   intersectionRU   R   R   R   RI   R^   t   _deferred_column_loaderR   R@   t   _gettert   create_row_processorR   R   t   _current_pathR6   R=   RT   Ri   t   always_refreshRy   R   R   R:   R   R   RD   RE   t   hash_keyRj   R   Re   t   strategyR    t   _should_selectin_loadt
   local_optst   AssertionErrort   _load_subclass_via_int   PostLoadt   callable_for_pathR   t   for_contextt   _identity_key_from_statet   allow_partial_pkst
   issupersett   polymorphic_mapt   _decorate_polymorphic_switch(   R   R,   R   R6   R   Rd   Rb   R   t   _polymorphic_fromt   ct   propsR   t   propR   t   gettert   adapted_colR^   t   selectin_load_viat	   callable_R   (    (   R   R,   R   Re   RE   RD   R   R   R   R   R   Rd   R   R   Ri   R   R7   R   R   R   Rb   R   R   R   Rj   s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   _instance_processorQ  s    	#		"

									Wc         @  ss   | j  } t | j j  d k  | j rE | j |  \     n | j \          f d   } | S(   Ni   c   	      @  s   |  j  }  j  f | j   f | j d | } | j rQ | j d    n  | |  j  j d g  | D]0 \ } }  r | j d d n
 | j d ^ qj  j	   d  S(   Nt
   cache_pathc         S@  s
   |  j    S(   N(   Ri   (   R~   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   <lambda>  t    t   primary_keysi   i    (
   R   t   _with_lazyload_optionst   _with_optionst   parentt   _populate_existingt   add_criteriaR=   R   R^   t   all(	   R,   R6   t   statest	   load_onlyt   effective_entityt
   orig_queryt   q2R`   t
   load_attrs(   t   disable_optt
   enable_optR~   t   zero_idx(    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   do_load  s    				(   R   R   t   base_mapperRp   t   is_aliased_classt   _subclass_load_via_int   _subclass_load_via_in_mapper(   R,   R6   t   entityR   R   (    (   R   R   R~   R   s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR     s    		c	         C@  s  | r|  j  | _  x( | d D] \ }	 }
 |
 |  | |	 <q W| r xx | d D]5 \ }	 } | j |	 d   | rN | j j |	  qN qN Wn4 x1 | d D]% \ }	 } | r | j j |	  q q Wx( | d D] \ }	 } | | | |  q Wx | d D] \ }	 } | | | |  q Wn | | j k r| | _ x7 | d D]+ \ }	 }
 |	 | k r:|
 |  | |	 <q:q:WxV | d D] \ }	 } | | | |  qtWn+ x( | d D] \ }	 } | | | |  qWd  S(   NR   R   R   t   delayedt   existing(   R   t   popRH   t   expired_attributest   addR   (   R,   R   R`   R   R   R   R   Ri   R   R^   R   t   set_callablet	   populator(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR     s2    	c         C@  s  | sP |  j  | } xN| d D]+ \ }	 }
 |	 | k r |
 | | |  q q Wn| } | |  j  | <x7 | d D]+ \ }	 } |	 | k rn | |  | |	 <qn qn WxP | d D]D \ }	 } |	 | k r | j |	 d   | r | j j |	  q q q Wx7 | d D]+ \ }	 }
 |	 | k r |
 | | |  q q Wx7 | d D]+ \ }	 }
 |	 | k r5|
 | | |  q5q5Wx7 | d D]+ \ }	 }
 |	 | k ro|
 | | |  qoqoW| S(   NR   R   R   R   R   R   (   R!   R  RH   R  R  (   R,   R   R`   R   R   R   R   R   R   R^   R  R   R  (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR     s2    c         C@  s   |  j  } | d  k r d  S| r/ | j | } n  |  j | | |  j   | | k r t j d t |  |  j | | |  j   | | f   n  d  S(   NsW   Instance '%s' has version id '%s' which does not match database-loaded version id '%s'.(   t   version_id_colRH   R   t   _get_state_attr_by_columnR[   t   StaleDataErrorR   (   R   R`   R   R   R   R  (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR      s    		c   	      @  s   | d  k	 r |  n	  j   d  k r.  S  rD   j   n        f d   } t j |      f d   } | S(   Nc         @  se   y  j  |  } Wn! t k
 r4 t d |    n- X|  k rE d  St |      d  Sd  S(   Ns*   No such polymorphic_identity %r is definedR   (   R   t   KeyErrorR   RH   R   (   t   discriminatort
   sub_mapper(   R   R,   R   R6   R   (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   configure_subclass_mapper.  s    c         @  s=   |   } | d  k	 r3  | } | r3 | |   Sn    |   S(   N(   RH   (   R   R
  R   (   t   instance_fnt   polymorphic_instancesR   (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   polymorphic_instanceD  s    

(   RH   R   R   R	   t   PopulateDict(	   R  R,   R   R   R6   R   R   R  R  (    (   R   R,   R  R   R6   R  R   R   s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR     s    			R   c           B@  s\   e  Z d  Z d
 Z d   Z d   Z d   Z e d    Z e d    Z	 e d	    Z
 RS(   s:   Track loaders and states for "post load" operations.

    t   loadersR   t	   load_keysc         C@  s%   i  |  _  t j   |  _ d  |  _ d  S(   N(   R  R	   t   OrderedDictR   RH   R  (   t   self(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   __init__V  s    	c         C@  s   | |  j  | <d  S(   N(   R   (   R  R`   t	   overwrite(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR   [  s    c         C@  s   |  j  s d  St j j |  } x |  j j   D]} \ } } } } } g  |  j  j   D]- \ } }	 | j j j	 |  rT | |	 f ^ qT }
 |
 r/ | | | |
 |  j
 | |  q/ q/ W|  j  j   d  S(   N(   R   R   t   PathRegistryt   coerceR  t   valuesR%   R   R   t   isaR  t   clear(   R  R,   R6   t   tokent   limit_to_mapperR   t   argR   R`   R  R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR&   b  s    	%'#c         C@  s7   | j  j | j  } | d  k	 r3 | r3 | | _ n  | S(   N(   R   RU   R6   RH   R  (   t   clsR,   R6   Rd   t   pl(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR   p  s    c         C@  s)   | j  | j k o( | | j | j  j k S(   N(   R6   R   R  (   R  R,   R6   R^   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   path_existsw  s    c   	      O@  s\   | j  | j k r% | j | j  } n t   } | j | j  <| | | | | f | j | <d  S(   N(   R6   R   R   R  (	   R  R,   R6   R  R  t   loader_callableR  R   R   (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR   ~  s    (   R  R   R  (   t   __name__t
   __module__t   __doc__t	   __slots__R  R   R&   t   classmethodR   R!  R   (    (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR   O  s   			c   
      C@  s  | j  } | s+ t j d t |    n  t | j  } t } | ra | j |  j j	    } n  |  j
 r |  j r |  j | |  } | d k	 r t | j |   j t j |   j d   j |  d d | d | } q n  | t k r| r | j } nc g  |  j D] } |  j | j ^ q}	 | j j |	  rRt j d t |    n  |  j |  } t j |  rz|  j st j |  rt j  d t |   d St | j |   | d | d | } n  | r| d k rt j! |   n  d S(   s4   initiate a column-based attribute refresh operation.sQ   Instance %s is not bound to a Session; attribute refresh operation cannot proceedt   *Rd   Rb   s_   Instance %s cannot be refreshed - it's not  persistent and does not contain a full primary key.sw   Instance %s to be refreshed doesn't contain a full primary key - can't be refreshed (and shouldn't be expired, either).N("   R=   R[   t   DetachedInstanceErrorR   Ry   R^   R@   R   t   attrsRQ   t   inheritst   concretet   _optimized_get_statementRH   Rh   R   t   optionsR   t   Loadt   undefert   from_statementRp   t   _columntopropertyR  t   sa_exct   InvalidRequestErrorR   R   t   issubsetR   R   R	   t   warn_limitedR\   (
   R   R`   t   attribute_namesR=   t   has_keyR   t	   statementt   identity_keyR   t   pk_attrs(    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   load_scalar_attributes  sR    	&('   R%  t
   __future__R    R   R   R   R   R[   R   R   t   baseR   R   R	   R   R   R3  t   sqlRq   t   counterR   R9   t   dependenciesR    RS   Ra   RH   Rh   Rf   R   R   R   R   R   R   R   t   objectR   R<  (    (    (    s5   lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   <module>   sL   	I5	L/ ,	 	9	"		4: