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/12 00:13:19 UTC
[3/3] incubator-tinkerpop git commit: INSANE COMMIT HERE ---
Traversals are now fully serializable as all lambda references have been
gutted -- back to Java7 :). What this means is that you can now
.submit(g.compute()) Gremlin-Java traversals across the
INSANE COMMIT HERE --- Traversals are now fully serializable as all lambda references have been gutted -- back to Java7 :). What this means is that you can now .submit(g.compute()) Gremlin-Java traversals across the wire -- e.g. Hadoop, GremlinServer, etc. No more relegating over the wire traversals to ScriptEngine-based languages. Boooooooo yea.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/af7eb283
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/af7eb283
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/af7eb283
Branch: refs/heads/master
Commit: af7eb28335bde563b8b1a87d4c1a153dc15f4197
Parents: 41999a8
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Feb 11 16:13:02 2015 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Feb 11 16:13:14 2015 -0700
----------------------------------------------------------------------
.../com/tinkerpop/gremlin/process/Step.java | 3 +-
.../tinkerpop/gremlin/process/Traversal.java | 5 +-
.../gremlin/process/TraversalSideEffects.java | 3 +-
.../gremlin/process/TraversalStrategies.java | 3 +-
.../gremlin/process/TraversalStrategy.java | 3 +-
.../computer/traversal/TraversalSupplier.java | 41 +++++++
.../traversal/TraversalVertexProgram.java | 18 ++--
.../process/computer/util/LambdaHolder.java | 27 ++---
.../computer/util/VertexProgramHelper.java | 24 +++--
.../graph/traversal/ElementTraversal.java | 8 ++
.../process/graph/traversal/GraphTraversal.java | 23 +++-
.../gremlin/process/graph/traversal/__.java | 8 ++
.../graph/traversal/step/branch/UnionStep.java | 4 +-
.../traversal/step/filter/LambdaFilterStep.java | 2 +-
.../graph/traversal/step/filter/SampleStep.java | 93 ++++++++--------
.../graph/traversal/step/map/CoalesceStep.java | 3 +-
.../graph/traversal/step/map/CountStep.java | 27 ++++-
.../graph/traversal/step/map/FlatMapStep.java | 5 +-
.../graph/traversal/step/map/FoldStep.java | 30 +++++-
.../graph/traversal/step/map/MaxStep.java | 29 ++++-
.../graph/traversal/step/map/MeanStep.java | 30 +++++-
.../graph/traversal/step/map/MinStep.java | 29 ++++-
.../traversal/step/map/OrderGlobalStep.java | 37 +++++--
.../graph/traversal/step/map/SumStep.java | 27 ++++-
.../step/sideEffect/AggregateStep.java | 35 +++---
.../traversal/step/sideEffect/GraphStep.java | 8 +-
.../step/sideEffect/GroupCountStep.java | 4 +-
.../traversal/step/sideEffect/GroupStep.java | 9 +-
.../traversal/step/sideEffect/InjectStep.java | 20 ++--
.../step/sideEffect/SideEffectCapStep.java | 17 +--
.../traversal/step/sideEffect/StoreStep.java | 4 +-
.../sideEffect/mapreduce/GroupMapReduce.java | 7 +-
.../step/util/CollectingBarrierStep.java | 12 +--
.../traversal/step/util/ComputerAwareStep.java | 3 +-
.../step/util/ReducingBarrierStep.java | 17 ++-
.../step/util/SupplyingBarrierStep.java | 11 +-
.../process/graph/util/HasContainer.java | 3 +-
.../process/traversal/DefaultTraversal.java | 2 -
.../gremlin/process/traversal/StepPosition.java | 4 +-
.../traversal/lambda/ConstantTraversal.java | 42 ++++++++
.../process/traversal/lambda/OneTraversal.java | 49 ---------
.../step/ElementFunctionComparator.java | 3 +-
.../traversal/step/ExpandableStepIterator.java | 3 +-
.../process/traversal/util/TraversalRing.java | 3 +-
.../traverser/TraverserGeneratorFactory.java | 4 +-
.../util/function/ArrayListSupplier.java | 42 ++++++++
.../gremlin/util/function/BulkSetSupplier.java | 43 ++++++++
.../util/function/CloningUnaryOperator.java | 49 +++++++++
.../gremlin/util/function/ConstantSupplier.java | 38 +++++++
.../gremlin/util/function/HashMapSupplier.java | 44 ++++++++
.../gremlin/util/function/HashSetSupplier.java | 42 ++++++++
.../util/function/MeanNumberSupplier.java | 47 ++++++++
.../gremlin/util/iterator/ArrayIterator.java | 3 +-
.../gremlin/util/iterator/DoubleIterator.java | 3 +-
.../gremlin/util/iterator/EmptyIterator.java | 49 +++++++++
.../gremlin/util/iterator/MultiIterator.java | 3 +-
.../gremlin/util/iterator/SingleIterator.java | 3 +-
.../step/branch/GroovyBranchTest.groovy | 13 ++-
.../step/branch/GroovyChooseTest.groovy | 40 +------
.../step/branch/GroovyRepeatTest.groovy | 60 -----------
.../step/branch/GroovyUnionTest.groovy | 16 +--
.../traversal/step/filter/GroovyHasTest.groovy | 10 --
.../step/filter/GroovyWhereTest.groovy | 8 +-
.../traversal/step/map/GroovyCountTest.groovy | 8 +-
.../traversal/step/map/GroovyOrderTest.groovy | 10 --
.../traversal/step/map/GroovyUnfoldTest.groovy | 12 +--
.../step/sideEffect/GroovyGroupCountTest.groovy | 8 +-
.../step/sideEffect/GroovyGroupTest.groovy | 21 ++--
.../step/sideEffect/GroovySackTest.groovy | 13 ++-
.../gremlin/groovy/loaders/StepLoader.groovy | 10 ++
.../gremlin/groovy/function/GComparator.java | 2 +-
.../gremlin/groovy/function/GFunction.java | 2 +-
.../gremlin/groovy/function/GSupplier.java | 53 +++++++++
.../gremlin/groovy/function/GUnaryOperator.java | 53 +++++++++
.../gremlin/process/ProcessComputerSuite.java | 2 +-
.../graph/traversal/step/branch/BranchTest.java | 19 ++--
.../graph/traversal/step/branch/ChooseTest.java | 107 -------------------
.../graph/traversal/step/branch/LocalTest.java | 2 +-
.../graph/traversal/step/branch/RepeatTest.java | 93 ----------------
.../graph/traversal/step/branch/UnionTest.java | 24 ++---
.../graph/traversal/step/filter/ExceptTest.java | 6 +-
.../graph/traversal/step/filter/FilterTest.java | 16 +--
.../graph/traversal/step/filter/HasTest.java | 21 ----
.../graph/traversal/step/filter/RetainTest.java | 2 +-
.../graph/traversal/step/filter/WhereTest.java | 12 +--
.../graph/traversal/step/map/CountTest.java | 12 +--
.../graph/traversal/step/map/FoldTest.java | 7 +-
.../graph/traversal/step/map/MapTest.java | 6 +-
.../graph/traversal/step/map/OrderTest.java | 41 ++-----
.../graph/traversal/step/map/UnfoldTest.java | 17 +--
.../step/sideEffect/GroupCountTest.java | 12 +--
.../traversal/step/sideEffect/GroupTest.java | 39 ++++---
.../traversal/step/sideEffect/SackTest.java | 11 +-
.../traversal/step/sideEffect/StoreTest.java | 9 +-
...HadoopGraphProcessComputerIntegrateTest.java | 32 ++++++
95 files changed, 1149 insertions(+), 788 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Step.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Step.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Step.java
index 6eb4f44..b197790 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Step.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Step.java
@@ -20,6 +20,7 @@ package com.tinkerpop.gremlin.process;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import java.io.Serializable;
import java.util.Collections;
import java.util.Iterator;
import java.util.Optional;
@@ -36,7 +37,7 @@ import java.util.Set;
* @param <S> The incoming object type of the step
* @param <E> The outgoing object type of the step
*/
-public interface Step<S, E> extends Iterator<Traverser<E>>, Cloneable {
+public interface Step<S, E> extends Iterator<Traverser<E>>, Serializable, Cloneable {
/**
* Add a iterator of {@link Traverser} objects of type S to the step.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Traversal.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Traversal.java
index cb42693..870c155 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Traversal.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/Traversal.java
@@ -32,6 +32,7 @@ import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
import com.tinkerpop.gremlin.process.util.BulkSet;
import com.tinkerpop.gremlin.structure.Graph;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
@@ -54,7 +55,7 @@ import java.util.stream.Collectors;
*
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface Traversal<S, E> extends Iterator<E>, Cloneable {
+public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
/**
* Used for reflection based access to the static "of" method of a Traversal.
@@ -80,7 +81,7 @@ public interface Traversal<S, E> extends Iterator<E>, Cloneable {
*/
public default Traversal<S, E> submit(final GraphComputer computer) {
try {
- final TraversalVertexProgram vertexProgram = TraversalVertexProgram.build().traversal(this::asAdmin).create();
+ final TraversalVertexProgram vertexProgram = TraversalVertexProgram.build().traversal(this.asAdmin()).create();
final ComputerResult result = computer.program(vertexProgram).submit().get();
final Traversal.Admin<S, S> traversal = new DefaultTraversal<>(result.graph().getClass());
return traversal.asAdmin().addStep(new ComputerResultStep<>(traversal, result, vertexProgram, true));
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalSideEffects.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalSideEffects.java
index 9653017..f44e287 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalSideEffects.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalSideEffects.java
@@ -20,6 +20,7 @@ package com.tinkerpop.gremlin.process;
import com.tinkerpop.gremlin.structure.Vertex;
+import java.io.Serializable;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiConsumer;
@@ -30,7 +31,7 @@ import java.util.function.UnaryOperator;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public interface TraversalSideEffects extends Cloneable {
+public interface TraversalSideEffects extends Cloneable, Serializable {
public static final String SIDE_EFFECTS = "gremlin.traversal.sideEffects";
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
index a9c7381..c5cf221 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
@@ -28,6 +28,7 @@ import com.tinkerpop.gremlin.structure.Vertex;
import com.tinkerpop.gremlin.structure.VertexProperty;
import com.tinkerpop.gremlin.util.tools.MultiMap;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -41,7 +42,7 @@ import java.util.Set;
* @author Marko A. Rodriguez (http://markorodriguez.com)
* @author Matthias Broecheler (me@matthiasb.com)
*/
-public interface TraversalStrategies extends Cloneable {
+public interface TraversalStrategies extends Serializable, Cloneable {
/**
* Return all the {@link TraversalStrategy} singleton instances associated with this {@link TraversalStrategies}.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategy.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategy.java
index 40b90d6..1ed0245 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategy.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategy.java
@@ -18,6 +18,7 @@
*/
package com.tinkerpop.gremlin.process;
+import java.io.Serializable;
import java.util.Collections;
import java.util.Set;
@@ -31,7 +32,7 @@ import java.util.Set;
* @author Marko A. Rodriguez (http://markorodriguez.com)
* @author Matthias Broecheler (me@matthiasb.com)
*/
-public interface TraversalStrategy {
+public interface TraversalStrategy extends Serializable{
// A TraversalStrategy should not have a public constructor
// Make use of a singleton instance() object to reduce object creation on the JVM
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
new file mode 100644
index 0000000..2e6f7ac
--- /dev/null
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
@@ -0,0 +1,41 @@
+/*
+ * 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 com.tinkerpop.gremlin.process.computer.traversal;
+
+import com.tinkerpop.gremlin.process.Traversal;
+
+import java.io.Serializable;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TraversalSupplier<S, E> implements Supplier<Traversal.Admin<S, E>>, Serializable {
+
+ private final Traversal.Admin<S, E> traversal;
+
+ public TraversalSupplier(final Traversal.Admin<S, E> traversal) {
+ this.traversal = traversal;
+ }
+
+ @Override
+ public Traversal.Admin<S, E> get() {
+ return this.traversal;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
index 0020c17..fd72c84 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
@@ -32,11 +32,11 @@ import com.tinkerpop.gremlin.process.computer.VertexProgram;
import com.tinkerpop.gremlin.process.computer.traversal.step.sideEffect.mapreduce.TraverserMapReduce;
import com.tinkerpop.gremlin.process.computer.util.AbstractVertexProgramBuilder;
import com.tinkerpop.gremlin.process.computer.util.LambdaHolder;
-import com.tinkerpop.gremlin.process.traversal.step.MapReducer;
import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapStep;
-import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import com.tinkerpop.gremlin.process.traversal.TraversalMatrix;
+import com.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import com.tinkerpop.gremlin.process.util.TraverserSet;
import com.tinkerpop.gremlin.structure.Direction;
import com.tinkerpop.gremlin.structure.Element;
@@ -46,7 +46,12 @@ import com.tinkerpop.gremlin.structure.util.StringFactory;
import com.tinkerpop.gremlin.util.iterator.IteratorUtils;
import org.apache.commons.configuration.Configuration;
-import java.util.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Optional;
+import java.util.Set;
import java.util.function.Supplier;
@@ -103,7 +108,8 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
throw new IllegalArgumentException("The configuration does not have a traversal supplier");
}
this.traversal = this.traversalSupplier.get().get();
- this.traversal.applyStrategies(TraversalEngine.COMPUTER);
+ if (!this.traversal.getEngine().isPresent())
+ this.traversal.applyStrategies(TraversalEngine.COMPUTER);
this.traversalMatrix = new TraversalMatrix<>(this.traversal);
for (final MapReducer<?, ?, ?, ?, ?> mapReducer : TraversalHelper.getStepsOfAssignableClassRecurssively(MapReducer.class, this.traversal)) {
this.mapReducers.add(mapReducer.getMapReduce());
@@ -244,8 +250,8 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
return traversal(GREMLIN_GROOVY, traversalScript);
}
- public Builder traversal(final Supplier<Traversal.Admin> traversal) {
- LambdaHolder.storeState(this.configuration, LambdaHolder.Type.OBJECT, TRAVERSAL_SUPPLIER, traversal);
+ public Builder traversal(final Traversal.Admin traversal) {
+ LambdaHolder.storeState(this.configuration, LambdaHolder.Type.OBJECT, TRAVERSAL_SUPPLIER, new TraversalSupplier(traversal));
return this;
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/LambdaHolder.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/LambdaHolder.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/LambdaHolder.java
index 8a629d4..21eb6ce 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/LambdaHolder.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/LambdaHolder.java
@@ -73,7 +73,7 @@ public class LambdaHolder<S> {
lambdaHolder.configKeyPrefix = configKeyPrefix;
lambdaHolder.type = Type.valueOf(configuration.getString(lambdaHolder.configKeyPrefix.concat(DOT_TYPE)));
if (lambdaHolder.type.equals(Type.OBJECT)) {
- lambdaHolder.configObject = configuration.getProperty(lambdaHolder.configKeyPrefix.concat(DOT_OBJECT));
+ lambdaHolder.configObject = VertexProgramHelper.deserialize(configuration, lambdaHolder.configKeyPrefix.concat(DOT_OBJECT));
lambdaHolder.realObject = lambdaHolder.configObject;
} else if (lambdaHolder.type.equals(Type.CLASS)) {
try {
@@ -84,13 +84,9 @@ public class LambdaHolder<S> {
throw new IllegalStateException(e.getMessage(), e);
}
} else { // SCRIPT
- try {
- final String[] script = VertexProgramHelper.deserialize(configuration, lambdaHolder.configKeyPrefix.concat(DOT_OBJECT));
- lambdaHolder.configObject = script;
- lambdaHolder.realObject = new ScriptEngineLambda(script[0], script[1]);
- } catch (Exception e) {
- throw new IllegalArgumentException(e.getMessage(), e);
- }
+ final String[] script = VertexProgramHelper.deserialize(configuration, lambdaHolder.configKeyPrefix.concat(DOT_OBJECT));
+ lambdaHolder.configObject = script;
+ lambdaHolder.realObject = new ScriptEngineLambda(script[0], script[1]);
}
return lambdaHolder;
}
@@ -98,17 +94,12 @@ public class LambdaHolder<S> {
public void storeState(final Configuration configuration) {
configuration.setProperty(this.configKeyPrefix.concat(DOT_TYPE), this.type.name());
- if (this.type.equals(Type.OBJECT)) {
- configuration.setProperty(this.configKeyPrefix.concat(DOT_OBJECT), this.configObject);
- } else if (this.type.equals(Type.CLASS)) {
+ if (this.type.equals(Type.OBJECT))
+ VertexProgramHelper.serialize(this.configObject, configuration, this.configKeyPrefix.concat(DOT_OBJECT));
+ else if (this.type.equals(Type.CLASS))
configuration.setProperty(this.configKeyPrefix.concat(DOT_OBJECT), ((Class) this.configObject).getCanonicalName());
- } else { // SCRIPT
- try {
- VertexProgramHelper.serialize(this.configObject, configuration, this.configKeyPrefix.concat(DOT_OBJECT));
- } catch (Exception e) {
- throw new IllegalArgumentException(e.getMessage(), e);
- }
- }
+ else
+ VertexProgramHelper.serialize(this.configObject, configuration, this.configKeyPrefix.concat(DOT_OBJECT));
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
index 9d3120b..048e533 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
@@ -34,17 +34,25 @@ public final class VertexProgramHelper {
private VertexProgramHelper() {
}
- public static void serialize(final Object object, final Configuration configuration, final String key) throws IOException {
- configuration.setProperty(key, Serializer.serializeObject(object));
+ public static void serialize(final Object object, final Configuration configuration, final String key) {
+ try {
+ configuration.setProperty(key, Serializer.serializeObject(object));
+ } catch (final IOException e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
}
- public static <T> T deserialize(final Configuration configuration, final String key) throws IOException, ClassNotFoundException {
- final List byteList = configuration.getList(key);
- byte[] bytes = new byte[byteList.size()];
- for (int i = 0; i < byteList.size(); i++) {
- bytes[i] = Byte.valueOf(byteList.get(i).toString().replace("[", "").replace("]", ""));
+ public static <T> T deserialize(final Configuration configuration, final String key) {
+ try {
+ final List byteList = configuration.getList(key);
+ byte[] bytes = new byte[byteList.size()];
+ for (int i = 0; i < byteList.size(); i++) {
+ bytes[i] = Byte.valueOf(byteList.get(i).toString().replace("[", "").replace("]", ""));
+ }
+ return (T) Serializer.deserializeObject(bytes);
+ } catch (final IOException | ClassNotFoundException e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
}
- return (T) Serializer.deserializeObject(bytes);
}
public static void verifyReversibility(final Traversal.Admin<?, ?> traversal) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
index 0b9c17a..0484021 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
@@ -514,6 +514,14 @@ public abstract interface ElementTraversal<A extends Element> {
return this.start().withSack(initialValue);
}
+ public default <B> GraphTraversal<A, A> withSack(final B initialValue, final UnaryOperator<B> splitOperator) {
+ return this.start().withSack(initialValue, splitOperator);
+ }
+
+ public default <B> GraphTraversal<A, A> withSack(B initialValue) {
+ return this.start().withSack(initialValue);
+ }
+
public default GraphTraversal<A, A> withPath() {
return this.start().withPath();
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
index bdd4942..c93d4cd 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
@@ -108,6 +108,7 @@ import com.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
import com.tinkerpop.gremlin.process.traversal.step.ElementFunctionComparator;
import com.tinkerpop.gremlin.process.traversal.step.ElementValueComparator;
import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import com.tinkerpop.gremlin.process.util.TraverserSet;
import com.tinkerpop.gremlin.structure.Compare;
import com.tinkerpop.gremlin.structure.Contains;
import com.tinkerpop.gremlin.structure.Direction;
@@ -117,6 +118,7 @@ import com.tinkerpop.gremlin.structure.Order;
import com.tinkerpop.gremlin.structure.Property;
import com.tinkerpop.gremlin.structure.PropertyType;
import com.tinkerpop.gremlin.structure.Vertex;
+import com.tinkerpop.gremlin.util.function.ConstantSupplier;
import java.util.Arrays;
import java.util.Collection;
@@ -159,7 +161,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
@Override
public default GraphTraversal<S, E> submit(final GraphComputer computer) {
try {
- final TraversalVertexProgram vertexProgram = TraversalVertexProgram.build().traversal(this::asAdmin).create();
+ final TraversalVertexProgram vertexProgram = TraversalVertexProgram.build().traversal(this.asAdmin()).create();
final ComputerResult result = computer.program(vertexProgram).submit().get();
final GraphTraversal.Admin<S, S> traversal = new DefaultGraphTraversal<>(result.graph().getClass());
return traversal.addStep(new ComputerResultStep<>(traversal, result, vertexProgram, true));
@@ -316,7 +318,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
}
public default <E2> GraphTraversal<S, E2> fold(final E2 seed, final BiFunction<E2, E, E2> foldFunction) {
- return this.asAdmin().addStep(new FoldStep<>(this.asAdmin(), () -> seed, foldFunction)); // TODO: User should provide supplier?
+ return this.asAdmin().addStep(new FoldStep<>(this.asAdmin(), new ConstantSupplier<>(seed), foldFunction)); // TODO: User should provide supplier?
}
public default GraphTraversal<S, Long> count() {
@@ -660,6 +662,16 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
return this;
}
+ public default <A> GraphTraversal<S, E> withSack(final A initialValue, final UnaryOperator<A> splitOperator) {
+ this.asAdmin().getSideEffects().setSack(new ConstantSupplier<>(initialValue), Optional.of(splitOperator));
+ return this;
+ }
+
+ public default <A> GraphTraversal<S, E> withSack(A initialValue) {
+ this.asAdmin().getSideEffects().setSack(new ConstantSupplier<>(initialValue), Optional.empty());
+ return this;
+ }
+
public default GraphTraversal<S, E> withPath() {
return this.asAdmin().addStep(new PathIdentityStep<>(this.asAdmin()));
}
@@ -671,7 +683,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
}
public default GraphTraversal<S, E> barrier() {
- return this.asAdmin().addStep(new CollectingBarrierStep<>(this.asAdmin()));
+ return this.asAdmin().addStep(new CollectingBarrierStep(asAdmin()) {
+ @Override
+ public void barrierConsumer(TraverserSet traverserSet) {
+
+ }
+ });
}
////
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/__.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/__.java
index 813e937..3fc0491 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/__.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/__.java
@@ -544,6 +544,14 @@ public class __ {
return __.<A>start().withSack(initialValue);
}
+ public static <A, B> GraphTraversal<A, A> withSack(final B initialValue, final UnaryOperator<B> splitOperator) {
+ return __.<A>start().withSack(initialValue, splitOperator);
+ }
+
+ public static <A, B> GraphTraversal<A, A> withSack(B initialValue) {
+ return __.<A>start().withSack(initialValue);
+ }
+
public static <A> GraphTraversal<A, A> withPath() {
return __.<A>start().withPath();
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
index 29acc09..91f75b0 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
@@ -20,7 +20,7 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.branch;
import com.tinkerpop.gremlin.process.Traversal;
import com.tinkerpop.gremlin.process.graph.traversal.step.TraversalOptionParent;
-import com.tinkerpop.gremlin.process.traversal.lambda.MapTraversal;
+import com.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import java.util.Collections;
@@ -32,7 +32,7 @@ public final class UnionStep<S, E> extends BranchStep<S, E, TraversalOptionParen
public UnionStep(final Traversal.Admin traversal, final Traversal.Admin<?, E>... unionTraversals) {
super(traversal);
- this.setBranchTraversal(new MapTraversal<>(s -> Pick.any));
+ this.setBranchTraversal(new ConstantTraversal<>(Pick.any));
for (final Traversal.Admin<?, E> union : unionTraversals) {
this.addGlobalChildOption(Pick.any, (Traversal.Admin) union);
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
index 74d20f4..a355afb 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
@@ -29,7 +29,7 @@ import java.util.function.Predicate;
*/
public final class LambdaFilterStep<S> extends FilterStep<S> {
- private Predicate<Traverser<S>> predicate = null;
+ private final Predicate<Traverser<S>> predicate;
public LambdaFilterStep(final Traversal.Admin traversal, final Predicate<Traverser<S>> predicate) {
super(traversal);
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleStep.java
index f0af2d6..f3da7eb 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleStep.java
@@ -20,10 +20,10 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.filter;
import com.tinkerpop.gremlin.process.Traversal;
import com.tinkerpop.gremlin.process.Traverser;
+import com.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
+import com.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
import com.tinkerpop.gremlin.process.traversal.step.Reversible;
import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import com.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import com.tinkerpop.gremlin.process.traversal.lambda.OneTraversal;
import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import com.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
@@ -39,14 +39,13 @@ import java.util.Set;
*/
public final class SampleStep<S> extends CollectingBarrierStep<S> implements Reversible, TraversalParent {
- private Traversal.Admin<S, Number> probabilityTraversal = OneTraversal.instance();
+ private Traversal.Admin<S, Number> probabilityTraversal = new ConstantTraversal<>(1.0d);
private final int amountToSample;
private static final Random RANDOM = new Random();
public SampleStep(final Traversal.Admin traversal, final int amountToSample) {
super(traversal);
this.amountToSample = amountToSample;
- SampleStep.generatePredicate(this);
}
@Override
@@ -65,6 +64,47 @@ public final class SampleStep<S> extends CollectingBarrierStep<S> implements Rev
}
@Override
+ public void barrierConsumer(final TraverserSet<S> traverserSet) {
+ // return the entire traverser set if the set is smaller than the amount to sample
+ if (traverserSet.bulkSize() <= this.amountToSample)
+ return;
+ //////////////// else sample the set
+ double totalWeight = 0.0d;
+ for (final Traverser<S> s : traverserSet) {
+ totalWeight = totalWeight + TraversalUtil.apply(s.asAdmin(), this.probabilityTraversal).doubleValue() * s.bulk();
+ }
+ ///////
+ final TraverserSet<S> sampledSet = new TraverserSet<>();
+ int runningAmountToSample = 0;
+ while (runningAmountToSample < this.amountToSample) {
+ boolean reSample = false;
+ double runningWeight = 0.0d;
+ for (final Traverser.Admin<S> s : traverserSet) {
+ long sampleBulk = sampledSet.contains(s) ? sampledSet.get(s).bulk() : 0;
+ if (sampleBulk < s.bulk()) {
+ final double currentWeight = TraversalUtil.apply(s, this.probabilityTraversal).doubleValue();
+ for (int i = 0; i < (s.bulk() - sampleBulk); i++) {
+ runningWeight = runningWeight + currentWeight;
+ if (RANDOM.nextDouble() <= (runningWeight / totalWeight)) {
+ final Traverser.Admin<S> split = s.asAdmin().split();
+ split.asAdmin().setBulk(1l);
+ sampledSet.add(split);
+ runningAmountToSample++;
+ totalWeight = totalWeight - currentWeight;
+ reSample = true;
+ break;
+ }
+ }
+ if (reSample || (runningAmountToSample >= this.amountToSample))
+ break;
+ }
+ }
+ }
+ traverserSet.clear();
+ traverserSet.addAll(sampledSet);
+ }
+
+ @Override
public Set<TraverserRequirement> getRequirements() {
return this.getSelfAndChildRequirements(TraverserRequirement.BULK);
}
@@ -73,51 +113,6 @@ public final class SampleStep<S> extends CollectingBarrierStep<S> implements Rev
public SampleStep<S> clone() throws CloneNotSupportedException {
final SampleStep<S> clone = (SampleStep<S>) super.clone();
clone.probabilityTraversal = clone.integrateChild(this.probabilityTraversal.clone(), TYPICAL_LOCAL_OPERATIONS);
- SampleStep.generatePredicate(clone);
return clone;
}
-
- /////////////////////////
-
- private static final <S> void generatePredicate(final SampleStep<S> sampleStep) {
- sampleStep.setConsumer(traverserSet -> {
- // return the entire traverser set if the set is smaller than the amount to sample
- if (traverserSet.bulkSize() <= sampleStep.amountToSample)
- return;
- //////////////// else sample the set
- double totalWeight = 0.0d;
- for (final Traverser<S> s : traverserSet) {
- totalWeight = totalWeight + TraversalUtil.apply(s.asAdmin(), sampleStep.probabilityTraversal).doubleValue() * s.bulk();
- }
- ///////
- final TraverserSet<S> sampledSet = new TraverserSet<>();
- int runningAmountToSample = 0;
- while (runningAmountToSample < sampleStep.amountToSample) {
- boolean reSample = false;
- double runningWeight = 0.0d;
- for (final Traverser.Admin<S> s : traverserSet) {
- long sampleBulk = sampledSet.contains(s) ? sampledSet.get(s).bulk() : 0;
- if (sampleBulk < s.bulk()) {
- final double currentWeight = TraversalUtil.apply(s, sampleStep.probabilityTraversal).doubleValue();
- for (int i = 0; i < (s.bulk() - sampleBulk); i++) {
- runningWeight = runningWeight + currentWeight;
- if (RANDOM.nextDouble() <= (runningWeight / totalWeight)) {
- final Traverser.Admin<S> split = s.asAdmin().split();
- split.asAdmin().setBulk(1l);
- sampledSet.add(split);
- runningAmountToSample++;
- totalWeight = totalWeight - currentWeight;
- reSample = true;
- break;
- }
- }
- if (reSample || (runningAmountToSample >= sampleStep.amountToSample))
- break;
- }
- }
- }
- traverserSet.clear();
- traverserSet.addAll(sampledSet);
- });
- }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
index 21b1d95..90113d3 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
@@ -23,6 +23,7 @@ import com.tinkerpop.gremlin.process.Traverser;
import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.iterator.EmptyIterator;
import java.util.ArrayList;
import java.util.Arrays;
@@ -55,7 +56,7 @@ public final class CoalesceStep<S, E> extends FlatMapStep<S, E> implements Trave
if (coalesceTraversal.hasNext())
return coalesceTraversal;
}
- return Collections.emptyIterator();
+ return EmptyIterator.instance();
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CountStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CountStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CountStep.java
index 6d6c2db..ea94492 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CountStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/CountStep.java
@@ -23,9 +23,12 @@ import com.tinkerpop.gremlin.process.Traverser;
import com.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
import com.tinkerpop.gremlin.process.traversal.step.Reducing;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.function.ConstantSupplier;
+import java.io.Serializable;
import java.util.EnumSet;
import java.util.Set;
+import java.util.function.BiFunction;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -36,8 +39,8 @@ public final class CountStep<S> extends ReducingBarrierStep<S, Long> implements
public CountStep(final Traversal.Admin traversal) {
super(traversal);
- this.setSeedSupplier(() -> 0l);
- this.setBiFunction((seed, start) -> seed + start.bulk());
+ this.setSeedSupplier(new ConstantSupplier<>(0L));
+ this.setBiFunction(CountBiFunction.<S>instance());
}
@@ -50,4 +53,24 @@ public final class CountStep<S> extends ReducingBarrierStep<S, Long> implements
public Reducer<Long, Traverser<S>> getReducer() {
return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true);
}
+
+ /////
+
+ private static class CountBiFunction<S> implements BiFunction<Long, Traverser<S>, Long>, Serializable {
+
+ private static final CountBiFunction INSTANCE = new CountBiFunction();
+
+ private CountBiFunction() {
+
+ }
+
+ @Override
+ public Long apply(final Long mutatingSeed, final Traverser<S> traverser) {
+ return mutatingSeed + traverser.bulk();
+ }
+
+ public final static <S> CountBiFunction<S> instance() {
+ return INSTANCE;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
index f38abb6..521a235 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
@@ -21,6 +21,7 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.map;
import com.tinkerpop.gremlin.process.Traversal;
import com.tinkerpop.gremlin.process.Traverser;
import com.tinkerpop.gremlin.process.traversal.step.AbstractStep;
+import com.tinkerpop.gremlin.util.iterator.EmptyIterator;
import java.util.Collections;
import java.util.Iterator;
@@ -31,7 +32,7 @@ import java.util.Iterator;
public abstract class FlatMapStep<S, E> extends AbstractStep<S, E> {
private Traverser.Admin<S> head = null;
- private Iterator<E> iterator = Collections.emptyIterator();
+ private Iterator<E> iterator = EmptyIterator.instance();
public FlatMapStep(final Traversal.Admin traversal) {
super(traversal);
@@ -54,6 +55,6 @@ public abstract class FlatMapStep<S, E> extends AbstractStep<S, E> {
@Override
public void reset() {
super.reset();
- this.iterator = Collections.emptyIterator();
+ this.iterator = EmptyIterator.instance();
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
index 4fccce2..fea68e2 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
@@ -19,13 +19,15 @@
package com.tinkerpop.gremlin.process.graph.traversal.step.map;
import com.tinkerpop.gremlin.process.Traversal;
+import com.tinkerpop.gremlin.process.Traverser;
import com.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
import com.tinkerpop.gremlin.process.traversal.step.Reducing;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.function.ArrayListSupplier;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.EnumSet;
-import java.util.List;
import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Supplier;
@@ -38,10 +40,7 @@ public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> implements R
private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
public FoldStep(final Traversal.Admin traversal) {
- this(traversal, () -> (E) new ArrayList<S>(), (seed, start) -> {
- ((List) seed).add(start);
- return seed;
- });
+ this(traversal, (Supplier) ArrayListSupplier.instance(), (BiFunction) ArrayListBiFunction.instance());
}
public FoldStep(final Traversal.Admin traversal, final Supplier<E> seed, final BiFunction<E, S, E> foldFunction) {
@@ -59,4 +58,25 @@ public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> implements R
public Set<TraverserRequirement> getRequirements() {
return REQUIREMENTS;
}
+
+ /////////
+
+ private static class ArrayListBiFunction<S> implements BiFunction<ArrayList<S>, S, ArrayList<S>>, Serializable {
+
+ private static final ArrayListBiFunction INSTANCE = new ArrayListBiFunction();
+
+ private ArrayListBiFunction() {
+
+ }
+
+ @Override
+ public ArrayList<S> apply(final ArrayList<S> mutatingSeed, final S traverser) {
+ mutatingSeed.add(traverser);
+ return mutatingSeed;
+ }
+
+ public final static <S> ArrayListBiFunction<S> instance() {
+ return INSTANCE;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MaxStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MaxStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MaxStep.java
index a60e2a3..11cc77f 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MaxStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MaxStep.java
@@ -20,12 +20,15 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.map;
import com.tinkerpop.gremlin.process.Traversal;
import com.tinkerpop.gremlin.process.Traverser;
-import com.tinkerpop.gremlin.process.traversal.step.Reducing;
import com.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
+import com.tinkerpop.gremlin.process.traversal.step.Reducing;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.function.ConstantSupplier;
+import java.io.Serializable;
import java.util.Collections;
import java.util.Set;
+import java.util.function.BiFunction;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -34,8 +37,8 @@ public final class MaxStep<S extends Number> extends ReducingBarrierStep<S, S> i
public MaxStep(final Traversal.Admin traversal) {
super(traversal);
- this.setSeedSupplier(() -> (S) Double.valueOf(Double.MIN_VALUE));
- this.setBiFunction((seed, start) -> seed.doubleValue() > start.get().doubleValue() ? seed : start.get());
+ this.setSeedSupplier(new ConstantSupplier<>((S) Double.valueOf(Double.MIN_VALUE)));
+ this.setBiFunction(MaxBiFunction.<S>instance());
}
@Override
@@ -47,4 +50,24 @@ public final class MaxStep<S extends Number> extends ReducingBarrierStep<S, S> i
public Reducer<S, Traverser<S>> getReducer() {
return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true);
}
+
+ /////
+
+ private static class MaxBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
+
+ private static final MaxBiFunction INSTANCE = new MaxBiFunction();
+
+ private MaxBiFunction() {
+
+ }
+
+ @Override
+ public S apply(final S mutatingSeed, final Traverser<S> traverser) {
+ return mutatingSeed.doubleValue() > traverser.get().doubleValue() ? mutatingSeed : traverser.get();
+ }
+
+ public final static <S extends Number> MaxBiFunction<S> instance() {
+ return INSTANCE;
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MeanStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MeanStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MeanStep.java
index 500c58d..bd9fc35 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MeanStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MeanStep.java
@@ -23,9 +23,13 @@ import com.tinkerpop.gremlin.process.Traverser;
import com.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
import com.tinkerpop.gremlin.process.traversal.step.Reducing;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.function.MeanNumberSupplier;
+import java.io.Serializable;
import java.util.EnumSet;
import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -36,8 +40,8 @@ public final class MeanStep<S extends Number, E extends Number> extends Reducing
public MeanStep(final Traversal.Admin traversal) {
super(traversal);
- this.setSeedSupplier(() -> (E) new MeanNumber());
- this.setBiFunction((seed, start) -> (E) ((MeanNumber) seed).add(start.get(), start.bulk()));
+ this.setSeedSupplier((Supplier) MeanNumberSupplier.instance());
+ this.setBiFunction((BiFunction) MeanBiFunction.instance());
}
@Override
@@ -50,9 +54,29 @@ public final class MeanStep<S extends Number, E extends Number> extends Reducing
return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true);
}
+ /////
+
+ private static class MeanBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
+
+ private static final MeanBiFunction INSTANCE = new MeanBiFunction();
+
+ private MeanBiFunction() {
+
+ }
+
+ @Override
+ public S apply(final S mutatingSeed, final Traverser<S> traverser) {
+ return (S) ((MeanNumber) mutatingSeed).add(traverser.get(), traverser.bulk());
+ }
+
+ public final static <S extends Number> MeanBiFunction<S> instance() {
+ return INSTANCE;
+ }
+ }
+
///
- public final class MeanNumber extends Number implements Comparable<Number>, FinalGet<Double> {
+ public static final class MeanNumber extends Number implements Comparable<Number>, FinalGet<Double> {
private long count = 0l;
private double sum = 0.0d;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MinStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MinStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MinStep.java
index 783f252..742296a 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MinStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/MinStep.java
@@ -20,12 +20,15 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.map;
import com.tinkerpop.gremlin.process.Traversal;
import com.tinkerpop.gremlin.process.Traverser;
-import com.tinkerpop.gremlin.process.traversal.step.Reducing;
import com.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
+import com.tinkerpop.gremlin.process.traversal.step.Reducing;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.function.ConstantSupplier;
+import java.io.Serializable;
import java.util.Collections;
import java.util.Set;
+import java.util.function.BiFunction;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -34,8 +37,8 @@ public final class MinStep<S extends Number> extends ReducingBarrierStep<S, S> i
public MinStep(final Traversal.Admin traversal) {
super(traversal);
- this.setSeedSupplier(() -> (S) Double.valueOf(Double.MAX_VALUE));
- this.setBiFunction((seed, start) -> seed.doubleValue() < start.get().doubleValue() ? seed : start.get());
+ this.setSeedSupplier(new ConstantSupplier<>((S) Double.valueOf(Double.MAX_VALUE)));
+ this.setBiFunction(MinBiFunction.instance());
}
@Override
@@ -47,4 +50,24 @@ public final class MinStep<S extends Number> extends ReducingBarrierStep<S, S> i
public Reducer<S, Traverser<S>> getReducer() {
return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true);
}
+
+ /////
+
+ private static class MinBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
+
+ private static final MinBiFunction INSTANCE = new MinBiFunction();
+
+ private MinBiFunction() {
+
+ }
+
+ @Override
+ public S apply(final S mutatingSeed, final Traverser<S> traverser) {
+ return mutatingSeed.doubleValue() < traverser.get().doubleValue() ? mutatingSeed : traverser.get();
+ }
+
+ public final static <S extends Number> MinBiFunction<S> instance() {
+ return INSTANCE;
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
index 17f34c6..40c0e2e 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
@@ -21,12 +21,14 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.map;
import com.tinkerpop.gremlin.process.Traversal;
import com.tinkerpop.gremlin.process.Traverser;
import com.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
-import com.tinkerpop.gremlin.process.traversal.step.Reversible;
import com.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.process.traversal.step.Reversible;
import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.process.util.TraverserSet;
import com.tinkerpop.gremlin.structure.Order;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -39,22 +41,21 @@ import java.util.Set;
public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implements Reversible, ComparatorHolder<S> {
private final List<Comparator<S>> comparators = new ArrayList<>();
+ private Comparator<Traverser<S>> chainedComparator = (Comparator) Order.incr;
public OrderGlobalStep(final Traversal.Admin traversal) {
super(traversal);
- this.setConsumer(traversers -> traversers.sort((Comparator) Order.incr));
+ }
+
+ @Override
+ public void barrierConsumer(final TraverserSet<S> traverserSet) {
+ traverserSet.sort(this.chainedComparator);
}
@Override
public void addComparator(final Comparator<S> comparator) {
this.comparators.add(comparator);
- final Comparator<Traverser<S>> chainedComparator = this.comparators.stream().map(c -> (Comparator<Traverser<S>>) new Comparator<Traverser<S>>() {
- @Override
- public int compare(final Traverser<S> traverserA, final Traverser<S> traverserB) {
- return c.compare(traverserA.get(), traverserB.get());
- }
- }).reduce((a, b) -> a.thenComparing(b)).get();
- this.setConsumer(traversers -> traversers.sort(chainedComparator));
+ this.chainedComparator = this.comparators.stream().map(c -> (Comparator<Traverser<S>>) new ComparatorTraverser<S>(c)).reduce((a, b) -> a.thenComparing(b)).get();
}
@Override
@@ -71,4 +72,20 @@ public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implement
public Set<TraverserRequirement> getRequirements() {
return Collections.singleton(TraverserRequirement.OBJECT);
}
+
+ /////
+
+ private static class ComparatorTraverser<S> implements Comparator<Traverser<S>>, Serializable {
+
+ private final Comparator<S> comparator;
+
+ public ComparatorTraverser(final Comparator<S> comparator) {
+ this.comparator = comparator;
+ }
+
+ @Override
+ public int compare(final Traverser<S> traverserA, final Traverser<S> traverserB) {
+ return this.comparator.compare(traverserA.get(), traverserB.get());
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/SumStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/SumStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/SumStep.java
index 8f2d745..0278b15 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/SumStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/map/SumStep.java
@@ -23,9 +23,12 @@ import com.tinkerpop.gremlin.process.Traverser;
import com.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
import com.tinkerpop.gremlin.process.traversal.step.Reducing;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import com.tinkerpop.gremlin.util.function.ConstantSupplier;
+import java.io.Serializable;
import java.util.EnumSet;
import java.util.Set;
+import java.util.function.BiFunction;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -39,8 +42,8 @@ public final class SumStep extends ReducingBarrierStep<Number, Double> implement
public SumStep(final Traversal.Admin traversal) {
super(traversal);
- this.setSeedSupplier(() -> 0.0d);
- this.setBiFunction((seed, start) -> seed + (start.get().doubleValue() * start.bulk()));
+ this.setSeedSupplier(new ConstantSupplier<>(0.0d));
+ this.setBiFunction(SumBiFunction.instance());
}
@@ -53,4 +56,24 @@ public final class SumStep extends ReducingBarrierStep<Number, Double> implement
public Reducer<Double, Traverser<Number>> getReducer() {
return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true);
}
+
+ /////
+
+ private static class SumBiFunction<S extends Number> implements BiFunction<Double, Traverser<S>, Double>, Serializable {
+
+ private static final SumBiFunction INSTANCE = new SumBiFunction();
+
+ private SumBiFunction() {
+
+ }
+
+ @Override
+ public Double apply(final Double mutatingSeed, final Traverser<S> traverser) {
+ return mutatingSeed + (traverser.get().doubleValue() * traverser.bulk());
+ }
+
+ public final static <S extends Number> SumBiFunction<S> instance() {
+ return INSTANCE;
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
index edcdefc..7b289f9 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
@@ -20,18 +20,19 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect;
import com.tinkerpop.gremlin.process.Traversal;
import com.tinkerpop.gremlin.process.computer.MapReduce;
-import com.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import com.tinkerpop.gremlin.process.traversal.step.Reversible;
import com.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-import com.tinkerpop.gremlin.process.traversal.step.SideEffectRegistrar;
-import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.mapreduce.AggregateMapReduce;
import com.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
import com.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
+import com.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import com.tinkerpop.gremlin.process.traversal.step.Reversible;
+import com.tinkerpop.gremlin.process.traversal.step.SideEffectRegistrar;
+import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import com.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import com.tinkerpop.gremlin.process.util.BulkSet;
+import com.tinkerpop.gremlin.process.util.TraverserSet;
+import com.tinkerpop.gremlin.util.function.BulkSetSupplier;
import java.util.Collection;
import java.util.Collections;
@@ -49,13 +50,12 @@ public final class AggregateStep<S> extends CollectingBarrierStep<S> implements
public AggregateStep(final Traversal.Admin traversal, final String sideEffectKey) {
super(traversal);
this.sideEffectKey = sideEffectKey;
- AggregateStep.generateConsumer(this);
}
@Override
public void registerSideEffects() {
if (null == this.sideEffectKey) this.sideEffectKey = this.getId();
- this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSet::new);
+ this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
}
@Override
@@ -84,6 +84,15 @@ public final class AggregateStep<S> extends CollectingBarrierStep<S> implements
}
@Override
+ public void barrierConsumer(final TraverserSet<S> traverserSet) {
+ traverserSet.forEach(traverser ->
+ TraversalHelper.addToCollection(
+ traverser.getSideEffects().get(this.sideEffectKey),
+ TraversalUtil.apply(traverser, this.aggregateTraversal),
+ traverser.bulk()));
+ }
+
+ @Override
public Set<TraverserRequirement> getRequirements() {
return this.getSelfAndChildRequirements(TraverserRequirement.BULK, TraverserRequirement.SIDE_EFFECTS);
}
@@ -92,18 +101,6 @@ public final class AggregateStep<S> extends CollectingBarrierStep<S> implements
public AggregateStep<S> clone() throws CloneNotSupportedException {
final AggregateStep<S> clone = (AggregateStep<S>) super.clone();
clone.aggregateTraversal = this.integrateChild(this.aggregateTraversal.clone(), TYPICAL_LOCAL_OPERATIONS);
- AggregateStep.generateConsumer(clone);
return clone;
}
-
- /////////////////////////
-
- private static final <S> void generateConsumer(final AggregateStep<S> aggregateStep) {
- aggregateStep.setConsumer(traverserSet ->
- traverserSet.forEach(traverser ->
- TraversalHelper.addToCollection(
- traverser.getSideEffects().get(aggregateStep.sideEffectKey),
- TraversalUtil.apply(traverser, aggregateStep.aggregateTraversal),
- traverser.bulk())));
- }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
index bc280f2..f698f3e 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
@@ -27,6 +27,7 @@ import com.tinkerpop.gremlin.structure.Edge;
import com.tinkerpop.gremlin.structure.Element;
import com.tinkerpop.gremlin.structure.Graph;
import com.tinkerpop.gremlin.structure.Vertex;
+import com.tinkerpop.gremlin.util.iterator.EmptyIterator;
import java.util.Arrays;
import java.util.Collections;
@@ -40,8 +41,8 @@ public class GraphStep<S extends Element> extends StartStep<S> implements Engine
protected final Class<S> returnClass;
protected final Object[] ids;
- protected final Graph graph;
- protected Supplier<Iterator<S>> iteratorSupplier;
+ protected transient Graph graph;
+ protected transient Supplier<Iterator<S>> iteratorSupplier;
public GraphStep(final Traversal.Admin traversal, final Graph graph, final Class<S> returnClass, final Object... ids) {
super(traversal);
@@ -90,7 +91,8 @@ public class GraphStep<S extends Element> extends StartStep<S> implements Engine
@Override
protected Traverser<S> processNextStart() {
- if (this.first) this.start = this.iteratorSupplier.get();
+ if (this.first)
+ this.start = null == this.iteratorSupplier ? EmptyIterator.instance() : this.iteratorSupplier.get();
return super.processNextStart();
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountStep.java
index 4dd86bd..288f7c8 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountStep.java
@@ -32,9 +32,9 @@ import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import com.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
import com.tinkerpop.gremlin.process.util.MapHelper;
+import com.tinkerpop.gremlin.util.function.HashMapSupplier;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -62,7 +62,7 @@ public final class GroupCountStep<S> extends SideEffectStep<S> implements SideEf
@Override
public void registerSideEffects() {
if (this.sideEffectKey == null) this.sideEffectKey = this.getId();
- this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMap<Object, Long>::new);
+ this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
index 2fcac21..dfc7071 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
@@ -22,18 +22,19 @@ import com.tinkerpop.gremlin.process.Traversal;
import com.tinkerpop.gremlin.process.TraversalEngine;
import com.tinkerpop.gremlin.process.Traverser;
import com.tinkerpop.gremlin.process.computer.MapReduce;
+import com.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
+import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.mapreduce.GroupMapReduce;
+import com.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
import com.tinkerpop.gremlin.process.traversal.step.EngineDependent;
import com.tinkerpop.gremlin.process.traversal.step.MapReducer;
import com.tinkerpop.gremlin.process.traversal.step.Reversible;
-import com.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
import com.tinkerpop.gremlin.process.traversal.step.SideEffectRegistrar;
import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.mapreduce.GroupMapReduce;
-import com.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import com.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
import com.tinkerpop.gremlin.process.util.BulkSet;
+import com.tinkerpop.gremlin.util.function.HashMapSupplier;
import java.util.Arrays;
import java.util.Collection;
@@ -80,7 +81,7 @@ public final class GroupStep<S, K, V, R> extends SideEffectStep<S> implements Si
@Override
public void registerSideEffects() {
if (this.sideEffectKey == null) this.sideEffectKey = this.getId();
- this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMap<K, Collection<V>>::new);
+ this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
}
private static <S, K, V> void doGroup(final Traverser.Admin<S> traverser, final Map<K, Collection<V>> groupMap, final Traversal.Admin<S, K> keyTraversal, final Traversal.Admin<S, V> valueTraversal) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
index 753c12d..4a03159 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
@@ -19,28 +19,32 @@
package com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect;
import com.tinkerpop.gremlin.process.Traversal;
-
-import java.util.Arrays;
-import java.util.List;
+import com.tinkerpop.gremlin.util.iterator.ArrayIterator;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public final class InjectStep<S> extends StartStep<S> {
- private final List<S> injections;
+ private final S[] injections;
@SafeVarargs
public InjectStep(final Traversal.Admin traversal, final S... injections) {
super(traversal);
- this.injections = Arrays.asList(injections);
- this.start = this.injections.iterator();
+ this.injections = injections;
+ this.start = new ArrayIterator<>(this.injections);
}
@Override
public InjectStep<S> clone() throws CloneNotSupportedException {
- final InjectStep<S> clone = (InjectStep<S>)super.clone();
- clone.start = this.injections.iterator();
+ final InjectStep<S> clone = (InjectStep<S>) super.clone();
+ clone.start = new ArrayIterator<>(clone.injections);
return clone;
}
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.start = new ArrayIterator<>(this.injections);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
index 4d93b35..de42a67 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
@@ -47,7 +47,6 @@ public final class SideEffectCapStep<S, E> extends SupplyingBarrierStep<S, E> im
public void registerSideEffects() {
if (this.sideEffectKeys.isEmpty())
this.sideEffectKeys = Collections.singletonList(((SideEffectCapable) this.getPreviousStep()).getSideEffectKey());
- SideEffectCapStep.generateSupplier(this);
}
@Override
@@ -65,10 +64,10 @@ public final class SideEffectCapStep<S, E> extends SupplyingBarrierStep<S, E> im
}
@Override
- public SideEffectCapStep<S, E> clone() throws CloneNotSupportedException {
- final SideEffectCapStep<S, E> clone = (SideEffectCapStep<S, E>) super.clone();
- SideEffectCapStep.generateSupplier(clone);
- return clone;
+ public E supply() {
+ return this.sideEffectKeys.size() == 1 ?
+ this.getTraversal().asAdmin().getSideEffects().get(this.sideEffectKeys.get(0)) :
+ (E) this.getMapOfSideEffects();
}
public Map<String, Object> getMapOfSideEffects() {
@@ -78,12 +77,4 @@ public final class SideEffectCapStep<S, E> extends SupplyingBarrierStep<S, E> im
}
return sideEffects;
}
-
- /////////////////////////
-
- private static final <S, E> void generateSupplier(final SideEffectCapStep<S, E> sideEffectCapStep) {
- sideEffectCapStep.setSupplier(() -> sideEffectCapStep.sideEffectKeys.size() == 1 ?
- sideEffectCapStep.getTraversal().asAdmin().getSideEffects().get(sideEffectCapStep.sideEffectKeys.get(0)) :
- (E) sideEffectCapStep.getMapOfSideEffects());
- }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
index efe5e60..e10be8a 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
@@ -31,7 +31,7 @@ import com.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import com.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import com.tinkerpop.gremlin.process.util.BulkSet;
+import com.tinkerpop.gremlin.util.function.BulkSetSupplier;
import java.util.Collection;
import java.util.Collections;
@@ -62,7 +62,7 @@ public final class StoreStep<S> extends SideEffectStep<S> implements SideEffectC
@Override
public void registerSideEffects() {
if (null == this.sideEffectKey) this.sideEffectKey = this.getId();
- this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSet::new);
+ this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
index 04d9c7f..4be5457 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
@@ -25,9 +25,9 @@ import com.tinkerpop.gremlin.process.computer.MapReduce;
import com.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
import com.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupStep;
-import com.tinkerpop.gremlin.process.util.BulkSet;
import com.tinkerpop.gremlin.process.traversal.TraversalMatrix;
import com.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import com.tinkerpop.gremlin.process.util.BulkSet;
import com.tinkerpop.gremlin.structure.Vertex;
import org.apache.commons.configuration.Configuration;
@@ -65,7 +65,7 @@ public final class GroupMapReduce implements MapReduce<Object, Collection, Objec
@Override
public void storeState(final Configuration configuration) {
- this.storeState(configuration);
+ MapReduce.super.storeState(configuration);
configuration.setProperty(GROUP_BY_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
configuration.setProperty(GROUP_BY_STEP_STEP_ID, this.groupStepId);
}
@@ -75,7 +75,8 @@ public final class GroupMapReduce implements MapReduce<Object, Collection, Objec
this.sideEffectKey = configuration.getString(GROUP_BY_STEP_SIDE_EFFECT_KEY);
this.groupStepId = configuration.getString(GROUP_BY_STEP_STEP_ID);
final Traversal.Admin<?, ?> traversal = TraversalVertexProgram.getTraversalSupplier(configuration).get();
- traversal.applyStrategies(TraversalEngine.COMPUTER); // TODO: this is a scary error prone requirement, but only a problem for GroupStep
+ if (!traversal.getEngine().isPresent())
+ traversal.applyStrategies(TraversalEngine.COMPUTER); // TODO: this is a scary error prone requirement, but only a problem for GroupStep
final GroupStep groupStep = new TraversalMatrix<>(traversal).getStepById(this.groupStepId);
this.reduceFunction = groupStep.getReduceTraversal();
this.mapSupplier = traversal.getSideEffects().<Map>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
index e850158..40bd37f 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
@@ -20,28 +20,24 @@ package com.tinkerpop.gremlin.process.graph.traversal.step.util;
import com.tinkerpop.gremlin.process.Traversal;
import com.tinkerpop.gremlin.process.Traverser;
-import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
import com.tinkerpop.gremlin.process.traversal.step.AbstractStep;
+import com.tinkerpop.gremlin.process.traverser.TraverserRequirement;
import com.tinkerpop.gremlin.process.util.TraverserSet;
import java.util.Collections;
import java.util.Set;
-import java.util.function.Consumer;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public class CollectingBarrierStep<S> extends AbstractStep<S, S> {
+public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> {
private TraverserSet<S> traverserSet = new TraverserSet<>();
- private Consumer<TraverserSet<S>> barrierConsumer;
public CollectingBarrierStep(final Traversal.Admin traversal) {
super(traversal);
}
- public void setConsumer(final Consumer<TraverserSet<S>> barrierConsumer) {
- this.barrierConsumer = barrierConsumer;
- }
+ public abstract void barrierConsumer(final TraverserSet<S> traverserSet);
@Override
public Set<TraverserRequirement> getRequirements() {
@@ -52,7 +48,7 @@ public class CollectingBarrierStep<S> extends AbstractStep<S, S> {
public Traverser<S> processNextStart() {
if (this.starts.hasNext()) {
this.starts.forEachRemaining(this.traverserSet::add);
- if (null != this.barrierConsumer) this.barrierConsumer.accept(this.traverserSet);
+ this.barrierConsumer(this.traverserSet);
}
return this.traverserSet.remove();
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/af7eb283/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
index eb2afe9..ec66645 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
@@ -24,6 +24,7 @@ import com.tinkerpop.gremlin.process.Traverser;
import com.tinkerpop.gremlin.process.traversal.step.EngineDependent;
import com.tinkerpop.gremlin.process.traversal.step.AbstractStep;
import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import com.tinkerpop.gremlin.util.iterator.EmptyIterator;
import java.util.Collections;
import java.util.Iterator;
@@ -34,7 +35,7 @@ import java.util.NoSuchElementException;
*/
public abstract class ComputerAwareStep<S, E> extends AbstractStep<S, E> implements EngineDependent {
- private Iterator<Traverser<E>> previousIterator = Collections.emptyIterator();
+ private Iterator<Traverser<E>> previousIterator = EmptyIterator.instance();
public ComputerAwareStep(final Traversal.Admin traversal) {
super(traversal);