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/01 01:12:48 UTC

incubator-tinkerpop git commit: super optimization to WhereStep I never realized before.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/multi-label-steps 95f370d7c -> 426cf997a


super optimization to WhereStep I never realized before.


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

Branch: refs/heads/multi-label-steps
Commit: 426cf997a64cca0a34fa0e59418909b1687ad3d2
Parents: 95f370d
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Apr 30 17:12:44 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Apr 30 17:12:44 2015 -0600

----------------------------------------------------------------------
 .../traversal/step/filter/WhereStep.java        | 48 ++++++++++----------
 .../traversal/step/map/match/MatchStep.java     | 21 ++++++---
 2 files changed, 39 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/426cf997/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
index 9fbf91f..d7d7142 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
@@ -54,40 +54,42 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
 
     public WhereStep(final Traversal.Admin traversal, final Traversal.Admin constraint) {
         super(traversal);
-        this.firstKey = null;
-        this.secondKey = null;
         this.biPredicate = null;
         this.constraint = this.integrateChild(constraint);
+        // TODO: do we need to compile the traversal first (probably)
+        ///
+        final Step<?, ?> startStep = this.constraint.getStartStep();
+        if (startStep.getLabels().isEmpty())
+            throw new IllegalArgumentException("Where traversal must have their start step labeled with as(): " + this.constraint);
+        if (startStep.getLabels().size() > 1)
+            throw new IllegalArgumentException("Where traversal can not have multiple labels on the start step: " + this.constraint);
+        this.firstKey = startStep.getLabels().iterator().next();
+        ///
+        Step<?, ?> endStep = this.constraint.getEndStep();
+        if (endStep instanceof MarkerIdentityStep) endStep = endStep.getPreviousStep();  // DAH
+        if (endStep.getLabels().size() > 1)
+            throw new IllegalArgumentException("Where traversal can not have multiple labels on the end step: " + this.constraint);
+        this.secondKey = endStep.getLabels().isEmpty() ? null : endStep.getLabels().iterator().next();
     }
 
     @Override
     protected boolean filter(final Traverser.Admin<Map<String, E>> traverser) {
+        final Map<String, E> map = traverser.get();
         if (null == this.constraint) {
-            final Map<String, E> map = traverser.get();
             if (!map.containsKey(this.firstKey))
                 throw new IllegalArgumentException("The provided key is not in the current map: " + this.firstKey);
             if (!map.containsKey(this.secondKey))
                 throw new IllegalArgumentException("The provided key is not in the current map: " + this.secondKey);
             return this.biPredicate.test(map.get(this.firstKey), map.get(this.secondKey));
         } else {
-            final Step<?, ?> startStep = this.constraint.getStartStep();
-            Step<?, ?> endStep = this.constraint.getEndStep();
-            if (endStep instanceof MarkerIdentityStep) // DAH!
-                endStep = endStep.getPreviousStep();
-
-            final Map<String, E> map = traverser.get();
-            if (!map.containsKey(startStep.getLabels().iterator().next()))
-                throw new IllegalArgumentException("The provided key is not in the current map: " + startStep.getLabels().iterator().next());
-            final Object startObject = map.get(startStep.getLabels().iterator().next());
-            final Object endObject;
-            if (!endStep.getLabels().isEmpty()) {
-                if (!map.containsKey(endStep.getLabels().iterator().next()))
-                    throw new IllegalArgumentException("The provided key is not in the current map: " + endStep.getLabels().iterator().next());
-                endObject = map.get(endStep.getLabels().iterator().next());
-            } else
-                endObject = null;
-
-            startStep.addStart(this.getTraversal().asAdmin().getTraverserGenerator().generate(startObject, (Step) startStep, traverser.bulk()));
+            final Object startObject = map.get(this.firstKey);
+            if (null == startObject)
+                throw new IllegalArgumentException("The provided key is not in the current map: " + this.firstKey);
+            if (null != this.secondKey && !map.containsKey(this.secondKey))
+                throw new IllegalArgumentException("The provided key is not in the current map: " + this.secondKey);
+            final Object endObject = null == this.secondKey ? null : map.get(this.secondKey);
+            //
+            this.constraint.addStart(this.getTraversal().asAdmin().getTraverserGenerator().generate(startObject, this.constraint.getStartStep(), traverser.bulk()));
             if (null == endObject) {
                 if (this.constraint.hasNext()) {
                     this.constraint.reset();
@@ -95,7 +97,6 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
                 } else {
                     return false;
                 }
-
             } else {
                 while (this.constraint.hasNext()) {
                     if (this.constraint.next().equals(endObject)) {
@@ -121,8 +122,7 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
     @Override
     public WhereStep<E> clone() {
         final WhereStep<E> clone = (WhereStep<E>) super.clone();
-        if (null != this.constraint)
-            clone.constraint = clone.integrateChild(this.constraint.clone());
+        if (null != this.constraint) clone.constraint = clone.integrateChild(this.constraint.clone());
         return clone;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/426cf997/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
index 31112ea..ddfc83f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
@@ -19,13 +19,14 @@
 package org.apache.tinkerpop.gremlin.process.traversal.step.map.match;
 
 import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+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 org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.util.ArrayList;
@@ -180,10 +181,18 @@ public final class MatchStep<S, E> extends AbstractStep<S, Map<String, E>> imple
     }
 
     private void addTraversalPrivate(final Traversal<S, S> traversal) {
-
-        String startAs = traversal.asAdmin().getStartStep().getLabels().iterator().next();
-        //        -> new IllegalArgumentException("All match traversals must have their start step labeled with as()"));
-        String endAs = traversal.asAdmin().getEndStep().getLabels().stream().findFirst().orElse(null);
+        final Step<S,?> startStep = traversal.asAdmin().getStartStep();
+        if (startStep.getLabels().isEmpty())
+            throw new IllegalArgumentException("Match traversals must have their start step labeled with as(): " + traversal);
+        if (startStep.getLabels().size() > 1)
+            throw new IllegalArgumentException("Match traversals can not have multiple labels on the start step: " + traversal);
+        final String startAs = traversal.asAdmin().getStartStep().getLabels().iterator().next();
+        ///
+        final Step<?,S> endStep = traversal.asAdmin().getEndStep();
+        if(endStep.getLabels().size() > 1)
+            throw new IllegalArgumentException("Match traversals can not have multiple labels on the end step: " + traversal);
+
+        String endAs = endStep.getLabels().isEmpty() ? null : endStep.getLabels().iterator().next();
         checkAs(startAs);
         if (null == endAs) {
             endAs = createAnonymousAs();