From 7b3a358752138e0411d2292c89d3a41a9124da11 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 6 Jun 2014 07:54:23 +0200 Subject: [PATCH] DATAREDIS-313 - Overhaul SCAN, HSCAN, SSCAN, ZSCAN operations. Unify naming and return types. Update supported commands documentation. Remove key from BoundHashOperations and use getKey() instead. Prevent error when trying to read values when there are no values present. --- .../connection/lettuce/LettuceConnection.java | 23 +++++++++++++------ .../connection/lettuce/LettuceConverters.java | 8 +++++++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java index 0dee9252a..c3fa4e82c 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java @@ -3112,8 +3112,7 @@ public class LettuceConnection implements RedisConnection { List result = eval(script.getBytes(), ReturnType.MULTI, 0); String nextCursorId = LettuceConverters.bytesToString().convert((byte[]) result.get(0)); - @SuppressWarnings("unchecked") - Map values = LettuceConverters.toMap((List) result.get(1)); + Map values = failsafeReadScanValues(result, LettuceConverters.bytesListToMapConverter()); return new ScanIteration>(Long.valueOf(nextCursorId), values.entrySet()); } }.open(); @@ -3139,7 +3138,6 @@ public class LettuceConnection implements RedisConnection { return new KeyBoundCursor(key, cursorId, options) { - @SuppressWarnings("unchecked") @Override protected ScanIteration doScan(byte[] key, long cursorId, ScanOptions options) { @@ -3154,7 +3152,8 @@ public class LettuceConnection implements RedisConnection { List result = eval(script.getBytes(), ReturnType.MULTI, 0); String nextCursorId = LettuceConverters.bytesToString().convert((byte[]) result.get(0)); - return new ScanIteration(Long.valueOf(nextCursorId), ((ArrayList) result.get(1))); + List values = failsafeReadScanValues(result, null); + return new ScanIteration(Long.valueOf(nextCursorId), values); } }.open(); } @@ -3179,7 +3178,6 @@ public class LettuceConnection implements RedisConnection { return new KeyBoundCursor(key, cursorId, options) { - @SuppressWarnings("unchecked") @Override protected ScanIteration doScan(byte[] key, long cursorId, ScanOptions options) { @@ -3194,12 +3192,23 @@ public class LettuceConnection implements RedisConnection { List result = eval(script.getBytes(), ReturnType.MULTI, 0); String nextCursorId = LettuceConverters.bytesToString().convert((byte[]) result.get(0)); - return new ScanIteration(Long.valueOf(nextCursorId), LettuceConverters.toTuple((List) result - .get(1))); + List values = failsafeReadScanValues(result, LettuceConverters.bytesListToTupleListConverter()); + return new ScanIteration(Long.valueOf(nextCursorId), values); } }.open(); } + @SuppressWarnings("unchecked") + private T failsafeReadScanValues(List source, @SuppressWarnings("rawtypes") Converter converter) { + + try { + return (T) (converter != null ? converter.convert(source.get(1)) : source.get(1)); + } catch (IndexOutOfBoundsException e) { + // ignore this one + } + return null; + } + /** * Specifies if pipelined and transaction results should be converted to the expected data type. If false, results of * {@link #closePipeline()} and {@link #exec()} will be of the type returned by the Lettuce driver diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java index 6882d60e9..489a2fcc3 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java @@ -174,6 +174,10 @@ abstract public class LettuceConverters extends Converters { return BYTES_LIST_TO_TUPLE_LIST_CONVERTER.convert(list); } + public static Converter, List> bytesListToTupleListConverter() { + return BYTES_LIST_TO_TUPLE_LIST_CONVERTER; + } + public static Converter> stringToRedisClientListConverter() { return new Converter>() { @@ -290,6 +294,10 @@ abstract public class LettuceConverters extends Converters { return BYTES_LIST_TO_MAP.convert(source); } + public static Converter, Map> bytesListToMapConverter() { + return BYTES_LIST_TO_MAP; + } + public static SortArgs toSortArgs(SortParameters params) { SortArgs args = new SortArgs(); if (params == null) {