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 2015/10/07 23:14:10 UTC
[06/19] incubator-tinkerpop git commit: Figured out how to do
by('name') by wrapping in a map(ElementValueFunction). I'm done for the day.
Tomorrow I will finish up the conversion as well as include GroupStepV3d0
test cases and we will have the new group
Figured out how to do by('name') by wrapping in a map(ElementValueFunction). I'm done for the day. Tomorrow I will finish up the conversion as well as include GroupStepV3d0 test cases and we will have the new group()-lazy reduction model complete.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/60b19ed8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/60b19ed8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/60b19ed8
Branch: refs/heads/master
Commit: 60b19ed8a71fb1da29accc3e38638759d9c921c5
Parents: da2477b
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Oct 5 17:20:09 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Oct 5 17:20:09 2015 -0600
----------------------------------------------------------------------
.../process/traversal/step/map/GroupStep.java | 24 ++++++++-------
.../traversal/step/map/GroupStepV3d0.java | 1 +
.../traversal/step/map/MeanGlobalStep.java | 1 +
.../step/sideEffect/GroupSideEffectStep.java | 21 +++++++------
.../step/sideEffect/SideEffectCapStep.java | 13 +++-----
.../process/traversal/step/util/FinalGet.java | 32 ++++++++++++++++++++
.../step/util/ReducingBarrierStep.java | 12 --------
.../traversal/step/sideEffect/GroupTest.java | 5 ++-
8 files changed, 66 insertions(+), 43 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60b19ed8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
index a06e251..0b04cfb 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
@@ -26,9 +26,11 @@ import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.BarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.FinalGet;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
@@ -41,7 +43,6 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
import java.io.Serializable;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -83,7 +84,7 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>>
this.keyTraversal = this.integrateChild(kvrTraversal);
this.state = 'v';
} else if ('v' == this.state) {
- this.valueTraversal = this.integrateChild(kvrTraversal);
+ this.valueTraversal = this.integrateChild(kvrTraversal instanceof ElementValueTraversal ? ((Traversal.Admin) __.map(kvrTraversal).fold()) : kvrTraversal);
this.state = 'x';
} else {
throw new IllegalStateException("The key and value traversals for group()-step have already been set: " + this);
@@ -124,7 +125,9 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>>
public Traverser<Map<K, V>> processNextStart() {
if (this.byPass) {
final Traverser.Admin<S> traverser = this.starts.next();
- final Object[] kvPair = new Object[]{TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map>) this.keyTraversal), traverser.get()};
+ final Traverser.Admin<S> traverserSplit = traverser.split();
+ traverserSplit.setBulk(1l);
+ final Object[] kvPair = new Object[]{TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map>) this.keyTraversal), traverserSplit};
return traverser.asAdmin().split(kvPair, (Step) this);
} else {
return super.processNextStart();
@@ -185,7 +188,7 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>>
///////////
- public static final class GroupMapReduce<S, K, V> implements MapReduce<K, S, K, V, Map<K, V>> {
+ public static final class GroupMapReduce<S, K, V> implements MapReduce<K, Traverser<S>, K, V, Map<K, V>> {
public static final String GROUP_BY_STEP_STEP_ID = "gremlin.groupStep.stepId";
@@ -219,19 +222,18 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>>
}
@Override
- public void map(final Vertex vertex, final MapEmitter<K, S> emitter) {
+ public void map(final Vertex vertex, final MapEmitter<K, Traverser<S>> emitter) {
vertex.<TraverserSet<Object[]>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> {
final Object[] objects = traverser.get();
- emitter.emit((K) objects[0], (S) objects[1]);
-
+ emitter.emit((K) objects[0], (Traverser<S>) objects[1]);
}));
}
@Override
- public void reduce(final K key, final Iterator<S> values, final ReduceEmitter<K, V> emitter) {
- Traversal.Admin<S, V> reduceTraversalClone = this.valueTraversal.clone();
- reduceTraversalClone.addStarts(reduceTraversalClone.getTraverserGenerator().generateIterator((Iterator)values, reduceTraversalClone.getStartStep(), 1l));
- emitter.emit(key, reduceTraversalClone.next());
+ public void reduce(final K key, final Iterator<Traverser<S>> values, final ReduceEmitter<K, V> emitter) {
+ Traversal.Admin<S, V> valueTraversalClone = this.valueTraversal.clone();
+ valueTraversalClone.addStarts(values);
+ emitter.emit(key, valueTraversalClone.next());
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60b19ed8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStepV3d0.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStepV3d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStepV3d0.java
index 8313916..0c338eb 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStepV3d0.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStepV3d0.java
@@ -32,6 +32,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.FinalGet;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMatrix;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60b19ed8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
index 7f2b39d..66092a5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
@@ -28,6 +28,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierS
import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.FinalGet;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.util.function.MeanNumberSupplier;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60b19ed8/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 7f90db7..0701b82 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
@@ -27,13 +27,14 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.BarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.FinalGet;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMatrix;
@@ -63,12 +64,12 @@ public final class GroupSideEffectStep<S, K, V> extends SideEffectStep<S> implem
private Traversal.Admin<S, V> valueTraversal = this.integrateChild((Traversal.Admin) __.<V>fold().asAdmin());
private String sideEffectKey;
private boolean onGraphComputer = false;
+ private FinalGroupMap<S, K, V> finalGroupMap;
public GroupSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
super(traversal);
this.sideEffectKey = sideEffectKey;
- final FinalGroupMap<S, K, V> finalGroupMap = new FinalGroupMap<>(new HashMap<>());
- this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, () -> finalGroupMap); // HashMapSupplier.instance());
+ this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
}
@Override
@@ -83,8 +84,12 @@ public final class GroupSideEffectStep<S, K, V> extends SideEffectStep<S> implem
}
values.add(traverser);
} else {
- final FinalGroupMap<S, K, V> finalGroupMap = traverser.sideEffects(this.sideEffectKey); // for nested traversals and not !starts.hasNext()
- final Map<K, Traversal.Admin<S, V>> groupMap = finalGroupMap.get();
+ if (null == this.finalGroupMap) {
+ final Object object = traverser.sideEffects(this.sideEffectKey);
+ if (!(object instanceof FinalGroupMap))
+ traverser.sideEffects(this.sideEffectKey, this.finalGroupMap = new FinalGroupMap<>((Map) object));
+ }
+ final Map<K, Traversal.Admin<S, V>> groupMap = this.finalGroupMap.get();
final K key = TraversalUtil.applyNullable(traverser, this.keyTraversal);
Traversal.Admin<S, V> traversal = groupMap.get(key);
if (null == traversal) {
@@ -106,8 +111,6 @@ public final class GroupSideEffectStep<S, K, V> extends SideEffectStep<S> implem
@Override
public void onEngine(final TraversalEngine traversalEngine) {
this.onGraphComputer = traversalEngine.isComputer();
- if (this.onGraphComputer)
- this.traversal.asAdmin().getSideEffects().registerSupplier(this.sideEffectKey, HashMapSupplier.instance());
}
@Override
@@ -136,7 +139,7 @@ public final class GroupSideEffectStep<S, K, V> extends SideEffectStep<S> implem
this.keyTraversal = this.integrateChild(kvrTraversal);
this.state = 'v';
} else if ('v' == this.state) {
- this.valueTraversal = this.integrateChild(kvrTraversal);
+ this.valueTraversal = this.integrateChild(kvrTraversal instanceof ElementValueTraversal ? ((Traversal.Admin) __.map(kvrTraversal).fold()) : kvrTraversal);
this.state = 'x';
} else {
throw new IllegalStateException("The key and value traversals for group()-step have already been set");
@@ -168,7 +171,7 @@ public final class GroupSideEffectStep<S, K, V> extends SideEffectStep<S> implem
///////////
- public static class FinalGroupMap<S, K, V> implements ReducingBarrierStep.FinalGet<Map<K, V>>, Serializable {
+ public static class FinalGroupMap<S, K, V> implements FinalGet<Map<K, V>>, Serializable {
private final Map<K, Traversal.Admin<S, V>> mapTraversal;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60b19ed8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java
index e80bae2..a784bfd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java
@@ -19,9 +19,9 @@
package org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.SupplyingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.FinalGet;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
import java.util.ArrayList;
@@ -72,18 +72,15 @@ public final class SideEffectCapStep<S, E> extends SupplyingBarrierStep<S, E> {
@Override
protected E supply() {
- if (this.sideEffectKeys.size() == 1) {
- final Object object = this.getTraversal().getSideEffects().<E>get(this.sideEffectKeys.get(0)).get();
- return (E) (object instanceof ReducingBarrierStep.FinalGet ? ((ReducingBarrierStep.FinalGet) object).getFinal() : object);
- } else {
- return (E) this.getMapOfSideEffects();
- }
+ return this.sideEffectKeys.size() == 1 ?
+ FinalGet.tryFinalGet(this.getTraversal().asAdmin().getSideEffects().<E>get(this.sideEffectKeys.get(0)).get()) :
+ (E) this.getMapOfSideEffects();
}
public Map<String, Object> getMapOfSideEffects() {
final Map<String, Object> sideEffects = new HashMap<>();
for (final String sideEffectKey : this.sideEffectKeys) {
- this.getTraversal().asAdmin().getSideEffects().get(sideEffectKey).ifPresent(value -> sideEffects.put(sideEffectKey, value instanceof ReducingBarrierStep.FinalGet ? ((ReducingBarrierStep.FinalGet) value).getFinal() : value));
+ this.getTraversal().asAdmin().getSideEffects().get(sideEffectKey).ifPresent(value -> sideEffects.put(sideEffectKey, FinalGet.tryFinalGet(value)));
}
return sideEffects;
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60b19ed8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/FinalGet.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/FinalGet.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/FinalGet.java
new file mode 100644
index 0000000..2d0efbe
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/FinalGet.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.step.util;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface FinalGet<A> {
+
+ public A getFinal();
+
+ public static <A> A tryFinalGet(final Object object) {
+ return object instanceof FinalGet ? ((FinalGet<A>) object).getFinal() : (A) object;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60b19ed8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java
index ce3bc4c..bb7d523 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java
@@ -177,16 +177,4 @@ public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> imple
emitter.emit(FinalGet.tryFinalGet(mutatingSeed));
}
}
-
- /////
-
- public interface FinalGet<A> {
-
- public A getFinal();
-
- public static <A> A tryFinalGet(final Object object) {
- return object instanceof FinalGet ? ((FinalGet<A>) object).getFinal() : (A) object;
- }
- }
-
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60b19ed8/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 e36745f..45b3a11 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,6 @@ 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.traversal.Scope;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Test;
@@ -162,7 +161,7 @@ public abstract class GroupTest extends AbstractGremlinProcessTest {
@Override
public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
- return g.V().has("lang").group("a").by("lang").by(values("name").fold()).out().cap("a");
+ return g.V().has("lang").group("a").by("lang").by("name").out().cap("a");
}
@Override
@@ -177,7 +176,7 @@ public abstract class GroupTest extends AbstractGremlinProcessTest {
@Override
public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
- return g.V().<Long, Collection<String>>group().by(outE().count()).by(values("name").fold());
+ return g.V().<Long, Collection<String>>group().by(outE().count()).by("name");
}
}
}