This is an automated email from the ASF dual-hosted git repository.

okram pushed a commit to branch tp4
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 0af118912b2d55f0b9c88fccd1eb3693133e86f1
Author: Marko A. Rodriguez <[email protected]>
AuthorDate: Mon Mar 11 14:02:47 2019 -0600

    found a mutation bug in Apache Beam. Even when you filter, you have to make 
sure that its a new object being added to the output. Thus, you have to clone 
the object.
---
 .../apache/tinkerpop/machine/strategies/IdentityStrategy.java |  5 ++++-
 .../tinkerpop/machine/traversers/CompleteTraverser.java       | 10 ----------
 .../java/org/apache/tinkerpop/machine/traversers/Path.java    |  4 ++--
 .../org/apache/tinkerpop/machine/traversers/Traverser.java    | 11 +----------
 .../org/apache/tinkerpop/machine/traversers/TraverserSet.java |  2 +-
 .../main/java/org/apache/tinkerpop/machine/beam/FilterFn.java |  5 +++--
 .../main/java/org/apache/tinkerpop/machine/beam/MapFn.java    | 11 ++---------
 .../test/java/org/apache/tinkerpop/machine/beam/BeamTest.java |  2 +-
 8 files changed, 14 insertions(+), 36 deletions(-)

diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/strategies/IdentityStrategy.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/strategies/IdentityStrategy.java
index 9b91e2c..92ef157 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/strategies/IdentityStrategy.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/strategies/IdentityStrategy.java
@@ -28,6 +28,9 @@ public final class IdentityStrategy implements Strategy {
 
     @Override
     public <C> void apply(final Bytecode<C> bytecode) {
-        bytecode.getInstructions().removeIf(instruction -> 
instruction.op().equals(Symbols.IDENTITY));
+        bytecode.getInstructions().removeIf(instruction ->
+                instruction.op().equals(Symbols.IDENTITY) &&
+                        instruction.labels().isEmpty());
+        //!instruction.coefficient().equals(unity));
     }
 }
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/CompleteTraverser.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/CompleteTraverser.java
index b6c471e..b605da2 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/CompleteTraverser.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/CompleteTraverser.java
@@ -22,8 +22,6 @@ import org.apache.tinkerpop.machine.coefficients.Coefficient;
 import org.apache.tinkerpop.machine.functions.CFunction;
 import org.apache.tinkerpop.machine.functions.ReduceFunction;
 
