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/09/01 22:33:04 UTC
[3/3] incubator-tinkerpop git commit: Added Sack merge binary
operator. This is a breaking change as a method signature has changed. Note
that this breaking change is for language vendors,
NOT for users. TINKERPOP-796 #close.
Added Sack merge binary operator. This is a breaking change as a method signature has changed. Note that this breaking change is for language vendors, NOT for users. TINKERPOP-796 #close.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/60239ff0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/60239ff0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/60239ff0
Branch: refs/heads/master
Commit: 60239ff052f9628677cd63facba51b61da7502af
Parents: b3d7098
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Sep 1 14:32:45 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Sep 1 14:32:45 2015 -0600
----------------------------------------------------------------------
.../traversal/VertexTraversalSideEffects.java | 9 ++--
.../process/traversal/SackFunctions.java | 23 ++------
.../gremlin/process/traversal/Traversal.java | 2 +-
.../process/traversal/TraversalSideEffects.java | 21 ++++----
.../dsl/graph/GraphTraversalSource.java | 36 ++++++-------
.../step/util/CollectingBarrierStep.java | 2 +-
.../step/util/LambdaCollectingBarrierStep.java | 6 +++
.../traverser/B_O_S_SE_SL_Traverser.java | 10 ++--
.../util/DefaultTraversalSideEffects.java | 15 +++---
.../util/EmptyTraversalSideEffects.java | 11 ++--
.../step/sideEffect/GroovySackTest.groovy | 6 +++
.../gremlin/groovy/loaders/StepLoader.groovy | 16 +++---
.../AbstractImportCustomizerProvider.java | 1 -
.../gremlin/groovy/function/GBiFunction.java | 55 --------------------
.../groovy/function/GBinaryOperator.java | 55 ++++++++++++++++++++
.../traversal/step/sideEffect/SackTest.java | 17 ++++++
.../tinkergraph/structure/TinkerGraphTest.java | 4 +-
17 files changed, 147 insertions(+), 142 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java
index 278dd10..d9889f1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java
@@ -19,7 +19,6 @@
package org.apache.tinkerpop.gremlin.process.computer.traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
@@ -27,7 +26,7 @@ import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
-import java.util.function.BiFunction;
+import java.util.function.BinaryOperator;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
@@ -60,12 +59,12 @@ public final class VertexTraversalSideEffects implements TraversalSideEffects {
}
@Override
- public <T, S> void setSack(final Supplier<S> initialValue, final UnaryOperator<S> splitOperator, final BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, S> mergeFunction) {
+ public <S> void setSack(final Supplier<S> initialValue, final UnaryOperator<S> splitOperator, final BinaryOperator<S> mergeOperator) {
throw EXCEPTION;
}
@Override
- public <S> Optional<Supplier<S>> getSackInitialValue() {
+ public <S> Supplier<S> getSackInitialValue() {
throw EXCEPTION;
}
@@ -75,7 +74,7 @@ public final class VertexTraversalSideEffects implements TraversalSideEffects {
}
@Override
- public <T, S> BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, S> getSackMerger() {
+ public <S> BinaryOperator<S> getSackMerger() {
throw EXCEPTION;
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/SackFunctions.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/SackFunctions.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/SackFunctions.java
index ac51212..78195cf 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/SackFunctions.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/SackFunctions.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.traversal;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
-import java.util.function.BiFunction;
import java.util.function.Consumer;
/**
@@ -33,32 +32,16 @@ public final class SackFunctions {
}
- public enum Merge implements BiFunction<Traverser.Admin<Object>, Traverser.Admin<Object>, Object> {
- weightedSum {
- @Override
- public Object apply(final Traverser.Admin<Object> a, final Traverser.Admin<Object> b) {
- final Object value = (a.bulk() * ((Number) a.sack()).doubleValue()) + (b.bulk() * ((Number) b.sack()).doubleValue());
- a.setBulk(1l);
- return value;
- }
- };
- }
-
public enum Barrier implements Consumer<TraverserSet<Object>> {
- noOp {
- @Override
- public void accept(final TraverserSet<Object> traverserSet) {
-
- }
- }, normSack {
+ normSack {
@Override
public void accept(final TraverserSet<Object> traverserSet) {
double total = 0.0d;
for (final Traverser.Admin<Object> traverser : traverserSet) {
- total = total + ((double) traverser.sack() * (double) traverser.bulk());
+ total = total + (((Number) traverser.sack()).doubleValue() * ((Number) traverser.bulk()).doubleValue());
}
for (final Traverser.Admin<Object> traverser : traverserSet) {
- traverser.sack(((double) traverser.sack() * (double) traverser.bulk()) / total);
+ traverser.sack((((Number) traverser.sack()).doubleValue() * ((Number) traverser.bulk()).doubleValue()) / total);
}
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
index 735c537..5ee731a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
@@ -357,7 +357,7 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
.collect(Collectors.toSet());
if (this.getSideEffects().keys().size() > 0)
requirements.add(TraverserRequirement.SIDE_EFFECTS);
- if (this.getSideEffects().getSackInitialValue().isPresent())
+ if (null != this.getSideEffects().getSackInitialValue())
requirements.add(TraverserRequirement.SACK);
if (this.getEngine().isComputer())
requirements.add(TraverserRequirement.BULK);
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java
index 8a11616..4619e23 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java
@@ -25,6 +25,7 @@ import java.util.Optional;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
+import java.util.function.BinaryOperator;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
@@ -107,27 +108,28 @@ public interface TraversalSideEffects extends Cloneable, Serializable {
}
/**
- * Set the initial value of each {@link Traverser} "sack" along with the methods for splitting and merging sacks.
+ * Set the initial value of each {@link Traverser} "sack" along with the operators for splitting and merging sacks.
* If no split operator is provided, then a direct memory copy is assumed (this is typically good for primitive types and strings).
- * If no merge function is provided, then traversers with sacks can not be merged.
+ * If no merge operator is provided, then traversers with sacks will not be merged.
*
* @param initialValue the initial value supplier of the traverser sack
* @param splitOperator the split operator for splitting traverser sacks
- * @param <T> the traverser object type
+ * @param mergeOperator the merge operator for merging traverser sacks
* @param <S> the sack type
*/
- public <T, S> void setSack(final Supplier<S> initialValue, final UnaryOperator<S> splitOperator, final BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, S> mergeFunction);
+ public <S> void setSack(final Supplier<S> initialValue, final UnaryOperator<S> splitOperator, final BinaryOperator<S> mergeOperator);
/**
* If sacks are enabled, get the initial value of the {@link Traverser} sack.
+ * If its not enabled, then <code>null</code> is returned.
*
* @param <S> the sack type
* @return the supplier of the initial value of the traverser sack
*/
- public <S> Optional<Supplier<S>> getSackInitialValue();
+ public <S> Supplier<S> getSackInitialValue();
/**
- * If sacks are enabled and a split operator has been specified, then get it (else null).
+ * If sacks are enabled and a split operator has been specified, then get it (else get <code>null</code>).
* The split operator is used to split a sack when a bifurcation in a {@link Traverser} happens.
*
* @param <S> the sack type
@@ -136,14 +138,13 @@ public interface TraversalSideEffects extends Cloneable, Serializable {
public <S> UnaryOperator<S> getSackSplitter();
/**
- * If sacks are enabled and a merge function has been specified, then get it (else null).
- * The merge function is used to merge a sack when two {@link Traverser}s converge.
+ * If sacks are enabled and a merge function has been specified, then get it (else get <code>null</code>).
+ * The merge function is used to merge two sacks when two {@link Traverser}s converge.
*
- * @param <T> the traverser object type
* @param <S> the sack type
* @return the operator for merging two traverser sacks
*/
- public <T, S> BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, S> getSackMerger();
+ public <S> BinaryOperator<S> getSackMerger();
/**
* If the sideEffect contains an object associated with the key, return it.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
index 651ffbc..fe06948 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
@@ -23,7 +23,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
@@ -31,7 +30,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.PathIdentityStep;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Transaction;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
@@ -41,7 +39,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
-import java.util.function.BiFunction;
+import java.util.function.BinaryOperator;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
@@ -160,23 +158,23 @@ public class GraphTraversalSource implements TraversalSource {
return this.withSack(initialValue, splitOperator, null);
}
- public <A> GraphTraversalSourceStub withSack(final Supplier<A> initialValue, final BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, A> mergeFunction) {
- return this.withSack(initialValue, null, mergeFunction);
+ public <A> GraphTraversalSourceStub withSack(final Supplier<A> initialValue, final BinaryOperator<A> mergeOperator) {
+ return this.withSack(initialValue, null, mergeOperator);
}
- public <A> GraphTraversalSourceStub withSack(final A initialValue, final BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, A> mergeFunction) {
- return this.withSack(initialValue, null, mergeFunction);
+ public <A> GraphTraversalSourceStub withSack(final A initialValue, final BinaryOperator<A> mergeOperator) {
+ return this.withSack(initialValue, null, mergeOperator);
}
- public <A> GraphTraversalSourceStub withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator, final BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, A> mergeFunction) {
+ public <A> GraphTraversalSourceStub withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) {
final GraphTraversal.Admin traversal = this.generateTraversal();
- traversal.getSideEffects().setSack(initialValue, splitOperator, mergeFunction);
+ traversal.getSideEffects().setSack(initialValue, splitOperator, mergeOperator);
return new GraphTraversalSourceStub(traversal, false);
}
- public <A> GraphTraversalSourceStub withSack(final A initialValue, final UnaryOperator<A> splitOperator, final BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, A> mergeFunction) {
+ public <A> GraphTraversalSourceStub withSack(final A initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) {
final GraphTraversal.Admin traversal = this.generateTraversal();
- traversal.getSideEffects().setSack(new ConstantSupplier<>(initialValue), splitOperator, mergeFunction);
+ traversal.getSideEffects().setSack(new ConstantSupplier<>(initialValue), splitOperator, mergeOperator);
return new GraphTraversalSourceStub(traversal, false);
}
@@ -333,23 +331,23 @@ public class GraphTraversalSource implements TraversalSource {
return this;
}
- public <A> GraphTraversalSourceStub withSack(final Supplier<A> initialValue, final BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, A> mergeFunction) {
- this.traversal.getSideEffects().setSack(initialValue, null, mergeFunction);
+ public <A> GraphTraversalSourceStub withSack(final Supplier<A> initialValue, final BinaryOperator<A> mergeOperator) {
+ this.traversal.getSideEffects().setSack(initialValue, null, mergeOperator);
return this;
}
- public <A> GraphTraversalSourceStub withSack(final A initialValue, final BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, A> mergeFunction) {
- this.traversal.getSideEffects().setSack(new ConstantSupplier<>(initialValue), null, mergeFunction);
+ public <A> GraphTraversalSourceStub withSack(final A initialValue, final BinaryOperator<A> mergeOperator) {
+ this.traversal.getSideEffects().setSack(new ConstantSupplier<>(initialValue), null, mergeOperator);
return this;
}
- public <A> GraphTraversalSourceStub withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator, final BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, A> mergeFunction) {
- this.traversal.getSideEffects().setSack(initialValue, splitOperator, mergeFunction);
+ public <A> GraphTraversalSourceStub withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) {
+ this.traversal.getSideEffects().setSack(initialValue, splitOperator, mergeOperator);
return this;
}
- public <A> GraphTraversalSourceStub withSack(final A initialValue, final UnaryOperator<A> splitOperator, final BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, A> mergeFunction) {
- this.traversal.getSideEffects().setSack(new ConstantSupplier<>(initialValue), splitOperator, mergeFunction);
+ public <A> GraphTraversalSourceStub withSack(final A initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) {
+ this.traversal.getSideEffects().setSack(new ConstantSupplier<>(initialValue), splitOperator, mergeOperator);
return this;
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
index 6af4dbe..e73c655 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
@@ -78,7 +78,7 @@ public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> {
@Override
public String toString() {
- return StringFactory.stepString(this, this.maxBarrierSize);
+ return StringFactory.stepString(this, this.maxBarrierSize == Integer.MAX_VALUE ? null : this.maxBarrierSize);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/LambdaCollectingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/LambdaCollectingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/LambdaCollectingBarrierStep.java
index a3c7bef..ec21d8c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/LambdaCollectingBarrierStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/LambdaCollectingBarrierStep.java
@@ -22,6 +22,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.util;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.LambdaHolder;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
import java.util.function.Consumer;
@@ -50,4 +51,9 @@ public final class LambdaCollectingBarrierStep<S> extends CollectingBarrierStep<
public void barrierConsumer(final TraverserSet<S> traverserSet) {
this.barrierConsumer.accept(traverserSet);
}
+
+ @Override
+ public String toString() {
+ return StringFactory.stepString(this, this.barrierConsumer.toString());
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_Traverser.java
index 327bad3..b69db85 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_Traverser.java
@@ -23,8 +23,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import java.util.function.BiFunction;
-
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@@ -40,7 +38,8 @@ public class B_O_S_SE_SL_Traverser<T> extends B_O_Traverser<T> {
public B_O_S_SE_SL_Traverser(final T t, final Step<T, ?> step, final long initialBulk) {
super(t, initialBulk);
this.sideEffects = step.getTraversal().getSideEffects();
- this.sideEffects.getSackInitialValue().ifPresent(supplier -> this.sack = supplier.get());
+ if (null != this.sideEffects.getSackInitialValue())
+ this.sack = this.sideEffects.getSackInitialValue().get();
}
/////////////////
@@ -104,8 +103,9 @@ public class B_O_S_SE_SL_Traverser<T> extends B_O_Traverser<T> {
@Override
public void merge(final Traverser.Admin<?> other) {
super.merge(other);
- if (this.sack != null && this.sideEffects.getSackMerger() != null)
- this.sack = ((BiFunction)this.sideEffects.getSackMerger()).apply(this,other);
+ if (null != this.sack && null != this.sideEffects.getSackMerger())
+ this.sack = this.sideEffects.getSackMerger().apply(this.sack, other.sack());
+
}
/////////////////
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java
index 42bb04f..f1cccbd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java
@@ -19,7 +19,6 @@
package org.apache.tinkerpop.gremlin.process.traversal.util;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.structure.Property;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
@@ -31,7 +30,7 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
-import java.util.function.BiFunction;
+import java.util.function.BinaryOperator;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
@@ -43,7 +42,7 @@ public class DefaultTraversalSideEffects implements TraversalSideEffects {
protected Map<String, Object> objectMap = new HashMap<>();
protected Map<String, Supplier> supplierMap = new HashMap<>();
protected UnaryOperator sackSplitOperator = null;
- protected BiFunction sackMergeOperator = null;
+ protected BinaryOperator sackMergeOperator = null;
protected Supplier sackInitialValue = null;
public DefaultTraversalSideEffects() {
@@ -78,15 +77,15 @@ public class DefaultTraversalSideEffects implements TraversalSideEffects {
}
@Override
- public <T,S> void setSack(final Supplier<S> initialValue, final UnaryOperator<S> splitOperator, final BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, S> mergeFunction) {
+ public <S> void setSack(final Supplier<S> initialValue, final UnaryOperator<S> splitOperator, final BinaryOperator<S> mergeOperator) {
this.sackInitialValue = initialValue;
this.sackSplitOperator = splitOperator;
- this.sackMergeOperator = mergeFunction;
+ this.sackMergeOperator = mergeOperator;
}
@Override
- public <S> Optional<Supplier<S>> getSackInitialValue() {
- return Optional.ofNullable(this.sackInitialValue);
+ public <S> Supplier<S> getSackInitialValue() {
+ return this.sackInitialValue;
}
@Override
@@ -95,7 +94,7 @@ public class DefaultTraversalSideEffects implements TraversalSideEffects {
}
@Override
- public <T,S> BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, S> getSackMerger() {
+ public <S> BinaryOperator<S> getSackMerger() {
return this.sackMergeOperator;
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java
index b1aea21..584ccbf 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java
@@ -19,13 +19,12 @@
package org.apache.tinkerpop.gremlin.process.traversal.util;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import java.util.Collections;
import java.util.Optional;
import java.util.Set;
-import java.util.function.BiFunction;
+import java.util.function.BinaryOperator;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
@@ -71,13 +70,13 @@ public final class EmptyTraversalSideEffects implements TraversalSideEffects {
}
@Override
- public <T, S> void setSack(final Supplier<S> initialValue, final UnaryOperator<S> splitOperator, final BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, S> mergeFunction) {
+ public <S> void setSack(final Supplier<S> initialValue, final UnaryOperator<S> splitOperator, final BinaryOperator<S> mergeOperator) {
}
@Override
- public <S> Optional<Supplier<S>> getSackInitialValue() {
- return Optional.empty();
+ public <S> Supplier<S> getSackInitialValue() {
+ return null;
}
@Override
@@ -86,7 +85,7 @@ public final class EmptyTraversalSideEffects implements TraversalSideEffects {
}
@Override
- public <T, S> BiFunction<Traverser.Admin<T>, Traverser.Admin<T>, S> getSackMerger() {
+ public <S> BinaryOperator<S> getSackMerger() {
return null;
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
index 5739513..bf705e7 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
@@ -58,5 +58,11 @@ public abstract class GroovySackTest {
public Traversal<Vertex, Map> get_g_withSackXmap__map_cloneX_V_out_out_sackXmap_a_nameX_sack() {
TraversalScriptHelper.compute("g.withSack{[:]}{ it.clone() }.V.out().out().sack { m, v -> m['a'] = v.name; m }.sack()", g);
}
+
+ @Override
+ public Traversal<Vertex, Double> get_g_withSackX1_sumX_VX1X_localXoutXknowsX_barrierXnormSackXX_inXknowsX_barrier_sack(
+ final Object v1Id) {
+ TraversalScriptHelper.compute("g.withSack(1.0d,sum).V(${v1Id}).local(out('knows').barrier(normSack)).in('knows').barrier.sack", g, "v1Id", v1Id)
+ }
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy
index 8243e64..d5de45f 100644
--- a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy
+++ b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy
@@ -42,13 +42,13 @@ class StepLoader {
return ((GraphTraversalSource) delegate).withSack(new GSupplier(closure));
}
- GraphTraversalSource.metaClass.withSack = { final Closure closure, final Closure splitOrMerge ->
- return ((GraphTraversalSource) delegate).withSack(new GSupplier(closure), splitOrMerge.getMaximumNumberOfParameters() == 1 ? new GUnaryOperator(splitOrMerge) : new GBiFunction(splitOrMerge));
+ GraphTraversalSource.metaClass.withSack = { final Closure closure, final Closure splitOrMergeOperator ->
+ return ((GraphTraversalSource) delegate).withSack(new GSupplier(closure), splitOrMergeOperator.getMaximumNumberOfParameters() == 1 ? new GUnaryOperator(splitOrMergeOperator) : new GBinaryOperator(splitOrMergeOperator));
}
GraphTraversalSource.metaClass.withSack = {
- final Closure closure, final Closure splitOperator, final Closure mergeFunction ->
- return ((GraphTraversalSource) delegate).withSack(new GSupplier(closure), new GUnaryOperator(splitOperator), new GBiFunction(mergeFunction));
+ final Closure closure, final Closure splitOperator, final Closure mergeOperator ->
+ return ((GraphTraversalSource) delegate).withSack(new GSupplier(closure), new GUnaryOperator(splitOperator), new GBinaryOperator(mergeOperator));
}
///////////////////
@@ -63,13 +63,13 @@ class StepLoader {
}
GraphTraversalSource.GraphTraversalSourceStub.metaClass.withSack = {
- final Closure closure, final Closure splitOrMerge ->
- return ((GraphTraversalSource.GraphTraversalSourceStub) delegate).withSack(new GSupplier(closure), splitOrMerge.getMaximumNumberOfParameters() == 1 ? new GUnaryOperator(splitOrMerge) : new GBiFunction(splitOrMerge));
+ final Closure closure, final Closure splitOrMergeOperator ->
+ return ((GraphTraversalSource.GraphTraversalSourceStub) delegate).withSack(new GSupplier(closure), splitOrMergeOperator.getMaximumNumberOfParameters() == 1 ? new GUnaryOperator(splitOrMergeOperator) : new GBinaryOperator(splitOrMergeOperator));
}
GraphTraversalSource.GraphTraversalSourceStub.metaClass.withSack = {
- final Closure closure, final Closure splitOperator, Closure mergeFunction ->
- return ((GraphTraversalSource.GraphTraversalSourceStub) delegate).withSack(new GSupplier(closure), new GUnaryOperator(splitOperator), new GBiFunction(mergeFunction));
+ final Closure closure, final Closure splitOperator, Closure mergeOperator ->
+ return ((GraphTraversalSource.GraphTraversalSourceStub) delegate).withSack(new GSupplier(closure), new GUnaryOperator(splitOperator), new GBinaryOperator(mergeOperator));
}
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
index 594a3a9..27bffff 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
@@ -105,7 +105,6 @@ public abstract class AbstractImportCustomizerProvider implements ImportCustomiz
staticImports.add(Scope.class.getCanonicalName() + DOT_STAR);
staticImports.add(Pop.class.getCanonicalName() + DOT_STAR);
staticImports.add(__.class.getCanonicalName() + DOT_STAR);
- staticImports.add(SackFunctions.Merge.class.getCanonicalName() + DOT_STAR);
staticImports.add(SackFunctions.Barrier.class.getCanonicalName() + DOT_STAR);
staticImports.add(TraversalOptionParent.Pick.class.getCanonicalName() + DOT_STAR);
staticImports.add(GraphTraversalSource.class.getCanonicalName() + DOT_STAR);
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/function/GBiFunction.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/function/GBiFunction.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/function/GBiFunction.java
deleted file mode 100644
index 939dffd..0000000
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/function/GBiFunction.java
+++ /dev/null
@@ -1,55 +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.groovy.function;
-
-import groovy.lang.Closure;
-import org.apache.tinkerpop.gremlin.process.traversal.step.LambdaHolder;
-
-import java.util.function.BiFunction;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class GBiFunction<A, B, C> implements BiFunction<A, B, C>, LambdaHolder {
-
- private final Closure closure;
-
- public GBiFunction(final Closure closure) {
- this.closure = closure;
- }
-
- public static GBiFunction[] make(final Closure... closures) {
- final GBiFunction[] functions = new GBiFunction[closures.length];
- for (int i = 0; i < closures.length; i++) {
- functions[i] = new GBiFunction(closures[i]);
- }
- return functions;
- }
-
- @Override
- public String toString() {
- return "lambda";
- }
-
- @Override
- public C apply(final A a, final B b) {
- return (C) closure.call(a, b);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/function/GBinaryOperator.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/function/GBinaryOperator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/function/GBinaryOperator.java
new file mode 100644
index 0000000..02f8d7a
--- /dev/null
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/function/GBinaryOperator.java
@@ -0,0 +1,55 @@
+/*
+ * 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.groovy.function;
+
+import groovy.lang.Closure;
+import org.apache.tinkerpop.gremlin.process.traversal.step.LambdaHolder;
+
+import java.util.function.BinaryOperator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class GBinaryOperator<A> implements BinaryOperator<A>, LambdaHolder {
+
+ private final Closure closure;
+
+ public GBinaryOperator(final Closure closure) {
+ this.closure = closure;
+ }
+
+ public static GBinaryOperator[] make(final Closure... closures) {
+ final GBinaryOperator[] functions = new GBinaryOperator[closures.length];
+ for (int i = 0; i < closures.length; i++) {
+ functions[i] = new GBinaryOperator(closures[i]);
+ }
+ return functions;
+ }
+
+ @Override
+ public String toString() {
+ return "lambda";
+ }
+
+ @Override
+ public A apply(final A a, final A b) {
+ return (A) closure.call(a, b);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
index 0db1b35..a886c3f 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
@@ -22,7 +22,9 @@ import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
import org.apache.tinkerpop.gremlin.process.traversal.Operator;
+import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Test;
@@ -56,6 +58,8 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
public abstract Traversal<Vertex, Map> get_g_withSackXmap__map_cloneX_V_out_out_sackXmap_a_nameX_sack();
+ public abstract Traversal<Vertex, Double> get_g_withSackX1_sumX_VX1X_localXoutXknowsX_barrierXnormSackXX_inXknowsX_barrier_sack(final Object v1Id);
+
@Test
@LoadGraphWith(MODERN)
public void g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
@@ -103,6 +107,14 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
assertEquals(2, counter);
}
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_withSackX1_sumX_VX1X_localXoutXknowsX_barrierXnormSackXX_inXknowsX_barrier_sack() {
+ final Traversal<Vertex, Double> traversal = get_g_withSackX1_sumX_VX1X_localXoutXknowsX_barrierXnormSackXX_inXknowsX_barrier_sack(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList(1.0d, 1.0d), traversal);
+ }
+
public static class Traversals extends SackTest {
@Override
@@ -137,5 +149,10 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
return map;
}).sack();
}
+
+ @Override
+ public Traversal<Vertex, Double> get_g_withSackX1_sumX_VX1X_localXoutXknowsX_barrierXnormSackXX_inXknowsX_barrier_sack(final Object v1Id) {
+ return g.withSack(1.0d, Operator.sum).V(v1Id).local(__.out("knows").barrier(SackFunctions.Barrier.normSack)).in("knows").barrier().sack();
+ }
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/60239ff0/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
index 1a75b83..3e3b2dc 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
@@ -24,7 +24,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.LambdaCollectingBarrierStep;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.T;
@@ -41,7 +40,6 @@ import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
-import java.util.function.BiFunction;
import java.util.function.Supplier;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
@@ -166,7 +164,7 @@ public class TinkerGraphTest {
public void testPlay7() throws Exception {
final Graph graph = TinkerFactory.createModern();
final GraphTraversalSource g = graph.traversal();
- g.withSack(1.0,(BiFunction)SackFunctions.Merge.weightedSum).V(1).local(outE("knows").barrier(SackFunctions.Barrier.normSack)).inV().in("knows").barrier().sack().forEachRemaining(System.out::println);
+ g.withSack(1.0, Operator.sum).V(1).local(outE("knows").barrier(SackFunctions.Barrier.normSack)).inV().in("knows").barrier().sack().forEachRemaining(System.out::println);
}
@Test