You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/05/20 21:07:32 UTC

incubator-tinkerpop git commit: fixed an step ID naming algorithm bug. Created a static tool to verify that all step IDs are unique in a compiled traversal. Added the tool to AbstractGremlinTest -- now every traversal in the test suite is valifdated to e

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/no_local_olap 1dd702e05 -> 674422883


fixed an step ID naming algorithm bug. Created a static tool to verify that all step IDs are unique in a compiled traversal. Added the tool to AbstractGremlinTest -- now every traversal in the test suite is valifdated to ensure the naming algorithm works correctly. Removed HasNextTraversal -- bug central. Added HasNextStep -- clean sailing.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/67442288
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/67442288
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/67442288

Branch: refs/heads/no_local_olap
Commit: 674422883ff80f665e02d386811b8e1fccdbf157
Parents: 1dd702e
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed May 20 13:07:43 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed May 20 13:07:43 2015 -0600

----------------------------------------------------------------------
 .../traversal/lambda/HasNextTraversal.java      | 170 -------------------
 .../traversal/step/branch/ChooseStep.java       |   4 +-
 .../process/traversal/step/map/HasNextStep.java |  48 ++++++
 .../process/traversal/util/TraversalHelper.java |   9 +-
 .../process/traversal/util/TraversalMatrix.java |   5 +-
 .../tinkerpop/gremlin/AbstractGremlinTest.java  |  36 +++-
 6 files changed, 90 insertions(+), 182 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/67442288/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
deleted file mode 100644
index b12e1bf..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.traversal.lambda;
-
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class HasNextTraversal<S> implements Traversal.Admin<S, Boolean>, TraversalParent {
-
-    private Traversal.Admin<S, ?> hasNextTraversal;
-
-    public HasNextTraversal(final Admin<S, ?> hasNextTraversal) {
-        this.hasNextTraversal = hasNextTraversal;
-        this.hasNextTraversal.setParent(this);
-    }
-
-    @Override
-    public boolean hasNext() {
-        return true;
-    }
-
-    @Override
-    public Boolean next() {
-        return this.hasNextTraversal.hasNext();
-    }
-
-    @Override
-    public void addStart(final Traverser<S> start) {
-        this.hasNextTraversal.addStart(start);
-    }
-
-    @Override
-    public String toString() {
-        return this.hasNextTraversal.toString();
-    }
-
-    @Override
-    public void setStrategies(final TraversalStrategies strategies) {
-        this.hasNextTraversal.setStrategies(strategies);
-    }
-
-    @Override
-    public TraversalStrategies getStrategies() {
-        return this.hasNextTraversal.getStrategies();
-    }
-
-    @Override
-    public void setSideEffects(final TraversalSideEffects sideEffects) {
-        this.hasNextTraversal.setSideEffects(sideEffects);
-    }
-
-    @Override
-    public TraversalSideEffects getSideEffects() {
-        return this.hasNextTraversal.getSideEffects();
-    }
-
-    @Override
-    public void setParent(final TraversalParent holder) {
-        this.hasNextTraversal.setParent(holder);
-    }
-
-    @Override
-    public TraversalParent getParent() {
-        return this.hasNextTraversal.getParent();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getTraverserRequirements() {
-        return this.hasNextTraversal.getTraverserRequirements();
-    }
-
-    @Override
-    public List<Step> getSteps() {
-        return this.hasNextTraversal.getSteps();
-    }
-
-    @Override
-    public <S2, E2> Traversal.Admin<S2, E2> addStep(final int index, final Step<?, ?> step) throws IllegalStateException {
-        return this.hasNextTraversal.addStep(index, step);
-    }
-
-    @Override
-    public <S2, E2> Traversal.Admin<S2, E2> removeStep(int index) throws IllegalStateException {
-        return this.hasNextTraversal.removeStep(index);
-    }
-
-    @Override
-    public HasNextTraversal<S> clone() {
-        try {
-            final HasNextTraversal<S> clone = (HasNextTraversal<S>) super.clone();
-            clone.hasNextTraversal = this.hasNextTraversal.clone();
-            return clone;
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public boolean isLocked() {
-        return true;
-    }
-
-    @Override
-    public void applyStrategies() throws IllegalStateException {
-        this.hasNextTraversal.applyStrategies();
-    }
-
-    @Override
-    public TraversalEngine getEngine() {
-        return this.hasNextTraversal.getEngine();
-    }
-
-    @Override
-    public void setEngine(final TraversalEngine engine) {
-        this.hasNextTraversal.setEngine(engine);
-    }
-
-    @Override
-    public void reset() {
-        this.hasNextTraversal.reset();
-    }
-
-    @Override
-    public Optional<Graph> getGraph() {
-        return this.hasNextTraversal.getGraph();
-    }
-
-    @Override
-    public void setGraph(final Graph graph) {
-        this.hasNextTraversal.setGraph(graph);
-    }
-
-    @Override
-    public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() {
-        return (List) Collections.singletonList(this.hasNextTraversal);
-    }
-
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/67442288/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java
index 09af7e2..e699f22 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.gremlin.process.traversal.step.branch;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.HasNextTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.HasNextStep;
 
 /**
  * A step which offers a choice of two or more Traversals to take.
@@ -35,7 +35,7 @@ public final class ChooseStep<S, E, M> extends BranchStep<S, E, M> {
     }
 
     public ChooseStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?> predicateTraversal, final Traversal.Admin<S, E> trueChoice, final Traversal.Admin<S, E> falseChoice) {
-        this(traversal, new HasNextTraversal(predicateTraversal));
+        this(traversal, (Traversal.Admin<S, M>) predicateTraversal.addStep(new HasNextStep<>(predicateTraversal)));
         this.addGlobalChildOption((M) Boolean.TRUE, trueChoice);
         this.addGlobalChildOption((M) Boolean.FALSE, falseChoice);
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/67442288/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/HasNextStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/HasNextStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/HasNextStep.java
new file mode 100644
index 0000000..03a814b
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/HasNextStep.java
@@ -0,0 +1,48 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one
+ *  * or more contributor license agreements.  See the NOTICE file
+ *  * distributed with this work for additional information
+ *  * regarding copyright ownership.  The ASF licenses this file
+ *  * to you under the Apache License, Version 2.0 (the
+ *  * "License"); you may not use this file except in compliance
+ *  * with the License.  You may obtain a copy of the License at
+ *  *
+ *  * http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing,
+ *  * software distributed under the License is distributed on an
+ *  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  * KIND, either express or implied.  See the License for the
+ *  * specific language governing permissions and limitations
+ *  * under the License.
+ *
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+
+import java.util.NoSuchElementException;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class HasNextStep<S> extends AbstractStep<S, Boolean> {
+
+    public HasNextStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Traverser<Boolean> processNextStart() throws NoSuchElementException {
+        if (this.starts.hasNext()) {
+            final Traverser.Admin<S> s = this.starts.next();
+            return s.split(Boolean.TRUE, this);
+        } else
+            return this.traversal.asAdmin().getTraverserGenerator().generate(Boolean.FALSE, (Step) this, 1l);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/67442288/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
index 8121f4b..cc056ce 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
@@ -253,16 +253,17 @@ public final class TraversalHelper {
             if (null == stepPosition.parentId && !(parent instanceof EmptyStep))
                 stepPosition.parentId = parent.asStep().getId();
             if (-1 == stepPosition.z) {
-                for (int i = 0; i < parent.getGlobalChildren().size(); i++) {
+                final int globalChildrenSize = parent.getGlobalChildren().size();
+                for (int i = 0; i < globalChildrenSize; i++) {
                     if (parent.getGlobalChildren().get(i) == current) {
                         stepPosition.z = i;
                     }
                 }
-                /*for (int i = 0; i < parent.getLocalChildren().size(); i++) {
+                for (int i = 0; i < parent.getLocalChildren().size(); i++) {
                     if (parent.getLocalChildren().get(i) == current) {
-                        stepPosition.z = i + parent.getGlobalChildren().size();
+                        stepPosition.z = i + globalChildrenSize;
                     }
-                }*/
+                }
             }
             current = parent.asStep().getTraversal();
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/67442288/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java
index 36a105a..5b0816d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java
@@ -56,11 +56,10 @@ public final class TraversalMatrix<S, E> {
                 for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
                     this.harvestSteps(globalChild);
                 }
-                /*for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+                for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
                     this.harvestSteps(localChild);
-                }*/
+                }
             }
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/67442288/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
index 3bd4e46..d05e162 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
@@ -20,9 +20,11 @@ package org.apache.tinkerpop.gremlin;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -34,14 +36,19 @@ import org.junit.Rule;
 import org.junit.rules.TestName;
 
 import java.lang.reflect.Method;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Random;
