You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by co...@apache.org on 2025/09/10 01:28:32 UTC
(tinkerpop) branch GValue-refinement created (now 5fe1672528)
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a change to branch GValue-refinement
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
at 5fe1672528 range and tail
This branch includes the following new commits:
new e4a876d320 WIP
new dab5231e33 WIP cleanup unoptimized strategies
new dbf12b395d WIP call and graph steps
new 0c4daf3bc9 AddVertex/AddElement
new 83c4ca4978 rename PropertiesHolder
new 55415f8305 AddProperty
new 31b073315f AddEdge
new c2994e986a mergeV/E
new e28b1474a8 vertexStep and IsStep
new 5fe1672528 range and tail
The 10 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(tinkerpop) 06/10: AddProperty
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch GValue-refinement
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 55415f830522a80875869035fd86045a2f5f02b1
Author: Cole-Greer <Co...@improving.com>
AuthorDate: Tue Sep 9 15:55:15 2025 -0700
AddProperty
---
.../traversal/step/sideEffect/AddPropertyStepContract.java | 8 ++++++++
.../step/sideEffect/AddPropertyStepPlaceholder.java | 12 +++++++-----
.../traversal/step/sideEffect/AddPropertyStepTest.java | 8 ++++----
3 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepContract.java
index 6fa32b7a7f..f7f0691a92 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepContract.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.step.Deleting;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.Writing;
@@ -49,4 +50,11 @@ public interface AddPropertyStepContract<S> extends Step<S, S>, TraversalParent,
* Get the property value
*/
Object getValue();
+
+ /**
+ * Get the value as a GValue, without pinning the variable
+ */
+ default GValue<?> getValueAsGValue() {
+ return GValue.of(getValue());
+ }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
index 3edaaefcf8..af3cb92846 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
@@ -118,10 +118,11 @@ public class AddPropertyStepPlaceholder<S extends Element> extends AbstractStep<
}
/**
- * Get the value without pinning the variable.
+ * Get the value as a GValue, without pinning the variable
*/
- public Object getValueGValueSafe() {
- return value == null ? null : value.get();
+ @Override
+ public GValue<?> getValueAsGValue() {
+ return value;
}
@Override
@@ -204,8 +205,9 @@ public class AddPropertyStepPlaceholder<S extends Element> extends AbstractStep<
gValue -> traversal.getGValueManager().pinVariable(gValue.getName()));
}
- public Map<Object, List<Object>> getPropertiesGValueSafe() {
- return GValueHelper.resolveProperties(properties);
+ @Override
+ public Map<Object, List<Object>> getPropertiesWithGValues() {
+ return Collections.unmodifiableMap(properties);
}
@Override
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepTest.java
index 4dd6051b17..c27fa13ea8 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepTest.java
@@ -97,16 +97,16 @@ public class AddPropertyStepTest extends GValueStepTest {
}
@Test
- public void getValueGValueSafeShouldNotPinVariable() {
+ public void getValueAsGValueShouldNotPinVariable() {
final GraphTraversal.Admin<Object, Object> traversal = __.property(PNAME, GValue.of(GNAME, PVALUE)).asAdmin();
- assertEquals(PVALUE, ((AddPropertyStepPlaceholder) traversal.getSteps().get(0)).getValueGValueSafe());
+ assertEquals(GValue.of(GNAME, PVALUE), ((AddPropertyStepPlaceholder) traversal.getSteps().get(0)).getValueAsGValue());
verifySingleUnpinnedVariable(traversal, GNAME);
}
@Test
- public void getPropertiesGValueSafeShouldNotPinVariable() {
+ public void getPropertiesWithGValuesShouldNotPinVariable() {
final GraphTraversal.Admin<Object, Object> traversal = __.property(PNAME, PVALUE, META_NAME, GValue.of(GMETA_NAME, META_VALUE)).asAdmin();
- assertEquals(List.of(META_VALUE), ((AddPropertyStepPlaceholder) traversal.getSteps().get(0)).getPropertiesGValueSafe().get(META_NAME));
+ assertEquals(List.of(GValue.of(GMETA_NAME, META_VALUE)), ((AddPropertyStepPlaceholder) traversal.getSteps().get(0)).getPropertiesWithGValues().get(META_NAME));
verifySingleUnpinnedVariable(traversal, GMETA_NAME);
}
(tinkerpop) 03/10: WIP call and graph steps
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch GValue-refinement
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit dbf12b395df1aa044e1500a4b6a41012182a393b
Author: Cole-Greer <Co...@improving.com>
AuthorDate: Tue Sep 9 15:03:33 2025 -0700
WIP call and graph steps
---
.../process/traversal/step/map/CallStep.java | 4 +++
.../traversal/step/map/CallStepContract.java | 14 ++++++--
.../traversal/step/map/CallStepPlaceholder.java | 41 +++++++++++-----------
.../traversal/step/map/GraphStepContract.java | 7 ++++
.../traversal/step/map/GraphStepPlaceholder.java | 6 ++--
.../process/traversal/step/map/CallStepTest.java | 18 ++--------
.../process/traversal/step/map/GraphStepTest.java | 6 ++--
7 files changed, 51 insertions(+), 45 deletions(-)
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStep.java
index 2beb54a3ce..ad1cf5a5fd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStep.java
@@ -200,6 +200,10 @@ public final class CallStep<S, E> extends AbstractStep<S, E> implements AutoClos
}
@Override
+ public Map getStaticParams() {
+ return Collections.unmodifiableMap(this.staticParams);
+ }
+
public Map getMergedParams() {
if (mapTraversal == null && parameters.isEmpty()) {
// static params only
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepContract.java
index 57e0559840..3e4bf03224 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepContract.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.structure.service.Service;
import org.apache.tinkerpop.gremlin.structure.service.ServiceRegistry;
@@ -29,11 +30,18 @@ import java.util.Map;
public interface CallStepContract<S, E> extends Step<S, E>, Configuring, TraversalParent {
Service<S, E> service();
+ default Service<S, E> serviceGValueSafe() {
+ return service();
+ }
+
String getServiceName();
- /**
- * TODO: re-evaluate if we should change this to return the static params only
- */
+ Map getStaticParams();
+
+ default GValue<Map> getStaticParamsAsGValue() {
+ return GValue.of(getStaticParams());
+ }
+
Map getMergedParams();
ServiceRegistry getServiceRegistry();
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java
index 08c055aa72..a4b5df72f8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java
@@ -92,6 +92,7 @@ public final class CallStepPlaceholder<S, E> extends AbstractStep<S, E> implemen
return getServiceRegistry().get(serviceName, isStart, staticParams.get());
}
+ @Override
public Service<S, E> serviceGValueSafe() {
// throws exception for unrecognized service
return getServiceRegistry().get(serviceName, isStart, staticParams.get());
@@ -108,41 +109,39 @@ public final class CallStepPlaceholder<S, E> extends AbstractStep<S, E> implemen
}
@Override
- public Map getMergedParams() {
- if (mapTraversal == null && parameters.isEmpty()) {
- // static params only
- if (staticParams.isVariable()) {
- traversal.getGValueManager().pinVariable(staticParams.getName());
- }
- return Collections.unmodifiableMap(this.staticParams.get());
+ public Map getStaticParams() {
+ if (staticParams.isVariable()) {
+ traversal.getGValueManager().pinVariable(staticParams.getName());
}
+ return Collections.unmodifiableMap(this.staticParams.get());
+ }
- return getMergedParams(new DummyTraverser<>(this.traversal.getTraverserGenerator()),
- gValue -> traversal.getGValueManager().pinVariable(gValue.getName()));
+ @Override
+ public GValue<Map> getStaticParamsAsGValue() {
+ if (staticParams == null) {
+ return GValue.ofMap(null);
+ }
+ return GValue.of(staticParams.getName(), Collections.unmodifiableMap(this.staticParams.get()));
}
- public Map getMergedParamsGValueSafe() {
+ @Override
+ public Map getMergedParams() {
if (mapTraversal == null && parameters.isEmpty()) {
// static params only
- return Collections.unmodifiableMap(this.staticParams.get());
+ return getStaticParams();
}
- return getMergedParams(new DummyTraverser<>(this.traversal.getTraverserGenerator()), null);
+
+ return getMergedParams(new DummyTraverser<>(this.traversal.getTraverserGenerator()));
}
- protected Map getMergedParams(final Traverser.Admin<S> traverser, Consumer<GValue> gValueConsumer) {
+ protected Map getMergedParams(final Traverser.Admin<S> traverser) {
if (mapTraversal == null && parameters.isEmpty()) {
// static params only
- if (gValueConsumer != null && staticParams.isVariable()) {
- gValueConsumer.accept(staticParams);
- }
- return Collections.unmodifiableMap(this.staticParams.get());
+ return this.getStaticParams();
}
// merge dynamic with static params
- if(gValueConsumer != null && staticParams.isVariable()) {
- gValueConsumer.accept(staticParams);
- }
- final Map params = new LinkedHashMap(this.staticParams.get());
+ final Map params = new LinkedHashMap(this.getStaticParams());
if (mapTraversal != null) params.putAll(TraversalUtil.apply(traverser, mapTraversal));
final Object[] kvs = this.parameters.getKeyValues(traverser);
for (int i = 0; i < kvs.length; i += 2) {
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepContract.java
index bbc9ae75e3..96f10c06bb 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepContract.java
@@ -19,9 +19,12 @@
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
import org.apache.tinkerpop.gremlin.structure.Element;
+import java.util.Arrays;
+
public interface GraphStepContract<S, E extends Element> extends Step<S, E>, GraphComputing {
Class<E> getReturnClass();
@@ -34,5 +37,9 @@ public interface GraphStepContract<S, E extends Element> extends Step<S, E>, Gra
Object[] getIds();
+ default GValue<?>[] getIdsAsGValues() {
+ return Arrays.stream(getIds()).map(o -> GValue.of(o)).toArray(GValue[]::new);
+ }
+
void clearIds();
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java
index a8241d6ae7..effd074d3c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java
@@ -54,6 +54,7 @@ public class GraphStepPlaceholder<S, E extends Element> extends AbstractStep<S,
}
}
+ @Override
public String toString() {
return StringFactory.stepString(this, this.returnClass.getSimpleName().toLowerCase(), Arrays.toString(this.ids));
}
@@ -88,8 +89,9 @@ public class GraphStepPlaceholder<S, E extends Element> extends AbstractStep<S,
return GValue.resolveToValues(this.ids);
}
- public Object[] getIdsGValueSafe() {
- return GValue.resolveToValues(this.ids);
+ @Override
+ public GValue<?>[] getIdsAsGValues() {
+ return this.ids.clone();
}
@Override
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepTest.java
index 9e4736fbf1..876f6605cd 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepTest.java
@@ -115,9 +115,9 @@ public class CallStepTest extends GValueStepTest {
}
@Test
- public void getMergedParamsGValueSafeShouldNotPinVariables() {
+ public void getStaticParamsAsGValueShouldNotPinVariables() {
GraphTraversal.Admin<Object, Object> traversal = getGValueTraversal();
- assertEquals(STATIC_PARAMS, ((CallStepPlaceholder<?, ?>) traversal.getSteps().get(0)).getMergedParamsGValueSafe());
+ assertEquals(GValue.of("params", STATIC_PARAMS), ((CallStepPlaceholder<?, ?>) traversal.getSteps().get(0)).getStaticParamsAsGValue());
verifyVariables(traversal, Set.of(), Set.of("params"));
}
@@ -138,20 +138,6 @@ public class CallStepTest extends GValueStepTest {
verifyVariables(traversal, Set.of("params"), Set.of());
}
- /**
- * This test needs to be revisited as the variables are pinned when the child traversal is executed
- */
- @Test
- @Ignore
- public void getMergedParamsGValueSafeWithChildTraversalShouldNotPinVariables() {
- when(mockedRegistry.get(TEST_SERVICE, false, STATIC_PARAMS)).thenReturn(mockedService);
- when(mockedService.getRequirements()).thenReturn(Set.of());
- GraphTraversal.Admin<?, ?> traversal = getGValueWithChildTraversal();
- assertEquals(Map.of("foo", "bar", "fizz", "fuzz", "abc", 123),
- ((CallStepPlaceholder<?, ?>) traversal.getSteps().get(1)).getMergedParamsGValueSafe());
- verifyVariables(traversal, Set.of(), Set.of("params"));
- }
-
@Test
public void getMergedParamsWithChildTraversalFromConcreteStep() {
when(mockedRegistry.get(TEST_SERVICE, false, STATIC_PARAMS)).thenReturn(mockedService);
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepTest.java
index 6b521c3ec0..0deb682ca7 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepTest.java
@@ -97,10 +97,10 @@ public class GraphStepTest extends GValueStepTest {
}
@Test
- public void getIdsGValueSafeShouldNotPinVariable() {
+ public void getIdsAsGValuesShouldNotPinVariable() {
GraphTraversal.Admin<?, ?> traversal = getGraphStepGValueTraversal();
- assertEquals(new Object[]{1,2,3,4}, ((GraphStepPlaceholder<?,?>) traversal.getSteps().get(0))
- .getIdsGValueSafe());
+ assertEquals(new GValue[]{GValue.of("x", 1), GValue.of("y", 2), GValue.of(3), GValue.of("z", 4)},
+ ((GraphStepPlaceholder<?,?>) traversal.getSteps().get(0)).getIdsAsGValues());
verifyVariables(traversal, Set.of(), Set.of("x","y","z"));
}
(tinkerpop) 07/10: AddEdge
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch GValue-refinement
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 31b073315f089e0c7747b2a03fafdee90c824f95
Author: Cole-Greer <Co...@improving.com>
AuthorDate: Tue Sep 9 17:15:12 2025 -0700
AddEdge
---
...er.java => AbstractAddEdgeStepPlaceholder.java} | 94 +++++++++++-------
.../step/map/AddEdgeStartStepPlaceholder.java | 109 +--------------------
.../traversal/step/map/AddEdgeStepContract.java | 48 +++++----
.../traversal/step/map/AddEdgeStepPlaceholder.java | 105 +-------------------
.../step/map/AddVertexStartStepPlaceholder.java | 1 -
.../traversal/step/map/AddEdgeStartStepTest.java | 8 +-
.../traversal/step/map/AddEdgeStepTest.java | 8 +-
7 files changed, 99 insertions(+), 274 deletions(-)
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddEdgeStepPlaceholder.java
similarity index 58%
copy from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepPlaceholder.java
copy to gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddEdgeStepPlaceholder.java
index c008b8cbab..00f4e7fd84 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddEdgeStepPlaceholder.java
@@ -18,31 +18,30 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
-import java.util.Collection;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.GValueConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex;
-public class AddEdgeStepPlaceholder<S> extends AbstractAddElementStepPlaceholder<S, Edge, Event.EdgeAddedEvent>
- implements AddEdgeStepContract<S> {
+import java.util.Collection;
- private Traversal.Admin<?,?> from;
- private Traversal.Admin<?,?> to;
+public abstract class AbstractAddEdgeStepPlaceholder<S> extends AbstractAddElementStepPlaceholder<S, Edge, Event.EdgeAddedEvent> implements AddEdgeStepContract<S> {
+ protected Traversal.Admin<?, ?> from;
+ protected Traversal.Admin<?, ?> to;
- public AddEdgeStepPlaceholder(final Traversal.Admin traversal, final String edgeLabel) {
- super(traversal, edgeLabel == null ? Edge.DEFAULT_LABEL : edgeLabel);
+ public AbstractAddEdgeStepPlaceholder(Traversal.Admin traversal, String label) {
+ super(traversal, label);
}
- public AddEdgeStepPlaceholder(final Traversal.Admin traversal, final GValue<String> edgeLabel) {
- super(traversal, edgeLabel == null || edgeLabel.isNull() ? GValue.of(Edge.DEFAULT_LABEL) : edgeLabel);
+ public AbstractAddEdgeStepPlaceholder(Traversal.Admin traversal, GValue<String> label) {
+ super(traversal, label);
}
- public AddEdgeStepPlaceholder(final Traversal.Admin traversal, final Traversal.Admin<S,String> edgeLabelTraversal) {
- super(traversal, edgeLabelTraversal == null ?
- new ConstantTraversal<>(Edge.DEFAULT_LABEL) : edgeLabelTraversal);
+ public AbstractAddEdgeStepPlaceholder(Traversal.Admin traversal, Traversal.Admin<S, String> labelTraversal) {
+ super(traversal, labelTraversal);
}
@Override
@@ -75,19 +74,6 @@ public class AddEdgeStepPlaceholder<S> extends AbstractAddElementStepPlaceholder
return hash;
}
- @Override
- public AddEdgeStep<S> asConcreteStep() {
- AddEdgeStep<S> step = new AddEdgeStep<>(traversal, label instanceof GValueConstantTraversal ? ((GValueConstantTraversal<S, String>) label).getConstantTraversal() : label);
- super.configureConcreteStep(step);
- if (from != null) {
- step.addFrom(from instanceof GValueConstantTraversal ? ((GValueConstantTraversal<S, String>) from).getConstantTraversal() : from);
- }
- if (to != null) {
- step.addTo(to instanceof GValueConstantTraversal ? ((GValueConstantTraversal<S, String>) to).getConstantTraversal() : to);
- }
- return step;
- }
-
@Override
public boolean isParameterized() {
if (super.isParameterized() ||
@@ -105,20 +91,22 @@ public class AddEdgeStepPlaceholder<S> extends AbstractAddElementStepPlaceholder
@Override
public Object getFrom() {
- return resolveVertexTraversal(from, gValue -> traversal.getGValueManager().pinVariable(gValue.getName()));
+ return resolveVertexTraversalAndPinVariables(from);
}
- public Object getFromGValueSafe() {
- return resolveVertexTraversal(from);
+ @Override
+ public Object getFromWithGValue() {
+ return resolveVertexTraversalAndPreserveGValue(from);
}
@Override
public Object getTo() {
- return resolveVertexTraversal(to, gValue -> traversal.getGValueManager().pinVariable(gValue.getName()));
+ return resolveVertexTraversalAndPinVariables(to);
}
- public Object getToGValueSafe() {
- return resolveVertexTraversal(to);
+ @Override
+ public Object getToWithGValue() {
+ return resolveVertexTraversalAndPreserveGValue(to);
}
@Override
@@ -145,14 +133,50 @@ public class AddEdgeStepPlaceholder<S> extends AbstractAddElementStepPlaceholder
}
@Override
- public AddEdgeStepPlaceholder<S> clone() {
- final AddEdgeStepPlaceholder<S> clone = (AddEdgeStepPlaceholder) super.clone();
- if (from != null){
+ public AbstractAddEdgeStepPlaceholder<S> clone() {
+ final AbstractAddEdgeStepPlaceholder<S> clone = (AbstractAddEdgeStepPlaceholder) super.clone();
+ if (from != null) {
clone.from = from.clone();
}
- if (to != null){
+ if (to != null) {
clone.to = to.clone();
}
return clone;
}
+
+ /**
+ * Attempts to extract a Vertex from a given Traversal. If the traversal is wrapping a GValue, that variable is pinned.
+ * @param vertexTraversal
+ * @return If vertexTraversal is a ConstantTraversal, returns a ReferenceVertex, otherwise returns vertexTraversal as-is
+ */
+ private Object resolveVertexTraversalAndPinVariables(Traversal.Admin<?,?> vertexTraversal) {
+ if (vertexTraversal instanceof GValueConstantTraversal) {
+ GValue<?> gValue = ((GValueConstantTraversal<?, ?>) vertexTraversal).getGValue();
+ if (gValue.isVariable()) {
+ traversal.getGValueManager().pinVariable(gValue.getName());
+ }
+ return new ReferenceVertex(vertexTraversal.next());
+ }
+ if (vertexTraversal instanceof ConstantTraversal) {
+ return new ReferenceVertex(vertexTraversal.next());
+ }
+ // anything other than a ConstantTraversal is returned as-is
+ return vertexTraversal;
+ }
+
+ /**
+ * TODO
+ * @param vertexTraversal
+ * @return If vertexTraversal is a ConstantTraversal, returns the constant vertex or id as a GValue, otherwise returns vertexTraversal as-is
+ */
+ private Object resolveVertexTraversalAndPreserveGValue(Traversal.Admin<?,?> vertexTraversal) {
+ if (vertexTraversal instanceof GValueConstantTraversal) {
+ return ((GValueConstantTraversal<?, ?>) vertexTraversal).getGValue();
+ }
+ if (vertexTraversal instanceof ConstantTraversal) {
+ return new ReferenceVertex(vertexTraversal.next());
+ }
+ // anything other than a ConstantTraversal is returned as-is
+ return vertexTraversal;
+ }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepPlaceholder.java
index 7921117efb..85912cdf65 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepPlaceholder.java
@@ -22,18 +22,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.GValueConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
-import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.PropertiesHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
import org.apache.tinkerpop.gremlin.structure.Edge;
-import java.util.Collection;
-
-public class AddEdgeStartStepPlaceholder extends AbstractAddElementStepPlaceholder<Edge, Edge, Event.EdgeAddedEvent>
- implements AddEdgeStepContract<Edge>, GValueHolder<Edge, Edge>, PropertiesHolder {
-
- private Traversal.Admin<?,?> from;
- private Traversal.Admin<?,?> to;
+public class AddEdgeStartStepPlaceholder extends AbstractAddEdgeStepPlaceholder<Edge> {
public AddEdgeStartStepPlaceholder(final Traversal.Admin traversal, final String edgeLabel) {
super(traversal, edgeLabel == null ? Edge.DEFAULT_LABEL : edgeLabel);
@@ -49,36 +40,6 @@ public class AddEdgeStartStepPlaceholder extends AbstractAddElementStepPlacehold
(Traversal.Admin<Edge, String>) edgeLabelTraversal);
}
- @Override
- public void addTo(final Traversal.Admin<?, ?> toObject) {
- addTraversal(toObject);
- if (toObject instanceof GValueConstantTraversal) {
- traversal.getGValueManager().register(((GValueConstantTraversal<?, ?>) toObject).getGValue());
- }
- this.to = toObject;
- }
-
- @Override
- public void addFrom(final Traversal.Admin<?, ?> fromObject) {
- addTraversal(fromObject);
- if (fromObject instanceof GValueConstantTraversal) {
- traversal.getGValueManager().register(((GValueConstantTraversal<?, ?>) fromObject).getGValue());
- }
- this.from = fromObject;
- }
-
- @Override
- public int hashCode() {
- int hash = super.hashCode();
- if (from != null) {
- hash ^= from.hashCode();
- }
- if (to != null) {
- hash ^= to.hashCode();
- }
- return hash;
- }
-
@Override
public AddEdgeStartStep asConcreteStep() {
AddEdgeStartStep step = new AddEdgeStartStep(traversal, label instanceof GValueConstantTraversal ? ((GValueConstantTraversal<?, String>) label).getConstantTraversal() : label);
@@ -91,72 +52,4 @@ public class AddEdgeStartStepPlaceholder extends AbstractAddElementStepPlacehold
}
return step;
}
-
- @Override
- public boolean isParameterized() {
- if (super.isParameterized() ||
- (from instanceof GValueConstantTraversal && ((GValueConstantTraversal<Edge, String>) from).isParameterized()) ||
- (to instanceof GValueConstantTraversal && ((GValueConstantTraversal<Edge, String>) to).isParameterized())) {
- return true;
- }
- return false;
- }
-
- @Override
- protected boolean supportsMultiProperties() {
- return false;
- }
-
- @Override
- public Object getFrom() {
- return resolveVertexTraversal(from, gValue -> traversal.getGValueManager().pinVariable(gValue.getName()));
- }
-
- public Object getFromGValueSafe() {
- return resolveVertexTraversal(from);
- }
-
- @Override
- public Object getTo() {
- return resolveVertexTraversal(to, gValue -> traversal.getGValueManager().pinVariable(gValue.getName()));
- }
-
- public Object getToGValueSafe() {
- return resolveVertexTraversal(to);
- }
-
- @Override
- public void updateVariable(String name, Object value) {
- super.updateVariable(name, value);
- if (from instanceof GValueConstantTraversal) {
- ((GValueConstantTraversal<Edge, String>) from).updateVariable(name, value);
- }
- if (to instanceof GValueConstantTraversal) {
- ((GValueConstantTraversal<Edge, String>) to).updateVariable(name, value);
- }
- }
-
- @Override
- public Collection<GValue<?>> getGValues() {
- Collection<GValue<?>> gValues = super.getGValues();
- if (from instanceof GValueConstantTraversal && ((GValueConstantTraversal<Edge, String>) from).getGValue().isVariable()) {
- gValues.add(((GValueConstantTraversal<Edge, String>) from).getGValue());
- }
- if (to instanceof GValueConstantTraversal && ((GValueConstantTraversal<Edge, String>) to).getGValue().isVariable()) {
- gValues.add(((GValueConstantTraversal<Edge, String>) to).getGValue());
- }
- return gValues;
- }
-
- @Override
- public AddEdgeStartStepPlaceholder clone() {
- final AddEdgeStartStepPlaceholder clone = (AddEdgeStartStepPlaceholder) super.clone();
- if (from != null){
- clone.from = from.clone();
- }
- if (to != null){
- clone.to = to.clone();
- }
- return clone;
- }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepContract.java
index 13ec8d493a..158d958cc4 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepContract.java
@@ -19,11 +19,9 @@
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import java.util.List;
-import java.util.function.Consumer;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.GValueConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.FromToModulating;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
@@ -36,9 +34,39 @@ import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex;
public interface AddEdgeStepContract<S> extends TraversalParent, Scoping, FromToModulating, AddElementStepContract<S, Edge>, Writing<Event.EdgeAddedEvent> {
+
+ /**
+ * Gets the "from" vertex for the edge to be added. If the "from" vertex was added as a {@link Vertex}, ID, {@link GValue},
+ * or {@link ConstantTraversal}, it is returned as a {@link ReferenceVertex}. Otherwise, it is returned in {@link Traversal} form.
+ */
Object getFrom();
+
+ /**
+ * Gets the "to" vertex for the edge to be added. If the "to" vertex was added as a {@link Vertex}, ID, {@link GValue},
+ * or {@link ConstantTraversal}, it is returned as a {@link ReferenceVertex}. Otherwise, it is returned in {@link Traversal} form.
+ */
Object getTo();
+ /**
+ * Gets the "from" vertex for the edge to be added. If the "from" vertex was added as a {@link Vertex}, ID,
+ * or {@link ConstantTraversal}, it is returned as a {@link ReferenceVertex}. If it was added as a {@link GValue}
+ * containing a {@link Vertex} or ID, the {@link GValue} is returned. Otherwise, it is returned in {@link Traversal} form.
+ */
+ default Object getFromWithGValue() {
+ Object from = getFrom();
+ return from instanceof Traversal ? from : GValue.of(from);
+ }
+
+ /**
+ * Gets the "from" vertex for the edge to be added. If the "from" vertex was added as a {@link Vertex}, ID,
+ * or {@link ConstantTraversal}, it is returned as a {@link ReferenceVertex}. If it was added as a {@link GValue}
+ * containing a {@link Vertex} or ID, the {@link GValue} is returned. Otherwise, it is returned in {@link Traversal} form.
+ */
+ default Object getToWithGValue() {
+ Object to = getTo();
+ return to instanceof Traversal ? to : GValue.of(to);
+ }
+
default Object getAdjacentVertex(Parameters parameters, String key) {
Object vertex;
List<Object> values = parameters.get(key, () -> null);
@@ -72,21 +100,5 @@ public interface AddEdgeStepContract<S> extends TraversalParent, Scoping, FromTo
return (Vertex) vertex;
}
- default Object resolveVertexTraversal(Traversal.Admin<?,?> vertexTraversal) {
- return resolveVertexTraversal(vertexTraversal, null);
- }
- default Object resolveVertexTraversal(Traversal.Admin<?,?> vertexTraversal, Consumer<GValue<?>> gValueConsumer) {
- if (vertexTraversal instanceof GValueConstantTraversal) {
- if (gValueConsumer != null) {
- gValueConsumer.accept(((GValueConstantTraversal<?, ?>) vertexTraversal).getGValue());
- }
- return new ReferenceVertex(vertexTraversal.next());
- }
- if (vertexTraversal instanceof ConstantTraversal) {
- return new ReferenceVertex(vertexTraversal.next());
- }
- // anything other than a ConstantTraversal is returned as-is
- return vertexTraversal;
- }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepPlaceholder.java
index c008b8cbab..b7d3b57b45 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepPlaceholder.java
@@ -18,19 +18,13 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
-import java.util.Collection;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.GValueConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
import org.apache.tinkerpop.gremlin.structure.Edge;
-public class AddEdgeStepPlaceholder<S> extends AbstractAddElementStepPlaceholder<S, Edge, Event.EdgeAddedEvent>
- implements AddEdgeStepContract<S> {
-
- private Traversal.Admin<?,?> from;
- private Traversal.Admin<?,?> to;
+public class AddEdgeStepPlaceholder<S> extends AbstractAddEdgeStepPlaceholder<S> {
public AddEdgeStepPlaceholder(final Traversal.Admin traversal, final String edgeLabel) {
super(traversal, edgeLabel == null ? Edge.DEFAULT_LABEL : edgeLabel);
@@ -45,36 +39,6 @@ public class AddEdgeStepPlaceholder<S> extends AbstractAddElementStepPlaceholder
new ConstantTraversal<>(Edge.DEFAULT_LABEL) : edgeLabelTraversal);
}
- @Override
- public void addTo(final Traversal.Admin<?, ?> toObject) {
- addTraversal(toObject);
- if (toObject instanceof GValueConstantTraversal) {
- traversal.getGValueManager().register(((GValueConstantTraversal<?, ?>) toObject).getGValue());
- }
- this.to = toObject;
- }
-
- @Override
- public void addFrom(final Traversal.Admin<?, ?> fromObject) {
- addTraversal(fromObject);
- if (fromObject instanceof GValueConstantTraversal) {
- traversal.getGValueManager().register(((GValueConstantTraversal<?, ?>) fromObject).getGValue());
- }
- this.from = fromObject;
- }
-
- @Override
- public int hashCode() {
- int hash = super.hashCode();
- if (from != null) {
- hash ^= from.hashCode();
- }
- if (to != null) {
- hash ^= to.hashCode();
- }
- return hash;
- }
-
@Override
public AddEdgeStep<S> asConcreteStep() {
AddEdgeStep<S> step = new AddEdgeStep<>(traversal, label instanceof GValueConstantTraversal ? ((GValueConstantTraversal<S, String>) label).getConstantTraversal() : label);
@@ -88,71 +52,4 @@ public class AddEdgeStepPlaceholder<S> extends AbstractAddElementStepPlaceholder
return step;
}
- @Override
- public boolean isParameterized() {
- if (super.isParameterized() ||
- (from instanceof GValueConstantTraversal && ((GValueConstantTraversal<S, String>) from).isParameterized()) ||
- (to instanceof GValueConstantTraversal && ((GValueConstantTraversal<S, String>) to).isParameterized())) {
- return true;
- }
- return false;
- }
-
- @Override
- protected boolean supportsMultiProperties() {
- return false;
- }
-
- @Override
- public Object getFrom() {
- return resolveVertexTraversal(from, gValue -> traversal.getGValueManager().pinVariable(gValue.getName()));
- }
-
- public Object getFromGValueSafe() {
- return resolveVertexTraversal(from);
- }
-
- @Override
- public Object getTo() {
- return resolveVertexTraversal(to, gValue -> traversal.getGValueManager().pinVariable(gValue.getName()));
- }
-
- public Object getToGValueSafe() {
- return resolveVertexTraversal(to);
- }
-
- @Override
- public void updateVariable(String name, Object value) {
- super.updateVariable(name, value);
- if (from instanceof GValueConstantTraversal) {
- ((GValueConstantTraversal<S, String>) from).updateVariable(name, value);
- }
- if (to instanceof GValueConstantTraversal) {
- ((GValueConstantTraversal<S, String>) to).updateVariable(name, value);
- }
- }
-
- @Override
- public Collection<GValue<?>> getGValues() {
- Collection<GValue<?>> gValues = super.getGValues();
- if (from instanceof GValueConstantTraversal && ((GValueConstantTraversal<S, String>) from).getGValue().isVariable()) {
- gValues.add(((GValueConstantTraversal<S, String>) from).getGValue());
- }
- if (to instanceof GValueConstantTraversal && ((GValueConstantTraversal<S, String>) to).getGValue().isVariable()) {
- gValues.add(((GValueConstantTraversal<S, String>) to).getGValue());
- }
- return gValues;
- }
-
- @Override
- public AddEdgeStepPlaceholder<S> clone() {
- final AddEdgeStepPlaceholder<S> clone = (AddEdgeStepPlaceholder) super.clone();
- if (from != null){
- clone.from = from.clone();
- }
- if (to != null){
- clone.to = to.clone();
- }
- return clone;
- }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepPlaceholder.java
index 53a1da24f1..8a95182a13 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepPlaceholder.java
@@ -23,7 +23,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.GValueConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
import org.apache.tinkerpop.gremlin.structure.Vertex;
public class AddVertexStartStepPlaceholder extends AbstractAddVertexStepPlaceholder<Vertex>
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepTest.java
index 71efca85bf..55e5b67b52 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepTest.java
@@ -145,9 +145,9 @@ public class AddEdgeStartStepTest extends GValueStepTest {
}
@Test
- public void getFromGValueSafeShouldNotPinVariable() {
+ public void getFromWithGValueShouldNotPinVariable() {
GraphTraversal.Admin<Edge, Edge> traversal = getAddEdgeGValueTraversal();
- assertEquals(1, ((Vertex) (((AddEdgeStartStepPlaceholder) traversal.getSteps().get(0)).getFromGValueSafe())).id());
+ assertEquals(GValue.of("from", 1), ((AddEdgeStartStepPlaceholder) traversal.getSteps().get(0)).getFromWithGValue());
verifyVariables(traversal, Set.of(), Set.of("label", "from", "to", "id", "r"));
}
@@ -165,9 +165,9 @@ public class AddEdgeStartStepTest extends GValueStepTest {
}
@Test
- public void getToShouldNotPinVariable() {
+ public void getToWithGValueShouldNotPinVariable() {
GraphTraversal.Admin<Edge, Edge> traversal = getAddEdgeGValueTraversal();
- assertEquals(2, ((Vertex) (((AddEdgeStartStepPlaceholder) traversal.getSteps().get(0)).getToGValueSafe())).id());
+ assertEquals(GValue.of("to", 2), ((AddEdgeStartStepPlaceholder) traversal.getSteps().get(0)).getToWithGValue());
verifyVariables(traversal, Set.of(), Set.of("label", "from", "to", "id", "r"));
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepTest.java
index 5f6918930a..864c49358d 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepTest.java
@@ -218,9 +218,9 @@ public class AddEdgeStepTest extends GValueStepTest {
}
@Test
- public void getFromGValueSafeShouldNotPinVariable() {
+ public void getFromWithGValueShouldNotPinVariable() {
GraphTraversal.Admin<Object, Edge> traversal = getAddEdgeGValueTraversal();
- assertEquals(1, ((Vertex) (((AddEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getFromGValueSafe())).id());
+ assertEquals(GValue.of("from", 1), ((AddEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getFromWithGValue());
verifyVariables(traversal, Set.of(), Set.of("label", "from", "to", "id", "r"));
}
@@ -248,9 +248,9 @@ public class AddEdgeStepTest extends GValueStepTest {
}
@Test
- public void getToShouldNotPinVariable() {
+ public void getToWithGValueShouldNotPinVariable() {
GraphTraversal.Admin<Object, Edge> traversal = getAddEdgeGValueTraversal();
- assertEquals(2, ((Vertex) (((AddEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getToGValueSafe())).id());
+ assertEquals(GValue.of("to", 2), ((AddEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getToWithGValue());
verifyVariables(traversal, Set.of(), Set.of("label", "from", "to", "id", "r"));
}
(tinkerpop) 05/10: rename PropertiesHolder
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch GValue-refinement
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 83c4ca497847c952f436ce7767f2aca094d10a3b
Author: Cole-Greer <Co...@improving.com>
AuthorDate: Tue Sep 9 15:49:03 2025 -0700
rename PropertiesHolder
---
.../gremlin/process/traversal/dsl/graph/GraphTraversal.java | 4 ++--
.../step/{PropertyAdding.java => PropertiesHolder.java} | 4 ++--
.../traversal/step/map/AddEdgeStartStepPlaceholder.java | 4 ++--
.../process/traversal/step/map/AddElementStepContract.java | 4 ++--
.../gremlin/process/traversal/step/map/MergeStepContract.java | 4 ++--
.../traversal/step/sideEffect/AddPropertyStepContract.java | 4 ++--
.../traversal/strategy/decoration/PartitionStrategy.java | 11 +++--------
.../verification/ReservedKeysVerificationStrategy.java | 6 +++---
8 files changed, 18 insertions(+), 23 deletions(-)
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index b7d50b6680..e775c4fa9a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -62,7 +62,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.MergeEdgeStepPlac
import org.apache.tinkerpop.gremlin.process.traversal.step.map.MergeStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.MergeStepContract;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.MergeVertexStepPlaceholder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.PropertyAdding;
+import org.apache.tinkerpop.gremlin.process.traversal.step.PropertiesHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStepPlaceholder;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AddPropertyStepPlaceholder;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStepContract;
@@ -3874,7 +3874,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
if ((endStep instanceof AddEdgeStepContract) ||
((endStep instanceof AddVertexStepContract) && keyValues.length == 0 &&
(key instanceof T || (key instanceof String && null == cardinality) || key instanceof Traversal))) {
- ((PropertyAdding) endStep).addProperty(key, value);
+ ((PropertiesHolder) endStep).addProperty(key, value);
} else {
final AddPropertyStepContract<Element> addPropertyStep = new AddPropertyStepPlaceholder<>(this.asAdmin(), cardinality, key, value);
this.asAdmin().addStep(addPropertyStep);
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PropertyAdding.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PropertiesHolder.java
similarity index 90%
rename from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PropertyAdding.java
rename to gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PropertiesHolder.java
index 13cedd23b6..9267ec0f74 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PropertyAdding.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PropertiesHolder.java
@@ -16,12 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.tinkerpop.gremlin.process.traversal.step; //TODO:: relocate class
+package org.apache.tinkerpop.gremlin.process.traversal.step;
import java.util.List;
import java.util.Map;
-public interface PropertyAdding {
+public interface PropertiesHolder {
void addProperty(Object key, Object value);
Map<Object, List<Object>> getProperties();
boolean removeProperty(Object k);
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepPlaceholder.java
index e742af4286..7921117efb 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepPlaceholder.java
@@ -23,14 +23,14 @@ import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.GValueConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.PropertyAdding;
+import org.apache.tinkerpop.gremlin.process.traversal.step.PropertiesHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
import org.apache.tinkerpop.gremlin.structure.Edge;
import java.util.Collection;
public class AddEdgeStartStepPlaceholder extends AbstractAddElementStepPlaceholder<Edge, Edge, Event.EdgeAddedEvent>
- implements AddEdgeStepContract<Edge>, GValueHolder<Edge, Edge>, PropertyAdding {
+ implements AddEdgeStepContract<Edge>, GValueHolder<Edge, Edge>, PropertiesHolder {
private Traversal.Admin<?,?> from;
private Traversal.Admin<?,?> to;
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddElementStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddElementStepContract.java
index 5fa5a552ba..7468a5ae69 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddElementStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddElementStepContract.java
@@ -20,13 +20,13 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
-import org.apache.tinkerpop.gremlin.process.traversal.step.PropertyAdding;
+import org.apache.tinkerpop.gremlin.process.traversal.step.PropertiesHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import java.util.HashSet;
-public interface AddElementStepContract<S, E> extends Step<S, E>, PropertyAdding, TraversalParent, Scoping {
+public interface AddElementStepContract<S, E> extends Step<S, E>, PropertiesHolder, TraversalParent, Scoping {
Object getLabel();
default GValue<?> getLabelAsGValue(){
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeStepContract.java
index d0f3f7b420..7ec5a40a87 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeStepContract.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.traversal.Merge;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.Deleting;
-import org.apache.tinkerpop.gremlin.process.traversal.step.PropertyAdding;
+import org.apache.tinkerpop.gremlin.process.traversal.step.PropertiesHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.Writing;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
@@ -30,7 +30,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequire
import java.util.Map;
import java.util.Set;
-public interface MergeStepContract<S, E, C> extends Writing<Event>, Deleting<Event>, TraversalOptionParent<Merge, S, C>, PropertyAdding {
+public interface MergeStepContract<S, E, C> extends Writing<Event>, Deleting<Event>, TraversalOptionParent<Merge, S, C>, PropertiesHolder {
Traversal.Admin<S, Map> getMergeTraversal();
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepContract.java
index 804e1a95b3..6fa32b7a7f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepContract.java
@@ -23,13 +23,13 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.Deleting;
import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.Writing;
-import org.apache.tinkerpop.gremlin.process.traversal.step.PropertyAdding;
+import org.apache.tinkerpop.gremlin.process.traversal.step.PropertiesHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import java.util.HashSet;
-public interface AddPropertyStepContract<S> extends Step<S, S>, TraversalParent, Scoping, PropertyAdding, Writing<Event.ElementPropertyChangedEvent>, Deleting<Event.ElementPropertyChangedEvent> {
+public interface AddPropertyStepContract<S> extends Step<S, S>, TraversalParent, Scoping, PropertiesHolder, Writing<Event.ElementPropertyChangedEvent>, Deleting<Event.ElementPropertyChangedEvent> {
VertexProperty.Cardinality getCardinality();
@Override
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
index bac524d955..7a640420d3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
@@ -28,17 +28,12 @@ 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.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStartStepPlaceholder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStepPlaceholder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStepPlaceholder;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeOtherVertexStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaMapStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.MergeStepContract;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.PropertyAdding;
+import org.apache.tinkerpop.gremlin.process.traversal.step.PropertiesHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyMapStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStepContract;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AddPropertyStepPlaceholder;
@@ -238,7 +233,7 @@ public final class PartitionStrategy extends AbstractTraversalStrategy<Traversal
// ends up being a Vertex or not. AddPropertyStep currently chooses to simply not bother
// to use the additional "property mutations" if the Element being mutated is a Edge or
// VertexProperty
- ((PropertyAdding) step).addProperty(partitionKey, writePartition);
+ ((PropertiesHolder) step).addProperty(partitionKey, writePartition);
if (vertexFeatures.isPresent()) {
// GraphTraversal folds g.addV().property('k','v') to just AddVertexStep/AddVertexStartStep so this
@@ -260,7 +255,7 @@ public final class PartitionStrategy extends AbstractTraversalStrategy<Traversal
// need to remove the property from the AddVertex/StartStep because it's now being
// added via the AddPropertyStep
- ((PropertyAdding) step).removeProperty(k);
+ ((PropertiesHolder) step).removeProperty(k);
TraversalHelper.insertAfterStep(addPropertyStep, step, traversal);
});
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategy.java
index 201b37a96a..acead17808 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReservedKeysVerificationStrategy.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
import org.apache.commons.configuration2.Configuration;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.PropertyAdding;
+import org.apache.tinkerpop.gremlin.process.traversal.step.PropertiesHolder;
import java.util.Arrays;
import java.util.LinkedHashSet;
@@ -53,8 +53,8 @@ public class ReservedKeysVerificationStrategy extends AbstractWarningVerificatio
@Override
void verify(final Traversal.Admin<?, ?> traversal) throws VerificationException {
for (final Step<?, ?> step : traversal.getSteps()) {
- if (step instanceof PropertyAdding) {
- final PropertyAdding propertySettingStep = (PropertyAdding) step;
+ if (step instanceof PropertiesHolder) {
+ final PropertiesHolder propertySettingStep = (PropertiesHolder) step;
final Map<Object, List<Object>> properties = propertySettingStep.getProperties();
for (String key : reservedKeys) {
if (properties.containsKey(key)) {
(tinkerpop) 01/10: WIP
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch GValue-refinement
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit e4a876d320f324bc5a81cf19c0be183ba77a65f0
Author: Cole-Greer <Co...@improving.com>
AuthorDate: Fri Sep 5 14:17:03 2025 -0700
WIP
---
.../process/traversal/step/HasContainerHolder.java | 6 ++-
.../process/traversal/step/PropertyAdding.java | 4 ++
.../map/AbstractAddElementStepPlaceholder.java | 4 ++
.../strategy/decoration/PartitionStrategy.java | 12 ++---
.../strategy/decoration/SubgraphStrategy.java | 11 ++--
.../optimization/AdjacentToIncidentStrategy.java | 10 +++-
.../optimization/IncidentToAdjacentStrategy.java | 10 +++-
.../traversal/strategy/GValueManagerVerifier.java | 59 ++--------------------
.../strategy/GValueManagerVerifierTest.java | 17 -------
9 files changed, 43 insertions(+), 90 deletions(-)
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java
index 330ee84f4e..23c0546d55 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java
@@ -45,7 +45,9 @@ public interface HasContainerHolder<S, E> extends GValueHolder<S, E> {
public default Collection<P<?>> getPredicates() {
Collection<P<?>> predicates = getHasContainers().stream().map(p -> p.getPredicate()).collect(Collectors.toList());
for (P<?> predicate : predicates) {
- getTraversal().getGValueManager().pinGValues(predicate.getGValues());
+ if (predicate.isParameterized()) {
+ getTraversal().getGValueManager().pinGValues(predicate.getGValues());
+ }
}
return predicates;
}
@@ -70,7 +72,7 @@ public interface HasContainerHolder<S, E> extends GValueHolder<S, E> {
public default Collection<GValue<?>> getGValues() {
Set<GValue<?>> allGValues = new HashSet<>();
- for (final P<?> p : getPredicates()) {
+ for (final P<?> p : getPredicatesGValueSafe()) {
allGValues.addAll(p.getGValues());
}
return allGValues;
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PropertyAdding.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PropertyAdding.java
index c37e94cdf7..13cedd23b6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PropertyAdding.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PropertyAdding.java
@@ -25,4 +25,8 @@ public interface PropertyAdding {
void addProperty(Object key, Object value);
Map<Object, List<Object>> getProperties();
boolean removeProperty(Object k);
+
+ default public Map<Object, List<Object>> getPropertiesWithGValues() {
+ return getProperties();
+ }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
index 7783711d5b..12427350b4 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
@@ -211,6 +211,10 @@ public abstract class AbstractAddElementStepPlaceholder<S, E extends Element, X
return GValueHelper.resolveProperties(properties);
}
+ public Map<Object, List<Object>> getPropertiesWithGValues() {
+ return Collections.unmodifiableMap(properties);
+ }
+
@Override
public boolean removeProperty(Object k) {
if (properties.containsKey(k)) {
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
index 5c8db0c912..bac524d955 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
@@ -32,6 +32,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStartStepP
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStepPlaceholder;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStepPlaceholder;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeOtherVertexStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaMapStep;
@@ -242,13 +243,12 @@ public final class PartitionStrategy extends AbstractTraversalStrategy<Traversal
if (vertexFeatures.isPresent()) {
// GraphTraversal folds g.addV().property('k','v') to just AddVertexStep/AddVertexStartStep so this
// has to be exploded back to g.addV().property(cardinality, 'k','v','partition','A')
- if (step instanceof AddVertexStartStep || step instanceof AddVertexStep ||
- step instanceof AddVertexStartStepPlaceholder || step instanceof AddEdgeStartStepPlaceholder) {
- final Map<Object, List<Object>> params = ((PropertyAdding) step).getProperties();
+ if (step instanceof AddVertexStepContract) {
+ final Map<Object, List<Object>> properties = ((AddVertexStepContract) step).getPropertiesWithGValues();
// we get accused of ConcurrentModification if we rely on either the entry set or key set iterators in HashMap here
- for (Object k : params.keySet().toArray()) {
- final List<Object> v = params.get(k);
+ for (Object k : properties.keySet().toArray()) {
+ final List<Object> v = properties.get(k);
// need to filter out T based keys
if (k instanceof String) {
final List<Step> addPropertyStepsToAppend = new ArrayList<>(v.size());
@@ -262,8 +262,6 @@ public final class PartitionStrategy extends AbstractTraversalStrategy<Traversal
// added via the AddPropertyStep
((PropertyAdding) step).removeProperty(k);
- //TODO:: Extract properties as GValue from addV/addE and preserve GValue in AddPropertyStepPlaceholder
-
TraversalHelper.insertAfterStep(addPropertyStep, step, traversal);
});
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
index e031f31221..0a0e25c312 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
@@ -24,6 +24,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.ValueTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ClassFilterStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterStep;
@@ -36,6 +37,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyMapStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyValueStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStepContract;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStepPlaceholder;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStepContract;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStepContract;
@@ -188,13 +190,14 @@ public final class SubgraphStrategy extends AbstractTraversalStrategy<TraversalS
continue;
if (edgeCriterion != null) {
- final VertexStepContract<Edge> someEStep = new VertexStep<>(traversal, Edge.class, step.getDirection(), step.getEdgeLabels());
+ final VertexStepContract<Edge> someEStep = step instanceof VertexStepPlaceholder ?
+ // It is safe to use ((VertexStepPlaceholder<?>) step).getGValues()) here as edgeLabels are the
+ // only GValues in VertexStepPlaceholder, although the interface is not ideal.
+ new VertexStepPlaceholder<>(traversal, Edge.class, step.getDirection(), ((VertexStepPlaceholder<?>) step).getGValues().toArray(new GValue[0])) :
+ new VertexStep<>(traversal, Edge.class, step.getDirection(), step.getEdgeLabels());
final Step<Edge, Vertex> someVStep = step.getDirection() == Direction.BOTH ?
new EdgeOtherVertexStep(traversal) :
new EdgeVertexStep(traversal, step.getDirection().opposite());
-
- // TODO:: preserve GValues from out() to outE() for example
-
TraversalHelper.replaceStep((Step<Vertex, Edge>) step, someEStep, traversal);
TraversalHelper.insertAfterStep(someVStep, someEStep, traversal);
TraversalHelper.copyLabels(step, someVStep, true);
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategy.java
index 422b1c2578..8057e08547 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategy.java
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep;
@@ -31,10 +32,12 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountGlobalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStepContract;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStepPlaceholder;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.PropertyType;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
import java.util.Arrays;
import java.util.HashSet;
@@ -119,8 +122,11 @@ public final class AdjacentToIncidentStrategy extends AbstractTraversalStrategy<
final Step newStep;
if (step instanceof VertexStepContract) {
final VertexStepContract vs = (VertexStepContract) step;
- newStep = new VertexStep<>(traversal, Edge.class, vs.getDirection(), vs.getEdgeLabels());
- // TODO:: preserve GValue and leave unpinned if vs is a GValueHolder
+ newStep = step instanceof VertexStepPlaceholder ?
+ // It is safe to use getGValues() here as edgeLabels are the only GValues in VertexStepPlaceholder,
+ // although the interface is not ideal.
+ new VertexStepPlaceholder<>(traversal, Edge.class, vs.getDirection(), ((VertexStepPlaceholder<?>) vs).getGValues().toArray(new GValue[0])) :
+ new VertexStep<>(traversal, Edge.class, vs.getDirection(), vs.getEdgeLabels());
} else if (step instanceof PropertiesStep) {
final PropertiesStep ps = (PropertiesStep) step;
newStep = new PropertiesStep(traversal, PropertyType.PROPERTY, ps.getPropertyKeys());
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java
index e7ec18bc5a..e3e7362fac 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java
@@ -22,6 +22,7 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.VertexPr
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.LambdaHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.PathFilterStep;
@@ -31,10 +32,12 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.TreeStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStepContract;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStepPlaceholder;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeSideEffectStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.javatuples.Pair;
@@ -110,8 +113,11 @@ public final class IncidentToAdjacentStrategy extends AbstractTraversalStrategy<
* @param step2 the vertex-emitting step to replace
*/
private static void optimizeSteps(final Traversal.Admin traversal, final VertexStepContract step1, final Step step2) {
- final Step newStep = new VertexStep(traversal, Vertex.class, step1.getDirection(), step1.getEdgeLabels());
- //TODO:: preserve GValue and leave unpinned if step1 is a GValueHolder
+ final Step newStep = step1 instanceof VertexStepPlaceholder ?
+ // It is safe to use getGValues() here as edgeLabels are the only GValues in VertexStepPlaceholder,
+ // although the interface is not ideal.
+ new VertexStepPlaceholder<>(traversal, Vertex.class, step1.getDirection(), ((VertexStepPlaceholder<?>) step1).getGValues().toArray(new GValue[0])) :
+ new VertexStep(traversal, Vertex.class, step1.getDirection(), step1.getEdgeLabels());
for (final String label : (Iterable<String>) step2.getLabels()) {
newStep.addLabel(label);
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
index 5e67971317..9d020bcbea 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
@@ -186,64 +186,11 @@ public class GValueManagerVerifier {
}
/**
- * Verifies that all variables are preserved
+ * Verifies that all variables are preserved and unpinned
*/
public AfterVerifier<S, E> variablesArePreserved() {
- final Set<String> currentVariables = manager.getVariableNames();
- assertEquals("All variables should be preserved", preVariables, currentVariables);
- return this;
- }
-
- /**
- * Verifies that the contents of the GValueManager before and after applying strategies are unchanged.
- * This ensures that they have the same Step references, StepContract objects, and the contents of the
- * StepContracts are also the same.
- */
- public AfterVerifier<S, E> notModified() {
- // Verify that the same steps are in the manager
- // Use identity-based sets for Step objects
- final Set<Step> preSteps = Collections.newSetFromMap(new IdentityHashMap<>());
- preSteps.addAll(preStepGValues.keySet());
-
- final Set<Step> currentSteps = Collections.newSetFromMap(new IdentityHashMap<>());
- currentSteps.addAll(TraversalHelper.gatherGValuePlaceholders(traversal));
-
- assertEquals("Steps in GValueManager should be unchanged", preSteps.size(), currentSteps.size());
-
- for (Step preStep : preSteps) {
- boolean found = false;
- for (Step currentStep : currentSteps) {
- if (preStep.toString().equals(currentStep.toString())) {
- found = true;
-
- // Verify that the step has the same GValues
- final Collection<GValue<?>> preGValuesForStep = preStepGValues.get(preStep);
- final Collection<GValue<?>> currentGValuesForStep = currentStep instanceof GValueHolder ?
- ((GValueHolder<?, ?>) currentStep).getGValues() :
- Collections.emptySet();
- assertEquals("GValues for step should be unchanged", preGValuesForStep, currentGValuesForStep);
-
- // Verify that the step has the same variables
- final Set<String> preVariablesForStep = preStepVariables.get(preStep);
- if (preVariablesForStep != null) {
- final Set<String> currentVariablesForStep = currentGValuesForStep.stream()
- .filter(GValue::isVariable)
- .map(GValue::getName)
- .collect(Collectors.toSet());
- assertEquals("Variables for step should be unchanged", preVariablesForStep, currentVariablesForStep);
- }
-
- // TODO:: Verify that the GValues are the same if they exist
- break;
- }
- }
- assertTrue("Step not found in current steps: " + preStep, found);
- }
-
- // Verify that the same GValues are in the manager
- final Set<GValue<?>> currentGValues = manager.getGValues();
- assertEquals("GValues in GValueManager should be unchanged", preGValues, currentGValues);
-
+ final Set<String> currentVariables = manager.getUnpinnedVariableNames();
+ assertEquals("All variables should be preserved and unpinned", preVariables, currentVariables);
return this;
}
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifierTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifierTest.java
index 28745120b4..ab8ba75f3f 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifierTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifierTest.java
@@ -145,23 +145,6 @@ public class GValueManagerVerifierTest {
.variablesArePreserved();
}
- /**
- * Tests the notModified method of AfterVerifier.
- */
- @Test
- public void testNotModified() {
- // Create a traversal with GValues
- final Traversal.Admin<?, ?> traversal = __.filter(__.has("age", GValue.of("x", 25))).asAdmin();
-
- // Verify that the state is unchanged after applying the NoOpStrategy
- GValueManagerVerifier.verify(traversal, NoOpStrategy.instance())
- .beforeApplying()
- .stepsOfClassAreParameterized(true, HasStep.class)
- .afterApplying()
- .variablesArePreserved()
- .notModified();
- }
-
/**
* Tests the managerIsEmpty method of AbstractVerifier.
*/
(tinkerpop) 09/10: vertexStep and IsStep
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch GValue-refinement
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit e28b1474a8ed1cba3b841b01ed4c2a85cd5b0fb2
Author: Cole-Greer <Co...@improving.com>
AuthorDate: Tue Sep 9 18:12:50 2025 -0700
vertexStep and IsStep
---
.../gremlin/process/traversal/step/filter/IsStepContract.java | 6 +++++-
.../gremlin/process/traversal/step/filter/IsStepPlaceholder.java | 1 +
.../gremlin/process/traversal/step/map/VertexStepContract.java | 6 ++++++
.../gremlin/process/traversal/step/map/VertexStepPlaceholder.java | 5 +++--
.../gremlin/process/traversal/step/map/VertexStepTest.java | 6 +++---
.../gremlin/process/traversal/strategy/GValueManagerVerifier.java | 4 ++--
6 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStepContract.java
index e83cbbf7fc..d44cefb239 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStepContract.java
@@ -34,7 +34,11 @@ public interface IsStepContract<S> extends Step<S, S> {
*
* @return the predicate associated with the step
*/
- public P<?> getPredicate();
+ public P<S> getPredicate();
+
+ default P<S> getPredicateGValueSafe() {
+ return getPredicate();
+ }
public Set<TraverserRequirement> getRequirements();
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStepPlaceholder.java
index e2897d5fec..348d66ed94 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStepPlaceholder.java
@@ -55,6 +55,7 @@ public final class IsStepPlaceholder<S> extends AbstractStep<S,S> implements GVa
return this.predicate;
}
+ @Override
public P<S> getPredicateGValueSafe() {
return this.predicate;
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepContract.java
index 729b1f68ed..9beff28853 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepContract.java
@@ -19,11 +19,13 @@
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Vertex;
+import java.util.Arrays;
import java.util.Set;
public interface VertexStepContract<E extends Element> extends Step<Vertex, E> {
@@ -31,6 +33,10 @@ public interface VertexStepContract<E extends Element> extends Step<Vertex, E> {
String[] getEdgeLabels();
+ default GValue<String>[] getEdgeLabelsAsGValues() {
+ return Arrays.stream(getEdgeLabels()).map(GValue::of).toArray(GValue[]::new);
+ }
+
Class<E> getReturnClass();
void reverseDirection();
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java
index a4147e739f..02dec1596a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java
@@ -74,8 +74,9 @@ public class VertexStepPlaceholder<E extends Element> extends AbstractStep<Verte
return Arrays.stream(GValue.resolveToValues(edgeLabels)).toArray(String[]::new);
}
- public String[] getEdgeLabelsGValueSafe() {
- return Arrays.stream(GValue.resolveToValues(edgeLabels)).toArray(String[]::new);
+ @Override
+ public GValue<String>[] getEdgeLabelsAsGValues() {
+ return edgeLabels;
}
@Override
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepTest.java
index 3338c8e9ca..5d235140d8 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepTest.java
@@ -121,11 +121,11 @@ public class VertexStepTest extends GValueStepTest {
}
@Test
- public void getEdgeLabelsGValueSafeShouldNotPinVariables() {
+ public void getEdgeLabelsAsGValuesShouldNotPinVariables() {
GraphTraversal.Admin<Vertex, Vertex> traversal = getVertexGValueTraversal();
- String[] edgeLabels = ((VertexStepPlaceholder<?>) traversal.getSteps().get(0)).getEdgeLabelsGValueSafe();
+ GValue<String>[] edgeLabels = ((VertexStepPlaceholder<?>) traversal.getSteps().get(0)).getEdgeLabelsAsGValues();
assertEquals(2, edgeLabels.length);
- assertTrue(List.of(edgeLabels).containsAll(List.of("knows", "created")));
+ assertTrue(List.of(edgeLabels).containsAll(List.of(GValue.of("k", "knows"), GValue.of("c", "created"))));
verifyVariables(traversal, Set.of(), Set.of("k", "c"));
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
index 9d020bcbea..90b997e377 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
@@ -288,9 +288,9 @@ public class GValueManagerVerifier {
VertexStepPlaceholder<?> vertexStepPlaceholder = (VertexStepPlaceholder<?>) step;
- assertEquals("Label count should match", expectedLabelCount, vertexStepPlaceholder.getEdgeLabelsGValueSafe().length);
+ assertEquals("Label count should match", expectedLabelCount, vertexStepPlaceholder.getEdgeLabelsAsGValues().length);
assertTrue("Expected names should match", CollectionUtils.isEqualCollection(expectedNames, vertexStepPlaceholder.getGValues().stream().map(GValue::getName).collect(Collectors.toSet())));
- assertTrue("Expected values should match", CollectionUtils.isEqualCollection(expectedValues, Set.of(vertexStepPlaceholder.getEdgeLabelsGValueSafe())));
+ assertTrue("Expected values should match", CollectionUtils.isEqualCollection(expectedValues, Set.of(GValue.resolveToValues(vertexStepPlaceholder.getEdgeLabelsAsGValues()))));
return self();
}
(tinkerpop) 08/10: mergeV/E
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch GValue-refinement
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit c2994e986aafa399b1aa8833a64f67dc0307220b
Author: Cole-Greer <Co...@improving.com>
AuthorDate: Tue Sep 9 18:02:47 2025 -0700
mergeV/E
---
...va => AbstractMergeElementStepPlaceholder.java} | 127 +++++-------
.../step/map/MergeEdgeStepPlaceholder.java | 207 +-------------------
.../traversal/step/map/MergeStepContract.java | 41 ++++
.../step/map/MergeVertexStepPlaceholder.java | 216 +--------------------
.../traversal/step/map/MergeEdgeStepTest.java | 26 +--
.../traversal/step/map/MergeVertexStepTest.java | 26 +--
6 files changed, 123 insertions(+), 520 deletions(-)
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java
similarity index 69%
copy from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStepPlaceholder.java
copy to gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java
index 8f84d67a16..477717fb39 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java
@@ -23,7 +23,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.GValueConstantTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
@@ -32,9 +31,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.CallbackRe
import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.T;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
import java.util.Arrays;
import java.util.Collection;
@@ -48,54 +45,28 @@ import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Set;
-/**
- * Implementation for the {@code mergeV()} step covering both the start step version and the one used mid-traversal.
- */
-public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> implements MergeStepContract<S, Vertex, Map>, GValueHolder<S, Vertex> {
-
- private static final Set allowedTokens = new LinkedHashSet(Arrays.asList(T.id, T.label));
- private Map<Object, List<Object>> properties = new HashMap<>();
-
- public static void validateMapInput(final Map map, final boolean ignoreTokens) {
- MergeElementStep.validate(map, ignoreTokens, allowedTokens, "mergeV");
- }
-
- private Traversal.Admin<?,Map<Object,Object>> mergeTraversal;
- private Traversal.Admin<?,Map<Object,Object>> onCreateTraversal;
- private Traversal.Admin<?,Map<Object,Object>> onMatchTraversal;
- private final boolean isStart;
-
- public MergeVertexStepPlaceholder(final Traversal.Admin traversal, final boolean isStart) {
- this(traversal, isStart, new IdentityTraversal<>());
- }
-
- public MergeVertexStepPlaceholder(final Traversal.Admin traversal, final boolean isStart, final Map<Object, Object> merge) {
- this(traversal, isStart, new ConstantTraversal<>(merge));
- validateMapInput(merge, false);
- }
+public abstract class AbstractMergeElementStepPlaceholder<S, E> extends AbstractStep<S, E> implements MergeStepContract<S, E, Map>, GValueHolder<S, E> {
+ protected static final Set allowedTokens = new LinkedHashSet(Arrays.asList(T.id, T.label));
+ protected final boolean isStart;
+ protected Map<Object, List<Object>> properties = new HashMap<>();
+ protected Traversal.Admin<?, Map<Object, Object>> mergeTraversal;
+ protected Traversal.Admin<?, Map<Object, Object>> onCreateTraversal;
+ protected Traversal.Admin<?, Map<Object, Object>> onMatchTraversal;
- public MergeVertexStepPlaceholder(final Traversal.Admin traversal, final boolean isStart, final GValue<Map<Object, Object>> merge) {
- this(traversal, isStart, new GValueConstantTraversal<>(merge));
- validateMapInput(merge.get(), false);
- }
-
- public MergeVertexStepPlaceholder(final Traversal.Admin traversal, final boolean isStart, final Traversal.Admin<?,Map<Object, Object>> mergeTraversal) {
+ public AbstractMergeElementStepPlaceholder(Traversal.Admin traversal, final Traversal.Admin<?, Map<Object, Object>> mergeTraversal, final boolean isStart) {
super(traversal);
- this.isStart = isStart;
this.mergeTraversal = mergeTraversal;
- if (mergeTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).isParameterized()) {
- traversal.getGValueManager().register(((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).getGValue());
- }
+ this.isStart = isStart;
}
@Override
- protected Traverser.Admin<Vertex> processNextStart() throws NoSuchElementException {
- return null;
+ protected Traverser.Admin<E> processNextStart() throws NoSuchElementException {
+ throw new IllegalStateException("GValuePlaceholder step is not executable");
}
@Override
- public MergeVertexStepPlaceholder<S> clone() {
- return (MergeVertexStepPlaceholder<S>) super.clone();
+ public AbstractMergeElementStepPlaceholder<S, E> clone() {
+ return (AbstractMergeElementStepPlaceholder<S, E>) super.clone();
}
@Override
@@ -112,9 +83,16 @@ public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> imple
return mergeTraversal;
}
- public Traversal.Admin getMergeTraversalGValueSafe() {
- if (mergeTraversal != null && mergeTraversal instanceof GValueConstantTraversal) {
- return ((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).getConstantTraversal();
+ @Override
+ public Object getMergeMapWithGValue() {
+ if (mergeTraversal == null) {
+ return null;
+ }
+ if (mergeTraversal instanceof GValueConstantTraversal) {
+ return ((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).getGValue();
+ }
+ if (mergeTraversal instanceof ConstantTraversal) {
+ return mergeTraversal.next();
}
return mergeTraversal;
}
@@ -128,9 +106,16 @@ public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> imple
return onCreateTraversal;
}
- public Traversal.Admin getOnCreateTraversalGValueSafe() {
- if (onCreateTraversal != null && onCreateTraversal instanceof GValueConstantTraversal) {
- return ((GValueConstantTraversal<?, Map<Object, Object>>) onCreateTraversal).getConstantTraversal();
+ @Override
+ public Object getOnCreateMapWithGValue() {
+ if (onCreateTraversal == null) {
+ return null;
+ }
+ if (onCreateTraversal instanceof GValueConstantTraversal) {
+ return ((GValueConstantTraversal<?, Map<Object, Object>>) onCreateTraversal).getGValue();
+ }
+ if (onCreateTraversal instanceof ConstantTraversal) {
+ return onCreateTraversal.next();
}
return onCreateTraversal;
}
@@ -144,9 +129,16 @@ public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> imple
return onMatchTraversal;
}
- public Traversal.Admin getOnMatchTraversalGValueSafe() {
- if (onMatchTraversal != null && onMatchTraversal instanceof GValueConstantTraversal) {
- return ((GValueConstantTraversal<?, Map<Object, Object>>) onMatchTraversal).getConstantTraversal();
+ @Override
+ public Object getOnMatchMapWithGValue() {
+ if (onMatchTraversal == null) {
+ return null;
+ }
+ if (onMatchTraversal instanceof GValueConstantTraversal) {
+ return ((GValueConstantTraversal<?, Map<Object, Object>>) onMatchTraversal).getGValue();
+ }
+ if (onMatchTraversal instanceof ConstantTraversal) {
+ return onMatchTraversal.next();
}
return onMatchTraversal;
}
@@ -178,7 +170,7 @@ public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> imple
}
@Override
- public void setOnMatch(final Traversal.Admin<?,Map<Object, Object>> onMatchMap) {
+ public void setOnMatch(final Traversal.Admin<?, Map<Object, Object>> onMatchMap) {
this.onMatchTraversal = onMatchMap;
if (onMatchMap instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, Map<Object, Object>>) onMatchMap).isParameterized()) {
traversal.getGValueManager().register(((GValueConstantTraversal<?, Map<Object, Object>>) onMatchMap).getGValue());
@@ -186,7 +178,7 @@ public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> imple
}
@Override
- public void setOnCreate(final Traversal.Admin<?,Map<Object, Object>> onCreateMap) {
+ public void setOnCreate(final Traversal.Admin<?, Map<Object, Object>> onCreateMap) {
this.onCreateTraversal = onCreateMap;
if (onCreateMap instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, Map<Object, Object>>) onCreateMap).isParameterized()) {
traversal.getGValueManager().register(((GValueConstantTraversal<?, Map<Object, Object>>) onCreateMap).getGValue());
@@ -194,7 +186,7 @@ public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> imple
}
@Override
- public void setMerge(Traversal.Admin<?,Map<Object, Object>> mergeMap) {
+ public void setMerge(Traversal.Admin<?, Map<Object, Object>> mergeMap) {
this.mergeTraversal = mergeMap;
if (mergeMap instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, Map<Object, Object>>) mergeMap).isParameterized()) {
traversal.getGValueManager().register(((GValueConstantTraversal<?, Map<Object, Object>>) mergeMap).getGValue());
@@ -206,7 +198,7 @@ public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> imple
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
- MergeVertexStepPlaceholder<?> that = (MergeVertexStepPlaceholder<?>) o;
+ AbstractMergeElementStepPlaceholder<?, ?> that = (AbstractMergeElementStepPlaceholder<?, ?>) o;
return isStart == that.isStart && Objects.equals(properties, that.properties) && Objects.equals(mergeTraversal, that.mergeTraversal) && Objects.equals(onCreateTraversal, that.onCreateTraversal) && Objects.equals(onMatchTraversal, that.onMatchTraversal);
}
@@ -215,26 +207,6 @@ public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> imple
return Objects.hash(super.hashCode(), properties, mergeTraversal, onCreateTraversal, onMatchTraversal, isStart);
}
- @Override
- public MergeVertexStep<S> asConcreteStep() {
- MergeVertexStep<S> step = new MergeVertexStep<>(traversal, isStart,
- mergeTraversal instanceof GValueConstantTraversal ?
- ((GValueConstantTraversal) mergeTraversal).getConstantTraversal() : mergeTraversal);
- step.setOnCreate(onCreateTraversal instanceof GValueConstantTraversal ?
- ((GValueConstantTraversal) onCreateTraversal).getConstantTraversal() : onCreateTraversal);
- step.setOnMatch(onMatchTraversal instanceof GValueConstantTraversal ?
- ((GValueConstantTraversal) onMatchTraversal).getConstantTraversal() : onMatchTraversal);
- TraversalHelper.copyLabels(this, step, false);
-
- for (final Map.Entry<Object, List<Object>> entry : properties.entrySet()) {
- for (final Object value : entry.getValue()) {
- step.addProperty(entry.getKey(), value);
- }
- }
-
- return step;
- }
-
@Override
public boolean isParameterized() {
return onMatchTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal) onMatchTraversal).isParameterized() ||
@@ -298,8 +270,9 @@ public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> imple
gValue -> traversal.getGValueManager().pinVariable(gValue.getName()));
}
- public Map<Object, List<Object>> getPropertiesGValueSafe() {
- return GValueHelper.resolveProperties(properties);
+ @Override
+ public Map<Object, List<Object>> getPropertiesWithGValues() {
+ return Collections.unmodifiableMap(properties);
}
@Override
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStepPlaceholder.java
index eb5887790f..5f219c5756 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStepPlaceholder.java
@@ -52,18 +52,12 @@ import java.util.Set;
/**
* Implementation for the {@code mergeV()} step covering both the start step version and the one used mid-traversal.
*/
-public class MergeEdgeStepPlaceholder<S> extends AbstractStep<S, Edge> implements MergeStepContract<S, Edge, Map<Object, Object>>, GValueHolder<S, Edge> {
-
- private static final Set allowedTokens = new LinkedHashSet(Arrays.asList(T.id, T.label, Direction.IN, Direction.OUT));
- private Map<Object, List<Object>> properties = new HashMap<>();
+public class MergeEdgeStepPlaceholder<S> extends AbstractMergeElementStepPlaceholder<S, Edge> {
public static void validateMapInput(final Map map, final boolean ignoreTokens) {
MergeElementStep.validate(map, ignoreTokens, allowedTokens, "mergeE");
}
- private Traversal.Admin<?,Map<Object,Object>> mergeTraversal;
- private Traversal.Admin<?,Map<Object,Object>> onCreateTraversal;
- private Traversal.Admin<?,Map<Object,Object>> onMatchTraversal;
private Traversal.Admin<S,Map<Object,Object>> outVTraversal = null;
private Traversal.Admin<S,Map<Object,Object>> inVTraversal = null;
private final boolean isStart;
@@ -83,7 +77,7 @@ public class MergeEdgeStepPlaceholder<S> extends AbstractStep<S, Edge> implement
}
public MergeEdgeStepPlaceholder(final Traversal.Admin traversal, final boolean isStart, final Traversal.Admin<?,Map<Object, Object>> mergeTraversal) {
- super(traversal);
+ super(traversal, mergeTraversal, isStart);
this.isStart = isStart;
this.mergeTraversal = mergeTraversal;
if (mergeTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).isParameterized()) {
@@ -91,135 +85,18 @@ public class MergeEdgeStepPlaceholder<S> extends AbstractStep<S, Edge> implement
}
}
- @Override
- protected Traverser.Admin<Edge> processNextStart() throws NoSuchElementException {
- return null;
- }
-
- @Override
- public MergeEdgeStepPlaceholder<S> clone() {
- return (MergeEdgeStepPlaceholder<S>) super.clone();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return super.getRequirements();
- }
-
- @Override
- public Traversal.Admin getMergeTraversal() {
- if (mergeTraversal != null && mergeTraversal instanceof GValueConstantTraversal) {
- traversal.getGValueManager().pinVariable(((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).getGValue().getName());
- return ((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).getConstantTraversal();
- }
- return mergeTraversal;
- }
-
- public Traversal.Admin getMergeTraversalGValueSafe() {
- if (mergeTraversal != null && mergeTraversal instanceof GValueConstantTraversal) {
- return ((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).getConstantTraversal();
- }
- return mergeTraversal;
- }
-
- @Override
- public Traversal.Admin getOnCreateTraversal() {
- if (onCreateTraversal != null && onCreateTraversal instanceof GValueConstantTraversal) {
- traversal.getGValueManager().pinVariable(((GValueConstantTraversal<?, Map<Object, Object>>) onCreateTraversal).getGValue().getName());
- return ((GValueConstantTraversal<?, Map<Object, Object>>) onCreateTraversal).getConstantTraversal();
- }
- return onCreateTraversal;
- }
-
- public Traversal.Admin getOnCreateTraversalGValueSafe() {
- if (onCreateTraversal != null && onCreateTraversal instanceof GValueConstantTraversal) {
- return ((GValueConstantTraversal<?, Map<Object, Object>>) onCreateTraversal).getConstantTraversal();
- }
- return onCreateTraversal;
- }
-
- @Override
- public Traversal.Admin getOnMatchTraversal() {
- if (onMatchTraversal != null && onMatchTraversal instanceof GValueConstantTraversal) {
- traversal.getGValueManager().pinVariable(((GValueConstantTraversal<?, Map<Object, Object>>) onMatchTraversal).getGValue().getName());
- return ((GValueConstantTraversal<?, Map<Object, Object>>) onMatchTraversal).getConstantTraversal();
- }
- return onMatchTraversal;
- }
-
- public Traversal.Admin getOnMatchTraversalGValueSafe() {
- if (onMatchTraversal != null && onMatchTraversal instanceof GValueConstantTraversal) {
- return ((GValueConstantTraversal<?, Map<Object, Object>>) onMatchTraversal).getConstantTraversal();
- }
- return onMatchTraversal;
- }
-
- @Override
- public boolean isStart() {
- return isStart;
- }
-
- @Override
- public boolean isFirst() {
- return true; // Step cannot be iterated so isFirst() is always true
- }
-
- @Override
- public void addChildOption(Merge token, Traversal.Admin traversalOption) {
- if (token == Merge.onCreate) {
- setOnCreate(traversalOption);
- } else if (token == Merge.onMatch) {
- setOnMatch(traversalOption);
- } else if (token == Merge.outV) {
- this.outVTraversal = traversalOption;
- } else if (token == Merge.inV) {
- this.inVTraversal = traversalOption;
- }else {
- throw new UnsupportedOperationException(String.format("Option %s for Merge is not supported", token.name()));
- }
- }
-
- @Override
- public boolean isUsingPartitionStrategy() {
- return false;
- }
-
- @Override
- public void setOnMatch(final Traversal.Admin<?,Map<Object, Object>> onMatchMap) {
- this.onMatchTraversal = onMatchMap;
- if (onMatchMap instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, Map<Object, Object>>) onMatchMap).isParameterized()) {
- traversal.getGValueManager().register(((GValueConstantTraversal<?, Map<Object, Object>>) onMatchMap).getGValue());
- }
- }
-
- @Override
- public void setOnCreate(final Traversal.Admin<?,Map<Object, Object>> onCreateMap) {
- this.onCreateTraversal = onCreateMap;
- if (onCreateMap instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, Map<Object, Object>>) onCreateMap).isParameterized()) {
- traversal.getGValueManager().register(((GValueConstantTraversal<?, Map<Object, Object>>) onCreateMap).getGValue());
- }
- }
-
- @Override
- public void setMerge(Traversal.Admin<?,Map<Object, Object>> mergeMap) {
- this.mergeTraversal = mergeMap;
- if (mergeMap instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, Map<Object, Object>>) mergeMap).isParameterized()) {
- traversal.getGValueManager().register(((GValueConstantTraversal<?, Map<Object, Object>>) mergeMap).getGValue());
- }
- }
-
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
MergeEdgeStepPlaceholder<?> that = (MergeEdgeStepPlaceholder<?>) o;
- return isStart == that.isStart && Objects.equals(properties, that.properties) && Objects.equals(mergeTraversal, that.mergeTraversal) && Objects.equals(onCreateTraversal, that.onCreateTraversal) && Objects.equals(onMatchTraversal, that.onMatchTraversal) && Objects.equals(outVTraversal, that.outVTraversal) && Objects.equals(inVTraversal, that.inVTraversal);
+ return Objects.equals(outVTraversal, that.outVTraversal) && Objects.equals(inVTraversal, that.inVTraversal);
}
@Override
public int hashCode() {
- return Objects.hash(super.hashCode(), properties, mergeTraversal, onCreateTraversal, onMatchTraversal, outVTraversal, inVTraversal, isStart);
+ return Objects.hash(super.hashCode(), outVTraversal, inVTraversal);
}
@Override
@@ -248,80 +125,4 @@ public class MergeEdgeStepPlaceholder<S> extends AbstractStep<S, Edge> implement
TraversalHelper.copyLabels(this, step, false);
return step;
}
-
- @Override
- public boolean isParameterized() {
- return onMatchTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal) onMatchTraversal).isParameterized() ||
- onCreateTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal) onCreateTraversal).isParameterized() ||
- mergeTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal) mergeTraversal).isParameterized();
- }
-
- @Override
- public void updateVariable(String name, Object value) {
- if (mergeTraversal != null && mergeTraversal instanceof GValueConstantTraversal) {
- ((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).updateVariable(name, value);
- }
- if (onMatchTraversal != null && onMatchTraversal instanceof GValueConstantTraversal) {
- ((GValueConstantTraversal<?, Map<Object, Object>>) onMatchTraversal).updateVariable(name, value);
- }
- if (onCreateTraversal != null && onCreateTraversal instanceof GValueConstantTraversal) {
- ((GValueConstantTraversal<?, Map<Object, Object>>) onCreateTraversal).updateVariable(name, value);
- }
- }
-
- @Override
- public Collection<GValue<?>> getGValues() {
- Set<GValue<?>> gValues = new HashSet<>();
- if (mergeTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, ?>) mergeTraversal).getGValue().isVariable()) {
- gValues.add(((GValueConstantTraversal<?, ?>) mergeTraversal).getGValue());
- }
- if (onMatchTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, ?>) onMatchTraversal).getGValue().isVariable()) {
- gValues.add(((GValueConstantTraversal<?, ?>) onMatchTraversal).getGValue());
- }
- if (onCreateTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, ?>) onCreateTraversal).getGValue().isVariable()) {
- gValues.add(((GValueConstantTraversal<?, ?>) onCreateTraversal).getGValue());
- }
- return gValues;
- }
-
- @Override
- public CallbackRegistry<Event> getMutatingCallbackRegistry() {
- throw new IllegalStateException("Cannot get mutating CallbackRegistry on GValue placeholder step");
- }
-
- /**
- * This implementation should only be used as a mechanism for supporting {@link PartitionStrategy}.
- */
- @Override
- public void addProperty(Object key, Object value) {
- if (key instanceof GValue) {
- throw new IllegalArgumentException("GValue cannot be used as a property key");
- }
- if (value instanceof GValue) {
- traversal.getGValueManager().register((GValue<?>) value);
- }
- if (properties.containsKey(key)) {
- throw new IllegalArgumentException("MergeElement.addProperty only support properties with single cardinality");
- }
- properties.put(key, Collections.singletonList(value));
- }
-
- @Override
- public Map<Object, List<Object>> getProperties() {
- return GValueHelper.resolveProperties(properties,
- gValue -> traversal.getGValueManager().pinVariable(gValue.getName()));
- }
-
- public Map<Object, List<Object>> getPropertiesGValueSafe() {
- return GValueHelper.resolveProperties(properties);
- }
-
- @Override
- public boolean removeProperty(Object k) {
- if (properties.containsKey(k)) {
- properties.remove(k);
- return true;
- }
- return false;
- }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeStepContract.java
index 7ec5a40a87..77c3879472 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeStepContract.java
@@ -20,7 +20,9 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.traversal.Merge;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.Deleting;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.PropertiesHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.Writing;
@@ -34,10 +36,49 @@ public interface MergeStepContract<S, E, C> extends Writing<Event>, Deleting<Eve
Traversal.Admin<S, Map> getMergeTraversal();
+ /**
+ * Gets the merge map from this step. If the map was originally passed as a {@link GValue<Map>}, that is returned
+ * directly. If it was originally passed as a {@link Map} or {@link ConstantTraversal<Map>}, then a {@link Map} is
+ * returned. Otherwise, the MergeMap is returned in Traversal form.
+ */
+ default Object getMergeMapWithGValue() {
+ Traversal mergeTraversal = getMergeTraversal();
+ if (mergeTraversal instanceof ConstantTraversal) {
+ return mergeTraversal.next();
+ }
+ return mergeTraversal;
+ }
+
Traversal.Admin<S, Map> getOnCreateTraversal();
+ /**
+ * Gets the onCreate map from this step. If the map was originally passed as a {@link GValue<Map>}, that is returned
+ * directly. If it was originally passed as a {@link Map} or {@link ConstantTraversal<Map>}, then a {@link Map} is
+ * returned. Otherwise, the onCreate is returned in Traversal form.
+ */
+ default Object getOnCreateMapWithGValue() {
+ Traversal onCreateTraversal = getOnCreateTraversal();
+ if (onCreateTraversal instanceof ConstantTraversal) {
+ return onCreateTraversal.next();
+ }
+ return onCreateTraversal;
+ }
+
Traversal.Admin<S, Map<String, ?>> getOnMatchTraversal();
+ /**
+ * Gets the onMatch map from this step. If the map was originally passed as a {@link GValue<Map>}, that is returned
+ * directly. If it was originally passed as a {@link Map} or {@link ConstantTraversal<Map>}, then a {@link Map} is
+ * returned. Otherwise, the onMatch is returned in Traversal form.
+ */
+ default Object getOnMatchMapWithGValue() {
+ Traversal onMatchTraversal = getOnMatchTraversal();
+ if (onMatchTraversal instanceof ConstantTraversal) {
+ return onMatchTraversal.next();
+ }
+ return onMatchTraversal;
+ }
+
boolean isStart();
boolean isFirst();
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStepPlaceholder.java
index 8f84d67a16..d84dcb82ce 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStepPlaceholder.java
@@ -51,20 +51,12 @@ import java.util.Set;
/**
* Implementation for the {@code mergeV()} step covering both the start step version and the one used mid-traversal.
*/
-public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> implements MergeStepContract<S, Vertex, Map>, GValueHolder<S, Vertex> {
-
- private static final Set allowedTokens = new LinkedHashSet(Arrays.asList(T.id, T.label));
- private Map<Object, List<Object>> properties = new HashMap<>();
+public class MergeVertexStepPlaceholder<S> extends AbstractMergeElementStepPlaceholder<S, Vertex> {
public static void validateMapInput(final Map map, final boolean ignoreTokens) {
MergeElementStep.validate(map, ignoreTokens, allowedTokens, "mergeV");
}
- private Traversal.Admin<?,Map<Object,Object>> mergeTraversal;
- private Traversal.Admin<?,Map<Object,Object>> onCreateTraversal;
- private Traversal.Admin<?,Map<Object,Object>> onMatchTraversal;
- private final boolean isStart;
-
public MergeVertexStepPlaceholder(final Traversal.Admin traversal, final boolean isStart) {
this(traversal, isStart, new IdentityTraversal<>());
}
@@ -80,141 +72,12 @@ public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> imple
}
public MergeVertexStepPlaceholder(final Traversal.Admin traversal, final boolean isStart, final Traversal.Admin<?,Map<Object, Object>> mergeTraversal) {
- super(traversal);
- this.isStart = isStart;
- this.mergeTraversal = mergeTraversal;
+ super(traversal, mergeTraversal, isStart);
if (mergeTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).isParameterized()) {
traversal.getGValueManager().register(((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).getGValue());
}
}
- @Override
- protected Traverser.Admin<Vertex> processNextStart() throws NoSuchElementException {
- return null;
- }
-
- @Override
- public MergeVertexStepPlaceholder<S> clone() {
- return (MergeVertexStepPlaceholder<S>) super.clone();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return super.getRequirements();
- }
-
- @Override
- public Traversal.Admin getMergeTraversal() {
- if (mergeTraversal != null && mergeTraversal instanceof GValueConstantTraversal) {
- traversal.getGValueManager().pinVariable(((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).getGValue().getName());
- return ((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).getConstantTraversal();
- }
- return mergeTraversal;
- }
-
- public Traversal.Admin getMergeTraversalGValueSafe() {
- if (mergeTraversal != null && mergeTraversal instanceof GValueConstantTraversal) {
- return ((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).getConstantTraversal();
- }
- return mergeTraversal;
- }
-
- @Override
- public Traversal.Admin getOnCreateTraversal() {
- if (onCreateTraversal != null && onCreateTraversal instanceof GValueConstantTraversal) {
- traversal.getGValueManager().pinVariable(((GValueConstantTraversal<?, Map<Object, Object>>) onCreateTraversal).getGValue().getName());
- return ((GValueConstantTraversal<?, Map<Object, Object>>) onCreateTraversal).getConstantTraversal();
- }
- return onCreateTraversal;
- }
-
- public Traversal.Admin getOnCreateTraversalGValueSafe() {
- if (onCreateTraversal != null && onCreateTraversal instanceof GValueConstantTraversal) {
- return ((GValueConstantTraversal<?, Map<Object, Object>>) onCreateTraversal).getConstantTraversal();
- }
- return onCreateTraversal;
- }
-
- @Override
- public Traversal.Admin getOnMatchTraversal() {
- if (onMatchTraversal != null && onMatchTraversal instanceof GValueConstantTraversal) {
- traversal.getGValueManager().pinVariable(((GValueConstantTraversal<?, Map<Object, Object>>) onMatchTraversal).getGValue().getName());
- return ((GValueConstantTraversal<?, Map<Object, Object>>) onMatchTraversal).getConstantTraversal();
- }
- return onMatchTraversal;
- }
-
- public Traversal.Admin getOnMatchTraversalGValueSafe() {
- if (onMatchTraversal != null && onMatchTraversal instanceof GValueConstantTraversal) {
- return ((GValueConstantTraversal<?, Map<Object, Object>>) onMatchTraversal).getConstantTraversal();
- }
- return onMatchTraversal;
- }
-
- @Override
- public boolean isStart() {
- return isStart;
- }
-
- @Override
- public boolean isFirst() {
- return true; // Step cannot be iterated so isFirst() is always true
- }
-
- @Override
- public void addChildOption(Merge token, Traversal.Admin traversalOption) {
- if (token == Merge.onCreate) {
- setOnCreate(traversalOption);
- } else if (token == Merge.onMatch) {
- setOnMatch(traversalOption);
- } else {
- throw new UnsupportedOperationException(String.format("Option %s for Merge is not supported", token.name()));
- }
- }
-
- @Override
- public boolean isUsingPartitionStrategy() {
- return false;
- }
-
- @Override
- public void setOnMatch(final Traversal.Admin<?,Map<Object, Object>> onMatchMap) {
- this.onMatchTraversal = onMatchMap;
- if (onMatchMap instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, Map<Object, Object>>) onMatchMap).isParameterized()) {
- traversal.getGValueManager().register(((GValueConstantTraversal<?, Map<Object, Object>>) onMatchMap).getGValue());
- }
- }
-
- @Override
- public void setOnCreate(final Traversal.Admin<?,Map<Object, Object>> onCreateMap) {
- this.onCreateTraversal = onCreateMap;
- if (onCreateMap instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, Map<Object, Object>>) onCreateMap).isParameterized()) {
- traversal.getGValueManager().register(((GValueConstantTraversal<?, Map<Object, Object>>) onCreateMap).getGValue());
- }
- }
-
- @Override
- public void setMerge(Traversal.Admin<?,Map<Object, Object>> mergeMap) {
- this.mergeTraversal = mergeMap;
- if (mergeMap instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, Map<Object, Object>>) mergeMap).isParameterized()) {
- traversal.getGValueManager().register(((GValueConstantTraversal<?, Map<Object, Object>>) mergeMap).getGValue());
- }
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- if (!super.equals(o)) return false;
- MergeVertexStepPlaceholder<?> that = (MergeVertexStepPlaceholder<?>) o;
- return isStart == that.isStart && Objects.equals(properties, that.properties) && Objects.equals(mergeTraversal, that.mergeTraversal) && Objects.equals(onCreateTraversal, that.onCreateTraversal) && Objects.equals(onMatchTraversal, that.onMatchTraversal);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(super.hashCode(), properties, mergeTraversal, onCreateTraversal, onMatchTraversal, isStart);
- }
-
@Override
public MergeVertexStep<S> asConcreteStep() {
MergeVertexStep<S> step = new MergeVertexStep<>(traversal, isStart,
@@ -235,79 +98,4 @@ public class MergeVertexStepPlaceholder<S> extends AbstractStep<S, Vertex> imple
return step;
}
- @Override
- public boolean isParameterized() {
- return onMatchTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal) onMatchTraversal).isParameterized() ||
- onCreateTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal) onCreateTraversal).isParameterized() ||
- mergeTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal) mergeTraversal).isParameterized();
- }
-
- @Override
- public void updateVariable(String name, Object value) {
- if (mergeTraversal != null && mergeTraversal instanceof GValueConstantTraversal) {
- ((GValueConstantTraversal<?, Map<Object, Object>>) mergeTraversal).updateVariable(name, value);
- }
- if (onMatchTraversal != null && onMatchTraversal instanceof GValueConstantTraversal) {
- ((GValueConstantTraversal<?, Map<Object, Object>>) onMatchTraversal).updateVariable(name, value);
- }
- if (onCreateTraversal != null && onCreateTraversal instanceof GValueConstantTraversal) {
- ((GValueConstantTraversal<?, Map<Object, Object>>) onCreateTraversal).updateVariable(name, value);
- }
- }
-
- @Override
- public Collection<GValue<?>> getGValues() {
- Set<GValue<?>> gValues = new HashSet<>();
- if (mergeTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, ?>) mergeTraversal).getGValue().isVariable()) {
- gValues.add(((GValueConstantTraversal<?, ?>) mergeTraversal).getGValue());
- }
- if (onMatchTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, ?>) onMatchTraversal).getGValue().isVariable()) {
- gValues.add(((GValueConstantTraversal<?, ?>) onMatchTraversal).getGValue());
- }
- if (onCreateTraversal instanceof GValueConstantTraversal && ((GValueConstantTraversal<?, ?>) onCreateTraversal).getGValue().isVariable()) {
- gValues.add(((GValueConstantTraversal<?, ?>) onCreateTraversal).getGValue());
- }
- return gValues;
- }
-
- @Override
- public CallbackRegistry<Event> getMutatingCallbackRegistry() {
- throw new IllegalStateException("Cannot get mutating CallbackRegistry on GValue placeholder step");
- }
-
- /**
- * This implementation should only be used as a mechanism for supporting {@link PartitionStrategy}.
- */
- @Override
- public void addProperty(Object key, Object value) {
- if (key instanceof GValue) {
- throw new IllegalArgumentException("GValue cannot be used as a property key");
- }
- if (value instanceof GValue) {
- traversal.getGValueManager().register((GValue<?>) value);
- }
- if (properties.containsKey(key)) {
- throw new IllegalArgumentException("MergeElement.addProperty only support properties with single cardinality");
- }
- properties.put(key, Collections.singletonList(value));
- }
-
- @Override
- public Map<Object, List<Object>> getProperties() {
- return GValueHelper.resolveProperties(properties,
- gValue -> traversal.getGValueManager().pinVariable(gValue.getName()));
- }
-
- public Map<Object, List<Object>> getPropertiesGValueSafe() {
- return GValueHelper.resolveProperties(properties);
- }
-
- @Override
- public boolean removeProperty(Object k) {
- if (properties.containsKey(k)) {
- properties.remove(k);
- return true;
- }
- return false;
- }
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStepTest.java
index fe362db4c9..ade2eab4e9 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeEdgeStepTest.java
@@ -95,12 +95,12 @@ public class MergeEdgeStepTest extends GValueStepTest {
true);
step.addProperty("name", GValue.of("vadas"));
step.addProperty("age", GValue.of(27));
- assertTrue(step.getPropertiesGValueSafe().containsKey("name"));
- assertTrue(step.getPropertiesGValueSafe().containsKey("age"));
+ assertTrue(step.getProperties().containsKey("name"));
+ assertTrue(step.getProperties().containsKey("age"));
assertTrue(step.removeProperty("name"));
- assertFalse(step.getPropertiesGValueSafe().containsKey("name"));
- assertTrue(step.getPropertiesGValueSafe().containsKey("age"));
+ assertFalse(step.getProperties().containsKey("name"));
+ assertTrue(step.getProperties().containsKey("age"));
assertFalse(step.removeProperty("name"));
}
@@ -208,9 +208,9 @@ public class MergeEdgeStepTest extends GValueStepTest {
}
@Test
- public void getMergeTraversalGValueSafeShouldNotPinVariable() {
+ public void getMergeMapWithGValueShouldNotPinVariable() {
GraphTraversal.Admin<?, ?> traversal = getMergeEGValueTraversal();
- assertEquals(NAME_MAP, ((MergeEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getMergeTraversalGValueSafe().next());
+ assertEquals(GValue.of("mergeMap", NAME_MAP), ((MergeEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getMergeMapWithGValue());
verifyVariables(traversal, Set.of(), Set.of("mergeMap", "matchMap", "createMap"));
}
@@ -228,9 +228,9 @@ public class MergeEdgeStepTest extends GValueStepTest {
}
@Test
- public void getOnCreateTraversalGValueSafeShouldNotPinVariable() {
+ public void getOnCreateMapWithGValueShouldNotPinVariable() {
GraphTraversal.Admin<?, ?> traversal = getMergeEGValueTraversal();
- assertEquals(AGE_30_MAP, ((MergeEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getOnCreateTraversalGValueSafe().next());
+ assertEquals(GValue.of("createMap", AGE_30_MAP), ((MergeEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getOnCreateMapWithGValue());
verifyVariables(traversal, Set.of(), Set.of("mergeMap", "matchMap", "createMap"));
}
@@ -248,9 +248,9 @@ public class MergeEdgeStepTest extends GValueStepTest {
}
@Test
- public void getOnMatchTraversalGValueSafeShouldNotPinVariable() {
+ public void getOnMatchMapWithGValueShouldNotPinVariable() {
GraphTraversal.Admin<?, ?> traversal = getMergeEGValueTraversal();
- assertEquals(AGE_29_MAP, ((MergeEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getOnMatchTraversalGValueSafe().next());
+ assertEquals(GValue.of("matchMap", AGE_29_MAP), ((MergeEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getOnMatchMapWithGValue());
verifyVariables(traversal, Set.of(), Set.of("mergeMap", "matchMap", "createMap"));
}
@@ -272,13 +272,13 @@ public class MergeEdgeStepTest extends GValueStepTest {
}
@Test
- public void getPropertiesGValueSafeShouldNotPinVariable() {
+ public void getPropertiesWithGValuesShouldNotPinVariable() {
GraphTraversal.Admin<?, ?> traversal = getMergeEGValueTraversal();
MergeEdgeStepPlaceholder step = (MergeEdgeStepPlaceholder<?>) traversal.getSteps().get(0);
//There is no direct way to add properties to mergeV via Gremlin, this interface is only exposed for the purposes of PartitionStrategy
step.addProperty("key", GValue.of("x", "value"));
- assertEquals(List.of("value"), ((MergeEdgeStepPlaceholder<?>) traversal.getSteps().get(0))
- .getPropertiesGValueSafe().get("key"));
+ assertEquals(List.of(GValue.of("x", "value")), ((MergeEdgeStepPlaceholder<?>) traversal.getSteps().get(0))
+ .getPropertiesWithGValues().get("key"));
verifyVariables(traversal, Set.of(), Set.of("mergeMap", "matchMap", "createMap", "x"));
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStepTest.java
index 6b60e00b69..3b79e4dbc2 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStepTest.java
@@ -110,12 +110,12 @@ public class MergeVertexStepTest extends GValueStepTest {
true);
step.addProperty("name", GValue.of("vadas"));
step.addProperty("age", GValue.of(27));
- assertTrue(step.getPropertiesGValueSafe().containsKey("name"));
- assertTrue(step.getPropertiesGValueSafe().containsKey("age"));
+ assertTrue(step.getProperties().containsKey("name"));
+ assertTrue(step.getProperties().containsKey("age"));
assertTrue(step.removeProperty("name"));
- assertFalse(step.getPropertiesGValueSafe().containsKey("name"));
- assertTrue(step.getPropertiesGValueSafe().containsKey("age"));
+ assertFalse(step.getProperties().containsKey("name"));
+ assertTrue(step.getProperties().containsKey("age"));
assertFalse(step.removeProperty("name"));
}
@@ -261,9 +261,9 @@ public class MergeVertexStepTest extends GValueStepTest {
}
@Test
- public void getMergeTraversalGValueSafeShouldNotPinVariable() {
+ public void getMergeMapWithGValueShouldNotPinVariable() {
GraphTraversal.Admin<?, ?> traversal = getMergeVGValueTraversal();
- assertEquals(NAME_MAP, ((MergeVertexStepPlaceholder<?>) traversal.getSteps().get(0)).getMergeTraversalGValueSafe().next());
+ assertEquals(GValue.of("mergeMap", NAME_MAP), ((MergeVertexStepPlaceholder<?>) traversal.getSteps().get(0)).getMergeMapWithGValue());
verifyVariables(traversal, Set.of(), Set.of("mergeMap", "matchMap", "createMap"));
}
@@ -281,9 +281,9 @@ public class MergeVertexStepTest extends GValueStepTest {
}
@Test
- public void getOnCreateTraversalGValueSafeShouldNotPinVariable() {
+ public void getOnCreateMapWithGValueShouldNotPinVariable() {
GraphTraversal.Admin<?, ?> traversal = getMergeVGValueTraversal();
- assertEquals(AGE_30_MAP, ((MergeVertexStepPlaceholder<?>) traversal.getSteps().get(0)).getOnCreateTraversalGValueSafe().next());
+ assertEquals(GValue.of("createMap", AGE_30_MAP), ((MergeVertexStepPlaceholder<?>) traversal.getSteps().get(0)).getOnCreateMapWithGValue());
verifyVariables(traversal, Set.of(), Set.of("mergeMap", "matchMap", "createMap"));
}
@@ -301,9 +301,9 @@ public class MergeVertexStepTest extends GValueStepTest {
}
@Test
- public void getOnMatchTraversalGValueSafeShouldNotPinVariable() {
+ public void getOnMatchMapWithGValueShouldNotPinVariable() {
GraphTraversal.Admin<?, ?> traversal = getMergeVGValueTraversal();
- assertEquals(AGE_29_MAP, ((MergeVertexStepPlaceholder<?>) traversal.getSteps().get(0)).getOnMatchTraversalGValueSafe().next());
+ assertEquals(GValue.of("matchMap", AGE_29_MAP), ((MergeVertexStepPlaceholder<?>) traversal.getSteps().get(0)).getOnMatchMapWithGValue());
verifyVariables(traversal, Set.of(), Set.of("mergeMap", "matchMap", "createMap"));
}
@@ -325,13 +325,13 @@ public class MergeVertexStepTest extends GValueStepTest {
}
@Test
- public void getPropertiesGValueSafeShouldNotPinVariable() {
+ public void getPropertiesWithGValuesShouldNotPinVariable() {
GraphTraversal.Admin<?, ?> traversal = getMergeVGValueTraversal();
MergeVertexStepPlaceholder step = (MergeVertexStepPlaceholder<?>) traversal.getSteps().get(0);
//There is no direct way to add properties to mergeV via Gremlin, this interface is only exposed for the purposes of PartitionStrategy
step.addProperty("key", GValue.of("x", "value"));
- assertEquals(List.of("value"), ((MergeVertexStepPlaceholder<?>) traversal.getSteps().get(0))
- .getPropertiesGValueSafe().get("key"));
+ assertEquals(List.of(GValue.of("x", "value")), ((MergeVertexStepPlaceholder<?>) traversal.getSteps().get(0))
+ .getPropertiesWithGValues().get("key"));
verifyVariables(traversal, Set.of(), Set.of("mergeMap", "matchMap", "createMap", "x"));
}
(tinkerpop) 04/10: AddVertex/AddElement
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch GValue-refinement
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 0c4daf3bc9e778e049775a67678878048c018c55
Author: Cole-Greer <Co...@improving.com>
AuthorDate: Tue Sep 9 15:47:30 2025 -0700
AddVertex/AddElement
---
.../map/AbstractAddElementStepPlaceholder.java | 20 ++++------
....java => AbstractAddVertexStepPlaceholder.java} | 18 +++------
.../traversal/step/map/AddElementStepContract.java | 9 +++++
.../step/map/AddVertexStartStepPlaceholder.java | 24 +-----------
.../step/map/AddVertexStepPlaceholder.java | 44 ++++------------------
.../traversal/step/map/AddEdgeStartStepTest.java | 14 +++----
.../traversal/step/map/AddEdgeStepTest.java | 18 ++++-----
.../traversal/step/map/AddVertexStartStepTest.java | 14 +++----
.../traversal/step/map/AddVertexStepTest.java | 18 ++++-----
9 files changed, 64 insertions(+), 115 deletions(-)
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
index 12427350b4..8af2d91563 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
@@ -156,12 +156,13 @@ public abstract class AbstractAddElementStepPlaceholder<S, E extends Element, X
return label.next();
}
- public String getLabelGValueSafe() {
- return label.next();
+ @Override
+ public GValue<String> getLabelAsGValue() {
+ return label instanceof GValueConstantTraversal ? ((GValueConstantTraversal) label).getGValue() : GValue.of(label.next());
}
private void setLabel(Object label) {// TODO should this be public and added to step interface?
- if (getLabelGValueSafe().equals(Vertex.DEFAULT_LABEL)) {
+ if (getLabelAsGValue().get().equals(Vertex.DEFAULT_LABEL)) {
this.label = label instanceof GValue ? new GValueConstantTraversal<>((GValue) label) : new ConstantTraversal<>((String) label);
if (label instanceof GValue) {
traversal.getGValueManager().register((GValue<?>) label);
@@ -207,10 +208,7 @@ public abstract class AbstractAddElementStepPlaceholder<S, E extends Element, X
gValue -> traversal.getGValueManager().pinVariable(gValue.getName()));
}
- public Map<Object, List<Object>> getPropertiesGValueSafe() {
- return GValueHelper.resolveProperties(properties);
- }
-
+ @Override
public Map<Object, List<Object>> getPropertiesWithGValues() {
return Collections.unmodifiableMap(properties);
}
@@ -235,11 +233,9 @@ public abstract class AbstractAddElementStepPlaceholder<S, E extends Element, X
return elementId.get();
}
- public Object getElementIdGValueSafe() {
- if (elementId == null) {
- return null;
- }
- return elementId.get();
+ @Override
+ public GValue<?> getElementIdAsGValue() {
+ return elementId;
}
@Override
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddVertexStepPlaceholder.java
similarity index 71%
copy from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepPlaceholder.java
copy to gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddVertexStepPlaceholder.java
index 77315ca580..451dc4b1b9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddVertexStepPlaceholder.java
@@ -26,22 +26,22 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
import org.apache.tinkerpop.gremlin.structure.Vertex;
-public class AddVertexStepPlaceholder<S> extends AbstractAddElementStepPlaceholder<S, Vertex, Event.VertexAddedEvent>
+public abstract class AbstractAddVertexStepPlaceholder<S> extends AbstractAddElementStepPlaceholder<S, Vertex, Event.VertexAddedEvent>
implements AddVertexStepContract<S>, GValueHolder<S, Vertex> {
private boolean userProvidedLabel;
- public AddVertexStepPlaceholder(final Traversal.Admin traversal, final String label) {
+ public AbstractAddVertexStepPlaceholder(final Traversal.Admin traversal, final String label) {
super(traversal, label == null ? Vertex.DEFAULT_LABEL : label);
userProvidedLabel = label != null;
}
- public AddVertexStepPlaceholder(final Traversal.Admin traversal, final GValue<String> label) {
+ public AbstractAddVertexStepPlaceholder(final Traversal.Admin traversal, final GValue<String> label) {
super(traversal, label == null ? GValue.of(Vertex.DEFAULT_LABEL) : label);
userProvidedLabel = label != null;
}
- public AddVertexStepPlaceholder(final Traversal.Admin traversal, final Traversal.Admin<S,String> vertexLabelTraversal) {
+ public AbstractAddVertexStepPlaceholder(final Traversal.Admin traversal, final Traversal.Admin<S,String> vertexLabelTraversal) {
super(traversal, vertexLabelTraversal == null ?
new ConstantTraversal<>(Vertex.DEFAULT_LABEL) : vertexLabelTraversal);
userProvidedLabel = vertexLabelTraversal != null;
@@ -53,8 +53,8 @@ public class AddVertexStepPlaceholder<S> extends AbstractAddElementStepPlacehold
}
@Override
- public AddVertexStepPlaceholder<S> clone() {
- final AddVertexStepPlaceholder<S> clone = (AddVertexStepPlaceholder<S>) super.clone();
+ public AbstractAddVertexStepPlaceholder<S> clone() {
+ final AbstractAddVertexStepPlaceholder<S> clone = (AbstractAddVertexStepPlaceholder<S>) super.clone();
clone.userProvidedLabel = this.userProvidedLabel;
return clone;
}
@@ -64,10 +64,4 @@ public class AddVertexStepPlaceholder<S> extends AbstractAddElementStepPlacehold
return true;
}
- @Override
- public AddVertexStep<S> asConcreteStep() {
- AddVertexStep<S> step = new AddVertexStep<>(traversal, label instanceof GValueConstantTraversal ? ((GValueConstantTraversal<S, String>) label).getConstantTraversal() : label);
- super.configureConcreteStep(step);
- return step;
- }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddElementStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddElementStepContract.java
index 6c3bc8cc97..5fa5a552ba 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddElementStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddElementStepContract.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.step.PropertyAdding;
import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
@@ -28,8 +29,16 @@ import java.util.HashSet;
public interface AddElementStepContract<S, E> extends Step<S, E>, PropertyAdding, TraversalParent, Scoping {
Object getLabel();
+ default GValue<?> getLabelAsGValue(){
+ return GValue.of(getLabel());
+ }
+
Object getElementId();
+ default GValue<?> getElementIdAsGValue() {
+ return GValue.of(getElementId());
+ }
+
void setElementId(Object elementId);
boolean removeElementId();
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepPlaceholder.java
index def5989635..53a1da24f1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepPlaceholder.java
@@ -26,42 +26,20 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
import org.apache.tinkerpop.gremlin.structure.Vertex;
-public class AddVertexStartStepPlaceholder extends AbstractAddElementStepPlaceholder<Vertex, Vertex, Event.VertexAddedEvent>
+public class AddVertexStartStepPlaceholder extends AbstractAddVertexStepPlaceholder<Vertex>
implements AddVertexStepContract<Vertex>, GValueHolder<Vertex, Vertex> {
- private boolean userProvidedLabel;
-
public AddVertexStartStepPlaceholder(final Traversal.Admin traversal, final String label) {
super(traversal, label == null ? Vertex.DEFAULT_LABEL : label);
- userProvidedLabel = label != null;
}
public AddVertexStartStepPlaceholder(final Traversal.Admin traversal, final GValue<String> label) {
super(traversal, label == null ? GValue.of(Vertex.DEFAULT_LABEL) : label);
- userProvidedLabel = label != null;
}
public AddVertexStartStepPlaceholder(final Traversal.Admin traversal, final Traversal.Admin<?,String> vertexLabelTraversal) {
super(traversal, vertexLabelTraversal == null ?
new ConstantTraversal<>(Vertex.DEFAULT_LABEL) : (Traversal.Admin<Vertex,String>) vertexLabelTraversal);
- userProvidedLabel = vertexLabelTraversal != null;
- }
-
- @Override
- public boolean hasUserProvidedLabel() {
- return userProvidedLabel;
- }
-
- @Override
- public AddVertexStartStepPlaceholder clone() {
- final AddVertexStartStepPlaceholder clone = (AddVertexStartStepPlaceholder) super.clone();
- clone.userProvidedLabel = this.userProvidedLabel;
- return clone;
- }
-
- @Override
- protected boolean supportsMultiProperties() {
- return true;
}
@Override
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepPlaceholder.java
index 77315ca580..2147c1010a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepPlaceholder.java
@@ -19,49 +19,21 @@
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.GValueConstantTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
-import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-public class AddVertexStepPlaceholder<S> extends AbstractAddElementStepPlaceholder<S, Vertex, Event.VertexAddedEvent>
- implements AddVertexStepContract<S>, GValueHolder<S, Vertex> {
+public class AddVertexStepPlaceholder<S> extends AbstractAddVertexStepPlaceholder<S> {
- private boolean userProvidedLabel;
-
- public AddVertexStepPlaceholder(final Traversal.Admin traversal, final String label) {
- super(traversal, label == null ? Vertex.DEFAULT_LABEL : label);
- userProvidedLabel = label != null;
- }
-
- public AddVertexStepPlaceholder(final Traversal.Admin traversal, final GValue<String> label) {
- super(traversal, label == null ? GValue.of(Vertex.DEFAULT_LABEL) : label);
- userProvidedLabel = label != null;
- }
-
- public AddVertexStepPlaceholder(final Traversal.Admin traversal, final Traversal.Admin<S,String> vertexLabelTraversal) {
- super(traversal, vertexLabelTraversal == null ?
- new ConstantTraversal<>(Vertex.DEFAULT_LABEL) : vertexLabelTraversal);
- userProvidedLabel = vertexLabelTraversal != null;
+ public AddVertexStepPlaceholder(Traversal.Admin traversal, String label) {
+ super(traversal, label);
}
- @Override
- public boolean hasUserProvidedLabel() {
- return userProvidedLabel;
+ public AddVertexStepPlaceholder(Traversal.Admin traversal, GValue<String> label) {
+ super(traversal, label);
}
- @Override
- public AddVertexStepPlaceholder<S> clone() {
- final AddVertexStepPlaceholder<S> clone = (AddVertexStepPlaceholder<S>) super.clone();
- clone.userProvidedLabel = this.userProvidedLabel;
- return clone;
- }
-
- @Override
- protected boolean supportsMultiProperties() {
- return true;
+ public AddVertexStepPlaceholder(Traversal.Admin traversal, Traversal.Admin<S, String> vertexLabelTraversal) {
+ super(traversal, vertexLabelTraversal);
}
@Override
@@ -70,4 +42,4 @@ public class AddVertexStepPlaceholder<S> extends AbstractAddElementStepPlacehold
super.configureConcreteStep(step);
return step;
}
-}
+}
\ No newline at end of file
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepTest.java
index cfa684918f..71efca85bf 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStepTest.java
@@ -105,9 +105,9 @@ public class AddEdgeStartStepTest extends GValueStepTest {
}
@Test
- public void getLabelGValueSafeShouldNotPinVariable() {
+ public void getLabelAsGValueShouldNotPinVariable() {
GraphTraversal.Admin<Edge, Edge> traversal = getAddEdgeGValueTraversal();
- assertEquals("likes", ((AddEdgeStartStepPlaceholder) traversal.getSteps().get(0)).getLabelGValueSafe());
+ assertEquals(GValue.of("label", "likes"), ((AddEdgeStartStepPlaceholder) traversal.getSteps().get(0)).getLabelAsGValue());
verifyVariables(traversal, Set.of(), Set.of("label", "from", "to", "id", "r"));
}
@@ -125,9 +125,9 @@ public class AddEdgeStartStepTest extends GValueStepTest {
}
@Test
- public void getElementIdGValueSafeShouldNotPinVariable() {
+ public void getElementIdAsGValueShouldNotPinVariable() {
GraphTraversal.Admin<Edge, Edge> traversal = getAddEdgeGValueTraversal();
- assertEquals("1234", ((AddEdgeStartStepPlaceholder) traversal.getSteps().get(0)).getElementIdGValueSafe());
+ assertEquals(GValue.of("id", "1234"), ((AddEdgeStartStepPlaceholder) traversal.getSteps().get(0)).getElementIdAsGValue());
verifyVariables(traversal, Set.of(), Set.of("label", "from", "to", "id", "r"));
}
@@ -186,10 +186,10 @@ public class AddEdgeStartStepTest extends GValueStepTest {
}
@Test
- public void getPropertiesGValueSafeShouldNotPinVariable() {
+ public void getPropertiesWithGValuesShouldNotPinVariable() {
GraphTraversal.Admin<Edge, Edge> traversal = getAddEdgeGValueTraversal();
- assertEquals(List.of("great"), ((AddEdgeStartStepPlaceholder) traversal.getSteps().get(0))
- .getPropertiesGValueSafe().get("rating"));
+ assertEquals(List.of(GValue.of("r", "great")), ((AddEdgeStartStepPlaceholder) traversal.getSteps().get(0))
+ .getPropertiesWithGValues().get("rating"));
verifyVariables(traversal, Set.of(), Set.of("label", "from", "to", "id", "r"));
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepTest.java
index 1190c11e34..5f6918930a 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepTest.java
@@ -144,8 +144,8 @@ public class AddEdgeStepTest extends GValueStepTest {
step.addProperty("type", GValue.of("friendship"));
assertTrue(step.removeProperty("type"));
- assertFalse(step.getPropertiesGValueSafe().containsKey("type"));
- assertTrue(step.getPropertiesGValueSafe().containsKey("weight"));
+ assertFalse(step.getPropertiesWithGValues().containsKey("type"));
+ assertTrue(step.getPropertiesWithGValues().containsKey("weight"));
assertFalse(step.removeProperty("type"));
}
@@ -178,9 +178,9 @@ public class AddEdgeStepTest extends GValueStepTest {
}
@Test
- public void getLabelGValueSafeShouldNotPinVariable() {
+ public void getLabelAsGValueShouldNotPinVariable() {
GraphTraversal.Admin<Object, Edge> traversal = getAddEdgeGValueTraversal();
- assertEquals("likes", ((AddEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getLabelGValueSafe());
+ assertEquals(GValue.of("label", "likes"), ((AddEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getLabelAsGValue());
verifyVariables(traversal, Set.of(), Set.of("label", "from", "to", "id", "r"));
}
@@ -198,9 +198,9 @@ public class AddEdgeStepTest extends GValueStepTest {
}
@Test
- public void getElementIdGValueSafeShouldNotPinVariable() {
+ public void getElementIdAsGValueShouldNotPinVariable() {
GraphTraversal.Admin<Object, Edge> traversal = getAddEdgeGValueTraversal();
- assertEquals("1234", ((AddEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getElementIdGValueSafe());
+ assertEquals(GValue.of("id", "1234"), ((AddEdgeStepPlaceholder<?>) traversal.getSteps().get(0)).getElementIdAsGValue());
verifyVariables(traversal, Set.of(), Set.of("label", "from", "to", "id", "r"));
}
@@ -279,10 +279,10 @@ public class AddEdgeStepTest extends GValueStepTest {
}
@Test
- public void getPropertiesGValueSafeShouldNotPinVariable() {
+ public void getPropertiesWithGValuesShouldNotPinVariable() {
GraphTraversal.Admin<Object, Edge> traversal = getAddEdgeGValueTraversal();
- assertEquals(List.of("great"), ((AddEdgeStepPlaceholder<?>) traversal.getSteps().get(0))
- .getPropertiesGValueSafe().get("rating"));
+ assertEquals(List.of(GValue.of("r", "great")), ((AddEdgeStepPlaceholder<?>) traversal.getSteps().get(0))
+ .getPropertiesWithGValues().get("rating"));
verifyVariables(traversal, Set.of(), Set.of("label", "from", "to", "id", "r"));
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepTest.java
index 5aaf4060e7..7bd31f0760 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStepTest.java
@@ -99,9 +99,9 @@ public class AddVertexStartStepTest extends GValueStepTest {
}
@Test
- public void getLabelGValueSafeShouldNotPinVariable() {
+ public void getLabelAsGValueShouldNotPinVariable() {
GraphTraversal.Admin<Vertex, Vertex> traversal = getAddPersonGValueTraversal();
- assertEquals("person", ((AddVertexStartStepPlaceholder) traversal.getSteps().get(0)).getLabelGValueSafe());
+ assertEquals(GValue.of("label", "person"), ((AddVertexStartStepPlaceholder) traversal.getSteps().get(0)).getLabelAsGValue());
verifyVariables(traversal, Set.of(), Set.of("label", "id", "a"));
}
@@ -120,9 +120,9 @@ public class AddVertexStartStepTest extends GValueStepTest {
}
@Test
- public void getElementIdGValueSafeShouldNotPinVariable() {
+ public void getElementIdAsGValueShouldNotPinVariable() {
GraphTraversal.Admin<Vertex, Vertex> traversal = getAddPersonGValueTraversal();
- assertEquals("1234", ((AddVertexStartStepPlaceholder) traversal.getSteps().get(0)).getElementIdGValueSafe());
+ assertEquals(GValue.of("id", "1234"), ((AddVertexStartStepPlaceholder) traversal.getSteps().get(0)).getElementIdAsGValue());
verifyVariables(traversal, Set.of(), Set.of("label", "id", "a"));
}
@@ -140,10 +140,10 @@ public class AddVertexStartStepTest extends GValueStepTest {
}
@Test
- public void getPropertiesGValueSafeShouldNotPinVariable() {
+ public void getPropertiesWithGValuesShouldNotPinVariable() {
GraphTraversal.Admin<Vertex, Vertex> traversal = getAddPersonGValueTraversal();
- assertEquals(List.of(29), ((AddVertexStartStepPlaceholder) traversal.getSteps().get(0))
- .getPropertiesGValueSafe().get("age"));
+ assertEquals(List.of(GValue.of("a", 29)), ((AddVertexStartStepPlaceholder) traversal.getSteps().get(0))
+ .getPropertiesWithGValues().get("age"));
verifyVariables(traversal, Set.of(), Set.of("label", "id", "a"));
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepTest.java
index 90badb64f5..fc370342b0 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepTest.java
@@ -200,8 +200,8 @@ public class AddVertexStepTest extends GValueStepTest {
step.addProperty("age", GValue.of(27));
assertTrue(step.removeProperty("name"));
- assertFalse(step.getPropertiesGValueSafe().containsKey("name"));
- assertTrue(step.getPropertiesGValueSafe().containsKey("age"));
+ assertFalse(step.getPropertiesWithGValues().containsKey("name"));
+ assertTrue(step.getPropertiesWithGValues().containsKey("age"));
assertFalse(step.removeProperty("name"));
}
@@ -279,9 +279,9 @@ public class AddVertexStepTest extends GValueStepTest {
}
@Test
- public void getLabelGValueSafeShouldNotPinVariable() {
+ public void getLabelAsGValueShouldNotPinVariable() {
GraphTraversal.Admin<Object, Vertex> traversal = getAddPersonGValueTraversal();
- assertEquals("person", ((AddVertexStepPlaceholder) traversal.getSteps().get(0)).getLabelGValueSafe());
+ assertEquals(GValue.of("label", "person"), ((AddVertexStepPlaceholder) traversal.getSteps().get(0)).getLabelAsGValue());
verifyVariables(traversal, Set.of(), Set.of("label", "id", "a"));
}
@@ -300,9 +300,9 @@ public class AddVertexStepTest extends GValueStepTest {
}
@Test
- public void getElementIdGValueSafeShouldNotPinVariable() {
+ public void getElementIdAsGValueShouldNotPinVariable() {
GraphTraversal.Admin<Object, Vertex> traversal = getAddPersonGValueTraversal();
- assertEquals("1234", ((AddVertexStepPlaceholder) traversal.getSteps().get(0)).getElementIdGValueSafe());
+ assertEquals(GValue.of("id", "1234"), ((AddVertexStepPlaceholder) traversal.getSteps().get(0)).getElementIdAsGValue());
verifyVariables(traversal, Set.of(), Set.of("label", "id", "a"));
}
@@ -320,10 +320,10 @@ public class AddVertexStepTest extends GValueStepTest {
}
@Test
- public void getPropertiesGValueSafeShouldNotPinVariable() {
+ public void getPropertiesWithGValuesShouldNotPinVariable() {
GraphTraversal.Admin<Object, Vertex> traversal = getAddPersonGValueTraversal();
- assertEquals(List.of(29), ((AddVertexStepPlaceholder) traversal.getSteps().get(0))
- .getPropertiesGValueSafe().get("age"));
+ assertEquals(List.of(GValue.of("a", 29)), ((AddVertexStepPlaceholder) traversal.getSteps().get(0))
+ .getPropertiesWithGValues().get("age"));
verifyVariables(traversal, Set.of(), Set.of("label", "id", "a"));
}
(tinkerpop) 10/10: range and tail
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch GValue-refinement
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 5fe1672528e9db76a0040d38bd12ff0204cf2e71
Author: Cole-Greer <Co...@improving.com>
AuthorDate: Tue Sep 9 18:27:05 2025 -0700
range and tail
---
.../step/filter/RangeGlobalStepContract.java | 21 +++++++++++++++++++++
.../step/filter/RangeLocalStepContract.java | 21 +++++++++++++++++++++
.../traversal/step/filter/RangeStepPlaceholder.java | 20 ++++++--------------
.../step/filter/TailGlobalStepContract.java | 5 +++++
.../step/filter/TailGlobalStepPlaceholder.java | 5 +++--
.../step/filter/TailLocalStepContract.java | 5 +++++
.../step/filter/TailLocalStepPlaceholder.java | 5 +++--
.../traversal/step/filter/RangeGlobalStepTest.java | 6 +++---
.../traversal/step/filter/TailGlobalStepTest.java | 4 ++--
.../traversal/step/map/RangeLocalStepTest.java | 6 +++---
.../traversal/step/map/TailLocalStepTest.java | 4 ++--
.../traversal/strategy/GValueManagerVerifier.java | 6 ++----
12 files changed, 76 insertions(+), 32 deletions(-)
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepContract.java
index c2a6f46e9e..4a7a27e1e0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepContract.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.gremlin.process.traversal.step.filter;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
/**
* Defines the contract for {@code range} related steps.
@@ -38,4 +39,24 @@ public interface RangeGlobalStepContract<S> extends Step<S, S> {
* @return the higher bound of the range as an object of type V
*/
Long getHighRange();
+
+ /**
+ * getLowRange, retaining the GValue container and without pinning the variable. It is the caller's
+ * responsibility to ensure that this value is not used to alter the traversal in any way which is not generalizable
+ * to any parameter value.
+ * @return the lower bound for range().
+ */
+ default GValue<Long> getLowRangeAsGValue() {
+ return GValue.of(getLowRange());
+ }
+
+ /**
+ * getHighRange, retaining the GValue container and without pinning the variable. It is the caller's
+ * responsibility to ensure that this value is not used to alter the traversal in any way which is not generalizable
+ * to any parameter value.
+ * @return the upper bound for range().
+ */
+ default GValue<Long> getHighRangeAsGValue() {
+ return GValue.of(getHighRange());
+ }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepContract.java
index a57b6fed3f..e45203881e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepContract.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.gremlin.process.traversal.step.filter;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
/**
* Defines the contract for {@code range} related steps.
@@ -38,4 +39,24 @@ public interface RangeLocalStepContract<S> extends Step<S, S> {
* @return the higher bound of the range as an object of type V
*/
Long getHighRange();
+
+ /**
+ * getLowRange, retaining the GValue container and without pinning the variable. It is the caller's
+ * responsibility to ensure that this value is not used to alter the traversal in any way which is not generalizable
+ * to any parameter value.
+ * @return the lower bound for range().
+ */
+ default GValue<Long> getLowRangeAsGValue() {
+ return GValue.of(getLowRange());
+ }
+
+ /**
+ * getHighRange, retaining the GValue container and without pinning the variable. It is the caller's
+ * responsibility to ensure that this value is not used to alter the traversal in any way which is not generalizable
+ * to any parameter value.
+ * @return the upper bound for range().
+ */
+ default GValue<Long> getHighRangeAsGValue() {
+ return GValue.of(getHighRange());
+ }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeStepPlaceholder.java
index 145b8229d4..73d53f417b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeStepPlaceholder.java
@@ -102,31 +102,23 @@ public abstract class RangeStepPlaceholder<S> extends AbstractStep<S,S> implemen
}
/**
- * getLowRange without marking the GValue as dirty and thus automatically pinning the GValue. It is the caller's
+ * getLowRange, retaining the GValue container and without pinning the variable. It is the caller's
* responsibility to ensure that this value is not used to alter the traversal in any way which is not generalizable
* to any parameter value.
* @return the lower bound for range().
*/
- public long getLowRangeGValueSafe() {
- return low.get();
+ public GValue<Long> getLowRangeAsGValue() {
+ return low;
}
/**
- * getHighRange without marking the GValue as dirty and thus automatically pinning the GValue. It is the caller's
+ * getHighRange, retaining the GValue container and without pinning the variable. It is the caller's
* responsibility to ensure that this value is not used to alter the traversal in any way which is not generalizable
* to any parameter value.
* @return the upper bound for range().
*/
- public long getHighRangeGValueSafe() {
- return high.get();
- }
-
- public String getLowName() {
- return low.getName();
- }
-
- public String getHighName() {
- return high.getName();
+ public GValue<Long> getHighRangeAsGValue() {
+ return high;
}
@Override
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepContract.java
index 9c113880ef..f2198548b0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepContract.java
@@ -19,7 +19,12 @@
package org.apache.tinkerpop.gremlin.process.traversal.step.filter;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
public interface TailGlobalStepContract<S> extends Step<S, S> {
Long getLimit();
+
+ default GValue<Long> getLimitAsGValue() {
+ return GValue.of(getLimit());
+ }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java
index 4b554056f5..e6d57ccdcc 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java
@@ -69,8 +69,9 @@ public final class TailGlobalStepPlaceholder<S> extends AbstractStep<S, S> imple
return limit.get();
}
- public Long getLimitGValueSafe() {
- return limit.get();
+ @Override
+ public GValue<Long> getLimitAsGValue() {
+ return limit;
}
@Override
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepContract.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepContract.java
index f72640eec4..e7357b33d3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepContract.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepContract.java
@@ -19,7 +19,12 @@
package org.apache.tinkerpop.gremlin.process.traversal.step.filter;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
public interface TailLocalStepContract<S> extends Step<S, S> {
Long getLimit();
+
+ default GValue<Long> getLimitAsGValue() {
+ return GValue.of(getLimit());
+ }
}
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java
index e36edd6e33..85f81658a8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java
@@ -66,8 +66,9 @@ public final class TailLocalStepPlaceholder<S> extends AbstractStep<S, S> implem
return limit.get();
}
- public Long getLimitGValueSafe() {
- return limit.get();
+ @Override
+ public GValue<Long> getLimitAsGValue() {
+ return limit;
}
@Override
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepTest.java
index f005aa4132..75f854ca99 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepTest.java
@@ -71,10 +71,10 @@ public class RangeGlobalStepTest extends GValueStepTest {
}
@Test
- public void getLowHighRangeGValueSafeShouldNotPinVariables() {
+ public void getLowHighRangeAsGValueShouldNotPinVariables() {
GraphTraversal.Admin<Object, Object> traversal = __.range(GValue.of(LOW_NAME, LOW_VALUE), GValue.of(HIGH_NAME, HIGH_VALUE)).asAdmin();
- assertEquals(LOW_VALUE, ((RangeStepPlaceholder.RangeGlobalStepPlaceholder) traversal.getSteps().get(0)).getLowRangeGValueSafe());
- assertEquals(HIGH_VALUE, ((RangeStepPlaceholder.RangeGlobalStepPlaceholder) traversal.getSteps().get(0)).getHighRangeGValueSafe());
+ assertEquals(GValue.of(LOW_NAME, LOW_VALUE), ((RangeStepPlaceholder.RangeGlobalStepPlaceholder) traversal.getSteps().get(0)).getLowRangeAsGValue());
+ assertEquals(GValue.of(HIGH_NAME, HIGH_VALUE), ((RangeStepPlaceholder.RangeGlobalStepPlaceholder) traversal.getSteps().get(0)).getHighRangeAsGValue());
verifyVariables(traversal, Set.of(), Set.of(LOW_NAME, HIGH_NAME));
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepTest.java
index 5172a64f34..3397896299 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepTest.java
@@ -65,9 +65,9 @@ public class TailGlobalStepTest extends GValueStepTest {
}
@Test
- public void getLimitGValueSafeShouldNotPinVariable() {
+ public void getLimitAsGValueShouldNotPinVariable() {
GraphTraversal.Admin<Object, Object> traversal = __.tail(GValue.of(GVALUE_NAME, LIMIT_10)).asAdmin();
- assertNotNull(((TailGlobalStepPlaceholder) traversal.getSteps().get(0)).getLimitGValueSafe());
+ assertEquals(GValue.of(GVALUE_NAME, LIMIT_10), ((TailGlobalStepPlaceholder) traversal.getSteps().get(0)).getLimitAsGValue());
verifySingleUnpinnedVariable(traversal, GVALUE_NAME);
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStepTest.java
index c7ef28e4fe..7ce53e1709 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStepTest.java
@@ -79,10 +79,10 @@ public class RangeLocalStepTest extends GValueStepTest {
}
@Test
- public void getLowHighRangeGValueSafeShouldNotPinVariables() {
+ public void getLowHighRangeAsGValueShouldNotPinVariables() {
GraphTraversal.Admin<Object, Object> traversal = __.range(Scope.local, GValue.of(LOW_NAME, LOW_VALUE), GValue.of(HIGH_NAME, HIGH_VALUE)).asAdmin();
- assertEquals(LOW_VALUE, ((RangeStepPlaceholder.RangeLocalStepPlaceholder) traversal.getSteps().get(0)).getLowRangeGValueSafe());
- assertEquals(HIGH_VALUE, ((RangeStepPlaceholder.RangeLocalStepPlaceholder) traversal.getSteps().get(0)).getHighRangeGValueSafe());
+ assertEquals(GValue.of(LOW_NAME, LOW_VALUE), ((RangeStepPlaceholder.RangeLocalStepPlaceholder) traversal.getSteps().get(0)).getLowRangeAsGValue());
+ assertEquals(GValue.of(HIGH_NAME, HIGH_VALUE), ((RangeStepPlaceholder.RangeLocalStepPlaceholder) traversal.getSteps().get(0)).getHighRangeAsGValue());
verifyVariables(traversal, Set.of(), Set.of(LOW_NAME, HIGH_NAME));
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStepTest.java
index 39466e782c..f47f7f989c 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStepTest.java
@@ -67,9 +67,9 @@ public class TailLocalStepTest extends GValueStepTest {
}
@Test
- public void getLimitGValueSafeShouldNotPinVariable() {
+ public void getLimitAsGValueShouldNotPinVariable() {
GraphTraversal.Admin<Object, Object> traversal = __.tail(Scope.local, GValue.of(GVALUE_NAME, LIMIT_10)).asAdmin();
- assertNotNull(((TailLocalStepPlaceholder) traversal.getSteps().get(0)).getLimitGValueSafe());
+ assertEquals(GValue.of(GVALUE_NAME, LIMIT_10), ((TailLocalStepPlaceholder) traversal.getSteps().get(0)).getLimitAsGValue());
verifySingleUnpinnedVariable(traversal, GVALUE_NAME);
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
index 90b997e377..e7a5fc6745 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
@@ -271,10 +271,8 @@ public class GValueManagerVerifier {
RangeGlobalStepPlaceholder<?> rangeGlobalStepPlaceholder = (RangeGlobalStepPlaceholder<?>) step;
- assertEquals("Low range should match", expectedLow, rangeGlobalStepPlaceholder.getLowRangeGValueSafe());
- assertEquals("High range should match", expectedHigh, rangeGlobalStepPlaceholder.getHighRangeGValueSafe());
- assertEquals("Low range name should match", lowName, rangeGlobalStepPlaceholder.getLowName());
- assertEquals("High range name should match", highName, rangeGlobalStepPlaceholder.getHighName());
+ assertEquals("Low range should match", GValue.of(lowName, expectedLow), rangeGlobalStepPlaceholder.getLowRangeAsGValue());
+ assertEquals("High range should match", GValue.of(highName, expectedHigh), rangeGlobalStepPlaceholder.getHighRangeAsGValue());
return self();
}
(tinkerpop) 02/10: WIP cleanup unoptimized strategies
Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
colegreer pushed a commit to branch GValue-refinement
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit dab5231e335a52da944bdb62905718a9960b3315
Author: Cole-Greer <Co...@improving.com>
AuthorDate: Tue Sep 9 09:22:53 2025 -0700
WIP cleanup unoptimized strategies
---
.../gremlin/process/traversal/step/HasContainerHolder.java | 6 +++---
.../traversal/strategy/optimization/CountStrategyTest.java | 8 +++++++-
.../strategy/optimization/FilterRankingStrategyTest.java | 5 +++--
3 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java
index 23c0546d55..d288af5000 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java
@@ -43,7 +43,7 @@ public interface HasContainerHolder<S, E> extends GValueHolder<S, E> {
}
public default Collection<P<?>> getPredicates() {
- Collection<P<?>> predicates = getHasContainers().stream().map(p -> p.getPredicate()).collect(Collectors.toList());
+ Collection<P<?>> predicates = getPredicatesGValueSafe();
for (P<?> predicate : predicates) {
if (predicate.isParameterized()) {
getTraversal().getGValueManager().pinGValues(predicate.getGValues());
@@ -61,11 +61,11 @@ public interface HasContainerHolder<S, E> extends GValueHolder<S, E> {
}
public default boolean isParameterized() {
- return getPredicates().stream().anyMatch(P::isParameterized);
+ return getPredicatesGValueSafe().stream().anyMatch(P::isParameterized);
}
public default void updateVariable(final String name, final Object value) {
- getPredicates().forEach((p) -> {
+ getPredicatesGValueSafe().forEach((p) -> {
p.updateVariable(name, value);
});
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/CountStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/CountStrategyTest.java
index 6aad8c7391..26dfa4b10b 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/CountStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/CountStrategyTest.java
@@ -282,6 +282,13 @@ public class CountStrategyTest {
{__.count().as("c").is(GValue.of("x", 0))},
{__.union(__.count().is(GValue.of("x", 0)), __.out().count())},
{__.coalesce(__.count().is(GValue.of("x", 0)), __.out().count())},
+
+ // This case may be controversial, as the GValues are accessed by the strategy, but ultimately the traversal
+ // is not modified. The variables are pinned regardless as those variables could later be updated to values
+ // in which the strategy is active. Leaving the variables unpinned in such a case would not lead to an
+ // incorrect traversal, however it may result in certain cached traversals missing out on the CountStrategy
+ // optimizations.
+ {__.count().is(P.within(GValue.of("x", "string"), GValue.of("y", "another")))},
});
}
@@ -312,7 +319,6 @@ public class CountStrategyTest {
{__.flatMap(__.count().is(GValue.of("x", 0))).as("a")},
{__.limit(5).count().is(GValue.of("x", 0))},
{__.range(1, 5).count().is(GValue.of("x", 0))},
- {__.count().is(P.within(GValue.of("x", "string"), GValue.of("y", "another")))},
});
}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
index 5054ca6415..1304538ac6 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
@@ -27,6 +27,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.GValueManagerVerifier;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.GValueReductionStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.translator.GroovyTranslator;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.util.CollectionUtil;
@@ -288,10 +289,10 @@ public class FilterRankingStrategyTest {
// Examples with TraversalStrategies.GlobalCache
{has("value", GValue.ofInteger("x", 0)).or(out(), in()).as(Graph.Hidden.hide("x")).has("value", GValue.ofInteger("y", 1)).dedup(),
CollectionUtil.asSet("x", "y"),
- TraversalStrategies.GlobalCache.getStrategies(Graph.class).toList()},
+ TraversalStrategies.GlobalCache.getStrategies(Graph.class).removeStrategies(GValueReductionStrategy.class).toList()},
{has("value", GValue.ofInteger("x", 0)).filter(or(not(has("age")), has("age", GValue.ofInteger("y", 1)))).has("value", GValue.ofInteger("z", 1)).dedup(),
CollectionUtil.asSet("x", "y", "z"),
- TraversalStrategies.GlobalCache.getStrategies(Graph.class).toList()},
+ TraversalStrategies.GlobalCache.getStrategies(Graph.class).removeStrategies(GValueReductionStrategy.class).toList()},
});
}