From 15b18abe74330112133031d2a1d48defb979966c Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 24 May 2017 16:25:03 +0300 Subject: [PATCH] RScoredSortedSet.firstScore, lastScore methods added. #811 --- .../org/redisson/RedissonScoredSortedSet.java | 21 ++++++++ .../org/redisson/api/RScoredSortedSet.java | 4 ++ .../redisson/api/RScoredSortedSetAsync.java | 4 ++ .../client/protocol/RedisCommands.java | 3 +- .../ObjectFirstScoreReplayDecoder.java | 49 +++++++++++++++++++ .../redisson/RedissonScoredSortedSetTest.java | 11 +++++ 6 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectFirstScoreReplayDecoder.java diff --git a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java index 7bf4a1521..01a6cc955 100644 --- a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -143,6 +143,27 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc public RFuture lastAsync() { return commandExecutor.readAsync(getName(), codec, RedisCommands.ZRANGE_SINGLE, getName(), -1, -1); } + + @Override + public Double firstScore() { + return get(firstScoreAsync()); + } + + @Override + public RFuture firstScoreAsync() { + return commandExecutor.readAsync(getName(), codec, RedisCommands.ZRANGE_SINGLE_SCORE, getName(), 0, 0, "WITHSCORES"); + } + + @Override + public Double lastScore() { + return get(lastScoreAsync()); + } + + @Override + public RFuture lastScoreAsync() { + return commandExecutor.readAsync(getName(), codec, RedisCommands.ZRANGE_SINGLE_SCORE, getName(), -1, -1, "WITHSCORES"); + } + @Override public RFuture addAsync(double score, V object) { diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java index 72b548972..869ab8dcb 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java @@ -52,6 +52,10 @@ public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable< V first(); V last(); + + Double firstScore(); + + Double lastScore(); Long addAll(Map objects); diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java index 25bcfe5e4..2a98c42d0 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java @@ -37,6 +37,10 @@ public interface RScoredSortedSetAsync extends RExpirableAsync, RSortableAsyn RFuture firstAsync(); RFuture lastAsync(); + + RFuture firstScoreAsync(); + + RFuture lastScoreAsync(); RFuture addAllAsync(Map objects); diff --git a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java index a91c4dda6..b46ded991 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -46,11 +46,11 @@ import org.redisson.client.protocol.decoder.ListResultReplayDecoder; import org.redisson.client.protocol.decoder.ListScanResult; import org.redisson.client.protocol.decoder.ListScanResultReplayDecoder; import org.redisson.client.protocol.decoder.Long2MultiDecoder; -import org.redisson.client.protocol.decoder.LongMultiDecoder; import org.redisson.client.protocol.decoder.MapScanResult; import org.redisson.client.protocol.decoder.MapScanResultReplayDecoder; import org.redisson.client.protocol.decoder.NestedMultiDecoder; import org.redisson.client.protocol.decoder.ObjectFirstResultReplayDecoder; +import org.redisson.client.protocol.decoder.ObjectFirstScoreReplayDecoder; import org.redisson.client.protocol.decoder.ObjectListReplayDecoder; import org.redisson.client.protocol.decoder.ObjectMapEntryReplayDecoder; import org.redisson.client.protocol.decoder.ObjectMapReplayDecoder; @@ -115,6 +115,7 @@ public interface RedisCommands { RedisCommand ZREVRANK_INT = new RedisCommand("ZREVRANK", new IntegerReplayConvertor(), 2); RedisStrictCommand ZRANK = new RedisStrictCommand("ZRANK", 2); RedisCommand ZRANGE_SINGLE = new RedisCommand("ZRANGE", new ObjectFirstResultReplayDecoder()); + RedisStrictCommand ZRANGE_SINGLE_SCORE = new RedisStrictCommand("ZRANGE", new ObjectFirstScoreReplayDecoder()); RedisCommand> ZRANGE = new RedisCommand>("ZRANGE", new ObjectListReplayDecoder()); RedisStrictCommand ZREMRANGEBYRANK = new RedisStrictCommand("ZREMRANGEBYRANK", new IntegerReplayConvertor()); RedisStrictCommand ZREMRANGEBYSCORE = new RedisStrictCommand("ZREMRANGEBYSCORE", new IntegerReplayConvertor()); diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectFirstScoreReplayDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectFirstScoreReplayDecoder.java new file mode 100644 index 000000000..19a0bf0c5 --- /dev/null +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectFirstScoreReplayDecoder.java @@ -0,0 +1,49 @@ +/** + * Copyright 2016 Nikita Koksharov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.redisson.client.protocol.decoder; + +import java.math.BigDecimal; +import java.util.List; + +import org.redisson.client.handler.State; + +import io.netty.buffer.ByteBuf; +import io.netty.util.CharsetUtil; + +/** + * + * @author Nikita Koksharov + * + * + */ +public class ObjectFirstScoreReplayDecoder implements MultiDecoder { + + @Override + public Object decode(ByteBuf buf, State state) { + return new BigDecimal(buf.toString(CharsetUtil.UTF_8)).doubleValue(); + } + + @Override + public Double decode(List parts, State state) { + return (Double) parts.get(1); + } + + @Override + public boolean isApplicable(int paramNum, State state) { + return paramNum % 2 != 0; + } + +} diff --git a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java index cf7d0d3c6..e90447e83 100644 --- a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java +++ b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java @@ -274,7 +274,18 @@ public class RedissonScoredSortedSetTest extends BaseTest { Assert.assertEquals("a", set.first()); Assert.assertEquals("d", set.last()); } + + @Test + public void testFirstLastScore() { + RScoredSortedSet set = redisson.getScoredSortedSet("simple"); + set.add(0.1, "a"); + set.add(0.2, "b"); + set.add(0.3, "c"); + set.add(0.4, "d"); + assertThat(set.firstScore()).isEqualTo(0.1); + assertThat(set.lastScore()).isEqualTo(0.4); + } @Test public void testRemoveRangeByScore() {