package com.codecademy.eventhub.storage;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.codecademy.eventhub.base.BloomFilter;
import com.codecademy.eventhub.base.DB;
import com.codecademy.eventhub.list.DmaList;
import com.codecademy.eventhub.model.User;
import org.fusesource.hawtjournal.api.Journal;
import org.fusesource.leveldbjni.JniDBFactory;
import org.iq80.leveldb.Options;
import javax.inject.Named;
import javax.inject.Provider;
import java.io.File;
import java.io.IOException;
public class UserStorageModule extends AbstractModule {
@Override
protected void configure() {}
@Provides
@Named("eventhub.userstorage.directory")
public String getJournalUserStorageDirectory(@Named("eventhub.directory") String directory) {
return directory + "/user_storage/";
}
@Provides
public DmaList<JournalUserStorage.MetaData> getJournalUserStorageMetaDataList(
JournalUserStorage.MetaData.Schema schema,
@Named("eventhub.userstorage.directory") String userStorageDirectory,
@Named("eventhub.journaluserstorage.numMetaDataPerFile") int numMetaDataPerFile,
@Named("eventhub.journaluserstorage.metaDataFileCacheSize") int metaDataFileCacheSize) {
return DmaList.build(schema, userStorageDirectory + "/meta_data/", numMetaDataPerFile,
metaDataFileCacheSize);
}
@Provides
@Named("eventhub.journaluserstorage")
public Journal getUserJournal(
@Named("eventhub.userstorage.directory") String userStorageDirectory,
@Named("eventhub.journaluserstorage.journalFileSize") int journalFileSize,
@Named("eventhub.journaluserstorage.journalWriteBatchSize") int journalWriteBatchSize) {
return JournalUtil.createJournal(userStorageDirectory + "/user_journal/",
journalFileSize, journalWriteBatchSize);
}
@Provides
public IdMap getIdMap(@Named("eventhub.userstorage.directory") String userStorageDirectory) throws IOException {
String filename = userStorageDirectory + "/id_map.db";
//noinspection ResultOfMethodCallIgnored
new File(userStorageDirectory).mkdirs();
Options options = new Options();
options.createIfMissing(true);
return IdMap.create(new DB(JniDBFactory.factory.open(new File(filename), options)));
}
@Provides
public JournalUserStorage getJournalUserStorage(
final @Named("eventhub.journaluserstorage") Journal userJournal,
final DmaList<JournalUserStorage.MetaData> metaDataList,
IdMap idMap) {
return new JournalUserStorage(userJournal, metaDataList, idMap);
}
@Provides
public CachedUserStorage getCachedEventStorage(
JournalUserStorage journalUserStorage,
@Named("eventhub.cacheduserstorage.recordCacheSize") int recordCacheSize) {
Cache<Integer, User> userCache = CacheBuilder.newBuilder()
.maximumSize(recordCacheSize)
.recordStats()
.build();
return new CachedUserStorage(journalUserStorage, userCache);
}
@Provides
@Named("eventhub.bloomfiltereduserstorage")
public DmaList<BloomFilter> getBloomFilterDmaList(
@Named("eventhub.userstorage.directory") String userStorageDirectory,
@Named("eventhub.bloomfiltereduserstorage.numHashes") int numHashes,
@Named("eventhub.bloomfiltereduserstorage.bloomFilterSize") int bloomFilterSize,
@Named("eventhub.bloomfiltereduserstorage.numMetaDataPerFile") int numMetaDataPerFile,
@Named("eventhub.bloomfiltereduserstorage.metaDataFileCacheSize") int metaDataFileCacheSize) {
return DmaList.build(new BloomFilter.Schema(numHashes, bloomFilterSize),
userStorageDirectory + "/bloom_filtered_user_storage_meta_data/",
numMetaDataPerFile,
metaDataFileCacheSize);
}
@Provides
@Named("eventhub.bloomfiltereduserstorage")
public BloomFilter getBloomFilter(
@Named("eventhub.bloomfiltereduserstorage.numHashes") int numHashes,
@Named("eventhub.bloomfiltereduserstorage.bloomFilterSize") int bloomFilterSize) {
return BloomFilter.build(numHashes, bloomFilterSize);
}
@Provides
public BloomFilteredUserStorage getBloomFilteredUserStorage(
@Named("eventhub.bloomfiltereduserstorage.numHashes") int numHashes,
@Named("eventhub.bloomfiltereduserstorage.bloomFilterSize") int bloomFilterSize,
@Named("eventhub.bloomfiltereduserstorage") DmaList<BloomFilter> bloomFilterDmaList,
@Named("eventhub.bloomfiltereduserstorage") Provider<BloomFilter> bloomFilterProvider,
CachedUserStorage cachedUserStorage) {
return new BloomFilteredUserStorage(cachedUserStorage, bloomFilterDmaList, bloomFilterProvider);
}
}