//$HeadURL$
//$Id$
//Copyright © 2006, 2010, 2011, 2012 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.ui.cherrypickrequests;
import java.util.List;
import java.util.Map;
import org.joda.time.LocalDate;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import edu.harvard.med.screensaver.db.Criterion;
import edu.harvard.med.screensaver.db.Criterion.Operator;
import edu.harvard.med.screensaver.db.GenericEntityDAO;
import edu.harvard.med.screensaver.db.ScreenDAO;
import edu.harvard.med.screensaver.db.datafetcher.DataFetcherUtil;
import edu.harvard.med.screensaver.db.datafetcher.EntityDataFetcher;
import edu.harvard.med.screensaver.db.hqlbuilder.HqlBuilder;
import edu.harvard.med.screensaver.model.Volume;
import edu.harvard.med.screensaver.model.cherrypicks.CherryPickAssayPlate;
import edu.harvard.med.screensaver.model.cherrypicks.CherryPickRequest;
import edu.harvard.med.screensaver.model.meta.RelationshipPath;
import edu.harvard.med.screensaver.model.screens.Screen;
import edu.harvard.med.screensaver.model.screens.ScreenType;
import edu.harvard.med.screensaver.model.users.ScreeningRoomUser;
import edu.harvard.med.screensaver.ui.arch.datatable.column.TableColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.BooleanEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.DateEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.EnumEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.HasFetchPaths;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.IntegerEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.TextEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.UserNameColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.column.entity.VolumeEntityColumn;
import edu.harvard.med.screensaver.ui.arch.datatable.model.InMemoryEntityDataModel;
import edu.harvard.med.screensaver.ui.arch.searchresults.EntityBasedEntitySearchResults;
import edu.harvard.med.screensaver.ui.arch.searchresults.SearchResults;
import edu.harvard.med.screensaver.ui.screens.ScreenViewer;
import edu.harvard.med.screensaver.ui.users.UserViewer;
/**
* A {@link SearchResults} for {@link CherryPickRequest CherryPickRequests}.
*
* @author <a mailto="andrew_tolopko@hms.harvard.edu">Andrew Tolopko</a>
* @author <a mailto="john_sullivan@hms.harvard.edu">John Sullivan</a>
*/
public class CherryPickRequestSearchResults extends EntityBasedEntitySearchResults<CherryPickRequest,Integer>
{
private ScreenViewer _screenViewer;
private UserViewer _userViewer;
private GenericEntityDAO _dao;
private ScreenDAO _screenDao;
// custom cache of values to get around lazy loading issue, see [#3528] Add a total Lab Cherry Picks column to the CherryPickRequestSearchResults
private Map<Integer,Integer> cprLcpCounts = null;
/**
* @motivation for CGLIB2
*/
protected CherryPickRequestSearchResults()
{
}
public CherryPickRequestSearchResults(CherryPickRequestViewer cprViewer,
ScreenViewer screenViewer,
UserViewer userViewer,
ScreenDAO screenDao,
GenericEntityDAO dao)
{
super(cprViewer);
_screenViewer = screenViewer;
_userViewer = userViewer;
_screenDao = screenDao;
_dao = dao;
}
public void searchAll()
{
setTitle("Cherry Pick Requests");
EntityDataFetcher<CherryPickRequest,Integer> dataFetcher =
(EntityDataFetcher<CherryPickRequest,Integer>) new EntityDataFetcher<CherryPickRequest,Integer>(CherryPickRequest.class, _dao);
initialize(new InMemoryEntityDataModel<CherryPickRequest,Integer,CherryPickRequest>(dataFetcher));
// default to descending sort order on cherry pick request number
getColumnManager().setSortAscending(false);
}
@SuppressWarnings("unchecked")
public void searchScreenType(ScreenType screenType)
{
setTitle(screenType + " Cherry Pick Requests");
searchAll();
TableColumn<CherryPickRequest,ScreenType> column = (TableColumn<CherryPickRequest,ScreenType>) getColumnManager().getColumn("Screen Type");
column.clearCriteria();
column.addCriterion(new Criterion<ScreenType>(Operator.EQUAL, screenType));
}
public void searchForScreen(final Screen screen)
{
setTitle("Cherry Pick Requests for screen " + screen.getFacilityId());
initialize(new InMemoryEntityDataModel<CherryPickRequest,Integer,CherryPickRequest>(new EntityDataFetcher<CherryPickRequest,Integer>(CherryPickRequest.class, _dao) {
@Override
public void addDomainRestrictions(HqlBuilder hql)
{
DataFetcherUtil.addDomainRestrictions(hql, CherryPickRequest.screen, screen, getRootAlias());
}
}));
}
// implementations of the SearchResults abstract methods
@Override
protected List<TableColumn<CherryPickRequest,?>> buildColumns()
{
List<TableColumn<CherryPickRequest,?>> columns = Lists.newArrayList();
cprLcpCounts = _screenDao.retrieveTotalLabCherryPickCounts();
columns.add(new IntegerEntityColumn<CherryPickRequest>(RelationshipPath.from(CherryPickRequest.class).toProperty("cherryPickRequestId"),
"CPR #",
"The cherry pick request number",
TableColumn.UNGROUPED) {
@Override
public Integer getCellValue(CherryPickRequest cpr) { return cpr.getCherryPickRequestId(); }
@Override
public Object cellAction(CherryPickRequest cpr) { return viewSelectedEntity(); }
@Override
public boolean isCommandLink() { return true; }
});
columns.add(new TextEntityColumn<CherryPickRequest>(CherryPickRequest.screen.to(Screen.facilityId),
"Screen ID",
"The facility-assigned ID of the cherry pick request's screen",
TableColumn.UNGROUPED) {
@Override
public String getCellValue(CherryPickRequest cpr)
{
return cpr.getScreen().getFacilityId();
}
@Override
public Object cellAction(CherryPickRequest cpr) {
return _screenViewer.viewEntity(cpr.getScreen());
}
@Override
public boolean isCommandLink() { return true; }
});
columns.add(new DateEntityColumn<CherryPickRequest>(RelationshipPath.from(CherryPickRequest.class).toProperty("dateRequested"),
"Date Requested", "The date of the cherry pick request", TableColumn.UNGROUPED) {
@Override
protected LocalDate getDate(CherryPickRequest cpr) { return cpr.getDateRequested(); }
});
columns.add(new UserNameColumn<CherryPickRequest,ScreeningRoomUser>(
CherryPickRequest.requestedBy,
"Requested By",
"The person that requested the cherry picks",
TableColumn.UNGROUPED,
_userViewer) {
@Override
public ScreeningRoomUser getUser(CherryPickRequest cpr) { return cpr.getRequestedBy(); }
});
columns.add(new BooleanEntityColumn<CherryPickRequest>(
CherryPickRequest.cherryPickAssayPlates,
"Completed",
"Has the cherry pick request been completed, such that all cherry pick plates have been plated",
TableColumn.UNGROUPED) {
@Override
public Boolean getCellValue(CherryPickRequest cpr) { return cpr.isPlated(); }
});
((HasFetchPaths<CherryPickRequest>) columns.get(columns.size() - 1)).addRelationshipPath(CherryPickRequest.cherryPickAssayPlates.to(CherryPickAssayPlate.cherryPickLiquidTransfer));
columns.add(new IntegerEntityColumn<CherryPickRequest>(
CherryPickRequest.cherryPickAssayPlates,
"# Plates",
"The total number of cherry pick plates",
TableColumn.UNGROUPED) {
@Override
public Integer getCellValue(CherryPickRequest cpr) { return cpr.getActiveCherryPickAssayPlates().size(); }
});
columns.add(new IntegerEntityColumn<CherryPickRequest>(
CherryPickRequest.cherryPickAssayPlates,
"# Plates Completed",
"The number of cherry pick plates that have been plated (completed)",
TableColumn.UNGROUPED) {
@Override
public Integer getCellValue(CherryPickRequest cpr) { return cpr.getCompletedCherryPickAssayPlates().size(); }
});
// [#3528] Add a total Lab Cherry Picks column to the CherryPickRequestSearchResults
columns.add(new IntegerEntityColumn<CherryPickRequest>(RelationshipPath.from(CherryPickRequest.class),
"# Total LCPs",
"The total number of lab cherry picks.",
TableColumn.UNGROUPED) {
@Override
public Integer getCellValue(CherryPickRequest cpr) { return cprLcpCounts.get(cpr.getEntityId()); /**cpr.getLabCherryPicks().size();**/ }
});
columns.add(new IntegerEntityColumn<CherryPickRequest>(RelationshipPath.from(CherryPickRequest.class).toProperty("numberUnfulfilledLabCherryPicks"),
"# Unfulfilled LCPs",
"The number of lab cherry picks that have are unfulfilled.",
TableColumn.UNGROUPED) {
@Override
public Integer getCellValue(CherryPickRequest cpr) { return cpr.getNumberUnfulfilledLabCherryPicks(); }
});
columns.add(new DateEntityColumn<CherryPickRequest>(
CherryPickRequest.cherryPickAssayPlates.to(CherryPickAssayPlate.cherryPickLiquidTransfer),
"Plating Activity Date ",
"The date that the most recent cherry pick plating activity was performed.",
TableColumn.UNGROUPED) {
@Override
public LocalDate getDate(CherryPickRequest cpr) {
if (cpr.getCherryPickLiquidTransfers().isEmpty()) {
return null;
}
else {
return Sets.newTreeSet(cpr.getCherryPickLiquidTransfers()).last().getDateOfActivity();
}
}
});
columns.get(columns.size() - 1).setAdministrative(true);
columns.add(new VolumeEntityColumn<CherryPickRequest>(RelationshipPath.from(CherryPickRequest.class).toProperty("volumeApproved"),
"Volume Approved",
"The approved volume of reagent to be used when creating the cherry pick plates",
TableColumn.UNGROUPED) {
@Override
public Volume getCellValue(CherryPickRequest cpr) { return cpr.getTransferVolumePerWellApproved(); }
});
columns.get(columns.size() - 1).setAdministrative(true);
columns.add(new VolumeEntityColumn<CherryPickRequest>(RelationshipPath.from(CherryPickRequest.class).toProperty("volumeRequested"),
"Volume Requested",
"The screener-requested volume of reagent to be used when creating the cherry pick plates",
TableColumn.UNGROUPED) {
@Override
public Volume getCellValue(CherryPickRequest cpr) { return cpr.getTransferVolumePerWellRequested(); }
});
columns.get(columns.size() - 1).setVisible(false);
columns.get(columns.size() - 1).setAdministrative(true);
columns.add(new UserNameColumn<CherryPickRequest,ScreeningRoomUser>(
CherryPickRequest.screen.to(Screen.labHead),
"Lab Head",
"The head of the lab performing the screen",
TableColumn.UNGROUPED,
_userViewer) {
@Override
public ScreeningRoomUser getUser(CherryPickRequest cpr) { return cpr.getScreen().getLabHead(); }
});
columns.add(new UserNameColumn<CherryPickRequest,ScreeningRoomUser>(
CherryPickRequest.screen.to(Screen.leadScreener),
"Lead Screener",
"The scientist primarily responsible for running the screen",
TableColumn.UNGROUPED,
_userViewer) {
@Override
public ScreeningRoomUser getUser(CherryPickRequest cpr) { return cpr.getScreen().getLeadScreener(); }
});
columns.add(new EnumEntityColumn<CherryPickRequest, ScreenType>(
CherryPickRequest.screen.toProperty("screenType"),
"Screen Type",
"'RNAi' or 'Small Molecule'",
TableColumn.UNGROUPED,
ScreenType.values()) {
@Override
public ScreenType getCellValue(CherryPickRequest cpr) { return cpr.getScreen().getScreenType(); }
});
return columns;
}
//@Override
//protected List<Integer[]> getCompoundSorts()
//{
//List<Integer[]> compoundSorts = super.getCompoundSorts();
//compoundSorts.add(new Integer[] {1, 0});
//compoundSorts.add(new Integer[] {2, 1, 0});
//compoundSorts.add(new Integer[] {3, 1, 0});
//compoundSorts.add(new Integer[] {4, 1, 0});
//compoundSorts.add(new Integer[] {5, 6, 1, 0});
//compoundSorts.add(new Integer[] {6, 5, 1, 0});
//compoundSorts.add(new Integer[] {7, 1, 0});
//compoundSorts.add(new Integer[] {8, 1, 0});
//compoundSorts.add(new Integer[] {9, 1, 0});
//return compoundSorts;
//}
}