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 2018/10/26 14:15:26 UTC
[tinkerpop] 01/02: TINKERPOP-2059 wip
This is an automated email from the ASF dual-hosted git repository.
dkuppitz pushed a commit to branch TINKERPOP-2059
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 75574e07df198b8d70db11d3ae515301b809d53b
Author: Daniel Kuppitz <da...@hotmail.com>
AuthorDate: Tue Oct 23 13:04:20 2018 -0700
TINKERPOP-2059 wip
---
.../traversal/step/map/PropertyMapStep.java | 82 +++++++++++--------
.../tinkergraph/structure/TinkerGraphPlayTest.java | 92 ++--------------------
2 files changed, 57 insertions(+), 117 deletions(-)
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStep.java
index 9ac7d3d..1718f59 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStep.java
@@ -20,8 +20,11 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Property;
@@ -30,12 +33,14 @@ import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -43,12 +48,13 @@ import java.util.Set;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public class PropertyMapStep<K,E> extends MapStep<Element, Map<K, E>> implements TraversalParent {
+public class PropertyMapStep<K,E> extends MapStep<Element, Map<K, E>> implements TraversalParent, ByModulating {
protected final String[] propertyKeys;
protected final PropertyType returnType;
protected final boolean includeTokens;
protected Traversal.Admin<Element, ? extends Property> propertyTraversal;
+ private TraversalRing<K, E> traversalRing;
public PropertyMapStep(final Traversal.Admin traversal, final boolean includeTokens, final PropertyType propertyType, final String... propertyKeys) {
super(traversal);
@@ -56,45 +62,61 @@ public class PropertyMapStep<K,E> extends MapStep<Element, Map<K, E>> implements
this.propertyKeys = propertyKeys;
this.returnType = propertyType;
this.propertyTraversal = null;
+ this.traversalRing = new TraversalRing<>();
}
@Override
protected Map<K, E> map(final Traverser.Admin<Element> traverser) {
- final Map<Object, Object> map = new HashMap<>();
+ final Map<Object, Object> map = new LinkedHashMap<>();
final Element element = traverser.get();
- final boolean isVertex = traverser.get() instanceof Vertex;
+ final boolean isVertex = element instanceof Vertex;
+ if (this.returnType == PropertyType.VALUE && this.includeTokens) {
+ map.put(T.id, element.id());
+ if (element instanceof VertexProperty) {
+ map.put(T.key, ((VertexProperty<?>) element).key());
+ map.put(T.value, ((VertexProperty<?>) element).value());
+ } else {
+ map.put(T.label, element.label());
+ }
+ }
final Iterator<? extends Property> properties = null == this.propertyTraversal ?
element.properties(this.propertyKeys) :
TraversalUtil.applyAll(traverser, this.propertyTraversal);
+ //final Iterator<? extends Property> properties = element.properties(this.propertyKeys);
while (properties.hasNext()) {
final Property<?> property = properties.next();
+ final Object value = this.returnType == PropertyType.VALUE ? property.value() : property;
if (isVertex) {
- List<Object> values = (List<Object>) map.get(property.key());
- if (null == values) {
- values = new ArrayList<>();
- map.put(property.key(), values);
- }
- values.add(this.returnType == PropertyType.VALUE ? property.value() : property);
- } else
- map.put(property.key(), this.returnType == PropertyType.VALUE ? property.value() : property);
- }
- if (this.returnType == PropertyType.VALUE && this.includeTokens) {
- // add tokens, as string keys
- if (element instanceof VertexProperty) {
- map.put(T.id, element.id());
- map.put(T.key, ((VertexProperty<?>) element).key());
- map.put(T.value, ((VertexProperty<?>) element).value());
+ map.compute(property.key(), (k, v) -> {
+ final List<Object> values = v != null ? (List<Object>) v : new ArrayList<>();
+ values.add(value);
+ return values;
+ });
} else {
- map.put(T.id, element.id());
- map.put(T.label, element.label());
+ map.put(property.key(), value);
}
}
+ if (!traversalRing.isEmpty()) {
+ for (final Object key : map.keySet()) {
+ map.compute(key, (k, v) -> TraversalUtil.applyNullable(v, (Traversal.Admin) this.traversalRing.next()));
+ }
+ this.traversalRing.reset();
+ }
return (Map) map;
}
@Override
- public List<Traversal.Admin<Element, ? extends Property>> getLocalChildren() {
- return null == this.propertyTraversal ? Collections.emptyList() : Collections.singletonList(this.propertyTraversal);
+ public List<Traversal.Admin<K, E>> getLocalChildren() {
+ final List<Traversal.Admin<K, E>> result = new ArrayList<>();
+ if (null != this.propertyTraversal)
+ result.add((Traversal.Admin) propertyTraversal);
+ result.addAll(this.traversalRing.getTraversals());
+ return Collections.unmodifiableList(result);
+ }
+
+ @Override
+ public void modulateBy(final Traversal.Admin<?, ?> selectTraversal) {
+ this.traversalRing.addTraversal(this.integrateChild(selectTraversal));
}
public void setPropertyTraversal(final Traversal.Admin<Element, ? extends Property> propertyTraversal) {
@@ -114,9 +136,7 @@ public class PropertyMapStep<K,E> extends MapStep<Element, Map<K, E>> implements
}
public String toString() {
- return null != this.propertyTraversal ?
- StringFactory.stepString(this, this.propertyTraversal, this.returnType.name().toLowerCase()) :
- StringFactory.stepString(this, Arrays.asList(this.propertyKeys), this.returnType.name().toLowerCase());
+ return StringFactory.stepString(this, this.traversalRing, this.returnType.name().toLowerCase());
}
@Override
@@ -124,20 +144,19 @@ public class PropertyMapStep<K,E> extends MapStep<Element, Map<K, E>> implements
final PropertyMapStep<K,E> clone = (PropertyMapStep<K,E>) super.clone();
if (null != this.propertyTraversal)
clone.propertyTraversal = this.propertyTraversal.clone();
+ clone.traversalRing = this.traversalRing.clone();
return clone;
}
@Override
public int hashCode() {
int result = super.hashCode() ^ this.returnType.hashCode() ^ Boolean.hashCode(this.includeTokens);
- if (null == this.propertyTraversal) {
- for (final String propertyKey : this.propertyKeys) {
- result ^= propertyKey.hashCode();
- }
- } else {
+ if (null != this.propertyTraversal)
result ^= this.propertyTraversal.hashCode();
+ for (final String propertyKey : this.propertyKeys) {
+ result ^= propertyKey.hashCode();
}
- return result;
+ return result ^ this.traversalRing.hashCode();
}
@Override
@@ -145,6 +164,7 @@ public class PropertyMapStep<K,E> extends MapStep<Element, Map<K, E>> implements
super.setTraversal(parentTraversal);
if (null != this.propertyTraversal)
this.integrateChild(this.propertyTraversal);
+ this.traversalRing.getTraversals().forEach(this::integrateChild);
}
@Override
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index a590835..8cc714a 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -25,6 +25,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathRetractionStrategy;
import org.apache.tinkerpop.gremlin.structure.*;
import org.apache.tinkerpop.gremlin.structure.io.IoTest;
@@ -123,92 +124,11 @@ public class TinkerGraphPlayTest {
@Test
@Ignore
public void testPlayDK() throws Exception {
-
- final Map<String, String> aliases = new HashMap<>();
- aliases.put("marko","okram");
- final GraphTraversalSource g = TinkerFactory.createModern().traversal();
- /*g.withSideEffect("a", aliases).V().hasLabel("person").
- values("name").as("n").
- optional(select("a").select(select("n"))).
- forEachRemaining(System.out::println);*/
-
- // shortest path lengths (by summed weight)
- g.withSack(0.0).V().has("person", "name", "marko").
- repeat(__.bothE().
- sack(sum).
- by("weight").
- otherV().
- group("m").
- by().
- by(sack().min()).as("x").
- // where(P.eq("m")).by(sack()).by(select(select("x"))). // could be that easy, but "x" is unknown here
- filter(project("s","x").
- by(sack()).
- by(select("m").select(select("x"))).
- where("s", P.eq("x"))).
- group("p").
- by().
- by(project("path","length").
- by(path().by("name").by("weight")).
- by(sack()))
- ).
- cap("p").unfold().
- group().
- by(select(Column.keys).values("name")).
- by(Column.values).next().entrySet().
- forEach(System.out::println);
-
- System.out.println("---");
-
- // longest path lengths (by summed weight)
- g.withSack(0.0).V().has("person", "name", "marko").
- repeat(__.bothE().simplePath().
- sack(sum).
- by("weight").
- otherV().
- group("m").
- by().
- by(sack().max()).as("x").
- filter(project("s","x").
- by(sack()).
- by(select("m").select(select("x"))).
- where("s", P.eq("x"))).
- group("p").
- by().
- by(project("path","length").
- by(path().by("name").by("weight")).
- by(sack()))
- ).
- cap("p").unfold().
- group().
- by(select(Column.keys).values("name")).
- by(Column.values).next().entrySet().
- forEach(System.out::println);
-
- System.out.println("---");
-
- // all shortest paths (by summed weight)
- g.withSack(0.0).V().as("a").
- repeat(__.bothE().
- sack(sum).
- by("weight").
- otherV().as("b").
- group("m").
- by(select("a","b").by("name")).
- by(sack().min()).
- filter(project("s","x").
- by(sack()).
- by(select("m").select(select("a", "b").by("name"))).
- where("s", P.eq("x"))).
- group("p").
- by(select("a","b").by("name")).
- by(map(union(path().by("name").by("weight"), sack()).fold()))
- ).
- cap("p").unfold().
- order().
- by(select(Column.keys).select("a")).
- by(select(Column.keys).select("b")).
- forEachRemaining(System.out::println);
+ TinkerGraph graph = TinkerFactory.createTheCrew();
+ GraphTraversalSource g = graph.traversal();
+ GraphTraversalSource sg = g.withStrategies(
+ SubgraphStrategy.build().vertexProperties(hasNot("endTime")).create());
+ sg.V().valueMap().forEachRemaining(System.out::println);
}
@Test