U a?@s&dZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd l m Z d dlmZd d lmZd d lm Z d d lmZejejjddGddde jZGdddejZGdddeZGdddeZGdddee 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) relationships) strategies)util)Query)log)resultdynamic)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)selfrrWC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-nyjtotrf\sqlalchemy\orm\dynamic.pyinit_class_attribute!s2zDynaLoader.init_class_attributeN)__name__ __module__ __qualname__rrrrrrsrcseZdZdZdZdZdZdZdZd'fdd Z e j fddZ de j fd d Zejd d Zejd dZd(ddZd)ddZddZde j dddfddZddZddZe j fddZe j fddZe j fdd Ze j fd!d"Ze j fd#d$Ze j fd%d&ZZS)*rTFrNc  s\tt|j||||f|||_|r.t||_|s:t|_nt| krN||_n t ||_dSN) superr__init__rtupler AppenderQueryr AppenderMixinmromixin_user_query) rclass_keyZ typecallabledispatchrrrkw __class__rrr Gs   zDynamicAttributeImpl.__init__cCs*|tj@s||tjjS|||SdSr)rSQL_OK_get_collection_historyPASSIVE_NO_INITIALIZE added_itemsr)rstatedict_passiverrrget_s  zDynamicAttributeImpl.getcCs4|tj@s|||j}n|||}|j}t|Sr)rr,r-r/added_plus_unchangedDynamicCollectionAdapter)rr0r1 user_datar2datahistoryrrrget_collectiongs   z#DynamicAttributeImpl.get_collectioncCst|tjSr)rEventZ OP_APPENDrrrr _append_tokenusz"DynamicAttributeImpl._append_tokencCst|tjSr)rr:Z OP_REMOVEr;rrr _remove_tokenysz"DynamicAttributeImpl._remove_tokencCsd|dkr|||}|||jjD]}||||p8|j}q&|jr`|dk r`|t||ddSNT) _modified_event add_addedr(appendr< trackparent sethasparentrinstance_staterr0r1value initiatorcollection_historyfnrrrfire_append_event}s   z&DynamicAttributeImpl.fire_append_eventcCsd|dkr|||}|||jr@|dk r@|t||d|jjD]}||||pZ|jqHdS)NF) r? add_removedrBrCrrDr(remover=rErrrfire_remove_events   z&DynamicAttributeImpl.fire_remove_eventcCsD|j|jkrt|||j|j<|||tjd||j<|j|jSr>)r'committed_stateCollectionHistoryr?rZ NEVER_SET)rr0r1rrrr?s   z$DynamicAttributeImpl._modified_eventc Cs|r|j|jkrdS|r$|dkr$dS|} t| } |jrHt|||} |||} |jsb| j} n | | j} tj} | | }| |  |}| |}| D] }||kr|j |||d| dq|D]}|j |||d| dqdS)N)rH) Z parent_tokenlist has_identityr Z IdentitySetr3r?r/union intersection differencerJrM)rr0r1rFrGr2Z check_oldpopZ_adaptiterableZ new_valuesZold_collectionrHZidset constantsZ additionsZremovalsmemberrrrsetsF     zDynamicAttributeImpl.setcOs tdSrNotImplementedError)rargskwargsrrrdeleteszDynamicAttributeImpl.deletecCs tddS)Nz7Dynamic attributes don't support collection population.rZ)rr0r1rFrrrset_committed_valuesz(DynamicAttributeImpl.set_committed_valuecCs|||}|Sr)r- as_historyrr0r1r2crrr get_historys z DynamicAttributeImpl.get_historycCs|||}dd|jDS)NcSsg|]}t||fqSr)rrD).0xrrr sz8DynamicAttributeImpl.get_all_pending..)r- all_itemsrarrrget_all_pendings z$DynamicAttributeImpl.get_all_pendingcCsJ|j|jkr|j|j}n t||}|jrB|tj@rBt|||dS|SdS)N)apply_to)r'rNrOrQrZINIT_OK)rr0r2rbrrrr-s   z,DynamicAttributeImpl._get_collection_historycCs||k r|||||dSr)rJrr0r1rFrGr2rrrrAszDynamicAttributeImpl.appendcCs||k r|||||dSr)rMrjrrrrLszDynamicAttributeImpl.removecCs|j|||||ddS)N)r2)rLrjrrrrUszDynamicAttributeImpl.pop)N)N)N) rrrZ uses_objectsZdefault_accepts_scalar_loaderZsupports_populationZ collectionrrr rZ PASSIVE_OFFr3r.r9r Zmemoized_propertyr<r=rJrMr?rYr^r_rcrhr-rArLrU __classcell__rrr*rr?sN        6    rc@s<eZdZdZddZddZddZdd Zd d ZeZ d S) r5z9simplified CollectionAdapter for internal API consistencycCs ||_dSr)r7)rr7rrrr sz!DynamicCollectionAdapter.__init__cCs t|jSr)iterr7r;rrr__iter__sz!DynamicCollectionAdapter.__iter__cCsdSrrr;rrr _reset_emptysz%DynamicCollectionAdapter._reset_emptycCs t|jSr)lenr7r;rrr__len__sz DynamicCollectionAdapter.__len__cCsdSr>rr;rrr__bool__sz!DynamicCollectionAdapter.__bool__N) rrr__doc__r rmrnrprq __nonzero__rrrrr5 sr5cspeZdZdZfddZddZeeddZdd Zd d Zd d Z dddZ ddZ ddZ ddZ ZS)r#Ncstt||jd||_}||_t|}|j|jj }|j dk rX|j j |j f|_ |j|ddf|_|jjr||jj|_dS)NF)Zalias_secondary)rr#r robjinstanceattrrZ_propsr'Z secondaryrZ selectable _from_objZ _with_parent_where_criteriar_order_by_clauses)rrvr0rurpropr*rrr "s  zAppenderMixin.__init__cCsHt|j}|dk r0|jr0|jr0|j|kr0|t|js@dS|SdSr)rru autoflushflushorm_utilrQrsessrrrsession:s  zAppenderMixin.sessioncCsdSrr)srerrrHzAppenderMixin.cCs~|j}|dkrlt|j}|jr4tdt|t j t |j j jg|j t|jtjjddS||SdS)NzInstance %s is detached, dynamic relationship cannot return a correct result. This warning will become a DetachedInstanceError in a future release.T)Z_source_supports_scalars)rrrDruZdetachedr rr}Z state_strr ZIteratorResultZSimpleResultMetaDatarvr&rr-r.r/Zscalars _generate_iter)rrr0rrrrJs$   zAppenderMixin._itercCs@|j}|dkr,|jt|jtj|S|| |SdSr) rrvr-rrDrur.indexedr __getitem__)rindexrrrrras zAppenderMixin.__getitem__cCs>|j}|dkr,t|jt|jtjjS| | SdSr) rrorvr-rrDrur.r/rcountr~rrrrks 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)r)rurorm_excZDetachedInstanceErrorr}Z instance_strrvr'rrqueryrxrwry)rrrurrrrrws zAppenderMixin._generatecCs0|D]&}|jt|jt|j|dqdSrrvrArrDru instance_dict)riteratoritemrrrextends  zAppenderMixin.extendcCs&|jt|jt|j|ddSrrrrrrrrAs   zAppenderMixin.appendcCs&|jt|jt|j|ddSr)rvrLrrDrurrrrrrLs   zAppenderMixin.remove)N)rrrrr rpropertyrrrrrrArLrkrrr*rr#s    r#c@seZdZdZdS)r"zBA dynamic query that supports basic collection storage operations.N)rrrrrrrrrr"sr"cCsd|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)rOzDOverrides AttributeHistory to receive append/remove events directly.NcCs`|r8t||d}t||_|j|_|j|_d|_n$t|_t|_t|_d|_dS)NFT)r"r{r ZOrderedIdentitySetunchanged_itemsr/ deleted_items_reconcile_collection)rrvr0riZcollrrrr s    zCollectionHistory.__init__cCst|j|jSr)rPr/rRrr;rrrr4sz&CollectionHistory.added_plus_unchangedcCst|j|j|jSr)rPr/rRrrr;rrrrgs zCollectionHistory.all_itemscCs`|jr0|j|j}|j|j}|j|}n|j|j|j}}}tt|t|t|Sr) rr/rTrrrSrZHistoryrP)raddedZdeletedZ unchangedrrrr`s zCollectionHistory.as_historycCst|j|Sr)rPr/)rrrrrrszCollectionHistory.indexedcCs|j|dSr)r/addrrFrrrr@szCollectionHistory.add_addedcCs(||jkr|j|n |j|dSr)r/rLrrrrrrrKs zCollectionHistory.add_removed)N) rrrrrr rr4rgr`rr@rKrrrrrOs    rON)rrrrrrrrrrr r}rr r Zenginer Z class_loggerZRelationshipPropertyZ strategy_forZAbstractRelationshipLoaderrZ AttributeImplrobjectr5r#r"r%rOrrrrs0              L