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/02/18 23:21:57 UTC
incubator-tinkerpop git commit: Count and Max are now MapReducers
proper.
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/reducingbarrier a949e6125 -> b2871597c
Count and Max are now MapReducers proper.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/b2871597
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/b2871597
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/b2871597
Branch: refs/heads/reducingbarrier
Commit: b2871597c361fc81fa5075705cd36efba3d271b5
Parents: a949e61
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Feb 18 15:21:58 2015 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Feb 18 15:21:58 2015 -0700
----------------------------------------------------------------------
.../traversal/step/map/ComputerResultStep.java | 2 +-
.../traversal/step/filter/DedupGlobalStep.java | 11 +--
.../traversal/step/map/CountGlobalStep.java | 33 ++++-----
.../graph/traversal/step/map/FoldStep.java | 27 ++++---
.../graph/traversal/step/map/MaxGlobalStep.java | 58 +++++++++++++--
.../traversal/step/map/MeanGlobalStep.java | 8 +--
.../graph/traversal/step/map/MinGlobalStep.java | 8 +--
.../graph/traversal/step/map/SumGlobalStep.java | 8 +--
.../step/util/ReducingBarrierStep.java | 59 +++++++---------
.../process/traversal/step/Reducing.java | 74 --------------------
10 files changed, 116 insertions(+), 172 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
index eb86435..4c0fe83 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
@@ -106,7 +106,7 @@ public final class ComputerResultStep<S> extends AbstractStep<S, S> {
this.traversers = IteratorUtils.of(this.getTraversal().getTraverserGenerator().generate((S) sideEffects, this, 1l));
}
} else if (endStep instanceof ReducingBarrierStep) {
- this.traversers = result.memory().get(Graph.Hidden.hide("reducingBarrier"));
+ this.traversers = result.memory().get(ReducingBarrierStep.REDUCING);
} else {
this.traversers = result.memory().get(TraverserMapReduce.TRAVERSERS);
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java
index b4950be..0476353 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter;
import org.apache.tinkerpop.gremlin.process.Traversal;
import org.apache.tinkerpop.gremlin.process.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
import org.apache.tinkerpop.gremlin.process.traversal.step.Reversible;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -36,7 +35,7 @@ import java.util.Set;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class DedupGlobalStep<S> extends FilterStep<S> implements Reversible, Reducing<Set<Object>, S>, TraversalParent {
+public final class DedupGlobalStep<S> extends FilterStep<S> implements Reversible, TraversalParent {
private Traversal.Admin<S, Object> dedupTraversal = new IdentityTraversal<>();
private Set<Object> duplicateSet = new HashSet<>();
@@ -63,14 +62,6 @@ public final class DedupGlobalStep<S> extends FilterStep<S> implements Reversibl
}
@Override
- public Reducer<Set<Object>, S> getReducer() {
- return new Reducer<>(HashSet::new, (set, start) -> {
- set.add(TraversalUtil.apply(start, this.dedupTraversal));
- return set;
- }, false, true);
- }
-
- @Override
public DedupGlobalStep<S> clone() throws CloneNotSupportedException {
final DedupGlobalStep<S> clone = (DedupGlobalStep<S>) super.clone();
clone.duplicateSet = new HashSet<>();
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java
index 62c714f..28e413d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java
@@ -27,10 +27,8 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexPr
import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
@@ -44,7 +42,7 @@ import java.util.function.BiFunction;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> implements Reducing<Long, Traverser<S>>, MapReducer {
+public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> implements MapReducer {
private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.BULK);
@@ -61,13 +59,8 @@ public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> imple
}
@Override
- public Reducer<Long, Traverser<S>> getReducer() {
- return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true, true);
- }
-
- @Override
- public MapReduce<MapReduce.NullObject, Long, MapReduce.NullObject, Long, Long> getMapReduce() {
- return (MapReduce) new CountMapReduce();
+ public MapReduce<MapReduce.NullObject, Long, MapReduce.NullObject, Long, Iterator<Traverser.Admin<Long>>> getMapReduce() {
+ return new CountMapReduce();
}
///////////
@@ -100,16 +93,6 @@ public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> imple
}
@Override
- public String getMemoryKey() {
- return Graph.Hidden.hide("reducingBarrier");
- }
-
- @Override
- public Iterator<Traverser.Admin<Long>> generateFinalResult(final Iterator<KeyValue<NullObject, Long>> keyValues) {
- return IteratorUtils.of(getTraversal().getTraverserGenerator().generate(keyValues.hasNext() ? keyValues.next().getValue() : 0L, (Step) CountGlobalStep.this, 1L));
- }
-
- @Override
public void map(final Vertex vertex, final MapEmitter<NullObject, Long> emitter) {
vertex.<TraverserSet<?>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.bulk())));
}
@@ -127,6 +110,16 @@ public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> imple
}
emitter.emit(count);
}
+
+ @Override
+ public String getMemoryKey() {
+ return REDUCING;
+ }
+
+ @Override
+ public Iterator<Traverser.Admin<Long>> generateFinalResult(final Iterator<KeyValue<NullObject, Long>> keyValues) {
+ return IteratorUtils.of(getTraversal().getTraverserGenerator().generate(keyValues.hasNext() ? keyValues.next().getValue() : 0L, (Step) CountGlobalStep.this, 1L));
+ }
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
index fb2dfbf..885c2fe 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.Traversal;
import org.apache.tinkerpop.gremlin.process.Traverser;
import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.util.function.ArrayListSupplier;
@@ -35,7 +34,7 @@ import java.util.function.Supplier;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> implements Reducing<E, S> {
+public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> {
private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
@@ -46,12 +45,7 @@ public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> implements R
public FoldStep(final Traversal.Admin traversal, final Supplier<E> seed, final BiFunction<E, S, E> foldFunction) {
super(traversal);
this.setSeedSupplier(seed);
- this.setBiFunction(new ObjectBiFunction<>(foldFunction));
- }
-
- @Override
- public Reducer<E, S> getReducer() {
- return new Reducer<>(this.getSeedSupplier(), ((ObjectBiFunction<S, E>) this.getBiFunction()).getBiFunction(), false, false);
+ this.setBiFunction(new FoldBiFunction<>(foldFunction));
}
@Override
@@ -79,4 +73,21 @@ public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> implements R
return INSTANCE;
}
}
+
+ ///////
+
+ public static class FoldBiFunction<S, E> implements BiFunction<E, Traverser<S>, E>, Serializable {
+
+ private final BiFunction<E, S, E> biFunction;
+
+ public FoldBiFunction(final BiFunction<E, S, E> biFunction) {
+ this.biFunction = biFunction;
+ }
+
+ @Override
+ public E apply(final E seed, final Traverser<S> traverser) {
+ return this.biFunction.apply(seed, traverser.get());
+ }
+
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java
index 1765340..0cfb574 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java
@@ -18,22 +18,31 @@
*/
package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map;
+import org.apache.tinkerpop.gremlin.process.Step;
import org.apache.tinkerpop.gremlin.process.Traversal;
import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import java.io.Serializable;
import java.util.Collections;
+import java.util.Iterator;
import java.util.Set;
import java.util.function.BiFunction;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> implements Reducing<S, Traverser<S>> {
+public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> implements MapReducer {
public MaxGlobalStep(final Traversal.Admin traversal) {
super(traversal);
@@ -47,8 +56,8 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
}
@Override
- public Reducer<S, Traverser<S>> getReducer() {
- return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true, true);
+ public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Iterator<Traverser.Admin<Number>>> getMapReduce() {
+ return new MaxMapReduce();
}
/////
@@ -70,4 +79,45 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
return INSTANCE;
}
}
+
+ ///////////
+
+ private class MaxMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Iterator<Traverser.Admin<Number>>> {
+
+ @Override
+ public boolean doStage(final MapReduce.Stage stage) {
+ return true;
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<NullObject, Number> emitter) {
+ vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get())));
+ }
+
+ @Override
+ public void combine(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
+ this.reduce(key, values, emitter);
+ }
+
+ @Override
+ public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
+ Number max = -Double.MAX_VALUE;
+ while (values.hasNext()) {
+ final Number value = values.next();
+ if (value.doubleValue() > max.doubleValue())
+ max = value;
+ }
+ emitter.emit(max);
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return REDUCING;
+ }
+
+ @Override
+ public Iterator<Traverser.Admin<Number>> generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
+ return IteratorUtils.of(getTraversal().getTraverserGenerator().generate(keyValues.hasNext() ? keyValues.next().getValue() : -Double.MAX_VALUE, (Step) MaxGlobalStep.this, 1L));
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java
index 4e656a2..f9c8a05 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.Traversal;
import org.apache.tinkerpop.gremlin.process.Traverser;
import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.util.function.MeanNumberSupplier;
@@ -34,7 +33,7 @@ import java.util.function.Supplier;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class MeanGlobalStep<S extends Number, E extends Number> extends ReducingBarrierStep<S, E> implements Reducing<E, Traverser<S>> {
+public final class MeanGlobalStep<S extends Number, E extends Number> extends ReducingBarrierStep<S, E> {
private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT, TraverserRequirement.BULK);
@@ -49,11 +48,6 @@ public final class MeanGlobalStep<S extends Number, E extends Number> extends Re
return REQUIREMENTS;
}
- @Override
- public Reducer<E, Traverser<S>> getReducer() {
- return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), false, true);
- }
-
/////
private static class MeanBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java
index 1c190cb..876717d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.Traversal;
import org.apache.tinkerpop.gremlin.process.Traverser;
import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
@@ -33,7 +32,7 @@ import java.util.function.BiFunction;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> implements Reducing<S, Traverser<S>> {
+public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> {
public MinGlobalStep(final Traversal.Admin traversal) {
super(traversal);
@@ -46,11 +45,6 @@ public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S
return Collections.singleton(TraverserRequirement.OBJECT);
}
- @Override
- public Reducer<S, Traverser<S>> getReducer() {
- return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true, true);
- }
-
/////
private static class MinBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java
index be8f4e3..1f2842b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.Traversal;
import org.apache.tinkerpop.gremlin.process.Traverser;
import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
@@ -33,7 +32,7 @@ import java.util.function.BiFunction;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class SumGlobalStep extends ReducingBarrierStep<Number, Double> implements Reducing<Double, Traverser<Number>> {
+public final class SumGlobalStep extends ReducingBarrierStep<Number, Double> {
private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
TraverserRequirement.BULK,
@@ -52,11 +51,6 @@ public final class SumGlobalStep extends ReducingBarrierStep<Number, Double> imp
return REQUIREMENTS;
}
- @Override
- public Reducer<Double, Traverser<Number>> getReducer() {
- return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true, true);
- }
-
/////
private static class SumBiFunction<S extends Number> implements BiFunction<Double, Traverser<S>, Double>, Serializable {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java
index 9e1ab48..a861b27 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java
@@ -28,7 +28,6 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexPr
import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -36,6 +35,7 @@ import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import java.io.Serializable;
+import java.util.Collections;
import java.util.Iterator;
import java.util.function.BiFunction;
import java.util.function.Supplier;
@@ -45,10 +45,12 @@ import java.util.function.Supplier;
*/
public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> implements MapReducer {
+ public static final String REDUCING = Graph.Hidden.hide("reducing");
+
private Supplier<E> seedSupplier;
private BiFunction<E, Traverser<S>, E> reducingBiFunction;
private boolean done = false;
- private boolean byPass =false;
+ private boolean byPass = false;
public ReducingBarrierStep(final Traversal.Admin traversal) {
super(traversal);
@@ -82,8 +84,8 @@ public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> imple
@Override
public Traverser<E> processNextStart() {
- if(this.byPass) {
- return (Traverser<E>) this.starts.next();
+ if (this.byPass) {
+ return (Traverser<E>) this.starts.next();
} else {
if (this.done)
throw FastNoSuchElementException.instance();
@@ -91,7 +93,7 @@ public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> imple
while (this.starts.hasNext())
seed = this.reducingBiFunction.apply(seed, this.starts.next());
this.done = true;
- return TraversalHelper.getRootTraversal(this.getTraversal()).getTraverserGenerator().generate(Reducing.FinalGet.tryFinalGet(seed), (Step) this, 1l);
+ return TraversalHelper.getRootTraversal(this.getTraversal()).getTraverserGenerator().generate(FinalGet.tryFinalGet(seed), (Step) this, 1l);
}
}
@@ -109,28 +111,7 @@ public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> imple
///////
- public static class ObjectBiFunction<S, E> implements BiFunction<E, Traverser<S>, E>, Serializable {
-
- private final BiFunction<E, S, E> biFunction;
-
- public ObjectBiFunction(final BiFunction<E, S, E> biFunction) {
- this.biFunction = biFunction;
- }
-
- public final BiFunction<E, S, E> getBiFunction() {
- return this.biFunction;
- }
-
- @Override
- public E apply(final E seed, final Traverser<S> traverser) {
- return this.biFunction.apply(seed, traverser.get());
- }
-
- }
-
- ///////
-
- public class DefaultMapReduce extends StaticMapReduce {
+ public class DefaultMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Object> {
@Override
public boolean doStage(Stage stage) {
@@ -139,31 +120,41 @@ public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> imple
@Override
public String getMemoryKey() {
- return Graph.Hidden.hide("reducingBarrier");
+ return REDUCING;
}
@Override
public Object generateFinalResult(final Iterator keyValues) {
- return IteratorUtils.of(((KeyValue) keyValues.next()).getValue());
+ return keyValues.hasNext() ? IteratorUtils.of(((KeyValue) keyValues.next()).getValue()) : Collections.emptyIterator();
}
@Override
- public void map(final Vertex vertex, final MapEmitter emitter) {
+ public void map(final Vertex vertex, final MapEmitter<NullObject, Object> emitter) {
vertex.<TraverserSet<?>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(emitter::emit));
}
@Override
- public void reduce(final Object key, final Iterator values, final ReduceEmitter emitter) {
+ public void reduce(final NullObject key, final Iterator<Object> values, final ReduceEmitter<NullObject, Object> emitter) {
Object mutatingSeed = getSeedSupplier().get();
final BiFunction function = getBiFunction();
- final boolean onTraverser = true;
while (values.hasNext()) {
- mutatingSeed = function.apply(mutatingSeed, onTraverser ? values.next() : ((Traverser) values.next()).get());
+ mutatingSeed = function.apply(mutatingSeed, values.next());
}
- emitter.emit(key, getTraversal().getTraverserGenerator().generate(Reducing.FinalGet.tryFinalGet(mutatingSeed), (Step) getTraversal().getEndStep(), 1l));
+ emitter.emit(getTraversal().getTraverserGenerator().generate(FinalGet.tryFinalGet(mutatingSeed), (Step) getTraversal().getEndStep(), 1l));
}
}
+ /////
+
+ 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/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Reducing.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Reducing.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Reducing.java
deleted file mode 100644
index 16e62b1..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Reducing.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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;
-
-import java.io.Serializable;
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface Reducing<A, B> {
-
- public Reducer<A, B> getReducer();
-
- //////////
-
- public class Reducer<A, B> implements Serializable {
- private final Supplier<A> seedSupplier;
- private final BiFunction<A, B, A> biFunction;
- private final boolean onTraverser;
- private final boolean supportsCombiner;
-
- public Reducer(final Supplier<A> seedSupplier, final BiFunction<A, B, A> biFunction, final boolean supportsCombiner, final boolean onTraverser) {
- this.seedSupplier = seedSupplier;
- this.biFunction = biFunction;
- this.supportsCombiner = supportsCombiner;
- this.onTraverser = onTraverser;
- }
-
- public Supplier<A> getSeedSupplier() {
- return this.seedSupplier;
- }
-
- public BiFunction<A, B, A> getBiFunction() {
- return this.biFunction;
- }
-
- public boolean supportsCombiner() {
- return this.supportsCombiner;
- }
-
- public boolean onTraverser() {
- return this.onTraverser;
- }
- }
-
- //////////
-
- 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;
- }
- }
-}