package com.lambdaworks.redis.cluster.topology;
import com.lambdaworks.redis.RedisURI;
import com.lambdaworks.redis.cluster.models.partitions.Partitions;
import com.lambdaworks.redis.cluster.models.partitions.RedisClusterNode;
import java.util.*;
/**
* @author Mark Paluch
*/
class NodeTopologyViews {
private List<NodeTopologyView> views = new ArrayList<>();
public NodeTopologyViews(List<NodeTopologyView> views) {
this.views = views;
}
/**
* Return cluster node URI's using the topology query sources and partitions.
*
* @return
*/
public Set<RedisURI> getClusterNodes() {
Set<RedisURI> result = new HashSet<>();
Map<String, RedisURI> knownUris = new HashMap<>();
for (NodeTopologyView view : views) {
knownUris.put(view.getNodeId(), view.getRedisURI());
}
for (NodeTopologyView view : views) {
for (RedisClusterNode redisClusterNode : view.getPartitions()) {
if (knownUris.containsKey(redisClusterNode.getNodeId())) {
result.add(knownUris.get(redisClusterNode.getNodeId()));
} else {
result.add(redisClusterNode.getUri());
}
}
}
return result;
}
public Map<RedisURI, Partitions> toMap() {
Map<RedisURI, Partitions> nodeSpecificViews = new TreeMap<>(TopologyComparators.RedisURIComparator.INSTANCE);
for (NodeTopologyView view : views) {
nodeSpecificViews.put(view.getRedisURI(), view.getPartitions());
}
return nodeSpecificViews;
}
}