Skip to content

Commit

Permalink
Glide range xadd (#1692)
Browse files Browse the repository at this point in the history
* binary version for xrange, xrevrange, setrange, lrange, getrange and xadd. Also made castMapOf2DArray generic
  • Loading branch information
talxsha authored Jul 2, 2024
1 parent 1d4268c commit cdf47fb
Show file tree
Hide file tree
Showing 8 changed files with 875 additions and 5 deletions.
101 changes: 101 additions & 0 deletions java/client/src/main/java/glide/api/BaseClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,8 @@
import glide.api.models.commands.WeightAggregateOptions.KeyArray;
import glide.api.models.commands.WeightAggregateOptions.KeysOrWeightedKeys;
import glide.api.models.commands.ZAddOptions;
import glide.api.models.commands.bitmap.BitFieldOptions.BitFieldReadOnlySubCommands;
import glide.api.models.commands.bitmap.BitFieldOptions.BitFieldSubCommands;
import glide.api.models.commands.bitmap.BitmapIndexType;
import glide.api.models.commands.bitmap.BitwiseOperation;
import glide.api.models.commands.geospatial.GeoAddOptions;
Expand Down Expand Up @@ -255,6 +257,7 @@
import glide.managers.BaseResponseResolver;
import glide.managers.CommandManager;
import glide.managers.ConnectionManager;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
Expand Down Expand Up @@ -503,6 +506,10 @@ protected String handleStringResponse(Response response) throws RedisException {
return handleRedisResponse(String.class, EnumSet.of(ResponseFlags.ENCODING_UTF8), response);
}

protected GlideString handleStringResponseBinary(Response response) throws RedisException {
return handleRedisResponse(GlideString.class, EnumSet.noneOf(ResponseFlags.class), response);
}

protected String handleStringOrNullResponse(Response response) throws RedisException {
return handleRedisResponse(
String.class, EnumSet.of(ResponseFlags.IS_NULLABLE, ResponseFlags.ENCODING_UTF8), response);
Expand Down Expand Up @@ -924,12 +931,26 @@ public CompletableFuture<Long> setrange(@NonNull String key, int offset, @NonNul
return commandManager.submitNewCommand(SetRange, arguments, this::handleLongResponse);
}

@Override
public CompletableFuture<Long> setrange(
@NonNull GlideString key, int offset, @NonNull GlideString value) {
GlideString[] arguments = new GlideString[] {key, gs(Integer.toString(offset)), value};
return commandManager.submitNewCommand(SetRange, arguments, this::handleLongResponse);
}

@Override
public CompletableFuture<String> getrange(@NonNull String key, int start, int end) {
String[] arguments = new String[] {key, Integer.toString(start), Integer.toString(end)};
return commandManager.submitNewCommand(GetRange, arguments, this::handleStringResponse);
}

@Override
public CompletableFuture<GlideString> getrange(@NonNull GlideString key, int start, int end) {
GlideString[] arguments =
new GlideString[] {key, gs(Integer.toString(start)), gs(Integer.toString(end))};
return commandManager.submitNewCommand(GetRange, arguments, this::handleStringResponseBinary);
}

@Override
public CompletableFuture<String> hget(@NonNull String key, @NonNull String field) {
return commandManager.submitNewCommand(
Expand Down Expand Up @@ -1238,6 +1259,14 @@ public CompletableFuture<String[]> lrange(@NonNull String key, long start, long
response -> castArray(handleArrayOrNullResponse(response), String.class));
}

@Override
public CompletableFuture<GlideString[]> lrange(@NonNull GlideString key, long start, long end) {
return commandManager.submitNewCommand(
LRange,
new GlideString[] {key, gs(Long.toString(start)), gs(Long.toString(end))},
response -> castArray(handleArrayOrNullResponseBinary(response), GlideString.class));
}

@Override
public CompletableFuture<String> lindex(@NonNull String key, long index) {
return commandManager.submitNewCommand(
Expand Down Expand Up @@ -2110,6 +2139,12 @@ public CompletableFuture<String> xadd(@NonNull String key, @NonNull Map<String,
return xadd(key, values, StreamAddOptions.builder().build());
}

@Override
public CompletableFuture<GlideString> xadd(
@NonNull GlideString key, @NonNull Map<GlideString, GlideString> values) {
return xadd(key, values, StreamAddOptions.builder().build());
}

@Override
public CompletableFuture<String> xadd(
@NonNull String key, @NonNull Map<String, String> values, @NonNull StreamAddOptions options) {
Expand All @@ -2119,6 +2154,20 @@ public CompletableFuture<String> xadd(
return commandManager.submitNewCommand(XAdd, arguments, this::handleStringOrNullResponse);
}

@Override
public CompletableFuture<GlideString> xadd(
@NonNull GlideString key,
@NonNull Map<GlideString, GlideString> values,
@NonNull StreamAddOptions options) {
String[] toArgsString = options.toArgs();
GlideString[] toArgs =
Arrays.stream(toArgsString).map(GlideString::gs).toArray(GlideString[]::new);
GlideString[] arguments =
ArrayUtils.addAll(
ArrayUtils.addFirst(toArgs, key), convertMapToKeyValueGlideStringArray(values));
return commandManager.submitNewCommand(XAdd, arguments, this::handleGlideStringOrNullResponse);
}

@Override
public CompletableFuture<Map<String, Map<String, String[][]>>> xread(
@NonNull Map<String, String> keysAndIds) {
Expand Down Expand Up @@ -2175,6 +2224,19 @@ public CompletableFuture<Map<String, String[][]>> xrange(
XRange, arguments, response -> castMapOf2DArray(handleMapResponse(response), String.class));
}

@Override
public CompletableFuture<Map<GlideString, GlideString[][]>> xrange(
@NonNull GlideString key, @NonNull StreamRange start, @NonNull StreamRange end) {
String[] toArgsString = StreamRange.toArgs(start, end);
GlideString[] toArgsBinary =
Arrays.stream(toArgsString).map(GlideString::gs).toArray(GlideString[]::new);
GlideString[] arguments = ArrayUtils.addFirst(toArgsBinary, key);
return commandManager.submitNewCommand(
XRange,
arguments,
response -> castMapOf2DArray(handleBinaryStringMapResponse(response), GlideString.class));
}

@Override
public CompletableFuture<Map<String, String[][]>> xrange(
@NonNull String key, @NonNull StreamRange start, @NonNull StreamRange end, long count) {
Expand All @@ -2183,6 +2245,19 @@ public CompletableFuture<Map<String, String[][]>> xrange(
XRange, arguments, response -> castMapOf2DArray(handleMapResponse(response), String.class));
}

@Override
public CompletableFuture<Map<GlideString, GlideString[][]>> xrange(
@NonNull GlideString key, @NonNull StreamRange start, @NonNull StreamRange end, long count) {
String[] toArgsString = StreamRange.toArgs(start, end, count);
GlideString[] toArgsBinary =
Arrays.stream(toArgsString).map(GlideString::gs).toArray(GlideString[]::new);
GlideString[] arguments = ArrayUtils.addFirst(toArgsBinary, key);
return commandManager.submitNewCommand(
XRange,
arguments,
response -> castMapOf2DArray(handleBinaryStringMapResponse(response), GlideString.class));
}

@Override
public CompletableFuture<Map<String, String[][]>> xrevrange(
@NonNull String key, @NonNull StreamRange end, @NonNull StreamRange start) {
Expand All @@ -2193,6 +2268,19 @@ public CompletableFuture<Map<String, String[][]>> xrevrange(
response -> castMapOf2DArray(handleMapResponse(response), String.class));
}

@Override
public CompletableFuture<Map<GlideString, GlideString[][]>> xrevrange(
@NonNull GlideString key, @NonNull StreamRange end, @NonNull StreamRange start) {
String[] toArgsString = StreamRange.toArgs(end, start);
GlideString[] toArgsBinary =
Arrays.stream(toArgsString).map(GlideString::gs).toArray(GlideString[]::new);
GlideString[] arguments = ArrayUtils.addFirst(toArgsBinary, key);
return commandManager.submitNewCommand(
XRevRange,
arguments,
response -> castMapOf2DArray(handleBinaryStringMapResponse(response), GlideString.class));
}

@Override
public CompletableFuture<Map<String, String[][]>> xrevrange(
@NonNull String key, @NonNull StreamRange end, @NonNull StreamRange start, long count) {
Expand All @@ -2203,6 +2291,19 @@ public CompletableFuture<Map<String, String[][]>> xrevrange(
response -> castMapOf2DArray(handleMapResponse(response), String.class));
}

@Override
public CompletableFuture<Map<GlideString, GlideString[][]>> xrevrange(
@NonNull GlideString key, @NonNull StreamRange end, @NonNull StreamRange start, long count) {
String[] toArgsString = StreamRange.toArgs(end, start, count);
GlideString[] toArgsBinary =
Arrays.stream(toArgsString).map(GlideString::gs).toArray(GlideString[]::new);
GlideString[] arguments = ArrayUtils.addFirst(toArgsBinary, key);
return commandManager.submitNewCommand(
XRevRange,
arguments,
response -> castMapOf2DArray(handleBinaryStringMapResponse(response), GlideString.class));
}

@Override
public CompletableFuture<String> xgroupCreate(
@NonNull String key, @NonNull String groupName, @NonNull String id) {
Expand Down
32 changes: 32 additions & 0 deletions java/client/src/main/java/glide/api/commands/ListBaseCommands.java
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,38 @@ CompletableFuture<Long[]> lposCount(
*/
CompletableFuture<String[]> lrange(String key, long start, long end);

/**
* Returns the specified elements of the list stored at <code>key</code>.<br>
* The offsets <code>start</code> and <code>end</code> are zero-based indexes, with <code>0</code>
* being the first element of the list, <code>1</code> being the next element and so on. These
* offsets can also be negative numbers indicating offsets starting at the end of the list, with
* <code>-1</code> being the last element of the list, <code>-2</code> being the penultimate, and
* so on.
*
* @see <a href="https://redis.io/commands/lrange/">redis.io</a> for details.
* @param key The key of the list.
* @param start The starting point of the range.
* @param end The end of the range.
* @return Array of elements in the specified range.<br>
* If <code>start</code> exceeds the end of the list, or if <code>start</code> is greater than
* <code>end</code>, an empty array will be returned.<br>
* If <code>end</code> exceeds the actual end of the list, the range will stop at the actual
* end of the list.<br>
* If <code>key</code> does not exist an empty array will be returned.
* @example
* <pre>{@code
* GlideString[] payload = lient.lrange(gs("my_list"), 0, 2).get();
* assert Arrays.equals(new GlideString[] {gs("value1"), gs("value2"), gs("value3")});
*
* GlideString[] payload = client.lrange(gs("my_list"), -2, -1).get();
* assert Arrays.equals(new GlideString[] {gs("value2"), gs("value3")});
*
* GlideString[] payload = client.lrange(gs("non_exiting_key"), 0, 2).get();
* assert Arrays.equals(new GlideString[] {});
* }</pre>
*/
CompletableFuture<GlideString[]> lrange(GlideString key, long start, long end);

/**
* Returns the element at <code>index</code> from the list stored at <code>key</code>.<br>
* The index is zero-based, so <code>0</code> means the first element, <code>1</code> the second
Expand Down
Loading

0 comments on commit cdf47fb

Please sign in to comment.