You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by rm...@apache.org on 2018/10/18 22:00:57 UTC
metron git commit: METRON-1816 Date format Stellar function
(merrimanr) closes apache/metron#1233
Repository: metron
Updated Branches:
refs/heads/master 28542ad64 -> bf32fef6a
METRON-1816 Date format Stellar function (merrimanr) closes apache/metron#1233
Project: http://git-wip-us.apache.org/repos/asf/metron/repo
Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/bf32fef6
Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/bf32fef6
Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/bf32fef6
Branch: refs/heads/master
Commit: bf32fef6a4a02c5b21ec1f6d97fbd83de78a996e
Parents: 28542ad
Author: merrimanr <me...@gmail.com>
Authored: Thu Oct 18 17:00:44 2018 -0500
Committer: rmerriman <me...@gmail.com>
Committed: Thu Oct 18 17:00:44 2018 -0500
----------------------------------------------------------------------
metron-stellar/stellar-common/README.md | 9 +++++
.../stellar/dsl/functions/DateFunctions.java | 42 ++++++++++++++++++++
.../dsl/functions/DateFunctionsTest.java | 38 ++++++++++++++++++
3 files changed, 89 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/metron/blob/bf32fef6/metron-stellar/stellar-common/README.md
----------------------------------------------------------------------
diff --git a/metron-stellar/stellar-common/README.md b/metron-stellar/stellar-common/README.md
index 468f358..0f3bb6a 100644
--- a/metron-stellar/stellar-common/README.md
+++ b/metron-stellar/stellar-common/README.md
@@ -169,6 +169,7 @@ Where:
| [ `CHOP`](#chop) |
| [ `CHOMP`](#chomp) |
| [ `COUNT_MATCHES`](#count_matches) |
+| [ `DATE_FORMAT`](#date_format)
| [ `DAY_OF_MONTH`](#day_of_month) |
| [ `DAY_OF_WEEK`](#day_of_week) |
| [ `DAY_OF_YEAR`](#day_of_year) |
@@ -379,6 +380,14 @@ Where:
* substring/character - the substring or character to count, may be null.
* Returns: the number of non-overlapping occurrences, 0 if either CharSequence is null.
+### `DATE_FORMAT`
+ * Description: Takes an epoch timestamp and converts it to a date format.
+ * Input:
+ * format - DateTime format as a String.
+ * timestampField - Optional epoch time in Long format. Defaults to now.
+ * timezone - Optional timezone in String format.
+ * Returns: Formatted date.
+
### `DAY_OF_MONTH`
* Description: The numbered day within the month. The first day within the month has a value of 1.
* Input:
http://git-wip-us.apache.org/repos/asf/metron/blob/bf32fef6/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/DateFunctions.java
----------------------------------------------------------------------
diff --git a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/DateFunctions.java b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/DateFunctions.java
index 212d6e9..17f5f8d 100644
--- a/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/DateFunctions.java
+++ b/metron-stellar/stellar-common/src/main/java/org/apache/metron/stellar/dsl/functions/DateFunctions.java
@@ -28,6 +28,7 @@ import org.apache.metron.stellar.common.utils.ConversionUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
+import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.TimeZone;
@@ -109,6 +110,13 @@ public class DateFunctions {
return sdf.parse(date).getTime();
}
+ public static String getDateFormat(String format, Optional<Long> epochTime, Optional<String> timezone) {
+ Long time = epochTime.orElseGet(System::currentTimeMillis);
+ TimezonedFormat fmt = timezone.map(s -> new TimezonedFormat(format, s)).orElseGet(() -> new TimezonedFormat(format));
+ SimpleDateFormat sdf = formatCache.get(fmt).get();
+ return sdf.format(new Date(time));
+ }
+
/**
* Stellar Function: TO_EPOCH_TIMESTAMP
@@ -144,6 +152,40 @@ public class DateFunctions {
}
}
+ @Stellar( name="DATE_FORMAT",
+ description = "Takes an epoch timestamp and converts it to a date format.",
+ params = {"format - DateTime format as a String."
+ , "timestampField - Optional epoch time in Long format. Defaults to now."
+ , "timezone - Optional timezone in String format."},
+ returns="Formatted date."
+ )
+ public static class DateFormat extends BaseStellarFunction {
+
+ public Object apply(List<Object> objects) {
+ int size = objects.size();
+ Optional<Object> formatObj = Optional.ofNullable(objects.get(0));
+ Optional<Long> epochObj = Optional.empty();
+ Optional<String> tzObj = Optional.empty();
+ if (size > 1) {
+ if (size == 2) {
+ if (objects.get(1) == null) {
+ return null;
+ }
+ epochObj = objects.get(1) instanceof Long ? Optional.of((Long) objects.get(1)) : Optional.empty();
+ tzObj = objects.get(1) instanceof String ? Optional.of((String) objects.get(1)) : Optional.empty();
+ } else {
+ epochObj = Optional.ofNullable((Long) objects.get(1));
+ tzObj = Optional.ofNullable((String) objects.get(2));
+ }
+ }
+ if(formatObj.isPresent()) {
+ return getDateFormat(formatObj.get().toString(), epochObj, tzObj);
+ } else {
+ return null;
+ }
+ }
+ }
+
/**
* Gets the value from a list of arguments.
*
http://git-wip-us.apache.org/repos/asf/metron/blob/bf32fef6/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/DateFunctionsTest.java
----------------------------------------------------------------------
diff --git a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/DateFunctionsTest.java b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/DateFunctionsTest.java
index 1f1f4f4..959e7ea 100644
--- a/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/DateFunctionsTest.java
+++ b/metron-stellar/stellar-common/src/test/java/org/apache/metron/stellar/dsl/functions/DateFunctionsTest.java
@@ -31,6 +31,7 @@ import org.junit.Test;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
+import java.util.TimeZone;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -225,4 +226,41 @@ public class DateFunctionsTest {
public void testDayOfYearNull() {
Object result = run("DAY_OF_YEAR(nada)");
}
+
+ @Test
+ public void testDateFormat() {
+ Object result = run("DATE_FORMAT('EEE MMM dd yyyy hh:mm:ss zzz', epoch, 'EST')");
+ assertEquals("Thu Aug 25 2016 08:27:10 EST", result);
+ }
+
+ @Test
+ public void testDateFormatDefault() {
+ Object result = run("DATE_FORMAT('EEE MMM dd yyyy hh:mm:ss zzzz')");
+ assertTrue(result.toString().endsWith(TimeZone.getDefault().getDisplayName(true, 1)));
+ }
+
+ @Test
+ public void testDateFormatNow() {
+ Object result = run("DATE_FORMAT('EEE MMM dd yyyy hh:mm:ss zzz', 'GMT')");
+ assertTrue(result.toString().endsWith("GMT"));
+ }
+
+ @Test
+ public void testDateFormatDefaultTimezone() {
+ Object result = run("DATE_FORMAT('EEE MMM dd yyyy hh:mm:ss zzzz', epoch)");
+ assertTrue(result.toString().endsWith(TimeZone.getDefault().getDisplayName(true, 1)));
+ }
+
+ /**
+ * If refer to variable that does not exist, expect ParseException.
+ */
+ @Test(expected = ParseException.class)
+ public void testDateFormatNull() {
+ Object result = run("DATE_FORMAT('EEE MMM dd yyyy hh:mm:ss zzz', nada, 'EST')");
+ }
+
+ @Test(expected = ParseException.class)
+ public void testDateFormatInvalid() {
+ Object result = run("DATE_FORMAT('INVALID DATE FORMAT', epoch, 'EST')");
+ }
}