Skip to content

Commit a1f9d8c

Browse files
authored
chore(query): refactoring ValueType, introducing ColumnBuilderMut (#18102)
1 parent 13e9626 commit a1f9d8c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+769
-545
lines changed

src/query/expression/src/kernels/filter.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -209,29 +209,24 @@ impl ValueVisitor for FilterVisitor<'_> {
209209
data_type: &DataType,
210210
) -> Result<()> {
211211
let c = T::upcast_column_with_type(column.clone(), data_type);
212-
let builder = ColumnBuilder::with_capacity(&c.data_type(), c.len());
213-
let mut builder = T::try_downcast_owned_builder(builder).unwrap();
212+
let mut builder = ColumnBuilder::with_capacity(&c.data_type(), c.len());
213+
let mut inner_builder = T::downcast_builder(&mut builder);
214214
match self.strategy {
215215
IterationStrategy::IndexIterator => {
216216
let iter = TrueIdxIter::new(self.original_rows, Some(self.filter));
217217
iter.for_each(|index| {
218-
T::push_item(&mut builder, unsafe {
219-
T::index_column_unchecked(&column, index)
220-
})
218+
inner_builder.push_item(unsafe { T::index_column_unchecked(&column, index) });
221219
});
222220
}
223221
_ => {
224222
let iter = SlicesIterator::new(self.filter);
225223
iter.for_each(|(start, len)| {
226-
T::append_column(&mut builder, &T::slice_column(&column, start..start + len))
224+
inner_builder.append_column(&T::slice_column(&column, start..start + len));
227225
});
228226
}
229227
}
230-
231-
self.result = Some(Value::Column(T::upcast_column_with_type(
232-
T::build_column(builder),
233-
data_type,
234-
)));
228+
drop(inner_builder);
229+
self.result = Some(Value::Column(builder.build()));
235230
Ok(())
236231
}
237232

src/query/expression/src/kernels/take.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -160,18 +160,15 @@ where I: databend_common_column::types::Index
160160
data_type: &DataType,
161161
) -> Result<()> {
162162
let c = T::upcast_column_with_type(column.clone(), data_type);
163-
let builder = ColumnBuilder::with_capacity(&c.data_type(), c.len());
164-
let mut builder = T::try_downcast_owned_builder(builder).unwrap();
163+
let mut builder = ColumnBuilder::with_capacity(&c.data_type(), c.len());
164+
let mut inner_builder = T::downcast_builder(&mut builder);
165165

166166
for index in self.indices {
167-
T::push_item(&mut builder, unsafe {
168-
T::index_column_unchecked(&column, index.to_usize())
169-
});
167+
inner_builder
168+
.push_item(unsafe { T::index_column_unchecked(&column, index.to_usize()) });
170169
}
171-
self.result = Some(Value::Column(T::upcast_column_with_type(
172-
T::build_column(builder),
173-
data_type,
174-
)));
170+
drop(inner_builder);
171+
self.result = Some(Value::Column(builder.build()));
175172
Ok(())
176173
}
177174

src/query/expression/src/kernels/take_compact.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -106,21 +106,17 @@ impl ValueVisitor for TakeCompactVisitor<'_> {
106106
data_type: &DataType,
107107
) -> Result<()> {
108108
let c = T::upcast_column_with_type(column.clone(), data_type);
109-
let builder = ColumnBuilder::with_capacity(&c.data_type(), c.len());
110-
let mut builder = T::try_downcast_owned_builder(builder).unwrap();
109+
let mut builder = ColumnBuilder::with_capacity(&c.data_type(), c.len());
110+
let mut inner_builder = T::downcast_builder(&mut builder);
111111

112112
for (index, cnt) in self.indices {
113113
for _ in 0..*cnt {
114-
T::push_item(&mut builder, unsafe {
115-
T::index_column_unchecked(&column, *index as usize)
116-
});
114+
inner_builder
115+
.push_item(unsafe { T::index_column_unchecked(&column, *index as usize) });
117116
}
118117
}
119-
self.result = Some(Value::Column(T::upcast_column_with_type(
120-
T::build_column(builder),
121-
data_type,
122-
)));
123-
118+
drop(inner_builder);
119+
self.result = Some(Value::Column(builder.build()));
124120
Ok(())
125121
}
126122

