Skip to content

Commit 4f79166

Browse files
authored
refactor: refine cast variant to map (#16691)
* refactor: refine cast variant to map * fix * address comment
1 parent aac746d commit 4f79166

File tree

1 file changed

+14
-19
lines changed

1 file changed

+14
-19
lines changed

src/query/expression/src/evaluator.rs

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ use crate::types::BooleanType;
4343
use crate::types::DataType;
4444
use crate::types::NullableType;
4545
use crate::types::NumberScalar;
46+
use crate::types::StringType;
4647
use crate::types::VariantType;
4748
use crate::values::Column;
4849
use crate::values::ColumnBuilder;
@@ -640,7 +641,7 @@ impl<'a> Evaluator<'a> {
640641
]))))
641642
}
642643
Value::Column(Column::Variant(col)) => {
643-
let mut key_builder = StringColumnBuilder::with_capacity(0, 0);
644+
let mut key_builder = StringType::create_builder(col.len(), &[]);
644645
let mut value_builder =
645646
ArrayType::<VariantType>::create_builder(col.len(), &[]);
646647

@@ -662,38 +663,32 @@ impl<'a> Evaluator<'a> {
662663
v.write_to_vec(&mut value_builder.builder.data);
663664
value_builder.builder.commit_row();
664665
}
666+
665667
value_builder.commit_row();
666668
}
667-
let key_column = Column::String(key_builder.build());
668669

669-
let value_column = value_builder.build();
670-
let validity = validity.map(|validity| {
671-
let mut inner_validity = MutableBitmap::with_capacity(col.len());
672-
for (index, offsets) in value_column.offsets.windows(2).enumerate() {
673-
inner_validity.extend_constant(
674-
(offsets[1] - offsets[0]) as usize,
675-
validity.get_bit(index),
676-
);
677-
}
678-
inner_validity.into()
679-
});
670+
let key_col = Column::String(key_builder.build());
671+
let value_col = Column::Array(Box::new(value_builder.build().upcast()));
680672

681-
let new_value_column = self
673+
let value_col = self
682674
.run_cast(
683675
span,
684-
&DataType::Variant,
676+
&DataType::Array(Box::new(DataType::Variant)),
685677
&fields_dest_ty[1],
686-
Value::Column(Column::Variant(value_column.values)),
678+
Value::Column(value_col),
687679
validity,
688680
options,
689681
)?
690682
.into_column()
683+
.unwrap()
684+
.into_array()
691685
.unwrap();
692686

693-
let kv_column = Column::Tuple(vec![key_column, new_value_column]);
687+
let kv_col = Column::Tuple(vec![key_col, value_col.values]);
688+
694689
Ok(Value::Column(Column::Map(Box::new(ArrayColumn {
695-
values: kv_column,
696-
offsets: col.offsets,
690+
values: kv_col,
691+
offsets: value_col.offsets,
697692
}))))
698693
}
699694
other => unreachable!("source: {}", other),

0 commit comments

Comments
 (0)