B
    \i:                @   sb  d 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 dJddZej j!dddG dd deZ"ej#ej j!d ddG d!d" d"eZ$ej#ej j!d d#G d$d% d%e$Z%ej#ej j!d d d&ej j!d d'G d(d) d)eZ&G d*d+ d+e'Z(G d,d- d-eZ)ej#ej*j!d d'G d.d/ d/eZ+ej#ej*j!d0d1ej*j!dd1G d2d3 d3e)Z,ej#ej*j!d d1ej*j!d4d1ej*j!d5d1ej*j!d6d1ej*j!d7d1G d8d9 d9e)ej-Z.G d:d; d;e'Z/ej*j!d<d1G d=d> d>e)Z0ej#ej*j!d?d1G d@dA dAe)Z1ej#ej*j!dBd1ej*j!dd1G dCdD dDe)Z2ej#ej*j!dEd1G dFdG dGe)ej-Z3dHdI Z4dS )KzWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.    N   )
attributes)exc)
interfaces)loading)
properties)query)
unitofwork)util)_DEFER_FOR_STATE)_SET_DEFERRED_EXPIRED)LoaderStrategy)StrategizedProperty)_state_session)InstanceState)	_none_set)aliased   )event)inspect)log)sql)visitorsFc	                s<  t tj| jg d}
g }|o | j|r6| jr6|t | j| j	j
krj| j	j
| j \|fdd |rz|tj |r| j  r| fdd x|jD ]}| |j| jkr|j| jstj|j| jf| |||
|o| jp| jtjk||||| p
| j | jd|	}x|D ]}|||  q W qW d S )N)defaultc                s   t j| |j fS )N)orm_utilZ_validator_eventskey)descprop)fnopts 8lib/python3.7/site-packages/sqlalchemy/orm/strategies.py<lambda>@   s   z%_register_attribute.<locals>.<lambda>c                s   t |  S )N)r   Zbackref_listeners)r   r   )backrefuselistr    r!   r"   N   s   )Zparent_tokenr$   compare_function	useobject	extensionZtrackparenttypecallable	callable_active_history
impl_classZsend_modified_eventsdoc)listr
   to_listr'   r$   Zsingle_parentappendsingle_parent_validatorr   parentZ
validatorsr	   Ztrack_cascade_eventsZback_populatesZself_and_descendants_propsgetclass_managerZ_attr_has_implr   Zregister_attribute_implclass_	directionr   Z	ONETOMANYZviewonlyr,   )r   mapperr&   r%   r(   r)   Zproxy_propertyr*   r+   kwZattribute_extZlisten_hooksmr   hookr    )r#   r   r   r$   r!   _register_attribute'   sP    





r;   )
instrumentdeferredc                   s6   e Zd ZdZdZ fddZd
ddZdd	 Z  ZS )UninstrumentedColumnLoaderzRepresent a non-instrumented MapperProperty.

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

    )columnsc                s    t t| || | jj| _d S )N)superr>   __init__parent_propertyr?   )selfr1   strategy_key)	__class__r    r!   rA      s    z#UninstrumentedColumnLoader.__init__Nc       	      K   s,   x&| j D ]}|r|j | }|| qW d S )N)r?   r/   )	rC   contextquery_entitypathloadoptadaptercolumn_collectionkwargscr    r    r!   setup_query   s    

z&UninstrumentedColumnLoader.setup_queryc             C   s   d S )Nr    )rC   rF   rH   rI   r7   resultrJ   
populatorsr    r    r!   create_row_processor   s    z/UninstrumentedColumnLoader.create_row_processor)N)	__name__
__module____qualname____doc__	__slots__rA   rN   rQ   __classcell__r    r    )rE   r!   r>   }   s
   
r>   Tc                   s<   e Zd ZdZdZ fddZdd Zdd Zd	d
 Z  Z	S )ColumnLoaderz8Provide loading behavior for a :class:`.ColumnProperty`.)r?   is_compositec                s.   t t| || | jj| _t| jd| _d S )Ncomposite_class)r@   rX   rA   rB   r?   hasattrrY   )rC   r1   rD   )rE   r    r!   rA      s    
zColumnLoader.__init__c             K   sN   x&| j D ]}	|r|j |	 }	||	 qW | j d }
|r@|j |
 }
|
|| j< d S )Nr   )r?   r/   rB   )rC   rF   rG   rH   rI   rJ   rK   memoized_populatorsrL   rM   fetchr    r    r!   rN      s    


zColumnLoader.setup_queryc             C   sP   d| _ | jd j}| jjp4| jd jp4|jt| jk}t| j|d|j	|d d S )NTr   F)r&   r%   r*   )
is_class_levelr?   typerB   r*   primary_keyZversion_id_colsetr;   compare_values)rC   r7   Zcoltyper*   r    r    r!   init_class_attribute   s    z!ColumnLoader.init_class_attributec       
      C   s\   xV| j D ]8}|r|j | }||d}	|	r|d | j|	f P qW |d | jdf d S )NFquickexpireT)r?   _getterr/   r   )
rC   rF   rH   rI   r7   rO   rJ   rP   colgetterr    r    r!   rQ      s    
z!ColumnLoader.create_row_processor)
rR   rS   rT   rU   rV   rA   rN   rc   rQ   rW   r    r    )rE   r!   rX      s   rX   )Zquery_expressionc                   s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	ExpressionColumnLoaderc                s   t t| || d S )N)r@   ri   rA   )rC   r1   rD   )rE   r    r!   rA      s    zExpressionColumnLoader.__init__c             K   sd   |r`d|j kr`|j d g}	x$|	D ]}
|r2|j|
 }
||
 q W |	d }|rV|j| }||| j< d S )N
expressionr   )
local_optsr?   r/   rB   )rC   rF   rG   rH   rI   rJ   rK   r\   rL   r?   rM   r]   r    r    r!   rN      s    


