package org.infinispan.query.affinity;
import static java.util.stream.IntStream.range;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.infinispan.remoting.transport.Address;
/**
* Provides shard distribution information for an index.
*
* @since 9.0
*/
interface ShardDistribution {
/**
* @return All shards identifiers.
*/
Set<String> getShardsIdentifiers();
/**
* @return Owner for a single shard.
*/
Address getOwner(String shardId);
/**
* @return All shards owned by a node.
*/
Set<String> getShards(Address address);
/**
* @return the shard mapped to a certain segment
*/
String getShardFromSegment(Integer segment);
/**
* @return input collection split into 'parts' sub collections
*/
default <T> List<Set<T>> split(Collection<T> collection, int parts) {
if (collection.isEmpty() || parts == 0) return Collections.emptyList();
List<Set<T>> splits = new ArrayList<>(parts);
range(0, parts).forEach(p -> splits.add(new HashSet<T>(collection.size() / parts)));
int i = 0;
for (T element : collection) {
splits.get(i++ % parts).add(element);
}
return splits;
}
}