diff --git a/redisson/src/main/java/org/redisson/RedissonSet.java b/redisson/src/main/java/org/redisson/RedissonSet.java index c71509d0d..9e539da83 100644 --- a/redisson/src/main/java/org/redisson/RedissonSet.java +++ b/redisson/src/main/java/org/redisson/RedissonSet.java @@ -16,11 +16,16 @@ package org.redisson; import org.redisson.api.*; -import org.redisson.api.listener.*; +import org.redisson.api.listener.SetAddListener; +import org.redisson.api.listener.SetRemoveListener; +import org.redisson.api.listener.SetRemoveRandomListener; +import org.redisson.api.listener.TrackingListener; import org.redisson.api.mapreduce.RCollectionMapReduce; import org.redisson.client.RedisClient; import org.redisson.client.codec.Codec; +import org.redisson.client.protocol.RedisCommand; import org.redisson.client.protocol.RedisCommands; +import org.redisson.client.protocol.decoder.ContainsDecoder; import org.redisson.command.CommandAsyncExecutor; import org.redisson.iterator.RedissonBaseIterator; import org.redisson.mapreduce.RedissonCollectionMapReduce; @@ -28,7 +33,6 @@ import org.redisson.misc.CompletableFutureWrapper; import java.util.*; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CompletionStage; import java.util.stream.Stream; /** @@ -398,25 +402,15 @@ public class RedissonSet extends RedissonExpirable implements RSet, ScanIt @Override public RFuture> containsEachAsync(Collection c) { if (c.isEmpty()) { - return new CompletableFutureWrapper<>(Collections.emptyList()); + return new CompletableFutureWrapper<>((List) Collections.emptyList()); } List args = new ArrayList<>(c.size() + 1); args.add(getRawName()); encode(args, c); - RFuture> future = commandExecutor.readAsync(getRawName(), codec, RedisCommands.SMISMEMBER, args.toArray()); - List keysToCheck = new ArrayList<>(c); - CompletionStage> f = future.thenApply(res -> { - List containedKeys = new ArrayList<>(); - for (int i = 0; i < res.size(); i++) { - if (res.get(i) == 1) { - containedKeys.add(keysToCheck.get(i)); - } - } - return containedKeys; - }); - return new CompletableFutureWrapper<>(f); + return commandExecutor.readAsync(getRawName(), codec, + new RedisCommand<>("SMISMEMBER", new ContainsDecoder<>(c)), args.toArray()); } @Override diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/ContainsDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/ContainsDecoder.java new file mode 100644 index 000000000..e12d86f82 --- /dev/null +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/ContainsDecoder.java @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2013-2024 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 org.redisson.client.handler.State; + +import java.util.*; + +/** + * + * @author Nikita Koksharov + * + */ +public class ContainsDecoder implements MultiDecoder> { + + private final int shiftIndex = 0; + private final List args; + + public ContainsDecoder(Collection args) { + if (args instanceof List) { + this.args = (List) args; + } else { + this.args = new ArrayList<>(args); + } + } + + @Override + public List decode(List parts, State state) { + if (parts.isEmpty()) { + return Collections.emptyList(); + } + + List result = new ArrayList<>(parts.size()); + for (int index = 0; index < parts.size()-shiftIndex; index++) { + Long value = (Long) parts.get(index); + if (value == 1) { + result.add(args.get(index + shiftIndex)); + } + } + return result; + } + +}