diff --git a/src/main/asciidoc/observability/_conventions.adoc b/src/main/asciidoc/observability/_conventions.adoc new file mode 100644 index 000000000..f9dde4326 --- /dev/null +++ b/src/main/asciidoc/observability/_conventions.adoc @@ -0,0 +1,6 @@ +[[observability-conventions]] +=== Observability - Conventions + +Below you can find a list of all `GlobalObservabilityConventions` and `ObservabilityConventions` declared by this project. + + diff --git a/src/main/asciidoc/observability/_metrics.adoc b/src/main/asciidoc/observability/_metrics.adoc new file mode 100644 index 000000000..870c98962 --- /dev/null +++ b/src/main/asciidoc/observability/_metrics.adoc @@ -0,0 +1,42 @@ +[[observability-metrics]] +=== Observability - Metrics + +Below you can find a list of all metrics declared by this project. + +[[observability-metrics-redis-command-observation]] +==== Redis Command Observation + +____ +Timer created around a Redis command execution. +____ + +**Metric name** `spring.data.redis`. **Type** `timer` and **base unit** `seconds`. + +Fully qualified name of the enclosing class `org.springframework.data.redis.connection.lettuce.observability.RedisObservation`. + + + +.Low cardinality Keys +[cols="a,a"] +|=== +|Name | Description +|`db.operation`|Redis command value. +|`db.redis.database_index`|Redis database index. +|`db.system`|Database system. +|`db.user`|Redis user. +|`net.peer.name`|Name of the database host. +|`net.peer.port`|Logical remote port number. +|`net.sock.peer.addr`|Mongo peer address. +|`net.sock.peer.port`|Mongo peer port. +|`net.transport`|Network transport. +|=== + +.High cardinality Keys +[cols="a,a"] +|=== +|Name | Description +|`db.statement`|Redis statement. +|`spring.data.redis.command.error`|Redis error response. +|=== + + diff --git a/src/main/asciidoc/observability/_spans.adoc b/src/main/asciidoc/observability/_spans.adoc new file mode 100644 index 000000000..e774c9c7c --- /dev/null +++ b/src/main/asciidoc/observability/_spans.adoc @@ -0,0 +1,35 @@ +[[observability-spans]] +=== Observability - Spans + +Below you can find a list of all spans declared by this project. + +[[observability-spans-redis-command-observation]] +==== Redis Command Observation Span + +> Timer created around a Redis command execution. + +**Span name** `spring.data.redis`. + +Fully qualified name of the enclosing class `org.springframework.data.redis.connection.lettuce.observability.RedisObservation`. + + + +.Tag Keys +|=== +|Name | Description +|`db.operation`|Redis command value. +|`db.redis.database_index`|Redis database index. +|`db.statement`|Redis statement. +|`db.system`|Database system. +|`db.user`|Redis user. +|`net.peer.name`|Name of the database host. +|`net.peer.port`|Logical remote port number. +|`net.sock.peer.addr`|Mongo peer address. +|`net.sock.peer.port`|Mongo peer port. +|`net.transport`|Network transport. +|`spring.data.redis.command.error`|Redis error response. +|=== + + + + diff --git a/src/main/java/org/springframework/data/redis/cache/NoOpCacheStatisticsCollector.java b/src/main/java/org/springframework/data/redis/cache/NoOpCacheStatisticsCollector.java index a8f1315cc..64b8a1b8b 100644 --- a/src/main/java/org/springframework/data/redis/cache/NoOpCacheStatisticsCollector.java +++ b/src/main/java/org/springframework/data/redis/cache/NoOpCacheStatisticsCollector.java @@ -18,6 +18,7 @@ package org.springframework.data.redis.cache; import java.time.Instant; import java.util.concurrent.TimeUnit; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -184,7 +185,7 @@ enum NoOpCacheStatisticsCollector implements CacheStatisticsCollector { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; diff --git a/src/main/java/org/springframework/data/redis/connection/BitFieldSubCommands.java b/src/main/java/org/springframework/data/redis/connection/BitFieldSubCommands.java index 6e4869ef3..70ee9f48c 100644 --- a/src/main/java/org/springframework/data/redis/connection/BitFieldSubCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/BitFieldSubCommands.java @@ -155,7 +155,7 @@ public class BitFieldSubCommands implements Iterable { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } @@ -456,7 +456,7 @@ public class BitFieldSubCommands implements Iterable { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; @@ -576,7 +576,7 @@ public class BitFieldSubCommands implements Iterable { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; @@ -644,7 +644,7 @@ public class BitFieldSubCommands implements Iterable { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; @@ -744,7 +744,7 @@ public class BitFieldSubCommands implements Iterable { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } @@ -915,7 +915,7 @@ public class BitFieldSubCommands implements Iterable { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; diff --git a/src/main/java/org/springframework/data/redis/connection/ClusterCommandExecutor.java b/src/main/java/org/springframework/data/redis/connection/ClusterCommandExecutor.java index 5b1d7945b..0d7d3e9e7 100644 --- a/src/main/java/org/springframework/data/redis/connection/ClusterCommandExecutor.java +++ b/src/main/java/org/springframework/data/redis/connection/ClusterCommandExecutor.java @@ -682,7 +682,7 @@ public class ClusterCommandExecutor implements DisposableBean { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/src/main/java/org/springframework/data/redis/connection/DefaultStringTuple.java b/src/main/java/org/springframework/data/redis/connection/DefaultStringTuple.java index f681d992e..d197da550 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultStringTuple.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultStringTuple.java @@ -19,6 +19,7 @@ import java.nio.charset.StandardCharsets; import org.springframework.data.redis.connection.RedisZSetCommands.Tuple; import org.springframework.data.redis.connection.StringRedisConnection.StringTuple; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -77,7 +78,7 @@ public class DefaultStringTuple extends DefaultTuple implements StringTuple { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/src/main/java/org/springframework/data/redis/connection/DefaultTuple.java b/src/main/java/org/springframework/data/redis/connection/DefaultTuple.java index b0131529f..ae15c01a8 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultTuple.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultTuple.java @@ -19,6 +19,8 @@ import java.util.Arrays; import org.springframework.data.redis.connection.RedisZSetCommands.Tuple; +import org.springframework.lang.Nullable; + /** * Default implementation for {@link Tuple} interface. * @@ -58,7 +60,7 @@ public class DefaultTuple implements Tuple { return value; } - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (obj == null) diff --git a/src/main/java/org/springframework/data/redis/connection/ReactiveRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/ReactiveRedisConnection.java index c1b529b56..3450966ad 100644 --- a/src/main/java/org/springframework/data/redis/connection/ReactiveRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/ReactiveRedisConnection.java @@ -374,7 +374,7 @@ public interface ReactiveRedisConnection extends Closeable { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/src/main/java/org/springframework/data/redis/connection/ReactiveSubscription.java b/src/main/java/org/springframework/data/redis/connection/ReactiveSubscription.java index 9d703a3d0..f0ee473a7 100644 --- a/src/main/java/org/springframework/data/redis/connection/ReactiveSubscription.java +++ b/src/main/java/org/springframework/data/redis/connection/ReactiveSubscription.java @@ -15,6 +15,7 @@ */ package org.springframework.data.redis.connection; +import org.springframework.lang.Nullable; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -194,7 +195,7 @@ public interface ReactiveSubscription { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) @@ -260,7 +261,7 @@ public interface ReactiveSubscription { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/src/main/java/org/springframework/data/redis/connection/RedisClusterConfiguration.java b/src/main/java/org/springframework/data/redis/connection/RedisClusterConfiguration.java index 0b0d64fd7..7b391051f 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisClusterConfiguration.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisClusterConfiguration.java @@ -227,7 +227,7 @@ public class RedisClusterConfiguration implements RedisConfiguration, ClusterCon * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } diff --git a/src/main/java/org/springframework/data/redis/connection/RedisNode.java b/src/main/java/org/springframework/data/redis/connection/RedisNode.java index 9a8d7a517..87ef1ec59 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisNode.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisNode.java @@ -277,7 +277,7 @@ public class RedisNode implements NamedNode { } @Override - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (this == obj) { return true; diff --git a/src/main/java/org/springframework/data/redis/connection/RedisPassword.java b/src/main/java/org/springframework/data/redis/connection/RedisPassword.java index cbb58888e..95f90747c 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisPassword.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisPassword.java @@ -148,7 +148,7 @@ public class RedisPassword { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; diff --git a/src/main/java/org/springframework/data/redis/connection/RedisSentinelConfiguration.java b/src/main/java/org/springframework/data/redis/connection/RedisSentinelConfiguration.java index 3912c138f..13fff785c 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisSentinelConfiguration.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisSentinelConfiguration.java @@ -320,7 +320,7 @@ public class RedisSentinelConfiguration implements RedisConfiguration, SentinelC * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } diff --git a/src/main/java/org/springframework/data/redis/connection/RedisSocketConfiguration.java b/src/main/java/org/springframework/data/redis/connection/RedisSocketConfiguration.java index 60f4d394e..400e8e223 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisSocketConfiguration.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisSocketConfiguration.java @@ -140,7 +140,7 @@ public class RedisSocketConfiguration implements RedisConfiguration, DomainSocke * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } diff --git a/src/main/java/org/springframework/data/redis/connection/RedisStandaloneConfiguration.java b/src/main/java/org/springframework/data/redis/connection/RedisStandaloneConfiguration.java index 11711709f..b43a88516 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisStandaloneConfiguration.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisStandaloneConfiguration.java @@ -173,7 +173,7 @@ public class RedisStandaloneConfiguration * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } diff --git a/src/main/java/org/springframework/data/redis/connection/RedisStaticMasterReplicaConfiguration.java b/src/main/java/org/springframework/data/redis/connection/RedisStaticMasterReplicaConfiguration.java index b513165b7..82bb508d8 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisStaticMasterReplicaConfiguration.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisStaticMasterReplicaConfiguration.java @@ -188,7 +188,7 @@ public class RedisStaticMasterReplicaConfiguration implements RedisConfiguration * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } diff --git a/src/main/java/org/springframework/data/redis/connection/RedisStreamCommands.java b/src/main/java/org/springframework/data/redis/connection/RedisStreamCommands.java index a7a52b9b5..c44c0caf6 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisStreamCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisStreamCommands.java @@ -243,7 +243,7 @@ public interface RedisStreamCommands { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } diff --git a/src/main/java/org/springframework/data/redis/connection/RedisZSetCommands.java b/src/main/java/org/springframework/data/redis/connection/RedisZSetCommands.java index 6fb1018ee..847cf308f 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisZSetCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisZSetCommands.java @@ -508,7 +508,7 @@ public interface RedisZSetCommands { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; diff --git a/src/main/java/org/springframework/data/redis/connection/SentinelMasterId.java b/src/main/java/org/springframework/data/redis/connection/SentinelMasterId.java index 7c2ad7b37..2fc48ea47 100644 --- a/src/main/java/org/springframework/data/redis/connection/SentinelMasterId.java +++ b/src/main/java/org/springframework/data/redis/connection/SentinelMasterId.java @@ -16,6 +16,7 @@ package org.springframework.data.redis.connection; import org.springframework.lang.NonNull; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -58,7 +59,7 @@ class SentinelMasterId implements NamedNode { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java index e21a108ab..8622e5b67 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java @@ -1615,7 +1615,7 @@ public class LettuceConnection extends AbstractRedisConnection { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; diff --git a/src/main/java/org/springframework/data/redis/connection/stream/Consumer.java b/src/main/java/org/springframework/data/redis/connection/stream/Consumer.java index cbeb16a58..3f6e589f0 100644 --- a/src/main/java/org/springframework/data/redis/connection/stream/Consumer.java +++ b/src/main/java/org/springframework/data/redis/connection/stream/Consumer.java @@ -15,6 +15,7 @@ */ package org.springframework.data.redis.connection.stream; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -64,7 +65,7 @@ public class Consumer { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/src/main/java/org/springframework/data/redis/connection/stream/ReadOffset.java b/src/main/java/org/springframework/data/redis/connection/stream/ReadOffset.java index d4d7f7143..3976d0b97 100644 --- a/src/main/java/org/springframework/data/redis/connection/stream/ReadOffset.java +++ b/src/main/java/org/springframework/data/redis/connection/stream/ReadOffset.java @@ -15,6 +15,7 @@ */ package org.springframework.data.redis.connection.stream; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -81,7 +82,7 @@ public final class ReadOffset { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; diff --git a/src/main/java/org/springframework/data/redis/connection/stream/RecordId.java b/src/main/java/org/springframework/data/redis/connection/stream/RecordId.java index fd377fe07..880a33073 100644 --- a/src/main/java/org/springframework/data/redis/connection/stream/RecordId.java +++ b/src/main/java/org/springframework/data/redis/connection/stream/RecordId.java @@ -154,7 +154,7 @@ public class RecordId { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/src/main/java/org/springframework/data/redis/connection/stream/StreamOffset.java b/src/main/java/org/springframework/data/redis/connection/stream/StreamOffset.java index c53ca0614..4511e5117 100644 --- a/src/main/java/org/springframework/data/redis/connection/stream/StreamOffset.java +++ b/src/main/java/org/springframework/data/redis/connection/stream/StreamOffset.java @@ -15,6 +15,7 @@ */ package org.springframework.data.redis.connection.stream; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -101,7 +102,7 @@ public final class StreamOffset { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; diff --git a/src/main/java/org/springframework/data/redis/connection/stream/StreamReadOptions.java b/src/main/java/org/springframework/data/redis/connection/stream/StreamReadOptions.java index 473db11ff..640d55cd7 100644 --- a/src/main/java/org/springframework/data/redis/connection/stream/StreamReadOptions.java +++ b/src/main/java/org/springframework/data/redis/connection/stream/StreamReadOptions.java @@ -131,7 +131,7 @@ public class StreamReadOptions { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/src/main/java/org/springframework/data/redis/connection/stream/StreamRecords.java b/src/main/java/org/springframework/data/redis/connection/stream/StreamRecords.java index 6b6dcf7dd..66fc12af8 100644 --- a/src/main/java/org/springframework/data/redis/connection/stream/StreamRecords.java +++ b/src/main/java/org/springframework/data/redis/connection/stream/StreamRecords.java @@ -281,7 +281,7 @@ public class StreamRecords { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (o == null) { return false; @@ -430,7 +430,7 @@ public class StreamRecords { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/src/main/java/org/springframework/data/redis/connection/util/ByteArrayWrapper.java b/src/main/java/org/springframework/data/redis/connection/util/ByteArrayWrapper.java index f4c5f1f13..6451293eb 100644 --- a/src/main/java/org/springframework/data/redis/connection/util/ByteArrayWrapper.java +++ b/src/main/java/org/springframework/data/redis/connection/util/ByteArrayWrapper.java @@ -17,6 +17,8 @@ package org.springframework.data.redis.connection.util; import java.util.Arrays; +import org.springframework.lang.Nullable; + /** * Simple wrapper class used for wrapping arrays so they can be used as keys inside maps. * @@ -32,7 +34,7 @@ public class ByteArrayWrapper { this.hashCode = Arrays.hashCode(array); } - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (obj instanceof ByteArrayWrapper) { return Arrays.equals(array, ((ByteArrayWrapper) obj).array); } diff --git a/src/main/java/org/springframework/data/redis/connection/zset/Weights.java b/src/main/java/org/springframework/data/redis/connection/zset/Weights.java new file mode 100644 index 000000000..bae81422d --- /dev/null +++ b/src/main/java/org/springframework/data/redis/connection/zset/Weights.java @@ -0,0 +1,166 @@ +/* + * Copyright 2022 the original author or authors. + * + * 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 + * + * https://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.springframework.data.redis.connection.zset; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.function.DoubleUnaryOperator; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.DoubleStream; +import java.util.stream.IntStream; + +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; + +/** + * Value object encapsulating a multiplication factor for each input sorted set. This means that the score of every + * element in every input sorted set is multiplied by this factor before being passed to the aggregation function. + * + * @author Mark Paluch + * @author Christoph Strobl + * @since 2.1 + */ +public class Weights { + + private final List weights; + + private Weights(List weights) { + this.weights = weights; + } + + /** + * Create new {@link Weights} given {@code weights} as {@code int}. + * + * @param weights must not be {@literal null}. + * @return the {@link Weights} for {@code weights}. + */ + public static Weights of(int... weights) { + + Assert.notNull(weights, "Weights must not be null"); + return new Weights(Arrays.stream(weights).mapToDouble(value -> value).boxed().collect(Collectors.toList())); + } + + /** + * Create new {@link Weights} given {@code weights} as {@code double}. + * + * @param weights must not be {@literal null}. + * @return the {@link Weights} for {@code weights}. + */ + public static Weights of(double... weights) { + + Assert.notNull(weights, "Weights must not be null"); + + return new Weights(DoubleStream.of(weights).boxed().collect(Collectors.toList())); + } + + /** + * Creates equal {@link Weights} for a number of input sets {@code count} with a weight of one. + * + * @param count number of input sets. Must be greater or equal to zero. + * @return equal {@link Weights} for a number of input sets with a weight of one. + */ + public static Weights fromSetCount(int count) { + + Assert.isTrue(count >= 0, "Count of input sorted sets must be greater or equal to zero"); + + return new Weights(IntStream.range(0, count).mapToDouble(value -> 1).boxed().collect(Collectors.toList())); + } + + /** + * Creates a new {@link Weights} object that contains all weights multiplied by {@code multiplier} + * + * @param multiplier multiplier used to multiply each weight with. + * @return equal {@link Weights} for a number of input sets with a weight of one. + */ + public Weights multiply(int multiplier) { + return apply(it -> it * multiplier); + } + + /** + * Creates a new {@link Weights} object that contains all weights multiplied by {@code multiplier} + * + * @param multiplier multiplier used to multiply each weight with. + * @return equal {@link Weights} for a number of input sets with a weight of one. + */ + public Weights multiply(double multiplier) { + return apply(it -> it * multiplier); + } + + /** + * Creates a new {@link Weights} object that contains all weights with {@link Function} applied. + * + * @param operator operator function. + * @return the new {@link Weights} with {@link DoubleUnaryOperator} applied. + */ + public Weights apply(Function operator) { + return new Weights(weights.stream().map(operator).collect(Collectors.toList())); + } + + /** + * Retrieve the weight at {@code index}. + * + * @param index the weight index. + * @return the weight at {@code index}. + * @throws IndexOutOfBoundsException if the index is out of range + */ + public double getWeight(int index) { + return weights.get(index); + } + + /** + * @return number of weights. + */ + public int size() { + return weights.size(); + } + + /** + * @return an array containing all of the weights in this list in proper sequence (from first to last element). + */ + public double[] toArray() { + return weights.stream().mapToDouble(Double::doubleValue).toArray(); + } + + /** + * @return a {@link List} containing all of the weights in this list in proper sequence (from first to last element). + */ + public List toList() { + return Collections.unmodifiableList(weights); + } + + @Override + public boolean equals(@Nullable Object o) { + + if (this == o) { + return true; + } + + if (!(o instanceof Weights)) { + return false; + } + + Weights that = (Weights) o; + return ObjectUtils.nullSafeEquals(this.weights, that.weights); + } + + @Override + public int hashCode() { + return ObjectUtils.nullSafeHashCode(weights); + } +} diff --git a/src/main/java/org/springframework/data/redis/core/DefaultTypedTuple.java b/src/main/java/org/springframework/data/redis/core/DefaultTypedTuple.java index e08674e92..e465c77e7 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultTypedTuple.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultTypedTuple.java @@ -59,7 +59,7 @@ public class DefaultTypedTuple implements TypedTuple { return result; } - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (obj == null) diff --git a/src/main/java/org/springframework/data/redis/core/convert/GeoIndexedPropertyValue.java b/src/main/java/org/springframework/data/redis/core/convert/GeoIndexedPropertyValue.java index ad5b8f5e0..5a33d03c4 100644 --- a/src/main/java/org/springframework/data/redis/core/convert/GeoIndexedPropertyValue.java +++ b/src/main/java/org/springframework/data/redis/core/convert/GeoIndexedPropertyValue.java @@ -16,6 +16,7 @@ package org.springframework.data.redis.core.convert; import org.springframework.data.geo.Point; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -75,7 +76,7 @@ public class GeoIndexedPropertyValue implements IndexedData { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; diff --git a/src/main/java/org/springframework/data/redis/core/convert/SimpleIndexedPropertyValue.java b/src/main/java/org/springframework/data/redis/core/convert/SimpleIndexedPropertyValue.java index 8d111c142..d70b66892 100644 --- a/src/main/java/org/springframework/data/redis/core/convert/SimpleIndexedPropertyValue.java +++ b/src/main/java/org/springframework/data/redis/core/convert/SimpleIndexedPropertyValue.java @@ -15,6 +15,7 @@ */ package org.springframework.data.redis.core.convert; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -78,7 +79,7 @@ public class SimpleIndexedPropertyValue implements IndexedData { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/src/main/java/org/springframework/data/redis/core/index/IndexDefinition.java b/src/main/java/org/springframework/data/redis/core/index/IndexDefinition.java index a16be74c5..608099ef0 100644 --- a/src/main/java/org/springframework/data/redis/core/index/IndexDefinition.java +++ b/src/main/java/org/springframework/data/redis/core/index/IndexDefinition.java @@ -18,6 +18,7 @@ package org.springframework.data.redis.core.index; import java.util.Collection; import org.springframework.data.util.TypeInformation; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -93,7 +94,7 @@ public interface IndexDefinition { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/src/main/java/org/springframework/data/redis/core/index/RedisIndexDefinition.java b/src/main/java/org/springframework/data/redis/core/index/RedisIndexDefinition.java index 6d3d7d580..9ba58e921 100644 --- a/src/main/java/org/springframework/data/redis/core/index/RedisIndexDefinition.java +++ b/src/main/java/org/springframework/data/redis/core/index/RedisIndexDefinition.java @@ -121,7 +121,7 @@ public abstract class RedisIndexDefinition implements IndexDefinition { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (this == obj) { return true; diff --git a/src/main/java/org/springframework/data/redis/core/index/SpelIndexDefinition.java b/src/main/java/org/springframework/data/redis/core/index/SpelIndexDefinition.java index c034bcde2..243ff6fdd 100644 --- a/src/main/java/org/springframework/data/redis/core/index/SpelIndexDefinition.java +++ b/src/main/java/org/springframework/data/redis/core/index/SpelIndexDefinition.java @@ -17,6 +17,7 @@ package org.springframework.data.redis.core.index; import org.springframework.data.redis.core.convert.SpelIndexResolver; import org.springframework.expression.spel.standard.SpelExpression; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -54,7 +55,7 @@ public class SpelIndexDefinition extends RedisIndexDefinition { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/src/main/java/org/springframework/data/redis/core/types/RedisClientInfo.java b/src/main/java/org/springframework/data/redis/core/types/RedisClientInfo.java index 366bfece8..62948d808 100644 --- a/src/main/java/org/springframework/data/redis/core/types/RedisClientInfo.java +++ b/src/main/java/org/springframework/data/redis/core/types/RedisClientInfo.java @@ -252,7 +252,7 @@ public class RedisClientInfo { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; diff --git a/src/main/java/org/springframework/data/redis/domain/geo/BoundingBox.java b/src/main/java/org/springframework/data/redis/domain/geo/BoundingBox.java index eaf353473..da3a97d86 100644 --- a/src/main/java/org/springframework/data/redis/domain/geo/BoundingBox.java +++ b/src/main/java/org/springframework/data/redis/domain/geo/BoundingBox.java @@ -19,6 +19,7 @@ import org.springframework.data.geo.Distance; import org.springframework.data.geo.Metric; import org.springframework.data.geo.Shape; import org.springframework.data.redis.connection.RedisGeoCommands; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -93,7 +94,7 @@ public class BoundingBox implements Shape { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } diff --git a/src/main/java/org/springframework/data/redis/domain/geo/GeoLocation.java b/src/main/java/org/springframework/data/redis/domain/geo/GeoLocation.java index 27fa2c1e5..8d006e5b1 100644 --- a/src/main/java/org/springframework/data/redis/domain/geo/GeoLocation.java +++ b/src/main/java/org/springframework/data/redis/domain/geo/GeoLocation.java @@ -17,6 +17,7 @@ package org.springframework.data.redis.domain.geo; import org.springframework.data.geo.Point; import org.springframework.data.redis.connection.RedisGeoCommands; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -42,7 +43,7 @@ public class GeoLocation { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; diff --git a/src/main/java/org/springframework/data/redis/domain/geo/GeoReference.java b/src/main/java/org/springframework/data/redis/domain/geo/GeoReference.java index 4f2ab2ddf..2a6b9fa27 100644 --- a/src/main/java/org/springframework/data/redis/domain/geo/GeoReference.java +++ b/src/main/java/org/springframework/data/redis/domain/geo/GeoReference.java @@ -18,6 +18,7 @@ package org.springframework.data.redis.domain.geo; import org.springframework.data.geo.Circle; import org.springframework.data.geo.Point; import org.springframework.data.redis.connection.RedisGeoCommands; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -128,7 +129,7 @@ public interface GeoReference { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } @@ -173,7 +174,7 @@ public interface GeoReference { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) { return true; } diff --git a/src/main/java/org/springframework/data/redis/listener/ChannelTopic.java b/src/main/java/org/springframework/data/redis/listener/ChannelTopic.java index f93ddb8a2..33bb4cf6f 100644 --- a/src/main/java/org/springframework/data/redis/listener/ChannelTopic.java +++ b/src/main/java/org/springframework/data/redis/listener/ChannelTopic.java @@ -15,6 +15,7 @@ */ package org.springframework.data.redis.listener; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -69,7 +70,7 @@ public class ChannelTopic implements Topic { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; diff --git a/src/main/java/org/springframework/data/redis/listener/PatternTopic.java b/src/main/java/org/springframework/data/redis/listener/PatternTopic.java index ab0f6d008..c73274858 100644 --- a/src/main/java/org/springframework/data/redis/listener/PatternTopic.java +++ b/src/main/java/org/springframework/data/redis/listener/PatternTopic.java @@ -15,6 +15,7 @@ */ package org.springframework.data.redis.listener; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -70,7 +71,7 @@ public class PatternTopic implements Topic { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; diff --git a/src/main/java/org/springframework/data/redis/repository/query/RedisOperationChain.java b/src/main/java/org/springframework/data/redis/repository/query/RedisOperationChain.java index 9e45c2a52..72c5ff9ae 100644 --- a/src/main/java/org/springframework/data/redis/repository/query/RedisOperationChain.java +++ b/src/main/java/org/springframework/data/redis/repository/query/RedisOperationChain.java @@ -125,7 +125,7 @@ public class RedisOperationChain { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; diff --git a/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainer.java b/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainer.java index 5cf4f5991..cdc1b58a8 100644 --- a/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainer.java +++ b/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainer.java @@ -38,6 +38,7 @@ import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StreamOperations; import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ErrorHandler; import org.springframework.util.ObjectUtils; @@ -345,7 +346,7 @@ class DefaultStreamMessageListenerContainer> implement } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/src/main/java/org/springframework/data/redis/support/collections/AbstractRedisCollection.java b/src/main/java/org/springframework/data/redis/support/collections/AbstractRedisCollection.java index a6e7ac77e..cabc861da 100644 --- a/src/main/java/org/springframework/data/redis/support/collections/AbstractRedisCollection.java +++ b/src/main/java/org/springframework/data/redis/support/collections/AbstractRedisCollection.java @@ -183,7 +183,7 @@ public abstract class AbstractRedisCollection extends AbstractCollection i * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (o == this) return true; diff --git a/src/main/java/org/springframework/data/redis/support/collections/DefaultRedisMap.java b/src/main/java/org/springframework/data/redis/support/collections/DefaultRedisMap.java index ef9cabbbc..919eeef99 100644 --- a/src/main/java/org/springframework/data/redis/support/collections/DefaultRedisMap.java +++ b/src/main/java/org/springframework/data/redis/support/collections/DefaultRedisMap.java @@ -238,7 +238,7 @@ public class DefaultRedisMap implements RedisMap { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (o == this) return true; diff --git a/src/test/java/org/springframework/data/redis/Address.java b/src/test/java/org/springframework/data/redis/Address.java index b0813e243..730cdf9c3 100644 --- a/src/test/java/org/springframework/data/redis/Address.java +++ b/src/test/java/org/springframework/data/redis/Address.java @@ -17,6 +17,8 @@ package org.springframework.data.redis; import java.io.Serializable; +import org.springframework.lang.Nullable; + /** * Simple serializable class. * @@ -84,7 +86,7 @@ public class Address implements Serializable { return result; } - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (obj == null) diff --git a/src/test/java/org/springframework/data/redis/Person.java b/src/test/java/org/springframework/data/redis/Person.java index 7025d0f68..d0659c1e5 100644 --- a/src/test/java/org/springframework/data/redis/Person.java +++ b/src/test/java/org/springframework/data/redis/Person.java @@ -17,6 +17,8 @@ package org.springframework.data.redis; import java.io.Serializable; +import org.springframework.lang.Nullable; + /** * Simple serializable class. * @@ -89,7 +91,7 @@ public class Person implements Serializable { return result; } - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (obj == null) diff --git a/src/test/java/org/springframework/data/redis/core/RedisKeyValueTemplateTests.java b/src/test/java/org/springframework/data/redis/core/RedisKeyValueTemplateTests.java index 5fdbd7ab3..5daf865ee 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisKeyValueTemplateTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisKeyValueTemplateTests.java @@ -44,6 +44,7 @@ import org.springframework.data.redis.core.mapping.RedisMappingContext; import org.springframework.data.redis.test.extension.RedisStanalone; import org.springframework.data.redis.test.extension.parametrized.MethodSource; import org.springframework.data.redis.test.extension.parametrized.ParameterizedRedisTest; +import org.springframework.lang.Nullable; import org.springframework.util.ObjectUtils; /** @@ -880,7 +881,7 @@ public class RedisKeyValueTemplateTests { } @Override - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (this == obj) { return true; } diff --git a/src/test/java/org/springframework/data/redis/repository/cdi/Person.java b/src/test/java/org/springframework/data/redis/repository/cdi/Person.java index ab5a98e35..ea5e7c2b2 100644 --- a/src/test/java/org/springframework/data/redis/repository/cdi/Person.java +++ b/src/test/java/org/springframework/data/redis/repository/cdi/Person.java @@ -18,6 +18,7 @@ package org.springframework.data.redis.repository.cdi; import org.springframework.data.annotation.Id; import org.springframework.data.redis.core.RedisHash; import org.springframework.data.redis.core.index.Indexed; +import org.springframework.lang.Nullable; /** * @author Mark Paluch @@ -46,7 +47,7 @@ class Person { } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (!(o instanceof Person)) diff --git a/src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java b/src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java index 16bb6c239..df09b2ac4 100644 --- a/src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java +++ b/src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java @@ -47,6 +47,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping; import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder; import com.fasterxml.jackson.databind.type.TypeFactory; +import org.springframework.lang.Nullable; /** * Unit tests for {@link GenericJackson2JsonRedisSerializer}. @@ -363,7 +364,7 @@ class GenericJackson2JsonRedisSerializerUnitTests { } @Override - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (this == obj) { return true; } @@ -402,7 +403,7 @@ class GenericJackson2JsonRedisSerializerUnitTests { } @Override - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (this == obj) { return true;