@@ -114,13 +114,23 @@ struct GenericNullLikePartition {
114114 std::span<IndexType> nan_range;
115115 std::span<IndexType> null_range;
116116
117+ IndexType* non_null_like_begin () const { return non_null_like_range.data (); }
118+ IndexType* non_null_like_end () const {
119+ return non_null_like_range.data () + non_null_like_range.size ();
120+ }
121+ IndexType* nan_begin () const { return nan_range.data (); }
122+ IndexType* nan_end () const { return nan_range.data () + nan_range.size (); }
123+ IndexType* null_begin () const { return null_range.data (); }
124+ IndexType* null_end () const { return null_range.data () + null_range.size (); }
125+
117126 IndexType* overall_begin () const {
118- return std::min (non_null_like_range.data (), null_range.data ());
127+ // nans are always in the middle
128+ return std::min (non_null_like_begin (), null_begin ());
119129 }
120130
121131 IndexType* overall_end () const {
122- return std::max (non_null_like_range. data () + non_null_like_range. size (),
123- null_range. data () + null_range. size ());
132+ // nans are always in the middle
133+ return std::max ( non_null_like_end (), null_end ());
124134 }
125135
126136 // Note that "_begin" is not actually the begin of the stored ranges, but can be much
@@ -310,27 +320,21 @@ struct ChunkedMergeImpl {
310320 const ChunkedNullLikePartition& left, const ChunkedNullLikePartition& right) const {
311321 // Input layout:
312322 // [left nul .. left nan .. left non-nul .. right nul .. right nan .. right non-nul]
313- ARROW_DCHECK_EQ (left.null_range .data () + left.null_range .size (),
314- left.nan_range .data ());
315- ARROW_DCHECK_EQ (left.nan_range .data () + left.nan_range .size (),
316- left.non_null_like_range .data ());
317- ARROW_DCHECK_EQ (left.non_null_like_range .data () + left.non_null_like_range .size (),
318- right.null_range .data ());
319- ARROW_DCHECK_EQ (right.null_range .data () + right.null_range .size (),
320- right.nan_range .data ());
321- ARROW_DCHECK_EQ (right.nan_range .data () + right.nan_range .size (),
322- right.non_null_like_range .data ());
323+ ARROW_DCHECK_EQ (left.null_end (), left.nan_begin ());
324+ ARROW_DCHECK_EQ (left.nan_end (), left.non_null_like_begin ());
325+ ARROW_DCHECK_EQ (left.non_null_like_end (), right.null_begin ());
326+ ARROW_DCHECK_EQ (right.null_end (), right.nan_begin ());
327+ ARROW_DCHECK_EQ (right.nan_end (), right.non_null_like_begin ());
323328
324329 // Mutate the input, stably in two steps, to obtain the following layouts:
325330 // [left nul .. left nan .. right nul .. right nan .. left non-nul .. right non-nus]
326- std::rotate (left.non_null_like_range .data (), right.null_range .data (),
327- right.nan_range .data () + right.nan_range .size ());
331+ std::rotate (left.non_null_like_begin (), right.null_begin (), right.nan_end ());
328332
329333 // only use sizes of ranges that are at a different position now
330334 // [left nul .. right nul .. left nan .. right nan .. left non-nulls .. right
331335 // non-nulls] this is a no-op if no nan values are present
332- std::rotate (left.nan_range . data (), left.nan_range . data () + left. nan_range . size (),
333- left.nan_range . data () + left. nan_range . size () + right.null_range .size ());
336+ std::rotate (left.nan_begin (), left.nan_end (),
337+ left.nan_end () + right.null_range .size ());
334338
335339 std::span<CompressedChunkLocation> full_span{left.overall_begin (),
336340 right.overall_end ()};
@@ -356,28 +360,22 @@ struct ChunkedMergeImpl {
356360 const ChunkedNullLikePartition& right) const {
357361 // Input layout:
358362 // [left non-nul .. left nan .. left nul .. right non-nul .. right nan .. right nulls]
359- ARROW_DCHECK_EQ (left.non_null_like_range .data () + left.non_null_like_range .size (),
360- left.nan_range .data ());
361- ARROW_DCHECK_EQ (left.nan_range .data () + left.nan_range .size (),
362- left.null_range .data ());
363- ARROW_DCHECK_EQ (left.null_range .data () + left.null_range .size (),
364- right.non_null_like_range .data ());
365- ARROW_DCHECK_EQ (right.non_null_like_range .data () + right.non_null_like_range .size (),
366- right.nan_range .data ());
367- ARROW_DCHECK_EQ (right.nan_range .data () + right.nan_range .size (),
368- right.null_range .data ());
363+ ARROW_DCHECK_EQ (left.non_null_like_end (), left.nan_begin ());
364+ ARROW_DCHECK_EQ (left.nan_end (), left.null_begin ());
365+ ARROW_DCHECK_EQ (left.null_end (), right.non_null_like_begin ());
366+ ARROW_DCHECK_EQ (right.non_null_like_end (), right.nan_begin ());
367+ ARROW_DCHECK_EQ (right.nan_end (), right.null_begin ());
369368
370369 // Mutate the input, stably in two steps, to obtain the following layouts:
371370 // [left non-nul .. right non-nul .. left nan .. left nul .. right nan .. right nul]
372- std::rotate (left.nan_range .data (), right.non_null_like_range .data (),
373- right.non_null_like_range .data () + right.non_null_like_range .size ());
371+ std::rotate (left.nan_begin (), right.non_null_like_begin (), right.non_null_like_end ());
374372
375373 // only use sizes of ranges that are at a different position now
376- // [left non-nul .. right non-nul .. left nan .. left nul .. right nan .. right nul]
374+ // [left non-nul .. right non-nul .. left nan .. right nan .. left null .. right nul]
377375 // this is a no-op if no nan values are present
378- auto new_left_null_range_begin =
379- left. non_null_like_range . data () + left .non_null_like_range .size () +
380- right. non_null_like_range . size () + left.nan_range .size ();
376+ auto new_left_null_range_begin = left. non_null_like_end () +
377+ right .non_null_like_range .size () +
378+ left.nan_range .size ();
381379 std::rotate (
382380 new_left_null_range_begin, new_left_null_range_begin + left.null_range .size (),
383381 new_left_null_range_begin + left.null_range .size () + right.nan_range .size ());
0 commit comments