o znhS @sdZddlmZddlZddlZddlmZddlmZddlm Z ddlm Z dd lm Z dd lm Z dd lm Z dd lmZdd lmZddlmZddl mZddl mZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZdd lmZdd lmZ ddlm!Z!      dKddZ"e j#j$dddGdd d eZ%ej&e j#j$d!ddGd"d#d#eZ'ej&e j#j$d!d$Gd%d&d&e'Z(ej&e j#j$d!d!d'e j#j$d!d(Gd)d*d*eZ)Gd+d,d,e*Z+Gd-d.d.eZ,ej&e j-j$d!d(Gd/d0d0eZ.ej&e j-j$d1d2e j-j$dd2Gd3d4d4e,Z/ej&e j-j$d!d2e j-j$d5d2e j-j$d6d2e j-j$d7d2e j-j$d8d2Gd9d:d:e,ej0Z1Gd;d<dd?d?e,Z3ej&e j-j$d@d2GdAdBdBe,Z4ej&e j-j$dCd2e j-j$dd2GdDdEdEe,Z5ej&e j-j$dFd2GdGdHdHe,ej0Z6dIdJZ7dS)LzWsqlalchemy.orm.interfaces.LoaderStrategy implementations, and related MapperOptions.)absolute_importN) 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  s0ttj|jgd} g} |o|j|r|jr| t|j|j j vr5|j j |j\| fdd|r=| t j |rN|j rN| fdd|jD]D} || j|jur| j|jstj| j|jf|||| |oy|jpy|jtju||||| p|j |jd | } | D]}|| |qqQdS)N)defaultcstj||jfiSN)orm_util_validator_eventskeydescprop)fnoptsD/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/strategies.pyBs z%_register_attribute..cst|Sr)rbackref_listenersr)backrefuselistr$r%r&Ps) parent_tokenr)compare_function useobject extension trackparent typecallable callable_active_history impl_classsend_modified_eventsdoc)listr to_listr-r) single_parentappendsingle_parent_validatorrparent validatorsr track_cascade_eventsback_populatesself_and_descendants_propsget class_manager_attr_has_implrregister_attribute_implclass_ directionr ONETOMANYviewonlyr4)r!mapperr,r+r/r0proxy_propertyr1r2kw attribute_ext listen_hooksmr hookr$)r(r"r#r)r%_register_attribute)sb            rO) instrumentdeferredcs8eZdZdZdZfddZ d 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. columnsc tt||||jj|_dSr)superrR__init__parent_propertyrTselfr: strategy_key __class__r$r%rWz#UninstrumentedColumnLoader.__init__Nc Ks(|jD]}|r |j|}||qdSr)rTr8) rZcontext query_entitypathloadoptadaptercolumn_collectionkwargscr$r$r% setup_querys   z&UninstrumentedColumnLoader.setup_querycCdSrr$)rZr_rarbrHresultrc populatorsr$r$r%create_row_processorsz/UninstrumentedColumnLoader.create_row_processorr) __name__ __module__ __qualname____doc__ __slots__rWrgrk __classcell__r$r$r\r%rRs  rRTcs<eZdZdZdZfddZddZddZd d ZZ S) ColumnLoaderz8Provide loading behavior for a :class:`.ColumnProperty`.)rT is_compositecs.tt||||jj|_t|jd|_dS)Ncomposite_class)rVrrrWrXrThasattrrsrYr\r$r%rWs zColumnLoader.__init__c KsJ|jD]} |r |j| } || q|jd} |r|j| } | ||j<dSNr)rTr8rX) rZr_r`rarbrcrdmemoized_populatorsrerffetchr$r$r%rgs     zColumnLoader.setup_querycCsPd|_|jdj}|jjp|jdjp|jt|jv}t|j|d|j |ddS)NTrF)r,r+r1) is_class_levelrTtyperXr1 primary_keyversion_id_colsetrOcompare_values)rZrHcoltyper1r$r$r%init_class_attributes   z!ColumnLoader.init_class_attributec Cs\|jD]}|r |j|}||d} | r!|d|j| fdSq|d|jdfdS)NFquickexpireT)rT_getterr8r) rZr_rarbrHrircrjcolgetterr$r$r%rks   z!ColumnLoader.create_row_processor) rlrmrnrorprWrgrrkrqr$r$r\r%rrs rr)query_expressioncs4eZdZfddZddZddZddZZS) ExpressionColumnLoadercstt|||dSr)rVrrWrYr\r$r%rWszExpressionColumnLoader.__init__c Ksh|r0d|jvr2|jdg} | D]} |r|j| } || q| d} |r)|j| } | ||j<dSdSdS)N expressionr) local_optsrTr8rX) rZr_r`rarbrcrdrwrerTrfrxr$r$r%rgs    z"ExpressionColumnLoader.setup_queryc Cs||r:d|jvr<|jdg}|D]} |r|j| } || d} | r-|d|j| fdSq|d|jdfdSdSdS)NrFrrT)rrTrr8r) rZr_rarbrHrircrjrTrrr$r$r%rks   z+ExpressionColumnLoader.create_row_processorcCs(d|_t|j|d|jdjjdddS)NTFr)r,r+accepts_scalar_loader)ryrOrXrTrzr~rZrHr$r$r%rs  z+ExpressionColumnLoader.init_class_attribute)rlrmrnrWrgrkrrqr$r$r\r%rs  r)rQrP) do_nothingcsHeZdZdZdZfddZddZddZ dd d Zd d Z Z S)DeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)rTgroupcs>tt|||t|jdrtd|jj|_|jj|_dS)Nrtz8Deferred loading for composite types not implemented yet)rVrrWrurXNotImplementedErrorrTrrYr\r$r%rW,s  zDeferredColumnLoader.__init__c Cs>|js|jj}|d|j|fdS|d|jdfdS)NnewrF)ryrX_deferred_column_loaderr8r) rZr_rarbrHrircrjset_deferred_for_local_stater$r$r%rk5s z)DeferredColumnLoader.create_row_processorcCs,d|_t|j|d|jdjj|jdddS)NTFr)r,r+r0expire_missing)ryrOrXrTrzr~_load_for_staterr$r$r%rEs  z)DeferredColumnLoader.init_class_attributeNc Ks|rd|jvrt|j|jjs'|r |jr |jd|jds'|r<|j|vr<|j dj |||||||fi| dS|j rFt ||j <dSt||j <dS)N undefer_pkszundefer_group_%sF))rQF)rPT)rr}rT intersectionr:_should_undefer_in_wildcardrr@rrX _get_strategyrgryr r ) rZr_r`rarbrcrdrwonly_load_propsrJr$r$r%rgQsF       z DeferredColumnLoader.setup_querycsjstjS|tj@stjSjj}jr fdd|jD}njg}fdd|D}t }|durBt dt jf||}tj|j|ddurXt tjS)Ncs4g|]}t|trt|jtr|jjkr|jqSr$) isinstancerstrategyrrr).0prZr$r% s  z8DeferredColumnLoader._load_for_state..csg|] }|jvr|qSr$) unmodified)rkstater$r%rszfParent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceed)r refresh_state)rr ATTR_EMPTYSQL_OKPASSIVE_NO_RESULTmanagerrHriterate_propertiesrorm_excDetachedInstanceErrorr state_strr r load_on_identObjectDeletedError ATTR_WAS_SET)rZrpassive localparenttoloadrsessionr r$)rZrr%rs4     z$DeferredColumnLoader._load_for_stater) rlrmrnrorprWrkrrgrrqr$r$r\r%r$s   /rc@&eZdZdZddZejfddZdS)LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoadercC ||_dSrr)rZrr$r$r%rW zLoadDeferredColumns.__init__cCs.|j}|jj}|j|}|jt}|||Sr)rrrHr? _strategiesrr)rZrrrrr!rr$r$r%__call__s    zLoadDeferredColumns.__call__NrlrmrnrorWr PASSIVE_OFFrr$r$r$r%rsrcs$eZdZdZdZfddZZS)AbstractRelationshipLoaderz0LoaderStratgies which deal with related objects.)rHtargetr)entitycs>tt||||jj|_|jj|_|jj|_|jj|_dSr)rVrrWrXrHrrr)rYr\r$r%rWs    z#AbstractRelationshipLoader.__init__)rlrmrnrorprWrqr$r$r\r%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)rlrmrnror$r$r$r%rsrnoload)lazyc@s$eZdZdZdZddZddZdS)NoLoaderzYProvide loading behavior for a :class:`.RelationshipProperty` with "lazy=None". r$cCs d|_t|j|d|jjddS)NT)r,r/)ryrOrXcollection_classrr$r$r%rs zNoLoader.init_class_attributec $fdd}|dj|fdS)Ncs.jr|jj||dSd|j<dSr)r)rget_implr initializerdict_rowrr$r%invoke_no_loadsz5NoLoader.create_row_processor..invoke_no_loadrr8r) rZr_rarbrHrircrjrr$rr%rks zNoLoader.create_row_processorN)rlrmrnrorprrkr$r$r$r%rs  rselectraise raise_on_sql baked_selectcseZdZdZdZfddZddZddZd d Zd d Z d dZ ddZ e dddZe dddZddZZS) LazyLoaderz|Provide loading behavior for a :class:`.RelationshipProperty` with "lazy=True", that is loads when first accessed. ) _lazywhere_rev_lazywhereuse_getis_aliased_class _bind_to_col_equated_columns_rev_bind_to_col_rev_equated_columns_simple_lazy_clause _raise_always _raise_on_sql_bakerycstt||||jddk|_|jddk|_t|jj|_|j j }| \|_ |_ |_|j dd\|_|_|_|jd||j |j oY|j oY|jjdj|j d|jjd|_|jrt|jD]}||jjvr||jj|D] }|j||j|<qqqc|jd |dSdS) NrrrT)reverse_directionz%s lazy loading clause %sr use_proxies equivalentsz2%s will use query.get() to optimize instance loads)rVrrW strategy_optsrrrrrrX_join_conditioncreate_lazy_clauserrrrrrloggerinfor) _get_clausecomparerH_equivalent_columnsrr5)rZr:r[join_conditionrrfr\r$r%rWsF     zLazyLoader.__init__cCsDd|_|jjp|jjtjup|j }t|j|d|j|jj |ddS)NT)r,r0r/r1) ryrXr1rEr MANYTOONErrOrr)rZrHr1r$r$r%r@s   zLazyLoader.init_class_attributecsT|j|j}gdd}t|id|ifdd}t|id|i}|fS)NcSs d|_dSNF)unique bindparamr$r$r%visit_bindparam]rzFLazyLoader._memoized_attr__simple_lazy_clause..visit_bindparamrcsL|jvr|j|jdfdS|jdur$|jd|jfdSdSr)_identifying_keyr8rcallablevaluer bind_to_colparamsr$r%rbs  )rrrtraversecloned_traverse)rZ criterionrr$rr%"_memoized_attr__simple_lazy_clauseXs z-LazyLoader._memoized_attr__simple_lazy_clausec Cs|j\}}|durt|dd|DS|jj}|}t|}|tj@r+|tjN}i}|D]%\} } } | durP|rH|tj @rH| ||| |} n| ||| |} | || <q/||fS)NcSsg|]\}}}|qSr$r$)rridentrr$r$r%ryz4LazyLoader._generate_lazy_clause..) rsql_utiladapt_criterion_to_nullrXr:objr instance_dictINIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column) rZrrr param_keysrHorrrrrr$r$r%_generate_lazy_clausets,     z LazyLoader._generate_lazy_clausecCstd||f)Nz&'%s' is not available due to lazy='%s')sa_excInvalidRequestError)rZrrrr$r$r%_invoke_raise_loads zLazyLoader._invoke_raise_loadcCsD|js|jjs |jr |jstjS|j }d}|tj@s|jr%|tj @s(|r(tj S|j r?|tj @s?|jr8|tj @r?|||dt|}|sZ|tj @rMtj Stdt||jf|jr||||}tj |vrltj Stj|vrttjSt|r{dS|j|j|||d}|dur|S|tj@r|tj @stj S|||||S)NrzbParent instance %s is not bound to a Session; lazy load operation of attribute '%s' cannot proceed)rlazy_loaded_from)rrXload_on_pending _load_pending session_idrrrrNON_PERSISTENT_OKrrNO_RAISERELATED_OBJECT_OKr rrrrr_get_ident_for_use_get NEVER_SETr issupersetr _identity_lookupr_emit_lazyload)rZrrpendingprimary_key_identityrinstancer$r$r%rsx      zLazyLoader._load_for_statecsDjj}tj@r |jn|jjfddjjDS)Ncs"g|] }j|dqS)rrrpkrget_attrrrZrr$r%rsz5LazyLoader._get_ident_for_use_get..)rrHrrrrdictr{)rZrrrinstance_mapperr$rr%rs z!LazyLoader._get_ident_for_use_getsqlalchemy.ext.bakedcC |jddSN2)sizebakeryrZbakedr$r$r%_memoized_attr__bakery z!LazyLoader._memoized_attr__bakeryzsqlalchemy.orm.strategy_optionsc sfdd}|ddjjjs|jddjjdur,|fddj }|s7|tj@r>|ddj rNj j}| j |j rnj r[|d||fd d|j|Sjjr{|fd djjD]jtjurjrtjts|fd dq|\|rttj !rdSn ttj"!rdSj rƈ|d|fd dfd d} ||fdd| #} j$r| St%| } | r| dkrt&dj| dSdS)Ncs |jSr)r rrrr$r%r& z+LazyLoader._emit_lazyload..cSs|dSr)_adapt_all_clauses_with_invoke_all_eagersqr$r$r%r&sT)fullcs|jjjSr) select_fromrHrX secondaryr1rr$r%r&(s cSs |dSr) autoflushr1r$r$r%r&1 rc |Sr_set_lazyload_fromr1rr$r%r&Cr7cs|jtjjSr)order_byr r6rXr1rr$r%r&Ks cs"|j|jjjSr)optionsLoadfor_existing_path _current_pathr:lazyloadrr1)revstrategy_optionsr$r%r&Zs  cr8r)filterr1) lazy_clauser$r%r&mr7cs|j|_|Sr)update_paramsr1)rr$r%set_default_paramsqs z5LazyLoader._emit_lazyload..set_default_paramscr8rr9r1rr$r%r&xr7rzKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r)'r add_criteriarX bake_queriesspoilr5rr NO_AUTOFLUSH load_options load_path_add_lazyload_optionsrrr with_post_criteria_load_on_pk_identityr rHr;_reverse_propertyrErr_use_getrrrrr has_intersectionrrvalues _never_setallr)lenwarn) rZrBrrrrr2reffective_pathrGrilr$)rDrrArZrrBr%rs           zLazyLoader._emit_lazyloadc sn|j|jst|jt|}|d|j|fdS|js#|jr5fdd} |d|j| fdSdS)Nrcs||dSr)_resetrrr$r%reset_for_lazy_callables z@LazyLoader.create_row_processor..reset_for_lazy_callable) rryr"_instance_level_callable_processorrALoadLazyAttributer8populate_existingalways_refresh) rZr_rarbrHrircrjset_lazy_callabler\r$rr%rks    zLazyLoader.create_row_processor)rlrmrnrorprWrrrr rrr dependenciesr+rrkrqr$r$r\r%rs  1 U   rc@r)r^z-serializable loader object used by LazyLoadercCs||_|j|_dSr)rr[)rZrinitiating_strategyr$r$r%rWs zLoadLazyAttribute.__init__cCs0|j}|jj}|j|}|j|j}|||Sr)rrrHr?rr[r)rZrrrr!r!rr$r$r%rs    zLoadLazyAttribute.__call__Nrr$r$r$r%r^sr^ immediatec@s.eZdZdZddZ  d ddZddZdS) ImmediateLoaderr$cC|jd|dSN)rrrXrrrr$r$r%r z$ImmediateLoader.init_class_attributeNc Krhrr$) rZr_rrarbrcrd parentmapperrer$r$r%rgs zImmediateLoader.setup_queryc r)Ncs|j||dSr)rrr@rrr$r%load_immediatesz.load_immediatedelayedr) rZr_rarbrHrircrjrlr$rr%rks z$ImmediateLoader.create_row_processorNN)rlrmrnrprrgrkr$r$r$r%res  resubquerycseZdZdZfddZddZ  dddZd d Zd d Zd dZ ddZ ddZ ddZ Gddde ZddZddZddZZS)SubqueryLoader) join_depthcrUr)rVrprWrXrqrYr\r$r%rWr^zSubqueryLoader.__init__cCrfrgrirr$r$r%rrjz#SubqueryLoader.init_class_attributeNcKs~|jjsdS|jjr|jd||j}||jdd} | dur$| } n|j} |jdtj j } | |} | |jds\|j rT|jj rG|jj jnd|jd|j krSdSn| |jr\dS|| \} } }|jdtf|j}||| | ||j}|j| }dtf|d| i|_|d}||| \}}}|j|}|j|}|||||| }||| || }||}||jd|dS) Nropath_with_polymorphic) subquery_pathNloaderrr orig_queryF)r _enable_eagerloads _yield_per _no_yield_perrXr@rrr PathRegistryrootcontainsrqr?lengthcontains_mapperrH _get_leftmostrp_generate_from_original_query entity_zeror _attributes_set_enable_single_crit_prep_for_joinsr; add_columns _apply_joins_setup_options_setup_outermost_orderbyr})rZr_rrarbrcrdrkrewith_poly_entityeffective_entity subq_pathleftmost_mapper leftmost_attrleftmost_relationshipru left_aliasr2to_join local_attr parent_aliasr$r$r%rgsz            zSubqueryLoader.setup_querycspjtd}|j|r|jdur|j|j}n|d}|j}fdd|D}||fS)Nrrcs$g|]}tdjj|jqSr)getattrr_columntopropertyrrrfrrr$r%r^s z0SubqueryLoader._get_leftmost..)rar_class_to_mapperr:isarX local_columns)rZr subq_mapper leftmost_prop leftmost_colsrr$rr%r~Os   zSubqueryLoader._get_leftmostc Cs|d}|js|ttdd|jDd||}|||j }|dur/d|_ n|durLtdd|DD]} t| | j sKd|_ nq<|j durU|j|_ |jdurb|jdurbd|_ |} tj|| dd} | S)NcSs g|] }|ddur|dqS)rNr$)rentr$r$r%r{s  z@SubqueryLoader._generate_from_original_query..FTcss|]}|jVqdSr)tablerr$r$r% sz?SubqueryLoader._generate_from_original_query..use_mapper_path)_clone correlate _from_obj_set_select_fromr5r}column_descriptions_adapt_col_list _set_entitiesdistinct_target_key _distinctrr{ _order_byr;_limit_offset with_labelsror AliasedClass) rZrurrr orig_entityr2 target_colsrtembed_qrr$r$r%rgs@      z,SubqueryLoader._generate_from_original_queryc sg}t|}t|D]'\}\}}|dkr)||ddj}||r&|n|} n|} || |jfq t|dkr=|nt|dd} | j rL| j nt j | j ddj j} fdd| D} || fS) NrrrTrcs g|] }tjj|jqSr$)rr:rrrrrZr$r%rsz2SubqueryLoader._prep_for_joins..)r5pairs enumeraterHrr8rrWrrrrrrXr) rZrrrrirHr! prev_mapper to_appendr local_colsrr$rr%rs*    zSubqueryLoader._prep_for_joinsc Cs2t|}|dkrt||dd|g}nu|dkr3t||dd|t||dd|g}nX|dkrdd|ddD}g}|rl|d} t| d| d} |r`| |dd} n| |} || |sFt||dd|djg|t||dd|g}|D] } |j| dd}q|S) NrrrrcSs:g|]}t|djst|dn|dj|dfqS)rr)rrrrr)ritemr$r$r%rs z/SubqueryLoader._apply_joins..T)from_joinpoint)rWrof_typepopr8r:join) rZr2rrrrltjmiddleinnerrattrr$r$r%rsF       zSubqueryLoader._apply_joinscCs(||}|j|j}|jr|j|_|Sr)_with_current_path_conditional_options _with_options_populate_existing)rZr2rrurr$r$r%r s  zSubqueryLoader._setup_optionscCs6|jjr|jd}|jt|jj}|j|}|Srv)rXr;r_target_adaptercopy_and_processr r6)rZr2 eagerjoineager_order_byr$r$r%rs   z'SubqueryLoader._setup_outermost_orderbyc@s4eZdZdZdZddZddZddZd d ZdS) zSubqueryLoader._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. NcCrr)subq)rZrr$r$r%rW,rz(SubqueryLoader._SubqCollections.__init__cCs |jdur ||j||Sr)_data_loadr@)rZrrr$r$r%r@/s z#SubqueryLoader._SubqCollections.getcCs&tddt|jddD|_dS)Ncss&|]\}}|dd|DfVqdS)cSg|]}|dqSrr$rvvr$r$r%r6zCSubqueryLoader._SubqCollections._load...Nr$rrvr$r$r%r5s  z8SubqueryLoader._SubqCollections._load..cSs |ddS)Nrr$xr$r$r%r&7r.z7SubqueryLoader._SubqCollections._load..)r  itertoolsgroupbyrrrr$r$r%r4sz%SubqueryLoader._SubqCollections._loadcCs|jdur |dSdSr)rr)rZrrrr$r$r%rt:s  z&SubqueryLoader._SubqCollections.loader) rlrmrnrorrWr@rrtr$r$r$r%_SubqCollections#s rc s|jj|jjjstd|||j}||j d}|dur"dS|j |j us,Jd|jj } ||j d} | durH| |} | |j d| rSfdd| D} |jr`||| | |dS||| | |dS)NJ'%s' does not support object population - eager loading cannot be applied.rozlSubquery session doesn't refer to that of our context. Are there broken context caching schemes being used? collectionscg|]}j|qSr$rSrrcr$r%r_rz7SubqueryLoader.create_row_processor..)r:rArimplsupports_populationrr rXr@rrrrr}r)_create_collection_loader_create_scalar_loader) rZr_rarbrHrircrjrrrr$rr%rk>s6  z#SubqueryLoader.create_row_processorcjfddfdd}|djf|dj|f|jr3|djjfdSdS)Ncs8tfddDd}|j|||dS)Ncg|]}|qSr$r$rrrr$r%rorz_SubqueryLoader._create_collection_loader..load_collection_from_subq..r$)r@tuplerrset_committed_value)rrr collectionrrrZrr%load_collection_from_subqms  zKSubqueryLoader._create_collection_loader..load_collection_from_subqcj|vr |||dSdSrrr)rrZr$r%&load_collection_from_subq_existing_rowu zXSubqueryLoader._create_collection_loader..load_collection_from_subq_existing_rowrexistingeagerr8rinvoke_all_eagersrt)rZr_rrrjrr$)rrrrZr%rjsz(SubqueryLoader._create_collection_loadercr)NcsZtfddDd}t|dkrtd|d}|j|||dS)Ncrr$r$rrr$r%rrzWSubqueryLoader._create_scalar_loader..load_scalar_from_subq..rrLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r)r@rrWr rXrrr)rrrrscalarrrr%load_scalar_from_subqs zCSubqueryLoader._create_scalar_loader..load_scalar_from_subqcrrrr)rrZr$r%"load_scalar_from_subq_existing_rowrzPSubqueryLoader._create_scalar_loader..load_scalar_from_subq_existing_rowrrrr)rZr_rrrjrr$)rrrrZr%rs z$SubqueryLoader._create_scalar_loaderrn)rlrmrnrprWrrgr~rrrrrobjectrrkrrrqr$r$r\r%rps"   cA/4 ,rpjoinedcseZdZdZdZfddZddZ   dd d Zd d Zd dZ ddZ ddZ ddZ d ddZ ddZddZddZddZZS)! JoinedLoaderzcProvide loading behavior for a :class:`.RelationshipProperty` using joined eager loading. )rq_aliased_class_poolcs&tt||||jj|_g|_dSr)rVrrWrXrqrrYr\r$r%rWs  zJoinedLoader.__init__cCrfrgrirr$r$r%rrjz!JoinedLoader.init_class_attributeNFc  Ks>|jjsdS|jjr|jr|jd||j}d} |r"|||nd} | dur5|||||| \} }} n-||j dsR|j rJ|j d|j krIdSn| |j rRdS|||||||||\} }} }||j dd}|durtt|j} nd} ||j}tj||j ||| | | |j |d |durdt|jvrtddSdS) z@Add a left outer join to the statement that's being constructed.Nzjoined collectionFrtrrr)with_polymorphicrkchained_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 rvrwr)rxrX_init_user_defined_eager_proc$_setup_query_on_user_defined_adapterr{rrqr|r}rH_generate_row_adapterr@rwith_polymorphic_mappersrr_setup_entity_queryr}secondary_columnsrr )rZr_r`rarbrcrdrkrreruser_defined_adapterclausesadd_to_collectionrr$r$r%rgs       zJoinedLoader.setup_queryc Csd|jvrdS|jj}||jdd}|dur|S|jd}|dd\}}|dur?t|tr5|j|}t j ||j j d}n!| |jdrW||jd}tj||j j d}n |jj|j d}||jd||S)Neager_from_aliasF user_defined_eager_row_processor)rrr)rrar:r@rrstrraliasr ColumnAdapterrHrr{r ORMAdapterr _polymorphic_adaptersr}) rZrbr_rarcr  root_mapperr!rr$r$r%rs>    z*JoinedLoader._init_user_defined_eager_proccCsZ||j|}|r|r||}||jd|n |r%|}||jd||j}|||fS)Nr)_get_entity_clausesr wrapr}rprimary_columns)rZr_rrarcrrr$r$r%rAs"  z1JoinedLoader._setup_query_on_user_defined_adaptercCst|jjr t|jj}nd}d|f}||jvr d|j|<}n |j|d|j|<}|t|jkrStj|j |durA|j ddndddd}t|jj |j ||j|S)Njoinedloader_acrrT)flat)r rr) rrr selectablerrWrrrrHr rfr8)rZr_alt_selectableridxto_adaptr$r$r%_gen_pooled_aliased_class[s&     z&JoinedLoader._gen_pooled_aliased_classc  Cs||jdd} | r | } n||} t| jd|ftj| |jjdddd} | j dus,J|j j r3d|_ |dur@|j d|j jn|j j} | sHd}|j|j||||| | |f|j} ||jd| | || |fS)Nrrjoinedloader_ormadapterTF)radapt_requiredallow_label_resolveanonymize_labels innerjoineager_row_processor)r@rrr_memorr rHr aliased_classrXr)multi_row_eager_loadersrrcreate_eager_joinsr8_create_eager_joinrr})rZr_rrarbrcrdrkrrrrrrr$r$r%r~sL     z"JoinedLoader._generate_row_adapterc Cs |dur|j} n|} |jo|jj} d} ||jvr@| s@|jr@t|j|j} t | dkr0t d| r@|j| d} | d| } }| durJ||j} }|j | |}|rt |ddrtt|j| |jrf| n|j}t |j|j|j}nt tj|j|jdd|j|j}n|j}|jdusJ| p| p|dkp|jj}|rtj||j|| p|jjp|ot|tj|j|jd}n|||||}||j| <|j|_|st |jj!D]}| j"j#$|r|r|j%|}|j&'|q|jj(r|j)|j*+t,-|jj(7_)dSdS) NrzCan't identify which query entity in which to joined eager load from. Please use an exact match when specifying the join path.rr Trunnestedisouter _left_memo _right_memo).rHr!r _should_nest_selectable eager_joins from_clauser#find_left_clause_that_matches_givenrrWrr  setdefaultrrr _entity_for_mapperrr:rrrXrrrrepresents_outer_join_ORMJoinrrJoin_splice_nested_inner_joinstop_on _find_columns primaryjoinpersist_selectablerfcontains_columnrTrr8r;rrrr r6)rZr_r`rarcrkrrrrshould_nest_selectablequery_entity_keyindexesclausedefault_towraptowrapefmonclauseattach_on_outsiderrr$r$r%r#s               zJoinedLoader._create_eager_joinc Cs2|dur t|tjs Jn.t|tjjr|||j|||St|tjs;|d|ur9tj||j|d||dj dSdS|||j |||j }|durfd}|||j |||j }|dure|duscJddSnd}|r|jsv|jsv||}ntj|j ||j|j|j d}ntj||j |j|j|j d}|j|_|S) NFrrr%z9assertion failed attempting to produce joined eager loadsT)r&r')r&r()rrr0rr FromGroupingr2elementr rHrightr(leftr'r&_splice_into_centerr?r) rZrajoin_objrr?splicing target_join right_splicerr$r$r%r2Lsf       z&JoinedLoader._splice_nested_inner_joincCsv|r|||nd}|dur#|}|jr|r||j}n|jr"|j}n ||jd}|dur0dS|j||r9|SdS)NFr)rrcrr@rrH_result_has_identity_key)rZr_rircrarbr decoratorr$r$r%_create_eager_adapters" z"JoinedLoader._create_eager_adapterc Cs|jj|jjjstd|||j}||||||} | durI|j} t |j ||||j | } |j s?||| | |dS||| | |dS|jd|||||||dS)NrFrh)r:rArrrrr rXrLr_instance_processorrHrr)rrrrk) rZr_rarbrHrircrjour_path eager_adapterr _instancer$r$r%rks<  z!JoinedLoader.create_row_processorcsvfdd}fdd}fdd}|d|j|f|d|j|fjr9|d |j|fdSdS) NcsJt||}t|d}|j|f<|}|dur#||dSdSNappend_without_eventrinit_state_collectionr UniqueAppenderr8)rrrr result_listinstrPr_rr$r%#load_collection_from_joined_new_rowszSJoinedLoader._create_collection_loader..load_collection_from_joined_new_rowcsh|fjvrj|f}nt||}t|d}|j|f<|}|dur2||dSdSrQrS)rrrrVrrWrXr$r%(load_collection_from_joined_existing_rowszXJoinedLoader._create_collection_loader..load_collection_from_joined_existing_rowc |dSrr$rrPr$r% load_collection_from_joined_exec zPJoinedLoader._create_collection_loader..load_collection_from_joined_execrrrr8rr)rZr_rrPrjrYrZr]r$rXr%rs z&JoinedLoader._create_collection_loadercstfdd}fdd}fdd}|dj|f|dj|f|jr8|d j|fdSdS) Ncs||<dSrr$r)rPrr$r%load_scalar_from_joined_new_rowszKJoinedLoader._create_scalar_loader..load_scalar_from_joined_new_rowcs>|}|vr||urtddSdS||<dS)Nr)r rX)rrrrrPrrZr$r%$load_scalar_from_joined_existing_rows  zPJoinedLoader._create_scalar_loader..load_scalar_from_joined_existing_rowcr[rr$rr\r$r%load_scalar_from_joined_execr^zHJoinedLoader._create_scalar_loader..load_scalar_from_joined_execrrrr_)rZr_rrPrjr`rbrcr$rar%rs z"JoinedLoader._create_scalar_loader)NNF)F)rlrmrnrorprWrrgrrrrr#r2rLrkrrrqr$r$r\r%rs*   `/#? F',rselectincseZdZdZedgdZdZfddZddZ d d Z d d Z d dZ e dddZddZe dddZddZddZZS)SelectInLoader)rq omit_join _parent_alias _query_info_fallback_query_infor queryinfo)load_only_childload_with_joinin_exprpk_colszero_idxchild_lookup_colsicstt||||jj|_|jjtju}|jjdur!|jj|_n|j d}|r.|j |_n|j j dj |jd|j jd|_|jrV|rO||_||_dS||_dS||_dS)NrhrTr)rVrerWrXrqrErrrfrrr:rrrr_init_for_omit_join_m2orh_init_for_joinri_init_for_omit_join)rZr:r[is_m2o lazyloaderr\r$r%rWAs*      zSelectInLoader.__init__cstjjjfddtDfddjjD}}t|dkr1t j |}d}n|d}d} dd|||dS) Nc3s2|]}jj|dD] }||fVq qdS)r$N)r:rr@)rrequivpk_to_fkrZr$r%rbs z5SelectInLoader._init_for_omit_join..csg|] }|vr|qSr$r$r)rxr$r%rhsz6SelectInLoader._init_for_omit_join..rFrT) r rXrlocal_remote_pairsrEr5r:r{rWrtuple_ query_info)rZrnfk_colsrmror$rwr%rs^s   z"SelectInLoader._init_for_omit_joincsb|jj}t|dkrtj|}d}n|d}d}|jdfdd|D}|dd||||S)NrFrTrhcrr$rrrur$r%r~rz:SelectInLoader._init_for_omit_join_m2o..)rHr{rWrrzrXrr{)rZrnrmro lookup_colsr$r}r%rqts    z&SelectInLoader._init_for_omit_join_m2ocsjt|jj|_t|jfdd|jjD}t|dkr%tj|}d}n|d}d}| dd|||dS)Ncg|]}|qSr$_adapt_elementrpa_inspr$r%r z1SelectInLoader._init_for_join..rFrT) rr:rDrgrr{rWrrzr{)rZrnrmror$rr%rrs    zSelectInLoader._init_for_joincCrfrgrirr$r$r%rrjz#SelectInLoader.init_class_attributer"cCr#r$r'r)r$r$r%r+r,z%SelectInLoader._memoized_attr__bakeryc Cs|jj|jjjstd||jjpt j j |}t |d|js%dSt j|||jr0dS||j} ||j} | |jdd} | durI| } n|j} | |jdsi|jra| jd|jkr`dSn| |jridSt j|||j|j|j| dS)Nrrrrrtr)r:rArrrrr r r?rryrz _entity_isarPostLoad path_existsrXr@rrr{rqr|r}rHcallable_for_path_load_for_path) rZr_rarbrHrircrj selectin_path path_w_propselectin_path_w_proprrr$r$r%rksH   z#SelectInLoader.create_row_processorcs:|r j|vr dSj}|jrRtt}g} j|D]6\} j t fdd|j D} t j | vr:j }nd| vrI||   | fq|  | fq|js\dd|D}|j|j|jstjrfddDfddDfdd} |js| fd dnj| fd d|jr| fd dn | fd d|j} | | j|j| jr| d djjr|jsjjjrfddD| fddn fdd}| ||jr|| || |dS||| |dS)Nc3s$|] }j|tjdVqdS)rN)rrPASSIVE_NO_FETCH)rlk)rHr state_dictr$r%rs z0SelectInLoader._load_for_path..cSs$g|]\}}|jd||j|fqSr)rr )rr overwriter$r$r%rsz1SelectInLoader._load_for_path..crr$rrinspr$r%r rcrr$rrrr$r%r rcs|tjdgRS)Nr)r Bundler-)rrnr$r%r& z/SelectInLoader._load_for_path..cr8r)r4r1)rr$r%r& r7cs |tjjSr)r4rrrXrrr1)rparZr$r%r&$ s cs|tjdddSN primary_keysT) expanding)rCin_rrr1)rmr$r%r&- rcs |tjdddjSr)rCrrrr;r1)rmrnr$r%r&3 s cSs|Sr)r_r1r$r$r%r&? crr$r)relemrr$r%rE rcs |jSr)r;r1)rr$r%r&H r7cs&|jd}|j|jtjjSrv)rr;rrr r6rX)r2rrr$r%rK s  z?SelectInLoader._load_for_path.._setup_outermost_orderby)rrhrkr defaultdictr5r:r rrprrrir8rnrmrlrrrrrHrgr rNrrXrr;_load_via_child_load_via_parent)rZr*r_rastates load_onlyrr{ our_states none_statesr related_identr2rurr$) rrrmrrHrrnrZrrr%rs             zSelectInLoader._load_for_pathcs|j}t|}|r[|d|j}||jd}dd||jjfdd|DdD} |D]*} | | d} || D]\} } }|sG|j| vrGq:| |j| | |sS| n| gq:q.|s |D]\} } }|sj|j| vrjq]| |j| | dq]dS)NrcSsi|]\}}||qSr$r$rr$r$r% g sz2SelectInLoader._load_via_child..csg|] }jr |dn|qSrro)rrr{r$r%rj sz2SelectInLoader._load_via_child..r) r)sorted _chunksizerrr@rrr)rZrrr{r2r_r)our_keyschunkdatar related_objrrrr$rr%r_ s:     zSelectInLoader._load_via_childcs|j}|rdnd}|r{|d|j}||jd}fdd|D}ddt||jj|ddd D} |D]>\} } } } | sF|j| vrFq8| | |}|sk|rkt|d kr]t d || |j | | |dq8| |j | | |q8|s dSdS) Nr$rcs&g|]\}}}}jr|dn|qSrr)rrrrrrr$r%r s z3SelectInLoader._load_via_parent..cSs i|] \}}|dd|DqS)cSrrr$rr$r$r%r rz>SelectInLoader._load_via_parent...r$rr$r$r%r sz3SelectInLoader._load_via_parent..rcSs|dSrvr$rr$r$r%r& rz1SelectInLoader._load_via_parent..rr) r)rrrrrrr@rWr rXrr)rZrr{r2r_r) _empty_resultrrrrrrrrr$rr%r s@        zSelectInLoader._load_via_parent)rlrmrnrpr namedtupler{rrWrsrqrrrr rbr+rkrrrrqr$r$r\r%re's(   1 *recsTfddfdd}fdd}tj|d|dddd tj|d |dddd dS) NcsP|dur&|jjkr&|t|}|r&||ur&tdt||jf|S)NzsInstance %s is already associated with an instance of %s via its %s attribute, and is only allowed a single parent.) r hasparentrinstance_staterr r instance_strrD)rroldvalue initiatorr)r!r$r% _do_check s z*single_parent_validator.._do_checkcs||d|Srr$)rrrrr$r%r8 z'single_parent_validator..appendcs||||Srr$)rrrrrr$r%set_ rz%single_parent_validator..set_r8T)rawretvalr1r})rlisten)r r!r8rr$)rr!r%r9 s   r9)NNNNFN)8ro __future__rrrrrrrrrr r r rbaser r rrrrrrrrrrrrrrrrOColumnProperty strategy_forrR class_loggerrrrrrrrRelationshipPropertyrr MemoizedSlotsrr^rerprrer9r$r$r$r%s                          V#B ;          8  @