XׯdddlZddlmZddlmZmZmZmZmZm Z m Z m Z ddl m Z mZddlZddlZddlZdZdZdZdZGd d eZGd d eZGd deZdZdZdZdZdZdZdZGddeZ Gdde Z!GddeZ"GddeZ#Gdde#Z$Gd d!eZ%Gd"d#eZ&Gd$d%e&Z'Gd&d'Z(dS)(N log_error) VBoxFigureCanvasDiamondShapeFigureRectangleShapeFigure TextFigureHFill draw_varrow draw_harrow) ImageSurfaceContextcRtj|}tj|SN)ioStringIOjsonload)textfps ..\modules\explain_renderer.py decode_jsonr$s T  B 9R==cd|z} ddl}||}|dd}n#t$rt dYnwxYw|S)NzSELECT r z;Can't import sqlide_grt, disabling expression reformatting ) sqlide_grtreformatSQLStatement partitionstrip ImportErrorr) expressionsqlrs rreformat_expressionr$(s j CR--c22]]3''+1133 RRRPQQQQQR sAAA*)A*ct|dkrd|dz zS|dkrd|dz zS|dkrd|d z zSt|S) Nʚ;z%.2fGeA@Bz%.02fM.Az%.0fK@@)str)cs r fmt_numberr.5sYN!-.// i1k?++ d!F(## q66Mrcv|dkrd|zS|dkrd|dz zS|dkrd|dz zS|d krd |d z zSd |zS) Nz%i rowr&z %.2fG rowsr'r(z %.2fM rowsr)r*z %.2fK rowsr+z%s rows)rs rfmt_rowsr3?sgAvv!| z>>1\>2 2 [[1Y;/ / XX1V8, ,q= rceZdZdZdZdS)MyCanvasc0tj||dSr)r__init__)selfcbs rr7zMyCanvas.__init__Nsb!!!!!rcbtj|||}|r|||SdSr)r figure_at get_figure_at)r8xyfigs rr;zMyCanvas.figure_atRs9tQ**  +$$Q** *trN)__name__ __module__ __qualname__r7r;r1rrr5r5Ms2"""rr5ceZdZdZdZdZdZdZedZ edZ edZ edZ ed Z ed Zed Zed Zed ZdZedZedZdZd%dZdZdZdZdZdZdZdZdZdZd&dZ d Z!ed!Z"d"Z#d#Z$d$S)' ExplainNodeFctj|||_d|_d|_d|_d|_d|_|j|_ |j |_ dSr) rr7_contextparent cost_info_figure_aggr_cost_value_aggr_cost_pcthandle_hover_in on_hover_inhandle_hover_out on_hover_out)r8contexts rr7zExplainNode.__init___s[D!!!   $"/ 1rc|jjS)z>Width of the figure itself, without accounting for child nodes)rKwidthr8s r inner_widthzExplainNode.inner_widthns|!!rc|jjSrrKheightrUs r inner_heightzExplainNode.inner_heights |""rcXt|j|jzdz|jjfSN?)introot_xvconnect_pos_offsetrKroot_yrUs r varrow_sourcezExplainNode.varrow_sourcexs)4;!99::3> @SSSrcht|j|jzdz|jj|jzfSr])r_r`rarKrbrZrUs r varrow_targetzExplainNode.varrow_target}s24;!99::3> @SVZVg@gggrcX|jjt|j|jzdzfSr])rKr`r_rbhconnect_pos_offsetrUs r harrow_targetzExplainNode.harrow_targets*|"C d6N(N$O$OPS$SSSrct|jj|jjzdzt|j|jzdzfSr])r_rKr`rTrbrgrUs rharrow_target_rightzExplainNode.harrow_target_rightsB4<&);;<rYrUs rrgzExplainNode.hconnect_pos_offsets|~ 3A 555rcdSrr1rUs rget_read_eval_costzExplainNode.get_read_eval_costtrc<d}|jjdkr|}|s t|S#t$rV|dd}|d}t|}|dkr|dzcYS|dkr |dzdzcYS|dkr |dzdzdzcYS|cYSwxYwdS)Nread_eval_costrKr*MG)rHdisplayed_cost_inforrfloat ValueError)r8 cost_valuevalueunits rr|zExplainNode.cost_values = ,0@ @ @0022J  ! !Z((( ! ! !"3B3!"~e 3;; 4<'''S[[ 4<,,,,S[[ 4<,T1111 LLL !ts!96B1BBBBcdS)zEThe row count number to be shown in outgoing node arrows Nr1rUs r rows_countzExplainNode.rows_counts trc|j|cxkr|j|jzkrnn|j|cxkr|j|jzkrnn|jD]}|||}|r|cS|jj|cxkr|jj|jzkr1nn.|jj|cxkr|jj|jzkrnn|SdSr) r`rTrbrYchildrenr<rKrVrZ)r8r=r>fffs rr<zExplainNode.get_figure_atsD ; 5 5 5 5T[4:5 5 5 5 5 5$+:e:e:e:eDKZ^ZeLe:e:e:e:e:e]  __Q**III|"QOOOO)ddlm}tt t ||ddzdd}|S)Nr0r)logr^)rmathrmaxminr_)r8r line_widthrs rget_line_widthzExplainNode.get_line_widthsa_   G SSSR%8%8%costs r render_costzExplainNode.render_costs     q!Q * * * JJq!      R LL//55 6 6 6 6 6  rc|j}|g|dddd||||d|t |dSdSr)rrrrrr3)r8rr=r>rs rrender_row_countzExplainNode.render_row_countsy_  !   q!Q * * * JJq!      R LL*-- . . . . . " !rcdSrr1r8rs rdo_render_extraszExplainNode.do_render_extrass rc|||jD]$}|j|ksJ||%dSr)rrrI render_extrasr8rchs rrzExplainNode.render_extrass[ b!!!- ! !B9$$$$   R  ! !rcZ||||dSr) do_renderrrs rrenderzExplainNode.renders. r 2rctj|||||j|j|jD]}|||dSr) rrsave translater=r>rrrestorers rrzExplainNode.do_renderss$###   TVTV$$$-  B LL     rctj|||jr|jd}|||j}|j}||_|j|jjz|j z|_ | d|j|jjz|j ||j dz z |j jdSdS)Nrro)r do_relayoutrrarT_widthrZrHvspacingrY_heightmoverKrVr>)r8ctxchild child_align_x child_widths rrzExplainNode.do_relayoutstS))) = RM!$E   c " " ""5M+K&DK,t}/EE TDL JJq$+dm.DD E E E L  md.>q.@@$,. Q Q Q Q Q% R Rrc||||||||dz|z|t |||fd|zd|z|dS)Nr)set_line_widthrrline_tostroker fill)r8rr=y1y2s rr zExplainNode.draw_varrow.s $--//000 1b 1b1ft22444555 BBD$7$7$9$9!91T=P=P=R=R;RSSS  rrrc|||||||||zz ||t |||f||z||z|dSr)rrrrrr r)r8rx1x2r>whs rr zExplainNode.draw_harrow7s $--//000 2q 2T002223Q777 BQ4#6#6#8#8!8!Ds rrPzExplainNode.handle_hover_outAs@ =  ) M ! ' ' ) ) )$(DM ! ! ! ) )rc |j|jzSr)r`rTrUs r hint_pos_xzExplainNode.hint_pos_xGs{TZ''rcdSrr1rUs r get_hint_textzExplainNode.get_hint_textLrsrc|jjr*|jjd|j_|jjrdS|}|r t jdt j|j_|jr"|j |dz|\}}nE|j |j j |j z|j j |jdz z\}}t jd}|dd}|dD]} | dr|rk|dr |dd}t j|} | t j|| ddd}t j| d dd} | t j|| dd|| dzz }|r]t j|d} | t j|| dd|jjt7|d t7|d |jj||jj|jj |jj!|jj"||t j#dSdS) NrroFrr*rr0d2)$rHrr overview_modermforms newPopoverPopoverStyleTooltip is_containerclient_to_screenrKr`rVrbrZnewBox set_spacingsplit startswithendswithnewLabel set_style SmallStyleaddrstripSmallBoldStyleset_sizer get_width get_height set_contentadd_close_callback close_tooltipshow_and_track_view StartRight) r8r?r=r>rxxyyboxtlinelabels rrNzExplainNode.handle_hover_inPs =  ) M ! ' ' ) ) )$(DM ! = &  F!!## ! a$*$5dF>AQA]^_A___rc^|jjddr |jjSdS)NrF)rHserver_version#is_supported_mysql_version_at_leastr rows_producedrUs rrzNestedLoopNode.rows_counts0 = ' K KAq Q Q 2#1 1trcx|jjr-t|jjddndS)N prefix_costr)rrJrzgetrUs rrrz!NestedLoopNode.get_read_eval_costs7JNJZJdnuT%/33M1EEFFFjnnrc|jSr)rrUs r__repr__zNestedLoopNode.__repr__s rcf|jrt|jtpt|jt}||ddddt|jt ry|sC|||jd|jj d|jj d| ||jddz|jddz np|s>| ||j d|j d|jj d| ||j ddz|j d|||jj|j ddz |dSdS)Nrr0r)rI isinstanceMaterializedTableNodeMaterializedJoinNoderrrr rlrhrr rcrerrKr`r)r8ris_inside_a_boxs rrzNestedLoopNode.do_render_extrass ; (6KLL}PZ[_[fh|P}P}O GGIII   q!Q * * *$+~66 \&|$$R);A)> @YZ[@\^b^i^wxy^z{{{%%b$*@RST@UW[WbWpqrWsttt%%b$*)r8rbelowaside total_widths rrzNestedLoopNode.do_relayouts     %%% # #kEK/$-2HH $*K88 e^ , , Ht|2T]5KKelZ$|--DL L  d69I!9KK ! ! ! JJq$,. ) ) ) )<.1GG#el\a\hJiJiiDL L  d69I!9KKQ O O O JJq$,- 0FF G G G 5;!779Lt}Oe9efffffrcZdd|jiz}|jjr|d|jjzz }|S)Nz*%(join_buffer)s rzPrefix Cost: %(prefix_cost)s)rrrJr8rs rrzNestedLoopNode.get_hint_textsEt'()   % P 2T5E5OO OD rN)r@rArBrr7rrrarrrrrrrr1rrrr~sL@44X4``X`X ooo   $ggg4rr)?r^?r0)r^r'r0)r&r&r'r0)r&r^r'r0)r&r%r%r0)rrrr0)r0r0r0r0c<eZdZdeddfdeddfdeddfd ed d fd ed dfdeddfdeddfdeddfdeddfdeddfdeddfd ed!d"fd#ed$d%fg Z d&gd&d&d&d&fd'Z e d(Z d)Z e d*Ze d+Ze d,Ze d-Zd4d/Zd0Zd1Zd2Zd3Zd&S)5 TableNodesystemzSingle Row (system constant)z Very low costconstzSingle Row (constant)eq_refzUnique Key LookupzLow - The optimizer is able to find an index that it can use to retrieve required records. Fast because the index search leads directly to the page with all the row datarefzNon-Unique Key Lookupz]Low-medium - Low if number of matching rows is small, higher as the number of rows increases.fulltextzFulltext Index SearchzLSpecialized FULL TEXT search. Low - for this specialized search requirement. ref_or_nullzKey Lookup + Fetch NULL ValueszYLow-medium - if number of matching rows is small, higher as the number of rows increases. index_mergez Index MergezYMedium - may want to look for better index selection in the query to improve performance.unique_subqueryz(Unique Key Lookup into table of subqueryz,Low - Used for efficient Subquery processingindex_subqueryz,Non-Unique Key Lookup into table of subqueryrangezIndex Range ScanzMedium - partial index scanindexzFull Index Scanz#High - especially for large indexesALLzFull Table ScanzVery High - very costly for large tables (not so much for small ones). No usable indexes were found for the table and the optimizer must search every row. This could also mean the search range is so broad that the index would be useless.UNKNOWNunknownrNc t||||_||_||_||_||_||_| |_||_ |r||_ |j D]\} } } } || krn| |jd<| |jd<| dt| |_|jd|jd|jd|jj| |jdddd|jdddd||jt|j|_|jd|jdddd|jd|jdddd|jd d||j|jrt3|j|_|jd|jd|jd|jdddd|jd d||jdSd|_dS) N_hint _access_typerrrTr0rr^)rDr7namekey_name access_typeinforJ rows_examinedrchild_attached_subqueriesrIcol_join_typesrrrKrr set_font_boldset_fill_colorr set_paddingr _figure_namer set_alignmentr _figure_key)r8rRr;r=attached_subqueriesr<r>rJr?rkeycolorrhints rr7zTableNode.__init__ s T7+++   & "**)<&  .)-  &'+':   #Ctc!!"" '$) .! +E22  %%a((( ""2&&& ""4(((# #U++ ##Aq!Q///   RR000 0;; **1--- ##Aq!Q/// ''+++ ((Aq!444 ''Q/// "### = $)$-88D    - -a 0 0 0   * *2 . . .   * *4 0 0 0   + +Aq!Q 7 7 7   * *3 2 2 2 HHT% & & & & &#D   rc$|jr|jgSgSr)r@rUs rrzTableNode.childrenAs  ) 423 3 rc|jrQt|jddt|jddzSdS)N read_costr eval_cost)rJrzrrUs rrrzTableNode.get_read_eval_costGsS > i++K;;<DL$6q$88 8|~ 0 222rc|jj}|jr|d|jjzz }|jr|d|jjzz }|SNr)rKrYrErGr8rs rrZzTableNode.inner_heightVsQ L    . T&-- -A   - T%,, ,Arc4|jj|jjzSr)rKr`rTrUs rrzTableNode.hint_pos_x`s|"T\%777rFc||jvs|rj|r||jvr||j|z}n|j|d}t|turd|}|d|dSdS)N-z, rrr)r>rtypelistjoin)r8rrI always_show value_formatr}s r _hint_linezTableNode._hint_lineds $)  {  0ty 0 0$ty~5 c3//E{{d""!u--!&. .rrcd|jz}||ddz }|dz }||dddz }||dd z }||d d z }||d d z }d|jvsd |jvs d |jvr|dz }d|jvrzd|jvrq t|jd|jd<nM#t$r@}t d|jdd|d|jd|jd<Yd}~nd}~wwxYw||ddz }d|jvr|dz }||ddz }||ddz }||ddz }||dddz }|dz }|dz }|jr |d|jzz }|S) Nza*%(table_name)s Access Type: %(access_type)s %(_access_type)s Cost Hint: %(_hint)s z Used Columns: used_columnsrz *Key/Index:rITz Ref.:r-z Used Key Parts:used_key_partsz Possible Keys: possible_keysattached_condition_fmtattached_conditionzCould not reformat : z*Attached Condition: zUsing Join Buffer:using_join_bufferzRows Examined per Scan:rows_examined_per_scanzRows Produced per Join:rows_produced_per_joinz4Filtered (ratio of rows produced per rows examined):filteredz%s%%)r\z' Hint: 100% is best, <= 1% is worst zN A low value means the query examines a lot of rows that are not returned. zu*Cost Info Read: %(read_cost)s Eval: %(eval_cost)s Prefix: %(prefix_cost)s Data Read: %(data_read_per_join)s )r>r]r$ ExceptionrrJ)r8res rrzTableNode.get_hint_textpsc i   1>BBB    ud;;;  5111  35EFFF  2ODDD TY & &*:di*G*G?^b^gKgKg DLD #49 4 49MQUQZ9Z9Z V6I$)ThJi6j6j 233 V V V 49EY;Z;Z;Z\]\]\]^___6:i@T6U 2333333 V  8:RSSS 49 , , DLD  46IJJJ  9;STTT  9;STTT  VXbqwxxx :: aa >    n  D s"C$$ D..6D))D.cp|jrt|jts||ddddt|jt r|jj|kr|j|j| |jd|jj d| ||jd|jj d|jj dn>| ||jd|jd|jj d|||jj|jddz |||jddz|jddz |dSdSdS)Nrr0rr)rIrrrrrrrrcrrhr r rerrKr`rrrs rrzTableNode.do_render_extrass ; z$+7LMM  GGIII   q!Q * * *$+~66 q4;;RVZ;Z;Z D.// 4-a0$+2KA2NOOO  T%7%:DKr=rHr rrYr8rrs rrzTableNode.do_relayouts tT***   %%% s4<#5r::DL(C(CTEVE_ ` ` `   _   & &s4<+=r'B'BDDTD] ^ ^ ^( tS))).  ;   c " " " L  a 0 0 0  ?!&&q$*;*=>>> = %%a)9);<<< JJt|~ (::T]=SSUYUaUc d d d,,t}/EE SDKt|U\::DLLL ; ;rc2d|jzdz|jzdzS)Nzr;r=rUs rrzTableNode.__repr__s!$)#D()99$>>r)FN)r@rArBBLUEGREENYELLOWORANGEREDBLACKrAr7rrrrrrarZrr]rrrrr1rrr)r)s$0OQ`a$0H/Z%1DGRS%1HKjk!&2ILZ[$%1RUtu$%A\](&2]`NO'&2adRS&2DFcd#/@Bgh#/@CVW!%B?!N&HLt!%t3$3$3$3$lX  ""X"33X3 X88X8    +++\    ;;;:?????rr)cneZdZdZdddgddddfdZdZedZdZdZ edZ d Z dS) rTNc t|||||||| | |  |d|jj} |j| d| d| dd|j| d| d| dd|jdddd|dr0| dr|j |n|j d |z|jdddd|j d d d d ||_ ||_ ||_dS) N)r=rHr<r>rJr?rrr0ro皙??<>z%s (materialized)r)r)r7rrK _fill_colorrrCrErrset_textrDmaterialize_attributeschild_materialized_fromrI) r8rRr;r=rHmaterialized_fromrr<r>rJr?rrs rr7zMaterializedTableNode.__init__s 4$k1D&.t'0-an  p p p |' tAwQa#>>> ##DGT!Wd1gsCCC ##Cc3777 ??3   CDMM#$6$6 C   & &t , , , ,   & &':T'A B B B ((c3<<< %%aAq111&<#'8$#'   rc2d|jzdz|jzdzS)Nzrrrr_rZrYr@r rK)r8rrTrrs rrz!MaterializedTableNode.do_relayouts $00555,2T]5PQR5RRtS)))  A FF1acNNNAHH 4<T->A]Ad-dgkgthCDEhE.E*F*FGG :5; ; ;  ( - -dm.I.2.?$-B].] _ _ _ _  ( - -ut7S7Y/Y[\.\.2.?$-B].] _ _ _ .  ;   c " " " JJut}55t|~ F F F$-"885;FDKt|U\::DLLL  ; ;rc rt|||||j|j|ddt|jj |jjz|j j zt|jj |jjz|j j z| d|ddgd|dddd||dS)Nr^r0@@rr})r)rrrr=r> rectangler_rrTrHrrYrset_dashrrrr8rs rrzMaterializedTableNode.do_rendersD#&&&   dfdf%%% c3$6>  %%a((( &&r*** sCa000  ++ ##A&&&   RR000  ?  6 7 7 & LL % % % ?  / 0 0 % LL $ $ $  (#-chhuoo#>#>D  . .t 4 4 4  . .r 2 2 2 HHT) * * * * *#'D rc|jrCt|j|jzdz|jj|jjz|jzdzfSt|j|jzdz|jj|jzdzfS)Nr^rr0)rr_r`rarKrbrYrZrUs rrezOperationNode.varrow_targetxs   pt{T%==>>sBDLDWZ^ZnZuDux|yJEJMNENN Nt{T%==>>sBDLDWZ^ZkDknoDoo orc$|jr|jgngSr)rrUs rrzOperationNode.childrens#z1 ||r1rc|jr}t|jtsdt|jtsK||ddddt|jt rT|jj|krD|||j d|jj d|jj dnt|jtr?|||j d|jj d|j dn>| ||j d|j d|jjd|dSdSdSdSNrr0)rIrrrrrrrr rcrhrrlr rerrs rrzOperationNode.do_render_extrass ; z$+7LMM V`aealoCWDWD  GGIII   q!Q * * *$+~66 q4;;RVZ;Z;Z  T%7%:DKros rrzOperationNode.do_relayoutstS)))  # un - - ECW1X1X ]ghmox]y]y ek4:66DK <$-*@@4CTTDL{T\/// !!%";dl>PQR>R"R"#%%% 1dl1DM4JJKKKK !!!Q''' DL.<A<.1GGIIII + (>>AQQDKu|T->??DL L  ekDM,BB ! ! ! JJq!      `  % %dlndlnt|GZ6Z]^6^ _ _ _ _ _ ` `rc.|jdkrd}n&|jdkrd}n|jdkrd}n |jdz}|dz }d|jvr|d |jdzz }d |jvr|d |jd zz }|jrd |jvr|d |jd zz }|S)Nrz*Grouping Operation rz*Ordering Operation rz*Duplicates Removal rrUsing Temporary Table: %s rzUsing Filesort: %s sort_costzSort Cost: %s )rrrJr$s rrzOperationNode.get_hint_texts >1 1 1*DD ^3 3 3*DD ^3 3 3*DD>$&D   "do 5 5 2T_E\5]] ]D t . . +do>N.OO OD > DkT^;; %{(CC CD rcZ|jr|jdjStd|ddS)NrNodezhas no children)rrprintrUs rrzOperationNode.rows_counts4 = =#. . &$ 1 2 2 21rc|jSr)rrUs rrzOperationNode.__repr__s ~r)NNN) r@rArBrr7rrerrrrrrr1rrrr6sL<(<(<(<(~ppXp 22X2   ```8&Xrrc`eZdZd dZedZedZdZdZdZ dZ d Z dS) QueryBlockNodeNct|||r||_||_||_||_||_|r||_||_|r||_|d|r"d|vrtd|dz|_ ntd|_ |j d|j dddd| |j |rd|vrt|d|_|jd|jdddd |jd d| |jdSd|_dS) Nr select_idzquery_block #%s query_blockrrmessagerr0r^)rDr7rIr>rJrrselect_list_subqueriesrrrKrrDrr rrrrFr8rRrrrr>rJs rr7zQueryBlockNode.__init__sT7+++  &!%K  "  $:! ! 1,0 " )&<# ! 1,0 " )   ?K4''/0ADDU0UVVDLL/ >>DL %%a(((   RR000   (I%%#-d9o#>#>D  . .r 2 2 2  / /1a ; ; ;  . .sA 6 6 6 HHT) * * * * *#'D rcJ|jj}|jr||jjz }|Sr)rKrYrrTs rrZzQueryBlockNode.inner_heights, L    - %, ,Arcg}|jr||j|jr||j|Sr)rrrr8results rrzQueryBlockNode.childrensJ : & MM$* % % %  & 7 MM$5 6 6 6 rc8tj|||j}|r||d}|j}|j}||_|j|jjz|j z|z|_ | d|j|jjz|j ||j dz z ||j}|r||| |j|jjz|j j|jjz|xj|jj|jzz c_t%|j |j|j z|_ |xj|jjdzz c_|xj |jjz c_ dS)Nrrro)rrrrarTrrZrHrrYrrrKrVrsmall_hspacingr>rr)r8rrvoffsetrrs rrzQueryBlockNode.do_relayoutstS)))   K   c " " "G"5M+K&DK,t}/EE TW^^DL JJq$+dm.DD E E E L  md.>q.@@' J J J+  E   c " " " JJtzDM$@@$,.SWS`SnBn o o o KK4=7%+E EKKt|UWu|-CDDDL t}2Q66   33 rcld|jdz}|jrd|jvr|d|jdzz }|S)NSelect ID: %s r query_costQuery Cost: %s r>rJr$s rrzQueryBlockNode.get_hint_text-sF 49[#99 > Fldn<< & )EE ED rc |jry|jd}|_|dddd||||d|d|zdSdSdS)Nrrr0rzQuery cost: %s)rJrrrrrrs rrzQueryBlockNode.render_cost4s > 6>%%l33D""1aA... 1a     $$$ -455555  6 6rc| |dddd|||jj|jjdz |jrXt!|jt"s>|||jd|jd|jjd| dS)NFr333333?ror0r)rrrrr`rHrrKrbrTrYr>rrrrIrrr rcrers rrzQueryBlockNode.do_render_extras>s    1aA&&& T\0$,2E2IJJJ ; mz$+7LMM m   R!3A!68J18Mt{OhijOk l l l rcdSNrr1rUs rrzQueryBlockNode.__repr__Rs}rNNNN) r@rArBr7rrZrrrrrrr1rrrrs ( ( ( (FXX&4&4&4R666(rrc(eZdZddZdZdZdZdS)SubQueryBlockNodeNc t|||||||d|_|r)d|vr%|jd|dzdS|jddS)Nrz subquery #%ssubquery)rr7rrKrrs rr7zSubQueryBlockNode.__init__Wsg{rJrr$s rrzSubQueryBlockNode.get_hint_textis $) # # % +(>> >D > Fldn<< & )EE ED   "do 5 5 2T_E\5]] ]D $/ ) ) &)EE ED $/ ) ) &)EE ED rcdS)Nrr1rUs rrzSubQueryBlockNode.__repr__yszrr)r@rArBr7rrrr1rrrrVsU....%%%    rrceZdZdZdZedZedZedZedZ dZ dZ d Z d Z d Zd S) rTct|||d|ddddt ||_|jt|jd|j dddd|j dddd|j d|jdddd| |j||_ g}|j d r|d |rvt!d ||_|j d|jd| |jnd|_||_||_||_||_||_dS) Nrrr0r^r|Trrrrr)rDr7rrDrrKrr rrrCrBrrrrr rZrrrrIr>rJr)r8rRr;rr>rJrrs rr7zMaterializedJoinNode.__init__sT7+++  RR(((+D11  %%e,,, ##A&&& sCc222 ##Cc3777 ""4(((   Aq!,,, $ ?  6 7 7 & LL % % %  (#-chhuoo#>#>D  . .t 4 4 4  . .r 2 2 2 HHT) * * * *#'D &!  "  rc|jj}|SrrXrTs rrZz!MaterializedJoinNode.inner_heights L rc|jSrrrUs rrVz MaterializedJoinNode.inner_widthrrc|jdz SrnrrUs rraz(MaterializedJoinNode.vconnect_pos_offsetsz!|rcLg}|jr||j|Sr)rrrs rrzMaterializedJoinNode.childrens* : & MM$* % % % rcLddi}||jd|z}|S)NrFzG*Buffered Join Result Using Temporary Table: %(using_temporary_table)s )rrrs rrz"MaterializedJoinNode.get_hint_texts:  !!! rct|||j}|r|||j}||jz|jz|_|j|jj z|j z|j z|j z|_ ||j|j|jj z|jdddSdSNr)rDrrrT padding_left padding_rightrrZrHrrY padding_toppadding_bottomrrrK)r8rrrs rrz MaterializedJoinNode.do_relayoutsc***   $   c " " "+K&(99DT*T U U U L  a # # # # # $ $rcd|jzdzS)Nr~r)r;rUs rrzMaterializedJoinNode.__repr__s49}S  rct|||||j|j|ddt|jt|j dz | d| ddgd| dddd| |dS)Nr^r0rorrrr})rDrrrr=r>rr_rrrrrrrrs rrzMaterializedJoinNode.do_rendersdC(((   dfdf%%% c3DK 0 0#dl2C2CA2EFFF 1 c3Z### Cc3///  rc|jr\t|jtsC||ddddt|jt rw|||jd|jjd|jjd| ||jddz|jddz nn| ||j d|j d|jj d| ||j ddz|j d| dSdSdS)Nrr0rr)rIrrrrrr rlrhrr rcrerrs rrz%MaterializedJoinNode.do_render_extrassW ; z$+7LMM  GGIII   q!Q * * *$+~66 \  T%7%:DK| ||jd|jd|jjd|dS)Nrr0r)rrHir)rrrrKr`rbrrIrTr rlrrr rcrer)r8rtarget_xs rrzSubQueries.do_render_extrass    1aA&&& T\0$,2E2IJJJ 9I I I{*1DK4G4MMH   Rh8J18MsTU V V V V [ mDK9N!O!O m   R!3A!68J18Mt{OhijOk l l l rc|jjSrrXrUs rrZzSubQueries.inner_height&r[rN) r@rArBr7rrrrrZr1rrrrsn   UUU&   ##X###rrc6eZdZdZedZdZdZdS) UnionResultcFt||d||d|jdd|jdddd|jddddd|vrt|d|_|j d|j dddd|j dd| |jnd|_||_ dS) NUNIONrrr0gffffff? table_namerr^)rr7rrKrrrCr rErrrFrr>)r8rRr>queriess rr7zUnionResult.__init__-sD'7G<<<  ""4... q!Q*** ##Cc1555 4   *4 += > >D    + +B / / /   , ,Q1a 8 8 8   + +C 3 3 3 HHT& ' ' ' ' $D  rcvtj|}|jr|d|jjzz }|SrS)rrZrrErYrTs rrZzUnionResult.inner_height@s=  # ( ( . .   . T&-- -Arc* t||ddS)Nz!!!!!!)rrs rrzUnionResult.set_attributesGs  j$)))))rcd}d|jz}|S)Nz UNION Result zj*%(table_name)s Access Type: %(access_type)s Using Temporary Table: %(using_temporary_table)s)r>r$s rrzUnionResult.get_hint_textNs"47;i@  rN)r@rArBr7rrZrrr1rrrr,s\&X ***rrceZdZdZdZdZdZdZdZdZ dZ d%dZ d Z d Z d Zd Zd ZdZd&dZdZdZdZdZdZeeeZdZdZdZdZd'dZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'd$S)(ExplainContextArrrc4||_||_||}|stdd|_n|d|_ d|_ d|_ d|_ d|_ d|_d|_d|_d|_d|_d|_d|_dS)NzCould not process JSON data rFg?rr)_jsonrprocess_explain_outputr_rootrrrrgetvalue _old_offsetr_scale_offset _extra_offset_canvasrsizeaggregate_costsrycost_value_is_amount)r8rrrrs rr7zExplainContext.__init__fs ,++D11 $ 5 6 6 6DJJqDJ $  "  #   $#' $)!!!rrc^|rtd|d|ddStd|zdS)Nz.While parsing JSON output: unexpected node in rdrz/While parsing JSON output: unexpected node: %s r)r8noderRs r unexpectedzExplainContext.unexpectedsN  Q IRYRYRY[_[_[_` a a a a a H4O P P P P Prc|dd}|d}d}i}|r|d|\}}|d}|r|d|}nd}d|vr|dpd|d<d|vrN|dpdtt |d dzd z |d<|r{t ||||||d d|d d||d |d|d St ||||d d|d d||d |d|d S)Nrrmaterialized_from_subqueryrHrfrowsrrgrhrr=rIrJ) rrrHr=r<r>rJr?r)rHr=r<r>rJr?r)r!handle_materialized_from_subqueryhandle_attached_subqueriesr_rzrr))r8tabler;r"materialized_from_subquery_nodematerialized_attributesattached_subqueries_rHs r handle_tablezExplainContext.handle_tablesyyr**%*YY/K%L%L"*.'"$ % hGKGmGmoKMgHhHh D +-D$yy)>??  '"&"A"ABWYm"n"n  "&  #5 0 0/4yy/@/@/EAE* + #5 0 0/4yy/@/@/EAUSXS\S\]gijSkSkMlMlImIm.mps.sE* + + (t/N4K1D).=")E)E&+iit&<&<"'',yy'='=+0995M+N+N+0995M+N+N    T41D).=")E)E&+iit&<&<"'',yy'='=+0995M+N+N+0995M+N+N rcg}|D]}t|turt|dkrd|vr||d}||t|dkr=d|dvr|dd}nd}t |||d|d}|g}t|dkrt dt|turt|dkrd|vr|d|d}||t|dkr%d}t |||d|d}|g}it|dkrt d||dt|dksJ|dS) Nr0r&rorerrzuh ohr) rXdictlenr*rrrihandle_query_blockr )r8datapartsrr&r loop_noders rhandle_nested_loopz!ExplainContext.handle_nested_loops 5 5DDzzT!!c$ii1nnD))$w-88 U###u::??*d7m;;&*7m4G&H &3 .t[%(ERSH U UI&KEEZZ!^^#G,,,$dt##D Q;OSW;W;W 334H$OcJdee  Y'''u::??"/K .t[%(ERSH U UI&KEEZZ!^^#G,,,$m44445zzQQxrcXg}|D]}d}i}t|D]C\}}|dkr|||d}#|dvr|||<-|||D||||t |||S)NrTr)rYitemsr.r rrr r8r; subquery_list subqueriesr/qblockrrIr}s r handle_optimized_away_subqueriesz/ExplainContext.handle_optimized_away_subqueriess ! & &DFJ"4::<<00 / / U-''!44S%FFFFOOO&+JsOOOOC....  ! !* - - -   f % % % %$j111rcg}|D]}d}i}t|D]_\}}|dkr|||d}#|dvr|||<-|dkr||}I|||`|r||||t|||S)NrTrr&)rYr4r.r*r rrrr5s rr%z)ExplainContext.handle_attached_subqueriess ! & &DFJ"4::<<00 / / U-''!44S%FFFFOOO&+JsOOG^^!..u55FFOOC.... 2%%j111   f % % % %$j111rcd}i}t|D]E\}}|dkr|||dd}%|dvr|||</|||F||fS)NrT) is_subqueryis_materializedr)rYr4r.r )r8r;r/ inner_qblockrrIr}s rr$z0ExplainContext.handle_materialized_from_subquerys  tzz||,, + +JCm###66sEtei6jj KKK"' 3T****Z''rc i}g}t|D]\}}|dvr|||<|dkrl|D]h}|d|d||d|di|||t |||S)N)rr=rquery_specificationsrrr)r>r)rYr4rrr.r r)r8r;r/r>qblocksrIr}qspecs rhandle_union_resultz"ExplainContext.handle_union_result stzz||,, + +JCLLL!S ..."eeEIIk***IIk***NN4#:#:=%))TaJbJb#c#cdddde T****4dG<<<>000)-)H)He)T)T&&''11#u==T**** =   ;(&-&?&<+/09 ;;;;&d&-&?&<+/09 ;;;; _ $ $'dGT9jYY Y( Q$T4)ZQjkkk$T4)ZPPPrcg}t|D]4\}}|dkr)||||5|Sr)rYr4rr.)r8r/outputrIr}s rhandlezExplainContext.handleas_tzz||,, C CJCm## d55c5AABBB rc,||Sr)rK)r8r/s rrz%ExplainContext.process_explain_outputis{{4   rc|jrQtj}|j|dt |dSdSr)rrrrrr)r8rs rrzExplainContext.dumpnsS :  A JOOAq ! ! ! !**,,       rc||j_dSrrr)r8vs r _set_tooltipzExplainContext._set_tooltipus  rc|jjSrrOrUs r _get_tooltipzExplainContext._get_tooltipxs |##rct||_|j|j||_||_|jjdddddS)Nr|r0)r5rrrr_scrollrKrC)r8viewscrollqueue_repaint_cbs r init_canvaszExplainContext.init_canvas~s] 011  $$$   ))#sC;;;;;rc||f|_dSr)rr8r=r>s r set_offsetzExplainContext.set_offsets1v rc||jd|jdzz }||jd|jdzz }|jt |t |Sr)rrrrr_r[s rrzExplainContext.client_to_screens` dl1o 21 556 dl1o 21 556z**3q663q66:::rct|jd|jd}t|}|j|dd|jd|jd||dS)Nrr0rTrY)r rrrrepaint write_to_png)r8pathimgrs r export_to_pngzExplainContext.export_to_pngso1dilCCC S\\ RAty|TYq\BBB rc&ttdd}|j||j|j|j|jj\}}||jdzz||jdzzf|_|jS)Nr0r_ro)rr rrrglobal_paddingr)r8paddingr-rrs rlayoutzExplainContext.layouts Lq333 4 4 q!!! +T-@AAAz1+a//T5H15L1LL yrc||jd|jdz|jd|jdz||j|j |j|dd|jd|jd|jr |j \}}}}|j\}}t||}t||}| d| dd||| | |||||tj|dddd|| |||||dddd|dSdS#t($r,ddl}t-d|zYdSwxYw)Nrr0rr^z!Exception repainting explain: %s )rrrscalerrr`rr_overview_visible_rectrrr new_sub_path set_fill_rulecairoCAIRO_FILL_RULE_EVEN_ODDrrrri tracebackr format_exc) r8rr=r>rrtotal_wtotal_hrps rr`zExplainContext.repaints T\!_t'9!'<efff dk*** U L Q49Q<1 F F F! !8 1a#'9 gq//gq//!!!$$$ Q7G444!!! Q1a(((  !?@@@""1aC000  Q1a(((""1aC000 !  " U U U     :Y=Q=Q=S=SS T T T T T T Us*EG2G>=G>cZ|j|_|j|_|j}|\}}}}|j\}}||kr||krdSt||z }t||z }||kr d|z |_n d|z |_d|_||_ |||jzz dz |||jzz dz f|_ |j d|j t|t||j dS)Nr0Troz#b3b3b3)rrr _old_scalerUget_content_rectrrzrrkrrset_back_colorrr_set_needs_repaint) r8r2_ view_width view_heightr" total_heightdwdhs renter_overview_modez"ExplainContext.enter_overview_modes><+ L ) ) + +()%1j+$(I! \ * $ $)D)D F ;  * , < ; . 77B$DKKB$DK!&'#);+DDaG+XdgkgrXrJrtuIuu !!),,, C OOS-=-=>>> $$&&&&&rc|j\}}}}d|_|j|_d|_|jd|jt|j |j dt|j |j d|j |||jdS)NFrz#ffffffrr0)rkrrurrrrwrrrUrrr scroll_torx)r8r=r>rrs rleave_overview_modez"ExplainContext.leave_overview_modes0 1a"o # !!),,, C 6 6 8 8$)A,GGT\MdMdMfMfhlhqrshtIuIuvvv q!$$$ $$&&&&&rc2||jd|jdzz}||jd|jdzz}||jz}||jz}|j\}}|j\}}}}||dz z}||dz z}t ||}t ||}t t |d||z }t t |d||z }t|t|||f|_|j dS)Nrr0ro) rrrrrkrrr_rrx) r8r=r>r"r|rrwwhhs r mouse_movedzExplainContext.mouse_moveds dl1o 21 556 dl1o 21 556 T[ T[$(I! \4BB R!V  R!V  [ ! ! \ " " Aq ;+ , , Aq <", - -&)!ffc!ffb"&<# $$&&&&&rc.|dSr)rr[s r mouse_downzExplainContext.mouse_downs   """""rcL|jrt|St|Sr)rr.r,)r8r}s rrzExplainContext.fmt_costs'  $ e$$ $u:: rc*d|k|_||_dS)Ndata_read_per_join)rry)r8r;s rshow_cost_info_typez"ExplainContext.show_cost_info_types$8D$@!#'   rc||_dSr)r)r8flags rshow_aggregated_cost_infoz(ExplainContext.show_aggregated_cost_info s#rcX|jr"|jd|_dSdSr)rrrUs rrzExplainContext.close_tooltips5 < L   DLLL  rN)r)FF)r)(r@rArBrrr rrrrfr7r r*r2r9r%r$rCr.rKrrrQrSrrrYr\rrdrhr`rrrrrrrrr1rrr r \sNHHNNMN***:QQQQ)))XB222"222( ( ( ( = = = EQEQEQEQP!!!    !!!$$$h|\22G<<<;;; UUU8'''>''''''"###((( $$$     rr ))r workbench.logrworkbench.graphics.canvasrrrrr r r r workbench.graphics.cairo_utilsr rrnrrrr$r.r3r5rDrrtrurvrwrxryWHITEr)rrrrrrrr r1rrrs, $#####PPPPPPPPPPPPPPPPPPPP@@@@@@@@     ! ! !     v   aaaaaaaaaa*aaaaaaJ nnnnn[nnnb  U?U?U?U?U? U?U?U?rc;c;c;c;c;Ic;c;c;LUUUUUKUUUpEEEEE[EEEP$$$$$$$$Prrrrr;rrrj5#5#5#5#5#5#5#5#r)))))*)))`u u u u u u u u u u r