Skip to content

Commit

Permalink
TODO: add docs and more integTests
Browse files Browse the repository at this point in the history
  • Loading branch information
GumpacG committed Jun 21, 2024
1 parent 4146ce2 commit 80cc5c9
Show file tree
Hide file tree
Showing 8 changed files with 141 additions and 7 deletions.
4 changes: 0 additions & 4 deletions java/client/src/main/java/glide/api/BaseClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -347,10 +347,6 @@ protected Object handleObjectOrNullResponse(Response response) throws RedisExcep
return handleRedisResponse(Object.class, EnumSet.of(ResponseFlags.IS_NULLABLE), response);
}

// protected Object handleObjectResponse(Response response) throws RedisException {
// return handleRedisResponse(Object.class, EnumSet.noneOf(ResponseFlags.class), response);
// }

protected String handleStringResponse(Response response) throws RedisException {
return handleRedisResponse(String.class, EnumSet.noneOf(ResponseFlags.class), response);
}
Expand Down
16 changes: 16 additions & 0 deletions java/client/src/main/java/glide/api/models/BaseTransaction.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import static glide.api.commands.SortedSetBaseCommands.WITH_SCORES_REDIS_API;
import static glide.api.commands.SortedSetBaseCommands.WITH_SCORE_REDIS_API;
import static glide.api.commands.StringBaseCommands.LEN_REDIS_API;
import static glide.api.models.commands.LcsOptions.IDX_COMMAND_STRING;
import static glide.api.models.commands.RangeOptions.createZRangeArgs;
import static glide.api.models.commands.bitmap.BitFieldOptions.createBitFieldArgs;
import static glide.api.models.commands.function.FunctionListOptions.LIBRARY_NAME_REDIS_API;
Expand Down Expand Up @@ -192,6 +193,7 @@
import glide.api.models.commands.InfoOptions.Section;
import glide.api.models.commands.LInsertOptions.InsertPosition;
import glide.api.models.commands.LPosOptions;
import glide.api.models.commands.LcsOptions;
import glide.api.models.commands.ListDirection;
import glide.api.models.commands.RangeOptions;
import glide.api.models.commands.RangeOptions.InfLexBound;
Expand Down Expand Up @@ -4634,6 +4636,20 @@ public T lcsLen(@NonNull String key1, @NonNull String key2) {
return getThis();
}

public T lcsIdx(@NonNull String key1, @NonNull String key2) {
ArgsArray args = buildArgs(key1, key2, IDX_COMMAND_STRING);
protobufTransaction.addCommands(buildCommand(LCS, args));
return getThis();
}

public T lcsIdx(@NonNull String key1, @NonNull String key2, @NonNull LcsOptions lcsOptions) {
ArgsArray args =
buildArgs(
ArrayUtils.addAll(new String[] {key1, key2, IDX_COMMAND_STRING}, lcsOptions.toArgs()));
protobufTransaction.addCommands(buildCommand(LCS, args));
return getThis();
}

