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");
+ }
}
}