diff --git a/core/src/main/java/com/arangodb/model/AqlQueryOptions.java b/core/src/main/java/com/arangodb/model/AqlQueryOptions.java
index 59661c2a2..3aba96dd4 100644
--- a/core/src/main/java/com/arangodb/model/AqlQueryOptions.java
+++ b/core/src/main/java/com/arangodb/model/AqlQueryOptions.java
@@ -22,9 +22,7 @@
import com.arangodb.internal.serde.UserDataInside;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Map;
+import java.util.*;
/**
* @author Mark Vollmary
@@ -32,7 +30,7 @@
* @see API
* Documentation
*/
-public final class AqlQueryOptions {
+public final class AqlQueryOptions implements Cloneable {
private Boolean count;
private Integer ttl;
@@ -491,7 +489,19 @@ public AqlQueryOptions streamTransactionId(final String streamTransactionId) {
return this;
}
- public static final class Options {
+ @Override
+ public AqlQueryOptions clone() {
+ try {
+ AqlQueryOptions clone = (AqlQueryOptions) super.clone();
+ clone.bindVars = bindVars != null ? new HashMap<>(bindVars) : null;
+ clone.options = options != null ? options.clone() : null;
+ return clone;
+ } catch (CloneNotSupportedException e) {
+ throw new AssertionError();
+ }
+ }
+
+ public static final class Options implements Cloneable {
private Boolean failOnWarning;
private Boolean profile;
@@ -577,14 +587,36 @@ public Collection getShardIds() {
return shardIds;
}
+ @Override
+ public Options clone() {
+ try {
+ Options clone = (Options) super.clone();
+ clone.optimizer = optimizer != null ? optimizer.clone() : null;
+ clone.shardIds = shardIds != null ? new ArrayList<>(shardIds) : null;
+ return clone;
+ } catch (CloneNotSupportedException e) {
+ throw new AssertionError();
+ }
+ }
}
- public static final class Optimizer {
+ public static final class Optimizer implements Cloneable {
private Collection rules;
public Collection getRules() {
return rules;
}
+
+ @Override
+ public Optimizer clone() {
+ try {
+ Optimizer clone = (Optimizer) super.clone();
+ clone.rules = rules != null ? new ArrayList<>(rules) : null;
+ return clone;
+ } catch (CloneNotSupportedException e) {
+ throw new AssertionError();
+ }
+ }
}
}
diff --git a/driver/src/test/java/com/arangodb/model/AqlQueryOptionsTest.java b/driver/src/test/java/com/arangodb/model/AqlQueryOptionsTest.java
new file mode 100644
index 000000000..39e9c1c43
--- /dev/null
+++ b/driver/src/test/java/com/arangodb/model/AqlQueryOptionsTest.java
@@ -0,0 +1,31 @@
+package com.arangodb.model;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class AqlQueryOptionsTest {
+
+ @Test
+ void cloneable() {
+ List rules = Arrays.asList("foo", "bar");
+ AqlQueryOptions options = new AqlQueryOptions()
+ .cache(true)
+ .stream(true)
+ .rules(rules)
+ .shardIds("a", "b");
+ AqlQueryOptions clone = options.clone();
+ assertThat(clone.getCache()).isEqualTo(options.getCache());
+ assertThat(clone.getStream()).isEqualTo(options.getStream());
+ assertThat(clone.getRules())
+ .isEqualTo(options.getRules())
+ .isNotSameAs(options.getRules());
+ assertThat(clone.getShardIds())
+ .isEqualTo(options.getShardIds())
+ .isNotSameAs(options.getShardIds());
+ }
+
+}