removed CyclicPathStep and SimplePathStep for a more abstract, generalized step 
called PathFilterStep which handles cyclic/simple filtering as well as to() and 
from() modulation. Updated UPGRADE docs. Will add by()-modulation to 
PathFilterStep next.


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

Branch: refs/heads/TINKERPOP-1625
Commit: 65b3ad06b15b75ae944c11bfbdc592994fa706b2
Parents: 0fe3b1d
Author: Marko A. Rodriguez <okramma...@gmail.com>
Authored: Thu Mar 16 09:14:40 2017 -0600
Committer: Marko A. Rodriguez <okramma...@gmail.com>
Committed: Thu Mar 16 09:14:40 2017 -0600

----------------------------------------------------------------------
 .../upgrade/release-3.2.x-incubating.asciidoc   |  7 ++
 .../traversal/dsl/graph/GraphTraversal.java     | 11 ++-
 .../traversal/step/filter/CyclicPathStep.java   | 46 ------------
 .../traversal/step/filter/PathFilterStep.java   | 75 ++++++++++++++++++++
 .../traversal/step/filter/SimplePathStep.java   | 47 ------------
 .../optimization/FilterRankingStrategy.java     |  5 +-
 .../IncidentToAdjacentStrategy.java             |  7 +-
 .../step/filter/PathFilterStepTest.java         | 47 ++++++++++++
 8 files changed, 139 insertions(+), 106 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/65b3ad06/docs/src/upgrade/release-3.2.x-incubating.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade/release-3.2.x-incubating.asciidoc 
b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
index 78c276b..a770ed8 100644
--- a/docs/src/upgrade/release-3.2.x-incubating.asciidoc
+++ b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
@@ -63,6 +63,13 @@ See: 
link:https://issues.apache.org/jira/browse/TINKERPOP-1599[TINKERPOP-1599]
 Upgrading for Providers
 ~~~~~~~~~~~~~~~~~~~~~~~
 
