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

    https://github.com/apache/spark/pull/6986#discussion_r35490337
  
    --- Diff: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeFunctions.scala
 ---
    @@ -258,3 +258,62 @@ case class DateFormatClass(left: Expression, right: 
Expression) extends BinaryEx
         })
       }
     }
    +
    +/**
    + * Returns the last day of the month which the date belongs to.
    + */
    +case class LastDay(startDate: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +  override def child: Expression = startDate
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(DateType)
    +
    +  override def dataType: DataType = DateType
    +
    +  override def nullSafeEval(date: Any): Any = {
    +    val days = date.asInstanceOf[Int]
    +    DateTimeUtils.getLastDayOfMonth(days)
    +  }
    +
    +  override protected def genCode(ctx: CodeGenContext, ev: 
GeneratedExpressionCode): String = {
    +    val dtu = DateTimeUtils.getClass.getName.stripSuffix("$")
    +    defineCodeGen(ctx, ev, (sd) => {
    +      s"$dtu.getLastDayOfMonth($sd)"
    +    })
    +  }
    +}
    +
    +/**
    + * Returns the first date which is later than start_date and named as 
day_of_week.
    + */
    +case class NextDay(left: Expression, right: Expression)
    +  extends BinaryExpression with ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(DateType, 
StringType)
    +
    +  override def dataType: DataType = DateType
    +
    +  override def nullSafeEval(start: Any, dayOfWeek: Any): Any = {
    +    val dow = 
DateTimeUtils.getDayOfWeekFromString(dayOfWeek.asInstanceOf[UTF8String])
    +    if (dow == -1) {
    +      null
    +    } else {
    +      val sd = start.asInstanceOf[Int]
    +      sd + 1 + ((dow - sd % 7) % 7 + 7) % 7
    +    }
    +  }
    +
    +  override protected def genCode(ctx: CodeGenContext, ev: 
GeneratedExpressionCode): String = {
    +    nullSafeCodeGen(ctx, ev, (sd, dowS) => {
    +      val dtu = DateTimeUtils.getClass.getName.stripSuffix("$")
    +      val dow = ctx.freshName("dow")
    +      s"""
    +        int $dow = $dtu.getDayOfWeekFromString($dowS);
    --- End diff --
    
    it'd be great to avoid computing $dow if right is a literal.



---
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