o znh@sdZddlmZddlmZddlZddlmZddlmZddlmZ dd lm Z dd lm Z dd l m Z dd l mZd dlmZd dlmZd dlmZd dlmZd dlmZddZddZdTddZddZddZddZdd Zd!d"Z   dUd#d$Z dTd%d&Zd'd(Zd)d*Z +dVd,d-Z! +dVd.d/Z"d0d1Z#d2d3Z$d4d5Z%d6d7Z&d8d9Z'd:d;Z(dd?Z*d@dAZ+GdBdCdCe,Z-GdDdEdEe-Z.GdFdGdGe-Z/GdHdIdIe-Z0GdJdKdKe-Z1GdLdMdMe.e0Z2GdNdOdOe.e1Z3GdPdQdQe/e0Z4GdRdSdSe/e1Z5dS)Wzprivate module containing functions used to emit INSERT, UPDATE and DELETE statements on behalf of a :class:`.Mapper` and its descending mappers. The functions here are called only by the unit of work functions in unitofwork.py. )chain)groupbyN) attributes) evaluator)exc)loading)sync)_entity_descriptor) state_str)sql)util) expression) _from_objectsc s"j}t|}|jjrtd|r*|r"dd|D}dd|D}n dd|D}nt|}|||jD].\} }  | sBq8fddt | fdd|Dd ||d D} t |d|| | | |d q8|r|rj } d dj D} |D]\}| tfd d| Df|_qxdSdSdS)NzJconnection_callable / per-instance sharding not supported in bulk_insert()cSsg|]}||jfqSdict.0staterrE/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/persistence.py 7z _bulk_insert..cSsg|]\}}|qSrr)rrdict_rrrr8cSg|]}|jqSrrrrrrr:c 3s4|]\}}}}}}}}d|||||fVqdSNr) rr state_dictparamsmpconn value_params has_all_pkshas_all_defaults connectionmapperrr Cs*  z_bulk_insert..c3s|] }d|fVqdSrrrmappingr&rrr)YsT)bulkreturn_defaults render_nulls bookkeepingcSrrkeyrprrrrkrcsg|]}|qSrr)rr2)rrrror) base_mapper_cached_connection_dictsessionconnection_callableNotImplementedErrorlistr'_sorted_tablesitemsisa_collect_insert_commands_emit_insert_statements_identity_class_identity_key_propstupler2)r(mappingssession_transactionisstatesr-r.r5cached_connectionsstatestable super_mapperrecords identity_clsidentity_propsrr)r'rr(r _bulk_insert#sV     rMc sj}t|}jjrjjhfdd|r2|r*fdd|D}n dd|D}nt|}|jjr>t d| ||j D]%\}} |sRqHtd|fdd|Dd d } t|d|||| d d qHdS) NcstfddjDS)Nc3s.|]\}}|jvs|vr||fVqdSr)committed_staterkv) search_keysrrrr)sz6_bulk_update.._changed_dict..)rr<)r(r)rRrr _changed_dict~sz#_bulk_update.._changed_dictcsg|]}|qSrrr)rTr(rrrrz _bulk_update..cSrrrrrrrrrzJconnection_callable / per-instance sharding not supported in bulk_update()c3s0|]}d|jr|jjndfVqdSr)_version_id_propr2r*r&rrr)s  z_bulk_update..T)r,Fr/)r5r6_primary_key_propkeysrUr2unionr:r7r8r9r'r;r<r=_collect_update_commands_emit_update_statements) r(rCrDrEupdate_changed_onlyr5rFrHrIrJr)rTr'r(rRr _bulk_updatessJ     r[FcCs|s|jst||D] }t||g|ddq dSg}g}t|}t|||D]!\}}} } } } } | s3| r>|||| | | fq&|||| | fq&|jD]'\}} || jvrWqMt ||}t |||}t |||| ||t |||| ||qMt ||tdd|Ddd|DdS)a;Issue ``INSERT`` and/or ``UPDATE`` statements for a list of objects. This is called within the context of a UOWTransaction during a flush operation, given a list of states to be flushed. The base mapper in an inheritance hierarchy handles the inserts/ updates for all descendant mappers. T)singleNcss&|]\}}}}||||dfVqdS)FNr)rrrr(r'rrrr)s   zsave_obj..css(|]\}}}}}||||dfVqdS)TNr)rrrr(r'update_version_idrrrr)s )batch _sort_statessave_objr6_organize_states_for_saveappendr;r< _pks_by_tabler>rXrYr? _finalize_insert_update_commandsr)r5rGuowtransactionr\rstates_to_updatestates_to_insertrFrr(r' has_identity row_switchr]rHinsertupdaterrrr`sp       r`csrt|}tt|||}|jD]%\jvrqfdd|D}t||||}t||||qdS)z\Issue UPDATE statements on behalf of a relationship() which specifies post_update. c 3sJ|] \}}}}|jvr||||jdur||jndfVqdSr)rcversion_id_col#_get_committed_state_attr_by_column)rrr sub_mapperr'r(rHrrr)s    zpost_update..N)r6r: _organize_states_for_post_updater;r<rc_collect_post_update_commands_emit_post_update_statements)r5rGrepost_update_colsrFrfrkrror post_updates,     rtc Cst|}tt|||}|j}tt|D]#}||}||jvr#q|jr*|jr*qt ||||}t ||||||q|D]\} } }} } |j || | q=dS)zIssue ``DELETE`` statements for a list of objects. This is called within the context of a UOWTransaction during a flush operation. N) r6r:_organize_states_for_deleter;reversedkeysrcinheritspassive_deletes_collect_delete_commands_emit_delete_statementsdispatch after_delete) r5rGrerFstates_to_deletetable_to_mapperrHr(deleterrr'r]rrr delete_obj;s>   rc cs@t|||D]\}}}}t|j}|jp||}d} } |s)|j|||n|j||||jr;|||||sy||jj vry|jj |} t | } | | sy| | sftdt||t| f|d|t|t| || | } |s}| r|jdur|| r| n|| r| jn||j} |||||| | fVqdS)aTMake an initial pass across a set of states for INSERT or UPDATE. This includes splitting out into distinct lists for each, calling before_insert/before_update, obtaining key information for each state including its dictionary, mapper, the connection to use for the execution per state, and the identity flag. NzJNew instance %s with identity key %s conflicts with persistent instance %szPdetected row switch for identity %s. will update %s, remove %s from transaction)_connections_for_statesboolr2_identity_key_from_stater| before_insert before_update_validate_polymorphic_identityr7 identity_maprinstance_statewas_already_deleted is_deletedorm_exc FlushErrorr _log_debugremove_state_actionsrlrmr) r5rGrerrr(r'rh instance_keyrir]instanceexistingrrrrais^          racCs t|||S)zMake an initial pass across a set of states for UPDATE corresponding to post_update. This includes obtaining key information for each state including its dictionary, mapper, the connection to use for the execution per state. )r)r5rGrerrrrps rpccs`t|||D]&\}}}}|j||||jdur#||||j}nd}|||||fVqdS)zMake an initial pass across a set of states for DELETE. This includes calling out before_delete and obtaining key information for each state including its dictionary, mapper, the connection to use for the execution per state. N)rr| before_deleterlrm)r5rGrerrr(r'r]rrrrus ruc csx|D]\}}}}||jvrqi} i} |j|} |j|} t| |D]5} || }| | }|dur9|| vr9|s9q$|s@t|dsFt|tjrTt|drO| n|| |<q$|| |j <q$|ss|j | |  dd| DD]}d| |<ql|rw|r|j || }|jjr|j|| }nd}nd}}|jdur|jdur|j|j|vr|d| |jj <||| ||| ||fVqdS)zSIdentify sets of values to use in INSERT statements for a list of states. N__clause_element__cSrrr1rcrrrrrz,_collect_insert_commands..TF)rc_propkey_to_col_insert_cols_evaluating_noneset intersectionhasattr isinstancer ClauseElementrr2_insert_cols_as_none difference_pk_keys_by_tableissubsetr5eager_defaults_server_default_colsversion_id_generatorrl_cols_by_table)rHrgr,r-r.rrr(r'r r#propkey_to_col eval_nonepropkeyvaluecolcolkeyr$r%rrrr>sl           r>c #sH|D]\}}}}||jvrq|j|}i} |j||r9tfddt|j|D} d} nQi} t|jD]7} | } | }t| dsXt | t j rft| dra| n| | |<qC|j | j| |j| durz| | |j<qC|jjr|j|| } nd} |dur|j|j|vr|s| s| s|jD]}|j |jj|tj}|jrnqq|j}| o| }|| |j<|s|j| vr|jdur||}|| |j<n|jdur|r|| |j<n| s| sqd}d}|r tfddt|j|D}nfi}|D]a}|j|j} |j | j|tj}|jrU|j r3d||f|jvrEd}|jd ||j<| !|jdn|j d ||j<|| vrTd}n|j"d ||j<||jdurnt#$d ||fq| sv| r| %||| ||| | |fVq|r|j&|D]\}}t'(|||||||j)qqdS) atIdentify sets of values to use in UPDATE statements for a list of states. This function works intricately with the history system to determine exactly what values should be updated as well as how the row should be matched within an UPDATE statement. Includes some tricky scenarios where the primary key of an object might have been changed. c3s"|] }|j|fVqdSrr1rrrrrrr)Ys  z+_collect_update_commands..TrNFc3s$|] }|j|fVqdSr)_labelgetrrrrr)s  pk_cascadedrzCCan't update table %s using NULL for primary key value on column %s)*rcrrrrr_pk_attr_keys_by_tablerNrrr rrmanagerimplis_equalr2r5r_server_onupdate_default_colsrrlr_columntopropertyvalues get_historyrPASSIVE_NO_INITIALIZEaddedrr PASSIVE_OFFdeletedpop unchangedrrrk_table_to_equatedr populatepassive_updates)rerHrfr,rr(r'r]pksr#r r%rrrprophistory no_paramsvalr$expect_pk_cascaded pk_paramsm equated_pairsrrrrX7s                        rXccs"|D]\}}}}} |j|} i} d} |j|D]>} | | vr,|j||| tjd| | j<q| |vs5| jdurV|j| }|j|j j ||tj }|j rV|j d}|| | j <d} q| r| dur|j|j|vr|j} | | | j<t|j r| j | vr|jdur|| }|| | j <||||| fVqdS)zrIdentify sets of values to use in UPDATE statements for a list of states within a post_update operation. F)passiveNrT)rcr_get_state_attr_by_columnrrronupdaterrr2rrrrrlrr)r5rerHrfrsrrr(r'r]rr hasdatarrrrrrrrrqsP          rqc cs|D]G\}}}}}||jvrqi} |j|D]} |||| | | j<} | dur2td|| fq|durE|j|j|vrE|| |jj<| |fVqdS)zSIdentify values to use in DELETE statements for a list of states to be deleted.NzHCan't delete from table %s using NULL for primary key value on column %s)rcrmr2rrrlr) r5rerHr~rrr(r'r]r rrrrrrz(s>    rzTc stjduo jjvfdd}|df|}t|ddD]\\} } } } } }d}t|}|}d}| sA|}d }n|rP| sPjjrP|}d }n jdur]|j}d }|sc| jj n| jj }|ol| jj }| oq }| r|D],\}}}} }} } | | ||}|rt|||||jjd|d ||j7}|}qvno|s|}|D])\}}}} }} } ||  ||}|rt|||||jjd|d ||j7}qn>d d |D}|p|ot|d k}||  ||}||j7}|D]\}}}} }} } |rt|||||jjd|d q|r+|t|kr*td jt||fq$r7td|jjq$dS)z`Emit UPDATE statements corresponding to value lists collected by _collect_update_commands().Ncslt}jD]}|j|tj|j|jdkq r/|jjtjjjjjdk |}|SN)type_) r and_rcclausesrb bindparamrtyperlrkclauserstmtr(needs_version_idrHrr update_stmt`s  z,_emit_update_statements..update_stmtrkcS*|dt|dt|d|d|dfSNr rrrecrrr{   z)_emit_update_statements..rFTcSg|]}|dqSr rrrrrrrrz+_emit_update_statements..rMUPDATE statement on table '%s' expected to update %d row(s); %d were matched.MDialect %s does not support updated rowcount - versioning cannot be verified.)rlr_memorr:r-r5rdialectsupports_sane_rowcount supports_sane_rowcount_returningsupports_sane_multi_rowcountexecuter _postfetchcontextcompiled_parametersrowcountlenrStaleDataError descriptionrwarndialect_description)r5rerFr(rHrkr0r cached_stmtr' paramkeyshasvaluer%r$rJrows statementr-assert_singlerowassert_multirowallow_multirowrrr r#rcheck_rowcount multiparamsrrrrYOs                 rYc Cs|d|f|j}t|ddD]\\}} } } } } |}|r*| s&|jr&|jjsi| ri| sit| } dd| D}||||}|rht| |j j D]!\\}}}}}}} } }|rat ||||||||d qFt |||qFq| ss|jrs| }n |jdur~| |j}| D]h\}}}}}}} } |r||||}n||||}|j j}|durt||j|D]\}}|j|}|dur||vs||jdur|||j<q|r|rt |||||||j j d|d qt |||qqdS) z`Emit INSERT statements corresponding to value lists collected by _collect_insert_commands().rjcSrrrrrrrr#rz)_emit_insert_statements..cSrrrrrrrr:rz+_emit_insert_statements..FNr)rrjrrrimplicit_returningr:rziprrr_postfetch_bulk_saver-rlrinserted_primary_keyrcrrr2)r5rerFr(rHrjr0rr'pkeysrr$r%rJrrrrrr mapper_recr"r#last_inserted_paramsresult primary_keypkrrrrrr?s                 r?c sjduo jjvfdd}|df|}t|ddD]\}} d} t| } |d} jdur;| jjn| jj} | oD| jj}  pI| }|st| }| D]"\}}}} }||  ||}t ||||||j j d| |j 7} qPn6dd | D}| p| ot|d k}||  ||}| |j 7} | D]\}}}} }t ||||||j j dq|r| t| krtd jt| | fq$rtd |jjq$dS) zeEmit UPDATE statements corresponding to value lists collected by _collect_post_update_commands().Ncst}jD]}|j|tj|j|jdkq r/|jjtjjjjjdk |}jdur?| j}|Sr) r rrcrrbrrrrlrkr-rrrrrs$   z1_emit_post_update_statements..update_stmtrtcSs|dt|dfS)Nr)rrrrrrrz._emit_post_update_statements..rcSsg|] \}}}}}|qSrr)rrrr r"r rrrrs z0_emit_post_update_statements..rrr)rlrrrr:rrrrr_postfetch_post_updaterrrrrrrrrr)r5rerFr(rHrkrrr2rJrr'rrrrrrr r rrrrrrrs          rrcsLjduo jjvfdd}|df|}t|ddD]\}} dd| D} ||}t| } d } d } rh|jjsh|jjrXd } | D] }|||}| |j 7} qInt d |jj ||| n ||| }srd } |j } |j r| d kr| | kr|jjst| dkr| rt dj| | fq$tdj| | fq$dS)z`Emit DELETE statements corresponding to value lists collected by _collect_delete_commands().Ncsht}jD]}|j|tj|j|jdkq r/|jjtjjjjjdk |Sr) r rrcrrbrr2rrlr)rrr(need_version_idrHrr delete_stmts  z,_emit_delete_statements..delete_stmtrcSs|dS)Nrrrrrrr!sz)_emit_delete_statements..cSsg|]\}}|qSrr)rr r'rrrr"rz+_emit_delete_statements..FrzMDialect %s does not support deleted rowcount - versioning cannot be verified.TrzDELETE statement on table '%s' expected to delete %d row(s); %d were matched. Please set confirm_deleted_rows=False within the mapper configuration to prevent this warning.)rlrrrrrrrrrrrrconfirm_deleted_rowsrrr)r5rerFr(rHrrrr'recs del_objectsexpected rows_matched only_warnr rrrrr{sf       r{c s|D]\}}}}|jr"fdd|jD}|r"j|g}|jr1|j|j|j durJ|j durJ|j j j vrJ||j j g|r`|_ tj|j|j |d|sk|j||n|j|||j dur|j dur||j j durtdqdS)zzfinalize state on states that have been inserted or updated, including calling after_insert/after_update events. csBg|]}|jr|jr|jjvs|js|js|jjvr|jqSr)expire_on_flushdeferredr2rr3rSrrrjs   z4_finalize_insert_update_commands..NF) refresh_stateonly_load_propsz2Instance does not contain a non-NULL version value)_readonly_propsunmodified_intersection_expire_attributesrrextend_unloaded_non_objectr&_server_default_plus_onupdate_propkeysrlrrUr2unloadedrr load_on_identr7queryr| after_insert after_updaterr) r5rerGrr(r'rhreadonly toload_nowrrSrrdasN       rdc s||rdS|jjj}|jjj}jdur&jj|vr&t|jg}tj j j } | r1g} |D]"} | j |vrU| j vrU|| j |j | j <| rU| j | j q3| rc| rcj j ||| |ru||jfdd|DdSdS)Nc"g|] }|jvrj|jqSrrr2rr(rrr   z*_postfetch_post_update..)rrcompiledprefetch postfetchrlrr:r class_managerr| refresh_flushr2rrbr r) r(rerHrrr r prefetch_colspostfetch_colsr3load_evt_attrsrrr-rrs8     rc  s|jjj} |jjj} |jjjjdur$jj|vr$t| jg} tj j j } | r/g} r]|jj } | dur]D]!}|j rE|jjrEq;j|}|r\| |||j<| r\| |jq;| D]"}|j|vr|jvr||j|j|j<| r| j|jq_| r| rj j ||| |r|r| fdd|D| r||jfdd| Dj|D]\}}t||||||jqdS)zExpire attributes in need of newly persisted database state, after an INSERT or UPDATE statement has proceeded for that state.Ncsg|] }|jr |vr|qSr)r )rr)returning_colsrrrsz_postfetch..cr+rr,rr-rrrr.)rr/r0r1 returningrlrr:rr2r|r3returned_defaultsr isinsertrrr2rbr!r rrr rr)r(rerHrrr r r#isupdater4r5r3r6rowrrrrrr)r(r7rrsn         rcCs&|j|D] \}}t|||qdSr)rr bulk_populate_inherit_keys)r(rrHrrrrrr0srccsb|jjr |jj}n|j|}d}t||D]}|r"|||}|jj}||j||fVqdS)zReturn an iterator of (state, state.dict, mapper, connection). The states are sorted according to _sort_states, then paired with the connection they should be using for the given unit of work transaction. N) r7r8 transactionr'r_objrr(r)r5rerGr8r'rr(rrrr5s  rcstfddS)Ncs|jjdS)N)compiled_cache)execution_options_compiled_cache)r"r5rrrRsz)_cached_connection_dict..)r PopulateDictrCrrCrr6Os r6c Cstt|}tdd|D}||z t||jd}Wnty.}ztd|d}~wwt|tdd|S)Ncss|] }|jdur|VqdSrr1)rsrrrr)Zsz_sort_states..r1z^Could not sort objects by primary key; primary key values must be sortable in Python (was: %s) insert_order) rdifference_updatesorted_persistent_sortkey_fn TypeErrorsa_excInvalidRequestErroroperator attrgetter)r(rGpending persistentpersistent_sortederrrrrr_Xs&  r_c@sreZdZdZddZddZeddZedd Z d d Z d d Z ddZ e dddZddZddZdS)BulkUDz5Handle bulk update and deletes via a :class:`.Query`.cCs$|d|_|j|_|dS)NF)enable_eagerloadsr& _bind_mapperr(_validate_query_stateselfr&rrr__init__os   zBulkUD.__init__c Csdddtjfdddtjfdddtjfdd dtjfd d dtjfd d dtjffD]\}}}}|t|j||s=td|fq&dS)N_limitzlimit()_offsetzoffset() _order_byz order_by()F _group_byz group_by() _distinctz distinct() _from_objz2join(), outerjoin(), select_from(), or from_self()rzCCan't call Query.update() or Query.delete() when %s has been called)rMis_eqgetattrr&rKrL)rXattrmethnamenotsetoprrrrVts&      zBulkUD._validate_query_statecCs|jjSr)r&r7rXrrrr7szBulkUD.sessionc GsDz ||}W||Sty!tddtdd|Dw)Nz3Valid strategies for session synchronization are %sz, css|]}t|VqdSr)repr)rxrrrr)z"BulkUD._factory..)KeyErrorrK ArgumentErrorjoinrH)clslookupsynchronize_sessionargklassrrr_factorys  zBulkUD._factorycCs4||||||dSr)_do_before_compile_do_pre_do_pre_synchronize_do_exec_do_post_synchronize_do_postrgrrrexec_s  z BulkUD.exec_cCs |j||j|_|jj|_dSr)r& _execute_crudr(r r)rXrrrr _execute_stmtszBulkUD._execute_stmtcCstr)r9rgrrrrtszBulkUD._do_before_compilezsqlalchemy.orm.querycCs|j}|||_t|jd|jr@t}|jD]}t||js&|n |t |j qt |dkr:t d||_n|djj|_|j}|jrT|dSdS)NrrzLThis operation requires only one Table or entity be specified as the target.)r& QueryContextrr _entities _ColumnEntityrclearrkrcolumnrrKrLr primary_table_only_entity_zeror( local_tabler7 _autoflush)rXquerylibr&tablesentr7rrrrus.      zBulkUD._do_precCdSrrrgrrrrvzBulkUD._do_pre_synchronizecCrrrrgrrrrxrzBulkUD._do_post_synchronizeN)__name__ __module__ __qualname____doc__rYrVpropertyr7 classmethodrsrzr|rtr dependenciesrurvrxrrrrrSls    " rSc@ eZdZdZddZddZdS) BulkEvaluatezDBulkUD which does the 'evaluate' method of session state resolution.cCrrr)rXevaluator_compilerrrr_additional_evaluatorsrz#BulkEvaluate._additional_evaluatorsc s|j}|jzt}|jdur||jndd||Wntjy8}zt d|d}~wwfdd|j j D|_dS)NcSsdS)NTr)r?rrreval_conditionrz8BulkEvaluate._do_pre_synchronize..eval_conditionztCould not evaluate current criteria in Python: "%s". Specify 'fetch' or False for the synchronize_session parameter.cs,g|]\\}}}}t|r|r|qSr) issubclass)rrnr identity_tokenr?r target_clsrrrsz4BulkEvaluate._do_pre_synchronize..)r& _mapper_zeroclass_rEvaluatorCompiler whereclauseprocessrUnevaluatableErrorrKrLr7rr<matched_objects)rXr&rrRrrrrvs&      z BulkEvaluate._do_pre_synchronizeN)rrrrrrvrrrrrs rc@eZdZdZddZdS) BulkFetchzABulkUD which does the 'fetch' method of session state resolution.cCsB|j}|j}|}|j|jj}|j||j|j d |_ dS)N)r(r ) r&r7_compile_contextrwith_only_columnsrr rr(_paramsfetchall matched_rows)rXr&r7r select_stmtrrrrvs zBulkFetch._do_pre_synchronizeN)rrrrrvrrrrrs rcs\eZdZdZfddZeddZddZedd Z ed d Z d d Z ddZ Z S) BulkUpdatezBulkUD which handles UPDATEs.cs tt||||_||_dSr)superrrYr update_kwargs)rXr&rr __class__rrrY s zBulkUpdate.__init__cCsttttd||||SN)evaluatefetchF)rSrsBulkUpdateEvaluateBulkUpdateFetchr)rnr&rprrrrrfactoryszBulkUpdate.factorycC<|jjjr|jjjD]}||j|}|dur||_q dSdSr)r&r|before_compile_updaterXfn new_queryrrrrt  zBulkUpdate._do_before_compilecCsg}t|jdr |jn|jD]:\}}|jrCt|tjr,t|j|}|| |qt|t j r;|| |q| ||fq| ||fq|S)Nr<) rrr<r(rr string_typesr r!_bulk_update_tuplesrQueryableAttributerb)rXrrPrQdescrrr_resolved_values%s      zBulkUpdate._resolved_valuesc Csg}|jD]G\}}t|tjr||j|fqt|dr!|}|jrFt|t j rFz|jj |}Wn t j y<Yqw||j|fqtd||S)NrzInvalid expression type: %r)rrrrrbr2rrr(r ColumnElementrrUnmappedColumnErrorrKrL)rXrrPrQrcrrr"_resolved_values_keys_as_propnames9s$  z-BulkUpdate._resolved_values_keys_as_propnamescCsH|j}|jddst|}tj|j|jj|fi|j}| |dS)Npreserve_parameter_orderF) rrrrr rkrrrr|)rXrrrrrrwPszBulkUpdate._do_execcC|jj}|j|dSr)r&r7r|after_bulk_updaterXr7rrrry_zBulkUpdate._do_post)rrrrrYrrrtrrrrwry __classcell__rrrrrs     rcsDeZdZdZfddZeddZddZdd Zd d Z Z S) BulkDeletezBulkUD which handles DELETEs.cstt||dSr)rrrYrWrrrrYgszBulkDelete.__init__cCsttttd||Sr)rSrsBulkDeleteEvaluateBulkDeleteFetchr)rnr&rprrrrjszBulkDelete.factorycCrr)r&r|before_compile_deleterrrrrtvrzBulkDelete._do_before_compilecCs t|j|jj}||dSr)r rrrrr|)rXrrrrrw}szBulkDelete._do_execcCrr)r&r7r|after_bulk_deleterrrrryrzBulkDelete._do_post) rrrrrYrrrtrwryrrrrrrds   rc@r)rzSBulkUD which handles UPDATEs using the "evaluate" method of session resolution.cCs4i|_|j}|D]\}}|t||j|<qdSr)value_evaluatorsrrr_literal_as_binds)rXrrr2rrrrrs  z)BulkUpdateEvaluate._additional_evaluatorsc Cs|jj}t}t|j}|jD]B}t|t |}}|j |}|D] }|j||||<q&|j j |d|||t|||t||||q||dSr)r&r7rr:rrwrrr instance_dict unmodifiedrrr|refresh_commitr radd_register_altered) rXr7rGevaluated_keysr?rr to_evaluater2rrrrxs"   z'BulkUpdateEvaluate._do_post_synchronizeN)rrrrrrxrrrrrs rc@r)rzSBulkUD which handles DELETEs using the "evaluate" method of session resolution.cCs|jjdd|jDdS)NcSsg|]}t|qSr)rr)rr?rrrrrz;BulkDeleteEvaluate._do_post_synchronize..)r&r7_remove_newly_deletedrrgrrrrxsz'BulkDeleteEvaluate._do_post_synchronizeNrrrrrxrrrrr rc@r)rzPBulkUD which handles UPDATEs using the "fetch" method of session resolution.cs|jj|jtfddfdd|jDD}|j}tdd|D}|D]}||j}|r:||q* |dS)Ncs&g|]}|jvrtj|qSr)rrr)r identity_key)r7rrrs  z8BulkUpdateFetch._do_post_synchronize..csg|] }t|qSr)identity_key_from_primary_keyr:)rr ) target_mapperrrrs css|]\}}|VqdSrrrOrrrr)rjz7BulkUpdateFetch._do_post_synchronize..) r&r7rrrrrr _expire_stater)rXrGrattribr to_expirer)r7rrrxs"      z$BulkUpdateFetch._do_post_synchronizeNrrrrrrrrc@r)rzPBulkUD which handles DELETEs using the "fetch" method of session resolution.cCsR|jj}|j}|jD]}|t|}||jvr&|t |j|gq dSr) r&r7rrrr:rrrr)rXr7rr rrrrrxs   z$BulkDeleteFetch._do_post_synchronizeNrrrrrrrr)F)FFF)T)6r itertoolsrrrMrrrrrr baser r rKr rrsql.baserrMr[r`rtrrarprur>rXrqrzrYr?rrr{rdrrrrr6r_objectrSrrrrrrrrrrrrsr             P EV-.Q  Z :8. I s]F)` e(\#(