@@ -28,7 +28,7 @@ import org.scalatest.Tag
2828
2929import org .apache .hadoop .fs .Path
3030import org .apache .spark .sql .{CometTestBase , DataFrame , Row }
31- import org .apache .spark .sql .catalyst .expressions .{Alias , Cast , FromUnixTime , Literal , TruncDate , TruncTimestamp }
31+ import org .apache .spark .sql .catalyst .expressions .{Alias , Cast , FromUnixTime , Literal , TruncDate , TruncTimestamp , Years }
3232import org .apache .spark .sql .catalyst .optimizer .SimplifyExtractValueOps
3333import org .apache .spark .sql .comet .CometProjectExec
3434import org .apache .spark .sql .execution .{ProjectExec , SparkPlan }
@@ -39,6 +39,8 @@ import org.apache.spark.sql.internal.SQLConf.SESSION_LOCAL_TIMEZONE
3939import org .apache .spark .sql .types ._
4040
4141import org .apache .comet .CometSparkSessionExtensions .isSpark40Plus
42+ import org .apache .comet .serde .{CometYears , Compatible , Unsupported }
43+ import org .apache .comet .serde .QueryPlanSerde .exprToProto
4244import org .apache .comet .testing .{DataGenOptions , FuzzDataGenerator }
4345
4446class CometExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelper {
@@ -3162,4 +3164,38 @@ class CometExpressionSuite extends CometTestBase with AdaptiveSparkPlanHelper {
31623164 }
31633165 }
31643166
3167+ test(" support Years partition transform (serialization only)" ) {
3168+ val input = Seq (java.sql.Date .valueOf(" 2024-01-15" )).toDF(" col" )
3169+ val inputAttrs = input.queryExecution.analyzed.output
3170+ val yearsExpr = Years (input.col(" col" ).expr)
3171+ val proto = exprToProto(yearsExpr, inputAttrs, binding = false )
3172+
3173+ assert(proto.isDefined, " Comet failed to serialize the Years expression!" )
3174+
3175+ val expr = proto.get
3176+ assert(expr.hasCast, " Expected the result to be a Cast (to Integer)" )
3177+ assert(expr.getCast.getChild.hasScalarFunc, " Expected Cast child to be a Scalar Function" )
3178+ assert(expr.getCast.getChild.getScalarFunc.getFunc == " datepart" , " Expected function to be 'datepart'" )
3179+ }
3180+
3181+ test(" Years support level" ) {
3182+ val supportedTypes = Seq (DateType , TimestampType , TimestampNTZType )
3183+ val unsupportedTypes = Seq (StringType , IntegerType , LongType )
3184+
3185+ supportedTypes.foreach { dt =>
3186+ val child = Literal .default(dt)
3187+ val expr = Years (child)
3188+ val result = CometYears .getSupportLevel(expr)
3189+
3190+ assert(result.isInstanceOf [Compatible ], s " Expected $dt to be Compatible " )
3191+ }
3192+
3193+ unsupportedTypes.foreach { dt =>
3194+ val child = Literal .default(dt)
3195+ val expr = Years (child)
3196+ val result = CometYears .getSupportLevel(expr)
3197+
3198+ assert(result.isInstanceOf [Unsupported ], s " Expected $dt to be Unsupported " )
3199+ }
3200+ }
31653201}
0 commit comments