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/02/23 01:21:53 UTC
incubator-tinkerpop git commit: Fixed a bug in FoldStep,
got GroupStep working perfectly (both OLTP and OLAP -- but there is
still one awakward hack). Need to spend some more cycles on GroupStep and
then once I get that clean, clean, clean, I will map th
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/TINKERPOP-1166 338912259 -> 9f8252b81
Fixed a bug in FoldStep, got GroupStep working perfectly (both OLTP and OLAP -- but there is still one awakward hack). Need to spend some more cycles on GroupStep and then once I get that clean, clean, clean, I will map that pattern over to GroupStepV3d0 and that will be that.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/9f8252b8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/9f8252b8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/9f8252b8
Branch: refs/heads/TINKERPOP-1166
Commit: 9f8252b816432249a0667e654b682293b77ec3c1
Parents: 3389122
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Feb 22 17:21:48 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Feb 22 17:21:48 2016 -0700
----------------------------------------------------------------------
.../process/traversal/step/map/FoldStep.java | 28 ++++----
.../traversal/step/map/GroupCountStep.java | 14 ++--
.../process/traversal/step/map/GroupStep.java | 68 +++++++++++++++-----
3 files changed, 77 insertions(+), 33 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9f8252b8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
index ca45767..d9dec06 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
@@ -25,7 +25,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequire
import org.apache.tinkerpop.gremlin.util.function.ArrayListSupplier;
import java.io.Serializable;
-import java.util.Collections;
+import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
@@ -39,23 +39,33 @@ import java.util.function.Supplier;
public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> {
private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
+ private final boolean listFold;
public FoldStep(final Traversal.Admin traversal) {
this(traversal, (Supplier) ArrayListSupplier.instance(), (BiFunction) new ListBiOperator<>());
}
- @Override
- public E projectTraverser(final Traverser.Admin<S> traverser) {
- return (E) Collections.singletonList(traverser.get());
- }
-
public FoldStep(final Traversal.Admin traversal, final Supplier<E> seed, final BiFunction<E, S, E> foldFunction) {
super(traversal);
+ this.listFold = foldFunction instanceof ListBiOperator;
this.setSeedSupplier(seed);
this.setReducingBiOperator(new FoldBiOperator<>(foldFunction));
}
@Override
+ public E projectTraverser(final Traverser.Admin<S> traverser) {
+ if (this.listFold) {
+ final List<S> list = new ArrayList<>();
+ for (long i = 0; i < traverser.bulk(); i++) {
+ list.add(traverser.get());
+ }
+ return (E) list;
+ } else {
+ return (E) traverser.get();
+ }
+ }
+
+ @Override
public Set<TraverserRequirement> getRequirements() {
return REQUIREMENTS;
}
@@ -63,18 +73,14 @@ public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> {
/////////
private static class ListBiOperator<S> implements BinaryOperator<List<S>>, Serializable {
-
@Override
public List<S> apply(final List<S> mutatingSeed, final List<S> list) {
mutatingSeed.addAll(list);
return mutatingSeed;
}
-
}
- ///////
-
- public static class FoldBiOperator<E> implements BinaryOperator<E>, Serializable {
+ private static class FoldBiOperator<E> implements BinaryOperator<E>, Serializable {
private final BiFunction biFunction;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9f8252b8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
index e669bca..966d17a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
@@ -42,7 +42,7 @@ import java.util.function.BinaryOperator;
*/
public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Long>> implements TraversalParent, ByModulating {
- private Traversal.Admin<S, E> groupTraversal = null;
+ private Traversal.Admin<S, E> keyTraversal = null;
public GroupCountStep(final Traversal.Admin traversal) {
super(traversal);
@@ -53,17 +53,17 @@ public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Lo
@Override
public void modulateBy(final Traversal.Admin<?, ?> keyTraversal) {
- this.groupTraversal = this.integrateChild(keyTraversal);
+ this.keyTraversal = this.integrateChild(keyTraversal);
}
@Override
public List<Traversal.Admin<S, E>> getLocalChildren() {
- return null == this.groupTraversal ? Collections.emptyList() : Collections.singletonList(this.groupTraversal);
+ return null == this.keyTraversal ? Collections.emptyList() : Collections.singletonList(this.keyTraversal);
}
public Map<E, Long> projectTraverser(final Traverser.Admin<S> traverser) {
final Map<E, Long> map = new HashMap<>(); // TODO: make singleton map
- map.put(TraversalUtil.applyNullable(traverser, this.groupTraversal), traverser.bulk());
+ map.put(TraversalUtil.applyNullable(traverser, this.keyTraversal), traverser.bulk());
return map;
}
@@ -75,8 +75,8 @@ public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Lo
@Override
public GroupCountStep<S, E> clone() {
final GroupCountStep<S, E> clone = (GroupCountStep<S, E>) super.clone();
- if (null != this.groupTraversal)
- clone.groupTraversal = clone.integrateChild(this.groupTraversal.clone());
+ if (null != this.keyTraversal)
+ clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
return clone;
}
@@ -91,7 +91,7 @@ public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Lo
@Override
public String toString() {
- return StringFactory.stepString(this, this.groupTraversal);
+ return StringFactory.stepString(this, this.keyTraversal);
}
///////////
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9f8252b8/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 1051c01..35d0acd 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
@@ -18,11 +18,11 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
-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.step.ByModulating;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.GroupStepHelper;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
@@ -39,11 +39,12 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.BinaryOperator;
+import java.util.function.Supplier;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>> implements TraversalParent, ByModulating {
+public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>> implements TraversalParent, GraphComputing, ByModulating {
private char state = 'k';
@@ -52,25 +53,33 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>>
private Traversal.Admin<?, V> reduceTraversal = this.integrateChild(__.fold().asAdmin()); // used in OLAP
private Traversal.Admin<S, V> valueReduceTraversal = this.integrateChild(__.fold().asAdmin()); // used in OLTP
+ private boolean onComputer = false;
+
public GroupStep(final Traversal.Admin traversal) {
super(traversal);
- this.setSeedSupplier(HashMapSupplier.instance());
- this.setReducingBiOperator(new GroupBiOperator<>());
+ this.setSeedSupplier((Supplier) new GroupStepHelper.GroupMapSupplier());
+ this.setReducingBiOperator(new GroupStandardBiOperator<>(this));
}
@Override
public Map<K, V> projectTraverser(final Traverser.Admin<S> traverser) {
- final K key = TraversalUtil.applyNullable(traverser, this.keyTraversal);
- this.valueTraversal.addStart(traverser);
- final TraverserSet<?> value = new TraverserSet<>();
- this.valueTraversal.forEachRemaining(t -> {
- Traverser.Admin x = traverser.split(t, (Step) this);
- x.setBulk(1l);
- value.add(x);
- });
- final Map<K, V> map = new HashMap<>();
- map.put(key, (V) value);
- return map;
+ if(this.onComputer) {
+ final K key = TraversalUtil.applyNullable(traverser, this.keyTraversal);
+ this.valueTraversal.reset();
+ this.valueTraversal.addStart(traverser);
+ final TraverserSet traverserSet = new TraverserSet();
+ this.valueTraversal.getEndStep().forEachRemaining(t -> traverserSet.add(t.asAdmin()));
+ final Map<K, V> map = new HashMap<>();
+ map.put(key, (V) traverserSet);
+ return map;
+ } else {
+ final K key = TraversalUtil.applyNullable(traverser, this.keyTraversal);
+ final TraverserSet traverserSet = new TraverserSet();
+ traverserSet.add(traverser);
+ final Map<K, V> map = new HashMap<>();
+ map.put(key, (V) traverserSet);
+ return map;
+ }
}
@Override
@@ -139,6 +148,13 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>>
return reducedMap;
}
+ @Override
+ public void onGraphComputer() {
+ this.onComputer = true;
+ this.setSeedSupplier(HashMapSupplier.instance());
+ this.setReducingBiOperator(new GroupBiOperator<>());
+ }
+
///////////
private static class GroupBiOperator<S, K, V> implements BinaryOperator<Map<K, V>>, Serializable {
@@ -159,4 +175,26 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>>
return mutatingSeed;
}
}
+
+ private static class GroupStandardBiOperator<S, K, V> implements BinaryOperator<Map<K, V>>, Serializable {
+
+ private final GroupStep groupStep;
+
+ private GroupStandardBiOperator(final GroupStep groupStep) {
+ this.groupStep = groupStep;
+ }
+
+ @Override
+ public Map<K, V> apply(final Map<K, V> mutatingSeed, final Map<K, V> map) {
+ for (final K key : map.keySet()) {
+ Traversal.Admin reduce = (Traversal.Admin) mutatingSeed.get(key);
+ if (null == reduce) {
+ reduce = this.groupStep.valueReduceTraversal.clone();
+ mutatingSeed.put(key, (V) reduce);
+ }
+ ((TraverserSet<?>) map.get(key)).forEach(reduce::addStart);
+ }
+ return mutatingSeed;
+ }
+ }
}
\ No newline at end of file