Skip to content

Commit e00eeca

Browse files
committed
[native] Add protocol support for index join constant equal condition
1 parent e7420ae commit e00eeca

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

presto-native-execution/presto_cpp/main/types/PrestoToVeloxQueryPlan.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,14 @@ std::shared_ptr<protocol::CallExpression> isContains(
559559
return isFunctionCall(expression, kContains);
560560
}
561561

562+
// Check if input RowExpression is an 'equal' expression and returns it as
563+
// CallExpression. Returns nullptr if input expression is something else.
564+
std::shared_ptr<protocol::CallExpression> isEqual(
565+
const std::shared_ptr<protocol::RowExpression>& expression) {
566+
static constexpr std::string_view kEqual = "presto.default.$operator$equal";
567+
return isFunctionCall(expression, kEqual);
568+
}
569+
562570
// Check if input RowExpression is an 'and' expression and returns it as
563571
// SpecialFormExpression. Returns nullptr if input expression is something else.
564572
std::shared_ptr<protocol::SpecialFormExpression> isAnd(
@@ -2353,6 +2361,41 @@ void parseIndexLookupCondition(
23532361
return;
23542362
}
23552363

2364+
if (const auto equals = isEqual(filter)) {
2365+
VELOX_CHECK_EQ(equals->arguments.size(), 2);
2366+
const auto leftExpr = exprConverter.toVeloxExpr(equals->arguments[0]);
2367+
const auto rightExpr = exprConverter.toVeloxExpr(equals->arguments[1]);
2368+
2369+
const bool leftIsConstant = core::TypedExprs::isConstant(leftExpr);
2370+
const bool rightIsConstant = core::TypedExprs::isConstant(rightExpr);
2371+
2372+
VELOX_CHECK_NE(
2373+
leftIsConstant,
2374+
rightIsConstant,
2375+
"The equal condition must have one key and one constant: {}",
2376+
toJsonString(filter));
2377+
2378+
// Determine which argument is the key (non-constant) and which is the value
2379+
// (constant)
2380+
const auto& keyArgument =
2381+
leftIsConstant ? equals->arguments[1] : equals->arguments[0];
2382+
const auto& constantExpr = leftIsConstant ? leftExpr : rightExpr;
2383+
2384+
const auto keyColumnExpr = exprConverter.toVeloxExpr(
2385+
std::dynamic_pointer_cast<protocol::VariableReferenceExpression>(
2386+
keyArgument));
2387+
2388+
VELOX_CHECK_NOT_NULL(
2389+
keyColumnExpr,
2390+
"Key argument must be a variable reference: {}",
2391+
toJsonString(keyArgument));
2392+
2393+
joinConditionPtrs.push_back(
2394+
std::make_shared<core::EqualIndexLookupCondition>(
2395+
keyColumnExpr, constantExpr));
2396+
return;
2397+
}
2398+
23562399
VELOX_UNSUPPORTED(
23572400
"Unsupported index lookup condition: {}", toJsonString(filter));
23582401
}

0 commit comments

Comments
 (0)