3030import org .opensearch .sql .data .model .ExprDateValue ;
3131import org .opensearch .sql .data .model .ExprTimestampValue ;
3232import org .opensearch .sql .data .model .ExprValue ;
33- import org .opensearch .sql .expression .datetime .DateTimeFunctions ;
3433import org .opensearch .sql .expression .function .FunctionProperties ;
3534import org .opensearch .sql .expression .function .ImplementorUDF ;
3635
@@ -94,18 +93,19 @@ public Expression implement(
9493 UserDefinedFunctionUtils .class , "restoreFunctionProperties" , translator .getRoot ());
9594
9695 if (SqlTypeFamily .NUMERIC .contains (temporalDeltaType )) {
97- String dateApplyFuncName =
98- SqlTypeName .DATE .equals (
99- OpenSearchTypeFactory .convertRelDataTypeToSqlTypeName (temporalType ))
100- ? "dateApplyDaysOnDate"
101- : "dateApplyDaysOnTimestamp" ;
96+ String applyDaysFuncName ;
97+ if (SqlTypeName .DATE .equals (
98+ OpenSearchTypeFactory .convertRelDataTypeToSqlTypeName (temporalType ))) {
99+ applyDaysFuncName = isAdd ? "dateAddDaysOnDate" : "dateSubDaysOnDate" ;
100+ } else {
101+ applyDaysFuncName = isAdd ? "dateAddDaysOnTimestamp" : "dateSubDaysOnTimestamp" ;
102+ }
102103 return Expressions .call (
103104 AddSubDateImplementor .class ,
104- dateApplyFuncName ,
105+ applyDaysFuncName ,
105106 properties ,
106107 base ,
107- Expressions .convert_ (temporalDelta , long .class ),
108- Expressions .constant (isAdd ));
108+ Expressions .convert_ (temporalDelta , long .class ));
109109 } else if (SqlTypeFamily .DATETIME_INTERVAL .contains (temporalDeltaType )) {
110110 Expression interval =
111111 Expressions .call (
@@ -115,13 +115,9 @@ public Expression implement(
115115 Expressions .constant (
116116 Objects .requireNonNull (temporalDeltaType .getIntervalQualifier ()).getUnit ()));
117117
118+ String applyIntervalFuncName = isAdd ? "dateAddInterval" : "dateSubInterval" ;
118119 return Expressions .call (
119- AddSubDateImplementor .class ,
120- "dateApplyInterval" ,
121- properties ,
122- base ,
123- interval ,
124- Expressions .constant (isAdd ));
120+ AddSubDateImplementor .class , applyIntervalFuncName , properties , base , interval );
125121 } else {
126122 throw new IllegalArgumentException (
127123 String .format (
@@ -130,28 +126,38 @@ public Expression implement(
130126 }
131127 }
132128
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 ();
129+ public static String dateAddDaysOnDate (
130+ FunctionProperties ignored , ExprValue datetime , long days ) {
131+ return (String ) new ExprDateValue (datetime .dateValue ().plusDays (days )).valueForCalcite ();
132+ }
133+
134+ public static String dateSubDaysOnDate (
135+ FunctionProperties ignored , ExprValue datetime , long days ) {
136+ return (String ) new ExprDateValue (datetime .dateValue ().minusDays (days )).valueForCalcite ();
137+ }
138+
139+ public static String dateAddDaysOnTimestamp (
140+ FunctionProperties properties , ExprValue datetime , long days ) {
141+ var dt = extractTimestamp (datetime , properties ).atZone (ZoneOffset .UTC ).toLocalDateTime ();
142+ return (String ) new ExprTimestampValue (dt .plusDays (days )).valueForCalcite ();
143+ }
144+
145+ public static String dateSubDaysOnTimestamp (
146+ FunctionProperties properties , ExprValue datetime , long days ) {
147+ var dt = extractTimestamp (datetime , properties ).atZone (ZoneOffset .UTC ).toLocalDateTime ();
148+ return (String ) new ExprTimestampValue (dt .minusDays (days )).valueForCalcite ();
141149 }
142150
143- public static String dateApplyDaysOnTimestamp (
144- FunctionProperties properties , ExprValue datetime , long days , boolean isAdd ) {
151+ public static String dateAddInterval (
152+ FunctionProperties properties , ExprValue datetime , TemporalAmount interval ) {
145153 var dt = extractTimestamp (datetime , properties ).atZone (ZoneOffset .UTC ).toLocalDateTime ();
146- return (String )
147- new ExprTimestampValue (isAdd ? dt .plusDays (days ) : dt .minusDays (days )).valueForCalcite ();
154+ return (String ) new ExprTimestampValue (dt .plus (interval )).valueForCalcite ();
148155 }
149156
150- public static String dateApplyInterval (
151- FunctionProperties properties , ExprValue datetime , TemporalAmount interval , boolean isAdd ) {
152- return (String )
153- DateTimeFunctions .exprDateApplyInterval (properties , datetime , interval , isAdd )
154- .valueForCalcite ();
157+ public static String dateSubInterval (
158+ FunctionProperties properties , ExprValue datetime , TemporalAmount interval ) {
159+ var dt = extractTimestamp (datetime , properties ).atZone (ZoneOffset .UTC ).toLocalDateTime ();
160+ return (String ) new ExprTimestampValue (dt .minus (interval )).valueForCalcite ();
155161 }
156162 }
157163}
0 commit comments