aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2023-08-17 09:38:01 +0200
committerGitHub <noreply@github.com>2023-08-17 09:38:01 +0200
commit43eae4a4c62c9dc4addda09e62720dbdfb0609ec (patch)
tree3685c8e6e898d15149fe45a482d8755de475f989
parentbacc836bf68b2d0c2fc4acb6d5d9cceb204ae382 (diff)
parentaad9506a7f9424c02b94ee0dea9ef140dbe7edc9 (diff)
Merge pull request #28068 from vespa-engine/jobergum/date-to-epoch-il-expression
Add support for converting iso-8601 date strings to epoch time
-rw-r--r--indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToEpochSecondExpression.java51
-rw-r--r--indexinglanguage/src/main/javacc/IndexingParser.jj8
-rw-r--r--indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ToEpochSecondExpressionTestCase.java51
3 files changed, 110 insertions, 0 deletions
diff --git a/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToEpochSecondExpression.java b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToEpochSecondExpression.java
new file mode 100644
index 00000000000..c8106148630
--- /dev/null
+++ b/indexinglanguage/src/main/java/com/yahoo/vespa/indexinglanguage/expressions/ToEpochSecondExpression.java
@@ -0,0 +1,51 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.indexinglanguage.expressions;
+
+import com.yahoo.document.DataType;
+import com.yahoo.document.datatypes.LongFieldValue;
+import java.time.Instant;
+
+/**
+ * Converts ISO-8601 formatted date string to UNIX Epoch Time in seconds
+ *
+ * @author bergum
+ */
+
+public class ToEpochSecondExpression extends Expression {
+ public ToEpochSecondExpression() {
+ super(DataType.STRING); //only accept string input
+ }
+
+ @Override
+ protected void doExecute(ExecutionContext context) {
+ String inputString = String.valueOf(context.getValue());
+ long epochTime = Instant.parse(inputString).getEpochSecond();
+ context.setValue(new LongFieldValue(epochTime));
+ }
+
+ @Override
+ protected void doVerify(VerificationContext context) {
+ context.setValueType(createdOutputType());
+ }
+
+ @Override
+ public DataType createdOutputType() {
+ return DataType.LONG;
+ }
+
+ @Override
+ public String toString() {
+ return "to_epoch_second";
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj instanceof ToEpochSecondExpression;
+ }
+
+ @Override
+ public int hashCode() {
+ return getClass().hashCode();
+ }
+
+}
diff --git a/indexinglanguage/src/main/javacc/IndexingParser.jj b/indexinglanguage/src/main/javacc/IndexingParser.jj
index a039ad137ee..d559d9b7260 100644
--- a/indexinglanguage/src/main/javacc/IndexingParser.jj
+++ b/indexinglanguage/src/main/javacc/IndexingParser.jj
@@ -198,6 +198,7 @@ TOKEN :
<TO_INT: "to_int"> |
<TO_LONG: "to_long"> |
<TO_POS: "to_pos"> |
+ <TO_EPOCH_SECOND: "to_epoch_second"> |
<TO_STRING: "to_string"> |
<TO_WSET: "to_wset"> |
<TO_BOOL: "to_bool"> |
@@ -338,6 +339,7 @@ Expression value() :
val = toIntExp() |
val = toLongExp() |
val = toPosExp() |
+ val = toEpochSecondExp() |
val = toStringExp() |
val = toWsetExp() |
val = toBoolExp() |
@@ -713,6 +715,12 @@ Expression toPosExp() : { }
{ return new ToPositionExpression(); }
}
+Expression toEpochSecondExp() : { }
+{
+ ( <TO_EPOCH_SECOND> )
+ { return new ToEpochSecondExpression(); }
+}
+
Expression toStringExp() : { }
{
( <TO_STRING> )
diff --git a/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ToEpochSecondExpressionTestCase.java b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ToEpochSecondExpressionTestCase.java
new file mode 100644
index 00000000000..7203afcc1a0
--- /dev/null
+++ b/indexinglanguage/src/test/java/com/yahoo/vespa/indexinglanguage/expressions/ToEpochSecondExpressionTestCase.java
@@ -0,0 +1,51 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.indexinglanguage.expressions;
+
+import com.yahoo.document.DataType;
+import com.yahoo.document.datatypes.FieldValue;
+import com.yahoo.document.datatypes.LongFieldValue;
+import com.yahoo.document.datatypes.StringFieldValue;
+import com.yahoo.vespa.indexinglanguage.SimpleTestAdapter;
+import org.junit.Test;
+
+import static com.yahoo.vespa.indexinglanguage.expressions.ExpressionAssert.assertVerify;
+import static com.yahoo.vespa.indexinglanguage.expressions.ExpressionAssert.assertVerifyThrows;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+public class ToEpochSecondExpressionTestCase {
+ @Test
+ public void requireThatHashCodeAndEqualsAreImplemented() {
+ Expression exp = new ToEpochSecondExpression();
+ assertFalse(exp.equals(new Object()));
+ assertEquals(exp, new ToEpochSecondExpression());
+ assertEquals(exp.hashCode(), new ToEpochSecondExpression().hashCode());
+ }
+
+ @Test
+ public void requireThatExpressionCanBeVerified() {
+ Expression exp = new ToEpochSecondExpression();
+ assertVerify(DataType.STRING, exp, DataType.LONG);
+ assertVerifyThrows(DataType.INT, exp, "Expected string input, got int.");
+ assertVerifyThrows(null, exp, "Expected string input, got null.");
+ }
+
+ @Test
+ public void requireThatValueIsConvertedWithMs() {
+ ExecutionContext ctx = new ExecutionContext(new SimpleTestAdapter());
+ ctx.setValue(new StringFieldValue("2023-12-24T17:00:43.000Z")).execute(new ToEpochSecondExpression());
+ FieldValue val = ctx.getValue();
+ assertTrue(val instanceof LongFieldValue);
+ assertEquals(1703437243L, ((LongFieldValue)val).getLong());
+ }
+
+ @Test
+ public void requireThatValueIsConverted() {
+ ExecutionContext ctx = new ExecutionContext(new SimpleTestAdapter());
+ ctx.setValue(new StringFieldValue("2023-12-24T17:00:43Z")).execute(new ToEpochSecondExpression());
+ FieldValue val = ctx.getValue();
+ assertTrue(val instanceof LongFieldValue);
+ assertEquals(1703437243L, ((LongFieldValue)val).getLong());
+ }
+}