Repository: incubator-tinkerpop Updated Branches: refs/heads/TINKERPOP-1310 e6f2caa89 -> f78d1cb63
Giraph integration tests are passing now. @spmallette and I chatted tonight and came up with some good ideas regarding how to leverage HaltedTraverserStrategy for both OLTP and OLAP. In short, 'metadata strategies' might be the new thing. Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/f78d1cb6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/f78d1cb6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/f78d1cb6 Branch: refs/heads/TINKERPOP-1310 Commit: f78d1cb631c91fefb46829840e6f4247955a1a5b Parents: e6f2caa Author: Marko A. Rodriguez <[email protected]> Authored: Wed May 25 19:58:28 2016 -0600 Committer: Marko A. Rodriguez <[email protected]> Committed: Wed May 25 19:58:28 2016 -0600 ---------------------------------------------------------------------- .../traversal/TraversalVertexProgram.java | 19 ++-- .../step/map/TraversalVertexProgramStep.java | 10 +- .../HaltedTraverserFactoryStrategy.java | 67 ------------ .../decoration/HaltedTraverserStrategy.java | 54 ++++++++++ .../HaltedTraverserFactoryStrategyTest.java | 96 ----------------- .../decoration/HaltedTraverserStrategyTest.java | 102 +++++++++++++++++++ 6 files changed, 165 insertions(+), 183 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f78d1cb6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java index 4479306..07ab98a 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java @@ -32,6 +32,7 @@ import org.apache.tinkerpop.gremlin.process.computer.VertexComputeKey; import org.apache.tinkerpop.gremlin.process.computer.VertexProgram; import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep; import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep; +import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.HaltedTraverserStrategy; import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy; import org.apache.tinkerpop.gremlin.process.computer.util.AbstractVertexProgramBuilder; import org.apache.tinkerpop.gremlin.process.computer.util.SingleMessenger; @@ -64,7 +65,6 @@ import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.structure.util.ElementHelper; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory; import org.apache.tinkerpop.gremlin.util.function.MutableMetricsSupplier; import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator; import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; @@ -94,7 +94,6 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet< public static final String TRAVERSAL = "gremlin.traversalVertexProgram.traversal"; public static final String HALTED_TRAVERSERS = "gremlin.traversalVertexProgram.haltedTraversers"; public static final String ACTIVE_TRAVERSERS = "gremlin.traversalVertexProgram.activeTraversers"; - public static final String HALTED_TRAVERSER_FACTORY = "gremlin.traversalVertexProgram.haltedTraverserFactory"; protected static final String MUTATED_MEMORY_KEYS = "gremlin.traversalVertexProgram.mutatedMemoryKeys"; private static final String VOTE_TO_HALT = "gremlin.traversalVertexProgram.voteToHalt"; private static final String COMPLETED_BARRIERS = "gremlin.traversalVertexProgram.completedBarriers"; @@ -168,7 +167,11 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet< (this.traversal.get().getParent().asStep().getNextStep() instanceof ProfileStep && // same as above, but needed for profiling this.traversal.get().getParent().asStep().getNextStep().getNextStep() instanceof ComputerResultStep)); // determine how to store halted traversers - this.haltedTraverserDetachFactory = configuration.containsKey(HALTED_TRAVERSER_FACTORY) ? (Class) configuration.getProperty(HALTED_TRAVERSER_FACTORY) : ReferenceFactory.class; + this.haltedTraverserDetachFactory = ((HaltedTraverserStrategy) this.traversal.get().getStrategies().toList() + .stream() + .filter(strategy -> strategy instanceof HaltedTraverserStrategy) + .findAny() + .orElse(HaltedTraverserStrategy.reference())).getHaltedTraverserFactory(); // register traversal side-effects in memory this.memoryComputeKeys.addAll(MemoryTraversalSideEffects.getMemoryComputeKeys(this.traversal.get())); // register MapReducer memory compute keys @@ -196,7 +199,6 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet< public void storeState(final Configuration configuration) { VertexProgram.super.storeState(configuration); this.traversal.storeState(configuration, TRAVERSAL); - configuration.setProperty(HALTED_TRAVERSER_FACTORY, this.haltedTraverserDetachFactory); TraversalVertexProgram.storeHaltedTraversers(configuration, this.haltedTraversers); } @@ -280,9 +282,9 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet< }); } memory.add(VOTE_TO_HALT, activeTraversers.isEmpty() || WorkerExecutor.execute(vertex, new SingleMessenger<>(messenger, activeTraversers), this.traversalMatrix, memory, this.returnHaltedTraversers, this.haltedTraverserDetachFactory)); - } else { // ITERATION 1+ + } else // ITERATION 1+ memory.add(VOTE_TO_HALT, WorkerExecutor.execute(vertex, messenger, this.traversalMatrix, memory, this.returnHaltedTraversers, this.haltedTraverserDetachFactory)); - } + // save space by not having an empty halted traversers property if (this.returnHaltedTraversers || haltedTraversers.isEmpty()) vertex.<TraverserSet>property(HALTED_TRAVERSERS).remove(); } @@ -414,11 +416,6 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet< return this; } - public Builder haltedTraverserFactory(final Class detachFactory) { - this.configuration.setProperty(HALTED_TRAVERSER_FACTORY, detachFactory); - return this; - } - public Builder traversal(final TraversalSource traversalSource, final String scriptEngine, final String traversalScript, final Object... bindings) { return this.traversal(new ScriptTraversal<>(traversalSource, scriptEngine, traversalScript, bindings)); } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f78d1cb6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java index 2b2498b..58e44a2 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java @@ -30,7 +30,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequire import org.apache.tinkerpop.gremlin.process.traversal.util.PureTraversal; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory; import java.util.Collections; import java.util.List; @@ -42,7 +41,6 @@ import java.util.Set; public final class TraversalVertexProgramStep extends VertexProgramStep implements TraversalParent { public PureTraversal<?, ?> computerTraversal; - private Class haltedTraverserFactory = ReferenceFactory.class; public TraversalVertexProgramStep(final Traversal.Admin traversal, final Traversal.Admin<?, ?> computerTraversal) { super(traversal); @@ -71,9 +69,7 @@ public final class TraversalVertexProgramStep extends VertexProgramStep implemen this.getTraversal().getStrategies().toList().forEach(computerSpecificTraversal.getStrategies()::addStrategies); computerSpecificTraversal.setSideEffects(new MemoryTraversalSideEffects(this.getTraversal().getSideEffects())); computerSpecificTraversal.setParent(this); - final TraversalVertexProgram.Builder builder = TraversalVertexProgram.build() - .traversal(computerSpecificTraversal) - .haltedTraverserFactory(this.haltedTraverserFactory); + final TraversalVertexProgram.Builder builder = TraversalVertexProgram.build().traversal(computerSpecificTraversal); if (memory.exists(TraversalVertexProgram.HALTED_TRAVERSERS)) builder.haltedTraversers(memory.get(TraversalVertexProgram.HALTED_TRAVERSERS)); return builder.create(graph); @@ -100,10 +96,6 @@ public final class TraversalVertexProgramStep extends VertexProgramStep implemen this.integrateChild(this.computerTraversal.get()); } - public void setHaltedTraverserFactory(final Class haltedTraverserDetachFactory) { - this.haltedTraverserFactory = haltedTraverserDetachFactory; - } - /*@Override public int hashCode() { return super.hashCode() ^ this.computerTraversal.hashCode(); http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f78d1cb6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/HaltedTraverserFactoryStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/HaltedTraverserFactoryStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/HaltedTraverserFactoryStrategy.java deleted file mode 100644 index c2f3855..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/HaltedTraverserFactoryStrategy.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration; - -import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep; -import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep; -import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory; - -import java.util.Collections; -import java.util.List; -import java.util.Set; - -/** - * @author Marko A. Rodriguez (http://markorodriguez.com) - */ -public final class HaltedTraverserFactoryStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy { - - private final Class haltedTraverserFactory; - - private HaltedTraverserFactoryStrategy(final Class haltedTraverserFactory) { - this.haltedTraverserFactory = haltedTraverserFactory; - } - - public void apply(final Traversal.Admin<?, ?> traversal) { - // only the root traversal should be processed - if (traversal.getParent() instanceof EmptyStep) { - final List<TraversalVertexProgramStep> steps = TraversalHelper.getStepsOfAssignableClass(TraversalVertexProgramStep.class, traversal); - // only the last step (the one returning data) needs to have a non-reference traverser factory - if (!steps.isEmpty()) - steps.get(steps.size() - 1).setHaltedTraverserFactory(this.haltedTraverserFactory); - } - } - - public static HaltedTraverserFactoryStrategy detached() { - return new HaltedTraverserFactoryStrategy(DetachedFactory.class); - } - - public static HaltedTraverserFactoryStrategy reference() { - return new HaltedTraverserFactoryStrategy(ReferenceFactory.class); - } - - public Set<Class<? extends DecorationStrategy>> applyPrior() { - return Collections.singleton(VertexProgramStrategy.class); - } -} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f78d1cb6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/HaltedTraverserStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/HaltedTraverserStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/HaltedTraverserStrategy.java new file mode 100644 index 0000000..fd07e23 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/HaltedTraverserStrategy.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration; + +import org.apache.tinkerpop.gremlin.process.traversal.Traversal; +import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public final class HaltedTraverserStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy { + + private final Class haltedTraverserFactory; + + private HaltedTraverserStrategy(final Class haltedTraverserFactory) { + this.haltedTraverserFactory = haltedTraverserFactory; + } + + public void apply(final Traversal.Admin<?, ?> traversal) { + // do nothing as this is simply a metadata strategy + } + + public Class getHaltedTraverserFactory() { + return this.haltedTraverserFactory; + } + + public static HaltedTraverserStrategy detached() { + return new HaltedTraverserStrategy(DetachedFactory.class); + } + + public static HaltedTraverserStrategy reference() { + return new HaltedTraverserStrategy(ReferenceFactory.class); + } +} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f78d1cb6/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/traversal/strategy/decoration/HaltedTraverserFactoryStrategyTest.java ---------------------------------------------------------------------- diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/traversal/strategy/decoration/HaltedTraverserFactoryStrategyTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/traversal/strategy/decoration/HaltedTraverserFactoryStrategyTest.java deleted file mode 100644 index 43bc94e..0000000 --- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/traversal/strategy/decoration/HaltedTraverserFactoryStrategyTest.java +++ /dev/null @@ -1,96 +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.tinkergraph.process.computer.traversal.strategy.decoration; - -import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.HaltedTraverserFactoryStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; -import org.apache.tinkerpop.gremlin.structure.Graph; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPath; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceProperty; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex; -import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertexProperty; -import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -/** - * @author Marko A. Rodriguez (http://markorodriguez.com) - */ -public class HaltedTraverserFactoryStrategyTest { - - @Before - public void setup() { - // necessary as ComputerResult step for testing purposes attaches Attachables - System.setProperty("is.testing", "false"); - } - - @After - public void shutdown() { - System.setProperty("is.testing", "true"); - } - - @Test - public void shouldReturnDetachedElements() { - Graph graph = TinkerFactory.createModern(); - GraphTraversalSource g = graph.traversal().withComputer().withStrategies(HaltedTraverserFactoryStrategy.detached()); - g.V().out().forEachRemaining(vertex -> assertEquals(DetachedVertex.class, vertex.getClass())); - g.V().out().properties("name").forEachRemaining(vertexProperty -> assertEquals(DetachedVertexProperty.class, vertexProperty.getClass())); - g.V().out().values("name").forEachRemaining(value -> assertEquals(String.class, value.getClass())); - g.V().out().outE().forEachRemaining(edge -> assertEquals(DetachedEdge.class, edge.getClass())); - g.V().out().outE().properties("weight").forEachRemaining(property -> assertEquals(DetachedProperty.class, property.getClass())); - g.V().out().outE().values("weight").forEachRemaining(value -> assertEquals(Double.class, value.getClass())); - g.V().out().out().forEachRemaining(vertex -> assertEquals(DetachedVertex.class, vertex.getClass())); - g.V().out().out().path().forEachRemaining(path -> assertEquals(DetachedPath.class, path.getClass())); - } - - @Test - public void shouldReturnReferenceElements() { - Graph graph = TinkerFactory.createModern(); - GraphTraversalSource g = graph.traversal().withComputer().withStrategies(HaltedTraverserFactoryStrategy.reference()); - g.V().out().forEachRemaining(vertex -> assertEquals(ReferenceVertex.class, vertex.getClass())); - g.V().out().properties("name").forEachRemaining(vertexProperty -> assertEquals(ReferenceVertexProperty.class, vertexProperty.getClass())); - g.V().out().values("name").forEachRemaining(value -> assertEquals(String.class, value.getClass())); - g.V().out().outE().forEachRemaining(edge -> assertEquals(ReferenceEdge.class, edge.getClass())); - g.V().out().outE().properties("weight").forEachRemaining(property -> assertEquals(ReferenceProperty.class, property.getClass())); - g.V().out().outE().values("weight").forEachRemaining(value -> assertEquals(Double.class, value.getClass())); - g.V().out().out().forEachRemaining(vertex -> assertEquals(ReferenceVertex.class, vertex.getClass())); - g.V().out().out().path().forEachRemaining(path -> assertEquals(ReferencePath.class, path.getClass())); - // the default should be reference elements - g = graph.traversal().withComputer(); - g.V().out().forEachRemaining(vertex -> assertEquals(ReferenceVertex.class, vertex.getClass())); - g.V().out().properties("name").forEachRemaining(vertexProperty -> assertEquals(ReferenceVertexProperty.class, vertexProperty.getClass())); - g.V().out().values("name").forEachRemaining(value -> assertEquals(String.class, value.getClass())); - g.V().out().outE().forEachRemaining(edge -> assertEquals(ReferenceEdge.class, edge.getClass())); - g.V().out().outE().properties("weight").forEachRemaining(property -> assertEquals(ReferenceProperty.class, property.getClass())); - g.V().out().outE().values("weight").forEachRemaining(value -> assertEquals(Double.class, value.getClass())); - g.V().out().out().forEachRemaining(vertex -> assertEquals(ReferenceVertex.class, vertex.getClass())); - g.V().out().out().path().forEachRemaining(path -> assertEquals(ReferencePath.class, path.getClass())); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f78d1cb6/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/traversal/strategy/decoration/HaltedTraverserStrategyTest.java ---------------------------------------------------------------------- diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/traversal/strategy/decoration/HaltedTraverserStrategyTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/traversal/strategy/decoration/HaltedTraverserStrategyTest.java new file mode 100644 index 0000000..9c92efe --- /dev/null +++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/traversal/strategy/decoration/HaltedTraverserStrategyTest.java @@ -0,0 +1,102 @@ +/* + * 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.tinkergraph.process.computer.traversal.strategy.decoration; + +import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.HaltedTraverserStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; +import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPath; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex; +import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceProperty; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertexProperty; +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public class HaltedTraverserStrategyTest { + + @Before + public void setup() { + // necessary as ComputerResult step for testing purposes attaches Attachables + System.setProperty("is.testing", "false"); + } + + @After + public void shutdown() { + System.setProperty("is.testing", "true"); + } + + @Test + public void shouldReturnDetachedElements() { + final Graph graph = TinkerFactory.createModern(); + final GraphTraversalSource g = graph.traversal().withComputer().withStrategies(HaltedTraverserStrategy.detached()); + g.V().out().forEachRemaining(vertex -> assertEquals(DetachedVertex.class, vertex.getClass())); + g.V().out().properties("name").forEachRemaining(vertexProperty -> assertEquals(DetachedVertexProperty.class, vertexProperty.getClass())); + g.V().out().values("name").forEachRemaining(value -> assertEquals(String.class, value.getClass())); + g.V().out().outE().forEachRemaining(edge -> assertEquals(DetachedEdge.class, edge.getClass())); + g.V().out().outE().properties("weight").forEachRemaining(property -> assertEquals(DetachedProperty.class, property.getClass())); + g.V().out().outE().values("weight").forEachRemaining(value -> assertEquals(Double.class, value.getClass())); + g.V().out().out().forEachRemaining(vertex -> assertEquals(DetachedVertex.class, vertex.getClass())); + g.V().out().out().path().forEachRemaining(path -> assertEquals(DetachedPath.class, path.getClass())); + g.V().out().pageRank().forEachRemaining(vertex -> assertEquals(DetachedVertex.class, vertex.getClass())); + g.V().out().pageRank().out().forEachRemaining(vertex -> assertEquals(DetachedVertex.class, vertex.getClass())); + } + + @Test + public void shouldReturnReferenceElements() { + final Graph graph = TinkerFactory.createModern(); + GraphTraversalSource g = graph.traversal().withComputer().withStrategies(HaltedTraverserStrategy.reference()); + g.V().out().forEachRemaining(vertex -> assertEquals(ReferenceVertex.class, vertex.getClass())); + g.V().out().properties("name").forEachRemaining(vertexProperty -> assertEquals(ReferenceVertexProperty.class, vertexProperty.getClass())); + g.V().out().values("name").forEachRemaining(value -> assertEquals(String.class, value.getClass())); + g.V().out().outE().forEachRemaining(edge -> assertEquals(ReferenceEdge.class, edge.getClass())); + g.V().out().outE().properties("weight").forEachRemaining(property -> assertEquals(ReferenceProperty.class, property.getClass())); + g.V().out().outE().values("weight").forEachRemaining(value -> assertEquals(Double.class, value.getClass())); + g.V().out().out().forEachRemaining(vertex -> assertEquals(ReferenceVertex.class, vertex.getClass())); + g.V().out().out().path().forEachRemaining(path -> assertEquals(ReferencePath.class, path.getClass())); + g.V().out().pageRank().forEachRemaining(vertex -> assertEquals(ReferenceVertex.class, vertex.getClass())); + g.V().out().pageRank().out().forEachRemaining(vertex -> assertEquals(ReferenceVertex.class, vertex.getClass())); + // the default should be reference elements + g = graph.traversal().withComputer(); + g.V().out().forEachRemaining(vertex -> assertEquals(ReferenceVertex.class, vertex.getClass())); + g.V().out().properties("name").forEachRemaining(vertexProperty -> assertEquals(ReferenceVertexProperty.class, vertexProperty.getClass())); + g.V().out().values("name").forEachRemaining(value -> assertEquals(String.class, value.getClass())); + g.V().out().outE().forEachRemaining(edge -> assertEquals(ReferenceEdge.class, edge.getClass())); + g.V().out().outE().properties("weight").forEachRemaining(property -> assertEquals(ReferenceProperty.class, property.getClass())); + g.V().out().outE().values("weight").forEachRemaining(value -> assertEquals(Double.class, value.getClass())); + g.V().out().out().forEachRemaining(vertex -> assertEquals(ReferenceVertex.class, vertex.getClass())); + g.V().out().out().path().forEachRemaining(path -> assertEquals(ReferencePath.class, path.getClass())); + g.V().out().pageRank().forEachRemaining(vertex -> assertEquals(ReferenceVertex.class, vertex.getClass())); + g.V().out().pageRank().out().forEachRemaining(vertex -> assertEquals(ReferenceVertex.class, vertex.getClass())); + } + +}
