You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2015/06/04 12:15:50 UTC

[36/43] incubator-tinkerpop git commit: Fixed TINKERPOP-619. If a SelectStep does not bind all variables, then move to the next traverser.

Fixed TINKERPOP-619. If a SelectStep does not bind all variables, then move to the next traverser.


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

Branch: refs/heads/preprocessor
Commit: f764ba8528cf035ed1f939750816d06ff5c59d4d
Parents: d8df036
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Jun 3 10:27:35 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Jun 3 10:27:47 2015 -0600

----------------------------------------------------------------------
 .../gremlin/process/traversal/step/Scoping.java | 12 +++++-
 .../traversal/step/map/AddVertexStartStep.java  |  6 +++
 .../process/traversal/step/map/MapStep.java     |  4 +-
 .../traversal/step/map/SelectOneStep.java       |  8 ++--
 .../process/traversal/step/map/SelectStep.java  | 23 ++++++----
 .../traversal/step/map/GroovySelectTest.groovy  | 10 +++++
 .../process/traversal/step/map/SelectTest.java  | 44 +++++++++++++++++++-
 7 files changed, 93 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f764ba85/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java
index 43abaa4..01f1485 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java
@@ -26,13 +26,14 @@ import org.apache.tinkerpop.gremlin.process.traversal.Scope;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public interface Scoping {
 
-    public default <S> S getScopeValueByKey(final String key, final Traverser.Admin<?> traverser) {
+    public default <S> S getScopeValueByKey(final String key, final Traverser.Admin<?> traverser) throws IllegalArgumentException {
         if (Scope.local == this.getScope()) {
             final S s = ((Map<String, S>) traverser.get()).get(key);
             if (null == s)
@@ -44,6 +45,15 @@ public interface Scoping {
         }
     }
 
+    public default <S> Optional<S> getOptionalScopeValueByKey(final String key, final Traverser.Admin<?> traverser) {
+        if (Scope.local == this.getScope()) {
+            return Optional.ofNullable(((Map<String, S>) traverser.get()).get(key));
+        } else {
+            final Path path = traverser.path();
+            return Optional.ofNullable(path.hasLabel(key) ? path.get(key) : traverser.getSideEffects().<S>get(key).orElse(null));
+        }
+    }
+
     public Scope getScope();
 
     public Scope recommendNextScope();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f764ba85/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
index 856a985..3702aa0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
@@ -77,4 +77,10 @@ public final class AddVertexStartStep extends AbstractStep<Vertex, Vertex> imple
         }
         return result;
     }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.first = false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f764ba85/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
index 1ef30f3..edf3501 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
@@ -35,7 +35,9 @@ public abstract class MapStep<S, E> extends AbstractStep<S, E> {
     protected Traverser<E> processNextStart() {
         while (true) {
             final Traverser.Admin<S> traverser = this.starts.next();
-            return traverser.split(this.map(traverser), this);
+            final E e = this.map(traverser);
+            if (null != e)
+                return traverser.split(e, this);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f764ba85/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
index 20ddad0..4a0bebf 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
@@ -31,6 +31,7 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -40,7 +41,7 @@ public final class SelectOneStep<S, E> extends MapStep<S, E> implements Traversa
 
     private Scope scope;
     private final String selectLabel;
-    private Traversal.Admin<Object, Object> selectTraversal = new IdentityTraversal<>();
+    private Traversal.Admin<S, E> selectTraversal = new IdentityTraversal<>();
 
     public SelectOneStep(final Traversal.Admin traversal, final Scope scope, final String selectLabel) {
         super(traversal);
@@ -50,7 +51,8 @@ public final class SelectOneStep<S, E> extends MapStep<S, E> implements Traversa
 
     @Override
     protected E map(final Traverser.Admin<S> traverser) {
-        return (E) TraversalUtil.apply((Object) this.getScopeValueByKey(this.selectLabel, traverser), this.selectTraversal);
+        final Optional<S> optional = this.getOptionalScopeValueByKey(this.selectLabel, traverser);
+        return optional.isPresent() ? TraversalUtil.apply(optional.get(), this.selectTraversal) : null;
     }
 
     @Override
@@ -71,7 +73,7 @@ public final class SelectOneStep<S, E> extends MapStep<S, E> implements Traversa
     }
 
     @Override
-    public List<Traversal.Admin<Object, Object>> getLocalChildren() {
+    public List<Traversal.Admin<S, E>> getLocalChildren() {
         return Collections.singletonList(this.selectTraversal);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f764ba85/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
index ab58d89..f7da677 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
@@ -34,6 +34,7 @@ import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -41,7 +42,7 @@ import java.util.Set;
  */
 public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implements Scoping, TraversalParent, PathProcessor {
 
-    private TraversalRing<Object, Object> traversalRing = new TraversalRing<>();
+    private TraversalRing<Object, E> traversalRing = new TraversalRing<>();
     private Scope scope;
     private final List<String> selectLabels;
 
@@ -59,13 +60,21 @@ public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implement
         if (this.selectLabels.isEmpty()) {
             if (Scope.local == this.scope)
                 ((Map<String, Object>) start).forEach((key, value) -> bindings.put(key, (E) TraversalUtil.apply(value, this.traversalRing.next())));
-            else  {
+            else {
                 final Path path = traverser.path();
                 path.labels().stream().flatMap(Set::stream).distinct().forEach(label -> bindings.put(label, (E) TraversalUtil.apply(path.<Object>get(label), this.traversalRing.next())));
             }
-        } else
-            this.selectLabels.forEach(label -> bindings.put(label, (E) TraversalUtil.apply((Object) this.getScopeValueByKey(label, traverser), this.traversalRing.next())));
-
+        } else {
+            for (final String label : this.selectLabels) {
+                final Optional<E> optional = this.getOptionalScopeValueByKey(label, traverser);
+                if (optional.isPresent())
+                    bindings.put(label, TraversalUtil.apply(optional.get(), this.traversalRing.next()));
+                else {
+                    this.traversalRing.reset();
+                    return null;
+                }
+            }
+        }
         this.traversalRing.reset();
         return bindings;
     }
@@ -99,7 +108,7 @@ public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implement
     }
 
     @Override
-    public List<Traversal.Admin<Object, Object>> getLocalChildren() {
+    public List<Traversal.Admin<Object, E>> getLocalChildren() {
         return this.traversalRing.getTraversals();
     }
 
@@ -119,7 +128,7 @@ public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implement
     }
 
     @Override
-    public Scope getScope()  {
+    public Scope getScope() {
         return this.scope;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f764ba85/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
index 3f797d7..6597f14 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
@@ -161,5 +161,15 @@ public abstract class GroovySelectTest {
             TraversalScriptHelper.compute("""g.V.hasLabel('software').as('name').as('language').as('creators').select().by('name').by('lang').
                     by(__.in('created').values('name').fold().order(local))""", g)
         }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_untilXout_outX_repeatXin_asXaXX_selectXaX_byXtailXlocalX_nameX() {
+            TraversalScriptHelper.compute("g.V.until(__.out.out).repeat(__.in.as('a')).select('a').by(tail(local).name)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_untilXout_outX_repeatXin_asXaX_in_asXbXX_selectXa_bX_byXnameX() {
+            TraversalScriptHelper.compute("g.V.until(__.out.out).repeat(__.in.as('a').in.as('b')).select('a','b').by('name')", g);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f764ba85/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
index 41e3cf2..f0a575b 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
@@ -21,10 +21,10 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
+import org.apache.tinkerpop.gremlin.process.traversal.Order;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.process.traversal.Order;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -77,7 +77,7 @@ public abstract class SelectTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Map<String, List<Vertex>>> get_g_V_asXaX_outXcreatedX_asXaX_select();
 
-    // below we original back()-tests
+    // below are original back()-tests
 
     public abstract Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_selectXhereX(final Object v1Id);
 
@@ -101,6 +101,12 @@ public abstract class SelectTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXnameX_asXlanguageX_asXcreatorsX_select_byXnameX_byXlangX_byXinXcreatedX_valuesXnameX_fold_orderXlocalXX();
 
+    // when labels don't exist
+
+    public abstract Traversal<Vertex, String> get_g_V_untilXout_outX_repeatXin_asXaXX_selectXaX_byXtailXlocalX_nameX();
+
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_untilXout_outX_repeatXin_asXaX_in_asXbXX_selectXa_bX_byXnameX();
+
     @Test
     @LoadGraphWith(MODERN)
     public void g_VX1X_asXaX_outXknowsX_asXbX_select() {
@@ -469,6 +475,30 @@ public abstract class SelectTest extends AbstractGremlinProcessTest {
         assertFalse(traversal.hasNext());
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_untilXout_outX_repeatXin_asXaXX_selectXaX_byXtailXlocalX_nameX() {
+        final Traversal<Vertex, String> traversal = get_g_V_untilXout_outX_repeatXin_asXaXX_selectXaX_byXtailXlocalX_nameX();
+        printTraversalForm(traversal);
+        checkResults(this.<String, Long>makeMapList(1, "marko", 5l).get(0), traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_untilXout_outX_repeatXin_asXaX_in_asXbXX_selectXa_bX_byXnameX() {
+        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_untilXout_outX_repeatXin_asXaX_in_asXbXX_selectXa_bX_byXnameX();
+        printTraversalForm(traversal);
+        Map<String, String> result = traversal.next();
+        assertEquals(2, result.size());
+        assertEquals("josh", result.get("a"));
+        assertEquals("marko", result.get("b"));
+        result = traversal.next();
+        assertEquals(2, result.size());
+        assertEquals("josh", result.get("a"));
+        assertEquals("marko", result.get("b"));
+        assertFalse(traversal.hasNext());
+    }
+
     public static class Traversals extends SelectTest {
         @Override
         public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
@@ -594,5 +624,15 @@ public abstract class SelectTest extends AbstractGremlinProcessTest {
             return g.V().hasLabel("software").as("name").as("language").as("creators").select().by("name").by("lang").
                     by(__.in("created").values("name").fold().order(local));
         }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_untilXout_outX_repeatXin_asXaXX_selectXaX_byXtailXlocalX_nameX() {
+            return g.V().until(__.out().out()).repeat(__.in().as("a")).<String>select("a").by(__.tail(local).values("name"));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_untilXout_outX_repeatXin_asXaX_in_asXbXX_selectXa_bX_byXnameX() {
+            return g.V().until(__.out().out()).repeat(__.in().as("a").in().as("b")).<String>select("a", "b").by("name");
+        }
     }
 }