+SimplePathStep and CyclicPathStep now PathFilterStep
+++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+The Gremlin traversal machine use to support two step instructions: 
`SimplePathStep` and `CyclicPathStep`. These have
+been replaced by a high-level instruction called `PathFilterStep` which is 
boolean configured for simple or cyclic paths.
+Furthermore, `PathFilterStep` also support `from()`-, `to()`-, and 
`by()`-modulation.
+
 LazyBarrierStrategy No Longer End Appends Barriers
 ++++++++++++++++++++++++++++++++++++++++++++++++++
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/65b3ad06/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index 4344aaf..0b95479 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -48,7 +48,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.branch.UnionStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CoinStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
@@ -56,9 +55,9 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep;
+import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.PathFilterStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleGlobalStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.TailGlobalStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.TimeLimitStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep;
@@ -1783,25 +1782,25 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
     /**
      * Filter the <code>E</code> object if its {@link Traverser#path} is not 
{@link Path#isSimple}.
      *
-     * @return the traversal with an appended {@link SimplePathStep}.
+     * @return the traversal with an appended {@link PathFilterStep}.
      * @see <a 
href="http://tinkerpop.apache.org/docs/${project.version}/reference/#simplepath-step";
 target="_blank">Reference Documentation - SimplePath Step</a>
      * @since 3.0.0-incubating
      */
     public default GraphTraversal<S, E> simplePath() {
         this.asAdmin().getBytecode().addStep(Symbols.simplePath);
-        return this.asAdmin().addStep(new SimplePathStep<>(this.asAdmin()));
+        return this.asAdmin().addStep(new PathFilterStep<E>(this.asAdmin(), 
true));
     }
 
     /**
      * Filter the <code>E</code> object if its {@link Traverser#path} is 
{@link Path#isSimple}.
      *
-     * @return the traversal with an appended {@link CyclicPathStep}.
+     * @return the traversal with an appended {@link PathFilterStep}.
      * @see <a 
href="http://tinkerpop.apache.org/docs/${project.version}/reference/#cyclicpath-step";
 target="_blank">Reference Documentation - CyclicPath Step</a>
      * @since 3.0.0-incubating
      */
     public default GraphTraversal<S, E> cyclicPath() {
         this.asAdmin().getBytecode().addStep(Symbols.cyclicPath);
-        return this.asAdmin().addStep(new CyclicPathStep<>(this.asAdmin()));
+        return this.asAdmin().addStep(new PathFilterStep<E>(this.asAdmin(), 
false));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/65b3ad06/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathStep.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathStep.java
deleted file mode 100644
index e9c5dcf..0000000
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathStep.java
+++ /dev/null
@@ -1,46 +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.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class CyclicPathStep<S> extends FilterStep<S> {
-
-    public CyclicPathStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        return !traverser.path().isSimple();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.PATH);
-    }
-}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/65b3ad06/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/PathFilterStep.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/PathFilterStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/PathFilterStep.java
new file mode 100644
index 0000000..bbc8168
--- /dev/null
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/PathFilterStep.java
@@ -0,0 +1,75 @@
+/*
+ *  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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.FromToModulating;
+import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class PathFilterStep<S> extends FilterStep<S> implements 
FromToModulating {
+
+    protected String fromLabel;
+    protected String toLabel;
+    private boolean isSimple;
+
+    public PathFilterStep(final Traversal.Admin traversal, final boolean 
isSimple) {
+        super(traversal);
+        this.isSimple = isSimple;
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        return traverser.path().getSubPath(this.fromLabel, 
this.toLabel).isSimple() == this.isSimple;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.PATH);
+    }
+
+    public void addFrom(final String fromLabel) {
+        this.fromLabel = fromLabel;
+    }
+
+    public void addTo(final String toLabel) {
+        this.toLabel = toLabel;
+    }
+
+    @Override
+    public String toString() {
+        return StringFactory.stepString(this, this.isSimple ? "simple" : 
"cyclic", this.fromLabel, this.toLabel);
+    }
+
+    @Override
+    public int hashCode() {
+        return super.hashCode() ^
+                Boolean.hashCode(this.isSimple) ^
+                (null == this.fromLabel ? "null".hashCode() : 
this.fromLabel.hashCode()) ^
+                (null == this.toLabel ? "null".hashCode() : 
this.toLabel.hashCode());
+    }
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/65b3ad06/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathStep.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathStep.java
deleted file mode 100644
index 5789803..0000000
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathStep.java
+++ /dev/null
@@ -1,47 +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.step.filter;
-
-
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SimplePathStep<S> extends FilterStep<S> {
-
-    public SimplePathStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        return traverser.path().isSimple();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.PATH);
-    }
-}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/65b3ad06/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
index 3649615..6ca676a 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
@@ -26,14 +26,13 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.ClassFilterStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathStep;
+import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.PathFilterStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.WherePredicateStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
@@ -129,7 +128,7 @@ public final class FilterRankingStrategy extends 
AbstractTraversalStrategy<Trave
             rank = 2;
         else if (step instanceof WherePredicateStep && ((WherePredicateStep) 
step).getLocalChildren().isEmpty())
             rank = 3;
-        else if (step instanceof SimplePathStep || step instanceof 
CyclicPathStep)
+        else if (step instanceof PathFilterStep)
             rank = 4;
         else if (step instanceof TraversalFilterStep || step instanceof 
NotStep)
             rank = 5;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/65b3ad06/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java
index 4270ac3..1c96cf8 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java
@@ -23,8 +23,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.step.LambdaHolder;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathStep;
+import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.PathFilterStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeOtherVertexStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathStep;
@@ -72,8 +71,8 @@ public final class IncidentToAdjacentStrategy extends 
AbstractTraversalStrategy<
 
     private static final IncidentToAdjacentStrategy INSTANCE = new 
IncidentToAdjacentStrategy();
     private static final String MARKER = 
Graph.Hidden.hide("gremlin.incidentToAdjacent");
-    private static final Set<Class> INVALIDATING_STEP_CLASSES = new 
HashSet<>(Arrays.asList(CyclicPathStep.class,
-            PathStep.class, SimplePathStep.class, TreeStep.class, 
TreeSideEffectStep.class, LambdaHolder.class));
+    private static final Set<Class> INVALIDATING_STEP_CLASSES = new 
HashSet<>(Arrays.asList(
+            PathStep.class, PathFilterStep.class, TreeStep.class, 
TreeSideEffectStep.class, LambdaHolder.class));
 
     private IncidentToAdjacentStrategy() {
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/65b3ad06/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/PathFilterStepTest.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/PathFilterStepTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/PathFilterStepTest.java
new file mode 100644
index 0000000..ff994e8
--- /dev/null
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/PathFilterStepTest.java
@@ -0,0 +1,47 @@
+/*
+ *  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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.StepTest;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class PathFilterStepTest extends StepTest {
+
+    @Override
+    protected List<Traversal> getTraversals() {
+        return Arrays.asList(
+                __.simplePath(),
+                __.simplePath().from("a").to("b"),
+                __.simplePath().from("a"),
+                __.simplePath().to("b"),
+                __.cyclicPath().from("a"),
+                __.cyclicPath().to("b"),
+                __.cyclicPath().from("a").to("b"),
+                __.cyclicPath()
+        );
+    }
+}

Reply via email to