From 4d5101ec3a8bf335c99c4e91fd70621205166541 Mon Sep 17 00:00:00 2001 From: oliver Date: Sat, 10 Oct 2026 23:20:50 +0800 Subject: [PATCH] Fix business compare history, search, sampling and exports --- docs/reviews/assets/biz-compare-desktop.png | Bin 0 -> 102957 bytes docs/reviews/assets/biz-compare-error.png | Bin 0 -> 98303 bytes docs/reviews/assets/biz-compare-legacy.png | Bin 0 -> 89658 bytes .../assets/biz-compare-memory-benchmark.json | 29 ++ docs/reviews/assets/biz-compare-narrow.png | Bin 0 -> 89146 bytes docs/reviews/biz-compare-review-2026-10-10.md | 120 ++++++ netx_api/biz_state/compare_engine.py | 135 +++--- netx_api/biz_state/compare_service.py | 406 ++++++++++++++---- tests/test_biz_state_compare_export.py | 87 ++++ tests/test_biz_state_compare_memory.py | 103 +++++ tests/test_biz_state_compare_search.py | 186 ++++++++ tests/test_biz_state_compare_snapshot.py | 170 ++++++++ web/src/i18n/en.ts | 17 +- web/src/i18n/zh.ts | 19 +- web/src/index.css | 87 +++- web/src/pages/network/BizComparePage.tsx | 280 ++++++++---- web/src/pages/network/cutoverDataCache.ts | 28 +- web/tests/bizCompare.browser.mjs | 133 ++++++ web/tests/cutoverDataCache.test.mjs | 72 ++++ 19 files changed, 1598 insertions(+), 274 deletions(-) create mode 100644 docs/reviews/assets/biz-compare-desktop.png create mode 100644 docs/reviews/assets/biz-compare-error.png create mode 100644 docs/reviews/assets/biz-compare-legacy.png create mode 100644 docs/reviews/assets/biz-compare-memory-benchmark.json create mode 100644 docs/reviews/assets/biz-compare-narrow.png create mode 100644 docs/reviews/biz-compare-review-2026-10-10.md create mode 100644 tests/test_biz_state_compare_export.py create mode 100644 tests/test_biz_state_compare_memory.py create mode 100644 tests/test_biz_state_compare_search.py create mode 100644 tests/test_biz_state_compare_snapshot.py create mode 100644 web/tests/bizCompare.browser.mjs create mode 100644 web/tests/cutoverDataCache.test.mjs diff --git a/docs/reviews/assets/biz-compare-desktop.png b/docs/reviews/assets/biz-compare-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..17926f38fecee7b8af0ecb4e82069def942ceac1 GIT binary patch literal 102957 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�zu+4-$Au(7>H~I+N;Z8D?6Waub4W{a@`)*99^XeUoOa7*i;eF_@Z$e}n3pqR z+bR!gb2B=5g6GO3KKNv4@j}`@}HS!z0_q?{SMNIVw2-;hvUp@D%Z zpB#i`6;;x*a_FjB>@^YdipvWRo2TL3Q>j-|seyF2$eA}C@>mSa89|7b4Gbg#puF^I zQ?@S`YEq|MKz;F_@){(wmQ04b(xE*;h53rQatV(UTVz4sN~UCYd|q8pV_SEbg|NNM z^vlUa>pwn8ZSfg%umLND)>s*RO1|o*DcO>1{o4PgpG1x8sF)sgfUHP1Bg00t0J2_W8+}w14G@b9p>Eq5ZJIe&kg?H-<}eZ z>vaP66ZV4ZpJ%6;>Ak4e(eNfC*{*0Way*^JZZqHA=l=nur0rGLF&~awL{(2kcjDTVoH+h zWisI69}z*F1Ty$+LV7wv3!?c?>@y401Z5yihI3XfX$szM(y(e#LG_qXdu?jEJ@CVp zh+O}FGsoZxi(PA~%5GVL2oGXxTbA0_+9g7G8HtF59+VL^Vu>0!b#9thGwX0EpuT|(5Wwk50&EQV(9h=BF7%B0|YcmRZ zYI9PyV7#7otnK=t%JcKUy#fwS0A^-=`D&3-ca)4DmQmO?9O~GlP)}jmI*PE~%X*o% zIqov1Pws{~lX2zems3xt(lQKo=VSq(e*YHQAp*gc%AD8Gbx=yD|5rD+dmLObYxfFa z+IAI<91t**^kHId{F>Gd1mQ9pBABPp&519!lzknZ4qWdVlZ*@+d31xFk_U0iqHyo= zb%?dvzv1@H+^(n9`u8{)ZOys!0$7;MUZysAgB$W<`UzsmVoLJzb|1ih+3J_1e|udp_vqEMq!*UWC6HfET2 z?qE+nd26biCWhkV6;bGbebL4u2T!8DXdeYZ=1y4pN6ghIg$cqr%$=H*udj+!J}?g+ zBqk=t*_ent7d1FDs#m2dkBG0q(lvU2TuQDZ5DCB3i7*snh7~wIXJ`=Go_$PeyrN=l z2-`2XeJ!}*QEjLjmE;c#f1r@SNN8W**AdG*?OJ>yUl#hFM{ToxC!$e??BtzrY<)t0 zGccP5lIv*gzNlGv7sTMu!^p~68;+W-tN2tV+57hBeRwahwg{D6⪙^E6D*J7|5}j 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

%5OKXq=lESN4hxl;fdp?Rm0~2fCJ{qC1XD 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 F{|Bv1EKL9a literal 0 HcmV?d00001 diff --git a/docs/reviews/assets/biz-compare-error.png b/docs/reviews/assets/biz-compare-error.png new file mode 100644 index 0000000000000000000000000000000000000000..e032b230841a5a9dd9fa44fb3956a8afb20b4498 GIT binary patch literal 98303 zcmaI8WmH^C6D}Ow9fA$+5G29fU4tgUg1fuBySw|~f#B}$PLSa4u6NG4Z{&RITX(Jb zG0g7ns;=&;uIK66geb^~Bf;arzj^ZpNm4>Y@y#2k>^E;9_F%z5zZBt)<-d7@`bJVj zP}w>CCEKF^Q(etUN&7Ti zrY>*KrFqa-VbNZ(_mKHgj5!#JlJbu1DX+|zV-K!p_i_1Qnm?(q53Kq3eR3i;1dK`tI@>pxFn zr+y0hK>Y427>$eq5BMX>*WOuSUEtTqf~fi3e&8^_6#z9{Rdjw zC7pUdG&C^zX3izY}5YXWiP=q4;IY@un99k&~ef>uW>BYq3^*CaAhl9QAD zosIPJN^`1X>>aLCqUw|iIoPj>_;&qeh%pHOD!#g!+No{x z;O95v81hPS%g2s=y*7Z|x`{(o9FV3Gktf)g9FSAf)23#Jf7GP{C#>tXuWc$UOgZI2 zP%I;s$>g=%;~u{xjOrI3oCAP*GKtrNw~0di5|@vmTO&%@!!5l1wD!~3a>wk@R0r}a zU}UKF1*F>-NBb~Hd_TRt8T>v6hhW3)RWGlGzGj1g+O$4Z)@fU-3h9y%CDumVh zBcsW5=UIzq^bp*HNA1V2txY&JmABbF4yMy-S*PT467uqN3=AZKsMy#^nTbGmdIlOS zpvvyd++1un4u{LlnM}|)X~o9qaN7z6R{P%4$I1THmnZS_<#ov#v0i}J;WYTOTvs8Y zVy(;lyjy(B4?4?{ius)@Ield1ndr=v^%}5WmZ&8NfrA6|2avjVMp|6 zIKIRa$_bf9dOi5frX=yZZfi~j9cgEHCHun%tswg;d{!}NV6_*<#906eL|Mk5R>(^p z@j48ojte^&JnD@GxlQjPqf-8eoH-F57~im=x;dl_p?_R6|DG7^o%o)?Dg44gxRX+X zl{26d9sr&YwE9TCrjJjJx9i-VvCQ83GU3KQlr}b4g)#M5i0?MMyb_xm!|o7Y6`~*6 zbW-?niZW>!86stG6fNq}(TCbDKRz^furWz{m#g*odDg9EDx~Sp46)9bc(}N@2KIAD z#!mT5N1OE(2}`7oGR>3hN~6jju3!cedyqRcwU(085A<&wlTIH@H%XXWBQmCJ5JB|#vH(} zA&S5H<-2fJ`%d>fxfcpE5o+W5YVK;IudrX9S$l~7E*|xo(#`%tbEdr_x?M%HZ!n(t z>P*@_3~prenC8z<2TPRa+y3(oV$p)m>3ukVz#zZ>pl=D1bi}=SOU0` z^0Jy)+Nc+*5d_S%6r3reU?l|`Be)Z)#09AcfQ)CniOF(|CD^=3OR_@5=S7J+SQ!3F zT7W4=e$j?b}2nfgtMuC)-B z1RP{IrU874`+cqXBx*hqLZvy*6mLPbZuie)Zsag+w{6YX;}s73u5C%IEYI&sn2eO$ z$6qwl!TL>k9u^Odn?eIKvKAZ6W^aR_>SH`NT?v+~7jAtt8L-0xJ*UhKg1f|-%E2Qb z_=xovj_P!F5q(fbVLtoRik4!I`T}uAM@OmTGD9OGNJzMv9E2#W8{{&9r*o_^93RBx z2)^ZgPYf!%|LPTpGua(8W#tI(uvYxee5IGBT&|NUsBqQ(erCuYsAuJ+#c49f83&CX zyH(8fLKbo;7Y6GpF0>Qjd)g;x!x_?`U@-o;m1`!hnFMFryG;ANYyKOykf!Lb07Xmy zn@0a_a+^*AycoY^U$aCOi8*3(B5*cHz?;KspoqULQ7V`aP@0@T*6q5WxIcwn|DoT~ zyzE9bmYIQhRns9nxk~T2Xa*-0Q{MdCuPFE@BGNKHc?hOY6PP*wm(}muUywPE`a}Gz z*uu5;or0-B+mK1%Qxfz2HwLP`I$HNhM%%4J9MjeA4e%Bqt zd6Hz;FR2}lo%8AI^QsbW0CiEM2wub0$V=iZ#=BmM0+y4&i-ds~j)nAzXzfodZq9}( zKdHV}uFhKAoP9)gn%n^wVu*!5y1#km)j!KGS&@@K6H9ngkPuXtV1z>Cu<4KoO#V(~ zgRSYN*Q9f$DEO!_|AySxo)i+dmxA_xW}TAraWS;3sdREtTtm7kMWI5je4`UuboEI^ zS8)ZHSFKbi8>4HSKVgiQIW+|o(YX(y;S9Bs7(JKgSEn;VY5ckrKMa+3Q~b@cK+T*b z=2;YZp7kn>;;r{2)5sOCNPL&<8iv8o!Du@{`TLDwGXE=p+j-;e5zjP57~u87%muC! zP1ohU^zauIEv@sFTeH5%7+s1~7i;4SyZ-P(G1&;O+u*lRD)kj9*)1I;o~!#6SRoSD|A8!fHYZgK92Q%E7a2TUzW`%;j?1k2IgQ{VgI%UiX{Rkj%RFKPZb zBv%qcjlO1mnQ>Tt%mv{^AaIngis35ucp-{fqoOa!*V=BPCGN*X#}3XLV7f_8ReS*7l^>WlT^ zUZ%(WSNZ)4mHQx&YknXGN_d_RO;o$|ihd*(6G-V?Wh&5LiYM&y@)u>uvW&h+UMJvg ze|-mea<8h47?wUwF-ACl`c3*VWbKCmuTxe@M!Ls&@sbrAc5DZ%WGN^Jo=;6}ZEa;a z!Sg+I2WHxhMGIy#dcz7KKw|2%B&&A%d|>{NnwAz8DqnLi^+T!2HNby&51u5V^ZXJ> zztUUZM|qRRYZI5H^2tz83_^czCUZ4utnLIHH&N9s3?3~$U^PS~07mlkBo6wefh$KI z+NN=8JcY%29b*vHjB3COzY;~;9xnt zd`6BTnHs_jAk%*RVKG1ZVs#D+n=f-GJzUP`S7i@!8G^Vp1zFX8w7nW z1{-V#dDOT0PYpr&s~mSri#HF#r>$N)ps;n#cPrwjQ7qtIPzvvm9RW(UW_o5P+^p}Q zP4_bPo`EgibB`5of93W|@KHrHzG23cg;qcEL1`x>E|jfq9+2+qm$hMWTq7~xm4Cv$ z49Sjhl>bm(X&5u*)-~yUPzV-ii%DT}2Wl|Umk3QN1j;4nYWgWIX5EUGv^NKKX7y+C&85Q(gjRuD`3xzzxK#2PzAPou z*ysRyvsq4IXwD3q>>2iyO;XHHI0}*x}GtlPx9e+pwo1U?$x{PbhjQ z$fWJGqUwsl$`6DQ$_JXcztD-qW5>3mI42`|Wz?wjdKdM6X`dgDn9oVT^Ij>yEXB1qHTGGe&1k?*3} z_>4RlWXy#5IrJ=icWu1*fZ2Hy*nzr22ZUd9eYAUc{xK}6JLbS%lDp6}J6~80(+|pO zshR^N8St~6TE64)viuLLLNhBw1u4VY<(6aL8sGl-yuz;9f5oyASTVH= z!z3ckR+*@l_0%E!^+ zM6tT)W+tAcZc^!l+H&k$f)y?uRF35O`Uj!ww^$oo-}gs5bdAEZR-!_wE8^Tr+WW@F zBd?leM~>FY{fRS-`>>mTv_ z3ouKht)H_rYA__n&wV~qIP+6e;7EU+)p10ivq;{8#S7ARr+8b1&Tiko#4}9K|BDNd z7iP(TAj!_j=`>#y9SAJOQvc4UooZ3dNLLL`jb=9gic_cx6&01IPW28PCj9=}^M3s` zLKb#^v64Td<9{99u_tbgvbu`f&*!R#Uq)ONw`gNI0LwN z{%Qqx3lwMT+0bae&J9Qt`I)&{N{4;ju<$DuC{~lB27$G_T)@z<(sk|NKk(7oKFk_K zA=u8vWoD{sXbAm=od0$Wtdl z$3(WBQ&LwK|I-hfFe+%Xp<&@uRR3s}EP4?AhpB!0xel4iv2l$`R!~Q*k;!uJKTLr{ zQSWhJBlT%`Sj0N%Sm1YBG&GHPGFnQ?CSX(FMtUPwAgD`h-Xl~}@vlhlYj0~_H_))a z5!5|7GXpvPlUFu#tkxK+a7YNgMm>#QDqQ8Wx*EQ5!_fa9<~M?3VvGn4bzC_9Dk37% z;T~;|ez&t@_*0h1(n(KG!D<6`A7q&>XM5rQ550l$3zGjERk=9+-&~12x2t&B3K{`+ z7A6Kh5f*__RA`;(5*g_^R^9I$6Lw0=*z&?T^~XtHU|-GLt&{r3{!=*1syt0B1MK*5^}?J%cO!3zzQI+q}J!7OaM3a z52*q>Rc8$lS3*O_MZ?9$PK%C4HK}RjmEET3mzF285DtoD!{C_u;8x^xNI+mv2?Ul= zS6;EOva+-1rT_93&=d)vCOAn+NzG$oBnLrYKLjb_WFszsLNp+s-WbA%jFK(K?DhpN zL^1*isi44sp&maU=~sLP^_J*|)JG0l$xKZI5D=)l6h6&Vdt5uHr7m@@FtfS@bBSqoW&B-uQ<3m#`jZ z9$74`gcuEdF~>DAH9doS6Le2fiMxr5O>p;Ub zIgO3|tm4wQ?TGQm9)e?10&k1?loH~X=%);+bjZTN#f6es)b;gU?o&X%`5*ak1Kqy!>({?hvfwiqAj+JQA;n=olO*9jccud52-2(~#+ z;7v%!v14yfU)&ig0|kPY$wWx(hgF=hMO{!Po`Qc8MoNB@-^^uuOvk%_Hyj$A!S zXV|0;oqBPQi*7#rwGB;z76@(vAMns2tGJbQTU*wjCug>-A+tjuML@G1kZ=>uL-?B? zHVG0D5o2pyA&33yRNUk05)G>n!4Qog@z3yJ8TO4D|4|60-$sy&qT@tWtEFpd&k-vB z-(itEHgB?F{^E)4F%7j?H!HZk3dVzEx}UsJA>v&n7GU%K!&CQf%(rW0PkwlL+U+Nf zt93K~OA@MoG!~KPk8*W2TBDY;jbRaGcF>3r7yI)!h<{PNu)Y!sBz~rV&x@axSMD~6 zh$xRU6X5}kNvp|m>w1s!{8@i_kgq+t`H?JWMi4cx!vMn_7j zI=*F<1DrCQAP7R?elJ34KR>vH2?_0sm>+NB!M+gF_Iy6FiUQPzMnN~y04?U<7N`)w0TAwlDt9h2AmDj9>K1TurO_Td1+27cZQKc1UAbXO&r4`PzbJHt5%4^Jq>qT z&*8^EK~6cG!yaidIs?)i&`MlNDkZAskp^mMw7je?j- zBQ9AWN=ZriO05Zk2~C*xo!M%`)11hb38?3q z)lep|;{nu&oB=^m(0LqZqwY#}pz8rjov&k~^O{bhGC|#e-+s?a0-@n>Oxt7ziH%Ua zm<2hifA$9emjHiWL7t}~+62(qCTbvTqLP(v@22w8QgL=PBOx6`Xx#`WF!#LYKqlnk zF}u+ql^-j4E(*f#-1>3aRyEx4W70g5^iu=xi5H_w(A?Y(wXg4K3a6%YZupyHyu%p5 z96rh-Ic&OAs4bZ+*TK9feh7$SOb8Fisd+6ggefYbS2AS@O*O=vHo~*Tx_dV^?U;|j zP$w;qx8#TdrBHh^&GKXD6ucWY4T^OJVnmPllBTi z&8@>BLi{2(T|6oo6*ABR!0q}}-`;xo{OVC_GW}K-NzUj9BkC26uZPOoo+uVgxGs@A!`t+%6M}eR^2zvH!$d=mBGP* zsqCkHI^BVH)XchfsCbqT%Hh>|Vy#aHY04Vj41QnEOYiO0g++ppC+x3;Bpqbw^UudP zaB%lFn$3umKJW$Bn<7;o( z?lUvgPKk+mi;MeNO|9MJa<2XLxxg<7nQoi0$#|p2%i|phUt3O&%{4ne&w0}Bfqm@T zvjvP-agkAjjXRs)@d)x9X8aNWi^L=UMQYe-*91ZW<9y-xqoa8I@~nh!ALYz&jJFb+ zo9ii}(|IEABgO;bDf2h>5?c4>_#eq}vq90%S;oj#nhanq6x&2(sjNu}83JWEgd6Q9b zs@xFNk_Lc6%*Fs&OL1lUU`XW1k`-54C5NM+m1w0e>0-HuC@&%d_m=1c7#JJ%#ncS= zt|*c3^~6$-Ss9#IsKIaFxqH)sUnNl669nn#IAVn_V!^*8Z*JwUO zuHg8xX7#e3SHd)NH1EatN(%swr|j*A3_nQy(hbGx^n>p<>C)5Y>25IS^=f9E`xZ4W zCz?G_!5TPU)x)MWQPgk>MIjbD1Rgc#k!~K1EK|42$-upH0t0nZV1XP@u*BD z1RS(IbgY^>nmgFmL3Va_HoRbc;rqhv-bXh8YGe+iy#6rwkErJ5H7p$IE0nnt*PIietJBHEdEYwD3K= zRUq#uQm=k-0lxxf4FKfDgNz6z2$l~+A>RHWU{CAq zp|E~QrB${r{8esCi*Ao~Co}j|>e7;IS{-$7MW(~Off6N+4x_+bGSB{#%cUhGzLYPy zV7T*sLctjc2}Ox?(!c;LYT(ci9h=o6vKs#=2o>^0RLcIEFeF?$C=*_2;7D6pRnVT^ za#V*a?zGX!Um+yegmi##q@wqyYGFqev$M0)*N4^eA$7H`^+qaPUCka}sdruEGeyGT z%Jhfb{!T0vd5r^@nHJnk7AWvh(e@aY!Uv=OxIaf9S231d`5B2s%8&Kl?S^ooj9SNo zWe>HQ(S_u~O=oeCAIZS>so~0$h_+BazbGLw(Ps**8=OWtH<*=aCr=FdQFr#>k}ADa zSxDPdFY4Q?+aP!6oh*RYwFTHjNzZF=l#Ir|W96Sd7&k62cK|*#{Igq}l#G;wijS{N zdu{cK+7J5Hi32d9j2g0jc}}JM2V#-KrlzHu0fBkBc^T)DXfZMAt2u%&!NjAovX)8B z1#S4G>9nX~%;R+9RemHwz*N0-Rw3P>R4k$j0N(-lHiWhb-vAi47EgEovdq^D{>!0~ zYMbizRQ}yk#zgvum6a%-i$?-(Co=#$8|G8K^2W&PI)VRQ!ZczZ!~dj z>d$EI9p07EaA_~ZZEvxEZJRCg!s;BbnNVOTbHX;3C%*zBd^ZC*jCmTuJ0d`P&X}hHT_4fExMQt`5kM$`xj8aTY%)QBWmWb%abvr&G zL0GykobbK1Ksyk4z`p8!+kWc)r(h;J5{c?TOd^IOSs_c1gzx9>Rso}8c}|t^=tyZH zoec#|FJ%n&o)BVv|MNd_k2w3vfOLjna}27!?ar5JdA>y%YUk{VT7eTuG-pOZOfiKT?>k~8QBGXOht?n-NoR<&VYyq}SmL$w+}`${P3}Iz z#vVY7Y7u8spT_grZY_Y0Rk}2HaiL#}1}WGT0`L=-1L0!p$Ycg`L_{1{OPh}$h4o-p z_04d;3b~jJB)=!aG7-33ino3f;j)z@O2_{iI<_nLvbRzi^f`LcD9a-Us^*HR6PhBx zhg5d~tvi-aC=Ob3Jagssdc264d0N}+nV%#|DD*dGtF_C`%bj9ozCB&q(~Ko;lI#%? zS5r%bX;cu!9DTnCPUnlq}F8w!8@-GtcaeajYhC*7K`x2(EVvErZfK@b&!LpC3wPday74!~Ao z>KE!;`@fsNe;ZvH^U@1#cM8t9iWL6``3ftqqMK$#yydbHVY&`v`iWK@Am;Cc(3Rq04=}$fb<@%qhup!W| z|AFwt1ZeGq0I)E^y-pu{Ptr}dWsC=r9(}Qej118kGfT&LmU-;PQe-w2Z1i7~jz$h# z@*~4!0Mvmf7+>Oy_~5Iy{4EkF%f@WFupqf7ujnn{IEGz_W0kiG#VL#s-3p? zj+K_aW5>1;&evWHB(7gy9*o}G3TOr7UEQi6mt~kT3APtm!XVrHCfF8o?BVcyuCh1u z%M23zKG*B8NNig4Y1Sh-zJn+*A15argLp|l#3IOg&$0#X-tQDr)(@{NOnkLTl4Ap> z?;DyB6)F1Y(5>WDTe8!Tp}d$z$63*6hY0wg+rph&LNht5fWALc*L&kVHizZu?fI+F z!q*;Ec}mE5H8&UjFo#cB;zC$RL|?>QBfWpKqNKvuwpqA_tEe0-hIGm@D$<4vW8=`& zEG;e71M?)FY(lpTQB!%xMR{f23`Lwh>!RVH^bp9k*o%RoPIO#sKkLe4P1S$n%`i{& z68(FV*}p04Szm`h$Keu-{+PVXJ~PicqY@_vnJy4Dtg=ZP6&VqPJg0nrpjia)dAsSf z2eO`cpFM_Z;S2!AA+K#mrl`dks9C@S{$6fMK`$&^%8x;~-zMib-$f9mz#(Pt%`OEZ zo85R$|RO7YB;F8{oB>T0o?3sjq zniA#M!o!*1(HOR0bN5MfqPwiu=A)>z`&d|So84)w#B}C<9FQ7SD6TX0 z?y{dwr?|h+Y8z6@KATIBk45f`^=d~XyV<8AGPWiDt~J6XLr)} zICiYg&iB%AE7Czp{iZj&%21q0EwYg3m*-3Dl4E+Jqh<8_>7CFixvHH$)!j-thH{i# zrF4=(!)1kBCJs>ut|X@jON^P@QRoiRV+6FS0!RbsGHHq{7@XzqQk@=K_G{VhI@lN$ zeToo(rSLsud`a4($mKXBD(HrU7j>qPwTZPKm@>=qKR9)vDpnnVNjGbqZC#YBC-Hm6 zd^M8SZrCbC(pCBF+fi$>&&w;p?F0XIt{{jeN$wl>5t%q*jUtFVUGcc(f3s`32t&7S z=J^6$MFMjH_iGjdivrY7Wm>5ALtCp2KQfe5ke(aR zLCbp0Gz%*8BA2&$z?s0EHzGKlevvp9ZLVX;of|1{HVPF}p@E~CD1q9V{h_{^uU#q) zPo&-G;Ao|St6*n{EtK@E%4Q__;{Gjp((mb_qs&MkYGB-zQXZ$Zzj8D}{wuWL#>BVI z8p5d~=gAtBu@Rd4yOSWi-KR@0yD_3zJgAg_vsVmhOPA}Xr+~}MwnIOBEe^S*@O~mM z{hL{4L7U{;VQt>mr!W?bp2++9F}p?$dH!n=F)=Rnm;Itl0JkF|j>p3lr}NqRwwi{l znF4%IZ*N=m7M7`B`uToQ)*nipoaH@7Hl7@&bbNf*PAzeJLdxTi?~glSI>KwEqrvSk z=o3%FDkc>QafFFeDGsInid%;L#DQO?07RqJg(oI8g;lT$;O78I!EsNEssoHuVbJsQrUQEk3 zI-$nwFy0r7J3`7Y{DbLX@IDGGGUHYRYfTop^uWbptHYPTY?g$B=T9eh+x|yQ7OxFn zNGWcY11Ay9tDoZ>yL-${Hq#i(8&4wkr%!NSyH4lh=BP+Wbf){Rv&9=UPikwGQCUGn zwuM@3+tvM9kliO$SsXUt$|zr)e>7;Ia;M8tnFmy&@RM_Bw_F^w^FMDv6fwW__Evgx ze9-H&AE+!TX*_*_VK=8%a3s$?02_jJH#XE-Z2)JCb?nr-10grWBn_J1Y#H_%{zh!(g==V8SD9Mv)lEGhvp@;fQ zf9?QV>>ul&@5N?CWZ&*+6Y%bJg<4c>9 zkI7a9bzcrEfmox2OaL4@SDQFY5I}=43if=f`%du`dV+fu`z0+SK~+<+xJ2}3(;N52 znpEy6X>VzIh!6mdGV+B@_t5w0;10Ml>|aT=v&*P)zm+$Qq^qMG=1F%^-&iSw_CnTB z9gRh1E30QT;1<$GU*lA;&CjdL)f~P(xDEB0Xh)8S#N#*%uX1MXaRRvCG`aVliQ6Zg z0cdCD=-n#25X%qilYPf$}#OkQ(x=ksPqI zwcSjY=J)q_$; zc~^r~2-V!st&vqxWjcFmyPByUg|a+V9<{Qi?9<6~ia6T=!qZ!qD!LG&YjO$t`dz%h z%LZ!J80FI+;v+7%cPWpT=!%k$U%LZ+cVBLzf{0w-h=g`^b@9J$zdl?aBGC37UwYl& zVaV4|lr(|$9hDjx8ad!IJGOkz_-h-85R1I$NItkzST64po;HHRFrQStR|?J{${bW0 zJ^Mb%?p7lOi6t0+F~p)3%`ei9s15k?zH2~J$o9&Zbz^$#1dfluY%ELq9V|f1H-LO` zLN;6bu55j<^kPUA@q(+I=L2`rRwXsghYd6ZUx^~UtKyGNYaYAOjP0wk2CO3I51N==LO;DzDuoBtql=;Af0H+eaG>7E z8EzvauM|de*H?tkMDw!*1^eD1O|!%!X4n0r2Vn|_xCg^glAf(kywLenF`H0klBELk z3F&;A?gv|vqlF;H@us!e8i>ge4ifVDXFmnpu0r$@2SKA2&_W}qycdAsbR4;&uP?*Q zbxC{oG3a+3ffRhQopZ59<&^6u(G-yVX+T6l^a0nChr@s0W04I3L7;0qZWwzz@g0V? z7o9(L28;Hmly5U-wRe2+k3FA&E>ZAS3n~^FaT$u5E#vx(Bu}QQogRuBh|xko>DX~1 z3H@87^MK~sFK{G^gF~9?2nZtQo;lAJ0~zpG-wp6aJ?>qz)cy>QC7;8eS9 zrRr=sRH~xAiGUC@$-x{?_*vjp+4>M5sm7D?I0XS^D=CVbV%OhO*0*ByqQ?tIr#$dg z)E}3*@b+*mtBoUZ$Ni-j_~Xa>loU;E4-dGT_0sIv`}ub$Ip!`}dQ%(kI;fgGKDWej(kS1V3UWf&V9i!!R^;%Ile}xIpMW$i=Qu7ot-9wF{BMOUPnH@ChP@`aqh`U;D^ok zUx<&zh80B~;wCV(R1_GpOZ~nqtX2BO1xz&^h>Q2nC@0__qjemrfI#$5+SSMDN#@nl z=kY-@*o~-DqGZ-CV(US;*=6hBFcYL7LVGu6Asc$>@SV$=JUzR>r4#^(1$)xVu9LMLa9*6ztwWvt)Jr$cMd0!7@ z^uG_`GAL~O|17N#DI_~$XHXW#%KI;d2tE4Ol2-4Q+;T(7^-%`GNpte5b2<%c#QXc= zgKZf48`TKY^B4Hzu5rpls z=Ge%n*l6t^Ov#t}K;3$7j5VL(ANgN4`4Lua(r2B6;a?ctg-O7**KGYifSU?LNIQ@h z>$4BDH*7ZLeJ`i$Br-d%;_xkuic&S&N+U*7aAloTFMD{x<`|T{Z!PLlmBuDOg^Gvx{nH%G6V9SII6``V(+so z0Ag-Lg7%t8AlEqB;G1NA@6j<;^S;IO5ILP>FWde?C7l^o)O-UL6>Jboftui=r7y#- zF2s+&pUyIyW&Z9<&;j%>MT|HphJ&zmM^lFP zj-ivRokt94A^TQ-$2yXn^YycsDB|NcBs#QZ}ZqUJjUGhMd8s_^~N1vH36Lv@OamOm}gU+u_$B=@YtivFPhL4*~T$XCR_ zUugV-w%UUXfAyc&6j^`D9A$UZ|EVSf_4`?!QxEl*JOToISM}eC1E@jh*~StI8xoin z3UXvf1{y8?Uy6vxe#+HY7$J4@ANuo3BPyiM*H*T!_0C_k(?6y__w2fVi}m;XRY^wP z|4kVPcFEuA{mr)d`s4mr{ceo6D3P$;p?>ne-4L|g;p^KdI^kcd(F%u93w461cwoN3 z_hUpdUs%G4(-JMJwHc&gxPBc>jND}A|KXTzf$S_(7H;Pz6>uJ-NLV3ax15Hq)$r-F zdX{bA{Z+IgvIWFw5!u+%2vTtk{f&IPQ*xDao!`Q&mnqA{+htVWHgz6s`tsFvg^6j{ zxG;HIVOg*_xiCbbLcZ=!A$d@$Y@m6hz+m|pu+u^D%j=8@Z;<%v=w<2cp?o?95hd2@nC)(xETDeu~Phg zxXZRuyQ!vWb9B3I7M$9aB;U7xGSzbqvl)@_|6ntTDL-jGze|oNscnvQX0+wCl2y`l0F?=esC#1GMn) zXNlIrS~|NtTM@m(v2;p<7gwADk)(%)wUpG^`S<6MNi7-Ei{|ZHeQ0rF#?3n3r;idM zO=SM`S4-KP%0J>SM=djmD}*D_qRO-{ZGrak9>WI}3?)%VNRl!Pl9$WlZg1iq{#|bq z1b?rGpV~%kDOQ0*L}(iM5zMbDn7(bVEHvXwtF3ziQ-JTIVQiH(A-8~(45wMA&BP1Z zU#||?LuM&H3L`7Ho!8ylZqa|XLkog;r#UZGI?$WWSIkxUwq(Yy2_7J1O zK}teEQ~YfqFsuXRswwuR^!qltf3dl1{YA@IVp=zpr$vn#R{zqfTj))&9Z}6Bb~rPYmXk`cC3Xp{Q7m4T!>mK`)^LUW$o9_egW9uX?sb(HZ1`C9++5*K zeHIWJVIJdOCoe}v`4H5Pg{HGfN-Ftj-QENils3ak;vx4Cxu6ZHIUZv9i)3LrlS?I&W*}lCHHV7iS=H(MBNw_3kPIqD`Yl1GG5)K=%%A*luL0Amwd{+z0v-{*}c@lvqQ_>akyAku%sL%S>T#P zqG@0ngjIU^o#AX)=hB0S( zyAYcigOYATLAAX;g+=k7nle>xgKx%2M>2YmqlOZ1kj}nbhe{=$BCsVq_Ft~5GSySQ z*SzRXQ60=ruT)-2x?R&}OTedEGL@$|{s~9&!btvaWLiqxF+_Q4CO~@|LH4d4l1l~= z8EBc@$9)zT+K!@9_vAOSZjuvnOhu7sF&%$Xv$>-#;Sm+ZK;g3_;^z4*BQkmnD!NDQ zL(zPsp3y$I?#*_JiWhEajk{aJ|L zhIQ)aBzN5z{DnNIugFT8WQ@@a z2U^P&mZfkJRxwgBHg-?_xV9Hsm9I-HU6$NOOW3NA@C2RawPFLiXTCiKw>lvzdELU= zAyv&%Q*~&w^6@0}cyL}{V=B`U#TFx5xxe|>09@eiHR5-;n643idMH98gxF9LFz4&2 z;>yOrEAsT|B~QiN8g=>v9`Sbzt1cmw7Lsir%iuu{#laBwaAHMQM5zX~JFQwEVnN4; z&9a>WFnyFwaCI&u%+2=7mP0f@b!1j|R3i?ELpb`y1!yg=JAU8D+w#&aYdgL!pDW~< z*1I{y9cP&_DnnAiel7q|5lvFh1%krvrq;SJCNm-Jy(+V(Fa6?0h^je3VE1Usi^ujB z-uF7b*(}tZwjGw+2B0g1`cabose*a}x+d^^3^gh@>buU5PjYdyW97& z=T3ep8udUSAj14z#m|&58MEPjIMS2Ahq@b&=g0GzGsiTvsF7Dz_Ew%zE74Oh8MA+} zXTHbOkE0M+kA;t`yYp|+1xK>_pyOhryX*ju-tmwI7#XrpOFcqu0UK?{(S`2b_at(l z*n_Uxr)_aKZWUI6p%d)9lIJ|C=TZ<32=+CyXs4N6(&&a z?rgljN4-==q4EmW;YMU6UXdu3uQHAIU{R_MyR|Q=P|n5Y$TZ0Z#_6iLqxkHbP>o;# zd6QoVue7|l)Z17P88C2f@aYR>JqUfN>lO?0n`XnIm)wJ&eqck>oI5IVA&+BRUJ{=9 z6rfl+BK>=@F;($1jfcF)x=9|k>fTKbO9oGfbdkz=M2TDL8FD;S)}HO$3%mvh=cq{WoRKT7E*?}s9(grRq^yn#iN>+u)R zGb80n(h^bN`Nx8X%Z*3GsrXjtGA+@bo=aa; zt5ImSYTd*7J;h916X_@=dQ%?0U7PeM+~9hP7M=>qx&{5hVV+CsH76OQOQW#|<=3sn zce76O`ni@2xoC}C-z`=}^px|2p3)I@JyS%O>RzBH64iQVCi>>TTI30zuO7})w?U_& zYtqgGB+8H)kyejs(;62!`~vX`5B$(F%85QaBaf79;wC5?VN@3PEDcd#3Tl-4tdR|I z&@g`0sbq>oO>owCyiC&qzEpV4Zig@Zi!1Em?+k^6=&aA0SU$B70$NTuI+sZVJ^kgu z#j}J=iXqP+3E@_m$%$A#aHW{#H1@J zR@*JV8oKqT-=%&vQ(Se6m`syO^-W&dX!-bA&dOX`&6|yaOZ{Q2#Nt#UZJ{sW92kOJ z`IKbDgSl55oW!W$RT5P%BrzX6UNqNYGc?W5QFgo{Ym~-5iTMos`8Dk%LkDA2W~tJf zLQ|$`X2`~6yZr(|*hS80m;(0WqR7qI#F7ZB_ziFMd|{v$Mlg9U>M^gh{&UBVosj(w z+;9jIT5N*v$MhxN;MDz@B~xO7@vTx3L&_ z?E1t+MVHNE%4&m%jhN4jMm9}M&CQF;OG+z%l(4?FeC`9UK58!!o2=v6U$pYb*kT|f zYEBmfY4V*<`^c(=`yJ)I(}7>w8j6cS|H%Xr=~N{|#;g5NdOKB!$M+6_!QX$&{*GfF ztUxMmX^}?NVK`_5JsU>cIfx|N?{kx$A9pi-G7n756jv+8{~_v~qATmVuI-9ZaVmDj zwryJ#t74lwwr$(Cor-PSw*P%UUwhkswh#B3bFQ|=?4w_On3utif$N!`hw%K<8rU-n z>Xf<{%mct4UZUlDYj7n_@ebIcMk;+)i?I<5I@{dp)_R!EDNErTH%$%^w;`c05L%Oz zkOT;+t7<5^7x!QO2YQHHxNsNN)!74aA2v@FcMZ-lTOB2$yA?KZ)C z911S3=Hl`VvzQ;=i0cw&oNYkRMW`JfFBVr`DDVzP^2>bU+}bmdn2wH(ifatrT)CYf zI42<0<=?`EhyHy)i^jy=Iy^{}HlZq{3Luxf#u|F|r7^IX%cdmox^RD0>eJuHK7;2f z7}Cv7^U}fz=5c&VC7(7aPE+KD%bLjiw9I~LMVUNiad{DFR9H~xs;R$&^Afl?*AVHt+NN(1(4&Kr*>^2d{#3uc%p7Fw)+WwU%aobKF9VUU&~`eXGw#LLW4&? z5FI}{g%A7Q8%9^HJH{81lLp=_!+TEFW~p7!jp_hR@Ty5kNrz2Q$zEb!^6J8=N|h^k zaRTrELJR`ehu~V34PBher%PSTm)0S!o3o==XAy{wIrmhwK#&`juguz9L@)Od@2Nny#_ z@843=QaESlyLQ%`Vg0}6ca)?`tv<6zY)q{qXknw#ahr|7eo4`=aW&fAl_bTi2j7?q z`Uo%7#BPg&%x%E&JM&bFsROKav@4mHu+-I+*Rg6w*@*c-ylKgCDS3d>LmlLYPI*m* ztgO7Pg#|kA_?mBE;onr>g+<`^#j2Lo_o@~990mjVIMTMVhMgwhzh^-Z5ee)S?l)-| z;>a z9a0+ASAI)ep0Ei@Y%Vlftx7(dmL`{xl(1%fQ(Dp*M42g6@lJrK^AMoKtxl7Tv?jQ` zNlN!{vEy2&VGV6EK;IX}0yA+6MG5aC;h(wRyVq{K6It*#)rC>0^)K}0B`|g6PsgS=y4YA?59Cd3TX%JJ zd;6H}?m^-K@E8N{i=ZGjb--VyE|*(meLxaue@EU>Sf?Zk3{^Z2?h6tKzzUY()lyQ84C4_7SR9>VW8R}n!;0Cd*f8O#4A#S-&Dp$ z+sU7nssErPX%+D=^{ZJ+^yC~78O!cqek;=8acif{WmBjk$EOI}qYR6Ut9j?gkcy!0+K36WX*Y-Be4YZW z<+U>l3>|cf1tYCOT29u*OZyy7 z9}wI_LH2Ids9vbf&N2c z$Nf#uBH}wLJR11@*(qWw|HWsdjG`?&$)BXAmf!B@WaXB1$$seE91|l++Br-{wN7De zW>Ib7bX`$dZSFJxU%FtBe#f;gF4fuW_@{nkQKhS3Lgx@cU!`!NQ;-&)`VxjIP2nTnjWbF{>vRfqJ+b?q&=rXa332pg3 zv0hLhYveXGLJovm8ZcJdU1`LC%|iT=x)N+O^t zxa-usojAXm9@CvlcbFOgITtuwd^8UqWe4^Y6QlU0Yd^6~S2M}zGtW_BZdK#+nkg^zn*OJ5yz{LCT6`xibeB%Uepb{O2)eEjcX9|r zQ^0q6Ft2CaacSk8NtfFQ7-htY$=}DFwOg4^bf0D)#<441fSs&TQ>)5<67rj95$AXlFy=RL?H^ty1-(%ojniy+E2xMY-T5=mFLW9 zez9j|Cta~#`ef<^-XPBwj+}t@HL^+O=P3pF&=^J*nXoCgL64waOW}2tyRT+p%?_c$+#&BPV!g-uAe+^VEK<5fd9m{!UCl1V-4Vcqu6Sz zPJPvM)ZZTl``gR8FBuw}{j(pD?9EY9rc`#sZ=QF-pXX)>|EC37L}K~*WnT+=`=0bJ+Q0FV7xE^ zDAEVf$aH;2DTun?`qMyhc`i6l!1{r$7HD)BZo61XX@pG&R5Z6K6fgOb2vj&+w^?kbWUN0 z>Q*rzfKNW3|A-@dmLb)CXW>woiO-QN^7WAv_3LqQjeXhXH#7=E<`e?U;_?8>PGu-Jba47TCk(A^i#tnZ*rb%#c-u<9YJ=<{)bALMaX)0JaTe)7 z2xnCaK9`u-h~MQw4Y6Uf40YYz^;i=1)*buQhx7gAdYzdm`n=sjC2}1-lB0cmI|#xS ziMZ_d4%a&5mXcbo(+|G@cDH(wLiY01E5otCudZ*0%?I_K$?G-J-Q+N%qz_ayRactV zZNK><0JD-_I*_mi42&}OUndC<8K+~bZ7|c5^S-W5_dxA}iNtQpb?qqFzfSmIZZpl- zWV&n*L>OkxT{pC+uayvZnjDJf(0cC=)g61peC^i9WV`LaxQuXLwHaM~aE`@q?#+`T z(tEfme-%ITd-9jWJQ$5%y3hkuTXR?ALlDq)xi2*tR)i_i(w}Cqb>Bv$)4dMu3YiNq zp#N~^CK_6^?Y!5XkrkSn>M)vatxc<6ZPr6L4C}hxzECO~yk}QssCT_bqu?1WRkd7y zm=h;TPG1ct9?y3e_Z63}tS}c95p>qK7MF)xn|P=#p*bE`eOeuERcRG#`wa9V7bLPt zJw|Y#qEvSS1XC6khTGc@YkHKt_P{U96so!lI@d4;ET|-~EVSg@(@}(Ej4ZUDr!z9k zZuR)zhaN&|oQj92qvC$SW@|r+2n5 zoL%&M&h<>;oOi`7TW>h+ zZI`NWHfnrKJg_@367{<88rqhpmT>o$Tc(VjH}(Diqa&S3NM;zxCsIRX;%D?AtR;{@ z6Q=ozHks;e+HJNlD%5SZ+aMh1QtfU@F<{y6nseB{uM1ogWuWn`>0+)vNHHMEPoS;LBNSk*TfJ~9=R4hgyoSSX12zLqksWhCXQYHGCZ zwo~NMvo4ZXt+(jCN!7IWs+#dKkra4~r&`Y@)%CdSKUS6|A=#%|^r}D~iN=sGLmg`O zpp&FaWrHI1CNjQf>!0VCn93rBSbriBe_fA?KQ1aY`LBhAg{A3q0D9gmS8g}IJM$>8 zTQ=R<3o&${Q?|mlJ? zgNqil=jM{A$Fg^Z2P^nmA>_0p6W-Hdi@@rlRqLG00@_Foxechg%?^pBOaBlbjhwqI zgme4HJG^&xZc)2h>#XWsTx_TpKakyawOnPFt<`n8F~+{|P?@JG==6J|qS2k~>)%Gw z(}J5@xqg9Xc}fU41CKyarNHSA(2$RRYVWOMBkB4LUP$y`Ea&wqrW-Z%X*UDe0l~(@ z&*w?#1n-N}p7(DLkulL8k4u*3-Q)YK9tVGIa_}F{393`U2`msVfDGj6JMjB?dn(_< zSebAJVKf{CLb_MI{e}ItG4It?o#zLOipcl6quNlT{c!V}N{ONzoEA(8+JFQOc2Usm zQ-#_Ox9G=uHkSJIN}~a4#`dZ+Jj7H9o>_U#$VKghOz6DZpVAA;Wxef=@7}X9=El8; z%8RW4$eyp15u^Qm!68fr2NG!1SbqIM3AcXty%|9y%9Xp`z_R(C&jVo!mrH-W9Cqus z^5-qZbk0MrHU@I9AXz8se^~S0jHcsj1c_|@(H(5I8!wmawc|nRQ(iu|J&_fQ@;8H8 zD)y1JR*qa5307-P(Qe||e5T1DxBg?Os5U(c{8ucK*lS&1GFcr{Xyz?~yQ2J3J)q+V zDc#-!h71-`ym!~d=KXNA``a$icZ-rO8Ja(kv(O%F zvBYh;wqSGGU(*E)3poQ?IA^ozyp8VIp*EusA#J|TV`Xo07@|LCKWr8yZOTcU&XVnGB~z28$%TP zWi!Bsik9+fjTYykOT{##^O7P#r|c2+0y;AX4|PR=XnB`>RPe zfu)``B%QC9*#>xvbBxUx2xDye@H;Kpi4Umx!FPR~B*gSBMf!GYVxpG*eLG|pi1&SS zwb}+j3E0);QwW4HBVh@ER*$gzU0F)P+608IU(7w&c5`Fr0;pc4B+ZCmMBHcXfSC&3 zFT3L8a+wMa_4V}*jw987Zu5q)1^Q2B3tX*bo4ipaa8l$tIz3~u0dJ4*N8|LrUX2b; zHs~lN3l|mWO-2=EWihU{niQIcM(#f0)w)Z`Ukw>&eMB@8eq%CF>t?l^9i@}LlYQCE zV(X3TuK9|a94A*|e~{t9iUt8Kp`pUIm8)Hrturb$W5k!gIU6wBE1;#2G}6AuI-!=b zdk9m0@vuu28AH=CpOW_%*kJx-{-e@k+e!?E!6|Z>{JorZ}4b%;{oObOG^5Z?Z__(&!n-3kXe6uN7%O&Ck zC8vKyjV*+zOgWo(r1ZVF8WTL2V6?PLnVC`!0K^Gspt6cEdwwKDsZ(jjb%X z82|k8f#Cpb68I{-Ae0Atlo-MY2L#++EH6(^f4%rj;Ax5)FI*0so4L^F?Wk}k+81WHit3_@8Xmt>?Xs_*e{UZu!;|$k#-mmNFX9MihDHv7@XPr*)K zfO$gDm^;&X^Lmic?N&7$HfwQxXXVRaSRIgSb$eK$-*O+fiCOD1N3~k3KME;h-(b;y zk;q%4?N78?e{(jXYn{Q$A>_0-YcJx^7@flOzC4)7{uGOz{=UE)(hHE##hLhbKM}XU z$lCpKPadX&npJlD&1!Fg>#(YD)*81)-qqeZc2t{$M+vyTYFS~LYJ54*?vZRLsHncJ z_}FzukBb@6ILs*CLD%#&fn8#V1Y$zr8>u!Ve_y&V z;9QB0=s@z`U1|P;J6%(EAQf!6wJQtF!bAxWr?|fQqmgs{Ku_)EYr5A@sEWL#LK~6y5U9Odq zoqe|$&HgFOu=Yw!PXvPIQuac1bKxrPlk3`jPPWu`bZl1Jc5ACDDQP=Oq?Yzhw5^p+ zUVoZWdX)m!vs`gtNxS`omBG?MtQFEh;Ca`kp)E z7V&lp=iA!rRrfD)L#A}L-Ji24mFbB6z#6oT^WR5Ha)hKEMxui<6^X^s(X#SsHNIv; zd|I!&?Ts9F&*5Kta)bIHPeHI_;R$EW!q zI14H}e=We5TVAZx7k%gURj32R`UTbsSvyQoF7H6x86$9$g|dD62b~AmHZOF#?uOKH zVHMy9St(yNrVnIsNla+ne>j1pniE*ap9S0LLfBfB=Cb{t7NE*_HJsOfmYGIn8zBtQ zQ6fR@l*p5MDNm=X7|Rw`NtM=lH!2>5zQ)7FE3cg@42vEie1^Bxh8j$QtBFQ-jaG$3 zTn-23`X2S8{vbJw^FI(x5t`QPV{O9?$!3Kb#3{$$|7=5ha_1lJn&i>-7OS44`D=Lt zZ*SU4-z<@#9VWm0z6=j{Xpq_U?X05Sb`K#nWnO#Ut$^a_Kiz)eLiQyq?UoultLU8q zM(35@x$-sMl5oKtg{S-qb$$A`M-kD*y87@dO37H1pOIMXWRz{vqOVv(0Rz7W#1R_S zFV|bFZ0+4^9p4^;z0`JcFF9QvUdCehGQ1C29Mp1qqWmQvozszXYx_@)x#Kgl6?MJR z@sZ$OV2haM@K#JL8pc_3ncY>rTyc>{E4p`q(; zgpt zh#dA2P4WiSqmPA*nikkmfTFht5aN{-_JZ9=!=eyiJm^G_gsty!9bjA(WH5; zTMGy{jejMK#wQE?H6oYIv=($S&6F520>}Y$y*1<5p3FBaztkDQrPMXTm2Momd^b+^ z6Tna9>zW?w>YMu!&K-e!TvOk8m;b$ZXpG#On_qw==4A!D2z&`VC`@$5@t)bvC^J80 z7%Ao~G9Kz5pM7-2B?ri5^VNAwrnF3VjhnRiJZ>J}H0f=FI6wABT{v-__GGdGT~UwD zI_)IVi+7nS*3|LI$zK_whzpC0Yq-(EP*3K~CdRG=2^r5%b3WAB$dxtVR(LE2xTano zqo^ZFqQ*pZ(kbHEUcqlpxV+jNKy{>|rYA1=Aot;tUqO-L%+gX%i$+Eb4FfT`9tCJj zD~<{l14p{u=s)-Zn!@6&wYA^)Y!Z(DboqR3V?Vj^wKA-4_MStV0i;}y|B`?xh$c$&(t?VjmWDx}+Eq(dF!vl7r5t>%w7YxS z-f6AVX+|ytW^*_dM6N5ewCM0rzn$NTpuFsEo-m<-FAZorAU-tneZ{5_csqeAlEu2m>RF z2WF0BWx*0`aPN7`BOox0w+4aBe(~x*H75CyTmQG^gPJxQ0&RfaUrLR8{d6iGPk9}P z_&~`Wr7Bn7QaxM`BL_`YR?2senWbF_+X)TO5wzzjIyW1Qwf@zPW;vMk0WZ$}6PdH{ z`q1Kz!4rw+DiCwc4xzol%ZQ&#G}yO~xqTO@ZtCZy$e;9T5eD33al$Q~=~+F_q_a?{ zeunCJ(;1}W@Q(G$(7X&XkCJ_kRmIl_g+mE}g2&UO(#h$Gt!A%R?+5c|T|WxVDD(Lv z$g(4XepGy&lUO6#Qc^2$Nx&f_cooPxoekoA)n?D|AGhgg!<-F29%EasvuARnH2a^$ zVdC6x1=H$ukWf{qJY~{+eRd50r0=3-BH|^!EGqJU?x=@6SmF-!L8wUwkb1F5%l#2Z zT4_{AxH6sX z8oj2Wsz}OO+?eJh7||GMb!claAI?mMy1c;-Ad33F?lo>xe|Qw?+4#FUA8nYPbi(hbP#eqYI#?W<|Ad~75F(IquU@IjV%Wv``G z&vTsfM0F}#NXyeRxyYj3;EjXve4Ow|qIzN$kF$`fz&+8CYo@lz3McXObjM8_Mvgzd zV|7o}p3E!oLh|Z;d1jNgdUqujty=ZMr;h!F>J%8m=f=;*X7llifq=^aJ_uU$L&tBg z17${B0C%;?=pCMY8cc`SXA_Z>bm$v!w73O$4}hx!%924)Pp23$W}yCO7|j%n9EOI5 zF5jJ5<>V~GP!jl!aG$XL<57-2Fqi62L7D45pBb_cuYAc}fne=y;Kh^N&DP5K_-6mU z841Ra?AsB_m$F>xd=WPrF9Hw=Wu@gw_iz_aBMZ90yxoBkNfHFH&&R;$AU1=osp(_4 z!8#Z%kH^D`do3Cf2tH*(={>lB8>dneF+ z=J}LZbJp`PPO+;35iOnwW0FW(_Mp(#6uvzuR0pS9gA0%E0nak9U}|RIv{(@rCLN(p zWN6)4chNkW85>l0?6^=T&FQkcKj`~Y0?4l(ERw48Jih_u*PF-c(c>X5T;R>(`)<^N z!fX2wBVZ+uM)5R*=mYx2WcjNjnXZJ}BE#HY!|Ep+BousO-ml^`6|-DH7QXjg=JacJ z$dNsET@pS&;SbkQt)92XO9fiw<=Ph;)6gBSwOzT#5!L{9H5#wsafZ4>oJGr)&RyU# zWXf-{_nvH(Tu3-WYvS4Ek%ET}FHMvssU zjR}jYprUs*HJ!)plMEDVIgBK89;E3G-U+HZT#sq-dS+BKv_mTUh}47e@$-4van{jt z-z;0ezw7GQ28|j>!=~@X2_kS;$~W@XXyog%j(_$~o(g#0x$@iN z72tsUbeW_>N|YdA0BPW+sMhw`W^)RM`{~^Hx{2anY0`KcDYReiv@()v^el-k>K<1r(;S9l+U;4No^j3QHXif zHWoKD#X}XHl&6EE*fFe6C^!&jux|gl!;<7u6FK)FltanCTniYa#C+EdwQe+BNTXFM<)z1L}tO#ryM?j`` z?hZrVOJWPKg_Gb2t4>3l0B~0d1lgT{EkOaVe3d@xHYcG=#BEu^M=CUVRy(ZC<~~a; zQ#-e^T$nw7o%!&+zyyUlFY9wkf8O25!@-LNfU{M4E?digEg2-Ve~-B)aROA6Mk7H^50Gj$JjmCP{=WhC*7i^NGh!Sn96COhlRHEJ(yro1#6Q~7Nf@b$I z)YW5u)AlJSR=7J|RWvlCsUEv$`3%FX+f`1$l6SL1FLWPrnAoa95(fQu``KAw;Q`1% z(4WGAY2KO#r#K|vf!Z3wg!zVgfgX-}SNcz`r~C-PYq#$qpCPWS0I`@=pqNQao~fs& z?zuP9$B3Z~9fDqtN3T}VDJsfNa)BccXJ~Pz_=EAYW;f=E4TsYY!N`Z$+8swG< zHZom+On$^+kIvxIdFArHNc}mD2b>Y6r}=i&5TW-46k#_RT@iGOgoOHfboD@+fE7V- zdY(55ruQ}dfKKRYn_0@AP9neszT4xSH<~Hc6#sKS?K&H0)-CX2{JNKsG!P8U&J;D6 z*EQ@8%=OAjOocOU{_Z^7U_6F-3p(l&l{p+DEfI$&$k>tbyi^a$|4Sle)ZlwyT6;Nsi>jlanRpu!$9CR4OF;Xfe~ujMeNNpP_fA#xO#aSr|0|F z_GH0?ib|<_?d97B71z|{df$uxaOS6AtIE6S<#T)ce3~nHz{lm&I?(wk+@sV5HW+=2 zN-rTJ1&RilK9>CPv5$C4v_`d4dK83VqM-NVcknMxuLtN3m_*Q!0q^n2{&|FRWdK)9 zkoW^ot!&+1Hkc6u7VlB`%uC{ov6`iV`(aAv0;}cV+4@E@Gtk)RU2?w!E(#3Da#2V- zOPv#4-UM#p^O6Sa{E&nLVvusGH0|DN#>U4_+=L8Pf}$|hA$ zf*_x0X{9DKA*f|Z1;MdMBZom;pcmn17*SE$e^u&9TVuNxba%Vl8K)3%d$cx^)S?~I z`q_^tc)_w5a73rjX3};dsl10Pw?h`Dw>#5x@wW6JnK(2P{`m*m2i8#hb4bOr41)}M z`bqL#Ae34VoINU}lUSfdVq7NBCLEdTE(ia1K-ALZ`VR6Im>VIqo#SV)+QcLNXWUU$ zcXc@+c`PVU{UDhJ=i@}!u>n?-c*5B7|FnRYvsLul17KuEo^-l{5S0PdKSDW>qTuGwp^nIMSq@xU??h{e2A7v3ayp;W zMY#%zeF0U$!@!Wg*P0%m<+;N%Ml`Dx*bKyK@5k_T8&(t7*L+*Y#vwFi3oEr{3Jo6~q}l zw$Gc*gNmBAanP63>n5_H>KMrE5N2MvpxR1xXW^nCY+gV)G`ksFGWz z%KvWhcl@5>AN`V)idOyI0z=PkUBD&;5{h;^8}*X?2jR79_b2-tYY%3LVw+?$BW@b<5X^_SiL?|prX%IJQ#?;5bl z;W{<6277EqCrBYacEkn6^lKj8gD<-_hc4glcKlfi6LIB!GNt9yuv_w&OAmL#eKWHQ zwl*;4qAI(H__{rr?mdZ$2H=6JmVfOHNJOJ|@i4t&yIHtY4%hpd(vHy@ldyv0CZ$t`UC#WgfFO*B$_ zr=hM}Br?MgK*b^DE04q~@XL2>Hx~>NVWrbJA_f3xWR{rFJoKbj5ZL)kS;sRHH3_kc z@{4*#Ti`_T!%)C%CK9ttt`Zu{q?d3&RfL{=ay9QnG&xq7H5#cLC(wQylatH!EvZ3Z z^M@i>_ti$X_1FVenYlH306(8AQ7Kx-y2A7Ca$% zk4Qs2v`;W6+)|kfx^p*x{niJvM)x!$?X5&ZIp3<;U{%M5`_bQ&|Jz18CmXE2`1^jG zb^3E}EGi^=>v0%rV%|;H*ipnIcQ^sovzi`uey`HUQ9>!^5^uIr83`2CrUs7bc8k^P0|;Z@}kdWqa{YqZT|He z`=KqD!-<{8@CvYR`EoIk6d2YgSm0UtVMYo=)H#YP_}$2i*>PwtZS?n~TBb&JH?+<= z>aeCOf2CpzAnv9bF5#i3X6P{1KCNa!^>_Swv);I7TF;gbb{-Q~1a9w?t3YI^h)WNGFq5UN9eWED};fEwbK#M#5k!4`u9ZGJQAM|ZXx7s4ZFP^ zd@ev7!L&FA{y~Q-UAQ)b&1%hI=wP&*eMl-`B$Id%3l8$L4d}{h-L1MjYr&>2`xoER z`Mmbc=Oyk=ZrL(X36$wnE1KAuw7lP=X&-2*OyG6ymd3}@0Pdsr7k)i@9oT&OnKWEq z2Mve~p8m~3+Y0OHGs}bcKw-_n>M9THJ<%B#cQnXMqaW@j5jY4u)Y2ew0@ELD6h+I097txxV`)okqhT6=X_}Ks86N3EU1&W(U5X z4+>ZyM?AkZU@v_RMoo3KK04r)Sv{}{$8Mz|$3kTE{_$#3KD@20^L6Qy*N=ojc z5Hi`Tt=ZigAA3K6F)Odf_tOIxYoxsUjKee^2j!}Il#ConCx{Q$ln+^CG*-QG63omU z{a03QiUbNVF?y3dQPqW*TvjK?dR~HqH~HZ;frxPHk{=-V-~GZNi4r;TJhvQ;ZTkC` zQn88+YIVFpA7v>zkgpe@sIlRM4f^|HE65hPVuXERn93_zk!|N$=oauGUx#$Qu(LJ$Lb+&vkKbwECq+`;)gBeo#=Ns8q)$R#0xysF?!@L z7Zkzv5v#ltk$m>XH`LLgZE@UHk|;Y9!G}#>_Ywc-%HAK`WcJsT(4)!BE(S65i5I>Q z&Q+L7rXtCg5_XsJ(41)50u5GNS`J0Xx{i)!5SQ1$>^32*xZI3i(Od%|jUJmBkPi~0 zl}h4PzhS_@rmzs@C9tt^BxhLeGk33tEAdy!WANq=e=?72teT(8r9g3R!;=*Kshc+O zijn`LEM+GpES|RscmEQ3fHori!Mb2rq#IA}%HObhLFyv7X+{_=^L3f{QFK0)#z#|R zN~M#JqOi_|2ePT06w#!jCp-MK056C^((vaI4c9{6$%mm2d&Z5 zqI%88MFV5O$V`gU$J18Oe|D2DseJblSQcMMWx|PeFxiU4Vk%NfsXEsPr7974vlg*{9K2U@cz0TJp_hCSkQCl;gQ)5gCLzYhm z9|9$Em)k=~;@j^Scf~cfk#6)f&A0??PCHPN{`UC^*4!`nW*GJNbZ<~-p*u`E;ZLRF z>t%z9f;hgRn@olK(yBF5s*F$BJ7uQ&v52N@`>*$}gFF99M2v*j{tlJ$@`}-`p$cUT z80_fWP9)Ccz!kUGB#QFjFo&4ZHJV%dU;MTx$RVXxL07yTN3NajwTgjM@mJRx=dHp%H>K4qbpNBkB<#Y0QVPHXcyhMc5N zJxM)Dry6)pfV?5@A%@1C%-lt6y|`NKH&ibma8WlYv8LpmU)ivdbQJi^GeSP$v9@N+2&3CYe4tuA(qrR&H}>}oDeH3T-e%k?t9rct~MT!iOBl)25xW1Vl9GGdJClu90T#Qp+D37Aby)tK92ktI74(9|{GRII5kqVkt{V-phG z1M~sxfZaOf#X|GnNFms)|CeUPoYdpeHGn#GtD*aPM1MMkn6$WT812Q|@Iim~>G}_b z3?|I0nJ?z;+IWpGj{#;IYIedqKxHa9j}co!TJa%nzC>#zO%Im7TyMfK4%qR$+HAmB z1lq1+o5eoIkg@|0N=(F&INUfhgIR>*tr&=jFY#lvzJGrFu@>HbS(!9WlJPG6O%q53 zq^b>pX$F+rzdO33%132r6*>xpi0Nyad5}6aq{i!;7g>1O&dg+a-ve~nR{3=nj-1(M zSGShhBd`rU$W*?ykM0Yb;ixw)QzQb$n#NKah5b*sYfuqB)XYDxB`I$0r=`}T=67mK z23sS}CYs+;>pC`VItF%OgD^~we~5t%4_aB~u7#j|=Ci^m5txJI%7PQigQMD@n&;$Z zh7;nUPQB~tW}$-P?Eu}l=f60bHWwEDMnn?U6F_C)mzLS?yk<{fnul^JjX4W+3>0fe zTrdDC*$aZoz8v@DbVVZSX8Fy()1MAxX zEo�zu+4-$Au(7>H~I+N;Z8D?6Waub4W{a@`)*99^XeUoOa7*i;eF_@Z$e}n3pqR z+bR!gb2B=5g6GO3KKNv4@j}`@}HS!z0_q?{SMNIVw2-;hvUp@D%Z zpB#i`6;;x*a_FjB>@^YdipvWRo2TL3Q>j-|seyF2$eA}C@>mSa89|7b4Gbg#puF^I zQ?@S`YEq|MKz;F_@){(wmQ04b(xE*;h53rQatV(UTVz4sN~UCYd|q8pV_SEbg|NNM z^vlUa>pwn8ZSfg%umLND)>s*RO1|o*DcO>1{o4PgpG1x8sF)sgfUHP1Bg00t0J2_W8+}w14G@b9p>Eq5ZJIe&kg?H-<}eZ z>vaP66ZV4ZpJ%6;>Ak4e(eNfC*{*0Way*^JZZqHA=l=nur0rGLF&~awL{(2kcjDTVoH+h zWisI69}z*F1Ty$+LV7wv3!?c?>@y401Z5yihI3XfX$szM(y(e#LG_qXdu?jEJ@CVp zh+O}FGsoZxi(PA~%5GVL2oGXxTbA0_+9g7G8HtF59+VL^Vu>0!b#9thGwX0EpuT|(5Wwk50&EQV(9h=BF7%B0|YcmRZ zYI9PyV7#7otnK=t%JcKUy#fwS0A^-=`D&3-ca)4DmQmO?9O~GlP)}jmI*PE~%X*o% zIqov1Pws{~lX2zems3xt(lQKo=VSq(e*YHQAp*gc%AD8Gbx=yD|5rD+dmLObYxfFa z+IAI<91t**^kHId{F>Gd1mQ9pBABPp&519!lzknZ4qWdVlZ*@+d31xFk_U0iqHyo= zb%?dvzv1@H+^(n9`u8{)ZOys!0$7;MUZysAgB$W<`UzsmVoLJzb|1ih+3J_1e|udp_vqEMq!*UWC6HfET2 z?qE+nd26biCWhkV6;bGbebL4u2T!8DXdeYZ=1y4pN6ghIg$cqr%$=H*udj+!J}?g+ zBqk=t*_ent7d1FDs#m2dkBG0q(lvU2TuQDZ5DCB3i7*snh7~wIXJ`=Go_$PeyrN=l z2-`2XeJ!}*QEjLjmE;c#f1r@SNN8W**AdG*?OJ>yUl#hFM{ToxC!$e??BtzrY<)t0 zGccP5lIv*gzNlGv7sTMu!^p~68;+W-tN2tV+57hBeRwahwg{D6⪙^E6D*J7|5}j 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 Oc=Ay90qVZZoBsl8uS7He literal 0 HcmV?d00001 diff --git a/docs/reviews/assets/biz-compare-legacy.png b/docs/reviews/assets/biz-compare-legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..a374dee0715c0d9d41cb11878676c7feef81211f GIT binary patch literal 89658 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 literal 0 HcmV?d00001 diff --git a/docs/reviews/assets/biz-compare-memory-benchmark.json b/docs/reviews/assets/biz-compare-memory-benchmark.json new file mode 100644 index 0000000..70290b7 --- /dev/null +++ b/docs/reviews/assets/biz-compare-memory-benchmark.json @@ -0,0 +1,29 @@ +{ + "date": "2026-10-10", + "baseline_ref": "afa8e06b2de64100f963ae30b3babfcb5d7009f4", + "python": "3.14.3", + "dataset": { + "rows_per_side": 1000000, + "fields": ["id", "neighbor", "state", "afi"], + "strata": 50, + "unchanged_limit": 5000, + "compact_unchanged": true, + "interface_transforms": false, + "all_rows_unchanged": true + }, + "measurement": "tracemalloc peak allocated during compare_rows; excludes input allocations, DB loading and process overhead", + "results": [ + { + "engine": "baseline", + "peak_engine_mib": 1144.43, + "seconds_with_tracemalloc": 92.4 + }, + { + "engine": "optimized", + "peak_engine_mib": 420.49, + "seconds_with_tracemalloc": 63.681 + } + ], + "results_and_sample_order_identical": true, + "test_result": "1 passed in 157.88s" +} diff --git a/docs/reviews/assets/biz-compare-narrow.png b/docs/reviews/assets/biz-compare-narrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f6f316a574d77c66575f8a42b1152b25426794a7 GIT binary patch literal 89146 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 literal 0 HcmV?d00001 diff --git a/docs/reviews/biz-compare-review-2026-10-10.md b/docs/reviews/biz-compare-review-2026-10-10.md new file mode 100644 index 0000000..f3150e1 --- /dev/null +++ b/docs/reviews/biz-compare-review-2026-10-10.md @@ -0,0 +1,120 @@ +# 业务对比检查与优化记录 + +检查日期:2026-10-10。范围:网络管理 → 割接对比 → 业务对比,包括前端任务/批次/结果界面、Python 与 PostgreSQL 对比路径、结果分页与搜索、短期列表缓存。 + +本次直接修改项目代码并添加回归测试,没有连接设备执行采集,也没有修改生产数据库。浏览器截图与交互测试使用固定 API 响应。 + +## 已修复的问题 + +### 1. 搜索会改变业务判定(P1) + +原实现分别按搜索条件过滤割接前、后的原表,再重新对比。例如 `state=up → down`,搜索 `up` 后只剩前侧,原本的“变化”就可能变成“删除”。重复身份键的业务还可能在筛选后错位配对。 + +现在:已存储的判定直接在结果表分页筛选;需要回查未保存全量明细的成功行时,先找到候选身份键,再补齐两侧的完整分组,按原有配对规则对比,最后筛选。达到读取上限的分组整体跳过,并返回截断标记,避免产生虚假的新增或删除。 + +### 2. PostgreSQL 搜索漏用部分模板过滤条件(P1) + +原搜索只下推 SQL 支持的过滤规则,对 `age_timer` 等不支持的规则直接忽略,可能将静态 ARP 等不属于模板范围的数据纳入结果。现在不支持下推的规则走流式读取并在 Python 中完整过滤。 + +### 3. 快速切换时旧请求覆盖当前任务(P1) + +前后采集任务的批次列表、打开任务、加载历史结果以及轮询缺少完整的过期保护。现在对批次请求使用清理标记,对任务与结果使用请求序号;关闭弹窗、切换路由或打开其他任务后,旧响应不能覆盖当前界面。 + +### 4. 结果加载错误容易被误读(P2) + +原查询失败时保留上一组明细,界面已经显示新筛选条件;切到未完成的表后,加载状态也可能无法结束。现在加载和失败都有独立状态,错误时清除旧明细并提供重试入口;切换表/页签后清理加载状态。 + +### 5. LLDP 搜索漏查(P2) + +LLDP 数据存于 `biz_state_lldp_neighbor`,原搜索只读 `biz_state_metric_row`。现在原表回查与精简结果的字段搜索都支持 LLDP 表。 + +### 6. 其他已修复边界 + +- 恰好命中读取上限时,原非 PostgreSQL 路径错误地报告“已截断”;现在多读一条判断。 +- 无效或有歧义的表标识可能落到其他表;现在返回 `sheet_not_found`。 +- `%`、`_` 等搜索字符按字面值匹配,避免不同查询路径含义不一致。 +- 关闭最后一项检查后,空数组被解释为“启用全部”;现在阻止关闭最后一项并提示至少保留一项。 +- 两个 HeroUI Input 使用了 `isDisabled`,实际需要 `disabled`;过滤值与容差输入的禁用状态已修正。 +- 列表缓存缺少并发合并,慢请求可以覆盖强制刷新结果或在失效后重新填充缓存;现在共享请求、保护失效状态并抑制过期的后台通知。 +- 清理中英文文案中的重复键,解决相关类型检查错误。 + +## 性能改动与实际收益范围 + +- 合并两套轮询,下一轮在本轮请求完成后启动。模拟浏览器测试中,运行任务在 5.2 秒内请求历史列表和详情各两次,没有重复轮询,也不会因慢请求持续叠加。 +- 已保存的失败、新增、变化等结果在数据库中筛选并分页,避免每次翻页重新加载和对比原始批次。回归测试明确验证这一查询路径不调用 `compare_rows`。 +- 同一前后采集任务的批次请求共用短期缓存,列表后台刷新合并同一请求;6 项缓存测试覆盖并发、强制刷新、失败重试与失效竞态。 +- 模板查找使用 Map,避免列表搜索与绘制逐项线性查找模板。 +- 修改筛选后先回到第一页,避免先请求旧页码再重复请求第一页。 + +这些改动减少了重复工作。以下后续基准使用合成数据,没有测量生产环境延迟。 + +## 后续优化(2026-10-10) + +### 历史执行配置与精简行还原 + +新运行在创建时将模板、启用的检查项、字段规则/过滤、接口归一化、端口映射、成功行保存策略和名称存入 `summary_json.config_snapshot`。后台执行、成功行回查、精简行还原以及导出共用该配置;排队之后修改配置,甚至删除原模板/映射,也不会改变这一运行使用的配置。无需数据库结构迁移。 + +修复了精简存储明细还原时将 `mapped_before` 直接设为原始 `before` 的问题。现在前侧依次归一化和映射,后侧归一化,保持与完整结果的显示及 CSV 一致。ZIP 新增 `config_snapshot.json`,便于核对当时配置;详情接口只返回快照模板与版本,不将完整端口映射加入轮询响应。 + +页面显示“执行配置已保存”;旧记录显示“旧记录:未保存执行配置”。旧运行无法可靠补造当时的配置,仍保留兼容查询,成功行回查及精简行还原会使用当前配置。快照也不保存原始采集行的副本,若原始批次数据被清理,依赖行 ID 的还原仍会缺少内容。 + +### Python 大表内存 + +成功样本按“层内序号、层首次出现顺序”排序,只保留样本上限内的候选和分层状态,避免先积累全部成功行。保留原分层轮询顺序;未截断的小表仍保持采集顺序。不需要接口变换时复用输入行;有变换时创建新行,不修改输入数据。稳定身份键顺序直接使用分组字典,省去再次计算全表键、额外键列表与集合。 + +每侧 1,000,000 行、50 个邻居分层、全部成功、保存 5,000 条精简样本的测试:优化前引擎新增分配峰值 **1144.43 MiB**,优化后 **420.49 MiB**,下降约 **63.3%**。完整结果与样本顺序的 SHA-256 一致。开启 `tracemalloc` 时耗时为 92.400 秒和 63.681 秒;该计时含内存追踪开销,不代表生产耗时。输入行在追踪开始前创建,峰值不包含输入行、数据库加载或 Python 进程的总内存。 + +基线为 `afa8e06b2de64100f963ae30b3babfcb5d7009f4` 中的对比引擎。原始指标见 [百万行测试结果](assets/biz-compare-memory-benchmark.json)。身份键分组仍需要随原表行数增长的内存;这次不是完全流式对比。 + +### 大表导出 + +导出改为按 `(seq, id)` 游标分批查询、分批还原精简行、逐行将 UTF-8 CSV 写入 ZIP,避免将全部明细与完整 CSV 同时保存在内存。相同 `seq` 的多条结果按 `id` 连续读取,不漏掉跨批次的同行序号记录。保留 BOM、字段顺序及逗号/引号/换行转义。最终压缩包仍由现有接口在内存中返回,压缩文件本身的大小仍计入内存。 + +## UI 改动 + +结果区分为当前检查项/全表通过率、结果类型、搜索与辅助操作三层。增加明确的分页范围、清空筛选、加载状态、错误重试和搜索无结果提示。筛选按钮增加按下状态,字段筛选增加展开状态与键盘焦点提示。后续增加了执行配置保存状态及旧记录限制提示。 + +窄屏检查项导航改为紧凑的横向排列,避免一个检查项占据整行的大块区域。浏览器检查覆盖 1440px、768px、390px;筛选栏没有横向溢出。结果表保留必要的横向滚动。 + +- [桌面结果区](assets/biz-compare-desktop.png) +- [768px 结果区](assets/biz-compare-narrow.png) +- [加载失败与重试](assets/biz-compare-error.png) +- [旧记录执行配置提示](assets/biz-compare-legacy.png) + +## 验证 + +- Python:87 项通过,1 项百万行基准默认跳过;单独启用百万行基准后通过。新增测试覆盖搜索、历史配置快照、有界抽样与游标导出。 +- 缓存:6 项 Node 测试通过。 +- 浏览器:10 个场景通过,包括配置保存状态、旧记录提示、结果布局、错误清除旧明细、重试、清空筛选、窄屏布局、旧任务响应保护、单套轮询、无运行时异常。 +- Vite 生产打包成功。 +- 本次业务对比页面的类型错误已经修复。全项目 `tsc -b` 仍被 `BizStatePage.tsx`、`BizMigrationPage.tsx` 中原有的类型/未使用变量错误阻塞。 +- 页面 ESLint 原有 34 个错误,主要是 `any` 与现有 React Hook 写法;本次未增加错误。结果请求依赖警告已修正。缓存模块没有 lint 错误。 +- PostgreSQL 路径验证了 SQL 编译与规则降级分支,没有在真实 PostgreSQL 数据库上执行查询或测量执行计划。 + +可重复执行的检查: + +```powershell +# 项目根目录 +.venv\Scripts\python.exe -m pytest tests/test_biz_state_compare_export.py tests/test_biz_state_compare_snapshot.py tests/test_biz_state_compare_memory.py tests/test_biz_state_compare_search.py tests/test_biz_state_compare.py tests/test_biz_state_compare_sql.py tests/test_biz_state_compare_recovery.py -q + +# 可选:百万行基准,耗时约数分钟,内存占用较大 +$env:NETX_BENCH_ROWS = '1000000' +$env:NETX_BENCH_REF = 'afa8e06b2de64100f963ae30b3babfcb5d7009f4' +.venv\Scripts\python.exe -m pytest tests/test_biz_state_compare_memory.py::test_memory_benchmark_against_git_baseline -q -s +Remove-Item Env:NETX_BENCH_ROWS, Env:NETX_BENCH_REF + +# web 目录 +node --experimental-strip-types --test tests/cutoverDataCache.test.mjs +node node_modules/vite/bin/vite.js build +node node_modules/typescript/bin/tsc -b +``` + +浏览器脚本为 `web/tests/bizCompare.browser.mjs`。先启动本地 Vite 服务,再设置 `NETX_PLAYWRIGHT_MODULE` 为可用的 Playwright 包路径;`NETX_TEST_URL` 默认是 `http://127.0.0.1:5179`,浏览器默认使用已安装的 Chrome。所有 `/v1` 请求由脚本提供固定响应,不会访问实际设备或数据库。 + +## 后续值得优化的部分 + +1. **Python 大表分组。** 有界抽样和冗余复制优化已完成,百万行基准下降约 63% 的引擎新增分配峰值。分组与输入仍随原表规模增长;进一步降低内存可研究排序流式配对或分区执行,并保持重复键配对语义。 +2. **PostgreSQL 搜索与深分页。** JSON 字段包含搜索和精确总数统计仍可能扫描大量结果。需要用真实数据查看 `EXPLAIN (ANALYZE, BUFFERS)`,再决定常用字段索引、搜索文本索引或游标分页;本次没有盲目添加生产索引。 +3. **历史配置与原始数据保留。** 新运行的执行配置快照已完成。旧运行仍无法还原未记录的当时配置;精简结果还原依赖原批次行,后续可为批次清理增加引用保护或保留策略。 +4. **重复键的业务语义。** 引擎按采集顺序配对同键行。如果业务应按集合判断,CLI 行顺序改变可能产生多条“不一致”。当前保留原有语义;可优先完善身份键,或另行实现并测试 Python/SQL 一致的集合匹配。 +5. **原表回查的数量上限。** 每侧候选命中最多 2000 条,完整分组补齐每侧预算 10000 条,最终展示最多 200 对;这不是全表匹配总数。界面会提示截断,大范围检索需要收窄条件。 diff --git a/netx_api/biz_state/compare_engine.py b/netx_api/biz_state/compare_engine.py index 3871cc4..5957d79 100644 --- a/netx_api/biz_state/compare_engine.py +++ b/netx_api/biz_state/compare_engine.py @@ -2,8 +2,10 @@ from __future__ import annotations -from collections import defaultdict, deque -from typing import Any, Mapping, Sequence +from collections import defaultdict +from heapq import heappush, heapreplace +from itertools import chain +from typing import Any, Iterable, Mapping, Sequence from .compare_rules import field_rule_map, values_equal, explain_diff from .iface_normalize import ( @@ -28,36 +30,52 @@ def stratum_key(row: Mapping[str, Any] | None) -> str: return "|".join(parts) if parts else "_" -def stratify_take(items: list[Any], limit: int, *, key_fn) -> list[Any]: - """Round-robin across strata so one neighbor/direction cannot consume the whole sample.""" - lim = max(0, int(limit)) - if lim <= 0 or not items: +class _StratifiedSample: + """Keep the first N round-robin ranks in O(N) space, even with many strata.""" + + def __init__(self, limit: int) -> None: + self.limit = max(0, int(limit)) + self.count = 0 + self.strata: dict[str, tuple[int, int]] = {} + self.heap: list[tuple[int, int, int, Any]] = [] + + def add(self, item: Any, key: str) -> None: + serial = self.count + self.count += 1 + if not self.limit: + return + state = self.strata.get(key) + if state is None: + # Later strata cannot beat the first item of N earlier strata. + if len(self.strata) >= self.limit: + return + index, round_n = len(self.strata), 0 + else: + index, round_n = state + self.strata[key] = (index, round_n + 1) + entry = (-round_n, -index, serial, item) + if len(self.heap) < self.limit: + heappush(self.heap, entry) + elif entry[:2] > self.heap[0][:2]: + heapreplace(self.heap, entry) + + def picked(self) -> list[Any]: + # The legacy helper preserves encounter order when no truncation occurs. + if self.count <= self.limit: + entries = sorted(self.heap, key=lambda e: e[2]) + else: + entries = sorted(self.heap, key=lambda e: (-e[0], -e[1])) + return [entry[3] for entry in entries] + + +def stratify_take(items: Iterable[Any], limit: int, *, key_fn) -> list[Any]: + """Round-robin across strata without retaining every candidate.""" + sample = _StratifiedSample(limit) + if not sample.limit: return [] - if len(items) <= lim: - return list(items) - buckets: dict[str, deque[Any]] = defaultdict(deque) - order: list[str] = [] - for it in items: - sk = str(key_fn(it) or "_") - if sk not in buckets: - order.append(sk) - buckets[sk].append(it) - out: list[Any] = [] - while len(out) < lim and buckets: - drained: list[str] = [] - for sk in order: - q = buckets.get(sk) - if not q: - drained.append(sk) - continue - out.append(q.popleft()) - if len(out) >= lim: - break - for sk in drained: - buckets.pop(sk, None) - if sk in order: - order = [x for x in order if x != sk] - return out + for item in items: + sample.add(item, str(key_fn(item) or "_")) + return sample.picked() def apply_port_map( @@ -198,10 +216,10 @@ def compare_rows( before_norm = apply_iface_normalize_rows( before_rows, iface_fields=iface_list, rules=norm_rules - ) + ) if norm_rules and iface_list else before_rows after_norm = apply_iface_normalize_rows( after_rows, iface_fields=iface_list, rules=norm_rules - ) + ) if norm_rules and iface_list else after_rows ignore_ports = False # No map → optionally ignore port renames by dropping iface from match key. @@ -216,9 +234,16 @@ def compare_rows( match_keys = list(key_fields) else: # Auto heuristic (legacy default) - before_c = [row_key(r, candidate) for r in before_norm] - after_c = [row_key(r, candidate) for r in after_norm] - if len(before_c) == len(set(before_c)) and len(after_c) == len(set(after_c)): + def unique_keys(rows: list[dict[str, Any]]) -> bool: + seen: set[tuple[str, ...]] = set() + for row in rows: + key = row_key(row, candidate) + if key in seen: + return False + seen.add(key) + return True + + if unique_keys(before_norm) and unique_keys(after_norm): match_keys = candidate ignore_ports = True else: @@ -226,15 +251,12 @@ def compare_rows( else: match_keys = list(key_fields) - before_mapped: list[dict[str, Any]] = [ - apply_port_map(r, iface_fields=iface_list, port_map=pmap) for r in before_norm - ] - before_groups: dict[tuple[str, ...], list[tuple[dict[str, Any], dict[str, Any]]]] = ( defaultdict(list) ) after_groups: dict[tuple[str, ...], list[dict[str, Any]]] = defaultdict(list) - for orig, mapped in zip(before_rows, before_mapped): + for orig, norm in zip(before_rows, before_norm): + mapped = apply_port_map(norm, iface_fields=iface_list, port_map=pmap) if iface_list else norm before_groups[row_key(mapped, match_keys)].append((orig, mapped)) for r in after_norm: after_groups[row_key(r, match_keys)].append(r) @@ -246,6 +268,7 @@ def compare_rows( multi_before_keys: list[tuple[str, ...]] = [] multi_after_keys: list[tuple[str, ...]] = [] unchanged_candidates: list[tuple[dict[str, Any], dict[str, Any], dict[str, Any]]] = [] + sample = _StratifiedSample(limit_n) if include_unchanged and limit_n is not None else None def _key_obj(row: dict[str, Any]) -> dict[str, Any]: return {f: row.get(f, "") for f in key_fields} @@ -294,18 +317,7 @@ def compare_rows( ) # Stable key order: before encounter order, then after-only keys - seen_keys: set[tuple[str, ...]] = set() - ordered_keys: list[tuple[str, ...]] = [] - for orig, mapped in zip(before_rows, before_mapped): - k = row_key(mapped, match_keys) - if k not in seen_keys: - seen_keys.add(k) - ordered_keys.append(k) - for r in after_norm: - k = row_key(r, match_keys) - if k not in seen_keys: - seen_keys.add(k) - ordered_keys.append(k) + ordered_keys = chain(before_groups, (k for k in after_groups if k not in before_groups)) for k in ordered_keys: b_list = before_groups.get(k) or [] a_list = after_groups.get(k) or [] @@ -377,17 +389,14 @@ def compare_rows( else: unchanged += 1 if include_unchanged: - unchanged_candidates.append((orig, mapped, after)) + if sample is not None: + if sample.limit: + sample.add((orig, mapped, after), stratum_key(mapped)) + else: + unchanged_candidates.append((orig, mapped, after)) - if include_unchanged and unchanged_candidates: - if limit_n is None: - picked = unchanged_candidates - else: - picked = stratify_take( - unchanged_candidates, - limit_n, - key_fn=lambda t: stratum_key(t[1]), - ) + if include_unchanged: + picked = sample.picked() if sample is not None else unchanged_candidates for orig, mapped, after_row in picked: _append_unchanged_diff(orig, mapped, after_row) diff --git a/netx_api/biz_state/compare_service.py b/netx_api/biz_state/compare_service.py index e11b551..43e097b 100644 --- a/netx_api/biz_state/compare_service.py +++ b/netx_api/biz_state/compare_service.py @@ -8,13 +8,14 @@ import logging import threading import time import zipfile +from copy import deepcopy from datetime import datetime -from typing import Any, Callable +from typing import Any, Callable, Iterable, Iterator from uuid import uuid4 from fastapi import HTTPException -from sqlalchemy import and_, or_ -from sqlalchemy.orm import Session +from sqlalchemy import String, and_, cast, func, or_, tuple_ +from sqlalchemy.orm import Session, aliased from ..models import ( BizCompareDiff, @@ -29,7 +30,7 @@ from ..models import ( BizStateTask, ) from ..timeutil import utcnow_naive -from .compare_engine import compare_rows, mapping_stats +from .compare_engine import apply_port_map, compare_rows, mapping_stats, row_key from .compare_rules import ( ROW_FILTER_PRESETS, apply_row_filters, @@ -193,6 +194,7 @@ _FAIL_COMPACT_MIN = 50_000 # Live search (kw): load at most this many matching rows per side, return ≤ this many pairs. _LIVE_SEARCH_LOAD_CAP = 2_000 _LIVE_SEARCH_RESULT_CAP = 200 +_LIVE_SEARCH_GROUP_LOAD_CAP = 10_000 # Success-row persist policy (see resolve_unchanged_policy) _STORE_UNCHANGED_MODES = frozenset({"auto", "always", "never", "sample", "keys"}) _UNCHANGED_FULL_MAX = 20_000 @@ -269,7 +271,7 @@ def _strip_netx(row: Any) -> dict[str, Any]: return {k: v for k, v in row.items() if k != "_netx"} -def _diff_search_text(d: dict[str, Any]) -> str: +def _diff_search_text(d: dict[str, Any], *, limit: int | None = _SEARCH_TEXT_MAX) -> str: parts = [str(d.get("kind") or "")] for key in ("key", "before", "after", "mapped_before", "changes"): val = d.get(key) @@ -278,7 +280,8 @@ def _diff_search_text(d: dict[str, Any]) -> str: parts.append(json.dumps(val, ensure_ascii=False, default=str, separators=(",", ":"))) except Exception: parts.append(str(val)) - return " ".join(parts)[:_SEARCH_TEXT_MAX] + value = " ".join(parts) + return value if limit is None else value[:limit] def _top_changed_fields(diffs: list[dict[str, Any]], *, limit: int = 8) -> list[dict[str, Any]]: @@ -422,7 +425,10 @@ def _metric_rows_by_ids(db: Session, ids: list[str]) -> dict[str, dict[str, Any] return out -def _hydrate_diff_rows(db: Session, items: list[dict[str, Any]]) -> list[dict[str, Any]]: +def _hydrate_diff_rows( + db: Session, items: list[dict[str, Any]], *, + run: BizCompareRun | None = None, sheet: dict[str, Any] | None = None, +) -> list[dict[str, Any]]: """Fill empty before/after from metric tables when row_ids are present.""" need: list[str] = [] for it in items: @@ -433,16 +439,24 @@ def _hydrate_diff_rows(db: Session, items: list[dict[str, Any]]) -> list[dict[st if not need: return items by_id = _metric_rows_by_ids(db, need) + pmap, norm_rules = _run_transform_config(db, run) if run else ({}, []) + iface_fields = list((sheet or {}).get("iface_fields") or []) for it in items: brid = str(it.get("before_row_id") or "") arid = str(it.get("after_row_id") or "") if not it.get("before") and brid and brid in by_id: it["before"] = by_id[brid] if not it.get("after") and arid and arid in by_id: - it["after"] = by_id[arid] - # Success compact: no mapped_before stored — UI falls back to before + it["after"] = apply_iface_normalize_rows( + [by_id[arid]], iface_fields=iface_fields, rules=norm_rules, + )[0] if not it.get("mapped_before") and it.get("before"): - it["mapped_before"] = dict(it["before"]) + normalized = apply_iface_normalize_rows( + [it["before"]], iface_fields=iface_fields, rules=norm_rules, + )[0] + it["mapped_before"] = apply_port_map( + normalized, iface_fields=iface_fields, port_map=pmap, + ) return items @@ -471,6 +485,7 @@ def _filter_inline_diffs( *, kind: str, kw: str, + field_q: dict[str, str] | None = None, ) -> list[dict[str, Any]]: kind_n = (kind or "diff").strip().lower() kw_n = (kw or "").strip().lower() @@ -484,13 +499,62 @@ def _filter_inline_diffs( elif kind_n != "all" and dk != kind_n: continue if kw_n: - blob = _diff_search_text(d).lower() + blob = _diff_search_text(d, limit=None).lower() if kw_n not in blob: continue + if field_q and not _diff_matches_search(d, kw="", field_q=field_q): + continue out.append(d) return out +def _diff_matches_search(d: dict[str, Any], *, kw: str, field_q: dict[str, str]) -> bool: + """Search a completed pair, never filter its two sides before pairing.""" + if kw and kw.lower() not in _diff_search_text(d, limit=None).lower(): + return False + return all( + any( + val.lower() in str((d.get(side) or {}).get(name, "")).lower() + for side in ("key", "before", "mapped_before", "after") + ) + for name, val in field_q.items() + ) + + +def _search_stored_diffs(q: Any, *, metric_id: str, kw: str, field_q: dict[str, str]) -> Any: + """Filter persisted verdicts in SQL; join source rows for compact payloads.""" + from ..models import BizStateMetricRow + + sides = [BizCompareDiff.key_json, BizCompareDiff.before_json, + BizCompareDiff.mapped_before_json, BizCompareDiff.after_json] + sources = [] + for row_id in (BizCompareDiff.before_row_id, BizCompareDiff.after_row_id): + model = BizStateLldpNeighbor if metric_id == "lldp_neighbor" else BizStateMetricRow + src = aliased(model) + q = q.outerjoin(src, src.id == row_id) + sources.append(src) + if kw: + expressions = [BizCompareDiff.search_text, *[cast(s, String) for s in sides]] + for src in sources: + if metric_id == "lldp_neighbor": + expressions.extend(getattr(src, f) for f in + ("local_if", "remote_sys", "remote_if", "remote_ip", "protocol")) + else: + expressions.append(cast(src.data_json, String)) + q = q.filter(or_(*[func.lower(e).contains(kw.lower(), autoescape=True) for e in expressions])) + for name, val in field_q.items(): + expressions = [s[name].as_string() for s in sides] + for src in sources: + if metric_id == "lldp_neighbor": + if name in ("local_if", "remote_sys", "remote_if", "remote_ip", "protocol"): + expressions.append(getattr(src, name)) + else: + expressions.append(src.data_json[name].as_string()) + q = q.filter(or_(*[func.lower(cast(e, String)).contains(val.lower(), autoescape=True) + for e in expressions])) + return q + + def _sheet_meta_from_summary(summary: dict[str, Any], run: BizCompareRun, tpl: Any) -> list[dict[str, Any]]: sheets = list(summary.get("sheets") or []) if sheets: @@ -2193,6 +2257,18 @@ def _create_running_run( ) -> BizCompareRun: first_metric = str(sheets_cfg[0].get("metric_id") or "") pending_sheets = [_pending_sheet_meta(s) for s in sheets_cfg] + mapping = db.get(BizPortMapping, job.mapping_id) if job.mapping_id else None + config_snapshot = deepcopy({ + "version": 1, + "template": _template_out(tpl), + "sheets": sheets_cfg, + "port_map": _port_map_dict(db, str(job.mapping_id or "")), + "store_unchanged": normalize_store_unchanged(getattr(job, "store_unchanged", None)), + "job_name": job.name or "", + "before_task_id": job.before_task_id or "", + "after_task_id": job.after_task_id or "", + "mapping_name": (mapping.name if mapping else "") or "", + }) run = BizCompareRun( id=uuid4().hex, job_id=job.id, @@ -2203,6 +2279,7 @@ def _create_running_run( metric_id=first_metric, status="running", summary_json={ + "config_snapshot": config_snapshot, "progress": { "phase": "queued", "sheet_index": 0, @@ -2232,6 +2309,26 @@ def _create_running_run( return run +def _run_config_snapshot(run: BizCompareRun) -> dict[str, Any] | None: + snapshot = (run.summary_json or {}).get("config_snapshot") + if isinstance(snapshot, dict) and snapshot.get("version") == 1: + return snapshot + return None + + +def _run_transform_config( + db: Session, run: BizCompareRun, +) -> tuple[dict[str, str], list[dict[str, str]]]: + snapshot = _run_config_snapshot(run) + if snapshot is not None: + return dict(snapshot.get("port_map") or {}), normalize_iface_rules( + (snapshot.get("template") or {}).get("iface_normalize_rules") or [], + ) + # Legacy runs did not record these settings; retain their fallback behavior. + tpl = db.get(BizCompareTemplate, run.template_id) if run.template_id else None + return _port_map_dict(db, str(run.mapping_id or "")), template_iface_normalize(tpl) + + def _set_run_progress( db: Session, run: BizCompareRun, @@ -2309,14 +2406,15 @@ def _execute_compare_into_run(db: Session, run_id: str) -> dict[str, Any]: run = db.get(BizCompareRun, run_id) if not run: raise HTTPException(status_code=404, detail="run_not_found") + snapshot = _run_config_snapshot(run) j = db.get(BizCompareJob, run.job_id) if not j: run.status = "failed" run.message = "job_not_found" db.commit() raise HTTPException(status_code=404, detail="job_not_found") - tpl = db.get(BizCompareTemplate, run.template_id) - if not tpl: + tpl = db.get(BizCompareTemplate, run.template_id) if snapshot is None else None + if not tpl and snapshot is None: run.status = "failed" run.message = "template_not_found" db.commit() @@ -2324,25 +2422,25 @@ def _execute_compare_into_run(db: Session, run_id: str) -> dict[str, Any]: before_batch_id = str(run.before_batch_id or "") after_batch_id = str(run.after_batch_id or "") - sheets_cfg = _filter_enabled_sheets( - template_metrics(tpl), getattr(j, "enabled_sheet_ids", None) - ) + if snapshot is not None: + sheets_cfg = deepcopy(snapshot.get("sheets") or []) + else: + sheets_cfg = _filter_enabled_sheets(template_metrics(tpl), getattr(j, "enabled_sheet_ids", None)) if not sheets_cfg: run.status = "failed" run.message = "no_enabled_sheets" db.commit() raise HTTPException(status_code=400, detail="no_enabled_sheets") - sheets_cfg = _order_sheets_small_first( - db, - sheets_cfg, - before_batch_id=before_batch_id, - after_batch_id=after_batch_id, - ) + if snapshot is None: + sheets_cfg = _order_sheets_small_first( + db, sheets_cfg, before_batch_id=before_batch_id, after_batch_id=after_batch_id, + ) started_mono = time.monotonic() - store_mode = normalize_store_unchanged(getattr(j, "store_unchanged", None)) - pmap = _port_map_dict(db, run.mapping_id) - norm_rules = template_iface_normalize(tpl) + store_mode = normalize_store_unchanged( + snapshot.get("store_unchanged") if snapshot is not None else getattr(j, "store_unchanged", None), + ) + pmap, norm_rules = _run_transform_config(db, run) unchanged_listed_total = 0 unchanged_truncated_any = False unchanged_compact_any = False @@ -2636,6 +2734,8 @@ def _execute_compare_into_run(db: Session, run_id: str) -> dict[str, Any]: }, "sheets": sheet_metas, } + if snapshot is not None: + summary_payload["config_snapshot"] = snapshot run = db.get(BizCompareRun, run_id) or run if str(run.status or "") == "cancelled": return get_run(db, run.id) @@ -2842,7 +2942,7 @@ def _csv_cell(v: Any) -> str: return s -def _sheet_csv(sheet: dict[str, Any]) -> str: +def _sheet_csv_lines(sheet: dict[str, Any], diffs: Iterable[dict[str, Any]]) -> Iterator[str]: keys = list(sheet.get("key_fields") or []) key_set = set(keys) compare = [f for f in list(sheet.get("compare_fields") or []) if f not in key_set] @@ -2861,8 +2961,8 @@ def _sheet_csv(sheet: dict[str, Any]) -> str: headers.append(f"{f}__post") else: headers.append(f) - lines = [",".join(_csv_cell(h) for h in headers)] - for d in list(sheet.get("diffs") or []): + yield ",".join(_csv_cell(h) for h in headers) + for d in diffs: kind = str(d.get("kind") or "") pre = dict(d.get("mapped_before") or d.get("before") or {}) post = dict(d.get("after") or {}) @@ -2887,8 +2987,11 @@ def _sheet_csv(sheet: dict[str, Any]) -> str: row.append(pre.get(f, "")) else: row.append(post.get(f, pre.get(f, ""))) - lines.append(",".join(_csv_cell(x) for x in row)) - return "\ufeff" + "\n".join(lines) + "\n" + yield ",".join(_csv_cell(x) for x in row) + + +def _sheet_csv(sheet: dict[str, Any]) -> str: + return "\ufeff" + "\n".join(_sheet_csv_lines(sheet, sheet.get("diffs") or [])) + "\n" def _enrich_summary(summary: dict[str, Any], sheets: list[dict[str, Any]]) -> dict[str, Any]: @@ -3001,8 +3104,13 @@ def get_run(db: Session, run_id: str) -> dict[str, Any]: r = db.get(BizCompareRun, run_id) if not r: raise HTTPException(status_code=404, detail="run_not_found") - tpl = db.get(BizCompareTemplate, r.template_id) if r.template_id else None summary = dict(r.summary_json or {}) + snapshot = _run_config_snapshot(r) + tpl = db.get(BizCompareTemplate, r.template_id) if r.template_id and snapshot is None else None + template_out = ( + deepcopy(snapshot.get("template")) if snapshot is not None + else (_template_out(tpl) if tpl else None) + ) raw_sheets = _sheet_meta_from_summary(summary, r, tpl) # Never return full diffs in run detail (million-row safe) sheets = [ @@ -3023,22 +3131,31 @@ def get_run(db: Session, run_id: str) -> dict[str, Any]: ] enriched = _enrich_summary(summary, raw_sheets) stored = "rows" if _run_has_diff_rows(db, run_id) else "inline" - job = db.get(BizCompareJob, r.job_id) if r.job_id else None - mapping = db.get(BizPortMapping, r.mapping_id) if r.mapping_id else None + job = db.get(BizCompareJob, r.job_id) if r.job_id and snapshot is None else None + mapping = db.get(BizPortMapping, r.mapping_id) if r.mapping_id and snapshot is None else None before_side = _compare_side( - db, r.before_batch_id, fallback_task_id=(job.before_task_id if job else "") + db, r.before_batch_id, fallback_task_id=( + snapshot.get("before_task_id", "") if snapshot is not None else (job.before_task_id if job else "") + ), ) after_side = _compare_side( - db, r.after_batch_id, fallback_task_id=(job.after_task_id if job else "") + db, r.after_batch_id, fallback_task_id=( + snapshot.get("after_task_id", "") if snapshot is not None else (job.after_task_id if job else "") + ), ) return { "id": r.id, "job_id": r.job_id, - "job_name": (job.name if job else "") or "", + "job_name": ( + snapshot.get("job_name", "") if snapshot is not None else ((job.name if job else "") or "") + ), "template_id": r.template_id, - "template_name": (tpl.name if tpl else "") or "", + "template_name": (template_out or {}).get("name") or "", "mapping_id": r.mapping_id, - "mapping_name": (mapping.name if mapping else "") or "", + "mapping_name": ( + snapshot.get("mapping_name", "") if snapshot is not None else ((mapping.name if mapping else "") or "") + ), + "config_snapshot_version": snapshot["version"] if snapshot is not None else None, "before_batch_id": r.before_batch_id, "after_batch_id": r.after_batch_id, "before": before_side, @@ -3052,7 +3169,7 @@ def get_run(db: Session, run_id: str) -> dict[str, Any]: "mapping_stats": r.mapping_stats_json or {}, "message": r.message, "created_at": r.created_at.isoformat() + "Z" if r.created_at else None, - "template": _template_out(tpl) if tpl else None, + "template": template_out, } @@ -3152,13 +3269,17 @@ def _field_qf_sql(field_q: dict[str, str], *, prefix: str = "qf") -> tuple[str, for i, (name, val) in enumerate(field_q.items()): sf = _safe_field(name) key = f"{prefix}_{i}" - params[key] = f"%{val.lower()}%" + params[key] = _literal_search_pattern(val) parts.append( f"lower(trim(both from coalesce(data_json->>'{sf}', ''))) LIKE :{key}" ) return "(" + " AND ".join(parts) + ")", params +def _literal_search_pattern(value: str) -> str: + return "%" + value.lower().replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_") + "%" + + def _load_metric_rows_for_search( db: Session, *, @@ -3188,7 +3309,9 @@ def _load_metric_rows_for_search( lim = max(1, min(int(cap), _LIVE_SEARCH_LOAD_CAP)) filters = [f for f in (row_filters or []) if isinstance(f, dict)] - if _dialect_is_postgres(db): + if mid != "lldp_neighbor" and _dialect_is_postgres(db) and ( + not filters or _filters_sql_compatible(filters) + ): filter_sql, filter_params = ("TRUE", {}) if filters and _filters_sql_compatible(filters): filter_sql, filter_params = compile_row_filters_sql(filters) @@ -3202,7 +3325,7 @@ def _load_metric_rows_for_search( **qf_params, } if needle: - params["kw"] = f"%{needle.lower()}%" + params["kw"] = _literal_search_pattern(needle) search_parts.append(_kw_match_sql(key_fields)) search_sql = " AND ".join(f"({p})" for p in search_parts if p and p != "TRUE") if not search_sql: @@ -3246,20 +3369,21 @@ def _load_metric_rows_for_search( return out, truncated # Non-PG / fallback: scan with early stop (OK for tests / small sheets) - q = ( - db.query(BizStateMetricRow) - .filter( - BizStateMetricRow.batch_id == bid, - BizStateMetricRow.metric_id == mid, - ) - .order_by(BizStateMetricRow.seq.asc(), BizStateMetricRow.id.asc()) - ) + model = BizStateLldpNeighbor if mid == "lldp_neighbor" else BizStateMetricRow + q = db.query(model).filter(model.batch_id == bid) + if mid == "lldp_neighbor": + q = q.order_by(model.id.asc()) + else: + q = q.filter(model.metric_id == mid).order_by(model.seq.asc(), model.id.asc()) out = [] truncated = False needle_l = needle.lower() key_set = [str(k).strip() for k in key_fields if str(k).strip()] for r in q.yield_per(500): - data = dict(r.data_json or {}) + data = ( + {f: getattr(r, f) for f in ("local_if", "remote_sys", "remote_if", "remote_ip", "protocol")} + if mid == "lldp_neighbor" else dict(r.data_json or {}) + ) row = { **data, "_netx": { @@ -3297,14 +3421,75 @@ def _load_metric_rows_for_search( if not hit: db.expunge(r) continue - out.append(row) db.expunge(r) if len(out) >= lim: truncated = True break + out.append(row) return out, truncated +def _load_search_key_groups( + db: Session, *, batch_id: str, metric_id: str, keys: set[tuple[str, ...]], + match_keys: list[str], iface_fields: list[str], row_filters: list[dict[str, Any]], + norm_rules: list[dict[str, str]], port_map: dict[str, str], +) -> tuple[list[dict[str, Any]], set[tuple[str, ...]]]: + """Complete candidate key groups so a one-sided search cannot change verdicts. + + Interface transforms run in Python. Other identity fields narrow the SQL + query. If the load budget is exceeded, omit entire groups rather than compare + partial groups and manufacture additions/deletions. + """ + from ..models import BizStateMetricRow + + model = BizStateLldpNeighbor if metric_id == "lldp_neighbor" else BizStateMetricRow + invariant = [f for f in match_keys if f not in iface_fields] + positions = [match_keys.index(f) for f in invariant] + coarse = sorted({tuple(k[i] for i in positions) for k in keys}) + out: list[dict[str, Any]] = [] + complete: set[tuple[str, ...]] = set() + # Bound memory even when a candidate identifies a very large duplicate group. + budget = _LIVE_SEARCH_GROUP_LOAD_CAP + for start in range(0, len(coarse), 100): + group = coarse[start:start + 100] + group_set = set(group) + target = {k for k in keys if tuple(k[i] for i in positions) in group_set} + q = db.query(model).filter(model.batch_id == batch_id) + if metric_id == "lldp_neighbor": + q = q.order_by(model.id.asc()) + else: + q = q.filter(model.metric_id == metric_id).order_by(model.seq.asc(), model.id.asc()) + if invariant: + exprs = [func.trim(func.coalesce( + cast(getattr(model, f) if metric_id == "lldp_neighbor" + else model.data_json[f].as_string(), String), "")) for f in invariant] + q = q.filter(tuple_(*exprs).in_(group)) + rows = q.limit(budget + 1).all() + if len(rows) > budget: + for r in rows: + db.expunge(r) + # No partial verdicts. Later groups may still fit the remaining budget. + continue + budget -= len(rows) + complete.update(target) + for r in rows: + data = ( + {f: getattr(r, f) for f in ("local_if", "remote_sys", "remote_if", "remote_ip", "protocol")} + if metric_id == "lldp_neighbor" else dict(r.data_json or {}) + ) + row = {**data, "_netx": {"row_id": r.id}} + db.expunge(r) + if row_filters and not all(row_matches_filter(row, f) for f in row_filters): + continue + normalized = apply_iface_normalize_rows( + [row], iface_fields=iface_fields, rules=norm_rules, + )[0] + mapped = apply_port_map(normalized, iface_fields=iface_fields, port_map=port_map) + if row_key(mapped, match_keys) in target: + out.append(row) + return out, complete + + def _live_search_sheet_diffs( db: Session, run: BizCompareRun, @@ -3316,7 +3501,7 @@ def _live_search_sheet_diffs( page: int, page_size: int, ) -> dict[str, Any]: - """Search before/after metric tables, zip-compare, filter by kind tab.""" + """Find candidate keys, complete both sides, then compare and filter pairs.""" mid_src = str(sheet.get("metric_id") or "").strip() sid = sheet_key(sheet) key_fields = list(sheet.get("key_fields") or []) @@ -3328,7 +3513,7 @@ def _live_search_sheet_diffs( ) row_filters = list(sheet.get("row_filters") or []) # Older runs may lack row_filters on sheet meta — fall back to template - if not row_filters and run.template_id: + if "row_filters" not in sheet and _run_config_snapshot(run) is None and run.template_id: tpl = db.get(BizCompareTemplate, run.template_id) if tpl: for s in template_metrics(tpl): @@ -3363,9 +3548,7 @@ def _live_search_sheet_diffs( ignore_ports = sheet.get("ignore_port_changes") if ignore_ports is not None: ignore_ports = bool(ignore_ports) - pmap = _port_map_dict(db, str(run.mapping_id or "")) - tpl = db.get(BizCompareTemplate, run.template_id) if run.template_id else None - norm_rules = template_iface_normalize(tpl) + pmap, norm_rules = _run_transform_config(db, run) before_rows, trunc_b = _load_metric_rows_for_search( db, @@ -3385,6 +3568,31 @@ def _live_search_sheet_diffs( kw=free_kw, field_q=merged_q, ) + match_keys = list((sheet.get("summary") or {}).get("match_key_fields") or key_fields) + if ignore_ports is True and not pmap: + match_keys = [f for f in key_fields if f not in iface_fields] or key_fields + keys: set[tuple[str, ...]] = set() + for rows, mapping in ((before_rows, pmap), (after_rows, {})): + for row in apply_iface_normalize_rows(rows, iface_fields=iface_fields, rules=norm_rules): + keys.add(row_key(apply_port_map(row, iface_fields=iface_fields, port_map=mapping), match_keys)) + before_rows, complete_b = _load_search_key_groups( + db, batch_id=str(run.before_batch_id or ""), metric_id=mid_src, keys=keys, + match_keys=match_keys, iface_fields=iface_fields, row_filters=row_filters, + norm_rules=norm_rules, port_map=pmap, + ) + after_rows, complete_a = _load_search_key_groups( + db, batch_id=str(run.after_batch_id or ""), metric_id=mid_src, keys=keys, + match_keys=match_keys, iface_fields=iface_fields, row_filters=row_filters, + norm_rules=norm_rules, port_map={}, + ) + complete = complete_b & complete_a + def keep_complete(rows: list[dict[str, Any]], mapping: dict[str, str]) -> list[dict[str, Any]]: + normalized = apply_iface_normalize_rows(rows, iface_fields=iface_fields, rules=norm_rules) + return [orig for orig, norm in zip(rows, normalized) if row_key( + apply_port_map(norm, iface_fields=iface_fields, port_map=mapping), match_keys, + ) in complete] + before_rows = keep_complete(before_rows, pmap) + after_rows = keep_complete(after_rows, {}) result = compare_rows( before_rows=before_rows, after_rows=after_rows, @@ -3394,17 +3602,19 @@ def _live_search_sheet_diffs( port_map=pmap, field_rules=field_rules, iface_normalize_rules=norm_rules, - ignore_port_changes=ignore_ports, + ignore_port_changes=(match_keys != key_fields) if not pmap else False, include_unchanged=True, unchanged_limit=None, compact_unchanged=False, ) kind_n = (kind or "diff").strip().lower() filtered = [ - d for d in list(result.get("diffs") or []) if _kind_allows(kind_n, str(d.get("kind") or "")) + d for d in list(result.get("diffs") or []) + if _kind_allows(kind_n, str(d.get("kind") or "")) + and _diff_matches_search(d, kw=free_kw, field_q=merged_q) ] # Cap pairs returned to keep UI snappy - truncated = bool(trunc_b or trunc_a or len(filtered) > _LIVE_SEARCH_RESULT_CAP) + truncated = bool(trunc_b or trunc_a or complete != keys or len(filtered) > _LIVE_SEARCH_RESULT_CAP) filtered = filtered[:_LIVE_SEARCH_RESULT_CAP] total = len(filtered) start = (page - 1) * page_size @@ -3452,10 +3662,17 @@ def list_run_diffs( sheets = _sheet_meta_from_summary(summary, r, tpl) asked = (metric_id or "").strip() sheet = _lookup_sheet(sheets, asked) if asked else (sheets[0] if sheets else None) + if asked and sheet is None: + raise HTTPException(status_code=404, detail="sheet_not_found") mid = sheet_key(sheet) if sheet else (asked or str(r.metric_id or "")) - # Unified search: kw and/or field filters → live source lookup; kind tab only filters. - if (kw_n or field_q) and sheet: + # Only reconstruct missing success rows. Persisted verdicts must stay stable + # while searching and avoid loading/recomparing source tables on every page. + sheet_summary = (sheet or {}).get("summary") or {} + success_missing = int(sheet_summary.get("unchanged") or 0) > int( + sheet_summary.get("unchanged_listed") or 0 + ) + if (kw_n or field_q) and sheet and kind_n in ("all", "unchanged") and success_missing: return _live_search_sheet_diffs( db, r, @@ -3480,6 +3697,9 @@ def list_run_diffs( q = q.filter(BizCompareDiff.kind == "changed") elif kind_n != "all": q = q.filter(BizCompareDiff.kind == kind_n) + if kw_n or field_q: + q = _search_stored_diffs(q, metric_id=str((sheet or {}).get("metric_id") or mid), + kw=kw_n, field_q=field_q) total = q.count() rows = ( q.order_by(BizCompareDiff.seq.asc(), BizCompareDiff.id.asc()) @@ -3487,7 +3707,7 @@ def list_run_diffs( .limit(size_n) .all() ) - items = _hydrate_diff_rows(db, [_diff_row_out(x) for x in rows]) + items = _hydrate_diff_rows(db, [_diff_row_out(x) for x in rows], run=r, sheet=sheet) return { "total": total, "page": page_n, @@ -3505,7 +3725,7 @@ def list_run_diffs( inline = list((sheet or {}).get("diffs") or []) if not inline and mid == r.metric_id: inline = list(r.diffs_json or []) - filtered = _filter_inline_diffs(inline, kind=kind_n, kw="") + filtered = _filter_inline_diffs(inline, kind=kind_n, kw=kw_n, field_q=field_q) total = len(filtered) start = (page_n - 1) * size_n page_items = filtered[start : start + size_n] @@ -3520,44 +3740,53 @@ def list_run_diffs( } -def _iter_sheet_diffs(db: Session, run_id: str, metric_id: str) -> list[dict[str, Any]]: - """Load all diffs for one sheet (export). Prefer row table; fall back to inline. +def _iter_sheet_diffs(db: Session, run_id: str, metric_id: str) -> Iterator[dict[str, Any]]: + """Stream one sheet using a stable (seq, id) cursor; fall back to inline. Compact success rows are hydrated in chunks from metric tables. """ + r = db.get(BizCompareRun, run_id) + if not r: + return + tpl = db.get(BizCompareTemplate, r.template_id) if r.template_id else None + sheets = _sheet_meta_from_summary(dict(r.summary_json or {}), r, tpl) + sheet = next((s for s in sheets if sheet_key(s) == metric_id), None) if _run_has_diff_rows(db, run_id): - out: list[dict[str, Any]] = [] - offset = 0 + cursor: tuple[int, str] | None = None while True: - rows = ( - db.query(BizCompareDiff) - .filter(BizCompareDiff.run_id == run_id, BizCompareDiff.metric_id == metric_id) + q = db.query(BizCompareDiff).filter( + BizCompareDiff.run_id == run_id, BizCompareDiff.metric_id == metric_id, + ) + if cursor is not None: + seq, diff_id = cursor + q = q.filter(or_(BizCompareDiff.seq > seq, and_( + BizCompareDiff.seq == seq, BizCompareDiff.id > diff_id, + ))) + rows = (q .order_by(BizCompareDiff.seq.asc(), BizCompareDiff.id.asc()) - .offset(offset) .limit(_DIFF_CHUNK) .all() ) if not rows: break - chunk = _hydrate_diff_rows(db, [_diff_row_out(x) for x in rows]) - out.extend(chunk) - offset += len(rows) + chunk = _hydrate_diff_rows(db, [_diff_row_out(x) for x in rows], run=r, sheet=sheet) + cursor = (rows[-1].seq, rows[-1].id) + yield from chunk if len(rows) < _DIFF_CHUNK: break - return out - r = db.get(BizCompareRun, run_id) - if not r: - return [] + # Release the previous chunk before loading the next one. + del rows, chunk + return summary = dict(r.summary_json or {}) sheets = list(summary.get("sheets") or []) for sh in sheets: if sheet_key(sh) == metric_id or ( str(sh.get("metric_id") or "") == metric_id and sheet_key(sh) == metric_id ): - return list(sh.get("diffs") or []) + yield from sh.get("diffs") or [] + return if metric_id == r.metric_id: - return list(r.diffs_json or []) - return [] + yield from r.diffs_json or [] def export_run_zip(db: Session, run_id: str) -> bytes: @@ -3586,14 +3815,17 @@ def export_run_zip(db: Session, run_id: str) -> bytes: f"+{card.get('added')}/-{card.get('removed')}/~{card.get('changed')}/= {card.get('unchanged')}" ) zf.writestr("manifest.txt", "\n".join(manifest) + "\n") + run = db.get(BizCompareRun, run_id) + snapshot = _run_config_snapshot(run) if run else None + if snapshot is not None: + zf.writestr("config_snapshot.json", json.dumps(snapshot, ensure_ascii=False, indent=2)) for sheet in list(detail.get("sheets") or []): sid = sheet_key(sheet) or "sheet" safe = "".join(ch if ch.isalnum() or ch in "-_." else "_" for ch in sid)[:80] or "sheet" - sheet_full = { - **sheet, - "diffs": _iter_sheet_diffs(db, run_id, sid), - } - zf.writestr(f"tables/{safe}.csv", _sheet_csv(sheet_full)) + with zf.open(f"tables/{safe}.csv", "w", force_zip64=True) as csv_file: + csv_file.write(b"\xef\xbb\xbf") + for line in _sheet_csv_lines(sheet, _iter_sheet_diffs(db, run_id, sid)): + csv_file.write((line + "\n").encode("utf-8")) sum_lines = ["metric_id,mode,before,after,added,removed,changed,unchanged,diff_count,pass_rate"] for card in list(s.get("sheet_cards") or []): sum_lines.append( diff --git a/tests/test_biz_state_compare_export.py b/tests/test_biz_state_compare_export.py new file mode 100644 index 0000000..d176c40 --- /dev/null +++ b/tests/test_biz_state_compare_export.py @@ -0,0 +1,87 @@ +"""Export must page lazily, keep tied sequence rows, and produce valid UTF-8 CSV.""" + +from __future__ import annotations + +import csv +import io +import unittest +import zipfile +from unittest.mock import patch + +from sqlalchemy import create_engine, event +from sqlalchemy.orm import Session + +from netx_api.biz_state.compare_service import _iter_sheet_diffs, export_run_zip +from netx_api.db import Base +from netx_api.models import BizCompareDiff, BizCompareRun + + +class CompareExportTests(unittest.TestCase): + def setUp(self): + self.engine = create_engine("sqlite+pysqlite:///:memory:") + Base.metadata.create_all(self.engine) + self.db = Session(self.engine) + self.sheet = {"sheet_id": "sheet", "metric_id": "test", "key_fields": ["id"], + "compare_fields": ["note"], "display_fields": ["id", "note"], + "summary": {"unchanged": 7}, "status": "done"} + self.run = BizCompareRun(id="run", metric_id="test", status="success", + summary_json={"sheets": [self.sheet]}) + self.db.add(self.run) + for seq, ids in ((0, "cba"), (1, "ed"), (2, "gf")): + for rid in ids: + note = '中文, "quoted"\nsecond line' + self.db.add(BizCompareDiff(id=rid, run_id="run", metric_id="sheet", seq=seq, + kind="unchanged", key_json={"id": rid}, + before_json={"id": rid, "note": note}, + after_json={"id": rid, "note": note})) + self.db.commit() + + def tearDown(self): + self.db.close() + self.engine.dispose() + + def test_cursor_handles_tied_sequence_numbers_across_chunks(self): + statements = [] + def record(_conn, _cursor, statement, _parameters, _context, _executemany): + if "ORDER BY biz_compare_diff.seq" in statement: + statements.append(statement) + event.listen(self.engine, "before_cursor_execute", record) + with patch("netx_api.biz_state.compare_service._DIFF_CHUNK", 2): + iterator = _iter_sheet_diffs(self.db, "run", "sheet") + self.assertEqual(statements, []) + self.assertEqual(next(iterator)["key"]["id"], "a") + self.assertEqual(next(iterator)["key"]["id"], "b") + self.assertEqual(len(statements), 1, "do not load the next chunk early") + self.assertEqual([d["key"]["id"] for d in iterator], list("cdefg")) + self.assertEqual(len(statements), 4) + self.assertTrue(all("biz_compare_diff.seq >" in q and "biz_compare_diff.id >" in q + for q in statements[1:])) + + def test_export_csv_escapes_unicode_quotes_commas_and_newlines(self): + with patch("netx_api.biz_state.compare_service._DIFF_CHUNK", 2): + archive_bytes = export_run_zip(self.db, "run") + with zipfile.ZipFile(io.BytesIO(archive_bytes)) as archive: + payload = archive.read("tables/sheet.csv") + self.assertTrue(payload.startswith(b"\xef\xbb\xbf")) + rows = list(csv.DictReader(io.StringIO(payload.decode("utf-8-sig")))) + self.assertEqual([r["id"] for r in rows], list("abcdefg")) + self.assertTrue(all(r["note__pre"] == '中文, "quoted"\nsecond line' for r in rows)) + self.assertTrue(all(r["note__pre"] == r["note__post"] for r in rows)) + + def test_other_sheets_do_not_leak_into_export(self): + self.db.add(BizCompareDiff(id="other", run_id="run", metric_id="another", seq=0, + kind="added", key_json={"id": "other"}, after_json={"note": "other"})) + self.db.commit() + with patch("netx_api.biz_state.compare_service._DIFF_CHUNK", 2): + self.assertEqual([d["key"]["id"] for d in _iter_sheet_diffs(self.db, "run", "sheet")], list("abcdefg")) + + def test_legacy_inline_and_empty_exports(self): + self.db.query(BizCompareDiff).delete() + inline = {"kind": "added", "key": {"id": "legacy"}, "after": {"note": "value"}} + self.run.summary_json = {"sheets": [{**self.sheet, "diffs": [inline]}]} + self.db.commit() + self.assertEqual(list(_iter_sheet_diffs(self.db, "run", "sheet")), [inline]) + self.run.summary_json = {"sheets": [self.sheet]} + self.db.commit() + with zipfile.ZipFile(io.BytesIO(export_run_zip(self.db, "run"))) as archive: + self.assertEqual(archive.read("tables/sheet.csv").decode("utf-8-sig"), "kind,id,note__pre,note__post\n") diff --git a/tests/test_biz_state_compare_memory.py b/tests/test_biz_state_compare_memory.py new file mode 100644 index 0000000..7850798 --- /dev/null +++ b/tests/test_biz_state_compare_memory.py @@ -0,0 +1,103 @@ +"""Bounded sampling regressions and an opt-in comparison memory benchmark.""" + +from __future__ import annotations + +import gc +import hashlib +import json +import os +import random +import subprocess +import time +import tracemalloc +import types +from collections import defaultdict, deque +from copy import deepcopy + +import pytest + +from netx_api.biz_state.compare_engine import _StratifiedSample, compare_rows, stratify_take + + +def reference_sample(items, limit): + if len(items) <= limit: + return list(items) + buckets = defaultdict(deque) + for item in items: + buckets[item[0]].append(item) + out = [] + while buckets and len(out) < limit: + for key in list(buckets): + out.append(buckets[key].popleft()) + if not buckets[key]: + del buckets[key] + if len(out) >= limit: + break + return out + + +def test_streaming_sample_preserves_round_robin_and_small_input_order(): + rng = random.Random(42) + for _ in range(100): + items = [(str(rng.randrange(20)), i) for i in range(rng.randrange(100))] + for limit in (0, 1, 5, 20, 100): + expected = reference_sample(items, limit) + assert stratify_take(iter(items), limit, key_fn=lambda item: item[0]) == expected + + +def test_sample_storage_is_bounded_for_both_many_rows_and_many_strata(): + sample = _StratifiedSample(50) + for i in range(20_000): + sample.add(i, str(i) if i >= 10_000 else "one-large-peer") + assert len(sample.heap) == 50 + assert len(sample.strata) == 50 + assert sample.picked() == [0, *range(10_000, 10_049)] + + +@pytest.mark.parametrize("iface_fields,rules,pmap", [ + ([], [], {}), + (["interface"], [], {}), + (["interface"], [{"from": "GE", "to": "gei"}], {"gei-1": "gei-2"}), +]) +def test_compare_does_not_mutate_inputs_when_reusing_rows(iface_fields, rules, pmap): + before = [{"id": "1", "interface": "GE-1", "state": "up"}] + after = [{"id": "1", "interface": "GE-2", "state": "up"}] + original = deepcopy((before, after)) + compare_rows(before_rows=before, after_rows=after, key_fields=["id"], + iface_fields=iface_fields, compare_fields=["state"], port_map=pmap, + iface_normalize_rules=rules, include_unchanged=True, unchanged_limit=1) + assert (before, after) == original + + +def test_memory_benchmark_against_git_baseline(): + """Run explicitly with NETX_BENCH_ROWS=1000000; not part of routine CI.""" + n = int(os.environ.get("NETX_BENCH_ROWS", "0")) + if not n: + pytest.skip("opt-in large synthetic benchmark") + baseline_ref = os.environ.get("NETX_BENCH_REF", "HEAD") + source = subprocess.run(["git", "show", f"{baseline_ref}:netx_api/biz_state/compare_engine.py"], + check=True, capture_output=True, text=True, encoding="utf-8").stdout + baseline = types.ModuleType("netx_api.biz_state._benchmark_baseline") + baseline.__package__ = "netx_api.biz_state" + exec(compile(source, "baseline_compare_engine.py", "exec"), baseline.__dict__) + before = [{"id": str(i), "neighbor": str(i % 50), "state": "up", "afi": "vpnv4"} for i in range(n)] + after = [dict(row) for row in before] + records = [] + digests = [] + for name, compare in (("baseline", baseline.compare_rows), ("optimized", compare_rows)): + gc.collect() + tracemalloc.start() + started = time.perf_counter() + result = compare(before_rows=before, after_rows=after, key_fields=["id"], iface_fields=[], + compare_fields=["state"], include_unchanged=True, unchanged_limit=5000, + compact_unchanged=True) + elapsed = time.perf_counter() - started + _, peak = tracemalloc.get_traced_memory() + tracemalloc.stop() + digests.append(hashlib.sha256(json.dumps(result, sort_keys=True).encode()).hexdigest()) + records.append({"engine": name, "rows_per_side": n, "peak_engine_mib": round(peak / 2**20, 2), + "seconds_with_tracemalloc": round(elapsed, 3)}) + del result + assert digests[0] == digests[1], "large-sheet results and sample order must match" + print("\n" + json.dumps({"baseline_ref": baseline_ref, "input_allocations_included": False, + "results": records}, indent=2)) diff --git a/tests/test_biz_state_compare_search.py b/tests/test_biz_state_compare_search.py new file mode 100644 index 0000000..0b30c8f --- /dev/null +++ b/tests/test_biz_state_compare_search.py @@ -0,0 +1,186 @@ +"""Regression tests: searching a pair must not change its comparison verdict.""" + +from __future__ import annotations + +import unittest +from unittest.mock import patch + +from fastapi import HTTPException +from sqlalchemy import create_engine +from sqlalchemy.dialects import postgresql +from sqlalchemy.orm import Session + +from netx_api.biz_state.compare_engine import compare_rows +from netx_api.biz_state.compare_service import ( + _load_metric_rows_for_search, + _literal_search_pattern, + _persist_sheet_diffs, + _search_stored_diffs, + list_run_diffs, +) +from netx_api.db import Base +from netx_api.models import ( + BizCompareDiff, BizCompareRun, BizCompareTemplate, BizPortMappingRow, + BizStateLldpNeighbor, BizStateMetricRow, +) + + +class CompareSearchTests(unittest.TestCase): + def setUp(self) -> None: + self.engine = create_engine("sqlite+pysqlite:///:memory:") + Base.metadata.create_all(self.engine, tables=[m.__table__ for m in ( + BizCompareDiff, BizCompareRun, BizCompareTemplate, BizPortMappingRow, + BizStateLldpNeighbor, BizStateMetricRow, + )]) + self.db = Session(self.engine) + + def tearDown(self) -> None: + self.db.close() + self.engine.dispose() + + def seed(self, before, after, *, metric="test", keys=None, fields=None, + iface=None, mapping=None, sample=False, compact=False, filters=None): + keys = keys or ["id"] + iface = iface or [] + fields = fields or ["state"] + for side, rows in (("before", before), ("after", after)): + for seq, row in enumerate(rows): + rid = f"{side}-{seq}" + if metric == "lldp_neighbor": + self.db.add(BizStateLldpNeighbor(id=rid, batch_id=side, **row)) + else: + self.db.add(BizStateMetricRow(id=rid, batch_id=side, metric_id=metric, + seq=seq, data_json=dict(row))) + row["_netx"] = {"row_id": rid} + if mapping: + for b, a in mapping.items(): + self.db.add(BizPortMappingRow(mapping_id="map", before_if=b, after_if=a)) + result = compare_rows(before_rows=before, after_rows=after, key_fields=keys, + compare_fields=fields, iface_fields=iface, port_map=mapping or {}, + include_unchanged=True, compact_unchanged=compact) + sheet = {"sheet_id": "sheet", "metric_id": metric, "key_fields": keys, + "compare_fields": fields, "iface_fields": iface, + "summary": {**result["summary"], "unchanged_listed": 0 if sample + else result["summary"]["unchanged"]}, + "row_filters": filters or []} + self.db.add(BizCompareRun(id="run", status="success", before_batch_id="before", + after_batch_id="after", mapping_id="map" if mapping else "", + summary_json={"sheets": [sheet]})) + self.db.commit() + _persist_sheet_diffs(self.db, run_id="run", metric_id="sheet", + diffs=[d for d in result["diffs"] + if not sample or d["kind"] != "unchanged"]) + return result + + def search(self, **kwargs): + return list_run_diffs(self.db, "run", metric_id="sheet", **kwargs) + + def test_search_before_value_preserves_changed_verdict(self): + self.seed([{"id": "1", "state": "up"}], [{"id": "1", "state": "down"}]) + with patch("netx_api.biz_state.compare_service.compare_rows") as compare: + result = self.search(kw="up", kind="changed") + compare.assert_not_called() + self.assertEqual(result["total"], 1) + self.assertEqual(result["items"][0]["after"]["state"], "down") + self.assertEqual(self.search(kw="up", kind="removed")["total"], 0) + + def test_field_filter_matches_after_value_on_compact_diff(self): + self.seed([{"id": "1", "state": "up"}], [{"id": "1", "state": "down"}], compact=True) + result = self.search(qf={"state": "down"}, kind="changed") + self.assertEqual(result["total"], 1) + self.assertEqual(result["items"][0]["before"]["state"], "up") + + def test_sample_lookup_completes_pair_matching_only_one_side(self): + self.seed([{"id": "1", "state": "up", "age": "old"}], + [{"id": "1", "state": "up", "age": "new"}], sample=True) + result = self.search(kw="old", kind="unchanged") + self.assertEqual(result["source"], "live") + self.assertEqual(result["total"], 1) + self.assertEqual(result["items"][0]["after"]["age"], "new") + + def test_sample_lookup_does_not_turn_changed_into_removed(self): + self.seed([{"id": "1", "state": "up"}, {"id": "2", "state": "up"}], + [{"id": "1", "state": "down"}, {"id": "2", "state": "up"}], sample=True) + result = self.search(qf={"id": "1", "state": "up"}, kind="all") + self.assertEqual([d["kind"] for d in result["items"]], ["changed"]) + + def test_sample_lookup_keeps_duplicate_group_pairing(self): + self.seed([{"id": "1", "state": "up", "note": "first"}, + {"id": "1", "state": "down", "note": "second"}], + [{"id": "1", "state": "up", "note": "other"}, + {"id": "1", "state": "down", "note": "other"}], sample=True) + result = self.search(kw="second", kind="all") + self.assertEqual([d["kind"] for d in result["items"]], ["unchanged"]) + self.assertEqual(result["items"][0]["after"]["state"], "down") + + def test_sample_search_is_not_limited_by_persisted_search_text_size(self): + self.seed([{"id": "1", "state": "up", "note": "x" * 5000 + "needle"}], + [{"id": "1", "state": "up", "note": "other"}], sample=True) + self.assertEqual(self.search(kw="needle", kind="unchanged")["total"], 1) + + def test_sample_lookup_applies_port_mapping_before_matching(self): + self.seed([{"id": "1", "interface": "old", "state": "up"}], + [{"id": "1", "interface": "new", "state": "up"}], + keys=["id", "interface"], iface=["interface"], mapping={"old": "new"}, sample=True) + result = self.search(qf={"interface": "old"}, kind="unchanged") + self.assertEqual(result["total"], 1) + self.assertEqual(result["items"][0]["after"]["interface"], "new") + + def test_lldp_source_search(self): + self.seed([{"local_if": "gei-1", "remote_sys": "peer", "remote_if": "port", "remote_ip": "1"}], + [{"local_if": "gei-1", "remote_sys": "peer", "remote_if": "port", "remote_ip": "1"}], + metric="lldp_neighbor", keys=["local_if", "remote_sys"], fields=["remote_ip"], + iface=["local_if"], sample=True) + self.assertEqual(self.search(kw="peer", kind="unchanged")["total"], 1) + + def test_lldp_compact_diff_field_search(self): + self.seed([{"local_if": "gei-1", "remote_sys": "peer", "remote_ip": "1"}], + [{"local_if": "gei-1", "remote_sys": "peer", "remote_ip": "2"}], + metric="lldp_neighbor", keys=["local_if", "remote_sys"], fields=["remote_ip"], + iface=["local_if"], compact=True) + self.assertEqual(self.search(qf={"remote_ip": "2"}, kind="changed")["total"], 1) + + def test_exact_load_cap_is_not_truncated(self): + self.seed([{"id": "1", "state": "up"}], [{"id": "1", "state": "up"}]) + rows, truncated = _load_metric_rows_for_search(self.db, batch_id="before", metric_id="test", + row_filters=[], key_fields=["id"], kw="up", cap=1) + self.assertEqual(len(rows), 1) + self.assertFalse(truncated) + + def test_incomplete_duplicate_groups_are_omitted(self): + self.seed([{"id": "1", "state": "up"}, {"id": "1", "state": "down"}], + [{"id": "1", "state": "up"}, {"id": "1", "state": "down"}], sample=True) + with patch("netx_api.biz_state.compare_service._LIVE_SEARCH_GROUP_LOAD_CAP", 1): + result = self.search(kw="up", kind="all") + self.assertEqual(result["items"], []) + self.assertTrue(result["truncated"]) + + def test_postgres_search_pattern_treats_wildcards_literally(self): + self.assertEqual(_literal_search_pattern("a_10%"), "%a\\_10\\%%") + + def test_postgres_unsupported_filter_uses_python(self): + self.seed([{"id": "1", "state": "up", "age": "H"}], + [{"id": "1", "state": "up", "age": "H"}]) + with patch("netx_api.biz_state.compare_sql._dialect_is_postgres", return_value=True): + rows, _ = _load_metric_rows_for_search(self.db, batch_id="before", metric_id="test", + row_filters=[{"field": "age", "op": "age_timer"}], key_fields=["id"], kw="up") + self.assertEqual(rows, []) + + def test_unknown_sheet_is_rejected(self): + self.seed([{"id": "1", "state": "up"}], [{"id": "1", "state": "up"}]) + with self.assertRaises(HTTPException) as error: + list_run_diffs(self.db, "run", metric_id="missing") + self.assertEqual(error.exception.detail, "sheet_not_found") + + def test_stored_search_escapes_like_wildcards(self): + self.seed([{"id": "x_1", "state": "up"}, {"id": "xy1", "state": "up"}], + [{"id": "x_1", "state": "down"}, {"id": "xy1", "state": "down"}]) + self.assertEqual(self.search(qf={"id": "x_1"}, kind="changed")["total"], 1) + query = _search_stored_diffs(self.db.query(BizCompareDiff), metric_id="test", + kw="up", field_q={"id": "x_1"}) + compiled = query.statement.compile(dialect=postgresql.dialect()) + self.assertIn("LEFT OUTER JOIN", str(compiled)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_biz_state_compare_snapshot.py b/tests/test_biz_state_compare_snapshot.py new file mode 100644 index 0000000..3736fa8 --- /dev/null +++ b/tests/test_biz_state_compare_snapshot.py @@ -0,0 +1,170 @@ +"""Historical comparisons must use the settings captured when they were queued.""" + +from __future__ import annotations + +import csv +import io +import json +import unittest +import zipfile +from copy import deepcopy +from unittest.mock import patch + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from netx_api.biz_state.compare_service import ( + _create_running_run, _execute_compare_into_run, cancel_compare_run, + export_run_zip, get_run, list_run_diffs, template_metrics, +) +from netx_api.db import Base +from netx_api.models import ( + BizCompareDiff, BizCompareJob, BizCompareTemplate, BizPortMapping, + BizPortMappingRow, BizStateMetricRow, +) + + +class CompareSnapshotTests(unittest.TestCase): + def setUp(self): + self.engine = create_engine("sqlite+pysqlite:///:memory:") + Base.metadata.create_all(self.engine) + self.factory = sessionmaker(bind=self.engine, expire_on_commit=False) + self.db = self.factory() + # Progress uses a separate session in production; keep every test write local. + self.session_patch = patch("netx_api.db.SessionLocal", self.factory) + self.session_patch.start() + self.sheet = { + "sheet_id": "sheet", "metric_id": "test", "title": "Original sheet", + "key_fields": ["id", "interface"], "iface_fields": ["interface"], + "compare_fields": ["state"], "display_fields": ["id", "interface", "state"], + "row_filters": [], "ignore_port_changes": False, + } + self.tpl = BizCompareTemplate( + id="tpl", name="Original template", metrics_json=[deepcopy(self.sheet)], + iface_normalize_json=[{"from": "GE", "to": "gei"}], + ) + self.job = BizCompareJob(id="job", name="Original job", template_id="tpl", + mapping_id="map", store_unchanged="sample") + self.mapping = BizPortMapping(id="map", name="Original mapping") + self.pair = BizPortMappingRow(mapping_id="map", before_if="gei-1", after_if="gei-2") + self.db.add_all([self.tpl, self.job, self.mapping, self.pair]) + for side, iface, note in (("before", "GE-1.100", "old"), ("after", "GE-2.100", "new")): + self.db.add(BizStateMetricRow(id=side, batch_id=side, metric_id="test", seq=0, + data_json={"id": "1", "interface": iface, + "state": "up", "note": note})) + self.db.commit() + self.run = _create_running_run( + self.db, job=self.job, tpl=self.tpl, before_batch_id="before", + after_batch_id="after", sheets_cfg=template_metrics(self.tpl), + ) + + def tearDown(self): + self.session_patch.stop() + self.db.close() + self.engine.dispose() + + def edit_current_settings(self): + changed = {**self.sheet, "title": "Edited sheet", "compare_fields": ["note"], + "row_filters": [{"field": "state", "op": "eq", "value": "down"}]} + self.tpl.name = "Edited template" + self.tpl.metrics_json = [changed] + self.tpl.iface_normalize_json = [{"from": "GE", "to": "other"}] + self.pair.after_if = "gei-99" + self.job.name = "Edited job" + self.job.store_unchanged = "never" + self.job.enabled_sheet_ids = ["different-sheet"] + self.mapping.name = "Edited mapping" + self.db.commit() + + def execute(self): + return _execute_compare_into_run(self.db, self.run.id) + + def test_queued_run_uses_original_sheet_rules_mapping_and_storage(self): + original = deepcopy(self.run.summary_json["config_snapshot"]) + self.edit_current_settings() + detail = self.execute() + self.assertEqual(detail["status"], "success") + self.assertEqual(detail["summary"]["unchanged"], 1) + self.assertEqual(detail["summary"]["unchanged_listed"], 1) + self.assertEqual(detail["summary"]["store_unchanged"], "sample") + self.assertEqual(detail["sheets"][0]["compare_fields"], ["state"]) + self.assertEqual(self.run.summary_json["config_snapshot"], original) + + def test_compact_hydration_restores_original_normalized_values(self): + self.execute() + self.edit_current_settings() + diff = list_run_diffs(self.db, self.run.id, metric_id="sheet", kind="unchanged")["items"][0] + self.assertEqual(diff["before"]["interface"], "GE-1.100") + self.assertEqual(diff["mapped_before"]["interface"], "gei-2.100") + self.assertEqual(diff["after"]["interface"], "gei-2.100") + + def test_live_search_does_not_inherit_new_filters_or_transforms(self): + with patch("netx_api.biz_state.compare_service._UNCHANGED_SAMPLE_MAX", 0): + self.execute() + self.edit_current_settings() + result = list_run_diffs(self.db, self.run.id, metric_id="sheet", kind="unchanged", kw="old") + self.assertEqual(result["source"], "live") + self.assertEqual(result["total"], 1) + self.assertEqual(result["items"][0]["mapped_before"]["interface"], "gei-2.100") + + def test_snapshot_can_be_read_after_mapping_and_template_are_deleted(self): + self.execute() + self.db.query(BizPortMappingRow).delete() + self.db.delete(self.mapping) + self.db.delete(self.tpl) + self.db.commit() + detail = get_run(self.db, self.run.id) + self.assertEqual(detail["template_name"], "Original template") + self.assertEqual(detail["mapping_name"], "Original mapping") + diff = list_run_diffs(self.db, self.run.id, metric_id="sheet", kind="unchanged")["items"][0] + self.assertEqual(diff["mapped_before"]["interface"], "gei-2.100") + + def test_queued_run_can_execute_after_its_template_and_mapping_are_deleted(self): + self.db.query(BizPortMappingRow).delete() + self.db.delete(self.mapping) + self.db.delete(self.tpl) + self.db.commit() + detail = self.execute() + self.assertEqual(detail["status"], "success") + self.assertEqual(detail["summary"]["unchanged"], 1) + + def test_detail_returns_original_names_and_independent_template_copy(self): + self.edit_current_settings() + detail = get_run(self.db, self.run.id) + self.assertEqual(detail["job_name"], "Original job") + self.assertEqual(detail["config_snapshot_version"], 1) + self.assertEqual(detail["template"]["iface_normalize_rules"], [{"from": "GE", "to": "gei"}]) + self.assertNotIn("config_snapshot", detail["summary"]) + detail["template"]["iface_normalize_rules"].clear() + self.assertTrue(self.run.summary_json["config_snapshot"]["template"]["iface_normalize_rules"]) + + def test_export_contains_original_config_and_hydrated_csv(self): + self.execute() + self.edit_current_settings() + with zipfile.ZipFile(io.BytesIO(export_run_zip(self.db, self.run.id))) as archive: + config = json.loads(archive.read("config_snapshot.json")) + self.assertEqual(config["port_map"], {"gei-1": "gei-2"}) + self.assertEqual(config["template"]["name"], "Original template") + rows = list(csv.DictReader(io.StringIO(archive.read("tables/sheet.csv").decode("utf-8-sig")))) + self.assertEqual(rows[0]["interface"], "gei-2.100") + + def test_failed_and_cancelled_runs_keep_snapshot(self): + original = deepcopy(self.run.summary_json["config_snapshot"]) + with patch("netx_api.biz_state.compare_service._run_sheet", side_effect=RuntimeError("test-failure")): + with self.assertRaisesRegex(RuntimeError, "test-failure"): + self.execute() + self.assertEqual(self.run.summary_json["config_snapshot"], original) + self.run.status = "running" + self.db.commit() + cancel_compare_run(self.db, self.run.id) + self.assertEqual(self.run.summary_json["config_snapshot"], original) + + def test_legacy_runs_without_snapshot_remain_readable(self): + self.execute() + self.run.summary_json = {k: v for k, v in self.run.summary_json.items() if k != "config_snapshot"} + self.db.commit() + detail = get_run(self.db, self.run.id) + self.assertEqual(detail["status"], "success") + self.assertIsNone(detail["config_snapshot_version"]) + self.assertEqual(list_run_diffs(self.db, self.run.id, metric_id="sheet", kind="unchanged")["total"], 1) + self.assertEqual(self.db.query(BizCompareDiff).count(), 1) diff --git a/web/src/i18n/en.ts b/web/src/i18n/en.ts index 1061040..7c247dd 100644 --- a/web/src/i18n/en.ts +++ b/web/src/i18n/en.ts @@ -474,6 +474,10 @@ const en = { sideAfter: "After", sidesVs: "vs", sidesTitle: "Compare sides", + configSnapshot: "Execution settings saved", + configSnapshotHint: "Template rules and port mapping are fixed for this run. Later edits do not affect historical lookup. The downloaded report includes the execution settings.", + configLegacy: "Legacy run: settings not saved", + configLegacyHint: "This run has no configuration snapshot. Success lookup and compact row reconstruction use the current settings, which may differ from the original execution.", pick: "Select…", sameAsBefore: "Same as before / select…", autoHint: "auto: new after-task batches trigger compare", @@ -532,8 +536,14 @@ const en = { ranWithDuration: "Compare finished ({{s}}s)", unchangedNotStored: "Success rows were counted but not stored. Set “Store success rows” to sample and re-run for spot-check.", unchangedSampleHint: "{{total}} success rows total; browsing a stratified sample of {{listed}}. Search any route for live source lookup. Pass rate uses all {{total}}.", - liveSearchHint: "Field filters look up source batches live; tabs only filter kind. E.g. direction=out, network=1.1.1.1.", - liveSearchTruncatedHint: "Search results truncated — narrow the field filters.", + liveSearchHint: "Pairs are completed from source batches before filtering. Pass rate still uses the full sheet.", + liveSearchTruncatedHint: "Search limit reached; some entries are omitted. Narrow the filters. Incomplete key groups were skipped.", + clearSearch: "Clear filters", + resultLoading: "Loading comparison details…", + resultRange: "{{from}}–{{to}} of {{total}}", + resultLoadFailed: "Could not load comparison details", + retry: "Retry", + searchEmpty: "No results match these filters. Clear filters or select another result type.", clearKeyFilters: "Clear fields", storeUnchanged: "Store success rows", storeUnchangedAuto: "Auto (full if small / sample 5k + hydrate if large)", @@ -567,8 +577,6 @@ const en = { pickBatchRun: "Select compare run", pickRun: "Select run…", runCount: "{{n}} runs", - resultEmpty: "No matching diff rows", - resultFilterPh: "Free text, or direction:out network:1.1.1.1", kindAll: "All", kindDiff: "Fail", kindAdded: "Added", @@ -712,7 +720,6 @@ const en = { newBaseline: "New baseline batch", needProjectFields: "Enter a name and pick old/new portrait tasks", needExpectPorts: "Select at least one expected object for this batch", - needBaselineFirst: "Save an old baseline batch first to list expect objects", needBothBaselines: "Save both old and new baseline batches before evaluating", errOldBaselineRequired: "Old baseline batch is required", errNewBaselineRequired: "New baseline batch is required", diff --git a/web/src/i18n/zh.ts b/web/src/i18n/zh.ts index 1c9b0fc..2eb360f 100644 --- a/web/src/i18n/zh.ts +++ b/web/src/i18n/zh.ts @@ -473,6 +473,10 @@ const zh = { sideAfter: "操作后", sidesVs: "比对", sidesTitle: "比对双方", + configSnapshot: "执行配置已保存", + configSnapshotHint: "此记录的模板规则和端口映射已固定;后续编辑不影响历史回查,下载报告包含执行配置。", + configLegacy: "旧记录:未保存执行配置", + configLegacyHint: "此记录创建时未保存配置快照;成功行回查和精简明细还原使用当前配置,修改配置后可能与当时结果不同。", pick: "选择…", sameAsBefore: "同操作前 / 选择…", autoHint: "auto:操作后任务新批次到达会自动跑比对", @@ -531,8 +535,14 @@ const zh = { ranWithDuration: "比对完成(耗时 {{s}} 秒)", unchangedNotStored: "成功行仅统计数量未落库。可在任务配置将「成功行保存」改为抽样后重新比对(抽查用)。", unchangedSampleHint: "成功共 {{total}} 条,明细抽样 {{listed}} 条(分层抽查)。要查任意路由请输入筛选条件——将按原表即时判定。通过率按全部 {{total}} 计。", - liveSearchHint: "按字段回查原表即时判定;页签只过滤种类。例:direction=out,network=1.1.1.1。", - liveSearchTruncatedHint: "搜索结果已截断,请再收窄字段条件。", + liveSearchHint: "从原始批次补齐同一业务的前后数据后筛选;通过率仍按全表统计。", + liveSearchTruncatedHint: "搜索已达上限,部分业务未展示。请收窄条件;不完整的业务分组已跳过。", + clearSearch: "清空筛选", + resultLoading: "正在加载对比明细…", + resultRange: "{{from}}–{{to}} / {{total}} 条", + resultLoadFailed: "对比明细加载失败", + retry: "重试", + searchEmpty: "当前筛选条件下没有匹配结果,可清空筛选或切换结果类型。", clearKeyFilters: "清空字段", storeUnchanged: "成功行保存", storeUnchangedAuto: "自动(小表全量 / 大表抽样 5000+原表补全)", @@ -778,7 +788,6 @@ const zh = { metaBaseline: "基线", baselineOk: "已设", baselineMissing: "缺", - needBaselineFirst: "先设基线", enableHighfreq: "开启高频", highfreqReady: "高频已就绪", collectNow: "立即采集", @@ -830,10 +839,6 @@ const zh = { currentMissingBanner: "缺当前批次:{{metrics}}", highfreqReadyInactive: "高频已绑定(窗口未开,未立即采集)", collectPartial: "部分失败(成功 {{ok}} / 失败 {{fail}})", - confirmProjectDone: "确认完成项目并暂停全部高频?", - projectMarkedDone: "已完成,高频已停", - confirmDeleteProject: "确认删除项目?将停高频并清批次记录。", - projectDeleted: "已删除", errMetricNeedsBindings: "监控项「{{metric}}」需要参数绑定({{params}}),割接高频暂不支持,请去掉该项", errNoProfileForMetric: "监控项「{{metric}}」在当前设备厂商下无可用采集 profile", acceptTitle: "本批验收", diff --git a/web/src/index.css b/web/src/index.css index 2046460..96e00ff 100644 --- a/web/src/index.css +++ b/web/src/index.css @@ -11931,6 +11931,22 @@ body:has(.bs-cmp-board:fullscreen) { opacity: 0.75; } +.bs-cmp-board__config { + flex: 0 1 auto; + min-width: 0; + padding: 4px 7px; + border: 1px solid var(--bs-cmp-border, rgba(148, 163, 184, 0.22)); + border-radius: 6px; + color: var(--nm-muted, #94a3b8); + font-size: 11px; + line-height: 1.4; + overflow-wrap: anywhere; +} + +.bs-cmp-board__config.is-legacy { + color: #fbbf24; +} + .bs-cmp-board__actions { margin-left: auto; flex: 0 0 auto; @@ -12497,7 +12513,7 @@ body:has(.bs-cmp-board:fullscreen) { flex-wrap: wrap; align-items: center; gap: 4px; - flex: 1 1 280px; + flex: 1 1 100%; min-width: 0; padding: 2px; border-radius: 8px; @@ -12615,13 +12631,13 @@ body:has(.bs-cmp-board:fullscreen) { .bs-cmp-filter-bar { display: flex; - flex-wrap: nowrap; + flex-wrap: wrap; gap: 8px; align-items: center; - flex: 1 1 200px; - min-width: 160px; - max-width: 320px; - margin-left: auto; + flex: 1 1 100%; + min-width: 0; + max-width: none; + margin-left: 0; min-height: 32px; } @@ -12630,6 +12646,8 @@ body:has(.bs-cmp-board:fullscreen) { .bs-cmp-filter-bar input { min-width: 0; width: 100%; + flex: 1 1 220px; + max-width: 440px; } .bs-cmp-filter-bar .bs-sheet-count { @@ -12717,11 +12735,57 @@ body:has(.bs-cmp-board:fullscreen) { } .bs-cmp-result-table.is-loading { - opacity: 0.55; + opacity: 1; /* Keep header/filters clickable; only mute row hit-testing via opacity cue */ pointer-events: auto; } +.bs-cmp-result-state { + min-height: 180px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 12px; + padding: 24px; + text-align: center; + white-space: normal; + overflow-wrap: anywhere; + color: var(--bs-cmp-muted); +} + +.bs-cmp-result-state strong { + color: var(--bs-cmp-ink); + font-size: 14px; +} + +.bs-cmp-result-state.is-error strong { + color: var(--danger, #fca5a5); +} + +.bs-cmp-strip__kind:focus-visible, +.bs-cmp-strip__toggle:focus-visible, +.bs-cmp-nav__item:focus-visible { + outline: 2px solid var(--accent, #60a5fa); + outline-offset: 2px; +} + +@media (max-width: 600px) { + .bs-cmp-strip__sheet { + flex-wrap: wrap; + } + + .bs-cmp-filter-bar input { + flex-basis: 100%; + max-width: none; + } + + .bs-cmp-key-filter { + flex: 1 1 120px; + max-width: none; + } +} + .bs-cmp-board.is-fullscreen .bs-cmp-result-table { max-height: none; min-height: 0; @@ -12752,6 +12816,7 @@ body:has(.bs-cmp-board:fullscreen) { @media (max-width: 960px) { .bs-cmp-board__body { grid-template-columns: 1fr; + grid-template-rows: auto minmax(0, 1fr); } .bs-cmp-board__body.is-nav-collapsed { @@ -12760,6 +12825,7 @@ body:has(.bs-cmp-board:fullscreen) { .bs-cmp-nav { max-height: 180px; + align-self: start; } .bs-cmp-nav.is-collapsed { @@ -12769,6 +12835,8 @@ body:has(.bs-cmp-board:fullscreen) { .bs-cmp-nav__list { flex-direction: row; flex-wrap: nowrap; + flex: 0 0 auto; + align-items: flex-start; overflow-x: auto; overflow-y: hidden; } @@ -12779,8 +12847,9 @@ body:has(.bs-cmp-board:fullscreen) { .bs-cmp-nav__item { flex: 0 0 auto; - min-width: 180px; - grid-template-columns: 8px minmax(0, 1fr); + width: auto; + min-width: 240px; + grid-template-columns: 8px minmax(0, 1fr) auto; } } diff --git a/web/src/pages/network/BizComparePage.tsx b/web/src/pages/network/BizComparePage.tsx index 22f2213..57c5079 100644 --- a/web/src/pages/network/BizComparePage.tsx +++ b/web/src/pages/network/BizComparePage.tsx @@ -845,7 +845,7 @@ function TplRowFiltersEditor({ Array.isArray(filt.value) ? filt.value.join(",") : String(filt.value ?? "") } placeholder={t("bizCompare.filterValue")} - isDisabled={["empty", "not_empty", "age_timer"].includes(filt.op || "")} + disabled={["empty", "not_empty", "age_timer"].includes(filt.op || "")} onChange={(e) => { const next = groups.map((g) => g.map((x) => ({ ...x }))); const op = next[gi][fi]?.op || "eq"; @@ -893,10 +893,6 @@ function TplRowFiltersEditor({ ); } -function metricLabel(id: string) { - return id; -} - export type BizComparePageMode = "jobs" | "templates" | "all"; export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePageMode }) { @@ -988,6 +984,12 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage const [diffsLoading, setDiffsLoading] = useState(false); const [diffsSource, setDiffsSource] = useState(""); const [diffsTruncated, setDiffsTruncated] = useState(false); + const [diffsError, setDiffsError] = useState(""); + const [diffsRetry, setDiffsRetry] = useState(0); + const jobRequestRef = useRef(0); + const runRequestRef = useRef(0); + const listsRequestRef = useRef(0); + const diffFiltersRef = useRef(""); const boardRef = useRef(null); const tableScrollRef = useRef(null); const tableScrollPosRef = useRef({ top: 0, left: 0 }); @@ -996,6 +998,7 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage const tplImportRef = useRef(null); const refresh = useCallback(async (opts?: { force?: boolean }) => { + const request = ++listsRequestRef.current; type Bundle = { taskRes: Awaited>; tpl: Awaited>; @@ -1014,6 +1017,7 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage return { taskRes, tpl, maps, j, met }; }; const apply = (b: Bundle) => { + if (request !== listsRequestRef.current) return; setTasks((b.taskRes.items || []) as TaskOpt[]); setTemplates((b.tpl.items || []) as Template[]); setMappings((b.maps.items || []) as Mapping[]); @@ -1038,8 +1042,12 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage // eslint-disable-next-line react-hooks/exhaustive-deps }, [refresh]); + useEffect(() => () => { listsRequestRef.current += 1; }, []); + // Keep local tab + dismiss overlays when route mode flips (component may be reused). useEffect(() => { + jobRequestRef.current += 1; + runRequestRef.current += 1; if (pageMode === "templates") setPageTab("templates"); else if (pageMode === "jobs") setPageTab("jobs"); setTplOpen(false); @@ -1053,39 +1061,55 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage void document.exitFullscreen().catch(() => undefined); } setBoardFs(false); + return () => { + jobRequestRef.current += 1; + runRequestRef.current += 1; + }; }, [pageMode]); useEffect(() => { + let cancelled = false; + setBeforeBatches([]); void (async () => { - if (!beforeTaskId) { - setBeforeBatches([]); - return; + if (!beforeTaskId) return; + try { + const b = await cutoverCachedGet(`bizCompare:batches:${beforeTaskId}`, + () => bizStateListBatches(beforeTaskId), { ttlMs: 5000 }); + if (!cancelled) setBeforeBatches((b.items || []) as BatchOpt[]); + } catch (e) { + if (!cancelled) showError(formatErr(e)); } - const b = await bizStateListBatches(beforeTaskId); - setBeforeBatches((b.items || []) as BatchOpt[]); })(); - }, [beforeTaskId]); + return () => { cancelled = true; }; + }, [beforeTaskId, showError]); useEffect(() => { + let cancelled = false; + setAfterBatches([]); void (async () => { - if (!afterTaskId) { - setAfterBatches([]); - return; + if (!afterTaskId) return; + try { + const b = await cutoverCachedGet(`bizCompare:batches:${afterTaskId}`, + () => bizStateListBatches(afterTaskId), { ttlMs: 5000 }); + if (!cancelled) setAfterBatches((b.items || []) as BatchOpt[]); + } catch (e) { + if (!cancelled) showError(formatErr(e)); } - const b = await bizStateListBatches(afterTaskId); - setAfterBatches((b.items || []) as BatchOpt[]); })(); - }, [afterTaskId]); + return () => { cancelled = true; }; + }, [afterTaskId, showError]); + + const templatesById = useMemo(() => new Map(templates.map((x) => [x.id, x])), [templates]); const filteredJobs = useMemo(() => { const kw = debouncedListKw.trim().toLowerCase(); if (!kw) return jobs; return jobs.filter((j) => { - const tpl = templates.find((x) => x.id === j.template_id); + const tpl = templatesById.get(j.template_id); const mids = (tpl?.metric_ids || templateSheets(tpl).map((s) => s.metric_id)).join(" "); return `${j.name} ${j.mode} ${j.status} ${tpl?.name || ""} ${mids}`.toLowerCase().includes(kw); }); - }, [jobs, templates, debouncedListKw]); + }, [jobs, templatesById, debouncedListKw]); const filteredTemplates = useMemo(() => { const kw = debouncedListKw.trim().toLowerCase(); @@ -1135,10 +1159,14 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage const next = currentlyOn.includes(sid) ? currentlyOn.filter((id) => id !== sid) : [...currentlyOn, sid]; + if (!next.length) { + showError(t("bizCompare.needSheets")); + return; + } // Empty list means "all on" (new template sheets auto-included) setEnabledSheetIds(next.length === all.length ? [] : next); }, - [jobSheetAllIds, enabledSheetIds], + [jobSheetAllIds, enabledSheetIds, showError, t], ); const setJobTemplateAndSheets = useCallback( @@ -1195,28 +1223,18 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage () => runSheets.find((s) => sheetIdentity(s) === resultSheetId) || runSheets[0] || null, [runSheets, resultSheetId], ); + const activeRunSheetId = sheetIdentity(activeRunSheet); + const activeRunSheetStatus = String(activeRunSheet?.status || ""); // Clear field filters when switching sheet useEffect(() => { setResultKeyFilters({}); }, [resultSheetId]); - // Reset page when sheet / filter / page size changes - useEffect(() => { - setResultPage(1); - }, [ - resultSheetId, - kindFilter, - debouncedResultKw, - debouncedKeyFiltersJson, - resultPageSize, - runDetail?.id, - ]); - useEffect(() => { const runId = String(runDetail?.id || ""); - const mid = resultSheetId || sheetIdentity(activeRunSheet) || ""; - const sheetSt = String(activeRunSheet?.status || ""); + const mid = resultSheetId || activeRunSheetId || ""; + const sheetSt = activeRunSheetStatus; // Block only while *this* sheet is still in flight — done sheets are readable mid-run const sheetStillRunning = ["pending", "running", "queued"].includes(sheetSt); if (!runId || !mid || jobDetailTab !== "result" || sheetStillRunning) { @@ -1224,11 +1242,30 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage setResultTotal(0); setDiffsSource(""); setDiffsTruncated(false); + setDiffsLoading(false); + setDiffsError(""); return; } + const filterKey = JSON.stringify([runId, mid, kindFilter, debouncedResultKw, + debouncedKeyFiltersJson, resultPageSize]); + if (diffFiltersRef.current !== filterKey) { + diffFiltersRef.current = filterKey; + if (resultPage !== 1) { + setPagedDiffs([]); + setResultTotal(0); + setDiffsLoading(true); + setResultPage(1); + return; + } + } let cancelled = false; void (async () => { setDiffsLoading(true); + setDiffsError(""); + setPagedDiffs([]); + setResultTotal(0); + setDiffsSource(""); + setDiffsTruncated(false); try { const res = await bizCompareListRunDiffs({ runId, @@ -1253,8 +1290,7 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage if (resultPage > pages) setResultPage(pages); } catch (e) { if (!cancelled) { - // Keep previous rows to avoid strip/table jump; only clear on hard empty run - showError(formatErr(e)); + setDiffsError(formatErr(e)); } } finally { if (!cancelled) setDiffsLoading(false); @@ -1267,15 +1303,16 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage runDetail?.id, runDetail?.status, resultSheetId, - activeRunSheet?.metric_id, - activeRunSheet?.status, + activeRunSheetId, + activeRunSheetStatus, kindFilter, debouncedResultKw, debouncedKeyFiltersJson, + debouncedKeyFilters, resultPage, resultPageSize, jobDetailTab, - showError, + diffsRetry, ]); const resultColumns = useMemo(() => { @@ -1991,9 +2028,12 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage }; const openJob = async (id: string) => { + const request = ++jobRequestRef.current; + runRequestRef.current += 1; setJobId(id); setJobDetailTab("config"); setRunDetail(null); + setRuns([]); setResultSheetId(""); setKindFilter("diff"); setResultKw(""); @@ -2001,20 +2041,24 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage if (job) resetJobForm(job); try { const r = await bizCompareListRuns(id, 50); + if (request !== jobRequestRef.current) return; const items = r.items || []; setRuns(items); if (items.length) { const latest = await bizCompareGetRun(String((items as any[])[0].id)); + if (request !== jobRequestRef.current) return; setRunDetail(latest); // Land on batch list so stuck/cancelled runs are visible and actionable setJobDetailTab("runs"); } } catch (e) { - showError(formatErr(e)); + if (request === jobRequestRef.current) showError(formatErr(e)); } }; const closeJob = () => { + jobRequestRef.current += 1; + runRequestRef.current += 1; if (document.fullscreenElement === boardRef.current) { void document.exitFullscreen().catch(() => undefined); } @@ -2061,20 +2105,26 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage setJobDetailTab("runs"); return; } + const request = jobRequestRef.current; setBusy(true); try { await bizCompareUpdateJob(jobId, jobConfigBody()); // Async enqueue — returns immediately with status=running; poll below. const run = await bizCompareRunJob(jobId); + if (request !== jobRequestRef.current) return; + runRequestRef.current += 1; setRunDetail(run); setJobDetailTab("runs"); showOk(t("bizCompare.runStarted")); const r = await bizCompareListRuns(jobId, 50); + if (request !== jobRequestRef.current) return; setRuns(r.items || []); await refresh({ force: true }); } catch (e) { - showError(formatErr(e)); - setJobDetailTab("runs"); + if (request === jobRequestRef.current) { + showError(formatErr(e)); + setJobDetailTab("runs"); + } } finally { setBusy(false); } @@ -2082,20 +2132,25 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage const runProgress = (runDetail?.summary?.progress || {}) as RunProgressInfo; const runEngine = String(runProgress.engine || "").toLowerCase(); - // Poll active compare runs so the modal can be closed and reopened safely. + // One poller; schedule the next tick after requests settle to prevent overlap. useEffect(() => { - if (!runIsActive || !runDetail?.id) return; + if (!jobId || (!runIsActive && !(jobHasActiveRun && jobDetailTab === "runs"))) return; let cancelled = false; let notified = false; + let timer: number | undefined; + const jobRequest = jobRequestRef.current; + const runId = String(runDetail?.id || ""); const tick = async () => { + const runRequest = runRequestRef.current; try { - const d = await bizCompareGetRun(String(runDetail.id)); - if (cancelled) return; - setRunDetail(d); - if (jobId) { - const r = await bizCompareListRuns(jobId); - if (!cancelled) setRuns(r.items || []); - } + const [r, d] = await Promise.all([ + bizCompareListRuns(jobId, 50), + runIsActive && runId ? bizCompareGetRun(runId) : Promise.resolve(null), + ]); + if (cancelled || jobRequest !== jobRequestRef.current) return; + setRuns(r.items || []); + if (!d || runRequest !== runRequestRef.current) return; + setRunDetail((prev: typeof runDetail) => String(prev?.id || "") === runId ? d : prev); const st = String(d.status || ""); if (!notified && st === "success") { notified = true; @@ -2111,62 +2166,45 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage } } catch (e) { if (!cancelled) showError(formatErr(e)); + } finally { + if (!cancelled) timer = window.setTimeout(() => void tick(), 2000); } }; void tick(); - const id = window.setInterval(() => void tick(), 2000); return () => { cancelled = true; - window.clearInterval(id); + window.clearTimeout(timer); }; - }, [runDetail?.id, runIsActive, jobId, showOk, showError, t]); - - // Keep the runs list fresh while any batch on this job is active - useEffect(() => { - if (!jobId || !jobHasActiveRun || jobDetailTab !== "runs") return; - let cancelled = false; - const tick = async () => { - try { - const r = await bizCompareListRuns(jobId, 50); - if (!cancelled) setRuns(r.items || []); - const curId = String(runDetail?.id || ""); - if (curId) { - const d = await bizCompareGetRun(curId); - if (!cancelled) setRunDetail(d); - } - } catch { - /* ignore list poll errors */ - } - }; - void tick(); - const id = window.setInterval(() => void tick(), 2500); - return () => { - cancelled = true; - window.clearInterval(id); - }; - }, [jobId, jobHasActiveRun, jobDetailTab, runDetail?.id]); + }, [runDetail?.id, runIsActive, jobId, jobHasActiveRun, jobDetailTab, showOk, showError, t]); const loadRun = async (runId: string) => { + const request = ++runRequestRef.current; + const jobRequest = jobRequestRef.current; try { const d = await bizCompareGetRun(runId); + if (request !== runRequestRef.current || jobRequest !== jobRequestRef.current) return; setRunDetail(d); setKindFilter("diff"); setResultKw(""); + setResultKeyFilters({}); setJobDetailTab("result"); } catch (e) { - showError(formatErr(e)); + if (request === runRequestRef.current && jobRequest === jobRequestRef.current) showError(formatErr(e)); } }; const cancelRun = async (runId: string) => { if (!runId) return; if (!window.confirm(t("bizCompare.confirmCancelRun"))) return; + const request = jobRequestRef.current; setBusy(true); try { const d = await bizCompareCancelRun(runId); - if (String(runDetail?.id || "") === runId) setRunDetail(d); + if (request !== jobRequestRef.current) return; + setRunDetail((prev: typeof runDetail) => String(prev?.id || "") === runId ? d : prev); if (jobId) { const r = await bizCompareListRuns(jobId, 50); + if (request !== jobRequestRef.current) return; setRuns(r.items || []); } showOk(t("bizCompare.runCancelled")); @@ -2180,19 +2218,24 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage const removeRun = async (runId: string) => { if (!runId) return; if (!window.confirm(t("bizCompare.confirmDeleteRun"))) return; + const request = jobRequestRef.current; + const runRequest = runRequestRef.current; setBusy(true); try { const wasCurrent = String(runDetail?.id || "") === runId; await bizCompareDeleteRun(runId); + if (request !== jobRequestRef.current) return; let nextRuns: typeof runs = []; if (jobId) { const r = await bizCompareListRuns(jobId, 50); + if (request !== jobRequestRef.current) return; nextRuns = r.items || []; } else { nextRuns = (runs || []).filter((r) => String(r.id) !== runId); } setRuns(nextRuns); - if (wasCurrent) { + if (wasCurrent && runRequest === runRequestRef.current) { + runRequestRef.current += 1; setRunDetail(null); setResultSheetId(""); setJobDetailTab("runs"); @@ -2542,7 +2585,7 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage {filteredJobs.map((j) => { - const tpl = templates.find((x) => x.id === j.template_id); + const tpl = templatesById.get(j.template_id); const n = templateSheets(tpl).length; return ( @@ -2882,7 +2925,7 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage : "" } placeholder={cmpMode === "percent" ? "%" : ""} - isDisabled={!isCompare || !needsTol} + disabled={!isCompare || !needsTol} onChange={(e) => { const raw = e.target.value.trim(); const tol = raw === "" ? undefined : Number(raw); @@ -3113,7 +3156,12 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage className={jobDetailTab === "runs" ? "is-active" : undefined} onPress={() => { setJobDetailTab("runs"); - if (jobId) void bizCompareListRuns(jobId, 50).then((r) => setRuns(r.items || [])); + const request = jobRequestRef.current; + if (jobId) void bizCompareListRuns(jobId, 50).then((r) => { + if (request === jobRequestRef.current) setRuns(r.items || []); + }).catch((e) => { + if (request === jobRequestRef.current) showError(formatErr(e)); + }); }} > {t("bizCompare.tabRuns")} @@ -3354,6 +3402,18 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage })()} ) : null} + {runDetail ? ( + + {t(runDetail.config_snapshot_version + ? "bizCompare.configSnapshot" + : "bizCompare.configLegacy")} + + ) : null} {!boardFs ? ( <> setResultKw(e.target.value)} /> - - {diffsLoading ? "…" : `${pagedDiffs.length}/${resultTotal}`} + + {diffsLoading ? "…" : t("bizCompare.resultRange", { + from: resultTotal ? (resultPage - 1) * resultPageSize + 1 : 0, + to: Math.min(resultPage * resultPageSize, resultTotal), + total: resultTotal, + })} {resultSearchKeyFields.length ? ( + {(resultKw.trim() || activeKeyFilterCount > 0) ? ( + + ) : null} {resultSearchKeyFields.length && keyFiltersVisible ? (

@@ -3856,10 +3931,10 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage ) : null} {!isLiveSearch && kindFilter === "unchanged" && - (runDetail?.summary?.unchanged_truncated || + (activeRunSheet?.summary?.unchanged_truncated || (Number( - (activeRunSheet?.summary as any)?.unchanged || - runDetail?.summary?.unchanged || + (activeRunSheet?.summary as any)?.unchanged ?? + runDetail?.summary?.unchanged ?? 0, ) > Number( @@ -3899,6 +3974,7 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage className={`pt-list-table-wrap bs-sheet-table bs-cmp-result-table${ diffsLoading ? " is-loading" : "" }`} + aria-busy={diffsLoading} > @@ -4004,6 +4080,22 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage })()} + {diffsLoading || diffsError ? ( + + + + ) : null} {pagedDiffs.map((d, i) => { const pre = pickSideRow( d.mapped_before as Record | null | undefined, @@ -4081,13 +4173,13 @@ export function BizComparePage({ pageMode = "all" }: { pageMode?: BizComparePage ); })} - {runDetail && !diffsLoading && !pagedDiffs.length ? ( + {runDetail && !diffsLoading && !diffsError && !pagedDiffs.length ? (
+
+ {t(diffsError ? "bizCompare.resultLoadFailed" : "bizCompare.resultLoading")} + {diffsError ? <> + {diffsError} + + : null} +
+
- {kindFilter === "unchanged" - ? Number(runDetail?.summary?.unchanged || 0) > 0 && - !Number(runDetail?.summary?.unchanged_listed || 0) + {hasResultSearch ? t("bizCompare.searchEmpty") : kindFilter === "unchanged" + ? Number(activeRunSheet?.summary?.unchanged || 0) > 0 && + !Number(activeRunSheet?.summary?.unchanged_listed || 0) ? t("bizCompare.unchangedNotStored") : t("bizCompare.resultEmpty") : activeSheetPending diff --git a/web/src/pages/network/cutoverDataCache.ts b/web/src/pages/network/cutoverDataCache.ts index cc0748b..ff5e03b 100644 --- a/web/src/pages/network/cutoverDataCache.ts +++ b/web/src/pages/network/cutoverDataCache.ts @@ -7,6 +7,7 @@ type Entry = { at: number; data: unknown }; const store = new Map(); +const inFlight = new Map>(); const DEFAULT_TTL_MS = 45_000; export async function cutoverCachedGet( @@ -21,9 +22,17 @@ export async function cutoverCachedGet( return hit.data as T; } } - const data = await fetcher(); - store.set(key, { at: Date.now(), data }); - return data; + const existing = inFlight.get(key); + if (!opts?.force && existing) return existing as Promise; + const request = Promise.resolve().then(fetcher).then((data) => { + // An invalidation or forced refresh may supersede this request. + if (inFlight.get(key) === request) store.set(key, { at: Date.now(), data }); + return data; + }).finally(() => { + if (inFlight.get(key) === request) inFlight.delete(key); + }); + inFlight.set(key, request); + return request; } /** Return stale immediately (if any), refresh in background and notify. */ @@ -34,27 +43,28 @@ export async function cutoverCachedGetSWR( ): Promise { const hit = store.get(key); if (hit) { - void fetcher() + void cutoverCachedGet(key, fetcher, { ttlMs: 0 }) .then((data) => { - store.set(key, { at: Date.now(), data }); - onFresh?.(data); + if (store.get(key)?.data === data) onFresh?.(data); }) .catch(() => { /* keep stale */ }); return hit.data as T; } - const data = await fetcher(); - store.set(key, { at: Date.now(), data }); - return data; + return cutoverCachedGet(key, fetcher); } export function invalidateCutoverCache(prefix = ""): void { if (!prefix) { store.clear(); + inFlight.clear(); return; } for (const k of [...store.keys()]) { if (k.startsWith(prefix)) store.delete(k); } + for (const k of [...inFlight.keys()]) { + if (k.startsWith(prefix)) inFlight.delete(k); + } } diff --git a/web/tests/bizCompare.browser.mjs b/web/tests/bizCompare.browser.mjs new file mode 100644 index 0000000..6d3f62d --- /dev/null +++ b/web/tests/bizCompare.browser.mjs @@ -0,0 +1,133 @@ +// Run against a local Vite server. All API responses are fixtures; no device or DB is touched. +// NETX_PLAYWRIGHT_MODULE can point at a bundled Playwright package. +import assert from "node:assert/strict"; +import { createRequire } from "node:module"; +import { mkdir } from "node:fs/promises"; +import path from "node:path"; + +const require = createRequire(import.meta.url); +const { chromium } = require(process.env.NETX_PLAYWRIGHT_MODULE || "playwright"); +const base = process.env.NETX_TEST_URL || "http://127.0.0.1:5179"; +const output = path.resolve(process.env.NETX_TEST_OUTPUT || "../docs/reviews/assets"); +await mkdir(output, { recursive: true }); +const browser = await chromium.launch({ headless: true, channel: process.env.NETX_TEST_BROWSER || "chrome" }); +const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); +const errors = []; +page.on("pageerror", (error) => errors.push(error.message)); +const fields = ["neighbor", "vrf", "remote_as", "state"]; +const sheet = { + sheet_id: "peer", title: "BGP 邻居", metric_id: "bgp_peer", + key_fields: ["neighbor", "vrf"], iface_fields: [], compare_fields: ["remote_as", "state"], + status: "done", summary: { changed: 1, removed: 1, added: 1, unchanged: 2, unchanged_listed: 2 }, +}; +const side = (label, ne_name, time) => ({ label, ne_name, started_at: time, ne_ip: "10.0.0.1" }); +const run = { + id: "run-1", status: "success", job_id: "job-1", config_snapshot_version: 1, created_at: "2026-10-10T10:08:00Z", + before: side("before", "PE-BEFORE", "2026-10-10T09:00:00Z"), + after: side("after", "PE-AFTER", "2026-10-10T10:00:00Z"), + sheets: [sheet], + summary: { ...sheet.summary, before_count: 4, after_count: 4, pass_rate: 50, duration_ms: 1250, + sheet_cards: [{ ...sheet, ...sheet.summary, before_count: 4, after_count: 4, pass_rate: 50 }] }, +}; +const job = { id: "job-1", name: "割接前后 · 业务验收", template_id: "tpl", mode: "manual", status: "ready", + before_task_id: "t1", after_task_id: "t2", before_batch_id: "b", after_batch_id: "a" }; +const row = (neighbor, state, remote_as = "64512") => ({ neighbor, vrf: "core", state, remote_as }); +const diffs = [ + { kind: "changed", key: { neighbor: "10.2.1.1", vrf: "core" }, + before: row("10.2.1.1", "Established"), after: row("10.2.1.1", "Idle"), + changes: { state: { before: "Established", after: "Idle" } } }, + { kind: "removed", key: { neighbor: "10.2.1.2", vrf: "core" }, before: row("10.2.1.2", "Established"), after: null, changes: {} }, + { kind: "added", key: { neighbor: "10.2.1.3", vrf: "core" }, before: null, after: row("10.2.1.3", "Established"), changes: {} }, + { kind: "unchanged", key: { neighbor: "10.2.1.4", vrf: "core" }, before: row("10.2.1.4", "Established"), after: row("10.2.1.4", "Established"), changes: {} }, +]; +let failDiffs = false; +let active = false; +let legacy = false; +let pollCounts = { runs: 0, detail: 0 }; +await page.route("**/v1/**", async (route) => { + const url = new URL(route.request().url()); + const p = url.pathname; + let data = {}; + if (p === "/v1/auth/me") data = { user: { id: "test", username: "test", role: "admin", is_active: true } }; + else if (p.endsWith("/compare/jobs")) data = { items: [job, { ...job, id: "job-slow", name: "慢任务" }] }; + else if (p.endsWith("/compare/templates")) data = { items: [{ id: "tpl", name: "割接验收模板", metrics: [sheet] }] }; + else if (p.endsWith("/compare/metrics")) data = { items: [{ metric_id: "bgp_peer", fields: fields.map((name) => ({ name, display_name: name, dtype: "string", is_key: sheet.key_fields.includes(name) })) }] }; + else if (p.endsWith("/tasks")) data = { items: [{ id: "t1", ne_name: "PE-BEFORE", ne_ip: "10.0.0.1" }, { id: "t2", ne_name: "PE-AFTER", ne_ip: "10.0.0.2" }] }; + else if (p.endsWith("/batches")) data = { items: [{ id: p.includes("t1") ? "b" : "a", status: "success", row_count: 4 }] }; + else if (p.endsWith("/runs") && p.includes("/jobs/")) { + pollCounts.runs++; + if (p.includes("job-slow")) await new Promise((resolve) => setTimeout(resolve, 900)); + data = { items: [{ ...run, status: active ? "running" : "success" }] }; + } else if (p.endsWith("/diffs")) { + if (failDiffs) { await route.fulfill({ status: 503, contentType: "application/json", body: JSON.stringify({ detail: "测试:连接暂时中断" }) }); return; } + const kind = url.searchParams.get("kind") || "diff"; + const kw = url.searchParams.get("kw") || ""; + const items = diffs.filter((d) => (kind === "all" || (kind === "diff" ? ["removed", "changed"].includes(d.kind) : d.kind === kind)) && JSON.stringify(d).includes(kw)); + data = { items, total: items.length, page: 1, page_size: 100, source: "stored", truncated: false }; + } else if (p.endsWith("/runs/run-1")) { + pollCounts.detail++; + data = { ...run, config_snapshot_version: legacy ? null : 1, status: active ? "running" : "success" }; + } else if (p.endsWith("/mappings")) data = { items: [] }; + else data = { items: [] }; + await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify(data) }); +}); + +try { + await page.goto(`${base}/network/cutover/biz-compare`); + await page.getByRole("row").filter({ hasText: "割接前后 · 业务验收" }).getByRole("button", { name: "详情", exact: true }).click(); + await page.getByRole("button", { name: "比对结果", exact: true }).click(); + await page.locator(".bs-cmp-diff-table tbody tr.bs-cmp-row").first().waitFor(); + assert.equal(await page.locator(".bs-cmp-diff-table tbody tr.bs-cmp-row").count(), 2); + assert.equal(await page.locator(".bs-cmp-board__config").textContent(), "执行配置已保存"); + await page.screenshot({ path: path.join(output, "biz-compare-desktop.png"), fullPage: true }); + + const search = page.locator(".bs-cmp-filter-bar input"); + failDiffs = true; + await search.fill("故障"); + await page.getByText("对比明细加载失败", { exact: true }).waitFor(); + assert.equal(await page.locator(".bs-cmp-row").count(), 0); + await page.screenshot({ path: path.join(output, "biz-compare-error.png"), fullPage: true }); + failDiffs = false; + await page.getByRole("button", { name: "重试", exact: true }).click(); + await page.getByText("当前筛选条件下没有匹配结果,可清空筛选或切换结果类型。", { exact: true }).waitFor(); + await page.getByRole("button", { name: "清空筛选", exact: true }).click(); + await page.locator(".bs-cmp-row").first().waitFor(); + + await page.setViewportSize({ width: 768, height: 1000 }); + await page.screenshot({ path: path.join(output, "biz-compare-narrow.png"), fullPage: true }); + const fits = await page.locator(".bs-cmp-strip").evaluate((element) => element.scrollWidth <= element.clientWidth + 1); + assert.ok(fits, "filter toolbar must fit its available width"); + await page.setViewportSize({ width: 390, height: 1000 }); + assert.ok(await page.locator(".bs-cmp-strip").evaluate((element) => element.scrollWidth <= element.clientWidth + 1)); + assert.ok(await page.locator(".bs-cmp-board__toolbar").evaluate((element) => element.scrollWidth <= element.clientWidth + 1)); + await page.setViewportSize({ width: 768, height: 1000 }); + + await page.getByRole("button", { name: "关闭", exact: true }).click(); + await page.getByRole("row").filter({ hasText: "慢任务" }).getByRole("button", { name: "详情", exact: true }).click(); + await page.getByRole("button", { name: "关闭", exact: true }).click(); + await page.getByRole("row").filter({ hasText: "割接前后 · 业务验收" }).getByRole("button", { name: "详情", exact: true }).click(); + await page.getByRole("button", { name: "比对结果", exact: true }).click(); + await page.locator(".bs-cmp-row").first().waitFor(); + await page.waitForTimeout(1100); + assert.equal(await page.locator(".bs-cmp-row").count(), 2, "slow old job must not change the current tab"); + + legacy = true; + await page.reload(); + await page.getByRole("row").filter({ hasText: "割接前后 · 业务验收" }).getByRole("button", { name: "详情", exact: true }).click(); + await page.getByRole("button", { name: "比对结果", exact: true }).click(); + await page.getByText("旧记录:未保存执行配置", { exact: true }).waitFor(); + await page.screenshot({ path: path.join(output, "biz-compare-legacy.png"), fullPage: true }); + + active = true; + await page.reload(); + await page.getByRole("row").filter({ hasText: "割接前后 · 业务验收" }).getByRole("button", { name: "详情", exact: true }).click(); + await page.locator(".bs-cmp-runs").waitFor(); + pollCounts = { runs: 0, detail: 0 }; + await page.waitForTimeout(5200); + assert.ok(pollCounts.runs <= 3 && pollCounts.detail <= 3, JSON.stringify(pollCounts)); + assert.ok(pollCounts.runs >= 2 && pollCounts.detail >= 2, "active run should keep polling"); + assert.deepEqual(errors, []); + console.log(JSON.stringify({ passed: ["result layout", "saved execution settings", "legacy settings warning", "error clears stale rows", "retry", "clear filters", "768px toolbar", "old job response ignored", "single poller", "no runtime errors"], pollCounts, output })); +} finally { + await browser.close(); +} diff --git a/web/tests/cutoverDataCache.test.mjs b/web/tests/cutoverDataCache.test.mjs new file mode 100644 index 0000000..8c12694 --- /dev/null +++ b/web/tests/cutoverDataCache.test.mjs @@ -0,0 +1,72 @@ +import assert from "node:assert/strict"; +import { beforeEach, test } from "node:test"; +import { cutoverCachedGet, cutoverCachedGetSWR, invalidateCutoverCache } from "../src/pages/network/cutoverDataCache.ts"; + +const deferred = () => { + let resolve, reject; + const promise = new Promise((ok, fail) => { resolve = ok; reject = fail; }); + return { promise, resolve, reject }; +}; + +beforeEach(() => invalidateCutoverCache()); + +test("concurrent readers share one fetch", async () => { + const pending = deferred(); + let calls = 0; + const fetcher = () => { calls++; return pending.promise; }; + const first = cutoverCachedGet("batches", fetcher); + const second = cutoverCachedGet("batches", fetcher); + pending.resolve("fresh"); + assert.deepEqual(await Promise.all([first, second]), ["fresh", "fresh"]); + assert.equal(calls, 1); +}); + +test("invalidated pending requests cannot repopulate the cache", async () => { + const pending = deferred(); + const old = cutoverCachedGet("batches", () => pending.promise); + invalidateCutoverCache("batches"); + pending.resolve("stale"); + await old; + assert.equal(await cutoverCachedGet("batches", async () => "fresh"), "fresh"); +}); + +test("forced refresh supersedes a slow older request", async () => { + const pending = deferred(); + const old = cutoverCachedGet("lists", () => pending.promise); + assert.equal(await cutoverCachedGet("lists", async () => "fresh", { force: true }), "fresh"); + pending.resolve("old"); + await old; + assert.equal(await cutoverCachedGet("lists", async () => "unexpected"), "fresh"); +}); + +test("a failed fetch can be retried", async () => { + await assert.rejects(cutoverCachedGet("lists", async () => { throw new Error("offline"); })); + assert.equal(await cutoverCachedGet("lists", async () => "recovered"), "recovered"); +}); + +test("SWR readers share background refresh and each receives the fresh value", async () => { + await cutoverCachedGet("lists", async () => "cached"); + const pending = deferred(); + let calls = 0; + const notifications = []; + const fetcher = () => { calls++; return pending.promise; }; + const first = await cutoverCachedGetSWR("lists", fetcher, (x) => notifications.push(x)); + const second = await cutoverCachedGetSWR("lists", fetcher, (x) => notifications.push(x)); + assert.equal(first, "cached"); + assert.equal(second, "cached"); + pending.resolve("fresh"); + await new Promise((resolve) => setImmediate(resolve)); + assert.equal(calls, 1); + assert.deepEqual(notifications, ["fresh", "fresh"]); +}); + +test("invalidated SWR requests do not notify with stale data", async () => { + await cutoverCachedGet("lists", async () => "cached"); + const pending = deferred(); + const notifications = []; + await cutoverCachedGetSWR("lists", () => pending.promise, (x) => notifications.push(x)); + invalidateCutoverCache("lists"); + pending.resolve("stale"); + await new Promise((resolve) => setImmediate(resolve)); + assert.deepEqual(notifications, []); +});