package org.rakam.analysis.stream;
import com.facebook.presto.metadata.Metadata;
import com.facebook.presto.metadata.MetadataManager;
import com.facebook.presto.transaction.TransactionManager;
import com.google.auto.service.AutoService;
import com.google.inject.Binder;
import com.google.inject.TypeLiteral;
import com.google.inject.multibindings.Multibinder;
import org.apache.avro.generic.GenericRecord;
import org.rakam.collection.Event;
import org.rakam.plugin.EventMapper;
import org.rakam.plugin.RakamModule;
import org.rakam.plugin.stream.EventStream;
import org.rakam.util.ConditionalModule;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
@AutoService(RakamModule.class)
@ConditionalModule(config = "event-stream", value = "server")
public class APIEventStreamModule
extends RakamModule
{
private static final int MAXIMUM_QUEUE_CAPACITY = 1000;
@Override
protected void setup(Binder binder)
{
binder.bind(new TypeLiteral<Map<String, List<CollectionStreamHolder>>>() {})
.toInstance(new ConcurrentHashMap<>());
binder.bind(EventStream.class).to(APIEventStream.class);
Multibinder<EventMapper> mapperMultibinder = Multibinder.newSetBinder(binder, EventMapper.class);
mapperMultibinder.addBinding().to(EventListenerMapper.class);
binder.bind(TransactionManager.class).toInstance(TransactionManager.createTestTransactionManager());
binder.bind(Metadata.class).toInstance(MetadataManager.createTestMetadataManager());
}
@Override
public String name()
{
return null;
}
@Override
public String description()
{
return null;
}
public static class CollectionStreamHolder
{
public final List<CollectionFilter> collections;
public final Queue<Event> messageQueue;
public CollectionStreamHolder(List<CollectionFilter> collections)
{
this.collections = collections;
this.messageQueue = new ArrayBlockingQueue<>(MAXIMUM_QUEUE_CAPACITY);
}
public static class CollectionFilter
{
public final String collection;
public final Predicate<GenericRecord> filter;
public CollectionFilter(String collection, Predicate<GenericRecord> filter)
{
this.collection = collection;
this.filter = filter;
}
}
}
}