src/query/expression/src/kernels/take_ranges.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,21 +108,16 @@ impl ValueVisitor for TakeRangeVisitor<'_> {
108108
column: T::Column,
109109
data_type: &DataType,
110110
) -> Result<()> {
111-
let builder = ColumnBuilder::with_capacity(data_type, T::column_len(&column));
112-
let mut builder = T::try_downcast_owned_builder(builder).unwrap();
111+
let mut builder = ColumnBuilder::with_capacity(data_type, T::column_len(&column));
112+
let mut inner_builder = T::downcast_builder(&mut builder);
113113

114114
for range in self.ranges {
115115
for index in range.start as usize..range.end as usize {
116-
T::push_item(&mut builder, unsafe {
117-
T::index_column_unchecked(&column, index)
118-
});
116+
inner_builder.push_item(unsafe { T::index_column_unchecked(&column, index) });
119117
}
120118
}
121-
self.result = Some(Value::Column(T::upcast_column_with_type(
122-
T::build_column(builder),
123-
data_type,
124-
)));
125-
119+
drop(inner_builder);
120+
self.result = Some(Value::Column(builder.build()));
126121
Ok(())
127122
}
128123

src/query/expression/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#![feature(alloc_layout_extra)]
4343
#![feature(debug_closure_helpers)]
4444
#![feature(never_type)]
45+
#![feature(slice_as_array)]
4546

4647
#[allow(dead_code)]
4748
mod block;

src/query/expression/src/types.rs

Lines changed: 85 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ pub mod zero_size_type;
4040
use std::cmp::Ordering;
4141
use std::fmt::Debug;
4242
use std::iter::TrustedLen;
43+
use std::ops::Deref;
44+
use std::ops::DerefMut;
4345
use std::ops::Range;
4446

