ó
H`¾Tc           @   s÷   d  Z  d d l m Z d d l m Z m Z m Z d d l m	 Z	 d d l
 m Z d d l m Z m Z 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 d „  Z d „  Z 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   utili   (   t
   attributest   exct   state(   t   EXT_CONTINUE(   t	   _none_sett	   state_str(   R   c      
   #   sÆ  |  j  } t ƒ  | _ g  |  j D] } | j ^ q ‰  t ˆ  k } t |  j ƒ d k ob |  j d j } | rŒ | rz t } qŒ ‡  f d †  } n  | oŸ |  j d j } t	 t
 g  |  j D] }	 |	 j |  | | ƒ ^ q² Œ  ƒ \ }
 } xàt rÁi  | _ i  | _ |  j r"| j |  j ƒ } | s.Pq.n | j ƒ  } | r_g  } x’ | D] } |
 d | | ƒ qAWnp | rŽg  | D] } |
 d | d ƒ ^ ql} nA g  | D]4 } t j g  |
 D] } | | d ƒ ^ q¨| ƒ ^ q•} | rêt j | | ƒ } n  | j r@|  j r@| j | j k r@| j j | j j |  j ƒ | j j | j ƒ n  t j j t	 | j j ƒ  ƒ | j ƒ x3 | j j ƒ  D]" \ } \ } } | j | | ƒ quWx | D] } | Vq¢W|  j sâ Pqâ qâ Wd S(   s$   Return an ORM result as an iterator.i   i    c            s   t  d „  t |  ˆ  ƒ Dƒ ƒ S(   Nc         s   s!   |  ] \ } } | | ƒ Vq d  S(   N(    (   t   .0t   xt   fn(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pys	   <genexpr>-   s    (   t   tuplet   zip(   t   row(   t
   filter_fns(    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt	   filter_fn,   s    N(    t   sessiont
   _new_runidt   runidt	   _entitiesR   t   idt   lent   supports_single_entityt   custom_rowst   listR   t   row_processort   Truet   progresst   partialst
   _yield_pert	   fetchmanyt   fetchallt   NoneR    t
   KeyedTuplet   unique_listt   refresh_statet   _only_load_propst   _committ   dictt   popt   statelibt   InstanceStatet   _commit_all_statest   itemst   identity_map(   t   queryt   cursort   contextR   t   entt   filteredt   single_entityR   R   t   query_entityt   processt   labelst   fetcht   rowsR   t   procR   t   dict_t   attrs(    (   R   s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt	   instances   s`    		4				)>		
