diff --git a/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarExpressionConverter.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarExpressionConverter.scala index cddd56bd5..3a40341f0 100644 --- a/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarExpressionConverter.scala +++ b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarExpressionConverter.scala @@ -422,6 +422,8 @@ object ColumnarExpressionConverter extends Logging { case regexp: RegExpReplace => containsSubquery(regexp.subject) || containsSubquery( regexp.regexp) || containsSubquery(regexp.rep) || containsSubquery(regexp.pos) + case substrIndex: ColumnarSubstringIndex => + substrIndex.children.map(containsSubquery).exists(_ == true) case expr => throw new UnsupportedOperationException( s" --> ${expr.getClass} | ${expr} is not currently supported.") diff --git a/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarTernaryOperator.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarTernaryOperator.scala index 8d8440e21..4d7b8e777 100644 --- a/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarTernaryOperator.scala +++ b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarTernaryOperator.scala @@ -202,6 +202,27 @@ class ColumnarRegExpExtract(subject: Expression, regexp: Expression, idx: Expres } } +class ColumnarSubstringIndex(strExpr: Expression, delimExpr: Expression, + countExpr: Expression, original: Expression) + extends SubstringIndex(strExpr, delimExpr, countExpr) with ColumnarExpression { + + override def supportColumnarCodegen(args: java.lang.Object): Boolean = { + false + } + + override def doColumnarCodeGen(args: Object): (TreeNode, ArrowType) = { + val (str_node, _): (TreeNode, ArrowType) = + strExpr.asInstanceOf[ColumnarExpression].doColumnarCodeGen(args) + val (delim_node, _): (TreeNode, ArrowType) = + delimExpr.asInstanceOf[ColumnarExpression].doColumnarCodeGen(args) + val (count_node, _): (TreeNode, ArrowType) = + countExpr.asInstanceOf[ColumnarExpression].doColumnarCodeGen(args) + val resultType = new ArrowType.Utf8() + (TreeBuilder.makeFunction("substr_index", + Lists.newArrayList(str_node, delim_node, count_node), resultType), resultType) + } +} + object ColumnarTernaryOperator { def create(src: Expression, arg1: Expression, arg2: Expression, @@ -217,6 +238,8 @@ object ColumnarTernaryOperator { new ColumnarStringLocate(src, arg1, arg2, sl) case re: RegExpExtract => new ColumnarRegExpExtract(src, arg1, arg2, re) + case substrIndex: SubstringIndex => + new ColumnarSubstringIndex(src, arg1, arg2, substrIndex) case other => throw new UnsupportedOperationException(s"not currently supported: $other.") }