From eaac20b03b5257f6d7e378fce7388dc170495f7e Mon Sep 17 00:00:00 2001 From: Edmundo Alvarez Date: Thu, 18 Aug 2016 16:54:48 +0200 Subject: [PATCH] Support DateTime comparison (#92) Add support for comparison operators on DateTime objects. Fixes #86 --- .../ast/expressions/ComparisonExpression.java | 24 +++++++++++++++++-- .../pipelineprocessor/functions/dates.txt | 10 +++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/graylog/plugins/pipelineprocessor/ast/expressions/ComparisonExpression.java b/src/main/java/org/graylog/plugins/pipelineprocessor/ast/expressions/ComparisonExpression.java index f0177f464f48..bfcf45688171 100644 --- a/src/main/java/org/graylog/plugins/pipelineprocessor/ast/expressions/ComparisonExpression.java +++ b/src/main/java/org/graylog/plugins/pipelineprocessor/ast/expressions/ComparisonExpression.java @@ -18,6 +18,7 @@ import org.antlr.v4.runtime.Token; import org.graylog.plugins.pipelineprocessor.EvaluationContext; +import org.joda.time.DateTime; public class ComparisonExpression extends BinaryExpression implements LogicalExpression { private final String operator; @@ -42,11 +43,15 @@ public boolean evaluateBool(EvaluationContext context) { final Object leftValue = this.left.evaluateUnsafe(context); final Object rightValue = this.right.evaluateUnsafe(context); + if (leftValue instanceof DateTime && rightValue instanceof DateTime) { + return compareDateTimes(operator, (DateTime) leftValue, (DateTime) rightValue); + } + if (leftValue instanceof Double || rightValue instanceof Double) { return compareDouble(operator, (double) leftValue, (double) rightValue); - } else { - return compareLong(operator, (long) leftValue, (long) rightValue); } + + return compareLong(operator, (long) leftValue, (long) rightValue); } @SuppressWarnings("Duplicates") @@ -81,6 +86,21 @@ private boolean compareDouble(String operator, double left, double right) { } } + private boolean compareDateTimes(String operator, DateTime left, DateTime right) { + switch (operator) { + case ">": + return left.isAfter(right); + case ">=": + return !left.isBefore(right); + case "<": + return left.isBefore(right); + case "<=": + return !left.isAfter(right); + default: + return false; + } + } + @Override public String toString() { return left.toString() + " " + operator + " " + right.toString(); diff --git a/src/test/resources/org/graylog/plugins/pipelineprocessor/functions/dates.txt b/src/test/resources/org/graylog/plugins/pipelineprocessor/functions/dates.txt index 051fc005b101..1ba3d2bd8617 100644 --- a/src/test/resources/org/graylog/plugins/pipelineprocessor/functions/dates.txt +++ b/src/test/resources/org/graylog/plugins/pipelineprocessor/functions/dates.txt @@ -6,7 +6,15 @@ when now("CET") == now("UTC") && now("CET") == now() && flex_parse_date(value: "30th July 2010 18:03:25 ", timezone: "CET") == parse_date("2010-07-30T18:03:25+02:00", "yyyy-MM-dd'T'HH:mm:ssZZ") && - format_date(flex_parse_date("30th July 2010 18:03:25"), "yyyy-MM-dd") == "2010-07-30" + format_date(flex_parse_date("30th July 2010 18:03:25"), "yyyy-MM-dd") == "2010-07-30" && + parse_date("2010-07-30T18:03:24+02:00", "yyyy-MM-dd'T'HH:mm:ssZZ") < parse_date("2010-07-30T16:03:25Z", "yyyy-MM-dd'T'HH:mm:ssZZ") && + !(parse_date("2010-07-30T18:03:24+02:00", "yyyy-MM-dd'T'HH:mm:ssZZ") >= parse_date("2010-07-30T16:03:25Z", "yyyy-MM-dd'T'HH:mm:ssZZ")) && + parse_date("2010-07-30T18:03:25+02:00", "yyyy-MM-dd'T'HH:mm:ssZZ") > parse_date("2010-07-30T16:03:24Z", "yyyy-MM-dd'T'HH:mm:ssZZ") && + !(parse_date("2010-07-30T18:03:25+02:00", "yyyy-MM-dd'T'HH:mm:ssZZ") <= parse_date("2010-07-30T16:03:24Z", "yyyy-MM-dd'T'HH:mm:ssZZ")) && + parse_date("2010-07-30T18:03:25+02:00", "yyyy-MM-dd'T'HH:mm:ssZZ") <= parse_date("2010-07-30T16:03:25Z", "yyyy-MM-dd'T'HH:mm:ssZZ") && + !(parse_date("2010-07-30T18:03:25+02:00", "yyyy-MM-dd'T'HH:mm:ssZZ") > parse_date("2010-07-30T16:03:25Z", "yyyy-MM-dd'T'HH:mm:ssZZ")) && + parse_date("2010-07-30T18:03:25+02:00", "yyyy-MM-dd'T'HH:mm:ssZZ") >= parse_date("2010-07-30T16:03:25Z", "yyyy-MM-dd'T'HH:mm:ssZZ") && + !(parse_date("2010-07-30T18:03:25+02:00", "yyyy-MM-dd'T'HH:mm:ssZZ") < parse_date("2010-07-30T16:03:25Z", "yyyy-MM-dd'T'HH:mm:ssZZ")) then trigger_test(); let date = parse_date("2010-07-30T18:03:25+02:00", "yyyy-MM-dd'T'HH:mm:ssZZ");