
    bin~                       d dl mZ d dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
mZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ d dl m!Z!m"Z"m#Z#m$Z$ d dl%m&Z& d d	l'm(Z(m)Z) d d
l*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9 dZ:dZ; G d de      Z< G d de<e      Z= G d de<e      Z>d Z? G d de<      Z@ G d de<e      ZA G d de      ZBy)    )annotationsN)merge_sortedunique)TaskTaskRef)AndBinop	BlockwiseDropDuplicatesBlockwiseElemwiseExprFilterIndexIsinPartitionsFiltered
ProjectionUnaryop_DelayedExprare_co_aligneddetermine_column_projectionis_filter_pushdown_available)Repartition)RearrangeByColumn_contains_index_name_is_numeric_cast_type_select_columns_or_index)_convert_to_list)	make_metameta_nonempty)_concat_wrapper_merge_chunk_wrapper_split_partitionmerge_chunk)partitioning_index)	is_scalar)_tokenize_deterministic)Key)applyget_default_shuffle_method__hash_partition_partitionsc                     e Zd ZdZg dZddddddddddd
Zed        Zd	 Zd
 Z	d Z
d Zed        Zed        Zej                  d        Zej                  d        Zed        Zed        Zd Zej                  d        Zej                  d        Zej                  d        Zej                  d        Zej                  d        Zd Zd Zd Zy)MergezMerge / join two dataframes

    This is an abstract class.  It will be transformed into a concrete
    implementation before graph construction.

    See Also
    --------
    BlockwiseMerge
    Repartition
    Shuffle
    )leftrighthowleft_onright_on
left_indexright_indexsuffixes	indicatorshuffle_method_npartitions	broadcastinnerNF_x_y)
r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   c                    t        d      )Nz>please use _filter_passthrough_available to make this decision)NotImplementedErrorselfs    Z/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/dask/dataframe/dask_expr/_merge.py_filter_passthroughzMerge._filter_passthrough^   s    !L
 	
    c                   t        | ||      r|j                  }t        |t              r|j                  }t        |t              r| j                  |      }|y|j                  | j                  j                        r| j                  dv S |j                  | j                  j                        r| j                  dv S t        |      dkD  ryyt        |j                  t              r`t        | |j                  j                        }|j                  || j                     D ch c]  } |        |       j                   c}v S yc c}w )NFr.   r:   leftsemir/   r:   r   T)r   	predicate
isinstancer   r.   _predicate_columnsissubsetcolumnsr0   r/   lenr   _name)rA   parent
dependentsrI   predicate_columnsnewxs          rB   _filter_passthrough_availablez#Merge._filter_passthrough_availabled   s%   'fjA((I Y,%NN	 Y, $ 7 7	 B ( ))$))*;*;<xx#@@@"++DJJ,>,>?xx#555&'!+((#. v//445C99#-djj#9!QS_		!   !s   'E4Ec                `   t        |t        t        t        f      r| j	                  |      S t        |t
              rrt        |t              ry t        |j                  t              s| j	                  |j                        S t        |j                  t              r| j	                  |      S y y N)rJ   r   r   r   _get_original_predicate_columnsr	   r   r/   r   r.   r   )rA   rI   s     rB   rK   zMerge._predicate_columns~   s    i*gt!<=77	BB	5))S)ioot4;;INNKKIOOX6;;IFF rD   c                    t               }|g}t               }|r|j                         } j                  |j                  k(  r,|j                  |v r;|j                  |j                         t	        |t
              rg|j                         }|j                  |       t         fd|D              r|j                  |j                         |r|S )Nc              3  P   K   | ]  }|j                   j                   k(    y wrW   )rO   ).0drA   s     rB   	<genexpr>z8Merge._get_original_predicate_columns.<locals>.<genexpr>   s     ?Q177djj(?s   #&)setpoprO   addrJ   r   dependenciesextendanyupdaterM   )rA   rI   rR   stackseenera   s   `      rB   rX   z%Merge._get_original_predicate_columns   s    Eu		AzzQWW$ww$HHQWW!\*>>+LLL&?,??!((3   ! rD   c                R    t        |       j                   d| j                  dd   dS )N(i))type__qualname__rO   r@   s    rB   __str__zMerge.__str__   s+    t*))*!DJJrsO+<A>>rD   c                   | j                   rK| j                  j                  j                         }|j	                  | j
                  j                         |S t        | j                  t              rt        | j                        n| j                  t        | j                  t              rt        | j                        hS | j                  hS rW   )_is_single_partition_broadcastr.   -unique_partition_mapping_columns_from_shufflecopyrd   r/   rJ   r1   listtupler2   rA   results     rB   rp   z3Merge.unique_partition_mapping_columns_from_shuffle   s    ..YYLLQQSFMM$**RRSM $.dllD#AE$,,t||$.t}}d$CE$-- 
 	
IM
 	
rD   c                L    dD ci c]  }|| j                  |       c}S c c}w )N)r0   r1   r2   r3   r4   r5   r6   )operand)rA   ks     rB   kwargszMerge.kwargs   s1    
 t||A
 	
 
s   !c                   t        | j                  j                        }t        | j                  j                        }| j                  j                         }|d   dk(  rd|d<   t         |j                  |fi |      S )Nr0   rG   r.   )r   r.   _metar/   ry   rq   r   merge)rA   r.   r/   ry   s       rB   r{   zMerge._meta   sj    TYY__-djj../!!#%=J&"F5ME4V455rD   c                ~    | j                  d      | j                  d      S t        | j                               dz
  S )Nr8      )rw   rN   
_divisionsr@   s    rB   r8   zMerge._npartitions   s7    <<'3<<//4??$%))rD   c                    | j                  d      0| j                  dk(  r!t        | j                  | j                        S | j                  S )Nr8   r/   new_partitions)rw   broadcast_sider   r.   r8   r@   s    rB   _bcast_leftzMerge._bcast_left   s@    <<'3""g-"499T=N=NOOyyrD   c                    | j                  d      0| j                  dk(  r!t        | j                  | j                        S | j                  S )Nr8   r.   r   )rw   r   r   r/   r8   r@   s    rB   _bcast_rightzMerge._bcast_right   s@    <<'3""f,"4::d>O>OPPzzrD   c                6    | j                         j                  S rW   )_lower	divisionsr@   s    rB   r   zMerge._divisions   s    {{}&&&rD   c                d    | j                   j                  | j                  j                  k  rdS dS )Nr.   r/   )r.   npartitionsr/   r@   s    rB   r   zMerge.broadcast_side   s(    ..1G1GGvTWTrD   c                F   d\  }}| j                   }t        | j                  t              r| j                  }n&t        | j                  t              r| j                  }| j
                  xs
 t               }|dv r| j                  dv r| j                  |k7  r|durt        | j                  j                  | j                  j                        }t        | j                  j                  | j                  j                        }|s|t        j                  |      |z  k  ryy)N)g      ?N)disktasksp2p)r:   r.   r/   rG   FT)r   rJ   r9   floatboolr7   r)   r0   minr.   r   r/   maxmathlog2)rA   broadcast_biasr9   r   s_methodn_lown_highs          rB   is_broadcast_joinzMerge.is_broadcast_join   s    $-!	,,dnne,!^^N-I&&F*D*F00BBN*&		--tzz/E/EFE..

0F0FGFUTYYv%6%GGrD   c                    t        | j                  j                  | j                  j                        }|dk(  xsT | j                  j                  dk(  xr | j                  dv xs) | j                  j                  dk(  xr | j                  dv S )Nr~   rH   rF   )r   r.   r   r/   r0   )rA   r8   s     rB   ro   z$Merge._is_single_partition_broadcast   s    49900$**2H2HIA :yy$$) /..: zz%%* :99	
rD   c                    | j                   xs  t        | j                  | j                        xr | j                  j                  S rW   )r3   r   r.   r1   known_divisionsr@   s    rB   merge_indexed_leftzMerge.merge_indexed_left  s7     OOL3DIIt||L(ii''	(rD   c                    | j                   xs  t        | j                  | j                        xr | j                  j                  S rW   )r4   r   r/   r2   r   r@   s    rB   merge_indexed_rightzMerge.merge_indexed_right  s9     O 4TZZ O)jj((	)rD   c                    t        |t              s!||j                  v xs |f|j                  v }|S t        |      |j                  v }|S rW   )rJ   rr   rp   rs   )rA   expronru   s       rB    _on_condition_alread_partitionedz&Merge._on_condition_alread_partitioned  sW    "d#dHHH O5DNNN   2Y$"T"TTFrD   c                8   | j                   }| j                  }| j                  }| j                  }| j                  }| j
                  }| j                  }| j                  ||      }| j                  ||      }	| j                  rt        ||fi | j                  S |}
|}| j                  rw| j                  rkt        t        t        |j                   |j                                     }t#        |      dk(  r
|d   |d   f}t%        ||d      }t%        ||d      }d x}
}n|r$|j&                  j(                  j*                  }
|
d}
|r$|j&                  j(                  j*                  }|d}| j,                  r| j.                  | j0                  }}| j2                  dk7  r@| j4                  dk(  rt7        ||
|j8                        }nt7        |||j8                        }t;        ||| j2                  ||||| j<                  | j>                  	      S | jA                  d	      xs4 tC        | j                   j8                  | j                  j8                        }|
s|rM|d
k(  s|FtE               d
k(  r9|s7|	s5tG        ||| j2                  ||| j<                  | j>                  |||
||      S |
r+|r| j                   j8                  |k(  st7        ||
|||      }|r+|	r| j                  j8                  |k(  st7        |||||      }t        ||fi | j                  S )Nr~   r   T)new_divisionsforce_indexr:   r.   )npartitions_outr8   r   )
r0   r1   r2   r5   r6   r3   r4   shuffle_left_onshuffle_right_onr8   )r   methodindex_shuffle)$r.   r/   r1   r2   r3   r4   r7   r   ro   BlockwiseMergery   r   r   rr   r   r   r   rN   r   indexr{   namer   r   r   r0   r   r   r   BroadcastJoinr5   r6   rw   r   r)   HashJoinP2P)rA   r.   r/   r1   r2   r3   r4   r7   left_already_partitionedright_already_partitionedr   r   r   shuffle_npartitionss                 rB   r   zMerge._lower  s   yy