+import java.util.Set;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
+import static org.junit.Assert.*;
 import static org.junit.Assume.assumeThat;
 
 /**
@@ -228,6 +235,7 @@ public abstract class AbstractGremlinTest {
         if (!muted) System.out.println("   pre-strategy:" + traversal);
         traversal.hasNext();
         if (!muted) System.out.println("  post-strategy:" + traversal);
+        verifyUniqueStepIds(traversal.asAdmin());
     }
 
     public boolean isComputerTest() {
@@ -244,4 +252,26 @@ public abstract class AbstractGremlinTest {
     public static void validateException(final Throwable expected, final Throwable actual) {
         assertThat(actual, instanceOf(expected.getClass()));
     }
+
+    public static void verifyUniqueStepIds(final Traversal.Admin<?, ?> traversal) {
+        AbstractGremlinTest.verifyUniqueStepIds(traversal, 0, new HashSet<>());
+    }
+
+    private static void verifyUniqueStepIds(final Traversal.Admin<?, ?> traversal, final int depth, final Set<String> ids) {
+        for (final Step step : traversal.asAdmin().getSteps()) {
+            /*for (int i = 0; i < depth; i++) System.out.print("\t");
+            System.out.println(step.getId() + " --> " + step);*/
+            if (!ids.add(step.getId())) {
+                fail("The following step id already exists: " + step.getId() + "---" + step);
+            }
+            if (step instanceof TraversalParent) {
+                for (final Traversal.Admin<?, ?> globalTraversal : ((TraversalParent) step).getGlobalChildren()) {
+                    verifyUniqueStepIds(globalTraversal, depth + 1, ids);
+                }
+                for (final Traversal.Admin<?, ?> localTraversal : ((TraversalParent) step).getLocalChildren()) {
+                    verifyUniqueStepIds(localTraversal, depth + 1, ids);
+                }
+            }
+        }
+    }
 }