@@ -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.
564572std::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