// $HeadURL$
// $Id$
//
// Copyright © 2010 by the President and Fellows of Harvard College.
//
// Screensaver is an open-source project developed by the ICCB-L and NSRB labs
// at Harvard Medical School. This software is distributed under the terms of
// the GNU General Public License.
package edu.harvard.med.screensaver.db.datafetcher;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import edu.harvard.med.screensaver.model.libraries.Gene;
import edu.harvard.med.screensaver.model.libraries.Library;
import edu.harvard.med.screensaver.model.libraries.Reagent;
import edu.harvard.med.screensaver.model.libraries.SilencingReagent;
import edu.harvard.med.screensaver.model.libraries.Well;
import edu.harvard.med.screensaver.model.meta.PropertyPath;
import edu.harvard.med.screensaver.model.meta.RelationshipPath;
import edu.harvard.med.screensaver.model.screenresults.DataColumn;
import edu.harvard.med.screensaver.model.screenresults.ResultValue;
import edu.harvard.med.screensaver.model.screenresults.ScreenResult;
import edu.harvard.med.screensaver.model.screens.Screen;
import edu.harvard.med.screensaver.model.screens.ScreenType;
import edu.harvard.med.screensaver.model.users.LabHead;
import edu.harvard.med.screensaver.model.users.ScreeningRoomUser;
import edu.harvard.med.screensaver.test.AbstractSpringPersistenceTest;
import edu.harvard.med.screensaver.test.MakeDummyEntities;
public class TupleDataFetcherTest extends AbstractSpringPersistenceTest
{
public void testSimpleEntity()
{
LabHead labHead = dataFactory.newInstance(LabHead.class);
ScreeningRoomUser user1 = dataFactory.newInstance(ScreeningRoomUser.class);
user1.setLab(labHead.getLab());
ScreeningRoomUser user2 = dataFactory.newInstance(ScreeningRoomUser.class);
genericEntityDao.saveOrUpdateEntity(labHead);
genericEntityDao.saveOrUpdateEntity(user1);
genericEntityDao.saveOrUpdateEntity(user2);
TupleDataFetcher<ScreeningRoomUser,Integer> dataFetcher =
new TupleDataFetcher<ScreeningRoomUser,Integer>(ScreeningRoomUser.class, genericEntityDao);
ArrayList<PropertyPath<ScreeningRoomUser>> properties =
Lists.newArrayList(RelationshipPath.from(ScreeningRoomUser.class).toProperty("id"),
RelationshipPath.from(ScreeningRoomUser.class).toProperty("lastName"),
RelationshipPath.from(ScreeningRoomUser.class).toProperty("firstName"),
RelationshipPath.from(ScreeningRoomUser.class).toProperty("loginId"),
RelationshipPath.from(ScreeningRoomUser.class).toProperty("dateCreated"),
ScreeningRoomUser.LabHead.toProperty("lastName"));
dataFetcher.setPropertiesToFetch(properties);
List<Tuple<Integer>> result = dataFetcher.fetchAllData();
Collections.sort(result, new Comparator<Tuple<Integer>>() {
@Override
public int compare(Tuple<Integer> o1, Tuple<Integer> o2)
{
return o1.getKey().compareTo(o2.getKey());
}
});
assertEquals(3, result.size());
assertEquals(labHead.getEntityId(), result.get(0).getKey());
assertEquals(labHead.getEntityId(), result.get(0).getProperty("id"));
assertEquals(labHead.getLastName(), result.get(0).getProperty("lastName"));
assertEquals(labHead.getDateCreated(), result.get(0).getProperty("dateCreated"));
assertNull(result.get(0).getProperty("labHead.lastName"));
assertEquals(user1.getEntityId(), result.get(1).getKey());
assertEquals(user1.getEntityId(), result.get(1).getProperty("id"));
assertEquals(user1.getLastName(), result.get(1).getProperty("lastName"));
assertEquals(user1.getDateCreated(), result.get(1).getProperty("dateCreated"));
assertEquals(labHead.getLastName(), result.get(1).getProperty("labHead.lastName"));
assertEquals(user2.getEntityId(), result.get(2).getKey());
assertEquals(user2.getEntityId(), result.get(2).getProperty("id"));
assertEquals(user2.getLastName(), result.get(2).getProperty("lastName"));
assertEquals(user2.getDateCreated(), result.get(2).getProperty("dateCreated"));
assertNull(result.get(0).getProperty("labHead.lastName"));
Map<Integer,Tuple<Integer>> result2 = dataFetcher.fetchData(ImmutableSet.of(user1.getEntityId()));
assertEquals(result.get(1), result2.get(user1.getEntityId()));
}
public void testRestrictedToManyRelationship()
{
Library library = MakeDummyEntities.makeDummyLibrary(1, ScreenType.RNAI, 1);
genericEntityDao.saveOrUpdateEntity(library);
Screen screen = MakeDummyEntities.makeDummyScreen(1, ScreenType.RNAI);
ScreenResult screenResult = MakeDummyEntities.makeDummyScreenResult(screen, library);
genericEntityDao.saveOrUpdateEntity(screen);
TupleDataFetcher<Well,String> dataFetcher =
new TupleDataFetcher<Well,String>(Well.class, genericEntityDao);
DataColumn numericDataColumn = screenResult.getDataColumnsList().get(0);
assert numericDataColumn != null && numericDataColumn.getName().equals("numeric_repl1");
DataColumn positiveDataColumn = screenResult.getDataColumnsList().get(6);
assert positiveDataColumn != null && positiveDataColumn.getName().equals("positive");
ArrayList<PropertyPath<Well>> properties =
Lists.newArrayList(RelationshipPath.from(Well.class).toProperty("id"),
Well.library.toProperty("libraryName"),
Well.resultValues.restrict(ResultValue.DataColumn.getLeaf(), numericDataColumn).toProperty("numericValue"),
Well.resultValues.restrict(ResultValue.DataColumn.getLeaf(), numericDataColumn).toProperty("positive"),
Well.resultValues.restrict(ResultValue.DataColumn.getLeaf(), positiveDataColumn).toProperty("value"),
Well.resultValues.restrict(ResultValue.DataColumn.getLeaf(), positiveDataColumn).toProperty("positive"));
dataFetcher.setPropertiesToFetch(properties);
List<Tuple<String>> result = dataFetcher.fetchAllData();
assertEquals(384, result.size());
Map<String,Double> expectedNumericValues = Maps.newHashMap();
for (ResultValue resultValue : numericDataColumn.getResultValues()) {
expectedNumericValues.put(resultValue.getWell().getWellId(), resultValue.getNumericValue());
}
assertColumnEquals(expectedNumericValues,
result,
TupleDataFetcher.makePropertyKey(properties.get(2)));
Map<String,Boolean> expectedPositiveValues = Maps.newHashMap();
for (ResultValue resultValue : positiveDataColumn.getResultValues()) {
expectedPositiveValues.put(resultValue.getWell().getWellId(), resultValue.isPositive());
}
assertColumnEquals(expectedPositiveValues,
result,
TupleDataFetcher.makePropertyKey(properties.get(5)));
String tupleKey = result.get(0).getKey();
Map<String,Tuple<String>> result2 = dataFetcher.fetchData(ImmutableSet.of(tupleKey));
assertEquals(result.get(0), result2.get(tupleKey));
}
public void testFetchEntityAsTupleValue()
{
Library library = MakeDummyEntities.makeDummyLibrary(1, ScreenType.RNAI, 1);
genericEntityDao.saveOrUpdateEntity(library);
TupleDataFetcher<Well,String> dataFetcher =
new TupleDataFetcher<Well,String>(Well.class, genericEntityDao);
ArrayList<PropertyPath<Well>> properties =
Lists.newArrayList(RelationshipPath.from(Well.class).toProperty("id"),
Well.latestReleasedReagent.toProperty("id"),
Well.latestReleasedReagent.toFullEntity());
dataFetcher.setPropertiesToFetch(properties);
List<Tuple<String>> result = dataFetcher.fetchAllData();
assertNotNull(result.get(0).getProperty("latestReleasedReagent.*"));
assertTrue(result.get(0).getProperty("latestReleasedReagent.*") instanceof Reagent);
assertEquals(result.get(0).getProperty("latestReleasedReagent.id"),
((Reagent) result.get(0).getProperty("latestReleasedReagent.*")).getEntityId());
}
public void testFetchCollectionOfValuesAsTupleValue()
{
Library library = MakeDummyEntities.makeDummyLibrary(1, ScreenType.RNAI, 1);
Well well = library.getWells().iterator().next();
((SilencingReagent) well.getLatestReleasedReagent()).getFacilityGene().withEntrezgeneSymbol("xxx").withEntrezgeneSymbol("yyy");
genericEntityDao.saveOrUpdateEntity(library);
TupleDataFetcher<Well,String> dataFetcher =
new TupleDataFetcher<Well,String>(Well.class, genericEntityDao);
ArrayList<PropertyPath<Well>> properties =
Lists.newArrayList(RelationshipPath.from(Well.class).toProperty("id"),
Well.latestReleasedReagent.toProperty("id"),
Well.latestReleasedReagent.to(SilencingReagent.facilityGenes).to(Gene.entrezgeneSymbols));
dataFetcher.setPropertiesToFetch(properties);
Map<String,Tuple<String>> result = dataFetcher.fetchData(Sets.newHashSet(well.getWellId()));
Tuple<String> tuple = result.get(well.getWellId());
assertNotNull(tuple);
Object propValue = tuple.getProperty("latestReleasedReagent.facilityGenes.entrezgeneSymbols");
assertNotNull(propValue);
assertTrue(propValue instanceof List);
assertEquals(Sets.newHashSet("xxx", "yyy"), Sets.newHashSet((List<String>) propValue));
}
private <K,V> void assertColumnEquals(Map<String,V> expectedNumericValues, List<Tuple<K>> result, String propertyKey)
{
Map<K,V> actualValues = Maps.newHashMap();
for (Tuple<K> tuple : result) {
actualValues.put(tuple.getKey(), (V) tuple.getProperty(propertyKey));
}
assertEquals(expectedNumericValues, actualValues);
}
}