B 4]J9@s dZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd l m Z d dlmZd d lmZd d lm Z ejejjd dGddde jZGdddejZGdddeZGdddee ZddZGdddeZdS)zDynamic collection API. Dynamic collections act like Query() objects for read operations and support basic add/delete mutation. ) attributes)exc) interfaces) object_mapper)object_session) properties) strategies)util)Query)logdynamic)Zlazyc@seZdZddZdS) DynaLoaderc Csld|_|jstd|jn$|jjtjtjfkrBt d|jt j |j|dt |jj|jj|jjddS)NTztOn relationship %s, 'dynamic' loaders cannot be used with many-to-one/one-to-one relationships and/or uselist=False.zOn relationship %s, 'dynamic' loaders cannot be used with many-to-one/one-to-one relationships and/or uselist=False. This warning will be an exception in a future release.)Z useobjectZ impl_class target_mapperorder_by query_class)Zis_class_levelZuselistrZInvalidRequestErrorZparent_property directionrZ ONETOMANYZ MANYTOMANYr warnrZ_register_attributeDynamicAttributeImplmapperrr)selfrrI/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/orm/dynamic.pyinit_class_attribute s&   zDynaLoader.init_class_attributeN)__name__ __module__ __qualname__rrrrrrsrcseZdZdZdZdZdZdZd&fdd Ze j fddZ de j fdd Z ejd d Zejd d Zd'ddZd(ddZddZde j dddfddZddZddZe j fddZe j fddZe j fddZe j fd d!Ze j fd"d#Ze j fd$d%ZZS))rTFNc  sTtt|j||||f|||_||_|s2t|_nt|krF||_n t ||_dS)N) superr__init__rr AppenderQueryr AppenderMixinmromixin_user_query) rZclass_keyZ typecallabledispatchrrrkw) __class__rrrEs  zDynamicAttributeImpl.__init__cCs*|tj@s||tjjS|||SdS)N)rSQL_OK_get_collection_historyPASSIVE_NO_INITIALIZE added_itemsr)rstatedict_passiverrrget\s  zDynamicAttributeImpl.getcCs.|tj@s|||jS|||}|jSdS)N)rr'r(r*added_plus_unchanged)rr+r,Z user_datar-historyrrrget_collectionds  z#DynamicAttributeImpl.get_collectioncCst|tjS)N)rEventZ OP_APPEND)rrrr _append_tokenqsz"DynamicAttributeImpl._append_tokencCst|tjS)N)rr2Z OP_REMOVE)rrrr _remove_tokenusz"DynamicAttributeImpl._remove_tokencCsh|dkr|||}||x"|jjD]}||||p:|j}q(W|jrd|dk rd|t||ddS)NT) _modified_event add_addedr$appendr3 trackparent sethasparentrinstance_state)rr+r,value initiatorcollection_historyfnrrrfire_append_eventys  z&DynamicAttributeImpl.fire_append_eventcCsh|dkr|||}|||jr@|dk r@|t||dx"|jjD]}||||p\|jqJWdS)NF) r5 add_removedr8r9rr:r$remover4)rr+r,r;r<r=r>rrrfire_remove_events  z&DynamicAttributeImpl.fire_remove_eventcCsD|j|jkrt|||j|j<|||tjd||j<|j|jS)NT)r#committed_stateCollectionHistoryr5rZ NEVER_SET)rr+r,rrrr5s   z$DynamicAttributeImpl._modified_eventc Cs|r|j|jkrdS|r$|dkr$dS|} t| } |jrHt|||} |||} |jsb| j} n | | j} tj} | | }| |  |}| |}x(| D] }||kr|j |||d| dqWx |D]}|j |||d| dqWdS)N)r=) Z parent_tokenlist has_identityr Z IdentitySetr.r5r*union intersection differencer?rB)rr+r,r;r<r-Z check_oldpopZ_adaptiterableZ new_valuesZold_collectionr=ZidsetZ constantsZ additionsZremovalsmemberrrrsets@        zDynamicAttributeImpl.setcOs tdS)N)NotImplementedError)rargskwargsrrrdeleteszDynamicAttributeImpl.deletecCs tddS)Nz7Dynamic attributes don't support collection population.)rN)rr+r,r;rrrset_committed_valuesz(DynamicAttributeImpl.set_committed_valuecCs|||}|S)N)r( as_history)rr+r,r-crrr get_historys z DynamicAttributeImpl.get_historycCs|||}dd|jDS)NcSsg|]}t||fqSr)rr:).0xrrr sz8DynamicAttributeImpl.get_all_pending..)r( all_items)rr+r,r-rTrrrget_all_pendings z$DynamicAttributeImpl.get_all_pendingcCsJ|j|jkr|j|j}n t||}|jrB|tj@rBt|||dS|SdS)N)apply_to)r#rCrDrFrZINIT_OK)rr+r-rTrrrr(s   z,DynamicAttributeImpl._get_collection_historycCs||k r|||||dS)N)r?)rr+r,r;r<r-rrrr7szDynamicAttributeImpl.appendcCs||k r|||||dS)N)rB)rr+r,r;r<r-rrrrAszDynamicAttributeImpl.removecCs|j|||||ddS)N)r-)rA)rr+r,r;r<r-rrrrJszDynamicAttributeImpl.pop)N)N)N)rrrZ uses_objectsZdefault_accepts_scalar_loaderZsupports_populationZ collectionr rrZ PASSIVE_OFFr.r)r1r Zmemoized_propertyr3r4r?rBr5rMrQrRrUrZr(r7rArJ __classcell__rr)r&rr>s6     - rcspeZdZdZfddZddZeeddZdd Zd d Zd d Z dddZ ddZ ddZ ddZ ZS)r Ncs~tt||jd||_}||_t|}|j|jj }|j dk rX|j j |j f|_ |j|dd|_|jjrz|jj|_dS)NF)Zalias_secondary)rr rrobjinstanceattrrZ_propsr#Z secondaryrZ selectable _from_objZ _with_parent _criterionr _order_by)rr_r+r^rZprop)r&rrr s zAppenderMixin.__init__cCsHt|j}|dk r0|jr0|jr0|j|kr0|t|js@dS|SdS)N)rr^ autoflushflushorm_utilrF)rsessrrrsessions   zAppenderMixin.sessioncCsdS)Nr)srWrrr-zAppenderMixin.cCs>|j}|dkr,t|jt|jtjjSt| |SdS)N) rgiterr_r(rr:r^r)r*_clone)rrfrrr__iter__/s  zAppenderMixin.__iter__cCs@|j}|dkr,|jt|jtj|S|| |SdS)N) rgr_r(rr:r^r)indexedrl __getitem__)rindexrfrrrro;s zAppenderMixin.__getitem__cCs>|j}|dkr,t|jt|jtjjS| | SdS)N) rglenr_r(rr:r^r)r*rlcount)rrfrrrrrEs  zAppenderMixin.countcCs~|j}|dkr:t|}|dkr:tdt||jjf|jrT|j|jj |d}n| |jj }|j |_ |j |_ |j |_ |S)NzParent instance %s is not bound to a Session, and no contextual session is established; lazy load operation of attribute '%s' cannot proceed)rg)r^rorm_excZDetachedInstanceErrorreZ instance_strr_r#rrqueryrar`rb)rrfr^rtrrrrlQszAppenderMixin._clonecCs4x.|D]&}|jt|jt|j|dqWdS)N)r_r7rr:r^ instance_dict)riteratoritemrrrextendks    zAppenderMixin.extendcCs&|jt|jt|j|ddS)N)r_r7rr:r^ru)rrwrrrr7ts   zAppenderMixin.appendcCs&|jt|jt|j|ddS)N)r_rArr:r^ru)rrwrrrrA|s   zAppenderMixin.remove)N)rrrrrrgpropertyrmrorrrlrxr7rAr\rr)r&rr s     r c@seZdZdZdS)rzBA dynamic query that supports basic collection storage operations.N)rrr__doc__rrrrrsrcCsd|j}t|t|fd|iS)zAReturn a new class with AppenderQuery functionality layered over.ZAppenderr)rtyper )clsnamerrrr"s r"c@sReZdZdZdddZeddZeddZd d Zd d Z d dZ ddZ dS)rDzDOverrides AttributeHistory to receive append/remove events directly.NcCs`|r8t||d}t||_|j|_|j|_d|_n$t|_t|_t|_d|_dS)NFT)rrcr ZOrderedIdentitySetunchanged_itemsr* deleted_items_reconcile_collection)rr_r+r[Zcollrrrrs    zCollectionHistory.__init__cCst|j|jS)N)rEr*rGr~)rrrrr/sz&CollectionHistory.added_plus_unchangedcCst|j|j|jS)N)rEr*rGr~r)rrrrrYszCollectionHistory.all_itemscCs`|jr0|j|j}|j|j}|j|}n|j|j|j}}}tt|t|t|S)N) rr*rIr~rrHrZHistoryrE)rZaddedZdeletedZ unchangedrrrrSszCollectionHistory.as_historycCst|j|S)N)rEr*)rrprrrrnszCollectionHistory.indexedcCs|j|dS)N)r*add)rr;rrrr6szCollectionHistory.add_addedcCs(||jkr|j|n |j|dS)N)r*rArr)rr;rrrr@s zCollectionHistory.add_removed)N) rrrrzrryr/rYrSrnr6r@rrrrrDs   rDN)rzrrrsrrrrrr rertr r Z class_loggerZRelationshipPropertyZ strategy_forZAbstractRelationshipLoaderrZ AttributeImplrobjectr rr"rDrrrr s*             I