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/06/16 00:08:06 UTC

[05/31] incubator-tinkerpop git commit: XMatchStep works both in OLTP and OLAP. Bam. Added a handy ComputerAwareStep.EndStep boolean -- return home or go to next.

XMatchStep works both in OLTP and OLAP. Bam. Added a handy ComputerAwareStep.EndStep boolean -- return home or go to next.


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

Branch: refs/heads/master
Commit: 15e3f77c96c38bbceadd1b977e1afc58913d076b
Parents: 5e753ff
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 11 14:11:07 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 11 14:11:07 2015 -0600

----------------------------------------------------------------------
 .../gremlin/process/traversal/dsl/graph/__.java |   4 +
 .../traversal/step/branch/BranchStep.java       |   2 +-
 .../step/filter/exp/IsOrAllowStep.java          |   7 +-
 .../traversal/step/filter/exp/XMatchStep.java   | 103 ++++++++++++-------
 .../traversal/step/util/ComputerAwareStep.java  |   8 +-
 .../tinkergraph/structure/TinkerGraphTest.java  |   5 +-
 6 files changed, 87 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/15e3f77c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
index 76a4303..de061c9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
@@ -767,4 +767,8 @@ public class __ {
         return __.<A>start().barrier(maxBarrierSize);
     }
 
