Skip to content

Commit e158860

Browse files
Fix might_contain validate fallback and support struct literal (#137)
* Fix might_contain validate fallback * add struct support
1 parent 25bf3b4 commit e158860

File tree

3 files changed

+70
-5
lines changed

3 files changed

+70
-5
lines changed

velox/dwio/common/MetadataFilter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ std::unique_ptr<MetadataFilter::Node> MetadataFilter::Node::fromExpression(
160160
if (call->name() == "endswith" || call->name() == "contains" ||
161161
call->name() == "like" || call->name() == "startswith" ||
162162
call->name() == "in" || call->name() == "rlike" ||
163-
call->name() == "isnotnull" || call->name() == "coalesce") {
163+
call->name() == "isnotnull" || call->name() == "coalesce" ||
164+
call->name() == "might_contain") {
164165
return nullptr;
165166
}
166167
try {

velox/substrait/SubstraitToVeloxExpr.cpp

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "velox/substrait/VariantToVectorConverter.h"
2020
#include "velox/vector/FlatVector.h"
2121
#include "velox/vector/VariantToVector.h"
22+
2223
using namespace facebook::velox;
2324
namespace {
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+
104117
ArrayVectorPtr 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+
111128
template <typename T>
112129
void 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

151184
using 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+
432493
std::shared_ptr<const core::ITypedExpr>
433494
SubstraitVeloxExprConverter::toVeloxExpr(
434495
const ::substrait::Expression::Cast& castExpr,

velox/substrait/SubstraitToVeloxExpr.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ class SubstraitVeloxExprConverter {
9494
ArrayVectorPtr literalsToArrayVector(
9595
const ::substrait::Expression::Literal& listLiteral);
9696

97+
RowVectorPtr literalsToRowVector(
98+
const ::substrait::Expression::Literal& structLiteral);
99+
97100
/// Memory pool.
98101
memory::MemoryPool* pool_;
99102

0 commit comments

Comments
 (0)