package com.datascience.datastoring.storages; import com.datascience.core.base.AssignedLabel; import com.datascience.core.base.LObject; import com.datascience.core.base.Worker; import com.datascience.datastoring.adapters.db.DBFullAdapter; import com.datascience.datastoring.backends.db.DBBackendFactory; import com.datascience.datastoring.datamodels.full.DBJobStorage; import com.datascience.datastoring.datamodels.memory.InMemoryData; import com.datascience.datastoring.datamodels.memory.InMemoryNominalData; import com.datascience.datastoring.jobs.IJobStorage; import com.datascience.datastoring.jobs.Job; import com.datascience.datastoring.jobs.JobFactory; import com.datascience.core.nominal.INominalData; import com.datascience.core.nominal.NominalProject; import com.datascience.core.results.IResults; import com.datascience.serialization.json.GSONSerializer; import com.google.gson.JsonObject; import java.util.*; import com.google.gson.JsonArray; import com.google.gson.JsonPrimitive; import org.junit.Assert; import org.junit.Test; /** * * @author dana */ public class CachedAndDBJobStorageTest { private INominalData initializeNominalData() { ArrayList<Worker> workers; ArrayList<LObject<String>> objects; ArrayList<LObject<String>> goldObjects; ArrayList<AssignedLabel<String>> assigns; Set<String> categories; INominalData nominalData = new InMemoryNominalData(); int nWorkers = 2; int nObjects = 4; int nGold = 2; int i; categories = new HashSet<String>(); categories.add("cat1"); categories.add("cat2"); nominalData.initialize(categories, null, null); workers = new ArrayList<Worker>(); for (i = 0; i < nWorkers; i++) { workers.add(new Worker("worker" + i)); } objects = new ArrayList<LObject<String>>(); for (i = 0; i < nObjects; i++) { objects.add(new LObject<String>("object" + i)); } goldObjects = new ArrayList<LObject<String>>(); for (i = 0; i < nGold; i++) { LObject<String> gold = new LObject<String>("gObject" + i); gold.setGoldLabel(categories.iterator().next().toString()); goldObjects.add(gold); } objects.addAll(goldObjects); int nAssigns = nWorkers * (nObjects + nGold); assigns = new ArrayList<AssignedLabel<String>>(); for (i = 0; i < nAssigns; i++) { assigns.add(new AssignedLabel<String>(workers.get(i % nWorkers), objects.get(i % (nObjects + nGold)), categories.iterator().next().toString())); } for (LObject<String> gold : goldObjects) { nominalData.addObject(gold); } for (AssignedLabel<String> assign : assigns) { nominalData.addAssign(assign); } return nominalData; } private JsonArray createCategoriesJsonArray(Collection<String> categories) { JsonArray cat = new JsonArray(); Iterator<String> iterator = categories.iterator(); while (iterator.hasNext()) { String category = iterator.next(); cat.add(new JsonPrimitive(category)); } return cat; } // private void checkResults(IResults expectedResults, IResults actualResults) { // // Map expectedDatumResults = expectedResults.getDatumResults(); // for (Iterator it = expectedDatumResults.entrySet().iterator(); it.hasNext();) { // Object obj = it.next(); // System.out.println(obj); // } // } @Test public void testMixedStorages() throws Exception { IJobStorage dbJobStorage = new DBJobStorage(new DBFullAdapter(new DBBackendFactory().getInMemoryBackend()), new GSONSerializer()); // dbJobStorage.clear(); dbJobStorage.initialize(); JobFactory jobFactory = new JobFactory(new GSONSerializer(), dbJobStorage); JsonObject jo = new JsonObject(); INominalData nominalData = initializeNominalData(); jo.addProperty("algorithm", "BDS"); jo.add("categories", createCategoriesJsonArray(nominalData.getCategories())); jo.addProperty(com.datascience.scheduler.Constants.SCHEDULER, com.datascience.scheduler.Constants.SCHEDULER_NORMAL); Job job1 = jobFactory.createNominalJob(jo, "job1"); job1.getProject().setData(nominalData); job1.getProject().getAlgorithm().compute(); String job1Kind = job1.getProject().getKind(); IResults job1Results = job1.getProject().getResults(); Assert.assertFalse(job1Results == null); Job job2 = jobFactory.createNominalJob(jo, "job2"); job2.getProject().setData(nominalData); job2.getProject().getAlgorithm().compute(); CachedJobStorage cachedJobStorage = new CachedJobStorage(dbJobStorage, 1); cachedJobStorage.add(job1); cachedJobStorage.add(job2); //at this point job1 should be removed from cache and added to db //check that the job received from the db storage has the same data as the original one Job<NominalProject> dbJob = dbJobStorage.get("job1"); Assert.assertEquals("job1", dbJob.getId()); NominalProject dbNominalProject = dbJob.getProject(); Assert.assertEquals(job1Kind, dbNominalProject.getKind()); System.out.println(dbNominalProject.getAlgorithm().getResults()); //checkResults(job1Results, dbNominalProject.getAlgorithm().getResults()); InMemoryData dbJobData = (InMemoryData)dbNominalProject.getData(); Assert.assertEquals(nominalData.getAssigns(), dbJobData.getAssigns()); Assert.assertEquals(nominalData.getGoldObjects(), dbJobData.getGoldObjects()); Assert.assertEquals(nominalData.getEvaluationObjects(), dbJobData.getEvaluationObjects()); Assert.assertEquals(nominalData.getObjects(), dbJobData.getObjects()); Assert.assertEquals(nominalData.getWorkers(), dbJobData.getWorkers()); } }