U a @sdZddlmZddlZddlZddlmZddlmZddlm Z ddlm Z dd lm Z dd lm Z dd lm Z dd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddl mZddl mZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlmZ#ddlm$Z$ddlm%Z%ddlm&Z&ddlmZddl&mZ'dd l&m(Z(dd!l)m*Z*dUd#d$Z+e j,j-d"d"d%Gd&d'd'eZ.e%j/e j,j-d(d"d%Gd)d*d*eZ0e%j/e j,j-d(d+Gd,d-d-e0Z1e%j/e j,j-d(d(d.e j,j-d(d(d(d/e j,j-d(d0Gd1d2d2eZ2Gd3d4d4e3Z4Gd5d6d6eZ5e%j/ej6j-d(d0Gd7d8d8eZ7e%j/ej6j-d9d:ej6j-dd:Gd;d<dd:ej6j-d?d:ej6j-d@d:GdAdBdBe5ej9Z:GdCdDdDe3Z;GdEdFdFe5Ze%j/ej6j-dMd:ej6j-d"d:GdNdOdOe5Z?e%j/ej6j-dPd:GdQdRdReGs z%_register_attribute..cst|Sr!)rZbackref_listenersr$)backrefuselistr)r*r+Us) Z parent_tokenr-compare_function useobjectZ trackparent typecallable callable_active_history impl_classZsend_modified_eventsdoc)r-Z single_parentappendsingle_parent_validatorr#parentZ validatorsr Ztrack_cascade_eventsZback_populatesZ_effective_sync_backrefZself_and_descendants_propsget class_managerZ_attr_has_implrZregister_attribute_implclass_ directionrZ ONETOMANYZviewonlyr4)r&mapperr/r.r0r1Zproxy_propertyr2r3kwZ listen_hooksmr%hookr))r,r'r(r-r*_register_attribute0sZ            rA) instrumentdeferredcs6eZdZdZdZfddZd ddZdd ZZS) UninstrumentedColumnLoaderzRepresent a non-instrumented MapperProperty. The polymorphic_on argument of mapper() often results in this, if the argument is against the with_polymorphic selectable. columnscs tt||||jj|_dSr!)superrD__init__parent_propertyrFselfr7 strategy_key __class__r)r*rHsz#UninstrumentedColumnLoader.__init__Nc Ks(|jD]}|r|j|}||qdSr!)rFr5) rK compile_state query_entitypathloadoptadaptercolumn_collectionkwargscr)r)r* setup_querys  z&UninstrumentedColumnLoader.setup_queryc CsdSr!r) rKcontextrPrQrRr=resultrS populatorsr)r)r*create_row_processors z/UninstrumentedColumnLoader.create_row_processor)N) __name__ __module__ __qualname____doc__ __slots__rHrWr\ __classcell__r)r)rMr*rDs  rDTcs>eZdZdZdZfddZd ddZdd Zd d ZZ S) ColumnLoaderz8Provide loading behavior for a :class:`.ColumnProperty`.)rF is_compositecs.tt||||jj|_t|jd|_dS)Ncomposite_class)rGrcrHrIrFhasattrrdrJrMr)r*rHs zColumnLoader.__init__Fc Ksh|jD]:} |r6|r,|| } | dkr6dSn |j| } || q|jd} |rZ|j| } | ||j<dSNr)rFZadapt_check_presentr5rI) rKrOrPrQrRrSrTmemoized_populatorsZcheck_for_adaptrUrVfetchr)r)r*rWs      zColumnLoader.setup_querycCs`d|_|jdj}|jjpD|jdjpD|jdk oD|j|jd|jk}t |j|d|j |ddS)NTrF)r/r.r2) is_class_levelrFtyperIr2 primary_keyZversion_id_col_columntopropertyr9rAcompare_values)rKr=Zcoltyper2r)r)r*init_class_attributes"    z!ColumnLoader.init_class_attributec CsZ|jD]:} |r|j| } || d} | r|d|j| fqVq|d|jdfdS)NFquickexpireT)rF_getterr5r#) rKrYrPrQrRr=rZrSr[colgetterr)r)r*r\s   z!ColumnLoader.create_row_processor)F) r]r^r_r`rarHrWror\rbr)r)rMr*rcs  rc)Zquery_expressioncs4eZdZfddZddZddZddZZS) ExpressionColumnLoadercs@tt|||tdtfdd|jjD|_ dS)Nc3s|]}| VqdSr!)compare.0rVnullr)r* sz2ExpressionColumnLoader.__init__..) rGrurHrrzlabelanyrIrF_have_default_expressionrJrMryr*rHs  zExpressionColumnLoader.__init__c Ksd} |r d|jkr |jdg} n|jr.|jj} | dkr:dS| D]} |rP|j| } || q>| d} |rr|j| } | ||j<dS)N expressionr) local_optsr~rIrFr5) rKrOrPrQrRrSrTrhrUrFrVrir)r)r*rWs    z"ExpressionColumnLoader.setup_queryc Csr|rnd|jkrn|jdg} | D]:} |r0|j| } || d} | r|d|j| fqnq|d|jdfdS)NrFrprqT)rrFrrr5r#) rKrYrPrQrRr=rZrSr[rFrsrtr)r)r*r\1s    z+ExpressionColumnLoader.create_row_processorcCs(d|_t|j|d|jdjjdddS)NTFr)r/r.Zaccepts_scalar_loader)rjrArIrFrkrnrKr=r)r)r*roKs z+ExpressionColumnLoader.init_class_attribute)r]r^r_rHrWr\rorbr)r)rMr*rus ru)rCrB)rCrB raiseload)Z do_nothingcsNeZdZdZdZfddZddZddZdd d Zd d Z ddZ Z S)DeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)rFgrouprcsNtt|||t|jdr&td|jdd|_|jj |_ |jj |_ dS)Nrez8Deferred loading for composite types not implemented yetrF) rGrrHrfrINotImplementedError strategy_optsr9rrFrrJrMr)r*rHbs  zDeferredColumnLoader.__init__c CsL|js4|jr|jj} n|jj} |d|j| fn|d|jdfdS)NnewrqF)rjrrIZ_raise_column_loaderZ_deferred_column_loaderr5r#) rKrYrPrQrRr=rZrSr[Zset_deferred_for_local_stater)r)r*r\lsz)DeferredColumnLoader.create_row_processorcCs,d|_t|j|d|jdjj|jdddS)NTFr)r/r.r1Zload_on_unexpire)rjrArIrFrkrn_load_for_staterr)r)r*ros z)DeferredColumnLoader.init_class_attributeNc Ks|jjr|jjs^|r2d|jkr2t|j|jj s^|rP|j rP|j d|j ds^|r|j |kr|j dj|||||||f| n.|jrt||j<n|jst||j<n t||j<dS)NZ undefer_pkszundefer_group_%sF))rCFrBT)compile_optionsZ_render_for_subqueryrIZ_renders_in_subqueriesrsetrF intersectionr7Z_should_undefer_in_wildcardrr9r# _get_strategyrWrjrrrr) rKrOrPrQrRrSrTrhonly_load_propsr>r)r)r*rWsV      z DeferredColumnLoader.setup_querycsjs tjS|tj@stjSjj}jr@fdd|jD}njg}fdd|D}t }|dkrt dt jfjr|dtj|t|tj|ddkrt tjS)Ncs4g|],}t|trt|jtr|jjkr|jqSr)) isinstancerstrategyrrr#)rxprKr)r* s    z8DeferredColumnLoader._load_for_state..csg|]}|jkr|qSr))Z unmodified)rxk)stater)r*rs zfParent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceedraise)r refresh_state)r#r ATTR_EMPTYSQL_OKPASSIVE_NO_RESULTmanagerr=rZiterate_propertiesrorm_excDetachedInstanceErrorr" state_strr_invoke_raise_loadrZ load_on_identrselectset_label_styler ZObjectDeletedError ATTR_WAS_SET)rKrpassive localparentZtoloadrsessionr))rKrr*rsD     z$DeferredColumnLoader._load_for_statecCstd|fdS)Nz+'%s' is not available due to raiseload=Truesa_excInvalidRequestErrorrKrrlazyr)r)r*rsz'DeferredColumnLoader._invoke_raise_load)N) r]r^r_r`rarHr\rorWrrrbr)r)rMr*rWs ! 52rc@s(eZdZdZdddZejfddZdS) LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderFcCs||_||_dSr!)r#r)rKr#rr)r)r*rH szLoadDeferredColumns.__init__cCs>|j}|jj}|j|}|jr$d}nd}||}|||S)N)rCTr)rT)rr)r#rr=r8rrr)rKrrr#rr&rLrr)r)r*__call__ s  zLoadDeferredColumns.__call__N)F)r]r^r_r`rHr PASSIVE_OFFrr)r)r)r*rs rcs$eZdZdZdZfddZZS)AbstractRelationshipLoaderz0LoaderStratgies which deal with related objects.)r=targetr-entitycs>tt||||jj|_|jj|_|jj|_|jj|_dSr!)rGrrHrIr=rrr-rJrMr)r*rH#s    z#AbstractRelationshipLoader.__init__)r]r^r_r`rarHrbr)r)rMr*rsrc@seZdZdZdS)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)r]r^r_r`r)r)r)r*r+srZnoload)rc@s$eZdZdZdZddZddZdS)NoLoaderzYProvide loading behavior for a :class:`.RelationshipProperty` with "lazy=None". r)cCs d|_t|j|d|jjddS)NT)r/r0)rjrArIcollection_classrr)r)r*roBszNoLoader.init_class_attributec s$fdd} |dj| fdS)Ncs&jrt||jn d|j<dSr!)r-rinit_state_collectionr#rdict_rowrr)r*invoke_no_loadWsz5NoLoader.create_row_processor..invoke_no_loadr)r5r#) rKrYrPrQrRr=rZrSr[rr)rr*r\Ls zNoLoader.create_row_processorN)r]r^r_r`raror\r)r)r)r*r7s rrr raise_on_sqlZ baked_selectcsxeZdZdZdZfddZddZddZd d Zd d Z dddZ ddZ ddZ e dddZddZZS) LazyLoaderz|Provide loading behavior for a :class:`.RelationshipProperty` with "lazy=True", that is loads when first accessed. ) _lazywhere_rev_lazywhereZ_lazyload_reverse_option _order_byuse_getis_aliased_class _bind_to_col_equated_columns_rev_bind_to_col_rev_equated_columns_simple_lazy_clause _raise_always _raise_on_sql _lambda_cachecs<tt||||jddk|_|jddk|_t|jj|_|j j }| \|_ |_ |_|j dd\|_|_|_|j jrddt|j jD|_nd|_|jd||j |j o|j o|jjd j|j dd |jjd |_|jr8t|jD]4}||jjkr|jj|D]}|j||j|<qq|jd |dS) NrrrT)Zreverse_directioncSsg|]}t|ddiqS) _orm_adaptT)sql_util_deep_annotaterxelemr)r)r*rsz'LazyLoader.__init__..z%s lazy loading clause %srFZ use_proxiesZ compare_keys equivalentsz4%s will use Session.get() to optimize instance loads)rGrrHrrrrrrrI_join_conditionZcreate_lazy_clauserrrrrrorder_byr to_listrloggerinfor- _get_clauservr=_equivalent_columnsrlist)rKr7rLZjoin_conditionrsrVrMr)r*rH}sP      zLazyLoader.__init__c Csvd|_|jj}|jjr d}d}n4|jjtjk s4|jsL|rBd}d}qTd}d}nd}}t|j|d|j |jj ||ddS)NTF)r/r1r0r2_deferred_history) rjrI_legacy_inactive_history_styler2r<r MANYTOONErrArr)rKr=rr2rr)r)r*ros2 zLazyLoader.init_class_attributecsdt|jddi}||j}gdd}t|id|ifdd}t|id|i}|fS)NrTcSs d|_dS)NF)unique bindparamr)r)r*visit_bindparamszFLazyLoader._memoized_attr__simple_lazy_clause..visit_bindparamrcsF|jkr$|j|jdfn|jdkrB|jd|jfdSr!)Z_identifying_keyr5r#callablevaluerZ bind_to_colparamsr)r*rs  )rrrrrZtraverseZcloned_traverse)rKZ lazywhere criterionrr)rr*"_memoized_attr__simple_lazy_clauses  z-LazyLoader._memoized_attr__simple_lazy_clausec Cs|j\}}|dkr(t|dd|DS|jj}|}t|}|tj@rV|tjN}i}|D]J\} } } | dk r|r|tj @r| ||| |} n| ||| |} | || <q^||fS)NcSsg|]\}}}|qSr)r))rxr#identrr)r)r*rsz4LazyLoader._generate_lazy_clause..) rrZadapt_criterion_to_nullrIr7objr instance_dictZINIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column) rKrrrZ param_keysr=orrr#rrr)r)r*_generate_lazy_clauses:      z LazyLoader._generate_lazy_clausecCstd||fdS)Nz&'%s' is not available due to lazy='%s'rrr)r)r*rs zLazyLoader._invoke_raise_loadNr)c Cs|js |jjs|jr|js tjS|j }d}|jo>| p>|j }|tj @sN|r\|tj @sb|rbtj S|j r|tj @s|r|tj@r|||dt|}|s|tj @rtj Stdt||jf|rz||||}tj |krtj Stj|krtjSt|rdS|j|jkr(|tj@s(tjS|j|j|||d} | dk r\| tjkrVdS| Sn|tj @rt|tj@sztj S|||||||S)NrzbParent instance %s is not bound to a Session; lazy load operation of attribute '%s' cannot proceed)rZlazy_loaded_from) r#rIZload_on_pendingZ _load_pendingZ session_idrrr_extra_criteriarZNON_PERSISTENT_OKrrNO_RAISEZRELATED_OBJECT_OKrrrrr"r_get_ident_for_use_getZ NEVER_SETr issupersetdictDEFERRED_HISTORY_LOADrZ_identity_lookuprZPASSIVE_CLASS_MISMATCH_emit_lazyload) rKrrrRextra_criteriapendingprimary_key_identityrrinstancer)r)r*rs         zLazyLoader._load_for_statecsDjj}tj@r|jn|jjfddjjDS)Ncs"g|]}j|dqS)rrrxpkrZget_attrrrKrr)r*rsz5LazyLoader._get_ident_for_use_get..)rr=rrrrrrl)rKrrrinstance_mapperr)rr*rs z!LazyLoader._get_ident_for_use_getcCs tdSNr ZLRUCacherr)r)r*_memoized_attr__lambda_cachesz'LazyLoader._memoized_attr__lambda_cachezsqlalchemy.orm.strategy_optionscstjjtjfdddjfd}jjs6|}t j }|d|d7}jj dk rp|j fddjgd}|j } | s|tj@r|dd7}j} |js|r|jr|jjt|j|r|jrd} tj|f7|fd d7}n|jjj|fd d7}| rJjr8|tj@s8||d tj||||d Sjrj|j fd dgd}fdd|j fddgd} ||\} d|i} j |j!kr|tj"@stj#S| rt$tj%| &rdSnt$tj'| &rdSjr$|tj@s$||d |j fdddd}|j(|| | d} | )*+} j,rf| St-| }|r|dkrt.dj| dSdSdS)NcstjttjSr!)rrrrr _set_compile_optionsrdefault_compile_optionsr)rr)r*r+s z+LazyLoader._emit_lazyload..F)global_track_bound_values lambda_cachetrack_on)Z_invoke_all_eagers_lazy_loaded_fromcs|jjjSr!) select_fromr=rI secondarystmtrr)r*r+srcSs |jddS)NF)Z autoflushexecution_optionsr r)r)r*r+cs |jSr!)optionsr )r(r)r*r+rcs|diSN _current_path)_update_compile_optionsr )effective_pathr)r*r+sr) load_optionscs |jjSr!)rrr rr)r*r+rcsRjjD]D}|jtjkr|jrt|jtsj |j j |j ||qdSr!)rIZ_reverse_propertyr<rrZ_use_getrrrLoadZfor_existing_pathrrr7ZlazyloadZprocess_compile_state)compile_contextrev)rKstrategy_optionsr)r*_lazyload_reverses    z4LazyLoader._emit_lazyload.._lazyload_reversecs|jSr!_add_context_optionrIr )rrKr)r*r+sZ_sa_orm_load_optionscs |Sr!)wherer ) lazy_clauser)r*r+r)Zenable_trackingr rzKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r)/r Z preloadedZorm_strategy_optionsr lambda_stmtrrI bake_queriesspoilrZdefault_load_optionsr  add_criteriar#rZ NO_AUTOFLUSHrrrZ load_pathrr"LoaderCriteriaOptionrr=_path_registryrrrrZload_on_pk_identityrrrrrZhas_intersectionrvaluesZ _never_setexecuterZscalarsallr-lenwarn)rKrrrrrRrr rrrrrrZlr))rrrr(rKrr*rs               zLazyLoader._emit_lazyloadc s|j|jr|rV|jrVt|jt|||jr6||nd} |d|j| fn,|j sb|j rfdd} |d|j| fdS)Nrcs||dSr!)Z_resetrr#r)r*reset_for_lazy_callableZs z@LazyLoader.create_row_processor..reset_for_lazy_callable) r#rjrrZ"_instance_level_callable_processorr:LoadLazyAttribute_generate_extra_criteriar5populate_existingZalways_refresh) rKrYrPrQrRr=rZrSr[Zset_lazy_callabler,r)r+r*r\2s&     zLazyLoader.create_row_processor)Nr))r]r^r_r`rarHrorrrrrrr Zpreload_modulerr\rbr)r)rMr*r`s :"!  f rc@s.eZdZdZddZddZejfddZdS) r-asemi-serializable loader object used by LazyLoader Historically, this object would be carried along with instances that needed to run lazyloaders, so it had to be serializable to support cached instances. this is no longer a general requirement, and the case where this object is used is exactly the case where we can't really serialize easily, which is when extra criteria in the loader option is present. We can't reliably serialize that as it refers to mapped entities and AliasedClass objects that are local to the current process, which would need to be matched up on deserialize e.g. the sqlalchemy.ext.serializer approach. cCs||_|j|_||_||_dSr!r#rLrRr)rKr#Zinitiating_strategyrRrr)r)r*rHzszLoadLazyAttribute.__init__cCs(|jdk rtd|j|j|jddS)NzvCan't reliably serialize a lazyload() option that contains additional criteria; please use eager loading for this caser)r0)rr r)r#rLrRrr)r)r* __getstate__s zLoadLazyAttribute.__getstate__cCs:|j}|jj}|j|}|j|j}|j|||j|jdS)N)rRr) r#rr=r8Z _strategiesrLrrRr)rKrrr#rr&rr)r)r*rs  zLoadLazyAttribute.__call__N) r]r^r_r`rHr1rrrr)r)r)r*r-hsr-c@s"eZdZdZdddZddZdS) PostLoaderz;A relationship loader that emits a second SELECT statement.NcCsx|jjptjj|}tj|||jr*dS||j}||j}| |j dst|rd|j d|krtdSn| |j rtdSdS)NTloaderrF)rO current_pathr" PathRegistryrootrPostLoadZ path_existsrIcontainsrlengthcontains_mapperr=)rKrYrQ join_depthr path_w_propZeffective_path_w_propr)r)r*_check_recursive_postloads$   z$PostLoader._check_recursive_postloadc Cs |jd||||||||S)N))r immediate)rIrr\rXr)r)r*#_immediateload_create_row_processors z.PostLoader._immediateload_create_row_processor)N)r]r^r_r`r=r?r)r)r)r*r2s r2r>c@s eZdZdZddZddZdS)ImmediateLoaderr)cCs|jd|dSN)rrrIrrorr)r)r*ros z$ImmediateLoader.init_class_attributec sLfdd} ||r(tjtjBn tjtjB|dj| fdS)Ncs|j||dSr!)get_implr#r9rflagsrKr)r*load_immediatesz.load_immediateZdelayed)r=rZPASSIVE_NO_FETCH_RELATEDrrr5r#) rKrYrPrQrRr=rZrSr[rGr)rEr*r\s   z$ImmediateLoader.create_row_processorN)r]r^r_raror\r)r)r)r*r@sr@subquerycseZdZdZfddZddZddZdd Zd d Zd d Z ddZ ddZ Gddde Z ddZddZddZddZZS)SubqueryLoader)r;cs tt||||jj|_dSr!)rGrIrHrIr;rJrMr)r*rHszSubqueryLoader.__init__cCs|jd|dSrArCrr)r)r*ros z#SubqueryLoader.init_class_attributec s|}|j}t|d}|j|rB|j|dkrB|j|j}n||d}|r|j|jj|t |t }|rt j || d7n||j } fdd| D} | |fS)Nrrcs&g|]}tjdjj|jqSr)getattrrQrrmr#rwleftmost_mapperZ new_subq_pathr)r*r&s   z0SubqueryLoader._get_leftmost..)rQr"Z_class_to_mapperr7isarI _entities entity_zeror$r(rr5Zcoerce local_columns) rKorig_query_entity_index subq_pathZcurrent_compile_stateis_rootZgiven_subq_pathZ subq_mapperZ leftmost_prop additionalZ leftmost_cols leftmost_attrr)rLr* _get_leftmosts4    zSubqueryLoader._get_leftmostcCs2|d}tjtj}|j|j|}|js^d|_|j j |fddt ||dD| dd|D| } | |_|j} | dkrd|_n:| dkrtdd | DD]} t| | jsd|_qq|jsd |_|jdkr|jrt| |j} | r|| | |t} tj|| dd }|S) NFcSs h|]}|ddk r|dqS)rNr))rxentr)r)r* Rs z?SubqueryLoader._generate_from_original_query..)rOcSsg|]}tjtjj|qSr))rZ coercionsexpectZrolesZColumnsClauseRole)rxrr)r)r*risz@SubqueryLoader._generate_from_original_query..Tcss|] }|jVqdSr!)tablerwr)r)r*r{xsz?SubqueryLoader._generate_from_original_query..r)use_mapper_path)Z_cloneZ correlater Query__new____dict__updateZ _from_objZ_enable_assertionsrZnon_generativerZ_adapt_col_listZ_get_current_adapterZ _raw_columnsdistinct_target_keyZ _distinctrrrlZ_has_row_limiting_clauseZ_order_by_clausesrZ expand_column_list_from_order_byZ _set_entitiesrr rHr" AliasedClass)rKorig_compile_state orig_queryrMrVleftmost_relationshipZ orig_entityqZq2Z target_colsrbtZto_addZembed_q left_aliasr)r)r*_generate_from_original_query0s^  z,SubqueryLoader._generate_from_original_queryc sg}t|}t|D]N\}\}}|dkrR||ddj}||rL|n|} n|} || |jfqt|dkrz|n.t|dd} | j r| j nt j | j ddj j} fdd| D} || fS) NrrrTr\cs g|]}tjj|jqSr))rKr7rmr#rw parent_aliasrKr)r*rsz2SubqueryLoader._prep_for_joins..)rpairs enumerater=rNr5r#r(rrrr"rcrIrQ) rKrirSto_joinrnir=r&Z prev_mapperZ to_appendr local_cols local_attrr)rlr*_prep_for_joinss,   zSubqueryLoader._prep_for_joinsc Cs0t|}|dkr,t||dd|g}n|dkrft||dd|t||dd|g}n|dkrdd|ddD}g}|r|d} t| d| d} |r| |dd} n | |} || qt||dd|djg|t||dd|g}|D]} || }q|S)NrrrrkcSs:g|]2}t|djs$t|dn|dj|dfqS)rr)rrr"rcr)rxitemr)r)r*rs  z/SubqueryLoader._apply_joins..)r(rKof_typepopr5r7join) rKrgrprirmeffective_entityZltjZmiddleinnerruattrr)r)r* _apply_joinssD       zSubqueryLoader._apply_joinsc CsB|j}|r*|jr*|t|j||f7}||}|j|}|Sr!) _with_optionsrr"r#rr.Z_with_current_pathr) rKrYrgrSrewritten_pathreryrRr(r)r)r*_setup_optionss    zSubqueryLoader._setup_optionscs&jjr"fdd}||j}|S)Ncs |jttjj7_dSr!eager_order_bytupler rrIrrrr)r*_setup_outermost_orderbys zISubqueryLoader._setup_outermost_orderby.._setup_outermost_orderby)rIrr)rKrgrr)rr*rs z'SubqueryLoader._setup_outermost_orderbyc@s4eZdZdZdZddZddZddZd d Zd S) zSubqueryLoader._SubqCollectionszGiven a :class:`_query.Query` used to emit the "subquery load", provide a load interface that executes the query at the first moment a value is needed. rrrrsubq_datacCs4|j|_|j|_|j|_|jp i|_||_d|_dSr!r)rKrYrr)r)r*rH2s  z(SubqueryLoader._SubqCollections.__init__cCs |jdkr||j||Sr!)r_loadr9)rKr#defaultr)r)r*r9<s z#SubqueryLoader._SubqCollections.getcCstt|_|j}|jdks t||j}|jj r<| }t| |j }t |ddD]"\}}|j|dd|Dq\dS)NcSs |ddS)Nrr)xr)r)r*r+Orz7SubqueryLoader._SubqCollections._load..css|]}|dVqdS)rNr)rxvvr)r)r*r{Psz8SubqueryLoader._SubqCollections._load..) collections defaultdictrrrrAssertionErrorZ with_sessionrZ_populate_existingr/r itertoolsgroupbyextend)rKrgrowsrvr)r)r*rAs  z%SubqueryLoader._SubqCollections._loadcCs|jdkr|dSr!)rr)rKrrrr)r)r*r3Rs z&SubqueryLoader._SubqCollections.loaderN) r]r^r_r`rarHr9rr3r)r)r)r*_SubqCollections"s   rc Cs|j}|jjr|jjrdS|j|}d|_||j}||j dd} | dk rT| } n|j } |j j dt jjt jjf\} } | t jjk} | |} | |} ||j ds|jr|jr|jjnd|jd|jkrdSn| |jrdS|j j dtf|j }t|d}|jr2|jjdkr,td ||f|j}|j|d d }| || || \}}}} |!||||||}t "| }|j #dtf|d| | fi|_ |$d }|%|| \}}}|j&|}|'||||| }|(||| | || |}|)|}|S) NTpath_with_polymorphic)Zsubquery_pathsNr3rrreormzsubqueryloader for "%s" must invoke lambda callable at %r in order to produce a new query, decreasing the efficiency of caching for this statement. Consider using selectinload() for more effective full-lambda cachingF)legacy)*rOr_enable_eagerloadsZ_for_refresh_staterOindexZloaders_require_bufferingrIr9rrr Z_execution_optionsr"r5r6r8r;r4r9r:r=rIrZ_get_plugin_class_for_pluginZ_is_lambda_elementrrr r)Z _resolvedZ_create_entities_collectionrWrjr^unionZ_set_enable_single_critrtZ add_columnsr|rr)rKrYrPrQrrRrSrOrRwith_poly_entityryrSr~rTreZcompile_state_clsrdrMrVrfrirgrprsrmr)r)r*_setup_query_from_rowprocVs             z(SubqueryLoader._setup_query_from_rowprocc sL|jr||||||||S||||jr2dS|jj|jjjsRt d|t |dkrtt |j|jsdSnt |d|jsdS|||||d|} | dkrdS| jdkst||j}|jj} ||jd} | dkr||| } ||jd| rfdd| D} |jr6|||| | |n|||| | |dS)NJ'%s' does not support object population - eager loading cannot be applied.rrkrcsg|]}j|qSr)rErwrSr)r*r6sz7SubqueryLoader.create_row_processor..)rr?r=r;r7r:r#implsupports_populationrrr(r" _entity_isarPrrrrIrQr9rrrr-_create_collection_loader_create_scalar_loader) rKrYrPrQrRr=rZrSr[rrrrr)rr*r\st       z#SubqueryLoader.create_row_processorcsp||fddfdd}|djf|dj|f|jrl|djjfdS)Ncs*|d}|j|||dS)Nr))r9rDr#set_committed_value)rrr collectionrrK tuple_getterr)r*load_collection_from_subqFs  zKSubqueryLoader._create_collection_loader..load_collection_from_subqcsj|kr|||dSr!r+r)rrKr)r*&load_collection_from_subq_existing_rowLs zXSubqueryLoader._create_collection_loader..load_collection_from_subq_existing_rowrexistingeagerZ _tuple_getterr5r#invoke_all_eagersr3)rKrYrZrrrr[rr))rrrKrr*rAs z(SubqueryLoader._create_collection_loadercsp||fddfdd}|djf|dj|f|jrl|djjfdS)NcsL|d}t|dkr*td|d}|j|||dS)Nr!rLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r)r9r(r r)rDr#r)rrrrZscalarrr)r*load_scalar_from_subq]s zCSubqueryLoader._create_scalar_loader..load_scalar_from_subqcsj|kr|||dSr!r+r)rrKr)r*"load_scalar_from_subq_existing_rowhs zPSubqueryLoader._create_scalar_loader..load_scalar_from_subq_existing_rowrrrr)rKrYrZrrrr[rr))rrrKrr*rXs  z$SubqueryLoader._create_scalar_loader)r]r^r_rarHrorWrjrtr|rrobjectrrr\rrrbr)r)rMr*rIs 1d/54RrIZjoinedcseZdZdZdZfddZddZdd d Zd d Zd dZ ddZ ddZ ddZ d ddZ ddZddZddZddZZS)! JoinedLoaderzcProvide loading behavior for a :class:`.RelationshipProperty` using joined eager loading. )r;_aliased_class_poolcs&tt||||jj|_g|_dSr!)rGrrHrIr;rrJrMr)r*rHs zJoinedLoader.__init__cCs|jd|dSrArCrr)r)r*ros z!JoinedLoader.init_class_attributeNFc  Ks4|jjs dS|jrd|_||j}d} |r:||||jnd} | dk r`|||||| \} }} nZ||jds|j r|j d|j krdSn| |j rdS| ||||||||\} }} }||jdd}|dk rt|j} nd} ||j}tj||j ||| | | |j |d |dk r0dt|jkr0tddS) z@Add a left outer join to the statement that's being constructed.NTFr3rr)with_polymorphic parentmapperchained_from_outerjoinzDetected unaliased columns when generating joined load. Make sure to use aliased=True or flat=True when using joined loading with with_polymorphic().)rrr-multi_row_eager_loadersrI_init_user_defined_eager_procr$_setup_query_on_user_defined_adapterr8r;r9r:r=_generate_row_adapterr9rZwith_polymorphic_mappersrrZ_setup_entity_queryrsecondary_columnsrr)rKrOrPrQrRrSrTrrrUruser_defined_adapterclausesadd_to_collectionrr)r)r*rWs     zJoinedLoader.setup_queryc Csd|jkrdS|jj}||jdd}|dk r2|S|jd}|dd\}}|dk r~t|trj|j|}t j ||j j d}n@| |jdr||jd} tj| |j j d}n|j|j d}||d||S)NZeager_from_aliasF user_defined_eager_row_processor)rr)rrQr7r9rrstrraliasrZ ColumnAdapterr=rr8r" ORMAdapterZ_polymorphic_adaptersr) rKrRrOZtarget_attributesrQrSrZ root_mapperr&rr)r)r*rsR    z*JoinedLoader._init_user_defined_eager_proccCsV||}|r.|r.||}||jd|n|rF|}||jd||j}|||fS)Nr)Z_get_entity_clauseswraprrprimary_columns)rKrYrrQrSrrr)r)r*r$s"  z1JoinedLoader._setup_query_on_user_defined_adaptercCst|jjrt|jj}nd}d|f}||jkr@d|j|<}n|j|d|j|<}|t|jkrtj|j |dk r|j ddndddd}t|jj |j ||j|S)NZjoinedloader_acrrT)flat)rrr]) rrr selectablerr(rr"rcr=Z_anonymous_fromclauserVr5)rKrYZalt_selectabler#idxto_adaptr)r)r*_gen_pooled_aliased_class>s&    z&JoinedLoader._gen_pooled_aliased_classc  Cs||jdd} | r| } n ||} t| jd|ftj| |jjdddd} | j dk sXt |dk rr|j d|j j n|j j } | sd}|j|j||||| | ||r|jndf |j} ||jd| | || |fS) NrZjoinedloader_ormadapterTF)rZadapt_requiredZallow_label_resolveZanonymize_labels innerjoinr)eager_row_processor)r9rrrZ_memor"rr=r aliased_classrrrIrZcreate_eager_joinsr5_create_eager_joinrrr)rKrOrrQrRrSrTrrrrrrrr)r)r*r`sN    z"JoinedLoader._generate_row_adapterc  s^|dkr|j} n|} |jo|j} d} ||jkr~| s~|jr~t|j|j} t| dkr^t d| r~|j| d}| d|} }| dkr||j} }|j | |}|r t |ddrt |j| jr| nj}t |jjj}n t tjj|jddjj}nj}|jdk s t| p@| p@|dkp@|jj}| }|jdjfd }|rz|tfd d |D7}|rtj||j|| p|jjp|ot|tj jj|d }n!|||||}||j| <|j|_"|s,t#jj$D]2}| j%j&'|r|r|j(|}|j)*|qjj+rZ|j,t|j-.t/0jj+7_,dS) NrzCan't identify which query entity in which to joined eager load from. Please use an exact match when specifying the join path.rrTr\Zunnestedadditional_entity_criteriar)c3s |]}|jr|jVqdSr!)Zpropagate_to_loadersZ_resolve_where_criteriar=)rxZaerr)r*r{ sz2JoinedLoader._create_eager_join..isouter _left_memo _right_memor)1r=rZ_should_nest_selectableZ eager_joinsZ from_clausesrZ#find_left_clause_that_matches_givenrr(rr setdefaultrKrrZ_entity_for_mapperrNr7rr#rIr"rcrrPZrepresents_outer_joinZglobal_attributesr9r_ORMJoinrrZJoin_splice_nested_inner_joinZstop_onZ _find_columnsZ primaryjoinZpersist_selectablerVZcontains_columnrFrr5rr_target_adapterZcopy_and_processr r)rKrOrPrQrSrrrrrrZshould_nest_selectableZquery_entity_keyZindexesZclauseZdefault_towrapZtowrapZefmonclauseZattach_on_outsideZextra_join_criteriar eagerjoinrsr)rr*rs            zJoinedLoader._create_eager_joinc Cs<|dkrt|tjsztn`t|tjjr>|||j||||St|tjsz|d|krvtj||j |d||dj |dSdS|||j ||||j }|dkrd}|||j ||||j}|dkr|dk stddSnd}|r|js|js||} ntj|j ||j|j|jd} ntj||j |j|j|j d} |j| _| S) NFrrkrz9assertion failed attempting to produce joined eager loadsT)rr)rr)rr"rrrrZ FromGroupingrelementrr=rightrleftrrZ_splice_into_centerrr) rKrQZjoin_objrrrZsplicingZ target_joinZ right_splicerr)r)r*r; s     z&JoinedLoader._splice_nested_inner_joinc Cs|j}|r||||jnd}|dk rP|}|jrB|rB||j}qj|jrj|j}n||jd}|dkrjdS|j||r||SdSdS)NFr)rOrrZcompound_eager_adapterrr9r=Z_result_has_identity_key) rKrYrZrSrQrRrOr decoratorr)r)r*_create_eager_adapter s4 z"JoinedLoader._create_eager_adapterc Cs|jj|jjjs td||jr,d|_||j } | |||| |} | dk r|j} t ||j ||| |j| } |js||| | |q||| | |n |j d||||||||dS)NrTFrB)r7r:r#rrrrr-Zloaders_require_uniquingrIrrZ_instance_processorr=rrrrr\) rKrYrPrQrRr=rZrSr[Zour_pathZ eager_adapterr# _instancer)r)r*r\ s\   z!JoinedLoader.create_row_processorcsrfdd}fdd}fdd}|d|j|f|d|j|fjrn|d |j|fdS) NcsFt||}t|d}|j|f<|}|dk rB||dSNZappend_without_eventrrr ZUniqueAppenderr5)rrrr result_listinstrrYr#r)r*#load_collection_from_joined_new_row szSJoinedLoader._create_collection_loader..load_collection_from_joined_new_rowcsd|fjkrj|f}n(t||}t|d}|j|f<|}|dk r`||dSrr)rrrrrrrr)r*(load_collection_from_joined_existing_row szXJoinedLoader._create_collection_loader..load_collection_from_joined_existing_rowcs |dSr!r)rrr)r* load_collection_from_joined_exec szPJoinedLoader._create_collection_loader..load_collection_from_joined_execrrrr5r#r)rKrYr#rr[rrrr)rr*r s  z&JoinedLoader._create_collection_loadercspfdd}fdd}fdd}|dj|f|dj|f|jrl|d j|fdS) Ncs||<dSr!r)r)rr#r)r*load_scalar_from_joined_new_row szKJoinedLoader._create_scalar_loader..load_scalar_from_joined_new_rowcs8|}|kr,||k r4tdn||<dS)Nr)r r))rrrrrr#rKr)r*$load_scalar_from_joined_existing_row$ s  zPJoinedLoader._create_scalar_loader..load_scalar_from_joined_existing_rowcs |dSr!r)rrr)r*load_scalar_from_joined_exec7 szHJoinedLoader._create_scalar_loader..load_scalar_from_joined_execrrrr)rKrYr#rr[rrrr)rr*r s z"JoinedLoader._create_scalar_loader)NNF)F)r]r^r_r`rarHrorWrrrrrrrr\rrrbr)r)rMr*rts(   f5"= V$:/rZselectinc seZdZdZedddddddgZd Zfd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZZS)SelectInLoader)r; omit_join _parent_alias _query_info_fallback_query_inforZ queryinfoload_only_childload_with_joinin_exprpk_colszero_idxchild_lookup_colsicstt||||jj|_|jjtjk}|jjdk rB|jj|_n<|j d}|r\|j |_n"|j j dj |jdd|j jd|_|jr|r||_||_q||_n ||_dS)NrBrTFr)rGrrHrIr;r<rrrrrr7rrvrr_init_for_omit_join_m2or_init_for_joinr_init_for_omit_join)rKr7rLZis_m2o lazyloaderrMr)r*rH^ s,        zSelectInLoader.__init__cstjjjfddtDfddjjD}}t|dkrbt j |}d}n |d}d} dd|||dS) Nc3s0|](}jj|dD]}||fVqqdS)r)N)r7rr9)rxrequivpk_to_fkrKr)r*r{ sz5SelectInLoader._init_for_omit_join..csg|]}|kr|qSr)r)rxrs)rr)r*r sz6SelectInLoader._init_for_omit_join..rFrT) rrIrZlocal_remote_pairsrarr7rlr(rtuple_ query_info)rKrZfk_colsrrr)rr*r| s    z"SelectInLoader._init_for_omit_joincsb|jj}t|dkr$tj|}d}n |d}d}|jdfdd|D}|dd||||S)NrFrTrBcsg|]}j|qSr)rrrr)r*r sz:SelectInLoader._init_for_omit_join_m2o..)r=rlr(rrrIrr)rKrrrZ lookup_colsr)rr*r s    z&SelectInLoader._init_for_omit_join_m2ocsjt|jj|_t|jfdd|jjD}t|dkrJtj|}d}n |d}d}| dd|||dS)Ncsg|]}|qSr)_adapt_elementrZpa_inspr)r*r sz1SelectInLoader._init_for_join..rFrT) rr7r;rrrlr(rrr)rKrrrr)rr*r s    zSelectInLoader._init_for_joincCs|jd|dSrArCrr)r)r*ro s z#SelectInLoader.init_class_attributecCs tdSrrrr)r)r*r sz+SelectInLoader._memoized_attr__lambda_cachec Cs|jr|||||||||S||||jr2dS|jj|jjjsRt d|t |dkrtt |j|jsdSnt |d|jsdS|jjpt jj|} ||j} | |jdd} | dk rt| } n|j} tj|| |j|j|j| |dS)Nrrrkr)rr?r=r;r7r:r#rrrrr(r"rrPrOr4r5r6rIr9rrrrr7Zcallable_for_path_load_for_path) rKrYrPrQrRr=rZrSr[Z selectin_pathr<rryr)r)r*r\ sZ     z#SelectInLoader.create_row_processorcsx|rj|krdSj}|jrtt}g} j|D]l\ } j t fdd|j D} t j | krtj }qd| kr||  | fq6| | fq6|jsdd|D}|j|j|jsjrfddDtjfddjdftfd } jjs*| } |jsF| fd d} n| jfd dgd } | fd d} |jj} |j| j|r|jrt| |f7| fdd} |j!r| dd} jj"rH|js"jj"jrfddD| fdd} n&fdd| jfddgd } |jrd#|| || |n$||| |dS)Nc3s"|]}j|tjdVqdS)rN)rrZPASSIVE_NO_FETCH)rxZlk)r=r state_dictr)r*r{ sz0SelectInLoader._load_for_path..cSs$g|]\}}|jd||j|fqS)r)r#r)rxr overwriter)r)r*r- sz1SelectInLoader._load_for_path..csg|]}|qSr)rrryr)r*r= scs0ttjdttj ddS)Nrr)Zcompile_state_pluginZplugin_subject)r) rrr"ZBundlerr rrrZ_set_propagate_attrsr))ryrr)r*r+C s z/SelectInLoader._load_for_path..F)rrrcs |Sr!)rrgr r)r*r+\ rcs$|jtjjjSr!)rrrxrKrIr#rvr )ryrKr)r*r+b s r cs|tdS)N primary_keys)filterZin_rrr )rr)r*r+k rcs|jdiSr)rrr )rrr)r*r+ s cSs |jddS)NT)r/r r r)r)r*r+ rcsg|]}|qSr)rrr r)r*r scs |jSr!)rr )rr)r*r+ rcs |jttjj7_dSr!rrrr)r*r s z?SelectInLoader._load_for_path.._setup_outermost_orderbycs|jSr!rr )rrKr)r*r+ s)%r#rrrrrr7rrrrrrr5rrrrrrrrrIr r!r"rOZselect_statementr}rr"r#r.r/r_load_via_child_load_via_parent)rKrYrQZstates load_onlyryrRr our_states none_statesr Z related_identrgrer)) rrryrrr=rrrKrr r*r  s                zSelectInLoader._load_for_pathcs|j}t|}|r|d|j}||jd}dd|jj|dfdd|DidD} |D]T} | | d} || D]:\} } }|s|j| krqz| |j | | |s| n| gqzqbq|D]0\} } }|s|j| krq| |j | | dqdS)NrcSsi|]\}}||qSr)r))rxrrr)r)r* sz2SelectInLoader._load_via_child..rcsg|]}jr|dn|qSrJr)rxr#rr)r*r sz2SelectInLoader._load_via_child..r) r-sorted _chunksizerr&rr9r#rDr)rKrrrrgrYr-Zour_keyschunkdatar#Z related_objrrr r)rr*r s:     zSelectInLoader._load_via_childcs"|j}|rdnd}|r|d|j}||jd}fdd|D}tt} t|jj|d|id ddD] \} } | |  d d | Dqt|D]\} } }}|s|j |krq| | |}|s|rt |d krtd || |j | ||dq| |j | ||qqdS) Nr)rcs&g|]\}}}}jr|dn|qSrJr)rxr#rr r rr)r*r s z3SelectInLoader._load_via_parent..rrcSs|dSrgr)rr)r)r*r+ rz1SelectInLoader._load_via_parent..css|]}|dVqdS)rNr)rr)r)r*r{ sz2SelectInLoader._load_via_parent..rr)r-rrrrrrrr&rrr#r9r(r r)rDr)rKrrrgrYr-Z _empty_resultrrrrrr#rr r rr)rr*r sL         zSelectInLoader._load_via_parent)r]r^r_rar namedtuplerrrHrrrrorr\r rrrbr)r)rMr*rD s.   DE.rcsTfddfdd}fdd}tj|d|dddd tj|d |dddd dS) NcsT|dk rP|jjkrP|t|}|rP||k rPtjdt||jfdd|S)NzsInstance %s is already associated with an instance of %s via its %s attribute, and is only allowed a single parent.Zbbf1)code) r# hasparentrZinstance_staterrr"Z instance_strr;)rroldvalue initiatorr)r&r)r* _do_check" s z*single_parent_validator.._do_checkcs||d|Sr!r))rrr!r"r)r*r5/ sz'single_parent_validator..appendcs||||Sr!r))rrr r!r#r)r*set_2 sz%single_parent_validator..set_r5T)rawretvalr2r)rlisten)r%r&r5r$r))r"r&r*r6! s  r6)NNNNFN)Br` __future__rrrrrrrrrr r r r r r"baserrrrYrrrrrrrrrrrrrrrrrrZsql.selectabler rAZColumnPropertyZ strategy_forrDZ class_loggerrcrurrrrZRelationshipPropertyrrZ MemoizedSlotsrr-r2r@rIrrr6r)r)r)r*s                                 S+T P *     &      42 "   R ^