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/11 20:54:36 UTC

incubator-tinkerpop git commit: added select(pop...) to GraphTraversal and __.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 5e9ad8d7d -> f3f60e011


added select(pop...) to GraphTraversal and __.


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

Branch: refs/heads/master
Commit: f3f60e0116b0a34affd73758262f4837eb0d2283
Parents: 5e9ad8d
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 11 12:54:32 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 11 12:54:32 2015 -0600

----------------------------------------------------------------------
 .../traversal/dsl/graph/GraphTraversal.java     | 25 ++++++++++++++++----
 .../gremlin/process/traversal/dsl/graph/__.java | 18 ++++++++++++++
 .../gremlin/process/traversal/step/Scoping.java | 17 +++++++++----
 .../traversal/step/filter/WhereStep.java        |  3 +--
 .../traversal/step/map/SelectOneStep.java       |  7 ++++--
 .../process/traversal/step/map/SelectStep.java  |  9 ++++---
 6 files changed, 64 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f3f60e01/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 28d752a..09f5602 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
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.dsl.graph;
 import org.apache.tinkerpop.gremlin.process.traversal.Order;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 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;
@@ -467,20 +468,36 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return this.asAdmin().addStep(new SackStep<>(this.asAdmin()));
     }
 
+    public default <E2> GraphTraversal<S, Map<String, E2>> select(final Scope scope, final Pop pop, final String... stepLabels) {
+        return this.asAdmin().addStep(new SelectStep<>(this.asAdmin(), scope, Optional.ofNullable(pop), stepLabels));
+    }
+
     public default <E2> GraphTraversal<S, Map<String, E2>> select(final Scope scope, final String... stepLabels) {
-        return this.asAdmin().addStep(new SelectStep<>(this.asAdmin(), scope, stepLabels));
+        return this.select(scope, null, stepLabels);
+    }
+
+    public default <E2> GraphTraversal<S, Map<String, E2>> select(final Pop pop, final String... stepLabels) {
+        return this.select(Scope.global, pop, stepLabels);
     }
 
     public default <E2> GraphTraversal<S, Map<String, E2>> select(final String... stepLabels) {
-        return this.select(Scope.global, stepLabels);
+        return this.select(Scope.global, null, stepLabels);
+    }
+
+    public default <E2> GraphTraversal<S, E2> select(final Scope scope, final Pop pop, final String stepLabel) {
+        return this.asAdmin().addStep(new SelectOneStep(this.asAdmin(), scope, Optional.ofNullable(pop), stepLabel));
     }
 
     public default <E2> GraphTraversal<S, E2> select(final Scope scope, final String stepLabel) {
-        return this.asAdmin().addStep(new SelectOneStep(this.asAdmin(), scope, stepLabel));
+        return this.select(scope, null, stepLabel);
+    }
+
+    public default <E2> GraphTraversal<S, E2> select(final Pop pop, final String stepLabel) {
+        return this.select(Scope.global, pop, stepLabel);
     }
 
     public default <E2> GraphTraversal<S, E2> select(final String stepLabel) {
-        return this.select(Scope.global, stepLabel);
+        return this.select(Scope.global, null, stepLabel);
     }
 
     public default <E2> GraphTraversal<S, E2> unfold() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f3f60e01/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 b6ccb8a..76a4303 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
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.dsl.graph;
 
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 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.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
@@ -270,6 +271,11 @@ public class __ {
         return __.<A>start().sack();
     }
 
+
+    public static <A, B> GraphTraversal<A, B> select(final Scope scope, final Pop pop, final String stepLabel) {
+        return __.<A>start().select(scope, pop, stepLabel);
+    }
+
     /**
      * @see {@link GraphTraversal#select(Scope, String)}
      */
@@ -277,6 +283,10 @@ public class __ {
         return __.<A>start().select(scope, stepLabel);
     }
 
+    public static <A, B> GraphTraversal<A, B> select(final Pop pop, final String stepLabel) {
+        return __.<A>start().select(pop, stepLabel);
+    }
+
     /**
      * @see {@link GraphTraversal#select(String)}
      */
@@ -284,6 +294,10 @@ public class __ {
         return __.<A>start().select(stepLabel);
     }
 
+    public static <A, B> GraphTraversal<A, Map<String, B>> select(final Scope scope, final Pop pop, final String... stepLabels) {
+        return __.<A>start().select(scope, pop, stepLabels);
+    }
+
     /**
      * @see {@link GraphTraversal#select(Scope, String...)}
      */
@@ -291,6 +305,10 @@ public class __ {
         return __.<A>start().select(scope, stepLabels);
     }
 
+    public static <A, B> GraphTraversal<A, Map<String, B>> select(final Pop pop, final String... stepLabels) {
+        return __.<A>start().select(pop, stepLabels);
+    }
+
     /**
      * @see {@link GraphTraversal#select(String...)}
      */

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f3f60e01/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 0c387a9..c41ba9f 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
@@ -22,6 +22,7 @@
 package org.apache.tinkerpop.gremlin.process.traversal.step;
 
 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.Traverser;
 
