package com.datascience.datastoring.storages;
import com.datascience.datastoring.adapters.db.DBFullAdapter;
import com.datascience.datastoring.adapters.memory.MemoryKVFactory;
import com.datascience.datastoring.adapters.mixed.DBKVsFactory;
import com.datascience.datastoring.backends.db.DBBackend;
import com.datascience.datastoring.backends.db.DBBackendFactory;
import com.datascience.datastoring.datamodels.full.DBJobStorage;
import com.datascience.datastoring.datamodels.full.MemoryJobStorage;
import com.datascience.datastoring.datamodels.kv.BaseKVsProvider;
import com.datascience.datastoring.datamodels.kv.KVJobStorage;
import com.datascience.datastoring.datamodels.kv.TransformingKVsProvider;
import com.datascience.datastoring.jobs.IJobStorage;
import com.datascience.datastoring.transforms.*;
import com.datascience.serialization.ISerializer;
import java.sql.SQLException;
import java.util.Properties;
import static com.google.common.base.Preconditions.checkArgument;
/**
* User: artur
* Date: 4/16/13
*/
public class JobStorageFactory {
protected static DBBackendFactory dbBackendFactory = new DBBackendFactory();
public static class TransformationFactory {
public static ICoreTransformsFactory<String> createStringTransformationFactory(String type, ISerializer serializer){
if (type.equals("JSON"))
return new SingletonsCoreTransformsFactory<String>(new SerializerBasedCoreTransformsFactory(serializer));
if (type.equals("SIMPLE"))
return new SingletonsCoreTransformsFactory<String>(new SimpleStringCoreTransformsFactory());
//TODO: avro, thirft
return null;
}
public static ICoreTransformsFactory<Object> createObjectTransformationFactory(){
return new SingletonsCoreTransformsFactory<Object>(new CastingCoreTransformsFactory());
}
}
public static IJobStorage create(String fullType, Properties connectionProperties, Properties properties, ISerializer serializer) throws SQLException, ClassNotFoundException{
String[] storageParams = fullType.split("_");
checkArgument(storageParams.length >= 2, "Unknown storage model: " + fullType);
String type = (storageParams[0] + "_" + storageParams[1]).toUpperCase();
if (type.equals("MEMORY_FULL")){
return new MemoryJobStorage();
}
if (type.equals("MEMORY_KV")){
BaseKVsProvider baseKVsProvider;
if (fullType.equals(type)) {
baseKVsProvider = new TransformingKVsProvider<Object>(
new MemoryKVFactory<Object>(), TransformationFactory.createObjectTransformationFactory()
);
} else {
baseKVsProvider = new TransformingKVsProvider<String>(
new MemoryKVFactory<String>(), TransformationFactory.createStringTransformationFactory(storageParams[2], serializer)
);
}
return new KVJobStorage(baseKVsProvider);
}
if (type.startsWith("DB_")) {
DBBackend dbBackend = dbBackendFactory.getDBBackendOnProperties(connectionProperties, properties);
if (type.equals("DB_FULL")){
return new DBJobStorage(new DBFullAdapter(dbBackend), serializer);
} else if (type.equals("DB_KV")){
checkArgument(storageParams.length >= 3, "Unknown storage model: " + fullType);
return new KVJobStorage(new TransformingKVsProvider<String>(
new DBKVsFactory<String>(dbBackend), TransformationFactory.createStringTransformationFactory(storageParams[2], serializer)
));
}
}
throw new IllegalArgumentException("Unknown storage model: " + fullType);
}
}