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 2017/11/28 16:45:00 UTC
[1/3] tinkerpop git commit: Added NoneStep which simply
filter(false). Traversal.none() was added which appends the NoneStep.
Traversal.iterate() was updated such that if the traversal has not been
compiled yet, then Traversal.none() is called to ensure
Repository: tinkerpop
Updated Branches:
refs/heads/master 78baa86dc -> fb41d8471
Added NoneStep which simply filter(false). Traversal.none() was added which appends the NoneStep. Traversal.iterate() was updated such that if the traversal has not been compiled yet, then Traversal.none() is called to ensure that a full filter is propagated in the bytecode.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/2a957bb5
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/2a957bb5
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/2a957bb5
Branch: refs/heads/master
Commit: 2a957bb586263b2dd70b4db36d1b3c6f87d5596f
Parents: 26ea2be
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Nov 21 03:44:32 2017 -0800
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Nov 21 03:44:32 2017 -0800
----------------------------------------------------------------------
CHANGELOG.asciidoc | 1 +
.../gremlin/process/traversal/Traversal.java | 23 ++++++++--
.../process/traversal/step/filter/NoneStep.java | 44 ++++++++++++++++++++
.../optimization/LazyBarrierStrategy.java | 2 +
.../optimization/PathRetractionStrategy.java | 2 +
.../process/traversal/TraversalTest.java | 2 +-
.../traversal/dsl/graph/GraphTraversalTest.java | 2 +-
.../process/traversal/CoreTraversalTest.java | 11 +++++
8 files changed, 81 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2a957bb5/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 327e2cb..fd6ed48 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
This release also includes changes from <<release-3-2-7, 3.2.7>>.
+* Added `NoneStep` and `Traversal.none()` for full filtering integration with `iterate()`.
* Fixed bug in serialization of `Path` for GraphSON 3.0 in `gremlin-python`.
* Added support for GraphSON 3.0 in Gremlin.Net.
* Added `math()`-step which supports scientific calculator capabilities for numbers within a traversal.
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2a957bb5/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 c085dc7..220c995 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
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.remote.traversal.step.map.RemoteStep;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NoneStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
@@ -69,6 +70,7 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A
}
public static final String profile = "profile";
+ public static final String none = "none";
}
/**
@@ -149,7 +151,7 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A
* {@link TraversalSource#withRemote(Configuration)}. Calling this method otherwise will yield an
* {@code IllegalStateException}.
*/
- public default <T> CompletableFuture<T> promise(final Function<Traversal<S,E>, T> traversalFunction) {
+ public default <T> CompletableFuture<T> promise(final Function<Traversal<S, E>, T> traversalFunction) {
// apply strategies to see if RemoteStrategy has any effect (i.e. add RemoteStep)
if (!this.asAdmin().isLocked()) this.asAdmin().applyStrategies();
@@ -191,7 +193,10 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A
*/
public default <A, B> Traversal<A, B> iterate() {
try {
- if (!this.asAdmin().isLocked()) this.asAdmin().applyStrategies();
+ if (!this.asAdmin().isLocked()) {
+ this.none();
+ this.asAdmin().applyStrategies();
+ }
// use the end step so the results are bulked
final Step<?, E> endStep = this.asAdmin().getEndStep();
while (true) {
@@ -203,6 +208,16 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A
}
/**
+ * Filter all traversers in the traversal.
+ *
+ * @return the updated traversal with respective {@link NoneStep}.
+ */
+ public default Traversal<S, E> none() {
+ this.asAdmin().getBytecode().addStep(Symbols.none);
+ return this.asAdmin().addStep(new NoneStep<>(this.asAdmin()));
+ }
+
+ /**
* Profile the traversal.
*
* @return the updated traversal with respective {@link ProfileSideEffectStep}.
@@ -259,8 +274,8 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A
*/
@Override
public default void close() throws Exception {
- for(final Step<?,?> step : this.asAdmin().getSteps()) {
- if(step instanceof AutoCloseable)
+ for (final Step<?, ?> step : this.asAdmin().getSteps()) {
+ if (step instanceof AutoCloseable)
((AutoCloseable) step).close();
}
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2a957bb5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NoneStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NoneStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NoneStep.java
new file mode 100644
index 0000000..1d43444
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NoneStep.java
@@ -0,0 +1,44 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class NoneStep<S> extends FilterStep<S> {
+
+ public NoneStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return StringFactory.stepString(this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2a957bb5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java
index 9c8f931..927d6c9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java
@@ -24,6 +24,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.step.Barrier;
import org.apache.tinkerpop.gremlin.process.traversal.step.PathProcessor;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NoneStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.NoOpBarrierStep;
@@ -86,6 +87,7 @@ public final class LazyBarrierStrategy extends AbstractTraversalStrategy<Travers
(((GraphStep) step).getIds().length == 0 && !(step.getNextStep() instanceof HasStep))))) {
if (foundFlatMap && !labeledPath &&
!(step.getNextStep() instanceof Barrier) &&
+ !(step.getNextStep() instanceof NoneStep) &&
!(step.getNextStep() instanceof EmptyStep)) {
final Step noOpBarrierStep = new NoOpBarrierStep<>(traversal, MAX_BARRIER_SIZE);
TraversalHelper.copyLabels(step, noOpBarrierStep, true);
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2a957bb5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java
index a079a1c..d370c38 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java
@@ -29,6 +29,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NoneStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.NoOpBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectOneStep;
@@ -136,6 +137,7 @@ public final class PathRetractionStrategy extends AbstractTraversalStrategy<Trav
!(currentStep instanceof Barrier) &&
!(currentStep.getNextStep() instanceof Barrier) &&
!(currentStep.getTraversal().getParent() instanceof MatchStep) &&
+ !(currentStep.getNextStep() instanceof NoneStep) &&
!(currentStep.getNextStep() instanceof EmptyStep))
TraversalHelper.insertAfterStep(new NoOpBarrierStep<>(traversal, this.standardBarrierSize), currentStep, traversal);
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2a957bb5/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalTest.java
index 020ed72..80d5024 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalTest.java
@@ -267,7 +267,7 @@ public class TraversalTest {
@Override
public Bytecode getBytecode() {
- return null;
+ return new Bytecode();
}
@Override
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2a957bb5/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java
index d3fe1c4..6decbe0 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java
@@ -42,7 +42,7 @@ import static org.junit.Assert.assertEquals;
public class GraphTraversalTest {
private static final Logger logger = LoggerFactory.getLogger(GraphTraversalTest.class);
- private static Set<String> NO_GRAPH = new HashSet<>(Arrays.asList("asAdmin", "by", "option", "iterate", "to", "from", "profile", "pageRank", "peerPressure", "program"));
+ private static Set<String> NO_GRAPH = new HashSet<>(Arrays.asList("asAdmin", "by", "option", "iterate", "to", "from", "profile", "pageRank", "peerPressure", "program", "none"));
private static Set<String> NO_ANONYMOUS = new HashSet<>(Arrays.asList("start", "__"));
private static Set<String> IGNORES_BYTECODE = new HashSet<>(Arrays.asList("asAdmin", "iterate", "mapValues", "mapKeys"));
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2a957bb5/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
index feb0b7d..1ab83a6 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
@@ -94,6 +94,17 @@ public class CoreTraversalTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
+ public void shouldFilterOnIterate() {
+ final Traversal<Vertex,String> traversal = g.V().out().out().<String>values("name").aggregate("x").iterate();
+ assertFalse(traversal.hasNext());
+ assertEquals(2, traversal.asAdmin().getSideEffects().<BulkSet>get("x").size());
+ assertTrue(traversal.asAdmin().getSideEffects().<BulkSet>get("x").contains("ripple"));
+ assertTrue(traversal.asAdmin().getSideEffects().<BulkSet>get("x").contains("lop"));
+ assertEquals(Traversal.Symbols.none, traversal.asAdmin().getBytecode().getStepInstructions().get(traversal.asAdmin().getBytecode().getStepInstructions().size()-1).getOperator());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
public void shouldLoadVerticesViaIds() {
final List<Vertex> vertices = g.V().toList();
final List<Object> ids = vertices.stream().map(Vertex::id).collect(Collectors.toList());
[2/3] tinkerpop git commit: if it is an .iterate(),
GremlinServer needs to make sure that the traversal side-effects are
added to the cache for retrieval.
Posted by ok...@apache.org.
if it is an .iterate(), GremlinServer needs to make sure that the traversal side-effects are added to the cache for retrieval.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/f4018749
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/f4018749
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/f4018749
Branch: refs/heads/master
Commit: f401874976ebdad697f90f04396be02a906e965b
Parents: 2a957bb
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Nov 27 19:16:27 2017 -0800
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Nov 27 19:16:27 2017 -0800
----------------------------------------------------------------------
.../gremlin/server/op/traversal/TraversalOpProcessor.java | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f4018749/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
index b9705a6..1c0402f 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/traversal/TraversalOpProcessor.java
@@ -480,12 +480,16 @@ public class TraversalOpProcessor extends AbstractOpProcessor {
final boolean useBinary = ctx.channel().attr(StateKey.USE_BINARY).get();
boolean warnOnce = false;
-
// we have an empty iterator - happens on stuff like: g.V().iterate()
if (!itty.hasNext()) {
// as there is nothing left to iterate if we are transaction managed then we should execute a
// commit here before we send back a NO_CONTENT which implies success
onTraversalSuccess(graph, context);
+ // if it was a g.V().iterate(), then be sure to add the side-effects to the cache
+ if (itty instanceof TraverserIterator &&
+ !((TraverserIterator)itty).getTraversal().getSideEffects().isEmpty()) {
+ cache.put(msg.getRequestId(), ((TraverserIterator)itty).getTraversal().getSideEffects());
+ }
ctx.writeAndFlush(ResponseMessage.build(msg)
.code(ResponseStatusCode.NO_CONTENT)
.create());
[3/3] tinkerpop git commit: Merge branch 'TINKERPOP-1834'
Posted by ok...@apache.org.
Merge branch 'TINKERPOP-1834'
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/fb41d847
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/fb41d847
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/fb41d847
Branch: refs/heads/master
Commit: fb41d8471d81f37f612bbd68cc6229553b0a7d0b
Parents: 78baa86 f401874
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Nov 28 08:44:47 2017 -0800
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Nov 28 08:44:47 2017 -0800
----------------------------------------------------------------------
CHANGELOG.asciidoc | 1 +
.../gremlin/process/traversal/Traversal.java | 23 ++++++++--
.../process/traversal/step/filter/NoneStep.java | 44 ++++++++++++++++++++
.../optimization/LazyBarrierStrategy.java | 2 +
.../optimization/PathRetractionStrategy.java | 2 +
.../process/traversal/TraversalTest.java | 2 +-
.../traversal/dsl/graph/GraphTraversalTest.java | 2 +-
.../op/traversal/TraversalOpProcessor.java | 6 ++-
.../process/traversal/CoreTraversalTest.java | 11 +++++
9 files changed, 86 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fb41d847/CHANGELOG.asciidoc
----------------------------------------------------------------------