Skip to content

Commit ffff3ec

Browse files
authored
Support TDIGEST.[BY][REV]RANK commands (#3158)
1 parent 4a06e11 commit ffff3ec

File tree

9 files changed

+149
-16
lines changed

9 files changed

+149
-16
lines changed

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

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3907,27 +3907,18 @@ public final CommandObject<Map<String, Object>> tdigestInfo(String key) {
39073907
}
39083908

39093909
public final CommandObject<String> tdigestAdd(String key, double... values) {
3910-
CommandArguments args = commandArguments(TDigestCommand.ADD).key(key);
3911-
for (double value : values) {
3912-
args.add(value);
3913-
}
3914-
return new CommandObject<>(args, BuilderFactory.STRING);
3910+
return new CommandObject<>(addFlatArgs(commandArguments(TDigestCommand.ADD).key(key), values),
3911+
BuilderFactory.STRING);
39153912
}
39163913

39173914
public final CommandObject<List<Double>> tdigestCDF(String key, double... values) {
3918-
CommandArguments args = commandArguments(TDigestCommand.CDF).key(key);
3919-
for (double value : values) {
3920-
args.add(value);
3921-
}
3922-
return new CommandObject<>(args, BuilderFactory.DOUBLE_LIST);
3915+
return new CommandObject<>(addFlatArgs(commandArguments(TDigestCommand.CDF).key(key), values),
3916+
BuilderFactory.DOUBLE_LIST);
39233917
}
39243918

39253919
public final CommandObject<List<Double>> tdigestQuantile(String key, double... quantiles) {
3926-
CommandArguments args = commandArguments(TDigestCommand.QUANTILE).key(key);
3927-
for (double quantile : quantiles) {
3928-
args.add(quantile);
3929-
}
3930-
return new CommandObject<>(args, BuilderFactory.DOUBLE_LIST);
3920+
return new CommandObject<>(addFlatArgs(commandArguments(TDigestCommand.QUANTILE).key(key),
3921+
quantiles), BuilderFactory.DOUBLE_LIST);
39313922
}
39323923

39333924
public final CommandObject<Double> tdigestMin(String key) {
@@ -3942,6 +3933,26 @@ public final CommandObject<Double> tdigestTrimmedMean(String key, double lowCutQ
39423933
return new CommandObject<>(commandArguments(TDigestCommand.TRIMMED_MEAN).key(key).add(lowCutQuantile)
39433934
.add(highCutQuantile), BuilderFactory.DOUBLE);
39443935
}
3936+
3937+
public final CommandObject<List<Long>> tdigestRank(String key, double... values) {
3938+
return new CommandObject<>(addFlatArgs(commandArguments(TDigestCommand.RANK).key(key),
3939+
values), BuilderFactory.LONG_LIST);
3940+
}
3941+
3942+
public final CommandObject<List<Long>> tdigestRevRank(String key, double... values) {
3943+
return new CommandObject<>(addFlatArgs(commandArguments(TDigestCommand.REVRANK).key(key),
3944+
values), BuilderFactory.LONG_LIST);
3945+
}
3946+
3947+
public final CommandObject<List<Double>> tdigestByRank(String key, long... ranks) {
3948+
return new CommandObject<>(addFlatArgs(commandArguments(TDigestCommand.BYRANK).key(key),
3949+
ranks), BuilderFactory.DOUBLE_LIST);
3950+
}
3951+
3952+
public final CommandObject<List<Double>> tdigestByRevRank(String key, long... ranks) {
3953+
return new CommandObject<>(addFlatArgs(commandArguments(TDigestCommand.BYREVRANK).key(key),
3954+
ranks), BuilderFactory.DOUBLE_LIST);
3955+
}
39453956
// RedisBloom commands
39463957

39473958
// RedisGraph commands
@@ -4004,6 +4015,20 @@ public List<T> build(Object data) {
40044015
}
40054016
}
40064017

4018+
private CommandArguments addFlatArgs(CommandArguments args, long... values) {
4019+
for (long value : values) {
4020+
args.add(value);
4021+
}
4022+
return args;
4023+
}
4024+
4025+
private CommandArguments addFlatArgs(CommandArguments args, double... values) {
4026+
for (double value : values) {
4027+
args.add(value);
4028+
}
4029+
return args;
4030+
}
4031+
40074032
private CommandArguments addFlatKeyValueArgs(CommandArguments args, String... keyvalues) {
40084033
for (int i = 0; i < keyvalues.length; i += 2) {
40094034
args.key(keyvalues[i]).add(keyvalues[i + 1]);

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4209,6 +4209,26 @@ public Response<Double> tdigestMax(String key) {
42094209
public Response<Double> tdigestTrimmedMean(String key, double lowCutQuantile, double highCutQuantile) {
42104210
return appendCommand(commandObjects.tdigestTrimmedMean(key, lowCutQuantile, highCutQuantile));
42114211
}
4212+
4213+
@Override
4214+
public Response<List<Long>> tdigestRank(String key, double... values) {
4215+
return appendCommand(commandObjects.tdigestRank(key, values));
4216+
}
4217+
4218+
@Override
4219+
public Response<List<Long>> tdigestRevRank(String key, double... values) {
4220+
return appendCommand(commandObjects.tdigestRevRank(key, values));
4221+
}
4222+
4223+
@Override
4224+
public Response<List<Double>> tdigestByRank(String key, long... ranks) {
4225+
return appendCommand(commandObjects.tdigestByRank(key, ranks));
4226+
}
4227+
4228+
@Override
4229+
public Response<List<Double>> tdigestByRevRank(String key, long... ranks) {
4230+
return appendCommand(commandObjects.tdigestByRevRank(key, ranks));
4231+
}
42124232
// RedisBloom commands
42134233

42144234
// RedisGraph commands

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4188,6 +4188,26 @@ public Response<Double> tdigestMax(String key) {
41884188
public Response<Double> tdigestTrimmedMean(String key, double lowCutQuantile, double highCutQuantile) {
41894189
return appendCommand(commandObjects.tdigestTrimmedMean(key, lowCutQuantile, highCutQuantile));
41904190
}
4191+
4192+
@Override
4193+
public Response<List<Long>> tdigestRank(String key, double... values) {
4194+
return appendCommand(commandObjects.tdigestRank(key, values));
4195+
}
4196+
4197+
@Override
4198+
public Response<List<Long>> tdigestRevRank(String key, double... values) {
4199+
return appendCommand(commandObjects.tdigestRevRank(key, values));
4200+
}
4201+
4202+
@Override
4203+
public Response<List<Double>> tdigestByRank(String key, long... ranks) {
4204+
return appendCommand(commandObjects.tdigestByRank(key, ranks));
4205+
}
4206+
4207+
@Override
4208+
public Response<List<Double>> tdigestByRevRank(String key, long... ranks) {
4209+
return appendCommand(commandObjects.tdigestByRevRank(key, ranks));
4210+
}
41914211
// RedisBloom commands
41924212

41934213
// RedisGraph commands

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4256,6 +4256,26 @@ public Response<Double> tdigestMax(String key) {
42564256
public Response<Double> tdigestTrimmedMean(String key, double lowCutQuantile, double highCutQuantile) {
42574257
return appendCommand(commandObjects.tdigestTrimmedMean(key, lowCutQuantile, highCutQuantile));
42584258
}
4259+
4260+
@Override
4261+
public Response<List<Long>> tdigestRank(String key, double... values) {
4262+
return appendCommand(commandObjects.tdigestRank(key, values));
4263+
}
4264+
4265+
@Override
4266+
public Response<List<Long>> tdigestRevRank(String key, double... values) {
4267+
return appendCommand(commandObjects.tdigestRevRank(key, values));
4268+
}
4269+
4270+
@Override
4271+
public Response<List<Double>> tdigestByRank(String key, long... ranks) {
4272+
return appendCommand(commandObjects.tdigestByRank(key, ranks));
4273+
}
4274+
4275+
@Override
4276+
public Response<List<Double>> tdigestByRevRank(String key, long... ranks) {
4277+
return appendCommand(commandObjects.tdigestByRevRank(key, ranks));
4278+
}
42594279
// RedisBloom commands
42604280

42614281
// RedisGraph commands

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4401,6 +4401,26 @@ public double tdigestMax(String key) {
44014401
public double tdigestTrimmedMean(String key, double lowCutQuantile, double highCutQuantile) {
44024402
return executeCommand(commandObjects.tdigestTrimmedMean(key, lowCutQuantile, highCutQuantile));
44034403
}
4404+
4405+
@Override
4406+
public List<Long> tdigestRank(String key, double... values) {
4407+
return executeCommand(commandObjects.tdigestRank(key, values));
4408+
}
4409+
4410+
@Override
4411+
public List<Long> tdigestRevRank(String key, double... values) {
4412+
return executeCommand(commandObjects.tdigestRevRank(key, values));
4413+
}
4414+
4415+
@Override
4416+
public List<Double> tdigestByRank(String key, long... ranks) {
4417+
return executeCommand(commandObjects.tdigestByRank(key, ranks));
4418+
}
4419+
4420+
@Override
4421+
public List<Double> tdigestByRevRank(String key, long... ranks) {
4422+
return executeCommand(commandObjects.tdigestByRevRank(key, ranks));
4423+
}
44044424
// RedisBloom commands
44054425

44064426
// RedisGraph commands

src/main/java/redis/clients/jedis/bloom/RedisBloomProtocol.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ public byte[] getRaw() {
102102

103103
public enum TDigestCommand implements ProtocolCommand {
104104

105-
CREATE, INFO, ADD, RESET, MERGE, CDF, QUANTILE, MIN, MAX, TRIMMED_MEAN;
105+
CREATE, INFO, ADD, RESET, MERGE, CDF, QUANTILE, MIN, MAX, TRIMMED_MEAN,
106+
RANK, REVRANK, BYRANK, BYREVRANK;
106107

107108
private final byte[] raw;
108109

src/main/java/redis/clients/jedis/bloom/commands/TDigestSketchCommands.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,12 @@ public interface TDigestSketchCommands {
111111
* @return estimation of the mean value
112112
*/
113113
double tdigestTrimmedMean(String key, double lowCutQuantile, double highCutQuantile);
114+
115+
List<Long> tdigestRank(String key, double... values);
116+
117+
List<Long> tdigestRevRank(String key, double... values);
118+
119+
List<Double> tdigestByRank(String key, long... ranks);
120+
121+
List<Double> tdigestByRevRank(String key, long... ranks);
114122
}

src/main/java/redis/clients/jedis/bloom/commands/TDigestSketchPipelineCommands.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,12 @@ public interface TDigestSketchPipelineCommands {
3030
Response<Double> tdigestMax(String key);
3131

3232
Response<Double> tdigestTrimmedMean(String key, double lowCutQuantile, double highCutQuantile);
33+
34+
Response<List<Long>> tdigestRank(String key, double... values);
35+
36+
Response<List<Long>> tdigestRevRank(String key, double... values);
37+
38+
Response<List<Double>> tdigestByRank(String key, long... ranks);
39+
40+
Response<List<Double>> tdigestByRevRank(String key, long... ranks);
3341
}

src/test/java/redis/clients/jedis/modules/bloom/TDigestTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,17 @@ public void trimmedMean() {
177177
assertEquals(4.5, client.tdigestTrimmedMean(key, 0.0, 0.5), 0.01);
178178
assertEquals(14.5, client.tdigestTrimmedMean(key, 0.5, 1.0), 0.01);
179179
}
180+
181+
@Test
182+
public void rankCommands() {
183+
final String key = "ranks";
184+
client.tdigestCreate(key);
185+
client.tdigestAdd(key, 2d, 3d, 5d);
186+
assertEquals(Arrays.asList(1l, 2l), client.tdigestRank(key, 2d, 4d));
187+
assertEquals(Arrays.asList(0l, 1l), client.tdigestRevRank(key, 5d, 4d));
188+
assertEquals(Arrays.asList(2d, 3d), client.tdigestByRank(key, 0l, 1l));
189+
assertEquals(Arrays.asList(5d, 3d), client.tdigestByRevRank(key, 1l, 2l));
190+
}
180191
//
181192
// private static KeyValue<Double, Long> randomValueWeight() {
182193
// return new KeyValue<>(random.nextDouble() * 10000, Math.abs(random.nextInt()) + 1l);

0 commit comments

Comments
 (0)