-import java.util.Collections;
-
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
@@ -33,10 +31,6 @@ public class CompleteTraverser<C, S> implements Traverser<C, 
S> {
     private S object;
     private Path path = new Path();
 
-    public CompleteTraverser() {
-
-    }
-
     public CompleteTraverser(final Coefficient<C> coefficient, final S object) 
{
         this.coefficient = coefficient;
         this.object = object;
@@ -54,10 +48,6 @@ public class CompleteTraverser<C, S> implements Traverser<C, 
S> {
         return this.path;
     }
 
-    public void addLabel(final String label) {
-        this.path.addLabels(Collections.singleton(label));
-    }
-
     @Override
     public <E> Traverser<C, E> split(final CFunction<C> function, final E 
eObject) {
         final CompleteTraverser<C, E> clone = new CompleteTraverser<>(
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Path.java 
b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Path.java
index 7509824..9f5b997 100644
--- a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Path.java
+++ b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Path.java
@@ -35,8 +35,8 @@ public class Path implements Serializable {
     }
 
     public Path(final Path path) {
-        path.objects.forEach(o -> objects.add(o));
-        path.labels.forEach(l -> labels.add(l));
+        this.objects.addAll(path.objects);
+        this.labels.addAll(path.labels);
     }
 
     public void add(final Set<String> labels, final Object object) {
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Traverser.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Traverser.java
index 4164fe6..6484d18 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Traverser.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/Traverser.java
@@ -28,7 +28,6 @@ import org.apache.tinkerpop.util.IteratorUtils;
 
 import java.io.Serializable;
 import java.util.Iterator;
-import java.util.Set;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -41,17 +40,9 @@ public interface Traverser<C, S> extends Serializable, 
Cloneable {
 
     public Path path();
 
-    public void addLabel(final String label);
-
-    public default void addLabels(final Set<String> labels) {
-        for (final String label : labels) {
-            this.addLabel(label);
-        }
-    }
-
     public default boolean filter(final FilterFunction<C, S> function) {
         if (function.test(this)) {
-            this.addLabels(function.labels());
+            this.path().addLabels(function.labels());
             return true;
         } else {
             return false;
diff --git 
a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/TraverserSet.java
 
b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/TraverserSet.java
index 66169ab..103158c 100644
--- 
a/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/TraverserSet.java
+++ 
b/java/core/src/main/java/org/apache/tinkerpop/machine/traversers/TraverserSet.java
@@ -34,7 +34,7 @@ import java.util.Spliterator;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class TraverserSet<C, S> extends AbstractSet<Traverser<C, S>> 
implements Set<Traverser<C, S>>, Queue<Traverser<C, S>>, Serializable {
+public final class TraverserSet<C, S> extends AbstractSet<Traverser<C, S>> 
implements Set<Traverser<C, S>>, Queue<Traverser<C, S>>, Serializable {
 
     private final Map<Traverser<C, S>, Traverser<C, S>> map = 
Collections.synchronizedMap(new LinkedHashMap<>());
 
diff --git 
a/java/machine/beam/src/main/java/org/apache/tinkerpop/machine/beam/FilterFn.java
 
b/java/machine/beam/src/main/java/org/apache/tinkerpop/machine/beam/FilterFn.java
index e0df567..02ff1db 100644
--- 
a/java/machine/beam/src/main/java/org/apache/tinkerpop/machine/beam/FilterFn.java
+++ 
b/java/machine/beam/src/main/java/org/apache/tinkerpop/machine/beam/FilterFn.java
@@ -35,7 +35,8 @@ public class FilterFn<C, S> extends AbstractFn<C, S, S> {
 
     @ProcessElement
     public void processElement(final @Element Traverser<C, S> traverser, final 
OutputReceiver<Traverser<C, S>> output) {
-        if (traverser.filter(this.filterFunction))
-            output.output(traverser);
+        final Traverser<C,S> clone = 
traverser.split(this.filterFunction,traverser.object());
+        if (clone.filter(this.filterFunction))
+            output.output(clone);
     }
 }
\ No newline at end of file
diff --git 
a/java/machine/beam/src/main/java/org/apache/tinkerpop/machine/beam/MapFn.java 
b/java/machine/beam/src/main/java/org/apache/tinkerpop/machine/beam/MapFn.java
index 4a67d92..d5b4968 100644
--- 
a/java/machine/beam/src/main/java/org/apache/tinkerpop/machine/beam/MapFn.java
+++ 
b/java/machine/beam/src/main/java/org/apache/tinkerpop/machine/beam/MapFn.java
@@ -19,13 +19,8 @@
 package org.apache.tinkerpop.machine.beam;
 
 import org.apache.tinkerpop.machine.functions.MapFunction;
-import org.apache.tinkerpop.machine.functions.NestedFunction;
-import org.apache.tinkerpop.machine.pipes.Pipes;
-import org.apache.tinkerpop.machine.traversers.CompleteTraverserFactory;
 import org.apache.tinkerpop.machine.traversers.Traverser;
 
-import java.util.NoSuchElementException;
-
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
@@ -35,14 +30,12 @@ public class MapFn<C, S, E> extends AbstractFn<C, S, E> {
     private boolean first = true;
 
     public MapFn(final MapFunction<C, S, E> mapFunction) {
-       super(mapFunction);
+        super(mapFunction);
         this.mapFunction = mapFunction;
     }
 
     @ProcessElement
     public void processElement(final @Element Traverser<C, S> traverser, final 
OutputReceiver<Traverser<C, E>> output) {
-
-            output.output(traverser.map(this.mapFunction));
-
+        output.output(traverser.map(this.mapFunction));
     }
 }
diff --git 
a/java/machine/beam/src/test/java/org/apache/tinkerpop/machine/beam/BeamTest.java
 
b/java/machine/beam/src/test/java/org/apache/tinkerpop/machine/beam/BeamTest.java
index 268d75e..2c126e3 100644
--- 
a/java/machine/beam/src/test/java/org/apache/tinkerpop/machine/beam/BeamTest.java
+++ 
b/java/machine/beam/src/test/java/org/apache/tinkerpop/machine/beam/BeamTest.java
@@ -48,7 +48,7 @@ public class BeamTest {
         System.out.println(traversal);
         System.out.println(traversal.toList());
         System.out.println("\n----------\n");
-        traversal = 
g.inject(7L).union(__.<Long>incr().incr().union(__.incr(),__.incr()),__.incr());
+        traversal = 
g.inject(7L).union(__.<Long>incr().incr().union(__.<Long>incr().as("b").identity().as("a"),__.<Long>incr().identity()),__.incr());
         System.out.println(TraversalUtil.getBytecode(traversal));
         System.out.println(traversal);
         System.out.println(traversal.toList());

Reply via email to