From 93128066eb88e19212f1d863deda2a567bfcba4b Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Mon, 8 Nov 2010 22:04:25 +0200 Subject: [PATCH] + add Jredis support for set operations --- .../connection/jedis/JedisConnection.java | 4 +- .../connection/jredis/JredisConnection.java | 164 +++++++++++++++++- .../redis/connection/jredis/JredisUtils.java | 19 ++ 3 files changed, 179 insertions(+), 8 deletions(-) diff --git a/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/connection/jedis/JedisConnection.java b/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/connection/jedis/JedisConnection.java index 0da23aeaf..fb958d98c 100644 --- a/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/connection/jedis/JedisConnection.java +++ b/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/connection/jedis/JedisConnection.java @@ -417,7 +417,7 @@ public class JedisConnection implements RedisConnection { } // - // List operations + // List commands // @@ -588,7 +588,7 @@ public class JedisConnection implements RedisConnection { // - // Set operations + // Set commands // @Override diff --git a/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/connection/jredis/JredisConnection.java b/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/connection/jredis/JredisConnection.java index c09e97811..d1f04860e 100644 --- a/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/connection/jredis/JredisConnection.java +++ b/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/connection/jredis/JredisConnection.java @@ -15,9 +15,10 @@ */ package org.springframework.datastore.redis.connection.jredis; -import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.Set; import org.jredis.JRedis; import org.jredis.RedisException; @@ -226,6 +227,10 @@ public class JredisConnection implements RedisConnection { } } + // + // List commands + // + @Override public List bLPop(int timeout, String... keys) { throw new UnsupportedOperationException(); @@ -277,12 +282,8 @@ public class JredisConnection implements RedisConnection { public List lRange(String key, int start, int end) { try { List lrange = jredis.lrange(key, start, end); - List results = new ArrayList(lrange.size()); - for (byte[] bs : lrange) { - results.add(JredisUtils.convertToString(bs, encoding)); - } - return results; + return JredisUtils.convertToStringCollection(lrange, encoding, List.class); } catch (RedisException ex) { throw JredisUtils.convertJredisAccessException(ex); } @@ -343,4 +344,155 @@ public class JredisConnection implements RedisConnection { throw JredisUtils.convertJredisAccessException(ex); } } + + // + // Set commands + // + + @Override + public Boolean sAdd(String key, String value) { + try { + return jredis.sadd(key, value); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public Integer sCard(String key) { + try { + return Integer.valueOf((int) jredis.scard(key)); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public Set sDiff(String... keys) { + String set1 = keys[0]; + String[] sets = Arrays.copyOfRange(keys, 1, keys.length); + + try { + List result = jredis.sdiff(set1, sets); + return JredisUtils.convertToStringCollection(result, encoding, Set.class); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public void sDiffStore(String destKey, String... keys) { + String set1 = keys[0]; + String[] sets = Arrays.copyOfRange(keys, 1, keys.length); + + try { + jredis.sdiffstore(set1, sets); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public Set sInter(String... keys) { + String set1 = keys[0]; + String[] sets = Arrays.copyOfRange(keys, 1, keys.length); + + try { + List result = jredis.sinter(set1, sets); + return JredisUtils.convertToStringCollection(result, encoding, Set.class); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public void sInterStore(String destKey, String... keys) { + String set1 = keys[0]; + String[] sets = Arrays.copyOfRange(keys, 1, keys.length); + + try { + jredis.sinterstore(set1, sets); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public Boolean sIsMember(String key, String value) { + try { + return jredis.sismember(key, value); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public Set sMembers(String key) { + try { + return JredisUtils.convertToStringCollection(jredis.smembers(key), encoding, Set.class); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public Boolean sMove(String srcKey, String destKey, String value) { + try { + return jredis.smove(srcKey, destKey, value); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public String sPop(String key) { + try { + return JredisUtils.convertToString(jredis.spop(key), encoding); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public String sRandMember(String key) { + try { + return JredisUtils.convertToString(jredis.srandmember(key), encoding); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public Boolean sRem(String key, String value) { + try { + return jredis.srem(key, value); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public Set sUnion(String... keys) { + String set1 = keys[0]; + String[] sets = Arrays.copyOfRange(keys, 1, keys.length); + + try { + List result = jredis.sunion(set1, sets); + return JredisUtils.convertToStringCollection(result, encoding, Set.class); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } + + @Override + public void sUnionStore(String destKey, String... keys) { + String set1 = keys[0]; + String[] sets = Arrays.copyOfRange(keys, 1, keys.length); + + try { + jredis.sunionstore(set1, sets); + } catch (RedisException ex) { + throw JredisUtils.convertJredisAccessException(ex); + } + } } \ No newline at end of file diff --git a/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/connection/jredis/JredisUtils.java b/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/connection/jredis/JredisUtils.java index c995e156c..80d72e696 100644 --- a/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/connection/jredis/JredisUtils.java +++ b/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/connection/jredis/JredisUtils.java @@ -17,6 +17,10 @@ package org.springframework.datastore.redis.connection.jredis; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; import org.jredis.RedisException; import org.springframework.dao.DataAccessException; @@ -41,4 +45,19 @@ public abstract class JredisUtils { throw new DataRetrievalFailureException("Unsupported encoding " + encoding, ex); } } + + static > T convertToStringCollection(List bytes, String encoding, Class collectionType) { + + Collection col = (List.class.isAssignableFrom(collectionType) ? new ArrayList(bytes.size()) + : new LinkedHashSet(bytes.size())); + + try { + for (byte[] bs : bytes) { + col.add(new String(bs, encoding)); + } + return (T) col; + } catch (UnsupportedEncodingException ex) { + throw new DataRetrievalFailureException("Unsupported encoding " + encoding, ex); + } + } }