z"ExpressionColumnLoader.setup_queryc             C   st   |rpd|j krp|j d g}xT|D ]8}	|r2|j|	 }	||	d}
|
r |d | j|
f P q W |d | jdf d S )Nrj   Frd   re   T)rk   r?   rf   r/   r   )rC   rF   rH   rI   r7   rO   rJ   rP   r?   rg   rh   r    r    r!   rQ     s    

z+ExpressionColumnLoader.create_row_processorc             C   s(   d| _ t| j|d| jd jjdd d S )NTFr   )r&   r%   Zaccepts_scalar_loader)r^   r;   rB   r?   r_   rb   )rC   r7   r    r    r!   rc     s    z+ExpressionColumnLoader.init_class_attribute)rR   rS   rT   rA   rN   rQ   rc   rW   r    r    )rE   r!   ri      s   ri   )r=   r<   )Z
do_nothingc                   sF   e Zd ZdZdZ fddZdd Zdd Zdd
dZdd Z	  Z
S )DeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)r?   groupc                s>   t t| || t| jdr&td| jj| _| jj| _d S )NrZ   z8Deferred loading for composite types not implemented yet)r@   rl   rA   r[   rB   NotImplementedErrorr?   rm   )rC   r1   rD   )rE   r    r!   rA   *  s    
zDeferredColumnLoader.__init__c       	      C   s<   | j s$| jj}|d | j|f n|d | jdf d S )Nnewre   F)r^   rB   Z_deferred_column_loaderr/   r   )	rC   rF   rH   rI   r7   rO   rJ   rP   Zset_deferred_for_local_stater    r    r!   rQ   3  s    z)DeferredColumnLoader.create_row_processorc             C   s,   d| _ t| j|d| jd jj| jdd d S )NTFr   )r&   r%   r)   Zexpire_missing)r^   r;   rB   r?   r_   rb   _load_for_state)rC   r7   r    r    r!   rc   C  s    z)DeferredColumnLoader.init_class_attributeNc	       
      K   s   |r"d|j kr"t| j| jjsN|r@| jr@|j d| j dsN|rr| j|krr| j	
dj|||||||f|	 n| jrt|| j	< n
t|| j	< d S )NZundefer_pkszundefer_group_%sF))r=   F)r<   T)rk   ra   r?   intersectionr1   Z_should_undefer_in_wildcardrm   r3   r   rB   _get_strategyrN   r^   r   r   )
rC   rF   rG   rH   rI   rJ   rK   r\   only_load_propsr8   r    r    r!   rN   O  s,    


z DeferredColumnLoader.setup_queryc                s   j stjS |tj@ stjS jj} jr@ fdd|jD }n j g}fdd|D }t	}|d krt
dt j f ||}tj|j |dd krt
tjS )Nc                s4   g | ],}t |trt |jtr|j jkr|jqS r    )
isinstancer   strategyrl   rm   r   ).0p)rC   r    r!   
<listcomp>  s   
z8DeferredColumnLoader._load_for_state.<locals>.<listcomp>c                s   g | ]}| j kr|qS r    )Z
unmodified)rv   k)stater    r!   rx     s    zfParent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceed)rs   Zrefresh_state)r   r   
ATTR_EMPTYSQL_OKPASSIVE_NO_RESULTmanagerr7   rm   Ziterate_propertiesr   orm_excDetachedInstanceErrorr   	state_strr   r   Zload_on_identZObjectDeletedErrorZATTR_WAS_SET)rC   rz   passivelocalparentZtoloadrm   sessionr   r    )rC   rz   r!   rp   ~  s*    



z$DeferredColumnLoader._load_for_state)N)rR   rS   rT   rU   rV   rA   rQ   rc   rN   rp   rW   r    r    )rE   r!   rl   "  s   	
&rl   c               @   s&   e Zd ZdZdd ZejfddZdS )LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderc             C   s
   || _ d S )N)r   )rC   r   r    r    r!   rA     s    zLoadDeferredColumns.__init__c             C   s.   | j }|jj}|j| }|jt }|||S )N)r   r~   r7   r2   _strategiesrl   rp   )rC   rz   r   r   r   r   ru   r    r    r!   __call__  s
    

zLoadDeferredColumns.__call__N)rR   rS   rT   rU   rA   r   PASSIVE_OFFr   r    r    r    r!   r     s   r   c                   s$   e Zd ZdZdZ fddZ  ZS )AbstractRelationshipLoaderz0LoaderStratgies which deal with related objects.)r7   targetr$   entityc                s>   t t| || | jj| _| jj| _| jj| _| jj| _d S )N)r@   r   rA   rB   r7   r   r   r$   )rC   r1   rD   )rE   r    r!   rA     s
    


z#AbstractRelationshipLoader.__init__)rR   rS   rT   rU   rV   rA   rW   r    r    )rE   r!   r     s   r   c               @   s   e Zd ZdZdS )DoNothingLoaderzRelationship 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.

    N)rR   rS   rT   rU   r    r    r    r!   r     s   	r   Znoload)lazyc               @   s$   e Zd ZdZdZdd Zdd ZdS )NoLoaderzYProvide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=None".

    r    c             C   s    d| _ t| j|d| jjd d S )NT)r&   r(   )r^   r;   rB   collection_class)rC   r7   r    r    r!   rc     s    zNoLoader.init_class_attributec       	         s$    fdd}|d   j|f d S )Nc                s,    j r| j j| | n
d | j< d S )N)r$   r~   get_implr   Z
initialize)rz   dict_row)rC   r    r!   invoke_no_load  s    z5NoLoader.create_row_processor.<locals>.invoke_no_loadro   )r/   r   )	rC   rF   rH   rI   r7   rO   rJ   rP   r   r    )rC   r!   rQ     s    zNoLoader.create_row_processorN)rR   rS   rT   rU   rV   rc   rQ   r    r    r    r!   r     s   
r   selectraiseraise_on_sqlZbaked_selectc                   s   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
dd Zeddd Zeddd Zdd Z  ZS )
LazyLoaderz|Provide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=True", that is loads when first accessed.

    )
_lazywhere_rev_lazywhereuse_getis_aliased_class_bind_to_col_equated_columns_rev_bind_to_col_rev_equated_columns_simple_lazy_clause_raise_always_raise_on_sql_bakeryc                s  t t| || | jd dk| _| jd dk| _t| jj| _| j	j
}| \| _| _| _|jdd\| _| _| _| jd| | j | j o| j o| jjd j| jd| jjd| _| jrxDt| jD ]6}|| jjkrx$| jj| D ]}| j| | j|< qW qW | jd	|  d S )
Nr   r   r   T)Zreverse_directionz%s lazy loading clause %sr   )use_proxiesequivalentsz2%s will use query.get() to optimize instance loads)r@   r   rA   Zstrategy_optsr   r   r   r   r   rB   _join_conditionZcreate_lazy_clauser   r   r   r   r   r   Zloggerinfor$   _get_clausecomparer7   _equivalent_columnsr   r-   )rC   r1   rD   Zjoin_conditionrg   rM   )rE   r    r!   rA     s*    zLazyLoader.__init__c             C   sD   d| _ | jjp"| jjtjk	p"| j }t| j|d| j| jj	|d d S )NT)r&   r)   r(   r*   )
r^   rB   r*   r6   r   	MANYTOONEr   r;   rp   r   )rC   r7   r*   r    r    r!   rc   7  s    	zLazyLoader.init_class_attributec                sT   | j | j } g dd }t|i d|i  fdd}t|i d|i}|fS )Nc             S   s
   d| _ d S )NF)unique)	bindparamr    r    r!   visit_bindparamT  s    zFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparamr   c                sF   | j  kr$| j | j  d f n| jd krB| jd | jf d S )N)Z_identifying_keyr/   r   callablevalue)r   )bind_to_colparamsr    r!   r   Y  s    


)r   r   r   ZtraverseZcloned_traverse)rC   	criterionr   r    )r   r   r!   "_memoized_attr__simple_lazy_clauseO  s    z-LazyLoader._memoized_attr__simple_lazy_clausec             C   s   | j \}}|d kr(t|dd |D S | jj}| }t|}|tj@ rV|tjN }i }xR|D ]J\}	}
}|
d k	r|r|tj	@ r|
|||
|}n||||
|}|||	< q`W ||fS )Nc             S   s   g | ]\}}}|qS r    r    )rv   r   identr   r    r    r!   rx   p  s    z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>)r   sql_utilZadapt_criterion_to_nullrB   r1   objr   Zinstance_dictZINIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column)rC   rz   r   r   Z
param_keysr7   or   r   r   r   r   r    r    r!   _generate_lazy_clausek  s&    



z LazyLoader._generate_lazy_clausec             C   s   t d| |f d S )Nz&'%s' is not available due to lazy='%s')sa_excInvalidRequestError)rC   rz   r   r   r    r    r!   _invoke_raise_load  s    zLazyLoader._invoke_raise_loadc             C   s<  |j s | jjs|jr|js tjS |j  }d }|tj@ s<| jrJ|tj	@ sP|rPtj
S | jrn|tj@ sn| ||d t|}|s|tj@ rtj
S tdt|| j f | jr,| |||}tj
|krtj
S tj|krtjS t|rd S | j| j|||d}|d k	r|S |tj@ r&|tj@ s,tj
S | ||||S )Nr   zbParent instance %s is not bound to a Session; lazy load operation of attribute '%s' cannot proceed)r   Zlazy_loaded_from)r   rB   Zload_on_pendingZ_load_pendingZ
session_idr   r{   r|   r   ZNON_PERSISTENT_OKr}   r   ZNO_RAISEr   r   r   r   r   r   _get_ident_for_use_getZ	NEVER_SETr   
issupersetr   Z_identity_lookupr   ZRELATED_OBJECT_OK_emit_lazyload)rC   rz   r   pendingprimary_key_identityr   instancer    r    r!   rp     sP    





zLazyLoader._load_for_statec                sD   j j}tj@ r|jn|jj  fddjjD S )Nc                s"   g | ]} j | d qS ))r   )r   )rv   pk)r   get_attrr   rC   rz   r    r!   rx     s   z5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>)r~   r7   r   r   r   r   dictr`   )rC   r   rz   r   instance_mapperr    )r   r   r   rC   rz   r!   r     s    
z!LazyLoader._get_ident_for_use_getzsqlalchemy.ext.bakedc             C   s   |j ddS )N2   )size)bakery)rC   bakedr    r    r!   _memoized_attr__bakery  s    z!LazyLoader._memoized_attr__bakeryzsqlalchemy.orm.strategy_optionsc                s"   fdd}|dd j jjs:|jdd jjd k	rX|fdd j }|sn|tj@ r||dd  j	rj
j }|j	| jr܈jr|d ||fd	d|j|S jjr|fd
d xJjjD ]>jtjkr jr tjts |fdd q W |\ |rrttj ! rd S nttj"! rd S jr|d | fdd fdd}	||fdd|	# }
j$r|
S t%|
}|r|dkrt&dj  |
d S d S d S )Nc                s   |   jS )N)r   r   )r   )rC   r    r!   r"     s    z+LazyLoader._emit_lazyload.<locals>.<lambda>c             S   s   |   dS )NF)Z_adapt_all_clausesZ_with_invoke_all_eagers)qr    r    r!   r"     s    T)Zfullc                s   |   j jjS )N)select_fromr7   rB   	secondary)r   )rC   r    r!   r"     s   c             S   s
   |  dS )NF)Z	autoflush)r   r    r    r!   r"     s    r   c                s
   |   S )N)_set_lazyload_from)r   )rz   r    r!   r"   +  s    c                s   | j t jj  S )N)order_byr
   r.   rB   )r   )rC   r    r!   r"   3  s   c                s"   |  j| j j  jS )N)ZoptionsZLoadZfor_existing_path_current_pathr1   Zlazyloadr   )r   )revstrategy_optionsr    r!   r"   B  s   c                s
   |   S )N)filter)r   )lazy_clauser    r!   r"   U  s    c                s     | j  | _| S )N)updateZ_params)r   )r   r    r!   set_default_paramsY  s    z5LazyLoader._emit_lazyload.<locals>.set_default_paramsc                s
   |   S )N)r   )r   )rz   r    r!   r"   `  s    r   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   )'r   add_criteriarB   Zbake_queriesZspoilr   r   r   ZNO_AUTOFLUSHZload_optionsZ	load_path_add_lazyload_optionsr   r   r   Zwith_post_criteriaZ_load_on_pk_identityr   r7   r   Z_reverse_propertyr6   r   r   Z_use_getrt   ru   r   r   r
   Zhas_intersectionr   r   valuesZ
