From 6661d4b4d4c818a8f06e5e9baa1a30ed51452f99 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Tue, 16 May 2023 23:04:39 +0200 Subject: [PATCH] made AqlQueryOptions cloneable --- .../com/arangodb/model/AqlQueryOptions.java | 44 ++++++++++++++++--- .../arangodb/model/AqlQueryOptionsTest.java | 31 +++++++++++++ 2 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 driver/src/test/java/com/arangodb/model/AqlQueryOptionsTest.java 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()); + } + +}