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 2016/01/13 17:59:51 UTC

incubator-tinkerpop git commit: I have GroupSideEffectStep working with user provided maps for OLTP. I got confused and lost trying to get it to work for OLAP. However, I think there is a general solution that will allow code reuse between both engines.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1057 [created] 72d797ec7


I have GroupSideEffectStep working with user provided maps for OLTP. I got confused and lost trying to get it to work for OLAP. However, I think there is a general solution that will allow code reuse between both engines. Added a test case that verifies the example that @dkuppitz provided in JIRA working (for OLTP). Also, need to make this all work for GroupStep (non-sideEffect) -- the code will be the same, just a copy/paste over once GroupSideEffectStep is solid.


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

Branch: refs/heads/TINKERPOP-1057
Commit: 72d797ec79a84c71a0f0c8a6da7d09ea5c785588
Parents: 77af1a0
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Jan 13 09:59:39 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Jan 13 09:59:39 2016 -0700

----------------------------------------------------------------------
 .../step/sideEffect/GroupSideEffectStep.java    | 26 ++++++++++++++----
 .../traversal/step/util/GroupStepHelper.java    |  6 ++--
 .../step/sideEffect/GroovyGroupTest.groovy      |  7 +++--
 .../traversal/step/sideEffect/GroupTest.java    | 29 ++++++++++++++++++++
 4 files changed, 58 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72d797ec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java
index b2885b9..274f759 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java
@@ -72,7 +72,7 @@ public final class GroupSideEffectStep<S, K, V> extends SideEffectStep<S> implem
     public GroupSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
         super(traversal);
         this.sideEffectKey = sideEffectKey;
-        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
+        this.traversal.getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
     }
 
     @Override
@@ -106,8 +106,22 @@ public final class GroupSideEffectStep<S, K, V> extends SideEffectStep<S> implem
         } else {                        // OLTP
             if (null == this.groupMap) {
                 final Object object = traverser.sideEffects(this.sideEffectKey);
-                if (!(object instanceof GroupStepHelper.GroupMap))
-                    traverser.sideEffects(this.sideEffectKey, this.groupMap = new GroupStepHelper.GroupMap<>((Map<K, V>) object));
+                if (!(object instanceof GroupStepHelper.GroupMap)) {
+                    final Map<K, V> providedMap = (Map<K, V>) object;
+                    traverser.sideEffects(this.sideEffectKey, this.groupMap = new GroupStepHelper.GroupMap<>(providedMap));
+                    if (!providedMap.isEmpty()) {
+                        for (final K key : new ArrayList<>(providedMap.keySet())) {
+                            final Traversal.Admin<S, V> vrTraversal = this.valueReduceTraversal.clone();
+                            this.groupMap.put(key, vrTraversal);
+                            this.counters.put(key, 0);
+                            final Step barrierStep = (Step) TraversalHelper.getFirstStepOfAssignableClass(Barrier.class, vrTraversal).orElseGet(null);
+                            if (null != barrierStep) {
+                                barrierStep.addStart(this.traversal.getTraverserGenerator().generate(providedMap.get(key), barrierStep, 1l));
+                                providedMap.remove(key);
+                            }
+                        }
+                    }
+                }
             }
             final K key = TraversalUtil.applyNullable(traverser, this.keyTraversal);
             Traversal.Admin<S, V> traversal = this.groupMap.get(key);
@@ -200,7 +214,7 @@ public final class GroupSideEffectStep<S, K, V> extends SideEffectStep<S> implem
             this.groupStepId = step.getId();
             this.sideEffectKey = step.getSideEffectKey();
             this.reduceTraversal = step.reduceTraversal.clone();
-            this.mapSupplier = step.getTraversal().asAdmin().getSideEffects().<Map<K, V>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMapSupplier.instance());
+            this.mapSupplier = step.getTraversal().getSideEffects().<Map<K, V>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMapSupplier.instance());
         }
 
         @Override