_never_setallr$   lenwarn)rC   r   r   rz   r   r   r   r   Zeffective_pathr   rO   lr    )r   r   r   rC   rz   r   r!   r     sj    


zLazyLoader._emit_lazyloadc       
         sh   | j  | js8t|jt |  }|d | j |f n,|jsD|jrd fdd}	|d | j |	f d S )Nro   c                s   |  |  d S )N)Z_reset)rz   r   r   )r   r    r!   reset_for_lazy_callable  s    	z@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable)	r   r^   r   Z"_instance_level_callable_processorr4   LoadLazyAttributer/   populate_existingZalways_refresh)
rC   rF   rH   rI   r7   rO   rJ   rP   Zset_lazy_callabler   r    )r   r!   rQ   t  s    
zLazyLoader.create_row_processor)rR   rS   rT   rU   rV   rA   rc   r   r   r   rp   r   r
   dependenciesr   r   rQ   rW   r    r    )rE   r!   r     s   
* F r   c               @   s&   e Zd ZdZdd ZejfddZdS )r   z-serializable loader object used by LazyLoaderc             C   s   || _ |j| _d S )N)r   rD   )rC   r   Zinitiating_strategyr    r    r!   rA     s    zLoadLazyAttribute.__init__c             C   s0   | j }|jj}|j| }|j| j }|||S )N)r   r~   r7   r2   r   rD   rp   )rC   rz   r   r   r   r   ru   r    r    r!   r     s
    
zLoadLazyAttribute.__call__N)rR   rS   rT   rU   rA   r   r   r   r    r    r    r!   r     s   r   Z	immediatec               @   s*   e Zd ZdZdd Zd	ddZdd ZdS )
ImmediateLoaderr    c             C   s   | j d| d S )N))r   r   )rB   rr   rc   )rC   r7   r    r    r!   rc     s    z$ImmediateLoader.init_class_attributeNc       	      K   s   d S )Nr    )	rC   rF   r   rH   rI   rJ   rK   parentmapperrL   r    r    r!   rN     s    zImmediateLoader.setup_queryc       	         s$    fdd}|d   j|f d S )Nc                s   |   j| | d S )N)r   r   r3   )rz   r   r   )rC   r    r!   load_immediate  s    z<ImmediateLoader.create_row_processor.<locals>.load_immediateZdelayed)r/   r   )	rC   rF   rH   rI   r7   rO   rJ   rP   r   r    )rC   r!   rQ     s    z$ImmediateLoader.create_row_processor)NN)rR   rS   rT   rV   rc   rN   rQ   r    r    r    r!   r     s
    
r   subqueryc                   s   e Zd ZdZ fddZdd ZdddZd	d
 Zdd Zdd Z	dd Z
dd Zdd ZG dd deZdd Zdd Zdd Z  ZS )SubqueryLoader)
join_depthc                s    t t| || | jj| _d S )N)r@   r   rA   rB   r   )rC   r1   rD   )rE   r    r!   rA     s    zSubqueryLoader.__init__c             C   s   | j d| d S )N))r   r   )rB   rr   rc   )rC   r7   r    r    r!   rc     s    z#SubqueryLoader.init_class_attributeNc             K   s  |j jsd S |j jr |j d || j }||jdd }	|	d k	rJ|	j}
n| j}
|jdtj	j
}|| }||jds| jr|j jr|j jjnd|j d | jkrd S n|| jrd S | |\}}}|jdtf|j }| |||||j}|j |
}dtf|d|i|_|d}| ||\}}}|j| }|j| }| |||||
}| ||||
}| |}||jd| d S )	Nr   path_with_polymorphic)Zsubquery_pathNloaderr   r   
orig_queryF)r   _enable_eagerloads
_yield_per_no_yield_perrB   r3   r   r   r   PathRegistryrootcontainsr   r   lengthcontains_mapperr7   _get_leftmostr   _generate_from_original_queryentity_zeror   _attributesZ_set_enable_single_crit_prep_for_joinsr   Zadd_columns_apply_joins_setup_options_setup_outermost_orderbyra   )rC   rF   r   rH   rI   rJ   rK   r   rL   with_poly_infoeffective_entity	subq_pathleftmost_mapperleftmost_attrleftmost_relationshipr   
left_aliasr   to_join
local_attrparent_aliasr    r    r!   rN     sX    