4547
use borsh::BorshDeserialize;
@@ -456,6 +458,7 @@ pub trait AccessType: Debug + Clone + PartialEq + Sized + 'static {
456458
/// [ValueType] includes the builder method of a data type based on [AccessType].
457459
pub trait ValueType: AccessType {
458460
type ColumnBuilder: Debug + Clone;
461+
type ColumnBuilderMut<'a>: Debug + From<&'a mut Self::ColumnBuilder> + BuilderExt<Self>;
459462

460463
/// Convert a scalar value to the generic [Scalar] type
461464
fn upcast_scalar_with_type(scalar: Self::Scalar, data_type: &DataType) -> Scalar;
@@ -466,27 +469,7 @@ pub trait ValueType: AccessType {
466469
/// Convert a column value to the generic Column type
467470
fn upcast_column_with_type(col: Self::Column, data_type: &DataType) -> Column;
468471

469-
/// Downcast `ColumnBuilder` to a mutable reference of its inner builder type.
470-
///
471-
/// Not every builder can be downcasted successfully.
472-
/// For example: `ArrayType<T: ValueType>`, `NullableType<T: ValueType>`, and `KvPair<K: ValueType, V: ValueType>`
473-
/// cannot be downcasted and this method will return `None`.
474-
///
475-
/// So when using this method, we cannot unwrap the returned value directly.
476-
/// We should:
477-
///
478-
/// ```ignore
479-
/// // builder: ColumnBuilder
480-
/// // T: ValueType
481-
/// if let Some(inner) = T::try_downcast_builder(&mut builder) {
482-
/// inner.push(...);
483-
/// } else {
484-
/// builder.push(...);
485-
/// }
486-
/// ```
487-
fn try_downcast_builder(builder: &mut ColumnBuilder) -> Option<&mut Self::ColumnBuilder>;
488-
489-
fn try_downcast_owned_builder(builder: ColumnBuilder) -> Option<Self::ColumnBuilder>;
472+
fn downcast_builder(builder: &mut ColumnBuilder) -> Self::ColumnBuilderMut<'_>;
490473

491474
fn try_upcast_column_builder(
492475
builder: Self::ColumnBuilder,
@@ -495,15 +478,92 @@ pub trait ValueType: AccessType {
495478

496479
fn column_to_builder(col: Self::Column) -> Self::ColumnBuilder;
497480

481+
fn builder_len_mut(builder: &Self::ColumnBuilderMut<'_>) -> usize;
498482
fn builder_len(builder: &Self::ColumnBuilder) -> usize;
499-
fn push_item(builder: &mut Self::ColumnBuilder, item: Self::ScalarRef<'_>);
500-
fn push_item_repeat(builder: &mut Self::ColumnBuilder, item: Self::ScalarRef<'_>, n: usize);
501-
fn push_default(builder: &mut Self::ColumnBuilder);
502-
fn append_column(builder: &mut Self::ColumnBuilder, other: &Self::Column);
483+
484+
fn push_item_mut(builder: &mut Self::ColumnBuilderMut<'_>, item: Self::ScalarRef<'_>);
485+
fn push_item(builder: &mut Self::ColumnBuilder, item: Self::ScalarRef<'_>) {
486+
Self::push_item_mut(&mut builder.into(), item);
487+
}
488+
489+
fn push_item_repeat_mut(
490+
builder: &mut Self::ColumnBuilderMut<'_>,
491+
item: Self::ScalarRef<'_>,
492+
n: usize,
493+
);
494+
fn push_item_repeat(builder: &mut Self::ColumnBuilder, item: Self::ScalarRef<'_>, n: usize) {
495+
Self::push_item_repeat_mut(&mut builder.into(), item, n);
496+
}
497+
498+
fn push_default_mut(builder: &mut Self::ColumnBuilderMut<'_>);
499+
fn push_default(builder: &mut Self::ColumnBuilder) {
500+
Self::push_default_mut(&mut builder.into())
501+
}
502+
503+
fn append_column_mut(builder: &mut Self::ColumnBuilderMut<'_>, other: &Self::Column);
504+
fn append_column(builder: &mut Self::ColumnBuilder, other: &Self::Column) {
505+
Self::append_column_mut(&mut builder.into(), other);
506+
}
507+
503508
fn build_column(builder: Self::ColumnBuilder) -> Self::Column;
504509
fn build_scalar(builder: Self::ColumnBuilder) -> Self::Scalar;
505510
}
506511

512+
impl<'a, T: ValueType> From<&'a mut T::ColumnBuilder> for BuilderMut<'a, T> {
513+
fn from(value: &'a mut T::ColumnBuilder) -> Self {
514+
BuilderMut(value)
515+
}
516+
}
517+
518+
#[derive(Debug)]
519+
pub struct BuilderMut<'a, T: ValueType>(&'a mut T::ColumnBuilder);
520+
521+
impl<T: ValueType> Deref for BuilderMut<'_, T> {
522+
type Target = T::ColumnBuilder;
523+
524+
fn deref(&self) -> &Self::Target {
525+
self.0
526+
}
527+
}
528+
529+
impl<T: ValueType> DerefMut for BuilderMut<'_, T> {
530+
fn deref_mut(&mut self) -> &mut Self::Target {
531+
self.0
532+
}
533+
}
534+
535+
impl<'a, T> BuilderExt<T> for BuilderMut<'a, T>
536+
where T: ValueType<ColumnBuilderMut<'a> = Self>
537+
{
538+
fn len(&self) -> usize {
539+
T::builder_len(self.0)
540+
}
541+
542+
fn push_item(&mut self, item: <T>::ScalarRef<'_>) {
543+
T::push_item_mut(self, item);
544+
}
545+
546+
fn push_repeat(&mut self, item: <T>::ScalarRef<'_>, n: usize) {
547+
T::push_item_repeat_mut(self, item, n);
548+
}
549+
550+
fn push_default(&mut self) {
551+
T::push_default_mut(self);
552+
}
553+
554+
fn append_column(&mut self, other: &<T>::Column) {
555+
T::append_column_mut(self, other);
556+
}
557+
}
558+
559+
pub trait BuilderExt<T: ValueType> {
560+
fn len(&self) -> usize;
561+
fn push_item(&mut self, item: T::ScalarRef<'_>);
562+
fn push_repeat(&mut self, item: T::ScalarRef<'_>, n: usize);
563+
fn push_default(&mut self);
564+
fn append_column(&mut self, other: &T::Column);
565+
}
566+
507567
/// Almost all [ValueType] implement [ReturnType], except [AnyType].
508568
pub trait ReturnType: ValueType {
509569
fn create_builder(capacity: usize, generics: &GenericMap) -> Self::ColumnBuilder;

src/query/expression/src/types/any.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use std::ops::Range;
1717

1818
use crate::property::Domain;
1919
use crate::types::AccessType;
20+
use crate::types::BuilderMut;
2021
use crate::types::DataType;
2122
use crate::types::ValueType;
2223
use crate::values::Column;
@@ -92,6 +93,7 @@ impl AccessType for AnyType {
9293

9394
impl ValueType for AnyType {
9495
type ColumnBuilder = ColumnBuilder;
96+
type ColumnBuilderMut<'a> = BuilderMut<'a, Self>;
9597

9698
fn upcast_scalar_with_type(scalar: Self::Scalar, _: &DataType) -> Scalar {
9799
scalar
@@ -106,12 +108,8 @@ impl ValueType for AnyType {
106108
col
107109
}
108110

109-
fn try_downcast_builder(builder: &mut ColumnBuilder) -> Option<&mut Self::ColumnBuilder> {
110-
Some(builder)
111-
}
112-
113-
fn try_downcast_owned_builder(builder: ColumnBuilder) -> Option<Self::ColumnBuilder> {
114-
Some(builder)
111+
fn downcast_builder(builder: &mut ColumnBuilder) -> Self::ColumnBuilderMut<'_> {
112+
builder.into()
115113
}
116114

117115
fn try_upcast_column_builder(
@@ -129,19 +127,27 @@ impl ValueType for AnyType {
129127
builder.len()
130128
}
131129

132-
fn push_item(builder: &mut Self::ColumnBuilder, item: Self::ScalarRef<'_>) {
130+
fn builder_len_mut(builder: &Self::ColumnBuilderMut<'_>) -> usize {
131+
builder.len()
132+
}
133+
134+
fn push_item_mut(builder: &mut Self::ColumnBuilderMut<'_>, item: Self::ScalarRef<'_>) {
133135
builder.push(item);
134136
}
135137

136-
fn push_item_repeat(builder: &mut Self::ColumnBuilder, item: Self::ScalarRef<'_>, n: usize) {
138+
fn push_item_repeat_mut(
139+
builder: &mut Self::ColumnBuilderMut<'_>,
140+
item: Self::ScalarRef<'_>,
141+
n: usize,
142+
) {
137143
builder.push_repeat(&item, n);
138144
}
139145

140-
fn push_default(builder: &mut Self::ColumnBuilder) {
146+
fn push_default_mut(builder: &mut Self::ColumnBuilderMut<'_>) {
141147
builder.push_default();
142148
}
143149

144-
fn append_column(builder: &mut Self::ColumnBuilder, other: &Self::Column) {
150+
fn append_column_mut(builder: &mut Self::ColumnBuilderMut<'_>, other: &Self::Column) {
145151
builder.append_column(other);
146152
}
147153

0 commit comments

Comments
 (0)