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

Reply via email to