Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import org.apache.calcite.runtime.SqlFunctions;
import org.opensearch.sql.calcite.udf.UserDefinedFunction;
import org.opensearch.sql.calcite.utils.datetime.InstantUtils;
import org.opensearch.sql.data.model.ExprStringValue;
import org.opensearch.sql.data.model.ExprTimestampValue;
import org.opensearch.sql.data.model.ExprValue;
import org.opensearch.sql.expression.datetime.DateTimeFunctions;

public class ConvertTZFunction implements UserDefinedFunction {
@Override
public Object eval(Object... args) {
Object argTimestamp = args[0];
Object fromTz = args[1];
Object toTz = args[2];

Instant datetimeInstant = InstantUtils.fromEpochMills(((Number) argTimestamp).longValue());
ExprValue datetimeExpr =
DateTimeFunctions.exprConvertTZ(
new ExprTimestampValue(datetimeInstant),
new ExprStringValue(fromTz.toString()),
new ExprStringValue(toTz.toString()));

if (datetimeExpr.isNull()) {
return null;
}

// Manually convert to calcite internal representation of Timestamp to circumvent
// errors relating to null returns
return SqlFunctions.toLong(
Timestamp.valueOf(LocalDateTime.ofInstant(datetimeExpr.timestampValue(), ZoneOffset.UTC)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import org.apache.calcite.runtime.SqlFunctions;
import org.opensearch.sql.calcite.udf.UserDefinedFunction;
import org.opensearch.sql.data.model.ExprStringValue;
import org.opensearch.sql.data.model.ExprValue;
import org.opensearch.sql.expression.datetime.DateTimeFunctions;

public class DatetimeFunction implements UserDefinedFunction {
@Override
public Object eval(Object... args) {
Object argTimestamp = args[0];
ExprValue argTimestampExpr = new ExprStringValue(argTimestamp.toString());
ExprValue datetimeExpr;
if (args.length == 1) {
datetimeExpr = DateTimeFunctions.exprDateTimeNoTimezone(argTimestampExpr);
} else {
Object argTimezone = args[1];
datetimeExpr =
DateTimeFunctions.exprDateTime(
argTimestampExpr, new ExprStringValue(argTimezone.toString()));
}
if (datetimeExpr.isNull()) {
return null;
}
// Manually convert to calcite internal representation of Timestamp to circumvent
// errors relating to null returns
return SqlFunctions.toLong(
Timestamp.valueOf(LocalDateTime.ofInstant(datetimeExpr.timestampValue(), ZoneOffset.UTC)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import org.opensearch.sql.calcite.udf.UserDefinedFunction;
import org.opensearch.sql.calcite.utils.datetime.InstantUtils;
import org.opensearch.sql.data.model.ExprStringValue;
import org.opensearch.sql.data.model.ExprTimestampValue;
import org.opensearch.sql.expression.datetime.DateTimeFunctions;

public class ExtractFunction implements UserDefinedFunction {
@Override
public Object eval(Object... args) {
Object argPart = args[0];
Object argTimestamp = args[1];

Instant datetimeInstant = InstantUtils.fromEpochMills(((Number) argTimestamp).longValue());

return DateTimeFunctions.formatExtractFunction(
new ExprStringValue(argPart.toString()), new ExprTimestampValue(datetimeInstant))
.longValue();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import org.opensearch.sql.calcite.udf.UserDefinedFunction;
import org.opensearch.sql.data.model.ExprLongValue;
import org.opensearch.sql.data.model.ExprValue;
import org.opensearch.sql.expression.datetime.DateTimeFunctions;
import java.sql.Date;

public class FromDaysFunction implements UserDefinedFunction {
@Override
public Object eval(Object... args) {
Number argDays = (Number) args[0];
ExprValue dateExpr = DateTimeFunctions.exprFromDays(new ExprLongValue(argDays.longValue()));
return Date.valueOf(dateExpr.dateValue());
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import org.opensearch.sql.calcite.udf.UserDefinedFunction;
import org.opensearch.sql.data.model.ExprStringValue;
import org.opensearch.sql.data.model.ExprValue;
import org.opensearch.sql.expression.datetime.DateTimeFunctions;

public class GetFormatFunction implements UserDefinedFunction {
@Override
public Object eval(Object... args) {
Object argType = args[0];
Object argStandard = args[1];

ExprValue fmt =
DateTimeFunctions.exprGetFormat(
new ExprStringValue(argType.toString()), new ExprStringValue(argStandard.toString()));

return fmt.stringValue();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import java.sql.Time;
import org.opensearch.sql.calcite.udf.UserDefinedFunction;
import org.opensearch.sql.data.model.ExprDoubleValue;
import org.opensearch.sql.data.model.ExprValue;
import org.opensearch.sql.expression.datetime.DateTimeFunctions;

public class MakeTimeFunction implements UserDefinedFunction {
@Override
public Object eval(Object... args) {
ExprValue timeExpr =
DateTimeFunctions.exprMakeTime(
new ExprDoubleValue(((Number) args[0]).doubleValue()),
new ExprDoubleValue(((Number) args[1]).doubleValue()),
new ExprDoubleValue(((Number) args[2]).doubleValue()));
return Time.valueOf(timeExpr.timeValue());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.opensearch.sql.calcite.udf.datetimeUDF;

import com.google.common.collect.ImmutableList;
import java.util.Arrays;
import org.opensearch.sql.calcite.udf.UserDefinedFunction;
import org.opensearch.sql.calcite.utils.UserDefineFunctionUtils;
import org.opensearch.sql.calcite.utils.datetime.InstantUtils;
import org.opensearch.sql.data.model.ExprTimestampValue;
import org.opensearch.sql.expression.datetime.DateTimeFunctions;

/**
* minute(time) returns the amount of minutes in the day, in the range of 0 to 1439.
*/
public class MinuteOfDay implements UserDefinedFunction {
@Override
public Object eval(Object... args) {
UserDefineFunctionUtils.validateArgumentCount("MINUTE_OF_DAY", 1, args.length, false);
UserDefineFunctionUtils.validateArgumentTypes(
Arrays.asList(args), ImmutableList.of(Number.class));
return DateTimeFunctions.exprMinuteOfDay(
new ExprTimestampValue(InstantUtils.fromEpochMills(((Number) args[0]).longValue())))
.integerValue();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import com.google.common.collect.ImmutableList;
import java.util.Arrays;
import org.opensearch.sql.calcite.udf.UserDefinedFunction;
import org.opensearch.sql.calcite.utils.UserDefineFunctionUtils;
import org.opensearch.sql.data.model.ExprIntegerValue;
import org.opensearch.sql.data.model.ExprValue;
import org.opensearch.sql.expression.datetime.DateTimeFunctions;

public class PeriodAddFunction implements UserDefinedFunction {
@Override
public Object eval(Object... args) {
UserDefineFunctionUtils.validateArgumentCount("PERIOD_ADD", 2, args.length, false);

UserDefineFunctionUtils.validateArgumentTypes(
Arrays.asList(args), ImmutableList.of(Number.class, Number.class));

ExprValue periodAddExpr =
DateTimeFunctions.exprPeriodAdd(
new ExprIntegerValue((Number) args[0]), new ExprIntegerValue((Number) args[1]));

return periodAddExpr.integerValue();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import com.google.common.collect.ImmutableList;
import java.util.Arrays;
import org.opensearch.sql.calcite.udf.UserDefinedFunction;
import org.opensearch.sql.calcite.utils.UserDefineFunctionUtils;
import org.opensearch.sql.data.model.ExprIntegerValue;
import org.opensearch.sql.data.model.ExprValue;
import org.opensearch.sql.expression.datetime.DateTimeFunctions;

public class PeriodDiffFunction implements UserDefinedFunction {
@Override
public Object eval(Object... args) {
UserDefineFunctionUtils.validateArgumentCount("PERIOD_DIFF", 2, args.length, false);

UserDefineFunctionUtils.validateArgumentTypes(
Arrays.asList(args), ImmutableList.of(Number.class, Number.class));

ExprValue periodDiffExpr =
DateTimeFunctions.exprPeriodDiff(
new ExprIntegerValue((Number) args[0]), new ExprIntegerValue((Number) args[1]));

return periodDiffExpr.integerValue();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.List;
import org.apache.calcite.runtime.SqlFunctions;
import org.opensearch.sql.calcite.udf.UserDefinedFunction;
import org.opensearch.sql.calcite.utils.UserDefineFunctionUtils;
import org.opensearch.sql.data.model.ExprStringValue;
import org.opensearch.sql.data.model.ExprValue;
import org.opensearch.sql.expression.datetime.DateTimeFunctions;
import org.opensearch.sql.expression.function.FunctionProperties;

/**
* str_to_date(string, string) is used to extract a TIMESTAMP from the first argument string using
* the formats specified in the second argument string. The input argument must have enough
* information to be parsed as a DATE, TIMESTAMP, or TIME. Acceptable string format specifiers are
* the same as those used in the DATE_FORMAT function. It returns NULL when a statement cannot be
* parsed due to an invalid pair of arguments, and when 0 is provided for any DATE field. Otherwise,
* it will return a TIMESTAMP with the parsed values (as well as default values for any field that
* was not parsed).
*/
public class StrToDateFunction implements UserDefinedFunction {
@Override
public Object eval(Object... args) {
UserDefineFunctionUtils.validateArgumentCount("STR_TO_DATE", 2, args.length, true);
UserDefineFunctionUtils.validateArgumentTypes(
Arrays.asList(args), List.of(String.class, String.class));

ExprValue formatedDateExpr =
DateTimeFunctions.exprStrToDate(
new FunctionProperties(),
new ExprStringValue(args[0].toString()),
new ExprStringValue(args[1].toString()));

if (formatedDateExpr.isNull()) {
return null;
}

// Manually convert to calcite internal representation of Timestamp to circumvent
// errors relating to null returns
return SqlFunctions.toLong(
Timestamp.valueOf(
LocalDateTime.ofInstant(formatedDateExpr.timestampValue(), ZoneOffset.UTC)));
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import static org.opensearch.sql.expression.datetime.DateTimeFunctions.transferUnixTimeStampFromDoubleInput;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import java.sql.Date;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import java.sql.Time;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

package org.opensearch.sql.calcite.udf.datetimeUDF;

import java.time.ZoneOffset;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.opensearch.sql.calcite.udf.datetimeUDF;

import java.time.Instant;
import java.util.Arrays;
import java.util.List;
import org.opensearch.sql.calcite.udf.UserDefinedFunction;
import org.opensearch.sql.calcite.utils.UserDefineFunctionUtils;
import org.opensearch.sql.calcite.utils.datetime.InstantUtils;
import org.opensearch.sql.data.model.ExprIntegerValue;
import org.opensearch.sql.data.model.ExprTimestampValue;
import org.opensearch.sql.data.model.ExprValue;
import org.opensearch.sql.expression.datetime.DateTimeFunctions;

/** WEEK & WEEK_OF_YEAR */
public class WeekFunction implements UserDefinedFunction {
@Override
public Object eval(Object... args) {
UserDefineFunctionUtils.validateArgumentCount("WEEK", 2, args.length, false);
UserDefineFunctionUtils.validateArgumentTypes(
Arrays.asList(args), List.of(Number.class, Number.class));

Instant i = InstantUtils.fromEpochMills(((Number) args[0]).longValue());
ExprValue woyExpr =
DateTimeFunctions.exprWeek(
new ExprTimestampValue(i), new ExprIntegerValue((Number) args[1]));
return woyExpr.integerValue();
}
}
Loading
Loading