added StringFactory rules for GraphActors, Partitioner, and Partition. Realized someting profoundly sucky about DedupGlobalStep. Exposed more test cases to AkkaGraphActors.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/a9b81d29 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/a9b81d29 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/a9b81d29 Branch: refs/heads/TINKERPOP-1564 Commit: a9b81d2937184012f56f577df1ac1fa49a51cfee Parents: 73b6e74 Author: Marko A. Rodriguez <[email protected]> Authored: Wed Dec 14 09:37:14 2016 -0700 Committer: Marko A. Rodriguez <[email protected]> Committed: Wed Jan 4 05:07:59 2017 -0700 ---------------------------------------------------------------------- .../akka/process/actor/AkkaGraphActors.java | 8 +++- .../akka/process/AkkaActorsProvider.java | 1 - .../actor/traversal/TraversalMasterProgram.java | 8 ++-- .../traversal/step/filter/DedupGlobalStep.java | 3 +- .../tinkerpop/gremlin/structure/Partition.java | 15 +++++-- .../gremlin/structure/util/StringFactory.java | 15 +++++++ .../util/partitioner/GlobalPartitioner.java | 41 ++++++++++++++++++-- .../util/partitioner/HashPartitioner.java | 32 ++++++++++++++- 8 files changed, 108 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a9b81d29/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java ---------------------------------------------------------------------- diff --git a/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java b/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java index b28f536..362db97 100644 --- a/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java +++ b/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java @@ -25,9 +25,10 @@ import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; import com.typesafe.config.ConfigValueFactory; import org.apache.tinkerpop.gremlin.process.actor.ActorProgram; -import org.apache.tinkerpop.gremlin.process.actor.GraphActors; import org.apache.tinkerpop.gremlin.process.actor.Address; +import org.apache.tinkerpop.gremlin.process.actor.GraphActors; import org.apache.tinkerpop.gremlin.structure.Partitioner; +import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Future; @@ -52,6 +53,11 @@ public final class AkkaGraphActors<R> implements GraphActors<R> { } @Override + public String toString() { + return StringFactory.graphActorsString(this); + } + + @Override public Address.Master master() { return this.master; } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a9b81d29/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaActorsProvider.java ---------------------------------------------------------------------- diff --git a/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaActorsProvider.java b/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaActorsProvider.java index 9c8b320..bf9e092 100644 --- a/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaActorsProvider.java +++ b/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaActorsProvider.java @@ -68,7 +68,6 @@ public class AkkaActorsProvider extends AbstractGraphProvider { "g_VX1X_repeatXbothEXcreatedX_whereXwithoutXeXX_aggregateXeX_otherVX_emit_path", "g_withBulkXfalseX_withSackX1_sumX_V_out_barrier_sack", "g_V_both_groupCountXaX_out_capXaX_selectXkeysX_unfold_both_groupCountXaX_capXaX", - "g_V_both_both_dedup_byXoutE_countX_name", GraphTest.Traversals.class.getCanonicalName(), GroupTest.Traversals.class.getCanonicalName(), ComplexTest.Traversals.class.getCanonicalName(), http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a9b81d29/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalMasterProgram.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalMasterProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalMasterProgram.java index 7846d53..2cd5f7f 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalMasterProgram.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalMasterProgram.java @@ -35,6 +35,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.Barrier; import org.apache.tinkerpop.gremlin.process.traversal.step.Distributing; import org.apache.tinkerpop.gremlin.process.traversal.step.LocalBarrier; import org.apache.tinkerpop.gremlin.process.traversal.step.Pushing; +import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TailGlobalStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep; @@ -106,9 +107,10 @@ final class TraversalMasterProgram<M> implements ActorProgram.Master<M> { new OrderedTraverser<>(step.next(), this.orderCounter++)); } } else { - this.traversal.getSideEffects().forEach((k, v) -> { - this.broadcast(new SideEffectSetMessage(k, v)); - }); + if (step instanceof SideEffectCapable) { + final String key = ((SideEffectCapable) step).getSideEffectKey(); + this.broadcast(new SideEffectSetMessage(key, this.traversal.getSideEffects().get(key))); + } this.broadcast(new BarrierDoneMessage(barrier)); barrier.done(); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a9b81d29/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java index 2bd9c32..b89c64b 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java @@ -173,8 +173,7 @@ public final class DedupGlobalStep<S> extends FilterStep<S> implements Traversal object = TraversalUtil.applyNullable(traverser, this.dedupTraversal); } if (!map.containsKey(object)) { - traverser.setBulk(1l); - traverser.set(DetachedFactory.detach(traverser.get(), true)); + traverser.setBulk(1L); map.put(object, traverser); } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a9b81d29/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Partition.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Partition.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Partition.java index 12faca9..dbb5260 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Partition.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Partition.java @@ -19,8 +19,10 @@ package org.apache.tinkerpop.gremlin.structure; +import java.net.InetAddress; import java.net.URI; import java.util.Iterator; +import java.util.UUID; /** * A {@code Partition} represents a physical or logical split of the underlying {@link Graph} structure. @@ -59,11 +61,18 @@ public interface Partition { public Iterator<Edge> edges(final Object... ids); /** - * Get the {@link URI} location of the partition. + * Get the {@link UUID} of the partition. * - * @return the location of the partition + * @return the unique id of the partition */ - public URI location(); + public UUID guid(); + + /** + * Get the {@link InetAddress} of the locations physical location. + * + * @return the physical location of the partition. + */ + public InetAddress location(); public static interface PhysicalPartition extends Partition { } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a9b81d29/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java index bcead2d..553ebe3 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java @@ -18,6 +18,7 @@ */ package org.apache.tinkerpop.gremlin.structure.util; +import org.apache.tinkerpop.gremlin.process.actor.GraphActors; import org.apache.tinkerpop.gremlin.process.computer.Computer; import org.apache.tinkerpop.gremlin.process.computer.ComputerResult; import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; @@ -35,6 +36,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.Partition; +import org.apache.tinkerpop.gremlin.structure.Partitioner; import org.apache.tinkerpop.gremlin.structure.Property; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; @@ -139,6 +142,18 @@ public final class StringFactory { return graphComputer.getClass().getSimpleName().toLowerCase(); } + public static String graphActorsString(final GraphActors graphActors) { + return graphActors.getClass().getSimpleName().toLowerCase(); + } + + public static String partitionerString(final Partitioner partitioner) { + return "partitioner" + L_BRACKET + partitioner.getClass().getSimpleName().toLowerCase() + COLON + partitioner.getPartitions().size() + R_BRACKET; + } + + public static String partitionString(final Partition partition) { + return "partition" + L_BRACKET + partition.location().getHostAddress() + COLON + partition.guid() + R_BRACKET; + } + public static String traversalSourceString(final TraversalSource traversalSource) { final String graphString = traversalSource.getGraph().toString(); final Optional<Computer> optional = VertexProgramStrategy.getComputer(traversalSource.getStrategies()); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a9b81d29/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/partitioner/GlobalPartitioner.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/partitioner/GlobalPartitioner.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/partitioner/GlobalPartitioner.java index 910de8e..361750b 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/partitioner/GlobalPartitioner.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/partitioner/GlobalPartitioner.java @@ -25,11 +25,14 @@ import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Partition; import org.apache.tinkerpop.gremlin.structure.Partitioner; import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.structure.util.StringFactory; -import java.net.URI; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.UUID; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -52,12 +55,24 @@ public final class GlobalPartitioner implements Partitioner { return this.partition; } + @Override + public String toString() { + return StringFactory.partitionerString(this); + } + private class GlobalPartition implements Partition { private final Graph graph; + private final UUID guid = UUID.randomUUID(); + private final InetAddress location; private GlobalPartition(final Graph graph) { this.graph = graph; + try { + this.location = InetAddress.getLocalHost(); + } catch (final UnknownHostException e) { + throw new IllegalStateException(e.getMessage(), e); + } } @Override @@ -76,8 +91,28 @@ public final class GlobalPartitioner implements Partitioner { } @Override - public URI location() { - return URI.create("localhost"); + public String toString() { + return StringFactory.partitionString(this); + } + + @Override + public boolean equals(final Object other) { + return other instanceof Partition && ((Partition) other).guid().equals(this.guid); + } + + @Override + public int hashCode() { + return this.guid.hashCode() + this.location.hashCode(); + } + + @Override + public UUID guid() { + return this.guid; + } + + @Override + public InetAddress location() { + return this.location; } } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a9b81d29/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/partitioner/HashPartitioner.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/partitioner/HashPartitioner.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/partitioner/HashPartitioner.java index 432918f..b3d3db7 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/partitioner/HashPartitioner.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/partitioner/HashPartitioner.java @@ -24,12 +24,14 @@ import org.apache.tinkerpop.gremlin.structure.Element; import org.apache.tinkerpop.gremlin.structure.Partition; import org.apache.tinkerpop.gremlin.structure.Partitioner; import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; -import java.net.URI; +import java.net.InetAddress; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.UUID; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -47,6 +49,11 @@ public final class HashPartitioner implements Partitioner { } @Override + public String toString() { + return StringFactory.partitionerString(this); + } + + @Override public List<Partition> getPartitions() { return this.partitions; } @@ -65,6 +72,7 @@ public final class HashPartitioner implements Partitioner { private final Partition basePartition; private final int totalSplits; private final int splitId; + private final UUID guid = UUID.randomUUID(); private HashPartition(final Partition basePartition, final int splitId, final int totalSplits) { this.basePartition = basePartition; @@ -88,7 +96,27 @@ public final class HashPartitioner implements Partitioner { } @Override - public URI location() { + public String toString() { + return StringFactory.partitionString(this); + } + + @Override + public boolean equals(final Object other) { + return other instanceof Partition && ((Partition) other).guid().equals(this.guid); + } + + @Override + public int hashCode() { + return this.guid.hashCode() + this.location().hashCode(); + } + + @Override + public UUID guid() { + return this.guid; + } + + @Override + public InetAddress location() { return this.basePartition.location(); } }