@@ -34,7 +35,7 @@ import java.util.Set;
  */
 public interface Scoping {
 
-    public default <S> S getScopeValueByKey(final String key, final Traverser.Admin<?> traverser) throws IllegalArgumentException {
+    public default <S> S getScopeValueByKey(final Pop pop, final String key, final Traverser.Admin<?> traverser) throws IllegalArgumentException {
         if (traverser.getSideEffects().get(key).isPresent())
             return traverser.getSideEffects().<S>get(key).get();
         if (Scope.local == this.getScope()) {
@@ -46,13 +47,13 @@ public interface Scoping {
         } else {
             final Path path = traverser.path();
             if (path.hasLabel(key))
-                return path.get(key);
+                return null == pop ? path.get(key) : path.getSingle(pop, key);
             else
                 throw new IllegalArgumentException("Neither the current path nor sideEffects have a " + key + "-key: " + this);
         }
     }
 
-    public default <S> Optional<S> getOptionalScopeValueByKey(final String key, final Traverser.Admin<?> traverser) {
+    public default <S> Optional<S> getOptionalScopeValueByKey(final Pop pop, final String key, final Traverser.Admin<?> traverser) {
         if (traverser.getSideEffects().get(key).isPresent())
             return traverser.getSideEffects().<S>get(key);
 
@@ -60,10 +61,18 @@ public interface Scoping {
             return Optional.ofNullable(((Map<String, S>) traverser.get()).get(key));
         } else {
             final Path path = traverser.path();
-            return path.hasLabel(key) ? Optional.of(path.get(key)) : Optional.<S>empty();
+            return path.hasLabel(key) ? Optional.of(null == pop ? path.get(key) : path.getSingle(pop, key)) : Optional.<S>empty();
         }
     }
 
+    public default <S> S getScopeValueByKey(final String key, final Traverser.Admin<?> traverser) throws IllegalArgumentException {
+        return this.getScopeValueByKey(null, key, traverser);
+    }
+
+    public default <S> Optional<S> getOptionalScopeValueByKey(final String key, final Traverser.Admin<?> traverser) {
+        return this.getOptionalScopeValueByKey(null, key, traverser);
+    }
+
     public Scope getScope();
 
     public Scope recommendNextScope();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f3f60e01/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 cfe2d3a..4cb7086 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
@@ -37,7 +37,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalP;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
@@ -61,7 +60,7 @@ public final class WhereStep<S> extends FilterStep<S> implements TraversalParent
             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);
-                TraversalHelper.replaceStep(whereTraversal.getStartStep(), new SelectOneStep<>(whereTraversal, scope, startStep.getLabels().iterator().next()), whereTraversal);
+                TraversalHelper.replaceStep(whereTraversal.getStartStep(), new SelectOneStep<>(whereTraversal, scope, Optional.empty(), startStep.getLabels().iterator().next()), whereTraversal);   // TODO: pop head or allow multi-results?
             }
             //// END STEP
             final Step<?, ?> endStep = whereTraversal.getEndStep();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f3f60e01/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 0df3899..674dfcd 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
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 
+import org.apache.tinkerpop.gremlin.process.traversal.Pop;
 import org.apache.tinkerpop.gremlin.process.traversal.Scope;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
@@ -40,18 +41,20 @@ import java.util.Set;
 public final class SelectOneStep<S, E> extends MapStep<S, E> implements TraversalParent, Scoping, PathProcessor {
 
     private Scope scope;
+    private final Pop pop;
     private final String selectLabel;
     private Traversal.Admin<S, E> selectTraversal = new IdentityTraversal<>();
 
-    public SelectOneStep(final Traversal.Admin traversal, final Scope scope, final String selectLabel) {
+    public SelectOneStep(final Traversal.Admin traversal, final Scope scope, Optional<Pop> pop, final String selectLabel) {
         super(traversal);
         this.scope = scope;
+        this.pop = pop.orElse(null);
         this.selectLabel = selectLabel;
     }
 
     @Override
     protected E map(final Traverser.Admin<S> traverser) {
-        final Optional<S> optional = this.getOptionalScopeValueByKey(this.selectLabel, traverser);
+        final Optional<S> optional = this.getOptionalScopeValueByKey(this.pop, this.selectLabel, traverser);
         return optional.isPresent() ? TraversalUtil.apply(optional.get(), this.selectTraversal) : null;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f3f60e01/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 b9d8f55..0c9bf8b 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
@@ -19,6 +19,7 @@
 package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 
 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.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
@@ -44,12 +45,14 @@ import java.util.Set;
 public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implements Scoping, TraversalParent, PathProcessor {
 
     private TraversalRing<Object, E> traversalRing = new TraversalRing<>();
+    private final Pop pop;
     private Scope scope;
     private final List<String> selectLabels;
 
-    public SelectStep(final Traversal.Admin traversal, final Scope scope, final String... selectLabels) {
+    public SelectStep(final Traversal.Admin traversal, final Scope scope, final Optional<Pop> pop, final String... selectLabels) {
         super(traversal);
         this.scope = scope;
+        this.pop = pop.orElse(null);
         this.selectLabels = Arrays.asList(selectLabels);
     }
 
@@ -63,11 +66,11 @@ public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implement
                 ((Map<String, Object>) start).forEach((key, value) -> bindings.put(key, (E) TraversalUtil.apply(value, this.traversalRing.next())));
             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())));
+                path.labels().stream().flatMap(Set::stream).distinct().forEach(label -> bindings.put(label, (E) TraversalUtil.apply(null == this.pop ? path.<Object>get(label) : path.getSingle(this.pop, label), this.traversalRing.next())));
             }
         } else {
             for (final String label : this.selectLabels) {
-                final Optional<E> optional = this.getOptionalScopeValueByKey(label, traverser);
+                final Optional<E> optional = this.getOptionalScopeValueByKey(this.pop, label, traverser);
                 if (optional.isPresent())
                     bindings.put(label, TraversalUtil.apply(optional.get(), this.traversalRing.next()));
                 else {