@@ -232,10 +246,10 @@ public final class GroupSideEffectStep<S, K, V> extends SideEffectStep<S> implem
 
         @Override
         public void reduce(final K key, final Iterator<Collection<?>> values, final ReduceEmitter<K, V> emitter) {
-            Traversal.Admin<?,V> reduceTraversalClone = this.reduceTraversal.clone();
+            Traversal.Admin<?, V> reduceTraversalClone = this.reduceTraversal.clone();
             while (values.hasNext()) {
                 final BulkSet<?> value = (BulkSet<?>) values.next();
-                value.forEach((v,bulk) -> reduceTraversalClone.addStart(reduceTraversalClone.getTraverserGenerator().generate(v, (Step) reduceTraversalClone.getStartStep(), bulk)));
+                value.forEach((v, bulk) -> reduceTraversalClone.addStart(reduceTraversalClone.getTraverserGenerator().generate(v, (Step) reduceTraversalClone.getStartStep(), bulk)));
                 TraversalHelper.getFirstStepOfAssignableClass(Barrier.class, reduceTraversalClone).ifPresent(Barrier::processAllStarts);
             }
             emitter.emit(key, reduceTraversalClone.next());

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72d797ec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/GroupStepHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/GroupStepHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/GroupStepHelper.java
index 4ed4dc4..5cb7455 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/GroupStepHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/GroupStepHelper.java
@@ -76,7 +76,6 @@ public final class GroupStepHelper {
         }
     }
 
-
     /////////
 
     public static class GroupMap<S, K, V> extends HashMap<K, Traversal.Admin<S, V>> implements FinalGet<Map<K, V>> {
@@ -89,7 +88,10 @@ public final class GroupStepHelper {
 
         @Override
         public Map<K, V> getFinal() {
-            this.forEach((key, traversal) -> this.map.put(key, traversal.next()));
+            for (final Map.Entry<K, Traversal.Admin<S, V>> entry : this.entrySet()) {
+                if (!this.map.containsKey(entry.getKey()))
+                    this.map.put(entry.getKey(), entry.getValue().next());
+            }
             return this.map;
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72d797ec/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy
index 5a8a09e..82a1313 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy
@@ -22,8 +22,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptHelper
 import org.apache.tinkerpop.gremlin.structure.Vertex
 
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.constant
-
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
@@ -90,5 +88,10 @@ public abstract class GroovyGroupTest {
         public Traversal<Vertex, Map<String, Long>> get_g_V_groupXaX_byXname_substring_1X_byXconstantX1XX_capXaX() {
             TraversalScriptHelper.compute("g.V.group('a').by{it.name[0]}.by(constant(1l)).cap('a')", g)
         }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_withSideEffectXm__marko_1_peter_4X_V_groupXmX_byXnameX_byXconstantX1X_sumX_capXmX() {
+            TraversalScriptHelper.compute("g.withSideEffect('m', ['marko':1l,'peter':4l]).V.group('m').by('name').by(constant(1).sum).cap('m')", g);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72d797ec/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
index b2298be..9d3f1f3 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
@@ -21,7 +21,9 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Test;
@@ -73,6 +75,8 @@ public abstract class GroupTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Map<String, Long>> get_g_V_groupXaX_byXname_substring_1X_byXconstantX1XX_capXaX();
 
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_withSideEffectXm__marko_1_peter_4X_V_groupXmX_byXnameX_byXconstantX1X_sumX_capXmX();
+
     @Test
     @LoadGraphWith(MODERN)
     public void g_V_group_byXnameX() {
@@ -244,6 +248,23 @@ public abstract class GroupTest extends AbstractGremlinProcessTest {
         assertFalse(traversal.hasNext());
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_withSideEffectXm__marko_1_peter_4X_V_groupXmX_byXnameX_byXconstantX1X_sumX_capXmX() {
+        final Traversal<Vertex, Map<String, Long>> traversal = get_g_withSideEffectXm__marko_1_peter_4X_V_groupXmX_byXnameX_byXconstantX1X_sumX_capXmX();
+        printTraversalForm(traversal);
+        checkMap(new HashMap<String, Long>() {{
+            put("marko", 2l);
+            put("peter", 5l);
+            put("lop", 1l);
+            put("josh", 1l);
+            put("vadas", 1l);
+            put("ripple", 1l);
+        }}, traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
 
     public static class Traversals extends GroupTest {
 
@@ -306,5 +327,13 @@ public abstract class GroupTest extends AbstractGremlinProcessTest {
         public Traversal<Vertex, Map<String, Long>> get_g_V_groupXaX_byXname_substring_1X_byXconstantX1XX_capXaX() {
             return g.V().<String, Long>group("a").<Vertex>by(v -> v.<String>value("name").substring(0, 1)).by(constant(1l)).cap("a");
         }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_withSideEffectXm__marko_1_peter_4X_V_groupXmX_byXnameX_byXconstantX1X_sumX_capXmX() {
+            final Map<String, Long> map = new HashMap<>();
+            map.put("marko", 1l);
+            map.put("peter", 4l);
+            return g.withSideEffect("m", map).V().group("m").by("name").by(constant(1).sum()).cap("m");
+        }
     }
 }