Skip to content

Commit ac18fd0

Browse files
committed
Support IGNORE and other optional arguments for timeseries commands (#3860)
* Re-implement TS.ADD command with optional arguments * Implement TS.INCRBY and TS.DECRBY commands with optional arguments * Support IGNORE argument for TS.[ CREATE | ALTER | ADD | INCRBY | DECRBY] commands --- * Cover optional arguments for timeseries commands - Re-implement TS.ADD command with optional arguments - Implement TS.INCRBY and TS.DECRBY commands with optional arguments * Introduce EncodingFormat enum for <COMPRESSED|UNCOMPRESSED> * Support IGNORE option and rename to TSIncrOrDecrByParams
1 parent ef79d54 commit ac18fd0

14 files changed

+600
-37
lines changed

src/main/java/redis/clients/jedis/CommandObjects.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3946,9 +3946,15 @@ public final CommandObject<Long> tsAdd(String key, long timestamp, double value)
39463946
return new CommandObject<>(commandArguments(TimeSeriesCommand.ADD).key(key).add(timestamp).add(value), BuilderFactory.LONG);
39473947
}
39483948

3949+
@Deprecated
39493950
public final CommandObject<Long> tsAdd(String key, long timestamp, double value, TSCreateParams createParams) {
3950-
return new CommandObject<>(commandArguments(TimeSeriesCommand.ADD).key(key)
3951-
.add(timestamp).add(value).addParams(createParams), BuilderFactory.LONG);
3951+
return new CommandObject<>(commandArguments(TimeSeriesCommand.ADD).key(key).add(timestamp).add(value)
3952+
.addParams(createParams), BuilderFactory.LONG);
3953+
}
3954+
3955+
public final CommandObject<Long> tsAdd(String key, long timestamp, double value, TSAddParams addParams) {
3956+
return new CommandObject<>(commandArguments(TimeSeriesCommand.ADD).key(key).add(timestamp).add(value)
3957+
.addParams(addParams), BuilderFactory.LONG);
39523958
}
39533959

39543960
public final CommandObject<List<Long>> tsMAdd(Map.Entry<String, TSElement>... entries) {
@@ -3968,6 +3974,11 @@ public final CommandObject<Long> tsIncrBy(String key, double value, long timesta
39683974
.add(TimeSeriesKeyword.TIMESTAMP).add(timestamp), BuilderFactory.LONG);
39693975
}
39703976

3977+
public final CommandObject<Long> tsIncrBy(String key, double addend, TSIncrOrDecrByParams incrByParams) {
3978+
return new CommandObject<>(commandArguments(TimeSeriesCommand.INCRBY).key(key).add(addend)
3979+
.addParams(incrByParams), BuilderFactory.LONG);
3980+
}
3981+
39713982
public final CommandObject<Long> tsDecrBy(String key, double value) {
39723983
return new CommandObject<>(commandArguments(TimeSeriesCommand.DECRBY).key(key).add(value), BuilderFactory.LONG);
39733984
}
@@ -3977,6 +3988,11 @@ public final CommandObject<Long> tsDecrBy(String key, double value, long timesta
39773988
.add(TimeSeriesKeyword.TIMESTAMP).add(timestamp), BuilderFactory.LONG);
39783989
}
39793990

