Repository: tinkerpop Updated Branches: refs/heads/TINKERPOP-1975-x [created] e1cd83d0f
wip Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/e1cd83d0 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/e1cd83d0 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/e1cd83d0 Branch: refs/heads/TINKERPOP-1975-x Commit: e1cd83d0fc75d35a8443abcacba3aecb92a6d589 Parents: 94d0c3c Author: Stephen Mallette <sp...@genoprime.com> Authored: Thu May 31 12:55:13 2018 -0400 Committer: Stephen Mallette <sp...@genoprime.com> Committed: Thu May 31 12:55:13 2018 -0400 ---------------------------------------------------------------------- .../step/map/PageRankVertexProgramStep.java | 60 ++++++++++++++++++-- .../process/traversal/Parameterizing.java | 37 ------------ .../traversal/dsl/graph/GraphTraversal.java | 24 +++++++- .../process/traversal/step/Configuring.java | 26 +++++++++ .../process/traversal/step/Mutating.java | 5 +- .../process/traversal/step/Parameterizing.java | 38 +++++++++++++ .../process/traversal/step/filter/DropStep.java | 9 ++- .../traversal/step/map/AddEdgeStartStep.java | 6 +- .../process/traversal/step/map/AddEdgeStep.java | 7 +-- .../traversal/step/map/AddVertexStartStep.java | 7 +-- .../traversal/step/map/AddVertexStep.java | 7 +-- .../step/sideEffect/AddPropertyStep.java | 9 +-- .../process/traversal/step/util/Parameters.java | 2 + .../strategy/decoration/ElementIdStrategy.java | 2 +- .../strategy/decoration/PartitionStrategy.java | 6 +- .../traversal/step/map/PageRankTest.java | 41 +++++++++++++ 16 files changed, 211 insertions(+), 75 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java index 2f67aeb..a3c6238 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java @@ -23,12 +23,15 @@ import org.apache.tinkerpop.gremlin.process.computer.GraphFilter; import org.apache.tinkerpop.gremlin.process.computer.Memory; import org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgram; import org.apache.tinkerpop.gremlin.process.computer.traversal.lambda.HaltedTraversersCountTraversal; +import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring; +import org.apache.tinkerpop.gremlin.process.traversal.step.Parameterizing; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating; import org.apache.tinkerpop.gremlin.process.traversal.step.TimesModulating; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent; +import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; import org.apache.tinkerpop.gremlin.process.traversal.util.PureTraversal; import org.apache.tinkerpop.gremlin.structure.Edge; @@ -42,9 +45,12 @@ import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) + * @author Stephen Mallette (http://stephen.genoprime.com) */ -public final class PageRankVertexProgramStep extends VertexProgramStep implements TraversalParent, ByModulating, TimesModulating { +public final class PageRankVertexProgramStep extends VertexProgramStep + implements TraversalParent, ByModulating, TimesModulating, Configuring { + private Parameters parameters = new Parameters(); private PureTraversal<Vertex, Edge> edgeTraversal; private String pageRankProperty = PageRankVertexProgram.PAGE_RANK; private int times = 20; @@ -53,23 +59,59 @@ public final class PageRankVertexProgramStep extends VertexProgramStep implement public PageRankVertexProgramStep(final Traversal.Admin traversal, final double alpha) { super(traversal); this.alpha = alpha; - this.modulateBy(__.<Vertex>outE().asAdmin()); + this.configure(PageRank.EDGES, __.<Vertex>outE().asAdmin()); } @Override + public void configure(final Object... keyValues) { + if (keyValues[0].equals(PageRank.EDGES)) { + if (!(keyValues[1] instanceof Traversal)) + throw new IllegalArgumentException("PageRank.EDGES requires a Traversal as its argument"); + this.edgeTraversal = new PureTraversal<>(((Traversal<Vertex,Edge>) keyValues[1]).asAdmin()); + this.integrateChild(this.edgeTraversal.get()); + } else if (keyValues[0].equals(PageRank.PROPERTY_NAME)) { + if (!(keyValues[1] instanceof String)) + throw new IllegalArgumentException("PageRank.PROPERTY_NAME requires a String as its argument"); + this.pageRankProperty = (String) keyValues[1]; + } else if (keyValues[0].equals(PageRank.TIMES)) { + if (!(keyValues[1] instanceof Integer)) + throw new IllegalArgumentException("PageRank.TIMES requires a String as its argument"); + this.times = (int) keyValues[1]; + }else { + this.parameters.set(this, keyValues); + } + } + + @Override + public Parameters getParameters() { + return parameters; + } + + /** + * @deprecated As of release 3.4.0, replaced by {@link #configure(Object...)} + */ + @Deprecated + @Override public void modulateBy(final Traversal.Admin<?, ?> edgeTraversal) { - this.edgeTraversal = new PureTraversal<>((Traversal.Admin<Vertex, Edge>) edgeTraversal); - this.integrateChild(this.edgeTraversal.get()); + configure(PageRank.EDGES, edgeTraversal); } + /** + * @deprecated As of release 3.4.0, replaced by {@link #configure(Object...)} + */ + @Deprecated @Override public void modulateBy(final String pageRankProperty) { - this.pageRankProperty = pageRankProperty; + configure(PageRank.PROPERTY_NAME, pageRankProperty); } + /** + * @deprecated As of release 3.4.0, replaced by {@link #configure(Object...)} + */ + @Deprecated @Override public void modulateTimes(int times) { - this.times = times; + configure(PageRank.TIMES, times); } @Override @@ -118,4 +160,10 @@ public final class PageRankVertexProgramStep extends VertexProgramStep implement public int hashCode() { return super.hashCode() ^ this.edgeTraversal.hashCode() ^ this.pageRankProperty.hashCode() ^ this.times; } + + public static class PageRank { + public static final String TIMES = Graph.Hidden.hide("tinkerpop.pageRank.times"); + public static final String EDGES = Graph.Hidden.hide("tinkerpop.pageRank.edges"); + public static final String PROPERTY_NAME = Graph.Hidden.hide("tinkerpop.pageRank.propertyName"); + } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Parameterizing.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Parameterizing.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Parameterizing.java deleted file mode 100644 index 9b7e088..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Parameterizing.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tinkerpop.gremlin.process.traversal; - -import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters; - -/** - * An interface for {@link Step} implementations that hold a {@link Parameters} object, which fold in arguments from - * other steps. It is typically used on mutating steps, such as {@code addV()}, where calls to {@code property(k,v)} - * are folded in as parameters to that add vertex step. - * - * @author Marko A. Rodriguez (http://markorodriguez.com) - * @author Stephen Mallette (http://stephen.genoprime.com) - */ -public interface Parameterizing { - - /** - * Gets the parameters on the step. - */ - public Parameters getParameters(); -} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java index 0fd3599..7d1e7e4 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java @@ -36,6 +36,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.lambda.LoopTraversal; import org.apache.tinkerpop.gremlin.process.traversal.lambda.PredicateTraverser; import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal; import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating; +import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring; import org.apache.tinkerpop.gremlin.process.traversal.step.FromToModulating; import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating; import org.apache.tinkerpop.gremlin.process.traversal.step.TimesModulating; @@ -2074,10 +2075,10 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { final Step endStep = this.asAdmin().getEndStep(); if ((endStep instanceof AddVertexStep || endStep instanceof AddEdgeStep || endStep instanceof AddVertexStartStep || endStep instanceof AddEdgeStartStep) && keyValues.length == 0 && null == cardinality) { - ((Mutating) endStep).addPropertyMutations(key, value); + ((Mutating) endStep).configure(key, value); } else { this.asAdmin().addStep(new AddPropertyStep(this.asAdmin(), cardinality, key, value)); - ((AddPropertyStep) this.asAdmin().getEndStep()).addPropertyMutations(keyValues); + ((AddPropertyStep) this.asAdmin().getEndStep()).configure(keyValues); } return this; } @@ -2496,6 +2497,24 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { return this.asAdmin().addStep(new LambdaCollectingBarrierStep<>(this.asAdmin(), (Consumer) barrierConsumer, Integer.MAX_VALUE)); } + //// WITH-MODULATOR + + /** + * Provides a configuration to a step in the form of a key and value pair. The key of the configuration must be + * step specific and therefore a configuration could be supplied that is not known to be valid until execution. + * + * @param key the key of the configuration to apply to a step + * @param value the value of the configuration to apply to a step + * @return the traversal with a modulated step + * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#with-step" target="_blank">Reference Documentation - With Step</a> + * @since 3.4.0 + */ + public default GraphTraversal<S,E> with(final String key, final Object value) { + this.asAdmin().getBytecode().addStep(Symbols.with, key, value); + final Object[] configPair = { key, value }; + ((Configuring) this.asAdmin().getEndStep()).configure(configPair); + return this; + } //// BY-MODULATORS @@ -2801,6 +2820,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { public static final String program = "program"; public static final String by = "by"; + public static final String with = "with"; public static final String times = "times"; public static final String as = "as"; public static final String option = "option"; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Configuring.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Configuring.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Configuring.java new file mode 100644 index 0000000..4297ca9 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Configuring.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tinkerpop.gremlin.process.traversal.step; + +/** + * @author Stephen Mallette (http://stephen.genoprime.com) + */ +public interface Configuring extends Parameterizing { + public void configure(final Object... keyValues); +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java index 50e415a..14553d9 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java @@ -28,13 +28,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event; * @author Stephen Mallette (http://stephen.genoprime.com) * @author Matt Frantz (http://github.com/mhfrantz) */ -public interface Mutating<E extends Event> { +public interface Mutating<E extends Event> extends Configuring { /** * Gets the callback registry for events that the step raises. */ public CallbackRegistry<E> getMutatingCallbackRegistry(); - - public void addPropertyMutations(final Object... keyValues); - } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Parameterizing.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Parameterizing.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Parameterizing.java new file mode 100644 index 0000000..a4d27aa --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Parameterizing.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tinkerpop.gremlin.process.traversal.step; + +import org.apache.tinkerpop.gremlin.process.traversal.Step; +import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters; + +/** + * An interface for {@link Step} implementations that hold a {@link Parameters} object, which fold in arguments from + * other steps. It is typically used on mutating steps, such as {@code addV()}, where calls to {@code property(k,v)} + * are folded in as parameters to that add vertex step. + * + * @author Marko A. Rodriguez (http://markorodriguez.com) + * @author Stephen Mallette (http://stephen.genoprime.com) + */ +public interface Parameterizing { + + /** + * Gets the parameters on the step. + */ + public Parameters getParameters(); +} http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DropStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DropStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DropStep.java index cd95e48..e7e14bb 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DropStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DropStep.java @@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.filter; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating; +import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters; import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.CallbackRegistry; import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event; import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.ListCallbackRegistry; @@ -94,7 +95,13 @@ public final class DropStep<S> extends FilterStep<S> implements Mutating<Event> /** * This method doesn't do anything as {@code drop()} doesn't take property mutation arguments. */ - public void addPropertyMutations(final Object... keyValues) { + @Override + public void configure(final Object... keyValues) { // do nothing } + + @Override + public Parameters getParameters() { + return Parameters.EMPTY; + } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java index 73f69a0..c6a2ef1 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java @@ -19,7 +19,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map; -import org.apache.tinkerpop.gremlin.process.traversal.Parameterizing; +import org.apache.tinkerpop.gremlin.process.traversal.step.Parameterizing; import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; @@ -51,7 +51,7 @@ import java.util.Set; * @author Marko A. Rodriguez (http://markorodriguez.com) */ public final class AddEdgeStartStep extends AbstractStep<Edge, Edge> - implements Mutating<Event.EdgeAddedEvent>, TraversalParent, Parameterizing, Scoping, FromToModulating { + implements Mutating<Event.EdgeAddedEvent>, TraversalParent, Scoping, FromToModulating { private static final String FROM = Graph.Hidden.hide("from"); private static final String TO = Graph.Hidden.hide("to"); @@ -86,7 +86,7 @@ public final class AddEdgeStartStep extends AbstractStep<Edge, Edge> } @Override - public void addPropertyMutations(final Object... keyValues) { + public void configure(final Object... keyValues) { this.parameters.set(this, keyValues); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java index 81afd03..27197f4 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java @@ -18,7 +18,7 @@ */ package org.apache.tinkerpop.gremlin.process.traversal.step.map; -import org.apache.tinkerpop.gremlin.process.traversal.Parameterizing; +import org.apache.tinkerpop.gremlin.process.traversal.step.Parameterizing; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.step.FromToModulating; @@ -37,7 +37,6 @@ import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.util.Attachable; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory; import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph; import java.util.List; @@ -48,7 +47,7 @@ import java.util.Set; * @author Stephen Mallette (http://stephen.genoprime.com) */ public final class AddEdgeStep<S> extends MapStep<S, Edge> - implements Mutating<Event.EdgeAddedEvent>, TraversalParent, Parameterizing, Scoping, FromToModulating { + implements Mutating<Event.EdgeAddedEvent>, TraversalParent, Scoping, FromToModulating { private static final String FROM = Graph.Hidden.hide("from"); private static final String TO = Graph.Hidden.hide("to"); @@ -82,7 +81,7 @@ public final class AddEdgeStep<S> extends MapStep<S, Edge> } @Override - public void addPropertyMutations(final Object... keyValues) { + public void configure(final Object... keyValues) { this.parameters.set(this, keyValues); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java index 920fa45..f47e631 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java @@ -18,7 +18,7 @@ */ package org.apache.tinkerpop.gremlin.process.traversal.step.map; -import org.apache.tinkerpop.gremlin.process.traversal.Parameterizing; +import org.apache.tinkerpop.gremlin.process.traversal.step.Parameterizing; import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; @@ -37,7 +37,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementExce import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory; import java.util.List; import java.util.Set; @@ -47,7 +46,7 @@ import java.util.Set; * @author Stephen Mallette (http://stephen.genoprime.com) */ public final class AddVertexStartStep extends AbstractStep<Vertex, Vertex> - implements Mutating<Event.VertexAddedEvent>, TraversalParent, Parameterizing, Scoping { + implements Mutating<Event.VertexAddedEvent>, TraversalParent, Scoping { private Parameters parameters = new Parameters(); private boolean first = true; @@ -79,7 +78,7 @@ public final class AddVertexStartStep extends AbstractStep<Vertex, Vertex> } @Override - public void addPropertyMutations(final Object... keyValues) { + public void configure(final Object... keyValues) { this.parameters.set(this, keyValues); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java index 13e2fc8..e555277 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java @@ -18,7 +18,7 @@ */ package org.apache.tinkerpop.gremlin.process.traversal.step.map; -import org.apache.tinkerpop.gremlin.process.traversal.Parameterizing; +import org.apache.tinkerpop.gremlin.process.traversal.step.Parameterizing; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating; @@ -33,7 +33,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequire import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory; import java.util.List; import java.util.Set; @@ -43,7 +42,7 @@ import java.util.Set; * @author Stephen Mallette (http://stephen.genoprime.com) */ public final class AddVertexStep<S> extends MapStep<S, Vertex> - implements Mutating<Event.VertexAddedEvent>, TraversalParent, Parameterizing, Scoping { + implements Mutating<Event.VertexAddedEvent>, TraversalParent, Scoping { private Parameters parameters = new Parameters(); private CallbackRegistry<Event.VertexAddedEvent> callbackRegistry; @@ -74,7 +73,7 @@ public final class AddVertexStep<S> extends MapStep<S, Vertex> } @Override - public void addPropertyMutations(final Object... keyValues) { + public void configure(final Object... keyValues) { this.parameters.set(this, keyValues); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java index 7509f86..04a8414 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java @@ -18,7 +18,7 @@ */ package org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect; -import org.apache.tinkerpop.gremlin.process.traversal.Parameterizing; +import org.apache.tinkerpop.gremlin.process.traversal.step.Parameterizing; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating; @@ -37,9 +37,6 @@ import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty; import java.util.List; import java.util.Set; @@ -48,7 +45,7 @@ import java.util.Set; * @author Marko A. Rodriguez (http://markorodriguez.com) */ public final class AddPropertyStep<S extends Element> extends SideEffectStep<S> - implements Mutating<Event.ElementPropertyChangedEvent>, TraversalParent, Parameterizing, Scoping { + implements Mutating<Event.ElementPropertyChangedEvent>, TraversalParent, Scoping { private Parameters parameters = new Parameters(); private final VertexProperty.Cardinality cardinality; @@ -76,7 +73,7 @@ public final class AddPropertyStep<S extends Element> extends SideEffectStep<S> } @Override - public void addPropertyMutations(final Object... keyValues) { + public void configure(final Object... keyValues) { this.parameters.set(this, keyValues); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java index d368322..40d9330 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java @@ -48,6 +48,8 @@ import java.util.function.Supplier; */ public final class Parameters implements Cloneable, Serializable { + public static final Parameters EMPTY = new Parameters(); + private static final Object[] EMPTY_ARRAY = new Object[0]; private Map<Object, List<Object>> parameters = new HashMap<>(); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java index c8f9d22..25a2833 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java @@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.MapConfiguration; import org.apache.tinkerpop.gremlin.process.traversal.P; -import org.apache.tinkerpop.gremlin.process.traversal.Parameterizing; +import org.apache.tinkerpop.gremlin.process.traversal.step.Parameterizing; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java index 438d8b2..877c2df 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java @@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.MapConfiguration; import org.apache.tinkerpop.gremlin.process.traversal.P; -import org.apache.tinkerpop.gremlin.process.traversal.Parameterizing; +import org.apache.tinkerpop.gremlin.process.traversal.step.Parameterizing; import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; @@ -203,7 +203,7 @@ public final class PartitionStrategy extends AbstractTraversalStrategy<Traversal // ends up being a Vertex or not. AddPropertyStep currently chooses to simply not bother // to use the additional "property mutations" if the Element being mutated is a Edge or // VertexProperty - ((Mutating) step).addPropertyMutations(partitionKey, writePartition); + ((Mutating) step).configure(partitionKey, writePartition); if (includeMetaProperties) { // GraphTraversal folds g.addV().property('k','v') to just AddVertexStep/AddVertexStartStep so this @@ -216,7 +216,7 @@ public final class PartitionStrategy extends AbstractTraversalStrategy<Traversal final VertexProperty.Cardinality cardinality = vertexFeatures.getCardinality((String) k); v.forEach(o -> { final AddPropertyStep addPropertyStep = new AddPropertyStep(traversal, cardinality, k, o); - addPropertyStep.addPropertyMutations(partitionKey, writePartition); + addPropertyStep.configure(partitionKey, writePartition); addPropertyStepsToAppend.add(addPropertyStep); // need to remove the parameter from the AddVertex/StartStep because it's now being added http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e1cd83d0/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PageRankTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PageRankTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PageRankTest.java index 07a2b04..325621e 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PageRankTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PageRankTest.java @@ -23,6 +23,7 @@ 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.computer.ranking.pagerank.PageRankVertexProgram; +import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.PageRankVertexProgramStep.PageRank; import org.apache.tinkerpop.gremlin.process.traversal.Order; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; @@ -63,6 +64,8 @@ public abstract class PageRankTest extends AbstractGremlinProcessTest { public abstract Traversal<Vertex, Map<String, List<Object>>> get_g_V_hasLabelXsoftwareX_hasXname_rippleX_pageRankX1X_byXinEXcreatedXX_timesX1X_byXpriorsX_inXcreatedX_unionXboth__identityX_valueMapXname_priorsX(); + public abstract Traversal<Vertex, Map<Object, List<Vertex>>> get_g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_withXPROPERTY_NAME_pageRankXX_withXEDGES_inEXX_withXTIMES_1X_inXcreatedX_groupXmX_byXpageRankX_capXmX(); + public abstract Traversal<Vertex, Map<Object, List<Vertex>>> get_g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_byXpageRankX_byXinEX_timesX1X_inXcreatedX_groupXmX_byXpageRankX_capXmX(); @Test @@ -238,6 +241,39 @@ public abstract class PageRankTest extends AbstractGremlinProcessTest { }); } + @Test + @LoadGraphWith(MODERN) + public void g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_withXPROPERTY_NAME_pageRankXX_withXEDGES_inEXX_withXTIMES_1X_inXcreatedX_groupXmX_byXpageRankX_capXmX() { + // [{2.0=[v[4], v[4], v[4], v[4]], 1.0=[v[6], v[6], v[6], v[1], v[1], v[1]], software=[v[5], v[3], v[3], v[3]]}] + final Traversal<Vertex, Map<Object, List<Vertex>>> traversal = get_g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_withXPROPERTY_NAME_pageRankXX_withXEDGES_inEXX_withXTIMES_1X_inXcreatedX_groupXmX_byXpageRankX_capXmX(); + printTraversalForm(traversal); + final Map<Object, List<Vertex>> map = traversal.next(); + assertFalse(traversal.hasNext()); + assertEquals(3, map.size()); + assertTrue(map.containsKey("software")); + map.forEach((k, v) -> { + boolean found = false; + if (!k.equals("software") && v.size() == 4) { + assertEquals(2.0d, ((Number) k).doubleValue(), 0.01d); + assertEquals(4, v.stream().filter(vertex -> vertex.id().equals(convertToVertexId(graph, "josh"))).count()); + found = true; + } else if (v.size() == 6) { + assertEquals(1.0d, ((Number) k).doubleValue(), 0.01d); + assertEquals(3, v.stream().filter(vertex -> vertex.id().equals(convertToVertexId(graph, "peter"))).count()); + assertEquals(3, v.stream().filter(vertex -> vertex.id().equals(convertToVertexId(graph, "marko"))).count()); + found = true; + } else if (v.size() == 4) { + assertEquals("software", k); + assertEquals(3, v.stream().filter(vertex -> vertex.id().equals(convertToVertexId(graph, "lop"))).count()); + assertEquals(1, v.stream().filter(vertex -> vertex.id().equals(convertToVertexId(graph, "ripple"))).count()); + found = true; + } + + if (!found) + fail("There are too many key/values: " + k + "--" + v); + }); + } + public static class Traversals extends PageRankTest { @Override @@ -284,5 +320,10 @@ public abstract class PageRankTest extends AbstractGremlinProcessTest { public Traversal<Vertex, Map<Object, List<Vertex>>> get_g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_byXpageRankX_byXinEX_timesX1X_inXcreatedX_groupXmX_byXpageRankX_capXmX() { return g.V().out("created").group("m").by(T.label).pageRank(1.0).by("pageRank").by(__.inE()).times(1).in("created").group("m").by("pageRank").cap("m"); } + + @Override + public Traversal<Vertex, Map<Object, List<Vertex>>> get_g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_withXPROPERTY_NAME_pageRankXX_withXEDGES_inEXX_withXTIMES_1X_inXcreatedX_groupXmX_byXpageRankX_capXmX() { + return g.V().out("created").group("m").by(T.label).pageRank(1.0).with(PageRank.PROPERTY_NAME, "pageRank").with(PageRank.EDGES, __.inE()).with(PageRank.TIMES, 1).in("created").group("m").by("pageRank").cap("m"); + } } }