Skip to content

Commit d79b813

Browse files
committed
impl vectorized_append.
1 parent 1a7c2eb commit d79b813

File tree

2 files changed

+247
-108
lines changed

2 files changed

+247
-108
lines changed

datafusion/physical-plan/src/aggregates/group_values/column.rs

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -319,16 +319,23 @@ impl GroupValuesColumn {
319319
next_group_index = self.group_index_lists[current_group_index];
320320
}
321321
}
322-
323-
self.vectorized_equal_to_results
324-
.resize(self.vectorized_equal_to_group_indices.len(), true);
325322
}
326323

327324
/// Perform `vectorized_equal_to`
328325
///
329-
///
330326
fn vectorized_equal_to(&mut self, cols: &[ArrayRef]) {
327+
debug_assert_eq!(
328+
self.vectorized_equal_to_group_indices.len(),
329+
self.vectorized_equal_to_row_indices.len()
330+
);
331+
332+
if self.vectorized_equal_to_group_indices.is_empty() {
333+
return;
334+
}
335+
336+
// Vectorized equal to `cols` and `group columns`
331337
let mut equal_to_results = mem::take(&mut self.vectorized_equal_to_results);
338+
equal_to_results.resize(self.vectorized_equal_to_group_indices.len(), true);
332339
for (col_idx, group_col) in self.group_values.iter().enumerate() {
333340
group_col.vectorized_equal_to(
334341
&self.vectorized_equal_to_group_indices,
@@ -337,8 +344,40 @@ impl GroupValuesColumn {
337344
&mut equal_to_results,
338345
);
339346
}
347+
348+
let mut current_row_equal_to_result = false;
349+
let mut current_row = *self.vectorized_equal_to_row_indices.first().unwrap();
350+
for (idx, &row) in self.vectorized_equal_to_row_indices.iter().enumerate() {
351+
// If found next row, according to the equal to result of `current_row`
352+
if current_row != row {
353+
if !current_row_equal_to_result {
354+
self.vectorized_append_row_indices.push(row);
355+
}
356+
current_row = row;
357+
current_row_equal_to_result = equal_to_results[idx];
358+
continue;
359+
}
360+
current_row_equal_to_result |= equal_to_results[idx];
361+
}
362+
363+
if !current_row_equal_to_result {
364+
self.vectorized_append_row_indices.push(current_row);
365+
}
366+
340367
self.vectorized_equal_to_results = equal_to_results;
341368
}
369+
370+
/// Perform `vectorized_append`
371+
///
372+
/// 1. Vectorized append new values into `group_values`
373+
/// 2. Update `map` and `group_index_lists`
374+
fn vectorized_append(&mut self, cols: &[ArrayRef], batch_hashes: &[u64]) {
375+
if self.vectorized_append_row_indices.is_empty() {
376+
return;
377+
}
378+
379+
// 1. Vectorized append new values into `group_values`
380+
}
342381
}
343382

344383
/// instantiates a [`PrimitiveGroupValueBuilder`] and pushes it into $v

0 commit comments

Comments
 (0)