Github user tarekauel commented on a diff in the pull request:

    https://github.com/apache/spark/pull/6981#discussion_r34940088
  
    --- Diff: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeFunctions.scala
 ---
    @@ -54,3 +60,204 @@ case class CurrentTimestamp() extends LeafExpression {
         System.currentTimeMillis() * 1000L
       }
     }
    +
    +case class Hour(child: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(TimestampType)
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override protected def nullSafeEval(timestamp: Any): Any = {
    +    DateTimeUtils.getHours(timestamp.asInstanceOf[Long])
    +  }
    +
    +  override def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): 
String = {
    +    val dtu = DateTimeUtils.getClass.getName.stripSuffix("$")
    +    defineCodeGen(ctx, ev, (c) =>
    +      s"""$dtu.getHours($c)"""
    +    )
    +  }
    +}
    +
    +case class Minute(child: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(TimestampType)
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override protected def nullSafeEval(timestamp: Any): Any = {
    +    DateTimeUtils.getMinutes(timestamp.asInstanceOf[Long])
    +  }
    +
    +  override def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): 
String = {
    +    val dtu = DateTimeUtils.getClass.getName.stripSuffix("$")
    +    defineCodeGen(ctx, ev, (c) =>
    +      s"""$dtu.getMinutes($c)"""
    +    )
    +  }
    +}
    +
    +case class Second(child: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(TimestampType)
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override protected def nullSafeEval(timestamp: Any): Any = {
    +    DateTimeUtils.getSeconds(timestamp.asInstanceOf[Long])
    +  }
    +
    +  override protected def genCode(ctx: CodeGenContext, ev: 
GeneratedExpressionCode): String = {
    +    val dtu = DateTimeUtils.getClass.getName.stripSuffix("$")
    +    defineCodeGen(ctx, ev, (c) =>
    +      s"""$dtu.getSeconds($c)"""
    +    )
    +  }
    +}
    +
    +case class DayInYear(child: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(DateType)
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override def prettyName: String = "day_in_year"
    +
    +  override protected def nullSafeEval(date: Any): Any = {
    +    DateTimeUtils.getDayInYear(date.asInstanceOf[Int])
    +  }
    +
    +  override protected def genCode(ctx: CodeGenContext, ev: 
GeneratedExpressionCode): String = {
    +    val dtu = DateTimeUtils.getClass.getName.stripSuffix("$")
    +    defineCodeGen(ctx, ev, (c) =>
    +      s"""$dtu.getDayInYear($c)"""
    +    )
    +  }
    +}
    +
    +
    +case class Year(child: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(DateType)
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override protected def nullSafeEval(date: Any): Any = {
    +    DateTimeUtils.getYear(date.asInstanceOf[Int])
    +  }
    +
    +  override protected def genCode(ctx: CodeGenContext, ev: 
GeneratedExpressionCode): String = {
    +    val dtu = DateTimeUtils.getClass.getName.stripSuffix("$")
    +    defineCodeGen(ctx, ev, (c) =>
    +      s"""$dtu.getYear($c)"""
    +    )
    +  }
    +}
    +
    +case class Quarter(child: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(DateType)
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override protected def nullSafeEval(date: Any): Any = {
    +    DateTimeUtils.getQuarter(date.asInstanceOf[Int])
    +  }
    +
    +  override protected def genCode(ctx: CodeGenContext, ev: 
GeneratedExpressionCode): String = {
    +    val dtu = DateTimeUtils.getClass.getName.stripSuffix("$")
    +    defineCodeGen(ctx, ev, (c) =>
    +      s"""$dtu.getQuarter($c)"""
    +    )
    +  }
    +}
    +
    +case class Month(child: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(DateType)
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override protected def nullSafeEval(date: Any): Any = {
    +    DateTimeUtils.getMonth(date.asInstanceOf[Int])
    +  }
    +
    +  override protected def genCode(ctx: CodeGenContext, ev: 
GeneratedExpressionCode): String = {
    +    val dtu = DateTimeUtils.getClass.getName.stripSuffix("$")
    +    defineCodeGen(ctx, ev, (c) =>
    +      s"""$dtu.getMonth($c)"""
    +    )
    +  }
    +}
    +
    +case class Day(child: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(DateType)
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override protected def nullSafeEval(date: Any): Any = {
    +    DateTimeUtils.getDayOfMonth(date.asInstanceOf[Int])
    +  }
    +
    +  override protected def genCode(ctx: CodeGenContext, ev: 
GeneratedExpressionCode): String = {
    +    val dtu = DateTimeUtils.getClass.getName.stripSuffix("$")
    +    defineCodeGen(ctx, ev, (c) =>
    +      s"""$dtu.getDayOfMonth($c)"""
    +    )
    +  }
    +}
    +
    +case class WeekOfYear(child: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(DateType)
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override def prettyName: String = "week_of_year"
    +
    +  override protected def nullSafeEval(date: Any): Any = {
    +    val c = Calendar.getInstance()
    +    c.setFirstDayOfWeek(Calendar.MONDAY)
    +    c.setMinimalDaysInFirstWeek(4)
    +    c.setTimeInMillis(date.asInstanceOf[Int] * 1000L * 3600L * 24L)
    +    c.get(Calendar.WEEK_OF_YEAR)
    +  }
    +
    +  override def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): 
String =
    +    nullSafeCodeGen(ctx, ev, (time) => {
    +      val cal = classOf[Calendar].getName
    +      val c = ctx.freshName("cal")
    +      s"""
    +        $cal $c = $cal.getInstance();
    +        $c.setFirstDayOfWeek($cal.MONDAY);
    +        $c.setMinimalDaysInFirstWeek(4);
    +        $c.setTimeInMillis($time * 1000L * 3600L * 24L);
    +        ${ev.primitive} = $c.get($cal.WEEK_OF_YEAR);
    +      """
    +    })
    +}
    +
    +case class DateFormatClass(left: Expression, right: Expression) extends 
BinaryExpression
    +  with ImplicitCastInputTypes {
    +
    +  override def dataType: DataType = StringType
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(TimestampType, 
StringType)
    +
    +  override def prettyName: String = "date_format"
    +
    +  override protected def nullSafeEval(timestamp: Any, format: Any): Any = {
    +    val sdf = new SimpleDateFormat(format.toString)
    +    UTF8String.fromString(sdf.format(new Date(timestamp.asInstanceOf[Long] 
/ 1000)))
    +  }
    +
    +  override def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): 
String = {
    +    val sdf = classOf[SimpleDateFormat].getName
    +    val utf8 = classOf[UTF8String].getName
    +    defineCodeGen(ctx, ev, (timestamp, format) => {
    +      s"""$utf8.fromString((new $sdf($format.toString()))
    --- End diff --
    
    Jenkins refused to build with `s"""${ctx.stringType}.fromString((new 
$sdf($format.toString()))` even though it was locally accepted.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to