This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch TINKERPOP-2338 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit d31733952dfdbc727055c3d51b2ed35a4013f0c0 Author: Stephen Mallette <sp...@genoprime.com> AuthorDate: Thu Feb 13 06:07:49 2020 -0500 TINKERPOP-2338 wip --- .../strategy/optimization/LazyBarrierStrategy.java | 5 +++ .../optimization/LazyBarrierStrategyTest.java | 9 ++++- .../Gherkin/GherkinTestRunner.cs | 2 +- .../src/main/jython/radish/feature_steps.py | 2 + gremlin-test/features/filter/Drop.feature | 43 +++++++++++++++++++++- .../process/traversal/step/filter/DropTest.java | 37 +++++++++++++++++++ 6 files changed, 95 insertions(+), 3 deletions(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java index 7a4b17d..1e2257f 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java @@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.step.Barrier; import org.apache.tinkerpop.gremlin.process.traversal.step.PathProcessor; +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NoneStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapStep; @@ -74,7 +75,11 @@ public final class LazyBarrierStrategy extends AbstractTraversalStrategy<Travers @Override public void apply(final Traversal.Admin<?, ?> traversal) { + // drop() is a problem for bulked edge/meta properties because of Property equality changes in TINKERPOP-2318 + // which made it so that a Property is equal if the key/value is equal. as a result, they bulk together which + // is fine for almost all cases except when you wish to drop the property. if (TraversalHelper.onGraphComputer(traversal) || + TraversalHelper.hasStepOfAssignableClass(DropStep.class, traversal) || traversal.getTraverserRequirements().contains(TraverserRequirement.PATH) || (IS_TESTING && ((TraversalHelper.hasStepOfAssignableClass(ProfileStep.class, TraversalHelper.getRootTraversal(traversal)) || TraversalHelper.hasStepOfAssignableClass(ProfileSideEffectStep.class, TraversalHelper.getRootTraversal(traversal)))))) // necessary cause ProfileTest analyzes counts diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategyTest.java index b2bbd94..100ba8b 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategyTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategyTest.java @@ -100,7 +100,14 @@ public class LazyBarrierStrategyTest { {__.out().as("a").out().as("b").in().where(P.neq("a")).out().select("b").out(), __.out().as("a").out().as("b").in().where(P.neq("a")).barrier(PATH_SIZE).out().select("b").barrier(PATH_SIZE).out(), Collections.singletonList(PathRetractionStrategy.instance())}, {__.out().as("a").out().as("b").in().where(P.neq("a")).out().select("b").out().out(), __.out().as("a").out().as("b").in().where(P.neq("a")).barrier(PATH_SIZE).out().select("b").barrier(PATH_SIZE).out().barrier(LAZY_SIZE).out(), Collections.singletonList(PathRetractionStrategy.instance())}, {__.V().out().out().groupCount().by(__.out().out().out()).out(), __.V().out().barrier(LAZY_SIZE).out().groupCount().by(__.out().out().barrier(LAZY_SIZE).out()).out(), Collections.emptyList()}, - {__.V().out().out().groupCount().by(__.out().out().out()).out().as("a"), __.V().out().barrier(LAZY_SIZE).out().groupCount().by(__.out().out().barrier(LAZY_SIZE).out()).out().as("a"), Collections.emptyList()} + {__.V().out().out().groupCount().by(__.out().out().out()).out().as("a"), __.V().out().barrier(LAZY_SIZE).out().groupCount().by(__.out().out().barrier(LAZY_SIZE).out()).out().as("a"), Collections.emptyList()}, + {__.out().drop(), __.out().drop(), Collections.emptyList()}, + {__.out().properties().drop(), __.out().properties().drop(), Collections.emptyList()}, + {__.out().properties().properties().drop(), __.out().properties().properties().drop(), Collections.emptyList()}, + {__.out().out().properties().drop(), __.out().out().properties().drop(), Collections.emptyList()}, + {__.out().out().values().is(true), __.out().out().barrier(LAZY_SIZE).values().barrier(LAZY_SIZE).is(true), Collections.emptyList()}, + {__.outE().drop(), __.outE().drop(), Collections.emptyList()}, + {__.outE().properties().drop(), __.outE().properties().drop(), Collections.emptyList()} }); } } diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs index ba3b4ee..621ec8e 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs @@ -41,7 +41,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin new Dictionary<string, IgnoreReason> { // Add here the name of scenarios to ignore and the reason, e.g.: - // { "g_V_peerPressure_byXclusterX_byXoutEXknowsXX_pageRankX1X_byXrankX_byXoutEXknowsXX_timesX2X_group_byXclusterX_byXrank_sumX_limitX100X", IgnoreReason.NoReason }, + { "g_V_properties_propertiesXstartTimeX_drop", IgnoreReason.NoReason }, }; private static class Keywords diff --git a/gremlin-python/src/main/jython/radish/feature_steps.py b/gremlin-python/src/main/jython/radish/feature_steps.py index 441a3fb..40d2518 100644 --- a/gremlin-python/src/main/jython/radish/feature_steps.py +++ b/gremlin-python/src/main/jython/radish/feature_steps.py @@ -31,6 +31,7 @@ regex_and = re.compile(r"([(.,\s])and\(") regex_as = re.compile(r"([(.,\s])as\(") regex_from = re.compile(r"([(.,\s])from\(") regex_global = re.compile(r"([(.,\s])global") +regex_cardlist = re.compile(r"Cardinality\.list") regex_in = re.compile(r"([(.,\s])in\(") regex_is = re.compile(r"([(.,\s])is\(") regex_not = re.compile(r"([(.,\s])not\(") @@ -237,6 +238,7 @@ def _table_assertion(data, result, ctx, ordered): def _translate(traversal_): replaced = traversal_.replace("\n", "") replaced = regex_all.sub(r"Pop.all_", replaced) + replaced = regex_cardlist.sub(r"Cardinality.list_", replaced) replaced = regex_and.sub(r"\1and_(", replaced) replaced = regex_from.sub(r"\1from_(", replaced) replaced = regex_global.sub(r"\1global_", replaced) diff --git a/gremlin-test/features/filter/Drop.feature b/gremlin-test/features/filter/Drop.feature index 753b377..144399e 100644 --- a/gremlin-test/features/filter/Drop.feature +++ b/gremlin-test/features/filter/Drop.feature @@ -60,4 +60,45 @@ Feature: Step - drop() When iterated to list Then the result should be empty And the graph should return 2 for count of "g.V()" - And the graph should return 0 for count of "g.V().properties()" \ No newline at end of file + And the graph should return 0 for count of "g.V().properties()" + + Scenario: g_E_propertiesXweightX_drop + Given the empty graph + And the graph initializer of + """ + g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).as("marko"). + addV("person").property(T.id, 2).property("name", "vadas").property("age", 27).as("vadas"). + addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").as("lop"). + addV("person").property(T.id, 4).property("name","josh").property("age", 32).as("josh"). + addV("software").property(T.id, 5).property("name", "ripple").property("lang", "java").as("ripple"). + addV("person").property(T.id, 6).property("name", "peter").property("age", 35).as('peter'). + addE("knows").from("marko").to("vadas").property(T.id, 7).property("weight", 0.5). + addE("knows").from("marko").to("josh").property(T.id, 8).property("weight", 1.0). + addE("created").from("marko").to("lop").property(T.id, 9).property("weight", 0.4). + addE("created").from("josh").to("ripple").property(T.id, 10).property("weight", 1.0). + addE("created").from("josh").to("lop").property(T.id, 11).property("weight", 0.4). + addE("created").from("peter").to("lop").property(T.id, 12).property("weight", 0.2) + """ + And the traversal of + """ + g.E().properties("weight").drop() + """ + When iterated to list + Then the result should be empty + And the graph should return 0 for count of "g.E().properties()" + + Scenario: g_V_properties_propertiesXstartTimeX_drop + Given the empty graph + And the graph initializer of + """ + g.addV().property("name","bob").property(Cardinality.list, "location", "ny", "startTime", 2014, "endTime", 2016).property(Cardinality.list, "location", "va", "startTime", 2016). + addV().property("name","alice").property(Cardinality.list, "location", "va", "startTime", 2014, "endTime", 2016).property(Cardinality.list, "location", "ny", "startTime", 2016) + """ + And the traversal of + """ + g.V().properties().properties("startTime").drop() + """ + When iterated to list + Then the result should be empty + And the graph should return 2 for count of "g.V().properties().properties()" + And the graph should return 0 for count of "g.V().properties().properties(\"startTime\")" \ No newline at end of file diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DropTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DropTest.java index f33997e..2b6a9ad 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DropTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DropTest.java @@ -26,12 +26,14 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; +import org.apache.tinkerpop.gremlin.structure.Property; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; import org.junit.Test; import org.junit.runner.RunWith; +import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW; import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -48,6 +50,10 @@ public abstract class DropTest extends AbstractGremlinTest { public abstract Traversal<Vertex, VertexProperty> get_g_V_properties_drop(); + public abstract Traversal<Vertex, ? extends Property<Object>> get_g_V_properties_propertiesXstartTimeX_drop(); + + public abstract Traversal<Edge, ? extends Property<Object>> get_g_E_propertiesXweightX_drop(); + @Test @LoadGraphWith(MODERN) @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_REMOVE_VERTICES) @@ -82,6 +88,27 @@ public abstract class DropTest extends AbstractGremlinTest { g.V().forEachRemaining(vertex -> assertEquals(0, IteratorUtils.count(vertex.properties()))); } + @Test + @LoadGraphWith(MODERN) + @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_REMOVE_PROPERTY) + public void g_E_propertiesXweightX_drop() { + final Traversal<Edge, ? extends Property<Object>> traversal = get_g_E_propertiesXweightX_drop(); + printTraversalForm(traversal); + assertFalse(traversal.hasNext()); + g.E().forEachRemaining(edge -> assertEquals(0, IteratorUtils.count(edge.properties()))); + } + + + @Test + @LoadGraphWith(CREW) + @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_REMOVE_PROPERTY) + public void g_V_properties_propertiesXstartTimeX_drop() { + final Traversal<Vertex, ? extends Property<Object>> traversal = get_g_V_properties_propertiesXstartTimeX_drop(); + printTraversalForm(traversal); + assertFalse(traversal.hasNext()); + g.V().forEachRemaining(vertex -> assertEquals(0, IteratorUtils.count(IteratorUtils.flatMap(vertex.properties("location"), vp -> vp.properties("startTime"))))); + } + public static class Traversals extends DropTest { @@ -99,5 +126,15 @@ public abstract class DropTest extends AbstractGremlinTest { public Traversal<Vertex, VertexProperty> get_g_V_properties_drop() { return (Traversal) g.V().properties().drop(); } + + @Override + public Traversal<Edge, ? extends Property<Object>> get_g_E_propertiesXweightX_drop() { + return g.E().properties("weight").drop(); + } + + @Override + public Traversal<Vertex, ? extends Property<Object>> get_g_V_properties_propertiesXstartTimeX_drop() { + return g.V().properties().properties("startTime").drop(); + } } } \ No newline at end of file