"		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]6 } | j t	 j
 | ƒ t	 j | ƒ d | d i  ƒ^ ql } q¯t | ƒ } nõ g  t | j ƒ D]$ \ }	 }
 t |
 |  j ƒ rÊ |	 ^ qÊ } g  } g  | j D] } | j ^ q} x“ | D]‹ } t | ƒ } x] | D]U }	 | |	 d k	 r9| j t	 j
 | |	 ƒ t	 j | |	 ƒ d | d i  ƒ| |	 <q9q9W| j t j | | ƒ ƒ q Wt | ƒ SWd | | _ Xd S(   s:   Merge a result into this :class:`.Query` object's Session.i   i    t   loadt
   _recursiveN(   R   t
   _autoflusht	   autoflusht   FalseR   R   t
   isinstancet   _MapperEntityt   _mergeR   t   instance_statet   instance_dictR   t	   enumeratet   _label_nameR   t   appendR    R    t   iter(   t   querylibR,   t   iteratorR;   R   R>   R1   t   instancet   resultt   it   et   mapped_entitiesR/   t   keysR   t   newrow(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   merge_resultf   s6    			Cc         C   s£   |  j  j | ƒ } | d k	 r› t j | ƒ } | j r— | t j @sJ t j S| t j @s[ | Sy | | | ƒ 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(   R+   t   getR   R   RC   t   expiredt   SQL_OKt   PASSIVE_NO_RESULTt   RELATED_OBJECT_OKt   orm_exct   ObjectDeletedErrort   _remove_newly_deleted(   R   t   keyt   passiveRK   R   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   get_from_identity   s    	c      	   C   sí  | d k	 r | d } n d } | d k rD |  j ƒ  } | j ƒ  n |  j ƒ  } | d k	 rD|  j ƒ  } | j \ } }	 d | k rÜ t g  t | j | ƒ D]% \ }
 } | d k r™ |	 |
 j ^ q™ ƒ } t	 j
 | | ƒ } n  | j | t t ƒ } | | _ t g  t | | j ƒ D] \ } } |	 | j | f ^ qƒ } | | _ n  | d k	 rht } | j | ƒ } n* |  j d k	 rŒt } |  j | _ n t } | j d t | ƒ d | d | d | ƒ d | _ y | j ƒ  SWn t j k
 rèd SXd S(   s.   Load the given identity key from the database.i   t   populate_existingt   version_checkt   only_load_propsR"   N(   R   t   _clonet   _get_conditiont   _mapper_zerot   _get_clauset   setR   t   primary_keyR[   t   sql_utilt   adapt_criterion_to_nullt   _adapt_clauseR   R?   t
   _criterionR%   t   _paramst   with_lockmodet   _for_update_argt   _get_optionst   boolt	   _order_byt   oneRX   t   NoResultFound(   R,   R[   R"   t   lockmodeR`   t   identt   qt   mapperRd   t   _get_paramst   colt   valuet   nonest   id_valRf   t   paramsR_   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   load_on_ident­   sN    >	8		c            s  ˆ j  ‰ | s ˆ r d ‰ n< | d k	 r3 | ‰ n	 ˆ j ‰ t j t ˆ ˆ ˆ ˆ ƒ ƒ ‰ ˆ j ‰ ˆ rÄ g  ˆ D] } ˆ j | ^ qp ‰ ˆ d k	 r¥ ˆ j ˆ ‰ n  ˆ d k	 rÄ ˆ j ˆ ‰ qÄ n  ˆ j ‰ g  ‰ g  ‰  g  ‰ ˆ j	 j
 j rþ ˆ j	 j
 ˆ n ˆ ‰	 ‡  ‡ ‡ ‡ ‡	 ‡ ‡ ‡ f d †  ‰ ˆ j j ‰
 ˆ j }	 |	 j pId ‰ |	 j pXd ‰ |	 j pgd ‰ |	 j pvd ‰ ˆ j pˆˆ j ‰ ˆ j ‰ ˆ j r©t j ‰ n	 t j ‰ ‡  ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡
 ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ f d †  }
 |
 S(   s`   Produce a mapper level row processor callable
       which processes rows into mapped instances.c      	      sì   | r6 ˆ j  r ˆ j  |  _ n  |  j r6 ˆ |  _ q6 n  ˆ s^ t ˆ ˆ ˆ | ˆ ˆ ˆ  ˆ ƒ n  | rm ˆ } n ˆ  } | d  k r© xf | D] \ } } | |  | | ƒ q† Wn? | rè x6 | D]+ \ } } | | k r¶ | |  | | ƒ q¶ q¶ Wn  d  S(   N(   t   propagate_optionst   load_optionst	   load_patht   _populatorsR   (   R   R8   R   t   isnewR`   t
   populatorsR[   t	   populator(   t   existing_populatorsRv   t   new_populatorst   eager_populatorsR€   R.   t   patht   adapter(    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   populate_state  s(    		
	c            s½  ˆ r/ ˆ r/ t  ˆ ˆ ˆ |  ˆ ˆ ˆ  ˆ ƒ n  ˆ rq x9 ˆ D]. } | ˆ ˆ |  ƒ } | t k	 r< | }  Pq< q< Wn  ˆ d  k	 r¶ |  ˆ } | d  k	 r¶ ˆ | } | r³ | |  | ƒ Sq¶ n  ˆ ræ ˆ j } | d  k rˆ j ˆ ƒ } qn) ˆ t g  ˆ D] } |  | ^ qó ƒ f } ˆ j | ƒ } | d  k	 rãt j | ƒ }	 t j	 | ƒ }
 |	 j
 ˆ j
 k } | } t } | rˆ d  k	 rˆ j rˆ j |	 |
 ˆ j ƒ |  ˆ k rt j d t |	 ƒ ˆ j |	 |
 ˆ j ƒ |  ˆ f ƒ ‚ qn0ˆ r+ˆ }	 |	 j ƒ  } t j	 | ƒ }
 |	 j
 ˆ j
 k } t } t } nè ˆ | d ƒ r?d  St } t } t } ˆ rÁxv ˆ D]M } | ˆ ˆ |  ˆ j ƒ } | t k	 r^t j | j ƒ } | j | ƒ Pq^q^Wˆ j j ƒ  } n ˆ j j ƒ  } t j	 | ƒ }
 t j | ƒ }	 | |	 _ ˆ j j |	 _ ˆ j |	 ƒ | sˆ
 r| rAˆ j
 |	 _
 |
 ˆ j |	 <n  ˆ r¨xt ˆ D]= } | ˆ ˆ |  |	 d ˆ	 d | d | ƒ} | t k	 rNPqNqNWˆ |	 |
 |  | ˆ	 ƒ n ˆ |	 |
 |  | ˆ	 ƒ | rÝ|	 j j  j! |	 ˆ ƒ qH| rH|	 j j  j" |	 ˆ ˆ	 ƒ qHnF|	 ˆ j# k s |	 j$ s ˆ rH|	 ˆ j# k rKt } ˆ j# |	 \ } } n" t } |	 j$ } |
 | f ˆ j# |	 <ˆ rÔxt ˆ D]= } | ˆ ˆ |  |	 d | d | d | ƒ} | t k	 rzPqzqzWˆ |	 |
 |  | | ƒ n ˆ |	 |
 |  | | ƒ x6 ˆ D]. \ } } | |	 j$ k rñ| |	 |
 |  ƒ qñqñW| rH|	 j j  j" |	 ˆ | ƒ qHn  | d  k	 r¹ˆ r©xY ˆ D]4 } | ˆ ˆ |  |	 | d | d | ƒt k	 raPqaqaW| j% | ƒ q¹| j% | ƒ n  | S(   NsW   Instance '%s' has version id '%s' which does not match database-loaded version id '%s'.i   R`   t   instancekeyR‚   (&   R   R   R   R[   t   _identity_key_from_stateR
   RS   R   RC   RD   R   R?   R_   t   _get_state_attr_by_columnt   version_id_colRX   t   StaleDataErrorR   t   objR   t   class_t   manager_of_classt	   __class__t   setup_instancet   class_managert   new_instanceR   t   hash_keyt
   session_idt   addR   t   managert   dispatchR;   t   refreshR   t   unloadedRG   (   R   RL   R	   t   rett   discriminatort	   _instancet   identitykeyt   columnRK   R   R8   R‚   t   currentloadt   loaded_instanceRš   t   d_R9   R[   R&   (   R…   t   pk_colst   create_instancet   append_resultt   polymorphic_instancest   identity_classt   translate_rowR†   t   session_identity_mapR`   R^   RŽ   t   polymorphic_onR‡   t   populate_instanceR"   Rˆ   Rv   R‰   t   is_not_primary_keyR.   RŠ   t   invoke_all_eagers(    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR    J  sò    


	&								N(   Rf   R   R­   R    t   PopulateDictt   _configure_subclass_mapperRŽ   t   columnst   _identity_classR,   t   _current_pathRˆ   R   R+   R›   R«   R§   R®   R¨   R^   t   always_refreshR°   t   allow_partial_pksR   t
   issupersett   issubset(   Rv   R.   Rˆ   R‰   t   polymorphic_fromR`   R"   t   polymorphic_discriminatort   ct	   listenersR    (    (   R…   R¦   R§   R¨   R©   Rª   R"   R¯   R†   R€   R¬   R`   R^   RŽ   R­   R‡   R«   R®   Rˆ   RŠ   Rv   R‰   R.   R°   s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   instance_processorì   sJ    					 	$				Q°c         C   s§   g  } | | | | f }	 xr |  j  j ƒ  D]a }
 xX t |
 j | | |  | | ƒ ƒ D]5 \ } } | d k	 rP |	 | j |
 j | f ƒ qP qP Wq( W| r£ | j | ƒ n  d S(   sD   Produce a collection of attribute level row processor
    callables.N(   t   _propst   valuesRE   t   create_row_processorR   RG   R[   t   extend(   Rv   R.   Rˆ   R   R‰   R†   R…   R‡   t   delayed_populatorst   popst   propRM   R&   (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR   ý  s    		%c            s   ‡  ‡ ‡ ‡ f d †  } | S(   sZ   Produce a mapper level row processor callable factory for mappers
    inheriting this one.c            s^   y ˆ  j  |  } Wn! t k
 r4 t d |  ƒ ‚ n X| ˆ  k rE d  St | ˆ ˆ ˆ d ˆ  ƒS(   Ns*   No such polymorphic_identity %r is definedRº   (   t   polymorphic_mapt   KeyErrort   AssertionErrorR   R¾   (   RŸ   t
   sub_mapper(   Rv   R.   Rˆ   R‰   (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   configure_subclass_mapper  s    (    (   Rv   R.   Rˆ   R‰   RÊ   (    (   Rv   R‰   R.   Rˆ   s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyR²     s    c   
   
   C   s·  | j  } | s+ t j d t | ƒ ƒ ‚ n  t | j ƒ } t } |  j r¤ |  j r¤ |  j	 | | ƒ } | d k	 r¤ t | j |  ƒ j | ƒ d d | d | ƒ} q¤ n  | t k r| rÂ | j } nc g  |  j D] } |  j | j ^ qÌ }	 | j j |	 ƒ rt j d t | ƒ ƒ ‚ n  |  j | ƒ } t j | ƒ r>|  j sMt j | ƒ rh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 proceedR`   R"   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   RX   t   DetachedInstanceErrorR   Ro   R[   R?   t   inheritst   concretet   _optimized_get_statementR   R}   R,   t   from_statementRf   t   _columntopropertyt   expired_attributest   intersectiont   sa_exct   InvalidRequestErrorRŒ   R   R¹   R·   R¸   R    t   warnRY   (
   Rv   R   t   attribute_namesR   t   has_keyRL   t	   statementt   identity_keyRx   t   pk_attrs(    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   load_scalar_attributes*  sL    	#
	N(   t   __doc__t    R    R   R   RX   R   R'   t
   interfacesR   t   sqlRg   R   R   RÓ   t   counterR   R:   t   dependenciesR   RR   R]   R   R}   R¾   R   R²   RÛ   (    (    (    s\   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/orm/loading.pyt   <module>   s*   	K)	>ÿ 		