zSubqueryLoader.setup_queryc                sp   j td }| j|r>| jd kr>| j| j  }n|d   }|j} fdd|D } ||fS )Nr   r   c                s$   g | ]}t d  j j| jqS )r   )getattrr   _columntopropertyr   )rv   rM   )r  r  r    r!   rx   G  s   z0SubqueryLoader._get_leftmost.<locals>.<listcomp>)rH   r   Z_class_to_mapperr1   isarB   local_columns)rC   r  Zsubq_mapperZleftmost_propZleftmost_colsr  r    )r  r  r!   r   7  s    zSubqueryLoader._get_leftmostc             C   s   |  d }|js4|ttdd |jD d ||}|| |j	}|dkr^d|_
n<|d krx2tdd |D D ]}	t||	jszd|_
P qzW |jdkr|j|_|jd kr|jd krd |_|  }
tj||
dd}|S )Nc             S   s    g | ]}|d  dk	r|d  qS )r   Nr    )rv   Zentr    r    r!   rx   d  s   z@SubqueryLoader._generate_from_original_query.<locals>.<listcomp>FTc             s   s   | ]}|j V  qd S )N)table)rv   rM   r    r    r!   	<genexpr>{  s    z?SubqueryLoader._generate_from_original_query.<locals>.<genexpr>)use_mapper_path)Z_cloneZ	correlate	_from_objZ_set_select_fromr-   ra   Zcolumn_descriptionsZ_adapt_col_listZ_set_entitiesdistinct_target_keyZ	_distinctr   r`   Z	_order_byr   Z_limitZ_offsetZwith_labelsr   r   AliasedClass)rC   r   r  r  r  Zorig_entityr   Ztarget_colsr  tZembed_qr  r    r    r!   r   O  s4    



z,SubqueryLoader._generate_from_original_queryc                s   g }t | }xZt|D ]N\}\}}|dkrT||d  d j}||rN|n|}	n|}	||	|jf qW t|dk r~| n.t|d d }
|
j	r|
j
 ntj|
j
dd jj} fdd|D }|| fS )	Nr   r   r   T)r  c                s    g | ]}t  jj| jqS r    )r	  r1   r
  r   )rv   rM   )r  rC   r    r!   rx     s   z2SubqueryLoader._prep_for_joins.<locals>.<listcomp>)r-   pairs	enumerater7   r  r/   r   r   r   r   r   r   r  rB   r  )rC   r  r  r  r  ir7   r   Zprev_mapperZ	to_appendr   
local_colsr  r    )r  rC   r!   r     s&    zSubqueryLoader._prep_for_joinsc             C   s<  t |}|dkr,t||d d |g}n|dkrft||d d |t||d d |g}n|dkrdd |dd D }g }xP|r|d}	t|	d |	d }
|r|
|d d }
n
|
|}
||
 qW t||d d |d jg| t||d d |g }x|D ]}
|j|
dd}q W |S )	Nr   r   r   r  c             S   s:   g | ]2}t |d  js$t|d  n|d  j|d fqS )r   r   )r   r   r   r  r   )rv   itemr    r    r!   rx     s   z/SubqueryLoader._apply_joins.<locals>.<listcomp>T)Zfrom_joinpoint)r   r	  of_typepopr/   r1   join)rC   r   r  r  r  r   ZltjZmiddleinnerr  attrr    r    r!   r     s0    



"

zSubqueryLoader._apply_joinsc             C   s(   | |}|j|j }|jr$|j|_|S )N)Z_with_current_pathZ_conditional_options_with_options_populate_existing)rC   r   r  r   r   r    r    r!   r     s
    
zSubqueryLoader._setup_optionsc             C   s6   | j jr2|jd }|jt| j j}|j| }|S )Nr   )rB   r   r  _target_adaptercopy_and_processr
   r.   )rC   r   	eagerjoineager_order_byr    r    r!   r     s    

z'SubqueryLoader._setup_outermost_orderbyc               @   s4   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdS )zSubqueryLoader._SubqCollectionszGiven 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.

        Nc             C   s
   || _ d S )N)subq)rC   r%  r    r    r!   rA     s    z(SubqueryLoader._SubqCollections.__init__c             C   s    | j d kr|   | j ||S )N)_data_loadr3   )rC   r   r   r    r    r!   r3     s    
z#SubqueryLoader._SubqCollections.getc             C   s&   t dd t| jdd D | _d S )Nc             s   s$   | ]\}}|d d |D fV  qdS )c             S   s   g | ]}|d  qS )r   r    )rv   vvr    r    r!   rx     s    zCSubqueryLoader._SubqCollections._load.<locals>.<genexpr>.<listcomp>Nr    )rv   ry   vr    r    r!   r    s   z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>c             S   s   | dd  S )Nr   r    )xr    r    r!   r"     s    z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>)r   	itertoolsgroupbyr%  r&  )rC   r    r    r!   r'    s    z%SubqueryLoader._SubqCollections._loadc             C   s   | j d kr|   d S )N)r&  r'  )rC   rz   r   r   r    r    r!   r   "  s    
z&SubqueryLoader._SubqCollections.loader)	rR   rS   rT   rU   r&  rA   r3   r'  r   r    r    r    r!   _SubqCollections  s   r-  c                s   | j j| j jjs td|  || j }||j	d}|d krDd S |j
|j
ksXtd| jj}	||j	d}
|
d kr| |}
||j	d|
  r fdd|	D }	| jr| ||
|	| n| ||
|	| d S )NzJ'%s' does not support object population - eager loading cannot be applied.r   zlSubquery session doesn't refer to that of our context.  Are there broken context caching schemes being used?collectionsc                s   g | ]} j | qS r    )r?   )rv   rM   )rJ   r    r!   rx   G  s    z7SubqueryLoader.create_row_processor.<locals>.<listcomp>)r1   r4   r   implsupports_populationr   r   rB   r3   r   r   AssertionErrorr  r-  ra   r$   _create_collection_loader_create_scalar_loader)rC   rF   rH   rI   r7   rO   rJ   rP   r%  r  r.  r    )rJ   r!   rQ   &  s,    

z#SubqueryLoader.create_row_processorc                sf    fddfdd}|d  jf |d  j|f |jrb|d  j jf d S )Nc                s8    t fddD d}| j| || d S )Nc                s   g | ]} | qS r    r    )rv   rg   )r   r    r!   rx   W  s    z_SubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq.<locals>.<listcomp>r    )r3   tupler   r   set_committed_value)rz   r   r   
collection)r.  r  rC   )r   r!   load_collection_from_subqU  s    zKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqc                s   j |kr | || d S )N)r   )rz   r   r   )r7  rC   r    r!   &load_collection_from_subq_existing_row]  s    
zXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowro   existingeager)r/   r   invoke_all_eagersr   )rC   rF   r.  r  rP   r8  r    )r.  r7  r  rC   r!   r2  R  s    z(SubqueryLoader._create_collection_loaderc                sf    fddfdd}|d  jf |d  j|f |jrb|d  j jf d S )Nc                sZ    t fddD d}t|dkr8td  |d }| j| || d S )Nc                s   g | ]} | qS r    r    )rv   rg   )r   r    r!   rx   n  s    zWSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq.<locals>.<listcomp>)Nr   zLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )r3   r4  r   r
   r   r   r   r5  )rz   r   r   r6  Zscalar)r.  r  rC   )r   r!   load_scalar_from_subql  s    zCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subqc                s   j |kr | || d S )N)r   )rz   r   r   )r<  rC   r    r!   "load_scalar_from_subq_existing_rowy  s    
zPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowro   r9  r:  )r/   r   r;  r   )rC   rF   r.  r  rP   r=  r    )r.  r<  r  rC   r!   r3  i  s    z$SubqueryLoader._create_scalar_loader)NN)rR   rS   rT   rV   rA   rc   rN   r   r   r   r   r   r   objectr-  rQ   r2  r3  rW   r    r    )rE   r!   r     s    
[A/4
,r   Zjoinedc                   s   e Zd ZdZdZ fddZdd Zdd	d
Zdd Zdd Z	dd Z
dd Zdd Zd ddZdd Zdd Zdd Zdd Z  ZS )!JoinedLoaderzcProvide loading behavior for a :class:`.RelationshipProperty`
    using joined eager loading.

    )r   _aliased_class_poolc                s&   t t| || | jj| _g | _d S )N)r@   r?  rA   rB   r   r@  )rC   r1   rD   )rE   r    r!   rA     s    
zJoinedLoader.__init__c             C   s   | j d| d S )N))r   r   )rB   rr   rc   )rC   r7   r    r    r!   rc     s    z!JoinedLoader.init_class_attributeNFc	             K   s:  |j jsdS |j jr&| jr&|j d || j }d}
|rD| ||nd}|dk	rj| |||||\}}}nZ||j	ds| j
r|jd | j
krdS n|| jrdS | ||||||||\}}}}||j	dd}|dk	r|j}
nd}
|| j }tj|| j|||||
| j|d	 |dk	r6dt|jkr6tddS )	z@Add a left outer join to the statement that's being constructed.Nzjoined collectionFr   r   r   )with_polymorphicr   chained_from_outerjoinzDetected 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$   r   rB   _init_user_defined_eager_proc$_setup_query_on_user_defined_adapterr   r   r   r   r   r7   _generate_row_adapterr3   Zwith_polymorphic_mappersr   r   Z_setup_entity_queryra   secondary_columnsr   r   )rC   rF   rG   rH   rI   rJ   rK   r   rB  rL   rA  user_defined_adapterclausesadd_to_collectionr   r    r    r!   rN     s\    

zJoinedLoader.setup_queryc       	      C   s   d|j krdS |jj}||jdd}|dk	r2|S |j d }|dd  \}}|d k	r~t|trj|j|}t	j
||jjd}nD||jdr||jd}tj|j|jjd}n|jj|jd }||jd| |S )NZeager_from_aliasF user_defined_eager_row_processor)r   r   )rk   rH   r1   r3   r   rt   strr   aliasr   ZColumnAdapterr7   r   r   r   
ORMAdapterr   r   Z_polymorphic_adaptersra   )	rC   rI   rF   rH   rJ   rM  Zroot_mapperr   r   r    r    r!   rC    s2    




z*JoinedLoader._init_user_defined_eager_procc             C   sZ   | |j|}|r2|r2||}||jd| n|rJ|}||jd| |j}|||fS )NrJ  )Z_get_entity_clausesr   wrapra   r   primary_columns)rC   rF   r   rH   rJ   rG  rI  r    r    r!   rD  (  s    
z1JoinedLoader._setup_query_on_user_defined_adapterc             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rtj| j	|d k	r|j
ddnd ddd}t |jj | j| | j| S )NZjoinedloader_acr   r   T)flat)rM  rQ  r  )r   r   r   
selectabler   r   r@  r   r  r7   rM  rM   r/   )rC   rF   Zalt_selectabler   idxto_adaptr    r    r!   _gen_pooled_aliased_classB  s"    
z&JoinedLoader._gen_pooled_aliased_classc	             C   s   | |jdd }	|	r|	j}
n
| |}
t|
jd| ftj|
| jj	dddd}|j
d k	sZt| jjrhd|_|d k	r|j d| jjn| jj}|sd}|j| j||||||||f	 |j}||jd| ||||fS )Nr   Zjoinedloader_ormadapterTF)r   Zadapt_requiredZallow_label_resolveZanonymize_labels	innerjoineager_row_processor)r3   r   r   rU  r   Z_memor   rN  r7   r   aliased_classr1  rB   r$   multi_row_eager_loadersrk   rV  Zcreate_eager_joinsr/   _create_eager_joinrF  ra   )rC   rF   r   rH   rI   rJ   rK   r   rB  r   rT  rH  rV  rI  r    r    r!   rE  e  sB    
z"JoinedLoader._generate_row_adapterc	             C   s$  |d kr|j }	n|}	|jo |jj}
d }||jkr|
s|jrt|j|j}t	|dkr`t
d|r|j|d  }|d | }}|d kr||j }}|j||}|rt|dd rt|j|	| jr|	n| j}t|j| j| j}n ttj| j|jdd| j| j}n| j}|jd k	s"t| pB| pB|dkpB|jj}|rtj||j|| px|jjpx|oxt|tj| j| j d}n| ||||}||j|< |j|_ |sxDt!| jj"D ]2}|	j#j$%|r|r|j&| }|j'(| qW | jj)r | j*|j+,t-.| jj)7  _*d S )	Nr   zCan't identify which query entity in which to joined eager load from.   Please use an exact match when specifying the join path.r   rX  T)r  Zunnested)isouter
_left_memo_right_memo)/r7   rY  r   Z_should_nest_selectableZeager_joinsZfrom_clauser   Z#find_left_clause_that_matches_givenrR  r   r   r   
setdefaultr	  r   rX  Z_entity_for_mapperr  r1   r   r   rB   r   r  r1  r   Zrepresents_outer_join_ORMJoinrt   r   ZJoin_splice_nested_inner_joinZstop_onZ_find_columnsZprimaryjoinZpersist_selectablerM   Zcontains_columnr?   rP  r/   r   r$  r!  r"  r
   r.   )rC   rF   rG   rH   rJ   r   rH  rV  rB  r   Zshould_nest_selectableZquery_entity_keyZindexesZclauseZdefault_towrapZtowrapZefmonclauseZattach_on_outsider#  rg   r    r    r!   rZ    s    








