|
7 | 7 |
|
8 | 8 | import static org.opensearch.sql.calcite.utils.UserDefinedFunctionUtils.NULLABLE_DATE_UDT; |
9 | 9 | import static org.opensearch.sql.calcite.utils.UserDefinedFunctionUtils.NULLABLE_TIMESTAMP_UDT; |
| 10 | +import static org.opensearch.sql.utils.DateTimeUtils.extractTimestamp; |
10 | 11 |
|
| 12 | +import java.time.ZoneOffset; |
11 | 13 | import java.time.temporal.TemporalAmount; |
12 | 14 | import java.util.List; |
13 | 15 | import java.util.Objects; |
|
25 | 27 | import org.opensearch.sql.calcite.utils.OpenSearchTypeFactory; |
26 | 28 | import org.opensearch.sql.calcite.utils.UserDefinedFunctionUtils; |
27 | 29 | import org.opensearch.sql.calcite.utils.datetime.DateTimeApplyUtils; |
| 30 | +import org.opensearch.sql.data.model.ExprDateValue; |
| 31 | +import org.opensearch.sql.data.model.ExprTimestampValue; |
28 | 32 | import org.opensearch.sql.data.model.ExprValue; |
29 | 33 | import org.opensearch.sql.expression.datetime.DateTimeFunctions; |
30 | 34 | import org.opensearch.sql.expression.function.FunctionProperties; |
@@ -90,9 +94,14 @@ public Expression implement( |
90 | 94 | UserDefinedFunctionUtils.class, "restoreFunctionProperties", translator.getRoot()); |
91 | 95 |
|
92 | 96 | if (SqlTypeFamily.NUMERIC.contains(temporalDeltaType)) { |
| 97 | + String dateApplyFuncName = |
| 98 | + SqlTypeName.DATE.equals( |
| 99 | + OpenSearchTypeFactory.convertRelDataTypeToSqlTypeName(temporalType)) |
| 100 | + ? "dateApplyDaysOnDate" |
| 101 | + : "dateApplyDaysOnTimestamp"; |
93 | 102 | return Expressions.call( |
94 | 103 | AddSubDateImplementor.class, |
95 | | - "dateApplyDays", |
| 104 | + dateApplyFuncName, |
96 | 105 | properties, |
97 | 106 | base, |
98 | 107 | Expressions.convert_(temporalDelta, long.class), |
@@ -121,16 +130,28 @@ public Expression implement( |
121 | 130 | } |
122 | 131 | } |
123 | 132 |
|
124 | | - public static Object dateApplyDays( |
| 133 | + public static String dateApplyDaysOnDate( |
| 134 | + FunctionProperties ignored, ExprValue datetime, long days, boolean isAdd) { |
| 135 | + return (String) |
| 136 | + new ExprDateValue( |
| 137 | + isAdd |
| 138 | + ? datetime.dateValue().plusDays(days) |
| 139 | + : datetime.dateValue().minusDays(days)) |
| 140 | + .valueForCalcite(); |
| 141 | + } |
| 142 | + |
| 143 | + public static String dateApplyDaysOnTimestamp( |
125 | 144 | FunctionProperties properties, ExprValue datetime, long days, boolean isAdd) { |
126 | | - return DateTimeFunctions.exprDateApplyDays(properties, datetime, days, isAdd) |
127 | | - .valueForCalcite(); |
| 145 | + var dt = extractTimestamp(datetime, properties).atZone(ZoneOffset.UTC).toLocalDateTime(); |
| 146 | + return (String) |
| 147 | + new ExprTimestampValue(isAdd ? dt.plusDays(days) : dt.minusDays(days)).valueForCalcite(); |
128 | 148 | } |
129 | 149 |
|
130 | | - public static Object dateApplyInterval( |
| 150 | + public static String dateApplyInterval( |
131 | 151 | FunctionProperties properties, ExprValue datetime, TemporalAmount interval, boolean isAdd) { |
132 | | - return DateTimeFunctions.exprDateApplyInterval(properties, datetime, interval, isAdd) |
133 | | - .valueForCalcite(); |
| 152 | + return (String) |
| 153 | + DateTimeFunctions.exprDateApplyInterval(properties, datetime, interval, isAdd) |
| 154 | + .valueForCalcite(); |
134 | 155 | } |
135 | 156 | } |
136 | 157 | } |
0 commit comments