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 {