This is an automated email from the ASF dual-hosted git repository.

valentyn pushed a commit to branch 3.6-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/3.6-dev by this push:
     new 7fbc3b9c6d TINKERPOP-2939 Fixed MergeE/MergeV steps to always throw 
exception for invalid `onMatch` option. (#2162)
7fbc3b9c6d is described below

commit 7fbc3b9c6dee022d91675c3366de53077354deb0
Author: Valentyn Kahamlyk <[email protected]>
AuthorDate: Thu Jul 27 16:44:10 2023 -0700

    TINKERPOP-2939 Fixed MergeE/MergeV steps to always throw exception for 
invalid `onMatch` option. (#2162)
---
 CHANGELOG.asciidoc                                        |  3 ++-
 .../gremlin/process/traversal/step/map/MergeEdgeStep.java |  5 +++++
 .../process/traversal/step/map/MergeVertexStep.java       |  6 ++++++
 .../tinkerpop/gremlin/test/features/map/MergeEdge.feature | 15 +++++++++++++++
 .../gremlin/test/features/map/MergeVertex.feature         | 11 +++++++++++
 5 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index fe768c3d82..e19c3fe4b3 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -30,7 +30,8 @@ This release also includes changes from <<release-3-5-7, 
3.5.7>>.
 * Fixed bug with `fail` step not working with a `VertexProgram` running on the 
server.
 * Introduced mime type `application/vnd.gremlin-v1.0+json;typed=false` to 
allow direct specification of GraphSON 1.0 without types.
 * Introduced mime type `application/vnd.gremlin-v2.0+json;typed=false` to 
allow direct specification of GraphSON 2.0 without types.
-* Removed `final` class declaration for `LabelStep`
+* Removed `final` class declaration for `LabelStep`.
+* Fixed MergeE/MergeV steps to always throw exception for invalid `onMatch` 
option.
 
 [[release-3-6-4]]
 === TinkerPop 3.6.4 (Release Date: May 12, 2023)
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStep.java
index b1e3875a72..748df266e0 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStep.java
@@ -33,6 +33,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Merge;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
@@ -265,6 +266,10 @@ public class MergeEdgeStep<S> extends MergeStep<S, Edge, 
Object> {
         Iterator<Edge> edges = searchEdges(mergeMap);
 
         if (onMatchTraversal != null) {
+            if (onMatchTraversal instanceof ConstantTraversal) {
+                final Map matchMap = onMatchTraversal.next();
+                validateMapInput(matchMap, true);
+            }
 
             edges = IteratorUtils.peek(edges, e -> {
 
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java
index 1408cfbfec..a976775a99 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java
@@ -29,6 +29,7 @@ import java.util.stream.Stream;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategy;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -84,6 +85,11 @@ public class MergeVertexStep<S> extends MergeStep<S, Vertex, 
Map> {
         Iterator<Vertex> vertices = searchVertices(mergeMap);
 
         if (onMatchTraversal != null) {
+            if (onMatchTraversal instanceof ConstantTraversal) {
+                final Map matchMap = onMatchTraversal.next();
+                validateMapInput(matchMap, true);
+            }
+
             // attach the onMatch properties
             vertices = IteratorUtils.peek(vertices, v -> {
 
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeEdge.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeEdge.feature
index 5acf5fb1a0..e5c65e1de2 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeEdge.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeEdge.feature
@@ -853,3 +853,18 @@ Feature: Step - mergeE()
     And the graph should return 1 for count of "g.E()"
     And the graph should return 1 for count of "g.V(1).out(\"knows\").hasId(2)"
 
+  # cannot use hidden namespace for label key for onMatch
+  Scenario: 
g_V_asXvX_mergeEXxx1X_optionXMerge_onMatch_xx2X_optionXMerge_outV_selectXvXX_optionXMerge_inV_selectXvXX
+    Given the empty graph
+    And the graph initializer of
+      """
+      g.addV("person").property("name", "marko").property("age", 29)
+      """
+    And using the parameter xx1 defined as "m[{\"t[label]\": \"self\", 
\"D[OUT]\":\"M[outV]\", \"D[IN]\":\"M[inV]\"}]"
+    And using the parameter xx2 defined as "m[{\"~label\":\"vertex\"}]"
+    And the traversal of
+      """
+      
g.V().as("v").mergeE(xx1).option(Merge.onMatch,xx2).option(Merge.outV,select("v")).option(Merge.inV,select("v"))
+      """
+    When iterated to list
+    Then the traversal will raise an error with message containing text of 
"Property key can not be a hidden key: ~label"
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeVertex.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeVertex.feature
index 9fca250457..fec2f9a637 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeVertex.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/MergeVertex.feature
@@ -827,3 +827,14 @@ Feature: Step - mergeV()
       """
     When iterated to list
     Then the traversal will raise an error with message containing text of 
"Property key can not be a hidden key: ~label"
+
+  # cannot use hidden namespace for label key for onMatch
+  Scenario: g_mergeV_hidden_label_key_onMatch_matched_prohibited
+    Given the empty graph
+    And using the parameter xx1 defined as "m[{\"~label\":\"vertex\"}]"
+    And the traversal of
+      """
+      g.mergeV([:]).option(Merge.onMatch, xx1)
+      """
+    When iterated to list
+    Then the traversal will raise an error with message containing text of 
"Property key can not be a hidden key: ~label"

Reply via email to