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