You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2017/08/24 20:52:37 UTC
tinkerpop git commit: Improved `hashcode()` and `equals()` for all
Traverser implementations.
Repository: tinkerpop
Updated Branches:
refs/heads/TINKERPOP-1759 [created] 9fbb625fb
Improved `hashcode()` and `equals()` for all Traverser implementations.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/9fbb625f
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/9fbb625f
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/9fbb625f
Branch: refs/heads/TINKERPOP-1759
Commit: 9fbb625fb94d455e1d1edb8a448689d43b5859ac
Parents: 529b819
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Thu Aug 24 13:51:41 2017 -0700
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Thu Aug 24 13:51:41 2017 -0700
----------------------------------------------------------------------
.../traverser/B_LP_O_P_S_SE_SL_Traverser.java | 12 ++++--------
.../traverser/B_LP_O_S_SE_SL_Traverser.java | 12 ++++--------
.../traversal/traverser/B_O_S_SE_SL_Traverser.java | 17 +++++++++++------
.../process/traversal/traverser/B_O_Traverser.java | 2 +-
.../traverser/LP_O_OB_P_S_SE_SL_Traverser.java | 15 +++++++--------
.../traverser/LP_O_OB_S_SE_SL_Traverser.java | 11 ++++-------
.../traverser/O_OB_S_SE_SL_Traverser.java | 16 ++++++++++------
.../process/traversal/traverser/O_Traverser.java | 12 ++++++++++++
.../traverser/util/AbstractTraverser.java | 5 ++++-
9 files changed, 57 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9fbb625f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_P_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_P_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_P_S_SE_SL_Traverser.java
index 49f19e4..919157c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_P_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_P_S_SE_SL_Traverser.java
@@ -80,17 +80,13 @@ public class B_LP_O_P_S_SE_SL_Traverser<T> extends B_O_S_SE_SL_Traverser<T> {
@Override
public int hashCode() {
- return super.hashCode() + this.path.hashCode();
+ return carriesUnmergeableSack() ? System.identityHashCode(this) : (super.hashCode() ^ this.path.hashCode());
}
@Override
public boolean equals(final Object object) {
- return (object instanceof B_LP_O_P_S_SE_SL_Traverser)
- && ((B_LP_O_P_S_SE_SL_Traverser) object).t.equals(this.t)
- && ((B_LP_O_P_S_SE_SL_Traverser) object).future.equals(this.future)
- && ((B_LP_O_P_S_SE_SL_Traverser) object).loops == this.loops
- && (null == this.sack || null != this.sideEffects.getSackMerger())
- && ((B_LP_O_P_S_SE_SL_Traverser) object).path.equals(this.path);
+ return object instanceof B_LP_O_P_S_SE_SL_Traverser &&
+ super.equals(object) &&
+ ((B_LP_O_P_S_SE_SL_Traverser) object).path.equals(this.path);
}
-
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9fbb625f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java
index 74a049c..1e50f3d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java
@@ -112,17 +112,13 @@ public class B_LP_O_S_SE_SL_Traverser<T> extends B_O_S_SE_SL_Traverser<T> {
@Override
public int hashCode() {
- return super.hashCode() + this.path.hashCode();
+ return carriesUnmergeableSack() ? System.identityHashCode(this) : (super.hashCode() ^ this.path.hashCode());
}
@Override
public boolean equals(final Object object) {
- return (object instanceof B_LP_O_S_SE_SL_Traverser)
- && ((B_LP_O_S_SE_SL_Traverser) object).t.equals(this.t)
- && ((B_LP_O_S_SE_SL_Traverser) object).future.equals(this.future)
- && ((B_LP_O_S_SE_SL_Traverser) object).loops == this.loops
- && (null == this.sack || (null != this.sideEffects && null != this.sideEffects.getSackMerger())) // hmmm... serialization in OLAP destroys the transient sideEffects
- && ((B_LP_O_S_SE_SL_Traverser) object).path.popEquals(Pop.last, this.path); // this should be Pop.all?
+ return object instanceof B_LP_O_S_SE_SL_Traverser &&
+ super.equals(object) &&
+ ((B_LP_O_S_SE_SL_Traverser) object).path.equals(this.path);
}
-
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9fbb625f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_Traverser.java
index ab1a783..2612472 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_Traverser.java
@@ -23,6 +23,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import java.util.Random;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@@ -110,17 +112,20 @@ public class B_O_S_SE_SL_Traverser<T> extends B_O_Traverser<T> {
/////////////////
+ final boolean carriesUnmergeableSack() {
+ return null != this.sack && (null == this.sideEffects || null == this.sideEffects.getSackMerger());
+ }
+
@Override
public int hashCode() {
- return this.t.hashCode() + this.future.hashCode() + this.loops;
+ return carriesUnmergeableSack() ? System.identityHashCode(this) : (super.hashCode() ^ this.loops);
}
@Override
public boolean equals(final Object object) {
- return object instanceof B_O_S_SE_SL_Traverser
- && ((B_O_S_SE_SL_Traverser) object).t.equals(this.t)
- && ((B_O_S_SE_SL_Traverser) object).future.equals(this.future)
- && ((B_O_S_SE_SL_Traverser) object).loops == this.loops
- && (null == this.sack || (null != this.sideEffects && null != this.sideEffects.getSackMerger())); // hmmm... serialization in OLAP destroys the transient sideEffects
+ return object instanceof B_O_S_SE_SL_Traverser &&
+ super.equals(object) &&
+ ((B_O_S_SE_SL_Traverser) object).loops == this.loops &&
+ !carriesUnmergeableSack(); // hmmm... serialization in OLAP destroys the transient sideEffects
}
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9fbb625f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java
index 4a66ab1..cef4e96 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java
@@ -65,7 +65,7 @@ public class B_O_Traverser<T> extends O_Traverser<T> {
@Override
public boolean equals(final Object object) {
return object instanceof B_O_Traverser &&
- ((B_O_Traverser) object).t.equals(this.t) &&
+ super.equals(object) &&
((B_O_Traverser) object).future.equals(this.future);
}
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9fbb625f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_Traverser.java
index 5f24e8c..b1f4aa7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_P_S_SE_SL_Traverser.java
@@ -106,17 +106,16 @@ public class LP_O_OB_P_S_SE_SL_Traverser<T> extends O_OB_S_SE_SL_Traverser<T> {
@Override
public int hashCode() {
- return super.hashCode() + this.path.hashCode();
+ if (carriesUnmergeableSack()) {
+ return System.identityHashCode(this);
+ }
+ return super.hashCode() ^ this.path.hashCode();
}
@Override
public boolean equals(final Object object) {
- return (object instanceof LP_O_OB_P_S_SE_SL_Traverser)
- && ((LP_O_OB_P_S_SE_SL_Traverser) object).t.equals(this.t)
- && ((LP_O_OB_P_S_SE_SL_Traverser) object).future.equals(this.future)
- && ((LP_O_OB_P_S_SE_SL_Traverser) object).loops == this.loops
- && (null == this.sack || null != this.sideEffects.getSackMerger())
- && ((LP_O_OB_P_S_SE_SL_Traverser) object).path.equals(this.path);
+ return object instanceof LP_O_OB_P_S_SE_SL_Traverser &&
+ super.equals(object) &&
+ ((LP_O_OB_P_S_SE_SL_Traverser) object).path.equals(this.path);
}
-
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9fbb625f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_Traverser.java
index 58f420c..b58560c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_O_OB_S_SE_SL_Traverser.java
@@ -89,16 +89,13 @@ public class LP_O_OB_S_SE_SL_Traverser<T> extends O_OB_S_SE_SL_Traverser<T> {
@Override
public int hashCode() {
- return super.hashCode() + this.path.hashCode();
+ return carriesUnmergeableSack() ? System.identityHashCode(this) : (super.hashCode() ^ this.path.hashCode());
}
@Override
public boolean equals(final Object object) {
- return (object instanceof LP_O_OB_S_SE_SL_Traverser)
- && ((LP_O_OB_S_SE_SL_Traverser) object).t.equals(this.t)
- && ((LP_O_OB_S_SE_SL_Traverser) object).future.equals(this.future)
- && ((LP_O_OB_S_SE_SL_Traverser) object).loops == this.loops
- && (null == this.sack || null != this.sideEffects.getSackMerger())
- && ((LP_O_OB_S_SE_SL_Traverser) object).path.popEquals(Pop.last, this.path); // this should be Pop.all?
+ return object instanceof LP_O_OB_S_SE_SL_Traverser &&
+ super.equals(object) &&
+ ((LP_O_OB_S_SE_SL_Traverser) object).path.equals(this.path);
}
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9fbb625f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_Traverser.java
index 2fb68ad..b49a661 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_OB_S_SE_SL_Traverser.java
@@ -133,17 +133,21 @@ public class O_OB_S_SE_SL_Traverser<T> extends O_Traverser<T> {
/////////////////
+ final boolean carriesUnmergeableSack() {
+ return null != this.sack && (null == this.sideEffects || null == this.sideEffects.getSackMerger());
+ }
+
@Override
public int hashCode() {
- return this.t.hashCode() + this.future.hashCode() + this.loops;
+ return carriesUnmergeableSack() ? System.identityHashCode(this) : (super.hashCode() ^ this.loops);
}
@Override
public boolean equals(final Object object) {
- return object instanceof O_OB_S_SE_SL_Traverser
- && ((O_OB_S_SE_SL_Traverser) object).t.equals(this.t)
- && ((O_OB_S_SE_SL_Traverser) object).future.equals(this.future)
- && ((O_OB_S_SE_SL_Traverser) object).loops == this.loops
- && (null == this.sack || (null != this.sideEffects && null != this.sideEffects.getSackMerger())); // hmmm... serialization in OLAP destroys the transient sideEffects
+ return object instanceof O_OB_S_SE_SL_Traverser &&
+ super.equals(object) &&
+ ((O_OB_S_SE_SL_Traverser) object).loops == this.loops &&
+ ((O_OB_S_SE_SL_Traverser) object).future.equals(this.future) &&
+ !carriesUnmergeableSack(); // hmmm... serialization in OLAP destroys the transient sideEffects
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9fbb625f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java
index e9735b0..86c9dc4 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.AbstractTraverser;
import java.util.HashSet;
+import java.util.Objects;
import java.util.Set;
/**
@@ -68,4 +69,15 @@ public abstract class O_Traverser<T> extends AbstractTraverser<T> {
this.tags.addAll(other.getTags());
}
}
+
+ @Override
+ public boolean equals(final Object object) {
+ return object instanceof O_Traverser &&
+ super.equals(object) &&
+ (this.tags == null
+ ? ((O_Traverser) object).tags == null
+ : (((O_Traverser) object).tags != null &&
+ ((O_Traverser) object).tags.containsAll(this.tags) &&
+ this.tags.containsAll(((O_Traverser) object).tags)));
+ }
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9fbb625f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
index 50a206b..75aa786 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
@@ -28,6 +28,7 @@ import org.apache.tinkerpop.gremlin.structure.util.Attachable;
import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory;
import java.util.Set;
+import java.util.UUID;
import java.util.function.Function;
/**
@@ -42,6 +43,7 @@ public abstract class AbstractTraverser<T> implements Traverser<T>, Traverser.Ad
}
public AbstractTraverser(final T t) {
+ this();
this.t = t;
}
@@ -197,7 +199,8 @@ public abstract class AbstractTraverser<T> implements Traverser<T>, Traverser.Ad
@Override
public boolean equals(final Object object) {
- return object instanceof AbstractTraverser && ((AbstractTraverser) object).get().equals(this.t);
+ return object instanceof AbstractTraverser &&
+ ((AbstractTraverser) object).get().equals(this.t);
}
@Override