o znh~@sLdZddlmZddlZddlmZddlmZddlmZddlm Z dd l m Z dd l m Z dd l mZdd l mZd dlmZd dlm Z d dlm Ze ZddZe dd-ddZddZ d.ddZ    d/ddZ   d.ddZ    d/ddZdd Zd!d"Zd#d$Zd%d&Z d'd(Z!Gd)d*d*e"Z#d+d,Z$dS)0zprivate module containing functions used to convert database rows into object instances and associated state. the functions here are called primarily by Query, Mapper, as well as some of the attribute loading strategies. )absolute_importN) attributes)exc) path_registry)strategy_options)_DEFER_FOR_STATE)_SET_DEFERRED_EXPIRED) _none_set) state_str)utilc #sTt_i_j}j}|r|rt}nfdd}zrttfddjD\}|s6t d| i_ j rI j }|sHWd Sn}|r]dfdd|D}n fd d|D}jD] \} } | | ql|rt ||}|D]} | Vqj sWd Sq7ty} zt | WYd } ~ d Sd } ~ ww) z$Return an ORM result as an iterator.cstddtj|DS)Ncss&|]\}}|jr t|n|VqdSN)use_id_for_hashid).0entitemrA/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/loading.py 3s  z/instances..filter_fn..)tuplezip _entitiesrow)queryrr filter_fn2s zinstances..filter_fncsg|] }|qSr) row_processor)r query_entity)contextcursorrrr ;s zinstances..resultTrcsg|]}|qSrr)rr)procrrr"Qcs"g|] fddDqS)csg|]}|qSrr)rr$rrrr"Tr%z(instances...r)r) keyed_tupleprocessrrr"SsN) _new_runidrunidpost_load_paths_has_mapper_entitiesis_single_entityrlistrrr lightweight_named_tuplepartials _yield_per fetchmanyfetchallitemsinvoke unique_list Exceptioncloseraise_from_cause) rr!r filtered single_entityrlabelsfetchrowspath post_loadrerrr)r r!r&r$r'rr instances#s^     rAzsqlalchemy.orm.queryTc s|jr j}zzd_t|jdk}|r2t|jdjr-fdd|D}nRt|}nMfddt|jD}g}dd|jD}t d|} |D].} t| } |D]} | | d urvj t | | t | | iid | | <qX|| | qPt|W|_S|_w) z:Merge a result into this :class:`.Query` object's Session.Frrc s,g|]}jt|t|iidqS)load _recursive_resolve_conflict_map)_mergerinstance_state instance_dict)rinstance)rCsessionrrr"wsz merge_result..cs g|] \}}t|jr|qSr) isinstance _MapperEntity)rie)querylibrrr"s  cSsg|]}|jqSr) _label_name)rrrrrr"sr#NrB)rJ _autoflush autoflushlenrrKrLr- enumerater r.rFrrGrHappenditer) rOriteratorrCrRr:r#mapped_entitieskeysr&rnewrowrMr)rCrOrJr merge_resulthsD       r[cCs|j|}|dur>t|}|jr<|tj@stjS|tj@s!|Sz |||W|St j y;| |gYdSw|SdS)zqLook up the given key in the given session's identity map, check the object for expired state if found. N) identity_mapgetrrGexpiredSQL_OKPASSIVE_NO_RESULTRELATED_OBJECT_OK _load_expiredorm_excObjectDeletedError_remove_newly_deleted)rJkeypassiverIstaterrrget_from_identitys"     ricCs6|dur |d}|d}nd}}t||||||dS)z.Load the given identity key from the database.Nrr ) refresh_statewith_for_updateonly_load_propsidentity_token)load_on_pk_identity)rrfrjrkrlidentrmrrr load_on_idents rpc s0|dur |}|n|}|dur`|}|j\}d|vrDtfddt|j|D} t|| }t | t |krDt d| |dd}||_ tfddt||jD} | |_|durjd} ||_n|jdurvd} |j|_nd} |jt|| |||dd|_z|WStjyYdSw) z6Load the given primary key identity from the database.Ncs"g|] \}}|dur|jqSrrf)rcolvalue _get_paramsrrr"s z'load_on_pk_identity..zofully NULL primary key identity cannot load any object. This condition may raise an error in a future release.TFcsg|] \}}|j|fqSrrq)rid_val primary_keyrtrrr"s )populate_existing version_checkrlrjrm)_clone_get_condition _mapper_zero _get_clausesetrrwsql_utiladapt_criterion_to_nullrSr warn _adapt_clause _criteriondict_params_for_update_arg _get_optionsbool _order_byonerc NoResultFound) rprimary_key_identityrjrkrlrmqmapperr}nonesparamsryrrtrrnsd          rnc Ks|r||} n|j} i} ||jd| | D]} |r!| j|vr!q| j||||f||| d| q|durL||jurN|rC|j|} n|} || dSdSdS)Nmemoized_setups)rlcolumn_collectionmemoized_populators) _iterate_polymorphic_properties_polymorphic_propertiesr~rrfsetuppolymorphic_oncolumnsrU)r rrr>adapterrwith_polymorphicrlpolymorphic_discriminatorkwpoly_propertiesquick_populatorsrspdrrr_setup_entity_query!s<   rc s j rfdd D jtt j} dur)|  fdd D} |jdt } | D]f} | | vr| | } | t urMd | j | j fq3| tur\d | j d fq3d} roj| }|duro||d } | sw|| d } | rd  | j | fq3| | |q3| | |q3jjjjrjj|n|jjjp jt jjjt jjjtjjj rЈjjj tj tj!jj"j#j$j%s2|dur2d |jf}|jvr j|j&d kr 'j|j(d |}n 'd|}|r2||ur2 dus!Jt)||}t*+|j,|||t*- rJj durI .nd j/rTt j0nt j fdd} j1r|sst2| |||}|S)z`Produce a mapper level row processor callable which processes rows into mapped instances.csg|]}j|qSr)r)rc)rrrr"jsz'_instance_processor..Nc3s|]}j|VqdSr)_props)rkrrrrrsz&_instance_processor..rnewexpireFquickloader))selectinload_polymorphicTentitiesc s,r}|}|}|jk}d}d}n`tfddDf}|}|durL|}|}|jk}| }d}rK|sKt ||n*|drTdSd}d}d} j}|}|}||_|_|_  |||szr|rss|_ |_ t ||| | |r|rr|jj| r j|n r|jj| s|jr̈rƈ r|| n||rԈ|d|S|j}|jv}|r|sdrt||| |} |rr|jj|| ||| rjr|d|S)NTFcsg|]}|qSrr)rcolumnrrrr"r%z:_instance_processor.._instance..reager)objr)rr]_validate_version_id class_manager new_instancerfrm session_id_add_unpresent load_options load_path_populate_fullmanagerdispatchrCrJrefreshmodified_commit _commit_all add_stateunloadedr/_populate_partialinvoke_all_eagers) rrhrIdict_isnew currentloadloaded_instance identitykeyrto_loadrr identity_classrmrHrGis_not_primary_keyload_evtrloaded_as_persistentrrlpersistent_evtpk_colsrx populatorsr?propagate_options refresh_evtrefresh_identity_keyrjr)rsession_identity_mapryrr _instances           "    z&_instance_processor.._instance)3rw_identity_class collections defaultdictr- _prop_set intersectionr]rr rrUrf_deferred_column_loaderr r_gettercreate_row_processorrr _current_pathr>rJr\rxalways_refreshrrrrCrrrGrHhash_keyryr)rmstrategy_should_selectin_load local_opts_load_subclass_via_inPostLoadcallable_for_pathr for_context_identity_key_from_stateallow_partial_pks issupersetpolymorphic_map_decorate_polymorphic_switch)rr r#r>rrlrjr_polymorphic_frompropsrproprrgetter adapted_colrfselectin_load_via callable_rrrr_instance_processorSs             <  rcsP|j}t|jjdk|jr||\n|j\fdd}|S)Nrcsb|j}jf|jf|j|d}|jr|dd||jjfdd|DddS)N) cache_pathcSs|Sr)rx)rrrrsz8_load_subclass_via_in..do_load..cs,g|]\}}r|jddn|jdqS)rrrq)rrh load_attrs)zero_idxrrr"sz:_load_subclass_via_in..do_load..) primary_keys) r_with_lazyload_options _with_optionsparent_populate_existing add_criteriarJrall)r r>states load_onlyeffective_entity orig_queryq2 disable_opt enable_optrrrrdo_loads   z&_load_subclass_via_in..do_load)rrS base_mapperrwis_aliased_class_subclass_load_via_in_subclass_load_via_in_mapper)r r>entityrrrrrrs rc Cs:|r`|j|_|dD] \} } | ||| <q |r/|dD]\} } || d| r-|j| qn|dD] \} } | r?|j| q3|dD] \} } | |||qD|dD] \} } | |||qSdS||jkr||_|dD]\} } | |vrz| ||| <ql|dD] \} } | |||qdS|dD] \} } | |||qdS)Nrrrdelayedexisting)r)popexpired_attributesaddr) r rrhrrrrrxrrfr set_callable populatorrrrrs@      rc Cs|s|j|}|dD]\} } | |vr| |||q n[|}||j|<|dD]\} } | |vr4| ||| <q&|dD]\} } | |vrO|| d| rO|j| q9|dD]\} } | |vrb| |||qT|dD]\} } | |vru| |||qg|dD]\} } | |vr| |||qz|S)Nr rrrr r)r/r rr) r rrhrrrrrrrfrrrrrrrs@         rc Csd|j}|dur dS|r|j|}||||j||kr0tdt|||||j||fdS)NzWInstance '%s' has version id '%s' which does not match database-loaded version id '%s'.)version_id_colr_get_state_attr_by_columnrcStaleDataErrorr )rrhrrrrrrrrs& rc s`|dur|njdurSrjfdd}t|fdd}|S)NcsJzj|}Wn tytd|w|urdSt|dS)Nz*No such polymorphic_identity %r is defined)r)rKeyErrorAssertionErrorr) discriminator sub_mapper)rr rr>r#rrconfigure_subclass_mapper0s" z?_decorate_polymorphic_switch..configure_subclass_mappercs,|}|dur|}|r||S|Srr)rrr) instance_fnpolymorphic_instancesrrrpolymorphic_instanceFs z:_decorate_polymorphic_switch..polymorphic_instance)rrr PopulateDict) rr rr#r>rrrrr)rr rrr>rrr#rrs   rc@sPeZdZdZdZddZddZddZed d Z ed d Z ed dZ dS)rz:Track loaders and states for "post load" operations. )loadersr load_keyscCsi|_t|_d|_dSr)rr OrderedDictrr)selfrrr__init__Xs  zPostLoad.__init__cCs||j|<dSr)r)r!rh overwriterrrr]szPostLoad.add_statecsx|jsdStj|}|jD]$\}}}}fdd|jD}|r4|||||jg|Ri|q|jdS)Ncs&g|]\}}|jjr||fqSr)rrisa)rrhr#limit_to_mapperrrr"is  z#PostLoad.invoke..) rr PathRegistrycoercervaluesr3rclear)r!r r>tokenrargrrrr%rr4ds  zPostLoad.invokecCs$|j|j}|dur|r||_|Sr)r*r]r>r)clsr r>rlplrrrrrs zPostLoad.for_contextcCs|j|jvo||j|jjvSr)r>r*r)r!r r>rfrrr path_existsys zPostLoad.path_existsc OsD|j|jvr |j|j}n t}|j|j<|||||f|j|<dSr)r>r*rr) r-r r>r&r+loader_callabler,rr.rrrrs zPostLoad.callable_for_pathN) __name__ __module__ __qualname____doc__ __slots__r"rr4 classmethodrr/rrrrrrQs  rc s>|j}|stdt|t|j}d}|r|j}j rFj sF ||}|durFt | td|d||d}|dur|rP|j}nfddjD}|j|ritdt||}t|rvjr{t|rtd t|dSt | |||d }|r|durt|dSdS) z4initiate a column-based attribute refresh operation.zQInstance %s is not bound to a Session; attribute refresh operation cannot proceedFN*)rlrjcsg|]}j|jqSr)_columntopropertyrf)rrrrrrr"s z*load_scalar_attributes..z_Instance %s cannot be refreshed - it's not persistent and does not contain a full primary key.zwInstance %s to be refreshed doesn't contain a full primary key - can't be refreshed (and shouldn't be expired, either).)rjrl)rJrcDetachedInstanceErrorr rrfrattrsrYinheritsconcrete_optimized_get_statementrproptionsrLoadundeferfrom_statementrwrsa_excInvalidRequestErrorrr issubsetrrr warn_limitedrd) rrhattribute_namesrJhas_keyr# statement identity_keypk_attrsrrrload_scalar_attributessn        rK)T)NNN)NNNN)%r4 __future__rrrrrcrrbaserr r r r rBsqlrcounterr(rA dependenciesr[rirprnrrrrrrrobjectrrKrrrrsX            E 5  X 8 6 9"4 :