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