1919#include " velox/substrait/VariantToVectorConverter.h"
2020#include " velox/vector/FlatVector.h"
2121#include " velox/vector/VariantToVector.h"
22+
2223using namespace facebook ::velox;
2324namespace {
2425// Get values for the different supported types.
@@ -101,13 +102,29 @@ ArrayVectorPtr makeArrayVector(const VectorPtr& elements) {
101102 elements);
102103}
103104
105+ RowVectorPtr makeRowVector (const std::vector<VectorPtr>& children) {
106+ std::vector<std::shared_ptr<const Type>> types;
107+ types.resize (children.size ());
108+ for (int i = 0 ; i < children.size (); i++) {
109+ types[i] = children[i]->type ();
110+ }
111+ const size_t vectorSize = children.empty () ? 0 : children.front ()->size ();
112+ auto rowType = ROW (std::move (types));
113+ return std::make_shared<RowVector>(
114+ children[0 ]->pool (), rowType, BufferPtr (nullptr ), vectorSize, children);
115+ }
116+
104117ArrayVectorPtr makeEmptyArrayVector (memory::MemoryPool* pool) {
105118 BufferPtr offsets = allocateOffsets (1 , pool);
106119 BufferPtr sizes = allocateOffsets (1 , pool);
107120 return std::make_shared<ArrayVector>(
108121 pool, ARRAY (UNKNOWN ()), nullptr , 1 , offsets, sizes, nullptr );
109122}
110123
124+ RowVectorPtr makeEmptyRowVector (memory::MemoryPool* pool) {
125+ return makeRowVector ({});
126+ }
127+
111128template <typename T>
112129void setLiteralValue (
113130 const ::substrait::Expression::Literal& literal,
@@ -120,8 +137,10 @@ void setLiteralValue(
120137 vector->set (index, StringView (literal.string ()));
121138 } else if (literal.has_var_char ()) {
122139 vector->set (index, StringView (literal.var_char ().value ()));
140+ } else if (literal.has_binary ()) {
141+ vector->set (index, StringView (literal.binary ()));
123142 } else {
124- VELOX_FAIL (" Unexpected string literal" );
143+ VELOX_FAIL (" Unexpected string or binary literal" );
125144 }
126145 } else {
127146 vector->set (index, getLiteralValue<T>(literal));
@@ -146,6 +165,20 @@ VectorPtr constructFlatVector(
146165 return vector;
147166}
148167
168+ template <TypeKind kind>
169+ VectorPtr constructFlatVectorForStruct (
170+ const ::substrait::Expression::Literal& child,
171+ const vector_size_t size,
172+ const TypePtr& type,
173+ memory::MemoryPool* pool) {
174+ VELOX_CHECK (type->isPrimitiveType ());
175+ auto vector = BaseVector::create (type, size, pool);
176+ using T = typename TypeTraits<kind>::NativeType;
177+ auto flatVector = vector->as <FlatVector<T>>();
178+ setLiteralValue (child, flatVector, 0 );
179+ return vector;
180+ }
181+
149182} // namespace
150183
151184using facebook::velox::core::variantArrayToVector;
@@ -348,14 +381,19 @@ SubstraitVeloxExprConverter::toVeloxExpr(
348381 case ::substrait::Expression_Literal::LiteralTypeCase::kVarChar :
349382 return std::make_shared<core::ConstantTypedExpr>(
350383 variant (substraitLit.var_char ().value ()));
384+ case ::substrait::Expression_Literal::LiteralTypeCase::kBinary :
385+ return std::make_shared<core::ConstantTypedExpr>(
386+ variant::binary (substraitLit.binary ()));
351387 case ::substrait::Expression_Literal::LiteralTypeCase::kList : {
352388 auto constantVector =
353389 BaseVector::wrapInConstant (1 , 0 , literalsToArrayVector (substraitLit));
354390 return std::make_shared<const core::ConstantTypedExpr>(constantVector);
355391 }
356- case ::substrait::Expression_Literal::LiteralTypeCase::kBinary :
357- return std::make_shared<core::ConstantTypedExpr>(
358- variant::binary (substraitLit.binary ()));
392+ case ::substrait::Expression_Literal::LiteralTypeCase::kStruct : {
393+ auto constantVector =
394+ BaseVector::wrapInConstant (1 , 0 , literalsToRowVector (substraitLit));
395+ return std::make_shared<const core::ConstantTypedExpr>(constantVector);
396+ }
359397 default :
360398 VELOX_NYI (
361399 " Substrait conversion not supported for type case '{}'" , typeCase);
@@ -429,6 +467,29 @@ ArrayVectorPtr SubstraitVeloxExprConverter::literalsToArrayVector(
429467 }
430468}
431469
470+ RowVectorPtr SubstraitVeloxExprConverter::literalsToRowVector (
471+ const ::substrait::Expression::Literal& structLiteral) {
472+ auto childSize = structLiteral.struct_ ().fields ().size ();
473+ if (childSize == 0 ) {
474+ return makeEmptyRowVector (pool_);
475+ }
476+ auto typeCase = structLiteral.struct_ ().fields (0 ).literal_type_case ();
477+ switch (typeCase) {
478+ case ::substrait::Expression_Literal::LiteralTypeCase::kBinary : {
479+ std::vector<VectorPtr> vectors;
480+ vectors.reserve (structLiteral.struct_ ().fields ().size ());
481+ for (auto & child : structLiteral.struct_ ().fields ()) {
482+ vectors.emplace_back (constructFlatVectorForStruct<TypeKind::VARBINARY>(
483+ child, 1 , VARBINARY (), pool_));
484+ }
485+ return makeRowVector (vectors);
486+ }
487+ default :
488+ VELOX_NYI (
489+ " literalsToRowVector not supported for type case '{}'" , typeCase);
490+ }
491+ }
492+
432493std::shared_ptr<const core::ITypedExpr>
433494SubstraitVeloxExprConverter::toVeloxExpr (
434495 const ::substrait::Expression::Cast& castExpr,
0 commit comments