package com.datascience.datastoring.datamodels.kv; import com.datascience.core.base.AbstractData; import com.datascience.core.base.AssignedLabel; import com.datascience.core.base.LObject; import com.datascience.core.base.Worker; import com.datascience.datastoring.adapters.kv.ISafeKVStorage; import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; /** * @Author: konrad */ public class KVData<T> extends AbstractData<T> { protected ISafeKVStorage<Collection<AssignedLabel<T>>> workersAssigns; protected ISafeKVStorage<Collection<AssignedLabel<T>>> objectsAssigns; protected ISafeKVStorage<Collection<LObject<T>>> objects;// SINGLE ROW! protected ISafeKVStorage<Collection<LObject<T>>> goldObjects;// SINGLE ROW protected ISafeKVStorage<Collection<LObject<T>>> evaluationObjects;// SINGLE ROW protected ISafeKVStorage<Collection<Worker>> workers; //SINGLE ROW! public KVData(ISafeKVStorage<Collection<AssignedLabel<T>>> workersAssigns, ISafeKVStorage<Collection<AssignedLabel<T>>> objectsAssigns, ISafeKVStorage<Collection<LObject<T>>> objects, ISafeKVStorage<Collection<LObject<T>>> goldObjects, ISafeKVStorage<Collection<LObject<T>>> evaluationObjects, ISafeKVStorage<Collection<Worker>> workers){ this.workersAssigns = workersAssigns; this.objectsAssigns = objectsAssigns; this.objects = objects; this.goldObjects = goldObjects; this.evaluationObjects = evaluationObjects; this.workers = workers; initializeEmptyRows(Arrays.asList(new ISafeKVStorage[]{objects, goldObjects, evaluationObjects, workers})); } protected void initializeEmptyRows(Collection<ISafeKVStorage> storages){ for (ISafeKVStorage storage : storages){ if (!storage.contains("")){ storage.put("", new LinkedList()); } } } @Override protected LObject<T> uncheckedGetGoldObject(String objectId) { return getObjectFromCollection(objectId, goldObjects.get("")); } @Override protected LObject<T> uncheckedGetEvaluationObject(String objectId) { return getObjectFromCollection(objectId, evaluationObjects.get("")); } @Override protected void uncheckedAddWorker(Worker worker) { Collection<Worker> oldWorkers = workers.get(""); if (!oldWorkers.contains(worker)){ oldWorkers.add(worker); workers.put("", oldWorkers); notifyNewWorker(worker); workersAssigns.put(worker.getName(), new LinkedList()); } } @Override public Worker getWorker(String workerId) { for (Worker w : workers.get("")) if (w.getName().equals(workerId)) return w; return null; } @Override public Collection<Worker> getWorkers() { return workers.get(""); } @Override protected void uncheckedAddObject(LObject<T> object) { Collection<LObject<T>> oldObjects = objects.get(""); if (!oldObjects.contains(object)){ oldObjects.add(object); objects.put("", oldObjects); notifyNewObject(object); objectsAssigns.put(object.getName(), new LinkedList()); if (object.isGold()) addGoldObject(object); if (object.isEvaluation()) addEvaluationObject(object); } else { LObject<T> oldObject = getObject(object.getName()); if (object.isGold() && !oldObject.isGold()) { oldObjects.remove(oldObject); oldObject.setGoldLabel(object.getGoldLabel()); oldObjects.add(oldObject); objects.put("", oldObjects); addGoldObject(oldObject); } if (object.isEvaluation() && !oldObject.isEvaluation()) { oldObjects.remove(oldObject); oldObject.setEvaluationLabel(object.getEvaluationLabel()); oldObjects.add(oldObject); objects.put("", oldObjects); addEvaluationObject(oldObject); } } } private void addGoldObject(LObject<T> object){ //assumption: goldObjects collection doesnt contain object Collection<LObject<T>> oldGoldObjects = goldObjects.get(""); oldGoldObjects.add(object); goldObjects.put("", oldGoldObjects); notifyNewGoldObject(object); } private void addEvaluationObject(LObject<T> object){ //assumption: evaluationObjects collection doesnt contain object Collection<LObject<T>> oldEvaluationObjects = evaluationObjects.get(""); oldEvaluationObjects.add(object); evaluationObjects.put("", oldEvaluationObjects); } @Override public LObject<T> getObject(String objectId) { return getObjectFromCollection(objectId, objects.get("")); } private LObject<T> getObjectFromCollection(String objectId, Collection<LObject<T>> collection){ for (LObject<T> o : collection) if (o.getName().equals(objectId)) return o; return null; } @Override public Collection<LObject<T>> getObjects() { return objects.get(""); } @Override public Collection<LObject<T>> getGoldObjects() { return goldObjects.get(""); } @Override public void markObjectAsGold(LObject<T> object, T label) { object.setGoldLabel(label); Collection<LObject<T>> oldObjects = objects.get(""); oldObjects.add(object); objects.put("", oldObjects); oldObjects = goldObjects.get(""); oldObjects.add(object); goldObjects.put("", oldObjects); } @Override public Collection<LObject<T>> getEvaluationObjects() { return evaluationObjects.get(""); } @Override public void addAssign(AssignedLabel<T> assign) { addWorker(assign.getWorker()); forceAddAssign(assign, workersAssigns, assign.getWorker().getName()); addObject(assign.getLobject()); forceAddAssign(assign, objectsAssigns, assign.getLobject().getName()); notifyNewAssign(assign); } private void forceAddAssign(AssignedLabel<T> assign, ISafeKVStorage<Collection<AssignedLabel<T>>> storage, String key){ Collection<AssignedLabel<T>> assigns = storage.get(key); for (AssignedLabel<T> al : assigns){ if (al.equals(assign)){ assigns.remove(al); break; } } assigns.add(assign); storage.put(key, assigns); } @Override public Collection<AssignedLabel<T>> getAssigns() { Collection<AssignedLabel<T>> ret = new LinkedList<AssignedLabel<T>>(); for (Worker w : getWorkers()){ ret.addAll(workersAssigns.get(w.getName())); } return ret; } @Override public boolean hasAssign(LObject<T> object, Worker worker) { if (objectsAssigns.contains(object.getName())) for (AssignedLabel<T> al : objectsAssigns.get(object.getName())){ if (al.getWorker().equals(worker)) return true; } return false; } @Override public Collection<AssignedLabel<T>> uncheckedGetWorkerAssigns(Worker worker) { return workersAssigns.get(worker.getName()); } @Override public Collection<AssignedLabel<T>> uncheckedGetAssignsForObject(LObject<T> lObject) { return objectsAssigns.get(lObject.getName()); } }