zJoinedLoader._create_eager_joinc       	      C   s4  |dkrt |tjsvtn\t |tjjr<| ||j|||S t |tjsv|d |krrtj||j	|d||d j
dS d S | ||j|||j}|d krd}| ||j|||j}|d kr|dk	stdd S nd}|r|js|js||}ntj|j||j|j|jd}ntj||j|j|j|jd}|j|_|S )	NFrK  r  )r[  r\  r]  z9assertion failed attempting to produce joined eager loadsT)r[  r\  )r[  r]  )rt   r   r_  r1  r   rR  ZFromGroupingr`  elementrX  r7   rightr]  leftr\  r[  Z_splice_into_centerra  r!  )	rC   rH   Zjoin_objrH  ra  ZsplicingZtarget_joinZright_splicer#  r    r    r!   r`  4  sV    

z&JoinedLoader._splice_nested_inner_joinc             C   sz   |r|  ||nd}|dk	rF|}|jr8|r8||j}q`|jr`|j}n||jd}|d kr`dS | j||rr|S dS d S )NFrW  )rC  rJ   rO  r3   r   r7   Z_result_has_identity_key)rC   rF   rO   rJ   rH   rI   rG  Z	decoratorr    r    r!   _create_eager_adapterz  s    
z"JoinedLoader._create_eager_adapterc          	   C   s   | j j| j jjs td|  || j }| |||||}	|	dk	r| j}
t	
| j|||| j |	}| js|| ||
|| q| ||
|| n| jd||||||| d S )NzJ'%s' does not support object population - eager loading cannot be applied.F))r   r   )r1   r4   r   r/  r0  r   r   rB   re  r   Z_instance_processorr7   r   r$   r3  r2  rr   rQ   )rC   rF   rH   rI   r7   rO   rJ   rP   Zour_pathZeager_adapterr   	_instancer    r    r!   rQ     s,    
z!JoinedLoader.create_row_processorc                sr    fdd} fdd} fdd}|d  | j|f |d  | j|f jrn|d	  | j|f d S )
Nc                sF   t | |}t|d}|j | f<  |}|d k	rB|| d S )Nappend_without_event)r   init_state_collectionr
   UniqueAppenderr/   )rz   r   r   r6  result_listinst)rf  rF   r   r    r!   #load_collection_from_joined_new_row  s    zSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_rowc                sd   | fj krj | f }n(t | |}t|d}|j | f<  |}|d k	r`|| d S )Nrg  )r   rh  r
   ri  r/   )rz   r   r   rj  r6  rk  )rf  rF   r   r    r!   (load_collection_from_joined_existing_row  s    
zXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_rowc                s    | d S )Nr    )rz   r   r   )rf  r    r!    load_collection_from_joined_exec  s    zPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execro   r9  r:  )r/   r   r;  )rC   rF   r   rf  rP   rl  rm  rn  r    )rf  rF   r   r!   r2    s    
z&JoinedLoader._create_collection_loaderc                sp    fdd} fdd} fdd}|d  j|f |d  j|f |jrl|d	  j|f d S )
Nc                s    ||< d S )Nr    )rz   r   r   )rf  r   r    r!   load_scalar_from_joined_new_row  s    zKJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_new_rowc                s8    |}|kr,|| k	r4t d  n||< d S )NzLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' )r
   r   )rz   r   r   r9  )rf  r   rC   r    r!   $load_scalar_from_joined_existing_row  s    
zPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_rowc                s    | d S )Nr    )rz   r   r   )rf  r    r!   load_scalar_from_joined_exec  s    zHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execro   r9  r:  )r/   r   r;  )rC   rF   r   rf  rP   ro  rp  rq  r    )rf  r   rC   r!   r3    s    z"JoinedLoader._create_scalar_loader)NNF)F)rR   rS   rT   rU   rV   rA   rc   rN   rC  rD  rU  rE  rZ  r`  re  rQ   r2  r3  rW   r    r    )rE   r!   r?    s$     
U0#@ 
E',r?  Zselectinc                   sh   e Zd ZdZdZ fddZdd Zdd Zd	d
 Ze	
ddd Zdd Ze	
ddd Z  ZS )SelectInLoader)r   	omit_join_parent_alias_in_expr_pk_cols	_zero_idxr   i  c                s|   t t| || | jj| _| jjd k	r4| jj| _n,| jd}| jjd j	|j
d| jjd| _| jrp|   n|   d S )N))r   r   r   T)r   r   )r@   rr  rA   rB   r   rs  rr   r1   r   r   r   r   _init_for_omit_join_init_for_join)rC   r1   rD   Z
lazyloader)rE   r    r!   rA     s    

zSelectInLoader.__init__c                s|   t jjj   fddt D   fddjjD  _}t	|dkrht
j| _d_n|d _d_d S )	Nc             3   s0   | ](}j j|d D ]}| | fV  qqdS )r    N)r1   r   r3   )rv   ry   Zequiv)pk_to_fkrC   r    r!   r  7  s   z5SelectInLoader._init_for_omit_join.<locals>.<genexpr>c                s   g | ]}| kr | qS r    r    )rv   rg   )rz  r    r!   rx   =  s    z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>r   Fr   T)r   rB   r   Zlocal_remote_pairsr   r-   r1   r`   rv  r   r   tuple_ru  rw  )rC   Zfk_colsr    )rz  rC   r!   rx  2  s    
z"SelectInLoader._init_for_omit_joinc                sh   t | jj| _t| j  fdd| jjD  | _}t|dkrTtj	| | _
d| _n|d | _
d| _d S )Nc                s   g | ]}  |qS r    )_adapt_element)rv   rg   )pa_inspr    r!   rx   J  s    z1SelectInLoader._init_for_join.<locals>.<listcomp>r   Fr   T)r   r1   r5   rt  r   r`   rv  r   r   r{  ru  rw  )rC   pk_colsr    )r}  r!   ry  F  s    

