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/03 18:27:57 UTC
incubator-tinkerpop git commit: Fixed TINKERPOP-619. If a SelectStep
does not bind all variables, then move to the next traverser.
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master d8df0363f -> f764ba852
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/master
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");
+ }
}
}