Skip to content

Commit 6e46cfa

Browse files
author
Joubin Houshyar
committed
JRedis 1.0 RC1 updated to full compliance with Redis 1.2.6 release. Tested.
1 parent e562fb4 commit 6e46cfa

File tree

8 files changed

+244
-8
lines changed

8 files changed

+244
-8
lines changed

core/api/src/main/java/org/jredis/JRedis.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,16 @@ public interface JRedis {
610610
public long zcard (String setKey) throws RedisException;
611611

612612

613+
/**
614+
* @Redis ZCOUNT
615+
* @param setkey
616+
* @param minScore
617+
* @param maxScore
618+
* @return
619+
* @throws RedisException
620+
*/
621+
public long zcount (String setkey, double minScore, double maxScore) throws RedisException;
622+
613623
/**
614624
* @Redis ZSCORE
615625
* @param setkey
@@ -676,7 +686,7 @@ public interface JRedis {
676686
public List<ZSetEntry> zrevrangeSubset (String setkey, long from, long to) throws RedisException;
677687

678688
/**
679-
* @Redis ZRANGE
689+
* @Redis ZRANGEBYSCORE
680690
* @param setkey
681691
* @param from
682692
* @param to
@@ -685,6 +695,19 @@ public interface JRedis {
685695
*/
686696
public List<byte[]> zrangebyscore (String setkey, double minScore, double maxScore) throws RedisException;
687697

698+
/**
699+
* Equivalent to {@link JRedis#zrangebyscore(String, double, double)} with the {@link Command.Options#WITHSCORES}.
700+
* Unlike the general ZRANGEBYSCORE command that only returns the values, this method returns both
701+
* values and associated scores for the specified range.
702+
* @Redis ZRANGEBYSCORE ... WITHSCORES
703+
* @param setkey
704+
* @param from
705+
* @param to
706+
* @return
707+
* @throws RedisException
708+
*/
709+
public List<ZSetEntry> zrangebyscoreSubset (String setkey, double minScore, double maxScore) throws RedisException;
710+
688711
/**
689712
* @Redis ZREMRANGEBYSCORE
690713
* @param setkey

core/api/src/main/java/org/jredis/JRedisFuture.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import java.util.Map;
3838
import java.util.concurrent.ExecutionException;
3939
import java.util.concurrent.Future;
40+
import org.jredis.protocol.Command;
4041
import org.jredis.protocol.ResponseStatus;
4142

4243
/**
@@ -584,6 +585,15 @@ public interface JRedisFuture {
584585
*/
585586
public Future<Long> zcard (String setKey);
586587

588+
/**
589+
* @Redis ZCOUNT
590+
* @param setkey
591+
* @param minScore
592+
* @param maxScore
593+
* @return
594+
*/
595+
public Future<Long> zcount (String setkey, double minScore, double maxScore);
596+
587597
/**
588598
* @Redis ZSCORE
589599
* @param setkey
@@ -653,6 +663,18 @@ public interface JRedisFuture {
653663
*/
654664
public Future<List<byte[]>> zrangebyscore (String setkey, double minScore, double maxScore);
655665

666+
/**
667+
* Equivalent to {@link JRedis#zrangebyscore(String, double, double)} with the {@link Command.Options#WITHSCORES}.
668+
* Unlike the general ZRANGEBYSCORE command that only returns the values, this method returns both
669+
* values and associated scores for the specified range.
670+
* @Redis ZRANGEBYSCORE ... WITHSCORES
671+
* @param setkey
672+
* @param from
673+
* @param to
674+
* @return
675+
*/
676+
public Future<List<ZSetEntry>> zrangebyscoreSubset (String setkey, double minScore, double maxScore);
677+
656678
/**
657679
* @Redis ZREMRANGEBYSCORE
658680
* @param setkey

core/api/src/main/java/org/jredis/protocol/Command.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,14 @@ public enum Command {
103103
ZCARD (RequestType.KEY, ResponseType.NUMBER),
104104
ZSCORE (RequestType.KEY_VALUE, ResponseType.BULK),
105105
ZRANGE (RequestType.KEY_NUM_NUM, ResponseType.MULTI_BULK),
106-
ZRANGE$OPTS (RequestType.KEY_NUM_NUM_OPTS, ResponseType.MULTI_BULK),
107-
ZREVRANGE (RequestType.KEY_NUM_NUM, ResponseType.MULTI_BULK),
108-
ZREVRANGE$OPTS (RequestType.KEY_NUM_NUM_OPTS, ResponseType.MULTI_BULK),
109-
ZINCRBY (RequestType.KEY_IDX_VALUE, ResponseType.BULK),
110-
ZRANGEBYSCORE (RequestType.KEY_NUM_NUM, ResponseType.MULTI_BULK),
111-
ZREMRANGEBYSCORE (RequestType.KEY_NUM_NUM, ResponseType.NUMBER),
106+
ZCOUNT (RequestType.KEY_NUM_NUM, ResponseType.NUMBER),
107+
ZRANGE$OPTS (RequestType.KEY_NUM_NUM_OPTS, ResponseType.MULTI_BULK),
108+
ZREVRANGE (RequestType.KEY_NUM_NUM, ResponseType.MULTI_BULK),
109+
ZREVRANGE$OPTS (RequestType.KEY_NUM_NUM_OPTS, ResponseType.MULTI_BULK),
110+
ZINCRBY (RequestType.KEY_IDX_VALUE, ResponseType.BULK),
111+
ZRANGEBYSCORE (RequestType.KEY_NUM_NUM, ResponseType.MULTI_BULK),
112+
ZRANGEBYSCORE$OPTS (RequestType.KEY_NUM_NUM_OPTS, ResponseType.MULTI_BULK),
113+
ZREMRANGEBYSCORE (RequestType.KEY_NUM_NUM, ResponseType.NUMBER),
112114

113115

114116
// "Multiple databases handling commands"

core/ri/src/main/java/org/jredis/ri/alphazero/JRedisFutureSupport.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,18 @@ public Future<Long> zcard(String key) {
487487
return new FutureLong (futureResponse);
488488
}
489489

490+
// @Override
491+
public Future<Long> zcount(String key, double minScore, double maxScore) {
492+
byte[] keybytes = null;
493+
if((keybytes = getKeyBytes(key)) == null)
494+
throw new IllegalArgumentException ("invalid key => ["+key+"]");
495+
496+
byte[] minScoreBytes = Convert.toBytes(minScore);
497+
byte[] maxScoreBytes = Convert.toBytes(maxScore);
498+
499+
return new FutureLong(this.queueRequest(Command.ZCOUNT, keybytes, minScoreBytes, maxScoreBytes));
500+
}
501+
490502
public Future<byte[]> srandmember (String key) {
491503
byte[] keybytes = null;
492504
if((keybytes = getKeyBytes(key)) == null)
@@ -756,6 +768,18 @@ public Future<List<byte[]>> zrangebyscore(String key, double minScore, double ma
756768
return new FutureByteArrayList(this.queueRequest(Command.ZRANGEBYSCORE, keybytes, minScoreBytes, maxScoreBytes));
757769
}
758770

771+
// @Override
772+
public Future<List<ZSetEntry>> zrangebyscoreSubset(String key, double minScore, double maxScore) {
773+
byte[] keybytes = null;
774+
if((keybytes = getKeyBytes(key)) == null)
775+
throw new IllegalArgumentException ("invalid key => ["+key+"]");
776+
777+
byte[] minScoreBytes = Convert.toBytes(minScore);
778+
byte[] maxScoreBytes = Convert.toBytes(maxScore);
779+
780+
return new FutureZSetList(this.queueRequest(Command.ZRANGEBYSCORE$OPTS, keybytes, minScoreBytes, maxScoreBytes, Command.Options.WITHSCORES.bytes));
781+
}
782+
759783
// @Override
760784
public Future<Long> zremrangebyscore(String key, double minScore, double maxScore) {
761785
byte[] keybytes = null;

core/ri/src/main/java/org/jredis/ri/alphazero/JRedisSupport.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,26 @@ public long zcard(String key) throws RedisException {
728728
return value;
729729
}
730730

731+
// @Override
732+
public long zcount (String key, double minScore, double maxScore) throws RedisException {
733+
byte[] keybytes = null;
734+
if((keybytes = getKeyBytes(key)) == null)
735+
throw new IllegalArgumentException ("invalid key => ["+key+"]");
736+
737+
byte[] fromBytes = Convert.toBytes(minScore);
738+
byte[] toBytes = Convert.toBytes(maxScore);
739+
740+
long resp = Long.MIN_VALUE;
741+
try {
742+
ValueResponse valueResponse = (ValueResponse) this.serviceRequest(Command.ZCOUNT, keybytes, fromBytes, toBytes);
743+
resp = valueResponse.getLongValue();
744+
}
745+
catch (ClassCastException e){
746+
throw new ProviderException("Expecting a numeric ValueResponse here => " + e.getLocalizedMessage(), e);
747+
}
748+
return resp;
749+
}
750+
731751
public byte[] srandmember (String setkey) throws RedisException {
732752
byte[] keybytes = null;
733753
if((keybytes = getKeyBytes(setkey)) == null)
@@ -1054,6 +1074,32 @@ public List<byte[]> zrangebyscore (String key, double minScore, double maxScore)
10541074
return multiBulkData;
10551075
}
10561076

1077+
// @Override
1078+
public List<ZSetEntry> zrangebyscoreSubset(String key, double minScore, double maxScore) throws RedisException {
1079+
byte[] keybytes = null;
1080+
if((keybytes = getKeyBytes(key)) == null)
1081+
throw new IllegalArgumentException ("invalid key => ["+key+"]");
1082+
1083+
byte[] fromBytes = Convert.toBytes(minScore);
1084+
byte[] toBytes = Convert.toBytes(maxScore);
1085+
1086+
List<ZSetEntry> list= null;
1087+
try {
1088+
MultiBulkResponse multiBulkResponse = (MultiBulkResponse) this.serviceRequest(Command.ZRANGEBYSCORE$OPTS, keybytes, fromBytes, toBytes, Command.Options.WITHSCORES.bytes);
1089+
List<byte[]> bulkData = multiBulkResponse.getMultiBulkData();
1090+
if(null != bulkData){
1091+
list = new ArrayList<ZSetEntry>(bulkData.size()/2);
1092+
for(int i=0; i<bulkData.size(); i+=2){
1093+
list.add(new ZSetEntryImpl(bulkData.get(i), bulkData.get(i+1)));
1094+
}
1095+
}
1096+
}
1097+
catch (ClassCastException e){
1098+
throw new ProviderException("Expecting a MultiBulkResponse here => " + e.getLocalizedMessage(), e);
1099+
}
1100+
return list;
1101+
}
1102+
10571103
// @Override
10581104
public long zremrangebyscore (String key, double minScore, double maxScore) throws RedisException {
10591105
byte[] keybytes = null;

core/ri/src/test/java/org/jredis/ri/alphazero/JRedisFutureProviderTestsBase.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,77 @@ public void testZrangebyscoreStringByteArray() throws InterruptedException{
516516
catch (ClientRuntimeException e) { fail(cmd + " Runtime ERROR => " + e.getLocalizedMessage(), e); }
517517
}
518518

519+
@Test
520+
public void testZcountStringByteArray() throws InterruptedException{
521+
cmd = Command.ZCOUNT.code + " byte[] | " + Command.ZADD.code + " byte[]";
522+
Log.log("TEST: %s command", cmd);
523+
524+
try {
525+
provider.flushdb();
526+
String setkey = keys.get(0);
527+
List<Future<Boolean>> expectedOKResponses = new ArrayList<Future<Boolean>>();
528+
for(int i=0;i<MEDIUM_CNT; i++)
529+
expectedOKResponses.add (provider.zadd(setkey, i, dataList.get(i)));
530+
531+
Future<Long> frCount = provider.zcount(setkey, 0, SMALL_CNT);
532+
try {
533+
for(Future<Boolean> resp : expectedOKResponses)
534+
assertTrue (resp.get().booleanValue(), "zadd of random element should have been true");
535+
536+
long remCnt = frCount.get().longValue();
537+
assertTrue(remCnt > 0, "should have non-zero number of rem cnt for zremrangebyscore");
538+
assertEquals(remCnt, SMALL_CNT+1, "should have specific number for zcount");
539+
}
540+
catch(ExecutionException e){
541+
Throwable cause = e.getCause();
542+
fail(cmd + " ERROR => " + cause.getLocalizedMessage(), e);
543+
}
544+
}
545+
catch (ClientRuntimeException e) { fail(cmd + " Runtime ERROR => " + e.getLocalizedMessage(), e); }
546+
}
547+
548+
549+
@Test
550+
public void testZrangebyscoreWithscoresStringByteArray() throws InterruptedException{
551+
cmd = Command.ZRANGEBYSCORE$OPTS.code + " byte[] | " + Command.ZSCORE.code + " byte[]";
552+
Log.log("TEST: %s command", cmd);
519553

554+
try {
555+
provider.flushdb();
556+
String setkey = keys.get(0);
557+
List<Future<Boolean>> expectedOKResponses = new ArrayList<Future<Boolean>>();
558+
for(int i=0;i<MEDIUM_CNT; i++)
559+
expectedOKResponses.add (provider.zadd(setkey, i, dataList.get(i)));
560+
561+
Future<List<byte[]>> frZValues = provider.zrange(setkey, 0, SMALL_CNT);
562+
Future<List<ZSetEntry>> frSubset = provider.zrangebyscoreSubset(setkey, 0, SMALL_CNT);
563+
564+
try {
565+
for(Future<Boolean> resp : expectedOKResponses)
566+
assertTrue (resp.get().booleanValue(), "zadd of random element should have been true");
567+
568+
List<byte[]> zvalues = frZValues.get();
569+
List<ZSetEntry> zsubset = frSubset.get();
570+
571+
assertTrue(zvalues.size() > 0, "should have non empty results for range by score here");
572+
assertTrue(zsubset.size() > 0, "should have non empty results for range by score here");
573+
assertEquals(zsubset.size(), zvalues.size(), "size of collections should be equal");
574+
575+
for(int i=0;i<SMALL_CNT; i++){
576+
assertEquals(zsubset.get(i).getValue(), dataList.get(i), "value of element from zrange_withscore");
577+
assertEquals(zsubset.get(i).getValue(), zvalues.get(i), "value of element from zrange_withscore compared with zscore with same range query");
578+
assertEquals (zsubset.get(i).getScore(), (double)i, "score of element from zrange_withscore");
579+
assertTrue(zsubset.get(i).getScore() <= zsubset.get(i+1).getScore(), "range member score should be smaller or equal to previous range member. idx: " + i);
580+
if(i>0) assertTrue(zsubset.get(i).getScore() >= zsubset.get(i-1).getScore(), "range member score should be bigger or equal to previous range member. idx: " + i);
581+
}
582+
}
583+
catch(ExecutionException e){
584+
Throwable cause = e.getCause();
585+
fail(cmd + " ERROR => " + cause.getLocalizedMessage(), e);
586+
}
587+
}
588+
catch (ClientRuntimeException e) { fail(cmd + " Runtime ERROR => " + e.getLocalizedMessage(), e); }
589+
}
520590
@Test
521591
public void testZrangeWithscoresStringByteArray() throws InterruptedException{
522592
cmd = Command.ZRANGE$OPTS.code + " byte[] | " + Command.ZSCORE.code + " byte[]";

core/ri/src/test/java/org/jredis/ri/alphazero/JRedisProviderTestsBase.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1663,6 +1663,35 @@ public void testZrangeWithscoresStringByteArray() {
16631663
catch (RedisException e) { fail(cmd + " ERROR => " + e.getLocalizedMessage(), e); }
16641664
}
16651665

1666+
@Test
1667+
public void testZrangebyscoreWithscoresStringByteArray() {
1668+
cmd = Command.ZRANGEBYSCORE$OPTS.code + " byte[]";
1669+
Log.log("TEST: %s command", cmd);
1670+
try {
1671+
provider.flushdb();
1672+
1673+
String setkey = keys.get(0);
1674+
for(int i=0;i<MEDIUM_CNT; i++)
1675+
assertTrue(provider.zadd(setkey, i, dataList.get(i)), "zadd of random element should be true");
1676+
1677+
List<byte[]> zvalues = provider.zrangebyscore(setkey, 0, SMALL_CNT);
1678+
List<ZSetEntry> zsubset = provider.zrangebyscoreSubset(setkey, 0, SMALL_CNT);
1679+
1680+
assertTrue(zvalues.size() > 0, "should have non empty results for range by score here");
1681+
assertTrue(zsubset.size() > 0, "should have non empty results for range by score here");
1682+
assertEquals(zsubset.size(), zvalues.size(), "size of collections should be equal");
1683+
1684+
for(int i=0;i<SMALL_CNT; i++){
1685+
assertEquals(zsubset.get(i).getValue(), dataList.get(i), "value of element from zrange_withscore");
1686+
assertEquals(zsubset.get(i).getValue(), zvalues.get(i), "value of element from zrange_withscore compared with zscore with same range query");
1687+
assertEquals (zsubset.get(i).getScore(), (double)i, "score of element from zrange_withscore");
1688+
assertTrue(zsubset.get(i).getScore() <= zsubset.get(i+1).getScore(), "range member score should be smaller or equal to previous range member. idx: " + i);
1689+
if(i>0) assertTrue(zsubset.get(i).getScore() >= zsubset.get(i-1).getScore(), "range member score should be bigger or equal to previous range member. idx: " + i);
1690+
}
1691+
}
1692+
catch (RedisException e) { fail(cmd + " ERROR => " + e.getLocalizedMessage(), e); }
1693+
}
1694+
16661695
@Test
16671696
public void testZrevrangeWithscoresStringByteArray() {
16681697
cmd = Command.ZREVRANGE$OPTS.code + " byte[]";
@@ -2191,6 +2220,24 @@ public void testZcard() {
21912220
catch (RedisException e) { fail(cmd + " ERROR => " + e.getLocalizedMessage(), e); }
21922221
}
21932222

2223+
@Test
2224+
public void testZcountStringByteArray() {
2225+
cmd = Command.ZCOUNT.code + " byte[]";
2226+
Log.log("TEST: %s command", cmd);
2227+
try {
2228+
provider.flushdb();
2229+
2230+
String setkey = keys.get(0);
2231+
for(int i=0;i<MEDIUM_CNT; i++)
2232+
assertTrue(provider.zadd(setkey, i, dataList.get(i)), "zadd of random element should be true");
2233+
2234+
long remCnt = provider.zremrangebyscore(setkey, 0, SMALL_CNT);
2235+
assertTrue(remCnt > 0, "should have non-zero number of rem cnt for zremrangebyscore");
2236+
assertEquals(remCnt, SMALL_CNT+1, "should have specific number of rem cnt for zremrangebyscore");
2237+
}
2238+
catch (RedisException e) { fail(cmd + " ERROR => " + e.getLocalizedMessage(), e); }
2239+
}
2240+
21942241
/**
21952242
* Test method for {@link org.jredis.ri.alphazero.JRedisSupport#sinter(java.lang.String, java.lang.String[])}.
21962243
*/

redis_version_compliance.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
Redis 1.2.n
1+
compliance: Redis 1.2.n
2+
tested with: Redis 1.2.6
3+

0 commit comments

Comments
 (0)