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
16 changes: 15 additions & 1 deletion engine/src/main/java/com/arcadedb/utility/DateUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,20 @@ else if (precisionToUse.equals(ChronoUnit.NANOS))
else
// NOT SUPPORTED
timestamp = 0;
} else if (value instanceof java.time.OffsetDateTime offsetDateTime) {
if (precisionToUse.equals(ChronoUnit.SECONDS))
timestamp = offsetDateTime.toInstant().getEpochSecond();
else if (precisionToUse.equals(ChronoUnit.MILLIS))
timestamp = offsetDateTime.toInstant().toEpochMilli();
else if (precisionToUse.equals(ChronoUnit.MICROS))
timestamp =
TimeUnit.MICROSECONDS.convert(offsetDateTime.toEpochSecond(), TimeUnit.SECONDS) + (offsetDateTime.getNano() / 1000);
else if (precisionToUse.equals(ChronoUnit.NANOS)) {
long s2n = TimeUnit.NANOSECONDS.convert(offsetDateTime.toEpochSecond(), TimeUnit.SECONDS);
timestamp = (s2n >= 0 && Long.MAX_VALUE - s2n < offsetDateTime.getNano()) ? Long.MAX_VALUE : s2n + offsetDateTime.getNano();
} else
// NOT SUPPORTED
timestamp = 0;
} else if (value instanceof Instant instant) {
if (precisionToUse.equals(ChronoUnit.SECONDS))
timestamp = instant.getEpochSecond();
Expand Down Expand Up @@ -309,7 +323,7 @@ public static boolean isDate(final Object obj) {
if (obj == null)
return false;
return obj instanceof Date || obj instanceof Calendar || obj instanceof LocalDate || obj instanceof LocalDateTime
|| obj instanceof ZonedDateTime || obj instanceof Instant;
|| obj instanceof ZonedDateTime || obj instanceof java.time.OffsetDateTime || obj instanceof Instant;
}

public static ChronoUnit getHigherPrecision(final Object... objs) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,26 @@
*/
package org.apache.tinkerpop.gremlin.util;

import com.arcadedb.utility.DateUtils;
import org.apache.tinkerpop.gremlin.process.traversal.Path;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Property;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;

import java.util.*;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.EnumMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

import static org.apache.tinkerpop.gremlin.util.NumberHelper.eitherAreNaN;

Expand Down Expand Up @@ -166,6 +178,17 @@
*/
private final Comparator<Comparable> naturalOrderComparator = Comparator.naturalOrder();

/**
* Mixed date types (java.util.Date, java.time.*, java.util.Calendar).
*/
private final Comparator<Object> dateComparator = (f, s) -> {

Check notice on line 184 in gremlin/src/main/java/org/apache/tinkerpop/gremlin/util/GremlinValueComparator.java

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

gremlin/src/main/java/org/apache/tinkerpop/gremlin/util/GremlinValueComparator.java#L184

Fields should be declared at the top of the class, before any method declarations, constructors, initializers or inner classes.
if (f == s)
return 0;
final Long t1 = DateUtils.dateTimeToTimestamp(f, ChronoUnit.NANOS);
final Long t2 = DateUtils.dateTimeToTimestamp(s, ChronoUnit.NANOS);
Comment thread
robfrank marked this conversation as resolved.
return t1.compareTo(t2);
};

/**
* This comparator does not provide a stable order for numerics because of type promotion equivalence semantics.
*/
Expand Down Expand Up @@ -256,12 +279,35 @@
if (o == null)
return Nulltype;

final Type[] types = Type.values();
for (int i = 1; i < types.length; i++) {
if (types[i].type.isInstance(o)) {
return types[i];
}
}
if (o instanceof Boolean)
return Boolean;
if (o instanceof Number)
return Number;
if (DateUtils.isDate(o))
return Date;
if (o instanceof String)
return String;
if (o instanceof UUID)
return UUID;
if (o instanceof Vertex)
return Vertex;
if (o instanceof Edge)
return Edge;
if (o instanceof VertexProperty)
return VertexProperty;
if (o instanceof Property)
return Property;
if (o instanceof Path)
return Path;
if (o instanceof Set)
return Set;
if (o instanceof List)
return List;
if (o instanceof Map)
return Map;
if (o instanceof Map.Entry)
return MapEntry;

return Unknown;
}

Expand Down Expand Up @@ -315,7 +361,7 @@
put(Type.Nulltype, nulltypeComparator);
put(Type.Boolean, naturalOrderComparator);
put(Type.Number, numberComparator);
put(Type.Date, naturalOrderComparator);
put(Type.Date, dateComparator);
put(Type.String, naturalOrderComparator);
put(Type.UUID, naturalOrderComparator);
put(Type.Vertex, elementComparator);
Expand Down
Loading