B 4]zJ @svdZddlmZddlZddlZddlmZddlmZddlm 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  s<ttj|jgd} g} |o |j|r6|jr6| t|j|j j krj|j j |j\| fdd|rz| t j |r|j r| fddx|jD]} || j|jkr| j|jstj| j|jf|||| |o|jp|jtjk||||| p |j |jd | } x| D]}|| |q WqWdS)N)defaultcstj||jfS)N)orm_utilZ_validator_eventskey)descprop)fnoptsL/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/orm/strategies.pyBsz%_register_attribute..cst|S)N)rZbackref_listeners)rr)backrefuselistr!r"r#Ps) Z parent_tokenr%compare_function useobject extensionZ trackparent typecallable callable_active_history impl_classZsend_modified_eventsdoc)listr to_listr(r%Z single_parentappendsingle_parent_validatorrparentZ validatorsr Ztrack_cascade_eventsZback_populatesZself_and_descendants_propsget class_managerZ_attr_has_implrZregister_attribute_implclass_ directionrZ ONETOMANYZviewonlyr-)rmapperr'r&r)r*Zproxy_propertyr+r,kwZ attribute_extZ listen_hooksmrhookr!)r$rr r%r"_register_attribute)sP         r<) 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|_dS)N)superr?__init__parent_propertyr@)selfr2 strategy_key) __class__r!r"rBsz#UninstrumentedColumnLoader.__init__Nc Ks,x&|jD]}|r|j|}||qWdS)N)r@r0) rDcontext query_entitypathloadoptadaptercolumn_collectionkwargscr!r!r" setup_querys  z&UninstrumentedColumnLoader.setup_querycCsdS)Nr!)rDrGrIrJr8resultrK populatorsr!r!r"create_row_processorsz/UninstrumentedColumnLoader.create_row_processor)N) __name__ __module__ __qualname____doc__ __slots__rBrOrR __classcell__r!r!)rFr"r?s  r?Tcs<eZdZdZdZfddZddZddZd d ZZ S) ColumnLoaderz8Provide loading behavior for a :class:`.ColumnProperty`.)r@ is_compositecs.tt||||jj|_t|jd|_dS)Ncomposite_class)rArYrBrCr@hasattrrZ)rDr2rE)rFr!r"rBs zColumnLoader.__init__c KsNx&|jD]} |r|j| } || qW|jd} |r@|j| } | ||j<dS)Nr)r@r0rC) rDrGrHrIrJrKrLmemoized_populatorsrMrNfetchr!r!r"rOs    zColumnLoader.setup_querycCsPd|_|jdj}|jjp4|jdjp4|jt|jk}t|j|d|j |ddS)NTrF)r'r&r+) is_class_levelr@typerCr+ primary_keyZversion_id_colsetr<compare_values)rDr8Zcoltyper+r!r!r"init_class_attributes  z!ColumnLoader.init_class_attributec Cs\xV|jD]8}|r|j|}||d} | r|d|j| fPqW|d|jdfdS)NFquickexpireT)r@_getterr0r) rDrGrIrJr8rPrKrQcolgetterr!r!r"rRs   z!ColumnLoader.create_row_processor) rSrTrUrVrWrBrOrdrRrXr!r!)rFr"rYs  rY)Zquery_expressioncs4eZdZfddZddZddZddZZS) ExpressionColumnLoadercstt|||dS)N)rArjrB)rDr2rE)rFr!r"rBszExpressionColumnLoader.__init__c Ksd|r`d|jkr`|jdg} x$| D]} |r2|j| } || q W| d} |rV|j| } | ||j<dS)N expressionr) local_optsr@r0rC) rDrGrHrIrJrKrLr]rMr@rNr^r!r!r"rOs     z"ExpressionColumnLoader.setup_queryc Cst|rpd|jkrp|jdg}xT|D]8} |r2|j| } || d} | r |d|j| fPq W|d|jdfdS)NrkFrerfT)rlr@rgr0r) rDrGrIrJr8rPrKrQr@rhrir!r!r"rRs    z+ExpressionColumnLoader.create_row_processorcCs(d|_t|j|d|jdjjdddS)NTFr)r'r&Zaccepts_scalar_loader)r_r<rCr@r`rc)rDr8r!r!r"rds z+ExpressionColumnLoader.init_class_attribute)rSrTrUrBrOrRrdrXr!r!)rFr"rjs rj)r>r=)Z do_nothingcsFeZdZdZdZfddZddZddZdd d Zd d Z Z S)DeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)r@groupcs>tt|||t|jdr&td|jj|_|jj|_dS)Nr[z8Deferred loading for composite types not implemented yet)rArmrBr\rCNotImplementedErrorr@rn)rDr2rE)rFr!r"rB,s   zDeferredColumnLoader.__init__c Cs<|js$|jj}|d|j|fn|d|jdfdS)NnewrfF)r_rCZ_deferred_column_loaderr0r) rDrGrIrJr8rPrKrQZset_deferred_for_local_stater!r!r"rR5sz)DeferredColumnLoader.create_row_processorcCs,d|_t|j|d|jdjj|jdddS)NTFr)r'r&r*Zexpire_missing)r_r<rCr@r`rc_load_for_state)rDr8r!r!r"rdEs z)DeferredColumnLoader.init_class_attributeNc Ks|r"d|jkr"t|j|jjsN|r@|jr@|jd|jdsN|rr|j|krr|j dj |||||||f| n|j rt ||j <n t||j <dS)NZ undefer_pkszundefer_group_%sF))r>F)r=T)rlrbr@ intersectionr2Z_should_undefer_in_wildcardrnr4rrC _get_strategyrOr_r r ) rDrGrHrIrJrKrLr]only_load_propsr9r!r!r"rOQs,    z DeferredColumnLoader.setup_querycsjs tjS|tj@stjSjj}jr@fdd|jD}njg}fdd|D}t }|dkrt dt jf||}tj|j|ddkrt tjS)Ncs4g|],}t|trt|jtr|jjkr|jqSr!) isinstancerstrategyrmrnr).0p)rDr!r" s  z8DeferredColumnLoader._load_for_state..csg|]}|jkr|qSr!)Z unmodified)rwk)stater!r"ryszfParent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceed)rtZ refresh_state)rr ATTR_EMPTYSQL_OKPASSIVE_NO_RESULTmanagerr8rnZiterate_propertiesrorm_excDetachedInstanceErrorr state_strr rZ load_on_identZObjectDeletedErrorZ ATTR_WAS_SET)rDr{passive localparentZtoloadrnsessionr r!)rDr{r"rqs*     z$DeferredColumnLoader._load_for_state)N) rSrTrUrVrWrBrRrdrOrqrXr!r!)rFr"rm$s  &rmc@s&eZdZdZddZejfddZdS)LoadDeferredColumnsz7serializable loader object used by DeferredColumnLoadercCs ||_dS)N)r)rDrr!r!r"rBszLoadDeferredColumns.__init__cCs.|j}|jj}|j|}|jt}|||S)N)rrr8r3 _strategiesrmrq)rDr{rrrrrvr!r!r"__call__s   zLoadDeferredColumns.__call__N)rSrTrUrVrBr PASSIVE_OFFrr!r!r!r"rsrcs$eZdZdZdZfddZZS)AbstractRelationshipLoaderz0LoaderStratgies which deal with related objects.)r8targetr%entitycs>tt||||jj|_|jj|_|jj|_|jj|_dS)N)rArrBrCr8rrr%)rDr2rE)rFr!r"rBs    z#AbstractRelationshipLoader.__init__)rSrTrUrVrWrBrXr!r!)rFr"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)rSrTrUrVr!r!r!r"rs rZnoload)lazyc@s$eZdZdZdZddZddZdS)NoLoaderzYProvide loading behavior for a :class:`.RelationshipProperty` with "lazy=None". r!cCs d|_t|j|d|jjddS)NT)r'r))r_r<rCcollection_class)rDr8r!r!r"rds zNoLoader.init_class_attributec s$fdd}|dj|fdS)Ncs,jr|jj||n d|j<dS)N)r%rget_implrZ initialize)r{dict_row)rDr!r"invoke_no_loadsz5NoLoader.create_row_processor..invoke_no_loadrp)r0r) rDrGrIrJr8rPrKrQrr!)rDr"rRs zNoLoader.create_row_processorN)rSrTrUrVrWrdrRr!r!r!r"rs rselectraise raise_on_sqlZ 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 o|j o|jjdj|j d|jjd|_|jrxDt|jD]6}||jjkrx$|jj|D]}|j||j|<qWqW|jd |dS) NrrrT)Zreverse_directionz%s lazy loading clause %sr) use_proxies equivalentsz2%s will use query.get() to optimize instance loads)rArrBZ strategy_optsrrrrrrC_join_conditionZcreate_lazy_clauserrrrrrZloggerinfor% _get_clausecomparer8_equivalent_columnsrr.)rDr2rEZjoin_conditionrhrN)rFr!r"rBs*  zLazyLoader.__init__cCsDd|_|jjp"|jjtjk p"|j }t|j|d|j|jj |ddS)NT)r'r*r)r+) r_rCr+r7r MANYTOONErr<rqr)rDr8r+r!r!r"rd9s zLazyLoader.init_class_attributecsT|j|j}gdd}t|id|ifdd}t|id|i}|fS)NcSs d|_dS)NF)unique) bindparamr!r!r"visit_bindparamVszFLazyLoader._memoized_attr__simple_lazy_clause..visit_bindparamrcsF|jkr$|j|jdfn|jdkrB|jd|jfdS)N)Z_identifying_keyr0rcallablevalue)r) bind_to_colparamsr!r"r[s   )rrrZtraverseZcloned_traverse)rD criterionrr!)rrr""_memoized_attr__simple_lazy_clauseQs z-LazyLoader._memoized_attr__simple_lazy_clausec Cs|j\}}|dkr(t|dd|DS|jj}|}t|}|tj@rV|tjN}i}xR|D]J\} } } | dk r|r|tj @r| ||| |} n| ||| |} | || <q`W||fS)NcSsg|]\}}}|qSr!r!)rwridentrr!r!r"ryrsz4LazyLoader._generate_lazy_clause..) rsql_utilZadapt_criterion_to_nullrCr2objrZ instance_dictZINIT_OKLOAD_AGAINST_COMMITTED#_get_committed_state_attr_by_column_get_state_attr_by_column) rDr{rrZ param_keysr8orrrrrr!r!r"_generate_lazy_clausems&      z LazyLoader._generate_lazy_clausecCstd||fdS)Nz&'%s' is not available due to lazy='%s')sa_excInvalidRequestError)rDr{rrr!r!r"_invoke_raise_loadszLazyLoader._invoke_raise_loadcCs<|js |jjs|jr|js tjS|j }d}|tj@s<|jrJ|tj @sP|rPtj S|j rn|tj @sn| ||dt|}|s|tj @rtj Stdt||jf|jr,||||}tj |krtj Stj|krtjSt|rdS|j|j|||d}|dk r|S|tj@r&|tj@s,tj S|||||S)NrzbParent instance %s is not bound to a Session; lazy load operation of attribute '%s' cannot proceed)rZlazy_loaded_from)rrCZload_on_pendingZ _load_pendingZ session_idrr|r}rZNON_PERSISTENT_OKr~rZNO_RAISErrrrrr_get_ident_for_use_getZ NEVER_SETr issupersetr Z_identity_lookuprZRELATED_OBJECT_OK_emit_lazyload)rDr{rpendingprimary_key_identityrinstancer!r!r"rqsP        zLazyLoader._load_for_statecsDjj}tj@r|jn|jjfddjjDS)Ncs"g|]}j|dqS))r)r)rwpk)rget_attrrrDr{r!r"rysz5LazyLoader._get_ident_for_use_get..)rr8rrrrdictra)rDrr{rinstance_mapperr!)rrrrDr{r"rs z!LazyLoader._get_ident_for_use_getzsqlalchemy.ext.bakedcCs |jddS)N2)size)bakery)rDbakedr!r!r"_memoized_attr__bakerysz!LazyLoader._memoized_attr__bakeryzsqlalchemy.orm.strategy_optionsc s"fdd}|ddjjjs:|jddjjdk rX|fddj }|sn|tj@r||ddj rj j}| j |j r܈j r|d||fd d|j|Sjjr|fd dxJjjD]>jtjkrjrtjts|fd dqW|\|rrttj !rdSnttj"!rdSj r|d|fd dfd d} ||fdd| #} j$r| St%| } | r| dkrt&dj| dSdSdS)Ncs |jS)N)r r)r)rDr!r"r#z+LazyLoader._emit_lazyload..cSs|dS)NF)Z_adapt_all_clausesZ_with_invoke_all_eagers)qr!r!r"r# rT)Zfullcs|jjjS)N) select_fromr8rC secondary)r)rDr!r"r#scSs |dS)NF)Z autoflush)rr!r!r"r#rrcs |S)N)_set_lazyload_from)r)r{r!r"r#-rcs|jtjjS)N)order_byr r/rC)r)rDr!r"r#5scs"|j|jjjS)N)ZoptionsZLoadZfor_existing_path _current_pathr2Zlazyloadr)r)revstrategy_optionsr!r"r#Dscs |S)N)filter)r) lazy_clauser!r"r#Wrcs|j|_|S)N)updateZ_params)r)rr!r"set_default_params[s z5LazyLoader._emit_lazyload..set_default_paramscs |S)N)r)r)r{r!r"r#brrzKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r)'r add_criteriarCZ bake_queriesZspoilrrrZ NO_AUTOFLUSHZ load_optionsZ load_path_add_lazyload_optionsrrrZwith_post_criteriaZ_load_on_pk_identityr r8rZ_reverse_propertyr7rrZ_use_getrurvrrr Zhas_intersectionrrvaluesZ _never_setallr%lenwarn) rDrrr{rrrrZeffective_pathrrPlr!)rrrrDr{rr"rsj       zLazyLoader._emit_lazyloadc sh|j|js8t|jt|}|d|j|fn,|jsD|jrdfdd} |d|j| fdS)Nrpcs||dS)N)Z_reset)r{rr)rr!r"reset_for_lazy_callables z@LazyLoader.create_row_processor..reset_for_lazy_callable) rr_rZ"_instance_level_callable_processorr5LoadLazyAttributer0populate_existingZalways_refresh) rDrGrIrJr8rPrKrQZset_lazy_callablerr!)rr"rRvs   zLazyLoader.create_row_processor)rSrTrUrVrWrBrdrrrrqrr dependenciesrrrRrXr!r!)rFr"rs  * F rc@s&eZdZdZddZejfddZdS)rz-serializable loader object used by LazyLoadercCs||_|j|_dS)N)rrE)rDrZinitiating_strategyr!r!r"rBszLoadLazyAttribute.__init__cCs0|j}|jj}|j|}|j|j}|||S)N)rrr8r3rrErq)rDr{rrrrrvr!r!r"rs   zLoadLazyAttribute.__call__N)rSrTrUrVrBrrrr!r!r!r"rsrZ immediatec@s*eZdZdZddZd ddZddZdS) ImmediateLoaderr!cCs|jd|dS)N))rr)rCrsrd)rDr8r!r!r"rdsz$ImmediateLoader.init_class_attributeNc KsdS)Nr!) rDrGrrIrJrKrL parentmapperrMr!r!r"rOs zImmediateLoader.setup_queryc s$fdd}|dj|fdS)Ncs|j||dS)N)rrr4)r{rr)rDr!r"load_immediatesz.load_immediateZdelayed)r0r) rDrGrIrJr8rPrKrQrr!)rDr"rRs z$ImmediateLoader.create_row_processor)NN)rSrTrUrWrdrOrRr!r!r!r"rs   rsubquerycseZdZdZfddZddZdddZd d Zd d Zd dZ ddZ ddZ ddZ Gddde ZddZddZddZZS)SubqueryLoader) join_depthcs tt||||jj|_dS)N)rArrBrCr)rDr2rE)rFr!r"rBszSubqueryLoader.__init__cCs|jd|dS)N))rr)rCrsrd)rDr8r!r!r"rdsz#SubqueryLoader.init_class_attributeNcKs|jjs dS|jjr |jd||j}||jdd} | dk rJ| j} n|j} |jdtj j } | |} | |jds|j r|jj r|jj jnd|jd|j krdSn| |jrdS|| \} } }|jdtf|j}||| | ||j}|j| }dtf|d| i|_|d}||| \}}}|j|}|j|}|||||| }||| || }||}||jd|dS) Nrpath_with_polymorphic)Z subquery_pathNloaderrr orig_queryF)r _enable_eagerloads _yield_per _no_yield_perrCr4rrr PathRegistryrootcontainsrrlengthcontains_mapperr8 _get_leftmostr_generate_from_original_query entity_zeror _attributesZ_set_enable_single_crit_prep_for_joinsrZ add_columns _apply_joins_setup_options_setup_outermost_orderbyrb)rDrGrrIrJrKrLrrMwith_poly_infoeffective_entity subq_pathleftmost_mapper leftmost_attrleftmost_relationshipr left_aliasrto_join local_attr parent_aliasr!r!r"rOsX             zSubqueryLoader.setup_querycspjtd}|j|r>|jdkr>|j|j}n|d}|j}fdd|D}||fS)Nrrcs$g|]}tdjj|jqS)r)getattrr_columntopropertyr)rwrN)rrr!r"ryIsz0SubqueryLoader._get_leftmost..)rIrZ_class_to_mapperr2isarC local_columns)rDrZ subq_mapperZ leftmost_propZ leftmost_colsrr!)rrr"r9s  zSubqueryLoader._get_leftmostc Cs|d}|js4|ttdd|jDd||}|||j }|dkr^d|_ n<|dkrx2tdd|DD]} t| | j szd|_ PqzW|j dkr|j|_ |jdkr|jdkrd|_ |} tj|| dd} | S)NcSs g|]}|ddk r|dqS)rNr!)rwZentr!r!r"ryfsz@SubqueryLoader._generate_from_original_query..FTcss|] }|jVqdS)N)table)rwrNr!r!r" }sz?SubqueryLoader._generate_from_original_query..)use_mapper_path)Z_cloneZ correlate _from_objZ_set_select_fromr.rbZcolumn_descriptionsZ_adapt_col_listZ _set_entitiesdistinct_target_keyZ _distinctrraZ _order_byrZ_limitZ_offsetZ with_labelsrr AliasedClass) rDrrrrZ orig_entityrZ target_colsrtZembed_qrr!r!r"rQs4       z,SubqueryLoader._generate_from_original_queryc sg}t|}xZt|D]N\}\}}|dkrT||ddj}||rN|n|} n|} || |jfqWt|dkr~|n.t|dd} | j r| j nt j | j ddj j} fdd| D} || fS) NrrrT)rcs g|]}tjj|jqSr!)r r2r r)rwrN)r rDr!r"rysz2SubqueryLoader._prep_for_joins..)r.pairs enumerater8r r0rrrrrrrrCr) rDrrrrir8rZ prev_mapperZ to_appendr local_colsr r!)r rDr"rs&    zSubqueryLoader._prep_for_joinsc Cs<t|}|dkr,t||dd|g}n|dkrft||dd|t||dd|g}n|dkrdd|ddD}g}xP|r|d} t| d| d} |r| |dd} n | |} || qWt||dd|djg|t||dd|g}x|D]} |j| dd}q W|S) NrrrrcSs:g|]2}t|djs$t|dn|dj|dfqS)rr)rrrrr)rwitemr!r!r"rysz/SubqueryLoader._apply_joins..T)Zfrom_joinpoint)rr of_typepopr0r2join) rDrrrr rZltjZmiddleinnerrattrr!r!r"rs0    "  zSubqueryLoader._apply_joinscCs(||}|j|j}|jr$|j|_|S)N)Z_with_current_pathZ_conditional_options _with_options_populate_existing)rDrrrrr!r!r"rs   zSubqueryLoader._setup_optionscCs6|jjr2|jd}|jt|jj}|j|}|S)Nr)rCrr_target_adaptercopy_and_processr r/)rDr 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. NcCs ||_dS)N)subq)rDr'r!r!r"rBsz(SubqueryLoader._SubqCollections.__init__cCs |jdkr||j||S)N)_data_loadr4)rDrrr!r!r"r4s z#SubqueryLoader._SubqCollections.getcCs&tddt|jddD|_dS)Ncss$|]\}}|dd|DfVqdS)cSsg|] }|dqS)rr!)rwvvr!r!r"ry szCSubqueryLoader._SubqCollections._load...Nr!)rwrzvr!r!r"r sz8SubqueryLoader._SubqCollections._load..cSs |ddS)Nrr!)xr!r!r"r#!rz7SubqueryLoader._SubqCollections._load..)r itertoolsgroupbyr'r()rDr!r!r"r)sz%SubqueryLoader._SubqCollections._loadcCs|jdkr|dS)N)r(r))rDr{rrr!r!r"r$s z&SubqueryLoader._SubqCollections.loader) rSrTrUrVr(rBr4r)rr!r!r!r"_SubqCollections s r/c s|jj|jjjs td|||j}||j d}|dkrDdS|jj } ||j d} | dkr|| |} | |j d| rfdd| D} |j r||| | |n||| | |dS)NzJ'%s' does not support object population - eager loading cannot be applied.r collectionscsg|]}j|qSr!)r@)rwrN)rKr!r"ryIsz7SubqueryLoader.create_row_processor..)r2r5rimplsupports_populationrrrCr4rrr/rbr%_create_collection_loader_create_scalar_loader) rDrGrIrJr8rPrKrQr'rr0r!)rKr"rR(s(  z#SubqueryLoader.create_row_processorcsffddfdd}|djf|dj|f|jrb|djjfdS)Ncs8tfddDd}|j|||dS)Ncsg|] }|qSr!r!)rwrh)rr!r"ryYsz_SubqueryLoader._create_collection_loader..load_collection_from_subq..r!)r4tuplerrset_committed_value)r{rr collection)r0rrD)rr"load_collection_from_subqWs zKSubqueryLoader._create_collection_loader..load_collection_from_subqcsj|kr|||dS)N)r)r{rr)r8rDr!r"&load_collection_from_subq_existing_row_s zXSubqueryLoader._create_collection_loader..load_collection_from_subq_existing_rowrpexistingeager)r0rinvoke_all_eagersr)rDrGr0rrQr9r!)r0r8rrDr"r3Ts z(SubqueryLoader._create_collection_loadercsffddfdd}|djf|dj|f|jrb|djjfdS)NcsZtfddDd}t|dkr8td|d}|j|||dS)Ncsg|] }|qSr!r!)rwrh)rr!r"rypszWSubqueryLoader._create_scalar_loader..load_scalar_from_subq..)NrzLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r)r4r5rr rrrr6)r{rrr7Zscalar)r0rrD)rr"load_scalar_from_subqns zCSubqueryLoader._create_scalar_loader..load_scalar_from_subqcsj|kr|||dS)N)r)r{rr)r=rDr!r""load_scalar_from_subq_existing_row{s zPSubqueryLoader._create_scalar_loader..load_scalar_from_subq_existing_rowrpr:r;)r0rr<r)rDrGr0rrQr>r!)r0r=rrDr"r4ks  z$SubqueryLoader._create_scalar_loader)NN)rSrTrUrWrBrdrOrrrrrrobjectr/rRr3r4rXr!r!)rFr"rs   [A/4 ,rZjoinedcseZdZdZdZfddZddZdd 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|_dS)N)rAr@rBrCrrA)rDr2rE)rFr!r"rBs zJoinedLoader.__init__cCs|jd|dS)N))rr)rCrsrd)rDr8r!r!r"rdsz!JoinedLoader.init_class_attributeNFc  Ks:|jjs dS|jjr&|jr&|jd||j}d} |rD|||nd} | dk rj|||||| \} }} nZ||j ds|j r|j d|j krdSn| |j rdS|||||||||\} }} }||j dd}|dk r|j} nd} ||j}tj||j ||| | | |j |d |dk r6dt|jkr6tddS) z@Add a left outer join to the statement that's being constructed.Nzjoined collectionFrrr)with_polymorphicrchained_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 rrr%rrC_init_user_defined_eager_proc$_setup_query_on_user_defined_adapterrrrrrr8_generate_row_adapterr4Zwith_polymorphic_mappersrrZ_setup_entity_queryrbsecondary_columnsrr)rDrGrHrIrJrKrLrrCrMrBuser_defined_adapterclausesadd_to_collectionrr!r!r"rOs\      zJoinedLoader.setup_queryc Csd|jkrdS|jj}||jdd}|dk r2|S|jd}|dd\}}|dk r~t|trj|j|}t j ||j j d}nD| |jdr||jd}tj|j|j j d}n|jj|j d}||jd||S)NZeager_from_aliasF user_defined_eager_row_processor)rr)rlrIr2r4rrustrraliasrZ ColumnAdapterr8rrr ORMAdapterrr Z_polymorphic_adaptersrb) rDrJrGrIrKrNZ root_mapperrrr!r!r"rDs2        z*JoinedLoader._init_user_defined_eager_proccCsZ||j|}|r2|r2||}||jd|n|rJ|}||jd||j}|||fS)NrK)Z_get_entity_clausesr wraprbrprimary_columns)rDrGrrIrKrHrJr!r!r"rE*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)rNrRr) rrr selectablerrrArrr8rNrNr0)rDrGZalt_selectableridxto_adaptr!r!r"_gen_pooled_aliased_classDs"    z&JoinedLoader._gen_pooled_aliased_classc  Cs||jdd} | r| j} n ||} t| jd|ftj| |jj dddd} |j j rZd|_ |dk rt|j d|j jn|j j} | sd}|j|j|||||| | |f |j} ||jd| | || |fS)NrZjoinedloader_ormadapterTF)rZadapt_requiredZallow_label_resolveZanonymize_labels innerjoineager_row_processor)r4rrrVrZ_memorrOr8rrCr%multi_row_eager_loadersrlrWZcreate_eager_joinsr0_create_eager_joinrGrb)rDrGrrIrJrKrLrrCrrUrIrWrJr!r!r"rFgs@   z"JoinedLoader._generate_row_adapterc Cs|dkr|j} n|} |jo |jj} d} ||jkr| s|jrt|j|j} t | dkr`t d| r|j| d} | d| } }| dkr||j} }|j | |}|r t |ddrt|j| |jr| n|j}t |j|j|j}n t tj|j|jdd|j|j}n|j}| p2| p2|dkp2|jj}|rxtj||j|| ph|jjph|oht|tj|j|jd}n|||||}||j| <|j|_|sxDt |jj!D]2}| j"j#$|r|r|j%|}|j&'|qW|jj(r|j)|j*+t,-|jj(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.r aliased_classT)rZunnested)isouter _left_memo _right_memo).r8rYr Z_should_nest_selectableZ eager_joinsZ from_clauserZ#find_left_clause_that_matches_givenrSrrr setdefaultr rr[Z_entity_for_mapperr r2rrrCrrrZrepresents_outer_join_ORMJoinrurZJoin_splice_nested_inner_joinZstop_onZ _find_columnsZ primaryjoinZpersist_selectablerNZcontains_columnr@rQr0rr&r#r$r r/)rDrGrHrIrKrrIrWrCrZshould_nest_selectableZquery_entity_keyZindexesZclauseZdefault_towrapZtowrapZefmonclauseZattach_on_outsider%rhr!r!r"rZs~               zJoinedLoader._create_eager_joinc Cs|dkr n\t|tjjr,|||j|||St|tjsf|d|krbtj||j|d||dj dSdS|||j |||j }|dkrd}|||j |||j }|dkrdSnd}|r|js|js||}ntj|j ||j|j|j d}ntj||j |j|j|j d}|j|_|S)NFrLr)r\r]r^T)r\r])r\r^)rurrSZ FromGroupingraZelementrr`r[r8rightr^leftr]r\Z_splice_into_centerrbr#) rDrIZjoin_objrIrbZsplicingZ target_joinZ right_splicer%r!r!r"ra6sR      z&JoinedLoader._splice_nested_inner_joincCsz|r|||nd}|dk rF|}|jr8|r8||j}q`|jr`|j}n||jd}|dkr`dS|j||rr|SdSdS)NFrX)rDrKrPr4rr8Z_result_has_identity_key)rDrGrPrKrIrJrHZ decoratorr!r!r"_create_eager_adapter|s z"JoinedLoader._create_eager_adapterc Cs|jj|jjjs td|||j}||||||} | dk r|j} t |j ||||j | } |j s|||| | |q||| | |n|jd|||||||dS)NzJ'%s' does not support object population - eager loading cannot be applied.F))rr)r2r5rr1r2rrrCrerZ_instance_processorr8rr%r4r3rsrR) rDrGrIrJr8rPrKrQZour_pathZ eager_adapterr _instancer!r!r"rRs, z!JoinedLoader.create_row_processorcsrfdd}fdd}fdd}|d|j|f|d|j|fjrn|d |j|fdS) NcsFt||}t|d}|j|f<|}|dk rB||dS)Nappend_without_event)rinit_state_collectionr UniqueAppenderr0)r{rrr7 result_listinst)rfrGrr!r"#load_collection_from_joined_new_rowszSJoinedLoader._create_collection_loader..load_collection_from_joined_new_rowcsd|fjkrj|f}n(t||}t|d}|j|f<|}|dk r`||dS)Nrg)rrhr rir0)r{rrrjr7rk)rfrGrr!r"(load_collection_from_joined_existing_rows zXJoinedLoader._create_collection_loader..load_collection_from_joined_existing_rowcs |dS)Nr!)r{rr)rfr!r" load_collection_from_joined_execszPJoinedLoader._create_collection_loader..load_collection_from_joined_execrpr:r;)r0rr<)rDrGrrfrQrlrmrnr!)rfrGrr"r3s    z&JoinedLoader._create_collection_loadercspfdd}fdd}fdd}|dj|f|dj|f|jrl|d j|fdS) Ncs||<dS)Nr!)r{rr)rfrr!r"load_scalar_from_joined_new_rowszKJoinedLoader._create_scalar_loader..load_scalar_from_joined_new_rowcs8|}|kr,||k r4tdn||<dS)NzLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' )r r)r{rrr:)rfrrDr!r"$load_scalar_from_joined_existing_rows  zPJoinedLoader._create_scalar_loader..load_scalar_from_joined_existing_rowcs |dS)Nr!)r{rr)rfr!r"load_scalar_from_joined_execszHJoinedLoader._create_scalar_loader..load_scalar_from_joined_execrpr:r;)r0rr<)rDrGrrfrQrorprqr!)rfrrDr"r4s  z"JoinedLoader._create_scalar_loader)NNF)F)rSrTrUrVrWrBrdrOrDrErVrFrZrarerRr3r4rXr!r!)rFr"r@s$   U0#@ E',r@Zselectinc seZdZdZedddddddgZd Zfd d Zd d Z ddZ ddZ ddZ e dddZddZe dddZddZddZZS)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 |jd|j jd|_|jr|r||_||_q||_n ||_dS)N))rrrT)rr)rArrrBrCrr7rrrsrsrr2rrrr_init_for_omit_join_m2oru_init_for_joinrv_init_for_omit_join)rDr2rEZis_m2o lazyloader)rFr!r"rB+s&        zSelectInLoader.__init__cstjjjfddtDfddjjD}}t|dkrbt j |}d}n |d}d} dd|||dS) Nc3s0|](}jj|dD]}||fVqqdS)r!N)r2rr4)rwrzZequiv)pk_to_fkrDr!r"rLsz5SelectInLoader._init_for_omit_join..csg|]}|kr|qSr!r!)rwrh)rr!r"ryRsz6SelectInLoader._init_for_omit_join..rFrT) rrCrZlocal_remote_pairsrr.r2rarrtuple_ query_info)rDrzZfk_colsryr{r!)rrDr"rGs    z"SelectInLoader._init_for_omit_joincsb|jj}t|dkr$tj|}d}n |d}d}|jdfdd|D}|dd||||S)NrFrT))rrcsg|]}j|qSr!)r)rwr)rr!r"rygsz:SelectInLoader._init_for_omit_join_m2o..)r8rarrrrCrsr)rDrzryr{Z 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_element)rwrh)pa_inspr!r"ryqsz1SelectInLoader._init_for_join..rFrT) rr2r6rtrrarrrr)rDrzryr{r!)rr"r~ms   zSelectInLoader._init_for_joincCs|jd|dS)N))rr)rCrsrd)rDr8r!r!r"rd{sz#SelectInLoader.init_class_attributezsqlalchemy.ext.bakedcCs |jddS)Nr)r)r)rDrr!r!r"rsz%SelectInLoader._memoized_attr__bakeryc Cs|jj|jjjs td||jjp.t j j |}t |d|jsJdSt j|||jr`dS||j} ||j} | |jdd} | dk r| j} n|j} | |jds|jr| jd|jkrdSn| |jrdSt j|||j|j|j| dS)NzJ'%s' does not support object population - eager loading cannot be applied.rrrr)r2r5rr1r2rrr rrrrZ _entity_isarZPostLoadZ path_existsrCr4rrrrrrr8Zcallable_for_path_load_for_path) rDrGrIrJr8rPrKrQZ selectin_pathZ path_w_propZselectin_path_w_proprrr!r!r"rRs<    z#SelectInLoader.create_row_processorcs,|rj|krdSj}|jrtt}jx`|D]X\} j t fdd|j D} t j | krpj }Pd| kr4||   | fq4W|jsdd|D}|j|j|jstjrfddDfddDfdd} |js$| fd dnj| fd d|jr\| fd dn| fd d|j} | | j|j| jr| d djjr|jsjjjrԇfddD| fddnfdd} | | |jr||| |n||| |dS)Nc3s"|]}j|tjdVqdS))rN)rrZPASSIVE_NO_FETCH)rwZlk)r8r{ state_dictr!r"rsz0SelectInLoader._load_for_path..cSs$g|]\}}|jd||j|fqS)r)rr)rwr{ overwriter!r!r"rysz1SelectInLoader._load_for_path..csg|]}|qSr!)r)rwrh)inspr!r"ryscsg|]}|qSr!)r)rwrh)rr!r"ryscs|tjdS)Nr)r)r ZBundle)r)rrzr!r"r#sz/SelectInLoader._load_for_path..cs |S)N)r)r)rr!r"r#rcs |tjjS)N)rrr rCrr)r)rparDr!r"r# s cs|tjdddS)N primary_keysT) expanding)rin_rr)r)ryr!r"r# scs |tjdddjS)NrT)r)rrrrr)r)ryrzr!r"r# scSs|S)N)r)rr!r!r"r# rcsg|]}|qSr!)r)rwelem)rr!r"ry& scs |jS)N)r)r)r&r!r"r#( rcs&|jd}|j|jtjjS)Nr)rrr#r$r r/rC)rr%)rDr!r"r+ s z?SelectInLoader._load_for_path.._setup_outermost_orderby)rrurwr0 defaultdictr.r2rr5r|rr~rvr0rzryrxrrrrrrtr rr!rCr"r_load_via_child_load_via_parent)rDrrGrIZstatesZ load_onlyrr our_statesrZ related_identrrrr!) r&rryrr8rrzrDr{rr"rsr       zSelectInLoader._load_for_pathcs|j}t|}x|r|d|j}||jd}dd||jjfdd|DdD}x\|D]T} || } xF|| D]:\} } } | s|j| krqv| |j| | |s| n| gqvWq`WqWdS)NrcSsi|]\}}||qSr!r!)rwrzr+r!r!r" F sz2SelectInLoader._load_via_child..csg|]}jr|dn|qS)r)r{)rwr)rr!r"ryJ sz2SelectInLoader._load_via_child..)r)r%sorted _chunksizerrrrr6)rDrrrrGr%Zour_keyschunkdatarZ related_objr{rrr!)rr"r= s"   zSelectInLoader._load_via_childcs|j}|rdnd}x|r|d|j}||jd}fdd|D}ddt||jj|ddd D} x|D]|\} } } } | s|j| krqt| | |}|s|rt|d krt d || |j | | |dqt| |j | | |qtWqWdS) Nr!rcs&g|]\}}}}jr|dn|qS)r)r{)rwrr{rr)rr!r"ryd sz3SelectInLoader._load_via_parent..cSs i|]\}}dd|D|qS)cSsg|] }|dqS)rr!)rwr*r!r!r"ryi sz>SelectInLoader._load_via_parent...r!)rwrzr+r!r!r"rh sz3SelectInLoader._load_via_parent..)rcSs|dS)Nrr!)r,r!r!r"r#l rz1SelectInLoader._load_via_parent..rzLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' ) r%rr-r.rrrr4rr rrr6)rDrrrrGr%Z _empty_resultrrrrr{rrr7r!)rr"r[ s0      zSelectInLoader._load_via_parent)rSrTrUrWr0 namedtuplerrrBrr}r~rdr rrrRrrrrXr!r!)rFr"rrs* 1 rrcsTfddfdd}fdd}tj|d|dddd tj|d |dddd dS) NcsP|dk rL|jjkrL|t|}|rL||k rLtdt||jf|S)NzsInstance %s is already associated with an instance of %s via its %s attribute, and is only allowed a single parent.) r hasparentrZinstance_staterrrZ instance_strr6)r{roldvalue initiatorr)rr!r" _do_check s z*single_parent_validator.._do_checkcs||d|S)Nr!)r{rr)rr!r"r0 sz'single_parent_validator..appendcs||||S)Nr!)r{rrr)rr!r"set_ sz%single_parent_validator..set_r0T)rawZretvalr+rb)rZlisten)rrr0rr!)rrr"r1 s   r1)NNNNFN)8rVZ __future__rr0r-rrrrrrr r r rbaser r rrrrr{rrrrrrrrrrr<ZColumnPropertyZ strategy_forr?Z class_loggerrYrjrmr?rrZRelationshipPropertyrrZ MemoizedSlotsrrrrr@rrr1r!r!r!r" s                          M# B ;         " @   v