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 d5a0735d610b907673e7422d85ff3620e57f494b Author: Daniel Kuppitz <daniel_kupp...@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