Skip to content

Commit cdefb2e

Browse files
committed
Add Hash Field Expiration commands to TypeHints for Lettuce.
1 parent d750240 commit cdefb2e

File tree

4 files changed

+63
-1
lines changed

4 files changed

+63
-1
lines changed

src/main/antora/modules/ROOT/pages/appendix.adoc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ link:https://www.springframework.org/schema/redis/spring-redis-1.0.xsd[Spring Da
6767
|GETSET |X
6868
|HDEL |X
6969
|HEXISTS |X
70+
|HEXPIRE |X
71+
|HEXPIREAT |X
72+
|HPEXPIRE |X
73+
|HPEXPIREAT |X
74+
|HPERSIST |X
75+
|HTTL |X
76+
|HPTTL |X
7077
|HGET |X
7178
|HGETALL |X
7279
|HINCRBY |X

src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,14 @@ static class TypeHints {
11601160
COMMAND_OUTPUT_TYPE_MAPPING.put(PFMERGE, IntegerOutput.class);
11611161
COMMAND_OUTPUT_TYPE_MAPPING.put(PFADD, IntegerOutput.class);
11621162

1163+
COMMAND_OUTPUT_TYPE_MAPPING.put(HEXPIRE, IntegerListOutput.class);
1164+
COMMAND_OUTPUT_TYPE_MAPPING.put(HEXPIREAT, IntegerListOutput.class);
1165+
COMMAND_OUTPUT_TYPE_MAPPING.put(HPEXPIRE, IntegerListOutput.class);
1166+
COMMAND_OUTPUT_TYPE_MAPPING.put(HPEXPIREAT, IntegerListOutput.class);
1167+
COMMAND_OUTPUT_TYPE_MAPPING.put(HPERSIST, IntegerListOutput.class);
1168+
COMMAND_OUTPUT_TYPE_MAPPING.put(HTTL, IntegerListOutput.class);
1169+
COMMAND_OUTPUT_TYPE_MAPPING.put(HPTTL, IntegerListOutput.class);
1170+
11631171
// DOUBLE
11641172
COMMAND_OUTPUT_TYPE_MAPPING.put(HINCRBYFLOAT, DoubleOutput.class);
11651173
COMMAND_OUTPUT_TYPE_MAPPING.put(INCRBYFLOAT, DoubleOutput.class);

src/main/java/org/springframework/data/redis/core/RedisCommand.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@ public enum RedisCommand {
107107
HSET("w", 3, 3), //
108108
HSETNX("w", 3, 3), //
109109
HVALS("r", 1, 1), //
110+
HEXPIRE("w", 5), //
111+
HEXPIREAT("w", 5), //
112+
HPEXPIRE("w", 5), //
113+
HPEXPIREAT("w", 5), //
114+
HPERSIST("w", 4), //
115+
HTTL("r", 4), //
116+
HPTTL("r", 4), //
110117
// -- I
111118
INCR("rw", 1), //
112119
INCRBYFLOAT("rw", 2, 2), //

src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
import org.springframework.data.redis.test.condition.RedisDriver;
9999
import org.springframework.data.redis.test.util.HexStringUtils;
100100
import org.springframework.data.util.Streamable;
101+
import org.springframework.util.ObjectUtils;
101102

102103
/**
103104
* Base test class for AbstractConnection integration tests
@@ -752,6 +753,45 @@ void testExecute() {
752753
assertThat(stringSerializer.deserialize((byte[]) getResults().get(1))).isEqualTo("bar");
753754
}
754755

756+
@Test
757+
@EnabledOnCommand("HEXPIRE")
758+
void testExecuteHashFieldExpiration() {
759+
760+
actual.add(connection.hSet("foo", "bar", "field"));
761+
actual.add(connection.execute("HTTL", "foo", "FIELDS", "1", "bar"));
762+
actual.add(connection.execute("HEXPIRE", "foo", "100", "NX", "FIELDS", "1", "bar"));
763+
actual.add(connection.execute("HPERSIST", "foo", "FIELDS", "1", "bar"));
764+
actual.add(connection.execute("HTTL", "foo", "FIELDS", "1", "bar"));
765+
766+
List<Object> results = getResults();
767+
768+
assertThat(deserializeList(results, 1, stringSerializer)).containsOnly(-1L);
769+
assertThat(deserializeList(results, 2, stringSerializer)).containsOnly(1L);
770+
assertThat(deserializeList(results, 3, stringSerializer)).containsOnly(1L);
771+
assertThat(deserializeList(results, 4, stringSerializer)).containsOnly(-1L);
772+
}
773+
774+
List<Object> deserializeList(List<Object> objects, int index, RedisSerializer<?> serializer) {
775+
776+
List<Object> result = new ArrayList<>();
777+
Object o = objects.get(index);
778+
if (o instanceof List<?> ls) {
779+
for (Object obj : ls) {
780+
781+
if (obj instanceof byte[]) {
782+
result.add(serializer.deserialize((byte[]) obj));
783+
} else {
784+
result.add(obj);
785+
}
786+
}
787+
788+
return result;
789+
}
790+
791+
throw new IllegalArgumentException(
792+
"Object at index " + index + " is not a list but " + ObjectUtils.nullSafeToString(o));
793+
}
794+
755795
@Test
756796
void testExecuteNoArgs() {
757797

@@ -3436,7 +3476,7 @@ void hStrLenReturnsZeroWhenKeyDoesNotExist() {
34363476
@Test
34373477
@EnabledOnCommand("HEXPIRE")
34383478
public void hExpireReturnsSuccessAndSetsTTL() {
3439-
3479+
34403480
actual.add(connection.hSet("hash-hexpire", "key-2", "value-2"));
34413481
actual.add(connection.hExpire("hash-hexpire", 5L, "key-2"));
34423482
actual.add(connection.hTtl("hash-hexpire", "key-2"));

0 commit comments

Comments
 (0)