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);
+ }
+ }
+ }
+ }
}