@Qc@sddlZddlZddlmZmZmZddlmZmZmZmZdefdYZ de fdYZ de fd YZ d e fd YZ d e fd YZ de fdYZdd dYZdZdZdZdZdZdZdZdZedkrddlZeejdkrejjeejjjddddqejdZ!ee"e!jde!dndS(!iN(tContextt ImageSurfacetPattern(tVBoxNodet TextRectangletintersect_linestdraw_arrow_headtTreeNodecBsAeZdZdZddZdZdZdZRS(cCstj|d|_t|_||_||_||_g|_t ||_ |j j dddd|j j |j d|_dS(Nig?g?g?i(iiii(Rt__init__tpaddingtFalsetexpand_to_filltnametparenttdatatchildrenRtcontenttset_fill_colortitemstappendtextra_bottom_space(tselfR R ttitleR((s..\modules\explain_renderer.pyRs       cCsd|jjS(Ns (Rttext(R((s..\modules\explain_renderer.pyt__repr__)scCs[|s|j}ng}x<ddddgD](}|j|tr+|j|q+q+W|S(Ntusing_temporary_tablet dependenttusing_filesortt cacheable(RtgetR R(RRtflagstf((s..\modules\explain_renderer.pyt get_flags,s cCs"x|jD]}|jq WdS(N(Rtprocess(Rtch((s..\modules\explain_renderer.pyR!6scCs!tj|||j|dS(N(Rt do_rendert render_shadow(Rtc((s..\modules\explain_renderer.pyR#:scCsdS(Ni((RR%R"((s..\modules\explain_renderer.pyt'minimal_space_required_space_for_ref_to>sN( t__name__t __module__RRtNoneR R!R#R&(((s..\modules\explain_renderer.pyRs    t OperationNodecBseZdZdZRS(cCstj|||||tdj|j|_d|j_d|j_d|j_ d |j_ |j j |j|j dddddS( Ns i iig?g?g?i(iiii(RRRtjoinR RR)Rt border_colort font_sizeR RRR(RR R RR((s..\modules\explain_renderer.pyRCs    cCsgtj|||j||j\}}|j\}}|j|d|d|||jdS(Ng?(RR#tapply_attributestpostsizet rectangletstroke(RR%txtytwth((s..\modules\explain_renderer.pyR#Ms  (R'R(RR#(((s..\modules\explain_renderer.pyR*Bs t SubqueryNodecBs,eZdZdZdZdZRS(cCstj|||d|d |_t|_d|j_d |j_d|j_ d |j_t dj |j |_ d|j _d|j _d|j _ d|j _d|j _|jj|j dS(NtSUBQUERYii ig?g?is g333333?i(ii ii (g?g?g?g?(ii ii (g?g?g?g333333?(ii ii (RRR tTrueR R)RR,t fill_colort line_spacingRR+R tsubtitleR-RR(RR R R((s..\modules\explain_renderer.pyRWs           cCs d|jS(Ns (R (R((s..\modules\explain_renderer.pyRhscCstj|d}d}xQ|jD]F}|jdkrA|}q#t|trY|}q#dG|jG|GHq#W|r|r|jj|||_|jj |ndS(Nt query_blocks"Unexpected child type in subquery:( RR!R)RR t isinstancet TableTreeNodetremoveR R(Rt tmp_tableR=R"((s..\modules\explain_renderer.pyR!ks     csfd|j||j\}}|j\}}|}tj|||j|jdddd|jdddd|jddgd|j|d|d|||j |j dS(Ncs:|jd}x&|jD]}t||}qW|S(Ni(R/Rtmin(tnodeR3R"(tleftmost(s..\modules\explain_renderer.pyRD~s iigffffff?g@g?( R.R/tgsizeRR#tsavetset_source_rgbatset_dashR1R2trestore(RR%R3R4R5R6txx((RDs..\modules\explain_renderer.pyR#}s    (R'R(RRR!R#(((s..\modules\explain_renderer.pyR7Vs   R?cBsneZdZdZdZddZdZdZdZdZ d Z d Z d Z RS( cCstj|||||dddddddf|_|j|_d|j_i|_|jjd|jjddddd|_ d|_ g}|j dr|j d|dn|r t dj||_ |j j|jj|jj |j ndS(Ng@_@iis+../../images/grt/structs/db.Table.16x16.pngtusing_join_buffers join buf (%s)s (RRR,RtheadingR)t referencestset_icont set_colortbodyt flags_boxthas_keyRRR+tcolorR(RR R RRR((s..\modules\explain_renderer.pyRs !     cCsd|jjS(Ns (RLR(R((s..\modules\explain_renderer.pyRscCs|jr||j_nt||_|jj\}}}}|jj|||d|jj|jj|j|j_|j rt t t t f|j_ n d|j_ d|j_|jj|jdS(Ngffffff?ii(iiii(RPRRRLR:RRORSR,RQR R9t draw_verticesR)R RR(RRPtrtgtbta((s..\modules\explain_renderer.pyt set_body_texts    g?cCsg|jj|||||jr>|jj|||dn|jrc|jj|||dndS(Ngffffff?(RLRRPRQ(RRURVRWRX((s..\modules\explain_renderer.pyRs   c Cs|r$tj|||\}}ntj|||\}}|jjdd}|jjdd}|dk r|dk r|jdddtt||d}|d|dd|d|dd} } t j || | |d ndS( Ntfilteredtrowsg?g?gY@iii(iii( Rtstroke_line_to_parent_vtstroke_line_to_parent_hRRR)tset_source_rgbtstrtintt cairo_utilst"show_centered_text_with_background( RR%RCtverticaltp1tp2RZR[ttotalR3R4((s..\modules\explain_renderer.pytstroke_line_to_parents-c Cs^|j|j|j|jdddd|j\}}|j\}}|jjdrtj ||j d|dt |jddn|jj dd}|rP|jdd }xSt|d kr|j|}|j|jdd kr|d }d }qPqW|j||}d} |jddddddd|j|d ||jd|jd| |jd| d|j|jddddddd|j|jddddddd|jt|d | dt||jd|j|j|j| d|j||n|jdS(Ng?g?iR[ii tattached_conditioni ti g333333?is...iigo@iiii0(iii(tset_line_widtht line_widthRFRGR/R0RRRRaRbtcenterR_RR)t set_font_sizetlent text_extentstwidthREt rounded_recttheighttstroke_preservetfilltmove_toR`t y_bearingt show_textRI( RR%R3R4R5R6tcondtsuffixtextR ((s..\modules\explain_renderer.pytdo_render_attachmentss8 7   "> " "PcCst|j||j\}}|j\}}|j|j|j|d|d|||j|j|dS(Ng?(R{R/R0RGR,R1R2R$(RR%R3R4R5R6((s..\modules\explain_renderer.pyR#s  cCs}||jkrdS|j|}d}x)|D]!}t||kr-|}q-q-W|jd|j|}|jddS(Nii i (RMR)RnRmRoRp(RR%R"tref_colstlRURz((s..\modules\explain_renderer.pyR&s    cCs)tj|||jr%d|_ndS(Ni2(RtcalcRMR(RR%((s..\modules\explain_renderer.pyR~s c Cs|j}|j}|jjj||jjj|}|dkrs|j\}}|j\}} n$|j\}}|j\}} t|| ||} t||||} | r| r|j|| | ||j|n | G| GHdS(Ni( RlR Rtindext right_vertext left_vertexRt stroke_refRM( RR%R"RdRetdtp1stp1etp2stp2etets((s..\modules\explain_renderer.pyt stroke_ref_to s  (  #c Csd}|jd|j|dt|dd|dkr||||}||||}|d|ddd|} |j|d|d|d|d|d|dn8|d|dd} |j|dt|dd|j|r|j|jd|j|d} |d|d|d| j d} | } |j ddddt j |t| t| d j |d|jn|dkrt|||nt|||dS( NcSsBt|d|d|dddt|d|ddfS(Niig?ii(R`(RdReR((s..\modules\explain_renderer.pytpx siig?iii g?s (RjRuR`tcurve_totline_toR2RFRmRoRpRGRatshow_text_lines_with_borderR+RIR( RR%RdReRtcolumnsRtp11tp22ttext_yRzR3R4((s..\modules\explain_renderer.pyRs.  " 7"   %.  ( R'R(RRRYRRgR{R#R&R~RR(((s..\modules\explain_renderer.pyR?s      "  tIndexedTableTreeNodecBs#eZdZdZdZRS(cCstj|||||dS(N(R?R(RR R RR((s..\modules\explain_renderer.pyR>sc Cs8tj||j}i}|jdkrhx:|jD],}|jjdr5|||jd %ss, s (t is_key_refRRRRR@RR+RY(RtflagRtkeysR((s..\modules\explain_renderer.pyR^s     *(R'R(RR!R(((s..\modules\explain_renderer.pyR=s  tMaterializedTableTreeNodecBs,eZdZdZdZdZRS(cCstj|||||t|_d |_|jd|jjdddd|jjdddd|j }t dj ||_ d|j _|j jddddd|j _d |j _d|j _|jj|j dS( Nii sSUBQUERY, materialized fromg?g?is g333333?ii(ii i i (ii ii (R?RR9R R RYRPRROR RR+R<R)R,R;R-RR(RR R RRR((s..\modules\explain_renderer.pyRss        cCs|jj|||ddS(Ng333333?(RLR(RRURVRWRX((s..\modules\explain_renderer.pyRscCsxp|jD]e}|jdkr |j|_x|jD]}||_q5W|jj||jj|jPq q Wdj|j|j|j _ t j |dS(Ntmaterialized_from_subquerys ( RR Rt subquery_infoR R@textendR+R R<RR?R!(RR"tcch((s..\modules\explain_renderer.pyR!s  !csfd|j||j||j\}}|j\}}|}tj|||j|jdddd|jdddd|jddgd|j |d|d|||j |j dS(Ncs:|jd}x&|jD]}t||}qW|S(Ni(R/RRB(RCR3R"(RD(s..\modules\explain_renderer.pyRDs iigffffff?g@g@g?( R{R.R/RERR#RFRGRHR1R2RI(RR%R3R4R5R6RJ((RDs..\modules\explain_renderer.pyR#s     (R'R(RRR!R#(((s..\modules\explain_renderer.pyRrs   t TreeLayoutercBsVeZdZdddZdZdZdZdZdZdZ RS( cCsL||_|jdd|_|jdd|_|jdt|_dS(Ntyspacingi<txspacingiRc(trootRRRR9Rc(RRtoptions((s..\modules\explain_renderer.pyRs icCs|j\}}}}|jr*|j} n |j} | gt|jd} | jd|jrFxtt|jD]} |j| } | dkr|j| d} | j|| }t | | dt || | d            !     cCs%t||jjdd|}|S(Nt _subqueriest _subquery(R7R treplace(R RRC((s..\modules\explain_renderer.pytprocess_subquery~s!cCst|tk rdS|}|jdr||dtd !}|jdr^|dd!}nt|||j|}nx|dkrd|jd}t||||}|j dd d d n+t||||}|j dd d d |S( Nt _operationitingiR=squery_block #%st select_idg?g?g?i( ttypetdictR)tendswithRnR*tupperRRR(R R RtoperRC((s..\modules\explain_renderer.pyt process_nodes c Cs|dkrt||}n3|jdr?t||}nt|||}|s[dSx|jD]\}}|d krqhnt|tkrt|||}|r|j j |qqht|t krh|rt|dtkr|dj dgkrt |||i}|jdddd |j j |x|D]5}t|d|d}|rO|j j |qOqOWqt |||i}|j j |x@|D]5}t||d |}|r|j j |qqWqhqhW|S( NRs_subqueries itemRRig?g?g?is item(s possible_keyssref(RRRRR)RRRttree_from_jsonRRtlistRRR( R R tjsonRCRtvalueR"tintermtitem((s..\modules\explain_renderer.pyRs<  5  cCsd}||rCt|jdkrC|jd}d|_nxot|jD]^\}}||rt|jdkr|jd|j|<||jd_nt|qSW|S(NcSs|jdkrtStS(Ntquery_specificationtnested_loop_itemR=(RRs query_block(R R9R (RC((s..\modules\explain_renderer.pyt is_uselesssii(RnRR)R Rtstrip_useless_nodes(ttreeRRR"((s..\modules\explain_renderer.pyRs !  !c Cs<d}t|}tdd|d}|jt|}t||}|j|\}} |jd|rtj |} nd} | r| j t j kr|j t| } | jt j|j| |j|jn|jddd|j|j|||||d| |dfS(Ni2R=i ii(RRR)R!RRRRmRtfrom_pngtstatustcairotCAIRO_STATUS_SUCCESSRFRt set_extendtCAIRO_EXTEND_REPEATt set_sourcetpaintRIR^R( Rt json_texttbackground_imageRR RRRR5R6tbgimagetpat((s..\modules\explain_renderer.pytrender_json_datas,          cCsd}t|}tdd|d}|jt|}t||}ttjdd}t |} |j | \} } ttj| |d| |d}t |} | j d|rtj |} nd} | rD| j tjkrD| jt| } | jtj| j| | j| jn| jddd| j|j| |||j|| |d| |dfS(Ni2R=i idii i(RRR)R!RRRRtCAIRO_FORMAT_ARGB32RRRmRRRRFRRRRRRIR^Rt write_to_png(RRtpng_fileRR RRRtimgRR5R6RR((s..\modules\explain_renderer.pytrender_json_data_to_files6    %         t__main__is\nRis explain.pngs.png((#RRaRRRRRRRRR*R7R?RRRRRRRRRR RR'tsysRntargvtstdintreadlinetreadRR)Rtopen(((s..\modules\explain_renderer.pyts2  "'<5?  *   #   !   (