Skip to content

Commit 6a5e668

Browse files
committed
Refactor: split add and sub date to 2 static functions
Signed-off-by: Yuanchun Shen <yuanchu@amazon.com>
1 parent 3e11e63 commit 6a5e668

2 files changed

Lines changed: 41 additions & 38 deletions

File tree

core/src/main/java/org/opensearch/sql/expression/function/udf/datetime/AddSubDateFunction.java

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.opensearch.sql.data.model.ExprDateValue;
3131
import org.opensearch.sql.data.model.ExprTimestampValue;
3232
import org.opensearch.sql.data.model.ExprValue;
33-
import org.opensearch.sql.expression.datetime.DateTimeFunctions;
3433
import org.opensearch.sql.expression.function.FunctionProperties;
3534
import 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
}

core/src/main/java/org/opensearch/sql/expression/function/udf/datetime/DateAddSubFunction.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,10 @@ public Expression implement(
7474
Expressions.call(
7575
UserDefinedFunctionUtils.class, "restoreFunctionProperties", translator.getRoot());
7676

77+
String funcName = isAdd ? "dateAddInterval" : "dateSubInterval";
78+
7779
return Expressions.call(
78-
AddSubDateFunction.AddSubDateImplementor.class,
79-
"dateApplyInterval",
80-
properties,
81-
base,
82-
interval,
83-
Expressions.constant(isAdd));
80+
AddSubDateFunction.AddSubDateImplementor.class, funcName, properties, base, interval);
8481
}
8582
}
8683
}

0 commit comments

Comments
 (0)