1616
1717#include " velox/substrait/SubstraitToVeloxExpr.h"
1818#include " velox/substrait/TypeUtils.h"
19+ #include " velox/substrait/VectorCreater.h"
1920
2021namespace facebook ::velox::substrait {
2122
22- template <TypeKind KIND>
23- VectorPtr SubstraitVeloxExprConverter::setVectorFromVariantsByKind (
24- const std::vector<velox::variant>& value,
25- memory::MemoryPool* pool) {
26- using T = typename TypeTraits<KIND>::NativeType;
27-
28- auto flatVector = std::dynamic_pointer_cast<FlatVector<T>>(
29- BaseVector::create (CppToType<T>::create (), value.size (), pool));
30-
31- for (vector_size_t i = 0 ; i < value.size (); i++) {
32- if (value[i].isNull ()) {
33- flatVector->setNull (i, true );
34- } else {
35- flatVector->set (i, value[i].value <T>());
36- }
37- }
38- return flatVector;
39- }
40-
41- template <>
42- VectorPtr
43- SubstraitVeloxExprConverter::setVectorFromVariantsByKind<TypeKind::VARBINARY>(
44- const std::vector<velox::variant>& value,
45- memory::MemoryPool* pool) {
46- throw std::invalid_argument (" Return of VARBINARY data is not supported" );
47- }
48-
49- template <>
50- VectorPtr
51- SubstraitVeloxExprConverter::setVectorFromVariantsByKind<TypeKind::VARCHAR>(
52- const std::vector<velox::variant>& value,
53- memory::MemoryPool* pool) {
54- auto flatVector = std::dynamic_pointer_cast<FlatVector<StringView>>(
55- BaseVector::create (VARCHAR (), value.size (), pool));
56-
57- for (vector_size_t i = 0 ; i < value.size (); i++) {
58- if (value[i].isNull ()) {
59- flatVector->setNull (i, true );
60- } else {
61- flatVector->set (i, StringView (value[i].value <Varchar>()));
62- }
63- }
64- return flatVector;
65- }
66-
67- VectorPtr SubstraitVeloxExprConverter::setVectorFromVariants (
68- const TypePtr& type,
69- const std::vector<velox::variant>& value,
70- velox::memory::MemoryPool* pool) {
71- return VELOX_DYNAMIC_SCALAR_TYPE_DISPATCH (
72- setVectorFromVariantsByKind, type->kind (), value, pool);
73- }
74-
75- ArrayVectorPtr SubstraitVeloxExprConverter::toArrayVector (
76- TypePtr type,
77- VectorPtr vector,
78- memory::MemoryPool* pool) {
79- vector_size_t size = 1 ;
80- BufferPtr offsets = AlignedBuffer::allocate<vector_size_t >(size, pool);
81- BufferPtr sizes = AlignedBuffer::allocate<vector_size_t >(size, pool);
82- BufferPtr nulls = AlignedBuffer::allocate<uint64_t >(size, pool);
83-
84- auto rawOffsets = offsets->asMutable <vector_size_t >();
85- auto rawSizes = sizes->asMutable <vector_size_t >();
86- auto rawNulls = nulls->asMutable <uint64_t >();
87-
88- bits::fillBits (rawNulls, 0 , size, pool);
89- vector_size_t nullCount = 0 ;
90-
91- *rawSizes++ = vector->size ();
92- *rawOffsets++ = 0 ;
93-
94- return std::make_shared<ArrayVector>(
95- pool, ARRAY (type), nulls, size, offsets, sizes, vector, nullCount);
96- }
97-
9823std::shared_ptr<const core::FieldAccessTypedExpr>
9924SubstraitVeloxExprConverter::toVeloxExpr (
10025 const ::substrait::Expression::FieldReference& sField ,
@@ -130,6 +55,7 @@ std::shared_ptr<const core::ITypedExpr>
13055SubstraitVeloxExprConverter::toAliasExpr (
13156 const std::vector<std::shared_ptr<const core::ITypedExpr>>& params) {
13257 VELOX_CHECK (params.size () == 1 , " Alias expects one parameter." );
58+ // Alias is omitted due to name change is not needed.
13359 return params[0 ];
13460}
13561
@@ -161,7 +87,6 @@ SubstraitVeloxExprConverter::toVeloxExpr(
16187 const auto & veloxType =
16288 toVeloxType (subParser_->parseType (sFunc .output_type ())->type );
16389
164- // Omit alias because because name change is not needed.
16590 if (veloxFunction == " alias" ) {
16691 return toAliasExpr (params);
16792 }
@@ -172,44 +97,6 @@ SubstraitVeloxExprConverter::toVeloxExpr(
17297 veloxType, std::move (params), veloxFunction);
17398}
17499
175- TypePtr SubstraitVeloxExprConverter::literalToType (
176- const ::substrait::Expression::Literal& literal) {
177- auto typeCase = literal.literal_type_case ();
178- switch (typeCase) {
179- case ::substrait::Expression_Literal::LiteralTypeCase::kBoolean :
180- return BOOLEAN ();
181- case ::substrait::Expression_Literal::LiteralTypeCase::kI32 :
182- return INTEGER ();
183- case ::substrait::Expression_Literal::LiteralTypeCase::kI64 :
184- return BIGINT ();
185- case ::substrait::Expression_Literal::LiteralTypeCase::kFp64 :
186- return DOUBLE ();
187- case ::substrait::Expression_Literal::LiteralTypeCase::kString :
188- return VARCHAR ();
189- default :
190- VELOX_NYI (" LiteralToType not supported for type case '{}'" , typeCase);
191- }
192- }
193-
194- variant SubstraitVeloxExprConverter::toVariant (
195- const ::substrait::Expression::Literal& literal) {
196- auto typeCase = literal.literal_type_case ();
197- switch (typeCase) {
198- case ::substrait::Expression_Literal::LiteralTypeCase::kBoolean :
199- return variant (literal.boolean ());
200- case ::substrait::Expression_Literal::LiteralTypeCase::kI32 :
201- return variant (literal.i32 ());
202- case ::substrait::Expression_Literal::LiteralTypeCase::kI64 :
203- return variant (literal.i64 ());
204- case ::substrait::Expression_Literal::LiteralTypeCase::kFp64 :
205- return variant (literal.fp64 ());
206- case ::substrait::Expression_Literal::LiteralTypeCase::kString :
207- return variant (literal.string ());
208- default :
209- VELOX_NYI (" ToVariant not supported for type case '{}'" , typeCase);
210- }
211- }
212-
213100std::shared_ptr<const core::ConstantTypedExpr>
214101SubstraitVeloxExprConverter::toVeloxExpr (
215102 const ::substrait::Expression::Literal& sLit ) {
@@ -220,24 +107,32 @@ SubstraitVeloxExprConverter::toVeloxExpr(
220107 case ::substrait::Expression_Literal::LiteralTypeCase::kI64 :
221108 case ::substrait::Expression_Literal::LiteralTypeCase::kFp64 :
222109 case ::substrait::Expression_Literal::LiteralTypeCase::kString :
223- return std::make_shared<core::ConstantTypedExpr>(toVariant (sLit ));
110+ return std::make_shared<core::ConstantTypedExpr>(
111+ toTypedVariant (sLit )->veloxVariant );
224112 case ::substrait::Expression_Literal::LiteralTypeCase::kList : {
113+ // List is used in 'in' expression. Will wrap a constant
114+ // vector with an array vector inside to create the constant expression.
225115 std::vector<variant> variants;
226116 variants.reserve (sLit .list ().values ().size ());
227117 VELOX_CHECK (
228118 sLit .list ().values ().size () > 0 ,
229119 " List should have at least one item." );
230120 std::optional<TypePtr> literalType = std::nullopt ;
231121 for (const auto & literal : sLit .list ().values ()) {
122+ auto typedVariant = toTypedVariant (literal);
232123 if (!literalType.has_value ()) {
233- literalType = literalToType (literal) ;
124+ literalType = typedVariant-> variantType ;
234125 }
235- variants.emplace_back (toVariant (literal) );
126+ variants.emplace_back (typedVariant-> veloxVariant );
236127 }
237128 VELOX_CHECK (literalType.has_value (), " Type expected." );
238- auto type = literalType.value ();
239- VectorPtr vector = setVectorFromVariants (type, variants, pool_.get ());
240- ArrayVectorPtr arrayVector = toArrayVector (type, vector, pool_.get ());
129+ // Create flat vector from the variants.
130+ VectorPtr vector =
131+ setVectorFromVariants (literalType.value (), variants, pool_.get ());
132+ // Create array vector from the flat vector.
133+ ArrayVectorPtr arrayVector =
134+ toArrayVector (literalType.value (), vector, pool_.get ());
135+ // Wrap the array vector into constant vector.
241136 auto constantVector = BaseVector::wrapInConstant (1 , 0 , arrayVector);
242137 auto constantExpr =
243138 std::make_shared<core::ConstantTypedExpr>(constantVector);
@@ -285,4 +180,34 @@ SubstraitVeloxExprConverter::toVeloxExpr(
285180 }
286181}
287182
183+ std::shared_ptr<SubstraitVeloxExprConverter::TypedVariant>
184+ SubstraitVeloxExprConverter::toTypedVariant (
185+ const ::substrait::Expression::Literal& literal) {
186+ auto typeCase = literal.literal_type_case ();
187+ switch (typeCase) {
188+ case ::substrait::Expression_Literal::LiteralTypeCase::kBoolean : {
189+ TypedVariant typedVariant = {variant (literal.boolean ()), BOOLEAN ()};
190+ return std::make_shared<TypedVariant>(typedVariant);
191+ }
192+ case ::substrait::Expression_Literal::LiteralTypeCase::kI32 : {
193+ TypedVariant typedVariant = {variant (literal.i32 ()), INTEGER ()};
194+ return std::make_shared<TypedVariant>(typedVariant);
195+ }
196+ case ::substrait::Expression_Literal::LiteralTypeCase::kI64 : {
197+ TypedVariant typedVariant = {variant (literal.i64 ()), BIGINT ()};
198+ return std::make_shared<TypedVariant>(typedVariant);
199+ }
200+ case ::substrait::Expression_Literal::LiteralTypeCase::kFp64 : {
201+ TypedVariant typedVariant = {variant (literal.fp64 ()), DOUBLE ()};
202+ return std::make_shared<TypedVariant>(typedVariant);
203+ }
204+ case ::substrait::Expression_Literal::LiteralTypeCase::kString : {
205+ TypedVariant typedVariant = {variant (literal.string ()), VARCHAR ()};
206+ return std::make_shared<TypedVariant>(typedVariant);
207+ }
208+ default :
209+ VELOX_NYI (" ToVariant not supported for type case '{}'" , typeCase);
210+ }
211+ }
212+
288213} // namespace facebook::velox::substrait
0 commit comments