package com.datascience.datastoring.datamodels.kv;
import com.datascience.core.base.*;
import com.datascience.core.nominal.INominalData;
import com.datascience.core.nominal.INominalModel;
import com.datascience.datastoring.datamodels.memory.IncrementalNominalModel;
import com.datascience.datastoring.datamodels.memory.NominalModel;
import com.datascience.core.results.*;
import com.datascience.datastoring.adapters.kv.ISafeKVStorage;
import com.datascience.datastoring.jobs.*;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.Collection;
/**
* @Author: konrad
*/
public class KVJobStorage extends BaseJobStorage{
protected ISafeKVStorage<JsonObject> jobSettings;
protected ISafeKVStorage<String> jobTypes;
protected KVCleaner cleaner;
protected IKVsProvider kvsProvider;
public KVJobStorage(IKVsProvider kvsProvider){
super(kvsProvider);
this.kvsProvider = kvsProvider;
cleaner = new KVCleaner();
jobSettings = kvsProvider.getSettingsKV();
jobTypes = kvsProvider.getKindsKV();
}
@Override
public <T extends Project> void add(Job<T> job) throws Exception {
jobTypes.put(job.getId(), job.getProject().getKind());
jobSettings.put(job.getId(), job.getProject().getInitializationData());
}
@Override
public <T extends Project> Job<T> get(String id) throws Exception {
JsonObject settings = jobSettings.get(id);
String type = jobTypes.get(id);
if (type == null || settings == null)
return null;
return jobFactory.create(type, settings, id);
}
@Override
public void remove(Job job) throws Exception {
Project p = job.getProject();
cleaner.cleanUp((KVResults) p.getResults(), p.getData());
cleaner.cleanUp((KVData) p.getData()); // order is important ...
jobTypes.remove(job.getId());
jobSettings.remove(job.getId());
}
@Override
public void flush(Job job){
}
@Override
public IData<ContValue> getContData(String id) {
KVData<ContValue> data = new KVData<ContValue>(
kvsProvider.getContWorkerAssignsKV(id),
kvsProvider.getContObjectAssignsKV(id),
kvsProvider.getContObjectsKV(id),
kvsProvider.getContGoldObjectsKV(id),
kvsProvider.getContEvaluationObjectsKV(id),
kvsProvider.getWorkersKV(id)
);
return data;
}
@Override
public INominalData getNominalData(String id) {
INominalData data = new KVNominalData(
kvsProvider.getNominalWorkerAssignsKV(id),
kvsProvider.getNominalObjectAssignsKV(id),
kvsProvider.getNominalObjectsKV(id),
kvsProvider.getNominalGoldObjectsKV(id),
kvsProvider.getNominalEvaluationObjectsKV(id),
kvsProvider.getWorkersKV(id)
);
return data;
}
@Override
public IResults<ContValue, DatumContResults, WorkerContResults> getContResults(String id) {
return new KVResults(
new ResultsFactory.DatumContResultFactory(),
new ResultsFactory.WorkerContResultFactory(),
kvsProvider.getDatumContResultsKV(id),
kvsProvider.getWorkerContResultsKV(id));
}
@Override
public IResults<String, DatumResult, WorkerResult> getNominalResults(String id, Collection<String> categories) {
ResultsFactory.WorkerResultNominalFactory wrnf = new ResultsFactory.WorkerResultNominalFactory();
ResultsFactory.DatumResultFactory drf = new ResultsFactory.DatumResultFactory();
wrnf.setCategories(categories);
return new KVResults(drf, wrnf,
kvsProvider.getDatumResultsKV(id, drf),
kvsProvider.getWorkerResultsKV(id, wrnf));
}
@Override
public INominalModel getNominalModel(String id, Type t){
if (t.equals(new TypeToken<NominalModel>(){}.getType()))
return new KVNominalModel(kvsProvider.getNominalModel(id));
else
return new KVIncrementalNominalModel(kvsProvider.getIncrementalNominalModel(id));
}
@Override
public String toString(){
return "KV:" + kvsProvider.toString();
}
}