Skip to content

Commit aa0d475

Browse files
committed
fix painless script to cast implicitly identifiers to local date or local time when required
1 parent d842c5e commit aa0d475

File tree

4 files changed

+21
-6
lines changed

4 files changed

+21
-6
lines changed

es6/sql-bridge/src/test/scala/app/softnetwork/elastic/sql/SQLQuerySpec.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1958,7 +1958,7 @@ class SQLQuerySpec extends AnyFlatSpec with Matchers {
19581958
| "c": {
19591959
| "script": {
19601960
| "lang": "painless",
1961-
| "source": "def param1 = (!doc.containsKey('createdAt') || doc['createdAt'].empty ? null : doc['createdAt'].value); def param2 = LocalDate.parse(\"2025-09-11\", DateTimeFormatter.ofPattern('yyyy-MM-dd')).minus(2, ChronoUnit.DAYS); def param3 = param1 == param2 ? null : param1; def param4 = ZonedDateTime.now(ZoneId.of('Z')).toLocalDate(); param3 != null ? param3 : param4"
1961+
| "source": "def param1 = (!doc.containsKey('createdAt') || doc['createdAt'].empty ? null : doc['createdAt'].value.toLocalDate()); def param2 = LocalDate.parse(\"2025-09-11\", DateTimeFormatter.ofPattern('yyyy-MM-dd')).minus(2, ChronoUnit.DAYS); def param3 = param1 == param2 ? null : param1; def param4 = ZonedDateTime.now(ZoneId.of('Z')).toLocalDate(); param3 != null ? param3 : param4"
19621962
| }
19631963
| }
19641964
| },
@@ -2016,7 +2016,7 @@ class SQLQuerySpec extends AnyFlatSpec with Matchers {
20162016
| "c": {
20172017
| "script": {
20182018
| "lang": "painless",
2019-
| "source": "def param1 = (!doc.containsKey('createdAt') || doc['createdAt'].empty ? null : doc['createdAt'].value); def param2 = LocalDate.parse(\"2025-09-11\", DateTimeFormatter.ofPattern('yyyy-MM-dd')); def param3 = param1 == param2 ? null : param1; def param4 = ZonedDateTime.now(ZoneId.of('Z')).toLocalDate().minus(2, ChronoUnit.HOURS); try { param3 != null ? param3 : param4 } catch (Exception e) { return null; }"
2019+
| "source": "def param1 = (!doc.containsKey('createdAt') || doc['createdAt'].empty ? null : doc['createdAt'].value.toLocalDate()); def param2 = LocalDate.parse(\"2025-09-11\", DateTimeFormatter.ofPattern('yyyy-MM-dd')); def param3 = param1 == param2 ? null : param1; def param4 = ZonedDateTime.now(ZoneId.of('Z')).toLocalDate().minus(2, ChronoUnit.HOURS); try { param3 != null ? param3 : param4 } catch (Exception e) { return null; }"
20202020
| }
20212021
| },
20222022
| "c2": {

sql/bridge/src/test/scala/app/softnetwork/elastic/sql/SQLQuerySpec.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1962,7 +1962,7 @@ class SQLQuerySpec extends AnyFlatSpec with Matchers {
19621962
| "c": {
19631963
| "script": {
19641964
| "lang": "painless",
1965-
| "source": "def param1 = (!doc.containsKey('createdAt') || doc['createdAt'].empty ? null : doc['createdAt'].value); def param2 = LocalDate.parse(\"2025-09-11\", DateTimeFormatter.ofPattern('yyyy-MM-dd')).minus(2, ChronoUnit.DAYS); def param3 = param1 == param2 ? null : param1; def param4 = ZonedDateTime.now(ZoneId.of('Z')).toLocalDate(); param3 != null ? param3 : param4"
1965+
| "source": "def param1 = (!doc.containsKey('createdAt') || doc['createdAt'].empty ? null : doc['createdAt'].value.toLocalDate()); def param2 = LocalDate.parse(\"2025-09-11\", DateTimeFormatter.ofPattern('yyyy-MM-dd')).minus(2, ChronoUnit.DAYS); def param3 = param1 == param2 ? null : param1; def param4 = ZonedDateTime.now(ZoneId.of('Z')).toLocalDate(); param3 != null ? param3 : param4"
19661966
| }
19671967
| }
19681968
| },
@@ -2020,7 +2020,7 @@ class SQLQuerySpec extends AnyFlatSpec with Matchers {
20202020
| "c": {
20212021
| "script": {
20222022
| "lang": "painless",
2023-
| "source": "def param1 = (!doc.containsKey('createdAt') || doc['createdAt'].empty ? null : doc['createdAt'].value); def param2 = LocalDate.parse(\"2025-09-11\", DateTimeFormatter.ofPattern('yyyy-MM-dd')); def param3 = param1 == param2 ? null : param1; def param4 = ZonedDateTime.now(ZoneId.of('Z')).toLocalDate().minus(2, ChronoUnit.HOURS); try { param3 != null ? param3 : param4 } catch (Exception e) { return null; }"
2023+
| "source": "def param1 = (!doc.containsKey('createdAt') || doc['createdAt'].empty ? null : doc['createdAt'].value.toLocalDate()); def param2 = LocalDate.parse(\"2025-09-11\", DateTimeFormatter.ofPattern('yyyy-MM-dd')); def param3 = param1 == param2 ? null : param1; def param4 = ZonedDateTime.now(ZoneId.of('Z')).toLocalDate().minus(2, ChronoUnit.HOURS); try { param3 != null ? param3 : param4 } catch (Exception e) { return null; }"
20242024
| }
20252025
| },
20262026
| "c2": {

sql/src/main/scala/app/softnetwork/elastic/sql/function/cond/package.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ package object cond {
167167
callArgs match {
168168
case List(arg0, arg1) =>
169169
val expr =
170-
s"${arg0.trim} == ${arg1.trim} ? null : $arg0" // TODO check when expr1 and expr2 are nullable and have functions
170+
s"${arg0.trim} == ${arg1.trim} ? null : $arg0"
171171
context match {
172172
case Some(ctx) =>
173173
ctx.addParam(LiteralParam(expr)) match {

sql/src/main/scala/app/softnetwork/elastic/sql/function/package.scala

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package app.softnetwork.elastic.sql
1818

19-
import app.softnetwork.elastic.sql.`type`.{SQLType, SQLTypeUtils}
19+
import app.softnetwork.elastic.sql.`type`.{SQLType, SQLTypeUtils, SQLTypes}
2020
import app.softnetwork.elastic.sql.function.aggregate.AggregateFunction
2121
import app.softnetwork.elastic.sql.operator.math.ArithmeticExpression
2222
import app.softnetwork.elastic.sql.parser.Validator
@@ -147,6 +147,8 @@ package object function {
147147

148148
override def applyType(in: SQLType): SQLType = outputType
149149

150+
lazy val targetedType: SQLType = SQLTypeUtils.leastCommonSuperType(argTypes)
151+
150152
override def sql: String =
151153
s"${fun.map(_.sql).getOrElse("")}(${args.map(_.sql).mkString(argsSeparator)})"
152154

@@ -215,6 +217,19 @@ package object function {
215217
else {
216218
ctx.addParam(LiteralParam(ret))
217219
}
220+
case identifier: Identifier =>
221+
identifier.baseType match {
222+
case SQLTypes.Any => // in painless context, Any is ZonedDateTime
223+
targetedType match {
224+
case SQLTypes.Date =>
225+
identifier.addPainlessMethod(".toLocalDate()")
226+
case SQLTypes.Time =>
227+
identifier.addPainlessMethod(".toLocalTime()")
228+
case _ =>
229+
}
230+
case _ =>
231+
}
232+
Option(paramName)
218233
case _ =>
219234
Option(paramName)
220235
}

0 commit comments

Comments
 (0)