This is an automated email from the ASF dual-hosted git repository. xiazcy pushed a commit to branch 3.8-dev in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 5e652982c64ebaae4c7fc210718eda99321b7ada Merge: 482475e814 d5f4a29535 Author: xiazcy <[email protected]> AuthorDate: Fri Aug 22 15:42:10 2025 -0700 Merge branch '3.7-dev' into 3.8-dev docs/src/dev/provider/gremlin-semantics.asciidoc | 11 +++++++++++ .../gremlin/process/traversal/step/map/DateDiffStep.java | 2 +- .../gremlin/process/traversal/step/map/DateDiffStepTest.java | 5 +++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DateDiffStep.java index 1aa7d3f073,52d0bd2cbe..9f1f37fdbc --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DateDiffStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DateDiffStep.java @@@ -60,41 -52,18 +60,41 @@@ public final class DateDiffStep<S> exte @Override protected Long map(final Traverser.Admin<S> traverser) { final Object object = traverser.get(); - - if (!(object instanceof Date)) - throw new IllegalArgumentException( - String.format("DateDiff can only take Date as argument, encountered %s", object == null ? null : object.getClass())); - - final Date otherDate = value != null ? value : - dateTraversal != null ? TraversalUtil.apply(traverser, dateTraversal) : null; + OffsetDateTime date; + OffsetDateTime otherDate; + + if (!(object instanceof OffsetDateTime)) { + // allow incoming traverser to resolve into Date object for compatibility + if (object instanceof Date) { + date = ((Date) object).toInstant().atOffset(ZoneOffset.UTC); + } else { + // note: null handling consistency to be resolved https://issues.apache.org/jira/browse/TINKERPOP-3152 + throw new IllegalArgumentException( - String.format("DateDiff can only take OffsetDateTime or Date (deprecated) as argument, encountered %s", object.getClass())); ++ String.format("DateDiff can only take OffsetDateTime or Date (deprecated) as argument, encountered %s", object == null ? null : object.getClass())); + } + } else { + date = (OffsetDateTime) object; + } + + + if (null == value && null != dateTraversal) { + Object traversalDate = TraversalUtil.apply(traverser, dateTraversal); + if (traversalDate == null) { + otherDate = null; + } else if (traversalDate instanceof Date) { + // for cases when traversal resolves to a java.util.Date object (e.g. inject(new Date())) + otherDate = ((Date) traversalDate).toInstant().atOffset(ZoneOffset.UTC); + } else if (traversalDate instanceof OffsetDateTime) { + otherDate = (OffsetDateTime) traversalDate; + } else { + throw new IllegalArgumentException(String.format("DateDiff can only take OffsetDateTime or Date (deprecated) as argument, encountered %s", object.getClass())); + } + } else { + otherDate = value; + } // let's not throw exception and assume null date == 0 - final long otherDateMs = otherDate == null ? 0 : otherDate.getTime(); - - return (((Date) object).getTime() - otherDateMs) / 1000; + return otherDate == null ? date.toEpochSecond() : Duration.between(otherDate, date).getSeconds(); } @Override diff --cc gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DateDiffStepTest.java index 43537aa2fd,e8de2d8681..5fb8e0120f --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DateDiffStepTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DateDiffStepTest.java @@@ -136,4 -91,14 +136,9 @@@ public class DateDiffStepTest extends S assertEquals(now.getTime() / 1000, (long) __.__(now).dateDiff((Date) null).next()); } + - @Test(expected = IllegalArgumentException.class) - public void shouldThrowWhenInputIsNotDate() { - __.__("2023-08-23T00:00:00Z").dateDiff(new Date()).next(); - } - + @Test(expected = IllegalArgumentException.class) + public void shouldThrowWhenInputIsNull() { + __.__((Object) null).dateDiff(new Date()).next(); + } }
