From 017a5903dcabbfb48839ea2f19212e54636fd008 Mon Sep 17 00:00:00 2001 From: M Sazzadul Hoque <7600764+sazzad16@users.noreply.github.com> Date: Tue, 14 Jun 2022 16:04:11 +0600 Subject: [PATCH 1/2] Support TS.INCRBY and TS.DECRBY commands --- .../redis/clients/jedis/CommandObjects.java | 24 +++++++++-- .../redis/clients/jedis/UnifiedJedis.java | 20 +++++++++ .../timeseries/RedisTimeSeriesCommands.java | 8 ++++ .../modules/timeseries/TimeSeriesTest.java | 43 +++++++++---------- 4 files changed, 68 insertions(+), 27 deletions(-) diff --git a/src/main/java/redis/clients/jedis/CommandObjects.java b/src/main/java/redis/clients/jedis/CommandObjects.java index b8d33c3b8e..b4fa339496 100644 --- a/src/main/java/redis/clients/jedis/CommandObjects.java +++ b/src/main/java/redis/clients/jedis/CommandObjects.java @@ -3427,13 +3427,11 @@ public final CommandObject tsAlter(String key, TSAlterParams alterParams } public final CommandObject tsAdd(String key, double value) { - return new CommandObject<>(commandArguments(TimeSeriesCommand.ADD).key(key) - .add(Protocol.BYTES_ASTERISK).add(value), BuilderFactory.LONG); + return new CommandObject<>(commandArguments(TimeSeriesCommand.ADD).key(key).add(Protocol.BYTES_ASTERISK).add(value), BuilderFactory.LONG); } public final CommandObject tsAdd(String key, long timestamp, double value) { - return new CommandObject<>(commandArguments(TimeSeriesCommand.ADD).key(key) - .add(timestamp).add(value), BuilderFactory.LONG); + return new CommandObject<>(commandArguments(TimeSeriesCommand.ADD).key(key).add(timestamp).add(value), BuilderFactory.LONG); } public final CommandObject tsAdd(String key, long timestamp, double value, TSCreateParams createParams) { @@ -3449,6 +3447,24 @@ public final CommandObject> tsMAdd(Map.Entry... en return new CommandObject<>(args, BuilderFactory.LONG_LIST); } + public final CommandObject tsIncrBy(String key, double value) { + return new CommandObject<>(commandArguments(TimeSeriesCommand.INCRBY).key(key).add(value), BuilderFactory.LONG); + } + + public final CommandObject tsIncrBy(String key, double value, long timestamp) { + return new CommandObject<>(commandArguments(TimeSeriesCommand.INCRBY).key(key).add(value) + .add(TimeSeriesKeyword.TIMESTAMP).add(timestamp), BuilderFactory.LONG); + } + + public final CommandObject tsDecrBy(String key, double value) { + return new CommandObject<>(commandArguments(TimeSeriesCommand.DECRBY).key(key).add(value), BuilderFactory.LONG); + } + + public final CommandObject tsDecrBy(String key, double value, long timestamp) { + return new CommandObject<>(commandArguments(TimeSeriesCommand.DECRBY).key(key).add(value) + .add(TimeSeriesKeyword.TIMESTAMP).add(timestamp), BuilderFactory.LONG); + } + public final CommandObject> tsRange(String key, long fromTimestamp, long toTimestamp) { return new CommandObject<>(commandArguments(TimeSeriesCommand.RANGE).key(key) .add(fromTimestamp).add(toTimestamp), BuilderFactory.TIMESERIES_ELEMENT_LIST); diff --git a/src/main/java/redis/clients/jedis/UnifiedJedis.java b/src/main/java/redis/clients/jedis/UnifiedJedis.java index 47d81013a9..26998f6097 100644 --- a/src/main/java/redis/clients/jedis/UnifiedJedis.java +++ b/src/main/java/redis/clients/jedis/UnifiedJedis.java @@ -3861,6 +3861,26 @@ public List tsMAdd(Map.Entry... entries) { return executeCommand(commandObjects.tsMAdd(entries)); } + @Override + public long tsIncrBy(String key, double value) { + return executeCommand(commandObjects.tsIncrBy(key, value)); + } + + @Override + public long tsIncrBy(String key, double value, long timestamp) { + return executeCommand(commandObjects.tsIncrBy(key, value, timestamp)); + } + + @Override + public long tsDecrBy(String key, double value) { + return executeCommand(commandObjects.tsDecrBy(key, value)); + } + + @Override + public long tsDecrBy(String key, double value, long timestamp) { + return executeCommand(commandObjects.tsDecrBy(key, value, timestamp)); + } + @Override public List tsRange(String key, long fromTimestamp, long toTimestamp) { return executeCommand(commandObjects.tsRange(key, fromTimestamp, toTimestamp)); diff --git a/src/main/java/redis/clients/jedis/timeseries/RedisTimeSeriesCommands.java b/src/main/java/redis/clients/jedis/timeseries/RedisTimeSeriesCommands.java index 13c0d9c966..b5fca662e7 100644 --- a/src/main/java/redis/clients/jedis/timeseries/RedisTimeSeriesCommands.java +++ b/src/main/java/redis/clients/jedis/timeseries/RedisTimeSeriesCommands.java @@ -77,6 +77,14 @@ public interface RedisTimeSeriesCommands { */ List tsMAdd(Map.Entry... entries); + long tsIncrBy(String key, double value); + + long tsIncrBy(String key, double value, long timestamp); + + long tsDecrBy(String key, double value); + + long tsDecrBy(String key, double value, long timestamp); + /** * {@code TS.RANGE key fromTimestamp toTimestamp} * diff --git a/src/test/java/redis/clients/jedis/modules/timeseries/TimeSeriesTest.java b/src/test/java/redis/clients/jedis/modules/timeseries/TimeSeriesTest.java index 1fa683c920..444468fc5d 100644 --- a/src/test/java/redis/clients/jedis/modules/timeseries/TimeSeriesTest.java +++ b/src/test/java/redis/clients/jedis/modules/timeseries/TimeSeriesTest.java @@ -355,29 +355,26 @@ public void testMadd() { assertEquals(3.2, values2.get(0).getValue(), 0.001); assertEquals(54.2, values2.get(1).getValue(), 0.001); } -// -// @Test -// public void testIncrByDecrBy() throws InterruptedException { -// assertEquals("OK", client.tsCreate("seriesIncDec", 100 * 1000 /*100sec retentionTime*/)); -// assertEquals(1L, client.tsAdd("seriesIncDec", 1L, 1, 10000, null), 0); -// assertEquals(2L, client.incrBy("seriesIncDec", 3, 2L), 0); -// assertEquals(3L, client.decrBy("seriesIncDec", 2, 3L), 0); -// List values = client.tsRange("seriesIncDec", 1L, 3L); -// assertEquals(3, values.size()); -// assertEquals(2, values[2].getValue(), 0); -// if (moduleVersion >= 10400) { -// assertEquals(3L, client.decrBy("seriesIncDec", 2, 3L), 0); -// values = client.tsRange("seriesIncDec", 1L, Long.MAX_VALUE); -// assertEquals(3, values.size()); -// } else { -// try { -// client.incrBy("seriesIncDec", 3, 0L); -// fail(); -// } catch (JedisDataException e) { -// // Error on incrby in the past -// } -// } -// } + + @Test + public void testIncrByDecrBy() throws InterruptedException { + assertEquals("OK", client.tsCreate("seriesIncDec", + TSCreateParams.createParams().retention(100 * 1000 /*100 sec*/))); + + assertEquals(1L, client.tsAdd("seriesIncDec", 1L, 1), 0); + assertEquals(2L, client.tsIncrBy("seriesIncDec", 3, 2L), 0); + assertEquals(3L, client.tsDecrBy("seriesIncDec", 2, 3L), 0); + List values = client.tsRange("seriesIncDec", 1L, 3L); + assertEquals(3, values.size()); + assertEquals(2, values.get(2).getValue(), 0); + + assertEquals(3L, client.tsDecrBy("seriesIncDec", 2, 3L), 0); + values = client.tsRange("seriesIncDec", 1L, Long.MAX_VALUE); + assertEquals(3, values.size()); + + client.tsIncrBy("seriesIncDec", 100); + client.tsDecrBy("seriesIncDec", 33); + } @Test public void align() { From 92fb4e51cf4d057f0891093ed5836f602d134834 Mon Sep 17 00:00:00 2001 From: M Sazzadul Hoque <7600764+sazzad16@users.noreply.github.com> Date: Tue, 14 Jun 2022 16:09:59 +0600 Subject: [PATCH 2/2] Pipeline TS.INCRBY and TS.DECRBY commands --- .../clients/jedis/MultiNodePipelineBase.java | 20 +++++++++++++++++++ .../java/redis/clients/jedis/Pipeline.java | 20 +++++++++++++++++++ .../redis/clients/jedis/TransactionBase.java | 20 +++++++++++++++++++ .../RedisTimeSeriesPipelineCommands.java | 8 ++++++++ 4 files changed, 68 insertions(+) diff --git a/src/main/java/redis/clients/jedis/MultiNodePipelineBase.java b/src/main/java/redis/clients/jedis/MultiNodePipelineBase.java index da1e236b55..1b6065c16a 100644 --- a/src/main/java/redis/clients/jedis/MultiNodePipelineBase.java +++ b/src/main/java/redis/clients/jedis/MultiNodePipelineBase.java @@ -3720,6 +3720,26 @@ public Response> tsMAdd(Map.Entry... entries) { return appendCommand(commandObjects.tsMAdd(entries)); } + @Override + public Response tsIncrBy(String key, double value) { + return appendCommand(commandObjects.tsIncrBy(key, value)); + } + + @Override + public Response tsIncrBy(String key, double value, long timestamp) { + return appendCommand(commandObjects.tsIncrBy(key, value, timestamp)); + } + + @Override + public Response tsDecrBy(String key, double value) { + return appendCommand(commandObjects.tsDecrBy(key, value)); + } + + @Override + public Response tsDecrBy(String key, double value, long timestamp) { + return appendCommand(commandObjects.tsDecrBy(key, value, timestamp)); + } + @Override public Response> tsRange(String key, long fromTimestamp, long toTimestamp) { return appendCommand(commandObjects.tsRange(key, fromTimestamp, toTimestamp)); diff --git a/src/main/java/redis/clients/jedis/Pipeline.java b/src/main/java/redis/clients/jedis/Pipeline.java index 9827317309..2b0bbc34c2 100644 --- a/src/main/java/redis/clients/jedis/Pipeline.java +++ b/src/main/java/redis/clients/jedis/Pipeline.java @@ -3722,6 +3722,26 @@ public Response> tsMAdd(Map.Entry... entries) { return appendCommand(commandObjects.tsMAdd(entries)); } + @Override + public Response tsIncrBy(String key, double value) { + return appendCommand(commandObjects.tsIncrBy(key, value)); + } + + @Override + public Response tsIncrBy(String key, double value, long timestamp) { + return appendCommand(commandObjects.tsIncrBy(key, value, timestamp)); + } + + @Override + public Response tsDecrBy(String key, double value) { + return appendCommand(commandObjects.tsDecrBy(key, value)); + } + + @Override + public Response tsDecrBy(String key, double value, long timestamp) { + return appendCommand(commandObjects.tsDecrBy(key, value, timestamp)); + } + @Override public Response> tsRange(String key, long fromTimestamp, long toTimestamp) { return appendCommand(commandObjects.tsRange(key, fromTimestamp, toTimestamp)); diff --git a/src/main/java/redis/clients/jedis/TransactionBase.java b/src/main/java/redis/clients/jedis/TransactionBase.java index 3f12bb0acd..d74fa095db 100644 --- a/src/main/java/redis/clients/jedis/TransactionBase.java +++ b/src/main/java/redis/clients/jedis/TransactionBase.java @@ -3790,6 +3790,26 @@ public Response> tsMAdd(Map.Entry... entries) { return appendCommand(commandObjects.tsMAdd(entries)); } + @Override + public Response tsIncrBy(String key, double value) { + return appendCommand(commandObjects.tsIncrBy(key, value)); + } + + @Override + public Response tsIncrBy(String key, double value, long timestamp) { + return appendCommand(commandObjects.tsIncrBy(key, value, timestamp)); + } + + @Override + public Response tsDecrBy(String key, double value) { + return appendCommand(commandObjects.tsDecrBy(key, value)); + } + + @Override + public Response tsDecrBy(String key, double value, long timestamp) { + return appendCommand(commandObjects.tsDecrBy(key, value, timestamp)); + } + @Override public Response> tsRange(String key, long fromTimestamp, long toTimestamp) { return appendCommand(commandObjects.tsRange(key, fromTimestamp, toTimestamp)); diff --git a/src/main/java/redis/clients/jedis/timeseries/RedisTimeSeriesPipelineCommands.java b/src/main/java/redis/clients/jedis/timeseries/RedisTimeSeriesPipelineCommands.java index 6c241a7332..bb52df1766 100644 --- a/src/main/java/redis/clients/jedis/timeseries/RedisTimeSeriesPipelineCommands.java +++ b/src/main/java/redis/clients/jedis/timeseries/RedisTimeSeriesPipelineCommands.java @@ -22,6 +22,14 @@ public interface RedisTimeSeriesPipelineCommands { Response> tsMAdd(Map.Entry... entries); + Response tsIncrBy(String key, double value); + + Response tsIncrBy(String key, double value, long timestamp); + + Response tsDecrBy(String key, double value); + + Response tsDecrBy(String key, double value, long timestamp); + Response> tsRange(String key, long fromTimestamp, long toTimestamp); Response> tsRange(String key, TSRangeParams rangeParams);