This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch comparator-fix in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 637d84535aa37a6f0ffd16d626e406e19c57341c Author: Stephen Mallette <[email protected]> AuthorDate: Tue Feb 10 17:03:47 2026 +0000 Fixed issue with Gremlin semantics around comparability Allowed different size collections to be comparable. --- CHANGELOG.asciidoc | 3 ++- .../tinkerpop/gremlin/util/GremlinValueComparator.java | 3 --- .../tinkerpop/gremlin/process/traversal/CompareTest.java | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 22f3c2218f..e82b21c3b5 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima This release also includes changes from <<release-3-7-6, 3.7.6>>. * Fixed bug in pre-repeat() `emit()/until()` where `emit()` and `until()` traversers weren't added to the results. +* Fixed bug in `GremlinValueComparator` that prevented collections of differing sizes from being comparable. * Expose serialization functions for alternative transport protocols in gremlin-go * Improved Gremlint formatting to keep the first argument for a step on the same line if line breaks were required to meet max line length. * Improved Gremlint formatting to do greedy argument packing when possible so that more arguments can appear on a single line. @@ -35,7 +36,7 @@ This release also includes changes from <<release-3-7-6, 3.7.6>>. This release also includes changes from <<release-3-7-5, 3.7.5>>. -* Added a Gremln MCP server. +* Added a Gremlin MCP server. * Added the Air Routes 1.0 dataset to the set of available samples packaged with distributions. * Added a minimal distribution for `tinkergraph-gremlin` using the `min` classifier that doesn't include the sample datasets. * Removed `AggregateLocalStep` and `aggregate(Scope, String)`, and renamed `AggregateGlobalStep` to `AggregateStep`. diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/GremlinValueComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/GremlinValueComparator.java index 2f6e374d24..5d98d6e8ad 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/GremlinValueComparator.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/GremlinValueComparator.java @@ -370,9 +370,6 @@ public abstract class GremlinValueComparator implements Comparator<Object> { return false; } } - if (fi.hasNext() || si.hasNext()) { - return false; - } return true; } diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/CompareTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/CompareTest.java index 38633df8cd..280544cf0b 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/CompareTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/CompareTest.java @@ -249,6 +249,20 @@ public class CompareTest { {Compare.gt, asMap(1.0, "foo", 2.0, "bar"), asMap(2, "bar", 1, "foo"), false}, {Compare.gte, asMap(1.0, "foo", 2.0, "bar"), asMap(2, "bar", 1, "foo"), true}, + // Lists of different sizes should be comparable and sort lexicographically + {Compare.lt, asList(1, 2, 3), asList(1, 2, 3, 4), true}, + {Compare.gt, asList(1, 2, 3), asList(1, 2, 3, 4), false}, + {Compare.lt, asList(1, 2, 4), asList(1, 2, 3, 4), false}, + {Compare.gt, asList(1, 2, 4), asList(1, 2, 3, 4), true}, + + // Sets compare by sorted contents; different sizes remain comparable + {Compare.lt, asSet(1, 2, 3), asSet(1, 2, 3, 4), true}, + {Compare.gt, asSet(1, 2, 4), asSet(1, 2, 3, 4), true}, + + // Maps compare by sorted entry-set; different sizes remain comparable + {Compare.lt, asMap(1, 1, 2, 2, 3, 3), asMap(1, 1, 2, 2, 3, 3, 4, 4), true}, + {Compare.gt, asMap(1, 1, 2, 2, 3, 3, 4, 4), asMap(1, 1, 2, 2, 3, 3), true}, + })); // Compare Numbers of mixed types. final List<Object> one = Arrays.asList(1, 1l, 1d, 1f, BigDecimal.ONE, BigInteger.ONE);