zSelectInLoader._init_for_joinc             C   s   | j d| d S )N))r   r   )rB   rr   rc   )rC   r7   r    r    r!   rc   S  s    z#SelectInLoader.init_class_attributezsqlalchemy.ext.bakedc             C   s   |j ddS )Nr   )r   )r   )rC   r   r    r    r!   r   X  s    z%SelectInLoader._memoized_attr__bakeryc             C   s   | j j| j jjs td|  |jjp.t	j
j| }t	|d | j sJd S tj||| jr`d S || j }	|| j }
|	|jdd }|d k	r|j}n| j}|	|jds| jr|
jd | jkrd S n|
| jrd S tj||| j | j| j| d S )NzJ'%s' does not support object population - eager loading cannot be applied.r  r   r   r   )r1   r4   r   r/  r0  r   r   r   r   r   r   r   Z_entity_isar   ZPostLoadZpath_existsrB   r3   r   r   r   r   r   r   r7   Zcallable_for_path_load_for_path)rC   rF   rH   rI   r7   rO   rJ   rP   Zselectin_pathZpath_w_propZselectin_path_w_propr   r   r    r    r!   rQ   \  s<    

z#SelectInLoader.create_row_processorc                sj  |rj |krd S dd |D }jjjrntjrnfddD fddD fdd}jr|fdd nj	|fdd |fd	d |j
}	||	j|j  |	jr|d
d  jjrZjrDjj jr0fdd D  | fdd nfdd}
||
 j}|rjdnd }x|rd|dj }|jd  }dd t||jjfdd|D ddd D }x|D ]\}}}|sj |jkrq|||}|sB|rBt|dkr$td  |j ||j|d  n|j ||j| qW qpW d S )Nc             S   s    g | ]\}}|j d  ||fqS )r   )r   )rv   rz   	overwriter    r    r!   rx     s    z1SelectInLoader._load_for_path.<locals>.<listcomp>c                s   g | ]}  |qS r    )r|  )rv   rg   )inspr    r!   rx     s    c                s   g | ]}  |qS r    )r|  )rv   rg   )r  r    r!   rx     s    c                s   |  t jd  S )Nr   )r   )r   ZBundle)r   )r   r~  r    r!   r"     s   z/SelectInLoader._load_for_path.<locals>.<lambda>c                s
   |   S )N)r   )r   )r   r    r!   r"     s    c                s    |  tjj S )N)r   r  r	  rB   r   r  )r   )r   parC   r    r!   r"     s   
c                s    |   tjdddj S )Nprimary_keysT)Z	expanding)r   Zin_r   r   r   )r   )in_exprr~  r    r!   r"     s   c             S   s   |   S )N)r   )r   r    r    r!   r"     s    c                s   g | ]}  |qS r    )r|  )rv   elem)r  r    r!   rx     s    c                s
   | j   S )N)r   )r   )r$  r    r!   r"     s    c                s&   | j d }| j|jt jj S )Nr   )r  r   r!  r"  r
   r.   rB   )r   r#  )rC   r    r!   r     s    
z?SelectInLoader._load_for_path.<locals>._setup_outermost_orderbyr    r   c             S   s    i | ]\}}d d |D |qS )c             S   s   g | ]}|d  qS )r   r    )rv   r(  r    r    r!   rx     s    z<SelectInLoader._load_for_path.<locals>.<dictcomp>.<listcomp>r    )rv   ry   r)  r    r    r!   
<dictcomp>  s   z1SelectInLoader._load_for_path.<locals>.<dictcomp>c                s$   g | ]\}}} j r|d  n|qS )r   )rw  )rv   r   rz   r  )rC   r    r!   rx     s   )r  c             S   s   | d S )Nr   r    )r*  r    r    r!   r"     s    r   zLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' )r   rv  ru  rs  r   r   r|  r   r   rt  r   r   r  rB   r   r   r$   
_chunksizer+  r,  r   r   r   r3   r   r
   r   r   r5  )rC   r   rF   rH   ZstatesZ	load_onlyr   Z
our_statesr   r   r   r$   Z_empty_resultchunkdatar   rz   r  r6  r    )r$  r   r  r  r  r~  rC   r!   r    st    





zSelectInLoader._load_for_path)rR   rS   rT   rV   r  rA   rx  ry  rc   r
   r   r   rQ   r  rW   r    r    )rE   r!   rr    s   	1rr  c                sT   fdd  fdd} fdd}t j| d|dddd	 t j| d
|dddd	 d S )Nc                sP   |d k	rL|j  j krL|t|}|rL||k	rLtdt|| j f |S )NzsInstance %s is already associated with an instance of %s via its %s attribute, and is only allowed a single parent.)	r   	hasparentr   Zinstance_stater   r   r   Zinstance_strr5   )rz   r   oldvalue	initiatorr  )r   r    r!   	_do_check	  s    z*single_parent_validator.<locals>._do_checkc                s    | |d |S )Nr    )rz   r   r  )r  r    r!   r/   "	  s    z'single_parent_validator.<locals>.appendc                s    | |||S )Nr    )rz   r   r  r  )r  r    r!   set_%	  s    z%single_parent_validator.<locals>.set_r/   T)rawZretvalr*   ra   )r   Zlisten)r   r   r/   r  r    )r  r   r!   r0   	  s    r0   )NNNNFN)5rU   r+   r   r   r   r   r   r   r   r	   r
   r   baser   r   r   r   r   r   rz   r   r   r   r   r   r   r   r   r   r   r;   ZColumnPropertyZstrategy_forr>   Zclass_loggerrX   ri   rl   r>  r   r   ZRelationshipPropertyr   r   ZMemoizedSlotsr   r   r   r   r?  rr  r0   r    r    r    r!   <module>	   s        
M#
B
; 

   "
   @       