/** Build protobuf {@link Command} object for given command and arguments. */
protected Command buildCommand(RequestType requestType) {
return buildCommand(requestType, buildArgs());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,15 @@ public final class LcsOptions {
public static final String MINMATCHLEN_COMMAND_STRING = "MINMATCHLEN";
public static final String WITHMATCHLEN_COMMAND_STRING = "WITHMATCHLEN";
private final Long minMatchLen;
private final boolean isWithMatchLen;
private boolean isWithMatchLen;

public static class LcsOptionsBuilder {

/** If the stream doesn't exist, this creates a new stream with a length of <code>0</code>. */
public LcsOptionsBuilder withMatchLen() {
return isWithMatchLen(true);
}
}

public String[] toArgs() {
List<String> optionArgs = new ArrayList<>();
Expand Down
64 changes: 64 additions & 0 deletions java/client/src/test/java/glide/api/RedisClientTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import static glide.api.models.commands.FlushMode.ASYNC;
import static glide.api.models.commands.FlushMode.SYNC;
import static glide.api.models.commands.LInsertOptions.InsertPosition.BEFORE;
import static glide.api.models.commands.LcsOptions.IDX_COMMAND_STRING;
import static glide.api.models.commands.LcsOptions.WITHMATCHLEN_COMMAND_STRING;
import static glide.api.models.commands.ScoreFilter.MAX;
import static glide.api.models.commands.SetOptions.ConditionalSet.ONLY_IF_DOES_NOT_EXIST;
import static glide.api.models.commands.SetOptions.ConditionalSet.ONLY_IF_EXISTS;
Expand Down Expand Up @@ -230,6 +232,7 @@
import glide.api.models.commands.FlushMode;
import glide.api.models.commands.InfoOptions;
import glide.api.models.commands.LPosOptions;
import glide.api.models.commands.LcsOptions;
import glide.api.models.commands.ListDirection;
import glide.api.models.commands.RangeOptions;
import glide.api.models.commands.RangeOptions.InfLexBound;
Expand Down Expand Up @@ -6456,6 +6459,67 @@ public void lcs_with_len_option() {
assertEquals(value, payload);
}

@SneakyThrows
@Test
public void lcsIdx() {
// setup
String key1 = "testKey1";
String key2 = "testKey2";
String[] arguments = new String[] {key1, key2, IDX_COMMAND_STRING};
Map<String, Object> value =
Map.of(
"matches",
new Object[] {new Object[] {new Long[] {1L, 3L}, new Long[] {0L, 2L}}},
"len",
3L);

CompletableFuture<Map<String, Object>> testResponse = new CompletableFuture<>();
testResponse.complete(value);

// match on protobuf request
when(commandManager.<Map<String, Object>>submitNewCommand(eq(LCS), eq(arguments), any()))
.thenReturn(testResponse);

// exercise
CompletableFuture<Map<String, Object>> response = service.lcsIdx(key1, key2);
Map<String, Object> payload = response.get();

// verify
assertEquals(testResponse, response);
assertEquals(value, payload);
}

@SneakyThrows
@Test
public void lcsIdx_with_options() {
// setup
String key1 = "testKey1";
String key2 = "testKey2";
String[] arguments = new String[] {key1, key2, IDX_COMMAND_STRING, WITHMATCHLEN_COMMAND_STRING};
Map<String, Object> value =
Map.of(
"matches",
new Object[] {new Object[] {new Long[] {1L, 3L}, new Long[] {0L, 2L}, 3L}},
"len",
3L);

CompletableFuture<Map<String, Object>> testResponse = new CompletableFuture<>();
testResponse.complete(value);

// match on protobuf request
when(commandManager.<Map<String, Object>>submitNewCommand(eq(LCS), eq(arguments), any()))
.thenReturn(testResponse);

// exercise
CompletableFuture<Map<String, Object>> response =
service.lcsIdx(key1, key2, LcsOptions.builder().withMatchLen().build());
Map<String, Object> payload = response.get();

// verify
assertEquals(testResponse, response);
assertEquals(value, payload);
}

@SneakyThrows
@Test
public void watch_returns_success() {
Expand Down
10 changes: 10 additions & 0 deletions java/client/src/test/java/glide/api/models/TransactionTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import static glide.api.models.commands.FlushMode.ASYNC;
import static glide.api.models.commands.InfoOptions.Section.EVERYTHING;
import static glide.api.models.commands.LInsertOptions.InsertPosition.AFTER;
import static glide.api.models.commands.LcsOptions.IDX_COMMAND_STRING;
import static glide.api.models.commands.LcsOptions.WITHMATCHLEN_COMMAND_STRING;
import static glide.api.models.commands.RangeOptions.InfScoreBound.NEGATIVE_INFINITY;
import static glide.api.models.commands.RangeOptions.InfScoreBound.POSITIVE_INFINITY;
import static glide.api.models.commands.ScoreFilter.MAX;
Expand Down Expand Up @@ -203,6 +205,7 @@
import glide.api.models.commands.ConditionalChange;
import glide.api.models.commands.InfoOptions;
import glide.api.models.commands.LPosOptions;
import glide.api.models.commands.LcsOptions;
import glide.api.models.commands.ListDirection;
import glide.api.models.commands.RangeOptions;
import glide.api.models.commands.RangeOptions.InfLexBound;
Expand Down Expand Up @@ -1049,6 +1052,13 @@ InfScoreBound.NEGATIVE_INFINITY, new ScoreBoundary(3, false), new Limit(1, 2)),
transaction.lcsLen("key1", "key2");
results.add(Pair.of(LCS, buildArgs("key1", "key2", "LEN")));

transaction.lcsIdx("key1", "key2");
results.add(Pair.of(LCS, buildArgs("key1", "key2", IDX_COMMAND_STRING)));

transaction.lcsIdx("key1", "key2", LcsOptions.builder().withMatchLen().build());
results.add(
Pair.of(LCS, buildArgs("key1", "key2", IDX_COMMAND_STRING, WITHMATCHLEN_COMMAND_STRING)));

var protobufTransaction = transaction.getProtobufTransaction().build();

for (int idx = 0; idx < protobufTransaction.getCommandsCount(); idx++) {
Expand Down
14 changes: 14 additions & 0 deletions java/integTest/src/test/java/glide/SharedCommandTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import glide.api.models.commands.ConditionalChange;
import glide.api.models.commands.ExpireOptions;
import glide.api.models.commands.LPosOptions;
import glide.api.models.commands.LcsOptions;
import glide.api.models.commands.ListDirection;
import glide.api.models.commands.RangeOptions.InfLexBound;
import glide.api.models.commands.RangeOptions.InfScoreBound;
Expand Down Expand Up @@ -5449,5 +5450,18 @@ public void lcsIdx(BaseClient client) {

assertDeepEquals(expectedMatchesObject, client.lcsIdx(key1, key2).get().get("matches"));
assertEquals(8L, client.lcsIdx(key1, key2).get().get("len"));

expectedMatchesObject =
new Object[] {
new Object[] {new Long[] {6L, 10L}, new Long[] {8L, 12L}, 5L},
new Object[] {new Long[] {3L, 5L}, new Long[] {0L, 2L}, 3L}
};
assertDeepEquals(
expectedMatchesObject,
client
.lcsIdx(key1, key2, LcsOptions.builder().withMatchLen().build())
.get()
.get("matches"));
assertEquals(8L, client.lcsIdx(key1, key2).get().get("len"));
}
}
22 changes: 21 additions & 1 deletion java/integTest/src/test/java/glide/TransactionTestUtilities.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import glide.api.models.BaseTransaction;
import glide.api.models.commands.ExpireOptions;
import glide.api.models.commands.LPosOptions;
import glide.api.models.commands.LcsOptions;
import glide.api.models.commands.ListDirection;
import glide.api.models.commands.RangeOptions.InfLexBound;
import glide.api.models.commands.RangeOptions.InfScoreBound;
Expand Down Expand Up @@ -208,6 +209,20 @@ private static Object[] stringCommands(BaseTransaction<?> transaction) {
String stringKey7 = "{StringKey}-7-" + UUID.randomUUID();
String stringKey8 = "{StringKey}-8-" + UUID.randomUUID();

Map<String, Object> expectedLcsIdxObject =
Map.of(
"matches",
new Object[] {new Object[] {new Long[] {1L, 3L}, new Long[] {0L, 2L}}},
"len",
3L);

Map<String, Object> expectedLcsIdxWithMatchLenObject =
Map.of(
"matches",
new Object[] {new Object[] {new Long[] {1L, 3L}, new Long[] {0L, 2L}, 3L}},
"len",
3L);

transaction
.flushall()
.set(stringKey1, value1)
Expand Down Expand Up @@ -240,7 +255,9 @@ private static Object[] stringCommands(BaseTransaction<?> transaction) {
.lcs(stringKey6, stringKey7)
.lcs(stringKey6, stringKey8)
.lcsLen(stringKey6, stringKey7)
.lcsLen(stringKey6, stringKey8);
.lcsLen(stringKey6, stringKey8)
.lcsIdx(stringKey6, stringKey7)
.lcsIdx(stringKey6, stringKey7, LcsOptions.builder().withMatchLen().build());
}

var expectedResults =
Expand Down Expand Up @@ -281,6 +298,9 @@ private static Object[] stringCommands(BaseTransaction<?> transaction) {
"", // lcs(stringKey6, stringKey8)
3L, // lcsLEN(stringKey6, stringKey7)
0L, // lcsLEN(stringKey6, stringKey8)
expectedLcsIdxObject, // lcsIdx(stringKey6, stringKey7)
expectedLcsIdxWithMatchLenObject, // lcsIdx(stringKey6, stringKey7,
// LcsOptions.builder().withMatchLen().build())
});
}

Expand Down
8 changes: 7 additions & 1 deletion java/integTest/src/test/java/glide/cluster/CommandTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import glide.api.models.ClusterTransaction;
import glide.api.models.ClusterValue;
import glide.api.models.commands.InfoOptions;
import glide.api.models.commands.LcsOptions;
import glide.api.models.commands.ListDirection;
import glide.api.models.commands.RangeOptions.RangeByIndex;
import glide.api.models.commands.WeightAggregateOptions.KeyArray;
Expand Down Expand Up @@ -791,7 +792,12 @@ public static Stream<Arguments> callCrossSlotCommandsWhichShouldFail() {
Arguments.of("copy", "6.2.0", clusterClient.copy("abc", "def", true)),
Arguments.of("msetnx", null, clusterClient.msetnx(Map.of("abc", "def", "ghi", "jkl"))),
Arguments.of("lcs", "7.0.0", clusterClient.lcs("abc", "def")),
Arguments.of("lcsLEN", "7.0.0", clusterClient.lcsLen("abc", "def")));
Arguments.of("lcsLEN", "7.0.0", clusterClient.lcsLen("abc", "def")),
Arguments.of("lcsIdx", "7.0.0", clusterClient.lcsIdx("abc", "def")),
Arguments.of(
"lcsIdx",
"7.0.0",
clusterClient.lcsIdx("abc", "def", LcsOptions.builder().withMatchLen().build())));
}

@SneakyThrows
Expand Down

0 comments on commit 80cc5c9

Please sign in to comment.