@@ -211,7 +211,7 @@ sealed trait TimeInterval extends PainlessScript with MathScript {
211211
212212 override def script : String = TimeInterval .script(this )
213213
214- def applyType (in : SQLType ): Either [String , SQLType ] = {
214+ def checkType (in : SQLType ): Either [String , SQLType ] = {
215215 import TimeUnit ._
216216 in match {
217217 case SQLTypes .Date =>
@@ -254,20 +254,18 @@ object TimeInterval {
254254 }
255255}
256256
257- sealed trait SQLIntervalFunction extends SQLArithmeticFunction [SQLTemporal , SQLTemporal ] {
257+ sealed trait SQLIntervalFunction [ IO <: SQLTemporal ] extends SQLArithmeticFunction [IO , IO ] {
258258 def interval : TimeInterval
259- override def inputType : SQLTemporal = SQLTypes .Temporal
260- override def outputType : SQLTemporal = SQLTypes .Temporal
261259 override def script : String = s " ${operator.script}${interval.script}"
262260 private [this ] var _out : SQLType = outputType
263261 override def out : SQLType = _out
264262
265263 override def applyType (in : SQLType ): SQLType = {
266- _out = interval.applyType (in).getOrElse(out)
264+ _out = interval.checkType (in).getOrElse(out)
267265 _out
268266 }
269267
270- override def validate (): Either [String , Unit ] = interval.applyType (out) match {
268+ override def validate (): Either [String , Unit ] = interval.checkType (out) match {
271269 case Left (err) => Left (err)
272270 case Right (_) => Right (())
273271 }
@@ -279,20 +277,30 @@ sealed trait SQLIntervalFunction extends SQLArithmeticFunction[SQLTemporal, SQLT
279277 s " ${SQLTypeUtils .coerce(base, expr.out, out, nullable = expr.nullable)}$painless"
280278}
281279
282- case class SQLAddInterval (interval : TimeInterval )
283- extends SQLExpr (interval.sql)
284- with SQLIntervalFunction {
280+ sealed trait AddInterval [IO <: SQLTemporal ] extends SQLIntervalFunction [IO ] {
285281 override def operator : ArithmeticOperator = Add
286282 override def painless : String = s " .plus( ${interval.painless}) "
287283}
288284
289- case class SQLSubtractInterval (interval : TimeInterval )
290- extends SQLExpr (interval.sql)
291- with SQLIntervalFunction {
285+ sealed trait SubtractInterval [IO <: SQLTemporal ] extends SQLIntervalFunction [IO ] {
292286 override def operator : ArithmeticOperator = Subtract
293287 override def painless : String = s " .minus( ${interval.painless}) "
294288}
295289
290+ case class SQLAddInterval (interval : TimeInterval )
291+ extends SQLExpr (interval.sql)
292+ with AddInterval [SQLTemporal ] {
293+ override def inputType : SQLTemporal = SQLTypes .Temporal
294+ override def outputType : SQLTemporal = SQLTypes .Temporal
295+ }
296+
297+ case class SQLSubtractInterval (interval : TimeInterval )
298+ extends SQLExpr (interval.sql)
299+ with SubtractInterval [SQLTemporal ] {
300+ override def inputType : SQLTemporal = SQLTypes .Temporal
301+ override def outputType : SQLTemporal = SQLTypes .Temporal
302+ }
303+
296304sealed trait DateTimeFunction extends SQLFunction {
297305 def now : String = " ZonedDateTime.now(ZoneId.of('Z'))"
298306 override def out : SQLType = SQLTypes .DateTime
@@ -418,27 +426,27 @@ case class DateDiff(end: PainlessScript, start: PainlessScript, unit: TimeUnit)
418426case class DateAdd (identifier : SQLIdentifier , interval : TimeInterval )
419427 extends SQLExpr (" date_add" )
420428 with DateFunction
429+ with AddInterval [SQLDate ]
421430 with SQLTransformFunction [SQLDate , SQLDate ]
422431 with SQLFunctionWithIdentifier {
423432 override def inputType : SQLDate = SQLTypes .Date
424433 override def outputType : SQLDate = SQLTypes .Date
425434 override def toSQL (base : String ): String = {
426435 s " $sql( $base, ${interval.sql}) "
427436 }
428- override def painless : String = s " .plus( ${interval.painless}) "
429437}
430438
431439case class DateSub (identifier : SQLIdentifier , interval : TimeInterval )
432440 extends SQLExpr (" date_sub" )
433441 with DateFunction
442+ with SubtractInterval [SQLDate ]
434443 with SQLTransformFunction [SQLDate , SQLDate ]
435444 with SQLFunctionWithIdentifier {
436445 override def inputType : SQLDate = SQLTypes .Date
437446 override def outputType : SQLDate = SQLTypes .Date
438447 override def toSQL (base : String ): String = {
439448 s " $sql( $base, ${interval.sql}) "
440449 }
441- override def painless : String = s " .minus( ${interval.painless}) "
442450}
443451
444452case class ParseDate (identifier : SQLIdentifier , format : String )
@@ -480,27 +488,27 @@ case class FormatDate(identifier: SQLIdentifier, format: String)
480488case class DateTimeAdd (identifier : SQLIdentifier , interval : TimeInterval )
481489 extends SQLExpr (" datetime_add" )
482490 with DateTimeFunction
491+ with AddInterval [SQLDateTime ]
483492 with SQLTransformFunction [SQLDateTime , SQLDateTime ]
484493 with SQLFunctionWithIdentifier {
485494 override def inputType : SQLDateTime = SQLTypes .DateTime
486495 override def outputType : SQLDateTime = SQLTypes .DateTime
487496 override def toSQL (base : String ): String = {
488497 s " $sql( $base, ${interval.sql}) "
489498 }
490- override def painless : String = s " .plus( ${interval.painless}) "
491499}
492500
493501case class DateTimeSub (identifier : SQLIdentifier , interval : TimeInterval )
494502 extends SQLExpr (" datetime_sub" )
495503 with DateTimeFunction
504+ with SubtractInterval [SQLDateTime ]
496505 with SQLTransformFunction [SQLDateTime , SQLDateTime ]
497506 with SQLFunctionWithIdentifier {
498507 override def inputType : SQLDateTime = SQLTypes .DateTime
499508 override def outputType : SQLDateTime = SQLTypes .DateTime
500509 override def toSQL (base : String ): String = {
501510 s " $sql( $base, ${interval.sql}) "
502511 }
503- override def painless : String = s " .minus( ${interval.painless}) "
504512}
505513
506514case class ParseDateTime (identifier : SQLIdentifier , format : String )
0 commit comments