Skip to content

Commit 1c3df87

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 e71b187 commit 1c3df87

12 files changed

Lines changed: 506 additions & 13 deletions

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

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

3944+
@Deprecated
39443945
public final CommandObject<Long> tsAdd(String key, long timestamp, double value, TSCreateParams createParams) {
3945-
return new CommandObject<>(commandArguments(TimeSeriesCommand.ADD).key(key)
3946-
.add(timestamp).add(value).addParams(createParams), BuilderFactory.LONG);
3946+
return new CommandObject<>(commandArguments(TimeSeriesCommand.ADD).key(key).add(timestamp).add(value)
3947+
.addParams(createParams), BuilderFactory.LONG);
3948+
}
3949+
3950+
public final CommandObject<Long> tsAdd(String key, long timestamp, double value, TSAddParams addParams) {
3951+
return new CommandObject<>(commandArguments(TimeSeriesCommand.ADD).key(key).add(timestamp).add(value)
3952+
.addParams(addParams), BuilderFactory.LONG);
39473953
}
39483954

39493955
public final CommandObject<List<Long>> tsMAdd(Map.Entry<String, TSElement>... entries) {
@@ -3963,6 +3969,11 @@ public final CommandObject<Long> tsIncrBy(String key, double value, long timesta
39633969
.add(TimeSeriesKeyword.TIMESTAMP).add(timestamp), BuilderFactory.LONG);
39643970
}
39653971

3972+
public final CommandObject<Long> tsIncrBy(String key, double addend, TSIncrOrDecrByParams incrByParams) {
3973+
return new CommandObject<>(commandArguments(TimeSeriesCommand.INCRBY).key(key).add(addend)
3974+
.addParams(incrByParams), BuilderFactory.LONG);
3975+
}
3976+
39663977
public final CommandObject<Long> tsDecrBy(String key, double value) {
39673978
return new CommandObject<>(commandArguments(TimeSeriesCommand.DECRBY).key(key).add(value), BuilderFactory.LONG);
39683979
}
@@ -3972,6 +3983,11 @@ public final CommandObject<Long> tsDecrBy(String key, double value, long timesta
39723983
.add(TimeSeriesKeyword.TIMESTAMP).add(timestamp), BuilderFactory.LONG);
39733984
}
39743985

3986+
public final CommandObject<Long> tsDecrBy(String key, double subtrahend, TSIncrOrDecrByParams decrByParams) {
3987+
return new CommandObject<>(commandArguments(TimeSeriesCommand.DECRBY).key(key).add(subtrahend)
3988+
.addParams(decrByParams), BuilderFactory.LONG);
3989+
}
3990+
39753991
public final CommandObject<List<TSElement>> tsRange(String key, long fromTimestamp, long toTimestamp) {
39763992
return new CommandObject<>(commandArguments(TimeSeriesCommand.RANGE).key(key)
39773993
.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
@@ -3930,6 +3930,11 @@ public Response<Long> tsAdd(String key, long timestamp, double value, TSCreatePa
39303930
return appendCommand(commandObjects.tsAdd(key, timestamp, value, createParams));
39313931
}
39323932

3933+
@Override
3934+
public Response<Long> tsAdd(String key, long timestamp, double value, TSAddParams addParams) {
3935+
return appendCommand(commandObjects.tsAdd(key, timestamp, value, addParams));
3936+
}
3937+
39333938
@Override
39343939
public Response<List<Long>> tsMAdd(Map.Entry<String, TSElement>... entries) {
39353940
return appendCommand(commandObjects.tsMAdd(entries));
@@ -3945,6 +3950,11 @@ public Response<Long> tsIncrBy(String key, double value, long timestamp) {
39453950
return appendCommand(commandObjects.tsIncrBy(key, value, timestamp));
39463951
}
39473952

3953+
@Override
3954+
public Response<Long> tsIncrBy(String key, double addend, TSIncrOrDecrByParams incrByParams) {
3955+
return appendCommand(commandObjects.tsIncrBy(key, addend, incrByParams));
3956+
}
3957+
39483958
@Override
39493959
public Response<Long> tsDecrBy(String key, double value) {
39503960
return appendCommand(commandObjects.tsDecrBy(key, value));
@@ -3955,6 +3965,11 @@ public Response<Long> tsDecrBy(String key, double value, long timestamp) {
39553965
return appendCommand(commandObjects.tsDecrBy(key, value, timestamp));
39563966
}
39573967

3968+
@Override
3969+
public Response<Long> tsDecrBy(String key, double subtrahend, TSIncrOrDecrByParams decrByParams) {
3970+
return appendCommand(commandObjects.tsDecrBy(key, subtrahend, decrByParams));
3971+
}
3972+
39583973
@Override
39593974
public Response<List<TSElement>> tsRange(String key, long fromTimestamp, long toTimestamp) {
39603975
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
@@ -4461,6 +4461,11 @@ public long tsAdd(String key, long timestamp, double value, TSCreateParams creat
44614461
return executeCommand(commandObjects.tsAdd(key, timestamp, value, createParams));
44624462
}
44634463

4464+
@Override
4465+
public long tsAdd(String key, long timestamp, double value, TSAddParams addParams) {
4466+
return executeCommand(commandObjects.tsAdd(key, timestamp, value, addParams));
4467+
}
4468+
44644469
@Override
44654470
public List<Long> tsMAdd(Map.Entry<String, TSElement>... entries) {
44664471
return executeCommand(commandObjects.tsMAdd(entries));
@@ -4476,6 +4481,11 @@ public long tsIncrBy(String key, double value, long timestamp) {
44764481
return executeCommand(commandObjects.tsIncrBy(key, value, timestamp));
44774482
}
44784483

4484+
@Override
4485+
public long tsIncrBy(String key, double addend, TSIncrOrDecrByParams incrByParams) {
4486+
return executeCommand(commandObjects.tsIncrBy(key, addend, incrByParams));
4487+
}
4488+
44794489
@Override
44804490
public long tsDecrBy(String key, double value) {
44814491
return executeCommand(commandObjects.tsDecrBy(key, value));
@@ -4486,6 +4496,11 @@ public long tsDecrBy(String key, double value, long timestamp) {
44864496
return executeCommand(commandObjects.tsDecrBy(key, value, timestamp));
44874497
}
44884498

4499+
@Override
4500+
public long tsDecrBy(String key, double subtrahend, TSIncrOrDecrByParams decrByParams) {
4501+
return executeCommand(commandObjects.tsDecrBy(key, subtrahend, decrByParams));
4502+
}
4503+
44894504
@Override
44904505
public List<TSElement> tsRange(String key, long fromTimestamp, long toTimestamp) {
44914506
return executeCommand(commandObjects.tsRange(key, fromTimestamp, toTimestamp));
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)