From ed68913d09b0aa032e3f7a8a495f22451c65bb64 Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Mon, 7 Mar 2011 19:51:50 +0200 Subject: [PATCH] DATAKV-36 + refactored SortQuery by adding get params as well --- .../keyvalue/redis/core/RedisTemplate.java | 30 +++++++------------ .../core/query/DefaultSortCriterion.java | 12 +++++++- .../redis/core/query/DefaultSortQuery.java | 13 ++++++-- .../redis/core/query/SortCriterion.java | 2 ++ .../keyvalue/redis/core/query/SortQuery.java | 13 ++++++-- 5 files changed, 46 insertions(+), 24 deletions(-) diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java index e28643db6..8f9f7ec77 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java @@ -1954,19 +1954,15 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation } // Sort operations + @SuppressWarnings("unchecked") public List sort(SortQuery query) { - return sort(query, null); - } - - public List sort(SortQuery query, String getKeyPattern) { - return sort(query, getKeyPattern, valueSerializer); + return sort(query, valueSerializer); } @SuppressWarnings("unchecked") - public List sort(SortQuery query, String getKeyPattern, RedisSerializer resultSerializer) { + public List sort(SortQuery query, RedisSerializer resultSerializer) { final byte[] rawKey = rawKey(query.getKey()); - final SortParameters params = convertQuery(query, - (getKeyPattern != null ? Collections.singletonList(getKeyPattern) : null), stringSerializer); + final SortParameters params = convertQuery(query, stringSerializer); List vals = execute(new RedisCallback>() { @Override @@ -1978,9 +1974,9 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation return (List) deserializeValues(vals, List.class, resultSerializer); } - public List sort(SortQuery query, List getKeyPattern, BulkMapper bulkMapper) { + public List sort(SortQuery query, BulkMapper bulkMapper) { final byte[] rawKey = rawKey(query.getKey()); - final SortParameters params = convertQuery(query, getKeyPattern, stringSerializer); + final SortParameters params = convertQuery(query, stringSerializer); List vals = execute(new RedisCallback>() { @Override @@ -1989,7 +1985,7 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation } }, true); - int bulkSize = getKeyPattern.size(); + int bulkSize = query.getGetPattern().size(); List result = new ArrayList(vals.size() / bulkSize + 1); final List bulk = new ArrayList(bulkSize); @@ -2006,14 +2002,10 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation return result; } - public void sortAndStore(SortQuery query, K storeKey) { - sortAndStore(query, null, storeKey); - } - - public void sortAndStore(SortQuery query, List getKeyPattern, K storeKey) { + public void sort(SortQuery query, K storeKey) { final byte[] rawStoreKey = rawKey(storeKey); final byte[] rawKey = rawKey(query.getKey()); - final SortParameters params = convertQuery(query, getKeyPattern, stringSerializer); + final SortParameters params = convertQuery(query, stringSerializer); execute(new RedisCallback() { @Override @@ -2024,10 +2016,10 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation }, true); } - private static SortParameters convertQuery(SortQuery query, List getKeyPattern, RedisSerializer stringSerializer) { + private static SortParameters convertQuery(SortQuery query, RedisSerializer stringSerializer) { return new DefaultSortParameters(stringSerializer.serialize(query.getBy()), query.getLimit(), serialize( - getKeyPattern, stringSerializer), query.getOrder(), query.isAlphabetic()); + query.getGetPattern(), stringSerializer), query.getOrder(), query.isAlphabetic()); } private static byte[][] serialize(List strings, RedisSerializer stringSerializer) { diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/DefaultSortCriterion.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/DefaultSortCriterion.java index 781105687..962631b3f 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/DefaultSortCriterion.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/DefaultSortCriterion.java @@ -15,6 +15,9 @@ */ package org.springframework.data.keyvalue.redis.core.query; +import java.util.ArrayList; +import java.util.List; + import org.springframework.data.keyvalue.redis.connection.SortParameters.Order; import org.springframework.data.keyvalue.redis.connection.SortParameters.Range; @@ -25,6 +28,7 @@ class DefaultSortCriterion implements SortCriterion { private final K key; private String by; + private final List getKeys = new ArrayList(4); private Range limit; private Order order; @@ -42,7 +46,7 @@ class DefaultSortCriterion implements SortCriterion { @Override public SortQuery build() { - return new DefaultSortQuery(key, by, limit, order, alpha); + return new DefaultSortQuery(key, by, limit, order, alpha, getKeys); } @Override @@ -63,6 +67,12 @@ class DefaultSortCriterion implements SortCriterion { return this; } + @Override + public SortCriterion get(String getPattern) { + this.getKeys.add(getPattern); + return this; + } + SortCriterion addBy(String keyPattern) { this.by = keyPattern; return this; diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/DefaultSortQuery.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/DefaultSortQuery.java index 7d01ab8b3..b07a75206 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/DefaultSortQuery.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/DefaultSortQuery.java @@ -15,6 +15,8 @@ */ package org.springframework.data.keyvalue.redis.core.query; +import java.util.List; + import org.springframework.data.keyvalue.redis.connection.SortParameters.Order; import org.springframework.data.keyvalue.redis.connection.SortParameters.Range; @@ -30,13 +32,15 @@ class DefaultSortQuery implements SortQuery { private final Order order; private final Range limit; private final String by; + private final List gets; - DefaultSortQuery(K key, String by, Range limit, Order order, Boolean alpha) { + DefaultSortQuery(K key, String by, Range limit, Order order, Boolean alpha, List gets) { this.key = key; this.by = by; this.limit = limit; this.order = order; this.alpha = alpha; + this.gets = gets; } @Override @@ -63,4 +67,9 @@ class DefaultSortQuery implements SortQuery { public K getKey() { return key; } -} + + @Override + public List getGetPattern() { + return gets; + } +} \ No newline at end of file diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortCriterion.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortCriterion.java index 2a27d3d66..ef21918a5 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortCriterion.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortCriterion.java @@ -31,5 +31,7 @@ public interface SortCriterion { SortCriterion alphabetical(boolean alpha); + SortCriterion get(String pattern); + SortQuery build(); } diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortQuery.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortQuery.java index 2399f2ba0..ff31bce5c 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortQuery.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortQuery.java @@ -15,6 +15,8 @@ */ package org.springframework.data.keyvalue.redis.core.query; +import java.util.List; + import org.springframework.data.keyvalue.redis.connection.SortParameters.Order; import org.springframework.data.keyvalue.redis.connection.SortParameters.Range; @@ -48,16 +50,23 @@ public interface SortQuery { Range getLimit(); /** - * Target key for sorting. + * Return the target key for sorting. * * @return */ K getKey(); /** - * Pattern of external key used for sorting. + * Returns the pattern of the external key used for sorting. * * @return */ String getBy(); + + /** + * Returns the external key(s) whose values are returned by the sort. + * + * @return + */ + List getGetPattern(); } \ No newline at end of file