
    -h                     
   S r SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ	r	  SSKJ
r
  SS	KJr  S
SKJr  S
SKJr  S
SKJr   " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r\\\
\\	\0rg)zRelationship dependencies.

   )
attributes)exc)sync)
unitofwork)util)
MANYTOMANY)	MANYTOONE)	ONETOMANY   )sqlc                       \ rS rSrS r\S 5       rS rS rS r	S r
S rS	 rS
 rS rS rS rS rS rSS jrS rS rSrg)DependencyProcessor   c                 (   Xl         UR                  U l        UR                  U l        UR                  U l        UR                  U l        UR
                  U l        UR                  U l        UR                  U l        UR                  U l        UR                  U l	        U R                  (       a  [        R                  U l        O[        R                  U l        U R                  (       a  [        R                  U l        O[        R                  U l        U R                  R                  < SUR                   < 3U l        UR                   U l        U R                   R$                  (       d#  [&        R(                  " SU R                   -  5      eg )N_z|Can't build a DependencyProcessor for relationship %s. No target attributes to populate between parent and child are present)propcascademapperparent	secondary	directionpost_updatepassive_deletespassive_updatesenable_typechecksr   PASSIVE_NO_INITIALIZE_passive_delete_flagPASSIVE_OFF_passive_update_flag	_sort_keykeysort_keysynchronize_pairssa_excArgumentError)selfr   s     nC:\Users\ROHAN GUPTA\OneDrive\Desktop\mathbuddy-assessment\venv\Lib\site-packages\sqlalchemy/orm/dependency.py__init__DependencyProcessor.__init__   s   	||kkkk++#33#33!%!7!7(2(H(HD%(2(>(>D%(2(H(HD%(2(>(>D%#';;#8#8$((C88yy**&&$&*ii0  +    c                 4    [         UR                     " U5      $ N)_direction_to_processorr   )clsr   s     r'   from_relationship%DependencyProcessor.from_relationship7   s    &t~~6t<<r*   c                 ~    U R                   R                  R                  U R                  5      R	                  U5      $ )zreturn True if the given object instance has a parent,
according to the ``InstrumentedAttribute`` handled by this
``DependencyProcessor``.

)r   class_managerget_implr!   	hasparentr&   states     r'   r4   DependencyProcessor.hasparent;   s.     {{((11$((;EEeLLr*   c                 (    UR                  U S5        g)z}establish actions and dependencies related to a flush.

These actions will operate on all relevant states in
the aggregate.

TN)register_preprocessorr&   uows     r'   per_property_preprocessors.DependencyProcessor.per_property_preprocessorsC   s     	!!$-r*   c           	         [         R                  " XSS5      n[         R                  " XSS5      n[         R                  " XR                  R                  5      n[         R                  " XR
                  R                  5      n[         R                  " XR                  R                  5      n[         R                  " XR
                  R                  5      nU R                  UUUUUUU5        g NFT)r   
ProcessAllSaveUpdateAllr   primary_base_mapperr   	DeleteAllper_property_dependencies)r&   r;   
after_savebefore_deleteparent_saveschild_savesparent_deleteschild_deletess           r'   per_property_flush_actions.DependencyProcessor.per_property_flush_actionsL   s    **3eTB
"--ctD!//00
 !..00
 $--00
 #,,00
 	&&	
r*   c                    U R                   R                  n[        R                  " X5      n[        R                  " X5      nU(       a   [        R
                  " XSS5      nSUl        O[        R
                  " XSS5      nSUl        XQR                  ;  a  XaR                  ;  d   eUS4US4/n	Sn
OSn
U(       d?  [        R                  " XR                  R                  5      nS=pXR                  ;   a  SnO>[        R                  " XR                  R                  5      nS=pXR                  ;   a  SnU GH  nUR                  U R                     R                  R                  UUR                  U(       a  U R                  O[         R"                  5      nU(       d  Ml  U(       a6  [        R$                  " XSU5      nW(       a  [        R&                  " X5      nO5[        R$                  " XSU5      nW(       a  [        R(                  " X5      nU
(       a~  / n	U Hv  u  nnUUR*                  ;  a  SnOLUR*                  U   u  nnU(       a  [        R&                  " UU5      S4nO[        R(                  " UU5      S4nU	R-                  U5        Mx     W	 H  u  nnU R/                  UUUUWWUU5        M      GM     g)zestablish actions and dependencies related to a flush.

These actions will operate on all relevant states
individually.    This occurs only if there are cycles
in the 'aggregated' version of events.

TFN)NN)r   rB   r   rA   rC   r@   disabledcyclesr   base_mappermanagerr!   implget_all_pendingdictr   r   r   ProcessStateDeleteStateSaveUpdateStatestatesappendper_state_dependencies)r&   r;   rX   isdeletechild_base_mapperrH   rJ   rF   rE   child_actionschild_in_cyclesrG   rI   parent_in_cyclesr6   sum_child_statechildchild_actiondeletedlistonlychildisdeletes                         r'   per_state_flush_actions+DependencyProcessor.per_state_flush_actionsh   s    !KK;; ..sF",,SD
 &11#T4HM%)M"#..s%FJ"&J jj(
 !

222 *51M43HIM#O"O %33[[,,L .21Nzz)#' '11#{{7N7NON(,,L+#'  E ==*//??

 ))55D  * 7 74 O#%/%;%;C%GN'44SuM
##-#=#=c#IL "*.&K"#**4'3.1jj.E+(" * 6 6sK H $,L !+ : :3 L %,L "((6 +/& 0=+m++ " !!	 0=[ r*   c                     gNF r&   	uowcommitrX   s      r'   presort_deletes#DependencyProcessor.presort_deletes       r*   c                     grj   rk   rl   s      r'   presort_saves!DependencyProcessor.presort_saves   rp   r*   c                     g r,   rk   rl   s      r'   process_deletes#DependencyProcessor.process_deletes       r*   c                     g r,   rk   rl   s      r'   process_saves!DependencyProcessor.process_saves   rw   r*   c                    U(       a  U R                   (       a  [        R                  nO4U R                  [        L a  [        R
                  nO[        R                  nU H?  nUR                  XPR                  U5      nU(       d  M(  UR                  5       (       a  M?    g   U=(       a;    U R                  R                  (       + =(       a    U R                  UR                  ;   $ )NT)r   r   r   r   r	   PASSIVE_NO_FETCH_RELATEDr   get_attribute_historyr!   emptyr   _is_self_referentialr   mappers)r&   rm   rX   r[   passiveshistorys          r'   prop_has_changes$DependencyProcessor.prop_has_changes   s    4// 66G^^y( !99G ,,GA  55a7KGww}}   5		6665KK9#4#44r*   c                 R   U R                   R                  (       a'  Uc$  [        R                  " SU R                   < 35      eUb  U R                  R                  XR                  (       + S9(       d  U R                  R                  USS9(       aP  [        R                  " SUR                  U R                   U R                  R                  U R                  S.-  5      e[        R                  " SUR                  U R                   U R                  R                  S.-  5      eg g )Nz+Can't flush None value found in collection )allow_subtypesTaE  Attempting to flush an item of type %(x)s as a member of collection "%(y)s". Expected an object of type %(z)s or a polymorphic subclass of this type. If %(x)s is a subclass of %(z)s, configure mapper "%(zm)s" to load this subtype polymorphically, or set enable_typechecks=False to allow any subtype to be accepted for flush. )xyzzmzAttempting to flush an item of type %(x)s as a member of collection "%(y)s". Expected an object of type %(z)s or a polymorphic subclass of this type.)r   r   r   )r   uselistr   
FlushErrorr   _canloadr   class_r5   s     r'   _verify_canload#DependencyProcessor._verify_canload   s    99..#'99/  t{{';';&<&<"< (< (
 {{##E$#?nn= #\\!YY![[//"kk	 $ nn! #\\!YY![[//	 -(
r*   c                     [        5       er,   NotImplementedError)r&   r6   rb   associationrow	clearkeysrm   s         r'   _synchronize DependencyProcessor._synchronize(      !##r*   c           	         U R                   R                  (       d  g [        [        U R                  /U R                   R                   Vs/ s H  o"R                  PM     sn-   5      5      nUR                  SU4[        5      $ s  snf )Nreverse_key)r   _reverse_propertytuplesortedr!   memoset)r&   r;   pprocess_keys       r'   _get_reversed_processed_set/DependencyProcessor._get_reversed_processed_set+  sj    yy**DHH:		0K0K L0K10K LLM
 xx4c:: !Ms   Bc           
          U HI  nU(       a  Uc  M  UR                  XR                  R                   VVs/ s H  u  pgUPM	     snn5          g    g s  snnf r,   )register_post_updater   r#   )r&   r6   rm   relatedis_m2o_deleter   lrs           r'   _post_update DependencyProcessor._post_update4  sL    A AM..))*E*EF*E$!A*EF   Gs   Ac                     [        5       er,   r   r&   rm   r6   s      r'   _pks_changed DependencyProcessor._pks_changed<  r   r*   c                 R    U R                   R                  < SU R                  < S3$ )N())	__class____name__r   )r&   s    r'   __repr__DependencyProcessor.__repr__?  s    >>22DII>>r*   )r   r   r   r   r   r!   r   r   r   r   r   r   r   r"   N)F)r   
__module____qualname____firstlineno__r(   classmethodr/   r4   r<   rK   rg   rn   rr   ru   ry   r   r   r   r   r   r   r   __static_attributes__rk   r*   r'   r   r      sj    : = =M.
8n`6'R$;$?r*   r   c                   D    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
rg)OneToManyDPiC  c           
      t   U R                   (       a~  [        R                  " XR                  R                  S5      n[        R                  " XR                  R                  S5      n	UR
                  R                  X64X&4Xh4Xy4X4X4/5        g UR
                  R                  X&4Xc4Xe4X44XT4Xs4Xu4/5        g r?   r   r   PostUpdateAllr   rB   dependenciesupdate)
r&   r;   rG   rH   rI   rJ   rE   rF   child_post_updateschild_pre_updatess
             r'   rD   %OneToManyDP.per_property_dependenciesD  s     !+!9!9[[44e" !+ 8 8[[44d! ## -!.4"6&7&6	 ##!.-/ 1"3"0"2
r*   c	                    U R                   (       a  [        R                  " XR                  R                  S5      n	[        R                  " XR                  R                  S5      n
U(       dI  U(       a   UR
                  R                  XE4XY4/5        g UR
                  R                  X%4XE4XY4/5        g U(       a   UR
                  R                  Xj4X4/5        g UR
                  R                  Xj4X4/5        g U(       d"  UR
                  R                  X%4XT4X$4/5        g UR
                  R                  Xd4XC4/5        g r?   r   )r&   r;   save_parentdelete_parentrc   rE   rF   r[   rf   r   r   s              r'   rZ   "OneToManyDP.per_state_dependenciesm  sN    !+!9!9[[44e" !+ 8 8[[44d!  $$++)6'< $$++(5)6'< !$$++*>.> $$++*>.> ## -. / ##.0MNr*   c                 (   U R                   R                  (       + =(       a    U R                  S:X  + nU H  nUR                  X@R                  U R
                  5      nU(       d  M2  UR                   H\  nUc  M  U R                  U5      SL d  M  U R                   R                  (       a  UR                  USS9  MK  UR                  U5        M^     U(       d  M  UR                   H#  nUc  M  UR                  USU R                  S9  M%     M     g )NallFTr[   delete	operationr   )r   r   r   r}   r!   r   rd   r4   delete_orphanregister_object	unchangedr   r&   rm   rX   should_null_fksr6   r   rb   s          r'   rn   OneToManyDP.presort_deletes  s    
 ###ID,@,@E(I 	 E55xx!:!:G w$__E(T^^E-Be-K<<55%55ed5K%55e< - #?!(!2!2 ,%55 %		 6  "3 r*   c           
      H   UR                  SU 4[        5      nU R                  R                  (       + =(       a    U R                  S:X  + nU GH  nU R                  X5      nU(       a  U R                  (       a  [        R                  nO[        R                  nUR                  XPR                  U5      nU(       Ga  UR                   H$  n	U	c  M  UR                  U	SSU R                  S9  M&     UR                  UR                  5        UR                    H  n	U R                  R                  (       d'  U(       a  UR                  U	SSU R                  S9  MC  ME  U R#                  U	5      SL d  M[  UR                  U	SSU R                  S9  U R$                  R'                  SU	5       H  u  ppUR                  USS	9  M     M     U(       d  GM  U(       d  GM  UR(                   H/  n	U	c  M  UR                  U	SU R                  S
U R                  S9  M1     GM     g )Nchildren_addedr   Tadd)cancel_deleter   r   Fr   r[   r   r   r   z	pk changer   )r   r   r   r   r   r   r   r   r   r   r}   r!   addedr   r   r   rd   r4   r   cascade_iteratorr   )r&   rm   rX   r   r   r6   pks_changedr   r   rb   cmst_dct_s                 r'   rr   OneToManyDP.presort_saves  s   ")94(@#F *** 2((E1 	
 E++I=K$"6"6$::$0055eXXwOG$]]E(!11!*.&+!%	 2  + %%gmm4$__E<<55*%55 %).*2%)YY	 6  + .%7!11!%)&.!%	 2  04{{/K/K$e0OA# &55cD5I0! -* {7!(!2!2 ,%55 % % $ 4 4*5%)YY 6  "3Y r*   c           
         U R                   (       d  U R                  S:X  Gdg  UR                  SU 4[        5      nU GHG  nUR	                  X@R
                  U R                  5      nU(       d  M3  UR                   Hb  nUc  M  U R                  U5      SL d  M  U R                  XFS SUS5        U R                   (       d  MF  U(       d  MO  U R                  XaU/5        Md     U R                   (       d  U R                  R                  (       a  M  [        UR                  5      R                  U5       HL  nUc  M  U R                  XFS SUS5        U R                   (       d  M0  U(       d  M9  U R                  XaU/5        MN     GMJ     g g )Nr   r   FT)r   r   r   r   r}   r!   r   rd   r4   r   r   r   r   r   
difference)r&   rm   rX   r   r6   r   rb   s          r'   ru   OneToManyDP.process_deletes	  sM    4#7#75#@&^^-=t,DcJN#9988T%>%> 7!(!- $u 5 > -- %dD)U  $///EE $ 1 1%UG L "1 ''t||/B/B/B%():):%;%F%F*&E  %0 $ 1 1$)$i!" $(#3#3#3$($5$5(-5'%&&#   $Ar*   c           
         U R                   R                  (       + =(       a    U R                  S:X  + nU GH1  nUR                  X@R                  [
        R                  5      nU(       d  M7  UR                   HC  nU R                  XFS SUS5        Uc  M  U R                  (       d  M0  U R                  XaU/5        ME     UR                   HV  nU(       d  M  U R                   R                  (       a  M)  U R                  U5      (       a  MA  U R                  XFS SUS5        MX     U R                  X5      (       d  GM	  UR                   H  nU R                  XFS SUS5        M     GM4     g )Nr   FT)r   r   r   r}   r!   r   r   r   r   r   r   rd   r4   r   r   r   s          r'   ry   OneToManyDP.process_saves5  s1   *** 2((E1 	
 E55xx!A!AG w$]]E%%dE9e (T-=-=-=))%UGD + %__E' $ : : : $u 5 5))!$i - $$Y66!(!2!2))!$y$ "3/ r*   c           
         UnUnU R                  U5        Ub'  U R                  (       d  UR                  U5      (       a  g U(       a6  [        R                  " XR
                  U R                  R                  5        g [        R                  " UU R                  UU R
                  U R                  R                  UU R                  =(       a    U5        g r,   )r   r   
is_deletedr   clearr   r   r#   populater   r   )	r&   r6   rb   r   r   rm   r   sourcedests	            r'   r   OneToManyDP._synchronizeW  s     U#<  Y%9%9$%?%?JJt[[$))*E*EFMM		++$$4r*   c                 n    [         R                  " XU R                  U R                  R                  5      $ r,   r   source_modifiedr   r   r#   r   s      r'   r   OneToManyDP._pks_changedn  *    ##dkk499+F+F
 	
r*   rk   N)r   r   r   r   rD   rZ   rn   rr   ru   ry   r   r   r   rk   r*   r'   r   r   C  s0    'RAF6<|%&X D.
r*   r   c                   J    \ rS rSrS rS rS rS rS rS r	S r
 SS
 jrSrg	)ManyToOneDPit  c                     [         R                  X5        U R                  R                   H'  nUR                  R                  [        U5      5        M)     g r,   )r   r(   r   self_and_descendants_dependency_processorsrY   DetectKeySwitch)r&   r   r   s      r'   r(   ManyToOneDP.__init__u  s=    $$T0kk66F))001FG 7r*   c           
      l   U R                   (       a  [        R                  " XR                  R                  S5      n[        R                  " XR                  R                  S5      n	UR
                  R                  X64X&4Xh4Xi4Xy4X4X4/5        g UR
                  R                  X64Xb4X%4XE4/5        g r?   r   r   r   r   rB   r   r   )
r&   r;   rG   rH   rI   rJ   rE   rF   parent_post_updatesparent_pre_updatess
             r'   rD   %ManyToOneDP.per_property_dependenciesz  s     ",":":[[44e# ",!9!9[[44d" ## -!.54"7'7'8
 ## -.!1#3	r*   c	                    U R                   (       a  U(       dt  [        R                  " XR                  R                  S5      n	U(       a   UR
                  R                  XY4X4/5        g UR
                  R                  X%4XE4XY4/5        g [        R                  " XR                  R                  S5      n
UR
                  R                  Xj4X4X4/5        g U(       dE  U(       d   UR
                  R                  XE4XR4/5        g UR
                  R                  XR4/5        g U(       a  UR
                  R                  X44/5        g g r?   r   )r&   r;   r   r   rc   rE   rF   r[   rf   r   r   s              r'   rZ   "ManyToOneDP.per_state_dependencies  s@    &0&>&>88%'# !$$++'=0? $$++(5)6'= &0%=%=88$&"   ''&;+;+:    ''"/*1JK   ''*)B(CD   ''-)F(GH r*   c           	         U R                   R                  (       d  U R                   R                  (       a  U H  nUR                  X0R                  U R
                  5      nU(       d  M2  U R                   R                  (       a  UR                  5       nOUR                  5       nU H\  nUc  M  UR                  USSU R                  S9  U R                  R                  SU5      nU H  u  ppUR                  U
SS9  M     M^     M     g g )NTr   r   r   )r   r   r   r}   r!   r   sumnon_deletedr   r   r   r   )r&   rm   rX   r6   r   todeleterb   tr   r   r   r   s               r'   rn   ManyToOneDP.presort_deletes  s    <<$,,"<"<#9988T%>%> 7||11#*;;=#*#6#6#8!) =$!11!%)&.!%	 2  !KK885I/0OA#%55cD5I 01 "*   #=r*   c           	         U H  nUR                  USU R                  S9  U R                  R                  (       d  M;  UR	                  X0R
                  U R                  5      nU(       d  Mj  UR                   Hm  nU R                  U5      SL d  M  UR                  USSU R                  S9  U R                  R                  SU5      nU H  u  pxpUR                  U	SS9  M     Mo     M     g )Nr   r   FTr   r   r   )r   r   r   r   r}   r!   r   rd   r4   r   r   )r&   rm   rX   r6   r   rb   r  r   r   r   r   s              r'   rr   ManyToOneDP.presort_saves  s    E%%eu499%M||)))#9988T%>%> 7!(>>%0E9%55 %)-*2%)YY	 6  !% < <Xu MA34c ) 9 9# 9 M 45 "1 r*   c                    U R                   (       a  U R                  R                  (       d  U R                  S:X  d  U H  nU R	                  US S SU5        U(       d  M!  U R                   (       d  M4  UR                  X0R                  U R                  5      nU(       d  Mc  U R                  X1UR                  5       SS9  M     g g g g )Nr   T)r   )
r   r   r   r   r   r}   r!   r   r   r  )r&   rm   rX   r6   r   s        r'   ru   ManyToOneDP.process_deletes	  s    LL..((E1  !!%tT9E5T---'==xx)B)BG w))!gkkm4 *    2 / r*   c           
         U H  nUR                  X0R                  [        R                  5      nU(       d  M6  UR                  (       a)  UR                   H  nU R                  X5S SUS5        M     O'UR                  (       a  U R                  US S SUS5        U R                  (       d  M  U R                  X1UR                  5       5        M     g )NFr   Tr   )
r}   r!   r   r   r   r   rd   r   r   r  )r&   rm   rX   r6   r   rb   s         r'   ry   ManyToOneDP.process_saves  s    E55xx!A!AG w==!())!$y% "/ __%%tT4H ###%%eF r*   Nc           	      T   Ub'  U R                   (       d  UR                  U5      (       a  g Ube  Ubb  UR                  R                  U5      (       dB  [        R
                  " S[        R                  " U5      < SU< SU R                  < S35        g U(       d  Uc6  [        R                  " XR                  U R                  R                  5        g U R                  U5        [        R                  " UU R                  UU R                  U R                  R                  US5        g )NObject of type  not in session,  operation along '' won't proceedF)r   r   session_contains_stater   warn
mapperutilstate_class_strr   r   r   r   r#   r   r   r   r&   r6   rb   r   r   rm   r   s          r'   r   ManyToOneDP._synchronize0  s     =  Y%9%9%%@%@ !!%%55e<<II --e4iL
 JJukk499+F+FG  'MM		++r*   rk   r,   )r   r   r   r   r(   rD   rZ   rn   rr   ru   ry   r   r   rk   r*   r'   r   r   t  s6    H
&P8ItJ0N**G2 &r*   r   c                   Z    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rSrg)r   iY  ax  For many-to-one relationships with no one-to-many backref,
searches for parents through the unit of work when a primary
key has changed and updates them.

Theoretically, this approach could be expanded to support transparent
deletion of objects referenced via many-to-one as well, although
the current attribute system doesn't do enough bookkeeping for this
to be efficient.

c                     U R                   R                  (       a4  U R                  (       a  g SS U R                   R                   5       ;   a  g UR                  U S5        g )NFc              3   :   #    U  H  nUR                   v   M     g 7fr,   )r   ).0r   s     r'   	<genexpr>=DetectKeySwitch.per_property_preprocessors.<locals>.<genexpr>j  s       ; (( ;s   )r   r   r   r9   r:   s     r'   r<   *DetectKeySwitch.per_property_preprocessorse  sO    99&&##  $		 ; ;  !!$.r*   c                     [         R                  " XR                  R                  5      n[         R                  " XSS5      nUR
                  R                  X#4/5        g rj   )r   rA   r   rP   r@   r   r   )r&   r;   rG   rE   s       r'   rK   *DetectKeySwitch.per_property_flush_actionsr  sJ    !//[[5L5LM**3eUC
,!; <=r*   c                     g r,   rk   )r&   r;   rX   r[   s       r'   rg   'DetectKeySwitch.per_state_flush_actionsw  rw   r*   c                     g r,   rk   rl   s      r'   rn   DetectKeySwitch.presort_deletesz  rw   r*   c                 J    U R                   (       d  U R                  X!5        g g r,   r   _process_key_switches)r&   r;   rX   s      r'   rr   DetectKeySwitch.presort_saves}  s     ## &&v3 $r*   c                 l    U(       d-  U R                   (       a  U R                  X5      n[        U5      $ grj   )r   _key_switchersbool)r&   r;   rX   r[   ds        r'   r    DetectKeySwitch.prop_has_changes  s)    D00##C0A7Nr*   c                      er,   rk   rl   s      r'   ru   DetectKeySwitch.process_deletes  s    ur*   c                 L    U R                   (       d   eU R                  X!5        g r,   r)  rl   s      r'   ry   DetectKeySwitch.process_saves  s!    
 ####""65r*   c                     UR                  SU 4S 5      u  p4UR                  U5      nU HD  nXe;  d  M
  U R                  X5      (       a  UR                  U5        M3  UR                  U5        MF     U$ )Npk_switchersc                  *    [        5       [        5       4$ r,   )r   rk   r*   r'   <lambda>0DetectKeySwitch._key_switchers.<locals>.<lambda>  s    SUCENr*   )r   unionr   r   )r&   r;   rX   switchednotswitched	allstatesr   s          r'   r-  DetectKeySwitch._key_switchers  sm     #T"$:!
 NN;/	A!$$S,,LLOOOA&  r*   c           
         U R                  X!5      nU(       Gal  UR                  R                  R                  5        GHB  n[	        UR
                  U R                  R
                  5      (       d  M5  UR                  nUR                  U R                  5      R                  XEU R                  S9nU[        R                  Ld  M  Uc  M  U R                  R                  (       a  U(       d  M  US   nOUn[        R                   " U5      nX;   d  M  UR#                  USU R$                  5        [&        R(                  " UU R*                  UU R                  U R                  R,                  UU R$                  5        GME     g g )N)r       F)r-  r  identity_map
all_states
issubclassr   r   rT   r3   r!   getr   r   PASSIVE_NO_RESULTr   r   instance_stater   r   r   r   r   r#   )	r&   deplistrm   	switchersr6   dict_r   related_objrelated_states	            r'   r*  %DetectKeySwitch._process_key_switches  s3   ''	;	 #**77BBD!%,,0B0BCC

..266$*C*C 7  :#?#??+yy((&$&-aj&-$.$=$=k$JM$1!11!5$*>*> ) KK! KK II77% 00- E r*   c                     [        UR                  5      =(       a6    [        R                  " XU R                  U R
                  R                  5      $ r,   )r.  r!   r   r   r   r   r#   r   s      r'   r   DetectKeySwitch._pks_changed  s9    EII 
4#7#7dkk499+F+F$
 	
r*   rk   N)r   r   r   r   __doc__r<   rK   rg   rn   rr   r   ru   ry   r-  r*  r   r   rk   r*   r'   r   r   Y  s?    	/>
46#J
r*   r   c                   J    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)ManyToManyDPi  c           
      V    UR                   R                  X&4X64Xe4Xr4Xt4Xu4Xs4/5        g r,   r   r   )r&   r;   rG   rH   rI   rJ   rE   rF   s           r'   rD   &ManyToManyDP.per_property_dependencies  sI     	*)+ -/.,	
r*   c	                     U(       dG  U(       a   UR                   R                  X%4XT4/5        g UR                   R                  X%4XE4/5        g UR                   R                  Xd4Xc4/5        g r,   rS  )	r&   r;   r   r   rc   rE   rF   r[   rf   s	            r'   rZ   #ManyToManyDP.per_state_dependencies  st       ''!.0JK   ''!.0JK ##.0NOr*   c                     U R                   (       d0  U H)  nUR                  X0R                  U R                  5        M+     g g r,   )r   r}   r!   r   )r&   rm   rX   r6   s       r'   rn   ManyToManyDP.presort_deletes  s;     ##  //88T%>%>  	 $r*   c           	      b   U R                   (       dK  U HE  nU R                  X5      (       d  M  UR                  X0R                  [        R
                  5      nMG     U R                  R                  (       d  g U H  nUR                  X0R                  [        R                  5      nU(       d  M6  UR                   Hk  nU R                  U5      SL d  M  UR                  USSU R                  S9  U R                  R                  SU5       H  u  pgpUR                  USS9  M     Mm     M     g )NFTr   r   r   )r   r   r}   r!   r   r   r   r   r   rd   r4   r   r   r   r   )
r&   rm   rX   r6   r   rb   r   r   r   r   s
             r'   rr   ManyToManyDP.presort_saves  s   ##  $$Y66'==xx)?)?G   ||)) E55xx!A!AG w$__E~~e,5!11!%)&.!%	 2  04{{/K/K$e0OA# &55cD5I0 - r*   c           
        ^ / n/ n/ nU R                  U5      n[        5       nU H  mUR                  TU R                  U R                  5      nU(       d  M3  UR                  5        HC  n	U	b  Ub
  TU	4U;   a  M  0 n
U R                  TU	U
SUS5      (       d  M2  UR                  U
5        ME     UR                  U4S jUR                  5        5       5        M     Ub  UR                  U5        U R                  XXS5        g )NFr   c              3   *   >#    U  H  oT4v   M
     g 7fr,   rk   r  r   r6   s     r'   r  /ManyToManyDP.process_deletes.<locals>.<genexpr>Q  s     C/B!u:/B   )
r   r   r}   r!   r   	non_addedr   rY   r   	_run_crud)r&   rm   rX   secondary_deletesecondary_insertsecondary_update	processedtmpr   rb   r   r6   s              @r'   ru   ManyToManyDP.process_deletes2  s   44Y?	eE  55txx!:!:G w$..0E}!-5%.I2M %'N,,&!   !$++N; 1" 

Cw/@/@/BCC1 4  S!)9	
r*   c           
      |  ^ / n/ n/ nU R                  U5      n[        5       nU GH  mU R                  (       + =(       a    U R                  UT5      nU(       a  [        R
                  n	O[        R                  n	UR                  TU R                  U	5      n
U
(       d  M|  U
R                   H?  nUb
  TU4U;   a  M  0 nU R                  TXSUS5      (       d  M.  UR                  U5        MA     U
R                   H@  nUb
  TU4U;   a  M  0 nU R                  TUUSUS5      (       d  M/  UR                  U5        MB     UR                  U4S jU
R                  U
R                  -    5       5        U(       d  GMW  U
R                   H  n0 n[        R                  " TU R                   USU R"                  R$                  5        [        R                  " UU R&                  USU R"                  R(                  5        UR                  U5        M     GM     Ub  UR                  U5        U R+                  XXS5        g )NFr   r   c              3   *   >#    U  H  oT4v   M
     g 7fr,   rk   r]  s     r'   r  -ManyToManyDP.process_saves.<locals>.<genexpr>  s     O/N!u:/Nr_  old_)r   r   r   r   r   r   r   r}   r!   r   r   rY   rd   r   r   r   r   r   r#   r   secondary_synchronize_pairsra  )r&   rm   rX   rb  rc  rd  re  rf  need_cascade_pksr   r   rb   r   r6   s                @r'   ry   ManyToManyDP.process_savesZ  s   44Y?	eE#'#7#77  D<M<M5=  $00$::55eTXXwOGw$]]E ,%91L %'N,,ueY  !$++N; + %__E ,%91L %'N,,&!   !$++N; - 

Ow}}w/NOO##!(!2!2)+! KK*" II77 ! KK*" IIAA )//?# "3M r  S!)9	
r*   c                 v   UR                   R                  U R                  5      nU(       Ga"  US   nU R                  R	                  5       R                  [        R                  " U R                  R                   Vs/ s HA  nUR                  U;   d  M  U[        R                  " UR                  UR                  S9:H  PMC     sn6 5      nUR                  X5      n	U	R                  5       (       a\  U	R                  [        U5      :w  aC  [         R"                  " SU R                  R$                  [        U5      U	R                  4-  5      eU(       Ga%  US   nU R                  R'                  5       R                  [        R                  " U R                  R                   Vs/ s HD  nUR                  U;   d  M  U[        R                  " SUR                  -   UR                  S9:H  PMF     sn6 5      nUR                  X5      n	U	R                  5       (       a\  U	R                  [        U5      :w  aC  [         R"                  " SU R                  R$                  [        U5      U	R                  4-  5      eU(       a,  U R                  R)                  5       nUR                  X5        g g s  snf s  snf )Nr@  )type_zRDELETE statement on table '%s' expected to delete %d row(s); Only %d were matched.rk  zRUPDATE statement on table '%s' expected to update %d row(s); Only %d were matched.)transaction
connectionr   r   r   wherer   and_r   r!   	bindparamtypeexecutesupports_sane_multi_rowcountrowcountlenr   StaleDataErrordescriptionr   insert)
r&   rm   rc  rd  rb  rr  r   r   	statementresults
             r'   ra  ManyToManyDP._run_crud  sM    **55dkkB
-a0N--/55 "&!1!1!1A55N2 @S]]155??!1I  ''	DF 3355//S)9%::((7 22,-  -a0N--/55 "&!1!1!1A55N2 IS]]6AEE>HH!1I  ''	DF 3355//S)9%::((7 22,-  --/Iy; a4s   >J10J1(J6 3J6c           	         U R                  U5        Uc  gUbs  UR                  R                  U5      (       dS  UR                  (       dA  [        R
                  " S[        R                  " U5      < SU< SU R                  < S35        g[        R                  " XR                  X0R                  R                  5        [        R                  " UU R                  UU R                  R                  5        g)NFr  r  r  r  T)r   r  r  rd   r   r  r  r  r   r   populate_dictr   r#   r   rl  r  s          r'   r   ManyToManyDP._synchronize  s    
 	U# =Y%6%6%F%Fu%M%M==		 "11%8)TYYP
 ;;		0K0K	
 	KKII11		
 r*   c                 n    [         R                  " XU R                  U R                  R                  5      $ r,   r   r   s      r'   r   ManyToManyDP._pks_changed   r   r*   rk   N)r   r   r   r   rD   rZ   rn   rr   ru   ry   ra  r   r   r   rk   r*   r'   rQ  rQ    s6    
82
 JD&
PF
P;<zB
r*   rQ  N)rO   r   r   r   r   r   r  
interfacesr   r	   r
   r$   r   objectr   r   r   r   rQ  r-   rk   r*   r'   <module>r     s          " ! !   g?& g?T	n
% n
b	b% bJr
) r
ju
& u
r	 {{ r*   