B 4]}@s4dZddlmZddlZddlmZddlmZddlmZddlm Z dd l m Z dd l m Z dd l mZdd l mZd dlmZd dlm Z d dlm Ze ZddZe dd-ddZddZd.ddZd/ddZd0ddZd1ddZdd Zd!d"Zd#d$Zd%d&Z d'd(Z!Gd)d*d*e"Z#d+d,Z$dS)2zprivate 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 #szt_i_j}j o4tjdko4jdj}|rP|rDt}n fdd}yt t fddjD\}|st d|xi_ jrj}|sPn}|rЈdfdd|D}nfd d|D}x"jD]\} } | | qW|rt ||}x|D] } | Vq WjsPqWWn6tk rt} zt | Wd d } ~ XYnXd S) z$Return an ORM result as an iterator.rrcstddtj|DS)Ncss$|]\}}|jrt|n|VqdS)N)Zuse_id_for_hashid).0entitemrI/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/orm/loading.py 8sz/instances..filter_fn..)tuplezip _entities)row)queryrr filter_fn6szinstances..filter_fncsg|]}|qSr)Z row_processor)r query_entity)contextcursorrrr @szinstances..resultcsg|] }|qSrr)rr)procrrrUscs"g|]fddDqS)csg|] }|qSrr)rr )rrrrXsz(instances...r)r) keyed_tupleprocess)rrrXsN) _new_runidrunidpost_load_pathsZ_has_mapper_entitiesZ_only_return_tupleslenrZsupports_single_entityrlistrr lightweight_named_tuplepartialsZ _yield_perZ fetchmanyZfetchallitemsinvokeZ unique_list ExceptioncloseZraise_from_cause) rrrZfiltered single_entityrlabelsZfetchZrowspath post_loadrerrr)rrr!r r"rr instances#sP         r3zsqlalchemy.orm.queryTc s|jrj}zd_t|jdk}|rdt|jdjrZfdd|D}nt|}nfddt|jD}g}dd|jD}t d|} xh|D]`} t| } xD|D]<} | | d k rj t | | t | | iid | | <qW|| | qWt|S|_Xd S) 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)r4sessionrrr|sz merge_result..cs g|]\}}t|jr|qSr) isinstance _MapperEntity)rie)querylibrrrscSsg|] }|jqSr)Z _label_name)rrrrrrsrN)r4r5r6)r;Z _autoflush autoflushr&rr<r=r' enumerater r(r7rr8r9appenditer) r@riteratorr4rAr.rZmapped_entitieskeysr!rZnewrowr>r)r4r@r;r merge_resultls<          rGcCs|j|}|dk rzt|}|jrv|tj@s4tjS|tj@sB|Sy|||Wn"t j k rt| |gdSX|SdSdS)zqLook up the given key in the given session's identity map, check the object for expired state if found. N) identity_mapgetrr8ZexpiredZSQL_OKZPASSIVE_NO_RESULTZRELATED_OBJECT_OKZ _load_expiredorm_excObjectDeletedErrorZ_remove_newly_deleted)r;keyZpassiver:staterrrget_from_identitys     rNcCs6|dk r|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)rrLrOrPrQZidentrRrrr load_on_idents rTc s|dkr|}|n|}|dk r|}|j\}d|krntfddt|j|D} t|| }| |dd}||_ t fddt||jD} | |_ |dk rd} ||_ n|j dk rd} |j |_ nd} |jt|| |||dd|_y|Stjk rdSXdS)z6Load the given primary key identity from the database.Ncs"g|]\}}|dkr|jqS)N)rL)rcolvalue) _get_paramsrrrsz'load_on_pk_identity..TFcsg|]\}}|j|fqSr)rL)rZid_val primary_key)rWrrrs)populate_existing version_checkrQrOrR)Z_cloneZ_get_conditionZ _mapper_zero _get_clausesetrrXsql_utilZadapt_criterion_to_nullZ _adapt_clauseZ _criteriondictZ_paramsZ_for_update_argZ _get_optionsboolZ _order_byZonerJZ NoResultFound) rZprimary_key_identityrOrPrQrRqmapperr[ZnonesparamsrZr)rWrrSsL        rSc Ks|r||} n|j} i} ||jd| x<| D]4} |rD| j|krDq0| j||||f||| d| q0W|dk r||jk r|r|j|} n|} || dS)Nmemoized_setups)rQcolumn_collectionZmemoized_populators) Z_iterate_polymorphic_propertiesZ_polymorphic_propertiesr\rrLZsetuppolymorphic_oncolumnsrC)rrarr0adapterrdZwith_polymorphicrQpolymorphic_discriminatorkwZpoly_propertiesquick_populatorsrVZpdrrr_setup_entity_querys0     rkc s j rfdd D jtt j} dk rR|  fdd D} |jdt } x| D]} | | kr$| | } | t krd | j | j fn| tkrd | j d fnfd} rj| }|dk r||d } | s|| d } | rd  | j | fn| | |qh| | |qhWjjjjrZjj|n|jjjpr jt jjjt jjjtjjj rjjj tj tj!jj"j#j$j%sd|dk rdd |jf}|jkr&j|j&d kr& 'j|j(d |}n 'd|}|rd||k rdt)||}t*+|j,|||t*- rj dkr .nd j/rt j0nt j fdd} j1r|sst2| |||}|S)z`Produce a mapper level row processor callable which processes rows into mapped instances.csg|]}j|qSr)rf)rc)rgrrrhsz'_instance_processor..Nc3s|]}j|VqdS)N)Z_props)rk)rarrrpsz&_instance_processor..rcnewexpireFquickloader))Zselectinload_polymorphicTZentitiesc sJr,}|}|}|jk}d}d}ntfddDf}|}|dk r|}|}|jk}| }d}r|st ||nT|drdSd}d}d} j}|}|}||_|_|_  |||sr|rss|_ |_ t ||| | |r|rfrN|jj| r~ j|nr~|jj| s|jrr r|| n ||rF|dn|j}|jk}|r|sdr,t||| |} |r,r |jj|| ||| rFjrF|d|S)NTFcsg|] }|qSrr)rcolumn)rrrrsz:_instance_processor.._instance..reager)objr$rrI_validate_version_id class_managerZ new_instancerLrR session_idZ_add_unpresentZ load_options load_path_populate_fullmanagerdispatchr4r;refreshZmodifiedZ_commitZ _commit_all add_stateunloadedr)_populate_partialZinvoke_all_eagers) rrMr:dict_isnewZ currentloadloaded_instanceZ identitykeyr~to_load)rgridentity_classrRr9r8is_not_primary_keyload_evtrxloaded_as_persistentrarQpersistent_evtpk_colsrY populatorsr1propagate_options refresh_evtrefresh_identity_keyrOr$rwsession_identity_maprZ)rr _instances             z&_instance_processor.._instance)3rXZ_identity_class collections defaultdictr'Z _prop_set intersectionrIrr rrCrLZ_deferred_column_loaderr rfZ_getterZcreate_row_processorrrZ _current_pathr0r;rHrYZalways_refreshr_rvr{r4r|rr8r9Zhash_keyrZr$rRZstrategyZ_should_selectin_loadZ local_opts_load_subclass_via_inPostLoadcallable_for_pathra for_context_identity_key_from_stateallow_partial_pks issupersetpolymorphic_map_decorate_polymorphic_switch)rarrr0rgrQrOrh_polymorphic_fromZpropsrjZproprUgetterZ adapted_colrLZselectin_load_viaZ callable_rr)rgrrrRr9r8rrrxrrarQrrrYrr1rrrrOr$rwrrZr_instance_processorQs            < rcsP|j}t|jjdk|jr.||\n |j\fdd}|S)Nrcsb|j}jf|jf|j|d}|jr:|dd||jjfdd|DddS)N) cache_pathcSs|S)N)rY)r`rrrz8_load_subclass_via_in..do_load..cs,g|]$\}}r|jddn|jdqS)rr)rL)rrMZ load_attrs)zero_idxrrrsz:_load_subclass_via_in..do_load..)Z primary_keys) rZ_with_lazyload_optionsZ _with_optionsparentZ_populate_existingZ add_criteriar;rball)rr0statesZ load_onlyZeffective_entityZ orig_queryZq2) disable_opt enable_optr`rrrdo_loads  z&_load_subclass_via_in..do_load)rar&Z base_mapperrXZis_aliased_classZ_subclass_load_via_inZ_subclass_load_via_in_mapper)rr0Zentityrarr)rrr`rrrs rc Cs\|r|j|_x |dD]\} } | ||| <qW|rfxX|dD]$\} } || d| r<|j| qWdS)Nrprorndelayedexisting)r$popexpired_attributesaddrx) rrrMrrrxrrYrrLr set_callable populatorrrrrys2   ryc Cs2|s:|j|}x|dD]\} } | |kr| |||qWn|}||j|<x(|dD]\} } | |krR| ||| <qRWx8|dD],\} } | |kr||| d| r||j| q|Wx(|dD]\} } | |kr| |||qWx(|dD]\} } | |kr| |||qWx,|dD] \} } | |kr | |||q W|S)Nrrprornrrs)r)rrr) rrrMrrrxr~rrrLrrrrrrrs2    rc Csd|j}|dkrdS|r |j|}||||j||kr`tdt|||||j||fdS)NzWInstance '%s' has version id '%s' which does not match database-loaded version id '%s'.)version_id_colrfZ_get_state_attr_by_columnrJZStaleDataErrorr )rarMrrrgrrrrrus   ruc s`|dk r|njdkr Sr.jfdd}t|fdd}|S)NcsTyj|}Wn tk r.td|Yn"X|kr.configure_subclass_mappercs,|}|dk r$|}|r$||S|S)Nr)rrr) instance_fnpolymorphic_instancesrerrpolymorphic_instanceDs z:_decorate_polymorphic_switch..polymorphic_instance)rerfr Z PopulateDict) rrrarr0rhrgrrr)rgrrrar0rrerrrs   rc@sPeZdZdZdZddZddZddZed d Z ed d Z ed dZ dS)rz:Track loaders and states for "post load" operations. )loadersr load_keyscCsi|_t|_d|_dS)N)rr OrderedDictrr)selfrrr__init__Vs zPostLoad.__init__cCs||j|<dS)N)r)rrM overwriterrrr}[szPostLoad.add_statecsv|js dStj|}xP|jD]B\}}}}fdd|jD}|r"|||||jf||q"W|jdS)Ncs&g|]\}}|jjr||fqSr)rzraZisa)rrMr)limit_to_mapperrrrhsz#PostLoad.invoke..) rrZ PathRegistryZcoercervaluesr*rclear)rrr0tokenrqargrirr)rrr+bs  zPostLoad.invokecCs$|j|j}|dk r |r ||_|S)N)r%rIr0r)clsrr0rQplrrrrps zPostLoad.for_contextcCs|j|jko||j|jjkS)N)r0r%r)rrr0rLrrr path_existsws zPostLoad.path_existsc OsD|j|jkr|j|j}nt}|j|j<|||||f|j|<dS)N)r0r%rr) rrr0rrZloader_callablerrirrrrr~s zPostLoad.callable_for_pathN) __name__ __module__ __qualname____doc__ __slots__rr}r+ classmethodrrrrrrrrOs  rc sB|j}|stdt|t|j}d}|r>|j}j rj s ||}|dk rt | td|d||d}|dkr$|r|j}n<fddjD}|j|rtdt||}t|rjrt|rtd t|dSt | |||d }|r>|dkr>t|dS) z4initiate a column-based attribute refresh operation.zQInstance %s is not bound to a Session; attribute refresh operation cannot proceedFN*)rQrOcsg|]}j|jqSr)Z_columntopropertyrL)rrU)rarrrsz*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).)rOrQ)r;rJZDetachedInstanceErrorr r_rLrZattrsrFZinheritsZconcreteZ_optimized_get_statementrTrZoptionsrZLoadZundeferZfrom_statementrXrsa_excZInvalidRequestErrorrr issubsetrrr Z warn_limitedrK) rarMZattribute_namesr;Zhas_keyrZ statementZ identity_keyZpk_attrsr)rarload_scalar_attributessR           r)T)NNN)NNNN)NNN)NNNN)%rZ __future__rrrrrJrrbaserr r r r rZsqlr]Zcounterr#r3Z dependenciesrGrNrTrSrkrrryrrurobjectrrrrrrsN            I 5  L / - 9"4: