@@ -327,6 +327,7 @@ def __init__(
327327 # triggering the destruction of the exposed buffers.
328328 self ._exposed_buffers : set [Buffer ] = set ()
329329 self ._recompute_data ()
330+ self ._recompute_children ()
330331
331332 def _get_children_from_pylibcudf_column (
332333 self ,
@@ -500,6 +501,7 @@ def set_base_mask(self, value: None | Buffer) -> None:
500501 )
501502
502503 self ._clear_cache ()
504+ self ._recompute_children ()
503505
504506 def _clear_cache (self ) -> None :
505507 self ._distinct_count .clear ()
@@ -557,23 +559,8 @@ def base_children(self) -> tuple[ColumnBase, ...]:
557559
558560 @property
559561 def children (self ) -> tuple [ColumnBase , ...]:
560- if self .offset == 0 and self .size == self .base_size :
561- self ._children = self .base_children
562- if self ._children is None :
563- if not self .base_children :
564- self ._children = ()
565- else :
566- # Compute children from the column view (children factoring self.size)
567- children = ColumnBase .from_pylibcudf (
568- self .plc_column .copy ()
569- ).base_children
570- dtypes = (
571- base_child .dtype for base_child in self .base_children
572- )
573- self ._children = tuple (
574- child ._with_type_metadata (dtype )
575- for child , dtype in zip (children , dtypes , strict = True )
576- )
562+ """Return the offset-aware children columns."""
563+ assert self ._children is not None
577564 return self ._children
578565
579566 def set_base_children (self , value : tuple [ColumnBase , ...]) -> None :
@@ -584,7 +571,6 @@ def set_base_children(self, value: tuple[ColumnBase, ...]) -> None:
584571 if any (not isinstance (child , ColumnBase ) for child in value ):
585572 raise TypeError ("All children must be Columns." )
586573
587- self ._children = None
588574 self ._base_children = value
589575
590576 def _recompute_data (self ) -> None :
@@ -600,6 +586,21 @@ def _recompute_data(self) -> None:
600586 end = start + self .size * self .dtype .itemsize
601587 self ._data = self .base_data [start :end ]
602588
589+ def _recompute_children (self ) -> None :
590+ """Recompute the offset-aware children columns."""
591+ # Check for empty base_children first to avoid accessing properties on empty collections
592+ if not self .base_children :
593+ self ._children = ()
594+ elif self .offset == 0 and self .size == self .base_size :
595+ # Optimization: for non-sliced columns, children == base_children (just references)
596+ self ._children = self .base_children
597+ else :
598+ # Slice each base child using the parent's offset and size
599+ self ._children = tuple (
600+ base_child .slice (self .offset , self .offset + self .size )
601+ for base_child in self .base_children
602+ )
603+
603604 def _mimic_inplace (
604605 self , other_col : Self , inplace : bool = False
605606 ) -> None | Self :
@@ -614,8 +615,8 @@ def _mimic_inplace(
614615 self .plc_column = other_col .plc_column
615616 self ._base_children = other_col ._base_children
616617 self ._recompute_data ()
618+ self ._recompute_children ()
617619 self ._mask = None
618- self ._children = None
619620 self ._clear_cache ()
620621 return None
621622 else :
0 commit comments