diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index 5f1a95a8e3..f5ca153207 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -27,6 +27,7 @@ import redis.clients.jedis.Protocol.Keyword; import redis.clients.jedis.params.ClientKillParams; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.GetExParams; @@ -1312,14 +1313,17 @@ public void geoadd(final byte[] key, final double longitude, final double latitu } public void geoadd(final byte[] key, final Map memberCoordinateMap) { - List args = new ArrayList<>(memberCoordinateMap.size() * 3 + 1); - args.add(key); + geoadd(key, GeoAddParams.geoAddParams(), memberCoordinateMap); + } + + public void geoadd(final byte[] key, final GeoAddParams params, final Map memberCoordinateMap) { + List args = new ArrayList<>(memberCoordinateMap.size() * 3); args.addAll(convertGeoCoordinateMapToByteArrays(memberCoordinateMap)); byte[][] argsArray = new byte[args.size()][]; args.toArray(argsArray); - sendCommand(GEOADD, argsArray); + sendCommand(GEOADD, params.getByteParams(key, argsArray)); } public void geodist(final byte[] key, final byte[] member1, final byte[] member2) { diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index 3b8c06ef76..ffe4c02460 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -30,6 +30,7 @@ import redis.clients.jedis.exceptions.JedisDataException; import redis.clients.jedis.exceptions.JedisException; import redis.clients.jedis.params.ClientKillParams; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.GetExParams; @@ -4170,6 +4171,13 @@ public Long geoadd(final byte[] key, final Map memberCoor return client.getIntegerReply(); } + @Override + public Long geoadd(final byte[] key, final GeoAddParams params, final Map memberCoordinateMap) { + checkIsInMultiOrPipeline(); + client.geoadd(key, params, memberCoordinateMap); + return client.getIntegerReply(); + } + @Override public Double geodist(final byte[] key, final byte[] member1, final byte[] member2) { checkIsInMultiOrPipeline(); diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java index 65c23c2685..389d20384d 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java @@ -4,6 +4,7 @@ import redis.clients.jedis.commands.JedisClusterBinaryScriptingCommands; import redis.clients.jedis.commands.MultiKeyBinaryJedisClusterCommands; import redis.clients.jedis.commands.ProtocolCommand; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.GetExParams; @@ -1988,6 +1989,16 @@ public Long execute(Jedis connection) { }.runBinary(key); } + @Override + public Long geoadd(byte[] key, GeoAddParams params, Map memberCoordinateMap) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { + @Override + public Long execute(Jedis connection) { + return connection.geoadd(key, params, memberCoordinateMap); + } + }.runBinary(key); + } + @Override public Double geodist(final byte[] key, final byte[] member1, final byte[] member2) { return new JedisClusterCommand(connectionHandler, maxAttempts) { diff --git a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java index 6cab2e15f7..42e9b492ed 100644 --- a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java @@ -10,6 +10,7 @@ import redis.clients.jedis.commands.BinaryJedisCommands; import redis.clients.jedis.commands.ProtocolCommand; import redis.clients.jedis.exceptions.JedisConnectionException; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GetExParams; import redis.clients.jedis.params.SetParams; @@ -946,6 +947,12 @@ public Long geoadd(final byte[] key, final Map memberCoor return j.geoadd(key, memberCoordinateMap); } + @Override + public Long geoadd(byte[] key, GeoAddParams params, Map memberCoordinateMap) { + Jedis j = getShard(key); + return j.geoadd(key, params, memberCoordinateMap); + } + @Override public Double geodist(final byte[] key, final byte[] member1, final byte[] member2) { Jedis j = getShard(key); diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index 695cef17fb..5ade2cff2a 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -14,6 +14,7 @@ import javax.net.ssl.SSLSocketFactory; import redis.clients.jedis.commands.Commands; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.GetExParams; @@ -1181,6 +1182,10 @@ public void geoadd(final String key, final Map memberCoor geoadd(SafeEncoder.encode(key), convertMemberCoordinateMapToBinary(memberCoordinateMap)); } + public void geoadd(final String key, final GeoAddParams params, final Map memberCoordinateMap) { + geoadd(SafeEncoder.encode(key), params, convertMemberCoordinateMapToBinary(memberCoordinateMap)); + } + public void geodist(final String key, final String member1, final String member2) { geodist(SafeEncoder.encode(key), SafeEncoder.encode(member1), SafeEncoder.encode(member2)); } diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 046c9d2ce1..24ad5cf8d6 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -22,6 +22,7 @@ import redis.clients.jedis.commands.ProtocolCommand; import redis.clients.jedis.commands.ScriptingCommands; import redis.clients.jedis.commands.SentinelCommands; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.GetExParams; @@ -3709,6 +3710,13 @@ public Long geoadd(final String key, final Map memberCoor return client.getIntegerReply(); } + @Override + public Long geoadd(final String key, final GeoAddParams params, final Map memberCoordinateMap) { + checkIsInMultiOrPipeline(); + client.geoadd(key, params, memberCoordinateMap); + return client.getIntegerReply(); + } + @Override public Double geodist(final String key, final String member1, final String member2) { checkIsInMultiOrPipeline(); diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index 9c246cfbed..e0258c6ba7 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -1,6 +1,7 @@ package redis.clients.jedis; import redis.clients.jedis.commands.ProtocolCommand; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.params.GetExParams; @@ -2178,6 +2179,16 @@ public Long execute(Jedis connection) { }.run(key); } + @Override + public Long geoadd(String key, GeoAddParams params, Map memberCoordinateMap) { + return new JedisClusterCommand(connectionHandler, maxAttempts) { + @Override + public Long execute(Jedis connection) { + return connection.geoadd(key, params, memberCoordinateMap); + } + }.run(key); + } + @Override public Double geodist(final String key, final String member1, final String member2) { return new JedisClusterCommand(connectionHandler, maxAttempts) { diff --git a/src/main/java/redis/clients/jedis/PipelineBase.java b/src/main/java/redis/clients/jedis/PipelineBase.java index a47ffaca7c..3c71caa4b3 100644 --- a/src/main/java/redis/clients/jedis/PipelineBase.java +++ b/src/main/java/redis/clients/jedis/PipelineBase.java @@ -7,6 +7,7 @@ import redis.clients.jedis.commands.BinaryRedisPipeline; import redis.clients.jedis.commands.ProtocolCommand; import redis.clients.jedis.commands.RedisPipeline; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GetExParams; import redis.clients.jedis.params.SetParams; @@ -1814,6 +1815,18 @@ public Response geoadd(final String key, return getResponse(BuilderFactory.LONG); } + @Override + public Response geoadd(String key, GeoAddParams params, Map memberCoordinateMap) { + getClient(key).geoadd(key, params, memberCoordinateMap); + return getResponse(BuilderFactory.LONG); + } + + @Override + public Response geoadd(byte[] key, GeoAddParams params, Map memberCoordinateMap) { + getClient(key).geoadd(key, params, memberCoordinateMap); + return getResponse(BuilderFactory.LONG); + } + @Override public Response geodist(final byte[] key, final byte[] member1, final byte[] member2) { getClient(key).geodist(key, member1, member2); diff --git a/src/main/java/redis/clients/jedis/ShardedJedis.java b/src/main/java/redis/clients/jedis/ShardedJedis.java index 63a28bd029..24d388aaeb 100644 --- a/src/main/java/redis/clients/jedis/ShardedJedis.java +++ b/src/main/java/redis/clients/jedis/ShardedJedis.java @@ -9,6 +9,7 @@ import redis.clients.jedis.commands.JedisCommands; import redis.clients.jedis.commands.ProtocolCommand; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GetExParams; import redis.clients.jedis.params.SetParams; @@ -973,6 +974,12 @@ public Long geoadd(final String key, final Map memberCoor return j.geoadd(key, memberCoordinateMap); } + @Override + public Long geoadd(String key, GeoAddParams params, Map memberCoordinateMap) { + Jedis j = getShard(key); + return j.geoadd(key, params, memberCoordinateMap); + } + @Override public Double geodist(final String key, final String member1, final String member2) { Jedis j = getShard(key); diff --git a/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java index b23e978fa5..e52e2851ad 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java @@ -8,6 +8,7 @@ import redis.clients.jedis.ScanResult; import redis.clients.jedis.SortingParams; import redis.clients.jedis.Tuple; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GetExParams; import redis.clients.jedis.params.SetParams; @@ -308,6 +309,8 @@ default String setex(byte[] key, int seconds, byte[] value) { Long geoadd(byte[] key, Map memberCoordinateMap); + Long geoadd(byte[] key, GeoAddParams params, Map memberCoordinateMap); + Double geodist(byte[] key, byte[] member1, byte[] member2); Double geodist(byte[] key, byte[] member1, byte[] member2, GeoUnit unit); diff --git a/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java b/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java index 4db2d029e9..3df3e6b3a6 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java @@ -15,6 +15,7 @@ import redis.clients.jedis.StreamGroupInfo; import redis.clients.jedis.StreamInfo; import redis.clients.jedis.Tuple; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GetExParams; import redis.clients.jedis.params.SetParams; @@ -334,6 +335,8 @@ default String setex(byte[] key, int seconds, byte[] value) { Long geoadd(byte[] key, Map memberCoordinateMap); + Long geoadd(byte[] key, GeoAddParams params, Map memberCoordinateMap); + Double geodist(byte[] key, byte[] member1, byte[] member2); Double geodist(byte[] key, byte[] member1, byte[] member2, GeoUnit unit); diff --git a/src/main/java/redis/clients/jedis/commands/BinaryRedisPipeline.java b/src/main/java/redis/clients/jedis/commands/BinaryRedisPipeline.java index ae02efb863..c368d36d2c 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryRedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryRedisPipeline.java @@ -9,6 +9,7 @@ import redis.clients.jedis.Response; import redis.clients.jedis.SortingParams; import redis.clients.jedis.Tuple; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GetExParams; import redis.clients.jedis.params.SetParams; @@ -325,6 +326,8 @@ default Response restoreReplace(byte[] key, int ttl, byte[] serializedVa Response geoadd(byte[] key, Map memberCoordinateMap); + Response geoadd(byte[] key, GeoAddParams params, Map memberCoordinateMap); + Response geodist(byte[] key, byte[] member1, byte[] member2); Response geodist(byte[] key, byte[] member1, byte[] member2, GeoUnit unit); diff --git a/src/main/java/redis/clients/jedis/commands/JedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/JedisClusterCommands.java index 05a51ab7c1..0e6b9232ef 100644 --- a/src/main/java/redis/clients/jedis/commands/JedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/JedisClusterCommands.java @@ -12,6 +12,7 @@ import redis.clients.jedis.StreamEntry; import redis.clients.jedis.StreamPendingSummary; import redis.clients.jedis.Tuple; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GetExParams; import redis.clients.jedis.params.SetParams; @@ -330,6 +331,8 @@ default String setex(String key, int seconds, String value) { Long geoadd(String key, Map memberCoordinateMap); + Long geoadd(String key, GeoAddParams params, Map memberCoordinateMap); + Double geodist(String key, String member1, String member2); Double geodist(String key, String member1, String member2, GeoUnit unit); diff --git a/src/main/java/redis/clients/jedis/commands/JedisCommands.java b/src/main/java/redis/clients/jedis/commands/JedisCommands.java index eb661ac284..6f74f83bc0 100644 --- a/src/main/java/redis/clients/jedis/commands/JedisCommands.java +++ b/src/main/java/redis/clients/jedis/commands/JedisCommands.java @@ -20,6 +20,7 @@ import redis.clients.jedis.StreamEntry; import redis.clients.jedis.StreamPendingSummary; import redis.clients.jedis.Tuple; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GetExParams; import redis.clients.jedis.params.SetParams; @@ -360,6 +361,8 @@ default String setex(String key, int seconds, String value) { Long geoadd(String key, Map memberCoordinateMap); + Long geoadd(String key, GeoAddParams params, Map memberCoordinateMap); + Double geodist(String key, String member1, String member2); Double geodist(String key, String member1, String member2, GeoUnit unit); diff --git a/src/main/java/redis/clients/jedis/commands/RedisPipeline.java b/src/main/java/redis/clients/jedis/commands/RedisPipeline.java index e3422b51f4..64317c48dd 100644 --- a/src/main/java/redis/clients/jedis/commands/RedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/RedisPipeline.java @@ -12,6 +12,7 @@ import redis.clients.jedis.StreamEntry; import redis.clients.jedis.StreamPendingSummary; import redis.clients.jedis.Tuple; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GetExParams; import redis.clients.jedis.params.SetParams; @@ -328,6 +329,8 @@ default Response restoreReplace(String key, int ttl, byte[] serializedVa Response geoadd(String key, Map memberCoordinateMap); + Response geoadd(String key, GeoAddParams params, Map memberCoordinateMap); + Response geodist(String key, String member1, String member2); Response geodist(String key, String member1, String member2, GeoUnit unit); diff --git a/src/main/java/redis/clients/jedis/params/GeoAddParams.java b/src/main/java/redis/clients/jedis/params/GeoAddParams.java new file mode 100644 index 0000000000..c9290a14dc --- /dev/null +++ b/src/main/java/redis/clients/jedis/params/GeoAddParams.java @@ -0,0 +1,69 @@ +package redis.clients.jedis.params; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import redis.clients.jedis.util.SafeEncoder; + +public class GeoAddParams extends Params { + + private static final String NX = "nx"; + private static final String XX = "xx"; + private static final String CH = "ch"; + + public GeoAddParams() { + } + + public static GeoAddParams geoAddParams() { + return new GeoAddParams(); + } + + /** + * Don't update already existing elements. Always add new elements. + * @return GetExParams + */ + public GeoAddParams nx() { + addParam(NX); + return this; + } + + /** + * Only update elements that already exist. Never add elements. + * @return GetExParams + */ + public GeoAddParams xx() { + addParam(XX); + return this; + } + + /** + * Modify the return value from the number of new elements added, to the total number of elements + * changed + * @return GetExParams + */ + public GeoAddParams ch() { + addParam(CH); + return this; + } + + public byte[][] getByteParams(byte[] key, byte[]... args) { + List byteParams = new ArrayList<>(); + byteParams.add(key); + + if (contains(NX)) { + byteParams.add(SafeEncoder.encode(NX)); + } else if (contains(XX)) { + byteParams.add(SafeEncoder.encode(XX)); + } + + if (contains(CH)) { + byteParams.add(SafeEncoder.encode(CH)); + } + + Collections.addAll(byteParams, args); + + return byteParams.toArray(new byte[byteParams.size()][]); + } + +} diff --git a/src/test/java/redis/clients/jedis/tests/commands/GeoCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/GeoCommandsTest.java index e26161b04e..0d55fd3a90 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/GeoCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/GeoCommandsTest.java @@ -17,6 +17,7 @@ import redis.clients.jedis.GeoCoordinate; import redis.clients.jedis.GeoRadiusResponse; import redis.clients.jedis.GeoUnit; +import redis.clients.jedis.params.GeoAddParams; import redis.clients.jedis.params.GeoRadiusParam; import redis.clients.jedis.params.GeoRadiusStoreParam; import redis.clients.jedis.util.SafeEncoder; @@ -59,6 +60,36 @@ public void geoadd() { assertEquals(2, size); } + @Test + public void geoaddWithParams() { + assertEquals(1, jedis.geoadd("foo", 1, 2, "a").longValue()); + + Map coordinateMap = new HashMap<>(); + coordinateMap.put("a", new GeoCoordinate(3, 4)); + assertEquals(0, jedis.geoadd("foo", GeoAddParams.geoAddParams().nx(), coordinateMap).longValue()); + assertEquals(1, jedis.geoadd("foo", GeoAddParams.geoAddParams().xx().ch(), coordinateMap).longValue()); + + coordinateMap.clear(); + coordinateMap.put("b", new GeoCoordinate(6, 7)); + // never add elements. + assertEquals(0, jedis.geoadd("foo", GeoAddParams.geoAddParams().xx(), coordinateMap).longValue()); + assertEquals(1, jedis.geoadd("foo", GeoAddParams.geoAddParams().nx(), coordinateMap).longValue()); + + // binary + assertEquals(1, jedis.geoadd(bfoo, 1, 2, bA).longValue()); + + Map bcoordinateMap = new HashMap<>(); + bcoordinateMap.put(bA, new GeoCoordinate(3, 4)); + assertEquals(0, jedis.geoadd(bfoo, GeoAddParams.geoAddParams().nx(), bcoordinateMap).longValue()); + assertEquals(1, jedis.geoadd(bfoo, GeoAddParams.geoAddParams().xx().ch(), bcoordinateMap).longValue()); + + bcoordinateMap.clear(); + bcoordinateMap.put(bB, new GeoCoordinate(6, 7)); + // never add elements. + assertEquals(0, jedis.geoadd(bfoo, GeoAddParams.geoAddParams().xx(), bcoordinateMap).longValue()); + assertEquals(1, jedis.geoadd(bfoo, GeoAddParams.geoAddParams().nx(), bcoordinateMap).longValue()); + } + @Test public void geodist() { prepareGeoData();