,,==__
&&,, $(#H#Hw#W $($I$I8%
! ..!$=== "#""t'?'?VL$QRSI9~"&q\9Q<8	YdKEt9DID155O. "&**"2"2"7"7"*&.O#(;;#4#4#9#9 #+'/$%%"..0A0Ae88w&**f40 +,0,<,<  !2!,,1,=,=! %HHMMNN
 
 #ll>: 
cII!!4::#9#9?
 /e#%*,5,-HH!..%' /!10  $)>)>BU)U % 3%(D %$***@*@DW*W &  3%)E dE9T[[99rD   c                    t        |t              r։ j                  ||      sy |j                  }t        |t              r>t         |j
                        }|j                  j                   |      }t        ||      S  j                  |j                        } j
                   j                  }} j                  d    j                  d   c|rk|j                   j
                  j                        rFdk7  rt         fd|D              rn+|j                    j
                        }	 j
                  |	   }|rk|j                   j                  j                        rFdk7  rt         fd|D              rn+|j                    j                        }
 j                  |
   }| j                  u r| j
                  u ry  t               ||g j                  dd   S t        |t        t         f      rWt#         ||      }t%        |      }t        |t               r|d }}n||j'                  d      }}t)        |      r|g} j
                   j                  }}t%         j*                        }|g }t%         j,                        }|g } j                  d    j                  d   cg g }}g g }}|j                  D ]V  }||v s||v r|j/                  |       |  |v s&|j/                  |       ||j                  v sF|j/                  |       X |j                  D ][  }||v s||v r|j/                  |       |  |v s&|j/                  |       ||j                  v sF||vsK|j/                  |       ] |j1                  |D cg c]	  }||vs| c}       |j1                  |D cg c]	  }||vs| c}       t3        |      t3        |j                        k  s!t3        |      t3        |j                        k  r> t               ||   ||   g j                  dd   }| t        |      |      S ||   S y y c c}w c c}w )Nr   r~    c              3  v   K   | ]0  }|  j                   v xr |j                  j                   v  2 y wrW   )rM   r/   )r[   colleft_suffixrA   s     rB   r]   z%Merge._simplify_up.<locals>.<genexpr>  sB      - eK=)T\\9WcTZZEWEW>WW-   69c              3  v   K   | ]0  }|  j                   v xr |j                  j                   v  2 y wrW   )rM   r.   )r[   r   right_suffixrA   s     rB   r]   z%Merge._simplify_up.<locals>.<genexpr>  sB      . eL>*dll:WsdiiFWFW?WW.r      rM   )rJ   r   rU   rI   r   r.   r/   
