You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ke...@apache.org on 2024/11/03 05:32:22 UTC
(tinkerpop) 13/48: Updates to Strategy Construction for TP4 (#2781)
This is an automated email from the ASF dual-hosted git repository.
kenhuuu pushed a commit to branch master-http-final
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 9667696979c8257a6f1ec7725da922a77b63c0bb
Author: Cole Greer <11...@users.noreply.github.com>
AuthorDate: Tue Oct 1 17:47:57 2024 -0700
Updates to Strategy Construction for TP4 (#2781)
Changes included in this PR:
1. Add missing strategies to groovy's core imports, and the grammar's global strategy registry.
2. Update groovy translator to escape '$' in string literals. Unescaped '$' indicates an embedded value in groovy's GString literals.
3. Update python, .Net, groovy, go, and JS traversalStrategy translators to handle optional new in gremlin-lang strategy declaration. eg. withStrategies(new ReadOnlyStrategy()) as well as withStrategies(ReadOnlyStrategy())
4. Change signature of OptionsStrategy in python to be both more pythonic, and bear closer resemblance to gremlin-lang. For example, OptionsStrategy(options={'myVar': 'myValue'}) has been updated to OptionsStrategy(myVar='myValue')
5. Add missing strategies to python's strategies.py
6. Add static instance() method to obtain ElementIdStrategy with default configuration.
7. Updated ElementIdStrategy getConfiguration() such that idMaker is excluded from the config if it is set to the default id supplier. This ensures that configurations which do not override the default idMaker remain serializable.
---
CHANGELOG.asciidoc | 5 ++
docs/src/dev/developer/for-committers.asciidoc | 3 +-
docs/src/upgrade/release-4.x.x.asciidoc | 22 ++++++
.../tinkerpop/gremlin/jsr223/CoreImports.java | 10 +++
.../jsr223/DefaultGremlinScriptEngineManager.java | 2 +-
.../translator/DotNetTranslateVisitor.java | 2 +-
.../language/translator/GoTranslateVisitor.java | 5 +-
.../translator/GroovyTranslateVisitor.java | 23 +++++++
.../translator/JavascriptTranslateVisitor.java | 2 +-
.../translator/PythonTranslateVisitor.java | 2 +-
.../process/traversal/TraversalStrategies.java | 7 +-
.../strategy/decoration/ElementIdStrategy.java | 16 ++++-
.../strategy/decoration/OptionsStrategy.java | 2 +-
.../language/translator/GremlinTranslatorTest.java | 9 +++
gremlin-python/build/generate.groovy | 2 +-
.../gremlin_python/process/graph_traversal.py | 2 +-
.../python/gremlin_python/process/strategies.py | 37 +++++++++-
gremlin-python/src/main/python/radish/gremlin.py | 75 +++++++++++++++++++-
.../src/main/python/tests/driver/test_client.py | 2 +-
.../main/python/tests/process/test_gremlin_lang.py | 2 +-
.../main/python/tests/process/test_strategies.py | 2 +-
.../GraphBinaryGroovyRemoteGraphProvider.java | 5 --
.../GraphBinaryRemoteComputerFeatureTest.java | 3 +-
.../integrated/AdjacentToIncidentStrategy.feature | 80 ++++++++++++++++++++++
.../ByModulatorOptimizationStrategy.feature | 52 ++++++++++++++
.../ComputerFinalizationStrategy.feature | 52 ++++++++++++++
.../ComputerVerificationStrategy.feature | 52 ++++++++++++++
.../features/integrated/ConnectiveStrategy.feature | 43 ++++++++++++
.../test/features/integrated/CountStrategy.feature | 46 +++++++++++++
.../features/integrated/EarlyLimitStrategy.feature | 46 +++++++++++++
.../EdgeLabelVerificationStrategy.feature | 63 +++++++++++++++++
.../features/integrated/ElementIdStrategy.feature | 52 ++++++++++++++
.../integrated/FilterRankingStrategy.feature | 48 +++++++++++++
.../integrated/GraphFilterStrategy.feature | 52 ++++++++++++++
.../integrated/HaltedTraverserStrategy.feature | 69 +++++++++++++++++++
.../integrated/IdentityRemovalStrategy.feature | 52 ++++++++++++++
.../integrated/IncidentToAdjacentStrategy.feature | 52 ++++++++++++++
.../integrated/InlineFilterStrategy.feature | 42 ++++++++++++
.../integrated/LambdaRestrictionStrategy.feature | 54 +++++++++++++++
.../integrated/LazyBarrierStrategy.feature | 42 ++++++++++++
.../integrated/MatchAlgorithmStrategy.feature | 63 +++++++++++++++++
.../integrated/MatchPredicateStrategy.feature | 49 +++++++++++++
.../MessagePassingReductionStrategy.feature | 52 ++++++++++++++
.../features/integrated/OptionsStrategy.feature | 69 +++++++++++++++++++
.../features/integrated/OrderLimitStrategy.feature | 52 ++++++++++++++
.../integrated/PathProcessorStrategy.feature | 53 ++++++++++++++
.../integrated/PathRetractionStrategy.feature | 52 ++++++++++++++
.../integrated/ProductiveByStrategy.feature | 42 ++++++++++++
.../features/integrated/ProfileStrategy.feature | 52 ++++++++++++++
.../integrated/ReferenceElementStrategy.feature | 52 ++++++++++++++
.../integrated/RepeatUnrollStrategy.feature | 44 ++++++++++++
.../ReservedKeysVerificationStrategy.feature | 50 ++++++++++++++
.../test/features/integrated/SeedStrategy.feature | 48 +++++++++++++
.../StandardVerificationStrategy.feature | 52 ++++++++++++++
.../VertexProgramRestrictionStrategy.feature | 63 +++++++++++++++++
.../integrated/VertexProgramStrategy.feature | 52 ++++++++++++++
.../spark/SparkGraphFeatureIntegrateTest.java | 2 +-
57 files changed, 1959 insertions(+), 25 deletions(-)
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index f9092e78b0..3b82297473 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -65,6 +65,11 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
* Modified the `split()` step to split a string into a list of its characters if the given separator is an empty string.
* The `maxContentLength` setting for Gremlin Driver has been renamed to `maxResponseContentLength` and now blocks incoming responses that are too large based on total response size.
* The `maxContentLength` setting for Gremlin Server has been renamed to `maxRequestContentLength`.
+* Add missing strategies to the `TraversalStrategies` global cache as well as `CoreImports` in `gremlin-groovy`.
+* Add missing strategies to `strategies.py` in `gremlin-python`.
+* Updated `OptionsStrategy` in `gremlin-python` to take options directly as keyword arguments.
+* Added static `instance()` method to `ElementIdStrategy` to an instance with the default configuration.
+* Updated `ElementIdStrategy.getConfiguration()` to help with serialization.
== TinkerPop 3.7.0 (Gremfir Master of the Pan Flute)
diff --git a/docs/src/dev/developer/for-committers.asciidoc b/docs/src/dev/developer/for-committers.asciidoc
index aaf92442ca..3f938fb51b 100644
--- a/docs/src/dev/developer/for-committers.asciidoc
+++ b/docs/src/dev/developer/for-committers.asciidoc
@@ -563,6 +563,7 @@ tag when one is necessary will cause provider tests to fail:
* `@AllowNullPropertyValues` - The scenario requires that the graph be configured with `AllowNullPropertyValues` as
`true` (meaning that it can store `null` values).
+* `@GraphComputerOnly` - The scenario is only supported with `GraphComputer`.
* `@GraphComputerVerificationInjectionNotSupported` - The scenario will not work on with `GraphComputer` because the
`inject()` step is not supported.
* `@GraphComputerVerificationMidVNotSupported` - The scenario will not work on with `GraphComputer` because the
@@ -583,7 +584,7 @@ best example of this sort of test would be one that uses the remote `Lambda` syn
* `@UserSuppliedVertexIds` - The scenario relies on the vertex IDs specified in the dataset used by the scenario.
* `@UserSuppliedEdgeIds` - The scenario relies on the edge IDs specified in the dataset used by the scenario.
* `@UserSuppliedVertexPropertyIds` - The scenario relies on the vertex property IDs specified in the dataset used by the scenario.
-* `@With*` - The scenario uses some `with()` based configuration like strategies:
+* `@With*` - The scenario uses some `with()` based configuration like strategies. This includes but is not limited to the following:
** `@WithPartitionStrategy`
** `@WithProductiveByStrategy`
** `@WithReadOnlyStrategy`
diff --git a/docs/src/upgrade/release-4.x.x.asciidoc b/docs/src/upgrade/release-4.x.x.asciidoc
index 16e0c91cbd..fcb0713777 100644
--- a/docs/src/upgrade/release-4.x.x.asciidoc
+++ b/docs/src/upgrade/release-4.x.x.asciidoc
@@ -174,6 +174,28 @@ removed. As a result, all translators in .NET, Python, Go and Javascript have be
See: link:https://issues.apache.org/jira/browse/TINKERPOP-3028[TINKERPOP-3028]
+==== Change to `OptionsStrategy` in `gremlin-python`
+
+The `\\__init__()` syntax has been updated to be both more pythonic and more aligned to the `gremlin-lang` syntax.
+Previously, `OptionsStrategy()` took a single argument `options` which was a `dict` of all options to be set.
+Now, all options should be set directly as keyword arguments.
+
+For example:
+
+[source,python]
+----
+# 3.7 and before:
+g.with_strategies(OptionsStrategy(options={'key1': 'value1', 'key2': True}))
+# 4.x and newer:
+g.with_strategies(OptionsStrategy(key1='value1', key2=True))
+
+myOptions = {'key1': 'value1', 'key2': True}
+# 3.7 and before:
+g.with_strategies(OptionsStrategy(options=myOptions))
+# 4.x and newer:
+g.with_strategies(OptionsStrategy(**myOptions))
+----
+
==== Changes to Serialization
The GLVs will only support GraphBinary V4 and GraphSON support has been removed. This means that the serializer option
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java
index e83185382f..28f96bd803 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java
@@ -50,7 +50,9 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.PageRank
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.PeerPressure;
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ShortestPath;
import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.finalization.ComputerFinalizationStrategy;
import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.GraphFilterStrategy;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.MessagePassingReductionStrategy;
import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.verification.VertexProgramRestrictionStrategy;
import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection;
import org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource;
@@ -75,6 +77,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.Connec
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ElementIdStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.HaltedTraverserStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.OptionsStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
@@ -88,6 +91,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.Earl
import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.FilterRankingStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IdentityRemovalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IncidentToAdjacentStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.InlineFilterStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.LazyBarrierStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.MatchPredicateStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.OrderLimitStrategy;
@@ -99,6 +103,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.Comp
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.EdgeLabelVerificationStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.LambdaRestrictionStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReservedKeysVerificationStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.StandardVerificationStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
import org.apache.tinkerpop.gremlin.structure.Column;
@@ -247,10 +252,15 @@ public final class CoreImports {
CLASS_IMPORTS.add(Configurations.class);
// strategies
CLASS_IMPORTS.add(ConnectiveStrategy.class);
+ CLASS_IMPORTS.add(ComputerFinalizationStrategy.class);
CLASS_IMPORTS.add(ElementIdStrategy.class);
CLASS_IMPORTS.add(EventStrategy.class);
CLASS_IMPORTS.add(HaltedTraverserStrategy.class);
+ CLASS_IMPORTS.add(InlineFilterStrategy.class);
+ CLASS_IMPORTS.add(MessagePassingReductionStrategy.class);
+ CLASS_IMPORTS.add(OptionsStrategy.class);
CLASS_IMPORTS.add(PartitionStrategy.class);
+ CLASS_IMPORTS.add(ReservedKeysVerificationStrategy.class);
CLASS_IMPORTS.add(SubgraphStrategy.class);
CLASS_IMPORTS.add(LazyBarrierStrategy.class);
CLASS_IMPORTS.add(MatchAlgorithmStrategy.class);
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/DefaultGremlinScriptEngineManager.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/DefaultGremlinScriptEngineManager.java
index e485c05589..84b3d8fa48 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/DefaultGremlinScriptEngineManager.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/DefaultGremlinScriptEngineManager.java
@@ -53,7 +53,7 @@ import java.util.stream.Stream;
* This class is based quite heavily on the workings of the {@code ScriptEngineManager} supplied in the
* {@code javax.script} packages, but adds some additional features that are specific to Gremlin and TinkerPop.
* Unfortunately, it's not easily possible to extend {@code ScriptEngineManager} directly as there certain behaviors
- * don't appear to be be straightforward to implement and member variables are all private. It is important to note
+ * don't appear to be straightforward to implement and member variables are all private. It is important to note
* that this class is designed to provide support for "Gremlin-enabled" {@code ScriptEngine} instances (i.e. those
* that extend from {@link GremlinScriptEngine}) and is not meant to manage just any {@code ScriptEngine} instance
* that may be on the path.
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java
index 0e552bb560..66b31607d2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/DotNetTranslateVisitor.java
@@ -244,7 +244,7 @@ public class DotNetTranslateVisitor extends AbstractTranslateVisitor {
if (ctx.getChildCount() == 1)
sb.append("new ").append(ctx.getText()).append("()");
else {
- sb.append("new ").append(ctx.getChild(1).getText()).append("(");
+ sb.append("new ").append(ctx.getChild(0).getText().equals("new") ? ctx.getChild(1).getText() : ctx.getChild(0).getText()).append("(");
final List<ParseTree> configs = ctx.children.stream().
filter(c -> c instanceof GremlinParser.ConfigurationContext).collect(Collectors.toList());
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GoTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GoTranslateVisitor.java
index 10eec9f3e0..6bf7324c80 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GoTranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GoTranslateVisitor.java
@@ -194,8 +194,9 @@ public class GoTranslateVisitor extends AbstractTranslateVisitor {
if (ctx.getChildCount() == 1)
sb.append(GO_PACKAGE_NAME).append(ctx.getText()).append("()");
else {
- sb.append(GO_PACKAGE_NAME).append(ctx.getChild(1).getText()).append("(");
- sb.append(GO_PACKAGE_NAME + ctx.getChild(1).getText() + "Config{");
+ String strategyName = ctx.getChild(0).getText().equals("new") ? ctx.getChild(1).getText() : ctx.getChild(0).getText();
+ sb.append(GO_PACKAGE_NAME).append(strategyName).append("(");
+ sb.append(GO_PACKAGE_NAME + strategyName + "Config{");
// get a list of all the arguments to the strategy - i.e. anything not a terminal node
final List<ParseTree> configs = ctx.children.stream().
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java
index 7e5d82f638..3c87b6249a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java
@@ -153,6 +153,29 @@ public class GroovyTranslateVisitor extends TranslateVisitor {
return null;
}
+ @Override
+ public Void visitStringLiteral(final GremlinParser.StringLiteralContext ctx) {
+ String literal = ctx.getText();
+ literal = literal.replace("$", "\\$");
+ sb.append(literal);
+ return null;
+ }
+
+ @Override
+ public Void visitTraversalStrategy(final GremlinParser.TraversalStrategyContext ctx) {
+ if (ctx.getChildCount() == 1) {
+ sb.append(ctx.getText());
+ }
+ else {
+ // 'new' token is optional for gremlin-lang strategy construction, but required in gremlin-groovy
+ if(!ctx.getChild(0).getText().equals("new")) {
+ sb.append("new ");
+ }
+ visitChildren(ctx);
+ }
+ return null;
+ }
+
@Override
public Void visitTraversalSourceSpawnMethod_inject(final GremlinParser.TraversalSourceSpawnMethod_injectContext ctx) {
return handleInject(ctx);
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java
index 01d094fb68..e6deeea7e2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavascriptTranslateVisitor.java
@@ -70,7 +70,7 @@ public class JavascriptTranslateVisitor extends AbstractTranslateVisitor {
if (ctx.getChildCount() == 1)
sb.append(ctx.getText()).append("()");
else {
- sb.append(ctx.getChild(1).getText()).append("({");
+ sb.append(ctx.getChild(0).getText().equals("new") ? ctx.getChild(1).getText() : ctx.getChild(0).getText()).append("({");
final List<ParseTree> configs = ctx.children.stream().
filter(c -> c instanceof GremlinParser.ConfigurationContext).collect(Collectors.toList());
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/PythonTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/PythonTranslateVisitor.java
index 9bd025e53a..f90165f76f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/PythonTranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/PythonTranslateVisitor.java
@@ -78,7 +78,7 @@ public class PythonTranslateVisitor extends AbstractTranslateVisitor {
if (ctx.getChildCount() == 1)
sb.append(ctx.getText()).append("()");
else {
- sb.append(ctx.getChild(1).getText()).append("(");
+ sb.append(ctx.getChild(0).getText().equals("new") ? ctx.getChild(1).getText() : ctx.getChild(0).getText()).append("(");
final List<ParseTree> configs = ctx.children.stream().
filter(c -> c instanceof GremlinParser.ConfigurationContext).collect(Collectors.toList());
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
index b1f949afd4..c36afa8081 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
@@ -19,9 +19,11 @@
package org.apache.tinkerpop.gremlin.process.traversal;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.finalization.ComputerFinalizationStrategy;
import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.GraphFilterStrategy;
import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.MessagePassingReductionStrategy;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.verification.VertexProgramRestrictionStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ElementIdStrategy;
@@ -29,6 +31,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventS
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.HaltedTraverserStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.OptionsStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SackStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.MatchAlgorithmStrategy;
@@ -246,6 +249,7 @@ public interface TraversalStrategies extends Serializable, Cloneable, Iterable<T
put(PartitionStrategy.class.getSimpleName(), PartitionStrategy.class);
put(SeedStrategy.class.getSimpleName(), SeedStrategy.class);
put(SubgraphStrategy.class.getSimpleName(), SubgraphStrategy.class);
+ put(VertexProgramStrategy.class.getSimpleName(), VertexProgramStrategy.class);
// finalization
put(MatchAlgorithmStrategy.class.getSimpleName(), MatchAlgorithmStrategy.class);
@@ -261,6 +265,7 @@ public interface TraversalStrategies extends Serializable, Cloneable, Iterable<T
put(LambdaRestrictionStrategy.class.getSimpleName(), LambdaRestrictionStrategy.class);
put(ReadOnlyStrategy.class.getSimpleName(), ReadOnlyStrategy.class);
put(ReservedKeysVerificationStrategy.class.getSimpleName(), ReservedKeysVerificationStrategy.class);
+ put(VertexProgramRestrictionStrategy.class.getSimpleName(), VertexProgramRestrictionStrategy.class);
}};
static {
@@ -326,7 +331,7 @@ public interface TraversalStrategies extends Serializable, Cloneable, Iterable<T
/**
* Unregisters a strategy by its simple name. If the strategy is not in the registry then the grammar cannot
* reference it which means that it cannot be removed from execution using
- * {{@link GraphTraversalSource#withoutStrategies(Class[])}}..
+ * {{@link GraphTraversalSource#withoutStrategies(Class[])}}.
*/
public static void unregisterStrategy(final Class<? extends TraversalStrategy> clazz) {
GLOBAL_REGISTRY.remove(clazz.getSimpleName());
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 65cda70de0..67c08254a8 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
@@ -62,6 +62,8 @@ import java.util.function.Supplier;
*/
public final class ElementIdStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
+ public static final ElementIdStrategy INSTANCE = ElementIdStrategy.build().create();
+
private final String idPropertyKey;
private final Supplier<Object> idMaker;
@@ -127,9 +129,11 @@ public final class ElementIdStrategy extends AbstractTraversalStrategy<Traversal
}
public final static class Builder {
+ private static final Supplier<Object> DEFAULT_ID_MAKER = () -> UUID.randomUUID().toString();
+
private String idPropertyKey = "__id";
- private Supplier<Object> idMaker = () -> UUID.randomUUID().toString();
+ private Supplier<Object> idMaker = DEFAULT_ID_MAKER;
private Builder() {
}
@@ -173,7 +177,15 @@ public final class ElementIdStrategy extends AbstractTraversalStrategy<Traversal
final Map<String, Object> map = new HashMap<>();
map.put(STRATEGY, ElementIdStrategy.class.getCanonicalName());
map.put(ID_PROPERTY_KEY, this.idPropertyKey);
- map.put(ID_MAKER, this.idMaker);
+ // The idMaker is not serializable. The default idMaker is excluded from the configuration to allow for remote
+ // serialization. Custom idMakers are only supported in the config for embedded usages.
+ if (!idMaker.equals(Builder.DEFAULT_ID_MAKER)) {
+ map.put(ID_MAKER, this.idMaker);
+ }
return new MapConfiguration(map);
}
+
+ public static ElementIdStrategy instance() {
+ return INSTANCE;
+ }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/OptionsStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/OptionsStrategy.java
index 1a7a81f46b..78ab8a6d2b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/OptionsStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/OptionsStrategy.java
@@ -82,7 +82,7 @@ public class OptionsStrategy extends AbstractTraversalStrategy<TraversalStrategy
private final Map<String, Object> options = new HashMap<>();
/**
- * Adds an key to the configuration with the value of {@code true}.
+ * Adds a key to the configuration with the value of {@code true}.
*/
public Builder with(final String key) {
return with(key, true);
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java
index 9c81abaf90..555eb0d266 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java
@@ -610,6 +610,15 @@ public class GremlinTranslatorTest {
"g.withStrategies(PartitionStrategy.build().includeMetaProperties(true).partitionKey(\"x\").create())",
"g.withStrategies(new PartitionStrategy({includeMetaProperties: true, partitionKey: \"x\"}))",
"g.with_strategies(PartitionStrategy(include_meta_properties=True, partition_key='x'))"},
+ {"g.withStrategies(PartitionStrategy(includeMetaProperties: true, partitionKey:'x'))",
+ "g.withStrategies(PartitionStrategy(includeMetaProperties:true, partitionKey:'x'))",
+ "g.withStrategies(PartitionStrategy(includeMetaProperties:boolean0, partitionKey:string0))",
+ "g.WithStrategies(new PartitionStrategy(includeMetaProperties: true, partitionKey: \"x\"))",
+ "g.WithStrategies(gremlingo.PartitionStrategy(gremlingo.PartitionStrategyConfig{IncludeMetaProperties: true, PartitionKey: \"x\"}))",
+ "g.withStrategies(new PartitionStrategy(includeMetaProperties:true, partitionKey:'x'))",
+ "g.withStrategies(PartitionStrategy.build().includeMetaProperties(true).partitionKey(\"x\").create())",
+ "g.withStrategies(new PartitionStrategy({includeMetaProperties: true, partitionKey: \"x\"}))",
+ "g.with_strategies(PartitionStrategy(include_meta_properties=True, partition_key='x'))"},
{"g.withStrategies(new SubgraphStrategy(vertices:__.has('name', 'vadas'), edges: has('weight', gt(0.5))))",
"g.withStrategies(new SubgraphStrategy(vertices:__.has('name', 'vadas'), edges:__.has('weight', P.gt(0.5))))",
"g.withStrategies(new SubgraphStrategy(vertices:__.has(string0, string1), edges:__.has(string2, P.gt(number0))))",
diff --git a/gremlin-python/build/generate.groovy b/gremlin-python/build/generate.groovy
index c54287b090..3dfffab594 100644
--- a/gremlin-python/build/generate.groovy
+++ b/gremlin-python/build/generate.groovy
@@ -58,7 +58,7 @@ radishGremlinFile.withWriter('UTF-8') { Writer writer ->
'import datetime\n' +
'from gremlin_python.statics import long, bigint, GremlinType\n' +
'from gremlin_python.process.anonymous_traversal import traversal\n' +
- 'from gremlin_python.process.strategies import SeedStrategy, SubgraphStrategy, PartitionStrategy, ProductiveByStrategy, ReadOnlyStrategy\n' +
+ 'from gremlin_python.process.strategies import *\n' +
'from gremlin_python.process.traversal import TraversalStrategy\n' +
'from gremlin_python.process.graph_traversal import __\n' +
'from gremlin_python.structure.graph import Graph\n' +
diff --git a/gremlin-python/src/main/python/gremlin_python/process/graph_traversal.py b/gremlin-python/src/main/python/gremlin_python/process/graph_traversal.py
index a5e66371aa..c9c59fda6d 100644
--- a/gremlin-python/src/main/python/gremlin_python/process/graph_traversal.py
+++ b/gremlin-python/src/main/python/gremlin_python/process/graph_traversal.py
@@ -135,7 +135,7 @@ class GraphTraversalSource(object):
val = True if v is None else v
if options_strategy is None:
- options_strategy = OptionsStrategy({k: val})
+ options_strategy = OptionsStrategy(**{k: val})
source = self.with_strategies(options_strategy)
else:
options_strategy[1].configuration[k] = val
diff --git a/gremlin-python/src/main/python/gremlin_python/process/strategies.py b/gremlin-python/src/main/python/gremlin_python/process/strategies.py
index b1e1619f96..15bca18786 100644
--- a/gremlin-python/src/main/python/gremlin_python/process/strategies.py
+++ b/gremlin-python/src/main/python/gremlin_python/process/strategies.py
@@ -41,6 +41,7 @@ class ConnectiveStrategy(TraversalStrategy):
class ElementIdStrategy(TraversalStrategy):
def __init__(self):
TraversalStrategy.__init__(self, fqcn=decoration_namespace + 'ElementIdStrategy')
+ self.configuration = {}
# EventStrategy doesn't make sense outside JVM traversal machine
@@ -53,7 +54,7 @@ class HaltedTraverserStrategy(TraversalStrategy):
class OptionsStrategy(TraversalStrategy):
- def __init__(self, options=None):
+ def __init__(self, **options):
TraversalStrategy.__init__(self, configuration=options, fqcn=decoration_namespace + 'OptionsStrategy')
@@ -121,6 +122,21 @@ class MatchAlgorithmStrategy(TraversalStrategy):
self.configuration["matchAlgorithm"] = match_algorithm
+class ReferenceElementStrategy(TraversalStrategy):
+ def __init__(self, options=None):
+ TraversalStrategy.__init__(self, configuration=options, fqcn=decoration_namespace + 'ReferenceElementStrategy')
+
+
+class ComputerFinalizationStrategy(TraversalStrategy):
+ def __init__(self, options=None):
+ TraversalStrategy.__init__(self, configuration=options, fqcn=decoration_namespace + 'ComputerFinalizationStrategy')
+
+
+class ProfileStrategy(TraversalStrategy):
+ def __init__(self, options=None):
+ TraversalStrategy.__init__(self, configuration=options, fqcn=decoration_namespace + 'ProfileStrategy')
+
+
###########################
# OPTIMIZATION STRATEGIES #
###########################
@@ -210,10 +226,19 @@ class EarlyLimitStrategy(TraversalStrategy):
def __init__(self):
TraversalStrategy.__init__(self, fqcn=optimization_namespace + 'EarlyLimitStrategy')
+
+class MessagePassingReductionStrategy(TraversalStrategy):
+ def __init__(self, options=None):
+ TraversalStrategy.__init__(self, configuration=options, fqcn=decoration_namespace + 'MessagePassingReductionStrategy')
+
###########################
# VERIFICATION STRATEGIES #
###########################
+class ComputerVerificationStrategy(TraversalStrategy):
+ def __init__(self, options=None):
+ TraversalStrategy.__init__(self, configuration=options, fqcn=decoration_namespace + 'ComputerVerificationStrategy')
+
class LambdaRestrictionStrategy(TraversalStrategy):
def __init__(self):
@@ -237,3 +262,13 @@ class ReservedKeysVerificationStrategy(TraversalStrategy):
self.configuration["logWarning"] = log_warning
self.configuration["throwException"] = throw_exception
self.configuration["keys"] = keys
+
+
+class VertexProgramRestrictionStrategy(TraversalStrategy):
+ def __init__(self):
+ TraversalStrategy.__init__(self, fqcn=verification_namespace + 'VertexProgramRestrictionStrategy')
+
+
+class StandardVerificationStrategy(TraversalStrategy):
+ def __init__(self):
+ TraversalStrategy.__init__(self, fqcn=verification_namespace + 'StandardVerificationStrategy')
diff --git a/gremlin-python/src/main/python/radish/gremlin.py b/gremlin-python/src/main/python/radish/gremlin.py
index b7136e04aa..bf9e08ca76 100644
--- a/gremlin-python/src/main/python/radish/gremlin.py
+++ b/gremlin-python/src/main/python/radish/gremlin.py
@@ -28,7 +28,7 @@ from radish import world
import datetime
from gremlin_python.statics import long, bigint, GremlinType
from gremlin_python.process.anonymous_traversal import traversal
-from gremlin_python.process.strategies import SeedStrategy, SubgraphStrategy, PartitionStrategy, ProductiveByStrategy, ReadOnlyStrategy
+from gremlin_python.process.strategies import *
from gremlin_python.process.traversal import TraversalStrategy
from gremlin_python.process.graph_traversal import __
from gremlin_python.structure.graph import Graph
@@ -384,9 +384,58 @@ world.gremlins = {
'g_V_asXnX_whereXorXhasLabelXsoftwareX_hasLabelXpersonXXX_selectXnX_byXnameX': [(lambda g:g.V().as_('n').where(__.or_(__.has_label('software'), __.has_label('person'))).select('n').by('name'))],
'g_V_asXnX_whereXorXselectXnX_hasLabelXsoftwareX_selectXnX_hasLabelXpersonXXX_selectXnX_byXnameX': [(lambda g:g.V().as_('n').where(__.or_(__.select('n').has_label('software'), __.select('n').has_label('person'))).select('n').by('name'))],
'g_V_hasLabelXpersonX_asXxX_whereXinEXknowsX_count_isXgteX1XXX_selectXxX': [(lambda g:g.V().has_label('person').as_('x').where(__.in_e('knows').count().is_(P.gte(1))).select('x'))],
+ 'g_withStrategiesXAdjacentToIncidentStrategyX_V': [(lambda g:g.with_strategies(AdjacentToIncidentStrategy()).V())],
+ 'g_withoutStrategiesXAdjacentToIncidentStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.AdjacentToIncidentStrategy')]).V())],
+ 'g_withStrategiesXAdjacentToIncidentStrategyX_V_out_count': [(lambda g:g.with_strategies(AdjacentToIncidentStrategy()).V().out().count())],
+ 'g_withStrategiesXAdjacentToIncidentStrategyX_V_whereXoutX': [(lambda g:g.with_strategies(AdjacentToIncidentStrategy()).V().where(__.out()))],
+ 'g_withStrategiesXByModulatorOptimizationStrategyX_V_order_byXvaluesXnameXX': [(lambda g:g.with_strategies(ByModulatorOptimizationStrategy()).V().order().by(__.values('name')))],
+ 'g_withoutStrategiesXByModulatorOptimizationStrategyX_V_order_byXvaluesXnameXX': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ByModulatorOptimizationStrategy')]).V().order().by(__.values('name')))],
+ 'g_withStrategiesXComputerFinalizationStrategyX_V': [(lambda g:g.with_strategies(ComputerFinalizationStrategy()).V())],
+ 'g_withoutStrategiesXByModulatorOptimizationStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.finalization.ComputerFinalizationStrategy')]).V())],
+ 'g_withStrategiesXComputerVerificationStrategyX_V': [(lambda g:g.with_strategies(ComputerVerificationStrategy()).V())],
+ 'g_withoutStrategiesXComputerVerificationStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy')]).V())],
+ 'g_withStrategiesXConnectiveStrategyStrategyX_V_hasXname_markoX_or_whereXinXknowsX_hasXname_markoXX': [(lambda g:g.with_strategies(ConnectiveStrategy()).V().has('name', 'marko').or_().where(__.in_('knows').has('name', 'marko')))],
+ 'g_withStrategiesXCountStrategyX_V_whereXoutE_count_isX0XX': [(lambda g:g.with_strategies(CountStrategy()).V().where(__.out_e().count().is_(0)))],
+ 'g_withoutStrategiesXCountStrategyX_V_whereXoutE_count_isX0XX': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.CountStrategy')]).V().where(__.out_e().count().is_(0)))],
+ 'g_withStrategiesXEarlyLimitStrategyX_V_out_order_valueMap_limitX3X_selectXnameX': [(lambda g:g.with_strategies(EarlyLimitStrategy()).V().out().order().value_map().limit(3).select('name'))],
+ 'g_withoutStrategiesXEarlyLimitStrategyX_V_out_order_valueMap_limitX3X_selectXnameX': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.EarlyLimitStrategy')]).V().out().order().value_map().limit(3).select('name'))],
+ 'g_withStrategiesXEdgeLabelVerificationStrategyXthrowException_true_logWarning_falseXX_V': [(lambda g:g.with_strategies(EdgeLabelVerificationStrategy(throw_exception=True, log_warning=False)).V().out())],
+ 'g_withStrategiesXEdgeLabelVerificationStrategyXthrowException_false_logWarning_falseXX_V': [(lambda g:g.with_strategies(EdgeLabelVerificationStrategy(throw_exception=False, log_warning=False)).V().out())],
+ 'g_withoutStrategiesXEdgeLabelVerificationStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.EdgeLabelVerificationStrategy')]).V().out())],
+ 'g_withStrategiesXElementIdStrategyX_V': [(lambda g:g.with_strategies(ElementIdStrategy()).V())],
+ 'g_withoutStrategiesXElementIdStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ElementIdStrategy')]).V())],
+ 'g_withStrategiesXFilterRankingStrategyX_V_out_order_dedup': [(lambda g:g.with_strategies(FilterRankingStrategy()).V().out().order().dedup())],
+ 'g_withoutStrategiesXFilterRankingStrategyX_V_out_order_dedup': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.FilterRankingStrategy')]).V().out().order().dedup())],
+ 'g_withStrategiesXGraphFilterStrategyX_V': [(lambda g:g.with_strategies(GraphFilterStrategy()).V())],
+ 'g_withoutStrategiesXGraphFilterStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.GraphFilterStrategy')]).V())],
+ 'g_withStrategiesXHaltedTraverserStrategyXDetachedFactoryXX_V': [(lambda g:g.with_strategies(HaltedTraverserStrategy(halted_traverser_factory='org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory')).V())],
+ 'g_withStrategiesXHaltedTraverserStrategyXReferenceFactoryXX_V': [(lambda g:g.with_strategies(HaltedTraverserStrategy(halted_traverser_factory='org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory')).V())],
+ 'g_withoutStrategiesXHaltedTraverserStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.HaltedTraverserStrategy')]).V())],
+ 'g_withStrategiesXIdentityRemovalStrategyX_V_identity_out': [(lambda g:g.with_strategies(IdentityRemovalStrategy()).V().identity().out())],
+ 'g_withoutStrategiesXIdentityRemovalStrategyX_V_identity_out': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IdentityRemovalStrategy')]).V().identity().out())],
+ 'g_withStrategiesXIncidentToAdjacentStrategyX_V_outE_inV': [(lambda g:g.with_strategies(IncidentToAdjacentStrategy()).V().out_e().in_v())],
+ 'g_withoutStrategiesXIncidentToAdjacentStrategyX_V_outE_inV': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IncidentToAdjacentStrategy')]).V().out_e().in_v())],
+ 'g_withStrategiesXInlineFilterStrategyX_V_filterXhasXname_markoXX': [(lambda g:g.with_strategies(InlineFilterStrategy()).V().filter_(__.has('name', 'marko')))],
+ 'g_withoutStrategiesXInlineFilterStrategyX_V_filterXhasXname_markoXX': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.InlineFilterStrategy')]).V().filter_(__.has('name', 'marko')))],
+ 'g_withStrategiesXLambdaRestrictionStrategyX_V': [], # skipping as it contains a lambda
+ 'g_withoutStrategiesXLambdaRestrictionStrategyX_V': [], # skipping as it contains a lambda
+ 'g_withStrategiesXLazyBarrierStrategyX_V_out_bothE_count': [(lambda g:g.with_strategies(LazyBarrierStrategy()).V().out().both_e().count())],
+ 'g_withoutStrategiesXLazyBarrierStrategyX_V_out_bothE_count': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.LazyBarrierStrategy')]).V().out().both_e().count())],
+ 'g_withStrategiesXMatchAlgorithmStrategyXmatchAlgorithm_CountMatchAlgorithmXX_V_matchXa_knows_b__a_created_cX': [(lambda g:g.with_strategies(MatchAlgorithmStrategy(match_algorithm='org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchStep$CountMatchAlgorithm')).V().match(__.as_('a').out('knows').as_('b'), __.as_('a').out('created').as_('c')))],
+ 'g_withStrategiesXMatchAlgorithmStrategyXmatchAlgorithm_GreedyMatchAlgorithmXX_V_matchXa_knows_b__a_created_cX': [(lambda g:g.with_strategies(MatchAlgorithmStrategy(match_algorithm='org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchStep$GreedyMatchAlgorithm')).V().match(__.as_('a').out('knows').as_('b'), __.as_('a').out('created').as_('c')))],
+ 'g_withoutStrategiesXMatchAlgorithmStrategyX_V_matchXa_knows_b__a_created_cX': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.MatchAlgorithmStrategy')]).V().match(__.as_('a').out('knows').as_('b'), __.as_('a').out('created').as_('c')))],
+ 'g_withStrategiesXMatchPredicateStrategyX_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXa_b_cX': [(lambda g:g.with_strategies(MatchPredicateStrategy()).V().match(__.as_('a').out('created').has('name', 'lop').as_('b'), __.as_('b').in_('created').has('age', 29).as_('c')).where(__.as_('c').repeat(__.out()).times(2)).select('a', 'b', 'c'))],
+ 'g_withoutStrategiesXMatchPredicateStrategyX_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXa_b_cX': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.MatchPredicateStrategy')]).V().match(__.as_('a').out('created').has('name', 'lop').as_('b'), __.as_('b').in_('created').has('age', 29).as_('c')).where(__.as_('c').repeat(__.out()).times(2)).select('a', 'b', 'c'))],
+ 'g_withStrategiesXMessagePassingReductionStrategyX_V': [(lambda g:g.with_strategies(MessagePassingReductionStrategy()).V())],
+ 'g_withoutStrategiesXMessagePassingReductionStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.MessagePassingReductionStrategy')]).V())],
'g_withoutStrategiesXCountStrategyX_V_count': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.CountStrategy')]).V().count())],
'g_V_coworker': [(lambda g, xx1=None:g.V().has_label('person').filter_(__.out_e('created')).aggregate('p').as_('p1').values('name').as_('p1n').select('p').unfold().where(P.neq('p1')).as_('p2').values('name').as_('p2n').select('p2').out('created').choose(__.in_('created').where(P.eq('p1')), __.values('name'), __.constant(xx1)).group().by(__.select('p1n')).by(__.group().by(__.select('p2n')).by(__.unfold().fold().project('numCoCreated', 'coCreated').by(__.count(Scope.local)).by())).unfo [...]
'g_V_coworker_with_midV': [(lambda g:g.V().has_label('person').filter_(__.out_e('created')).as_('p1').V().has_label('person').where(P.neq('p1')).filter_(__.out_e('created')).as_('p2').map(__.out('created').where(__.in_('created').as_('p1')).values('name').fold()).group().by(__.select('p1').by('name')).by(__.group().by(__.select('p2').by('name')).by(__.project('numCoCreated', 'coCreated').by(__.count(Scope.local)).by())).unfold())],
+ 'g_withStrategiesXOptionsStrategyX_V': [(lambda g:g.with_strategies(OptionsStrategy()).V())],
+ 'g_withStrategiesXOptionsStrategyXmyVar_myValueXX_V': [(lambda g:g.with_strategies(OptionsStrategy(my_var='myValue')).V())],
+ 'g_withoutStrategiesXOptionsStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.OptionsStrategy')]).V())],
+ 'g_withStrategiesXOrderLimitStrategyX_V': [(lambda g:g.with_strategies(OrderLimitStrategy()).V())],
+ 'g_withoutStrategiesXOrderLimitStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.OrderLimitStrategy')]).V())],
'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').add_v('person').property('_partition', 'b').property('name', 'bob')), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['a'])).V().values('name'))],
'g_withStrategiesXPartitionStrategyXwrite_a_read_a_bXX_V_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').add_v('person').property('_partition', 'b').property('name', 'bob')), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['a', 'b'])).V().values('name'))],
'g_withStrategiesXPartitionStrategyXwrite_a_read_cXX_V_name': [(lambda g:g.add_v('person').property('_partition', 'a').property('name', 'alice').add_v('person').property('_partition', 'b').property('name', 'bob')), (lambda g:g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['c'])).V().values('name'))],
@@ -411,7 +460,15 @@ world.gremlins = {
'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_mergeVXlabel_person_name_aliceX_optionXonMatch_name_bobX': [(lambda g, xx1=None,xx2=None:g.add_v('person').property('_partition', 'a').property('name', 'alice').add_v('person').property('_partition', 'b').property('name', 'alice')), (lambda g, xx1=None,xx2=None:g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['a'])).merge_v(xx1).option(Merge.on_match, xx2)), (lambda g, xx1=None,x [...]
'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_mergeV_optionXonCreateX': [(lambda g, xx1=None,xx2=None:g.add_v('person').property('_partition', 'b').property('name', 'alice')), (lambda g, xx1=None,xx2=None:g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['a'])).merge_v(xx1).option(Merge.on_create, xx2)), (lambda g, xx1=None,xx2=None:g.V().has('name', 'alice').has('age', 35).has('_partition', 'a')), (lambda g, xx1=None,xx2=Non [...]
'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_injectX0X__mergeV_optionXonCreateX': [(lambda g, xx1=None,xx2=None:g.add_v('person').property('_partition', 'b').property('name', 'alice')), (lambda g, xx1=None,xx2=None:g.with_strategies(PartitionStrategy(partition_key='_partition', write_partition='a', read_partitions=['a'])).inject(0).merge_v(xx1).option(Merge.on_create, xx2)), (lambda g, xx1=None,xx2=None:g.V().has('name', 'alice').has('age', 35).has('_partition', 'a')), (lambd [...]
+ 'g_withStrategiesXPathProcessorStrategyX_V_asXaX_selectXaX_byXvaluesXnameXX': [(lambda g:g.with_strategies(PathProcessorStrategy()).V().as_('a').select('a').by(__.values('name')))],
+ 'g_withoutStrategiesXPathProcessorStrategyX_V_asXaX_selectXaX_byXvaluesXnameXX': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathProcessorStrategy')]).V().as_('a').select('a').by(__.values('name')))],
+ 'g_withStrategiesXPathRetractionStrategyX_V': [(lambda g:g.with_strategies(PathRetractionStrategy()).V())],
+ 'g_withoutStrategiesXPathRetractionStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathRetractionStrategy')]).V())],
'g_V_shortestpath': [(lambda g:g.V().as_('v').both().as_('v').project('src', 'tgt', 'p').by(__.select(Pop.first, 'v')).by(__.select(Pop.last, 'v')).by(__.select(Pop.all_, 'v')).as_('triple').group('x').by(__.select('src', 'tgt')).by(__.select('p').fold()).select('tgt').barrier().repeat(__.both().as_('v').project('src', 'tgt', 'p').by(__.select(Pop.first, 'v')).by(__.select(Pop.last, 'v')).by(__.select(Pop.all_, 'v')).as_('t').filter_(__.select(Pop.all_, 'p').count(Scope.local).as_('l [...]
+ 'g_withStrategiesXProductiveByStrategyX_V_group_byXageX_byXnameX': [(lambda g:g.with_strategies(ProductiveByStrategy()).V().group().by('age').by('name'))],
+ 'g_withoutStrategiesXProductiveByStrategyX_V_group_byXageX_byXnameX': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ProductiveByStrategy')]).V().group().by('age').by('name'))],
+ 'g_withStrategiesXProfileStrategyX_V': [(lambda g:g.with_strategies(ProfileStrategy()).V())],
+ 'g_withoutStrategiesXProfileStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ProfileStrategy')]).V())],
'g_withStrategiesXReadOnlyStrategyX_V': [(lambda g:g.with_strategies(ReadOnlyStrategy()).V())],
'g_withStrategiesXReadOnlyStrategyX_V_outXknowsX_name': [(lambda g:g.with_strategies(ReadOnlyStrategy()).V().out('knows').values('name'))],
'g_withStrategiesXReadOnlyStrategyX_addVXpersonX': [(lambda g:g.with_strategies(ReadOnlyStrategy()).add_v('person'))],
@@ -420,6 +477,17 @@ world.gremlins = {
'g_withStrategiesXReadOnlyStrategyX_V_propertyXname_joshX': [(lambda g:g.with_strategies(ReadOnlyStrategy()).V().property('name', 'josh'))],
'g_withStrategiesXReadOnlyStrategyX_E_propertyXweight_0X': [(lambda g:g.with_strategies(ReadOnlyStrategy()).E().property('weight', 0))],
'g_V_classic_recommendation': [(lambda g:g.V().has('name', 'DARK STAR').as_('a').out('followedBy').aggregate('stash').in_('followedBy').where(P.neq('a').and_(P.not_(P.within('stash')))).group_count().unfold().project('x', 'y', 'z').by(__.select(Column.keys).values('name')).by(__.select(Column.keys).values('performances')).by(__.select(Column.values)).order().by(__.select('z'), Order.desc).by(__.select('y'), Order.asc).limit(5).aggregate(Scope.local, 'm').select('x'))],
+ 'g_withStrategiesXReferenceElementStrategyX_V': [(lambda g:g.with_strategies(ReferenceElementStrategy()).V())],
+ 'g_withoutStrategiesXReferenceElementStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ReferenceElementStrategy')]).V())],
+ 'g_withStrategiesXRepeatUnrollStrategyX_V_repeatXoutX_timesX2X': [(lambda g:g.with_strategies(RepeatUnrollStrategy()).V().repeat(__.out()).times(2))],
+ 'g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXoutX_timesX2X': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy')]).V().repeat(__.out()).times(2))],
+ 'g_withStrategiesXReservedKeysVerificationStrategyXthrowException_trueXX_addVXpersonX_propertyXid_123X_propertyXname_markoX': [(lambda g:g.with_strategies(ReservedKeysVerificationStrategy(throw_exception=True)).add_v('person').property('id', 123).property('name', 'marko'))],
+ 'g_withStrategiesXReservedKeysVerificationStrategyXthrowException_trueXX_addVXpersonX_propertyXage_29X_propertyXname_markoX': [(lambda g:g.with_strategies(ReservedKeysVerificationStrategy(throw_exception=True, keys=['age'])).add_v('person').property('age', 29).property('name', 'marko'))],
+ 'g_withoutStrategiesXReservedKeysVerificationStrategyX_addVXpersonX_propertyXid_123X_propertyXname_markoX': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReservedKeysVerificationStrategy')]).add_v('person').property('id', 123).property('name', 'marko'))],
+ 'g_withStrategiesXSeedStrategyX_V': [(lambda g:g.with_strategies(SeedStrategy(seed=7)).V().coin(0.5))],
+ 'g_withoutStrategiesXSeedStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy')]).V())],
+ 'g_withStrategiesXStandardVerificationStrategyX_V': [(lambda g:g.with_strategies(StandardVerificationStrategy()).V())],
+ 'g_withoutStrategiesXStandardVerificationStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.StandardVerificationStrategy')]).V())],
'g_withStrategiesXSubgraphStrategyXsubgraphAXX_V': [(lambda g:g.with_strategies(SubgraphStrategy(vertices=__.has('name', P.within('josh', 'lop', 'ripple')))).V())],
'g_withStrategiesXSubgraphStrategyXsubgraphAXX_E': [(lambda g:g.with_strategies(SubgraphStrategy(vertices=__.has('name', P.within('josh', 'lop', 'ripple')))).E())],
'g_withStrategiesXSubgraphStrategyXsubgraphAXX_VX4X_outE': [(lambda g, vid4=None:g.with_strategies(SubgraphStrategy(vertices=__.has('name', P.within('josh', 'lop', 'ripple')))).V(vid4).out_e())],
@@ -481,6 +549,11 @@ world.gremlins = {
'g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX12X_bothV': [(lambda g, eid12=None:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=False, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).E(eid12).both_v())],
'g_withStrategiesXSubgraphStrategyXsubgraphDXX_EX9X_bothV': [(lambda g, eid9=None:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=False, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).E(eid9).both_v())],
'g_withStrategiesXSubgraphStrategyXcheckAdjacentVertices_subgraphDXX_EX9X_bothV': [(lambda g, eid9=None:g.with_strategies(SubgraphStrategy(check_adjacent_vertices=True, vertices=__.has('name', P.within('josh', 'lop', 'ripple')), edges=__.or_(__.has('weight', 0.4).has_label('created'), __.has('weight', 1.0).has_label('created')))).E(eid9).both_v())],
+ 'g_withStrategiesXVertexProgramRestrictionStrategyX_withoutStrategiesXVertexProgramStrategyX_V': [(lambda g:g.with_strategies(VertexProgramRestrictionStrategy()).without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V())],
+ 'g_withStrategiesXVertexProgramRestrictionStrategy_VertexProgramStrategyX_V': [(lambda g:g.with_strategies(VertexProgramRestrictionStrategy(), VertexProgramStrategy()).V())],
+ 'g_withoutStrategiesXVertexProgramRestrictionStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.verification.VertexProgramRestrictionStrategy')]).with_strategies(VertexProgramStrategy()).V())],
+ 'g_withStrategiesXVertexProgramStrategyX_V': [(lambda g:g.with_strategies(VertexProgramStrategy()).V())],
+ 'g_withoutStrategiesXVertexProgramStrategyX_V': [(lambda g:g.without_strategies(*[GremlinType('org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy')]).V())],
'g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX': [(lambda g, vid1=None:g.add_v('person').property('name', 'marko').property('age', 29).as_('marko').add_v('person').property('name', 'vadas').property('age', 27).as_('vadas').add_v('software').property('name', 'lop').property('lang', 'java').as_('lop').add_v('person').property('name', 'josh').property('age', 32).as_('josh').add_v('software').property('name', 'ripple').property('lang', 'java').as_('ripple').add_v('person').property('na [...]
'g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X': [(lambda g, vid1=None:g.add_v('person').property('name', 'marko').property('age', 29).as_('marko').add_v('person').property('name', 'vadas').property('age', 27).as_('vadas').add_v('software').property('name', 'lop').property('lang', 'java').as_('lop').add_v('person').property('name', 'josh').property('age', 32).as_('josh').add_v('software').property('name', 'ripple').property('lang', 'java').as_('ripple').add_v('pe [...]
'g_V_outE_propertyXweight_nullX': [(lambda g:g.add_v('person').property('name', 'marko').property('age', 29).as_('marko').add_v('person').property('name', 'vadas').property('age', 27).as_('vadas').add_v('software').property('name', 'lop').property('lang', 'java').as_('lop').add_v('person').property('name', 'josh').property('age', 32).as_('josh').add_v('software').property('name', 'ripple').property('lang', 'java').as_('ripple').add_v('person').property('name', 'peter').property('age' [...]
diff --git a/gremlin-python/src/main/python/tests/driver/test_client.py b/gremlin-python/src/main/python/tests/driver/test_client.py
index ddd4af32ff..be8dd24259 100644
--- a/gremlin-python/src/main/python/tests/driver/test_client.py
+++ b/gremlin-python/src/main/python/tests/driver/test_client.py
@@ -250,7 +250,7 @@ def test_client_gremlin_lang_options(client):
# smoke test to validate serialization of OptionsStrategy. no way to really validate this from an integration
# test perspective because there's no way to access the internals of the strategy via bytecode
g = GraphTraversalSource(Graph(), TraversalStrategies())
- t = g.with_strategies(OptionsStrategy(options={"x": "test", "y": True})).V()
+ t = g.with_strategies(OptionsStrategy(**{"x": "test", "y": True})).V()
message = create_basic_request_message(t)
result_set = client.submit(message)
assert len(result_set.all().result()) == 6
diff --git a/gremlin-python/src/main/python/tests/process/test_gremlin_lang.py b/gremlin-python/src/main/python/tests/process/test_gremlin_lang.py
index 0457bfe00c..f6126d2008 100644
--- a/gremlin-python/src/main/python/tests/process/test_gremlin_lang.py
+++ b/gremlin-python/src/main/python/tests/process/test_gremlin_lang.py
@@ -367,7 +367,7 @@ class TestGremlinLang(object):
"g.V().count()"])
# 96 Note OptionsStrategy are now extracted into request message and is no longer sent with the script
- tests.append([g.with_strategies(OptionsStrategy({'evaluationTimeout': 500})).V().count(),
+ tests.append([g.with_strategies(OptionsStrategy(evaluationTimeout=500)).V().count(),
"g.V().count()"])
# 97
diff --git a/gremlin-python/src/main/python/tests/process/test_strategies.py b/gremlin-python/src/main/python/tests/process/test_strategies.py
index b6fd0e3015..81f428dd14 100644
--- a/gremlin-python/src/main/python/tests/process/test_strategies.py
+++ b/gremlin-python/src/main/python/tests/process/test_strategies.py
@@ -89,7 +89,7 @@ class TestTraversalStrategies(object):
assert "SubgraphStrategy" in str(gremlin_script)
assert "__.has('name','marko')" in str(gremlin_script)
###
- gremlin_script = g.with_strategies(OptionsStrategy(options={"x": "test", "y": True})).gremlin_lang
+ gremlin_script = g.with_strategies(OptionsStrategy(x="test", y=True)).gremlin_lang
options = gremlin_script.options_strategies
assert "test" == options[0].configuration["x"]
assert options[0].configuration["y"]
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryGroovyRemoteGraphProvider.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryGroovyRemoteGraphProvider.java
index 5e1f9f0466..f9c9de8ffa 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryGroovyRemoteGraphProvider.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryGroovyRemoteGraphProvider.java
@@ -18,16 +18,11 @@
*/
package org.apache.tinkerpop.gremlin.driver.remote;
-import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.util.ser.Serializers;
/**
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
-@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest$GreedyMatchTraversals",
- method = "*",
- reason = "MatchAlgorithmStrategy construction doesn't work for gremlin-groovy")
public class GraphBinaryGroovyRemoteGraphProvider extends AbstractRemoteGraphProvider implements AutoCloseable {
public GraphBinaryGroovyRemoteGraphProvider() {
super(createClusterBuilder(Serializers.GRAPHBINARY_V4).create(), false, "groovy-test");
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteComputerFeatureTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteComputerFeatureTest.java
index dd03370c48..3b610a8041 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteComputerFeatureTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/driver/remote/GraphBinaryRemoteComputerFeatureTest.java
@@ -30,7 +30,8 @@ import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@CucumberOptions(
- tags = "not @RemoteOnly and not @GraphComputerVerificationElementSupported",
+ tags = "not @RemoteOnly and not @GraphComputerVerificationElementSupported and " +
+ "not @GraphComputerVerificationReferenceOnly and not @InsertionOrderingRequired",
glue = { "org.apache.tinkerpop.gremlin.features" },
objectFactory = GraphBinaryRemoteComputerFeatureTest.RemoteGuiceFactory.class,
features = { "classpath:/org/apache/tinkerpop/gremlin/test/features" },
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/AdjacentToIncidentStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/AdjacentToIncidentStrategy.feature
new file mode 100644
index 0000000000..608f9662c3
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/AdjacentToIncidentStrategy.feature
@@ -0,0 +1,80 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - AdjacentToIncidentStrategy
+
+ @WithAdjacentToIncidentStrategy
+ Scenario: g_withStrategiesXAdjacentToIncidentStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(AdjacentToIncidentStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXAdjacentToIncidentStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(AdjacentToIncidentStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ @WithAdjacentToIncidentStrategy
+ Scenario: g_withStrategiesXAdjacentToIncidentStrategyX_V_out_count
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(AdjacentToIncidentStrategy).V().out().count()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | d[6].l |
+
+ @WithAdjacentToIncidentStrategy
+ Scenario: g_withStrategiesXAdjacentToIncidentStrategyX_V_whereXoutX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(AdjacentToIncidentStrategy).V().where(__.out())
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[josh] |
+ | v[peter] |
+
+
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ByModulatorOptimizationStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ByModulatorOptimizationStrategy.feature
new file mode 100644
index 0000000000..126bf70e1f
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ByModulatorOptimizationStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - ByModulatorOptimizationStrategy
+
+ @WithByModulatorOptimizationStrategy
+ Scenario: g_withStrategiesXByModulatorOptimizationStrategyX_V_order_byXvaluesXnameXX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(ByModulatorOptimizationStrategy).V().order().by(values("name"))
+ """
+ When iterated to list
+ Then the result should be ordered
+ | result |
+ | v[josh] |
+ | v[lop] |
+ | v[marko] |
+ | v[peter] |
+ | v[ripple] |
+ | v[vadas] |
+
+ Scenario: g_withoutStrategiesXByModulatorOptimizationStrategyX_V_order_byXvaluesXnameXX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(ByModulatorOptimizationStrategy).V().order().by(values("name"))
+ """
+ When iterated to list
+ Then the result should be ordered
+ | result |
+ | v[josh] |
+ | v[lop] |
+ | v[marko] |
+ | v[peter] |
+ | v[ripple] |
+ | v[vadas] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ComputerFinalizationStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ComputerFinalizationStrategy.feature
new file mode 100644
index 0000000000..80dc757fa0
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ComputerFinalizationStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - ComputerFinalizationStrategy
+
+ @WithComputerFinalizationStrategy
+ Scenario: g_withStrategiesXComputerFinalizationStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(ComputerFinalizationStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXByModulatorOptimizationStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(ComputerFinalizationStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ComputerVerificationStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ComputerVerificationStrategy.feature
new file mode 100644
index 0000000000..bd733f5647
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ComputerVerificationStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - ComputerVerificationStrategy
+
+ @WithComputerVerificationStrategy
+ Scenario: g_withStrategiesXComputerVerificationStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(ComputerVerificationStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXComputerVerificationStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(ComputerVerificationStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ConnectiveStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ConnectiveStrategy.feature
new file mode 100644
index 0000000000..8247d204a4
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ConnectiveStrategy.feature
@@ -0,0 +1,43 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - ConnectiveStrategy
+
+ @WithConnectiveStrategy @GraphComputerVerificationStarGraphExceeded
+ Scenario: g_withStrategiesXConnectiveStrategyStrategyX_V_hasXname_markoX_or_whereXinXknowsX_hasXname_markoXX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(ConnectiveStrategy).V().has("name","marko").or().where(in("knows").has("name","marko"))
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[josh] |
+
+ @GraphComputerVerificationStarGraphExceeded
+ Scenario: g_withoutStrategiesXConnectiveStrategyX_V_hasXname_markoX_or_whereXinXknowsX_hasXname_markoXX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(ConnectiveStrategy).V().has("name","marko").or().where(in("knows").has("name","marko"))
+ """
+ When iterated to list
+ Then the result should be empty
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/CountStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/CountStrategy.feature
new file mode 100644
index 0000000000..46c26edcb8
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/CountStrategy.feature
@@ -0,0 +1,46 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - CountStrategy
+
+ @WithCountStrategy
+ Scenario: g_withStrategiesXCountStrategyX_V_whereXoutE_count_isX0XX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(CountStrategy).V().where(outE().count().is(0))
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[vadas] |
+ | v[lop] |
+ | v[ripple] |
+
+ Scenario: g_withoutStrategiesXCountStrategyX_V_whereXoutE_count_isX0XX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(CountStrategy).V().where(outE().count().is(0))
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[vadas] |
+ | v[lop] |
+ | v[ripple] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/EarlyLimitStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/EarlyLimitStrategy.feature
new file mode 100644
index 0000000000..dcbe50be5e
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/EarlyLimitStrategy.feature
@@ -0,0 +1,46 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - EarlyLimitStrategy
+
+ @WithEarlyLimitStrategy
+ Scenario: g_withStrategiesXEarlyLimitStrategyX_V_out_order_valueMap_limitX3X_selectXnameX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(EarlyLimitStrategy).V().out().order().valueMap().limit(3).select("name")
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | l[vadas] |
+ | l[lop] |
+ | l[lop] |
+
+ Scenario: g_withoutStrategiesXEarlyLimitStrategyX_V_out_order_valueMap_limitX3X_selectXnameX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(EarlyLimitStrategy).V().out().order().valueMap().limit(3).select("name")
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | l[vadas] |
+ | l[lop] |
+ | l[lop] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/EdgeLabelVerificationStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/EdgeLabelVerificationStrategy.feature
new file mode 100644
index 0000000000..4644c624cc
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/EdgeLabelVerificationStrategy.feature
@@ -0,0 +1,63 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - EdgeLabelVerificationStrategy
+
+ @WithEdgeLabelVerificationStrategy
+ Scenario: g_withStrategiesXEdgeLabelVerificationStrategyXthrowException_true_logWarning_falseXX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(EdgeLabelVerificationStrategy(throwException: true, logWarning: false)).V().out()
+ """
+ When iterated to list
+ Then the traversal will raise an error with message containing text of "The provided traversal contains a vertex step without any specified edge label"
+
+ @WithEdgeLabelVerificationStrategy
+ Scenario: g_withStrategiesXEdgeLabelVerificationStrategyXthrowException_false_logWarning_falseXX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(EdgeLabelVerificationStrategy(throwException: false, logWarning: false)).V().out()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[lop] |
+ | v[lop] |
+ | v[lop] |
+ | v[vadas] |
+ | v[josh] |
+ | v[ripple] |
+
+ Scenario: g_withoutStrategiesXEdgeLabelVerificationStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(EdgeLabelVerificationStrategy).V().out()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[lop] |
+ | v[lop] |
+ | v[lop] |
+ | v[vadas] |
+ | v[josh] |
+ | v[ripple] |
+
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ElementIdStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ElementIdStrategy.feature
new file mode 100644
index 0000000000..337eac6bbe
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ElementIdStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - ElementIdStrategy
+
+ @WithElementIdStrategy
+ Scenario: g_withStrategiesXElementIdStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(ElementIdStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXElementIdStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(ElementIdStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/FilterRankingStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/FilterRankingStrategy.feature
new file mode 100644
index 0000000000..3c18eb140f
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/FilterRankingStrategy.feature
@@ -0,0 +1,48 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - FilterRankingStrategy
+
+ @WithFilterRankingStrategy
+ Scenario: g_withStrategiesXFilterRankingStrategyX_V_out_order_dedup
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(FilterRankingStrategy).V().out().order().dedup()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+
+ Scenario: g_withoutStrategiesXFilterRankingStrategyX_V_out_order_dedup
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(FilterRankingStrategy).V().out().order().dedup()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/GraphFilterStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/GraphFilterStrategy.feature
new file mode 100644
index 0000000000..c4b318e476
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/GraphFilterStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - GraphFilterStrategy
+
+ @WithGraphFilterStrategy
+ Scenario: g_withStrategiesXGraphFilterStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(GraphFilterStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXGraphFilterStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(GraphFilterStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/HaltedTraverserStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/HaltedTraverserStrategy.feature
new file mode 100644
index 0000000000..91d80bad39
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/HaltedTraverserStrategy.feature
@@ -0,0 +1,69 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - HaltedTraverserStrategy
+
+ @WithHaltedTraverserStrategy
+ Scenario: g_withStrategiesXHaltedTraverserStrategyXDetachedFactoryXX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(HaltedTraverserStrategy(haltedTraverserFactory: "org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory")).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ @WithHaltedTraverserStrategy
+ Scenario: g_withStrategiesXHaltedTraverserStrategyXReferenceFactoryXX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(HaltedTraverserStrategy(haltedTraverserFactory: "org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceFactory")).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXHaltedTraverserStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(HaltedTraverserStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/IdentityRemovalStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/IdentityRemovalStrategy.feature
new file mode 100644
index 0000000000..0697bc86ed
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/IdentityRemovalStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - IdentityRemovalStrategy
+
+ @WithIdentityRemovalStrategy
+ Scenario: g_withStrategiesXIdentityRemovalStrategyX_V_identity_out
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(IdentityRemovalStrategy).V().identity().out()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[lop] |
+ | v[lop] |
+ | v[lop] |
+ | v[vadas] |
+ | v[josh] |
+ | v[ripple] |
+
+ Scenario: g_withoutStrategiesXIdentityRemovalStrategyX_V_identity_out
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(IdentityRemovalStrategy).V().identity().out()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[lop] |
+ | v[lop] |
+ | v[lop] |
+ | v[vadas] |
+ | v[josh] |
+ | v[ripple] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/IncidentToAdjacentStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/IncidentToAdjacentStrategy.feature
new file mode 100644
index 0000000000..0039518055
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/IncidentToAdjacentStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - IncidentToAdjacentStrategy
+
+ @WithIncidentToAdjacentStrategy
+ Scenario: g_withStrategiesXIncidentToAdjacentStrategyX_V_outE_inV
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(IncidentToAdjacentStrategy).V().outE().inV()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[lop] |
+ | v[lop] |
+ | v[lop] |
+ | v[vadas] |
+ | v[josh] |
+ | v[ripple] |
+
+ Scenario: g_withoutStrategiesXIncidentToAdjacentStrategyX_V_outE_inV
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(IncidentToAdjacentStrategy).V().outE().inV()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[lop] |
+ | v[lop] |
+ | v[lop] |
+ | v[vadas] |
+ | v[josh] |
+ | v[ripple] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/InlineFilterStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/InlineFilterStrategy.feature
new file mode 100644
index 0000000000..7126571b1a
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/InlineFilterStrategy.feature
@@ -0,0 +1,42 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - InlineFilterStrategy
+
+ @WithInlineFilterStrategy
+ Scenario: g_withStrategiesXInlineFilterStrategyX_V_filterXhasXname_markoXX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(InlineFilterStrategy).V().filter(has("name","marko"))
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+
+ Scenario: g_withoutStrategiesXInlineFilterStrategyX_V_filterXhasXname_markoXX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(InlineFilterStrategy).V().filter(has("name","marko"))
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/LambdaRestrictionStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/LambdaRestrictionStrategy.feature
new file mode 100644
index 0000000000..7e6f3efd98
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/LambdaRestrictionStrategy.feature
@@ -0,0 +1,54 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+
+#
+@StepClassIntegrated
+Feature: Step - LambdaRestrictionStrategy
+
+ @WithLambdaRestrictionStrategy
+ Scenario: g_withStrategiesXLambdaRestrictionStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(LambdaRestrictionStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXLambdaRestrictionStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(LambdaRestrictionStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/LazyBarrierStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/LazyBarrierStrategy.feature
new file mode 100644
index 0000000000..c982b47514
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/LazyBarrierStrategy.feature
@@ -0,0 +1,42 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - LazyBarrierStrategy
+
+ @WithLazyBarrierStrategy
+ Scenario: g_withStrategiesXLazyBarrierStrategyX_V_out_bothE_count
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(LazyBarrierStrategy).V().out().bothE().count()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | d[14].l |
+
+ Scenario: g_withoutStrategiesXLazyBarrierStrategyX_V_out_bothE_count
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(LazyBarrierStrategy).V().out().bothE().count()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | d[14].l |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/MatchAlgorithmStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/MatchAlgorithmStrategy.feature
new file mode 100644
index 0000000000..2b5680941c
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/MatchAlgorithmStrategy.feature
@@ -0,0 +1,63 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - MatchAlgorithmStrategy
+
+ @WithMatchAlgorithmStrategy
+ Scenario: g_withStrategiesXMatchAlgorithmStrategyXmatchAlgorithm_CountMatchAlgorithmXX_V_matchXa_knows_b__a_created_cX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(MatchAlgorithmStrategy(matchAlgorithm: "org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchStep$CountMatchAlgorithm"))
+ .V().match(__.as("a").out("knows").as("b"),
+ __.as("a").out("created").as("c"))
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | m[{"a":"v[marko]","b":"v[vadas]","c":"v[lop]"}] |
+ | m[{"a":"v[marko]","b":"v[josh]","c":"v[lop]"}] |
+
+ @WithMatchAlgorithmStrategy
+ Scenario: g_withStrategiesXMatchAlgorithmStrategyXmatchAlgorithm_GreedyMatchAlgorithmXX_V_matchXa_knows_b__a_created_cX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(MatchAlgorithmStrategy(matchAlgorithm: "org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchStep$GreedyMatchAlgorithm"))
+ .V().match(__.as("a").out("knows").as("b"),
+ __.as("a").out("created").as("c"))
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | m[{"a":"v[marko]","b":"v[vadas]","c":"v[lop]"}] |
+ | m[{"a":"v[marko]","b":"v[josh]","c":"v[lop]"}] |
+
+ Scenario: g_withoutStrategiesXMatchAlgorithmStrategyX_V_matchXa_knows_b__a_created_cX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(MatchAlgorithmStrategy)
+ .V().match(__.as("a").out("knows").as("b"),
+ __.as("a").out("created").as("c"))
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | m[{"a":"v[marko]","b":"v[vadas]","c":"v[lop]"}] |
+ | m[{"a":"v[marko]","b":"v[josh]","c":"v[lop]"}] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/MatchPredicateStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/MatchPredicateStrategy.feature
new file mode 100644
index 0000000000..bcf6c8cc9f
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/MatchPredicateStrategy.feature
@@ -0,0 +1,49 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - MatchPredicateStrategy
+
+ @WithMatchPredicateStrategy @GraphComputerVerificationStarGraphExceeded
+ Scenario: g_withStrategiesXMatchPredicateStrategyX_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXa_b_cX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(MatchPredicateStrategy).V().match(__.as("a").out("created").has("name", "lop").as("b"),
+ __.as("b").in("created").has("age", 29).as("c")).where(__.as("c").repeat(__.out()).times(2)).select("a", "b", "c")
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | m[{"a":"v[marko]","b":"v[lop]","c":"v[marko]"}] |
+ | m[{"a":"v[josh]","b":"v[lop]","c":"v[marko]"}] |
+ | m[{"a":"v[peter]","b":"v[lop]","c":"v[marko]"}] |
+
+ @GraphComputerVerificationStarGraphExceeded
+ Scenario: g_withoutStrategiesXMatchPredicateStrategyX_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXa_b_cX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(MatchPredicateStrategy).V().match(__.as("a").out("created").has("name", "lop").as("b"),
+ __.as("b").in("created").has("age", 29).as("c")).where(__.as("c").repeat(__.out()).times(2)).select("a", "b", "c")
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | m[{"a":"v[marko]","b":"v[lop]","c":"v[marko]"}] |
+ | m[{"a":"v[josh]","b":"v[lop]","c":"v[marko]"}] |
+ | m[{"a":"v[peter]","b":"v[lop]","c":"v[marko]"}] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/MessagePassingReductionStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/MessagePassingReductionStrategy.feature
new file mode 100644
index 0000000000..c36adcf659
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/MessagePassingReductionStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - MessagePassingReductionStrategy
+
+ @WithMessagePassingReductionStrategy
+ Scenario: g_withStrategiesXMessagePassingReductionStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(MessagePassingReductionStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXMessagePassingReductionStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(MessagePassingReductionStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/OptionsStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/OptionsStrategy.feature
new file mode 100644
index 0000000000..db90e07230
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/OptionsStrategy.feature
@@ -0,0 +1,69 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - OptionsStrategy
+
+ @WithOptionsStrategy
+ Scenario: g_withStrategiesXOptionsStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(OptionsStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ @WithOptionsStrategy
+ Scenario: g_withStrategiesXOptionsStrategyXmyVar_myValueXX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(OptionsStrategy(myVar: "myValue")).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXOptionsStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(OptionsStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/OrderLimitStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/OrderLimitStrategy.feature
new file mode 100644
index 0000000000..805c1d66c9
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/OrderLimitStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - OrderLimitStrategy
+
+ @WithOrderLimitStrategy
+ Scenario: g_withStrategiesXOrderLimitStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(OrderLimitStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXOrderLimitStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(OrderLimitStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/PathProcessorStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/PathProcessorStrategy.feature
new file mode 100644
index 0000000000..6f4f283aac
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/PathProcessorStrategy.feature
@@ -0,0 +1,53 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - PathProcessorStrategy
+
+ @WithPathProcessorStrategy
+ Scenario: g_withStrategiesXPathProcessorStrategyX_V_asXaX_selectXaX_byXvaluesXnameXX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(PathProcessorStrategy).V().as("a").select("a").by(values("name"))
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | marko |
+ | vadas |
+ | lop |
+ | josh |
+ | ripple |
+ | peter |
+
+ @GraphComputerVerificationReferenceOnly
+ Scenario: g_withoutStrategiesXPathProcessorStrategyX_V_asXaX_selectXaX_byXvaluesXnameXX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(PathProcessorStrategy).V().as("a").select("a").by(values("name"))
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | marko |
+ | vadas |
+ | lop |
+ | josh |
+ | ripple |
+ | peter |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/PathRetractionStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/PathRetractionStrategy.feature
new file mode 100644
index 0000000000..54e807f5a8
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/PathRetractionStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - PathRetractionStrategy
+
+ @WithPathRetractionStrategy
+ Scenario: g_withStrategiesXPathRetractionStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(PathRetractionStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXPathRetractionStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(PathRetractionStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ProductiveByStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ProductiveByStrategy.feature
new file mode 100644
index 0000000000..0edd21cc15
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ProductiveByStrategy.feature
@@ -0,0 +1,42 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - ProductiveByStrategy
+
+ @WithProductiveByStrategy @InsertionOrderingRequired
+ Scenario: g_withStrategiesXProductiveByStrategyX_V_group_byXageX_byXnameX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(ProductiveByStrategy).V().group().by("age").by("name")
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | m[{"null":"l[lop,ripple]","d[32].i":"l[josh]","d[35].i":"l[peter]","d[27].i":"l[vadas]","d[29].i":"l[marko]"}] |
+
+ Scenario: g_withoutStrategiesXProductiveByStrategyX_V_group_byXageX_byXnameX
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(ProductiveByStrategy).V().group().by("age").by("name")
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | m[{"d[32].i":"l[josh]","d[35].i":"l[peter]","d[27].i":"l[vadas]","d[29].i":"l[marko]"}] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ProfileStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ProfileStrategy.feature
new file mode 100644
index 0000000000..e51c7a0275
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ProfileStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - ProfileStrategy
+
+ @WithProfileStrategy
+ Scenario: g_withStrategiesXProfileStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(ProfileStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXProfileStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(ProfileStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ReferenceElementStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ReferenceElementStrategy.feature
new file mode 100644
index 0000000000..6b50420fa4
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ReferenceElementStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - ReferenceElementStrategy
+
+ @WithReferenceElementStrategy
+ Scenario: g_withStrategiesXReferenceElementStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(ReferenceElementStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXReferenceElementStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(ReferenceElementStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/RepeatUnrollStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/RepeatUnrollStrategy.feature
new file mode 100644
index 0000000000..13fd68a8c8
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/RepeatUnrollStrategy.feature
@@ -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.
+
+@StepClassIntegrated
+Feature: Step - RepeatUnrollStrategy
+
+ @WithRepeatUnrollStrategy
+ Scenario: g_withStrategiesXRepeatUnrollStrategyX_V_repeatXoutX_timesX2X
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(RepeatUnrollStrategy).V().repeat(out()).times(2)
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[lop] |
+ | v[ripple] |
+
+ Scenario: g_withoutStrategiesXRepeatUnrollStrategyX_V_repeatXoutX_timesX2X
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(RepeatUnrollStrategy).V().repeat(out()).times(2)
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[lop] |
+ | v[ripple] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ReservedKeysVerificationStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ReservedKeysVerificationStrategy.feature
new file mode 100644
index 0000000000..88142b0c2d
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/ReservedKeysVerificationStrategy.feature
@@ -0,0 +1,50 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - ReservedKeysVerificationStrategy
+
+ @WithReservedKeysVerificationStrategy
+ Scenario: g_withStrategiesXReservedKeysVerificationStrategyXthrowException_trueXX_addVXpersonX_propertyXid_123X_propertyXname_markoX
+ Given the empty graph
+ And the traversal of
+ """
+ g.withStrategies(ReservedKeysVerificationStrategy(throwException: true)).addV("person").property("id", 123).property("name", "marko")
+ """
+ When iterated to list
+ Then the traversal will raise an error with message containing text of "is setting a property key to a reserved word: id"
+
+ @WithReservedKeysVerificationStrategy
+ Scenario: g_withStrategiesXReservedKeysVerificationStrategyXthrowException_trueXX_addVXpersonX_propertyXage_29X_propertyXname_markoX
+ Given the empty graph
+ And the traversal of
+ """
+ g.withStrategies(ReservedKeysVerificationStrategy(throwException: true, keys: ["age"])).addV("person").property("age", 29).property("name", "marko")
+ """
+ When iterated to list
+ Then the traversal will raise an error with message containing text of "is setting a property key to a reserved word: age"
+
+ Scenario: g_withoutStrategiesXReservedKeysVerificationStrategyX_addVXpersonX_propertyXid_123X_propertyXname_markoX
+ Given the empty graph
+ And the traversal of
+ """
+ g.withoutStrategies(ReservedKeysVerificationStrategy).addV("person").property("id", 123).property("name", "marko")
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/SeedStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/SeedStrategy.feature
new file mode 100644
index 0000000000..57b76f8325
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/SeedStrategy.feature
@@ -0,0 +1,48 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - SeedStrategy
+
+ @WithSeedStrategy @InsertionOrderingRequired
+ Scenario: g_withStrategiesXSeedStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(SeedStrategy(seed: 7)).V().coin(0.5)
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[lop] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXSeedStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(SeedStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/StandardVerificationStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/StandardVerificationStrategy.feature
new file mode 100644
index 0000000000..623c282019
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/StandardVerificationStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - StandardVerificationStrategy
+
+ @WithStandardVerificationStrategy
+ Scenario: g_withStrategiesXStandardVerificationStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(StandardVerificationStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXStandardVerificationStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(StandardVerificationStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/VertexProgramRestrictionStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/VertexProgramRestrictionStrategy.feature
new file mode 100644
index 0000000000..125989548a
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/VertexProgramRestrictionStrategy.feature
@@ -0,0 +1,63 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - VertexProgramRestrictionStrategy
+
+ @WithVertexProgramRestrictionStrategy
+ Scenario: g_withStrategiesXVertexProgramRestrictionStrategyX_withoutStrategiesXVertexProgramStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(VertexProgramRestrictionStrategy).withoutStrategies(VertexProgramStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ @WithVertexProgramRestrictionStrategy @WithVertexProgramStrategy
+ Scenario: g_withStrategiesXVertexProgramRestrictionStrategy_VertexProgramStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(VertexProgramRestrictionStrategy, VertexProgramStrategy).V()
+ """
+ When iterated to list
+ Then the traversal will raise an error with message containing text of "The TraversalSource does not allow the use of a GraphComputer"
+
+ @WithVertexProgramStrategy @GraphComputerOnly
+ Scenario: g_withoutStrategiesXVertexProgramRestrictionStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(VertexProgramRestrictionStrategy).withStrategies(VertexProgramStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/VertexProgramStrategy.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/VertexProgramStrategy.feature
new file mode 100644
index 0000000000..938f9635a2
--- /dev/null
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/VertexProgramStrategy.feature
@@ -0,0 +1,52 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - VertexProgramStrategy
+
+ @WithVertexProgramStrategy @GraphComputerOnly
+ Scenario: g_withStrategiesXVertexProgramStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withStrategies(VertexProgramStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
+
+ Scenario: g_withoutStrategiesXVertexProgramStrategyX_V
+ Given the modern graph
+ And the traversal of
+ """
+ g.withoutStrategies(VertexProgramStrategy).V()
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
+ | v[vadas] |
+ | v[lop] |
+ | v[josh] |
+ | v[ripple] |
+ | v[peter] |
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureIntegrateTest.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureIntegrateTest.java
index d3f9bedd02..03bd30c185 100644
--- a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureIntegrateTest.java
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureIntegrateTest.java
@@ -62,7 +62,7 @@ import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData;
"not @GraphComputerVerificationMidVNotSupported and not @GraphComputerVerificationElementSupported and " +
"not @GraphComputerVerificationInjectionNotSupported and " +
"not @GraphComputerVerificationStarGraphExceeded and not @GraphComputerVerificationReferenceOnly and " +
- "not @TinkerServiceRegistry",
+ "not @TinkerServiceRegistry and not @InsertionOrderingRequired and not @WithElementIdStrategy",
glue = { "org.apache.tinkerpop.gremlin.features" },
objectFactory = GuiceFactory.class,
features = { "classpath:/org/apache/tinkerpop/gremlin/test/features" },