+    public static <A> GraphTraversal<A, A> xmatch(final Traversal<?, ?>... andTraversals) {
+        return __.<A>start().xmatch(andTraversals);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/15e3f77c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java
index eee95e7..2f3c7f1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java
@@ -52,7 +52,7 @@ public class BranchStep<S, E, M> extends ComputerAwareStep<S, E> implements Trav
             this.traversalOptions.get(pickToken).add(traversalOption);
         else
             this.traversalOptions.put(pickToken, new ArrayList<>(Collections.singletonList(traversalOption)));
-        traversalOption.addStep(new EndStep(traversalOption));
+        traversalOption.addStep(new EndStep(traversalOption, false));
         this.integrateChild(traversalOption);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/15e3f77c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/IsOrAllowStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/IsOrAllowStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/IsOrAllowStep.java
index 081f747..9202f86 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/IsOrAllowStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/IsOrAllowStep.java
@@ -21,6 +21,7 @@
 
 package org.apache.tinkerpop.gremlin.process.traversal.step.filter.exp;
 
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.process.traversal.Pop;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
@@ -45,8 +46,10 @@ public final class IsOrAllowStep<S> extends FilterStep<S> {
         final Optional<S> optional = traverser.getSideEffects().get(this.key);
         if (optional.isPresent())
             return traverser.get().equals(optional.get());
-        else
-            return !traverser.path().hasLabel(this.key) || traverser.get().equals(traverser.path().getSingle(Pop.head, this.key));
+        else {
+            final Path path = traverser.path();
+            return !path.hasLabel(this.key) || traverser.get().equals(path.getSingle(Pop.head, this.key));
+        }
 
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/15e3f77c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/XMatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/XMatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/XMatchStep.java
index 29ee69d..a67928b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/XMatchStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/exp/XMatchStep.java
@@ -21,21 +21,24 @@
 
 package org.apache.tinkerpop.gremlin.process.traversal.step.filter.exp;
 
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Pop;
 import org.apache.tinkerpop.gremlin.process.traversal.Scope;
 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.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectOneStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.TailLocalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Set;
@@ -43,11 +46,13 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class XMatchStep<S> extends AbstractStep<S, S> implements TraversalParent {
+public final class XMatchStep<S> extends ComputerAwareStep<S, S> implements TraversalParent {
 
-    private final List<Traversal.Admin<?, ?>> andTraversals = new ArrayList<>();
+    private List<Traversal.Admin<Object, Object>> andTraversals = new ArrayList<>();
     private final List<String> traversalLabels = new ArrayList<>();
     private final List<String> startLabels = new ArrayList<>();
+    private boolean first = true;
+
 
     public XMatchStep(final Traversal.Admin traversal, final Traversal... andTraversals) {
         super(traversal);
@@ -59,54 +64,31 @@ public final class XMatchStep<S> extends AbstractStep<S, S> implements Traversal
             final Step<?, ?> startStep = andTraversal.asAdmin().getStartStep();
             if (startStep instanceof StartStep && !startStep.getLabels().isEmpty()) {
                 if (startStep.getLabels().size() > 1)
-                    throw new IllegalArgumentException("The start step of a where()-traversal predicate can only have one label: " + startStep);
+                    throw new IllegalArgumentException("The start step of a match()-traversal can only have one label: " + startStep);
                 final String startLabel = startStep.getLabels().iterator().next();
-                final Step<?, ?> selectOneStep = new SelectOneStep<>(andTraversal.asAdmin(), Scope.global, startLabel);
+                final Step<?, ?> selectOneStep = new SelectOneStep<>(andTraversal.asAdmin(), Scope.global, Pop.head, startLabel);
                 selectOneStep.addLabel(traversalLabel);
                 this.startLabels.add(startLabel);
                 TraversalHelper.replaceStep(andTraversal.asAdmin().getStartStep(), selectOneStep, andTraversal.asAdmin());
-                TraversalHelper.insertAfterStep(new TailLocalStep<>(andTraversal.asAdmin(), 1), selectOneStep, andTraversal.asAdmin());
             }
             //// END STEP
             final Step<?, ?> endStep = andTraversal.asAdmin().getEndStep();
             if (!endStep.getLabels().isEmpty()) {
                 if (endStep.getLabels().size() > 1)
-                    throw new IllegalArgumentException("The end step of a where()-traversal predicate can only have one label: " + endStep);
+                    throw new IllegalArgumentException("The end step of a match()-traversal can only have one label: " + endStep);
                 final String label = endStep.getLabels().iterator().next();
                 endStep.removeLabel(label);
                 final Step<?, ?> isOrAllowStep = new IsOrAllowStep<>(andTraversal.asAdmin(), label);
                 isOrAllowStep.addLabel(label);
                 andTraversal.asAdmin().addStep(isOrAllowStep);
+                andTraversal.asAdmin().addStep(new EndStep(andTraversal.asAdmin(), true));
             }
             this.andTraversals.add(this.integrateChild(andTraversal.asAdmin()));
         }
     }
 
-    @Override
-    protected Traverser<S> processNextStart() throws NoSuchElementException {
-        while (true) {
 
-            for (final Traversal.Admin<?, ?> andTraversal : this.andTraversals) {
-                if (andTraversal.hasNext()) {
-                    this.starts.add((Traverser.Admin) andTraversal.getEndStep().next().asAdmin());
-                }
-            }
-            final Traverser<S> traverser = this.starts.next();
-            boolean repeated = false;
-            for (int i = 0; i < this.andTraversals.size(); i++) {
-                if (traverser.path().hasLabel(this.startLabels.get(i)) && !traverser.path().hasLabel(this.traversalLabels.get(i))) {
-                    repeated = true;
-                    this.andTraversals.get(i).addStart((Traverser) traverser);
-                    break;
-                }
-            }
-            if (!repeated)
-                return traverser;
-        }
-    }
-
-    @Override
-    public List<Traversal.Admin<?, ?>> getLocalChildren() {
+    public List<Traversal.Admin<Object, Object>> getGlobalChildren() {
         return Collections.unmodifiableList(this.andTraversals);
     }
 
@@ -115,20 +97,71 @@ public final class XMatchStep<S> extends AbstractStep<S, S> implements Traversal
         return StringFactory.stepString(this, this.andTraversals);
     }
 
+    @Override
+    public void reset() {
+        super.reset();
+        this.first = true;
+    }
 
     @Override
     public XMatchStep<S> clone() {
         final XMatchStep<S> clone = (XMatchStep<S>) super.clone();
-        clone.andTraversals.clear();
-        for (final Traversal.Admin<?, ?> traversal : this.andTraversals) {
+        clone.andTraversals = new ArrayList<>();
+        for (final Traversal.Admin<Object,Object> traversal : this.andTraversals) {
             clone.andTraversals.add(clone.integrateChild(traversal.clone()));
         }
         return clone;
     }
 
     @Override
+    protected Iterator<Traverser<S>> standardAlgorithm() throws NoSuchElementException {
+        while (true) {
+            if (!this.first) {
+                for (final Traversal.Admin<?, ?> andTraversal : this.andTraversals) {
+                    if (andTraversal.hasNext())
+                        this.starts.add((Traverser.Admin) andTraversal.getEndStep().next().asAdmin());
+                }
+            }
+            this.first = false;
+            final Traverser<S> traverser = this.starts.next();
+            final Path path = traverser.path();
+            boolean traverserPassed = true;
+            for (int i = 0; i < this.andTraversals.size(); i++) {
+                if (path.hasLabel(this.startLabels.get(i)) && !path.hasLabel(this.traversalLabels.get(i))) {
+                    traverserPassed = false;
+                    this.andTraversals.get(i).addStart((Traverser) traverser);
+                    break;
+                }
+            }
+            if (traverserPassed) {
+                // TODO: trim off internal traversal labels from path
+                return IteratorUtils.of(traverser);
+            }
+        }
+    }
+
+    @Override
+    protected Iterator<Traverser<S>> computerAlgorithm() throws NoSuchElementException {
+        final Traverser<S> traverser = this.starts.next();
+        final Path path = traverser.path();
+        for (int i = 0; i < this.andTraversals.size(); i++) {
+            if (path.hasLabel(this.startLabels.get(i)) && !path.hasLabel(this.traversalLabels.get(i))) {
+                traverser.asAdmin().setStepId(this.andTraversals.get(i).getStartStep().getId());
+                return IteratorUtils.of(traverser);
+            }
+        }
+        // TODO: trim off internal traversal labels from path
+        traverser.asAdmin().setStepId(this.getNextStep().getId());
+        return IteratorUtils.of(traverser);
+    }
+
+    @Override
     public int hashCode() {
-        return super.hashCode() ^ this.andTraversals.hashCode();
+        int result = super.hashCode();
+        for(final Traversal.Admin<Object,Object> andTraversal : this.andTraversals) {
+            result ^= andTraversal.hashCode();
+        }
+        return result;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/15e3f77c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java
index 4b79d4c..a4bb6d5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java
@@ -68,14 +68,18 @@ public abstract class ComputerAwareStep<S, E> extends AbstractStep<S, E> impleme
 
     public class EndStep extends AbstractStep<S, S> implements EngineDependent {
 
-        public EndStep(final Traversal.Admin traversal) {
+        private final boolean returnHome;
+
+        public EndStep(final Traversal.Admin traversal, final boolean returnHome) {
             super(traversal);
+            this.returnHome = returnHome;
         }
 
         @Override
         protected Traverser<S> processNextStart() throws NoSuchElementException {
             final Traverser.Admin<S> start = this.starts.next();
-            if (this.traverserStepIdSetByChild) start.setStepId(ComputerAwareStep.this.getNextStep().getId());
+            if (this.traverserStepIdSetByChild)
+                start.setStepId(this.returnHome ? ComputerAwareStep.this.getId() : ComputerAwareStep.this.getNextStep().getId());
             return start;
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/15e3f77c/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
index 54a66a3..0871251 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.tinkergraph.structure;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Operator;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.Pop;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.structure.*;
@@ -154,11 +155,11 @@ public class TinkerGraphTest {
     @Test
     @Ignore
     public void testPlay5() throws Exception {
-        GraphTraversalSource g = TinkerFactory.createModern().traversal();
+        GraphTraversalSource g = TinkerFactory.createModern().traversal(GraphTraversalSource.computer());
         g.V().as("a").xmatch(
                 as("a").out("knows").as("b"),
                 as("a").out("created").as("c"),
-                as("b").out("created").as("c")).select("a","b","c").forEachRemaining(System.out::println);
+                as("b").out("created").as("c")).select(Pop.head,"a","b","c").forEachRemaining(System.out::println);
     }
 
     @Test