You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/06/17 23:21:43 UTC
[09/11] incubator-tinkerpop git commit: recussive Where-P bindings
implemented and tested. WhereStep is nearly 'done done' with all the
functionality one would want.
recussive Where-P bindings implemented and tested. WhereStep is nearly 'done done' with all the functionality one would want.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/72ce7df9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/72ce7df9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/72ce7df9
Branch: refs/heads/master
Commit: 72ce7df984c190f54ca808d5e514e2f48c8359ce
Parents: a3e89f5
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Jun 17 10:55:01 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Jun 17 15:21:18 2015 -0600
----------------------------------------------------------------------
CHANGELOG.asciidoc | 6 ++
.../traversal/dsl/graph/GraphTraversal.java | 3 +-
.../process/traversal/step/filter/NotStep.java | 71 ++++++++++++++++
.../step/filter/TraversalFilterStep.java | 14 +---
.../traversal/step/filter/WhereStep.java | 66 ++++++++-------
.../step/filter/GroovyWhereTest.groovy | 12 +--
.../AbstractImportCustomizerProvider.java | 2 +
.../traversal/step/filter/WhereTest.java | 87 +++++++++++---------
.../tinkergraph/structure/TinkerGraphTest.java | 45 +++++-----
9 files changed, 205 insertions(+), 101 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 8f3af08..6ec3543 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -28,6 +28,7 @@ TinkerPop 3.0.0.GA (NOT OFFICIALLY RELEASED YET)
<<<<<<< HEAD
<<<<<<< HEAD
<<<<<<< HEAD
+<<<<<<< HEAD
* Renamed `Graphs` in Gremlin Server to `GraphManager`.
* Arrow keys for cycling through command history now work in Gremlin Console when being used on Windows.
=======
@@ -38,6 +39,11 @@ TinkerPop 3.0.0.GA (NOT OFFICIALLY RELEASED YET)
* Removed `TraversalP`. Traversals and `P`-predicates are completely separate concepts.
* `has(key,traversal)` is now an alias for `filter(__.values(key).traversal)`.
>>>>>>> TraversalP dead. P and Traversal are now completely distinct concepts. HasStep and IsStep just work with P-predicates. has(key,traversal) is now an alias for filter(__.values(key).traversal). has(key) is now filter(values(key)) -- as TraversalFilterStep is much simpler and more efficient than WhereStep. P.getTraversals() no longer exists. ConjuctionP can only conjoin P-predicates, not a hybrid of traversals and P-predicates. Good stuff. Phew.
+=======
+* Added `NotStep` and `not(traversal)` for not'ing a traversal (integrates like `ConjunctionStep`).
+* Removed `TraversalP`. Traversals and `P`-predicates are completely separate concepts.
+* `has(key,traversal)` is now an alias for `filter(__.values(key).traversal)` using `TraversalFilterStep`.
+>>>>>>> recussive Where-P bindings implemented and tested. WhereStep is nearly 'done done' with all the functionality one would want.
* Simplified `SubgraphStrategy` by using `TraversalFilterStep` instead of the more complex `WhereStep`.
* Added `TraversalMapStep`, `TraversalFlatMapStep`, `TraversalFilterStep`, and `TraversalSideEffectStep` which all leverage an internal traversal.
>>>>>>> greatly reduced the complexity of WhereStep -- learned alot about variable binding from XMatchStep. WhereStep is looking really really good.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/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 8c561a5..4a4837c 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
@@ -49,6 +49,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleGlobalStep;
@@ -745,7 +746,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
}
public default GraphTraversal<S, E> not(final Traversal<E, ?> notTraversal) {
- return this.asAdmin().addStep(new TraversalFilterStep<E>(this.asAdmin(), true, notTraversal));
+ return this.asAdmin().addStep(new NotStep<>(this.asAdmin(), notTraversal));
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java
new file mode 100644
index 0000000..e106416
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java
@@ -0,0 +1,71 @@
+/*
+ *
+ * * 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.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class NotStep<S> extends FilterStep<S> implements TraversalParent {
+
+ private Traversal.Admin<S, ?> notTraversal;
+
+ public NotStep(final Traversal.Admin traversal, final Traversal<S, ?> notTraversal) {
+ super(traversal);
+ this.notTraversal = this.integrateChild(notTraversal.asAdmin());
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ return !TraversalUtil.test(traverser, this.notTraversal);
+ }
+
+ @Override
+ public List<Traversal.Admin<S, ?>> getLocalChildren() {
+ return Collections.singletonList(this.notTraversal);
+ }
+
+ @Override
+ public NotStep<S> clone() {
+ final NotStep<S> clone = (NotStep<S>) super.clone();
+ clone.notTraversal = clone.integrateChild(this.notTraversal.clone());
+ return clone;
+ }
+
+ @Override
+ public String toString() {
+ return StringFactory.stepString(this, "!" + this.notTraversal);
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode() ^ this.notTraversal.hashCode();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TraversalFilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TraversalFilterStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TraversalFilterStep.java
index 800134f..b3036cd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TraversalFilterStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TraversalFilterStep.java
@@ -36,21 +36,15 @@ import java.util.List;
public final class TraversalFilterStep<S> extends FilterStep<S> implements TraversalParent {
private Traversal.Admin<S, ?> filterTraversal;
- private final boolean not;
- public TraversalFilterStep(final Traversal.Admin traversal, final boolean not, final Traversal<S, ?> filterTraversal) {
+ public TraversalFilterStep(final Traversal.Admin traversal, final Traversal<S, ?> filterTraversal) {
super(traversal);
this.filterTraversal = this.integrateChild(filterTraversal.asAdmin());
- this.not = not;
- }
-
- public TraversalFilterStep(final Traversal.Admin traversal, final Traversal<S, ?> filterTraversal) {
- this(traversal, false, filterTraversal);
}
@Override
protected boolean filter(final Traverser.Admin<S> traverser) {
- return this.not == !TraversalUtil.test(traverser, this.filterTraversal);
+ return TraversalUtil.test(traverser, this.filterTraversal);
}
@Override
@@ -67,11 +61,11 @@ public final class TraversalFilterStep<S> extends FilterStep<S> implements Trave
@Override
public String toString() {
- return StringFactory.stepString(this, this.not ? "!" + this.filterTraversal : this.filterTraversal);
+ return StringFactory.stepString(this, this.filterTraversal);
}
@Override
public int hashCode() {
- return super.hashCode() ^ this.filterTraversal.hashCode() ^ Boolean.valueOf(this.not).hashCode();
+ return super.hashCode() ^ this.filterTraversal.hashCode();
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
index ef2ea0f..062862e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
@@ -30,13 +30,16 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConjunctionStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.util.ConjunctionP;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -47,43 +50,46 @@ import java.util.Set;
public final class WhereStep<S> extends FilterStep<S> implements TraversalParent, Scoping {
protected String startKey;
- protected String selectKey;
+ protected List<String> selectKeys;
protected P<Object> predicate;
protected Traversal.Admin<?, ?> traversal;
protected Scope scope;
+ protected final Set<String> scopeKeys = new HashSet<>();
public WhereStep(final Traversal.Admin traversal, final Scope scope, final Optional<String> startKey, final P<?> predicate) {
super(traversal);
this.scope = scope;
this.startKey = startKey.orElse(null);
- this.selectKey = (String) (predicate.getValue() instanceof Collection ? ((Collection) predicate.getValue()).iterator().next() : predicate.getValue()); // hack for within("x")
this.predicate = (P) predicate;
+ this.selectKeys = new ArrayList<>();
this.traversal = null;
+ this.configurePredicates(this.predicate);
}
public WhereStep(final Traversal.Admin traversal, final Scope scope, final Traversal<?, ?> whereTraversal) {
super(traversal);
this.scope = scope;
this.startKey = null;
- this.selectKey = null;
this.predicate = null;
+ this.selectKeys = null;
this.traversal = whereTraversal.asAdmin();
this.configureStartAndEndSteps(this.traversal);
this.traversal = this.integrateChild(this.traversal);
-
}
private void configureStartAndEndSteps(final Traversal.Admin<?, ?> whereTraversal) {
ConjunctionStrategy.instance().apply(whereTraversal);
//// START STEP to WhereStartStep
final Step<?, ?> startStep = whereTraversal.getStartStep();
- if (startStep instanceof TraversalParent) {
+ if (startStep instanceof ConjunctionStep || startStep instanceof NotStep) { // for conjunction and not steps
((TraversalParent) startStep).getLocalChildren().forEach(this::configureStartAndEndSteps);
- } else if (startStep instanceof StartStep && !startStep.getLabels().isEmpty()) {
+ } else if (startStep instanceof StartStep && !startStep.getLabels().isEmpty()) { // as("a").out()... traversals
if (startStep.getLabels().size() > 1)
throw new IllegalArgumentException("The start step of a where()-traversal can only have one label: " + startStep);
- TraversalHelper.replaceStep(startStep, (Step) new WhereStartStep(whereTraversal, startStep.getLabels().iterator().next()), whereTraversal);
- } else {
+ final String label = startStep.getLabels().iterator().next();
+ this.scopeKeys.add(label);
+ TraversalHelper.replaceStep(startStep, (Step) new WhereStartStep(whereTraversal, label), whereTraversal);
+ } else { // out()... traversals
TraversalHelper.insertBeforeStep(new WhereStartStep(whereTraversal, null), (Step) startStep, whereTraversal);
}
//// END STEP to WhereEndStep
@@ -92,17 +98,35 @@ public final class WhereStep<S> extends FilterStep<S> implements TraversalParent
if (endStep.getLabels().size() > 1)
throw new IllegalArgumentException("The end step of a where()-traversal can only have one label: " + endStep);
final String label = endStep.getLabels().iterator().next();
+ this.scopeKeys.add(label);
endStep.removeLabel(label);
whereTraversal.addStep(new WhereEndStep(whereTraversal, label));
}
}
+ private void configurePredicates(final P<Object> predicate) {
+ if (predicate instanceof ConjunctionP)
+ ((ConjunctionP<Object>) predicate).getPredicates().forEach(this::configurePredicates);
+ else {
+ final String selectKey = (String) (predicate.getValue() instanceof Collection ? ((Collection) predicate.getValue()).iterator().next() : predicate.getValue()); // hack for within("x"))
+ this.selectKeys.add(selectKey);
+ this.scopeKeys.add(selectKey);
+ }
+ }
+
+ private void setPredicateValues(final P<Object> predicate, final Traverser.Admin<S> traverser, final Iterator<String> selectKeysIterator) {
+ if (predicate instanceof ConjunctionP)
+ ((ConjunctionP<Object>) predicate).getPredicates().forEach(p -> this.setPredicateValues(p, traverser, selectKeysIterator));
+ else
+ predicate.setValue(this.getScopeValueByKey(Pop.last, selectKeysIterator.next(), traverser));
+ }
+
@Override
protected boolean filter(final Traverser.Admin<S> traverser) {
if (null != this.traversal)
return TraversalUtil.test((Traverser.Admin) traverser, this.traversal);
else {
- this.predicate.setValue(this.getScopeValueByKey(Pop.last, this.selectKey, traverser));
+ this.setPredicateValues(this.predicate, traverser, this.selectKeys.iterator());
return this.predicate.test(null == this.startKey ? traverser.get() : this.getScopeValueByKey(Pop.last, this.startKey, traverser));
}
}
@@ -114,36 +138,22 @@ public final class WhereStep<S> extends FilterStep<S> implements TraversalParent
@Override
public String toString() {
+ // TODO: revert the predicates to their string form?
return StringFactory.stepString(this, this.scope, this.startKey, this.predicate, this.traversal);
}
@Override
public Set<String> getScopeKeys() {
- final Set<String> keys = new HashSet<>();
- if (null != this.traversal) {
- final Step<?, ?> startStep = traversal.getStartStep();
- final Step<?, ?> endStep = traversal.getEndStep();
- if (startStep instanceof WhereStep.WhereStartStep && ((WhereStartStep) startStep).selectKey != null)
- keys.add(((WhereStartStep) startStep).selectKey);
- if (endStep instanceof WhereStep.WhereEndStep && ((WhereEndStep) endStep).matchKey != null)
- keys.add(((WhereEndStep) endStep).matchKey);
- // TODO: recurse through conjunctions
- } else {
- if (this.startKey != null) keys.add(this.startKey);
- keys.add(this.selectKey);
- }
- return keys;
+ return this.scopeKeys;
}
@Override
public WhereStep<S> clone() {
final WhereStep<S> clone = (WhereStep<S>) super.clone();
- if (null != this.predicate) {
+ if (null != this.predicate)
clone.predicate = this.predicate.clone();
- } else {
- clone.traversal = this.traversal.clone();
- clone.integrateChild(clone.traversal);
- }
+ else
+ clone.integrateChild(clone.traversal = this.traversal.clone());
return clone;
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
index 9b06699..9ad9e26 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
@@ -108,7 +108,7 @@ public abstract class GroovyWhereTest {
@Override
public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX() {
- TraversalScriptHelper.compute("g.V.as('a').out.as('b').where(and(__.as('a').out('knows').as('b'),or(__.as('b').out('created').has('name','ripple'),__.as('b').in('knows').count.is(not(eq(0)))))).select.by('name')", g)
+ TraversalScriptHelper.compute("g.V.as('a').out.as('b').where(and(__.as('a').out('knows').as('b'),or(__.as('b').out('created').has('name','ripple'),__.as('b').in('knows').count.is(P.not(eq(0)))))).select.by('name')", g)
}
@Override
@@ -121,9 +121,11 @@ public abstract class GroovyWhereTest {
TraversalScriptHelper.compute("g.V.as('a').out('created').as('b').where(and(__.as('b').in,not(__.as('a').out('created').has('name','ripple')))).select.by('name')", g)
}
- /*@Override
- public Traversal<Vertex, String> get_g_V_asXaX_outXknowsX_asXbX_whereXasXa__bX_outXcreatedX_hasXname__rippleX_name() {
- TraversalScriptHelper.compute("g.V.as('a').out('knows').as('b').where(__.as('a', 'b').out('created').has('name', 'ripple')).name", g)
- }*/
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_select_byXnameX() {
+ TraversalScriptHelper.compute("g.V.as('a').out('created').as('b').in('created').as('c').both('knows').both('knows').as('d').where('c',P.not(eq('a').or(eq('d')))).select.by('name')", g)
+ }
+
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
index 2e4c626..2efb555 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
@@ -99,9 +99,11 @@ public abstract class AbstractImportCustomizerProvider implements ImportCustomiz
imports.add(Event.class.getPackage().getName() + DOT_STAR); // eventing
staticImports.add(__.class.getCanonicalName() + DOT_STAR);
+ //staticImports.add(__.class.getCanonicalName() + ".not"); // necessary as not() is both in P and __
staticImports.add(TraversalOptionParent.Pick.class.getCanonicalName() + DOT_STAR);
staticImports.add(GraphTraversalSource.class.getCanonicalName() + DOT_STAR);
staticImports.add(P.class.getCanonicalName() + DOT_STAR);
+ //staticImports.add(P.class.getCanonicalName() + ".not"); // necessary as not() is both in P and __
staticImports.add(Order.class.getCanonicalName() + DOT_STAR);
staticImports.add(Operator.class.getCanonicalName() + DOT_STAR);
staticImports.add(Scope.class.getCanonicalName() + DOT_STAR);
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
index 7a717ac..294010e 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
@@ -22,10 +22,10 @@ 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.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.Path;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -38,7 +38,9 @@ import java.util.Set;
import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
import static org.apache.tinkerpop.gremlin.process.traversal.P.*;
+import static org.apache.tinkerpop.gremlin.process.traversal.P.not;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.not;
import static org.junit.Assert.*;
/**
@@ -81,11 +83,13 @@ public abstract class WhereTest extends AbstractGremlinProcessTest {
// complex and/or functionality
- public abstract Traversal<Vertex,Map<String,String>> get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX();
+ public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX();
- public abstract Traversal<Vertex,String> get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX();
+ public abstract Traversal<Vertex, String> get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX();
- public abstract Traversal<Vertex,Map<String,String>> get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX();
+ public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX();
+
+ public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_select_byXnameX();
// multi-labels
@@ -269,52 +273,61 @@ public abstract class WhereTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
public void g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX() {
- Traversal<Vertex,Map<String,String>> traversal = get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX();
+ Traversal<Vertex, Map<String, String>> traversal = get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX();
printTraversalForm(traversal);
int counter = 0;
- while(traversal.hasNext()) {
- final Map<String,String> map = traversal.next();
- assertEquals(2,map.size());
- assertEquals("marko",map.get("a"));
+ while (traversal.hasNext()) {
+ final Map<String, String> map = traversal.next();
+ assertEquals(2, map.size());
+ assertEquals("marko", map.get("a"));
assertTrue(map.get("b").equals("josh") || map.get("b").equals("vadas"));
counter++;
}
- assertEquals(2,counter);
+ assertEquals(2, counter);
}
@Test
@LoadGraphWith(MODERN)
public void g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_selectXaX_byXnameX() {
- Traversal<Vertex,String> traversal = get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX();
+ Traversal<Vertex, String> traversal = get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX();
printTraversalForm(traversal);
- checkResults(Arrays.asList("marko","josh"),traversal);
+ checkResults(Arrays.asList("marko", "josh"), traversal);
}
@Test
@LoadGraphWith(MODERN)
public void g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX() {
- Traversal<Vertex,Map<String,String>> traversal = get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX();
+ Traversal<Vertex, Map<String, String>> traversal = get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX();
printTraversalForm(traversal);
int counter = 0;
- while(traversal.hasNext()) {
- final Map<String,String> map = traversal.next();
- assertEquals(2,map.size());
+ while (traversal.hasNext()) {
+ final Map<String, String> map = traversal.next();
+ assertEquals(2, map.size());
assertTrue(map.get("a").equals("marko") || map.get("a").equals("peter"));
assertEquals("lop", map.get("b"));
counter++;
}
- assertEquals(2,counter);
+ assertEquals(2, counter);
}
-
- // multi-labels
- /* @Test
+ @Test
@LoadGraphWith(MODERN)
- public void g_V_asXaX_outXknowsX_asXbX_whereXasXa__bX_outXcreatedX_hasXname__rippleX_name() {
- final Traversal<Vertex, String> traversal = get_g_V_asXaX_outXknowsX_asXbX_whereXasXa__bX_outXcreatedX_hasXname__rippleX_name();
- checkResults(Arrays.asList("josh"), traversal);
- } */
+ public void g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_select_byXnameX() {
+ Traversal<Vertex, Map<String, String>> traversal = get_g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_select_byXnameX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final Map<String, String> map = traversal.next();
+ assertEquals(4, map.size());
+ assertTrue(map.get("a").equals("marko") || map.get("a").equals("peter"));
+ assertEquals("lop", map.get("b"));
+ assertEquals("josh", map.get("c"));
+ assertEquals("vadas", map.get("d"));
+ }
+ assertEquals(2, counter);
+ }
public static class Traversals extends WhereTest {
@@ -349,7 +362,7 @@ public abstract class WhereTest extends AbstractGremlinProcessTest {
@Override
public Traversal<Vertex, Object> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXasXbX_outXcreatedX_hasXname_rippleXX_valuesXage_nameX(final Object v1Id) {
- return g.V(v1Id).as("a").out("created").in("created").as("b").where(__.as("b").out("created").has("name", "ripple")).values("age", "name");
+ return g.V(v1Id).as("a").out("created").in("created").as("b").where(as("b").out("created").has("name", "ripple")).values("age", "name");
}
// except/retain functionality
@@ -376,38 +389,36 @@ public abstract class WhereTest extends AbstractGremlinProcessTest {
@Override
public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_whereXwithoutXeXX_aggregateXeX_otherVX_emit_path(final Object v1Id) {
- return g.V(v1Id).repeat(__.bothE("created").where(without("e")).aggregate("e").otherV()).emit().path();
+ return g.V(v1Id).repeat(bothE("created").where(without("e")).aggregate("e").otherV()).emit().path();
}
// hasNot functionality
@Override
public Traversal<Vertex, String> get_g_V_whereXnotXoutXcreatedXXX_name() {
- return g.V().where(not(__.out("created"))).values("name");
+ return g.V().where(not(out("created"))).values("name");
}
// complex and/or functionality
@Override
- public Traversal<Vertex,Map<String,String>> get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX() {
- return g.V().as("a").out().as("b").where(and(as("a").out("knows").as("b"),or(as("b").out("created").has("name","ripple"),as("b").in("knows").count().is(not(eq(0)))))).<String>select().by("name");
+ public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX() {
+ return g.V().as("a").out().as("b").where(and(as("a").out("knows").as("b"), or(as("b").out("created").has("name", "ripple"), as("b").in("knows").count().is(not(eq(0)))))).<String>select().by("name");
}
@Override
- public Traversal<Vertex,String> get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX() {
+ public Traversal<Vertex, String> get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX() {
return g.V().where(out("created").and().out("knows").or().in("knows")).values("name");
}
@Override
- public Traversal<Vertex,Map<String,String>> get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX() {
- return g.V().as("a").out("created").as("b").where(and(as("b").in(),not(as("a").out("created").has("name","ripple")))).<String>select().by("name");
+ public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX() {
+ return g.V().as("a").out("created").as("b").where(and(as("b").in(), not(as("a").out("created").has("name", "ripple")))).<String>select().by("name");
}
- // multi-labels
-
- /* @Override
- public Traversal<Vertex, String> get_g_V_asXaX_outXknowsX_asXbX_whereXasXa__bX_outXcreatedX_hasXname__rippleX_name() {
- return g.V().as("a").out("knows").as("b").where(as("a", "b").out("created").has("name", "ripple")).values("name");
- }*/
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_select_byXnameX() {
+ return g.V().as("a").out("created").as("b").in("created").as("c").both("knows").both("knows").as("d").where("c", P.not(P.eq("a").or(P.eq("d")))).<String>select().by("name");
+ }
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
index 59d3f05..78abca5 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
@@ -162,35 +162,42 @@ public class TinkerGraphTest {
graph.io(GraphMLIo.build()).readGraph("/Users/marko/software/tinkerpop/tinkerpop3/data/grateful-dead.xml");
GraphTraversalSource g = graph.traversal(GraphTraversalSource.standard());
//System.out.println(g.E().label().groupCount().next());
- final Supplier<Traversal<?, ?>> traversal = () ->
- /*g.V().match("a",
+ final List<Supplier<Traversal<?,?>>> traversals = Arrays.asList(
+ () -> g.V().xmatch("a",
as("a").in("sungBy").as("b"),
- as("a").in("writtenBy").as("b")).select().by("name");*/
- /*g.V().xmatch("a",
+ as("a").in("writtenBy").as("b")).select().by("name"),
+ /*() -> g.V().xmatch("a",
+ as("a").in("sungBy").as("b"),
+ not(as("a").in("writtenBy").as("b"))).select().by("name"),*/
+ () -> g.V().xmatch("a",
as("a").out("followedBy").as("b"),
- as("b").out("followedBy").as("a")).select().by("name");*/
- /*g.V().xmatch("a",
+ as("b").out("followedBy").as("a")).select().by("name"),
+ () -> g.V().xmatch("a",
as("a").in("followedBy").as("b"),
as("a").out("sungBy").as("c"),
- as("a").out("writtenBy").as("d")).select().by("name");*/
- /*g.V().match("a",
+ as("a").out("writtenBy").as("d")).select().by("name"),
+ () -> g.V().xmatch("a",
as("a").in("followedBy").as("b"),
as("a").out("sungBy").as("c"),
as("a").out("writtenBy").as("d")).
- where("c", P.neq("d")).select().by("name");*/
- /*g.V().xmatch("a",
+ where("c", P.neq("d")).select().by("name"),
+ () -> g.V().xmatch("a",
as("a").in("sungBy").as("b"),
as("a").in("writtenBy").as("b"),
as("b").out("followedBy").as("c"),
as("c").out("sungBy").as("a"),
- as("c").out("writtenBy").as("a")).select().by("name");*/
- g.V().xmatch("a",
+ as("c").out("writtenBy").as("a")).select().by("name"),
+ () -> g.V().xmatch("a",
as("a").has("name","Garcia"),
as("a").in("writtenBy").as("b"),
as("b").out("followedBy").as("c"),
- as("c").out("writtenBy").has("name",P.neq("Garcia")).as("d")).select().by("name");
+ as("c").out("writtenBy").has("name",P.neq("Garcia")).as("d")).select().by("name"));
- System.out.println(TimeUtil.clockWithResult(100, () -> traversal.get().toList().size()));
+ traversals.forEach(traversal -> {
+ System.out.println("pre-strategy: " + traversal.get());
+ System.out.println("post-strategy: " + traversal.get().iterate());
+ System.out.println(TimeUtil.clockWithResult(10, () -> traversal.get().toList().size()));
+ });
}
@Test
@@ -230,13 +237,13 @@ public class TinkerGraphTest {
as("a").out("knows").as("c"),
as("c").out("created").count().as("b")).select("a","b","c").by("name").by().by("name");*/
- final Supplier<Traversal<?,?>> traversal = () ->
+ /*final Supplier<Traversal<?,?>> traversal = () ->
g.V().as("a").out().as("b").where(
- in("created").as("a")
- ).select().by("name");
+ not(in("knows").as("a")).and().as("b").in().count().is(P.gt(1))
+ ).select().by("name"); */
- /* final Supplier<Traversal<?,?>> traversal = () ->
- g.V().as("a").out().as("b").in().as("c").where(P.neq("a")).select().by("name"); */
+ final Supplier<Traversal<?,?>> traversal = () ->
+ g.V().as("a").out("created").as("b").in("created").as("c").both("knows").both("knows").as("d").where("c",P.not(P.eq("a").or(P.eq("d")))).select().by("name");
System.out.println(traversal.get());
System.out.println(traversal.get().iterate());