diff --git a/src/main/java/io/tarantool/driver/api/space/options/SelectOptions.java b/src/main/java/io/tarantool/driver/api/space/options/SelectOptions.java index c7c6815d..61e32862 100644 --- a/src/main/java/io/tarantool/driver/api/space/options/SelectOptions.java +++ b/src/main/java/io/tarantool/driver/api/space/options/SelectOptions.java @@ -4,6 +4,7 @@ import io.tarantool.driver.api.space.options.crud.OperationWithBucketIdOptions; import io.tarantool.driver.api.space.options.crud.OperationWithFieldsOptions; import io.tarantool.driver.api.space.options.crud.OperationWithModeOptions; +import io.tarantool.driver.api.space.options.crud.OperationWithPreferReplicaOptions; import io.tarantool.driver.api.space.options.crud.OperationWithTimeoutOptions; /** @@ -16,5 +17,5 @@ */ public interface SelectOptions> extends OperationWithBucketIdOptions, OperationWithTimeoutOptions, OperationWithFieldsOptions, - OperationWithModeOptions, OperationWithBatchSizeOptions { + OperationWithModeOptions, OperationWithBatchSizeOptions, OperationWithPreferReplicaOptions { } diff --git a/src/main/java/io/tarantool/driver/api/space/options/crud/OperationWithPreferReplicaOptions.java b/src/main/java/io/tarantool/driver/api/space/options/crud/OperationWithPreferReplicaOptions.java new file mode 100644 index 00000000..317cd050 --- /dev/null +++ b/src/main/java/io/tarantool/driver/api/space/options/crud/OperationWithPreferReplicaOptions.java @@ -0,0 +1,34 @@ +package io.tarantool.driver.api.space.options.crud; + +import java.util.Optional; + +import io.tarantool.driver.api.space.options.Options; +import io.tarantool.driver.api.space.options.Self; +import io.tarantool.driver.api.space.options.crud.enums.ProxyOption; + +/** + * Base interface for all operation options that may have a configurable "prefer_replica". + * + * @author Belonogov Nikolay + */ +public interface OperationWithPreferReplicaOptions> + extends Options, Self { + + /** + * Sets "prefer_replica" option value to true. If true then the preferred target is one of the replicas. + * Default value is false. + * + * @return this options instance. + */ + default T preferReplica() { + addOption(ProxyOption.PREFER_REPLICA, true); + return self(); + } + + /** + * @return "prefer_replica" option value. + */ + default Optional getPreferReplica() { + return getOption(ProxyOption.PREFER_REPLICA, Boolean.class); + } +} diff --git a/src/main/java/io/tarantool/driver/api/space/options/crud/enums/ProxyOption.java b/src/main/java/io/tarantool/driver/api/space/options/crud/enums/ProxyOption.java index c2b9de5f..e3a36cab 100644 --- a/src/main/java/io/tarantool/driver/api/space/options/crud/enums/ProxyOption.java +++ b/src/main/java/io/tarantool/driver/api/space/options/crud/enums/ProxyOption.java @@ -23,7 +23,9 @@ public enum ProxyOption { AFTER("after"), - FIRST("first"); + FIRST("first"), + + PREFER_REPLICA("prefer_replica"); private final String name; diff --git a/src/test/java/io/tarantool/driver/integration/proxy/options/ProxySpaceSelectOptionsIT.java b/src/test/java/io/tarantool/driver/integration/proxy/options/ProxySpaceSelectOptionsIT.java index 8c023dd7..227690e0 100644 --- a/src/test/java/io/tarantool/driver/integration/proxy/options/ProxySpaceSelectOptionsIT.java +++ b/src/test/java/io/tarantool/driver/integration/proxy/options/ProxySpaceSelectOptionsIT.java @@ -8,6 +8,7 @@ import io.tarantool.driver.api.space.options.SelectOptions; import io.tarantool.driver.api.space.TarantoolSpaceOperations; import io.tarantool.driver.api.space.options.ProxySelectOptions; +import io.tarantool.driver.api.space.options.crud.enums.ProxyOption; import io.tarantool.driver.api.tuple.DefaultTarantoolTupleFactory; import io.tarantool.driver.api.tuple.TarantoolTuple; import io.tarantool.driver.api.tuple.TarantoolTupleFactory; @@ -28,6 +29,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Artyom Dubinin @@ -174,4 +176,20 @@ public void withModeTest() throws ExecutionException, InterruptedException { crudSelectOpts = client.eval("return crud_select_opts").get(); assertEquals(Mode.WRITE.value(), ((HashMap) crudSelectOpts.get(0)).get("mode")); } + + @Test + public void withPreferReplicaTest() { + TarantoolSpaceOperations> operations = + client.space(TEST_SPACE_NAME); + + SelectOptions options = ProxySelectOptions.create().preferReplica(); + + assertTrue(options.getPreferReplica().isPresent()); + assertTrue(options.getPreferReplica().get()); + + operations.select(Conditions.any(), options).join(); + List crudSelectOpts = client.eval("return crud_select_opts").join(); + + assertEquals(true, ((HashMap) crudSelectOpts.get(0)).get(ProxyOption.PREFER_REPLICA.toString())); + } }