HazelcastMessageSearcher.java
package net.morimekta.providence.storage.hazelcast;
import com.hazelcast.core.IMap;
import com.hazelcast.query.Predicate;
import net.morimekta.providence.PMessage;
import net.morimekta.providence.PMessageBuilder;
import net.morimekta.providence.storage.MessageSearcher;
import javax.annotation.Nonnull;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class HazelcastMessageSearcher<Q, Key, M extends PMessage<M>, B extends PMessageBuilder<M>>
implements MessageSearcher<Q, M> {
private final IMap<Key, B> hazelcastMap;
private final Function<Q, Predicate<Key, B>> makePredicate;
public HazelcastMessageSearcher(Function<Q, Predicate<Key, B>> makePredicate,
IMap<Key, B> hazelcastMap) {
this.makePredicate = makePredicate;
this.hazelcastMap = hazelcastMap;
}
@Nonnull
@Override
public List<M> search(@Nonnull Q query) {
return stream(query).collect(Collectors.toList());
}
@Override
public Stream<M> stream(@Nonnull Q query) {
return hazelcastMap.values(makePredicate.apply(query))
.stream()
.map(PMessageBuilder::build);
}
}