3991+
public final CommandObject<Long> tsDecrBy(String key, double subtrahend, TSIncrOrDecrByParams decrByParams) {
3992+
return new CommandObject<>(commandArguments(TimeSeriesCommand.DECRBY).key(key).add(subtrahend)
3993+
.addParams(decrByParams), BuilderFactory.LONG);
3994+
}
3995+
39803996
public final CommandObject<List<TSElement>> tsRange(String key, long fromTimestamp, long toTimestamp) {
39813997
return new CommandObject<>(commandArguments(TimeSeriesCommand.RANGE).key(key)
39823998
.add(fromTimestamp).add(toTimestamp), TimeSeriesBuilderFactory.TIMESERIES_ELEMENT_LIST);

src/main/java/redis/clients/jedis/PipeliningBase.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3948,6 +3948,11 @@ public Response<Long> tsAdd(String key, long timestamp, double value, TSCreatePa
39483948
return appendCommand(commandObjects.tsAdd(key, timestamp, value, createParams));
39493949
}
39503950

3951+
@Override
3952+
public Response<Long> tsAdd(String key, long timestamp, double value, TSAddParams addParams) {
3953+
return appendCommand(commandObjects.tsAdd(key, timestamp, value, addParams));
3954+
}
3955+
39513956
@Override
39523957
public Response<List<Long>> tsMAdd(Map.Entry<String, TSElement>... entries) {
39533958
return appendCommand(commandObjects.tsMAdd(entries));
@@ -3963,6 +3968,11 @@ public Response<Long> tsIncrBy(String key, double value, long timestamp) {
39633968
return appendCommand(commandObjects.tsIncrBy(key, value, timestamp));
39643969
}
39653970

3971+
@Override
3972+
public Response<Long> tsIncrBy(String key, double addend, TSIncrOrDecrByParams incrByParams) {
3973+
return appendCommand(commandObjects.tsIncrBy(key, addend, incrByParams));
3974+
}
3975+
39663976
@Override
39673977
public Response<Long> tsDecrBy(String key, double value) {
39683978
return appendCommand(commandObjects.tsDecrBy(key, value));
@@ -3973,6 +3983,11 @@ public Response<Long> tsDecrBy(String key, double value, long timestamp) {
39733983
return appendCommand(commandObjects.tsDecrBy(key, value, timestamp));
39743984
}
39753985

3986+
@Override
3987+
public Response<Long> tsDecrBy(String key, double subtrahend, TSIncrOrDecrByParams decrByParams) {
3988+
return appendCommand(commandObjects.tsDecrBy(key, subtrahend, decrByParams));
3989+
}
3990+
39763991
@Override
39773992
public Response<List<TSElement>> tsRange(String key, long fromTimestamp, long toTimestamp) {
39783993
return appendCommand(commandObjects.tsRange(key, fromTimestamp, toTimestamp));

src/main/java/redis/clients/jedis/UnifiedJedis.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4513,6 +4513,11 @@ public long tsAdd(String key, long timestamp, double value, TSCreateParams creat
45134513
return executeCommand(commandObjects.tsAdd(key, timestamp, value, createParams));
45144514
}
45154515

4516+
@Override
4517+
public long tsAdd(String key, long timestamp, double value, TSAddParams addParams) {
4518+
return executeCommand(commandObjects.tsAdd(key, timestamp, value, addParams));
4519+
}
4520+
45164521
@Override
45174522
public List<Long> tsMAdd(Map.Entry<String, TSElement>... entries) {
45184523
return executeCommand(commandObjects.tsMAdd(entries));
@@ -4528,6 +4533,11 @@ public long tsIncrBy(String key, double value, long timestamp) {
45284533
return executeCommand(commandObjects.tsIncrBy(key, value, timestamp));
45294534
}
45304535

4536+
@Override
4537+
public long tsIncrBy(String key, double addend, TSIncrOrDecrByParams incrByParams) {
4538+
return executeCommand(commandObjects.tsIncrBy(key, addend, incrByParams));
4539+
}
4540+
45314541
@Override
45324542
public long tsDecrBy(String key, double value) {
45334543
return executeCommand(commandObjects.tsDecrBy(key, value));
@@ -4538,6 +4548,11 @@ public long tsDecrBy(String key, double value, long timestamp) {
45384548
return executeCommand(commandObjects.tsDecrBy(key, value, timestamp));
45394549
}
45404550

4551+
@Override
4552+
public long tsDecrBy(String key, double subtrahend, TSIncrOrDecrByParams decrByParams) {
4553+
return executeCommand(commandObjects.tsDecrBy(key, subtrahend, decrByParams));
4554+
}
4555+
45414556
@Override
45424557
public List<TSElement> tsRange(String key, long fromTimestamp, long toTimestamp) {
45434558
return checkAndClientSideCacheCommand(commandObjects.tsRange(key, fromTimestamp, toTimestamp), key);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package redis.clients.jedis.timeseries;
2+
3+
import redis.clients.jedis.args.Rawable;
4+
import redis.clients.jedis.util.SafeEncoder;
5+
6+
/**
7+
* Specifies the series samples encoding format.
8+
*/
9+
public enum EncodingFormat implements Rawable {
10+
11+
COMPRESSED,
12+
UNCOMPRESSED;
13+
14+
private final byte[] raw;
15+
16+
private EncodingFormat() {
17+
raw = SafeEncoder.encode(name());
18+
}
19+
20+
@Override
21+
public byte[] getRaw() {
22+
return raw;
23+
}
24+
}

src/main/java/redis/clients/jedis/timeseries/RedisTimeSeriesCommands.java

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,33 @@ public interface RedisTimeSeriesCommands {
5959
long tsAdd(String key, long timestamp, double value);
6060

6161
/**
62-
* {@code TS.ADD key timestamp value [RETENTION retentionTime] [ENCODING [COMPRESSED|UNCOMPRESSED]] [CHUNK_SIZE size] [ON_DUPLICATE policy] [LABELS label value..]}
63-
*
6462
* @param key
6563
* @param timestamp
6664
* @param value
6765
* @param createParams
6866
* @return timestamp
67+
* @deprecated Use {@link RedisTimeSeriesCommands#tsAdd(java.lang.String, long, double, redis.clients.jedis.timeseries.TSAddParams)}.
6968
*/
69+
@Deprecated
7070
long tsAdd(String key, long timestamp, double value, TSCreateParams createParams);
7171

72+
/**
73+
* {@code TS.ADD key timestamp value
74+
* [RETENTION retentionTime]
75+
* [ENCODING <COMPRESSED|UNCOMPRESSED>]
76+
* [CHUNK_SIZE size]
77+
* [DUPLICATE_POLICY policy]
78+
* [ON_DUPLICATE policy_ovr]
79+
* [LABELS label value..]}
80+
*
81+
* @param key
82+
* @param timestamp
83+
* @param value
84+
* @param addParams
85+
* @return timestamp
86+
*/
87+
long tsAdd(String key, long timestamp, double value, TSAddParams addParams);
88+
7289
/**
7390
* {@code TS.MADD key timestamp value [key timestamp value ...]}
7491
*
@@ -81,10 +98,44 @@ public interface RedisTimeSeriesCommands {
8198

8299
long tsIncrBy(String key, double value, long timestamp);
83100

101+
/**
102+
* {@code TS.INCRBY key addend
103+
* [TIMESTAMP timestamp]
104+
* [RETENTION retentionPeriod]
105+
* [ENCODING <COMPRESSED|UNCOMPRESSED>]
106+
* [CHUNK_SIZE size]
107+
* [DUPLICATE_POLICY policy]
108+
* [IGNORE ignoreMaxTimediff ignoreMaxValDiff]
109+
* [LABELS [label value ...]]}
110+
*
111+
* @param key
112+
* @param addend
113+
* @param incrByParams
114+
* @return timestamp
115+
*/
116+
long tsIncrBy(String key, double addend, TSIncrOrDecrByParams incrByParams);
117+
84118
long tsDecrBy(String key, double value);
85119

86120
long tsDecrBy(String key, double value, long timestamp);
87121

122+
/**
123+
* {@code TS.DECRBY key subtrahend
124+
* [TIMESTAMP timestamp]
125+
* [RETENTION retentionPeriod]
126+
* [ENCODING <COMPRESSED|UNCOMPRESSED>]
127+
* [CHUNK_SIZE size]
128+
* [DUPLICATE_POLICY policy]
129+
* [IGNORE ignoreMaxTimediff ignoreMaxValDiff]
130+
* [LABELS [label value ...]]}
131+
*
132+
* @param key
133+
* @param subtrahend
134+
* @param decrByParams
135+
* @return timestamp
136+
*/
137+
long tsDecrBy(String key, double subtrahend, TSIncrOrDecrByParams decrByParams);
138+
88139
/**
89140
* {@code TS.RANGE key fromTimestamp toTimestamp}
90141
*

src/main/java/redis/clients/jedis/timeseries/RedisTimeSeriesPipelineCommands.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,25 @@ public interface RedisTimeSeriesPipelineCommands {
1818

1919
Response<Long> tsAdd(String key, long timestamp, double value);
2020

21+
@Deprecated
2122
Response<Long> tsAdd(String key, long timestamp, double value, TSCreateParams createParams);
2223

24+
Response<Long> tsAdd(String key, long timestamp, double value, TSAddParams addParams);
25+
2326
Response<List<Long>> tsMAdd(Map.Entry<String, TSElement>... entries);
2427

2528
Response<Long> tsIncrBy(String key, double value);
2629

2730
Response<Long> tsIncrBy(String key, double value, long timestamp);
2831

32+
Response<Long> tsIncrBy(String key, double addend, TSIncrOrDecrByParams incrByParams);
33+
2934
Response<Long> tsDecrBy(String key, double value);
3035

3136
Response<Long> tsDecrBy(String key, double value, long timestamp);
3237

38+
Response<Long> tsDecrBy(String key, double subtrahend, TSIncrOrDecrByParams decrByParams);
39+
3340
Response<List<TSElement>> tsRange(String key, long fromTimestamp, long toTimestamp);
3441

3542
Response<List<TSElement>> tsRange(String key, TSRangeParams rangeParams);
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package redis.clients.jedis.timeseries;
2+
3+
import static redis.clients.jedis.Protocol.toByteArray;
4+
import static redis.clients.jedis.timeseries.TimeSeriesProtocol.TimeSeriesKeyword.*;
5+
6+
import java.util.LinkedHashMap;
7+
import java.util.Map;
8+
import redis.clients.jedis.CommandArguments;
9+
import redis.clients.jedis.params.IParams;
10+
11+
/**
12+
* Represents optional arguments of TS.ADD command.
13+
*/
14+
public class TSAddParams implements IParams {
15+
16+
private Long retentionPeriod;
17+
private EncodingFormat encoding;
18+
private Long chunkSize;
19+
private DuplicatePolicy duplicatePolicy;
20+
private DuplicatePolicy onDuplicate;
21+
22+
private boolean ignore;
23+
private long ignoreMaxTimediff;
24+
private double ignoreMaxValDiff;
25+
26+
private Map<String, String> labels;
27+
28+
public TSAddParams() {
29+
}
30+
31+
public static TSAddParams addParams() {
32+
return new TSAddParams();
33+
}
34+
35+
public TSAddParams retention(long retentionPeriod) {
36+
this.retentionPeriod = retentionPeriod;
37+
return this;
38+
}
39+
40+
public TSAddParams encoding(EncodingFormat encoding) {
41+
this.encoding = encoding;
42+
return this;
43+
}
44+
45+
public TSAddParams chunkSize(long chunkSize) {
46+
this.chunkSize = chunkSize;
47+
return this;
48+
}
49+
50+
public TSAddParams duplicatePolicy(DuplicatePolicy duplicatePolicy) {
51+
this.duplicatePolicy = duplicatePolicy;
52+
return this;
53+
}
54+
55+
public TSAddParams onDuplicate(DuplicatePolicy onDuplicate) {
56+
this.onDuplicate = onDuplicate;
57+
return this;
58+
}
59+
60+
public TSAddParams ignore(long maxTimediff, double maxValDiff) {
61+
this.ignore = true;
62+
this.ignoreMaxTimediff = maxTimediff;
63+
this.ignoreMaxValDiff = maxValDiff;
64+
return this;
65+
}
66+
67+
/**
68+
* Set label-value pairs
69+
*
70+
* @param labels label-value pairs
71+
* @return the object itself
72+
*/
73+
public TSAddParams labels(Map<String, String> labels) {
74+
this.labels = labels;
75+
return this;
76+
}
77+
78+
/**
79+
* Add label-value pair. Multiple pairs can be added through chaining.
80+
* @param label
81+
* @param value
82+
* @return the object itself
83+
*/
84+
public TSAddParams label(String label, String value) {
85+
if (this.labels == null) {
86+
this.labels = new LinkedHashMap<>();
87+
}
88+
this.labels.put(label, value);
89+
return this;
90+
}
91+
92+
@Override
93+
public void addParams(CommandArguments args) {
94+
95+
if (retentionPeriod != null) {
96+
args.add(RETENTION).add(toByteArray(retentionPeriod));
97+
}
98+
99+
if (encoding != null) {
100+
args.add(ENCODING).add(encoding);
101+
}
102+
103+
if (chunkSize != null) {
104+
args.add(CHUNK_SIZE).add(toByteArray(chunkSize));
105+
}
106+
107+
if (duplicatePolicy != null) {
108+
args.add(DUPLICATE_POLICY).add(duplicatePolicy);
109+
}
110+
111+
if (duplicatePolicy != null) {
112+
args.add(DUPLICATE_POLICY).add(duplicatePolicy);
113+
}
114+
115+
if (onDuplicate != null) {
116+
args.add(ON_DUPLICATE).add(onDuplicate);
117+
}
118+
119+
if (ignore) {
120+
args.add(IGNORE).add(ignoreMaxTimediff).add(ignoreMaxValDiff);
121+
}
122+
123+
if (labels != null) {
124+
args.add(LABELS);
125+
labels.entrySet().forEach((entry) -> args.add(entry.getKey()).add(entry.getValue()));
126+
}
127+
}
128+
}

0 commit comments

Comments
 (0)