substituterK   r5   rL   rM   rc   rk   operandsr   r   r   r   rw   r%   r1   r2   appendrb   r^   )rA   rP   rQ   rI   rS   new_predpredicate_colsnew_left	new_rightleft_filterright_filterrM   
projectionparent_columnsr.   r/   r1   r2   project_leftproject_rightright_suff_columnsleft_suff_columnsr   cru   r   r   s   `                        @@rB   _simplify_upzMerge._simplify_up  s>   ff%55fjI((I)S)T9>>2$??55dC@c8,,!44V5E5EFN"&))TZZiH(,a(8$--:J%K."9"9$)):K:K"L"$ --- *
 "+"6"6tTYY"GK#yy5H."9"9$**:L:L"M2%# .-. +
 #,#7#7djj#IL $

< 8IDJJ&8tyy+@4:h	FDMM!"4EFFfz512 2$
KG&w/G&%(-4dN
-4fnnY6ON
$(\
))TZZ%D&t||4G'6H(,a(8$--:J%K*,b-L46 1 || 7'>SJ%6 '',u[M*j8 '',emm+ +11#67 }} 6(?cZ&7!((-u\N+z9!((-dll*s,/F *0056 ,= Wq,AV WX  .Iq!=2HI < 3t||#44M8JSN 9 $d&m(<?C}}QR?P ")'4<//n--9i 3^ !XIs   	Q)Q	QQ)__name__
__module__rl   __doc___parameters	_defaultspropertyrC   rU   rK   rX   rm   rp   ry   	functoolscached_propertyr{   r8   r   r   r   r   r   ro   r   r   r   r   r    rD   rB   r-   r-   6   s|   
K  I 
 

4"!,? 	
 	
 
 
 6 6 * *
    ' U U  * 
 
 ( (
 ) )
D:Lb.rD   r-   c                  N    e Zd Zg dZddddddddddddZdZd ZddZd	 Zd
 Z	y)r   )r.   r/   r0   r1   r2   r3   r4   r5   r6   r+   r   r   r8   r:   NFr;   )r0   r1   r2   r3   r4   r5   r6   r+   r   r   r8   c                     y rW   r   r@   s    rB   r   zHashJoinP2P._lower(      rD   c                |   ddl m}m}m}m} ddlm} ddlm} i }t        | j                  | j                  j                  | j                  | j                        }t        | j                  | j                  j                  | j                  | j                         }	 | ||            }
 | ||	            }d|z   }d|	z   }t#               }t#               }t%               }t'        | j                  j(                        D ]  }t+        ||f|t-        | j                  j                  |f      | j                  t.        | j(                  ||| j                  	      }|||j0                  <   |j3                  |j5                                 t'        | j                  j(                        D ]  }t+        ||f|t-        | j                  j                  |f      | j                  t.        | j(                  |	|| j                   	      }|||j0                  <   |j3                  |j5                                  | j                  j6                  j8                  d	i t.        di} ||
||g|d ||| j(                  t.        || j:                  dd      i}|||j0                  <    | j                  j6                  j8                  d	i t.        di} ||||	g|d ||	| j(                  t.        || j:                  dd      i}|||j0                  <   | j:                  D ]  }t+        | j                  |f|||	||j5                         |j5                         | j<                  | j>                  | j@                  | j6                  | jB                  | j                  | j                   | jD                        }|||j0                  <    |S )
Nr   )P2PBarrierTask	ShuffleIdbarrier_keyp2p_barrier)merge_unpack)DataFrameShuffleSpeczhash-join-transfer-specT)idr   columnmeta	parts_outr   drop_columnr   )#distributed.shuffle._corer   r   r   r   distributed.shuffle._merger   distributed.shuffle._shuffler   r&   rO   r.   r   r3   r/   r   r4   rr   "create_assign_index_merge_transferranger   r   r   _HASH_COLUMN_NAMEkeyr   refr{   assignr+   r0   r1   r2   r5   r6   )rA   r   r   r   r   r   r   dsk
token_lefttoken_right_barrier_key_left_barrier_key_righttransfer_name_lefttransfer_name_righttransfer_keys_lefttransfer_keys_rightfuncit	meta_leftbarrier_left
meta_rightbarrier_rightpart_outs                           rB   _layerzHashJoinP2P._layer+  s   	
 	
 	<E, JJIIOO  OO

 . JJJJ!!
 (	*(=>(;)?@2Z?3kA!V"f13tyy,,- 	/A#Q'!,-$$!  
A CJ%%aeeg.	/ tzz--. 	0A$a())1-.%%!    
A CJ&&quuw/	0 +DIIOO**D.?-CD	%
  	

 & ,,(** 
 !-L,TZZ%%,,F0A1/EF
&
 !	

 & ,,(** 
 "/M(( 	HX&  "!!#

  A" CJ%	& 
rD   c                &    d| j                   dz   z  S )NrW   r~   )r8   r@   s    rB   r   zHashJoinP2P._divisions  s    $++a/00rD   c                     y rW   r   rA   rP   rQ   s      rB   r   zHashJoinP2P._simplify_up      rD   returndict)
r   r   rl   r   r   r   r   r  r   r   r   rD   rB   r   r   	  sQ    K    I zx1rD   r   c            	      D    e Zd Zg dZdddddddddZd Zd Zd	 Zdd
Zy)r   )
r.   r/   r0   r1   r2   r3   r4   r5   r6   r+   r:   Nr;   F)r0   r1   r2   r3   r4   r5   r6   r+   c                   | j                   dk(  r9| j                  r| j                  j                  S | j                  j                  }n8| j
                  r| j                  j                  S | j                  j                  }d|dz   z  S )Nr.   rW   r~   )r   r4   r/   r   r   r3   r.   )rA   r   s     rB   r   zBroadcastJoin._divisions  sm    &(zz+++**00Kyy***))//K+/**rD   c                     y rW   r   r  s      rB   r   zBroadcastJoin._simplify_up  r  rD   c                     y rW   r   r@   s    rB   r   zBroadcastJoin._lower  r   rD   c           	        | j                   dk(  rO| j                  j                  }| j                  j                  }| j                  j                  }| j
                  }nN| j                  j                  }| j                  j                  }| j                  j                  }| j                  }d| j                  z   }d| j                  z   }| j                  | j                  | j                  | j                  | j                  | j                  | j                  | j
                  d}i }| j                  D ]  }	| j                  dk7  rt        ||	f||f|||	f<   g }
t        |      D ]v  }| j                  dk7  rt         j"                  ||	f|fn||	f||fg}| j                   dv r|j%                          ||	|f}t&        t(        ||f|||	|f<   |
j+                  |       x t,        |
f|| j                  |	f<    |S )Nr.   zsplit-zinter-)r0   r6   r3   r4   r5   result_metar1   r2   r:   )r.   rG   )r   r.   rO   r   r/   r2   r1   r0   r6   r3   r4   r5   r{   r+   r"   r   operatorgetitemreverser(   r!   r   r    )rA   
bcast_name
bcast_sizeotherother_on
split_name
inter_namery   r   r  _concat_listj_merge_args	inter_keys                 rB   r  zBroadcastJoin._layer  s   &(J..JJJ$$E}}H))J//JIIOOE||H

*


*
88//++::||	
 (( #	JHxx7"$H%	/Z*+ L:& /  88w.	 %,,'2 $X.O &&*>>'')'15	(	2Z1-. ##I.1/2 ,;L*ICX&'G#	JH 
rD   r  )	r   r   rl   r   r   r   r   r   r  r   rD   rB   r   r     s>    K  	I	+=rD   r   c                 4    ddl m}  ddlm 	 	 	 	 dfd}|S )Nr   )r   )merge_transferc                   |r#| g    j                         }| j                  |d<   nt        | |      }t        |t        t
        t        f      r#t        |t              r|gn
t        |      }| |   }i }|j                  j                         D ]$  \  }}	t        |	      st        j                  ||<   & |r|j                  |d      }t        ||      } | j                  di ||i}  
| ||      S )Nr   ignore)errorsr   )rq   r   r   rJ   strrr   rs   dtypesitemsr   npfloat64astyper$   r   )dfr   r   r   r   input_partitionindex_merger$  r   dtyper  s             rB   assign_index_merge_transferzGcreate_assign_index_merge_transfer.<locals>.assign_index_merge_transfer  s     rFKKME hhE(O,R7Eec4/0)%5UG4;EuIE,,,,. 	)JC$U+ jjs	) LLL9E"5+6RYY'$'b"o66rD   )r   r   r*  int)r   r   r   r  )r   r-  r  s     @rB   r   r     s*    397
 7 7< '&rD   c                      e Zd Zd Zy)	SemiMergec                t    t        | j                        }t        | j                  |g| j                  dd   S )Nr   )r   r/   r-   r.   r   rA   r/   s     rB   r   zSemiMerge._lower=  s1    '

3TYY:ab(9::rD   N)r   r   rl   r   r   rD   rB   r0  r0  <  s    ;rD   r0  c                  T    e Zd ZdZdZej                  d        Zd Zd Z	d	dZ
d
dZy)r   a|  Merge two dataframes with aligned partitions

    This operation will directly merge partition i of the
    left dataframe with partition i of the right dataframe.
    The two dataframes must be shuffled or partitioned
    by the merge key(s) before this operation is performed.
    Single-partition dataframes will always be broadcasted.

    See Also
    --------
    Merge
    Fc                    | j                   j                  j                         }|j                  | j                  j                         |S rW   )r.   rp   rq   rd   r/   rt   s     rB   rp   z<BlockwiseMerge.unique_partition_mapping_columns_from_shuffleS  s5    HHMMOdjjNNOrD   c                0   | j                   xs* t        | j                  j                  | j                        }| j
                  xs* t        | j                  j                  | j                        }|r=| j                  j                  dk(  r$| j                  dv r| j                  j                  S |r=| j                  j                  dk(  r$| j                  dv r| j                  j                  S | j                  j                  | j                  j                  k(  r| j                  r| j                  rt        t        t        | j                  j                  | j                  j                                    }t!        |      dk(  r
|d   |d   fS | j                  j                  dk(  r/| j                  j                  dk(  rt#        |      t%        |      fS |S t%        | j                  j                  | j                  j                        }d|dz   z  S )Nr~   rH   )r:   r.   rG   r   rW   )r4   r   r/   r{   r2   r3   r.   r1   r   r0   r   r   r   rr   r   r   rN   r   r   )rA   use_left	use_rightr   r8   s        rB   r   zBlockwiseMerge._divisionsY  s   ## 
';JJdmm(
 OO 
';IIOOT\\(
	 ..!3DV8V::'''

&&!+9999&&&II!!TZZ%;%;;''((|DII$7$79M9MNOI 9~"!!il33yy$$)djj.D.D.III77tyy44djj6L6LMLlQ.//rD   c                     y rW   r   r@   s    rB   r   zBlockwiseMerge._lowery  r   rD   c                     |j                   dk(  S )Nr~   )r   )rA   deps     rB   _broadcast_depzBlockwiseMerge._broadcast_dep|  s    !##rD   c           	         | j                   j                         }| j                  |d<   t        |t        | j                  | j                  |      | j                  | j                  |      fi |S )Nr  )ry   rq   r{   r   r#   _blockwise_argr.   r/   )rA   r   r   ry   s       rB   _taskzBlockwiseMerge._task  sg    !!# $

}		51

E2	

 
 	
rD   N)r:  r   )r   r'   r   r.  r	  r   )r   r   rl   r   r   r   r   rp   r   r   r;  r>  r   rD   rB   r   r   C  s<      
0@$	
rD   r   c                  T    e Zd ZddgZdddZej                  d        Zd Zd Z	d	 Z
y
)JoinRecursiveframesr0   Touter)r4   r0   c                   t        | j                        dk(  r| j                  d   j                  S | j                  d   j                  j                  | j                  dd  D cg c]  }|j                   c}      S c c}w )Nr~   r   )rN   rA  r{   join)rA   ops     rB   r{   zJoinRecursive._meta  sg    t{{q ;;q>''';;q>'',,$(KKO4b4 4s   %A?c                >    | j                         j                         S rW   )lower_completelyr   r@   s    rB   r   zJoinRecursive._divisions  s    $$&1133rD   c                    | j                   dk(  rE| j                  | j                  dd        }t        | j                  d   || j                   dd      S | j                  | j                        S )Nr.   r~   r   Tr0   r3   r4   )r0   _recursive_joinrA  r-   r2  s     rB   r   zJoinRecursive._lower  sg    88v((QR9EAHH   ##DKK00rD   c                    t        |      dk(  r|d   S t        |      dk(  rt        |d   |d   ddd      S t        |      dz  }| j                  | j                  |d |       | j                  ||d        g      S )Nr~   r   r   rB  TrI  )rN   r-   rJ  )rA   rA  midxs      rB   rJ  zJoinRecursive._recursive_join  s    v;!!9v;!q	q	   6{a##$$VET]3$$VDE]3
 	
rD   N)r   r   rl   r   r   r   r   r{   r   r   rJ  r   rD   rB   r@  r@    s=    U#K $W5I 41
rD   r@  )C
__future__r   r   r   r  numpyr&  toolzr   r   dask._task_specr   r   dask.dataframe.dask_expr._exprr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   %dask.dataframe.dask_expr._repartitionr   !dask.dataframe.dask_expr._shuffler   r   r   r   dask.dataframe.dask_expr._utilr   dask.dataframe.dispatchr   r   dask.dataframe.multir    r!   r"   r#   dask.dataframe.shuffler$   dask.dataframe.utilsr%   dask.tokenizer&   dask.typingr'   
dask.utilsr(   r)   r   _PARTITION_COLUMNr-   r   r   r   r0  r   r@  r   rD   rB   <module>r]     s    "     & )    $ >  < <  6 * 1  8& ! P.D P.fb%+ bJfE- fR"'J; ;E
UI E
P1
D 1
rD   