diff --git a/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarBinaryExpression.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarBinaryExpression.scala index 6889403ba..60e74a536 100644 --- a/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarBinaryExpression.scala +++ b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarBinaryExpression.scala @@ -34,6 +34,7 @@ import scala.collection.mutable.ListBuffer import com.intel.oap.expression.ColumnarDateTimeExpressions.ColumnarDateDiff import com.intel.oap.expression.ColumnarDateTimeExpressions.ColumnarUnixTimestamp +import com.intel.oap.expression.ColumnarDateTimeExpressions.ColumnarFromUnixTime /** * A version of add that supports columnar processing for longs. @@ -83,6 +84,8 @@ object ColumnarBinaryExpression { new ColumnarDateDiff(left, right) case a: UnixTimestamp => new ColumnarUnixTimestamp(left, right) + case a: FromUnixTime => + new ColumnarFromUnixTime(left, right) case other => throw new UnsupportedOperationException(s"not currently supported: $other.") } diff --git a/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarDateTimeExpressions.scala b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarDateTimeExpressions.scala index d3fcdc427..c0d1f32c3 100644 --- a/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarDateTimeExpressions.scala +++ b/native-sql-engine/core/src/main/scala/com/intel/oap/expression/ColumnarDateTimeExpressions.scala @@ -49,6 +49,7 @@ import org.apache.spark.sql.catalyst.expressions.UnixMicros import org.apache.spark.sql.catalyst.expressions.UnixMillis import org.apache.spark.sql.catalyst.expressions.UnixSeconds import org.apache.spark.sql.catalyst.expressions.UnixTimestamp +import org.apache.spark.sql.catalyst.expressions.FromUnixTime import org.apache.spark.sql.catalyst.expressions.Year import org.apache.spark.sql.internal.SQLConf import org.apache.spark.sql.types.{DateType, IntegerType, LongType, StringType, TimestampType} @@ -493,6 +494,43 @@ object ColumnarDateTimeExpressions { } } + class ColumnarFromUnixTime(left: Expression, right: Expression) + extends FromUnixTime(left, right) with + ColumnarExpression { + + buildCheck() + + def buildCheck(): Unit = { + val supportedTypes = List(TimestampType) + if (supportedTypes.indexOf(left.dataType) == -1) { + throw new UnsupportedOperationException( + s"${left.dataType} is not supported in ColumnarFromUnixTime.") + } + if (left.dataType == StringType) { + right match { + case literal: ColumnarLiteral => + val format = literal.value.toString + if (format.length > 10) { + throw new UnsupportedOperationException( + s"$format is not supported in ColumnarFromUnixTime.") + } + case _ => + } + } + } + + override def doColumnarCodeGen(args: Object): (TreeNode, ArrowType) = { + val (leftNode, leftType) = left.asInstanceOf[ColumnarExpression].doColumnarCodeGen(args) + //val (rightNode, rightType) = right.asInstanceOf[ColumnarExpression].doColumnarCodeGen(args) + val outType = CodeGeneration.getResultType(dataType) + + val dateNode = TreeBuilder.makeFunction( + "castVARCHAR", Lists.newArrayList(leftNode, TreeBuilder.makeLiteral(java.lang.Long.valueOf(10L))), outType) + + (dateNode, outType) + } + } + class ColumnarDateDiff(left: Expression, right: Expression) extends DateDiff(left, right) with ColumnarExpression {