Skip to content

Commit 6b7445d

Browse files
committed
fix cloning in AbstractMergeElementStepPlaceholder
1 parent 9b292c6 commit 6b7445d

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,39 @@ protected Traverser.Admin<E> processNextStart() throws NoSuchElementException {
6767

6868
@Override
6969
public AbstractMergeElementStepPlaceholder<S, E> clone() {
70-
return (AbstractMergeElementStepPlaceholder<S, E>) super.clone();
70+
AbstractMergeElementStepPlaceholder<S, E> clone = (AbstractMergeElementStepPlaceholder<S, E>) super.clone();
71+
if (mergeTraversal != null){
72+
clone.setMerge(mergeTraversal.clone());
73+
}
74+
if (onMatchTraversal != null) {
75+
clone.setOnMatch(onMatchTraversal.clone());
76+
}
77+
if (onCreateTraversal != null) {
78+
clone.setOnCreate(onCreateTraversal.clone());
79+
}
80+
81+
// deep clone properties
82+
clone.properties = new HashMap<>();
83+
for (Map.Entry<Object, List<Object>> entry : this.properties.entrySet()) {
84+
final Object key = entry.getKey();
85+
final List<Object> oldValues = entry.getValue();
86+
final List<Object> newValues = new ArrayList<>(oldValues.size());
87+
for (Object v : oldValues) {
88+
if (v instanceof Traversal) {
89+
newValues.add(((Traversal<?, ?>) v).asAdmin().clone());
90+
} else if (v instanceof GValue) {
91+
try {
92+
newValues.add(((GValue) v).clone());
93+
} catch (CloneNotSupportedException e) {
94+
throw new RuntimeException(e);
95+
}
96+
} else {
97+
newValues.add(v);
98+
}
99+
}
100+
clone.properties.put(key, newValues);
101+
}
102+
return clone;
71103
}
72104

73105
@Override

0 commit comments

Comments
 (0)