From dd02c3f55ada9b361d19d7798fc09238e75e7aef Mon Sep 17 00:00:00 2001 From: Nikita Date: Thu, 22 Sep 2016 18:10:22 +0300 Subject: [PATCH] RScoredSortedSet.intersection methods implemented. #595 --- .../org/redisson/RedissonScoredSortedSet.java | 55 +++++++++++++++++++ .../org/redisson/api/RScoredSortedSet.java | 15 +++++ .../redisson/api/RScoredSortedSetAsync.java | 9 +++ .../client/protocol/RedisCommands.java | 1 + .../redisson/RedissonScoredSortedSetTest.java | 41 ++++++++++++++ 5 files changed, 121 insertions(+) diff --git a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java index 12cf4f771..96dc76fe8 100644 --- a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -31,6 +31,7 @@ import org.redisson.api.RFuture; import org.redisson.api.RScoredSortedSet; import org.redisson.client.codec.Codec; import org.redisson.client.codec.DoubleCodec; +import org.redisson.client.codec.LongCodec; import org.redisson.client.codec.ScoredCodec; import org.redisson.client.protocol.RedisCommand; import org.redisson.client.protocol.RedisCommand.ValueType; @@ -488,4 +489,58 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc return commandExecutor.readAsync(getName(), codec, RedisCommands.ZCOUNT, getName(), startValue, endValue); } + @Override + public int intersection(String... names) { + return get(intersectionAsync(names)); + } + + public RFuture intersectionAsync(String... names) { + return intersectionAsync(Aggregate.SUM, names); + } + + @Override + public int intersection(Aggregate aggregate, String... names) { + return get(intersectionAsync(aggregate, names)); + } + + public RFuture intersectionAsync(Aggregate aggregate, String... names) { + List args = new ArrayList(names.length + 4); + args.add(getName()); + args.add(names.length); + args.addAll(Arrays.asList(names)); + args.add("AGGREGATE"); + args.add(aggregate.name()); + return commandExecutor.writeAsync(getName(), LongCodec.INSTANCE, RedisCommands.ZINTERSTORE_INT, args.toArray()); + } + + @Override + public int intersection(Map nameWithWeight) { + return get(intersectionAsync(nameWithWeight)); + } + + public RFuture intersectionAsync(Map nameWithWeight) { + return intersectionAsync(Aggregate.SUM, nameWithWeight); + } + + @Override + public int intersection(Aggregate aggregate, Map nameWithWeight) { + return get(intersectionAsync(aggregate, nameWithWeight)); + } + + public RFuture intersectionAsync(Aggregate aggregate, Map nameWithWeight) { + List args = new ArrayList(nameWithWeight.size()*2 + 5); + args.add(getName()); + args.add(nameWithWeight.size()); + args.addAll(nameWithWeight.keySet()); + args.add("WEIGHTS"); + List weights = new ArrayList(); + for (Double weight : nameWithWeight.values()) { + weights.add(BigDecimal.valueOf(weight).toPlainString()); + } + args.addAll(weights); + args.add("AGGREGATE"); + args.add(aggregate.name()); + return commandExecutor.writeAsync(getName(), LongCodec.INSTANCE, RedisCommands.ZINTERSTORE_INT, args.toArray()); + } + } diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java index ec2d0df92..951da02d0 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java @@ -18,10 +18,17 @@ package org.redisson.api; import java.util.Collection; import java.util.Map; +import org.redisson.api.RScoredSortedSet.Aggregate; import org.redisson.client.protocol.ScoredEntry; public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable, RExpirable { + public enum Aggregate { + + SUM, MAX, MIN + + } + V pollFirst(); V pollLast(); @@ -131,5 +138,13 @@ public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable< * @return */ Collection readAll(); + + int intersection(String... names); + + int intersection(Aggregate aggregate, String... names); + + int intersection(Map nameWithWeight); + + int intersection(Aggregate aggregate, Map nameWithWeight); } diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java index 990cb45be..f98cb1128 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java @@ -18,6 +18,7 @@ package org.redisson.api; import java.util.Collection; import java.util.Map; +import org.redisson.api.RScoredSortedSet.Aggregate; import org.redisson.client.protocol.ScoredEntry; public interface RScoredSortedSetAsync extends RExpirableAsync { @@ -111,5 +112,13 @@ public interface RScoredSortedSetAsync extends RExpirableAsync { * @return */ RFuture> readAllAsync(); + + RFuture intersectionAsync(String... names); + + RFuture intersectionAsync(Aggregate aggregate, String... names); + + RFuture intersectionAsync(Map nameWithWeight); + + RFuture intersectionAsync(Aggregate aggregate, Map nameWithWeight); } 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 f29885278..858f4a3f7 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -86,6 +86,7 @@ public interface RedisCommands { RedisStrictCommand ASKING = new RedisStrictCommand("ASKING", new VoidReplayConvertor()); RedisStrictCommand READONLY = new RedisStrictCommand("READONLY", new VoidReplayConvertor()); + RedisStrictCommand ZINTERSTORE_INT = new RedisStrictCommand("ZINTERSTORE", new IntegerReplayConvertor()); RedisCommand ZADD_BOOL = new RedisCommand("ZADD", new BooleanAmountReplayConvertor(), 3); RedisCommand ZADD_NX_BOOL = new RedisCommand("ZADD", new BooleanAmountReplayConvertor(), 4); RedisCommand ZADD_BOOL_RAW = new RedisCommand("ZADD", new BooleanAmountReplayConvertor()); diff --git a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java index 22176b6dc..4bd35db6e 100644 --- a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java +++ b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java @@ -754,4 +754,45 @@ public class RedissonScoredSortedSetTest extends BaseTest { Assert.assertTrue(new Double(112.3).compareTo(res2) == 0); } + @Test + public void testIntersection() { + RScoredSortedSet set1 = redisson.getScoredSortedSet("simple1"); + set1.add(1, "one"); + set1.add(2, "two"); + + RScoredSortedSet set2 = redisson.getScoredSortedSet("simple2"); + set2.add(1, "one"); + set2.add(2, "two"); + set2.add(3, "three"); + + RScoredSortedSet out = redisson.getScoredSortedSet("out"); + assertThat(out.intersection(set1.getName(), set2.getName())).isEqualTo(2); + + assertThat(out.readAll()).containsOnly("one", "two"); + assertThat(out.getScore("one")).isEqualTo(2); + assertThat(out.getScore("two")).isEqualTo(4); + } + + @Test + public void testIntersectionWithWeight() { + RScoredSortedSet set1 = redisson.getScoredSortedSet("simple1"); + set1.add(1, "one"); + set1.add(2, "two"); + + RScoredSortedSet set2 = redisson.getScoredSortedSet("simple2"); + set2.add(1, "one"); + set2.add(2, "two"); + set2.add(3, "three"); + + RScoredSortedSet out = redisson.getScoredSortedSet("out"); + Map nameWithWeight = new HashMap<>(); + nameWithWeight.put(set1.getName(), 2D); + nameWithWeight.put(set2.getName(), 3D); + assertThat(out.intersection(nameWithWeight)).isEqualTo(2); + + assertThat(out.readAll()).containsOnly("one", "two"); + assertThat(out.getScore("one")).isEqualTo(5); + assertThat(out.getScore("two")).isEqualTo(10); + } + }