diff --git a/src/main/java/org/generationcp/middleware/dao/GermplasmDAO.java b/src/main/java/org/generationcp/middleware/dao/GermplasmDAO.java index 16662d68e6..1cacea9caf 100644 --- a/src/main/java/org/generationcp/middleware/dao/GermplasmDAO.java +++ b/src/main/java/org/generationcp/middleware/dao/GermplasmDAO.java @@ -107,7 +107,7 @@ public class GermplasmDAO extends GenericDAO { + " INNER JOIN nd_experiment e ON e.stock_id = s.stock_id "// + " INNER JOIN project p ON e.project_id = p.project_id "// + " WHERE g.deleted = 0 AND g.grplce = 0 "// - + " AND e.nd_geolocation_id = :studyDbId " + + " AND e.parent_id = :studyDbId " + " ORDER BY CAST(s.uniquename as SIGNED INTEGER) "; @Override diff --git a/src/main/java/org/generationcp/middleware/dao/ListDataProjectDAO.java b/src/main/java/org/generationcp/middleware/dao/ListDataProjectDAO.java index 6289166a87..a80963ee94 100644 --- a/src/main/java/org/generationcp/middleware/dao/ListDataProjectDAO.java +++ b/src/main/java/org/generationcp/middleware/dao/ListDataProjectDAO.java @@ -31,7 +31,7 @@ public class ListDataProjectDAO extends GenericDAO { private static final String ENTRY_ID = "entryId"; - public static final String GET_GERMPLASM_USED_IN_ENTRY_LIST = " SELECT \n" + " ldp.germplasm_id, \n" + private static final String GET_GERMPLASM_USED_IN_ENTRY_LIST = " SELECT \n" + " ldp.germplasm_id, \n" + " group_concat(p.name) \n" + " FROM listnms l \n" + " INNER JOIN listdata_project ldp ON l.listid = ldp.list_id \n" + " INNER JOIN project p ON l.projectid = p.project_id \n" + " WHERE ldp.germplasm_id IN (:gids) \n" @@ -100,59 +100,19 @@ public List getByListId(final int listId) { } - public ListDataProject getByListIdAndEntryNo(final int listId, final int entryNo) { - ListDataProject result = null; - - try { - final Criteria criteria = this.getSession().createCriteria(ListDataProject.class); - criteria.add(Restrictions.eq("list", new GermplasmList(listId))); - criteria.add(Restrictions.eq(ListDataProjectDAO.ENTRY_ID, entryNo)); - criteria.addOrder(Order.asc(ListDataProjectDAO.ENTRY_ID)); - result = (ListDataProject) criteria.uniqueResult(); - - } catch (final HibernateException e) { - throw new MiddlewareQueryException("Error with getByListIdAndEntryNo(listId=" + listId - + ") query from ListDataProjectDAO: " + e.getMessage(), e); - } - return result; - } - - public List getByStudy( - final int studyId, final GermplasmListType listType, final List plotNumbers, final String instanceNumber) { + List getByStudy(final int studyId, final GermplasmListType listType) { try { - final String queryStr = "select ldp.* FROM nd_experiment e," - + " nd_experimentprop nd_ep, stock," - + " listdata_project ldp, project p, listnms nms, nd_geolocation geo" - + " WHERE nd_ep.type_id IN (:PLOT_NO_TERM_IDS)" - + " AND nms.projectid = p.study_id" - + " AND nms.listid = ldp.list_id" - + " AND nms.projectid = :STUDY_ID" - + " AND p.dataset_type_id = :DATASET_TYPE" - + " AND e.project_id = p.project_id" - + " AND e.nd_experiment_id = nd_ep.nd_experiment_id" - + " AND stock.stock_id = e.stock_id" - + " AND ldp.germplasm_id = stock.dbxref_id" - + " AND nd_ep.value in (:PLOT_NO)" - + " AND nd_ep.nd_experiment_id = e.nd_experiment_id" - + " AND e.nd_geolocation_id = geo.nd_geolocation_id" - + " AND geo.description = :INSTANCE_NUMBER" - + " AND ( EXISTS (" + " SELECT 1" + " FROM listnms cl" - + " WHERE cl.listid = ldp.list_id" + " AND cl.listtype = 'CHECK'" + " AND NOT EXISTS (" - + " SELECT 1 FROM listnms nl" + " WHERE nl.listid = ldp.list_id" + " AND nl.listtype = :LIST_TYPE" - + " )) OR EXISTS (" + " SELECT 1 FROM listnms nl" + " WHERE nl.listid = ldp.list_id" - + " AND nl.listtype = :LIST_TYPE" + " ))"; + final String queryStr = "select ldp.* FROM listdata_project ldp " + + " INNER JOIN listnms nms on nms.listid = ldp.list_id " + + " INNER JOIN project p on nms.projectid = p.project_id " + + " WHERE p.project_id = :STUDY_ID " + + " AND nms.listtype = :LIST_TYPE "; final SQLQuery query = this.getSession().createSQLQuery(queryStr); query.addEntity("ldp", ListDataProject.class); query.setParameter("LIST_TYPE", listType.name()); query.setParameter("STUDY_ID", studyId); - query.setParameterList("PLOT_NO", plotNumbers); - query.setParameter("INSTANCE_NUMBER", instanceNumber); - query.setParameter("DATASET_TYPE", DatasetTypeEnum.PLOT_DATA.getId()); - query.setParameterList( - "PLOT_NO_TERM_IDS", - new Integer[] {TermId.PLOT_NO.getId(), TermId.PLOT_NNO.getId()}); return query.list(); @@ -201,7 +161,7 @@ public long countByListId(final Integer id) { criteria.createAlias("list", "l"); criteria.add(Restrictions.eq("l.id", id)); criteria.setProjection(Projections.rowCount()); - return ((Long) criteria.uniqueResult()).longValue(); // count + return ((Long) criteria.uniqueResult()); // count } } catch (final HibernateException e) { throw new MiddlewareQueryException( @@ -219,7 +179,7 @@ public long countByListIdAndEntryType(final Integer id, final List syst criteria.add(Restrictions.eq("l.id", id)); criteria.add(Restrictions.in("checkType", systemDefinedEntryTypeIds)); criteria.setProjection(Projections.rowCount()); - return ((Long) criteria.uniqueResult()).longValue(); // count + return ((Long) criteria.uniqueResult()); // count } } catch (final HibernateException e) { throw new MiddlewareQueryException( diff --git a/src/main/java/org/generationcp/middleware/dao/dms/DataSetDao.java b/src/main/java/org/generationcp/middleware/dao/dms/DataSetDao.java deleted file mode 100644 index fee501af88..0000000000 --- a/src/main/java/org/generationcp/middleware/dao/dms/DataSetDao.java +++ /dev/null @@ -1,87 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, All Rights Reserved. - * - * Generation Challenge Programme (GCP) - * - * - * This software is licensed for use under the terms of the GNU General Public License (http://bit.ly/8Ztv8M) and the provisions of Part F - * of the Generation Challenge Programme Amended Consortium Agreement (http://bit.ly/KQX1nL) - * - *******************************************************************************/ - -package org.generationcp.middleware.dao.dms; - -import org.generationcp.middleware.dao.GenericDAO; -import org.generationcp.middleware.dao.gdms.DatasetDAO; -import org.generationcp.middleware.exceptions.MiddlewareQueryException; -import org.generationcp.middleware.pojos.dms.DmsProject; -import org.hibernate.HibernateException; -import org.hibernate.SQLQuery; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * DAO class for Dataset (Stored in {@link DmsProject}). - * - * @author Donald Barre - * - */ -public class DataSetDao extends GenericDAO { - - private static final Logger LOG = LoggerFactory.getLogger(DataSetDao.class); - - public void deleteExperimentsByLocation(final int datasetId, final int locationId) { - try { - // Please note we are manually flushing because non hibernate based deletes and updates causes the Hibernate session to get out of synch with - // underlying database. Thus flushing to force Hibernate to synchronize with the underlying database before the delete - // statement - this.getSession().flush(); - - // Delete experiments - SQLQuery statement = - this.getSession().createSQLQuery( - "delete e, pheno, eprop " + "from nd_experiment e, " - + "phenotype pheno, nd_experimentprop eprop " - + "where e.project_id = " + datasetId + " and e.nd_geolocation_id = " + locationId - + " and e.nd_experiment_id = pheno.nd_experiment_id " - + " and e.nd_experiment_id = eprop.nd_experiment_id"); - if (statement.executeUpdate() == 0) { - statement = - this.getSession().createSQLQuery( - "delete e, pheno " + "from nd_experiment e, " - + "phenotype pheno " - + "where e.project_id = " + datasetId + " and e.nd_geolocation_id = " + locationId - + " and e.nd_experiment_id = pheno.nd_experiment_id "); - statement.executeUpdate(); - } - - } catch (final HibernateException e) { - final String errorMessage = "Error in deleteExperimentsByLocation=" + datasetId + ", " + locationId + " in DataSetDao: " + e.getMessage(); - DataSetDao.LOG.error(errorMessage, e); - throw new MiddlewareQueryException(errorMessage, e); - } - } - - public void deleteExperimentsByLocationAndType(final int datasetId, final int locationId, final int typeId) { - try { - // Please note we are manually flushing because non hibernate based deletes and updates causes the Hibernate session to get out of synch with - // underlying database. Thus flushing to force Hibernate to synchronize with the underlying database before the delete - // statement - this.getSession().flush(); - - // Delete experiments - final SQLQuery statement = - this.getSession().createSQLQuery( - "delete e, pheno, eprop " + "from nd_experiment e, " - + "phenotype pheno, nd_experimentprop eprop " - + "where e.project_id = " + datasetId + " and e.nd_geolocation_id = " + locationId - + " and e.type_id = " + typeId - + " and e.nd_experiment_id = pheno.nd_experiment_id " - + " and e.nd_experiment_id = eprop.nd_experiment_id"); - statement.executeUpdate(); - } catch (final HibernateException e) { - this.logAndThrowException("Error in deleteExperimentsByLocationAndType=" + datasetId + ", " + locationId + ", " + typeId - + " in DataSetDao: " + e.getMessage(), e); - } - } -} diff --git a/src/main/java/org/generationcp/middleware/dao/dms/DmsProjectDao.java b/src/main/java/org/generationcp/middleware/dao/dms/DmsProjectDao.java index 98b65fafe1..086389fc5b 100644 --- a/src/main/java/org/generationcp/middleware/dao/dms/DmsProjectDao.java +++ b/src/main/java/org/generationcp/middleware/dao/dms/DmsProjectDao.java @@ -31,6 +31,7 @@ import org.generationcp.middleware.exceptions.MiddlewareQueryException; import org.generationcp.middleware.pojos.SampleList; import org.generationcp.middleware.pojos.derived_variables.Formula; +import org.generationcp.middleware.pojos.dms.DatasetType; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.service.api.study.SeasonDto; @@ -70,6 +71,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; /** @@ -156,36 +158,33 @@ public class DmsProjectDao extends GenericDAO { + " AND p.deleted != " + DELETED_STUDY + " AND p.program_uuid = :program_uuid "; - private static final String GET_STUDY_METADATA_BY_GEOLOCATION_ID = " SELECT " - + " geoloc.nd_geolocation_id AS studyDbId, " + private static final String GET_STUDY_METADATA_BY_ENVIRONMENT_ID = " SELECT " + + " nde.nd_experiment_id AS studyDbId, " + " pmain.project_id AS trialOrNurseryId, " - + " CONCAT(pmain.name, ' Environment Number ', geoloc.description) AS studyName, " + + " CONCAT(pmain.name, ' Environment Number ', nde.observation_unit_no) AS studyName, " + " study_type.study_type_id AS studyType, " + " study_type.label AS studyTypeName, " - + " MAX(IF(geoprop.type_id = " + TermId.SEASON_VAR.getId() + ", " - + " geoprop.value, " + + " MAX(IF(xprop.type_id = " + TermId.SEASON_VAR.getId() + ", " + + " xprop.value, " + " NULL)) AS seasonId, " + " pmain.project_id AS trialDbId, " + " pmain.name AS trialName, " + " MAX(pmain.start_date) AS startDate, " + " MAX(pmain.end_date) AS endDate, " + " pmain.deleted, " - + " MAX(IF(geoprop.type_id = " + TermId.LOCATION_ID.getId() + ", " - + " geoprop.value, " + + " MAX(IF(xprop.type_id = " + TermId.LOCATION_ID.getId() + ", " + + " xprop.value, " + " NULL)) " + " AS locationId," + " pmain.description AS studyDescription, " + " pmain.objective AS studyObjective, " - + " (Select definition from cvterm where cvterm_id = (MAX(IF(geoprop.type_id = " + TermId.EXPERIMENT_DESIGN_FACTOR.getId() - + ", " - + " geoprop.value, " + + " (Select definition from cvterm where cvterm_id = (MAX(IF(xprop.type_id = " + TermId.EXPERIMENT_DESIGN_FACTOR.getId() + ", " + + " xprop.value, " + " NULL)))) " + " AS experimentalDesign," + " pmain.study_update AS lastUpdate" + " FROM " - + " nd_geolocation geoloc " - + " INNER JOIN " - + " nd_experiment nde ON nde.nd_geolocation_id = geoloc.nd_geolocation_id " + + " nd_experiment nde " + " INNER JOIN " + " project proj ON proj.project_id = nde.project_id " + " INNER JOIN " @@ -193,51 +192,52 @@ public class DmsProjectDao extends GenericDAO { + " INNER JOIN " + " study_type ON study_type.study_type_id = pmain.study_type_id " + " LEFT OUTER JOIN " - + " nd_geolocationprop geoprop ON geoprop.nd_geolocation_id = geoloc.nd_geolocation_id " + + " nd_experimentprop xprop ON xprop.nd_experiment_id = nde.nd_experiment_id " + " LEFT OUTER JOIN " + " projectprop pProp ON pmain.project_id = pProp.project_id " + " WHERE " + " nde.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() - + " AND geoloc.nd_geolocation_id = :geolocationId " - + " GROUP BY geoloc.nd_geolocation_id "; + + " AND nde.nd_experiment_id = :environmentId " + + " GROUP BY nde.nd_experiment_id "; private static final String GET_PROJECTID_BY_STUDYDBID = "SELECT DISTINCT p.study_id" + " FROM project p " + " INNER JOIN nd_experiment nde ON nde.project_id = p.project_id" - + " WHERE nde.nd_geolocation_id = :studyDbId" + + " WHERE nde.nd_experiment_id = :studyDbId" + " AND p.dataset_type_id = " + DatasetTypeEnum.SUMMARY_DATA.getId(); private static final String STUDY_DETAILS_SQL = " SELECT DISTINCT \n" - + " p.name AS name, \n" - + " p.description AS title, \n" - + " p.objective AS objective, \n" - + " p.start_date AS startDate, \n" - + " p.end_date AS endDate, \n" + + " pmain.name AS name, \n" + + " pmain.description AS title, \n" + + " pmain.objective AS objective, \n" + + " pmain.start_date AS startDate, \n" + + " pmain.end_date AS endDate, \n" + " stype.study_type_id AS studyTypeId, \n" + " stype.label AS studyTypeLabel, \n" + " stype.name AS studyTypeName, \n" + " ppPI.value AS piName, \n" - + " gpSiteName.value AS siteName, \n" - + " p.project_id AS id, \n" + + " siteName.value AS siteName, \n" + + " pmain.project_id AS id, \n" + " ppPIid.value AS piId, \n" - + " gpSiteId.value AS siteId, \n" - + " p.parent_project_id AS folderId, \n" - + " p.program_uuid AS programUUID, \n" - + " p.study_update AS studyUpdate, \n" - + " p.created_by AS createdBy, \n" - + " p.locked AS isLocked " + + " siteId.value AS siteId, \n" + + " pmain.parent_project_id AS folderId, \n" + + " pmain.program_uuid AS programUUID, \n" + + " pmain.study_update AS studyUpdate, \n" + + " pmain.created_by AS createdBy, \n" + + " pmain.locked AS isLocked " + " FROM \n" + " project p \n" - + " INNER JOIN study_type stype on stype.study_type_id = p.study_type_id" - + " LEFT JOIN projectprop ppPI ON p.project_id = ppPI.project_id AND ppPI.variable_id = " + TermId.PI_NAME.getId() + " \n" - + " LEFT JOIN projectprop ppPIid ON p.project_id = ppPIid.project_id AND ppPIid.variable_id = " + TermId.PI_ID.getId() + " \n" - + " LEFT JOIN nd_experiment e ON e.project_id = p.project_id \n" - + " LEFT JOIN nd_geolocationprop gpSiteName ON e.nd_geolocation_id = gpSiteName.nd_geolocation_id AND gpSiteName.type_id = " + + " INNER JOIN project pmain ON pmain.project_id = p.study_id " + + " INNER JOIN study_type stype on stype.study_type_id = pmain.study_type_id" + + " LEFT JOIN projectprop ppPI ON pmain.project_id = ppPI.project_id AND ppPI.variable_id = " + TermId.PI_NAME.getId() + " \n" + + " LEFT JOIN projectprop ppPIid ON pmain.project_id = ppPIid.project_id AND ppPIid.variable_id = " + TermId.PI_ID.getId() + " \n" + + " LEFT JOIN nd_experiment e ON e.project_id = p.project_id \n AND e.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + + " LEFT JOIN nd_experimentprop siteName ON e.nd_experiment_id = siteName.nd_experiment_id AND siteName.type_id = " + TermId.TRIAL_LOCATION.getId() + " \n" - + " LEFT JOIN nd_geolocationprop gpSiteId ON e.nd_geolocation_id = gpSiteId.nd_geolocation_id AND gpSiteId.type_id = " + + " LEFT JOIN nd_experimentprop siteId ON e.nd_experiment_id = siteId.nd_experiment_id AND siteId.type_id = " + TermId.LOCATION_ID.getId() + " \n" - + " WHERE p.project_id = :studyId \n"; + + " WHERE p.study_id = :studyId \n"; private static final String COUNT_PROJECTS_WITH_VARIABLE = "SELECT count(pp.project_id) FROM projectprop pp inner join project p on (p.project_id = pp.project_id)\n" @@ -346,32 +346,42 @@ public List getByIds(final Collection projectIds) { } public List getAllStudyDetails(final StudyTypeDto studyType, final String programUUID) { - return this.getAllStudyDetails(studyType, programUUID, -1, -1); + return this.getAllStudyDetails(Optional.of(studyType), programUUID, -1, -1); } public List getAllStudyDetails( - final StudyTypeDto studyType, final String programUUID, final int start, + final Optional studyType, final String programUUID, final int start, final int numOfRows) { final List studyDetails = new ArrayList<>(); + // Location-related information comes from first instance final StringBuilder sqlString = new StringBuilder().append( - "SELECT DISTINCT p.name AS name, p.description AS title, p.objective AS objective, p.start_date AS startDate, ") - .append("p.end_date AS endDate, ppPI.value AS piName, gpSiteName.value AS siteName, p.project_id AS id ") - .append(", ppPIid.value AS piId, gpSiteId.value AS siteId, p.created_by as createdBy, p.locked as isLocked ") - .append("FROM project p ") - .append(" LEFT JOIN projectprop ppPI ON p.project_id = ppPI.project_id ") - .append(" AND ppPI.variable_id = ").append(TermId.PI_NAME.getId()).append(" ") - .append(" LEFT JOIN projectprop ppPIid ON p.project_id = ppPIid.project_id ") - .append(" AND ppPIid.variable_id = ").append(TermId.PI_ID.getId()).append(" ") - .append(" LEFT JOIN nd_experiment e ON p.project_id = e.project_id ") - .append(" LEFT JOIN nd_geolocationprop gpSiteName ON e.nd_geolocation_id = gpSiteName.nd_geolocation_id ") - .append(" AND gpSiteName.type_id = ").append(TermId.TRIAL_LOCATION.getId()).append(" ") - .append(" LEFT JOIN nd_geolocationprop gpSiteId ON e.nd_geolocation_id = gpSiteId.nd_geolocation_id ") - .append(" AND gpSiteId.type_id = ").append(TermId.LOCATION_ID.getId()).append(" ") - .append(" WHERE p.deleted != " + DELETED_STUDY + " ") - .append(" AND p.study_type_id = '" + studyType.getId() + "'") - .append(" AND (p.program_uuid = :" + DmsProjectDao.PROGRAM_UUID + " ").append("OR p.program_uuid IS NULL) ") - .append(" ORDER BY p.name "); + "SELECT DISTINCT pmain.name AS name, pmain.description AS title, pmain.objective AS objective, pmain.start_date AS startDate, ") + .append("pmain.end_date AS endDate, st.study_type_id AS studyTypeId, st.label as studyTypelabel, st.name as studyTypeName, ") + .append("ppPI.value AS piName, siteName.value AS siteName, pmain.project_id AS id ") + .append(", ppPIid.value AS piId, siteId.value AS siteId, ") + .append("pmain.created_by as createdBy, pmain.locked as isLocked ") + .append("FROM project pmain ") + .append("INNER JOIN project env_ds ON pmain.project_id = env_ds.study_id AND env_ds.dataset_type_id = ") + .append(DatasetTypeEnum.SUMMARY_DATA.getId()).append(" ") + .append("LEFT JOIN projectprop ppPI ON pmain.project_id = ppPI.project_id ") + .append(" AND ppPI.variable_id = ").append(TermId.PI_NAME.getId()).append(" ") + .append("LEFT JOIN projectprop ppPIid ON pmain.project_id = ppPIid.project_id ") + .append(" AND ppPIid.variable_id = ").append(TermId.PI_ID.getId()).append(" ") + .append("LEFT JOIN nd_experiment e ON env_ds.project_id = e.project_id ") + .append(" AND e.type_id = ").append(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()).append(" ") + .append(" AND e.observation_unit_no = 1 ") + .append("LEFT JOIN nd_experimentprop siteName ON e.nd_experiment_id = siteName.nd_experiment_id ") + .append(" AND siteName.type_id = ").append(TermId.TRIAL_LOCATION.getId()).append(" ") + .append("LEFT JOIN nd_experimentprop siteId ON e.nd_experiment_id = siteId.nd_experiment_id ") + .append(" AND siteId.type_id = ").append(TermId.LOCATION_ID.getId()).append(" ") + .append("LEFT JOIN study_type st ON st.study_type_id = pmain.study_type_id ") + .append(" WHERE pmain.deleted != " + DELETED_STUDY + " "); + if (studyType.isPresent()) { + sqlString.append(" AND pmain.study_type_id = '" + studyType.get().getId() + "'"); + } + sqlString.append(" AND (pmain.program_uuid = :" + DmsProjectDao.PROGRAM_UUID + " ").append("OR pmain.program_uuid IS NULL) ") + .append(" ORDER BY pmain.name "); if (start > 0 && numOfRows > 0) { sqlString.append(" LIMIT " + start + "," + numOfRows); } @@ -381,7 +391,8 @@ public List getAllStudyDetails( try { final Query query = this.getSession().createSQLQuery(sqlString.toString()).addScalar("name").addScalar("title").addScalar("objective") - .addScalar("startDate").addScalar("endDate").addScalar("piName").addScalar("siteName").addScalar("id") + .addScalar("startDate").addScalar("endDate").addScalar("studyTypeId").addScalar("studyTypeLabel") + .addScalar("studyTypeName").addScalar("piName").addScalar("siteName").addScalar("id") .addScalar("piId").addScalar("siteId").addScalar("createdBy").addScalar("isLocked").setParameter( DmsProjectDao.PROGRAM_UUID, programUUID); @@ -400,16 +411,20 @@ public List getAllStudyDetails( final String objective = (String) row[2]; final String startDate = (String) row[3]; final String endDate = (String) row[4]; - final String piName = (String) row[5]; - final String siteName = (String) row[6]; - final Integer id = (Integer) row[7]; - final String piId = (String) row[8]; - final String siteId = (String) row[9]; - final String createdBy = (String) row[10]; - final Boolean isLocked = (Boolean) row[11]; - + final Integer studyTypeId = (Integer) row[5]; + final String studyTypeLabel = (String) row[6]; + final String studyTypeName = (String) row[7]; + final String piName = (String) row[8]; + final String siteName = (String) row[9]; + final Integer id = (Integer) row[10]; + final String piId = (String) row[11]; + final String siteId = (String) row[12]; + final String createdBy = (String) row[13]; + final Boolean isLocked = (Boolean) row[14]; + + final StudyTypeDto studyTypeDto = new StudyTypeDto(studyTypeId, studyTypeLabel, studyTypeName); final StudyDetails study = - new StudyDetails(id, name, title, objective, startDate, endDate, studyType, piName, siteName, piId, siteId, Util + new StudyDetails(id, name, title, objective, startDate, endDate, studyTypeDto, piName, siteName, piId, siteId, Util .getCurrentDateAsStringValue(), createdBy, isLocked); studyDetails.add(study); } @@ -464,7 +479,7 @@ public StudyDetails getStudyDetails(final int studyId) { } catch (final HibernateException e) { LOG.error(e.getMessage(), e); - throw new MiddlewareQueryException("Error in getTrialObservationTable() query in DmsProjectDao: " + e.getMessage(), e); + throw new MiddlewareQueryException("Error in getStudyDetails() query in DmsProjectDao: " + e.getMessage(), e); } return studyDetails; } @@ -474,13 +489,6 @@ public long countAllStudyDetails(final StudyTypeDto studyType, final String prog final StringBuilder sqlString = new StringBuilder() .append("SELECT COUNT(1) ").append("FROM project p ") - .append(" LEFT JOIN projectprop ppPI ON p.project_id = ppPI.project_id ") - .append(" AND ppPI.variable_id = ") - .append(TermId.PI_NAME.getId()) - .append(" ") - .append(" LEFT JOIN nd_experiment e ON p.project_id = e.project_id ") - .append(" LEFT JOIN nd_geolocationprop gpSiteName ON e.nd_geolocation_id = gpSiteName.nd_geolocation_id ") - .append(" AND gpSiteName.type_id = ").append(TermId.TRIAL_LOCATION.getId()).append(" ") .append("WHERE p.deleted != " + DELETED_STUDY + " ") .append(" AND p.study_type_id = '" + studyType.getId()) .append("' AND (p.").append(DmsProjectDao.PROGRAM_UUID) @@ -500,78 +508,7 @@ public long countAllStudyDetails(final StudyTypeDto studyType, final String prog } public List getAllStudyDetails(final String programUUID, final int start, final int numOfRows) { - final List studyDetails = new ArrayList<>(); - try { - - final StringBuilder sqlString = new StringBuilder() - .append("SELECT DISTINCT p.name AS name, p.description AS title, p.objective AS objective, p.start_date AS startDate, ") - .append("p.end_date AS endDate, ppPI.value AS piName, gpSiteName.value AS siteName, p.project_id AS id, st" - + ".study_type_id AS " - + "studyType , st.label as label, st.name as studyTypeName, st.visible as visible, st.cvterm_id as cvtermId ") - .append(", ppPIid.value AS piId, gpSiteId.value AS siteId, p.created_by as createdBy, p.locked as isLocked ") - .append("FROM project p ") - .append(" LEFT JOIN projectprop ppPI ON p.project_id = ppPI.project_id ").append(" AND ppPI.variable_id = ") - .append(TermId.PI_NAME.getId()).append(" ") - // 8100 - .append(" LEFT JOIN projectprop ppPIid ON p.project_id = ppPIid.project_id ") - .append(" AND ppPIid.variable_id = ").append(TermId.PI_ID.getId()).append(" ") - .append(" INNER JOIN nd_experiment e ON e.project_id = p.project_id ") - .append(" LEFT JOIN nd_geolocationprop gpSiteName ON e.nd_geolocation_id = gpSiteName.nd_geolocation_id ") - .append(" AND gpSiteName.type_id = ").append(TermId.TRIAL_LOCATION.getId()).append(" ") - // 8180 - .append(" LEFT JOIN nd_geolocationprop gpSiteId ON e.nd_geolocation_id = gpSiteId.nd_geolocation_id ") - .append(" AND gpSiteId.type_id = ").append(TermId.LOCATION_ID.getId()).append(" ") - .append(" LEFT JOIN study_type st ON p.study_type_id = st.study_type_id ") - .append(" WHERE p.deleted != " + DELETED_STUDY + " ") - .append(" AND p.study_type_id IS NOT NULL ") - .append(" AND (p.program_uuid = :" + DmsProjectDao.PROGRAM_UUID + " ").append("OR p.program_uuid IS NULL) ") - .append(" ORDER BY p.name "); - if (start > 0 && numOfRows > 0) { - sqlString.append(" LIMIT " + start + "," + numOfRows); - } - - final Query query = - this.getSession().createSQLQuery(sqlString.toString()).addScalar("name").addScalar("title").addScalar("objective") - .addScalar("startDate").addScalar("endDate").addScalar("piName").addScalar("siteName").addScalar("id") - .addScalar("studyType").addScalar("label").addScalar("studyTypeName").addScalar("visible").addScalar("cvTermId") - .addScalar("piId").addScalar("siteId").addScalar("createdBy").addScalar("isLocked") - .setParameter(DmsProjectDao.PROGRAM_UUID, programUUID); - - final List list = query.list(); - - if (list != null && !list.isEmpty()) { - for (final Object[] row : list) { - final String name = (String) row[0]; - final String title = (String) row[1]; - final String objective = (String) row[2]; - final String startDate = (String) row[3]; - final String endDate = (String) row[4]; - final String piName = (String) row[5]; - final String siteName = (String) row[6]; - final Integer id = (Integer) row[7]; - final Integer studyTypeId = (Integer) row[8]; - final String label = (String) row[9]; - final String studyTypeName = (String) row[10]; - final boolean visible = ((Byte) row[11]) == 1; - final Integer cvTermId = (Integer) row[12]; - final String piId = (String) row[13]; - final String siteId = (String) row[14]; - final String createdBy = (String) row[15]; - final Boolean isLocked = (Boolean) row[16]; - - final StudyTypeDto studyTypeDto = new StudyTypeDto(studyTypeId, label, studyTypeName, cvTermId, visible); - studyDetails.add( - new StudyDetails(id, name, title, objective, startDate, endDate, studyTypeDto, piName, siteName, piId, siteId, - Util.getCurrentDateAsStringValue(), createdBy, isLocked)); - } - } - - } catch (final HibernateException e) { - LOG.error(e.getMessage(), e); - throw new MiddlewareQueryException("Error in getAllStudyDetails() query in DmsProjectDao: " + e.getMessage(), e); - } - return studyDetails; - + return this.getAllStudyDetails(Optional.empty(), programUUID, start, numOfRows); } public long countAllStudyDetails(final String programUUID) { @@ -580,18 +517,6 @@ public long countAllStudyDetails(final String programUUID) { final StringBuilder sqlString = new StringBuilder() .append("SELECT COUNT(1) ").append("FROM project p ") - .append(" ") - .append(" LEFT JOIN projectprop ppPI ON p.project_id = ppPI.project_id ") - .append(" AND ppPI.variable_id = ") - .append(TermId.PI_NAME.getId()) - .append(" ") - // 8100 - .append(" INNER JOIN nd_experiment e ON e.project_id = p.project_id ") - .append(" LEFT JOIN nd_geolocationprop gpSiteName ON e.nd_geolocation_id = gpSiteName.nd_geolocation_id ") - .append(" AND gpSiteName.type_id = ") - .append(TermId.TRIAL_LOCATION.getId()) - .append(" ") - // 8180 .append("WHERE p.deleted != " + DELETED_STUDY + " ") .append(" AND p.study_type_id IS NOT NULL ") .append(" AND (p.").append(DmsProjectDao.PROGRAM_UUID).append(" = :").append(DmsProjectDao.PROGRAM_UUID) @@ -742,16 +667,15 @@ private Criteria buildCoreCriteria(final Map parameters, f } if (parameters.containsKey(StudyFilters.LOCATION_ID)) { - // Find environments with specified location (saved in GeolocationProperty) + // Find environments with specified location final DetachedCriteria locationCriteria = DetachedCriteria.forClass(ExperimentModel.class); locationCriteria.add(Restrictions.eq("typeId", TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId())); - locationCriteria.createAlias("geoLocation", "g"); - locationCriteria.createAlias("g.properties", "gp"); + locationCriteria.createAlias("properties", "xp"); locationCriteria.createAlias("project", "p"); locationCriteria.createAlias("p.study", "st"); locationCriteria.add(Restrictions.and( - Restrictions.eq("gp.typeId", DmsProjectDao.LOCATION_ID), - Restrictions.eq("gp.value", parameters.get(StudyFilters.LOCATION_ID)))); + Restrictions.eq("xp.typeId", DmsProjectDao.LOCATION_ID), + Restrictions.eq("xp.value", parameters.get(StudyFilters.LOCATION_ID)))); locationCriteria.setProjection(Projections.property("st.projectId")); criteria.add(Property.forName("projectId").in(locationCriteria)); } @@ -760,10 +684,10 @@ private Criteria buildCoreCriteria(final Map parameters, f return criteria; } - public StudyMetadata getStudyMetadataForGeolocationId(final Integer geolocationId) { - Preconditions.checkNotNull(geolocationId); + public StudyMetadata getStudyMetadataForEnvironmentId(final Integer environmentId) { + Preconditions.checkNotNull(environmentId); try { - final SQLQuery query = this.getSession().createSQLQuery(DmsProjectDao.GET_STUDY_METADATA_BY_GEOLOCATION_ID); + final SQLQuery query = this.getSession().createSQLQuery(DmsProjectDao.GET_STUDY_METADATA_BY_ENVIRONMENT_ID); query.addScalar("studyDbId"); query.addScalar("trialOrNurseryId"); query.addScalar("studyName"); @@ -780,12 +704,12 @@ public StudyMetadata getStudyMetadataForGeolocationId(final Integer geolocationI query.addScalar("studyObjective"); query.addScalar("experimentalDesign"); query.addScalar("lastUpdate"); - query.setParameter("geolocationId", geolocationId); + query.setParameter("environmentId", environmentId); final Object result = query.uniqueResult(); if (result != null) { final Object[] row = (Object[]) result; final StudyMetadata studyMetadata = new StudyMetadata(); - studyMetadata.setStudyDbId(geolocationId); + studyMetadata.setStudyDbId(environmentId); studyMetadata.setNurseryOrTrialId((row[1] instanceof Integer) ? (Integer) row[1] : null); studyMetadata.setStudyName((row[2] instanceof String) ? (String) row[2] : null); studyMetadata.setStudyType((row[3] instanceof Integer) ? ((Integer) row[3]).toString() : null); @@ -809,7 +733,7 @@ public StudyMetadata getStudyMetadataForGeolocationId(final Integer geolocationI return null; } } catch (final HibernateException e) { - final String message = "Error with getStudyMetadataForGeolocationId() query from study with geoloCationId: " + geolocationId; + final String message = "Error with getStudyMetadataForEnvironmentId() query from study with environment id: " + environmentId; DmsProjectDao.LOG.error(message, e); throw new MiddlewareQueryException(message, e); } @@ -837,9 +761,9 @@ public boolean isVariableUsedInOtherPrograms(final String variableId, final Stri + " INNER JOIN\n" + " nd_experiment ON nd_experiment.project_id = project.project_id\n" + " INNER JOIN\n" - + " nd_geolocationprop ON nd_experiment.nd_geolocation_id = nd_geolocationprop.nd_geolocation_id" - + " WHERE nd_geolocationprop.type_id = :variableId\n" - + " AND nd_geolocationprop.value = :variableValue\n" + + " nd_experimentprop xp ON nd_experiment.nd_experiment_id = xp.nd_experiment_id" + + " WHERE xp.type_id = :variableId\n" + + " AND xp.value = :variableValue\n" + " AND project.program_uuid <> :programUUID AND project.deleted = 0)) = 1 THEN 1 ELSE 0\n" + " END;"); query.setParameter("variableId", variableId); @@ -1102,7 +1026,7 @@ public List getObservationSetVariables(final List final Object categoryId = result.get(OBS_SET_CATEGORY_ID); if (categoryId != null) { if (measurementVariable.getPossibleValues() == null || measurementVariable.getPossibleValues().isEmpty()) { - measurementVariable.setPossibleValues(new ArrayList()); + measurementVariable.setPossibleValues(new ArrayList<>()); } final ValueReference valueReference = // new ValueReference( @@ -1159,74 +1083,97 @@ public List getDatasets(final Integer studyId) { } - public List getDatasetInstances(final int datasetId) { - return this.getDatasetInstances(datasetId, Collections.emptyList()); + public List getDatasetInstances(final int datasetId, final DatasetType datasetType) { + return this.getDatasetInstances(datasetId, Collections.emptyList(), datasetType); } - public List getDatasetInstances(final int datasetId, final List instanceIds) { + public List getDatasetInstances(final int datasetId, final List instanceIds, final DatasetType datasetType) { try { - final String sql = "select \n" + " geoloc.nd_geolocation_id as instanceDbId, \n" - + " nde.nd_experiment_id as experimentId, \n" - + " geoloc.description as instanceNumber, \n" - + " max(if(geoprop.type_id = 8190, loc.locid, null)) as locationId, \n" // 8190 = cvterm for LOCATION_ID - + " max(if(geoprop.type_id = 8190, loc.lname, null)) as locationName, \n" + - " max(if(geoprop.type_id = 8190, loc.labbr, null)) as locationAbbreviation, \n" + // 8189 = cvterm for LOCATION_ABBR - " max(if(geoprop.type_id = 8189, geoprop.value, null)) as customLocationAbbreviation, \n" + + final String sql = "select \n" + + " env.nd_experiment_id as experimentId, \n" + + " env.observation_unit_no as instanceNumber, \n" + + " max(if(xprop.type_id = 8190, loc.locid, null)) as locationId, \n" // 8190 = cvterm for LOCATION_ID + + " max(if(xprop.type_id = 8190, loc.lname, null)) as locationName, \n" + + " max(if(xprop.type_id = 8190, loc.labbr, null)) as locationAbbreviation, \n" + // 8189 = cvterm for LOCATION_ABBR + " max(if(xprop.type_id = 8189, xprop.value, null)) as customLocationAbbreviation, \n" + // 8189 = cvterm for CUSTOM_LOCATION_ABBR - " case when max(if(geoprop.type_id = 8583, geoprop.value, null)) is null then 0 else 1 end as hasFieldmap, \n" + " case when max(if(xprop.type_id = 8583, xprop.value, null)) is null then 0 else 1 end as hasFieldmap, \n" // 8583 = cvterm for BLOCK_ID (meaning instance has fieldmap) // if instance has X/Y coordinates (fieldmap or row/col design) - + " case when (max(if(geoprop.type_id = 8583, geoprop.value, null)) is null) \n " + + " case when (max(if(xprop.type_id = 8583, xprop.value, null)) is null) \n " + " and (max(hasRowColDesign.nd_experiment_id)) is null \n" + " then 0 else 1 end as hasFieldLayout, \n" // if instance has been georeferenced using the geojson editor - + " max(case when json_props like '%geoCoordinates%' then 1 else 0 end) as hasGeoJSON, \n" + + " max(case when env.json_props like '%geoCoordinates%' then 1 else 0 end) as hasGeoJSON \n"; + - // If study has any plot experiments, hasExperimentalDesign flag = true - + " case when (select count(1) FROM nd_experiment exp WHERE exp.type_id = 1155 " - + " AND exp.nd_geolocation_id = geoloc.nd_geolocation_id) > 0 then 1 else 0 end as hasExperimentalDesign, " - - // If study has sub-observations or samples, canBeDeleted = false - + " case when (select count(1) from sample s " - + " inner join nd_experiment exp on exp.nd_experiment_id = s.nd_experiment_id and exp.type_id = 1155 " - + " where exp.nd_geolocation_id = geoloc.nd_geolocation_id) > 0 or (select count(1) from nd_experiment exp \n" - + " INNER JOIN project pr ON pr.project_id = exp.project_id AND exp.type_id = 1155 \n" - + " INNER JOIN dataset_type dt on dt.dataset_type_id = pr.dataset_type_id and is_subobs_type = 1 where exp.nd_geolocation_id = geoloc.nd_geolocation_id) > 0" - + " then 0 else 1 end as canBeDeleted, " - - // if study has any pending or accepted plot observations, hasMeasurements = true - + " case when (select count(1) from phenotype ph " - + " inner join nd_experiment exp on exp.nd_experiment_id = ph.nd_experiment_id and exp.type_id = 1155 " - + " where exp.nd_geolocation_id = geoloc.nd_geolocation_id and " - + " (ph.value is not null or ph.cvalue_id is not null or draft_value is not null or draft_cvalue_id is not null)) > 0 then 1 else 0 end as hasMeasurements " - + " from nd_geolocation geoloc \n" - + " inner join nd_experiment nde on nde.nd_geolocation_id = geoloc.nd_geolocation_id \n" - + " inner join project proj on proj.project_id = nde.project_id \n" - + " left outer join nd_geolocationprop geoprop on geoprop.nd_geolocation_id = geoloc.nd_geolocation_id \n" - + " left outer join location loc on geoprop.value = loc.locid and geoprop.type_id = 8190 \n" - + " left join ( \n" - + " select ndep.nd_experiment_id \n" - + " from nd_experimentprop ndep \n" - + " INNER JOIN cvterm cvt ON cvt.cvterm_id = ndep.type_id \n" - + " WHERE cvt.name = 'ROW' \n" - + " ) hasRowColDesign on nde.nd_experiment_id = hasRowColDesign.nd_experiment_id " - + " where proj.project_id = :datasetId \n"; final StringBuilder sb = new StringBuilder(sql); + final boolean isEnvironmentDataset = DatasetTypeEnum.SUMMARY_DATA.getId() == datasetType.getDatasetTypeId(); + + // To optimize performance, only get experimental design-related metadata if the dataset is environment dataset + if (isEnvironmentDataset) { + // If study has any plot experiments, hasExperimentalDesign flag = true + sb.append(", case when (select count(1) FROM nd_experiment exp WHERE exp.type_id = 1155 "); + sb.append(" AND exp.parent_id = env.nd_experiment_id) > 0 then 1 else 0 end as hasExperimentalDesign, "); + + // If study has samples (plot and sub-obs levels) or sub-observations, canBeDeleted = false + sb.append(" CASE WHEN EXISTS (select 1 from sample s "); + sb.append(" inner join nd_experiment exp on exp.nd_experiment_id = s.nd_experiment_id and exp.type_id = 1155\n"); + sb.append(" where exp.parent_id = env.nd_experiment_id) OR "); + // we are making a separate query for samples at the sub-obs level for optimization purposes + sb.append(" EXISTS (select 1 from sample s "); + sb.append(" inner join nd_experiment exp on exp.nd_experiment_id = s.nd_experiment_id and exp.type_id = 1155\n"); + sb.append(" inner join nd_experiment plot ON plot.nd_experiment_id = exp.parent_id and plot.type_id = 1155\n"); + sb.append(" where plot.parent_id = env.nd_experiment_id) OR "); + sb.append(" EXISTS (select 1 from nd_experiment exp "); + sb.append(" INNER JOIN nd_experiment plot on exp.parent_id = plot.nd_experiment_id and plot.type_id = 1155\n"); + sb.append(" where exp.type_id = 1155 and plot.parent_id = env.nd_experiment_id) "); + sb.append(" THEN 0 else 1 end as canBeDeleted, "); + + // if study has any pending or accepted observations (plot and sub-obs levels), hasMeasurements = true + sb.append(" CASE WHEN EXISTS (select 1 from phenotype ph\n"); + sb.append(" inner join nd_experiment exp on exp.nd_experiment_id = ph.nd_experiment_id and exp.type_id = 1155\n"); + sb.append(" where exp.parent_id = env.nd_experiment_id and\n"); + sb.append(" (ph.value is not null or ph.cvalue_id is not null or draft_value is not null or draft_cvalue_id is not null))\n"); + // we are making a separate query for observations at the sub-obs level for optimization purposes + sb.append(" OR EXISTS (select 1 from phenotype ph\n"); + sb.append(" inner join nd_experiment exp on exp.nd_experiment_id = ph.nd_experiment_id and exp.type_id = 1155\n"); + sb.append(" inner JOIN nd_experiment plot ON plot.nd_experiment_id = exp.parent_id and plot.type_id = 1155\n"); + sb.append(" where plot.parent_id = env.nd_experiment_id and\n"); + sb.append(" (ph.value is not null or ph.cvalue_id is not null or draft_value is not null or draft_cvalue_id is not null))\n"); + sb.append(" then 1 else 0 end as hasMeasurements "); + sb.append(" FROM nd_experiment nde "); + sb.append(" INNER JOIN nd_experiment env ON nde.nd_experiment_id = env.nd_experiment_id "); + } else { + sb.append(" FROM nd_experiment nde "); + if (datasetType.isSubObservationType()) { + sb.append(" INNER JOIN nd_experiment plot ON plot.nd_experiment_id = nde.parent_id AND plot.type_id = ").append(TermId.PLOT_EXPERIMENT.getId()); + sb.append(" INNER JOIN nd_experiment env ON plot.parent_id = env.nd_experiment_id AND env.type_id = ").append(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()); + } else { + sb.append(" INNER JOIN nd_experiment env ON nde.parent_id = env.nd_experiment_id AND env.type_id = ").append(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()); + } + } + sb.append(" LEFT OUTER JOIN nd_experimentprop xprop ON xprop.nd_experiment_id = env.nd_experiment_id "); + sb.append(" LEFT OUTER JOIN location loc on xprop.value = loc.locid and xprop.type_id = 8190 "); + sb.append(" LEFT JOIN (select ndep.nd_experiment_id from nd_experimentprop ndep INNER JOIN cvterm cvt ON cvt.cvterm_id = ndep.type_id "); + sb.append(" WHERE cvt.name = 'ROW') hasRowColDesign on nde.nd_experiment_id = hasRowColDesign.nd_experiment_id "); + sb.append(" WHERE nde.project_id = :datasetId "); + + if (!CollectionUtils.isEmpty(instanceIds)) { - sb.append(" AND geoloc.nd_geolocation_id IN (:locationIds) \n"); + sb.append(" AND env.nd_experiment_id IN (:locationIds) \n"); } - sb.append(" group by geoloc.nd_geolocation_id \n"); - sb.append(" order by (1 * geoloc.description) asc "); + sb.append(" group by env.nd_experiment_id \n" ); + sb.append(" order by env.observation_unit_no asc "); final SQLQuery query = this.getSession().createSQLQuery(sb.toString()); query.setParameter("datasetId", datasetId); if (!CollectionUtils.isEmpty(instanceIds)) { query.setParameterList("locationIds", instanceIds); } - query.addScalar("instanceDbId", new IntegerType()); query.addScalar("experimentId", new IntegerType()); query.addScalar("locationId", new IntegerType()); query.addScalar("locationName", new StringType()); @@ -1236,9 +1183,11 @@ public List getDatasetInstances(final int datasetId, final List getPersonIdsAssociatedToEnvironment(final Integer instanceI + " ON ( r.object_id = scale.cvterm_id ) \n" + " INNER JOIN cvterm variable \n" + " ON ( r.subject_id = variable.cvterm_id ) \n" - + " INNER JOIN nd_geolocationprop pp \n" + + " INNER JOIN nd_experimentprop pp \n" + " ON ( pp.type_id = variable.cvterm_id ) \n" - + "WHERE pp.nd_geolocation_id = :instanceId \n" + + "WHERE pp.nd_experiment_id = :instanceId \n" + " AND r.object_id = 1901; ").addScalar("personId", new IntegerType()); query.setParameter("instanceId", instanceId); return query.list(); @@ -1436,7 +1385,7 @@ public long countStudies(final StudySearchFilter studySearchFilter) { public List getStudies(final StudySearchFilter studySearchFilter) { - // TODO: Check if we can reuse this query/method in getStudyMetadataForGeolocationId() + // TODO: Check if we can reuse this query/method in getStudyMetadataForEnvironmentId() final SQLQuery sqlQuery = this.getSession().createSQLQuery(this.createStudySummaryQueryString(studySearchFilter)); @@ -1527,7 +1476,7 @@ private void addstudySearchFilterParameters(final SQLQuery sqlQuery, final Study } private String createCountStudyQueryString(final StudySearchFilter studySearchFilter) { - final StringBuilder sql = new StringBuilder(" SELECT COUNT(DISTINCT geoloc.nd_geolocation_id) "); + final StringBuilder sql = new StringBuilder(" SELECT COUNT(DISTINCT env.nd_experiment_id) "); this.appendStudySummaryFromQuery(sql); this.appendStudySearchFilter(sql, studySearchFilter); return sql.toString(); @@ -1535,11 +1484,11 @@ private String createCountStudyQueryString(final StudySearchFilter studySearchFi private String createStudySummaryQueryString(final StudySearchFilter studySearchFilter) { final StringBuilder sql = new StringBuilder(" SELECT "); - sql.append(" geoloc.nd_geolocation_id AS " + StudySearchFilter.STUDY_DB_ID + ", "); - sql.append(" CONCAT(pmain.name, ' Environment Number ', geoloc.description) AS " + StudySearchFilter.STUDY_NAME + ", "); + sql.append(" env.nd_experiment_id AS " + StudySearchFilter.STUDY_DB_ID + ", "); + sql.append(" CONCAT(pmain.name, ' Environment Number ', env.observation_unit_no) AS " + StudySearchFilter.STUDY_NAME + ", "); sql.append(" pmain.study_type_id AS " + StudySearchFilter.STUDY_TYPE_DB_ID + ", "); sql.append(" studyType.label AS " + StudySearchFilter.STUDY_TYPE_NAME + ", "); - sql.append(" geopropSeason.value AS " + StudySearchFilter.SEASON_DB_ID + ", "); + sql.append(" xpropSeason.value AS " + StudySearchFilter.SEASON_DB_ID + ", "); sql.append(" cvtermSeason.definition AS " + StudySearchFilter.SEASON + ", "); sql.append(" pmain.project_id AS " + StudySearchFilter.TRIAL_DB_ID + ", "); sql.append(" pmain.name AS " + StudySearchFilter.TRIAL_NAME + ", "); @@ -1552,7 +1501,7 @@ private String createStudySummaryQueryString(final StudySearchFilter studySearch sql.append(" wp.project_uuid AS " + StudySearchFilter.PROGRAM_DB_ID + " "); this.appendStudySummaryFromQuery(sql); this.appendStudySearchFilter(sql, studySearchFilter); - sql.append(" GROUP BY geoloc.nd_geolocation_id "); + sql.append(" GROUP BY env.nd_experiment_id "); final String sortBy = studySearchFilter.getSortedRequest().getSortBy(); final String sortOrder = studySearchFilter.getSortedRequest().getSortOrder(); @@ -1566,39 +1515,37 @@ private String createStudySummaryQueryString(final StudySearchFilter studySearch private void appendStudySummaryFromQuery(final StringBuilder sql) { sql.append(" FROM "); - sql.append(" nd_geolocation geoloc "); + sql.append(" nd_experiment env "); sql.append(" INNER JOIN "); - sql.append(" nd_experiment nde ON nde.nd_geolocation_id = geoloc.nd_geolocation_id "); - sql.append(" INNER JOIN "); - sql.append(" project proj ON proj.project_id = nde.project_id "); + sql.append(" project proj ON proj.project_id = env.project_id "); sql.append(" INNER JOIN "); sql.append(" project pmain ON pmain.project_id = proj.study_id "); sql.append(" LEFT OUTER JOIN "); sql.append(" study_type studyType ON studyType.study_type_id = pmain.study_type_id "); sql.append(" LEFT OUTER JOIN "); sql.append( - " nd_geolocationprop geopropSeason ON geopropSeason.nd_geolocation_id = geoloc.nd_geolocation_id AND geopropSeason.type_id = " + " nd_experimentprop xpropSeason ON xpropSeason.nd_experiment_id = env.nd_experiment_id AND xpropSeason.type_id = " + TermId.SEASON_VAR.getId()); sql.append(" LEFT OUTER JOIN "); sql.append( - " nd_geolocationprop geopropLocation ON geopropLocation.nd_geolocation_id = geoloc.nd_geolocation_id AND geopropLocation.type_id = " + " nd_experimentprop xpropLocation ON xpropLocation.nd_experiment_id = env.nd_experiment_id AND xpropLocation.type_id = " + TermId.LOCATION_ID.getId()); sql.append(" LEFT OUTER JOIN "); - sql.append(" location ON geopropLocation.value = location.locid"); + sql.append(" location ON xpropLocation.value = location.locid"); sql.append(" LEFT OUTER JOIN "); sql.append(" workbench.workbench_project wp ON wp.project_uuid = pmain.program_uuid"); sql.append(" LEFT OUTER JOIN "); - sql.append(" cvterm cvtermSeason ON cvtermSeason.cvterm_id = geopropSeason.value"); + sql.append(" cvterm cvtermSeason ON cvtermSeason.cvterm_id = xpropSeason.value"); sql.append(" WHERE "); - sql.append(" nde.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + " "); + sql.append(" env.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + " "); } private void appendStudySearchFilter(final StringBuilder sql, final StudySearchFilter studySearchFilter) { if (!StringUtils.isEmpty(studySearchFilter.getStudyDbId())) { - sql.append("AND geoloc.nd_geolocation_id = :studyDbId "); + sql.append("AND env.nd_experiment_id = :studyDbId "); } if (!StringUtils.isEmpty(studySearchFilter.getLocationDbId())) { - sql.append("AND geopropLocation.value = :locationDbId "); + sql.append("AND xpropLocation.value = :locationDbId "); } if (!StringUtils.isEmpty(studySearchFilter.getProgramDbId())) { sql.append("AND pmain.program_uuid = :programDbId "); @@ -1619,12 +1566,12 @@ private void appendStudySearchFilter(final StringBuilder sql, final StudySearchF public Integer getDatasetIdByEnvironmentIdAndDatasetType(final Integer environmentId, final DatasetTypeEnum datasetType) { try { - final Query query = this.getSession().createSQLQuery("SELECT DISTINCT p.project_id" - + " FROM project p " - + " INNER JOIN nd_experiment nde ON nde.project_id = p.project_id" - + " INNER JOIN project study ON p.study_id = study.project_id AND study.deleted != " + DELETED_STUDY - + " WHERE nde.nd_geolocation_id = :environmentId" - + " AND p.dataset_type_id = :datasetTypeId"); + final Query query = this.getSession().createSQLQuery("SELECT p.project_id FROM project p " + + " INNER JOIN project env_ds ON env_ds.study_id = p.study_id AND env_ds.dataset_type_id = " + + DatasetTypeEnum.SUMMARY_DATA.getId() + + " INNER JOIN nd_experiment nde ON nde.project_id = env_ds.project_id AND nde.type_id = " + + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + + " WHERE nde.nd_experiment_id = :environmentId AND p.dataset_type_id = :datasetTypeId "); query.setParameter("environmentId", environmentId); query.setParameter("datasetTypeId", datasetType.getId()); return (Integer) query.uniqueResult(); @@ -1633,4 +1580,24 @@ public Integer getDatasetIdByEnvironmentIdAndDatasetType(final Integer environme throw new MiddlewareQueryException(e.getMessage(), e); } } + + public boolean isValidDatasetId(final Integer datasetId) { + final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); + criteria.add(Restrictions.eq("projectId", datasetId)); + criteria.add(Restrictions.isNotNull("datasetType")); + criteria.setProjection(Projections.rowCount()); + final Long count = (Long) criteria.uniqueResult(); + return count > 0; + } + + public boolean allDatasetIdsBelongToStudy(final Integer studyId, final List datasetIds){ + + final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); + criteria.add(Restrictions.in("projectId", datasetIds)); + criteria.add(Restrictions.eq("study.projectId", studyId)); + criteria.setProjection(Projections.rowCount()); + final Long count = (Long) criteria.uniqueResult(); + return count.intValue() == datasetIds.size(); + } + } diff --git a/src/main/java/org/generationcp/middleware/dao/dms/ExperimentDao.java b/src/main/java/org/generationcp/middleware/dao/dms/ExperimentDao.java index 1f48a77613..c98703308b 100644 --- a/src/main/java/org/generationcp/middleware/dao/dms/ExperimentDao.java +++ b/src/main/java/org/generationcp/middleware/dao/dms/ExperimentDao.java @@ -14,9 +14,7 @@ import com.google.common.base.Function; import com.google.common.collect.Lists; import org.apache.commons.lang3.StringUtils; -import org.fest.util.Preconditions; import org.generationcp.middleware.dao.GenericDAO; -import org.generationcp.middleware.domain.dms.ExperimentType; import org.generationcp.middleware.domain.etl.MeasurementVariable; import org.generationcp.middleware.domain.oms.TermId; import org.generationcp.middleware.domain.ontology.VariableType; @@ -26,7 +24,6 @@ import org.generationcp.middleware.exceptions.MiddlewareQueryException; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.dms.Phenotype; import org.generationcp.middleware.service.api.dataset.ObservationUnitData; import org.generationcp.middleware.service.api.dataset.ObservationUnitRow; @@ -47,6 +44,7 @@ import java.math.BigInteger; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -55,14 +53,19 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; /** * DAO class for {@link ExperimentModel}. */ public class ExperimentDao extends GenericDAO { + private static final List EXPERIMENTPROP_VAR_TYPES = Arrays + .asList(VariableType.TREATMENT_FACTOR.getId(), VariableType.EXPERIMENTAL_DESIGN.getId(), VariableType.ENVIRONMENT_DETAIL.getId()); + private static final String ND_EXPERIMENT_ID = "ndExperimentId"; private static final String OBS_UNIT_ID = "OBS_UNIT_ID"; static final String SQL_GET_SAMPLED_OBSERVATION_BY_STUDY = " SELECT " + @@ -80,17 +83,13 @@ public class ExperimentDao extends GenericDAO { + "FROM nd_experiment e INNER JOIN projectprop pp ON pp.project_id = e.project_id " + "AND pp.value = :variableId"; - private static final String COUNT_EXPERIMENT_BY_VARIABLE_IN_GEOLOCATION = "SELECT count(e.nd_experiment_id) " - + "FROM nd_experiment e INNER JOIN nd_geolocation g ON g.nd_geolocation_id = e.nd_geolocation_id " - + "WHERE (" + TermId.TRIAL_INSTANCE_FACTOR.getId() + " = :variableId AND g.description IS NOT NULL) OR (" + TermId.LATITUDE.getId() - + " = :variableId AND g.latitude IS NOT NULL) " - + "OR (" + TermId.LONGITUDE.getId() + "= :variableId AND g.longitude IS NOT NULL) OR (" + TermId.GEODETIC_DATUM.getId() - + " = :variableId AND g.geodetic_datum IS NOT NULL) " - + "OR (" + TermId.ALTITUDE.getId() + " = :variableId AND g.altitude IS NOT NULL) "; - - private static final String COUNT_EXPERIMENT_BY_VARIABLE_IN_GEOLOCATIONPROP = "SELECT count(e.nd_experiment_id) " - + "FROM nd_experiment e INNER JOIN nd_geolocationprop gp ON gp.nd_geolocation_id = e.nd_geolocation_id " - + "WHERE gp.type_id = :variableId AND gp.value IS NOT NULL"; + private static final String COUNT_EXPERIMENT_BY_VARIABLE_IN_EXPERIMENT = + "SELECT count(e.nd_experiment_id) " + + "FROM nd_experiment e " + + "LEFT JOIN projectprop pp pp.project_id = e.project_ID and pp.type_id = " + VariableType.OBSERVATION_UNIT.getId() + + "WHERE ( (e.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + " AND " + TermId.TRIAL_INSTANCE_FACTOR.getId() + + " = :variableId) OR (e.type_id = 1155 AND pp.variable_id = :variableId))" + + "AND e.observation_unit_no IS NOT NULL) "; private static final String COUNT_EXPERIMENT_BY_VARIABLE_IN_EXPERIMENTPROP = "SELECT count(e.nd_experiment_id) " + "FROM nd_experiment e INNER JOIN nd_experimentprop ep ON ep.nd_experiment_id = e.nd_experiment_id " @@ -111,64 +110,6 @@ public class ExperimentDao extends GenericDAO { + "FROM nd_experiment e INNER JOIN phenotype p ON p.nd_experiment_id = e.nd_experiment_id " + "AND p.observable_id = :variableId AND (p.value IS NOT NULL OR p.cvalue_id IS NOT NULL)"; - @SuppressWarnings("unchecked") - public List getExperimentIdsByGeolocationIds(final Collection geolocationIds) { - try { - if (geolocationIds != null && !geolocationIds.isEmpty()) { - final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); - criteria.add(Restrictions.in("geoLocation.locationId", geolocationIds)); - criteria.setProjection(Projections.property(ND_EXPERIMENT_ID)); - - return criteria.list(); - } - } catch (final HibernateException e) { - final String message = - "Error at getExperimentIdsByGeolocationIds=" + geolocationIds + " query at ExperimentDao: " + e.getMessage(); - ExperimentDao.LOG.error(message, e); - throw new MiddlewareQueryException(message, e); - } - return new ArrayList<>(); - } - - public ExperimentModel getExperimentByProjectIdAndLocation(final Integer projectId, final Integer locationId) { - try { - final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); - criteria.add(Restrictions.eq("project.projectId", projectId)); - criteria.add(Restrictions.eq("geoLocation.locationId", locationId)); - final List list = criteria.list(); - if (list != null && !list.isEmpty()) { - return list.get(0); - } - } catch (final HibernateException e) { - final String message = "Error at getExperimentByProjectIdAndLocation=" + projectId + "," + locationId - + " query at ExperimentDao: " + e.getMessage(); - ExperimentDao.LOG.error(message, e); - throw new MiddlewareQueryException(message, e); - } - return null; - } - - public ExperimentModel getExperimentByProjectIdAndGeoLocationAndType(final Integer projectId, final Integer geolocationId, final Integer typeId) { - final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); - criteria.add(Restrictions.eq("project.projectId", projectId)); - criteria.add(Restrictions.eq("geoLocation.locationId", geolocationId)); - criteria.add(Restrictions.eq("typeId", typeId)); - return (ExperimentModel) criteria.uniqueResult(); - } - - @SuppressWarnings("unchecked") - public List getExperimentsByProjectIds(final List projectIds) { - try { - final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); - criteria.add(Restrictions.in("project.projectId", projectIds)); - return criteria.list(); - - } catch (final HibernateException e) { - final String message = "Error at getExperimentsByProjectIds query at ExperimentDao: " + e.getMessage(); - ExperimentDao.LOG.error(message, e); - throw new MiddlewareQueryException(message, e); - } - } public boolean hasFieldmap(final int datasetId) { try { @@ -189,41 +130,43 @@ public boolean hasFieldmap(final int datasetId) { } @SuppressWarnings("unchecked") - // Should be renamed to getInstanceIds - public List getLocationIdsOfStudy(final int studyId) { + public List getInstanceIds(final int studyId) { try { final String sql = - "SELECT DISTINCT e.nd_geolocation_id " + " FROM nd_experiment e " + "SELECT DISTINCT e.nd_experiment_id " + + " FROM nd_experiment e " + " INNER JOIN project p ON p.project_id = e.project_id " - + " WHERE p.study_id = :studyId "; + + " WHERE e.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + " and p.study_id = :studyId "; final SQLQuery query = this.getSession().createSQLQuery(sql); query.setParameter("studyId", studyId); return query.list(); } catch (final HibernateException e) { - final String message = "Error at getLocationIdsOfStudy=" + studyId + " query at ExperimentDao: " + e.getMessage(); + final String message = "Error at getInstanceIds=" + studyId + " query at ExperimentDao: " + e.getMessage(); ExperimentDao.LOG.error(message, e); throw new MiddlewareQueryException(message, e); } } - @SuppressWarnings("unchecked") - public List getLocationIdsOfStudyWithFieldmap(final int studyId) { + public Map getInstanceNumberEnvironmentIdsMap(final int trialDatasetId) { try { - final String sql = - "SELECT DISTINCT e.nd_geolocation_id " + " FROM nd_experiment e " - + " INNER JOIN project p ON p.project_id = e.project_id " - + " WHERE p.study_id = :studyId " - + " AND EXISTS (SELECT 1 FROM nd_experimentprop eprop " + " WHERE eprop.type_id = " - + TermId.COLUMN_NO.getId() + " AND eprop.nd_experiment_id = e.nd_experiment_id AND eprop.value <> '') "; + final String sql = "SELECT DISTINCT nd_experiment_id as environmentId, observation_unit_no as instanceNumber " + + " FROM nd_experiment WHERE type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + + " AND project_id = :trialDatasetId"; final SQLQuery query = this.getSession().createSQLQuery(sql); - query.setParameter("studyId", studyId); - return query.list(); - + query.setParameter("trialDatasetId", trialDatasetId); + query.addScalar("environmentId"); + query.addScalar("instanceNumber"); + final List list = query.list(); + final Map instanceNumberEnvironmentIdsMap = new HashMap<>(); + for (final Object[] row : list) { + instanceNumberEnvironmentIdsMap.put((Integer) row[1], (Integer) row[0]); + } + return instanceNumberEnvironmentIdsMap; } catch (final HibernateException e) { - final String message = "Error at getLocationIdsOfStudyWithFieldmap=" + studyId + " query at ExperimentDao: " + e.getMessage(); + final String message = "Error at getinstanceNumberEnvironmentIdsMap=" + trialDatasetId + " query at ExperimentDao: " + e.getMessage(); ExperimentDao.LOG.error(message, e); throw new MiddlewareQueryException(message, e); } @@ -260,28 +203,27 @@ public void deleteExperimentsByIds(final List experimentIdList) { } public void deleteExperimentsForDataset(final int datasetId) { - this.deleteExperimentsForDatasetInstances(datasetId, Collections.emptyList()); + this.deleteExperimentsForDatasetInstances(datasetId, Collections.emptyList()); } public void deleteExperimentsForDatasets(final List datasetIds, final List instanceNumbers) { - - - // Please note we are manually flushing because non hibernate based deletes and updates causes the Hibernate session to get out of synch with - // underlying database. Thus flushing to force Hibernate to synchronize with the underlying database before the delete - // statement - this.getSession().flush(); - - // Delete phenotypes first because the foreign key with nd_experiment - String queryString = "DELETE pheno FROM nd_experiment e" - + " INNER JOIN nd_geolocation g on g.nd_geolocation_id = e.nd_geolocation_id" - + " LEFT JOIN phenotype pheno ON pheno.nd_experiment_id = e.nd_experiment_id" + // Delete any phenotypes first because its FK to experiment is not DELETE CASCADE + String queryString = "DELETE pheno " + " FROM phenotype pheno" + + " INNER JOIN nd_experiment e ON pheno.nd_experiment_id = e.nd_experiment_id" + + " LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = e.parent_id " + + " INNER JOIN project pr ON pr.project_id = e.project_id " + + " INNER JOIN project env_ds ON env_ds.study_id = pr.study_id AND env_ds.dataset_type_id = " + DatasetTypeEnum.SUMMARY_DATA.getId() + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = " + + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + // handle cases for with/without plot and with/without sub-observations + + " AND (e.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id or e.nd_experiment_id = env.nd_experiment_id)" + " WHERE e.project_id IN (:datasetIds) "; StringBuilder sb = new StringBuilder(queryString); if (!CollectionUtils.isEmpty(instanceNumbers)) { - sb.append(" AND g.description IN (:instanceNumbers)"); + sb.append(" AND env.observation_unit_no IN (:instanceNumbers)"); } - Query statement = + SQLQuery statement = this.getSession() .createSQLQuery(sb.toString()); statement.setParameterList("datasetIds", datasetIds); @@ -290,15 +232,20 @@ public void deleteExperimentsForDatasets(final List datasetIds, final L } statement.executeUpdate(); - - // Delete experiments - queryString = "DELETE e, eprop " + "FROM nd_experiment e " - + " INNER JOIN nd_geolocation g on g.nd_geolocation_id = e.nd_geolocation_id" + // Delete experiments and experiment properties + queryString = "DELETE eprop, e " + " FROM nd_experiment e " + + " LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = e.parent_id " + + " INNER JOIN project pr ON pr.project_id = e.project_id " + + " INNER JOIN project env_ds ON env_ds.study_id = pr.study_id AND env_ds.dataset_type_id = " + DatasetTypeEnum.SUMMARY_DATA.getId() + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = " + + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + // handle cases for with/without plot and with/without sub-observations + + " AND (e.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id or e.nd_experiment_id = env.nd_experiment_id)" + " LEFT JOIN nd_experimentprop eprop ON eprop.nd_experiment_id = e.nd_experiment_id " + " WHERE e.project_id IN (:datasetIds) "; sb = new StringBuilder(queryString); if (!CollectionUtils.isEmpty(instanceNumbers)) { - sb.append(" AND g.description IN (:instanceNumbers)"); + sb.append(" AND env.observation_unit_no IN (:instanceNumbers)"); } statement = this.getSession() @@ -314,71 +261,6 @@ public void deleteExperimentsForDatasetInstances(final int datasetId, final List this.deleteExperimentsForDatasets(Collections.singletonList(datasetId), instanceNumbers); } - public void deleteTrialExperimentsOfStudy(final int datasetId) { - - try { - - // Please note we are manually flushing because non hibernate based deletes and updates causes the Hibernate session to get out of synch with - // underlying database. Thus flushing to force Hibernate to synchronize with the underlying database before the delete - // statement - this.getSession().flush(); - - // Delete phenotypes first because the foreign key with nd_experiment - Query statement = - this.getSession() - .createSQLQuery("DELETE pheno FROM nd_experiment e" - + " LEFT JOIN phenotype pheno ON pheno.nd_experiment_id = e.nd_experiment_id" - + " WHERE e.project_id = :datasetId "); - statement.setParameter("datasetId", datasetId); - statement.executeUpdate(); - - // Delete experiments - statement = - this.getSession() - .createSQLQuery( - "DELETE g, gp, e, eprop " + "FROM nd_geolocation g " - + "LEFT JOIN nd_geolocationprop gp on g.nd_geolocation_id = gp.nd_geolocation_id " - + "LEFT join nd_experiment e on g.nd_geolocation_id = e.nd_geolocation_id " - + "LEFT JOIN nd_experimentprop eprop ON eprop.nd_experiment_id = e.nd_experiment_id " - + "WHERE e.project_id = :datasetId "); - statement.setParameter("datasetId", datasetId); - - statement.executeUpdate(); - } catch (final HibernateException e) { - final String message = "Error at deleteTrialExperimentsOfStudy=" + datasetId + " query at ExperimentDao: " + e.getMessage(); - ExperimentDao.LOG.error(message, e); - throw new MiddlewareQueryException(message, e); - } - } - - public boolean checkIfAnyLocationIDsExistInExperiments(final int dataSetId, final List locationIds) { - - try { - final String sql = - "SELECT count(*) FROM nd_experiment exp " - + "WHERE exp.nd_geolocation_id in (:locationIds) " + "AND exp.project_id = :dataSetId "; - - final SQLQuery query = this.getSession().createSQLQuery(sql); - query.setParameterList("locationIds", locationIds); - query.setParameter("dataSetId", dataSetId); - - long count = 0L; - final Object obj = query.uniqueResult(); - if (obj != null) { - count = ((Number) obj).longValue(); - } - - return count != 0; - - } catch (final HibernateException e) { - final String message = "Error at checkIfLocationIDsExistInExperiments=" + locationIds + "," + dataSetId + "," - + " query at ExperimentDao: " + e.getMessage(); - ExperimentDao.LOG.error(message, e); - throw new MiddlewareQueryException(message, e); - } - - } - public Map> getExperimentSamplesDTOMap(final Integer studyId) { final Map> map = new HashMap<>(); try { @@ -428,39 +310,40 @@ public List getExperiments(final int projectId, final int typeI } @SuppressWarnings("unchecked") - public List getExperiments(final int projectId, final List types, final int start, final int numOfRows, + public List getExperiments(final int datasetId, final List types, final int start, final int numOfRows, final boolean firstInstance) { try { - final List lists = new ArrayList<>(); - for (final TermId termId : types) { - lists.add(termId.getId()); - } + final List typeIds = types.stream().map(t -> t.getId()).collect(Collectors.toList()); final StringBuilder queryString = new StringBuilder(); - queryString.append("select distinct exp from ExperimentModel as exp "); - queryString.append("left outer join exp.properties as plot with plot.typeId IN (8200,8380) "); - queryString.append("left outer join exp.properties as rep with rep.typeId = 8210 "); - queryString.append("left outer join exp.stock as st "); - queryString.append("where exp.project.projectId =:p_id and exp.typeId in (:type_ids) "); + queryString.append("select distinct exp.* from nd_experiment exp "); + queryString.append("inner join project pr on exp.project_id = pr.project_id "); + queryString.append("inner join project env_ds on env_ds.study_id = pr.study_id and env_ds.dataset_type_id = "); + queryString.append(DatasetTypeEnum.SUMMARY_DATA.getId()).append(" "); + queryString.append("inner join nd_experiment env ON env_ds.project_id = env.project_id and env.type_id = "); + queryString.append(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()).append(" "); + queryString.append("left join nd_experiment plot ON plot.nd_experiment_id = exp.parent_id and plot.type_id = "); + queryString.append(TermId.PLOT_EXPERIMENT.getId()).append(" "); + queryString.append("where exp.project_id =:p_id and exp.type_id in (:type_ids) "); + // handle trial environment, plot, means, and sub-observation dataset types + queryString.append(" and (exp.parent_id = env.nd_experiment_id or env.nd_experiment_id = exp.nd_experiment_id or plot.parent_id = env.nd_experiment_id) "); if (firstInstance) { - queryString.append("and exp.geoLocation.description = 1 "); + queryString.append("and env.observation_unit_no = 1 "); } - queryString.append("order by (exp.geoLocation.description * 1) ASC, "); - queryString.append("(plot.value * 1) ASC, "); - queryString.append("(rep.value * 1) ASC, "); - queryString.append("(st.uniqueName * 1) ASC, "); - queryString.append("exp.ndExperimentId ASC"); - - final Query q = this.getSession().createQuery(queryString.toString()); - q.setParameter("p_id", projectId); - q.setParameterList("type_ids", lists); + queryString.append("order by (env.observation_unit_no * 1) ASC, "); + queryString.append("exp.nd_experiment_id ASC"); + + final SQLQuery q = this.getSession().createSQLQuery(queryString.toString()); + q.addEntity(ExperimentModel.class); + q.setParameter("p_id", datasetId); + q.setParameterList("type_ids", typeIds); q.setMaxResults(numOfRows); q.setFirstResult(start); return q.list(); } catch (final HibernateException e) { - final String message = "Error at getExperiments=" + projectId + ", " + types; + final String message = "Error at getExperiments=" + datasetId + ", " + types; ExperimentDao.LOG.error(message, e); throw new MiddlewareQueryException(message, e); } @@ -477,29 +360,6 @@ public long count(final int dataSetId) { } } - public int getExperimentIdByLocationIdStockId(final int projectId, final Integer locationId, final Integer stockId) { - try { - final String sql = - "SELECT exp.nd_experiment_id " + "FROM nd_experiment exp " - + " WHERE exp.project_id = " + projectId - + " AND exp.nd_geolocation_id = " + locationId + " AND exp.type_id = 1170 " + " AND exp.stock_id = " - + stockId; - - final SQLQuery statement = this.getSession().createSQLQuery(sql); - final Integer returnVal = (Integer) statement.uniqueResult(); - - if (returnVal == null) { - return 0; - } else { - return returnVal; - } - - } catch (final HibernateException e) { - final String message = "Error in getExperimentIdByLocationIdStockId=" + projectId; - ExperimentDao.LOG.error(message, e); - throw new MiddlewareQueryException(message, e); - } - } @SuppressWarnings("unchecked") public Integer getExperimentIdByProjectId(final int projectId) { @@ -523,7 +383,7 @@ public Integer getExperimentIdByProjectId(final int projectId) { } @SuppressWarnings("unchecked") - public List getExperimentIdsByStockIds(final Collection stockIds) { + List getExperimentIdsByStockIds(final Collection stockIds) { try { if (stockIds != null && !stockIds.isEmpty()) { final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); @@ -541,18 +401,16 @@ public List getExperimentIdsByStockIds(final Collection stockI } @SuppressWarnings("unchecked") - public Map> getEnvironmentsOfGermplasms(final Set gids, final String programUUID) { + public Map> getStudyInstancesForGermplasm(final Set gids, final String programUUID) { final Map> germplasmEnvironments = new HashMap<>(); if (gids.isEmpty()) { return germplasmEnvironments; } - for (final Integer gid : gids) { - germplasmEnvironments.put(gid, new HashSet()); - } - - final String sql = "SELECT DISTINCT s.dbxref_id, e.nd_geolocation_id " + "FROM nd_experiment e " + // Plot experiment's parent is Environment Experiment + final String sql = "SELECT DISTINCT s.dbxref_id, e.parent_id " + + "FROM nd_experiment e " + " INNER JOIN stock s ON e.stock_id = s.stock_id AND s.dbxref_id IN (:gids) "; final StringBuilder sb = new StringBuilder(); sb.append(sql); @@ -569,17 +427,14 @@ public Map> getEnvironmentsOfGermplasms(final Set final List result = query.list(); for (final Object[] row : result) { - final Integer gId = (Integer) row[0]; + final Integer gid = (Integer) row[0]; final Integer environmentId = (Integer) row[1]; - - final Set gidEnvironments = germplasmEnvironments.get(gId); - gidEnvironments.add(environmentId); - germplasmEnvironments.remove(gId); - germplasmEnvironments.put(gId, gidEnvironments); + germplasmEnvironments.putIfAbsent(gid, new HashSet<>()); + germplasmEnvironments.get(gid).add(environmentId); } } catch (final HibernateException e) { - final String error = "Error at getEnvironmentsOfGermplasms(programUUID=" + programUUID + " ,gids=" + gids + final String error = "Error at getEnvironmentsOfGermplasm(programUUID=" + programUUID + " ,gids=" + gids + ") query on ExperimentDao: " + e.getMessage(); ExperimentDao.LOG.error(error); throw new MiddlewareQueryException(error, e); @@ -620,8 +475,13 @@ public boolean isValidExperiment(final Integer projectId, final Integer experime public boolean areAllInstancesExistInDataset(final int datasetId, final Set instanceIds) { final StringBuilder sql = new StringBuilder(); - sql.append("SELECT COUNT(DISTINCT e.nd_geolocation_id) FROM nd_experiment e ") - .append(" WHERE e.project_id = :datasetId and e.nd_geolocation_id in (:instanceIds)"); + sql.append("SELECT COUNT(DISTINCT env.nd_experiment_id) FROM nd_experiment e ") + .append(" INNER JOIN project pr ON pr.project_id = e.project_id ") + .append(" INNER JOIN project env_ds ON env_ds.study_id = pr.study_id AND env_ds.dataset_type_id = ") + .append(DatasetTypeEnum.SUMMARY_DATA.getId()).append(" ") + .append(" INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = ") + .append(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()).append(" ") + .append(" WHERE e.project_id = :datasetId and env.nd_experiment_id in (:instanceIds)"); try { @@ -658,7 +518,7 @@ public List getObservationUnits(final Integer projectId, final try { final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); criteria.add(Restrictions.eq("project.projectId", projectId)); - criteria.add(Restrictions.in("geoLocation.locationId", instanceIds)); + criteria.add(Restrictions.in("parent.ndExperimentId", instanceIds)); return criteria.list(); } catch (final HibernateException e) { final String message = @@ -822,7 +682,7 @@ public ExperimentModel getByObsUnitId(final String obsUnitId) { } } - public long countByObservedVariable(final int variableId, final int variableTypeId) throws MiddlewareQueryException { + public long countByObservedVariable(final int variableId, final int variableTypeId) { try { String sql = null; if (VariableType.STUDY_DETAIL.getId() == variableTypeId) { @@ -830,11 +690,8 @@ public long countByObservedVariable(final int variableId, final int variableType } else if (TermId.TRIAL_INSTANCE_FACTOR.getId() == variableId || TermId.LATITUDE.getId() == variableId || TermId.LONGITUDE.getId() == variableId || TermId.GEODETIC_DATUM.getId() == variableId || TermId.ALTITUDE.getId() == variableId) { - sql = ExperimentDao.COUNT_EXPERIMENT_BY_VARIABLE_IN_GEOLOCATION; - } else if (VariableType.ENVIRONMENT_DETAIL.getId() == variableTypeId) { - sql = ExperimentDao.COUNT_EXPERIMENT_BY_VARIABLE_IN_GEOLOCATIONPROP; - } else if (VariableType.EXPERIMENTAL_DESIGN.getId() == variableTypeId - || VariableType.TREATMENT_FACTOR.getId() == variableTypeId) { + sql = ExperimentDao.COUNT_EXPERIMENT_BY_VARIABLE_IN_EXPERIMENT; + } else if (EXPERIMENTPROP_VAR_TYPES.contains(variableTypeId)) { sql = ExperimentDao.COUNT_EXPERIMENT_BY_VARIABLE_IN_EXPERIMENTPROP; } else if (TermId.ENTRY_NO.getId() == variableId || TermId.GID.getId() == variableId || TermId.DESIG.getId() == variableId || TermId.ENTRY_CODE.getId() == variableId) { @@ -892,18 +749,18 @@ public Map countObservationsPerInstance(final Integer datasetId) { try { final ProjectionList projectionList = Projections.projectionList(); - projectionList.add(Projections.groupProperty("g.description")) + projectionList.add(Projections.groupProperty("parent.observationUnitNo")) .add(Projections.rowCount()); final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); - criteria.createAlias("geoLocation", "g"); + criteria.createAlias("parent", "parent"); criteria.setProjection(projectionList); criteria.add(Restrictions.eq("project.projectId", datasetId)); final List rows = criteria.list(); final Map results = new LinkedHashMap<>(); for (final Object[] row : rows) { - results.put((String) row[0], (Long) row[1]); + results.put(String.valueOf(row[0]), (Long) row[1]); } return results; @@ -960,10 +817,10 @@ public Map>> getValuesFromObservations(final i final String variableId = (String) row.get("variableId"); final Object value = row.get("value"); if (!map.containsKey(experimentId)) { - map.put(experimentId, new HashMap>()); + map.put(experimentId, new HashMap<>()); } if (!map.get(experimentId).containsKey(variableId)) { - map.get(experimentId).put(variableId, new ArrayList()); + map.get(experimentId).put(variableId, new ArrayList<>()); } // Group values per variable and experimentId. map.get(experimentId).get(variableId).add(value); @@ -972,31 +829,35 @@ public Map>> getValuesFromObservations(final i return map; } - // Update study experiment if the Geolocation ID to be the one is the one used by the study experiment - public void updateStudyExperimentGeolocationIfNecessary(final Integer studyId, final Integer geolocationId) { - final ExperimentModel studyExperiment = this.getExperimentByProjectIdAndGeoLocationAndType(studyId, geolocationId, - ExperimentType.STUDY_INFORMATION.getTermId()); - - if (studyExperiment != null) { - // Query the next available Geolocation ID from environments that will remain - final String queryString = "select min(if (e.nd_geolocation_id != :geolocationId, nd_geolocation_id, null))\n" - + "from nd_experiment e " - + "inner join project p on e.project_id = p.project_id " - + "WHERE p.study_id = :studyId or p.project_id = :studyId"; - final StringBuilder sb = new StringBuilder(queryString); - final SQLQuery statement = this.getSession().createSQLQuery(sb.toString()); - statement.setParameter("studyId", studyId); - statement.setParameter("geolocationId", geolocationId); - final BigInteger nextGeolocationId = (BigInteger) statement.uniqueResult(); - - if (nextGeolocationId != null) { - studyExperiment.setGeoLocation(new Geolocation(nextGeolocationId.intValue())); - this.update(studyExperiment); - } else { - throw new MiddlewareQueryException("Cannot update GeolocationID=" + geolocationId + " for Study=" + studyId - + " as no other environments will remain for the study."); - } + public Optional getExperimentIdByEnvironmentIdStockId(final int datasetId, final Integer environmentId, final Integer stockId) { + final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); + criteria.add(Restrictions.eq("project.projectId", datasetId)); + criteria.add(Restrictions.eq("stock.stockId", stockId)); + criteria.add(Restrictions.eq("parent.ndExperimentId", environmentId)); + criteria.setProjection(Projections.distinct(Projections.property("ndExperimentId"))); + final List list = criteria.list(); + if (list != null && !list.isEmpty()) { + return Optional.of(list.get(0)); + } else { + return Optional.empty(); + } + } + + public Long countExperimentsByDatasetAndEnvironmentIds(final Integer datasetId, final List environmentIds) { + try { + final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); + criteria.add(Restrictions.eq("project.projectId", datasetId)); + criteria.add(Restrictions.in("parent.ndExperimentId", environmentIds)); + criteria.setProjection(Projections.rowCount()); + return (Long) criteria.uniqueResult(); + + } catch (final HibernateException e) { + final String message = + "Error at countExperimentsByDatasetAndEnvironmentIds for dataset=" + datasetId + ", environmentIds=" + environmentIds + + " query at ExperimentDao: " + e.getMessage(); + ExperimentDao.LOG.error(message, e); + throw new MiddlewareQueryException(message, e); } } diff --git a/src/main/java/org/generationcp/middleware/dao/dms/ExperimentPropertyDao.java b/src/main/java/org/generationcp/middleware/dao/dms/ExperimentPropertyDao.java index 8d33c4b341..a91999ec3d 100644 --- a/src/main/java/org/generationcp/middleware/dao/dms/ExperimentPropertyDao.java +++ b/src/main/java/org/generationcp/middleware/dao/dms/ExperimentPropertyDao.java @@ -1,17 +1,16 @@ /******************************************************************************* * Copyright (c) 2012, All Rights Reserved. - * + * * Generation Challenge Programme (GCP) - * - * + * + * * This software is licensed for use under the terms of the GNU General Public License (http://bit.ly/8Ztv8M) and the provisions of Part F * of the Generation Challenge Programme Amended Consortium Agreement (http://bit.ly/KQX1nL) - * + * *******************************************************************************/ package org.generationcp.middleware.dao.dms; -import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -36,15 +35,16 @@ import org.hibernate.SQLQuery; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; +import org.hibernate.type.StringType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * DAO class for {@link ExperimentProperty}. - * + * */ public class ExperimentPropertyDao extends GenericDAO { - + private static final Logger LOG = LoggerFactory.getLogger(ExperimentPropertyDao.class); @@ -78,7 +78,7 @@ public List getFieldMapLabels(final int projectId) { .append(" SELECT ") .append(" nde.project_id AS datasetId ") .append(" , proj.name AS datasetName ") - .append(" , geo.nd_geolocation_id AS geolocationId ") + .append(" , env.nd_experiment_id AS environmentId ") .append(" , site.value AS siteName ") .append(" , nde.nd_experiment_id AS experimentId ") .append(" , s.uniqueName AS entryNumber ") @@ -88,17 +88,15 @@ public List getFieldMapLabels(final int projectId) { .append(" , row.value AS row ") .append(" , col.value AS col ") .append(" , blk.value AS block_id ") - .append(" , inst.description AS trialInstance ") - //Casting inst.description to signed for natural sort - .append(" , CAST(inst.description as SIGNED) AS casted_trialInstance") + .append(" , env.observation_unit_no AS trialInstance ") .append(" , st.name AS studyName ") .append(" , s.dbxref_id AS gid ") .append(" , st.start_date as startDate ") - .append(" , gpSeason.value as season ") + .append(" , season.value as season ") .append(" , siteId.value AS siteId") .append(" , epropBlock.value AS blockNo ") .append(" , ldp.group_name AS pedigree ") - .append (" , geo.obs_unit_id as obsUnitId ") + .append (" , nde.obs_unit_id as obsUnitId ") .append(" FROM ") .append(" nd_experiment nde ") .append(" INNER JOIN project proj on proj.project_id = nde.project_id ") @@ -116,30 +114,29 @@ public List getFieldMapLabels(final int projectId) { .append(" AND epropPlot.type_id IN (" + TermId.PLOT_NO.getId() + ", " + TermId.PLOT_NNO.getId() + ") ") // 8200, 8380 .append(" AND epropPlot.value IS NOT NULL AND epropPlot.value <> '' ") - .append(" INNER JOIN nd_experiment geo ON nde.nd_experiment_id = geo.nd_experiment_id ") - .append(" AND geo.type_id = ").append(TermId.PLOT_EXPERIMENT.getId()) - .append(" INNER JOIN nd_geolocation inst ON geo.nd_geolocation_id = inst.nd_geolocation_id ") - .append(" LEFT JOIN nd_geolocationprop site ON geo.nd_geolocation_id = site.nd_geolocation_id ") + .append(" INNER JOIN nd_experiment env ON nde.parent_id = env.nd_experiment_id ") + .append(" AND env.type_id = ").append(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()) + .append(" LEFT JOIN nd_experimentprop site ON env.nd_experiment_id = site.nd_experiment_id ") .append(" AND site.type_id = ").append(TermId.TRIAL_LOCATION.getId()) - .append(" LEFT JOIN nd_geolocationprop siteId ON siteId.nd_geolocation_id = geo.nd_geolocation_id ") + .append(" LEFT JOIN nd_experimentprop siteId ON env.nd_experiment_id = siteId.nd_experiment_id ") .append(" AND siteId.type_id = ").append(TermId.LOCATION_ID.getId()) - .append(" LEFT JOIN nd_geolocationprop blk ON blk.nd_geolocation_id = geo.nd_geolocation_id ") + .append(" LEFT JOIN nd_experimentprop blk ON env.nd_experiment_id = blk.nd_experiment_id") .append(" AND blk.type_id = ").append(TermId.BLOCK_ID.getId()) .append(" LEFT JOIN nd_experimentprop row ON row.nd_experiment_id = nde.nd_experiment_id ") .append(" AND row.type_id = ").append(TermId.RANGE_NO.getId()) .append(" LEFT JOIN nd_experimentprop col ON col.nd_experiment_id = nde.nd_experiment_id ") .append(" AND col.type_id = ").append(TermId.COLUMN_NO.getId()) - .append(" LEFT JOIN nd_geolocationprop gpSeason ON geo.nd_geolocation_id = gpSeason.nd_geolocation_id ") - .append(" AND gpSeason.type_id = ").append(TermId.SEASON_VAR.getId()).append(" ") // -- 8371 (2452) + .append(" LEFT JOIN nd_experimentprop season ON env.nd_experiment_id = season.nd_experiment_id ") + .append(" AND season.type_id = ").append(TermId.SEASON_VAR.getId()).append(" ") // -- 8371 (2452) .append(" LEFT JOIN listnms lnms ON lnms.projectid = st.project_id AND lnms.listtype in ('STUDY')") .append(" LEFT JOIN listdata_project ldp on ldp.list_id = lnms.listid AND ldp.entry_id = s.uniqueName AND ldp.germplasm_id = s.dbxref_id") .append(" WHERE st.project_id = :studyId") - .append(" ORDER BY casted_trialInstance, inst.description, nde.nd_experiment_id ").append(order); + .append(" ORDER BY env.observation_unit_no, nde.nd_experiment_id ").append(order); final SQLQuery query = this.getSession().createSQLQuery(sql.toString()); query.addScalar("datasetId").addScalar("datasetName") - .addScalar("geolocationId").addScalar("siteName").addScalar("experimentId").addScalar("entryNumber") + .addScalar("environmentId").addScalar("siteName").addScalar("experimentId").addScalar("entryNumber") .addScalar("germplasmName").addScalar("rep").addScalar("plotNo").addScalar("row").addScalar("col") .addScalar("block_id").addScalar("trialInstance").addScalar("studyName").addScalar("gid") .addScalar("startDate").addScalar("season").addScalar("siteId").addScalar("blockNo").addScalar("pedigree").addScalar("obsUnitId", Hibernate.STRING); @@ -159,27 +156,25 @@ public List getFieldMapLabels(final int projectId) { } @SuppressWarnings("unchecked") - public List getAllFieldMapsInBlockByTrialInstanceId(final int datasetId, final int geolocationId, final Integer blockId) + public List getAllFieldMapsInBlockByTrialInstanceId(final int datasetId, final int instanceId, final Integer blockId) { List fieldmaps = new ArrayList<>(); try { - final String order = geolocationId > 0 ? "ASC" : "DESC"; + final String order = instanceId > 0 ? "ASC" : "DESC"; final StringBuilder sql = new StringBuilder().append(" SELECT ").append(" p.project_id AS datasetId ").append(" , p.name AS datasetName ") - .append(" , st.name AS studyName ").append(" , e.nd_geolocation_id AS geolocationId ") + .append(" , st.name AS studyName ").append(" , env.nd_experiment_id AS instanceId ") .append(" , site.value AS siteName ").append(" , siteId.value AS siteId") .append(" , e.nd_experiment_id AS experimentId ").append(" , s.uniqueName AS entryNumber ") .append(" , s.name AS germplasmName ").append(" , epropRep.value AS rep ") .append(" , epropPlot.value AS plotNo ").append(" , row.value AS row ").append(" , col.value AS col ") .append(" , blk.value AS blockId ").append(" , st.project_id AS studyId ") - .append(" , geo.description AS trialInstance ").append(" , s.dbxref_id AS gid ") - .append(" , st.start_date as startDate ").append(" , gpSeason.value as season ") + .append(" , env.observation_unit_no AS trialInstance ").append(" , s.dbxref_id AS gid ") + .append(" , st.start_date as startDate ").append(" , season.value as season ") .append(" , epropBlock.value AS blockNo ") .append(" , e.obs_unit_id as obsUnitId ") - .append(" FROM ").append(" nd_geolocationprop blk ") - .append(" INNER JOIN nd_experiment e ON e.nd_geolocation_id = blk.nd_geolocation_id ") - .append(" INNER JOIN nd_geolocation geo ON geo.nd_geolocation_id = e.nd_geolocation_id ") + .append(" FROM nd_experiment e ") .append(" INNER JOIN project p ON p.project_id = e.project_id ") .append(" INNER JOIN project st ON st.project_id = p.study_id ") .append(" INNER JOIN stock s ON e.stock_id = s.stock_id ") @@ -190,24 +185,27 @@ public List getAllFieldMapsInBlockByTrialInstanceId(final int data .append(" INNER JOIN nd_experimentprop epropPlot ON epropPlot.nd_experiment_id = e.nd_experiment_id ") .append(" AND epropPlot.type_id IN (").append(TermId.PLOT_NO.getId()).append(", ") .append(TermId.PLOT_NNO.getId()).append(") ").append(" AND epropPlot.value <> '' ") - .append(" LEFT JOIN nd_geolocationprop site ON site.nd_geolocation_id = e.nd_geolocation_id ") + .append(" INNER JOIN nd_experiment env ON e.parent_id = env.nd_experiment_id ") + .append(" AND env.type_id = ").append(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()) + .append(" LEFT JOIN nd_experimentprop site ON site.nd_experiment_id = env.nd_experiment_id ") .append(" AND site.type_id = ").append(TermId.TRIAL_LOCATION.getId()) - .append(" LEFT JOIN nd_geolocationprop siteId ON siteId.nd_geolocation_id = e.nd_geolocation_id ") + .append(" LEFT JOIN nd_experimentprop siteId ON siteId.nd_experiment_id = env.nd_experiment_id ") .append(" AND siteId.type_id = ").append(TermId.LOCATION_ID.getId()) .append(" LEFT JOIN nd_experimentprop row ON row.nd_experiment_id = e.nd_experiment_id ") .append(" AND row.type_id = ").append(TermId.RANGE_NO.getId()) .append(" LEFT JOIN nd_experimentprop col ON col.nd_experiment_id = e.nd_experiment_id ") .append(" AND col.type_id = ").append(TermId.COLUMN_NO.getId()) - .append(" LEFT JOIN nd_geolocationprop gpSeason ON geo.nd_geolocation_id = gpSeason.nd_geolocation_id ") - .append(" AND gpSeason.type_id = ").append(TermId.SEASON_VAR.getId()).append(" ") // -- 8371 (2452) - .append(" WHERE blk.type_id = ").append(TermId.BLOCK_ID.getId()); + .append(" LEFT JOIN nd_experimentprop season ON season.nd_experiment_id = env.nd_experiment_id ") + .append(" AND season.type_id = ").append(TermId.SEASON_VAR.getId()).append(" ") // -- 8371 (2452) + .append(" INNER JOIN nd_experimentprop blk on blk.nd_experiment_id = env.nd_experiment_id AND blk.type_id = ") + .append(TermId.BLOCK_ID.getId()); if (blockId != null) { sql.append(" AND blk.value = :blockId "); } else { - sql.append(" AND blk.value IN (SELECT DISTINCT bval.value FROM nd_geolocationprop bval ") - .append(" INNER JOIN nd_experiment bexp ON bexp.nd_geolocation_id = bval.nd_geolocation_id ") - .append(" AND bexp.nd_geolocation_id = :geolocationId ") + sql.append(" AND blk.value IN (SELECT DISTINCT bval.value FROM nd_experimentprop bval ") + .append(" INNER JOIN nd_experiment bexp ON bexp.parent_id = bval.nd_experiment_id ") + .append(" AND bexp.parent_id = :instanceId ") .append(" AND bexp.project_id = :datasetId ").append(" WHERE bval.type_id = ").append(TermId.BLOCK_ID.getId()) .append(")"); } @@ -216,16 +214,16 @@ public List getAllFieldMapsInBlockByTrialInstanceId(final int data final SQLQuery query = this.getSession().createSQLQuery(sql.toString()); query.addScalar("datasetId").addScalar("datasetName").addScalar("studyName") - .addScalar("geolocationId").addScalar("siteName").addScalar("siteId").addScalar("experimentId").addScalar("entryNumber").addScalar("germplasmName").addScalar( + .addScalar("instanceId").addScalar("siteName").addScalar("siteId").addScalar("experimentId").addScalar("entryNumber").addScalar("germplasmName").addScalar( "rep").addScalar("plotNo").addScalar("row") .addScalar("col").addScalar("blockId").addScalar("studyId").addScalar("trialInstance").addScalar("gid") - .addScalar("startDate").addScalar("season").addScalar("blockNo").addScalar("obsUnitId", Hibernate.STRING); + .addScalar("startDate").addScalar("season").addScalar("blockNo").addScalar("obsUnitId", new StringType()); if (blockId != null) { query.setParameter("blockId", blockId); } else { query.setParameter("datasetId", datasetId); - query.setParameter("geolocationId", geolocationId); + query.setParameter("instanceId", instanceId); } final List list = query.list(); @@ -235,7 +233,7 @@ public List getAllFieldMapsInBlockByTrialInstanceId(final int data } } catch (final HibernateException e) { - final String message = "Error at getAllFieldMapsInBlockByTrialInstanceId(" + geolocationId + ") at ExperimentPropertyDao: " + e.getMessage(); + final String message = "Error at getAllFieldMapsInBlockByTrialInstanceId(" + instanceId + ") at ExperimentPropertyDao: " + e.getMessage(); ExperimentPropertyDao.LOG.error(message, e); throw new MiddlewareQueryException(message, e); } @@ -250,24 +248,24 @@ private List createFieldMapDatasetInfo(final List FieldMapTrialInstanceInfo trialInstance = null; List labels = null; Integer datasetId = null; - Integer geolocationId = null; + Integer environmentId = null; String datasetName = null; String siteName = null; - String trialInstanceNo = null; + Integer trialInstanceNo = null; Integer blockId = null; Integer siteId = null; for (final Object[] row : list) { - if (geolocationId == null) { + if (environmentId == null) { trialInstance = new FieldMapTrialInstanceInfo(); labels = new ArrayList<>(); } else { // if trial instance or dataset has changed, add previously saved trial instance - if (!geolocationId.equals(row[2]) || !datasetId.equals(row[0])) { - trialInstance.setGeolocationId(geolocationId); + if (!environmentId.equals(row[2]) || !datasetId.equals(row[0])) { + trialInstance.setEnvironmentId(environmentId); trialInstance.setSiteName(siteName); trialInstance.setLocationName(siteName); trialInstance.setLocationId(siteId); - trialInstance.setTrialInstanceNo(trialInstanceNo); + trialInstance.setTrialInstanceNo(String.valueOf(trialInstanceNo)); trialInstance.setBlockId(blockId); trialInstance.setFieldMapLabels(labels); if (blockId != null) { @@ -329,23 +327,23 @@ private List createFieldMapDatasetInfo(final List datasetId = (Integer) row[0]; datasetName = (String) row[1]; - geolocationId = (Integer) row[2]; + environmentId = (Integer) row[2]; siteName = (String) row[3]; if (row[17] != null && NumberUtils.isNumber((String) row[17])) { siteId = Integer.valueOf((String) row[17]); } else { siteId = null; } - trialInstanceNo = (String) row[12]; + trialInstanceNo = (Integer) row[12]; blockId = row[11] != null ? Integer.valueOf((String) row[11]) : null; } // add last trial instance and dataset - trialInstance.setGeolocationId(geolocationId); + trialInstance.setEnvironmentId(environmentId); trialInstance.setSiteName(siteName); trialInstance.setLocationName(siteName); trialInstance.setLocationId(siteId); trialInstance.setBlockId(blockId); - trialInstance.setTrialInstanceNo(trialInstanceNo); + trialInstance.setTrialInstanceNo(String.valueOf(trialInstanceNo)); trialInstance.setFieldMapLabels(labels); if (blockId != null) { @@ -381,7 +379,7 @@ private List createFieldMapLabels(final List rows) { label.setRange(this.getIntegerValue(row[11])); label.setGermplasmName((String) row[8]); label.setDatasetId((Integer) row[0]); - label.setGeolocationId((Integer) row[3]); + label.setEnvironmentId((Integer) row[3]); label.setSiteName((String) row[4]); label.setGid((Integer) row[16]); label.setStartYear(startDate != null && !startDate.equals("null") && startDate.length() > 3 ? startDate.substring(0, 4) : null); @@ -393,7 +391,7 @@ private List createFieldMapLabels(final List rows) { FieldMapTrialInstanceInfo trial = trialMap.get(trialKey); if (trial == null) { trial = new FieldMapTrialInstanceInfo(); - trial.setGeolocationId((Integer) row[3]); + trial.setEnvironmentId((Integer) row[3]); trial.setSiteName((String) row[4]); trial.setLocationName((String) row[4]); if (row[5] != null && NumberUtils.isNumber((String) row[5])) { @@ -402,7 +400,7 @@ private List createFieldMapLabels(final List rows) { if (row[13] != null && NumberUtils.isNumber((String) row[13])) { trial.setBlockId(Integer.valueOf((String) row[13])); } - trial.setTrialInstanceNo((String) row[15]); + trial.setTrialInstanceNo(String.valueOf(row[15])); trialMap.put(trialKey, trial); } @@ -421,21 +419,21 @@ private List createFieldMapLabels(final List rows) { infoMap.put(study.getFieldbookId(), study); } if (study.getDatasets() == null) { - study.setDatasets(new ArrayList()); + study.setDatasets(new ArrayList<>()); } if (study.getDataSet(dataset.getDatasetId()) == null) { study.getDatasets().add(dataset); } } if (dataset.getTrialInstances() == null) { - dataset.setTrialInstances(new ArrayList()); + dataset.setTrialInstances(new ArrayList<>()); } - if (dataset.getTrialInstance(trial.getGeolocationId()) == null) { + if (dataset.getTrialInstance(trial.getEnvironmentId()) == null) { dataset.getTrialInstances().add(trial); } if (trial.getFieldMapLabels() == null) { - trial.setFieldMapLabels(new ArrayList()); + trial.setFieldMapLabels(new ArrayList<>()); } trial.getFieldMapLabels().add(label); } diff --git a/src/main/java/org/generationcp/middleware/dao/dms/GeolocationPropertyDao.java b/src/main/java/org/generationcp/middleware/dao/dms/GeolocationPropertyDao.java deleted file mode 100644 index b3e13012b5..0000000000 --- a/src/main/java/org/generationcp/middleware/dao/dms/GeolocationPropertyDao.java +++ /dev/null @@ -1,239 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, All Rights Reserved. - * - * Generation Challenge Programme (GCP) - * - * - * This software is licensed for use under the terms of the GNU General Public License (http://bit.ly/8Ztv8M) and the provisions of Part F - * of the Generation Challenge Programme Amended Consortium Agreement (http://bit.ly/KQX1nL) - * - *******************************************************************************/ - -package org.generationcp.middleware.dao.dms; - -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import org.generationcp.middleware.dao.GenericDAO; -import org.generationcp.middleware.domain.etl.MeasurementVariable; -import org.generationcp.middleware.domain.oms.Term; -import org.generationcp.middleware.domain.oms.TermId; -import org.generationcp.middleware.exceptions.MiddlewareQueryException; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; -import org.hibernate.Criteria; -import org.hibernate.HibernateException; -import org.hibernate.Query; -import org.hibernate.SQLQuery; -import org.hibernate.criterion.Projections; -import org.hibernate.criterion.Restrictions; -import org.hibernate.transform.AliasToEntityMapResultTransformer; -import org.hibernate.type.StringType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.util.CollectionUtils; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * DAO class for {@link GeolocationProperty}. - */ -public class GeolocationPropertyDao extends GenericDAO { - - private static final Logger LOG = LoggerFactory.getLogger(GeolocationPropertyDao.class); - - @SuppressWarnings("unchecked") - public List getGeolocationIdsByPropertyTypeAndValue(final Integer typeId, final String value) { - try { - final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); - criteria.add(Restrictions.eq("typeId", typeId)); - criteria.add(Restrictions.eq("value", value)); - criteria.setProjection(Projections.property("geolocation.locationId")); - - return criteria.list(); - - } catch (final HibernateException e) { - throw new MiddlewareQueryException( - "Error at getIdsByPropertyTypeAndValue=" + typeId + ", " + value + " query on GeolocationDao: " + e.getMessage(), e); - } - } - - @SuppressWarnings("unchecked") - public String getValueOfTrialInstance(final int datasetId, final int typeId, final String trialInstance) { - try { - final StringBuilder sql = - new StringBuilder().append("SELECT gp.value FROM nd_geolocationprop gp ") - .append(" INNER JOIN nd_geolocation g ON g.nd_geolocation_id = gp.nd_geolocation_id ") - .append(" AND g.description = ").append(trialInstance) - .append(" INNER JOIN nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id ") - .append(" WHERE gp.type_id = ").append(typeId).append(" AND e.project_id = ").append(datasetId); - - final SQLQuery query = this.getSession().createSQLQuery(sql.toString()); - return (String) query.uniqueResult(); - - } catch (final HibernateException e) { - throw new MiddlewareQueryException( - "Error at getValueOfTrialInstance=" + datasetId + " query on GeolocationPropertyDao: " + e.getMessage(), e); - } - } - - public void deletePropertiesInDataset(final int datasetId, final List variableIds) { - this.deleteValues(datasetId, Collections.emptyList(), variableIds); - } - - public void deletePropertiesInDatasetInstances(final int datasetId, final List instanceNumbers, final List variableIds) { - this.deleteValues(datasetId, instanceNumbers, variableIds); - } - - private void deleteValues(final int projectId, final List instanceNumbers, final List variableIds) { - // Please note we are manually flushing because non hibernate based deletes and updates causes the Hibernate session to get out of synch with - // underlying database. Thus flushing to force Hibernate to synchronize with the underlying database before the delete - // statement - this.getSession().flush(); - - final StringBuilder sql1 = new StringBuilder().append("Delete ngp.* FROM nd_geolocationprop ngp " - + "INNER JOIN nd_geolocation g on g.nd_geolocation_id = ngp.nd_geolocation_id " - + "INNER JOIN nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id " - + "INNER JOIN project p ON p.project_id = e.project_id " - + "WHERE (p.study_id = :datasetId OR p.project_id = :datasetId) AND ngp.type_id IN (:variableIds) "); - if (!CollectionUtils.isEmpty(instanceNumbers)) { - sql1.append(" AND g.description IN (:instanceNumbers)"); - } - - final SQLQuery sqlQuery1 = this.getSession().createSQLQuery(sql1.toString()); - sqlQuery1.setParameter("datasetId", projectId); - sqlQuery1.setParameterList("variableIds", variableIds); - if (!CollectionUtils.isEmpty(instanceNumbers)) { - sqlQuery1.setParameterList("instanceNumbers", instanceNumbers); - } - sqlQuery1.executeUpdate(); - } - - public Map getGeolocationPropsAndValuesByGeolocation(final Integer geolocationId, final List excludedVariableIds) { - Preconditions.checkNotNull(geolocationId); - final Map geoProperties = new HashMap<>(); - final List excludedIds = new ArrayList<>(excludedVariableIds); - excludedIds.add(TermId.NO_OF_COLS_IN_REPS.getId()); - excludedIds.add(TermId.LOCATION_ID.getId()); - excludedIds.add(TermId.TRIAL_LOCATION.getId()); - - final StringBuilder sql = - new StringBuilder().append("SELECT ").append(" cv.definition as name, geo.value as value ").append("FROM ") - .append(" nd_geolocationprop geo ").append(" INNER JOIN ") - .append(" cvterm cv ON (cv.cvterm_id = geo.type_id) ").append("WHERE ").append(" geo.nd_geolocation_id = :geolocationId ") - .append(" AND geo.type_id NOT IN (:excludedIds) "); - try { - final Query query = - this.getSession().createSQLQuery(sql.toString()).addScalar("name").addScalar("value").setParameter("geolocationId", geolocationId) - .setParameterList("excludedIds", excludedIds); - final List results = query.list(); - for (final Object obj : results) { - final Object[] row = (Object[]) obj; - geoProperties.put((String) row[0], (String) row[1]); - } - return geoProperties; - } catch (final MiddlewareQueryException e) { - final String message = "Error with getGeolocationPropsAndValuesByGeolocation() query from geolocationId: " + geolocationId - + " and excludedIds: " + excludedIds; - GeolocationPropertyDao.LOG.error(message, e); - throw new MiddlewareQueryException(message, e); - } - } - - - public Map getGeoLocationPropertyByVariableId(final Integer datasetId, final Integer instanceDbId) { - Preconditions.checkNotNull(datasetId); - final String sql = "SELECT " - + " gp.type_id as variableId, " - + " gp.value as value " - + "FROM " - + " nd_experiment e " - + " INNER JOIN " - + " nd_geolocationprop gp ON gp.nd_geolocation_id = e.nd_geolocation_id " - + "WHERE " - + " e.project_id = :datasetId " - + " and e.nd_geolocation_id = :instanceDbId"; - - final SQLQuery query = this.getSession().createSQLQuery(sql); - query.addScalar("variableId").addScalar("value").setParameter("datasetId", datasetId).setParameter("instanceDbId", instanceDbId); - query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE); - - final List> results = query.list(); - final Map geoProperties = new HashMap<>(); - for (final Map result : results) { - final Integer variableId = (Integer) result.get("variableId"); - final String value = (String) result.get("value"); - geoProperties.put(variableId, value); - } - return geoProperties; - } - - public String getGeolocationPropValue(final int stdVarId, final int datasetId) { - try { - final StringBuilder sql = - new StringBuilder().append("SELECT distinct value ").append("FROM nd_experiment e ") - .append("INNER JOIN nd_geolocationprop gp ON gp.nd_geolocation_id = e.nd_geolocation_id ") - .append("WHERE e.project_id = :projectId AND gp.type_id = :stdVarId ORDER BY e.nd_geolocation_id "); - final SQLQuery query = this.getSession().createSQLQuery(sql.toString()); - query.setParameter("projectId", datasetId); - query.setParameter("stdVarId", stdVarId); - return (String) query.uniqueResult(); - } catch (final HibernateException e) { - throw new MiddlewareQueryException( - "Error at getGeolocationPropValue=" + stdVarId + " query on GeolocationPropertyDao: " + e.getMessage(), e); - } - } - - - public List getByGeolocation(final Integer geolocationId) { - final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); - criteria.add(Restrictions.eq("geolocation.locationId", geolocationId)); - return criteria.list(); - } - - public List getEnvironmentDetailVariablesByGeoLocationIdAndVariableIds(Integer geolocationId, List variableIds) { - List studyVariables = new ArrayList<>(); - final List standardEnvironmentFactors = Lists.newArrayList( - TermId.LOCATION_ID.getId(), - TermId.TRIAL_INSTANCE_FACTOR.getId(), - TermId.EXPERIMENT_DESIGN_FACTOR.getId()); - try{ - final SQLQuery query = - this.getSession().createSQLQuery("SELECT ispcvt.name as name, ispcvt.definition as definition, " - + " cvt_scale.name AS scaleName, gprop.value AS value FROM nd_geolocationprop gprop " - + " INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = gprop.type_id AND ispcvt.cvterm_id in (:variableIds) " - + " INNER JOIN cvterm_relationship cvt_rel ON cvt_rel.subject_id = ispcvt.cvterm_id AND cvt_rel.type_id = " + TermId.HAS_SCALE.getId() - + " INNER JOIN cvterm cvt_scale ON cvt_scale.cvterm_id = cvt_rel.object_id " - + " INNER JOIN nd_geolocation gl ON gprop.nd_geolocation_id = gl.nd_geolocation_id " - + " WHERE gl.nd_geolocation_id = :geolocationId AND ispcvt.cvterm_id NOT IN (:standardEnvironmentFactors) ;"); - query.addScalar("name", new StringType()); - query.addScalar("definition", new StringType()); - query.addScalar("scaleName", new StringType()); - query.addScalar("value", new StringType()); - query.setParameterList("variableIds", variableIds); - query.setParameter("geolocationId", geolocationId); - query.setParameterList("standardEnvironmentFactors", standardEnvironmentFactors); - - final List results = query.list(); - for(Object result: results) { - - final Object[] row = (Object[]) result; - final MeasurementVariable measurementVariable = new MeasurementVariable(); - measurementVariable.setName((row[0] instanceof String) ? (String) row[0] : null); - measurementVariable.setDescription((row[1] instanceof String) ? (String) row[1] : null); - measurementVariable.setScale((row[2] instanceof String) ? (String) row[2] : null); - measurementVariable.setValue((row[3] instanceof String) ? (String) row[3] : null); - studyVariables.add(measurementVariable); - } - } catch (final MiddlewareQueryException e) { - final String message = "Error with getEnvironmentConditionVariablesByGeoLocationIdAndVariableIds() query from geolocationId: " + geolocationId - + " and variableIds: " + variableIds; - GeolocationPropertyDao.LOG.error(message, e); - throw new MiddlewareQueryException(message, e); - } - return studyVariables; - } - -} diff --git a/src/main/java/org/generationcp/middleware/dao/dms/GeolocationDao.java b/src/main/java/org/generationcp/middleware/dao/dms/InstanceDao.java similarity index 51% rename from src/main/java/org/generationcp/middleware/dao/dms/GeolocationDao.java rename to src/main/java/org/generationcp/middleware/dao/dms/InstanceDao.java index 7883ad0307..1ed03cbe46 100644 --- a/src/main/java/org/generationcp/middleware/dao/dms/GeolocationDao.java +++ b/src/main/java/org/generationcp/middleware/dao/dms/InstanceDao.java @@ -1,14 +1,3 @@ -/******************************************************************************* - * Copyright (c) 2012, All Rights Reserved. - * - * Generation Challenge Programme (GCP) - * - * - * This software is licensed for use under the terms of the GNU General Public License (http://bit.ly/8Ztv8M) and the provisions of Part F - * of the Generation Challenge Programme Amended Consortium Agreement (http://bit.ly/KQX1nL) - * - *******************************************************************************/ - package org.generationcp.middleware.dao.dms; import org.apache.commons.lang3.math.NumberUtils; @@ -21,12 +10,18 @@ import org.generationcp.middleware.domain.oms.TermId; import org.generationcp.middleware.enumeration.DatasetTypeEnum; import org.generationcp.middleware.exceptions.MiddlewareQueryException; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.hibernate.Hibernate; +import org.generationcp.middleware.pojos.dms.ExperimentModel; +import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.SQLQuery; +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Projections; +import org.hibernate.criterion.Property; +import org.hibernate.criterion.Restrictions; +import org.hibernate.criterion.Subqueries; import org.hibernate.type.IntegerType; +import org.hibernate.type.StringType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; @@ -35,93 +30,69 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; -/** - * DAO class for {@link Geolocation}. - */ -public class GeolocationDao extends GenericDAO { - - private static final Logger LOG = LoggerFactory.getLogger(GeolocationDao.class); +public class InstanceDao extends GenericDAO { + private static final Logger LOG = LoggerFactory.getLogger(InstanceDao.class); + private static final String ENVT_ID = "envtId"; private static final String LOCATION_ID = "locationId"; private static final String PROJECT_ID = "project_id"; private static final String ISOABBR = "isoabbr"; private static final String PROVINCE_NAME = "provinceName"; private static final String LOCATION_NAME = "locationName"; - private static final String ENVT_ID = "envtId"; private static final String DESCRIPTION = "description"; - private static final String AT_GEOLOCATION_DAO = " at GeolocationDao: "; - private static final String GET_ALL_ENVIRONMENTS_QUERY = - "SELECT DISTINCT gp.nd_geolocation_id as envtId, l.lname AS locationName, prov.lname AS provinceName, " - + " c.isoabbr, p.project_id, p.name, gp.value AS locationId, p.description AS description " - + " FROM nd_geolocationprop gp " - + " INNER JOIN nd_experiment e on e.nd_geolocation_id = gp.nd_geolocation_id " - + " AND e.nd_experiment_id = " + " ( " + " SELECT MIN(nd_experiment_id) " - + " FROM nd_experiment min" + " WHERE min.nd_geolocation_id = gp.nd_geolocation_id" - + " ) " - + " INNER JOIN project ds ON ds.project_id = e.project_id " - + " INNER JOIN project p ON p.project_id = ds.study_id " - + " LEFT JOIN location l ON l.locid = gp.value " + " LEFT JOIN location prov ON prov.locid = l.snl1id " - + " LEFT JOIN cntry c ON c.cntryid = l.cntryid " + " WHERE gp.type_id = " + TermId.LOCATION_ID.getId(); - @SuppressWarnings("unchecked") - public Set findInDataSet(final int datasetId) { - final Set locations = new LinkedHashSet<>(); - try { - - final String sql = "SELECT DISTINCT e.nd_geolocation_id" + " FROM nd_experiment e" - + " WHERE e.project_id = :projectId ORDER BY e.nd_geolocation_id"; - final Query query = this.getSession().createSQLQuery(sql).setParameter("projectId", datasetId); - final List ids = query.list(); - for (final Integer id : ids) { - locations.add(this.getById(id)); - } - } catch (final HibernateException e) { - final String errorMessage = "Error at findInDataSet=" + datasetId + GeolocationDao.AT_GEOLOCATION_DAO - + e.getMessage(); - GeolocationDao.LOG.error(errorMessage, e); - throw new MiddlewareQueryException(errorMessage, e); + private static final String GET_ALL_ENVIRONMENTS_QUERY = + "SELECT DISTINCT e.nd_experiment_id as envtId, l.lname AS locationName, prov.lname AS provinceName, " + + " c.isoabbr, p.project_id, p.name, xp.value AS locationId, p.description AS description " + + " FROM nd_experimentprop xp " + + " INNER JOIN nd_experiment e on e.nd_experiment_id = xp.nd_experiment_id AND e.type_id = " + + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + + " INNER JOIN project ds ON ds.project_id = e.project_id " + + " INNER JOIN project p ON p.project_id = ds.study_id " + + " LEFT JOIN location l ON l.locid = xp.value " + " LEFT JOIN location prov ON prov.locid = l.snl1id " + + " LEFT JOIN cntry c ON c.cntryid = l.cntryid " + " WHERE xp.type_id = " + TermId.LOCATION_ID.getId(); + + + + public List getEnvironmentsByDataset(final Integer datasetId, final boolean isEnvironmentDataset) { + final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass(), "environment"); + + if (isEnvironmentDataset) { + criteria.add(Restrictions.eq("project.projectId", datasetId)); + } else { + final DetachedCriteria childExperimentsCriteria = DetachedCriteria.forClass(ExperimentModel.class, "childExperiment"); + childExperimentsCriteria.add(Restrictions.eq("childExperiment.project.projectId", datasetId)); + childExperimentsCriteria.setProjection(Projections.distinct(Projections.property("childExperiment.parent.ndExperimentId"))); + criteria.add(Property.forName("ndExperimentId").in(childExperimentsCriteria)); } - return locations; + return criteria.list(); } - @SuppressWarnings("unchecked") - public Set getLocationIds(final Integer projectId) { - final Set locationIds = new HashSet<>(); - try { - final String sql = "SELECT DISTINCT e.nd_geolocation_id" - + " FROM nd_experiment e " - + " WHERE e.project_id = " + projectId; - final Query query = this.getSession().createSQLQuery(sql); - locationIds.addAll(query.list()); - - } catch (final HibernateException e) { - final String errorMessage = "Error at getLocationIds=" + projectId + GeolocationDao.AT_GEOLOCATION_DAO - + e.getMessage(); - GeolocationDao.LOG.error(errorMessage, e); - throw new MiddlewareQueryException(errorMessage, e); - } - return locationIds; + public List getEnvironmentIds(final Integer datasetId) { + final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); + criteria.add(Restrictions.eq("project.projectId", datasetId)); + criteria.setProjection(Projections.distinct(Projections.property("ndExperimentId"))); + return criteria.list(); } + @SuppressWarnings("unchecked") public List getAllTrialEnvironments() { final List environments = new ArrayList<>(); try { - final SQLQuery query = this.getSession().createSQLQuery(GeolocationDao.GET_ALL_ENVIRONMENTS_QUERY); - query.addScalar(GeolocationDao.ENVT_ID); - query.addScalar(GeolocationDao.LOCATION_NAME); - query.addScalar(GeolocationDao.PROVINCE_NAME); - query.addScalar(GeolocationDao.ISOABBR); - query.addScalar(GeolocationDao.PROJECT_ID); + final SQLQuery query = this.getSession().createSQLQuery(InstanceDao.GET_ALL_ENVIRONMENTS_QUERY); + query.addScalar(InstanceDao.ENVT_ID); + query.addScalar(InstanceDao.LOCATION_NAME); + query.addScalar(InstanceDao.PROVINCE_NAME); + query.addScalar(InstanceDao.ISOABBR); + query.addScalar(InstanceDao.PROJECT_ID); query.addScalar("name"); - query.addScalar(GeolocationDao.LOCATION_ID); - query.addScalar(GeolocationDao.DESCRIPTION); + query.addScalar(InstanceDao.LOCATION_ID); + query.addScalar(InstanceDao.DESCRIPTION); final List list = query.list(); for (final Object[] row : list) { // otherwise it's invalid data and should not be included @@ -135,8 +106,8 @@ public List getAllTrialEnvironments() { } } catch (final HibernateException e) { - final String errorMessage = "Error at getAllTrialEnvironments at GeolocationDao: " + e.getMessage(); - GeolocationDao.LOG.error(errorMessage, e); + final String errorMessage = "Error at getAllTrialEnvironments at InstanceDao: " + e.getMessage(); + InstanceDao.LOG.error(errorMessage, e); throw new MiddlewareQueryException(errorMessage, e); } return environments; @@ -144,14 +115,14 @@ public List getAllTrialEnvironments() { public long countAllTrialEnvironments() { try { - final String sql = "SELECT COUNT(DISTINCT nd_geolocation_id) " + " FROM nd_geolocationprop WHERE type_id = " + final String sql = "SELECT COUNT(DISTINCT nd_experiment_id) " + " FROM nd_experimentprop WHERE type_id = " + TermId.LOCATION_ID.getId(); final Query query = this.getSession().createSQLQuery(sql); return ((BigInteger) query.uniqueResult()).longValue(); } catch (final HibernateException e) { - final String errorMessage = "Error at countAllTrialEnvironments at GeolocationDao: " + e.getMessage(); - GeolocationDao.LOG.error(errorMessage, e); + final String errorMessage = "Error at countAllTrialEnvironments at InstanceDao: " + e.getMessage(); + InstanceDao.LOG.error(errorMessage, e); throw new MiddlewareQueryException(errorMessage, e); } } @@ -162,14 +133,14 @@ public List getPropertiesForTrialEnvironments(final Li try { // if categorical value, get related cvterm.definition as property // value. - // Else, get the value as it's stored in nd_geolocationprop - final String sql = "SELECT DISTINCT gp.type_id, cvt.name, cvt.definition, gp.nd_geolocation_id, " + // Else, get the value as it's stored in nd_experimentprop + final String sql = "SELECT DISTINCT xp.type_id, cvt.name, cvt.definition, nd_experiment_id, " + "CASE WHEN (v.name IS NOT NULL AND cvr.cvterm_relationship_id IS NOT NULL) THEN v.definition " - + " ELSE gp.value END AS propvalue " + " FROM nd_geolocationprop gp" - + " LEFT JOIN cvterm cvt ON gp.type_id = cvt.cvterm_id" - + " LEFT JOIN cvterm v ON v.cvterm_id = gp.value" - + " LEFT JOIN cvterm_relationship cvr ON cvr.subject_id = gp.type_id AND cvr.type_id = " + TermId.HAS_SCALE.getId() - + " WHERE gp.nd_geolocation_id IN (:environmentIds)" + " ORDER BY gp.type_id, gp.nd_geolocation_id"; + + " ELSE xp.value END AS propvalue " + " FROM nd_experimentprop xp" + + " LEFT JOIN cvterm cvt ON xp.type_id = cvt.cvterm_id" + + " LEFT JOIN cvterm v ON v.cvterm_id = xp.value" + + " LEFT JOIN cvterm_relationship cvr ON cvr.subject_id = xp.type_id AND cvr.type_id = " + TermId.HAS_SCALE.getId() + + " WHERE nd_experiment_id IN (:environmentIds)" + " ORDER BY xp.type_id, nd_experiment_id"; final Query query = this.getSession().createSQLQuery(sql); query.setParameterList("environmentIds", environmentIds); @@ -206,13 +177,14 @@ public List getPropertiesForTrialEnvironments(final Li } catch (final HibernateException e) { final String errorMessage = "Error at getPropertiesForTrialEnvironments=" + environmentIds - + GeolocationDao.AT_GEOLOCATION_DAO + e.getMessage(); - GeolocationDao.LOG.error(errorMessage, e); + + " at InstanceDao: " + e.getMessage(); + InstanceDao.LOG.error(errorMessage, e); throw new MiddlewareQueryException(errorMessage, e); } return properties; } + @SuppressWarnings("unchecked") public List getTrialEnvironmentDetails(final Set environmentIds) { final List environmentDetails = new ArrayList<>(); @@ -225,27 +197,27 @@ public List getTrialEnvironmentDetails(final Set envi // Get location name, study id and study name final String sql = - "SELECT DISTINCT e.nd_geolocation_id, l.lname, gp.value, p.project_id, p.name, p.description, prov.lname as provinceName, c.isoabbr " + "SELECT DISTINCT e.nd_experiment_id as environmentId, l.lname, xp.value, p.project_id, p.name, p.description, prov.lname as provinceName, c.isoabbr " + "FROM nd_experiment e " - + " LEFT JOIN nd_geolocationprop gp ON e.nd_geolocation_id = gp.nd_geolocation_id " - + " AND gp.type_id = " + TermId.LOCATION_ID.getId() - + " LEFT JOIN location l ON l.locid = gp.value " + + " LEFT JOIN nd_experimentprop xp ON e.nd_experiment_id = xp.nd_experiment_id" + + " AND xp.type_id = " + TermId.LOCATION_ID.getId() + + " LEFT JOIN location l ON l.locid = xp.value " + " LEFT JOIN location prov ON prov.locid = l.snl1id " + " LEFT JOIN cntry c ON l.cntryid = c.cntryid " + " INNER JOIN project ds ON ds.project_id = e.project_id " + " INNER JOIN project p ON p.project_id = ds.study_id " - + " WHERE e.nd_geolocation_id IN (:locationIds) "; + + " WHERE e.nd_experiment_id IN (:locationIds) "; final SQLQuery query = this.getSession().createSQLQuery(sql); query.setParameterList("locationIds", environmentIds); - query.addScalar("nd_geolocation_id", Hibernate.INTEGER); - query.addScalar("lname", Hibernate.STRING); - query.addScalar("value", Hibernate.INTEGER); - query.addScalar(GeolocationDao.PROJECT_ID, Hibernate.INTEGER); - query.addScalar("name", Hibernate.STRING); - query.addScalar(GeolocationDao.DESCRIPTION, Hibernate.STRING); - query.addScalar(GeolocationDao.PROVINCE_NAME, Hibernate.STRING); - query.addScalar(GeolocationDao.ISOABBR, Hibernate.STRING); + query.addScalar("environmentId", new IntegerType()); + query.addScalar("lname", new StringType()); + query.addScalar("value", new IntegerType()); + query.addScalar(InstanceDao.PROJECT_ID, new IntegerType()); + query.addScalar("name", new StringType()); + query.addScalar(InstanceDao.DESCRIPTION, new StringType()); + query.addScalar(InstanceDao.PROVINCE_NAME, new StringType()); + query.addScalar(InstanceDao.ISOABBR, new StringType()); final List locIds = new ArrayList<>(); final List result = query.list(); @@ -269,8 +241,8 @@ public List getTrialEnvironmentDetails(final Set envi } catch (final HibernateException e) { final String errorMessage = "Error at getTrialEnvironmentDetails=" + environmentIds - + GeolocationDao.AT_GEOLOCATION_DAO + e.getMessage(); - GeolocationDao.LOG.error(errorMessage, e); + + " at InstanceDao: " + e.getMessage(); + InstanceDao.LOG.error(errorMessage, e); throw new MiddlewareQueryException(errorMessage, e); } @@ -282,25 +254,30 @@ public TrialEnvironments getEnvironmentsForTraits(final List traitIds, final TrialEnvironments environments = new TrialEnvironments(); try { final String sql = - "SELECT DISTINCT gp.nd_geolocation_id as envtId, l.lname as locationName, prov.lname as provinceName, c.isoabbr, p.project_id, p.name, gp.value as locationId" - + " FROM nd_experiment e " - + " INNER JOIN project ds ON ds.project_id = e.project_id " - + " INNER JOIN project p ON p.project_id = ds.study_id " - + " INNER JOIN phenotype ph ON ph.nd_experiment_id = e.nd_experiment_id" - + " INNER JOIN nd_geolocationprop gp ON gp.nd_geolocation_id = e.nd_geolocation_id AND gp.type_id = " - + TermId.LOCATION_ID.getId() - + " LEFT JOIN location l ON l.locid = gp.value" - + " LEFT JOIN location prov ON prov.locid = l.snl1id" - + " LEFT JOIN cntry c ON c.cntryid = l.cntryid" - + " WHERE ph.observable_id IN (:traitIds) AND p.program_uuid = :programUUID ;"; + " SELECT DISTINCT xp.nd_experiment_id as envtId, l.lname as locationName, prov.lname as provinceName, c.isoabbr, pmain.project_id, pmain.name, xp.value as locationId " + + " FROM nd_experiment e " + + " LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = e.parent_id and plot.type_id = " + TermId.PLOT_EXPERIMENT.getId() + + " INNER JOIN project pr ON pr.project_id = e.project_id " + + " INNER JOIN project pmain ON pmain.project_id = pr.study_id " + + " INNER JOIN project env_ds ON env_ds.study_id = pr.study_id AND env_ds.dataset_type_id = " + DatasetTypeEnum.SUMMARY_DATA.getId() + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + + " AND (e.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id) " + + " INNER JOIN projectprop pp on e.project_id = pp.project_id and pp.type_id = 1808 AND pp.variable_id in (:traitIds) " + + " INNER JOIN nd_experimentprop xp ON xp.nd_experiment_id = env.nd_experiment_id AND xp.type_id = " + TermId.LOCATION_ID.getId() + + " LEFT JOIN location l ON l.locid = xp.value " + + " LEFT JOIN location prov ON prov.locid = l.snl1id " + + " LEFT JOIN cntry c ON c.cntryid = l.cntryid " + + " WHERE pmain.program_uuid = :programUUID AND EXISTS (" + + " select 1 from phenotype ph where ph.observable_id = pp.variable_id and ph.nd_experiment_id = e.nd_experiment_id) " + ; final SQLQuery query = this.getSession().createSQLQuery(sql); - query.addScalar(GeolocationDao.ENVT_ID); - query.addScalar(GeolocationDao.LOCATION_NAME); - query.addScalar(GeolocationDao.PROVINCE_NAME); - query.addScalar(GeolocationDao.ISOABBR); - query.addScalar(GeolocationDao.PROJECT_ID); + query.addScalar(InstanceDao.ENVT_ID); + query.addScalar(InstanceDao.LOCATION_NAME); + query.addScalar(InstanceDao.PROVINCE_NAME); + query.addScalar(InstanceDao.ISOABBR); + query.addScalar(InstanceDao.PROJECT_ID); query.addScalar("name"); - query.addScalar(GeolocationDao.LOCATION_ID); + query.addScalar(InstanceDao.LOCATION_ID); query.setParameterList("traitIds", traitIds); query.setParameter("programUUID", programUUID); final List list = query.list(); @@ -315,69 +292,61 @@ public TrialEnvironments getEnvironmentsForTraits(final List traitIds, } } catch (final HibernateException e) { - final String errorMessage = "Error at getEnvironmentForTraits at GeolocationDao: " + e.getMessage(); - GeolocationDao.LOG.error(errorMessage, e); + final String errorMessage = "Error at getEnvironmentForTraits at InstanceDao: " + e.getMessage(); + InstanceDao.LOG.error(errorMessage, e); throw new MiddlewareQueryException(errorMessage, e); } return environments; } - @SuppressWarnings("unchecked") - public Integer getLocationIdByProjectNameAndDescriptionAndProgramUUID( - final String projectName, - final String locationDescription, final String programUUID) { - try { - final String sql = "SELECT DISTINCT e.nd_geolocation_id" - + " FROM nd_experiment e" - + " INNER JOIN nd_geolocation g ON g.nd_geolocation_id = e.nd_geolocation_id" - + " INNER JOIN project p ON e.project_id = p.project_id " - + " INNER JOIN project st ON st.project_id = p.study_id " - + " WHERE st.name = :projectName" - + " and st.program_uuid = :programUUID" + " and g.description = :locationDescription"; - final Query query = this.getSession().createSQLQuery(sql); - query.setParameter("projectName", projectName); - query.setParameter("locationDescription", locationDescription); - query.setParameter("programUUID", programUUID); - final List list = query.list(); - if (list != null && !list.isEmpty()) { - return list.get(0); - } + public Integer getNextInstanceNumber(final Integer datasetId) { + final StringBuilder sb = new StringBuilder(); + sb.append("SELECT max(observation_unit_no) "); + sb.append(" FROM nd_experiment e "); + sb.append(" WHERE e.project_id = :datasetId and e.type_id = " ); + sb.append(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()); + final SQLQuery query = this.getSession().createSQLQuery(sb.toString()); + query.setParameter("datasetId", datasetId); + final Integer maxInstanceNumber = (Integer) query.uniqueResult(); + if (maxInstanceNumber != null) { + return maxInstanceNumber.intValue() + 1; + } + return 1; + } - } catch (final HibernateException e) { - final String errorMessage = "Error at getLocationIdByProjectNameAndDescription with project name =" - + projectName + " and location description = " + locationDescription - + GeolocationDao.AT_GEOLOCATION_DAO + e.getMessage(); - GeolocationDao.LOG.error(errorMessage, e); - throw new MiddlewareQueryException(errorMessage, e); + public Boolean instancesExist(final Set instanceIds) { + for (final Integer instanceId : instanceIds) { + if (this.getById(instanceId) == null) { + return Boolean.FALSE; + } } - return null; + return Boolean.TRUE; } public List getInstanceMetadata(final int studyId, final List locationIds) { - final String queryString = "select \n" + " geoloc.nd_geolocation_id as instanceDBId, \n" - + " geoloc.description as instanceNumber, \n" + " pmain.project_id trialDbId, \n" + final String queryString = "select \n" + " nde.nd_experiment_id as instanceDBId, \n" + + " nde.observation_unit_no as instanceNumber, \n" + " pmain.project_id trialDbId, \n" + " pmain.name as trialName, \n" + " proj.name as instanceDatasetName, \n" + " pmain.program_uuid as programDbId, \n" - + " max(if(geoprop.type_id = 8190, loc.lname, null)) as LOCATION_NAME, \n" - + " max(if(geoprop.type_id = 8190, geoprop.value, null)) as LOCATION_ID, \n" - + " max(if(geoprop.type_id = 8189, geoprop.value, null)) as LOCATION_ABBR, \n" - + " max(if(geoprop.type_id = 8370, geoprop.value, null)) as CROP_SEASON \n" + " from \n" - + " nd_geolocation geoloc \n" - + " inner join nd_experiment nde on nde.nd_geolocation_id = geoloc.nd_geolocation_id \n" + + " max(if(xprop.type_id = 8190, loc.lname, null)) as LOCATION_NAME, \n" + + " max(if(xprop.type_id = 8190, xprop.value, null)) as LOCATION_ID, \n" + + " max(if(xprop.type_id = 8189, xprop.value, null)) as LOCATION_ABBR, \n" + + " max(if(xprop.type_id = 8370, xprop.value, null)) as CROP_SEASON \n" + + " from nd_experiment nde \n" + " inner join project proj on proj.project_id = nde.project_id \n" + " inner join project pmain on pmain.project_id = proj.study_id \n" - + " left outer join nd_geolocationprop geoprop on geoprop.nd_geolocation_id = geoloc.nd_geolocation_id \n" - + " left outer join location loc on geoprop.value = loc.locid and geoprop.type_id = 8190 \n" - + " where nde.type_id = 1020 and pmain.project_id = :studyId \n"; + + " left join nd_experimentprop xprop on xprop.nd_experiment_id = nde.nd_experiment_id AND xprop.type_id = 8190\n" + + " left join location loc on xprop.value = loc.locid \n" + + " where nde.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + " and pmain.project_id = :studyId \n"; final StringBuilder strBuilder = new StringBuilder(queryString); final boolean locationFilterSpecified = !CollectionUtils.isEmpty(locationIds); if (locationFilterSpecified) { - strBuilder.append(" and geoprop.value in (:locationIds) "); + strBuilder.append(" and xprop.value in (:locationIds) "); } - strBuilder.append(" group by geoloc.nd_geolocation_id "); - strBuilder.append(" order by geoloc.nd_geolocation_id asc \n"); + strBuilder.append(" group by nde.nd_experiment_id "); + strBuilder.append(" order by nde.nd_experiment_id asc \n"); final SQLQuery query = this.getSession().createSQLQuery(strBuilder.toString()); query.setParameter("studyId", studyId); @@ -417,20 +386,19 @@ public List getInstanceMetadata(final int studyId, final List< return tiMetadata; } - public List getEnvironmentGeolocationsForInstances(final Integer studyId, final List instanceNumbers) { - List returnList = new ArrayList<>(); + public List getEnvironmentsForInstances(final Integer studyId, final List instanceNumbers) { + List returnList = new ArrayList<>(); if (studyId != null) { - final String sql = "SELECT DISTINCT g.* " + // - " FROM nd_geolocation g " + // - " INNER JOIN nd_experiment exp ON (exp.nd_geolocation_id = g.nd_geolocation_id) " + // - " INNER JOIN project envdataset on (envdataset.project_id = exp.project_ID) " + // + final String sql = "SELECT DISTINCT exp.* " + // + " FROM nd_experiment exp " + // + " INNER JOIN project envdataset on (envdataset.project_id = exp.project_id) " + // " WHERE envdataset.study_id = :studyId and envdataset.dataset_type_id = " + DatasetTypeEnum.SUMMARY_DATA.getId(); final StringBuilder sb = new StringBuilder(sql); if (!CollectionUtils.isEmpty(instanceNumbers)) { - sb.append(" AND g.description IN (:instanceNumbers)"); + sb.append(" AND exp.observation_unit_no IN (:instanceNumbers)"); } final SQLQuery query = this.getSession().createSQLQuery(sb.toString()); - query.addEntity("g", Geolocation.class); + query.addEntity("exp", ExperimentModel.class); query.setParameter("studyId", studyId); if (!CollectionUtils.isEmpty(instanceNumbers)) { query.setParameterList("instanceNumbers", instanceNumbers); @@ -441,37 +409,75 @@ public List getEnvironmentGeolocationsForInstances(final Integer st return returnList; } - - public List getEnvironmentGeolocations(final Integer studyId) { - return this.getEnvironmentGeolocationsForInstances(studyId, Collections.emptyList()); + public List getEnvironments(final Integer studyId) { + return this.getEnvironmentsForInstances(studyId, Collections.emptyList()); } - /** - * FIXME IBP-3472: make a single query - * - * @return TRUE if all of the instanceIds exists. Otherwise FALSE - */ - public Boolean instanceExists(final Set instanceIds) { - for (final Integer instanceId : instanceIds) { - if (this.getById(instanceId) == null) { - return Boolean.FALSE; + + @SuppressWarnings("unchecked") + public Integer getEnvironmentIdByStudyNameAndInstanceNumberAndProgramUUID( + final String projectName, + final Integer instanceNumber, final String programUUID) { + try { + final String sql = "SELECT DISTINCT e.nd_experiment_id" + + " FROM nd_experiment e " + + " INNER JOIN project p ON e.project_id = p.project_id " + + " INNER JOIN project st ON st.project_id = p.study_id " + + " WHERE st.name = :projectName" + + " and st.program_uuid = :programUUID" + " and e.observation_unit_no = :instanceNumber"; + final Query query = this.getSession().createSQLQuery(sql); + query.setParameter("projectName", projectName); + query.setParameter("instanceNumber", instanceNumber); + query.setParameter("programUUID", programUUID); + final List list = query.list(); + if (list != null && !list.isEmpty()) { + return list.get(0); } + + } catch (final HibernateException e) { + final String errorMessage = "Error at getEnvironmentIdByStudyNameAndInstanceNumberAndProgramUUID with project name =" + + projectName + " and instance number = " + instanceNumber + e.getMessage(); + InstanceDao.LOG.error(errorMessage, e); + throw new MiddlewareQueryException(errorMessage, e); } - return Boolean.TRUE; + return null; } - public Integer getNextInstanceNumber(final Integer datasetId) { + + public Map getExperimentIdEnvironmentMap(final Integer datasetId) { final StringBuilder sb = new StringBuilder(); - sb.append("SELECT max(cast(g.description as unsigned)) "); - sb.append(" FROM nd_geolocation g "); - sb.append(" INNER JOIN nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id "); - sb.append(" WHERE e.project_id = :datasetId" ); - final SQLQuery query = this.getSession().createSQLQuery(sb.toString()); - query.setParameter("datasetId", datasetId); - final BigInteger maxInstanceNumber = (BigInteger) query.uniqueResult(); - if (maxInstanceNumber != null) { - return maxInstanceNumber.intValue() + 1; + sb.append("select e.nd_experiment_id, env.nd_experiment_id as environmentId, env.observation_unit_no "); + sb.append("from nd_experiment e "); + sb.append("inner join project pr ON pr.project_id = e.project_id "); + sb.append("inner join project env_ds ON pr.study_id = env_ds.study_id and env_ds.dataset_type_id = "); + sb.append(DatasetTypeEnum.SUMMARY_DATA.getId()).append(" "); + sb.append("inner join nd_experiment env ON env.project_id = env_ds.project_id and env.type_id = "); + sb.append(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()).append(" "); + sb.append("inner join nd_experiment plot ON (plot.nd_experiment_id = e.nd_experiment_id OR plot.nd_experiment_id = e.parent_id) "); + sb.append(" and plot.parent_id = env.nd_experiment_id and plot.type_id = 1155 "); + sb.append("where e.project_id = :datasetId "); + + final SQLQuery createSQLQuery = this.getSession().createSQLQuery(sb.toString()); + createSQLQuery.addScalar("nd_experiment_id", new IntegerType()); + createSQLQuery.addScalar("environmentId", new IntegerType()); + createSQLQuery.addScalar("environmentId", new IntegerType()); + createSQLQuery.setParameter("datasetId", datasetId); + + final List results = createSQLQuery.list(); + final Map map = new HashMap<>(); + if (results != null && !results.isEmpty()) { + for (final Object[] row : results) { + final Integer environmentId = (Integer) row[1]; + final Integer instanceNumber = (Integer) row[2]; + final ExperimentModel experimentModel = new ExperimentModel(environmentId); + experimentModel.setObservationUnitNo(instanceNumber); + map.put((Integer) row[0], experimentModel); + } } - return 1; + return map; + } + + + } diff --git a/src/main/java/org/generationcp/middleware/dao/dms/ObservationUnitsSearchDao.java b/src/main/java/org/generationcp/middleware/dao/dms/ObservationUnitsSearchDao.java index 7218398fab..b147e32313 100644 --- a/src/main/java/org/generationcp/middleware/dao/dms/ObservationUnitsSearchDao.java +++ b/src/main/java/org/generationcp/middleware/dao/dms/ObservationUnitsSearchDao.java @@ -7,6 +7,7 @@ import org.generationcp.middleware.dao.GenericDAO; import org.generationcp.middleware.domain.oms.TermId; import org.generationcp.middleware.domain.ontology.VariableType; +import org.generationcp.middleware.enumeration.DatasetTypeEnum; import org.generationcp.middleware.exceptions.MiddlewareException; import org.generationcp.middleware.exceptions.MiddlewareQueryException; import org.generationcp.middleware.pojos.dms.ExperimentModel; @@ -25,6 +26,7 @@ import org.slf4j.LoggerFactory; import org.springframework.util.CollectionUtils; +import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -56,7 +58,7 @@ public class ObservationUnitsSearchDao extends GenericDAO factorsFilterMap = new HashMap<>(); private static final String ENVIRONMENT_COLUMN_NAME_SUFFIX = "_ENVIRONMENT"; @@ -68,30 +70,21 @@ public class ObservationUnitsSearchDao extends GenericDAO geolocSpecialFactorsMap = new HashMap<>(); - - static { - geolocSpecialFactorsMap.put("SITE_LAT", "gl.latitude"); - geolocSpecialFactorsMap.put("SITE_LONG", "gl.longitude"); - geolocSpecialFactorsMap.put("SITE_ALT", "gl.altitude"); - geolocSpecialFactorsMap.put("SITE_DATUM", "gl.geodetic_datum"); - } - private static final Map mainVariablesMap = new HashMap<>(); static { mainVariablesMap.put(OBSERVATION_UNIT_ID, " nde.nd_experiment_id as observationUnitId"); - mainVariablesMap.put(TRIAL_INSTANCE, " gl.description AS TRIAL_INSTANCE"); + mainVariablesMap.put(TRIAL_INSTANCE, " env.observation_unit_no AS TRIAL_INSTANCE"); mainVariablesMap.put(LOCATION_ID, - " (SELECT loc.lname FROM nd_geolocationprop gprop INNER JOIN location loc on loc.locid = gprop.value WHERE gprop.nd_geolocation_id = gl.nd_geolocation_id and gprop.type_id = 8190) 'LOCATION_ID'"); + " (SELECT loc.lname FROM nd_experimentprop xprop INNER JOIN location loc on loc.locid = xprop.value WHERE xprop.nd_experiment_id = env.nd_experiment_id and xprop.type_id = 8190) 'LOCATION_ID'"); mainVariablesMap.put(EXPT_DESIGN, - " (SELECT edesign.name FROM nd_geolocationprop gprop INNER JOIN cvterm edesign on edesign.cvterm_id = gprop.value WHERE gprop.nd_geolocation_id = gl.nd_geolocation_id and gprop.type_id = 8135) 'EXPT_DESIGN'"); + " (SELECT edesign.name FROM nd_experimentprop xprop INNER JOIN cvterm edesign on edesign.cvterm_id = xprop.value WHERE xprop.nd_experiment_id = env.nd_experiment_id and xprop.type_id = 8135) 'EXPT_DESIGN'"); mainVariablesMap.put(ENTRY_TYPE, " (SELECT iispcvt.definition FROM stockprop isp INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = isp.type_id INNER JOIN cvterm iispcvt ON iispcvt.cvterm_id = isp.value WHERE isp.stock_id = s.stock_id AND ispcvt.name = 'ENTRY_TYPE') AS ENTRY_TYPE"); mainVariablesMap.put(GID, " s.dbxref_id AS GID"); @@ -122,22 +115,18 @@ public class ObservationUnitsSearchDao extends GenericDAO getObservationUnitsByVariable(final ObservationU query.setParameter("instanceId", String.valueOf(params.getInstanceId())); } - if (!CollectionUtils.isEmpty(params.getEnvironmentConditions())) { - query.setParameter("datasetEnvironmentId", String.valueOf(params.getEnvironmentDatasetId())); - } - addFilteredValueParams(query, params.getFilter()); query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE); @@ -300,14 +293,14 @@ private String getObservationUnitsByVariableQuery(final ObservationUnitsSearchDT sql.append(" 1 FROM " // + " project p " // + " INNER JOIN nd_experiment nde ON nde.project_id = p.project_id " // - + " INNER JOIN nd_geolocation gl ON nde.nd_geolocation_id = gl.nd_geolocation_id " // - + " INNER JOIN stock s ON s.stock_id = nde.stock_id " // - + " LEFT JOIN phenotype ph ON nde.nd_experiment_id = ph.nd_experiment_id " // + + " INNER JOIN stock s ON s.stock_id = nde.stock_id "); + this.appendPlotAndEnvironmentExperimentJoins(searchDto.getSubobservationDataset(), sql); + sql.append(" LEFT JOIN phenotype ph ON nde.nd_experiment_id = ph.nd_experiment_id " // + " LEFT JOIN cvterm cvterm_variable ON cvterm_variable.cvterm_id = ph.observable_id " // + " WHERE p.project_id = :datasetId "); // if (searchDto.getInstanceId() != null) { - sql.append(" AND gl.nd_geolocation_id = :instanceId"); // + sql.append(" AND env.nd_experiment_id = :instanceId"); // } final ObservationUnitsSearchDTO.Filter filter = searchDto.getFilter(); @@ -397,10 +390,6 @@ private void setParameters(final ObservationUnitsSearchDTO searchDto, final SQLQ query.setParameter("instanceId", String.valueOf(searchDto.getInstanceId())); } - if (!CollectionUtils.isEmpty(searchDto.getEnvironmentConditions())) { - query.setParameter("datasetEnvironmentId", String.valueOf(searchDto.getEnvironmentDatasetId())); - } - addFilteredValueParams(query, searchDto.getFilter()); final Integer pageNumber = searchDto.getSortedRequest() != null ? searchDto.getSortedRequest().getPageNumber() : null; @@ -549,16 +538,9 @@ private String getObservationUnitTableQuery( // Only variables at observation level are supported in filtering columns. Variables at environment level are automatically excluded if filterColumns has values. if (noFilterVariables && !CollectionUtils.isEmpty(searchDto.getEnvironmentDetails())) { final String envFactorFormat = - " (SELECT gprop.value FROM nd_geolocationprop gprop INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = gprop.type_id AND ispcvt.name = '%s' WHERE gprop.nd_geolocation_id = gl.nd_geolocation_id ) '%s'"; - final String geolocEnvFactorFormat = - " %s AS '%s'"; + " (SELECT xprop.value FROM nd_experimentprop xprop INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = xprop.type_id AND ispcvt.name = '%s' WHERE xprop.nd_experiment_id = env.nd_experiment_id ) '%s'"; for (final MeasurementVariableDto envFactor : searchDto.getEnvironmentDetails()) { - if (geolocSpecialFactorsMap.containsKey(envFactor.getName())) { - final String column = geolocSpecialFactorsMap.get(envFactor.getName()); - columns.add(String.format(geolocEnvFactorFormat, column, this.getEnvironmentColumnName(envFactor.getName()))); - } else { - columns.add(String.format(envFactorFormat, envFactor.getName(), this.getEnvironmentColumnName(envFactor.getName()))); - } + columns.add(String.format(envFactorFormat, envFactor.getName(), this.getEnvironmentColumnName(envFactor.getName()))); } } @@ -567,8 +549,7 @@ private String getObservationUnitTableQuery( final String envConditionFormat = " (SELECT pheno.value from phenotype pheno " + " INNER JOIN cvterm envcvt ON envcvt.cvterm_id = pheno.observable_id AND envcvt.name = '%s' " - + " INNER JOIN nd_experiment envnde ON pheno.nd_experiment_id = envnde.nd_experiment_id AND envnde.project_id = :datasetEnvironmentId " - + " WHERE envnde.nd_geolocation_id = gl.nd_geolocation_id) '%s'"; + + " WHERE pheno.nd_experiment_id = env.nd_experiment_id) '%s'"; for (final MeasurementVariableDto envCondition : searchDto.getEnvironmentConditions()) { columns.add( String.format(envConditionFormat, envCondition.getName(), this.getEnvironmentColumnName(envCondition.getName()))); @@ -609,7 +590,6 @@ private void addFromClause(final StringBuilder sql, final ObservationUnitsSearch sql.append(" FROM " // + " project p " // + " INNER JOIN nd_experiment nde ON nde.project_id = p.project_id " // - + " INNER JOIN nd_geolocation gl ON nde.nd_geolocation_id = gl.nd_geolocation_id " // + " INNER JOIN stock s ON s.stock_id = nde.stock_id " // + " LEFT JOIN phenotype ph ON nde.nd_experiment_id = ph.nd_experiment_id " // + " LEFT JOIN cvterm cvterm_variable ON cvterm_variable.cvterm_id = ph.observable_id " // @@ -620,14 +600,13 @@ private void addFromClause(final StringBuilder sql, final ObservationUnitsSearch + " FROM nd_experiment child " // start the join with child to avoid parent_id full index scan + " LEFT JOIN sample child_sample ON child.nd_experiment_id = child_sample.nd_experiment_id " // + " INNER JOIN nd_experiment parent ON child.parent_id = parent.nd_experiment_id " // - + " GROUP BY parent.nd_experiment_id) child_sample_count ON child_sample_count.nd_experiment_id = nde.nd_experiment_id " // - // FIXME won't work for sub-sub-obs - + " INNER JOIN nd_experiment plot ON plot.nd_experiment_id = nde.parent_id OR ( plot.nd_experiment_id = nde.nd_experiment_id and nde.parent_id is null ) " - // - + " WHERE p.project_id = :datasetId "); // + + " GROUP BY parent.nd_experiment_id) child_sample_count ON child_sample_count.nd_experiment_id = nde.nd_experiment_id "); + + this.appendPlotAndEnvironmentExperimentJoins(searchDto.getSubobservationDataset(), sql); + sql.append(" WHERE p.project_id = :datasetId "); // if (searchDto.getInstanceId() != null) { - sql.append(" AND gl.nd_geolocation_id = :instanceId"); // + sql.append(" AND plot.parent_id = :instanceId"); // } if (Boolean.TRUE.equals(searchDto.getDraftMode())) { @@ -805,7 +784,7 @@ private void appendTraitValueFilteringToQuery(final StringBuilder sql, final Str private void applyFactorsFilter(final StringBuilder sql, final String variableId, final String variableType, final boolean performLikeOperation) { - // Check if the variable to be filtered is in one of the columns in stock, nd_experiment, geolocation or sum of samples + // Check if the variable to be filtered is in one of the columns in stock, nd_experiment, or sum of samples final String observationUnitClause = VariableType.OBSERVATION_UNIT.name().equals(variableType) ? "nde.observation_unit_no" : null; final String filterClause = factorsFilterMap.get(variableId); // Sum of Samples, whose Id is -2, will cause an error as query parameter. Remove the "-" from the ID as workaround @@ -1006,14 +985,13 @@ private ObservationUnitRow getObservationUnitRow(final ObservationUnitsSearchDTO observationUnitRow.setDesignation(designation); observationVariables.put(DESIGNATION, new ObservationUnitData(designation)); - final String trialInstance = (String) row.get(TRIAL_INSTANCE); - if (NumberUtils.isDigits(trialInstance)) { - observationUnitRow.setTrialInstance(Integer.valueOf(trialInstance)); - } - observationVariables.put(TRIAL_INSTANCE, new ObservationUnitData(trialInstance)); + final Integer trialInstance = (Integer) row.get(TRIAL_INSTANCE); + observationUnitRow.setTrialInstance(trialInstance); + + observationVariables.put(TRIAL_INSTANCE, new ObservationUnitData(String.valueOf(trialInstance))); final String entryNumber = (String) row.get(ENTRY_NO); - if (NumberUtils.isDigits(trialInstance)) { + if (trialInstance != null) { observationUnitRow.setEntryNumber(Integer.valueOf(entryNumber)); } observationVariables.put(ENTRY_NO, new ObservationUnitData(entryNumber)); @@ -1088,7 +1066,7 @@ private List> getObservationUnitTableAsMapListResult(final O } } - protected List> convertSelectionAndTraitColumnsValueType(final List> result, + List> convertSelectionAndTraitColumnsValueType(final List> result, final List selectionAndTraits) { final Iterator> iterator = result.iterator(); while (iterator.hasNext()) { diff --git a/src/main/java/org/generationcp/middleware/dao/dms/PhenotypeDao.java b/src/main/java/org/generationcp/middleware/dao/dms/PhenotypeDao.java index 418c8d964b..388b30134c 100644 --- a/src/main/java/org/generationcp/middleware/dao/dms/PhenotypeDao.java +++ b/src/main/java/org/generationcp/middleware/dao/dms/PhenotypeDao.java @@ -27,6 +27,8 @@ import org.generationcp.middleware.domain.h2h.TraitInfo; import org.generationcp.middleware.domain.h2h.TraitObservation; import org.generationcp.middleware.domain.oms.TermId; +import org.generationcp.middleware.domain.ontology.VariableType; +import org.generationcp.middleware.enumeration.DatasetTypeEnum; import org.generationcp.middleware.exceptions.MiddlewareQueryException; import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.pojos.dms.Phenotype; @@ -34,12 +36,9 @@ import org.generationcp.middleware.service.api.phenotype.PhenotypeSearchDTO; import org.generationcp.middleware.service.api.phenotype.PhenotypeSearchObservationDTO; import org.generationcp.middleware.service.api.phenotype.PhenotypeSearchRequestDTO; -import org.generationcp.middleware.service.api.study.SeasonDto; import org.generationcp.middleware.service.impl.study.PhenotypeQuery; import org.generationcp.middleware.util.Debug; -import org.generationcp.middleware.util.Util; import org.hibernate.Criteria; -import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.SQLQuery; @@ -65,6 +64,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; /** * DAO class for {@link Phenotype}. @@ -82,19 +82,7 @@ public class PhenotypeDao extends GenericDAO { private static final Logger LOG = LoggerFactory.getLogger(PhenotypeDao.class); - private static final String GET_OBSERVATIONS = "SELECT p.observable_id, s.dbxref_id, e.nd_geolocation_id, p.value " - + "FROM nd_experiment e " - + "INNER JOIN stock s ON e.stock_id = s.stock_id " - + "INNER JOIN phenotype p ON e.nd_experiment_id = p.nd_experiment_id " + "WHERE e.nd_geolocation_id IN (:environmentIds) " - + "AND p.observable_id IN (:traitIds) "; - - private static final String COUNT_OBSERVATIONS = - "SELECT COUNT(*) " + "FROM nd_experiment e " - + "INNER JOIN stock s ON e.stock_id = s.stock_id " - + "INNER JOIN phenotype p ON e.nd_experiment_id = p.nd_experiment_id " + "WHERE e.nd_geolocation_id IN (:environmentIds) " - + "AND p.observable_id IN (:traitIds) "; - - private static final String ORDER_BY_OBS = "ORDER BY p.observable_id, s.dbxref_id, e.nd_geolocation_id, p.value "; + private static final String ORDER_BY_OBS = "ORDER BY p.observable_id, s.dbxref_id, plot.parent_id, p.value "; //FIXME BMS-5055 private static final String HAS_OUT_OF_SYNC = "SELECT " @@ -123,14 +111,15 @@ public List getNumericTraitInfoList(final List enviro final List numericTraitInfoList = new ArrayList<>(); try { final SQLQuery query = this.getSession() - .createSQLQuery("SELECT p.observable_id, " + "COUNT(DISTINCT e.nd_geolocation_id) AS location_count, " + .createSQLQuery("SELECT p.observable_id, " + "COUNT(DISTINCT env.nd_experiment_id) AS location_count, " + "COUNT(DISTINCT s.dbxref_id) AS germplasm_count, " + "COUNT(DISTINCT e.nd_experiment_id) AS observation_count , " + "IF (MIN(p.value * 1) IS NULL, 0, MIN(p.value * 1)) AS min_value, " - + "IF (MAX(p.value * 1) IS NULL, 0, MAX(p.value * 1)) AS max_value " + "FROM phenotype p " - + " INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id " - + " INNER JOIN stock s ON e.stock_id = s.stock_id " + "WHERE e.nd_geolocation_id IN (:environmentIds) " - + " AND p.observable_id IN (:numericVariableIds) " + "GROUP by p.observable_id "); + + "IF (MAX(p.value * 1) IS NULL, 0, MAX(p.value * 1)) AS max_value " + + this.getPhenotypesInEnvironmentFromQuery(true) + + " WHERE env.nd_experiment_id IN (:environmentIds) " + + " AND p.observable_id IN (:numericVariableIds) " + + " GROUP by p.observable_id "); query.setParameterList("environmentIds", environmentIds); query.setParameterList("numericVariableIds", numericVariableIds); @@ -161,15 +150,37 @@ public List getNumericTraitInfoList(final List enviro } + private String getObservationsOnTraitsQuery() { + final StringBuilder sb = new StringBuilder(" SELECT p.observable_id, s.dbxref_id, env.nd_experiment_id, p.value "); + sb.append(this.getPhenotypesInEnvironmentFromQuery(true)); + sb.append(" WHERE env.nd_experiment_id IN (:environmentIds) "); + sb.append(" AND p.observable_id IN (:traitIds) "); + return sb.toString(); + } + + private String getPhenotypesInEnvironmentFromQuery(final boolean doJoinStockTable){ + final StringBuilder sb = new StringBuilder(" FROM phenotype p "); + sb.append(" INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id ") + .append(" LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = e.parent_id and plot.type_id = " + TermId.PLOT_EXPERIMENT.getId()) + .append(" INNER JOIN project pr ON pr.project_id = e.project_id ") + .append(" INNER JOIN project env_ds ON env_ds.study_id = pr.study_id AND env_ds.dataset_type_id = " + DatasetTypeEnum.SUMMARY_DATA.getId()) + .append(" INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()) + .append(" AND (e.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id) "); + if (doJoinStockTable) { + sb.append(" INNER JOIN stock s ON e.stock_id = s.stock_id "); + } + return sb.toString(); + } + public List getTraitInfoCounts(final List environmentIds, final List variableIds) { final List traitInfoList = new ArrayList<>(); try { final SQLQuery query = this.getSession() - .createSQLQuery("SELECT p.observable_id, " + "COUNT(DISTINCT e.nd_geolocation_id) AS location_count, " + .createSQLQuery("SELECT p.observable_id, " + "COUNT(DISTINCT env.nd_experiment_id) AS location_count, " + "COUNT(DISTINCT s.dbxref_id) AS germplasm_count, " - + "COUNT(DISTINCT e.nd_experiment_id) AS observation_count " + "FROM phenotype p " - + " INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id " - + " INNER JOIN stock s ON e.stock_id = s.stock_id " + "WHERE e.nd_geolocation_id IN (:environmentIds) " + + "COUNT(DISTINCT e.nd_experiment_id) AS observation_count " + + this.getPhenotypesInEnvironmentFromQuery(true) + + " WHERE env.nd_experiment_id IN (:environmentIds) " + " AND p.observable_id IN (:variableIds) " + "GROUP by p.observable_id "); query.setParameterList("environmentIds", environmentIds); query.setParameterList("variableIds", variableIds); @@ -197,53 +208,17 @@ public List getTraitInfoCounts(final List environmentIds, fi } - public List getTraitInfoCounts(final List environmentIds) { - final List traitInfoList = new ArrayList<>(); - try { - final SQLQuery query = this.getSession() - .createSQLQuery("SELECT p.observable_id, " + "COUNT(DISTINCT e.nd_geolocation_id) AS location_count, " - + "COUNT(DISTINCT s.dbxref_id) AS germplasm_count, " - + "COUNT(DISTINCT e.nd_experiment_id) AS observation_count " + "FROM phenotype p " - + " INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id " - + " INNER JOIN stock s ON e.stock_id = s.stock_id " + "WHERE e.nd_geolocation_id IN (:environmentIds) " - + "GROUP by p.observable_id "); - query.setParameterList("environmentIds", environmentIds); - - final List list = query.list(); - - for (final Object[] row : list) { - final Integer id = (Integer) row[0]; - final long locationCount = ((BigInteger) row[1]).longValue(); - final long germplasmCount = ((BigInteger) row[2]).longValue(); - final long observationCount = ((BigInteger) row[3]).longValue(); - - traitInfoList.add(new TraitInfo(id, null, null, locationCount, germplasmCount, observationCount)); - } - - } catch (final HibernateException e) { - throw new MiddlewareQueryException("Error at getTraitInfoCounts() query on PhenotypeDao: " + e.getMessage(), e); - } - - return traitInfoList; - - } - public Map> getNumericTraitInfoValues( final List environmentIds, - final List traitInfoList) { + final List traitIds) { final Map> traitValues = new HashMap<>(); - // Get trait IDs - final List traitIds = new ArrayList<>(); - for (final NumericTraitInfo trait : traitInfoList) { - traitIds.add(trait.getId()); - } - try { final SQLQuery query = this.getSession() - .createSQLQuery("SELECT p.observable_id, p.value * 1 " + "FROM phenotype p " - + " INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id " - + "WHERE e.nd_geolocation_id IN (:environmentIds) " + " AND p.observable_id IN (:traitIds) "); + .createSQLQuery("SELECT p.observable_id, p.value * 1 " + + this.getPhenotypesInEnvironmentFromQuery(false) + + " WHERE env.nd_experiment_id IN (:environmentIds) " + + " AND p.observable_id IN (:traitIds) "); query.setParameterList("environmentIds", environmentIds); query.setParameterList(TRAIT_IDS, traitIds); @@ -277,47 +252,6 @@ public Map> getNumericTraitInfoValues( } - public Map> getNumericTraitInfoValues(final List environmentIds, final Integer trait) { - final Map> traitValues = new HashMap<>(); - - try { - final SQLQuery query = this.getSession() - .createSQLQuery("SELECT p.observable_id, p.value * 1 " + "FROM phenotype p " - + " INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id " - + "WHERE e.nd_geolocation_id IN (:environmentIds) " + " AND p.observable_id = :traitId "); - query.setParameterList("environmentIds", environmentIds); - query.setParameter("traitId", trait); - - List list = new ArrayList<>(); - - if (!environmentIds.isEmpty()) { - list = query.list(); - } - - for (final Object[] row : list) { - final Integer traitId = (Integer) row[0]; - final Double value = (Double) row[1]; - - List values = new ArrayList<>(); - values.add(value); - // If the trait exists in the map, add the value found. Else, just add the pair. - if (traitValues.containsKey(traitId)) { - values = traitValues.get(traitId); - values.add(value); - traitValues.remove(traitId); - } - traitValues.put(traitId, values); - - } - - } catch (final HibernateException e) { - throw new MiddlewareQueryException("Error at getNumericTraitInfoValues() query on PhenotypeDao: " + e.getMessage(), e); - } - - return traitValues; - - } - public Map> getCharacterTraitInfoValues( final List environmentIds, final List traitInfoList) { @@ -325,16 +259,14 @@ public Map> getCharacterTraitInfoValues( final Map> traitValues = new HashMap<>(); // Get trait IDs - final List traitIds = new ArrayList<>(); - for (final CharacterTraitInfo trait : traitInfoList) { - traitIds.add(trait.getId()); - } + final List traitIds = traitInfoList.stream().map(CharacterTraitInfo::getId).collect(Collectors.toList()); try { final SQLQuery query = this.getSession() - .createSQLQuery("SELECT DISTINCT p.observable_id, p.value " + "FROM phenotype p " - + " INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id " - + "WHERE e.nd_geolocation_id IN (:environmentIds) " + " AND p.observable_id IN (:traitIds) " + .createSQLQuery("SELECT DISTINCT p.observable_id, p.value " + + this.getPhenotypesInEnvironmentFromQuery(false) + + " WHERE env.nd_experiment_id IN (:environmentIds) " + + " AND p.observable_id IN (:traitIds) " + "ORDER BY p.observable_id "); query.setParameterList("environmentIds", environmentIds); query.setParameterList(TRAIT_IDS, traitIds); @@ -370,17 +302,16 @@ public Map> getCharacterTraitInfoValues( public void setCategoricalTraitInfoValues(final List traitInfoList, final List environmentIds) { // Get trait IDs - final List traitIds = new ArrayList<>(); - for (final CategoricalTraitInfo trait : traitInfoList) { - traitIds.add(trait.getId()); - } + final List traitIds = traitInfoList.stream().map(CategoricalTraitInfo::getId).collect(Collectors.toList()); + try { final SQLQuery query = this.getSession() - .createSQLQuery("SELECT p.observable_id, p.cvalue_id, COUNT(p.phenotype_id) AS valuesCount " + "FROM phenotype p " - + "INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id " - + "WHERE p.cvalue_id IS NOT NULL AND p.observable_id IN (:traitIds) " - + " AND e.nd_geolocation_id IN (:environmentIds) " + "GROUP BY p.observable_id, p.cvalue_id "); + .createSQLQuery("SELECT p.observable_id, p.cvalue_id, COUNT(p.phenotype_id) AS valuesCount " + + this.getPhenotypesInEnvironmentFromQuery(false) + + " WHERE p.cvalue_id IS NOT NULL AND p.observable_id IN (:traitIds) " + + " AND env.nd_experiment_id IN (:environmentIds) " + + "GROUP BY p.observable_id, p.cvalue_id "); query.setParameterList(TRAIT_IDS, traitIds); query.setParameterList("environmentIds", environmentIds); @@ -397,7 +328,7 @@ public void setCategoricalTraitInfoValues(final List trait for (final CategoricalTraitInfo traitInfo : traitInfoList) { if (traitInfo.getId() == traitId) { - traitInfo.addValueCount(new CategoricalValue(cValueId), count.longValue()); + traitInfo.addValueCount(new CategoricalValue(cValueId), count); break; } } @@ -416,7 +347,7 @@ public List getObservationForTraitOnGermplasms( final List observationFinal = new ArrayList<>(); try { - final StringBuilder sb = new StringBuilder(PhenotypeDao.GET_OBSERVATIONS); + final StringBuilder sb = new StringBuilder(this.getObservationsOnTraitsQuery()); sb.append(" AND s.dbxref_id IN (:germplasmIds) "); sb.append(PhenotypeDao.ORDER_BY_OBS); final SQLQuery query = this.getSession().createSQLQuery(sb.toString()); @@ -448,18 +379,6 @@ public List getObservationForTraitOnGermplasms( return observationFinal; } - public long countObservationForTraits(final List traitIds, final List environmentIds) { - - try { - final SQLQuery query = this.getSession().createSQLQuery(PhenotypeDao.COUNT_OBSERVATIONS); - query.setParameterList(TRAIT_IDS, traitIds); - query.setParameterList("environmentIds", environmentIds); - return ((BigInteger) query.uniqueResult()).longValue(); - - } catch (final HibernateException e) { - throw new MiddlewareQueryException("Error at countObservationForTraits() query on PhenotypeDao: " + e.getMessage(), e); - } - } public List getObservationForTraits( final List traitIds, final List environmentIds, final int start, @@ -468,7 +387,7 @@ public List getObservationForTraits( final List toReturn = new ArrayList<>(); try { - final StringBuilder sb = new StringBuilder(PhenotypeDao.GET_OBSERVATIONS); + final StringBuilder sb = new StringBuilder(this.getObservationsOnTraitsQuery()); sb.append(PhenotypeDao.ORDER_BY_OBS); final SQLQuery query = this.getSession().createSQLQuery(sb.toString()); @@ -498,26 +417,24 @@ public List getObservationsForTrait(final int traitId, final L try { final StringBuilder queryString = new StringBuilder(); - queryString.append("SELECT p.observable_id, p.value, s.dbxref_id, e.nd_experiment_id, l.lname, gp.value as locationId "); - queryString.append("FROM phenotype p "); - queryString.append("INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id "); - queryString.append("INNER JOIN nd_geolocationprop gp ON gp.nd_geolocation_id = e.nd_geolocation_id AND gp.type_id = " + queryString.append("SELECT p.observable_id, p.value, s.dbxref_id, e.nd_experiment_id, l.lname, xp.value as locationId "); + queryString.append(this.getPhenotypesInEnvironmentFromQuery(true)); + queryString.append(" INNER JOIN nd_experimentprop xp ON xp.nd_experiment_id = env.nd_experiment_id AND xp.type_id = " + TermId.LOCATION_ID.getId() + " "); - queryString.append(" LEFT JOIN location l ON l.locid = gp.value "); - queryString.append("INNER JOIN stock s ON s.stock_id = e.stock_id "); - queryString.append("WHERE p.observable_id = :traitId AND e.nd_geolocation_id IN ( :environmentIds ) "); + queryString.append(" LEFT JOIN location l ON l.locid = xp.value "); + queryString.append(" WHERE p.observable_id = :traitId AND env.nd_experiment_id IN (:environmentIds ) "); queryString.append("ORDER BY s.dbxref_id "); PhenotypeDao.LOG.debug(queryString.toString()); final SQLQuery query = this.getSession().createSQLQuery(queryString.toString()); query.setParameter("traitId", traitId).setParameterList("environmentIds", environmentIds); - query.addScalar("observable_id", Hibernate.INTEGER); - query.addScalar("value", Hibernate.STRING); - query.addScalar("dbxref_id", Hibernate.INTEGER); - query.addScalar("nd_experiment_id", Hibernate.INTEGER); - query.addScalar("lname", Hibernate.STRING); - query.addScalar("locationId", Hibernate.INTEGER); + query.addScalar("observable_id", new IntegerType()); + query.addScalar("value", new StringType()); + query.addScalar("dbxref_id", new IntegerType()); + query.addScalar("nd_experiment_id", new IntegerType()); + query.addScalar("lname", new StringType()); + query.addScalar("locationId", new IntegerType()); final List list = query.list(); @@ -539,7 +456,7 @@ public List getObservationsForTrait(final int traitId, final L return traitObservationList; } - public List getEnvironmentTraits(final Set trialEnvironments, final List experimentTypes) { + public List getEnvironmentTraits(final Set trialEnvironments, final List experimentTypes, final String programUUID) { final List environmentDetails = new ArrayList<>(); if (trialEnvironments.isEmpty()) { @@ -553,22 +470,29 @@ public List getEnvironmentTraits(final Set t final StringBuilder sql = new StringBuilder() .append( - "SELECT DISTINCT e.nd_geolocation_id as nd_geolocation_id, p.observable_id as observable_id, trait.name as name, property.name as property, trait.definition as definition, c_scale.name as scale, cr_type.object_id as object_id ") - .append(" FROM phenotype p ") - .append( - " INNER JOIN nd_experiment e ON p.nd_experiment_id = e.nd_experiment_id AND e.nd_geolocation_id IN (:environmentIds) AND e.type_id in (:experimentTypes)") - .append(" LEFT JOIN cvterm_relationship cr_scale ON p.observable_id = cr_scale.subject_id AND cr_scale.type_id = 1220 ") + " SELECT DISTINCT env.nd_experiment_id as environmentId, pp.variable_id as observable_id, trait.name as name, property.name as property, trait.definition as definition, c_scale.name as scale, cr_type.object_id as object_id ") + .append(" FROM nd_experiment e ") + .append(" LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = e.parent_id and plot.type_id = 1155 ") + .append(" INNER JOIN project pr ON pr.project_id = e.project_id ") + .append(" INNER JOIN project env_ds ON env_ds.study_id = pr.study_id AND env_ds.dataset_type_id = ") + .append(DatasetTypeEnum.SUMMARY_DATA.getId()).append(" ") + .append(" INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = 1020 AND env.nd_experiment_id IN (:environmentIds) ") + // handle cases for with/without plot and with/without sub-observations + .append(" AND (e.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id) ") + .append(" INNER JOIN projectprop pp on e.project_id = pp.project_id and pp.type_id = " + VariableType.TRAIT.getId()) + .append(" LEFT JOIN cvterm_relationship cr_scale ON pp.variable_id = cr_scale.subject_id AND cr_scale.type_id = 1220 ") .append(" LEFT JOIN cvterm_relationship cr_type ON cr_type.subject_id = cr_scale.object_id AND cr_type.type_id = 1105 ") - .append( - " LEFT JOIN cvterm_relationship cr_property ON p.observable_id = cr_property.subject_id AND cr_property.type_id = 1200 ") + .append(" LEFT JOIN cvterm_relationship cr_property ON pp.variable_id = cr_property.subject_id AND cr_property.type_id = 1200 ") .append(" LEFT JOIN cvterm c_scale ON c_scale.cvterm_id = cr_scale.object_id ") - .append(" LEFT JOIN cvterm trait ON trait.cvterm_id = p.observable_id ") - .append(" LEFT JOIN cvterm property ON property.cvterm_id = cr_property.object_id "); - + .append(" LEFT JOIN cvterm trait ON trait.cvterm_id = pp.variable_id ") + .append(" LEFT JOIN cvterm property ON property.cvterm_id = cr_property.object_id ") + .append(" WHERE e.type_id IN (:experimentTypes) AND pr.program_uuid = :programUUID ") + .append(" AND EXISTS (select 1 from phenotype ph where ph.observable_id = pp.variable_id and ph.nd_experiment_id = e.nd_experiment_id) "); try { - final Query query = this.getSession().createSQLQuery(sql.toString()).addScalar("nd_geolocation_id").addScalar("observable_id") + final Query query = this.getSession().createSQLQuery(sql.toString()).addScalar("environmentId").addScalar("observable_id") .addScalar("name").addScalar("property").addScalar("definition").addScalar("scale").addScalar("object_id") + .setParameter("programUUID", programUUID) .setParameterList("environmentIds", environmentIds).setParameterList("experimentTypes", experimentTypes); final List result = query.list(); @@ -595,30 +519,6 @@ public List getEnvironmentTraits(final Set t return environmentDetails; } - public void deletePhenotypesByProjectIdAndLocationId(final Integer projectId, final Integer locationId) { - try { - // Please note we are manually flushing because non hibernate based deletes and updates causes the Hibernate session to get out - // of synch with - // underlying database. Thus flushing to force Hibernate to synchronize with the underlying database before the delete - // statement - this.getSession().flush(); - - // Delete phenotypes - final String sql = "delete pheno " + " from nd_experiment e," - + " phenotype pheno" + " where e.project_id = :projectId " - + " and e.nd_geolocation_id = :locationId " - + " and e.nd_experiment_id = pheno.nd_experiment_id"; - final SQLQuery statement = this.getSession().createSQLQuery(sql); - statement.setParameter("projectId", projectId); - statement.setParameter("locationId", locationId); - statement.executeUpdate(); - - } catch (final HibernateException e) { - throw new MiddlewareQueryException("Error in deletePhenotypesByProjectIdAndLocationId=" + projectId + ", " + locationId - + IN_PHENOTYPE_DAO + e.getMessage(), e); - } - } - public void deletePhenotypesByProjectIdAndVariableIds(final Integer projectId, final List variableIds) { try { // Delete phenotypes @@ -662,7 +562,7 @@ public int updatePhenotypesByExperimentIdAndObervableId(final Integer experiment } public List getPhenotypeIdsByLocationAndPlotNo( - final Integer projectId, final Integer locationId, final Integer plotNo, + final Integer projectId, final boolean isSubObservation, final Integer locationId, final Integer plotNo, final List cvTermIds) { try { if (cvTermIds.isEmpty()) { @@ -673,8 +573,9 @@ public List getPhenotypeIdsByLocationAndPlotNo( final String sql = "SELECT expprop.value, pheno.observable_id, pheno.phenotype_id FROM " + "nd_experiment exp " + "INNER JOIN nd_experimentprop expprop ON expprop.nd_experiment_id = exp.nd_experiment_id " - + "INNER JOIN phenotype pheno ON exp.nd_experiment_id = pheno.nd_experiment_id " + "WHERE exp.project_id = :projectId " - + "AND exp.nd_geolocation_id = :locationId " + "AND pheno.observable_id IN (:cvTermIds) " + + this.getPlotExperimentJoin(isSubObservation, "exp") + + " WHERE exp.project_id = :projectId " + + "AND plot.parent_id = :locationId " + "AND pheno.observable_id IN (:cvTermIds) " + "AND expprop.value = :plotNo " + "AND exp.type_id = 1155 " + "AND expprop.type_id in (8200, 8380)"; final SQLQuery statement = this.getSession().createSQLQuery(sql); @@ -883,14 +784,18 @@ public Boolean containsAtLeast2CommonEntriesWithValues(final int projectId, fina final StringBuilder sql = new StringBuilder().append(" SELECT phenotype.observable_id,count(phenotype.observable_id) ") .append(" FROM nd_experiment nd_exp ") .append(" INNER JOIN stock ON nd_exp.stock_id = stock.stock_id ") - .append(" LEFT JOIN phenotype ON nd_exp.nd_experiment_id = phenotype.nd_experiment_id ").append(" where nd_exp.project_id = ") - .append(projectId).append(" and nd_exp.nd_geolocation_id = ").append(locationId) + .append(" LEFT JOIN phenotype ON nd_exp.nd_experiment_id = phenotype.nd_experiment_id ") + .append(" where nd_exp.project_id = :projectId") + .append(" and nd_exp.parent_id = :environmentId") .append(" and ((phenotype.value <> '' and phenotype.value is not null) or ") - .append(" (phenotype.cvalue_id <> '' and phenotype.cvalue_id is not null)) ").append(" group by nd_exp.nd_geolocation_id, ") + .append(" (phenotype.cvalue_id <> '' and phenotype.cvalue_id is not null)) ") + .append(" group by nd_exp.parent_id, ") .append(groupByGermplasm).append(" , phenotype.observable_id ") .append(" having count(phenotype.observable_id) >= 2 LIMIT 1 "); final SQLQuery query = this.getSession().createSQLQuery(sql.toString()); + query.setParameter("projectId", projectId); + query.setParameter("environmentId", locationId); return !query.list().isEmpty(); } @@ -932,18 +837,17 @@ public List searchPhenotypes( final PhenotypeSearchDTO observationUnit = new PhenotypeSearchDTO(); final Integer ndExperimentId = (Integer) row[0]; - observationUnit.setObservationUnitDbId((String) row[1]); // OBS_UNIT_ID - observationUnit.setObservationUnitName((String) row[2]); - observationUnit.setObservationLevel((String) row[3]); + observationUnit.setObservationUnitDbId(String.valueOf(row[1])); // OBS_UNIT_ID + observationUnit.setObservationUnitName(String.valueOf(row[2])); + observationUnit.setObservationLevel(String.valueOf(row[3])); observationUnit.setObservationLevels("1"); - observationUnit.setPlantNumber((String) row[4]); - observationUnit.setGermplasmDbId((String) row[5]); - observationUnit.setGermplasmName((String) row[6]); - observationUnit.setInstanceNumber((String) row[7]); - observationUnit.setStudyDbId((String) row[8]); - observationUnit.setStudyName((String) row[9]); - observationUnit.setProgramName((String) row[10]); - + observationUnit.setPlantNumber(String.valueOf(row[4])); + observationUnit.setGermplasmDbId(String.valueOf(row[5])); + observationUnit.setGermplasmName(String.valueOf(row[6])); + observationUnit.setInstanceNumber(String.valueOf(row[7])); + observationUnit.setStudyDbId(String.valueOf(row[8])); + observationUnit.setStudyName(String.valueOf(row[9])); + observationUnit.setProgramName(String.valueOf(row[10])); String x = row[16] != null ? (String) row[16] : null; // ROW String y = row[17] != null ? (String) row[17] : null; // COL if (StringUtils.isBlank(x) || StringUtils.isBlank(y)) { @@ -954,13 +858,13 @@ public List searchPhenotypes( observationUnit.setY(y); observationUnit.setPositionCoordinateX(x); observationUnit.setPositionCoordinateY(y); - observationUnit.setPlotNumber((String) row[13]); - observationUnit.setBlockNumber((String) row[14]); - observationUnit.setReplicate((String) row[15]); - observationUnit.setStudyLocationDbId((String) row[18]); - observationUnit.setStudyLocation((String) row[19]); - observationUnit.setEntryType((String) row[20]); - observationUnit.setEntryNumber((String) row[21]); + observationUnit.setPlotNumber(String.valueOf(row[13])); + observationUnit.setBlockNumber(String.valueOf(row[14])); + observationUnit.setReplicate(String.valueOf(row[15])); + observationUnit.setStudyLocationDbId(String.valueOf(row[18])); + observationUnit.setStudyLocation(String.valueOf(row[19])); + observationUnit.setEntryType(String.valueOf(row[20])); + observationUnit.setEntryNumber(String.valueOf(row[21])); observationUnit.setAdditionalInfo(""); observationUnit.setLocationDbId(observationUnit.getStudyLocationDbId()); @@ -984,16 +888,16 @@ public List searchPhenotypes( try { final HashMap jsonProp = new ObjectMapper().readValue(jsonProps, HashMap.class); observationUnitPosition.setGeoCoordinates((Map) jsonProp.get("geoCoordinates")); - } catch (IOException e) { + } catch (final IOException e) { LOG.error("couldn't parse json_props column for observationUnitDbId=" + observationUnit.getObservationUnitDbId(), e); } } observationUnitPosition.setReplicate(observationUnit.getReplicate()); observationUnit.setObservationUnitPosition(observationUnitPosition); - observationUnit.setProgramDbId((String) row[22]); - observationUnit.setTrialDbId((String) row[23]); - observationUnit.setTrialName((String) row[24]); + observationUnit.setProgramDbId(String.valueOf(row[22])); + observationUnit.setTrialDbId(String.valueOf(row[23])); + observationUnit.setTrialName(String.valueOf(row[24])); observationUnitsByNdExpId.put(ndExperimentId, observationUnit); } @@ -1011,11 +915,11 @@ public List searchPhenotypes( final PhenotypeSearchObservationDTO observation = new PhenotypeSearchObservationDTO(); final String variableId = - (result[5] != null && !((String) result[5]).isEmpty()) ? (String) result[5] : String.valueOf(result[2]); + (result[5] != null && !(String.valueOf(result[5])).isEmpty()) ? String.valueOf(result[5]) : String.valueOf(result[2]); observation.setObservationVariableDbId(variableId); - observation.setObservationVariableName((String) result[3]); + observation.setObservationVariableName(String.valueOf(result[3])); observation.setObservationDbId(String.valueOf((Integer) result[1])); - observation.setValue((String) result[4]); + observation.setValue(String.valueOf(result[4])); observation.setObservationTimeStamp((Date) result[6]); // TODO observation.setCollector(StringUtils.EMPTY); @@ -1031,8 +935,8 @@ public List searchPhenotypes( final List treatmentFactorsResults = treatmentFactorsQuery.list(); for (final Object[] result : treatmentFactorsResults) { - final String factor = (String) result[0]; - final String modality = (String) result[1]; + final String factor = String.valueOf(result[0]); + final String modality = String.valueOf(result[1]); final Integer ndExperimentId = (Integer) result[2]; final PhenotypeSearchDTO.Treatment treatment = new PhenotypeSearchDTO.Treatment(); treatment.setFactor(factor); @@ -1158,17 +1062,27 @@ public long countPhenotypesForDataset(final Integer datasetId, final List experimentIds, final Se statement.executeUpdate(); } - public void updateOutOfSyncPhenotypesByGeolocation(final int geoLocationId, final Set targetVariableIds) { + public void updateOutOfSyncPhenotypesByEnvironment(final int environmentId, final Set targetVariableIds) { final String sql = "UPDATE nd_experiment experiment\n" + "LEFT JOIN nd_experiment experimentParent ON experimentParent.nd_experiment_id = experiment.parent_id\n" + "INNER JOIN phenotype pheno ON pheno.nd_experiment_id = experimentParent.nd_experiment_id OR pheno.nd_experiment_id = experiment.nd_experiment_id\n" + "SET pheno.status = :status \n" - + "WHERE experiment.nd_geolocation_id = :geoLocationId AND pheno.observable_id in (:variableIds) ;"; + + "WHERE experiment.parent_id = :environmentId AND pheno.observable_id in (:variableIds);"; final SQLQuery statement = this.getSession().createSQLQuery(sql); statement.setParameter("status", Phenotype.ValueStatus.OUT_OF_SYNC.getName()); - statement.setParameter("geoLocationId", geoLocationId); + statement.setParameter("environmentId", environmentId); statement.setParameterList("variableIds", targetVariableIds); statement.executeUpdate(); } @@ -1253,11 +1167,23 @@ public Phenotype getPhenotype(final Integer experimentId, final Integer phenotyp } public List getPhenotypeByDatasetIdAndInstanceDbId(final Integer datasetId, final Integer instanceDbId) { - final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); - criteria.createAlias("experiment", "experiment"); - criteria.add(Restrictions.eq("experiment.project.projectId", datasetId)); - criteria.add(Restrictions.eq("experiment.geoLocation.locationId", instanceDbId)); - return criteria.list(); + final Query query = + this.getSession() + .createSQLQuery( + "select p.* " + + " from phenotype p " + + " INNER JOIN nd_experiment e ON p.nd_experiment_id = e.nd_experiment_id " + + " LEFT JOIN nd_experiment level2 ON level2.nd_experiment_id = e.parent_id " + + " LEFT JOIN nd_experiment level3 ON level3.nd_experiment_id = level2.parent_id " + + " WHERE e.project_id = :projectId AND " + + "(CASE " + + " WHEN level3.nd_experiment_id IS NULL AND level2.nd_experiment_id IS NULL THEN e.nd_experiment_id " + + " WHEN level3.nd_experiment_id IS NULL THEN level2.nd_experiment_id ELSE level3.nd_experiment_id " + + "END) = :instanceId") + .addEntity(Phenotype.class); + query.setParameter("projectId", datasetId); + query.setParameter("instanceId", instanceDbId); + return query.list(); } @SuppressWarnings("Duplicates") @@ -1285,8 +1211,7 @@ public Long countPendingDataOfDataset(final Integer datasetId) { final Criterion draftCValueId = Restrictions.isNotNull("draftCValueId"); criteria.add(Restrictions.or(draftValue, draftCValueId)); criteria.setProjection(Projections.rowCount()); - final Long count = (Long) criteria.uniqueResult(); - return count; + return (Long) criteria.uniqueResult(); } public Map countOutOfSyncDataOfDatasetsInStudy(final Integer studyId) { @@ -1345,27 +1270,27 @@ public List getPhenotypes(final Integer datasetId) { return criteria.list(); } - public List getEnvironmentConditionVariablesByGeoLocationIdAndVariableIds(Integer geolocationId, List variableIds) { - List studyVariables = new ArrayList<>(); + public List getEnvironmentConditionVariables(final Integer environmentId) { + final List studyVariables = new ArrayList<>(); try{ final SQLQuery query = - this.getSession().createSQLQuery("SELECT envcvt.name AS name, envcvt.definition AS definition, " - + " cvt_scale.name AS scaleName, pheno.value AS value from phenotype pheno " - + " INNER JOIN cvterm envcvt ON envcvt.cvterm_id = pheno.observable_id AND envcvt.cvterm_id IN (:variableIds) " + this.getSession().createSQLQuery("SELECT envcvt.name AS name, envcvt.definition AS definition, " + + " cvt_scale.name AS scaleName, pheno.value AS value " + + " FROM phenotype pheno " + + " INNER JOIN cvterm envcvt ON envcvt.cvterm_id = pheno.observable_id " + " INNER JOIN cvterm_relationship cvt_rel ON cvt_rel.subject_id = envcvt.cvterm_id AND cvt_rel.type_id = " + TermId.HAS_SCALE.getId() + " INNER JOIN cvterm cvt_scale ON cvt_scale.cvterm_id = cvt_rel.object_id\n" - + " INNER JOIN nd_experiment envnde ON pheno.nd_experiment_id = envnde.nd_experiment_id\n" - + " INNER JOIN nd_geolocation gl ON envnde.nd_geolocation_id = gl.nd_geolocation_id AND gl.nd_geolocation_id = :geolocationId ;"); + + " INNER JOIN nd_experiment env ON pheno.nd_experiment_id = env.nd_experiment_id\n" + + " WHERE env.nd_experiment_id = :environmentId AND env.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + " ;"); query.addScalar("name", new StringType()); query.addScalar("definition", new StringType()); query.addScalar("scaleName", new StringType()); query.addScalar("value", new StringType()); - query.setParameterList("variableIds", variableIds); - query.setParameter("geolocationId", geolocationId); + query.setParameter("environmentId", environmentId); final List results = query.list(); - for(Object result: results) { + for(final Object result: results) { final Object[] row = (Object[]) result; final MeasurementVariable measurementVariable = new MeasurementVariable(); measurementVariable.setName((row[0] instanceof String) ? (String) row[0] : null); @@ -1375,8 +1300,7 @@ public List getEnvironmentConditionVariablesByGeoLocationId studyVariables.add(measurementVariable); } } catch (final MiddlewareQueryException e) { - final String message = "Error with getEnvironmentConditionVariablesByGeoLocationIdAndVariableIds() query from geolocationId: " + geolocationId - + " and variableIds: " + variableIds; + final String message = "Error with getEnvironmentConditionVariables() query from environmentId: " + environmentId; PhenotypeDao.LOG.error(message, e); throw new MiddlewareQueryException(message, e); } diff --git a/src/main/java/org/generationcp/middleware/dao/dms/StockDao.java b/src/main/java/org/generationcp/middleware/dao/dms/StockDao.java index 0ac83dad2f..7399c7e26c 100644 --- a/src/main/java/org/generationcp/middleware/dao/dms/StockDao.java +++ b/src/main/java/org/generationcp/middleware/dao/dms/StockDao.java @@ -48,7 +48,7 @@ public class StockDao extends GenericDAO { static final String DBXREF_ID = "dbxrefId"; @SuppressWarnings("unchecked") - public List getStockIdsByProperty(final String columnName, final String value) { + List getStockIdsByProperty(final String columnName, final String value) { final List stockIds; try { final Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); @@ -67,7 +67,7 @@ public List getStockIdsByProperty(final String columnName, final String return stockIds; } - public long countStudiesByGid(final int gid) { + long countStudiesByGid(final int gid) { try { final SQLQuery query = this.getSession() @@ -145,15 +145,20 @@ public Set findInDataSet(final int datasetId) { return stockModels; } - public long countStocks(final int datasetId, final int trialEnvironmentId, final int variateStdVarId) { + public long countStocks(final int datasetId, final int trialEnvironmentId, final int traitId) { try { - + // Dataset ID can be for means or plot dataset type final String sql = "select count(distinct e.stock_id) " - + "from nd_experiment e, phenotype p " - + "where e.nd_experiment_id = p.nd_experiment_id " - + " and e.nd_geolocation_id = " + trialEnvironmentId + " and p.observable_id = " + variateStdVarId - + " and e.project_id = " + datasetId; + + "from nd_experiment e " + + " inner join phenotype p ON e.nd_experiment_id = p.nd_experiment_id " + + " inner join nd_experiment env ON env.nd_experiment_id = e.parent_id AND env.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + + " WHERE env.nd_experiment_id = :environmentId and p.observable_id = :traitId " + + " and e.project_id = :datasetId "; final Query query = this.getSession().createSQLQuery(sql); + query.setParameter("environmentId", trialEnvironmentId); + query.setParameter("datasetId", datasetId); + query.setParameter("traitId", traitId); + return ((BigInteger) query.uniqueResult()).longValue(); diff --git a/src/main/java/org/generationcp/middleware/dao/dms/StudySearchDao.java b/src/main/java/org/generationcp/middleware/dao/dms/StudySearchDao.java index 25b8ecba52..bd45ae8286 100644 --- a/src/main/java/org/generationcp/middleware/dao/dms/StudySearchDao.java +++ b/src/main/java/org/generationcp/middleware/dao/dms/StudySearchDao.java @@ -79,7 +79,7 @@ public List searchStudies(final BrowseStudyQueryFilter filter, f } @SuppressWarnings("unchecked") - public List getStudiesByName(final String name, final StudySearchMatchingOption studySearchMatchingOption, + List getStudiesByName(final String name, final StudySearchMatchingOption studySearchMatchingOption, final String programUUID) { final List studyReferences = new ArrayList<>(); if (name != null && !name.isEmpty()) { @@ -175,7 +175,7 @@ private String getSearchByStartDateMainQuery() { } @SuppressWarnings("unchecked") - public List getStudiesBySeason(final Season season, final String programUUID) { + List getStudiesBySeason(final Season season, final String programUUID) { final List studyReferences = new ArrayList<>(); if (season != null) { @@ -216,8 +216,8 @@ private String getSearchBySeasonAtEnvironmentLevelMainQuery() { + " INNER JOIN project ds ON ds.study_id = p.project_id" + " INNER JOIN nd_experiment e ON e.project_id = ds.project_id and e.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() - + " INNER JOIN nd_geolocationprop gp on gp.nd_geolocation_id = e.nd_geolocation_id AND gp.type_id = " - + TermId.SEASON_VAR.getId() + " WHERE p.program_uuid = :programUUID AND gp.value = :seasonId " + + " INNER JOIN nd_experimentprop xp ON xp.nd_experiment_id = e.nd_experiment_id AND xp.type_id = " + + TermId.SEASON_VAR.getId() + " WHERE p.program_uuid = :programUUID AND xp.value = :seasonId " + StudySearchDao.NOT_IN_DELETED_STUDIES_QUERY + StudySearchDao.HAS_STUDY_TYPE; } @@ -229,7 +229,7 @@ private String getSearchBySeasonAtStudyLevelMainQuery() { } @SuppressWarnings("unchecked") - public List getStudiesByLocationIds(final List locationIds, final String programUUID) { + List getStudiesByLocationIds(final List locationIds, final String programUUID) { final List studyReferences = new ArrayList<>(); if (!locationIds.isEmpty()) { try { @@ -260,8 +260,8 @@ private String getSearchByLocationAtEnvironmentLevelMainQuery(final List getCategoriesUsedInStudies(final int scaleId) { try { final List allCategories = new ArrayList<>(); - allCategories.addAll(getScaleCategoriesUsedInObservations(scaleId)); - allCategories.addAll(getScaleCategoriesUsedAsConditions(scaleId)); - allCategories.addAll(getScaleCategoriesUsedAsGermplasmDescriptors(scaleId)); - allCategories.addAll(getScaleCategoriesUsedAsTrialDesignFactors(scaleId)); - allCategories.addAll(getScaleCategoriesUsedAsEnvironmentFactors(scaleId)); + allCategories.addAll(this.getScaleCategoriesUsedInObservations(scaleId)); + allCategories.addAll(this.getScaleCategoriesUsedAsConditions(scaleId)); + allCategories.addAll(this.getScaleCategoriesUsedAsGermplasmDescriptors(scaleId)); + allCategories.addAll(this.getScaleCategoriesUsedAsTrialDesignFactors(scaleId)); return allCategories; } catch (final HibernateException e) { final String message = "Error in getCategoriesUsedInStudies in CVTermRelationshipDao: " @@ -282,12 +281,12 @@ public List getCategoriesUsedInStudies(final int scaleId) { } @SuppressWarnings("unchecked") - protected List getScaleCategoriesUsedInObservations(final int scaleId) { + List getScaleCategoriesUsedInObservations(final int scaleId) { final SQLQuery query = this.getSession().createSQLQuery( "SELECT v.name category " + " FROM cvterm_relationship scale_values " + " INNER JOIN cvterm v ON v.cvterm_id = scale_values.object_id " - + " WHERE scale_values.subject_id = :scaleId AND scale_values.type_id = " + TermId.HAS_VALUE.getId() + + " WHERE scale_values.subject_id = :scaleId AND scale_values.type_id = " + TermId.HAS_VALUE.getId() + " AND EXISTS ( " + " SELECT 1 " + " FROM phenotype p " @@ -301,13 +300,13 @@ protected List getScaleCategoriesUsedInObservations(final int scaleId) { } @SuppressWarnings("unchecked") - protected List getScaleCategoriesUsedAsConditions(final int scaleId) { + List getScaleCategoriesUsedAsConditions(final int scaleId) { final SQLQuery query = this.getSession().createSQLQuery( "SELECT categ.name category " + " FROM cvterm_relationship scale_values " + " INNER JOIN cvterm categ ON categ.cvterm_id = scale_values.object_id " - + " INNER JOIN cvterm_relationship var ON var.object_id = scale_values.subject_id and var.type_id = " + TermId.HAS_SCALE.getId() - + " WHERE scale_values.subject_id = :scaleId AND scale_values.type_id = " + TermId.HAS_VALUE.getId() + + " INNER JOIN cvterm_relationship var ON var.object_id = scale_values.subject_id and var.type_id = " + TermId.HAS_SCALE.getId() + + " WHERE scale_values.subject_id = :scaleId AND scale_values.type_id = " + TermId.HAS_VALUE.getId() + " AND EXISTS ( " + " SELECT 1 " + " FROM projectprop pp " @@ -317,14 +316,14 @@ protected List getScaleCategoriesUsedAsConditions(final int scaleId) { query.addScalar("category", CVTermRelationshipDao.STRING); return query.list(); } - + @SuppressWarnings("unchecked") - protected List getScaleCategoriesUsedAsGermplasmDescriptors(final int scaleId) { + List getScaleCategoriesUsedAsGermplasmDescriptors(final int scaleId) { final SQLQuery query = this.getSession().createSQLQuery( "SELECT categ.name category " + " FROM cvterm_relationship scale_values " + " INNER JOIN cvterm categ ON categ.cvterm_id = scale_values.object_id " - + " INNER JOIN cvterm_relationship var ON var.object_id = scale_values.subject_id and var.type_id = " + TermId.HAS_SCALE.getId() + + " INNER JOIN cvterm_relationship var ON var.object_id = scale_values.subject_id and var.type_id = " + TermId.HAS_SCALE.getId() + " WHERE scale_values.subject_id = :scaleId AND scale_values.type_id = " + TermId.HAS_VALUE.getId() + " AND EXISTS ( " + " SELECT 1 " @@ -336,26 +335,7 @@ protected List getScaleCategoriesUsedAsGermplasmDescriptors(final int sc query.addScalar("category", CVTermRelationshipDao.STRING); return query.list(); } - - @SuppressWarnings("unchecked") - protected List getScaleCategoriesUsedAsEnvironmentFactors(final int scaleId) { - final SQLQuery query = this.getSession().createSQLQuery( - "SELECT categ.name category " - + " FROM cvterm_relationship scale_values " - + " INNER JOIN cvterm categ ON categ.cvterm_id = scale_values.object_id " - + " INNER JOIN cvterm_relationship var ON var.object_id = scale_values.subject_id and var.type_id = " + TermId.HAS_SCALE.getId() - + " WHERE scale_values.subject_id = :scaleId AND scale_values.type_id = " + TermId.HAS_VALUE.getId() - + " AND EXISTS ( " - + " SELECT 1 " - + " FROM nd_geolocationprop gp " - + " INNER JOIN nd_experiment ep on ep.nd_geolocation_id = gp.nd_geolocation_id " - + " INNER JOIN project pr ON pr.project_id =ep.project_id and pr.deleted = 0 " - + " WHERE gp.type_id = var.subject_id and gp.value = categ.cvterm_id)"); - query.setParameter("scaleId", scaleId); - query.addScalar("category", CVTermRelationshipDao.STRING); - return query.list(); - } - + @SuppressWarnings("unchecked") protected List getScaleCategoriesUsedAsTrialDesignFactors(final int scaleId) { final SQLQuery query = this.getSession().createSQLQuery( diff --git a/src/main/java/org/generationcp/middleware/domain/dms/DatasetBasicDTO.java b/src/main/java/org/generationcp/middleware/domain/dms/DatasetBasicDTO.java new file mode 100644 index 0000000000..8691116d9f --- /dev/null +++ b/src/main/java/org/generationcp/middleware/domain/dms/DatasetBasicDTO.java @@ -0,0 +1,54 @@ +package org.generationcp.middleware.domain.dms; + +import org.pojomatic.annotations.AutoProperty; + +@AutoProperty +public class DatasetBasicDTO { + + private Integer datasetId; + private Integer datasetTypeId; + private String name; + private Integer parentDatasetId; + + public DatasetBasicDTO(){ + + } + + public DatasetBasicDTO(final Integer datasetId) { + this(); + this.datasetId = datasetId; + } + + public Integer getDatasetId() { + return this.datasetId; + } + + public void setDatasetId(final Integer datasetId) { + this.datasetId = datasetId; + } + + public Integer getDatasetTypeId() { + return this.datasetTypeId; + } + + public void setDatasetTypeId(final Integer datasetTypeId) { + this.datasetTypeId = datasetTypeId; + } + + public String getName() { + return this.name; + } + + public void setName(final String name) { + this.name = name; + } + + public Integer getParentDatasetId() { + return this.parentDatasetId; + } + + public void setParentDatasetId(final Integer parentDatasetId) { + this.parentDatasetId = parentDatasetId; + } + +} diff --git a/src/main/java/org/generationcp/middleware/domain/dms/DatasetDTO.java b/src/main/java/org/generationcp/middleware/domain/dms/DatasetDTO.java index 00f65f4d51..fc2847cfbf 100644 --- a/src/main/java/org/generationcp/middleware/domain/dms/DatasetDTO.java +++ b/src/main/java/org/generationcp/middleware/domain/dms/DatasetDTO.java @@ -9,58 +9,22 @@ import java.util.List; @AutoProperty -public class DatasetDTO implements Serializable { +public class DatasetDTO extends DatasetBasicDTO implements Serializable { private static final long serialVersionUID = 736579292676142736L; - private Integer datasetId; - private Integer datasetTypeId; - private String name; - private Integer parentDatasetId; + private List instances; private List variables; private Boolean hasPendingData; private Boolean hasOutOfSyncData; public DatasetDTO(){ - + super(); } public DatasetDTO(final Integer datasetId) { - this(); - this.datasetId = datasetId; - } - - public Integer getDatasetId() { - return this.datasetId; - } - - public void setDatasetId(final Integer datasetId) { - this.datasetId = datasetId; - } - - public Integer getDatasetTypeId() { - return this.datasetTypeId; - } - - public void setDatasetTypeId(final Integer datasetTypeId) { - this.datasetTypeId = datasetTypeId; - } - - public String getName() { - return this.name; - } - - public void setName(final String name) { - this.name = name; - } - - public Integer getParentDatasetId() { - return this.parentDatasetId; - } - - public void setParentDatasetId(final Integer parentDatasetId) { - this.parentDatasetId = parentDatasetId; + super(datasetId); } public List getInstances() { diff --git a/src/main/java/org/generationcp/middleware/domain/dms/EnvironmentPropertyDao.java b/src/main/java/org/generationcp/middleware/domain/dms/EnvironmentPropertyDao.java new file mode 100644 index 0000000000..3004ca348e --- /dev/null +++ b/src/main/java/org/generationcp/middleware/domain/dms/EnvironmentPropertyDao.java @@ -0,0 +1,184 @@ +package org.generationcp.middleware.domain.dms; + +import com.google.common.base.Preconditions; +import org.generationcp.middleware.dao.GenericDAO; +import org.generationcp.middleware.domain.etl.MeasurementVariable; +import org.generationcp.middleware.domain.oms.TermId; +import org.generationcp.middleware.exceptions.MiddlewareQueryException; +import org.generationcp.middleware.pojos.dms.ExperimentProperty; +import org.hibernate.HibernateException; +import org.hibernate.Query; +import org.hibernate.SQLQuery; +import org.hibernate.transform.AliasToEntityMapResultTransformer; +import org.hibernate.type.StringType; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class EnvironmentPropertyDao extends GenericDAO { + + public Map getEnvironmentVariablesMap(final Integer datasetId, final Integer instanceDbId) { + Preconditions.checkNotNull(datasetId); + final String sql = "SELECT " + + " xp.type_id as variableId, " + + " xp.value as value " + + "FROM " + + " nd_experiment e " + + " INNER JOIN " + + " nd_experimentprop xp ON xp.nd_experiment_id = e.nd_experiment_id " + + "WHERE " + + " e.project_id = :datasetId and e.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + + " and e.nd_experiment_id = :instanceDbId"; + + final SQLQuery query = this.getSession().createSQLQuery(sql); + query.addScalar("variableId").addScalar("value").setParameter("datasetId", datasetId).setParameter("instanceDbId", instanceDbId); + query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE); + + final List> results = query.list(); + final Map geoProperties = new HashMap<>(); + for (final Map result : results) { + final Integer variableId = (Integer) result.get("variableId"); + final String value = (String) result.get("value"); + geoProperties.put(variableId, value); + } + return geoProperties; + } + + @SuppressWarnings("unchecked") + public String getVariableValueForTrialInstance(final int datasetId, final int variableId, final Integer trialInstance) { + try { + final StringBuilder sql = + new StringBuilder().append("SELECT xp.value FROM nd_experimentprop xp ") + .append(" INNER JOIN nd_experiment e ON e.nd_experiment_id = xp.nd_experiment_id AND e.type_id = ") + .append(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()).append(" ") + .append(" WHERE e.observation_unit_no = :instanceNumber AND xp.type_id = :variableId AND e.project_id = :datasetId"); + + final SQLQuery query = this.getSession().createSQLQuery(sql.toString()); + query.setParameter("instanceNumber", trialInstance); + query.setParameter("variableId", variableId); + query.setParameter("datasetId", datasetId); + return (String) query.uniqueResult(); + + } catch (final HibernateException e) { + throw new MiddlewareQueryException( + "Error at getVariableValueForTrialInstance=" + datasetId + " query on EnvironmentPropertyDao: " + e.getMessage(), e); + } + } + + public String getVariableValue(final int stdVarId, final int datasetId) { + try { + final StringBuilder sql = + new StringBuilder().append("SELECT distinct value ").append("FROM nd_experiment e ") + .append("INNER JOIN nd_experimentprop xp ON xp.nd_experiment_id = e.nd_experiment_id ") + .append("WHERE e.project_id = :projectId AND xp.type_id = :stdVarId ORDER BY e.observation_unit_no "); + final SQLQuery query = this.getSession().createSQLQuery(sql.toString()); + query.setParameter("projectId", datasetId); + query.setParameter("stdVarId", stdVarId); + return (String) query.uniqueResult(); + } catch (final HibernateException e) { + throw new MiddlewareQueryException( + "Error at getGeolocationPropValue=" + stdVarId + " query on EnvironmentPropertyDao: " + e.getMessage(), e); + } + } + + public void deletePropertiesInDataset(final int datasetId, final List variableIds) { + this.deleteValues(datasetId, Collections.emptyList(), variableIds); + } + + public void deletePropertiesInDatasetInstances(final int datasetId, final List instanceNumbers, final List variableIds) { + this.deleteValues(datasetId, instanceNumbers, variableIds); + } + + private void deleteValues(final int projectId, final List instanceNumbers, final List variableIds) { + // Please note we are manually flushing because non hibernate based deletes and updates causes the Hibernate session to get out of synch with + // underlying database. Thus flushing to force Hibernate to synchronize with the underlying database before the delete + // statement + this.getSession().flush(); + + final StringBuilder sql1 = new StringBuilder().append("Delete xp.* FROM nd_experimentprop xp " + + "INNER JOIN nd_experiment e ON e.nd_experiment_id = xp.nd_experiment_id " + + "INNER JOIN project p ON p.project_id = e.project_id " + + "WHERE (p.study_id = :datasetId OR p.project_id = :datasetId) AND xp.type_id IN (:variableIds) "); + if (!CollectionUtils.isEmpty(instanceNumbers)) { + sql1.append(" AND e.observation_unit_no IN (:instanceNumbers)"); + } + + final SQLQuery sqlQuery1 = this.getSession().createSQLQuery(sql1.toString()); + sqlQuery1.setParameter("datasetId", projectId); + sqlQuery1.setParameterList("variableIds", variableIds); + if (!CollectionUtils.isEmpty(instanceNumbers)) { + sqlQuery1.setParameterList("instanceNumbers", instanceNumbers); + } + sqlQuery1.executeUpdate(); + } + + public Map getEnvironmentVariableNameValuesMap(final Integer environmentId) { + Preconditions.checkNotNull(environmentId); + final Map geoProperties = new HashMap<>(); + final StringBuilder sql = + new StringBuilder().append("SELECT ").append(" cv.definition as name, xp.value as value ").append("FROM ") + .append(" nd_experimentprop xp ").append(" INNER JOIN ") + .append(" cvterm cv ON (cv.cvterm_id = xp.type_id) ").append("WHERE ").append(" xp.nd_experiment_id = :environmentId ") + .append(" AND xp.type_id NOT IN (8371, 8190, 8070, 8180) "); + try { + final Query query = + this.getSession().createSQLQuery(sql.toString()).addScalar("name").addScalar("value").setParameter("environmentId", + environmentId); + final List results = query.list(); + for (final Object obj : results) { + final Object[] row = (Object[]) obj; + geoProperties.put((String) row[0], (String) row[1]); + } + return geoProperties; + } catch (final MiddlewareQueryException e) { + final String message = "Error with getEnvironmentVariableNameValuesMap() query from environmentId: " + environmentId; + throw new MiddlewareQueryException(message, e); + } + } + + public List getEnvironmentDetailVariablesExcludeVariableIds(final Integer environmentId, final List excludedVariableIds) { + final List studyVariables = new ArrayList<>(); + + try{ + final SQLQuery query = + this.getSession().createSQLQuery("SELECT ispcvt.name as name, ispcvt.definition as definition, " + + " cvt_scale.name AS scaleName, xprop.value AS value " + + " FROM nd_experimentprop xprop " + + " INNER JOIN nd_experiment exp ON exp.nd_experiment_id = xprop.nd_experiment_id AND exp.type_id = " + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + + " INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = xprop.type_id " + + " INNER JOIN cvterm_relationship cvt_rel ON cvt_rel.subject_id = ispcvt.cvterm_id AND cvt_rel.type_id = " + TermId.HAS_SCALE.getId() + + " INNER JOIN cvterm cvt_scale ON cvt_scale.cvterm_id = cvt_rel.object_id " + + " WHERE exp.nd_experiment_id = :environmentId AND ispcvt.cvterm_id NOT IN (:excludedVariableIds) ;"); + query.addScalar("name", new StringType()); + query.addScalar("definition", new StringType()); + query.addScalar("scaleName", new StringType()); + query.addScalar("value", new StringType()); + query.setParameter("environmentId", environmentId); + query.setParameterList("excludedVariableIds", excludedVariableIds); + + final List results = query.list(); + for(final Object result: results) { + + final Object[] row = (Object[]) result; + final MeasurementVariable measurementVariable = new MeasurementVariable(); + measurementVariable.setName((row[0] instanceof String) ? (String) row[0] : null); + measurementVariable.setDescription((row[1] instanceof String) ? (String) row[1] : null); + measurementVariable.setScale((row[2] instanceof String) ? (String) row[2] : null); + measurementVariable.setValue((row[3] instanceof String) ? (String) row[3] : null); + studyVariables.add(measurementVariable); + } + } catch (final MiddlewareQueryException e) { + final String message = "Error with getEnvironmentDetailVariablesExcludeVariableIds() query from environmentId: " + environmentId + + " and excluded variableIds: " + excludedVariableIds; + throw new MiddlewareQueryException(message, e); + } + return studyVariables; + } + + + +} diff --git a/src/main/java/org/generationcp/middleware/domain/dms/Values.java b/src/main/java/org/generationcp/middleware/domain/dms/Values.java index 9b290fb23c..ce9725573e 100644 --- a/src/main/java/org/generationcp/middleware/domain/dms/Values.java +++ b/src/main/java/org/generationcp/middleware/domain/dms/Values.java @@ -12,7 +12,7 @@ package org.generationcp.middleware.domain.dms; /** - * This class is used to store variable list, germplasmId and locationId to Experiment. + * This class is used to store variable list, germplasmId, locationId, and observationUnitNo to Experiment. * */ public abstract class Values { @@ -20,12 +20,13 @@ public abstract class Values { private VariableList variableList; private Integer germplasmId; private Integer locationId; + private Integer observationUnitNo; public Values() { } - public Values(VariableList variableList, Integer germplasmId, Integer locationId) { + public Values(final VariableList variableList, final Integer germplasmId, final Integer locationId) { super(); this.variableList = variableList; this.germplasmId = germplasmId; @@ -36,7 +37,7 @@ public VariableList getVariableList() { return this.variableList != null ? this.variableList.sort() : null; } - public void setVariableList(VariableList variableList) { + public void setVariableList(final VariableList variableList) { this.variableList = variableList; } @@ -44,7 +45,7 @@ public Integer getGermplasmId() { return this.germplasmId; } - public void setGermplasmId(Integer germplasmId) { + public void setGermplasmId(final Integer germplasmId) { this.germplasmId = germplasmId; } @@ -52,7 +53,7 @@ public Integer getLocationId() { return this.locationId; } - public void setLocationId(Integer locationId) { + public void setLocationId(final Integer locationId) { this.locationId = locationId; } @@ -67,7 +68,7 @@ public int hashCode() { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (this == obj) { return true; } @@ -77,7 +78,7 @@ public boolean equals(Object obj) { if (this.getClass() != obj.getClass()) { return false; } - Values other = (Values) obj; + final Values other = (Values) obj; if (this.germplasmId == null) { if (other.germplasmId != null) { return false; @@ -93,18 +94,22 @@ public boolean equals(Object obj) { return false; } if (this.variableList == null) { - if (other.variableList != null) { - return false; - } - } else if (!this.variableList.equals(other.variableList)) { - return false; - } - return true; + return other.variableList == null; + } else + return this.variableList.equals(other.variableList); + } + + public Integer getObservationUnitNo() { + return this.observationUnitNo; + } + + public void setObservationUnitNo(final Integer observationUnitNo) { + this.observationUnitNo = observationUnitNo; } @Override public String toString() { - StringBuilder builder = new StringBuilder(); + final StringBuilder builder = new StringBuilder(); builder.append(this.getEntityName() + " [variableList="); builder.append(this.variableList); builder.append(", germplasmId="); diff --git a/src/main/java/org/generationcp/middleware/domain/fieldbook/FieldMapDatasetInfo.java b/src/main/java/org/generationcp/middleware/domain/fieldbook/FieldMapDatasetInfo.java index 49ff762ca6..4e3fb0a9c1 100644 --- a/src/main/java/org/generationcp/middleware/domain/fieldbook/FieldMapDatasetInfo.java +++ b/src/main/java/org/generationcp/middleware/domain/fieldbook/FieldMapDatasetInfo.java @@ -47,16 +47,16 @@ public FieldMapDatasetInfo() { * @param datasetName the dataset name * @param trialInstances the trial instances */ - public FieldMapDatasetInfo(Integer datasetId, String datasetName, List trialInstances) { + public FieldMapDatasetInfo(final Integer datasetId, final String datasetName, final List trialInstances) { this.datasetId = datasetId; this.datasetName = datasetName; this.trialInstances = trialInstances; } public List getTrialInstancesWithFieldMap() { - List info = new ArrayList(); + final List info = new ArrayList<>(); if (this.trialInstances != null && !this.trialInstances.isEmpty()) { - for (FieldMapTrialInstanceInfo geoloc : this.trialInstances) { + for (final FieldMapTrialInstanceInfo geoloc : this.trialInstances) { if (geoloc.isFieldMapGenerated()) { info.add(geoloc); } @@ -79,7 +79,7 @@ public Integer getDatasetId() { * * @param datasetId the new dataset id */ - public void setDatasetId(Integer datasetId) { + public void setDatasetId(final Integer datasetId) { this.datasetId = datasetId; } @@ -97,7 +97,7 @@ public String getDatasetName() { * * @param datasetName the new dataset name */ - public void setDatasetName(String datasetName) { + public void setDatasetName(final String datasetName) { this.datasetName = datasetName; } @@ -115,7 +115,7 @@ public List getTrialInstances() { * * @param trialInstances the new trial instances */ - public void setTrialInstances(List trialInstances) { + public void setTrialInstances(final List trialInstances) { this.trialInstances = trialInstances; } @@ -125,9 +125,9 @@ public void setTrialInstances(List trialInstances) { * @param geolocationId the geolocation id * @return the trial instance */ - public FieldMapTrialInstanceInfo getTrialInstance(Integer geolocationId) { - for (FieldMapTrialInstanceInfo trialInstance : this.trialInstances) { - if (geolocationId.equals(trialInstance.getGeolocationId())) { + public FieldMapTrialInstanceInfo getTrialInstance(final Integer geolocationId) { + for (final FieldMapTrialInstanceInfo trialInstance : this.trialInstances) { + if (geolocationId.equals(trialInstance.getEnvironmentId())) { return trialInstance; } } @@ -136,12 +136,12 @@ public FieldMapTrialInstanceInfo getTrialInstance(Integer geolocationId) { /* * (non-Javadoc) - * + * * @see java.lang.Object#toString() */ @Override public String toString() { - StringBuilder builder = new StringBuilder(); + final StringBuilder builder = new StringBuilder(); builder.append("FieldMapDatasetInfo [datasetId="); builder.append(this.datasetId); builder.append(", datasetName="); @@ -163,7 +163,7 @@ public void print(int indent) { Debug.println(indent, "Dataset Id = " + this.datasetId); Debug.println(indent, "Dataset Name = " + this.datasetName); Debug.println(indent, "Trial Instances = "); - for (FieldMapTrialInstanceInfo trialInstance : this.trialInstances) { + for (final FieldMapTrialInstanceInfo trialInstance : this.trialInstances) { trialInstance.print(indent + 3); } } diff --git a/src/main/java/org/generationcp/middleware/domain/fieldbook/FieldMapLabel.java b/src/main/java/org/generationcp/middleware/domain/fieldbook/FieldMapLabel.java index d822bb3101..853812069b 100644 --- a/src/main/java/org/generationcp/middleware/domain/fieldbook/FieldMapLabel.java +++ b/src/main/java/org/generationcp/middleware/domain/fieldbook/FieldMapLabel.java @@ -63,8 +63,8 @@ public class FieldMapLabel implements Serializable { /** The dataset id. */ private Integer datasetId; - /** The geolocation id. */ - private Integer geolocationId; + /** The Environment id. */ + private Integer environmentId; /** The site name. */ private String siteName; @@ -286,19 +286,19 @@ public void setDatasetId(final Integer datasetId) { /** * Gets the geolocation id. * - * @return the geolocationId + * @return the environmentId */ - public Integer getGeolocationId() { - return this.geolocationId; + public Integer getEnvironmentId() { + return this.environmentId; } /** * Sets the geolocation id. * - * @param geolocationId the geolocationId to set + * @param environmentId the environmentId to set */ - public void setGeolocationId(final Integer geolocationId) { - this.geolocationId = geolocationId; + public void setEnvironmentId(final Integer environmentId) { + this.environmentId = environmentId; } /** @@ -428,8 +428,8 @@ public String toString() { builder.append(this.studyName); builder.append(", datasetId="); builder.append(this.datasetId); - builder.append(", geolocationId="); - builder.append(this.geolocationId); + builder.append(", environmentId="); + builder.append(this.environmentId); builder.append(", siteName="); builder.append(this.siteName); builder.append(", gid="); @@ -461,7 +461,7 @@ public void print(int indent) { Debug.println(indent, "Range = " + this.range); Debug.println(indent, "Study Name = " + this.studyName); Debug.println(indent, "Dataset ID = " + this.datasetId); - Debug.println(indent, "Geolocation ID = " + this.geolocationId); + Debug.println(indent, "Geolocation ID = " + this.environmentId); Debug.println(indent, "Site Name = " + this.siteName); Debug.println(indent, "GID = " + this.gid); Debug.println(indent, "Season = " + this.season); diff --git a/src/main/java/org/generationcp/middleware/domain/fieldbook/FieldMapTrialInstanceInfo.java b/src/main/java/org/generationcp/middleware/domain/fieldbook/FieldMapTrialInstanceInfo.java index e808e3ac12..c340b84a7f 100644 --- a/src/main/java/org/generationcp/middleware/domain/fieldbook/FieldMapTrialInstanceInfo.java +++ b/src/main/java/org/generationcp/middleware/domain/fieldbook/FieldMapTrialInstanceInfo.java @@ -19,7 +19,6 @@ import java.util.Map; import java.util.Set; -import org.generationcp.middleware.pojos.GermplasmList; import org.generationcp.middleware.util.Debug; /** @@ -30,8 +29,8 @@ public class FieldMapTrialInstanceInfo implements Serializable { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; - /** The geolocation id. */ - private Integer geolocationId; + /** The Environment id. */ + private Integer environmentId; /** The site name. trial location id */ private String siteName; @@ -113,12 +112,12 @@ public FieldMapTrialInstanceInfo() { /** * Instantiates a new field map trial instance info. * - * @param geolocationId the geolocation id + * @param environmentId the geolocation id * @param siteName the site name * @param labels the labels */ - public FieldMapTrialInstanceInfo(Integer geolocationId, String siteName, List labels) { - this.geolocationId = geolocationId; + public FieldMapTrialInstanceInfo(final Integer environmentId, final String siteName, final List labels) { + this.environmentId = environmentId; this.siteName = siteName; this.labels = labels; } @@ -128,9 +127,9 @@ public FieldMapTrialInstanceInfo(Integer geolocationId, String siteName, List 0) { return true; } @@ -144,17 +143,17 @@ public boolean isFieldMapGenerated() { * * @return the geolocation id */ - public Integer getGeolocationId() { - return this.geolocationId; + public Integer getEnvironmentId() { + return this.environmentId; } /** * Sets the geolocation id. * - * @param geolocationId the new geolocation id + * @param environmentId the new geolocation id */ - public void setGeolocationId(Integer geolocationId) { - this.geolocationId = geolocationId; + public void setEnvironmentId(final Integer environmentId) { + this.environmentId = environmentId; } /** @@ -171,7 +170,7 @@ public String getSiteName() { * * @param siteName the new site name */ - public void setSiteName(String siteName) { + public void setSiteName(final String siteName) { this.siteName = siteName; } @@ -189,7 +188,7 @@ public String getTrialInstanceNo() { * * @param trialInstanceNo the new trial instance no */ - public void setTrialInstanceNo(String trialInstanceNo) { + public void setTrialInstanceNo(final String trialInstanceNo) { this.trialInstanceNo = trialInstanceNo; } @@ -207,7 +206,7 @@ public List getFieldMapLabels() { * * @param labels the new field map labels */ - public void setFieldMapLabels(List labels) { + public void setFieldMapLabels(final List labels) { this.labels = labels; } @@ -225,7 +224,7 @@ public String getBlockName() { * * @param blockName the blockName to set */ - public void setBlockName(String blockName) { + public void setBlockName(final String blockName) { this.blockName = blockName; } @@ -243,7 +242,7 @@ public Integer getRowsInBlock() { * * @param rowsInBlock the rowsInBlock to set */ - public void setRowsInBlock(Integer rowsInBlock) { + public void setRowsInBlock(final Integer rowsInBlock) { this.rowsInBlock = rowsInBlock; } @@ -261,7 +260,7 @@ public Integer getRangesInBlock() { * * @param rangesInBlock the rangesInBlock to set */ - public void setRangesInBlock(Integer rangesInBlock) { + public void setRangesInBlock(final Integer rangesInBlock) { this.rangesInBlock = rangesInBlock; } @@ -279,7 +278,7 @@ public Integer getPlantingOrder() { * * @param plantingOrder the plantingOrder to set */ - public void setPlantingOrder(Integer plantingOrder) { + public void setPlantingOrder(final Integer plantingOrder) { this.plantingOrder = plantingOrder; } @@ -289,8 +288,8 @@ public void setPlantingOrder(Integer plantingOrder) { * @return the entry count */ public long getEntryCount() { - Set entries = new HashSet(); - for (FieldMapLabel label : this.labels) { + final Set entries = new HashSet<>(); + for (final FieldMapLabel label : this.labels) { entries.add(label.getEntryNumber()); } return entries.size(); @@ -301,7 +300,7 @@ public long getEntryCount() { * * @param entryCount the new entry count */ - public void setEntryCount(long entryCount) { + public void setEntryCount(final long entryCount) { this.entryCount = entryCount; } @@ -311,8 +310,8 @@ public void setEntryCount(long entryCount) { * @return the rep count */ public long getRepCount() { - List reps = new ArrayList(); - for (FieldMapLabel label : this.labels) { + final List reps = new ArrayList<>(); + for (final FieldMapLabel label : this.labels) { reps.add(label.getRep()); } if (reps.isEmpty()) { @@ -326,7 +325,7 @@ public long getRepCount() { * * @param repCount the new rep count */ - public void setRepCount(long repCount) { + public void setRepCount(final long repCount) { this.repCount = repCount; } @@ -344,7 +343,7 @@ public long getPlotCount() { * * @param plotCount the new plot count */ - public void setPlotCount(long plotCount) { + public void setPlotCount(final long plotCount) { this.plotCount = plotCount; } @@ -354,8 +353,8 @@ public void setPlotCount(long plotCount) { * @param experimentId the experiment id * @return the field map label */ - public FieldMapLabel getFieldMapLabel(Integer experimentId) { - for (FieldMapLabel label : this.labels) { + public FieldMapLabel getFieldMapLabel(final Integer experimentId) { + for (final FieldMapLabel label : this.labels) { if (experimentId.equals(label.getExperimentId())) { return label; } @@ -377,7 +376,7 @@ public Integer getStartColumn() { * * @param startColumn the startColumn to set */ - public void setStartColumn(Integer startColumn) { + public void setStartColumn(final Integer startColumn) { this.startColumn = startColumn; } @@ -395,20 +394,20 @@ public Integer getStartRange() { * * @param startRange the startRange to set */ - public void setStartRange(Integer startRange) { + public void setStartRange(final Integer startRange) { this.startRange = startRange; } /* * (non-Javadoc) - * + * * @see java.lang.Object#toString() */ @Override public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("FieldMapTrialInstanceInfo [geolocationId="); - builder.append(this.geolocationId); + final StringBuilder builder = new StringBuilder(); + builder.append("FieldMapTrialInstanceInfo [environmentId="); + builder.append(this.environmentId); builder.append(", siteName="); builder.append(this.siteName); builder.append(", labels="); @@ -431,10 +430,10 @@ public String toString() { public void print(int indent) { Debug.println(indent, "FieldMapTrialInstanceInfo: "); indent = indent + 3; - Debug.println(indent, "Geolocation Id = " + this.geolocationId); + Debug.println(indent, "Geolocation Id = " + this.environmentId); Debug.println(indent, "Site Name = " + this.siteName); Debug.println(indent, "Labels = "); - for (FieldMapLabel label : this.labels) { + for (final FieldMapLabel label : this.labels) { label.print(indent + 3); } Debug.println(indent, "Number of Entries: " + this.getEntryCount()); @@ -456,7 +455,7 @@ public boolean getHasFieldMap() { * * @param hasFieldMap the hasFieldMap to set */ - public void setHasFieldMap(boolean hasFieldMap) { + public void setHasFieldMap(final boolean hasFieldMap) { this.hasFieldMap = hasFieldMap; } @@ -474,7 +473,7 @@ public Integer getRowsPerPlot() { * * @param rowsPerPlot the rowsPerPlot to set */ - public void setRowsPerPlot(Integer rowsPerPlot) { + public void setRowsPerPlot(final Integer rowsPerPlot) { this.rowsPerPlot = rowsPerPlot; } @@ -492,7 +491,7 @@ public String getFieldName() { * * @param fieldName the fieldName to set */ - public void setFieldName(String fieldName) { + public void setFieldName(final String fieldName) { this.fieldName = fieldName; } @@ -510,7 +509,7 @@ public String getFieldmapUUID() { * * @param fieldmapUUID the fieldmapUUID to set */ - public void setFieldmapUUID(String fieldmapUUID) { + public void setFieldmapUUID(final String fieldmapUUID) { this.fieldmapUUID = fieldmapUUID; } @@ -528,7 +527,7 @@ public Integer getMachineRowCapacity() { * * @param machineRowCapacity the machineRowCapacity to set */ - public void setMachineRowCapacity(Integer machineRowCapacity) { + public void setMachineRowCapacity(final Integer machineRowCapacity) { this.machineRowCapacity = machineRowCapacity; } @@ -546,7 +545,7 @@ public String getLocationName() { * * @param locationName the locationName to set */ - public void setLocationName(String locationName) { + public void setLocationName(final String locationName) { this.locationName = locationName; } @@ -564,7 +563,7 @@ public Integer getOrder() { * * @param order the new order */ - public void setOrder(Integer order) { + public void setOrder(final Integer order) { this.order = order; } @@ -578,7 +577,7 @@ public Integer getLocationId() { /** * @param locationId the locationId to set */ - public void setLocationId(Integer locationId) { + public void setLocationId(final Integer locationId) { this.locationId = locationId; } @@ -592,7 +591,7 @@ public Integer getFieldId() { /** * @param fieldId the fieldId to set */ - public void setFieldId(Integer fieldId) { + public void setFieldId(final Integer fieldId) { this.fieldId = fieldId; } @@ -606,7 +605,7 @@ public Integer getBlockId() { /** * @param blockId the blockId to set */ - public void setBlockId(Integer blockId) { + public void setBlockId(final Integer blockId) { this.blockId = blockId; } @@ -620,14 +619,14 @@ public List getDeletedPlots() { /** * @param deletedPlots the deletedPlots to set */ - public void setDeletedPlots(List deletedPlots) { + public void setDeletedPlots(final List deletedPlots) { this.deletedPlots = deletedPlots; } /** * @param blockInfo the blockInfo to set */ - public void updateBlockInformation(FieldmapBlockInfo blockInfo) { + public void updateBlockInformation(final FieldmapBlockInfo blockInfo) { if (blockInfo != null) { this.rowsInBlock = blockInfo.getRowsInBlock(); this.rangesInBlock = blockInfo.getRangesInBlock(); @@ -643,15 +642,15 @@ public Map getLabelHeaders() { return this.labelHeaders; } - public void setLabelHeaders(Map labelHeaders) { + public void setLabelHeaders(final Map labelHeaders) { this.labelHeaders = labelHeaders; } public Integer getLabelsNeeded() { - return labelsNeeded; + return this.labelsNeeded; } - public void setLabelsNeeded(Integer labelsNeeded) { + public void setLabelsNeeded(final Integer labelsNeeded) { this.labelsNeeded = labelsNeeded; } } diff --git a/src/main/java/org/generationcp/middleware/manager/CrossStudyDataManagerImpl.java b/src/main/java/org/generationcp/middleware/manager/CrossStudyDataManagerImpl.java index 87d00ad6b9..711902a70f 100644 --- a/src/main/java/org/generationcp/middleware/manager/CrossStudyDataManagerImpl.java +++ b/src/main/java/org/generationcp/middleware/manager/CrossStudyDataManagerImpl.java @@ -67,18 +67,18 @@ public List getPropertiesForTrialEnvironments(final Li } @Override - public List getTraitsForNumericVariates(final List environmentIds) { - return this.getTraitBuilder().getTraitsForNumericVariates(environmentIds); + public List getTraitsForNumericVariates(final List environmentIds, final List traitIds) { + return this.getTraitBuilder().getTraitsForNumericVariates(environmentIds, traitIds); } @Override - public List getTraitsForCharacterVariates(final List environmentIds) { - return this.getTraitBuilder().getTraitsForCharacterVariates(environmentIds); + public List getTraitsForCharacterVariates(final List environmentIds, final List traitIds) { + return this.getTraitBuilder().getTraitsForCharacterVariates(environmentIds, traitIds); } @Override - public List getTraitsForCategoricalVariates(final List environmentIds) { - return this.getTraitBuilder().getTraitsForCategoricalVariates(environmentIds); + public List getTraitsForCategoricalVariates(final List environmentIds, final List traitIds) { + return this.getTraitBuilder().getTraitsForCategoricalVariates(environmentIds, traitIds); } @Override diff --git a/src/main/java/org/generationcp/middleware/manager/DaoFactory.java b/src/main/java/org/generationcp/middleware/manager/DaoFactory.java index ea10146b7b..ee6fde70a1 100644 --- a/src/main/java/org/generationcp/middleware/manager/DaoFactory.java +++ b/src/main/java/org/generationcp/middleware/manager/DaoFactory.java @@ -16,9 +16,9 @@ import org.generationcp.middleware.dao.SearchRequestDAO; import org.generationcp.middleware.dao.dms.DatasetTypeDAO; import org.generationcp.middleware.dao.dms.DmsProjectDao; +import org.generationcp.middleware.dao.dms.InstanceDao; import org.generationcp.middleware.dao.dms.ExperimentDao; -import org.generationcp.middleware.dao.dms.GeolocationDao; -import org.generationcp.middleware.dao.dms.GeolocationPropertyDao; +import org.generationcp.middleware.dao.dms.ExperimentPropertyDao; import org.generationcp.middleware.dao.dms.LocationSearchDao; import org.generationcp.middleware.dao.dms.ObservationUnitsSearchDao; import org.generationcp.middleware.dao.dms.PhenotypeDao; @@ -32,6 +32,7 @@ import org.generationcp.middleware.dao.oms.CVTermDao; import org.generationcp.middleware.dao.oms.CVTermRelationshipDao; import org.generationcp.middleware.dao.oms.CvTermPropertyDao; +import org.generationcp.middleware.domain.dms.EnvironmentPropertyDao; import org.generationcp.middleware.hibernate.HibernateSessionProvider; public class DaoFactory { @@ -164,16 +165,11 @@ public ExperimentDao getExperimentDao() { } - public GeolocationDao getGeolocationDao() { - final GeolocationDao geolocationDao = new GeolocationDao(); - geolocationDao.setSession(this.sessionProvider.getSession()); - return geolocationDao; - } + public ExperimentPropertyDao getExperimentPropertyDao() { + final ExperimentPropertyDao experimentPropDao = new ExperimentPropertyDao(); + experimentPropDao.setSession(this.sessionProvider.getSession()); + return experimentPropDao; - public GeolocationPropertyDao getGeolocationPropertyDao() { - final GeolocationPropertyDao geolocationPropertyDao = new GeolocationPropertyDao(); - geolocationPropertyDao.setSession(this.sessionProvider.getSession()); - return geolocationPropertyDao; } public ProgramPresetDAO getProgramPresetDAO() { @@ -241,4 +237,16 @@ public ProgramFavoriteDAO getProgramFavoriteDao() { programFavoriteDao.setSession(this.sessionProvider.getSession()); return programFavoriteDao; } + + public InstanceDao getInstanceDao() { + final InstanceDao instanceDao = new InstanceDao(); + instanceDao.setSession(this.sessionProvider.getSession()); + return instanceDao; + } + + public EnvironmentPropertyDao getEnvironmentPropertyDao() { + final EnvironmentPropertyDao environmentPropertyDao = new EnvironmentPropertyDao(); + environmentPropertyDao.setSession(this.sessionProvider.getSession()); + return environmentPropertyDao; + } } diff --git a/src/main/java/org/generationcp/middleware/manager/DataManager.java b/src/main/java/org/generationcp/middleware/manager/DataManager.java index 029a637ffa..add8bc7db6 100644 --- a/src/main/java/org/generationcp/middleware/manager/DataManager.java +++ b/src/main/java/org/generationcp/middleware/manager/DataManager.java @@ -35,8 +35,6 @@ import org.generationcp.middleware.operation.saver.DatasetProjectSaver; import org.generationcp.middleware.operation.saver.ExperimentModelSaver; import org.generationcp.middleware.operation.saver.ExperimentPropertySaver; -import org.generationcp.middleware.operation.saver.GeolocationPropertySaver; -import org.generationcp.middleware.operation.saver.GeolocationSaver; import org.generationcp.middleware.operation.saver.ListDataPropertySaver; import org.generationcp.middleware.operation.saver.LocdesSaver; import org.generationcp.middleware.operation.saver.PhenotypeSaver; @@ -204,7 +202,7 @@ protected final TermBuilder getTermBuilder() { return new TermBuilder(this.sessionProvider); } - protected final MethodBuilder getMethodBuilder() { + final MethodBuilder getMethodBuilder() { return new MethodBuilder(this.sessionProvider); } @@ -212,11 +210,11 @@ protected final StandardVariableBuilder getStandardVariableBuilder() { return new StandardVariableBuilder(this.sessionProvider); } - protected final StudyBuilder getStudyBuilder() { + final StudyBuilder getStudyBuilder() { return new StudyBuilder(this.sessionProvider); } - protected final StudyTypeBuilder getStudyTypeBuilder() { + final StudyTypeBuilder getStudyTypeBuilder() { return new StudyTypeBuilder(); } @@ -268,10 +266,6 @@ protected final PhenotypeSaver getPhenotypeSaver() { return new PhenotypeSaver(this.sessionProvider); } - protected final GeolocationSaver getGeolocationSaver() { - return new GeolocationSaver(this.sessionProvider); - } - protected final ProjectSaver getProjectSaver() { return new ProjectSaver(this.sessionProvider); } @@ -312,10 +306,6 @@ protected final LocdesSaver getLocdesSaver() { return new LocdesSaver(this.sessionProvider); } - protected final GeolocationPropertySaver getGeolocationPropertySaver() { - return new GeolocationPropertySaver(this.sessionProvider); - } - protected final ListInventoryBuilder getListInventoryBuilder() { return new ListInventoryBuilder(this.sessionProvider); } diff --git a/src/main/java/org/generationcp/middleware/manager/DataManager.java.orig b/src/main/java/org/generationcp/middleware/manager/DataManager.java.orig index f09a540213..8ae44ea36c 100644 --- a/src/main/java/org/generationcp/middleware/manager/DataManager.java.orig +++ b/src/main/java/org/generationcp/middleware/manager/DataManager.java.orig @@ -45,8 +45,7 @@ import org.generationcp.middleware.operation.saver.CvTermSaver; import org.generationcp.middleware.operation.saver.DatasetProjectSaver; import org.generationcp.middleware.operation.saver.ExperimentModelSaver; import org.generationcp.middleware.operation.saver.ExperimentPropertySaver; -import org.generationcp.middleware.operation.saver.GeolocationPropertySaver; -import org.generationcp.middleware.operation.saver.GeolocationSaver; +import org.generationcp.middleware.operation.saver.EnvironmentPropertySaver; import org.generationcp.middleware.operation.saver.ListDataPropertySaver; import org.generationcp.middleware.operation.saver.LocdesSaver; import org.generationcp.middleware.operation.saver.PhenotypeSaver; diff --git a/src/main/java/org/generationcp/middleware/manager/StudyDataManagerImpl.java b/src/main/java/org/generationcp/middleware/manager/StudyDataManagerImpl.java index c2330de640..e080e52c6e 100644 --- a/src/main/java/org/generationcp/middleware/manager/StudyDataManagerImpl.java +++ b/src/main/java/org/generationcp/middleware/manager/StudyDataManagerImpl.java @@ -22,6 +22,7 @@ import org.generationcp.middleware.dao.dms.PhenotypeOutlierDao; import org.generationcp.middleware.domain.dms.DMSVariableType; import org.generationcp.middleware.domain.dms.DataSet; +import org.generationcp.middleware.domain.dms.DatasetDTO; import org.generationcp.middleware.domain.dms.DatasetReference; import org.generationcp.middleware.domain.dms.DatasetValues; import org.generationcp.middleware.domain.dms.Experiment; @@ -38,7 +39,6 @@ import org.generationcp.middleware.domain.dms.Variable; import org.generationcp.middleware.domain.dms.VariableList; import org.generationcp.middleware.domain.dms.VariableTypeList; -import org.generationcp.middleware.domain.etl.MeasurementVariable; import org.generationcp.middleware.domain.etl.StudyDetails; import org.generationcp.middleware.domain.fieldbook.FieldMapDatasetInfo; import org.generationcp.middleware.domain.fieldbook.FieldMapInfo; @@ -62,9 +62,9 @@ import org.generationcp.middleware.operation.builder.TrialEnvironmentBuilder; import org.generationcp.middleware.pojos.Location; import org.generationcp.middleware.pojos.Person; +import org.generationcp.middleware.pojos.dms.DatasetType; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.dms.Phenotype; import org.generationcp.middleware.pojos.dms.PhenotypeOutlier; import org.generationcp.middleware.pojos.dms.ProjectProperty; @@ -78,8 +78,6 @@ import org.generationcp.middleware.service.pedigree.PedigreeFactory; import org.generationcp.middleware.util.CrossExpansionProperties; import org.generationcp.middleware.util.PlotUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -90,12 +88,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; @Transactional public class StudyDataManagerImpl extends DataManager implements StudyDataManager { - private static final Logger LOG = LoggerFactory.getLogger(StudyDataManagerImpl.class); private PedigreeService pedigreeService; private LocationDataManager locationDataManager; private DaoFactory daoFactory; @@ -351,20 +349,6 @@ public void addOrUpdateExperiment( } - @Override - public int addTrialEnvironment(final VariableList variableList) { - - try { - - final Geolocation geolocation = this.getGeolocationSaver().saveGeolocation(variableList, null); - return geolocation.getLocationId(); - - } catch (final Exception e) { - - throw new MiddlewareQueryException("error in addTrialEnvironment " + e.getMessage(), e); - } - } - @Override public int addStock(final VariableList variableList) { @@ -514,7 +498,6 @@ public void saveOrUpdateFieldmapProperties(final List info, final } else { this.getLocdesSaver().updateDeletedPlots(info, userId); } - this.getGeolocationPropertySaver().saveFieldmapProperties(info); this.getExperimentPropertySaver().saveFieldmapProperties(info); } catch (final Exception e) { @@ -536,7 +519,7 @@ public void saveTrialDatasetSummary( this.getProjectPropertySaver().saveProjectProperties(project, variableTypeList, null); } if (experimentValues != null && !experimentValues.isEmpty()) { - this.updateExperimentValues(experimentValues, project.getProjectId()); + this.updateExperimentValues(experimentValues); } } catch (final Exception e) { @@ -545,11 +528,11 @@ public void saveTrialDatasetSummary( } } - void updateExperimentValues(final List experimentValues, final Integer projectId) { + void updateExperimentValues(final List experimentValues) { for (final ExperimentValues exp : experimentValues) { if (exp.getVariableList() != null && !exp.getVariableList().isEmpty()) { - final ExperimentModel experimentModel = - this.getExperimentDao().getExperimentByProjectIdAndLocation(projectId, exp.getLocationId()); + // The location id is the environment's experiment id + final ExperimentModel experimentModel = this.getExperimentDao().getById(exp.getLocationId()); for (final Variable variable : exp.getVariableList().getVariables()) { final int val = this.getPhenotypeDao().updatePhenotypesByExperimentIdAndObervableId(experimentModel.getNdExperimentId(), variable.getVariableType().getId(), variable.getValue()); @@ -563,14 +546,14 @@ void updateExperimentValues(final List experimentValues, final @Override public List getAllFieldMapsInBlockByTrialInstanceId( - final int datasetId, final int geolocationId, + final int datasetId, final int environmentId, final CrossExpansionProperties crossExpansionProperties) { final List fieldMapInfos = - this.getExperimentPropertyDao().getAllFieldMapsInBlockByTrialInstanceId(datasetId, geolocationId, null); + this.getExperimentPropertyDao().getAllFieldMapsInBlockByTrialInstanceId(datasetId, environmentId, null); this.updateFieldMapWithBlockInformation(fieldMapInfos, true); final Map pedigreeStringMap = new HashMap<>(); - // Filter those belonging to the given geolocationId + // Filter those belonging to the given environmentId for (final FieldMapInfo fieldMapInfo : fieldMapInfos) { final List datasetInfoList = fieldMapInfo.getDatasets(); if (datasetInfoList != null) { @@ -757,7 +740,7 @@ public DmsProject getProject(final int id) { public List getStudyDetails( final StudyTypeDto studyType, final String programUUID, final int start, final int numOfRows) { - final List details = this.getDmsProjectDao().getAllStudyDetails(studyType, programUUID, start, numOfRows); + final List details = this.getDmsProjectDao().getAllStudyDetails(Optional.of(studyType), programUUID, start, numOfRows); this.populateSiteAndPersonIfNecessary(details); return details; } @@ -776,6 +759,7 @@ public List getNurseryAndTrialStudyDetails(final String programUUI return list; } + // TODO IBP-3389 Optimize, no need to retrieve per study type from ETLServiceImpl @SuppressWarnings({"unchecked", "rawtypes"}) @Override public List getAllStudyDetails(final StudyTypeDto studyType, final String programUUID) { @@ -951,7 +935,9 @@ private String getLocationName(final Map locationMap, final Int public List getPhenotypeIdsByLocationAndPlotNo( final int projectId, final int locationId, final Integer plotNo, final List cvTermIds) { - return this.getPhenotypeDao().getPhenotypeIdsByLocationAndPlotNo(projectId, locationId, plotNo, cvTermIds); + final DatasetDTO dataset = this.daoFactory.getDmsProjectDAO().getDataset(projectId); + final DatasetType datasetType = this.daoFactory.getDatasetTypeDao().getById(dataset.getDatasetTypeId()); + return this.getPhenotypeDao().getPhenotypeIdsByLocationAndPlotNo(projectId, datasetType.isSubObservationType(), locationId, plotNo, cvTermIds); } @Override @@ -1021,34 +1007,23 @@ public void updateVariableOrdering(final int datasetId, final List vari } } - @Override - public String getTrialInstanceNumberByGeolocationId(final int geolocationId) { - final Geolocation geolocation = this.getGeolocationDao().getById(geolocationId); - if (geolocation != null) { - return geolocation.getDescription(); - } - return null; - } - @Override public List getAllSharedProjectNames() { return this.getDmsProjectDao().getAllSharedProjectNames(); } @Override - public boolean checkIfAnyLocationIDsExistInExperiments( + public Long countExperimentsByDatasetTypeAndEnvironments( final int studyId, final int datasetTypeId, - final List locationIds) { + final List environmentIds) { final List datasetProjects = this.getDmsProjectDao().getDatasetsByTypeForStudy(studyId, datasetTypeId); if (!datasetProjects.isEmpty()) { final int dataSetId = datasetProjects.get(0).getProjectId(); - return this.getExperimentDao().checkIfAnyLocationIDsExistInExperiments(dataSetId, locationIds); - } else { - return false; + return this.daoFactory.getExperimentDao().countExperimentsByDatasetAndEnvironmentIds(dataSetId, environmentIds); } - + return 0L; } @Override @@ -1086,7 +1061,7 @@ public List findPagedProjects(final Map filt final List locationIds = filters.get(StudyFilters.LOCATION_ID) != null ? Collections.singletonList(Integer.parseInt(filters.get(StudyFilters.LOCATION_ID))) : - new ArrayList(); + new ArrayList<>(); studySummary.setInstanceMetaData(this.getInstanceMetadata(dmsProject.getProjectId(), locationIds)); studySummaries.add(studySummary); } @@ -1100,26 +1075,16 @@ public Long countAllStudies(final Map filters) { @Override public List getInstanceMetadata(final int studyId) { - return this.getGeolocationDao().getInstanceMetadata(studyId, new ArrayList()); + return this.daoFactory.getInstanceDao().getInstanceMetadata(studyId, Collections.emptyList()); } List getInstanceMetadata(final int studyId, final List locationIds) { - return this.getGeolocationDao().getInstanceMetadata(studyId, locationIds); - } - - @Override - public Phenotype getPhenotypeById(final int phenotypeId) { - return this.getPhenotypeDao().getById(phenotypeId); - } - - @Override - public StudyMetadata getStudyMetadataForGeolocationId(final Integer geolocationId) { - return this.getDmsProjectDao().getStudyMetadataForGeolocationId(geolocationId); + return this.daoFactory.getInstanceDao().getInstanceMetadata(studyId, locationIds); } @Override - public Map getGeolocationPropsAndValuesByGeolocation(final Integer studyId, final List excludedIds) { - return this.getGeolocationPropertyDao().getGeolocationPropsAndValuesByGeolocation(studyId, excludedIds); + public StudyMetadata getStudyMetadataForEnvironmentId(final Integer environmentId) { + return this.getDmsProjectDao().getStudyMetadataForEnvironmentId(environmentId); } @Override @@ -1137,16 +1102,6 @@ public Map> getExperimentSamplesDTOMap(final Integer st return this.getExperimentDao().getExperimentSamplesDTOMap(studyId); } - @Override - public Map getInstanceGeolocationIdsMap(final Integer studyId) { - final List geolocations = this.getGeolocationDao().getEnvironmentGeolocations(studyId); - final Map map = new HashMap<>(); - for (final Geolocation geolocation : geolocations) { - map.put(geolocation.getDescription(), geolocation.getLocationId()); - } - return map; - } - @Override public boolean isVariableUsedInStudyOrTrialEnvironmentInOtherPrograms( final String variableId, final String variableValue, @@ -1259,8 +1214,8 @@ public boolean areAllInstancesExistInDataset(final Integer datasetId, final Set< } @Override - public String getBlockId(final int datasetId, final String trialInstance) { - return this.daoFactory.getGeolocationPropertyDao().getValueOfTrialInstance(datasetId, TermId.BLOCK_ID.getId(), trialInstance); + public String getBlockId(final int datasetId, final Integer trialInstance) { + return this.daoFactory.getEnvironmentPropertyDao().getVariableValueForTrialInstance(datasetId, TermId.BLOCK_ID.getId(), trialInstance); } @@ -1276,34 +1231,20 @@ public StudyReference getStudyReference(final Integer studyId) { return studyReference; } - public Boolean instanceExists(final Set instanceIds) { - return this.getGeolocationDao().instanceExists(instanceIds); - } - @Override - public Map getGeolocationByVariableId(final Integer datasetId, final Integer instanceDbId) { - final Geolocation geoLocation = this.getGeolocationDao().getById(instanceDbId); - final Map geoLocationMap = - this.getGeolocationPropertyDao().getGeoLocationPropertyByVariableId(datasetId, instanceDbId); - - geoLocationMap.put(TermId.TRIAL_INSTANCE_FACTOR.getId(), geoLocation.getDescription()); - if (geoLocation.getLatitude() != null) { - geoLocationMap.put(TermId.LATITUDE.getId(), geoLocation.getLatitude().toString()); - } - - if (geoLocation.getLongitude() != null) { - geoLocationMap.put(TermId.LONGITUDE.getId(), geoLocation.getLongitude().toString()); - } + public Map getEnvironmentVariableIdValuesMap(final Integer datasetId, final Integer environmentId) { + final Map environmentVariablesMap = + this.daoFactory.getEnvironmentPropertyDao().getEnvironmentVariablesMap(datasetId, environmentId); + final ExperimentModel environment = this.daoFactory.getInstanceDao().getById(environmentId); - if (geoLocation.getGeodeticDatum() != null) { - geoLocationMap.put(TermId.GEODETIC_DATUM.getId(), geoLocation.getGeodeticDatum()); - } - - if (geoLocation.getAltitude() != null) { - geoLocationMap.put(TermId.ALTITUDE.getId(), geoLocation.getAltitude().toString()); - } + environmentVariablesMap.put(TermId.TRIAL_INSTANCE_FACTOR.getId(), String.valueOf(environment.getObservationUnitNo())); + return environmentVariablesMap; + } - return geoLocationMap; + // TODO IBP-3305 Determine if this can be replaced with StudyDataManager#areAllInstancesExistInDataset + @Override + public Boolean instancesExist(final Set instanceIds) { + return this.daoFactory.getInstanceDao().instancesExist(instanceIds); } @Override @@ -1334,16 +1275,6 @@ public List getUsersForEnvironment(final Integer instanceId) { return Collections.emptyList(); } - @Override - public List getEnvironmentConditionVariablesByGeoLocationIdAndVariableIds(Integer geolocationId, List variableIds) { - return this.daoFactory.getPhenotypeDAO().getEnvironmentConditionVariablesByGeoLocationIdAndVariableIds(geolocationId, variableIds); - } - - @Override - public List getEnvironmentDetailVariablesByGeoLocationIdAndVariableIds(Integer geolocationId, List variableIds) { - return this.daoFactory.getGeolocationPropertyDao().getEnvironmentDetailVariablesByGeoLocationIdAndVariableIds(geolocationId, variableIds); - } - void setDataSetBuilder(final DataSetBuilder dataSetBuilder) { this.dataSetBuilder = dataSetBuilder; } diff --git a/src/main/java/org/generationcp/middleware/manager/api/CrossStudyDataManager.java b/src/main/java/org/generationcp/middleware/manager/api/CrossStudyDataManager.java index 0c5600bd8e..7aaa007380 100644 --- a/src/main/java/org/generationcp/middleware/manager/api/CrossStudyDataManager.java +++ b/src/main/java/org/generationcp/middleware/manager/api/CrossStudyDataManager.java @@ -55,7 +55,7 @@ public interface CrossStudyDataManager { * @param environmentIds * @return List of NumericTraitInfo */ - List getTraitsForNumericVariates(List environmentIds); + List getTraitsForNumericVariates(List environmentIds, List traitIds); /** * Retrieves a set of standard variables (traits) used for the character variates observed in given list of environments. Character @@ -64,7 +64,7 @@ public interface CrossStudyDataManager { * @param environmentIds * @return List of CharacterTraitInfo */ - List getTraitsForCharacterVariates(List environmentIds); + List getTraitsForCharacterVariates(List environmentIds, List traitIds); /** * Retrieve a set of standard variables (traits) used for the categorical variables observed in given list of environments. Categorical @@ -73,7 +73,7 @@ public interface CrossStudyDataManager { * @param environmentIds * @return List of CategoricalTraitInfo */ - List getTraitsForCategoricalVariates(List environmentIds); + List getTraitsForCategoricalVariates(List environmentIds, List traitIds); /** * Given a list of pairs of GIDs, return all environments where any of the pair of GIDs have been observed. Both the GIDs in a pair must diff --git a/src/main/java/org/generationcp/middleware/manager/api/StudyDataManager.java b/src/main/java/org/generationcp/middleware/manager/api/StudyDataManager.java index d114e7b152..ad65990934 100644 --- a/src/main/java/org/generationcp/middleware/manager/api/StudyDataManager.java +++ b/src/main/java/org/generationcp/middleware/manager/api/StudyDataManager.java @@ -38,9 +38,7 @@ import org.generationcp.middleware.domain.search.filter.StudyQueryFilter; import org.generationcp.middleware.domain.study.StudyTypeDto; import org.generationcp.middleware.enumeration.DatasetTypeEnum; -import org.generationcp.middleware.pojos.dms.DatasetType; import org.generationcp.middleware.pojos.dms.DmsProject; -import org.generationcp.middleware.pojos.dms.Phenotype; import org.generationcp.middleware.pojos.dms.PhenotypeOutlier; import org.generationcp.middleware.pojos.dms.StudyType; import org.generationcp.middleware.pojos.workbench.CropType; @@ -127,6 +125,11 @@ public interface StudyDataManager { */ List getExperiments(int dataSetId, int start, int numOfRows); + List getExperimentsOfFirstInstance(int dataSetId, int start, int numOfRows); + + VariableTypeList getTreatmentFactorVariableTypes(int dataSetId); + + /** * Gets the experiments. * @@ -138,24 +141,6 @@ public interface StudyDataManager { */ List getExperiments(int dataSetId, int start, int numOfRows, VariableTypeList varTypeList); - /** - * Gets the experiments of the first Instance. - * - * @param dataSetId the data set id - * @param start the start - * @param numOfRows the num of rows - * @return the experiments - */ - List getExperimentsOfFirstInstance(final int dataSetId, final int start, final int numOfRows); - - /** - * Gets the treatment factor variables of the study - * - * @param dataSetId - * @return - */ - VariableTypeList getTreatmentFactorVariableTypes(final int dataSetId); - /** * Get the number of experiments in a dataset. Retrieves from central if the given ID is positive, otherwise retrieves from local. * @@ -253,15 +238,6 @@ void addExperiment( */ void addOrUpdateExperiment(final CropType crop, int dataSetId, ExperimentType experimentType, List experimentValues); - /** - * Adds a Trial Environment. Accepts a variable list and sets up the trial environment data in the local database. It will throw an - * exception if the variable in the variable list passed is not recognized for trial environment. - * - * @param variableList the variable list - * @return ID of the trial environment data created. - */ - int addTrialEnvironment(VariableList variableList); - /** * Adds a Stock entry. Accepts a variable list and sets up the stock data in the local database. It will throw an exception if the * variable in the variable list is not a stock variable. @@ -384,11 +360,11 @@ void saveTrialDatasetSummary( * Retrieve all field map labels in the block of the specified trial instance id. * * @param datasetId the dataset id - * @param geolocationId the geolocation id + * @param environmentId the environment id * @return the all field maps in block by trial instance id */ List getAllFieldMapsInBlockByTrialInstanceId( - int datasetId, int geolocationId, + int datasetId, int environmentId, CrossExpansionProperties crossExpansionProperties); /** @@ -447,13 +423,12 @@ List getAllFieldMapsInBlockByTrialInstanceId( DmsProject getParentFolder(int id); /** - * Returns the datasetId of dataset to which the studyDbId (nd_geolocation_id) belongs to. - * In Brapi, studyDbId is the environment/instance (nd_geolocation_id) - * @param studyDbId + * Returns the datasetId of dataset to which the environment id belongs to. + * @param environmentId * @param datasetType * @return */ - Integer getDatasetIdByEnvironmentIdAndDatasetType(final Integer studyDbId, final DatasetTypeEnum datasetType); + Integer getDatasetIdByEnvironmentIdAndDatasetType(final Integer environmentId, final DatasetTypeEnum datasetType); /** @@ -630,31 +605,23 @@ List getAllFieldMapsInBlockByTrialInstanceId( */ void updateVariableOrdering(int datasetId, List variableIds); - /** - * Retrieves the trial instance number by geolocation id - * - * @param geolocationId - * @return trial instance number - */ - public String getTrialInstanceNumberByGeolocationId(int geolocationId); - /** * Retrieves all DMS project names with no program uuid. * * @return list of DMS project names with no programUUID * @ */ - public List getAllSharedProjectNames(); + List getAllSharedProjectNames(); /** - * Checks whether the specified locationIds exist in a given dataset + * Return counts of experiments for given dataset type and environment IDs * * @param studyId * @param datasetTypeId - * @param locationIds + * @param environmentIds * @return */ - boolean checkIfAnyLocationIDsExistInExperiments(int studyId, int datasetTypeId, List locationIds); + Long countExperimentsByDatasetTypeAndEnvironments(int studyId, int datasetTypeId, List environmentIds); /** * Retrieves all the StudySummaries of the DMS Project that matches the conditions: SeasonDbId, LocationDbId and ProgramDbId @@ -676,11 +643,9 @@ List getAllFieldMapsInBlockByTrialInstanceId( List getInstanceMetadata(int studyId); - Phenotype getPhenotypeById(int phenotypeId); + StudyMetadata getStudyMetadataForEnvironmentId(Integer environmentId); - StudyMetadata getStudyMetadataForGeolocationId(Integer geolocationId); - - Map getGeolocationPropsAndValuesByGeolocation(Integer geolocationId, List excludedVariableIds); + Map getEnvironmentVariableIdValuesMap(Integer datasetId, Integer environmentId); Map getProjectPropsAndValuesByStudy(Integer studyId, List excludedVariableIds); @@ -694,11 +659,7 @@ List getAllFieldMapsInBlockByTrialInstanceId( */ Map getExperimentSampleMap(final Integer studyDbId); - /** - * @param studyId - * @return a map of experiments ids with a list of it sampled plants - */ - Map> getExperimentSamplesDTOMap(final Integer studyId); + Map> getExperimentSamplesDTOMap(Integer studyId); /** * Detect the usage of the specified variable in any programs except for the specified programUUID. @@ -711,8 +672,6 @@ List getAllFieldMapsInBlockByTrialInstanceId( boolean isVariableUsedInStudyOrTrialEnvironmentInOtherPrograms( final String variableId, final String variableValue, final String programUUID); - Map getInstanceGeolocationIdsMap(final Integer studyId); - List getAllStudyTypes(); StudyTypeDto getStudyTypeByName(String name); @@ -752,13 +711,11 @@ boolean isVariableUsedInStudyOrTrialEnvironmentInOtherPrograms( boolean areAllInstancesExistInDataset(final Integer datasetId, final Set instanceIds); - String getBlockId(int datasetId, String trialInstance); + String getBlockId(int datasetId, Integer trialInstance); FieldmapBlockInfo getBlockInformation(int blockId); - Boolean instanceExists(final Set instanceIds); - - Map getGeolocationByVariableId(final Integer datasetId, final Integer instanceDbId); + Boolean instancesExist(final Set instanceIds); Map getPhenotypeByVariableId(final Integer datasetId, final Integer instanceDbId); @@ -778,8 +735,4 @@ boolean isVariableUsedInStudyOrTrialEnvironmentInOtherPrograms( */ List getUsersForEnvironment(final Integer instanceId); - List getEnvironmentConditionVariablesByGeoLocationIdAndVariableIds(Integer geolocationId, List variableIds); - - List getEnvironmentDetailVariablesByGeoLocationIdAndVariableIds(Integer geolocationId, List variableIds); - } diff --git a/src/main/java/org/generationcp/middleware/operation/builder/DataSetBuilder.java b/src/main/java/org/generationcp/middleware/operation/builder/DataSetBuilder.java index 6f1f3dd592..d74846a067 100644 --- a/src/main/java/org/generationcp/middleware/operation/builder/DataSetBuilder.java +++ b/src/main/java/org/generationcp/middleware/operation/builder/DataSetBuilder.java @@ -14,7 +14,6 @@ import com.jamonapi.Monitor; import com.jamonapi.MonitorFactory; import org.apache.commons.lang3.StringUtils; -import org.generationcp.middleware.dao.dms.DmsProjectDao; import org.generationcp.middleware.domain.dms.DMSVariableType; import org.generationcp.middleware.domain.dms.DataSet; import org.generationcp.middleware.domain.dms.DatasetReference; @@ -34,11 +33,11 @@ import org.generationcp.middleware.util.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -120,7 +119,7 @@ private DataSet createDataSet(final DmsProject project) { } private Set getLocationIds(final Integer projectId) { - return this.getGeolocationDao().getLocationIds(projectId); + return new HashSet<>(this.daoFactory.getInstanceDao().getEnvironmentIds(projectId)); } private VariableTypeList getVariableTypes(final DmsProject project) { @@ -133,7 +132,7 @@ private VariableTypeList getVariableTypes(final DmsProject project) { return variableTypes.sort(); } - public DmsProject getTrialDataset(final int studyId) { + DmsProject getTrialDataset(final int studyId) { // Get dataset reference with Summary Data type final DatasetReference trialDatasetReference = this.studyDataManager.findOneDataSetReferenceByType(studyId, DatasetTypeEnum.SUMMARY_DATA.getId()); @@ -175,7 +174,7 @@ public Workbook buildCompleteDataset(final int datasetId) { return workbook; } - protected VariableTypeList filterDatasetVariables(final VariableTypeList variables, final boolean isMeasurementDataset) { + VariableTypeList filterDatasetVariables(final VariableTypeList variables, final boolean isMeasurementDataset) { final VariableTypeList newVariables = new VariableTypeList(); if (variables != null) { for (final DMSVariableType variable : variables.getVariableTypes()) { @@ -213,7 +212,7 @@ private VariableTypeList filterVariables(final VariableTypeList variables, final return newList; } - protected DmsProject getDmsProjectById(final int studyId) { + DmsProject getDmsProjectById(final int studyId) { return this.daoFactory.getDmsProjectDAO().getById(studyId); } diff --git a/src/main/java/org/generationcp/middleware/operation/builder/ExperimentBuilder.java b/src/main/java/org/generationcp/middleware/operation/builder/ExperimentBuilder.java index b332c5050e..b6c34a8992 100644 --- a/src/main/java/org/generationcp/middleware/operation/builder/ExperimentBuilder.java +++ b/src/main/java/org/generationcp/middleware/operation/builder/ExperimentBuilder.java @@ -22,11 +22,12 @@ import org.generationcp.middleware.domain.dms.VariableList; import org.generationcp.middleware.domain.dms.VariableTypeList; import org.generationcp.middleware.domain.oms.TermId; +import org.generationcp.middleware.enumeration.DatasetTypeEnum; import org.generationcp.middleware.hibernate.HibernateSessionProvider; +import org.generationcp.middleware.manager.DaoFactory; +import org.generationcp.middleware.pojos.dms.DatasetType; import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.pojos.dms.ExperimentProperty; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; import org.generationcp.middleware.pojos.dms.Phenotype; import org.generationcp.middleware.pojos.dms.StockModel; import org.generationcp.middleware.pojos.dms.StockProperty; @@ -34,31 +35,36 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; + +public class ExperimentBuilder { -public class ExperimentBuilder extends Builder { - private static final Logger LOG = LoggerFactory.getLogger(ExperimentBuilder.class); - - public ExperimentBuilder(final HibernateSessionProvider sessionProviderForLocal) { - super(sessionProviderForLocal); + private final DaoFactory daoFactory; + + public ExperimentBuilder(final HibernateSessionProvider sessionProvider) { + this.daoFactory = new DaoFactory(sessionProvider); } public long count(final int dataSetId) { - return this.getExperimentDao().count(dataSetId); + return this.daoFactory.getExperimentDao().count(dataSetId); } public List build(final int projectId, final TermId type, final int start, final int numOfRows, final VariableTypeList variableTypes) { final List experiments = new ArrayList<>(); final List experimentModels = - this.getExperimentDao().getExperiments(projectId, type.getId(), start, numOfRows); + this.daoFactory.getExperimentDao().getExperiments(projectId, type.getId(), start, numOfRows); + final Map stockModelMap = this.getStockModelMap(experimentModels); - for (final ExperimentModel experimentModel : experimentModels) { - experiments.add(this.createExperiment(experimentModel, variableTypes, stockModelMap)); + final Map environmentsMap = this.getEnvironmentMap(experimentModels, projectId); + for (final ExperimentModel experimentModel : experimentModels) { + experiments.add(this.createExperiment(experimentModel, variableTypes, stockModelMap, environmentsMap)); } return experiments; } @@ -67,9 +73,10 @@ public List build(final int projectId, final TermId type, final int final boolean hasVariableType) { final List experiments = new ArrayList<>(); final List experimentModels = - this.getExperimentDao().getExperiments(projectId, type.getId(), start, numOfRows); + this.daoFactory.getExperimentDao().getExperiments(projectId, type.getId(), start, numOfRows); + final Map environmentsMap = this.getEnvironmentMap(experimentModels, projectId); for (final ExperimentModel experimentModel : experimentModels) { - experiments.add(this.createExperiment(experimentModel, variableTypes, hasVariableType)); + experiments.add(this.createExperiment(experimentModel, variableTypes, hasVariableType, environmentsMap)); } return experiments; } @@ -93,12 +100,15 @@ public List build( try { final List experiments = new ArrayList<>(); final List experimentModels = - this.getExperimentDao().getExperiments(projectId, types, start, numOfRows, false); + this.daoFactory.getExperimentDao().getExperiments(projectId, types, start, numOfRows, false); + + + // to improve, we will get all the stocks already and saved it in a map and pass it as a parameter to avoid multiple query in DB final Map stockModelMap = this.getStockModelMap(experimentModels); - + final Map environmentsMap = this.getEnvironmentMap(experimentModels, projectId); for (final ExperimentModel experimentModel : experimentModels) { - experiments.add(this.createExperiment(experimentModel, variableTypes, stockModelMap)); + experiments.add(this.createExperiment(experimentModel, variableTypes, stockModelMap, environmentsMap)); } return experiments; } finally { @@ -106,6 +116,21 @@ public List build( } } + private Map getEnvironmentMap(final List experimentModels, final Integer projectId) { + final DatasetType datasetType = this.daoFactory.getDmsProjectDAO().getById(projectId).getDatasetType(); + if (datasetType != null) { + if (DatasetTypeEnum.PLOT_DATA.getId() == datasetType.getDatasetTypeId() || DatasetTypeEnum.MEANS_DATA.getId() == datasetType.getDatasetTypeId()) { + return experimentModels.stream().collect(Collectors.toMap(ExperimentModel::getNdExperimentId, ExperimentModel::getParent)); + } else if (datasetType.isSubObservationType()) { + return this.daoFactory.getInstanceDao().getExperimentIdEnvironmentMap(projectId); + } + // If environment dataset, the experiment id is the environment id + return experimentModels.stream().collect(Collectors.toMap(ExperimentModel::getNdExperimentId, e -> e)); + } + // Experiment for the Study project record + return Collections.emptyMap(); + } + public List build(final int projectId, final List types, final int start, final int numOfRows, final VariableTypeList variableTypes, final boolean firstInstance) { final Monitor monitor = MonitorFactory.start("Build Experiments"); @@ -113,12 +138,12 @@ public List build(final int projectId, final List types, fin final List experiments = new ArrayList<>(); final List experimentModels = - this.getExperimentDao().getExperiments(projectId, types, start, numOfRows, firstInstance); + this.daoFactory.getExperimentDao().getExperiments(projectId, types, start, numOfRows, firstInstance); // to improve, we will get all the stocks already and saved it in a map and pass it as a parameter to avoid multiple query in DB final Map stockModelMap = this.getStockModelMap(experimentModels); - + final Map environmentsMap = this.getEnvironmentMap(experimentModels, projectId); for (final ExperimentModel experimentModel : experimentModels) { - experiments.add(this.createExperiment(experimentModel, variableTypes, stockModelMap)); + experiments.add(this.createExperiment(experimentModel, variableTypes, stockModelMap, environmentsMap)); } return experiments; } finally { @@ -126,7 +151,7 @@ public List build(final int projectId, final List types, fin } } - public Experiment buildOne(final int projectId, final TermId type, final VariableTypeList variableTypes) { + Experiment buildOne(final int projectId, final TermId type, final VariableTypeList variableTypes) { final List experiments = this.build(projectId, type, 0, 1, variableTypes); if (experiments != null && !experiments.isEmpty()) { return experiments.get(0); @@ -134,7 +159,7 @@ public Experiment buildOne(final int projectId, final TermId type, final Variabl return null; } - public Experiment buildOne(final int projectId, final TermId type, final VariableTypeList variableTypes, final boolean hasVariableType) + Experiment buildOne(final int projectId, final TermId type, final VariableTypeList variableTypes, final boolean hasVariableType) { final List experiments = this.build(projectId, type, 0, 1, variableTypes, hasVariableType); if (experiments != null && !experiments.isEmpty()) { @@ -144,23 +169,30 @@ public Experiment buildOne(final int projectId, final TermId type, final Variabl } private Experiment createExperiment(final ExperimentModel experimentModel, final VariableTypeList variableTypes, - final Map stockModelMap) { + final Map stockModelMap, final Map environmentsMap) { final Experiment experiment = new Experiment(); experiment.setId(experimentModel.getNdExperimentId()); - experiment.setFactors(this.getFactors(experimentModel, variableTypes, stockModelMap)); + final ExperimentModel environment = environmentsMap.get(experimentModel.getNdExperimentId()); + if (environment != null) { + experiment.setLocationId(environment.getNdExperimentId()); + } + experiment.setFactors(this.getFactors(experimentModel, variableTypes, stockModelMap, environment)); experiment.setVariates(this.getVariates(experimentModel, variableTypes)); - experiment.setLocationId(experimentModel.getGeoLocation().getLocationId()); experiment.setObsUnitId(experimentModel.getObsUnitId()); return experiment; } - private Experiment createExperiment(final ExperimentModel experimentModel, final VariableTypeList variableTypes, final boolean hasVariableType) + private Experiment createExperiment(final ExperimentModel experimentModel, final VariableTypeList variableTypes, + final boolean hasVariableType, final Map environmentsMap) { final Experiment experiment = new Experiment(); experiment.setId(experimentModel.getNdExperimentId()); - experiment.setFactors(this.getFactors(experimentModel, variableTypes, hasVariableType)); + final ExperimentModel environment = environmentsMap.get(experimentModel.getNdExperimentId()); + if (environment != null) { + experiment.setLocationId(environment.getNdExperimentId()); + } + experiment.setFactors(this.getFactors(experimentModel, variableTypes, hasVariableType, environment)); experiment.setVariates(this.getVariates(experimentModel, variableTypes)); - experiment.setLocationId(experimentModel.getGeoLocation().getLocationId()); return experiment; } @@ -186,14 +218,14 @@ private void addVariates(final ExperimentModel experiment, final VariableList va // added this validation for now, to handle the said scenario, otherwise, and NPE is thrown // in the future, trial constant will no longer be saved at the measurements level if (variableType != null) { - Variable var = null; + final Variable var; if (variableType.getStandardVariable().getDataType().getId() == TermId.CATEGORICAL_VARIABLE.getId()) { - var = new Variable(phenotype.getPhenotypeId(), variableType, phenotype.getcValueId()); + var = new Variable(phenotype.getPhenotypeId(), variableType, phenotype.getcValueId()); if (phenotype.getcValueId() == null && phenotype.getValue() != null) { var.setValue(phenotype.getValue()); var.setCustomValue(true); } - + variates.add(var); } else { var = new Variable(phenotype.getPhenotypeId(), variableType, phenotype.getValue()); @@ -206,32 +238,32 @@ private void addVariates(final ExperimentModel experiment, final VariableList va } } - private VariableList getFactors(final ExperimentModel experimentModel, final VariableTypeList variableTypes, final Map stockModelMap) + private VariableList getFactors(final ExperimentModel experimentModel, final VariableTypeList variableTypes, final Map stockModelMap, final ExperimentModel environment) { final VariableList factors = new VariableList(); this.addPlotExperimentFactors(factors, experimentModel, variableTypes, stockModelMap); - this.addLocationFactors(experimentModel, factors, variableTypes); + this.addEnvironmentFactors(experimentModel, factors, variableTypes, environment); return factors.sort(); } - private VariableList getFactors(final ExperimentModel experimentModel, final VariableTypeList variableTypes, final boolean hasVariableType) + private VariableList getFactors(final ExperimentModel experimentModel, final VariableTypeList variableTypes, final boolean hasVariableType, final ExperimentModel environment) { final VariableList factors = new VariableList(); this.addPlotExperimentFactors(factors, experimentModel, variableTypes, hasVariableType); - this.addLocationFactors(experimentModel, factors, variableTypes); + this.addEnvironmentFactors(experimentModel, factors, variableTypes, environment); return factors.sort(); } - private void addLocationFactors(final ExperimentModel experimentModel, final VariableList factors, final VariableTypeList variableTypes) { + private void addEnvironmentFactors(final ExperimentModel experimentModel, final VariableList factors, final VariableTypeList variableTypes, final ExperimentModel environment) { for (final DMSVariableType variableType : variableTypes.getVariableTypes()) { if (PhenotypicType.TRIAL_ENVIRONMENT == variableType.getRole()) { - final Variable variable = this.createLocationFactor(experimentModel.getGeoLocation(), variableType); + final Variable variable = this.createLocationFactor(experimentModel, variableType, environment); if (variable != null) { variable.getVariableType().setRole(PhenotypicType.TRIAL_ENVIRONMENT); variable.getVariableType().getStandardVariable().setPhenotypicType(PhenotypicType.TRIAL_ENVIRONMENT); @@ -241,34 +273,23 @@ private void addLocationFactors(final ExperimentModel experimentModel, final Var } } - protected Variable createLocationFactor(final Geolocation geoLocation, final DMSVariableType variableType) { + Variable createLocationFactor(final ExperimentModel experiment, final DMSVariableType variableType, final ExperimentModel environment) { final StandardVariable standardVariable = variableType.getStandardVariable(); - - if (standardVariable.getId() == TermId.TRIAL_INSTANCE_FACTOR.getId()) { - return new Variable(variableType, geoLocation.getDescription()); - } - if (standardVariable.getId() == TermId.LATITUDE.getId()) { - return new Variable(variableType, geoLocation.getLatitude()); - } - if (standardVariable.getId() == TermId.LONGITUDE.getId()) { - return new Variable(variableType, geoLocation.getLongitude()); - } - if (standardVariable.getId() == TermId.GEODETIC_DATUM.getId()) { - return new Variable(variableType, geoLocation.getGeodeticDatum()); - } - if (standardVariable.getId() == TermId.ALTITUDE.getId()) { - return new Variable(variableType, geoLocation.getAltitude()); + + if (standardVariable.getId() == TermId.TRIAL_INSTANCE_FACTOR.getId() && environment != null) { + return new Variable(variableType, environment.getObservationUnitNo()); } - final String locVal = this.findLocationValue(variableType.getId(), geoLocation.getProperties()); + + final String locVal = this.findLocationValue(variableType.getId(), experiment.getProperties()); if (locVal != null) { return new Variable(variableType, locVal); } return null; } - private String findLocationValue(final int stdVariableId, final List properties) { + private String findLocationValue(final int stdVariableId, final List properties) { if (properties != null) { - for (final GeolocationProperty property : properties) { + for (final ExperimentProperty property : properties) { if (property.getTypeId().equals(stdVariableId)) { return property.getValue(); } @@ -308,21 +329,21 @@ void addGermplasmFactors(final VariableList factors, final ExperimentModel exper if (stockModelMap != null && stockModelMap.get(stockId) != null) { stockModel = stockModelMap.get(stockId); } else { - stockModel = this.getStockBuilder().get(stockId); + stockModel = this.daoFactory.getStockDao().getById(stockId); } - + for (final DMSVariableType variableType : variableTypes.getVariableTypes()) { final Variable var = this.createGermplasmFactor(stockModel, variableType); if(var != null){ factors.add(var); - } + } } } } protected Variable createGermplasmFactor(final StockModel stockModel, final DMSVariableType variableType) { final StandardVariable standardVariable = variableType.getStandardVariable(); - + if (standardVariable.getId() == TermId.ENTRY_NO.getId()) { return new Variable(variableType, stockModel.getUniqueName()); } @@ -344,7 +365,7 @@ protected Variable createGermplasmFactor(final StockModel stockModel, final DMSV if (val != null) { return new Variable(variableType, val); } - + return null; } @@ -363,7 +384,10 @@ private void addExperimentFactors(final VariableList variables, final Experiment { if (experimentModel.getProperties() != null) { for (final ExperimentProperty property : experimentModel.getProperties()) { - variables.add(this.createVariable(property, variableTypes, PhenotypicType.TRIAL_DESIGN)); + // Exclude the BLOCK_ID experiment property because it is not expected to included in the dataset variable list. + if (!property.getTypeId().equals(TermId.BLOCK_ID.getId())) { + variables.add(this.createVariable(property, variableTypes, PhenotypicType.TRIAL_DESIGN)); + } } } } @@ -372,9 +396,12 @@ private void addExperimentFactors(final VariableList variables, final Experiment final boolean hasVariableType) { if (experimentModel.getProperties() != null) { for (final ExperimentProperty property : experimentModel.getProperties()) { - final Variable var = this.createVariable(property, variableTypes, hasVariableType, PhenotypicType.TRIAL_DESIGN); - if (var.getVariableType() != null) { - variables.add(var); + // Exclude the BLOCK_ID experiment property because it is not expected to included in the dataset variable list. + if (!property.getTypeId().equals(TermId.BLOCK_ID.getId())) { + final Variable var = this.createVariable(property, variableTypes, hasVariableType, PhenotypicType.TRIAL_DESIGN); + if (var.getVariableType() != null) { + variables.add(var); + } } } } @@ -398,17 +425,7 @@ protected Variable createVariable(final ExperimentProperty property, final Varia return variable; } - public ExperimentModel getExperimentModel(final int experimentId) { - return this.getExperimentDao().getById(experimentId); - } - public boolean hasFieldmap(final int datasetId) { - return this.getExperimentDao().hasFieldmap(datasetId); - } - - public boolean checkIfStudyHasFieldmap(final int studyId) { - final List geolocationIdsOfStudy = this.getExperimentDao().getLocationIdsOfStudy(studyId); - final List geolocationIdsOfStudyWithFieldmap = this.getExperimentDao().getLocationIdsOfStudyWithFieldmap(studyId); - return geolocationIdsOfStudy.size() == geolocationIdsOfStudyWithFieldmap.size(); + return this.daoFactory.getExperimentDao().hasFieldmap(datasetId); } } diff --git a/src/main/java/org/generationcp/middleware/operation/builder/StandardVariableBuilder.java b/src/main/java/org/generationcp/middleware/operation/builder/StandardVariableBuilder.java index a2990f0ac7..a03dab3692 100644 --- a/src/main/java/org/generationcp/middleware/operation/builder/StandardVariableBuilder.java +++ b/src/main/java/org/generationcp/middleware/operation/builder/StandardVariableBuilder.java @@ -59,7 +59,7 @@ public class StandardVariableBuilder extends Builder { public StandardVariableBuilder(final HibernateSessionProvider sessionProviderForLocal) { super(sessionProviderForLocal); - daoFactory = new DaoFactory(sessionProviderForLocal); + this.daoFactory = new DaoFactory(sessionProviderForLocal); } public StandardVariable create(final int standardVariableId, final String programUUID) { @@ -107,15 +107,6 @@ public List getStandardVariableSummaries(final List getStandardVariableSummariesWithIsAId(final List isAIds) { - final List result = new ArrayList<>(); - if (isAIds != null && !isAIds.isEmpty()) { - final List localVariables = this.getStandardVariableDao().getStandardVariableSummaryWithIsAId(isAIds); - result.addAll(localVariables); - } - return result; - } - private void specialProcessing(final List summaries) { if (summaries == null || summaries.isEmpty()) { return; @@ -127,7 +118,7 @@ private void specialProcessing(final List summaries) { // Now this relationship is linked to the "Property" of the standard variable. (facepalm). if (summary.getProperty() != null) { final List propertyCvTermRelationships = - daoFactory.getCvTermRelationshipDao().getBySubject(summary.getProperty().getId()); + this.daoFactory.getCvTermRelationshipDao().getBySubject(summary.getProperty().getId()); final Term isAOfProperty = this.createTerm(propertyCvTermRelationships, TermId.IS_A); if (isAOfProperty != null) { summary.setIsA(new TermSummary(isAOfProperty.getId(), isAOfProperty.getName(), isAOfProperty.getDefinition())); @@ -150,7 +141,7 @@ public String getCropOntologyId(final Term term) { } final CVTermProperty property = - daoFactory.getCvTermPropertyDao().getOneByCvTermAndType(term.getId(), TermId.CROP_ONTOLOGY_ID.getId()); + this.daoFactory.getCvTermPropertyDao().getOneByCvTermAndType(term.getId(), TermId.CROP_ONTOLOGY_ID.getId()); if (property != null) { cropOntologyId = property.getValue(); } @@ -186,13 +177,13 @@ public List createSynonyms(final int cvTermId) { return this.getNameSynonymBuilder().create(synonyms); } - public List createTermProperties(final int cvTermId) { + private List createTermProperties(final int cvTermId) { final List cvTermProperties = this.getTermPropertyBuilder().findProperties(cvTermId); return this.getTermPropertyBuilder().create(cvTermProperties); } private CVTerm getCvTerm(final int id) { - return daoFactory.getCvTermDao().getById(id); + return this.daoFactory.getCvTermDao().getById(id); } public StandardVariable findOrSave( @@ -287,7 +278,7 @@ public VariableType mapPhenotypicTypeToDefaultVariableType(final PhenotypicType } public StandardVariable getByName(final String name, final String programUUID) { - final CVTerm cvTerm = daoFactory.getCvTermDao().getByNameAndCvId(name, CvId.VARIABLES.getId()); + final CVTerm cvTerm = this.daoFactory.getCvTermDao().getByNameAndCvId(name, CvId.VARIABLES.getId()); if (cvTerm != null && cvTerm.getCvTermId() != null) { return this.getStandardVariableBuilder().create(cvTerm.getCvTermId(), programUUID); } @@ -306,7 +297,7 @@ public StandardVariable getByPropertyScaleMethod( return standardVariable; } - public StandardVariable getByPropertyScaleMethodRole( + StandardVariable getByPropertyScaleMethodRole( final Integer propertyId, final Integer scaleId, final Integer methodId, final PhenotypicType role, final String programUUID) { @@ -320,7 +311,7 @@ public StandardVariable getByPropertyScaleMethodRole( public Integer getIdByPropertyScaleMethod(final Integer propertyId, final Integer scaleId, final Integer methodId) { Integer stdVariableId = null; - stdVariableId = daoFactory.getCvTermDao().getStandadardVariableIdByPropertyScaleMethod(propertyId, scaleId, methodId, "DESC"); + stdVariableId = this.daoFactory.getCvTermDao().getStandadardVariableIdByPropertyScaleMethod(propertyId, scaleId, methodId, "DESC"); return stdVariableId; } @@ -333,7 +324,7 @@ public Map> getStandardVariablesInProjects(final // Trim all header names final List headerNamesTrimmed = new ArrayList<>(Lists.transform(headerNames, new Function() { - public String apply(String s) { + public String apply(final String s) { // Transform header names to uppercase; header names can be in lowercase or combination when defined in file return s.toUpperCase().trim(); } @@ -386,7 +377,7 @@ public String apply(String s) { // For headers with no match, just assign an empty list. for (final String name : headerNamesTrimmed) { - standardVariablesInProjects.put(name, new ArrayList()); + standardVariablesInProjects.put(name, new ArrayList<>()); } return standardVariablesInProjects; @@ -404,7 +395,7 @@ private void removeHeaderNamesWithMatch( } } - protected void setRoleOfVariables(final List variables, final Map varIdsWithType) { + void setRoleOfVariables(final List variables, final Map varIdsWithType) { for (final StandardVariable standardVariable : variables) { final VariableType type = varIdsWithType.get(standardVariable.getId()); if (type != null) { @@ -417,7 +408,7 @@ protected void setRoleOfVariables(final List variables, final * @param variableNames * @return a map with Property names (In UPPERCASE) as keys and a map(variableId, variableType) as Value */ - public Map> getStandardVariableIdsWithTypeForProjectProperties( + private Map> getStandardVariableIdsWithTypeForProjectProperties( final List variableNames, final String programUUID) { if (!variableNames.isEmpty()) { return this.getProjectPropertyDao().getStandardVariableIdsWithTypeByAlias(variableNames, programUUID); @@ -425,7 +416,7 @@ public Map> getStandardVariableIdsWithTypeFor return new HashMap<>(); } - public Map> getStandardVariableIdsWithTypeByAliasInVariableOverrideTable( + private Map> getStandardVariableIdsWithTypeByAliasInVariableOverrideTable( final List variableNames, final String programUUID) { if (!variableNames.isEmpty()) { return this.getVariableProgramOverridesDao().getVariableOverridesByVariableIdsAndProgram(variableNames, programUUID); @@ -433,49 +424,47 @@ public Map> getStandardVariableIdsWithTypeByA return new HashMap<>(); } - public Map> getStandardVariableIdsWithTypeForTerms(final List termNames) { + private Map> getStandardVariableIdsWithTypeForTerms(final List termNames) { if (!termNames.isEmpty()) { - return daoFactory.getCvTermDao().getTermIdsWithTypeByNameOrSynonyms(termNames, CvId.VARIABLES.getId()); + return this.daoFactory.getCvTermDao().getTermIdsWithTypeByNameOrSynonyms(termNames, CvId.VARIABLES.getId()); } return new HashMap<>(); } - public Map> getStandardVariableIdsForTraits(final List traitNames) { + private Map> getStandardVariableIdsForTraits(final List traitNames) { if (!traitNames.isEmpty()) { - return daoFactory.getCvTermDao().getStandardVariableIdsWithTypeByProperties(traitNames); + return this.daoFactory.getCvTermDao().getStandardVariableIdsWithTypeByProperties(traitNames); } return new HashMap<>(); } public Integer getIdByTermId(final int cvTermId, final TermId termId) { - Integer stdVariableId = null; - stdVariableId = daoFactory.getCvTermDao().getStandardVariableIdByTermId(cvTermId, termId); + final Integer stdVariableId; + stdVariableId = this.daoFactory.getCvTermDao().getStandardVariableIdByTermId(cvTermId, termId); return stdVariableId; } public CVTerm getCvTerm(final String name, final int cvId) { - return daoFactory.getCvTermDao().getByNameAndCvId(name, cvId); + return this.daoFactory.getCvTermDao().getByNameAndCvId(name, cvId); } public Integer getIdByPropertyScaleMethodRole( final Integer propertyId, final Integer scaleId, final Integer methodId, final PhenotypicType role) { - Integer stdVariableId = null; - stdVariableId = daoFactory.getCvTermDao().getStandadardVariableIdByPropertyScaleMethodRole(propertyId, scaleId, methodId, role); + final Integer stdVariableId; + stdVariableId = this.daoFactory.getCvTermDao().getStandadardVariableIdByPropertyScaleMethodRole(propertyId, scaleId, methodId, role); return stdVariableId; } public boolean validateEnumerationUsage(final int standardVariableId, final int enumerationId) { final Integer storedInId = - daoFactory.getCvTermRelationshipDao().getObjectIdByTypeAndSubject(TermId.STORED_IN.getId(), standardVariableId).get(0); + this.daoFactory.getCvTermRelationshipDao().getObjectIdByTypeAndSubject(TermId.STORED_IN.getId(), standardVariableId).get(0); final String value = String.valueOf(enumerationId); if (storedInId == TermId.STUDY_INFO_STORAGE.getId() || storedInId == TermId.DATASET_INFO_STORAGE.getId()) { return !this.isExistsPropertyByTypeAndValue(standardVariableId, value); } else if (storedInId == TermId.GERMPLASM_ENTRY_STORAGE.getId()) { return !this.isExistsStocksByTypeAndValue(standardVariableId, value); - } else if (storedInId == TermId.TRIAL_ENVIRONMENT_INFO_STORAGE.getId()) { - return !this.isExistsGeolocationByTypeAndValue(standardVariableId, value); - } else if (storedInId == TermId.TRIAL_DESIGN_INFO_STORAGE.getId()) { + } else if (storedInId == TermId.TRIAL_ENVIRONMENT_INFO_STORAGE.getId() || storedInId == TermId.TRIAL_DESIGN_INFO_STORAGE.getId()) { return !this.isExistsExperimentsByTypeAndValue(standardVariableId, value); } else if (storedInId == TermId.CATEGORICAL_VARIATE.getId()) { return !this.isExistsPhenotypeByTypeAndValue(standardVariableId, value, true); @@ -484,11 +473,6 @@ public boolean validateEnumerationUsage(final int standardVariableId, final int } } - private boolean isExistsGeolocationByTypeAndValue(final int factorId, final String value) { - final Set geolocationIds = - new HashSet<>(this.getGeolocationPropertyDao().getGeolocationIdsByPropertyTypeAndValue(factorId, value)); - return !geolocationIds.isEmpty(); - } private boolean isExistsStocksByTypeAndValue(final Integer factorId, final String value) { final Set stockIds = new HashSet<>(this.getStockPropertyDao().getStockIdsByPropertyTypeAndValue(factorId, value)); @@ -512,6 +496,6 @@ private boolean isExistsPhenotypeByTypeAndValue(final Integer variateId, final S } public List findAllByProperty(final int propertyId) { - return new ArrayList<>(daoFactory.getCvTermDao().getStandardVariablesOfProperty(propertyId)); + return new ArrayList<>(this.daoFactory.getCvTermDao().getStandardVariablesOfProperty(propertyId)); } } diff --git a/src/main/java/org/generationcp/middleware/operation/builder/TraitBuilder.java b/src/main/java/org/generationcp/middleware/operation/builder/TraitBuilder.java index 47008155c2..3d958eacdd 100644 --- a/src/main/java/org/generationcp/middleware/operation/builder/TraitBuilder.java +++ b/src/main/java/org/generationcp/middleware/operation/builder/TraitBuilder.java @@ -11,13 +11,6 @@ package org.generationcp.middleware.operation.builder; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import org.generationcp.middleware.domain.h2h.CategoricalTraitInfo; import org.generationcp.middleware.domain.h2h.CharacterTraitInfo; import org.generationcp.middleware.domain.h2h.NumericTraitInfo; @@ -28,30 +21,39 @@ import org.generationcp.middleware.hibernate.HibernateSessionProvider; import org.generationcp.middleware.manager.DaoFactory; import org.generationcp.middleware.pojos.oms.CVTerm; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; public class TraitBuilder extends Builder { private static final List NUMERIC_VARIABLE_TYPE = Arrays.asList(TermId.NUMERIC_VARIABLE.getId(), TermId.DATE_VARIABLE.getId()); - private DaoFactory daoFactory; + private final DaoFactory daoFactory; public TraitBuilder(final HibernateSessionProvider sessionProviderForLocal) { super(sessionProviderForLocal); this.daoFactory = new DaoFactory(sessionProviderForLocal); } - public List getTraitsForNumericVariates(final List environmentIds) { - final List numericTraitInfoList = new ArrayList<>(); - final List variableTerms = new ArrayList<>(); - final List variableIds = new ArrayList<>(); - - // Get locationCount, germplasmCount, observationCount, minValue, - // maxValue + public List getTraitsForNumericVariates(final List environmentIds, final List selectedTraitIds) { + // Get locationCount, germplasmCount, observationCount, minValue, maxValue // Retrieve traits environments - variableTerms.addAll(daoFactory.getCvTermDao().getVariablesByType(TraitBuilder.NUMERIC_VARIABLE_TYPE)); - variableIds.addAll(this.getVariableIds(variableTerms)); - numericTraitInfoList.addAll(this.getPhenotypeDao().getNumericTraitInfoList(environmentIds, variableIds)); + final List variableTerms = new ArrayList<>( + this.daoFactory.getCvTermDao().getVariablesByType(TraitBuilder.NUMERIC_VARIABLE_TYPE)); + final List allNumericTraitIds = new ArrayList<>(this.getVariableIds(variableTerms)); + + // If selected traits were specified, filter to numeric variable types + final List numericTraitInfoList = new ArrayList<>(this.getPhenotypeDao().getNumericTraitInfoList(environmentIds, + CollectionUtils.isEmpty(selectedTraitIds) ? allNumericTraitIds : allNumericTraitIds.stream().filter(selectedTraitIds::contains).collect( + Collectors.toList()))); Collections.sort(numericTraitInfoList); @@ -76,15 +78,18 @@ public List getTraitsForNumericVariates(final List en return numericTraitInfoList; } - public List getTraitsForCharacterVariates(final List environmentIds) { - final List characterTraitInfoList = new ArrayList<>(); - final List variableTerms = new ArrayList<>(); - // Get character variable terms - variableTerms.addAll(daoFactory.getCvTermDao().getVariablesByType(Arrays.asList(TermId.CHARACTER_VARIABLE.getId()))); + public List getTraitsForCharacterVariates(final List environmentIds, final List selectedTraitIds) { + final List characterTraitInfoList = new ArrayList<>(); + final List variableTerms = new ArrayList<>( + this.daoFactory.getCvTermDao().getVariablesByType(Collections.singletonList(TermId.CHARACTER_VARIABLE.getId()))); // Get location, germplasm and observation counts - final List traitInfoList = this.getTraitCounts(this.getVariableIds(variableTerms), environmentIds); + // If selected traits were specified, filter to character variable types + final List allCharacterTraitIds = this.getVariableIds(variableTerms); + final List traitInfoList = this.getTraitCounts(CollectionUtils.isEmpty(selectedTraitIds) ? allCharacterTraitIds : + allCharacterTraitIds.stream().filter(selectedTraitIds::contains).collect( + Collectors.toList()), environmentIds); // Set name and description for (final TraitInfo traitInfo : traitInfoList) { for (final CVTerm variable : variableTerms) { @@ -123,14 +128,12 @@ public List getTraitsForCharacterVariates(final List getTraitsForCategoricalVariates(final List environmentIds) { + public List getTraitsForCategoricalVariates(final List environmentIds, final List selectedTraitIds) { final List localCategTraitList = new ArrayList<>(); final List finalTraitInfoList = new ArrayList<>(); // Get locationCount, germplasmCount, observationCount - final List localTraitInfoList = new ArrayList<>(); - - localTraitInfoList.addAll(this.getPhenotypeDao().getTraitInfoCounts(environmentIds)); + final List localTraitInfoList = new ArrayList<>(this.getPhenotypeDao().getTraitInfoCounts(environmentIds, selectedTraitIds)); Collections.sort(localTraitInfoList); @@ -142,7 +145,7 @@ public List getTraitsForCategoricalVariates(final List getTraitsForCategoricalVariates(final List getTraitCounts(final List variableIds, final List environmentIds) { - final List traitInfoList = new ArrayList<>(); - // Get locationCount, germplasmCount, observationCount - traitInfoList.addAll(this.getPhenotypeDao().getTraitInfoCounts(environmentIds, variableIds)); - return traitInfoList; + return this.getPhenotypeDao().getTraitInfoCounts(environmentIds, variableIds); } private List getVariableIds(final List variableTerms) { @@ -175,11 +175,13 @@ private void getMedianValues(final List numericTraitInfoList, // error for large DBs if (environmentIds.size() > 1000) { for (final NumericTraitInfo traitInfo : numericTraitInfoList) { - traitValues.putAll(this.getPhenotypeDao().getNumericTraitInfoValues(environmentIds, traitInfo.getId())); + traitValues.putAll(this.getPhenotypeDao().getNumericTraitInfoValues(environmentIds, Collections.singletonList(traitInfo.getId()))); this.getMedianValue(traitValues, traitInfo); } } else { - traitValues.putAll(this.getPhenotypeDao().getNumericTraitInfoValues(environmentIds, numericTraitInfoList)); + traitValues.putAll( + this.getPhenotypeDao().getNumericTraitInfoValues(environmentIds, numericTraitInfoList.stream().map(t -> t.getId()).collect( + Collectors.toList()))); for (final NumericTraitInfo traitInfo : numericTraitInfoList) { this.getMedianValue(traitValues, traitInfo); } diff --git a/src/main/java/org/generationcp/middleware/operation/builder/TrialEnvironmentBuilder.java b/src/main/java/org/generationcp/middleware/operation/builder/TrialEnvironmentBuilder.java index 829c8ea0f0..fb55d8dfd5 100644 --- a/src/main/java/org/generationcp/middleware/operation/builder/TrialEnvironmentBuilder.java +++ b/src/main/java/org/generationcp/middleware/operation/builder/TrialEnvironmentBuilder.java @@ -24,9 +24,10 @@ import org.generationcp.middleware.domain.h2h.GermplasmPair; import org.generationcp.middleware.domain.oms.TermId; import org.generationcp.middleware.hibernate.HibernateSessionProvider; +import org.generationcp.middleware.manager.DaoFactory; import org.generationcp.middleware.pojos.dms.DmsProject; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; +import org.generationcp.middleware.pojos.dms.ExperimentModel; +import org.generationcp.middleware.pojos.dms.ExperimentProperty; import javax.annotation.Resource; import java.util.ArrayList; @@ -41,21 +42,25 @@ public class TrialEnvironmentBuilder extends Builder { @Resource private DataSetBuilder dataSetBuilder; + private DaoFactory daoFactory; + public TrialEnvironmentBuilder() { } public TrialEnvironmentBuilder(final HibernateSessionProvider sessionProviderForLocal) { super(sessionProviderForLocal); + this.daoFactory = new DaoFactory(sessionProviderForLocal); } public TrialEnvironments getTrialEnvironmentsInDataset(final int studyId, final int datasetId) { final DmsProject project = this.dataSetBuilder.getTrialDataset(studyId); - final DataSet dataSet = this.dataSetBuilder.build(project.getProjectId()); + final Integer environmentDatasetId = project.getProjectId(); + final DataSet dataSet = this.dataSetBuilder.build(environmentDatasetId); final Study study = this.getStudyBuilder().createStudy(dataSet.getStudyId()); final VariableTypeList trialEnvironmentVariableTypes = this.getTrialEnvironmentVariableTypes(study, dataSet); - final Set locations = this.getGeoLocations(datasetId); + final List locations = this.daoFactory.getInstanceDao().getEnvironmentsByDataset(datasetId, environmentDatasetId.equals(datasetId)); return this.buildTrialEnvironments(locations, trialEnvironmentVariableTypes); } @@ -67,48 +72,36 @@ private VariableTypeList getTrialEnvironmentVariableTypes(final Study study, fin return trialEnvironmentVariableTypes; } - private Set getGeoLocations(final int datasetId) { - return this.getGeolocationDao().findInDataSet(datasetId); - } - - private TrialEnvironments buildTrialEnvironments(final Set locations, + private TrialEnvironments buildTrialEnvironments(final List locations, final VariableTypeList trialEnvironmentVariableTypes) { final TrialEnvironments trialEnvironments = new TrialEnvironments(); - for (final Geolocation location : locations) { + for (final ExperimentModel location : locations) { final VariableList variables = new VariableList(); for (final DMSVariableType variableType : trialEnvironmentVariableTypes.getVariableTypes()) { final Variable variable = new Variable(variableType, this.getValue(location, variableType)); variables.add(variable); } - trialEnvironments.add(new TrialEnvironment(location.getLocationId(), variables)); + trialEnvironments.add(new TrialEnvironment(location.getNdExperimentId(), variables)); } return trialEnvironments; } - private String getValue(final Geolocation location, final DMSVariableType variableType) { - String value = null; + private String getValue(final ExperimentModel location, final DMSVariableType variableType) { + final String value; final int id = variableType.getStandardVariable().getId(); if (id == TermId.TRIAL_INSTANCE_FACTOR.getId()) { - value = location.getDescription(); - } else if (id == TermId.LATITUDE.getId()) { - value = location.getLatitude() == null ? null : Double.toString(location.getLatitude()); - } else if (id == TermId.LONGITUDE.getId()) { - value = location.getLongitude() == null ? null : Double.toString(location.getLongitude()); - } else if (id == TermId.GEODETIC_DATUM.getId()) { - value = location.getGeodeticDatum(); - } else if (id == TermId.ALTITUDE.getId()) { - value = location.getAltitude() == null ? null : Double.toString(location.getAltitude()); + value = String.valueOf(location.getObservationUnitNo()); } else { value = this.getPropertyValue(variableType.getId(), location.getProperties()); } return value; } - private String getPropertyValue(final int id, final List properties) { + private String getPropertyValue(final int id, final List properties) { String value = null; if (properties != null) { - for (final GeolocationProperty property : properties) { + for (final ExperimentProperty property : properties) { if (property.getTypeId() == id) { value = property.getValue(); break; @@ -120,16 +113,16 @@ private String getPropertyValue(final int id, final List pr public TrialEnvironments getAllTrialEnvironments() { final TrialEnvironments environments = new TrialEnvironments(); - environments.addAll(this.getGeolocationDao().getAllTrialEnvironments()); + environments.addAll(this.daoFactory.getInstanceDao().getAllTrialEnvironments()); return environments; } public long countAllTrialEnvironments() { - return this.getGeolocationDao().countAllTrialEnvironments(); + return this.daoFactory.getInstanceDao().countAllTrialEnvironments(); } public List getPropertiesForTrialEnvironments(final List environmentIds) { - return this.getGeolocationDao().getPropertiesForTrialEnvironments(environmentIds); + return this.daoFactory.getInstanceDao().getPropertiesForTrialEnvironments(environmentIds); } public List getEnvironmentForGermplasmPairs(final List germplasmPairs, @@ -143,7 +136,7 @@ public List getEnvironmentForGermplasmPairs(final List> germplasmEnvironments = this.getExperimentDao().getEnvironmentsOfGermplasms(allGids, programUUID); + final Map> germplasmEnvironments = this.getExperimentDao().getStudyInstancesForGermplasm(allGids, programUUID); // Step 2: Get the trial environment details final Set trialEnvironmentDetails = new HashSet<>(); @@ -151,7 +144,7 @@ public List getEnvironmentForGermplasmPairs(final List localTrialEnvironments = - this.getPhenotypeDao().getEnvironmentTraits(trialEnvironmentDetails, experimentTypes); + this.getPhenotypeDao().getEnvironmentTraits(trialEnvironmentDetails, experimentTypes, programUUID); trialEnvironments.addAll(localTrialEnvironments); // Step 4: Build germplasm pairs. Get what's common between GID1 AND GID2 @@ -161,8 +154,8 @@ public List getEnvironmentForGermplasmPairs(final List> germplasmEnvironments, final Set trialEnvironmentDetails) { - final Set localEnvironmentIds = this.getEnvironmentIdsFromMap(germplasmEnvironments); - trialEnvironmentDetails.addAll(this.getGeolocationDao().getTrialEnvironmentDetails(localEnvironmentIds)); + final Set environmentIds = this.getEnvironmentIdsFromMap(germplasmEnvironments); + trialEnvironmentDetails.addAll(this.daoFactory.getInstanceDao().getTrialEnvironmentDetails(environmentIds)); } private void buildGermplasmPairsBetweenGids(final List germplasmPairs, @@ -200,10 +193,7 @@ private Set getEnvironmentIdsFromMap(final Map> g final Set idsToReturn = new HashSet<>(); for (final Entry> environmentIds : germplasmEnvironments.entrySet()) { - final Set ids = environmentIds.getValue(); - for (final Integer id : ids) { - idsToReturn.add(id); - } + idsToReturn.addAll(environmentIds.getValue()); } return idsToReturn; @@ -211,7 +201,7 @@ private Set getEnvironmentIdsFromMap(final Map> g public TrialEnvironments getEnvironmentsForTraits(final List traitIds, final String programUUID) { final TrialEnvironments environments = new TrialEnvironments(); - environments.addAll(this.getGeolocationDao().getEnvironmentsForTraits(traitIds, programUUID)); + environments.addAll(this.daoFactory.getInstanceDao().getEnvironmentsForTraits(traitIds, programUUID)); return environments; } diff --git a/src/main/java/org/generationcp/middleware/operation/builder/WorkbookBuilder.java b/src/main/java/org/generationcp/middleware/operation/builder/WorkbookBuilder.java index 4593ac09d0..5d3d0146fc 100644 --- a/src/main/java/org/generationcp/middleware/operation/builder/WorkbookBuilder.java +++ b/src/main/java/org/generationcp/middleware/operation/builder/WorkbookBuilder.java @@ -15,10 +15,10 @@ import com.jamonapi.MonitorFactory; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; -import org.generationcp.middleware.dao.dms.GeolocationPropertyDao; import org.generationcp.middleware.domain.dms.DMSVariableType; import org.generationcp.middleware.domain.dms.DataSet; import org.generationcp.middleware.domain.dms.DatasetReference; +import org.generationcp.middleware.domain.dms.EnvironmentPropertyDao; import org.generationcp.middleware.domain.dms.Experiment; import org.generationcp.middleware.domain.dms.PhenotypicType; import org.generationcp.middleware.domain.dms.StandardVariable; @@ -45,7 +45,6 @@ import org.generationcp.middleware.pojos.ErrorCode; import org.generationcp.middleware.pojos.Method; import org.generationcp.middleware.pojos.dms.DmsProject; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.dms.Phenotype; import org.generationcp.middleware.pojos.dms.ProjectProperty; import org.generationcp.middleware.pojos.oms.CVTerm; @@ -146,7 +145,7 @@ public Workbook create(final int id) { // FIXME : this heavy id fetch pattern needs changing final int dataSetId = this.getMeasurementDataSetId(id); // validation, bring inline - this.checkMeasurementDataset(Integer.valueOf(dataSetId)); + this.checkMeasurementDataset(dataSetId); workbook.setMeasurementDatesetId(dataSetId); // Variables required to get Experiments (?) @@ -181,7 +180,7 @@ public Workbook create(final int id) { final Map projectPropRoleMapping = this .generateProjectPropertyRoleMap(projectProperties); - final GeolocationPropertyDao geolocationPropertyDao = this.daoFactory.getGeolocationPropertyDao(); + final EnvironmentPropertyDao environmentPropertyDao = this.daoFactory.getEnvironmentPropertyDao(); for (final ProjectProperty projectProperty : projectProperties) { // FIXME DA IN A LOOP final StandardVariable stdVariable = this.getStandardVariableBuilder() @@ -202,9 +201,9 @@ public Workbook create(final int id) { if (WorkbookBuilder.EXPERIMENTAL_DESIGN_VARIABLES.contains(stdVariableId)) { String value = projectProperty.getValue(); - // During import of study, experiment design values are not set in ProjectProperty so we resolve them from GeolocationProperty + // During import of study, experiment design values are not set in ProjectProperty so we resolve them from ExperimentProperty if (value == null && VariableType.ENVIRONMENT_DETAIL.equals(varType)) { - value = geolocationPropertyDao.getGeolocationPropValue(stdVariableId, id); + value = environmentPropertyDao.getVariableValue(stdVariableId, id); } final MeasurementVariable measurementVariable = @@ -231,28 +230,6 @@ public Workbook create(final int id) { return workbook; } - private String getVariableValueFromGeolocation(final int stdVariableId, final String value, final Geolocation geolocation) { - - if (geolocation != null) { - if (TermId.TRIAL_INSTANCE_FACTOR.getId() == stdVariableId) { - return geolocation.getDescription(); - - } else if (TermId.LATITUDE.getId() == stdVariableId && geolocation.getLatitude() != null) { - return geolocation.getLatitude().toString(); - - } else if (TermId.LONGITUDE.getId() == stdVariableId && geolocation.getLongitude() != null) { - return geolocation.getLongitude().toString(); - - } else if (TermId.GEODETIC_DATUM.getId() == stdVariableId && geolocation.getGeodeticDatum() != null) { - geolocation.setGeodeticDatum(value); - - } else if (TermId.ALTITUDE.getId() == stdVariableId && geolocation.getAltitude() != null) { - return geolocation.getAltitude().toString(); - } - } - return value; - } - private void populateBreedingMethodPossibleValues(final List variates) { final Monitor monitor = MonitorFactory.start("OpenTrial.bms.middleware.WorkbookBuilder.populateBreedingMethodPossibleValues"); @@ -274,7 +251,7 @@ private void populateBreedingMethodPossibleValues(final List buildConditionVariables( + Set buildConditionVariables( final VariableList studyConditionVariables, final VariableList trialEnvironmentVariables) { // we set roles here (study, trial, variate) which seem to match the @@ -291,7 +268,7 @@ private List getTrialObservations(final Workbook workbook) { return trialObservations; } - protected void checkMeasurementDataset(final Integer dataSetId) { + void checkMeasurementDataset(final Integer dataSetId) { // if study has no measurementDataset, throw an error as it is an // invalid template if (dataSetId == null || dataSetId.equals(0)) { @@ -364,7 +341,7 @@ public Workbook createStudyVariableSettings(final int id) { final DmsProject dmsProject = this.dataSetBuilder.getTrialDataset(id); final List experimentalDesignVariables = new ArrayList<>(); final List projectProperties = dmsProject != null ? dmsProject.getProperties() - : new ArrayList(); + : new ArrayList<>(); final Map projectPropRoleMapping = this .generateProjectPropertyRoleMap(projectProperties); @@ -549,7 +526,7 @@ void addMeasurementDataForFactors( * @param experimentId * @return MeasurementData */ - protected MeasurementData getMeasurementDataWithSample( + MeasurementData getMeasurementDataWithSample( final Map samplesMap, final int experimentId) { final MeasurementVariable measurementVariable = new MeasurementVariable(); @@ -559,7 +536,7 @@ protected MeasurementData getMeasurementDataWithSample( measurementVariable.setLabel(measurementVariable.getName()); measurementVariable.setFactor(true); measurementVariable.setDataTypeId(DataType.CHARACTER_VARIABLE.getId()); - measurementVariable.setPossibleValues(new ArrayList()); + measurementVariable.setPossibleValues(new ArrayList<>()); final String sampleValue = samplesMap.get(experimentId); return new MeasurementData(String.valueOf(TermId.SAMPLES.getId()), sampleValue, false, "C", measurementVariable); @@ -578,7 +555,7 @@ private Map getExperimentSampleMap(final Integer studyDbId) { return this.studyDataManager.getExperimentSampleMap(studyDbId); } - protected void populateMeasurementData( + void populateMeasurementData( final List variateList, final VariableList variates, final List measurementDataList) { for (final MeasurementVariable variate : variateList) { @@ -621,7 +598,7 @@ private void setValueStatusToMeasurementData(final Variable variable, final Meas } } - protected boolean isCategoricalVariate(final Variable variable) { + private boolean isCategoricalVariate(final Variable variable) { final StandardVariable stdVar = variable.getVariableType().getStandardVariable(); return PhenotypicType.VARIATE == stdVar.getPhenotypicType() && stdVar.getDataType().getId() == TermId.CATEGORICAL_VARIABLE.getId(); @@ -673,7 +650,7 @@ private Set buildStudyMeasurementVariables( return measurementVariableLists; } - protected void setMeasurementVarRoles( + void setMeasurementVarRoles( final Set measurementVariableLists, final boolean isFactor, final boolean isStudy) { final PhenotypicType role; @@ -836,7 +813,7 @@ private MeasurementVariable getMeasurementVariableByName(final String name, fina return var; } - protected VariableList getTrialEnvironmentVariableList(final DataSet trialDataset) { + private VariableList getTrialEnvironmentVariableList(final DataSet trialDataset) { final VariableTypeList typeList = trialDataset.getFactorsByPhenotypicType(PhenotypicType.TRIAL_ENVIRONMENT); final VariableList list = new VariableList(); for (final DMSVariableType type : typeList.getVariableTypes()) { @@ -845,7 +822,7 @@ protected VariableList getTrialEnvironmentVariableList(final DataSet trialDatase return list; } - protected VariableList getTrialConstants(final DataSet trialDataSet) { + private VariableList getTrialConstants(final DataSet trialDataSet) { final VariableTypeList typeList = trialDataSet.getVariableTypes().getVariates(); final VariableList list = new VariableList(); @@ -855,7 +832,7 @@ protected VariableList getTrialConstants(final DataSet trialDataSet) { return list; } - public List buildTrialObservations( + List buildTrialObservations( final int trialDatasetId, final List factorList, final List variateList) { @@ -927,7 +904,7 @@ public List buildTrialObservations( return rows; } - protected VariableTypeList removeTrialDatasetVariables( + VariableTypeList removeTrialDatasetVariables( final VariableTypeList variables, final VariableList toBeDeleted) { final List trialList = new ArrayList<>(); @@ -969,7 +946,7 @@ public int getTrialDataSetId(final int studyId) { } } - public List buildDatasetObservations( + List buildDatasetObservations( final List experiments, final VariableTypeList variateTypes, final List factorList, final List variateList) { @@ -1041,7 +1018,7 @@ private MeasurementData getMeasurementDataFromVariable(final MeasurementVariable // is the ID and not the name if (standardVariableDataTypeId == TermId.CATEGORICAL_VARIABLE.getId() && standardVariable.getId() != TermId.EXPERIMENT_DESIGN_FACTOR.getId()) { - final Integer id = value != null && NumberUtils.isNumber(value) ? Integer.valueOf(value) : null; + final Integer id = NumberUtils.isNumber(value) ? Integer.valueOf(value) : null; return new MeasurementData(variableType.getLocalName(), variable.getDisplayValue(), isEditable, this.getDataType(standardVariableDataTypeId), id, factor); } diff --git a/src/main/java/org/generationcp/middleware/operation/destroyer/Destroyer.java b/src/main/java/org/generationcp/middleware/operation/destroyer/Destroyer.java index f551fa1544..9afc66151d 100644 --- a/src/main/java/org/generationcp/middleware/operation/destroyer/Destroyer.java +++ b/src/main/java/org/generationcp/middleware/operation/destroyer/Destroyer.java @@ -11,7 +11,6 @@ package org.generationcp.middleware.operation.destroyer; -import org.generationcp.middleware.dao.dms.DataSetDao; import org.generationcp.middleware.hibernate.HibernateSessionProvider; import org.generationcp.middleware.operation.saver.ProjectPropertySaver; import org.generationcp.middleware.util.DatabaseBroker; @@ -28,12 +27,6 @@ public Destroyer(HibernateSessionProvider sessionProvider) { super(sessionProvider); } - protected final DataSetDao getDataSetDao() { - DataSetDao dataSetDao = new DataSetDao(); - dataSetDao.setSession(this.getActiveSession()); - return dataSetDao; - } - protected final ProjectPropertySaver getProjectPropertySaver() { return new ProjectPropertySaver(this.sessionProvider); } diff --git a/src/main/java/org/generationcp/middleware/operation/destroyer/ExperimentDestroyer.java b/src/main/java/org/generationcp/middleware/operation/destroyer/ExperimentDestroyer.java deleted file mode 100644 index 446cbc8c66..0000000000 --- a/src/main/java/org/generationcp/middleware/operation/destroyer/ExperimentDestroyer.java +++ /dev/null @@ -1,26 +0,0 @@ - -package org.generationcp.middleware.operation.destroyer; - -import java.util.List; - -import org.generationcp.middleware.exceptions.MiddlewareQueryException; -import org.generationcp.middleware.hibernate.HibernateSessionProvider; - -public class ExperimentDestroyer extends Destroyer { - - public ExperimentDestroyer(HibernateSessionProvider sessionProviderForLocal) { - super(sessionProviderForLocal); - } - - public void deleteExperimentsByIds(List experimentIds) throws MiddlewareQueryException { - this.getExperimentDao().deleteExperimentsByIds(experimentIds); - } - - public void deleteExperimentsByStudy(int datasetId) throws MiddlewareQueryException { - this.getExperimentDao().deleteExperimentsForDataset(datasetId); - } - - public void deleteTrialExperimentsOfStudy(int trialDatasetId) throws MiddlewareQueryException { - this.getExperimentDao().deleteTrialExperimentsOfStudy(trialDatasetId); - } -} diff --git a/src/main/java/org/generationcp/middleware/operation/saver/ExperimentModelSaver.java b/src/main/java/org/generationcp/middleware/operation/saver/ExperimentModelSaver.java index 08431af6e0..37dad9617b 100644 --- a/src/main/java/org/generationcp/middleware/operation/saver/ExperimentModelSaver.java +++ b/src/main/java/org/generationcp/middleware/operation/saver/ExperimentModelSaver.java @@ -10,7 +10,7 @@ package org.generationcp.middleware.operation.saver; -import org.generationcp.middleware.domain.dms.DatasetReference; +import org.generationcp.middleware.domain.dms.DMSVariableType; import org.generationcp.middleware.domain.dms.ExperimentType; import org.generationcp.middleware.domain.dms.PhenotypicType; import org.generationcp.middleware.domain.dms.StudyValues; @@ -24,28 +24,26 @@ import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.pojos.dms.ExperimentProperty; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.workbench.CropType; import org.generationcp.middleware.service.api.ObservationUnitIDGenerator; import org.generationcp.middleware.service.impl.study.ObservationUnitIDGeneratorImpl; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.Optional; @Transactional public class ExperimentModelSaver { - - private DaoFactory daoFactory; - private PhenotypeSaver phenotypeSaver; - private GeolocationSaver geolocationSaver; - private StockModelBuilder stockModelBuilder; + + private final DaoFactory daoFactory; + private final PhenotypeSaver phenotypeSaver; + private final StockModelBuilder stockModelBuilder; public ExperimentModelSaver(final HibernateSessionProvider sessionProvider) { this.daoFactory = new DaoFactory(sessionProvider); this.phenotypeSaver = new PhenotypeSaver(sessionProvider); - this.geolocationSaver = new GeolocationSaver(sessionProvider); this.stockModelBuilder = new StockModelBuilder(sessionProvider); } @@ -59,15 +57,15 @@ public ExperimentModel addExperiment(final CropType crop, final int projectId, f } public void addOrUpdateExperiment(final CropType crop, final int projectId, final ExperimentType experimentType, final Values values) { - final int experimentId = - this.daoFactory.getExperimentDao().getExperimentIdByLocationIdStockId(projectId, values.getLocationId(), - values.getGermplasmId()); - if(experimentId != 0 ) { + final Optional experimentId = + this.daoFactory.getExperimentDao().getExperimentIdByEnvironmentIdStockId(projectId, values.getLocationId(), + values.getGermplasmId()); + if(experimentId.isPresent()) { for (final Variable variable : values.getVariableList().getVariables()) { final int val = this.daoFactory.getPhenotypeDAO() - .updatePhenotypesByExperimentIdAndObervableId(experimentId, variable.getVariableType().getId(), variable.getValue()); + .updatePhenotypesByExperimentIdAndObervableId(experimentId.get(), variable.getVariableType().getId(), variable.getValue()); if (val == 0) { - this.phenotypeSaver.save(experimentId, variable); + this.phenotypeSaver.save(experimentId.get(), variable); } } } else { @@ -87,34 +85,31 @@ private ExperimentModel create(final CropType crop, final int projectId, final V experimentModel.setTypeId(expType.getTermId()); experimentModel.setProperties(this.createTrialDesignExperimentProperties(experimentModel, values.getVariableList())); - if (values.getLocationId() == null && values instanceof StudyValues) { - experimentModel.setGeoLocation(this.createNewGeoLocation()); - } else if (values.getLocationId() != null) { - experimentModel.setGeoLocation(this.daoFactory.getGeolocationDao().getById(values.getLocationId())); + if (values.getLocationId() != null) { + experimentModel.setParent(new ExperimentModel(values.getLocationId())); + } + + if (values.getObservationUnitNo() != null) { + experimentModel.setObservationUnitNo(values.getObservationUnitNo()); } + if (values.getGermplasmId() != null) { experimentModel.setStock(this.stockModelBuilder.get(values.getGermplasmId())); } final ObservationUnitIDGenerator observationUnitIDGenerator = new ObservationUnitIDGeneratorImpl(); - observationUnitIDGenerator.generateObservationUnitIds(crop, Arrays.asList(experimentModel)); + observationUnitIDGenerator.generateObservationUnitIds(crop, Collections.singletonList(experimentModel)); return experimentModel; } - // GCP-8092 Nurseries will always have a unique geolocation, no more concept of shared/common geolocation - public Geolocation createNewGeoLocation() { - final Geolocation location = new Geolocation(); - location.setDescription("1"); - this.daoFactory.getGeolocationDao().save(location); - return location; - } - protected List createTrialDesignExperimentProperties(final ExperimentModel experimentModel, final VariableList factors) { final List experimentProperties = new ArrayList<>(); if (factors != null && factors.getVariables() != null && !factors.getVariables().isEmpty()) { for (final Variable variable : factors.getVariables()) { - if (PhenotypicType.TRIAL_DESIGN == variable.getVariableType().getRole()) { + final DMSVariableType var = variable.getVariableType(); + if (TermId.TRIAL_INSTANCE_FACTOR.getId() != var.getId() && (PhenotypicType.TRIAL_DESIGN == var.getRole() + || PhenotypicType.TRIAL_ENVIRONMENT == var.getRole())) { experimentProperties.add(this.createTrialDesignProperty(experimentModel, variable)); } } @@ -141,27 +136,4 @@ protected ExperimentProperty createTrialDesignProperty(final ExperimentModel exp return experimentProperty; } - public int moveStudyToNewGeolocation(final int studyId) { - final List datasets = this.daoFactory.getDmsProjectDAO().getDirectChildDatasetsOfStudy(studyId); - final List ids = new ArrayList<>(); - ids.add(studyId); - if (datasets != null) { - for (final DatasetReference dataset : datasets) { - ids.add(dataset.getId()); - } - } - - final Geolocation location = this.geolocationSaver.createMinimumGeolocation(); - final List experiments = this.daoFactory.getExperimentDao().getExperimentsByProjectIds(ids); - if (experiments != null && !experiments.isEmpty()) { - for (final ExperimentModel experiment : experiments) { - if (experiment.getGeoLocation().getLocationId().intValue() == 1) { - experiment.setGeoLocation(location); - this.daoFactory.getExperimentDao().update(experiment); - } - } - } - - return location.getLocationId(); - } } diff --git a/src/main/java/org/generationcp/middleware/operation/saver/ExperimentPropertySaver.java b/src/main/java/org/generationcp/middleware/operation/saver/ExperimentPropertySaver.java index 002b200879..c12cb8d75d 100644 --- a/src/main/java/org/generationcp/middleware/operation/saver/ExperimentPropertySaver.java +++ b/src/main/java/org/generationcp/middleware/operation/saver/ExperimentPropertySaver.java @@ -11,42 +11,33 @@ package org.generationcp.middleware.operation.saver; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import org.generationcp.middleware.domain.dms.PhenotypicType; import org.generationcp.middleware.domain.fieldbook.FieldMapDatasetInfo; import org.generationcp.middleware.domain.fieldbook.FieldMapInfo; import org.generationcp.middleware.domain.fieldbook.FieldMapLabel; import org.generationcp.middleware.domain.fieldbook.FieldMapTrialInstanceInfo; import org.generationcp.middleware.domain.oms.TermId; -import org.generationcp.middleware.exceptions.MiddlewareQueryException; import org.generationcp.middleware.hibernate.HibernateSessionProvider; +import org.generationcp.middleware.manager.DaoFactory; import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.pojos.dms.ExperimentProperty; import org.hibernate.SQLQuery; -public class ExperimentPropertySaver extends Saver { +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; - private StringBuilder batchExperimentPropInsertSql = new StringBuilder(); +public class ExperimentPropertySaver { - public ExperimentPropertySaver(HibernateSessionProvider sessionProviderForLocal) { - super(sessionProviderForLocal); - } + private StringBuilder batchExperimentPropInsertSql = new StringBuilder(); + private final HibernateSessionProvider sessionProvider; + private final DaoFactory daoFactory; - public void saveOrUpdateProperty(ExperimentModel experiment, TermId propertyType, String value) throws MiddlewareQueryException { - ExperimentProperty experimentProperty = this.getExperimentProperty(experiment, propertyType.getId()); - if (experimentProperty == null) { - this.getProjectPropertySaver().createProjectPropertyIfNecessary(experiment.getProject(), propertyType, PhenotypicType.TRIAL_DESIGN); - experimentProperty = new ExperimentProperty(); - experimentProperty.setTypeId(propertyType.getId()); - experimentProperty.setRank(0); - experimentProperty.setExperiment(experiment); - } - experimentProperty.setValue(value); - this.getExperimentPropertyDao().saveOrUpdate(experimentProperty); + public ExperimentPropertySaver(final HibernateSessionProvider sessionProvider) { + this.daoFactory = new DaoFactory(sessionProvider); + this.sessionProvider = sessionProvider; } /** @@ -64,21 +55,20 @@ public void saveOrUpdateProperty(ExperimentModel experiment, TermId propertyType * @param value value of property * @param experimentPropertyMap map of experiment wise all experiment properties * @param projectPropCreatedMap map of project property created or not - * @throws MiddlewareQueryException */ - public void saveInBatchOrUpdateProperty(ExperimentModel experiment, TermId propertyType, String value, Map> experimentPropertyMap, Map projectPropCreatedMap) throws MiddlewareQueryException { - ExperimentProperty experimentProperty = this.getExperimentProperty(experiment, propertyType.getId(), experimentPropertyMap); + private void saveInBatchOrUpdateProperty(final ExperimentModel experiment, final TermId propertyType, final String value, final Map> experimentPropertyMap, final Map projectPropCreatedMap) { + final ExperimentProperty experimentProperty = this.getExperimentProperty(experiment, propertyType.getId(), experimentPropertyMap); if (experimentProperty == null) { - String projectPropKey = String.valueOf(experiment.getProject().getProjectId()+"-"+ propertyType); + final String projectPropKey = experiment.getProject().getProjectId()+"-"+ propertyType; if(projectPropCreatedMap.get(projectPropKey) == null){ - this.getProjectPropertySaver().createProjectPropertyIfNecessary(experiment.getProject(), propertyType, PhenotypicType.TRIAL_DESIGN); + new ProjectPropertySaver(this.sessionProvider).createProjectPropertyIfNecessary(experiment.getProject(), propertyType, PhenotypicType.TRIAL_DESIGN); projectPropCreatedMap.put(projectPropKey, true); } - createBatchInsertForExperimentProp(experiment.getNdExperimentId(), propertyType.getId(), 0, value); + this.createBatchInsertForExperimentProp(experiment.getNdExperimentId(), propertyType.getId(), 0, value); } else{ experimentProperty.setValue(value); - this.getExperimentPropertyDao().saveOrUpdate(experimentProperty); + this.daoFactory.getExperimentPropertyDao().saveOrUpdate(experimentProperty); } } @@ -93,26 +83,26 @@ public void saveInBatchOrUpdateProperty(ExperimentModel experiment, TermId prope * @param value value of experiment prop */ private void createBatchInsertForExperimentProp(final int experimentId, final int typeId, final int rank, final String value){ - if(batchExperimentPropInsertSql.length() == 0){ - batchExperimentPropInsertSql = new StringBuilder(); - batchExperimentPropInsertSql.append("insert into nd_experimentprop (nd_experiment_id, type_id, value , rank) values "); - batchExperimentPropInsertSql.append("( "); - batchExperimentPropInsertSql.append(experimentId).append(" , "); - batchExperimentPropInsertSql.append(typeId).append(" , "); - batchExperimentPropInsertSql.append(value).append(" , "); - batchExperimentPropInsertSql.append(rank); - batchExperimentPropInsertSql.append(") "); + if(this.batchExperimentPropInsertSql.length() == 0){ + this.batchExperimentPropInsertSql = new StringBuilder(); + this.batchExperimentPropInsertSql.append("insert into nd_experimentprop (nd_experiment_id, type_id, value , rank) values "); + this.batchExperimentPropInsertSql.append("( "); + this.batchExperimentPropInsertSql.append(experimentId).append(" , "); + this.batchExperimentPropInsertSql.append(typeId).append(" , "); + this.batchExperimentPropInsertSql.append(value).append(" , "); + this.batchExperimentPropInsertSql.append(rank); + this.batchExperimentPropInsertSql.append(") "); return; } - batchExperimentPropInsertSql.append(", ( "); - batchExperimentPropInsertSql.append(experimentId).append(" , "); - batchExperimentPropInsertSql.append(typeId).append(" , "); - batchExperimentPropInsertSql.append(value).append(" , "); - batchExperimentPropInsertSql.append(rank); - batchExperimentPropInsertSql.append(") "); + this.batchExperimentPropInsertSql.append(", ( "); + this.batchExperimentPropInsertSql.append(experimentId).append(" , "); + this.batchExperimentPropInsertSql.append(typeId).append(" , "); + this.batchExperimentPropInsertSql.append(value).append(" , "); + this.batchExperimentPropInsertSql.append(rank); + this.batchExperimentPropInsertSql.append(") "); } - public void saveOrUpdateProperty(ExperimentModel experiment, int propertyType, String value) throws MiddlewareQueryException { + public void saveOrUpdateProperty(final ExperimentModel experiment, final int propertyType, final String value) { ExperimentProperty experimentProperty = this.getExperimentProperty(experiment, propertyType); if (experimentProperty == null) { experimentProperty = new ExperimentProperty(); @@ -121,12 +111,12 @@ public void saveOrUpdateProperty(ExperimentModel experiment, int propertyType, S experimentProperty.setExperiment(experiment); } experimentProperty.setValue(value); - this.getExperimentPropertyDao().saveOrUpdate(experimentProperty); + this.daoFactory.getExperimentPropertyDao().saveOrUpdate(experimentProperty); } - private ExperimentProperty getExperimentProperty(ExperimentModel experiment, int typeId) { + private ExperimentProperty getExperimentProperty(final ExperimentModel experiment, final int typeId) { if (experiment != null && experiment.getProperties() != null) { - for (ExperimentProperty property : experiment.getProperties()) { + for (final ExperimentProperty property : experiment.getProperties()) { if (property.getTypeId().equals(typeId)) { return property; } @@ -135,11 +125,11 @@ private ExperimentProperty getExperimentProperty(ExperimentModel experiment, int return null; } - private ExperimentProperty getExperimentProperty(ExperimentModel experiment, int typeId, Map> experimentPropertyMap) { - List properties = experimentPropertyMap.get(experiment.getNdExperimentId()); + private ExperimentProperty getExperimentProperty(final ExperimentModel experiment, final int typeId, final Map> experimentPropertyMap) { + final List properties = experimentPropertyMap.get(experiment.getNdExperimentId()); if (experiment != null && properties != null) { - for (ExperimentProperty property : properties) { + for (final ExperimentProperty property : properties) { if (property.getTypeId().equals(typeId)) { return property; } @@ -149,26 +139,31 @@ private ExperimentProperty getExperimentProperty(ExperimentModel experiment, int } - public void saveFieldmapProperties(List infos) throws MiddlewareQueryException { + public void saveFieldmapProperties(final List infos) { // create list of all experimentIds that will be used later to load all experiment and its properties at one go - List experimentIds = createExperimentIdsList(infos); + final List experimentIds = this.createExperimentIdsList(infos); // create experimentId wise experiment entity map - Map experimentMap = createExperimentIdWiseMap(experimentIds); + final Map experimentMap = this.daoFactory.getExperimentDao().filterByColumnValues("ndExperimentId", experimentIds).stream().collect( + Collectors.toMap(ExperimentModel::getNdExperimentId, e -> e)); // create experimentId wise experiment properties map - Map> experimentPropertyMap = createExperimentIdWisePropertiesMap(experimentIds); - - Map projectPropCreatedMap = new HashMap<>(); + final Map> experimentPropertyMap = this.createExperimentIdWisePropertiesMap(experimentIds); + + final Map projectPropCreatedMap = new HashMap<>(); + for (final FieldMapInfo info : infos) { + for (final FieldMapDatasetInfo dataset : info.getDatasets()) { + for (final FieldMapTrialInstanceInfo instanceInfo : dataset.getTrialInstances()) { + // Save BLOCK_ID at environment level + if (instanceInfo.getBlockId() != null) { + this.saveOrUpdateEnvironmentProperty(instanceInfo.getEnvironmentId(), TermId.BLOCK_ID.getId(), instanceInfo.getBlockId().toString()); + } - for (FieldMapInfo info : infos) { - for (FieldMapDatasetInfo dataset : info.getDatasets()) { - for (FieldMapTrialInstanceInfo tInfo : dataset.getTrialInstances()) { - if (tInfo.getFieldMapLabels() != null) { - for (FieldMapLabel label : tInfo.getFieldMapLabels()) { + if (instanceInfo.getFieldMapLabels() != null) { + for (final FieldMapLabel label : instanceInfo.getFieldMapLabels()) { if (label.getColumn() != null && label.getRange() != null) { - ExperimentModel experiment = experimentMap.get(label.getExperimentId()); + final ExperimentModel experiment = experimentMap.get(label.getExperimentId()); this.saveInBatchOrUpdateProperty(experiment, TermId.COLUMN_NO, String.valueOf(label.getColumn()), experimentPropertyMap, projectPropCreatedMap); this.saveInBatchOrUpdateProperty(experiment, TermId.RANGE_NO, String.valueOf(label.getRange()), experimentPropertyMap, projectPropCreatedMap); } @@ -178,22 +173,22 @@ public void saveFieldmapProperties(List infos) throws MiddlewareQu } } - if(batchExperimentPropInsertSql.length() != 0){ - batchExperimentPropInsertSql.append(";"); - SQLQuery sqlQuery = this.getActiveSession().createSQLQuery(batchExperimentPropInsertSql.toString()); + if(this.batchExperimentPropInsertSql.length() != 0){ + this.batchExperimentPropInsertSql.append(";"); + final SQLQuery sqlQuery = this.sessionProvider.getSession().createSQLQuery(this.batchExperimentPropInsertSql.toString()); sqlQuery.executeUpdate(); } } private List createExperimentIdsList(final List infos){ - List experimentIds = new ArrayList<>(); + final List experimentIds = new ArrayList<>(); - for (FieldMapInfo info : infos) { - for (FieldMapDatasetInfo dataset : info.getDatasets()) { - for (FieldMapTrialInstanceInfo tInfo : dataset.getTrialInstances()) { + for (final FieldMapInfo info : infos) { + for (final FieldMapDatasetInfo dataset : info.getDatasets()) { + for (final FieldMapTrialInstanceInfo tInfo : dataset.getTrialInstances()) { if (tInfo.getFieldMapLabels() != null) { - for (FieldMapLabel label : tInfo.getFieldMapLabels()) { + for (final FieldMapLabel label : tInfo.getFieldMapLabels()) { if (label.getColumn() != null && label.getRange() != null) { experimentIds.add(label.getExperimentId()); } @@ -205,23 +200,6 @@ private List createExperimentIdsList(final List infos){ return experimentIds; } - /** - * This method will load experiment entity for all experimentIds and put it in map so we do not need to hit DB to load for each - * - * @param experimentIds experimentIds to load - * @return Map experimentId wise experimentModal entity - */ - private Map createExperimentIdWiseMap(final List experimentIds){ - Map experimentMap = new HashMap<>(); - List experiments = this.getExperimentDao().filterByColumnValues("ndExperimentId", experimentIds); - if(experiments != null){ - for(ExperimentModel experimentModel : experiments){ - experimentMap.put(experimentModel.getNdExperimentId(), experimentModel); - } - } - return experimentMap; - } - /** * This method will load experiment properties for all experimentIds and put it in map so we do not need to hit DB to load for each * @@ -229,18 +207,48 @@ private Map createExperimentIdWiseMap(final List> experimentId wise experiment properties */ private Map> createExperimentIdWisePropertiesMap(final List experimentIds){ - List experimentProperties = this.getExperimentPropertyDao().filterByColumnValues("experiment.ndExperimentId", experimentIds); - Map> experimentPropertyMap = new HashMap<>(); + final List experimentProperties = this.daoFactory.getExperimentPropertyDao().filterByColumnValues("experiment.ndExperimentId", experimentIds); + final Map> experimentPropertyMap = new HashMap<>(); if(experimentProperties != null){ - for(ExperimentProperty experimentProperty : experimentProperties){ - Integer experimentId = experimentProperty.getExperiment().getNdExperimentId(); - if(experimentPropertyMap.get(experimentId) == null){ - experimentPropertyMap.put(experimentId, new ArrayList()); - } + for(final ExperimentProperty experimentProperty : experimentProperties){ + final Integer experimentId = experimentProperty.getExperiment().getNdExperimentId(); + experimentPropertyMap.putIfAbsent(experimentId, new ArrayList<>()); experimentPropertyMap.get(experimentId).add(experimentProperty); } } return experimentPropertyMap; } + + private void saveOrUpdateEnvironmentProperty(final int environmentId, final int typeId, final String value) { + final ExperimentModel environment = this.daoFactory.getInstanceDao().getById(environmentId); + final List experimentProperties = environment.getProperties(); + + ExperimentProperty experimentProperty = null; + if (environment.getProperties() != null && !environment.getProperties().isEmpty()) { + experimentProperty = this.getExperimentProperty(environment, typeId); + } + if (experimentProperty == null) { + experimentProperty = new ExperimentProperty(); + experimentProperty.setRank(this.getMaxRank(environment.getProperties())); + experimentProperty.setExperiment(environment); + experimentProperty.setTypeId(typeId); + } + experimentProperty.setValue(value); + experimentProperties.add(experimentProperty); + this.daoFactory.getExperimentDao().saveOrUpdate(environment); + + } + + private int getMaxRank(final List properties) { + int maxRank = 1; + if(properties != null){ + for (final ExperimentProperty property : properties) { + if (property.getRank() >= maxRank) { + maxRank = property.getRank() + 1; + } + } + } + return maxRank; + } } diff --git a/src/main/java/org/generationcp/middleware/operation/saver/GeolocationPropertySaver.java b/src/main/java/org/generationcp/middleware/operation/saver/GeolocationPropertySaver.java deleted file mode 100644 index b0fad99588..0000000000 --- a/src/main/java/org/generationcp/middleware/operation/saver/GeolocationPropertySaver.java +++ /dev/null @@ -1,95 +0,0 @@ - -package org.generationcp.middleware.operation.saver; - -import java.util.List; - -import org.generationcp.middleware.domain.fieldbook.FieldMapDatasetInfo; -import org.generationcp.middleware.domain.fieldbook.FieldMapInfo; -import org.generationcp.middleware.domain.fieldbook.FieldMapTrialInstanceInfo; -import org.generationcp.middleware.domain.oms.TermId; -import org.generationcp.middleware.exceptions.MiddlewareQueryException; -import org.generationcp.middleware.hibernate.HibernateSessionProvider; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; - -public class GeolocationPropertySaver extends Saver { - - public GeolocationPropertySaver(final HibernateSessionProvider sessionProviderForLocal) { - super(sessionProviderForLocal); - } - - public void saveFieldmapProperties(final List infos) throws MiddlewareQueryException { - for (final FieldMapInfo info : infos) { - for (final FieldMapDatasetInfo dataset : info.getDatasets()) { - for (final FieldMapTrialInstanceInfo trial : dataset.getTrialInstances()) { - // GCP-8093 handle old data saved using the default location, default location is no longer used - int locationId = trial.getGeolocationId(); - if (trial.getGeolocationId() != null && trial.getGeolocationId().intValue() == 1) { - locationId = this.getExperimentModelSaver().moveStudyToNewGeolocation(info.getFieldbookId()); - } - - if (trial.getLocationId() != null) { - this.saveOrUpdate(locationId, TermId.LOCATION_ID.getId(), trial.getLocationId().toString()); - } - - if (trial.getBlockId() != null) { - this.saveOrUpdate(locationId, TermId.BLOCK_ID.getId(), trial.getBlockId().toString()); - } - } - } - } - } - - public void saveOrUpdate(final int geolocationId, final int typeId, final String value) throws MiddlewareQueryException { - final Geolocation geolocation = this.getGeolocationDao().getById(geolocationId); - GeolocationProperty property = null; - if (geolocation.getProperties() != null && !geolocation.getProperties().isEmpty()) { - property = this.findProperty(geolocation.getProperties(), typeId); - } - if (property == null) { - property = new GeolocationProperty(); - property.setRank(this.getMaxRank(geolocation.getProperties())); - property.setGeolocation(geolocation); - property.setType(typeId); - } - property.setValue(value); - this.getGeolocationPropertyDao().saveOrUpdate(property); - } - - private int getMaxRank(final List properties) { - int maxRank = 1; - if(properties != null){ - for (final GeolocationProperty property : properties) { - if (property.getRank() >= maxRank) { - maxRank = property.getRank() + 1; - } - } - } - return maxRank; - } - - private GeolocationProperty findProperty(final List properties, final int typeId) { - for (final GeolocationProperty property : properties) { - if (property.getTypeId() == typeId) { - return property; - } - } - return null; - } - - public void saveOrUpdate(final Geolocation geolocation, final int typeId, final String value) throws MiddlewareQueryException { - GeolocationProperty property = null; - if (geolocation.getProperties() != null && !geolocation.getProperties().isEmpty()) { - property = this.findProperty(geolocation.getProperties(), typeId); - } - if (property == null) { - property = new GeolocationProperty(); - property.setRank(this.getMaxRank(geolocation.getProperties())); - property.setGeolocation(geolocation); - property.setType(typeId); - geolocation.getProperties().add(property); - } - property.setValue(value); - this.getGeolocationPropertyDao().saveOrUpdate(property); - } -} diff --git a/src/main/java/org/generationcp/middleware/operation/saver/GeolocationSaver.java b/src/main/java/org/generationcp/middleware/operation/saver/GeolocationSaver.java deleted file mode 100644 index 6820b804d3..0000000000 --- a/src/main/java/org/generationcp/middleware/operation/saver/GeolocationSaver.java +++ /dev/null @@ -1,236 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, All Rights Reserved. - * - * Generation Challenge Programme (GCP) - * - * - * This software is licensed for use under the terms of the GNU General Public License (http://bit.ly/8Ztv8M) and the provisions of Part F - * of the Generation Challenge Programme Amended Consortium Agreement (http://bit.ly/KQX1nL) - * - *******************************************************************************/ - -package org.generationcp.middleware.operation.saver; - -import java.util.ArrayList; - -import org.generationcp.middleware.domain.dms.PhenotypicType; -import org.generationcp.middleware.domain.dms.Variable; -import org.generationcp.middleware.domain.dms.VariableList; -import org.generationcp.middleware.domain.dms.VariableTypeList; -import org.generationcp.middleware.domain.etl.MeasurementRow; -import org.generationcp.middleware.domain.oms.TermId; -import org.generationcp.middleware.exceptions.MiddlewareQueryException; -import org.generationcp.middleware.hibernate.HibernateSessionProvider; -import org.generationcp.middleware.manager.DaoFactory; -import org.generationcp.middleware.operation.transformer.etl.VariableListTransformer; -import org.generationcp.middleware.operation.transformer.etl.VariableTypeListTransformer; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; -import org.generationcp.middleware.util.StringUtil; - -public class GeolocationSaver { - - private DaoFactory daoFactory; - private PhenotypeSaver phenotypeSaver; - private VariableTypeListTransformer variableTypeListTransformer; - private VariableListTransformer variableListTransformer; - - public GeolocationSaver(final HibernateSessionProvider sessionProvider) { - this.daoFactory = new DaoFactory(sessionProvider); - this.phenotypeSaver = new PhenotypeSaver(sessionProvider); - this.variableTypeListTransformer = new VariableTypeListTransformer(sessionProvider); - this.variableListTransformer = new VariableListTransformer(sessionProvider); - } - - public Geolocation saveGeolocation(VariableList variableList, MeasurementRow row) { - return this.saveGeolocation(variableList, row, true); - } - - public Geolocation saveGeolocation(VariableList variableList, MeasurementRow row, boolean isCreate) { - Integer locationId = null; - if (row != null && !isCreate && row.getLocationId() != 0) { - locationId = (int) row.getLocationId(); - } - final Geolocation geolocation = this.createOrUpdate(variableList, row, locationId); - if (geolocation != null) { - if (isCreate) { - this.daoFactory.getGeolocationDao().save(geolocation); - } else { - this.daoFactory.getGeolocationDao().saveOrUpdate(geolocation); - } - if (null != geolocation.getVariates()) { - for (final Variable var : geolocation.getVariates().getVariables()) { - if (null == var.getPhenotypeId()) { - this.phenotypeSaver.save(row.getExperimentId(), var); - } else { - this.phenotypeSaver - .saveOrUpdate(row.getExperimentId(), var.getVariableType().getStandardVariable().getId(), var.getValue(), - this.daoFactory.getPhenotypeDAO().getById(var.getPhenotypeId()), - var.getVariableType().getStandardVariable().getDataType().getId(), null); - } - } - } - return geolocation; - } - return null; - } - - protected Geolocation createOrUpdate(VariableList factors, MeasurementRow row, Integer locationId) { - Geolocation geolocation = null; - - if (factors != null && factors.getVariables() != null && !factors.getVariables().isEmpty()) { - for (final Variable variable : factors.getVariables()) { - - final Integer variableId = variable.getVariableType().getStandardVariable().getId(); - final PhenotypicType role = variable.getVariableType().getRole(); - final String value = variable.getValue(); - geolocation = this.getGeolocationObject(geolocation, locationId); - - if(isInGeolocation(variableId)){ - setGeolocation(geolocation, variableId, value); - - } else if (PhenotypicType.TRIAL_ENVIRONMENT == role) { - if (TermId.EXPERIMENT_DESIGN_FACTOR.getId() == variableId) { - // Experiment Design saves the id of the category instead of the name - variable.setValue(variable.getIdValue()); - } - this.addProperty(geolocation, this.createOrUpdateProperty(variable, geolocation)); - - } else if (PhenotypicType.VARIATE == role) { - // value is in observation sheet - if (row != null) { - variable.setValue(row.getMeasurementDataValue(variable.getVariableType().getLocalName())); - } - this.addVariate(geolocation, variable); - - } else { - throw new MiddlewareQueryException( - "Non-Trial Environment Variable was used in calling create location: " + variable.getVariableType().getId()); - } - } - } - return geolocation; - } - - private boolean isInGeolocation(final int termId) { - return TermId.TRIAL_INSTANCE_FACTOR.getId() == termId || TermId.LATITUDE.getId() == termId || TermId.LONGITUDE.getId() == termId - || TermId.GEODETIC_DATUM.getId() == termId || TermId.ALTITUDE.getId() == termId; - } - - - private Geolocation getGeolocationObject(Geolocation geolocation, Integer locationId) { - Geolocation finalGeolocation = geolocation; - if (finalGeolocation == null) { - if (locationId != null) { - finalGeolocation = this.getGeolocationById(locationId); - } - if (finalGeolocation == null) { - finalGeolocation = new Geolocation(); - } - } - return finalGeolocation; - } - - protected Geolocation getGeolocationById(Integer locationId) { - return this.daoFactory.getGeolocationDao().getById(locationId); - } - - private GeolocationProperty createOrUpdateProperty(Variable variable, Geolocation geolocation) { - GeolocationProperty property = this.getGeolocationProperty(variable.getVariableType().getId(), geolocation); - - if (property == null) { - property = new GeolocationProperty(); - property.setType(variable.getVariableType().getId()); - property.setRank(variable.getVariableType().getRank()); - } - property.setValue(variable.getValue()); - - return property; - } - - private GeolocationProperty getGeolocationProperty(Integer typeId, Geolocation geolocation) { - if (typeId != null && geolocation != null && geolocation.getProperties() != null) { - for (GeolocationProperty property : geolocation.getProperties()) { - if (property.getTypeId().equals(typeId)) { - return property; - } - } - } - return null; - } - - private void addProperty(Geolocation geolocation, GeolocationProperty property) { - if (geolocation.getProperties() == null) { - geolocation.setProperties(new ArrayList()); - } - property.setGeolocation(geolocation); - geolocation.getProperties().add(property); - } - - private void addVariate(Geolocation geolocation, Variable variable) { - if (geolocation.getVariates() == null) { - geolocation.setVariates(new VariableList()); - } - geolocation.getVariates().add(variable); - } - - public Geolocation createMinimumGeolocation() { - Geolocation geolocation = this.getGeolocationObject(null, null); - geolocation.setDescription("1"); - this.daoFactory.getGeolocationDao().save(geolocation); - - return geolocation; - } - - public Geolocation updateGeolocationInformation(MeasurementRow row, String programUUID) { - VariableTypeList variableTypes = this.variableTypeListTransformer.transform(row.getMeasurementVariables(), programUUID); - VariableList variableList = this.variableListTransformer.transformTrialEnvironment(row, variableTypes); - - return this.saveGeolocation(variableList, row, false); - } - - public void setGeolocation(Geolocation geolocation, int termId, String value) { - if (TermId.TRIAL_INSTANCE_FACTOR.getId() == termId) { - geolocation.setDescription(value); - - } else if (TermId.LATITUDE.getId() == termId) { - geolocation.setLatitude(StringUtil.isEmpty(value) ? null : Double.valueOf(value)); - - } else if (TermId.LONGITUDE.getId() == termId) { - geolocation.setLongitude(StringUtil.isEmpty(value) ? null : Double.valueOf(value)); - - } else if (TermId.GEODETIC_DATUM.getId() == termId) { - geolocation.setGeodeticDatum(value); - - } else if (TermId.ALTITUDE.getId() == termId) { - geolocation.setAltitude(StringUtil.isEmpty(value) ? null : Double.valueOf(value)); - } - } - - public Geolocation saveGeolocationOrRetrieveIfExisting(String studyName, VariableList variableList, MeasurementRow row, boolean isDeleteTrialObservations, String programUUID) { - Geolocation geolocation = null; - - if (variableList != null && variableList.getVariables() != null && !variableList.getVariables().isEmpty()) { - String trialInstanceNumber = null; - for (Variable variable : variableList.getVariables()) { - String value = variable.getValue(); - if (TermId.TRIAL_INSTANCE_FACTOR.getId() == variable.getVariableType().getStandardVariable().getId()) { - trialInstanceNumber = value; - break; - } - } - // check if existing - Integer locationId = - this.daoFactory.getGeolocationDao().getLocationIdByProjectNameAndDescriptionAndProgramUUID(studyName, trialInstanceNumber, - programUUID); - if (isDeleteTrialObservations) { - locationId = null; - } - geolocation = this.createOrUpdate(variableList, row, locationId); - geolocation.setDescription(trialInstanceNumber); - this.daoFactory.getGeolocationDao().saveOrUpdate(geolocation); - return geolocation; - } - return null; - } -} diff --git a/src/main/java/org/generationcp/middleware/operation/saver/ProjectPropertySaver.java b/src/main/java/org/generationcp/middleware/operation/saver/ProjectPropertySaver.java index e249dfdcaf..d488409c40 100644 --- a/src/main/java/org/generationcp/middleware/operation/saver/ProjectPropertySaver.java +++ b/src/main/java/org/generationcp/middleware/operation/saver/ProjectPropertySaver.java @@ -23,12 +23,11 @@ import org.generationcp.middleware.domain.oms.Term; import org.generationcp.middleware.domain.oms.TermId; import org.generationcp.middleware.domain.ontology.VariableType; -import org.generationcp.middleware.exceptions.MiddlewareQueryException; import org.generationcp.middleware.hibernate.HibernateSessionProvider; import org.generationcp.middleware.manager.DaoFactory; import org.generationcp.middleware.manager.Operation; import org.generationcp.middleware.pojos.dms.DmsProject; -import org.generationcp.middleware.pojos.dms.Geolocation; +import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.pojos.dms.ProjectProperty; import org.generationcp.middleware.pojos.oms.CVTerm; import org.hibernate.Hibernate; @@ -37,7 +36,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.Set; public class ProjectPropertySaver { @@ -69,7 +67,7 @@ public List create(final DmsProject project, final VariableType public void saveProjectProperties(final DmsProject project, final VariableTypeList variableTypeList, final VariableList variableList) { final List properties = this.create(project, variableTypeList, variableList); - final ProjectPropertyDao projectPropertyDao = this.saver.getProjectPropertyDao(); + final ProjectPropertyDao projectPropertyDao = this.daoFactory.getProjectPropertyDAO(); for (final ProjectProperty property : properties) { property.setProject(project); projectPropertyDao.save(property); @@ -135,7 +133,6 @@ List createVariableProperties(final DmsProject project, final D * @param project DMSProject * @param objDMSVariableType DMSVariableType * @param value the value of the measurement variable - * @throws MiddlewareQueryException */ public void saveVariableType(final DmsProject project, final DMSVariableType objDMSVariableType, final String value) { objDMSVariableType.setVariableTypeIfNull(); @@ -158,14 +155,14 @@ private void saveProjectProperty(final DmsProject project, final int typeId, fin property.setProject(project); property.setVariableId(variableId); property.setAlias(alias); - this.saver.getProjectPropertyDao().save(property); + this.daoFactory.getProjectPropertyDAO().save(property); project.addProperty(property); } - public void createProjectPropertyIfNecessary(final DmsProject project, final TermId termId, final PhenotypicType role) { - final ProjectProperty property = this.saver.getProjectPropertyDao().getByStandardVariableId(project, termId.getId()); + void createProjectPropertyIfNecessary(final DmsProject project, final TermId termId, final PhenotypicType role) { + final ProjectProperty property = this.daoFactory.getProjectPropertyDAO().getByStandardVariableId(project, termId.getId()); if (property == null) { - final int rank = this.saver.getProjectPropertyDao().getNextRank(project.getProjectId()); + final int rank = this.daoFactory.getProjectPropertyDAO().getNextRank(project.getProjectId()); final StandardVariable stdvar = new StandardVariable(); stdvar.setId(termId.getId()); stdvar.setPhenotypicType(role); @@ -182,16 +179,12 @@ public void createProjectPropertyIfNecessary(final DmsProject project, final Ter } } - public void saveProjectProperties(final DmsProject study, final DmsProject trialDataset, final DmsProject measurementDataset, + void saveProjectProperties(final DmsProject study, final DmsProject trialDataset, final DmsProject measurementDataset, final List variables, final boolean isConstant) { if (variables != null) { int rank = this.getNextRank(study); - final Set geoIds = this.saver.getGeolocationDao().getLocationIds(study.getProjectId()); - final Geolocation geolocation = this.saver.getGeolocationDao().getById(geoIds.iterator().next()); - Hibernate.initialize(geolocation.getProperties()); - for (final MeasurementVariable variable : variables) { final Operation operation = variable.getOperation(); if (operation == null) { @@ -199,14 +192,14 @@ public void saveProjectProperties(final DmsProject study, final DmsProject trial } switch (operation) { case DELETE: - this.deleteVariable(study, trialDataset, measurementDataset, variable.getRole(), variable.getTermId(), geolocation); + this.deleteVariable(study, trialDataset, measurementDataset, variable.getRole(), variable.getTermId()); break; case ADD: - this.insertVariable(study, trialDataset, measurementDataset, variable, rank, isConstant, geolocation); + this.insertVariable(study, trialDataset, measurementDataset, variable, rank, isConstant); rank++; break; case UPDATE: - this.updateVariable(study, trialDataset, measurementDataset, variable, isConstant, geolocation); + this.updateVariable(study, trialDataset, measurementDataset, variable, isConstant); break; default: break; @@ -227,13 +220,8 @@ private int getNextRank(final DmsProject project) { return nextRank; } - private boolean isInGeolocation(final int termId) { - return TermId.TRIAL_INSTANCE_FACTOR.getId() == termId || TermId.LATITUDE.getId() == termId || TermId.LONGITUDE.getId() == termId - || TermId.GEODETIC_DATUM.getId() == termId || TermId.ALTITUDE.getId() == termId; - } - - private void insertVariable(final DmsProject project, final DmsProject trialDataset, final DmsProject measurementDataset, - final MeasurementVariable variable, final int rank, final boolean isConstant, final Geolocation geolocation) { + private void insertVariable(final DmsProject study, final DmsProject trialDataset, final DmsProject measurementDataset, + final MeasurementVariable variable, final int rank, final boolean isConstant) { if (PhenotypicType.TRIAL_ENVIRONMENT == variable.getRole()) { final int datasetRank = this.getNextRank(trialDataset); @@ -245,11 +233,11 @@ private void insertVariable(final DmsProject project, final DmsProject trialData if (variable.getTermId() == TermId.TRIAL_INSTANCE_FACTOR.getId()) { this.insertVariable(measurementDataset, variable, measurementRank); } - if (this.isInGeolocation(variable.getTermId())) { - this.saver.getGeolocationSaver().setGeolocation(geolocation, variable.getTermId(), variable.getValue()); - this.saver.getGeolocationDao().saveOrUpdate(geolocation); - } else { - this.saver.getGeolocationPropertySaver().saveOrUpdate(geolocation, variable.getTermId(), variable.getValue()); + + final List environments = this.daoFactory.getInstanceDao().getEnvironments(study.getProjectId()); + for (final ExperimentModel environment : environments) { + Hibernate.initialize(environment.getProperties()); + this.saver.getExperimentPropertySaver().saveOrUpdateProperty(environment, variable.getTermId(), variable.getValue()); } } else if (PhenotypicType.VARIATE == variable.getRole()) { @@ -263,8 +251,8 @@ private void insertVariable(final DmsProject project, final DmsProject trialData variable.getValue(), variable.getDataTypeId()); } else { // a study constant - this.insertVariable(project, variable, rank); - this.saver.getPhenotypeSaver().saveOrUpdatePhenotypeValue(project.getProjectId(), variable.getTermId(), + this.insertVariable(study, variable, rank); + this.saver.getPhenotypeSaver().saveOrUpdatePhenotypeValue(study.getProjectId(), variable.getTermId(), variable.getValue(), variable.getDataTypeId()); } } else { @@ -273,18 +261,18 @@ private void insertVariable(final DmsProject project, final DmsProject trialData } } else { // study - this.insertVariable(project, variable, rank); + this.insertVariable(study, variable, rank); } } - protected void insertVariable(final DmsProject project, final MeasurementVariable variable, final int rank) { + void insertVariable(final DmsProject project, final MeasurementVariable variable, final int rank) { if (project.getProperties() == null) { - project.setProperties(new ArrayList()); + project.setProperties(new ArrayList<>()); } this.saveVariableType(project, this.createVariableType(variable, rank), variable.getValue()); } - protected DMSVariableType createVariableType(final MeasurementVariable variable, final int rank) { + DMSVariableType createVariableType(final MeasurementVariable variable, final int rank) { final DMSVariableType varType = new DMSVariableType(); final StandardVariable stdVariable = new StandardVariable(); @@ -309,7 +297,7 @@ protected DMSVariableType createVariableType(final MeasurementVariable variable, } private void updateVariable(final DmsProject project, final DmsProject trialDataset, final DmsProject measurementDataset, - final MeasurementVariable variable, final boolean isConstant, final Geolocation geolocation) { + final MeasurementVariable variable, final boolean isConstant) { if (TermId.TRIAL_INSTANCE_FACTOR.getId() != variable.getTermId()) { if (PhenotypicType.TRIAL_ENVIRONMENT == variable.getRole()) { @@ -317,12 +305,8 @@ private void updateVariable(final DmsProject project, final DmsProject trialData this.updateVariable(trialDataset, variable); this.updateVariable(measurementDataset, variable); - if (this.isInGeolocation(variable.getTermId())) { - this.saver.getGeolocationSaver().setGeolocation(geolocation, variable.getTermId(), variable.getValue()); - this.saver.getGeolocationDao().saveOrUpdate(geolocation); - } else { - this.saver.getGeolocationPropertySaver().saveOrUpdate(geolocation, variable.getTermId(), variable.getValue()); - } + // TODO: IBP-3303, check if this is still relevant + //this.saver.getExperimentPropertySaver().saveOrUpdateProperty(environment, variable.getTermId(), variable.getValue()); } else if (PhenotypicType.VARIATE == variable.getRole()) { @@ -357,7 +341,7 @@ private void updateVariable(final DmsProject project, final MeasurementVariable if (property.getVariableId().equals(variable.getTermId())) { property.setValue(variable.getValue()); property.setAlias(variable.getName()); - this.saver.getProjectPropertyDao().update(property); + this.daoFactory.getProjectPropertyDAO().update(property); break; } } @@ -365,18 +349,14 @@ private void updateVariable(final DmsProject project, final MeasurementVariable } private void deleteVariable(final DmsProject project, final DmsProject trialDataset, final DmsProject measurementDataset, - final PhenotypicType role, final int termId, final Geolocation geolocation) { + final PhenotypicType role, final int termId) { if (PhenotypicType.TRIAL_ENVIRONMENT == role) { this.deleteVariable(trialDataset, termId); this.deleteVariable(measurementDataset, termId); - if (this.isInGeolocation(termId)) { - this.saver.getGeolocationSaver().setGeolocation(geolocation, termId, null); - this.saver.getGeolocationDao().saveOrUpdate(geolocation); - } else { - this.saver.getGeolocationPropertyDao().deletePropertiesInDataset(project.getProjectId(), Collections.singletonList(termId)); - } + this.daoFactory.getEnvironmentPropertyDao().deletePropertiesInDataset(project.getProjectId(), Collections.singletonList(termId)); + } else if (PhenotypicType.VARIATE == role) { // for constants @@ -399,7 +379,7 @@ public void deleteVariable(final DmsProject project, final int termId) { final List deletedProjectProperties = new ArrayList<>(); for (final ProjectProperty property : project.getProperties()) { if (property.getVariableId().equals(termId)) { - this.saver.getProjectPropertyDao().makeTransient(property); + this.daoFactory.getProjectPropertyDAO().makeTransient(property); deletedProjectProperties.add(property); } } @@ -417,7 +397,7 @@ private void deleteVariableForFactors(final DmsProject project, final Measuremen } } - public void saveFactors(final DmsProject measurementDataset, final List variables) { + void saveFactors(final DmsProject measurementDataset, final List variables) { if (variables != null && !variables.isEmpty()) { for (final MeasurementVariable variable : variables) { final Operation operation = variable.getOperation(); @@ -443,8 +423,8 @@ public void saveFactors(final DmsProject measurementDataset, final List variableIds) { - int rank = this.saver.getProjectPropertyDao().getNextRank(datasetId); - final List projectProperties = this.saver.getProjectPropertyDao().getByProjectId(datasetId); + int rank = this.daoFactory.getProjectPropertyDAO().getNextRank(datasetId); + final List projectProperties = this.daoFactory.getProjectPropertyDAO().getByProjectId(datasetId); rank = this.updateVariableRank(variableIds, rank, projectProperties); @@ -455,7 +435,7 @@ public void updateVariablesRanking(final int datasetId, final List vari storedInIds.addAll(PhenotypicType.VARIATE.getTypeStorages()); final List germplasmPlotVariateIds = - this.saver.getProjectPropertyDao().getDatasetVariableIdsForVariableTypeIds(datasetId, storedInIds, variableIds); + this.daoFactory.getProjectPropertyDAO().getDatasetVariableIdsForVariableTypeIds(datasetId, storedInIds, variableIds); this.updateVariableRank(germplasmPlotVariateIds, rank, projectProperties); } @@ -467,7 +447,7 @@ private int updateVariableRank(final List variableIds, final int startR for (final ProjectProperty pp: projectProperties) { if (pp.getVariableId().equals(variableId)) { pp.setRank(rank); - this.saver.getProjectPropertyDao().saveOrUpdate(pp); + this.daoFactory.getProjectPropertyDAO().saveOrUpdate(pp); rank++; } } diff --git a/src/main/java/org/generationcp/middleware/operation/saver/Saver.java b/src/main/java/org/generationcp/middleware/operation/saver/Saver.java index 84d39df628..eb713a9087 100644 --- a/src/main/java/org/generationcp/middleware/operation/saver/Saver.java +++ b/src/main/java/org/generationcp/middleware/operation/saver/Saver.java @@ -12,15 +12,9 @@ package org.generationcp.middleware.operation.saver; import org.generationcp.middleware.hibernate.HibernateSessionProvider; -import org.generationcp.middleware.manager.StudyDataManagerImpl; -import org.generationcp.middleware.manager.api.StudyDataManager; -import org.generationcp.middleware.operation.builder.ExperimentBuilder; import org.generationcp.middleware.operation.builder.StandardVariableBuilder; import org.generationcp.middleware.operation.builder.StockModelBuilder; import org.generationcp.middleware.operation.builder.TermBuilder; -import org.generationcp.middleware.operation.builder.VariableTypeBuilder; -import org.generationcp.middleware.operation.builder.WorkbookBuilder; -import org.generationcp.middleware.operation.destroyer.ExperimentDestroyer; import org.generationcp.middleware.operation.transformer.etl.DatasetValuesTransformer; import org.generationcp.middleware.operation.transformer.etl.ExperimentValuesTransformer; import org.generationcp.middleware.operation.transformer.etl.StudyValuesTransformer; @@ -43,7 +37,7 @@ public Saver() { /** * Instantiates a new data manager given session providers for local and central. */ - protected Saver(HibernateSessionProvider sessionProvider) { + protected Saver(final HibernateSessionProvider sessionProvider) { super(sessionProvider); } @@ -59,10 +53,6 @@ protected final ProjectPropertySaver getProjectPropertySaver() { return new ProjectPropertySaver(this.sessionProvider); } - protected final GeolocationSaver getGeolocationSaver() { - return new GeolocationSaver(this.sessionProvider); - } - protected final StockSaver getStockSaver() { return new StockSaver(this.sessionProvider); } @@ -75,6 +65,10 @@ protected final ExperimentModelSaver getExperimentModelSaver() { return new ExperimentModelSaver(this.sessionProvider); } + protected final ExperimentPropertySaver getExperimentPropertySaver() { + return new ExperimentPropertySaver(this.sessionProvider); + } + protected final StandardVariableBuilder getStandardVariableBuilder() { return new StandardVariableBuilder(this.sessionProvider); } @@ -103,10 +97,6 @@ protected final DatasetProjectSaver getDatasetProjectSaver() { return new DatasetProjectSaver(this.sessionProvider); } - protected final VariableTypeBuilder getVariableTypeBuilder() { - return new VariableTypeBuilder(this.sessionProvider); - } - protected final StockModelBuilder getStockModelBuilder() { return new StockModelBuilder(this.sessionProvider); } @@ -115,23 +105,4 @@ protected final TermBuilder getTermBuilder() { return new TermBuilder(this.sessionProvider); } - protected final ExperimentBuilder getExperimentBuilder() { - return new ExperimentBuilder(this.sessionProvider); - } - - protected final ExperimentPropertySaver getExperimentPropertySaver() { - return new ExperimentPropertySaver(this.sessionProvider); - } - - protected final ListDataPropertySaver getListDataPropertySaver() { - return new ListDataPropertySaver(this.sessionProvider); - } - - protected final GeolocationPropertySaver getGeolocationPropertySaver() { - return new GeolocationPropertySaver(this.sessionProvider); - } - - protected final ExperimentDestroyer getExperimentDestroyer() { - return new ExperimentDestroyer(this.sessionProvider); - } } diff --git a/src/main/java/org/generationcp/middleware/operation/saver/StudySaver.java b/src/main/java/org/generationcp/middleware/operation/saver/StudySaver.java index e8c7eb71d6..8e39e9cb80 100644 --- a/src/main/java/org/generationcp/middleware/operation/saver/StudySaver.java +++ b/src/main/java/org/generationcp/middleware/operation/saver/StudySaver.java @@ -17,6 +17,7 @@ import org.generationcp.middleware.domain.study.StudyTypeDto; import org.generationcp.middleware.hibernate.HibernateSessionProvider; import org.generationcp.middleware.pojos.dms.DmsProject; +import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.pojos.workbench.CropType; /** @@ -56,9 +57,9 @@ public DmsProject saveStudy(final CropType crop, final int parentId, final Varia /** * Creates an entry in nd_experiment table if saveStudyExperiment is true. */ - public void saveStudyExperiment(final CropType crop, final int projectId, final StudyValues values) throws Exception { + public ExperimentModel saveStudyExperiment(final CropType crop, final int projectId, final StudyValues values) { try { - this.getExperimentModelSaver().addExperiment(crop, projectId, ExperimentType.STUDY_INFORMATION, values); + return this.getExperimentModelSaver().addExperiment(crop, projectId, ExperimentType.STUDY_INFORMATION, values); } catch (final Exception e) { throw e; } diff --git a/src/main/java/org/generationcp/middleware/operation/saver/WorkbookSaver.java b/src/main/java/org/generationcp/middleware/operation/saver/WorkbookSaver.java index fbb6becdf5..70dc14c127 100644 --- a/src/main/java/org/generationcp/middleware/operation/saver/WorkbookSaver.java +++ b/src/main/java/org/generationcp/middleware/operation/saver/WorkbookSaver.java @@ -12,7 +12,6 @@ package org.generationcp.middleware.operation.saver; import org.apache.commons.lang3.StringUtils; -import org.generationcp.middleware.dao.LocationDAO; import org.generationcp.middleware.domain.dms.DMSVariableType; import org.generationcp.middleware.domain.dms.DataSet; import org.generationcp.middleware.domain.dms.DatasetValues; @@ -43,7 +42,6 @@ import org.generationcp.middleware.pojos.Location; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.workbench.CropType; import org.generationcp.middleware.util.TimerWatch; import org.generationcp.middleware.util.Util; @@ -56,11 +54,11 @@ import javax.annotation.Resource; import java.text.ParseException; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; // ASsumptions - can be added to validations // Mandatory fields: workbook.studyDetails.studyName @@ -115,11 +113,10 @@ public WorkbookSaver(final HibernateSessionProvider sessionProviderForLocal) { * @return Map, ?> : a map of 3 sub-maps containing * Strings(headers), VariableTypeLists and Lists of * MeasurementVariables - * @throws Exception */ @SuppressWarnings("rawtypes") - public Map saveVariables(final Workbook workbook, final String programUUID) throws Exception { + public Map saveVariables(final Workbook workbook, final String programUUID) { // make sure to reset all derived variables workbook.reset(); @@ -207,67 +204,17 @@ public int saveDataset( // TODO : Review code and see whether variable validation and possible // dataset creation abort is a good idea (rebecca) - // GCP-6091 start - final int studyLocationId; - final List locationIds = new ArrayList<>(); - final Map trialVariatesMap = new HashMap<>(); - - // get the trial and measurement dataset id to use in deletion of - // experiments - Integer environmentDatasetId = workbook.getTrialDatasetId(); - Integer plotDatasetId = workbook.getMeasurementDatesetId(); - int savedEnvironmentsCount = 0; - boolean isDeleteTrialObservations = false; - if (environmentDatasetId == null && workbook.getStudyDetails().getId() != null) { - environmentDatasetId = this.workbookBuilder.getTrialDataSetId(workbook.getStudyDetails().getId()); - } - if (plotDatasetId == null && workbook.getStudyDetails().getId() != null) { - plotDatasetId = this.workbookBuilder.getMeasurementDataSetId(workbook.getStudyDetails().getId()); - } - - if (environmentDatasetId != null) { - savedEnvironmentsCount = (int) this.studyDataManager.countExperiments(environmentDatasetId); - } - - if ((savedEnvironmentsCount != workbook.getTrialObservations().size() && savedEnvironmentsCount > 0 || isDeleteObservations) - && environmentDatasetId != null) { - isDeleteTrialObservations = true; - // delete measurement data - this.getExperimentDestroyer().deleteExperimentsByStudy(plotDatasetId); - // reset trial observation details such as experimentid, stockid and - // geolocationid - this.resetTrialObservations(workbook.getTrialObservations()); - } - - studyLocationId = - this.createLocationIfNecessary(trialVariableTypeList, isDeleteObservations, locationIds, workbook, trialVariables, trialMV, - trialHeaders, trialVariatesMap, isDeleteTrialObservations, programUUID); - - // GCP-6091 end - if (isDeleteTrialObservations) { - - final ExperimentModel studyExperiment = - this.getExperimentDao().getExperimentsByProjectIds(Arrays.asList(workbook.getStudyDetails().getId())).get(0); - studyExperiment.setGeoLocation(this.getGeolocationDao().getById(studyLocationId)); - this.getExperimentDao().saveOrUpdate(studyExperiment); - - // delete trial observations - this.getExperimentDestroyer().deleteTrialExperimentsOfStudy(environmentDatasetId); - } - final int studyId; if (!(workbook.getStudyDetails() != null && workbook.getStudyDetails().getId() != null)) { - studyId = this.createStudyIfNecessary(workbook, studyLocationId, true, programUUID, crop); + studyId = this.createStudyIfNecessary(workbook, true, programUUID, crop); } else { studyId = workbook.getStudyDetails().getId(); } - environmentDatasetId = this.createTrialDatasetIfNecessary(workbook, studyId, trialMV, trialVariables, programUUID); + final Integer environmentDatasetId = this.createTrialDatasetIfNecessary(workbook, studyId, trialMV, trialVariables, programUUID); - this.saveOrUpdateTrialObservations(crop, environmentDatasetId, workbook, locationIds, trialVariatesMap, studyLocationId, - savedEnvironmentsCount, - isDeleteObservations, programUUID); + this.saveOrUpdateTrialObservations(crop, environmentDatasetId, workbook, trialVariables, trialHeaders); - plotDatasetId = + final int plotDatasetId = this.createPlotDatasetIfNecessary(workbook, studyId, effectMV, effectVariables, trialVariables, programUUID); this.createStocksIfNecessary(plotDatasetId, workbook, effectVariables, trialHeaders); @@ -286,57 +233,14 @@ public int saveDataset( workbook.setMeasurementDatesetId(plotDatasetId); } - this.createMeasurementEffectExperiments(crop, plotDatasetId, effectVariables, workbook.getObservations(), trialHeaders); + this.createExperiments(crop, plotDatasetId, environmentDatasetId, effectVariables, workbook.getObservations(), trialHeaders, ExperimentType.PLOT); return studyId; } - public void deleteExperimentalDesign(final Workbook workbook, final Map variableMap, final String programUUID, final CropType crop) { - - final Map> headerMap = (Map>) variableMap.get(WorkbookSaver.HEADERMAP); - final Map variableTypeMap = - (Map) variableMap.get(WorkbookSaver.VARIABLETYPEMAP); - final Map> measurementVariableMap = - (Map>) variableMap.get(WorkbookSaver.MEASUREMENTVARIABLEMAP); - - final VariableTypeList trialVariableTypeList = variableTypeMap.get(WorkbookSaver.TRIALVARIABLETYPELIST); - final VariableTypeList trialVariables = variableTypeMap.get(WorkbookSaver.TRIALVARIABLES); - final List trialMV = measurementVariableMap.get(WorkbookSaver.TRIALMV); - final List trialHeaders = headerMap.get(WorkbookSaver.TRIALHEADERS); - - final List locationIds = new ArrayList<>(); - final Map trialVariatesMap = new HashMap<>(); - - final Integer environmentDatasetId = workbook.getTrialDatasetId(); - final Integer plotDatasetId = workbook.getMeasurementDatesetId(); - - final int savedEnvironmentsCount = (int) this.studyDataManager.countExperiments(environmentDatasetId); - - // delete measurement data - this.getExperimentDestroyer().deleteExperimentsByStudy(plotDatasetId); - // reset trial observation details such as experimentid, stockid and - // geolocationid - this.resetTrialObservations(workbook.getTrialObservations()); - - final int studyLocationId = - this.createLocationIfNecessary(trialVariableTypeList, true, locationIds, workbook, trialVariables, trialMV, - trialHeaders, trialVariatesMap, true, programUUID); - - final ExperimentModel studyExperiment = - this.getExperimentDao().getExperimentsByProjectIds(Arrays.asList(workbook.getStudyDetails().getId())).get(0); - studyExperiment.setGeoLocation(this.getGeolocationDao().getById(studyLocationId)); - this.getExperimentDao().saveOrUpdate(studyExperiment); - - // delete trial observations - this.getExperimentDestroyer().deleteTrialExperimentsOfStudy(environmentDatasetId); - - this.saveOrUpdateTrialObservations(crop, environmentDatasetId, workbook, locationIds, trialVariatesMap, studyLocationId, - savedEnvironmentsCount, - true, programUUID); - } - - public void savePlotDataset(final Workbook workbook, final Map variableMap, final String programUUID, final CropType crop) throws Exception { + // Used in Design Import + public void savePlotDataset(final Workbook workbook, final Map variableMap, final String programUUID, final CropType crop) { // unpack maps first level - Maps of Strings, Maps of VariableTypeList , // Maps of Lists of MeasurementVariable @@ -354,55 +258,28 @@ public void savePlotDataset(final Workbook workbook, final Map variab final List trialHeaders = headerMap.get(WorkbookSaver.TRIALHEADERS); final VariableTypeList effectVariables = variableTypeMap.get(WorkbookSaver.EFFECTVARIABLE); - final int studyLocationId; - final List locationIds = new ArrayList<>(); - final Map trialVariatesMap = new HashMap<>(); - - final Integer environmentDatasetId = this.workbookBuilder.getTrialDataSetId(workbook.getStudyDetails().getId()); - final Integer plotDatasetId = this.workbookBuilder.getMeasurementDataSetId(workbook.getStudyDetails().getId()); + final int environmentDatasetId = this.workbookBuilder.getTrialDataSetId(workbook.getStudyDetails().getId()); + final int plotDatasetId = this.workbookBuilder.getMeasurementDataSetId(workbook.getStudyDetails().getId()); final int studyId = workbook.getStudyDetails().getId(); - int savedEnvironmentsCount = (int) this.studyDataManager.countExperiments(environmentDatasetId); - this.getExperimentDestroyer().deleteExperimentsByStudy(plotDatasetId); - - this.resetTrialObservations(workbook.getTrialObservations()); - - studyLocationId = this.createLocationIfNecessary(trialVariableTypeList, true, locationIds, workbook, trialVariables, trialMV, - trialHeaders, trialVariatesMap, true, programUUID); - - final ExperimentModel studyExperiment = - this.getExperimentDao().getExperimentsByProjectIds(Arrays.asList(studyId)).get(0); - studyExperiment.setGeoLocation(this.getGeolocationDao().getById(studyLocationId)); - this.getExperimentDao().saveOrUpdate(studyExperiment); + // TODO: IBP-3389 Check if we can remove the code that resets/delete trial experiments +// this.getExperimentDestroyer().deleteExperimentsByStudy(plotDatasetId); +// this.resetTrialObservations(workbook.getTrialObservations()); +// +// final ExperimentModel studyExperiment = +// this.getExperimentDao().getExperimentsByProjectIds(Arrays.asList(studyId)).get(0); +// this.getExperimentDao().saveOrUpdate(studyExperiment); +// +// // delete trial observations +// this.getExperimentDestroyer().deleteExperimentsByStudy(environmentDatasetId); - // delete trial observations - this.getExperimentDestroyer().deleteTrialExperimentsOfStudy(environmentDatasetId); - - this.saveOrUpdateTrialObservations( crop, environmentDatasetId, workbook, locationIds, trialVariatesMap, studyLocationId, savedEnvironmentsCount, true, programUUID); + this.saveOrUpdateTrialObservations(crop, environmentDatasetId, workbook, trialVariables, trialHeaders); this.createStocksIfNecessary(plotDatasetId, workbook, effectVariables, trialHeaders); - this.createMeasurementEffectExperiments(crop, plotDatasetId, effectVariables, workbook.getObservations(), trialHeaders); + this.createExperiments(crop, plotDatasetId, environmentDatasetId, effectVariables, workbook.getObservations(), trialHeaders, ExperimentType.PLOT); } - private int createLocationIfNecessary(final VariableTypeList trialVariableTypeList, final boolean isDeleteObservations, - final List locationIds, final Workbook workbook, final VariableTypeList trialVariables, final List trialMV, final List trialHeaders, final Map trialVariatesMap, final boolean isDeleteTrialObservations, final String programUUID) { - - final int studyLocationId; - - if (trialVariableTypeList != null && !isDeleteObservations) { - // multi-location for data loader - studyLocationId = this.createLocationsAndSetToObservations(locationIds, workbook, trialVariables, trialHeaders, trialVariatesMap, false, programUUID); - } else if (workbook.getTrialObservations().size() > 1) { - // also a multi-location - studyLocationId = this.createLocationsAndSetToObservations(locationIds, workbook, trialVariables, trialHeaders, trialVariatesMap, isDeleteTrialObservations, programUUID); - } else { - studyLocationId = this.createLocationAndSetToObservations(workbook, trialMV, trialVariables, trialVariatesMap, isDeleteTrialObservations, programUUID); - } - - return studyLocationId; - } - public void removeDeletedVariablesAndObservations(final Workbook workbook) { for (final MeasurementRow measurementRow : workbook.getTrialObservations()) { this.removeDeletedVariablesInObservations(workbook.getConstants(), workbook.getTrialObservations()); @@ -467,183 +344,53 @@ private void removeDeletedVariables(final List variableList } } - public void resetTrialObservations(final List trialObservations) { - for (final MeasurementRow row : trialObservations) { - row.setExperimentId(0); - row.setLocationId(0); - row.setStockId(0); - for (final MeasurementData data : row.getDataList()) { - data.setPhenotypeId(null); - } - } - } + private void saveOrUpdateTrialObservations( + final CropType crop, final int trialDatasetId, final Workbook workbook, final VariableTypeList trialVariables, final List trialHeaders) { - public void saveOrUpdateTrialObservations( - final CropType crop, final int trialDatasetId, final Workbook workbook, final List locationIds, - final Map trialVariatesMap, final int studyLocationId, final int totalRows, - final boolean isDeleteObservations, final String programUUID) { - if (totalRows == workbook.getTrialObservations().size() && totalRows > 0 && !isDeleteObservations) { - this.saveTrialObservations(workbook, programUUID); - } else { - if (locationIds != null && !locationIds.isEmpty()) {// multi-location - for (final Integer locationId : locationIds) { - this.setVariableListValues(trialVariatesMap.get(locationId), workbook.getConstants()); - this.createTrialExperiment(crop, trialDatasetId, locationId, trialVariatesMap.get(locationId)); - } - } else { - this.createTrialExperiment(crop, trialDatasetId, studyLocationId, trialVariatesMap.get(studyLocationId)); - } - } - } - - public void saveTrialObservations(final Workbook workbook, final String programUUID) { - if (!workbook.getTrialObservations().isEmpty()) { - for (final MeasurementRow trialObservation : workbook.getTrialObservations()) { - this.getGeolocationSaver().updateGeolocationInformation(trialObservation, programUUID); - } - } - } - - public int createLocationAndSetToObservations( - final Workbook workbook, final List trialMV, - final VariableTypeList trialVariables, final Map trialVariatesMap, - final boolean isDeleteTrialObservations, final String programUUID) { - - final TimerWatch watch = new TimerWatch("transform trial environment"); - if (workbook.getTrialObservations().size() == 1) { - final MeasurementRow trialObs = workbook.getTrialObservations().get(0); - for (final MeasurementVariable mv : trialMV) { - for (final MeasurementData mvrow : trialObs.getDataList()) { - if (mvrow.getMeasurementVariable().getTermId() == mv.getTermId()) { - mv.setValue(mvrow.getValue()); - break; - } - } - } - } - VariableList geolocation = this.getVariableListTransformer().transformTrialEnvironment(trialMV, trialVariables); - this.setVariableListValues(geolocation, trialMV); - final Integer studyLocationId; - - // GCP-8092 Nurseries will always have a unique geolocation, no more - // concept of shared/common geolocation - if (geolocation == null || geolocation.isEmpty()) { - geolocation = this.createDefaultGeolocationVariableList(programUUID); - } - - watch.restart("save geolocation"); - - this.assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid(geolocation, this.daoFactory.getLocationDAO()); - this.assignExptDesignAsExternallyGeneratedDesignIfEmpty(geolocation); + final List locations = this.daoFactory.getLocationDAO().getByName(Location.UNSPECIFIED_LOCATION, Operation.EQUAL); - final Geolocation g = this.getGeolocationSaver() - .saveGeolocationOrRetrieveIfExisting(workbook.getStudyDetails().getStudyName(), geolocation, null, - isDeleteTrialObservations, programUUID); - studyLocationId = g.getLocationId(); - if (g.getVariates() != null && !g.getVariates().isEmpty()) { - final VariableList trialVariates = new VariableList(); - trialVariates.addAll(g.getVariates()); - trialVariatesMap.put(studyLocationId, trialVariates); - } - - watch.restart("set to observations(total)"); if (!workbook.getTrialObservations().isEmpty()) { + // If a study is created from Study Manager, extract the trial environments from workbook.getTrialObservations(). for (final MeasurementRow row : workbook.getTrialObservations()) { - row.setLocationId(studyLocationId); - } - } - if (workbook.getObservations() != null) { - for (final MeasurementRow row : workbook.getObservations()) { - row.setLocationId(studyLocationId); - } - } - watch.stop(); - - return studyLocationId; - } - - public int createLocationsAndSetToObservations( - final List locationIds, final Workbook workbook, - final VariableTypeList trialFactors, final List trialHeaders, final Map trialVariatesMap, - final boolean isDeleteTrialObservations, final String programUUID) { - - final List observations; - Long geolocationId = null; - boolean hasTrialObservations = false; - if (!workbook.getTrialObservations().isEmpty()) { - observations = workbook.getTrialObservations(); - hasTrialObservations = true; - } else { - observations = workbook.getObservations(); - } - final Map locationMap = new HashMap<>(); - if (observations != null) { - for (final MeasurementRow row : observations) { - geolocationId = row.getLocationId(); - if (geolocationId == 0) { - // if geolocationId does not exist, create the geolocation - // and set to row.locationId - final TimerWatch watch = new TimerWatch("transformTrialEnvironment in createLocationsAndSetToObservations"); - final VariableList geolocation = - this.getVariableListTransformer().transformTrialEnvironment(row, trialFactors, trialHeaders); - - this.setVariableListValues(geolocation, workbook.getConditions()); - if (geolocation != null && !geolocation.isEmpty()) { - - final String trialInstanceNumber = this.getTrialInstanceNumber(geolocation); - if (WorkbookSaver.LOG.isDebugEnabled()) { - WorkbookSaver.LOG.debug("trialInstanceNumber = " + trialInstanceNumber); - } - if (!locationMap.containsKey(trialInstanceNumber)) { - - // if new location (unique by trial instance number) - watch.restart("save geolocation"); - - this.assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid( - geolocation, this.daoFactory.getLocationDAO()); - this.assignExptDesignAsExternallyGeneratedDesignIfEmpty(geolocation); - - final Geolocation g = this.getGeolocationSaver() - .saveGeolocationOrRetrieveIfExisting(workbook.getStudyDetails().getStudyName(), geolocation, row, - isDeleteTrialObservations, programUUID); - geolocationId = g.getLocationId().longValue(); - locationIds.add(geolocationId.intValue()); - if (g.getVariates() != null && !g.getVariates().isEmpty()) { - final VariableList trialVariates = new VariableList(); - trialVariates.addAll(g.getVariates()); - trialVariatesMap.put(geolocationId.intValue(), trialVariates); - } - locationMap.put(trialInstanceNumber, geolocationId); - } else { - geolocationId = locationMap.get(trialInstanceNumber); - } - row.setLocationId(geolocationId); - } + final Integer instanceNumber = this.getTrialInstanceNumber(row); + if (row.getExperimentId() <= 0) { + final VariableList environmentVariables = + this.getVariableListTransformer().transformTrialEnvironment(row, trialVariables); + this.setVariableListValues(environmentVariables, workbook.getConditions()); + this.assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid( + environmentVariables, locations); + this.createTrialExperiment(crop, trialDatasetId, instanceNumber, environmentVariables); + } else { + // TODO: Update the trial environment variables if it is already existing. } } + } else { + // workbook.getTrialObservations() is empty when a study is created from Dataset Importer. + // In this case, extract the trial environments from plot observations + final Map instanceNumberEnvironmentIdsMap = this.daoFactory.getExperimentDao() + .getInstanceNumberEnvironmentIdsMap(trialDatasetId); - if (hasTrialObservations && workbook.getObservations() != null) { - for (final MeasurementRow row : workbook.getObservations()) { - final String trialInstance = this.getTrialInstanceNumber(row); - if (trialInstance != null) { - row.setLocationId(locationMap.get(trialInstance)); - } else if (geolocationId != null && geolocationId != 0) { - row.setLocationId(geolocationId); - } + for (final MeasurementRow row : workbook.getObservations()) { + final Integer instanceNumber = this.getTrialInstanceNumber(row); + if (!instanceNumberEnvironmentIdsMap.containsKey(instanceNumber)) { + final VariableList environmentVariables = + this.getVariableListTransformer().transformTrialEnvironment(row, trialVariables, trialHeaders); + this.setVariableListValues(environmentVariables, workbook.getConditions()); + this.assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid( + environmentVariables, locations); + this.assignExptDesignAsExternallyGeneratedDesignIfEmpty(environmentVariables); + + final Integer environmentId = this.createTrialExperiment(crop, trialDatasetId, instanceNumber, environmentVariables); + instanceNumberEnvironmentIdsMap.put(instanceNumber, environmentId); } - } - // return studyLocationId - if (workbook.getObservations() != null && !workbook.getObservations().isEmpty()) { - return Long.valueOf(workbook.getObservations().get(0).getLocationId()).intValue(); - } else { - return Long.valueOf(workbook.getTrialObservations().get(0).getLocationId()).intValue(); + row.setLocationId(instanceNumberEnvironmentIdsMap.get(instanceNumber)); } } - return 0; } - protected void assignExptDesignAsExternallyGeneratedDesignIfEmpty(final VariableList variableList) { + + private void assignExptDesignAsExternallyGeneratedDesignIfEmpty(final VariableList variableList) { final Variable exptDesignVariable = variableList.findById(TermId.EXPERIMENT_DESIGN_FACTOR); if (exptDesignVariable != null) { @@ -653,8 +400,8 @@ protected void assignExptDesignAsExternallyGeneratedDesignIfEmpty(final Variable } } - protected void assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid( - final VariableList variableList, final LocationDAO locationDAO) { + void assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid( + final VariableList variableList, final List locations) { final Variable locationIdVariable = variableList.findById(TermId.LOCATION_ID); if (locationIdVariable != null) { @@ -663,11 +410,11 @@ protected void assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid( if (!StringUtils.isEmpty(locationIdVariable.getValue())) { locationId.add(Integer.valueOf(locationIdVariable.getValue())); - locationIdExists = (locationDAO.getByIds(locationId).size() > 0) ? true : false; + locationIdExists = this.daoFactory.getLocationDAO().getByIds(locationId).size() > 0; } if (StringUtils.isEmpty(locationIdVariable.getValue()) || !locationIdExists) { String unspecifiedLocationLocId = ""; - final List locations = locationDAO.getByName(Location.UNSPECIFIED_LOCATION, Operation.EQUAL); + if (!locations.isEmpty()) { unspecifiedLocationLocId = String.valueOf(locations.get(0).getLocid()); } @@ -702,10 +449,10 @@ void setCategoricalVariableValues(final MeasurementVariable mvar, final Variable } } - private String getTrialInstanceNumber(final MeasurementRow row) { + private Integer getTrialInstanceNumber(final MeasurementRow row) { for (final MeasurementData data : row.getDataList()) { if (data.getMeasurementVariable().getTermId() == TermId.TRIAL_INSTANCE_FACTOR.getId()) { - return data.getValue(); + return Integer.valueOf(data.getValue()); } } return null; @@ -722,18 +469,6 @@ private String getStockFactor(final VariableList stockVariables) { return null; } - private String getTrialInstanceNumber(final VariableList trialVariables) { - if (trialVariables != null && trialVariables.getVariables() != null) { - for (final Variable variable : trialVariables.getVariables()) { - if (TermId.TRIAL_INSTANCE_FACTOR.getId() == variable.getVariableType().getStandardVariable().getId()) { - return variable.getValue(); - } - } - } - return null; - - } - private String generateTrialDatasetName(final String studyName) { return studyName + ENVIRONMENT; } @@ -746,15 +481,15 @@ private String generateMeansDatasetName(final String studyName) { return studyName + "-MEANS"; } - private ExperimentValues createTrialExperimentValues(final Integer locationId, final VariableList variates) { + private ExperimentValues createTrialExperimentValues(final VariableList variates, final Integer instanceNumber) { final ExperimentValues value = new ExperimentValues(); - value.setLocationId(locationId); value.setVariableList(variates); + value.setObservationUnitNo(instanceNumber); return value; } private int createStudyIfNecessary( - final Workbook workbook, final int studyLocationId, final boolean saveStudyExperiment, + final Workbook workbook, final boolean saveStudyExperiment, final String programUUID, final CropType crop) throws Exception { final TimerWatch watch = new TimerWatch("find study"); @@ -771,7 +506,7 @@ private int createStudyIfNecessary( studyVariables.addAll(this.getVariableTypeListTransformer() .transform(workbook.getStudyConstants(), studyVariables.size() + 1, programUUID)); - final StudyValues studyValues = this.getStudyValuesTransformer().transform(null, studyLocationId, studyMV, studyVariables); + final StudyValues studyValues = this.getStudyValuesTransformer().transform(studyMV, studyVariables); watch.restart("save study"); @@ -833,12 +568,14 @@ private int createTrialDatasetIfNecessary( return datasetId; } - private void createTrialExperiment( - final CropType crop, final int trialProjectId, final int locationId, final VariableList trialVariates) { + private Integer createTrialExperiment( + final CropType crop, final int trialProjectId, final Integer instanceNumber, final VariableList trialVariates) { final TimerWatch watch = new TimerWatch("save trial experiments"); - final ExperimentValues trialDatasetValues = this.createTrialExperimentValues(locationId, trialVariates); - this.getExperimentModelSaver().addExperiment(crop, trialProjectId, ExperimentType.TRIAL_ENVIRONMENT, trialDatasetValues); + final ExperimentValues trialDatasetValues = this.createTrialExperimentValues(trialVariates, instanceNumber); + final ExperimentModel experimentModel = + this.getExperimentModelSaver().addExperiment(crop, trialProjectId, ExperimentType.TRIAL_ENVIRONMENT, trialDatasetValues); watch.stop(); + return experimentModel.getNdExperimentId(); } private int createPlotDatasetIfNecessary( @@ -884,7 +621,7 @@ private int createPlotDatasetIfNecessary( return datasetId; } - public void createStocksIfNecessary( + private void createStocksIfNecessary( final int datasetId, final Workbook workbook, final VariableTypeList effectVariables, final List trialHeaders) { final Map stockMap = this.getStockModelBuilder().getStockMapForDataset(datasetId); @@ -927,65 +664,8 @@ public void createStocksIfNecessary( } - private void createMeasurementEffectExperiments( - final CropType crop, final int datasetId, final VariableTypeList effectVariables, - final List observations, final List trialHeaders) { + // TODO IBP-3389 See if this can be consolidated with createMeansExperiments - final TimerWatch watch = new TimerWatch("saving stocks and measurement effect data (total)"); - final TimerWatch rowWatch = new TimerWatch("for each row"); - - // observation values start at row 2 - int i = 2; - - final ExperimentValuesTransformer experimentValuesTransformer = this.getExperimentValuesTransformer(); - final ExperimentModelSaver experimentModelSaver = this.getExperimentModelSaver(); - Map exceptions = null; - final Session activeSession = this.getActiveSession(); - final FlushMode existingFlushMode = activeSession.getFlushMode(); - try { - activeSession.setFlushMode(FlushMode.MANUAL); - if (observations != null) { - for (final MeasurementRow row : observations) { - rowWatch.restart("saving row " + i++); - final ExperimentValues experimentValues = experimentValuesTransformer.transform(row, effectVariables, trialHeaders); - try { - experimentModelSaver.addExperiment(crop, datasetId, ExperimentType.PLOT, experimentValues); - } catch (final PhenotypeException e) { - WorkbookSaver.LOG.error(e.getMessage(), e); - if (exceptions == null) { - exceptions = e.getExceptions(); - } else { - for (final Integer standardVariableId : e.getExceptions().keySet()) { - final PhenotypeExceptionDto exception = e.getExceptions().get(standardVariableId); - if (exceptions.get(standardVariableId) == null) { - // add exception - exceptions.put(standardVariableId, exception); - } else { - // add invalid values to the existing map of - // exceptions for each phenotype - for (final String invalidValue : exception.getInvalidValues()) { - exceptions.get(standardVariableId).getInvalidValues().add(invalidValue); - } - } - } - } - } - } - } - activeSession.flush(); - } finally { - if (existingFlushMode != null) { - activeSession.setFlushMode(existingFlushMode); - } - } - - rowWatch.stop(); - watch.stop(); - - if (exceptions != null) { - throw new PhenotypeException(exceptions); - } - } private boolean isTrialFactorInDataset(final VariableTypeList list) { @@ -998,7 +678,7 @@ private boolean isTrialFactorInDataset(final VariableTypeList list) { } - protected VariableTypeList propagateTrialFactorsIfNecessary( + VariableTypeList propagateTrialFactorsIfNecessary( final VariableTypeList effectVariables, final VariableTypeList trialVariables) { @@ -1064,7 +744,7 @@ public int saveProjectOntology(final Workbook workbook, final String programUUID final List effectMV = measurementVariableMap.get(WorkbookSaver.EFFECTMV); // locationId and experiment are not yet needed here - final int studyId = this.createStudyIfNecessary(workbook, 0, false, programUUID, crop); + final int studyId = this.createStudyIfNecessary(workbook, false, programUUID, crop); final int trialDatasetId = this.createTrialDatasetIfNecessary(workbook, studyId, trialMV, trialVariables, programUUID); int measurementDatasetId = 0; int meansDatasetId = 0; @@ -1092,8 +772,7 @@ public int saveProjectOntology(final Workbook workbook, final String programUUID /** * Saves experiments creating entries in the following tables: - * nd_geolocation, nd_geolocationprop, nd_experiment, - * nd_experimentprop, stock, stockprop, + * nd_experiment, nd_experimentprop, stock, stockprop, * and phenotype * * @param workbook @@ -1125,26 +804,10 @@ public void saveProjectData(final Workbook workbook, final String programUUID, f // unpack maps final List trialHeaders = headerMap.get(WorkbookSaver.TRIALHEADERS); - final VariableTypeList trialVariableTypeList = variableTypeMap.get(WorkbookSaver.TRIALVARIABLETYPELIST); final VariableTypeList trialVariables = variableTypeMap.get(WorkbookSaver.TRIALVARIABLES); final VariableTypeList effectVariables = variableTypeMap.get(WorkbookSaver.EFFECTVARIABLE); - final List trialMV = measurementVariableMap.get(WorkbookSaver.TRIALMV); this.removeConstantsVariables(effectVariables, workbook.getConstants()); - // GCP-8092 Nurseries will always have a unique geolocation, no more - // concept of shared/common geolocation - // create locations (entries to nd_geolocation) and associate to - // observations - final int studyLocationId/* = DEFAULT_GEOLOCATION_ID */; - final List locationIds = new ArrayList<>(); - final Map trialVariatesMap = new HashMap<>(); - if (trialVariableTypeList != null) {// multi-location - studyLocationId = - this.createLocationsAndSetToObservations(locationIds, workbook, trialVariables, trialHeaders, trialVariatesMap, false, - programUUID); - } else { - studyLocationId = - this.createLocationAndSetToObservations(workbook, trialMV, trialVariables, trialVariatesMap, false, programUUID); - } + // create stock and stockprops and associate to observations int datasetId = measurementDatasetId; @@ -1155,31 +818,19 @@ public void saveProjectData(final Workbook workbook, final String programUUID, f // create trial experiments if not yet existing final boolean hasExistingStudyExperiment = this.checkIfHasExistingStudyExperiment(studyId); - final boolean hasExistingTrialExperiments = this.checkIfHasExistingExperiments(locationIds); if (!hasExistingStudyExperiment) { // 1. study experiment final StudyValues values = new StudyValues(); - values.setLocationId(studyLocationId); this.getStudySaver().saveStudyExperiment(crop, studyId, values); } - // create trial experiments if not yet existing - if (!hasExistingTrialExperiments) { - // 2. trial experiments - if (trialVariableTypeList != null) {// multi-location - for (final Integer locationId : locationIds) { - this.setVariableListValues(trialVariatesMap.get(locationId), workbook.getConstants()); - this.createTrialExperiment(crop, trialDatasetId, locationId, trialVariatesMap.get(locationId)); - } - } else { - this.createTrialExperiment(crop, trialDatasetId, studyLocationId, trialVariatesMap.get(studyLocationId)); - } - } + // 2. trial experiments + this.saveOrUpdateTrialObservations(crop, trialDatasetId, workbook, trialVariables, trialHeaders); if (isMeansDataImport) { // 3. means experiments - this.createMeansExperiments(crop, meansDatasetId, effectVariables, workbook.getObservations(), trialHeaders, trialVariatesMap); + this.createExperiments(crop, meansDatasetId, trialDatasetId, effectVariables, workbook.getObservations(), trialHeaders, ExperimentType.AVERAGE); } else { // 3. measurement experiments - this.createMeasurementEffectExperiments(crop, measurementDatasetId, effectVariables, workbook.getObservations(), trialHeaders); + this.createExperiments(crop, measurementDatasetId, trialDatasetId, effectVariables, workbook.getObservations(), trialHeaders, ExperimentType.PLOT); } } @@ -1209,23 +860,6 @@ private boolean checkIfHasExistingStudyExperiment(final int studyId) { return experimentId != null; } - private boolean checkIfHasExistingExperiments(final List locationIds) { - final List experimentIds = this.getExperimentDao().getExperimentIdsByGeolocationIds(locationIds); - return experimentIds != null && !experimentIds.isEmpty(); - } - - private VariableList createDefaultGeolocationVariableList(final String programUUID) { - final VariableList list = new VariableList(); - - final DMSVariableType variableType = new DMSVariableType(PhenotypicType.TRIAL_ENVIRONMENT.getLabelList().get(0), - PhenotypicType.TRIAL_ENVIRONMENT.getLabelList().get(0), - this.getStandardVariableBuilder().create(TermId.TRIAL_INSTANCE_FACTOR.getId(), programUUID), 1); - final Variable variable = new Variable(variableType, "1"); - list.add(variable); - - return list; - } - public void saveWorkbookVariables(final Workbook workbook) throws ParseException { final int parentFolderId = (int) workbook.getStudyDetails().getParentFolderId(); @@ -1340,11 +974,11 @@ private VariableTypeList getMeansData(final VariableTypeList effectVariables, fi return newList; } - private void createMeansExperiments( - final CropType crop, final int datasetId, final VariableTypeList effectVariables, - final List observations, final List trialHeaders, final Map trialVariatesMap) { + private void createExperiments( + final CropType crop, final int plotDatasetId, final Integer environmentDatasetId, final VariableTypeList effectVariables, + final List observations, final List trialHeaders, final ExperimentType experimentType) { - final TimerWatch watch = new TimerWatch("saving means data (total)"); + final TimerWatch watch = new TimerWatch("saving experiments (total)"); final TimerWatch rowWatch = new TimerWatch("for each row"); // observation values start at row 2 @@ -1353,38 +987,47 @@ private void createMeansExperiments( final ExperimentValuesTransformer experimentValuesTransformer = this.getExperimentValuesTransformer(); final ExperimentModelSaver experimentModelSaver = this.getExperimentModelSaver(); Map exceptions = null; - if (observations != null) { - for (final MeasurementRow row : observations) { - rowWatch.restart("saving row " + i++); - final ExperimentValues experimentValues = experimentValuesTransformer.transform(row, effectVariables, trialHeaders); - final VariableList trialVariates = trialVariatesMap.get((int) row.getLocationId()); - if (trialVariates != null) { - experimentValues.getVariableList().addAll(trialVariates); - } - try { - experimentModelSaver.addExperiment(crop, datasetId, ExperimentType.AVERAGE, experimentValues); - } catch (final PhenotypeException e) { - WorkbookSaver.LOG.error(e.getMessage(), e); - if (exceptions == null) { - exceptions = e.getExceptions(); - } else { - for (final Integer standardVariableId : e.getExceptions().keySet()) { - final PhenotypeExceptionDto exception = e.getExceptions().get(standardVariableId); - if (exceptions.get(standardVariableId) == null) { - // add exception - exceptions.put(standardVariableId, exception); - } else { - // add invalid values to the existing map of - // exceptions for each phenotype - for (final String invalidValue : exception.getInvalidValues()) { - exceptions.get(standardVariableId).getInvalidValues().add(invalidValue); + final Session activeSession = this.getActiveSession(); + final FlushMode existingFlushMode = activeSession.getFlushMode(); + final Map instanceNumberEnvironmentIdMap = this.daoFactory.getInstanceDao().getEnvironmentsByDataset(environmentDatasetId, true).stream() + .collect(Collectors.toMap(ExperimentModel::getObservationUnitNo, ExperimentModel::getNdExperimentId)); + try { + activeSession.setFlushMode(FlushMode.MANUAL); + if (observations != null) { + for (final MeasurementRow row : observations) { + rowWatch.restart("saving row " + i++); + final ExperimentValues experimentValues = experimentValuesTransformer.transform(row, effectVariables, trialHeaders, instanceNumberEnvironmentIdMap); + try { + experimentModelSaver.addExperiment(crop, plotDatasetId, experimentType, experimentValues); + } catch (final PhenotypeException e) { + WorkbookSaver.LOG.error(e.getMessage(), e); + if (exceptions == null) { + exceptions = e.getExceptions(); + } else { + for (final Integer standardVariableId : e.getExceptions().keySet()) { + final PhenotypeExceptionDto exception = e.getExceptions().get(standardVariableId); + if (exceptions.get(standardVariableId) == null) { + // add exception + exceptions.put(standardVariableId, exception); + } else { + // add invalid values to the existing map of + // exceptions for each phenotype + for (final String invalidValue : exception.getInvalidValues()) { + exceptions.get(standardVariableId).getInvalidValues().add(invalidValue); + } } } } } } } + activeSession.flush(); + } finally { + if (existingFlushMode != null) { + activeSession.setFlushMode(existingFlushMode); + } } + rowWatch.stop(); watch.stop(); @@ -1392,4 +1035,8 @@ private void createMeansExperiments( throw new PhenotypeException(exceptions); } } + + void setDaoFactory(final DaoFactory daoFactory) { + this.daoFactory = daoFactory; + } } diff --git a/src/main/java/org/generationcp/middleware/operation/searcher/ExperimentSearcher.java b/src/main/java/org/generationcp/middleware/operation/searcher/ExperimentSearcher.java deleted file mode 100644 index 4baa5089ed..0000000000 --- a/src/main/java/org/generationcp/middleware/operation/searcher/ExperimentSearcher.java +++ /dev/null @@ -1,98 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, All Rights Reserved. - * - * Generation Challenge Programme (GCP) - * - * - * This software is licensed for use under the terms of the GNU General Public License (http://bit.ly/8Ztv8M) and the provisions of Part F - * of the Generation Challenge Programme Amended Consortium Agreement (http://bit.ly/KQX1nL) - * - *******************************************************************************/ - -package org.generationcp.middleware.operation.searcher; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.generationcp.middleware.domain.oms.TermId; -import org.generationcp.middleware.exceptions.MiddlewareQueryException; -import org.generationcp.middleware.hibernate.HibernateSessionProvider; -import org.generationcp.middleware.manager.DaoFactory; - -public class ExperimentSearcher extends Searcher { - - private DaoFactory daoFactory; - - public ExperimentSearcher(HibernateSessionProvider sessionProviderForLocal) { - super(sessionProviderForLocal); - daoFactory = new DaoFactory(sessionProviderForLocal); - } - - // TODO: Not all factors were considered in this method. to be added as needed - public List searchExperimentsByFactor(Integer factorId, String value) throws MiddlewareQueryException { - Integer storedInId = this.getStoredInId(factorId); - - if (TermId.TRIAL_ENVIRONMENT_INFO_STORAGE.getId() == storedInId) { - return this.findExperimentsByGeolocationFactorValue(factorId, value); - - } else if (TermId.TRIAL_DESIGN_INFO_STORAGE.getId() == storedInId) { - return this.findExperimentsByExperimentFactorValue(factorId, value); - - } else if (TermId.GERMPLASM_ENTRY_STORAGE.getId() == storedInId) { - return this.findExperimentsByStockFactorValue(factorId, value); - - } else if (TermId.ENTRY_GID_STORAGE.getId() == storedInId) { - return this.findExperimentsByStock("dbxrefId", value); - - } else if (TermId.ENTRY_NUMBER_STORAGE.getId() == storedInId) { - return this.findExperimentsByStock("uniqueName", value); - - } else if (TermId.ENTRY_DESIGNATION_STORAGE.getId() == storedInId) { - return this.findExperimentsByStock("name", value); - - } else if (TermId.ENTRY_CODE_STORAGE.getId() == storedInId) { - return this.findExperimentsByStock("value", value); - } - - return new ArrayList(); - } - - private Integer getStoredInId(Integer factorId) throws MiddlewareQueryException { - List termIds = daoFactory.getCvTermRelationshipDao().getObjectIdByTypeAndSubject(TermId.STORED_IN.getId(), factorId); - return termIds != null && !termIds.isEmpty() ? termIds.get(0) : null; - } - - private List findExperimentsByGeolocationFactorValue(Integer factorId, String value) throws MiddlewareQueryException { - Set geolocationIds = new HashSet(); - geolocationIds.addAll(this.getGeolocationPropertyDao().getGeolocationIdsByPropertyTypeAndValue(factorId, value)); - - Set experimentIds = new HashSet(); - experimentIds.addAll(this.getExperimentDao().getExperimentIdsByGeolocationIds(geolocationIds)); - - return new ArrayList(experimentIds); - } - - private List findExperimentsByStockFactorValue(Integer factorId, String value) throws MiddlewareQueryException { - Set stockIds = new HashSet(); - stockIds.addAll(this.getStockPropertyDao().getStockIdsByPropertyTypeAndValue(factorId, value)); - - return this.getExperimentIdsByStockIds(stockIds); - } - - private List findExperimentsByExperimentFactorValue(Integer factorId, String value) throws MiddlewareQueryException { - return this.getExperimentPropertyDao().getExperimentIdsByPropertyTypeAndValue(factorId, value); - } - - private List getExperimentIdsByStockIds(Collection stockIds) throws MiddlewareQueryException { - return this.getExperimentDao().getExperimentIdsByStockIds(stockIds); - } - - private List findExperimentsByStock(String columnName, String value) throws MiddlewareQueryException { - Set stockIds = new HashSet(); - stockIds.addAll(this.getStockDao().getStockIdsByProperty(columnName, value)); - return this.getExperimentIdsByStockIds(stockIds); - } -} diff --git a/src/main/java/org/generationcp/middleware/operation/searcher/ProjectSearcher.java b/src/main/java/org/generationcp/middleware/operation/searcher/ProjectSearcher.java deleted file mode 100644 index b8572ad271..0000000000 --- a/src/main/java/org/generationcp/middleware/operation/searcher/ProjectSearcher.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, All Rights Reserved. - * - * Generation Challenge Programme (GCP) - * - * - * This software is licensed for use under the terms of the GNU General Public License (http://bit.ly/8Ztv8M) and the provisions of Part F - * of the Generation Challenge Programme Amended Consortium Agreement (http://bit.ly/KQX1nL) - * - *******************************************************************************/ - -package org.generationcp.middleware.operation.searcher; - -import org.generationcp.middleware.hibernate.HibernateSessionProvider; - -public abstract class ProjectSearcher extends Searcher { - - protected ProjectSearcher(HibernateSessionProvider sessionProviderForLocal) { - super(sessionProviderForLocal); - } -} diff --git a/src/main/java/org/generationcp/middleware/operation/searcher/Searcher.java b/src/main/java/org/generationcp/middleware/operation/searcher/Searcher.java deleted file mode 100644 index a665de9f9f..0000000000 --- a/src/main/java/org/generationcp/middleware/operation/searcher/Searcher.java +++ /dev/null @@ -1,29 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012, All Rights Reserved. - * - * Generation Challenge Programme (GCP) - * - * - * This software is licensed for use under the terms of the GNU General Public License (http://bit.ly/8Ztv8M) and the provisions of Part F - * of the Generation Challenge Programme Amended Consortium Agreement (http://bit.ly/KQX1nL) - * - *******************************************************************************/ - -package org.generationcp.middleware.operation.searcher; - -import org.generationcp.middleware.hibernate.HibernateSessionProvider; -import org.generationcp.middleware.util.DatabaseBroker; - -/** - * Provides searcher classes that can be used to retrieve data from IBDBv2 schema. Creates searcher classes based on the given local/central - * session parameters. - * - * @author Donald Barre - */ -public abstract class Searcher extends DatabaseBroker { - - protected Searcher(HibernateSessionProvider sessionProvider) { - super(sessionProvider); - } - -} diff --git a/src/main/java/org/generationcp/middleware/operation/searcher/package.html b/src/main/java/org/generationcp/middleware/operation/searcher/package.html deleted file mode 100644 index 1b2144b689..0000000000 --- a/src/main/java/org/generationcp/middleware/operation/searcher/package.html +++ /dev/null @@ -1,4 +0,0 @@ - -Contains the Searcher classes that are used to search for data in IBDBv2 schema. -Initially, it contains searcher classes and methods for Project, Study and Experiment. - \ No newline at end of file diff --git a/src/main/java/org/generationcp/middleware/operation/transformer/etl/ExperimentValuesTransformer.java b/src/main/java/org/generationcp/middleware/operation/transformer/etl/ExperimentValuesTransformer.java index 0aef89633f..b0e4333849 100644 --- a/src/main/java/org/generationcp/middleware/operation/transformer/etl/ExperimentValuesTransformer.java +++ b/src/main/java/org/generationcp/middleware/operation/transformer/etl/ExperimentValuesTransformer.java @@ -1,8 +1,6 @@ package org.generationcp.middleware.operation.transformer.etl; -import java.util.List; - import org.generationcp.middleware.domain.dms.DMSVariableType; import org.generationcp.middleware.domain.dms.ExperimentValues; import org.generationcp.middleware.domain.dms.Variable; @@ -10,50 +8,54 @@ import org.generationcp.middleware.domain.dms.VariableTypeList; import org.generationcp.middleware.domain.etl.MeasurementData; import org.generationcp.middleware.domain.etl.MeasurementRow; +import org.generationcp.middleware.domain.oms.TermId; import org.generationcp.middleware.exceptions.MiddlewareQueryException; import org.generationcp.middleware.hibernate.HibernateSessionProvider; +import java.util.List; +import java.util.Map; + public class ExperimentValuesTransformer extends Transformer { - public ExperimentValuesTransformer(HibernateSessionProvider sessionProviderForLocal) { + public ExperimentValuesTransformer(final HibernateSessionProvider sessionProviderForLocal) { super(sessionProviderForLocal); } - public ExperimentValues transform(MeasurementRow mRow, VariableTypeList varTypeList, List trialHeaders) - throws MiddlewareQueryException { - ExperimentValues experimentValues = new ExperimentValues(); + public ExperimentValues transform(final MeasurementRow mRow, final VariableTypeList varTypeList, final List trialHeaders, final Map instanceNumberEnvironmentIdMap) { + final ExperimentValues experimentValues = new ExperimentValues(); if (mRow == null) { return experimentValues; } - List nonTrialMD = mRow.getNonTrialDataList(trialHeaders); + final List nonTrialMD = mRow.getNonTrialDataList(trialHeaders); if (nonTrialMD != null && varTypeList != null && varTypeList.getVariableTypes() != null) { if (nonTrialMD.size() == varTypeList.getVariableTypes().size()) { - Integer locationId = Integer.parseInt(String.valueOf(mRow.getLocationId())); - Integer germplasmId = Integer.parseInt(String.valueOf(mRow.getStockId())); - VariableList variableList = new VariableList(); + final Integer germplasmId = Integer.parseInt(String.valueOf(mRow.getStockId())); + final VariableList variableList = new VariableList(); - List varTypes = varTypeList.getVariableTypes(); + final List varTypes = varTypeList.getVariableTypes(); for (int i = 0, l = varTypes.size(); i < l; i++) { - DMSVariableType varType = varTypes.get(i); - String value = null; - for (MeasurementData data : nonTrialMD) { + final DMSVariableType varType = varTypes.get(i); + String value; + for (final MeasurementData data : nonTrialMD) { if (data.getMeasurementVariable().getTermId() == varTypes.get(i).getId()) { if (data.getcValueId() != null) { value = data.getcValueId(); } else { value = data.getValue(); } - Variable variable = new Variable(varType, value); + final Variable variable = new Variable(varType, value); variableList.add(variable); data.setVariable(variable); } } } - + final Integer instanceNumber = this.getTrialInstanceNumber(mRow); + if (instanceNumberEnvironmentIdMap.get(instanceNumber) != null) { + experimentValues.setLocationId(instanceNumberEnvironmentIdMap.get(instanceNumber)); + } experimentValues.setVariableList(variableList); experimentValues.setGermplasmId(germplasmId); - experimentValues.setLocationId(locationId); } else { throw new MiddlewareQueryException("Variables did not match the Measurements Row."); } @@ -61,4 +63,13 @@ public ExperimentValues transform(MeasurementRow mRow, VariableTypeList varTypeL return experimentValues; } + + private Integer getTrialInstanceNumber(final MeasurementRow row) { + for (final MeasurementData data : row.getDataList()) { + if (data.getMeasurementVariable().getTermId() == TermId.TRIAL_INSTANCE_FACTOR.getId()) { + return Integer.valueOf(data.getValue()); + } + } + return null; + } } diff --git a/src/main/java/org/generationcp/middleware/operation/transformer/etl/StudyValuesTransformer.java b/src/main/java/org/generationcp/middleware/operation/transformer/etl/StudyValuesTransformer.java index 489b38d6a3..89fd4cbe0e 100644 --- a/src/main/java/org/generationcp/middleware/operation/transformer/etl/StudyValuesTransformer.java +++ b/src/main/java/org/generationcp/middleware/operation/transformer/etl/StudyValuesTransformer.java @@ -8,28 +8,27 @@ import org.generationcp.middleware.domain.dms.VariableList; import org.generationcp.middleware.domain.dms.VariableTypeList; import org.generationcp.middleware.domain.etl.MeasurementVariable; -import org.generationcp.middleware.exceptions.MiddlewareException; import org.generationcp.middleware.hibernate.HibernateSessionProvider; import java.util.List; public class StudyValuesTransformer extends Transformer { - public StudyValuesTransformer(HibernateSessionProvider sessionProviderForLocal) { + public StudyValuesTransformer(final HibernateSessionProvider sessionProviderForLocal) { super(sessionProviderForLocal); } - public StudyValues transform(Integer germplasmId, Integer locationId, List measurementVariables, - VariableTypeList variableTypeList) throws MiddlewareException { + public StudyValues transform(final List measurementVariables, + final VariableTypeList variableTypeList) { - StudyValues studyValues = new StudyValues(); - VariableList variableList = new VariableList(); + final StudyValues studyValues = new StudyValues(); + final VariableList variableList = new VariableList(); if (variableTypeList != null) { - for (DMSVariableType variableType : variableTypeList.getVariableTypes()) { + for (final DMSVariableType variableType : variableTypeList.getVariableTypes()) { if (variableType.getStandardVariable().getPhenotypicType() == PhenotypicType.STUDY || variableType.getStandardVariable().getPhenotypicType() == PhenotypicType.VARIATE) { String value = null; - for (MeasurementVariable var : measurementVariables) { + for (final MeasurementVariable var : measurementVariables) { if (var.getTermId() == variableType.getId()) { value = var.getValue(); @@ -41,8 +40,6 @@ public StudyValues transform(Integer germplasmId, Integer locationId, List varTypes = variableTypeList.getVariableTypes(); final int varTypeSize = varTypes.size(); - for (int i = 0, l = varTypeSize; i < l; i++) { + for (int i = 0; i < varTypeSize; i++) { final DMSVariableType varType = varTypes.get(i); if (varType.getStandardVariable().getPhenotypicType() == PhenotypicType.TRIAL_ENVIRONMENT @@ -165,7 +161,7 @@ public VariableList transformTrialEnvironment(final MeasurementRow mRow, final V if (trialMD != null && variableTypeList != null && variableTypeList.getVariableTypes() != null) { final List varTypes = variableTypeList.getVariableTypes(); final int varTypeSize = varTypes.size(); - for (int i = 0, l = varTypeSize; i < l; i++) { + for (int i = 0; i < varTypeSize; i++) { final DMSVariableType varType = varTypes.get(i); MeasurementData trialData = null; for (final MeasurementData aData : trialMD) { @@ -197,8 +193,8 @@ public VariableList transformTrialEnvironment(final MeasurementRow mRow, final V return variableList; } - public VariableList transformTrialEnvironment(final List measurementVariableList, - final VariableTypeList variableTypeList) throws MiddlewareQueryException { + VariableList transformTrialEnvironment(final List measurementVariableList, + final VariableTypeList variableTypeList) { final VariableList variableList = new VariableList(); if (measurementVariableList == null && variableTypeList == null) { @@ -224,37 +220,5 @@ public VariableList transformTrialEnvironment(final List me return variableList; } - private int addVariableIfNecessary(final VariableList variables, final VariableTypeList variableTypeList, - final TermId termId, final String localName, final String localDescription, final String value, - final int rank, final String programUUID, final PhenotypicType role) throws MiddlewareException { - Variable variable = null; - - boolean found = false; - if (variableTypeList != null && variableTypeList.getVariableTypes() != null - && !variableTypeList.getVariableTypes().isEmpty()) { - for (final DMSVariableType variableType : variableTypeList.getVariableTypes()) { - if (variableType.getStandardVariable() != null) { - final StandardVariable standardVariable = variableType.getStandardVariable(); - if (standardVariable.getId() == termId.getId()) { - found = true; - break; - } - } - } - - } - if (!found) { - final StandardVariable standardVariable = this.getStandardVariableBuilder().create(termId.getId(), - programUUID); - standardVariable.setPhenotypicType(role); - final DMSVariableType variableType = new DMSVariableType(localName, localDescription, standardVariable, - rank); - variable = new Variable(variableType, value); - variableType.setRole(role); - variables.add(variable); - return rank + 1; - } - return rank; - } } diff --git a/src/main/java/org/generationcp/middleware/pojos/dms/ExperimentModel.java b/src/main/java/org/generationcp/middleware/pojos/dms/ExperimentModel.java index 2f22f30a4a..ed23d15c5a 100644 --- a/src/main/java/org/generationcp/middleware/pojos/dms/ExperimentModel.java +++ b/src/main/java/org/generationcp/middleware/pojos/dms/ExperimentModel.java @@ -26,7 +26,6 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; -import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.TableGenerator; import java.io.Serializable; @@ -62,11 +61,6 @@ public class ExperimentModel implements Serializable { @Column(name = "nd_experiment_id") private Integer ndExperimentId; - // Geolocation - @OneToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "nd_geolocation_id") - private Geolocation geoLocation; - // References cvterm @Column(name = "type_id") private Integer typeId; @@ -113,16 +107,14 @@ public ExperimentModel(final Integer ndExperimentId) { this.ndExperimentId = ndExperimentId; } - public ExperimentModel(final Integer ndExperimentId, final Geolocation geoLocation, final Integer typeId) { + public ExperimentModel(final Integer ndExperimentId, final Integer typeId) { super(); this.ndExperimentId = ndExperimentId; - this.geoLocation = geoLocation; this.typeId = typeId; } - public ExperimentModel(final Geolocation geoLocation, final Integer typeId, final DmsProject project, final StockModel stock, + public ExperimentModel(final Integer typeId, final DmsProject project, final StockModel stock, final ExperimentModel parent, final Integer observationUnitNo) { - this.geoLocation = geoLocation; this.typeId = typeId; this.project = project; this.stock = stock; @@ -138,14 +130,6 @@ public void setNdExperimentId(final Integer ndExperimentId) { this.ndExperimentId = ndExperimentId; } - public Geolocation getGeoLocation() { - return this.geoLocation; - } - - public void setGeoLocation(final Geolocation geoLocation) { - this.geoLocation = geoLocation; - } - public Integer getTypeId() { return this.typeId; } @@ -159,7 +143,7 @@ public List getProperties() { } public String getJsonProps() { - return jsonProps; + return this.jsonProps; } public void setJsonProps(final String props) { @@ -177,11 +161,11 @@ public DmsProject getProject() { public void setProject(final DmsProject project) { this.project = project; } - + public StockModel getStock() { return this.stock; } - + public void setStock(final StockModel stock) { this.stock = stock; } @@ -222,7 +206,6 @@ public void setObservationUnitNo(final Integer observationUnitNo) { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + (this.geoLocation == null ? 0 : this.geoLocation.hashCode()); result = prime * result + (this.ndExperimentId == null ? 0 : this.ndExperimentId.hashCode()); result = prime * result + (this.typeId == null ? 0 : this.typeId.hashCode()); return result; @@ -240,13 +223,6 @@ public boolean equals(final Object obj) { return false; } final ExperimentModel other = (ExperimentModel) obj; - if (this.geoLocation == null) { - if (other.geoLocation != null) { - return false; - } - } else if (!this.geoLocation.equals(other.geoLocation)) { - return false; - } if (this.ndExperimentId == null) { if (other.ndExperimentId != null) { return false; @@ -267,16 +243,15 @@ public boolean equals(final Object obj) { @Override public String toString() { return "ExperimentModel{" + - "ndExperimentId=" + ndExperimentId + - ", geoLocation=" + geoLocation + - ", typeId=" + typeId + - ", obsUnitId='" + obsUnitId + '\'' + - ", properties=" + properties + - ", project=" + project + - ", stock=" + stock + - ", phenotypes=" + phenotypes + - ", parent=" + parent + - ", observationUnitNo=" + observationUnitNo + + "ndExperimentId=" + this.ndExperimentId + + ", typeId=" + this.typeId + + ", obsUnitId='" + this.obsUnitId + '\'' + + ", properties=" + this.properties + + ", project=" + this.project + + ", stock=" + this.stock + + ", phenotypes=" + this.phenotypes + + ", parent=" + this.parent + + ", observationUnitNo=" + this.observationUnitNo + '}'; } } diff --git a/src/main/java/org/generationcp/middleware/pojos/dms/ExperimentProperty.java b/src/main/java/org/generationcp/middleware/pojos/dms/ExperimentProperty.java index a530e15085..35b219692b 100644 --- a/src/main/java/org/generationcp/middleware/pojos/dms/ExperimentProperty.java +++ b/src/main/java/org/generationcp/middleware/pojos/dms/ExperimentProperty.java @@ -74,6 +74,13 @@ public ExperimentProperty (final ExperimentModel experimentModel, this.rank = rank; } + public ExperimentProperty(final ExperimentModel experimentModel, final String value, final Integer rank, final Integer typeId) { + this.experiment = experimentModel; + this.value = value; + this.rank = rank; + this.typeId = typeId; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/org/generationcp/middleware/service/DataImportServiceImpl.java b/src/main/java/org/generationcp/middleware/service/DataImportServiceImpl.java index 234e28f191..9e702c2a16 100644 --- a/src/main/java/org/generationcp/middleware/service/DataImportServiceImpl.java +++ b/src/main/java/org/generationcp/middleware/service/DataImportServiceImpl.java @@ -29,11 +29,11 @@ import org.generationcp.middleware.exceptions.MiddlewareQueryException; import org.generationcp.middleware.exceptions.WorkbookParserException; import org.generationcp.middleware.hibernate.HibernateSessionProvider; +import org.generationcp.middleware.manager.DaoFactory; import org.generationcp.middleware.manager.Operation; import org.generationcp.middleware.manager.api.GermplasmDataManager; import org.generationcp.middleware.manager.api.LocationDataManager; import org.generationcp.middleware.manager.api.OntologyDataManager; -import org.generationcp.middleware.manager.api.StudyDataManager; import org.generationcp.middleware.manager.ontology.api.TermDataManager; import org.generationcp.middleware.operation.parser.WorkbookParser; import org.generationcp.middleware.operation.saver.WorkbookSaver; @@ -90,18 +90,18 @@ public class DataImportServiceImpl extends Service implements DataImportService @Resource private TermDataManager termDataManager; - @Resource - private StudyDataManager studyDataManager; - @Resource private WorkbookSaver workbookSaver; + private DaoFactory daoFactory; + public DataImportServiceImpl() { } public DataImportServiceImpl(final HibernateSessionProvider sessionProvider) { super(sessionProvider); + this.daoFactory = new DaoFactory(sessionProvider); } /** @@ -192,8 +192,7 @@ public Workbook parseWorkbookDescriptionSheet(final org.apache.poi.ss.usermodel. throws WorkbookParserException { final WorkbookParser parser = new WorkbookParser(this.maxRowLimit); // Only parses the description sheet. - final Workbook workbook = parser.parseFile(excelWorkbook, false, currentIbdbUserId.toString()); - return workbook; + return parser.parseFile(excelWorkbook, false, currentIbdbUserId.toString()); } @Override @@ -674,7 +673,7 @@ private void checkForDuplicateStudyName(final Workbook workbook, final List getDatasetReferences(final int studyId) { return this.studyDataManager.getDatasetReferences(studyId); } - @Override - public Integer getGermplasmIdByName(final String name) { - - final List germplasmList = this.getGermplasmDataManager().getGermplasmByName(name, 0, 1, Operation.EQUAL); - Integer gid = null; - if (germplasmList != null && !germplasmList.isEmpty()) { - gid = germplasmList.get(0).getGid(); - } - return gid; - } @Override public Integer getStandardVariableIdByPropertyScaleMethodRole(final String property, final String scale, final String method, @@ -260,9 +248,6 @@ public void saveWorkbookVariablesAndObservations(final Workbook workbook, final this.workbookSaver.saveWorkbookVariables(workbook); this.workbookSaver.removeDeletedVariablesAndObservations(workbook); - // save trial observations - this.workbookSaver.saveTrialObservations(workbook, programUUID); - } catch (final Exception e) { throw new MiddlewareQueryException("Error encountered with saving to database: ", e); } @@ -290,24 +275,6 @@ public void saveExperimentalDesign( } } - @Override - public void deleteExperimentalDesign( - final Workbook workbook, final String programUUID, final CropType crop) { - final TimerWatch timerWatch = new TimerWatch("deleteExperimentalDesign (grand total)"); - try { - - this.workbookSaver.saveProjectProperties(workbook); - this.workbookSaver.removeDeletedVariablesAndObservations(workbook); - final Map variableMap = this.workbookSaver.saveVariables(workbook, programUUID); - - this.workbookSaver.deleteExperimentalDesign(workbook, variableMap, programUUID, crop); - } catch (final Exception e) { - throw new MiddlewareQueryException("Error encountered with saving to database: ", e); - } finally { - timerWatch.stop(); - } - } - protected void saveOrUpdateTrialDesignData(final ExperimentPropertySaver experimentPropertySaver, final ExperimentModel experimentModel, final MeasurementData measurementData, final int termId) { @@ -521,19 +488,6 @@ public Integer saveGermplasmList(final List> } - @Override - public String getCimmytWheatGermplasmNameByGid(final int gid) { - List names = this.getByGidAndNtype(gid, GermplasmNameType.CIMMYT_SELECTION_HISTORY); - if (names == null || names.isEmpty()) { - names = this.getByGidAndNtype(gid, GermplasmNameType.UNRESOLVED_NAME); - } - return names != null && !names.isEmpty() ? names.get(0).getNval() : null; - } - - private List getByGidAndNtype(final int gid, final GermplasmNameType nType) { - return this.getNameDao().getByGIDWithFilters(gid, null, nType); - } - @Override public GermplasmList getGermplasmListByName(final String name, final String programUUID) { final List germplasmLists = this.germplasmListManager.getGermplasmListByName(name, programUUID, 0, 1, Operation.EQUAL); @@ -553,51 +507,11 @@ public Germplasm getGermplasmByGID(final int gid) { return this.getGermplasmDataManager().getGermplasmByGID(gid); } - @Override - public List getDistinctStandardVariableValues(final int stdVarId) { - return this.getValueReferenceBuilder().getDistinctStandardVariableValues(stdVarId); - } - - @Override - public List getDistinctStandardVariableValues(final String property, final String scale, final String method, - final PhenotypicType role) { - - final Integer stdVarId = this.getStandardVariableIdByPropertyScaleMethodRole(property, scale, method, role); - if (stdVarId != null) { - return this.getValueReferenceBuilder().getDistinctStandardVariableValues(stdVarId); - } - return new ArrayList<>(); - } - - @Override - public Set getAllStandardVariables(final String programUUID) { - return this.getOntologyDataManager().getAllStandardVariables(programUUID); - } - @Override public StandardVariable getStandardVariable(final int id, final String programUUID) { return this.getOntologyDataManager().getStandardVariable(id, programUUID); } - @Override - public List getAllNurseryTypes(final String programUUID) { - - final List nurseryTypes = new ArrayList<>(); - - final StandardVariable stdVar = this.getOntologyDataManager().getStandardVariable(TermId.NURSERY_TYPE.getId(), programUUID); - final List validValues = stdVar.getEnumerations(); - - if (validValues != null) { - for (final Enumeration value : validValues) { - if (value != null) { - nurseryTypes.add(new ValueReference(value.getId(), value.getName(), value.getDescription())); - } - } - } - - return nurseryTypes; - } - @Override public int countPlotsWithRecordedVariatesInDataset(final int datasetId, final List variateIds) { @@ -773,8 +687,7 @@ public List getPossibleTreatmentPairs(final int cvTermId, fina termIds.add(pair.getMethod().getId()); } - final List terms = new ArrayList<>(); - terms.addAll(this.daoFactory.getCvTermDao().getByIds(termIds)); + final List terms = new ArrayList<>(this.daoFactory.getCvTermDao().getByIds(termIds)); for (final CVTerm term : terms) { termMap.put(term.getCvTermId(), term); @@ -806,39 +719,6 @@ public Location getLocationByName(final String locationName, final Operation op) return null; } - @Override - public Integer updateGermplasmList(final List> listDataItems, final GermplasmList germplasmList) { - final GermplasmListDAO germplasmListDao = this.daoFactory.getGermplasmListDAO(); - - final long startTime = System.currentTimeMillis(); - - try { - - germplasmListDao.update(germplasmList); - - // Save germplasms, names, list data - for (final Pair pair : listDataItems) { - - final Germplasm germplasm = pair.getLeft(); - final GermplasmListData germplasmListData = pair.getRight(); - - germplasmListData.setGid(germplasm.getGid()); - germplasmListData.setList(germplasmList); - this.daoFactory.getGermplasmListDataDAO().update(germplasmListData); - } - - } catch (final MiddlewareQueryException e) { - FieldbookServiceImpl.LOG - .error("Error encountered with FieldbookService.updateNurseryCrossesGermplasmList(germplasmList=" + germplasmList - + "): " + e.getMessage()); - throw e; - } - - FieldbookServiceImpl.LOG.debug("========== updateGermplasmList Duration (ms): " + (System.currentTimeMillis() - startTime) / 60); - - return germplasmList.getId(); - } - @Override public int getMeasurementDatasetId(final int studyId) { return this.workbookBuilder.getMeasurementDataSetId(studyId); @@ -880,8 +760,8 @@ public StudyDetails getStudyDetails(final int studyId) { } @Override - public String getBlockId(final int datasetId, final String trialInstance) { - return this.getGeolocationPropertyDao().getValueOfTrialInstance(datasetId, TermId.BLOCK_ID.getId(), trialInstance); + public String getBlockId(final int datasetId, final Integer trialInstance) { + return this.studyDataManager.getBlockId(datasetId, trialInstance); } @Override @@ -889,11 +769,6 @@ public String getFolderNameById(final Integer folderId) { return this.studyDataManager.getFolderNameById(folderId); } - @Override - public boolean checkIfStudyHasFieldmap(final int studyId) { - return this.getExperimentBuilder().checkIfStudyHasFieldmap(studyId); - } - @Override public boolean checkIfStudyHasMeasurementData(final int datasetId, final List variateIds) { return this.studyDataManager.checkIfStudyHasMeasurementData(datasetId, variateIds); @@ -904,34 +779,11 @@ public int countVariatesWithData(final int datasetId, final List variat return this.studyDataManager.countVariatesWithData(datasetId, variateIds); } - @Override - public void deleteObservationsOfStudy(final int datasetId) { - try { - this.getExperimentDestroyer().deleteExperimentsByStudy(datasetId); - } catch (final Exception e) { - - this.logAndThrowException("Error encountered with deleteObservationsOfStudy(): " + e.getMessage(), e, FieldbookServiceImpl.LOG); - } - } - - @Override - public List buildTrialObservations(final int trialDatasetId, final List factorList, - final List variateList) { - return this.workbookBuilder.buildTrialObservations(trialDatasetId, factorList, variateList); - } - @Override public List getGermplasmIdsByName(final String name) { return this.getNameDao().getGidsByName(name); } - @Override - public Integer addGermplasmName(final String nameValue, final int gid, final int userId, final int nameTypeId, final int locationId, - final Integer date) { - final Name name = new Name(null, gid, nameTypeId, 0, userId, nameValue, locationId, date, 0); - return this.getGermplasmDataManager().addGermplasmName(name); - } - @Override public List addGermplasmNames(final List names) { return this.getGermplasmDataManager().addGermplasmName(names); @@ -1084,17 +936,6 @@ public long countListDataProjectByListIdAndEntryTypeIds(final int listId, final return this.getListDataProjectDAO().countByListIdAndEntryType(listId, systemDefinedEntryTypeIds); } - @Override - public List getListDataProjectByStudy(final int projectId, final GermplasmListType type, final List plotNumbers, - final String instanceNumber) { - return this.getListDataProjectDAO().getByStudy(projectId, type, plotNumbers, instanceNumber); - } - - @Override - public ListDataProject getListDataProjectByListIdAndEntryNo(final int listId, final int entryNo) { - return this.getListDataProjectDAO().getByListIdAndEntryNo(listId, entryNo); - } - @Override public void deleteListDataProjects(final int projectId, final GermplasmListType type) { // when used in advanced, it will delete all the advance lists (list @@ -1163,20 +1004,6 @@ public boolean setOrderVariableByRank(final Workbook workbook, final Integer plo return false; } - @Override - public void addListDataProjectList(final List listDataProjectList) { - - try { - for (final ListDataProject listDataProject : listDataProjectList) { - listDataProject.setList(this.getGermplasmListById(listDataProject.getList().getId())); - this.getListDataProjectDAO().save(listDataProject); - } - } catch (final Exception e) { - FieldbookServiceImpl.LOG.error(e.getMessage(), e); - this.logAndThrowException("Error encountered with addListDataProjectList(): " + e.getMessage(), e, FieldbookServiceImpl.LOG); - } - } - @Override public StandardVariable getStandardVariableByName(final String name, final String programUUID) { return this.getStandardVariableBuilder().getByName(name, programUUID); @@ -1190,27 +1017,6 @@ void setGermplasmGroupingService(final GermplasmGroupingService germplasmGroupin this.germplasmGroupingService = germplasmGroupingService; } - @Override - public String getPlotCodePrefix(final String cropName) { - return this.getWorkbenchDataManager().getCropTypeByName(cropName).getPlotCodePrefix(); - } - - @Override - public List appendTabLabelToList(final List germplasmCrossesList) { - for (final Iterator iterator = germplasmCrossesList.iterator(); iterator.hasNext(); ) { - final GermplasmList germplasmList = iterator.next(); - - if (GermplasmListType.IMP_CROSS.toString().equals(germplasmList.getType())) { - germplasmList.setTabLabel(GermplasmList.IMP_CROSS); - } else if (GermplasmListType.CRT_CROSS.toString().equals(germplasmList.getType())) { - germplasmList.setTabLabel(GermplasmList.CRT_CROSS); - } else { - germplasmList.setTabLabel(GermplasmList.CROSSES); - } - } - return germplasmCrossesList; - } - @Override public List getAllNoBulkingMethods(final boolean filterOutGenerative) { final List methodList = filterOutGenerative ? diff --git a/src/main/java/org/generationcp/middleware/service/Service.java b/src/main/java/org/generationcp/middleware/service/Service.java index 2a50de2788..2fe4fa9936 100644 --- a/src/main/java/org/generationcp/middleware/service/Service.java +++ b/src/main/java/org/generationcp/middleware/service/Service.java @@ -35,17 +35,10 @@ import org.generationcp.middleware.manager.ontology.api.OntologyVariableDataManager; import org.generationcp.middleware.manager.ontology.api.TermDataManager; import org.generationcp.middleware.operation.builder.ExperimentBuilder; -import org.generationcp.middleware.operation.builder.LotBuilder; import org.generationcp.middleware.operation.builder.StandardVariableBuilder; import org.generationcp.middleware.operation.builder.TermBuilder; -import org.generationcp.middleware.operation.builder.TransactionBuilder; import org.generationcp.middleware.operation.builder.ValueReferenceBuilder; -import org.generationcp.middleware.operation.destroyer.ExperimentDestroyer; import org.generationcp.middleware.operation.destroyer.StudyDestroyer; -import org.generationcp.middleware.operation.saver.ExperimentPropertySaver; -import org.generationcp.middleware.operation.saver.GeolocationSaver; -import org.generationcp.middleware.operation.saver.PhenotypeOutlierSaver; -import org.generationcp.middleware.operation.saver.PhenotypeSaver; import org.generationcp.middleware.operation.transformer.etl.MeasurementVariableTransformer; import org.generationcp.middleware.service.api.SampleListService; import org.generationcp.middleware.service.api.derived_variables.FormulaService; @@ -61,15 +54,15 @@ public abstract class Service extends DatabaseBroker { public Service() { } - public Service(HibernateSessionProvider sessionProvider) { + public Service(final HibernateSessionProvider sessionProvider) { super(sessionProvider); } - public Service(HibernateSessionProvider sessionProvider, String databaseName) { + public Service(final HibernateSessionProvider sessionProvider, final String databaseName) { super(sessionProvider, databaseName); } - protected void logAndThrowException(String message, Throwable e, Logger log) { + protected void logAndThrowException(final String message, final Throwable e, final Logger log) { log.error(e.getMessage(), e); if (e instanceof PhenotypeException) { throw (PhenotypeException) e; @@ -77,18 +70,6 @@ protected void logAndThrowException(String message, Throwable e, Logger log) { throw new MiddlewareQueryException(message + e.getMessage(), e); } - protected final PhenotypeSaver getPhenotypeSaver() { - return new PhenotypeSaver(this.sessionProvider); - } - - protected final PhenotypeOutlierSaver getPhenotypeOutlierSaver() { - return new PhenotypeOutlierSaver(this.sessionProvider); - } - - protected final ExperimentPropertySaver getExperimentPropertySaver() { - return new ExperimentPropertySaver(this.sessionProvider); - } - protected final OntologyDataManager getOntologyDataManager() { return new OntologyDataManagerImpl(this.sessionProvider); } @@ -130,30 +111,14 @@ protected final ValueReferenceBuilder getValueReferenceBuilder() { return new ValueReferenceBuilder(this.sessionProvider); } - protected final GeolocationSaver getGeolocationSaver() { - return new GeolocationSaver(this.sessionProvider); - } - protected final StandardVariableBuilder getStandardVariableBuilder() { return new StandardVariableBuilder(this.sessionProvider); } - protected final LotBuilder getLotBuilder() { - return new LotBuilder(this.sessionProvider); - } - protected final ExperimentBuilder getExperimentBuilder() { return new ExperimentBuilder(this.sessionProvider); } - protected final ExperimentDestroyer getExperimentDestroyer() { - return new ExperimentDestroyer(this.sessionProvider); - } - - protected final TransactionBuilder getTransactionBuilder() { - return new TransactionBuilder(this.sessionProvider); - } - protected final MeasurementVariableTransformer getMeasurementVariableTransformer() { return new MeasurementVariableTransformer(this.sessionProvider); } @@ -166,12 +131,12 @@ protected final StudyDestroyer getStudyDestroyer() { return new StudyDestroyer(this.sessionProvider); } - protected void setLocationDataManager(LocationDataManager locationDataManager) { + protected void setLocationDataManager(final LocationDataManager locationDataManager) { this.locationDataManager = locationDataManager; } protected LocationDataManager getLocationDataManager() { - return locationDataManager; + return this.locationDataManager; } protected final SampleListService getSampleListService() { diff --git a/src/main/java/org/generationcp/middleware/service/api/DataImportService.java b/src/main/java/org/generationcp/middleware/service/api/DataImportService.java index 8a55db9ae9..e49c87fb84 100644 --- a/src/main/java/org/generationcp/middleware/service/api/DataImportService.java +++ b/src/main/java/org/generationcp/middleware/service/api/DataImportService.java @@ -11,10 +11,7 @@ package org.generationcp.middleware.service.api; -import java.io.File; -import java.util.List; -import java.util.Map; - +import com.google.common.base.Optional; import org.generationcp.middleware.domain.etl.MeasurementVariable; import org.generationcp.middleware.domain.etl.Workbook; import org.generationcp.middleware.exceptions.MiddlewareException; @@ -24,7 +21,9 @@ import org.generationcp.middleware.pojos.workbench.CropType; import org.generationcp.middleware.util.Message; -import com.google.common.base.Optional; +import java.io.File; +import java.util.List; +import java.util.Map; /** * This is the API for importing data to new schema. The methods here involve @@ -92,10 +91,9 @@ Workbook parseWorkbook(File file, String programUUID, boolean discardInvalidValu * @param programUUID * @return the workbook * @throws WorkbookParserException - * @throws MiddlewareQueryException + * @throws WorkbookParserException */ - Workbook strictParseWorkbook(File file, String programUUID, final Integer currentIbdbUserId) throws WorkbookParserException, - MiddlewareException; + Workbook strictParseWorkbook(File file, String programUUID, final Integer currentIbdbUserId) throws WorkbookParserException; /** * Checks if the name specified is an already existing project name @@ -103,22 +101,8 @@ Workbook strictParseWorkbook(File file, String programUUID, final Integer curren * @param name * @param programUUID * @return true or false - * @throws MiddlewareQueryException - */ - boolean checkIfProjectNameIsExistingInProgram(String name, String programUUID) throws MiddlewareQueryException; - - /** - * Checks if the experiment is already existing given the project name and - * location description - * - * @param projectName - * @param locationDescription - * @param programUUID - * @return nd_geolocation_id - * @throws MiddlewareQueryException */ - Integer getLocationIdByProjectNameAndDescriptionAndProgramUUID(String projectName, String locationDescription, - String programUUID) throws MiddlewareQueryException; + boolean checkIfProjectNameIsExistingInProgram(String name, String programUUID); /** * Validate the project ontology from the Workbook and return the list of @@ -127,10 +111,8 @@ Integer getLocationIdByProjectNameAndDescriptionAndProgramUUID(String projectNam * @param workbook * @return Map> - map of errors for each header and * global errors - * @throws MiddlewareQueryException */ - Map> validateProjectOntology(Workbook workbook, String programUUID) - throws MiddlewareException; + Map> validateProjectOntology(Workbook workbook, String programUUID); /** * Saves the project ontology from the Workbook Tables: project and projectprop @@ -164,7 +146,6 @@ int saveProjectData(final Workbook workbook, final String programUUID, final Cro * Checks the Workbook's observation data for out-of-bounds values. Returns * true if there are out-of-bounds data. * - * @param ontologyDataManager * @param workbook * @param programUUID * @return diff --git a/src/main/java/org/generationcp/middleware/service/api/FieldbookService.java b/src/main/java/org/generationcp/middleware/service/api/FieldbookService.java index 503dbecaa0..fa4a6c13cb 100644 --- a/src/main/java/org/generationcp/middleware/service/api/FieldbookService.java +++ b/src/main/java/org/generationcp/middleware/service/api/FieldbookService.java @@ -18,8 +18,6 @@ import org.generationcp.middleware.domain.dms.StandardVariable; import org.generationcp.middleware.domain.dms.Study; import org.generationcp.middleware.domain.dms.StudyReference; -import org.generationcp.middleware.domain.dms.ValueReference; -import org.generationcp.middleware.domain.etl.MeasurementRow; import org.generationcp.middleware.domain.etl.MeasurementVariable; import org.generationcp.middleware.domain.etl.StudyDetails; import org.generationcp.middleware.domain.etl.TreatmentVariable; @@ -195,14 +193,6 @@ List getAllFieldMapsInBlockByTrialInstanceId(int datasetId, int ge */ Integer getStandardVariableIdByPropertyScaleMethodRole(String property, String scale, String method, PhenotypicType role); - /** - * Gets the germplasm id by name. - * - * @param name - * the name - * @return the germplasm id by name - */ - Integer getGermplasmIdByName(String name); /** * Given a workbook already loaded which does not load observations now - this is a helper method to trigger @@ -254,15 +244,6 @@ Integer saveNurseryAdvanceGermplasmList(List>> germpl List> listDataItems, GermplasmList germplasmList, List>> germplasmAttributes); - /** - * Used for retrieving the Cimmyt Wheat Germplasm name. - * - * @param gid - * the gid - * @return the cimmyt wheat germplasm name by gid - */ - String getCimmytWheatGermplasmNameByGid(int gid); - /** * Used for retrieving the breeding method id given a method id. * @@ -292,39 +273,6 @@ Integer saveNurseryAdvanceGermplasmList(List>> germpl */ GermplasmList getGermplasmListByName(String name, String programUUID); - /** - * Get All distinct values given a standard variable id. - * - * @param stdVarId - * the std var id - * @return the distinct standard variable values - */ - List getDistinctStandardVariableValues(int stdVarId); - - /** - * Get all standard variables. - * - * @param programUUID - * unique id of the program - * @return the all standard variables - */ - Set getAllStandardVariables(String programUUID); - - /** - * Get all distinct values given the PSMR combination. - * - * @param property - * the property - * @param scale - * the scale - * @param method - * the method - * @param role - * the role - * @return the distinct standard variable values - */ - List getDistinctStandardVariableValues(String property, String scale, String method, PhenotypicType role); - /** * Get a standard variable given an id. After the first read, the variable * is cached in memory. @@ -337,14 +285,6 @@ Integer saveNurseryAdvanceGermplasmList(List>> germpl */ StandardVariable getStandardVariable(int id, String programUUID); - /** - * Gets the all nursery types. - * - * @param programUUID - * unique id of the program - * @return the all nursery types - */ - List getAllNurseryTypes(String programUUID); /** * Count plots with plants selectedof nursery. @@ -550,7 +490,7 @@ List filterStandardVariablesByMode(List stor * the trial instance * @return the block id */ - String getBlockId(int datasetId, String trialInstance); + String getBlockId(int datasetId, Integer trialInstance); /** * Gets the folder name by id. @@ -561,29 +501,6 @@ List filterStandardVariablesByMode(List stor */ String getFolderNameById(Integer folderId); - /** - * Returns true if all instances in the study has fieldmap. - * - * @param studyId - * the study id - * @return true, if successful - */ - boolean checkIfStudyHasFieldmap(int studyId); - - /** - * Builds the Trial Observations from the trial dataset id. - * - * @param trialDatasetId - * the trial dataset id - * @param factorList - * the factor list - * @param variateList - * the variate list - * @return the list - */ - List buildTrialObservations(int trialDatasetId, List factorList, - List variateList); - /** * Check if study has measurement data. * @@ -606,14 +523,6 @@ List buildTrialObservations(int trialDatasetId, List variateIds); - /** - * Delete observations of study. - * - * @param datasetId - * the dataset id - */ - void deleteObservationsOfStudy(int datasetId); - /** * Get germplasms by name. * @@ -623,25 +532,6 @@ List buildTrialObservations(int trialDatasetId, List getGermplasmIdsByName(String name); - /** - * Add Germplasm Name. - * - * @param nameValue - * the name value - * @param gid - * the gid - * @param userId - * the user id - * @param nameTypeId - * the name type id - * @param locationId - * the location id - * @param date - * the date - * @return the integer - */ - Integer addGermplasmName(String nameValue, int gid, int userId, int nameTypeId, int locationId, Integer date); - /** * * @param names @@ -850,11 +740,6 @@ MeasurementVariable getMeasurementVariableByPropertyScaleMethodAndRole(String pr */ long countListDataProjectByListIdAndEntryTypeIds(int listId, List systemDefinedEntryTypeIds); - List getListDataProjectByStudy(int projectId, GermplasmListType type, List plotNumbers, final String instanceNumber); - - - ListDataProject getListDataProjectByListIdAndEntryNo(int listId, int entryNo); - /** * Deletes a list data project given the project_id and the type. * @@ -883,8 +768,6 @@ Integer saveGermplasmList(List> listDataItems boolean setOrderVariableByRank(Workbook workbook); - void addListDataProjectList(List listDataProjectList); - /** * Gets the StandardVariable by Name * @@ -900,28 +783,10 @@ List filterStandardVariablesByIsAIds(List> listDataItems, GermplasmList germplasmList); - List getFavoriteLocationByLocationIDs(List locationIds); List getFavoriteMethods(List methodIds, Boolean filterOutGenerative); - String getPlotCodePrefix(final String cropName); - - List appendTabLabelToList(List germplasmCrossesList); - List getLocationsByProgramUUID(String programUUID); /** @@ -966,16 +831,6 @@ List filterStandardVariablesByIsAIds(List instanceIds, Integer observationUnitVariableId, Integer numberOfSubObservationUnits, Integer parentId); + /** + * Given a list of dataset types and a study, it will retrieve the study dataset basic dtos with the specified types + * + * @param studyId Id of the study + * @param datasetTypeIds List of dataset types + * @return List of datasets + */ + List getDatasetBasicDTOs(Integer studyId, Set datasetTypeIds); + /** * Given a list of dataset types and a study, it will retrieve the study datasets with the specified types * @@ -168,6 +180,14 @@ DatasetDTO generateSubObservationDataset( */ DatasetDTO getDataset(Integer datasetId); + /** + * Return a dataset basic DTO given the id + * + * @param datasetId Id of the dataset + * @return + */ + DatasetBasicDTO getDatasetBasicDTO(Integer datasetId); + /** * Get dataset that observationUnitDbId belongs to */ @@ -392,4 +412,6 @@ FilteredPhenotypesInstancesCountDTO countFilteredInstancesAndPhenotypes( * @param studyId */ void setValueToVariable(Integer datasetId, ObservationUnitsParamDTO searchDTO, Integer studyId); + + boolean allDatasetIdsBelongToStudy(final Integer studyId, List datasetIds); } diff --git a/src/main/java/org/generationcp/middleware/service/api/dataset/ObservationUnitsSearchDTO.java b/src/main/java/org/generationcp/middleware/service/api/dataset/ObservationUnitsSearchDTO.java index 574db94412..1b0d7ab3dd 100644 --- a/src/main/java/org/generationcp/middleware/service/api/dataset/ObservationUnitsSearchDTO.java +++ b/src/main/java/org/generationcp/middleware/service/api/dataset/ObservationUnitsSearchDTO.java @@ -24,6 +24,7 @@ public class ObservationUnitsSearchDTO { private Integer instanceId; private Integer environmentDatasetId; private Boolean draftMode; + private Boolean isSubobservationDataset; /** This is used by Visualization tool, to specify the columns that will be included in the data returned from the server. **/ private List filterColumns = new ArrayList<>(); @@ -245,6 +246,14 @@ public void setFilterColumns(final List filterColumns) { this.filterColumns = filterColumns; } + public Boolean getSubobservationDataset() { + return isSubobservationDataset; + } + + public void setSubobservationDataset(final Boolean subobservationDataset) { + isSubobservationDataset = subobservationDataset; + } + @Override public int hashCode() { return Pojomatic.hashCode(this); diff --git a/src/main/java/org/generationcp/middleware/service/api/study/StudyService.java b/src/main/java/org/generationcp/middleware/service/api/study/StudyService.java index ed87305140..beefee4d4b 100644 --- a/src/main/java/org/generationcp/middleware/service/api/study/StudyService.java +++ b/src/main/java/org/generationcp/middleware/service/api/study/StudyService.java @@ -11,12 +11,8 @@ public interface StudyService { List search(final StudySearchParameters serchParameters); - boolean hasMeasurementDataOnEnvironment(final int studyIdentifier, final int instanceId); - boolean hasAdvancedOrCrossesList(final int studyId); - int countTotalObservationUnits(final int studyIdentifier, final int instanceId); - List getObservations(final int studyIdentifier, final int instanceId, final int pageNumber, final int pageSize, final String sortBy, final String sortOrder); @@ -40,17 +36,10 @@ List getObservations(final int studyIdentifier, final int instan TrialObservationTable getTrialObservationTable(int studyIdentifier, Integer instanceDbId); /** - * @param geolocationId + * @param environmentId * @return StudyDetailsDto */ - StudyDetailsDto getStudyDetailsByGeolocation(Integer geolocationId); - - /** - * @param ids of the variables that i need to check data - * @param studyId id for the study (Nursery / Trial) - * @return the true if any id have data on the study - */ - boolean hasMeasurementDataEntered(final List ids, final int studyId); + StudyDetailsDto getStudyDetailsByEnvironment(Integer environmentId); /** * Retrieves Phenotypes given certain search parameters diff --git a/src/main/java/org/generationcp/middleware/service/api/study/generation/ExperimentDesignService.java b/src/main/java/org/generationcp/middleware/service/api/study/generation/ExperimentDesignService.java index f94e68f599..c60baade8f 100644 --- a/src/main/java/org/generationcp/middleware/service/api/study/generation/ExperimentDesignService.java +++ b/src/main/java/org/generationcp/middleware/service/api/study/generation/ExperimentDesignService.java @@ -1,12 +1,12 @@ package org.generationcp.middleware.service.api.study.generation; -import com.google.common.base.Optional; import org.generationcp.middleware.domain.etl.MeasurementVariable; import org.generationcp.middleware.pojos.workbench.CropType; import org.generationcp.middleware.service.api.dataset.ObservationUnitRow; import java.util.List; import java.util.Map; +import java.util.Optional; public interface ExperimentDesignService { diff --git a/src/main/java/org/generationcp/middleware/service/impl/dataset/DatasetServiceImpl.java b/src/main/java/org/generationcp/middleware/service/impl/dataset/DatasetServiceImpl.java index e1f0f19c98..96bbb5df01 100644 --- a/src/main/java/org/generationcp/middleware/service/impl/dataset/DatasetServiceImpl.java +++ b/src/main/java/org/generationcp/middleware/service/impl/dataset/DatasetServiceImpl.java @@ -14,6 +14,7 @@ import org.generationcp.middleware.dao.dms.PhenotypeDao; import org.generationcp.middleware.dao.dms.ProjectPropertyDao; import org.generationcp.middleware.domain.dataset.ObservationDto; +import org.generationcp.middleware.domain.dms.DatasetBasicDTO; import org.generationcp.middleware.domain.dms.DatasetDTO; import org.generationcp.middleware.domain.dms.ValueReference; import org.generationcp.middleware.domain.etl.MeasurementVariable; @@ -143,16 +144,18 @@ public long countObservationsByVariables(final Integer datasetId, final List getObservationSetColumns(final Integer observationSetId, final Boolean draftMode) { // TODO get plot dataset even if subobs is not a direct descendant (ie. sub-sub-obs) final List factorColumns; - final DatasetDTO datasetDTO = this.getDataset(observationSetId); + final DatasetBasicDTO datasetBasicDTO = this.daoFactory.getDmsProjectDAO().getDataset(observationSetId); - if (datasetDTO.getDatasetTypeId().equals(DatasetTypeEnum.PLOT_DATA.getId())) { + if (datasetBasicDTO.getDatasetTypeId().equals(DatasetTypeEnum.PLOT_DATA.getId())) { //PLOTDATA factorColumns = this.daoFactory.getDmsProjectDAO() .getObservationSetVariables(observationSetId, PLOT_COLUMNS_FACTOR_VARIABLE_TYPES); @@ -167,7 +170,7 @@ public List getObservationSetColumns(final Integer observat } List variateColumns; - if (datasetDTO.getDatasetTypeId().equals(DatasetTypeEnum.PLOT_DATA.getId())) { + if (datasetBasicDTO.getDatasetTypeId().equals(DatasetTypeEnum.PLOT_DATA.getId())) { //PLOTDATA variateColumns = this.daoFactory.getDmsProjectDAO().getObservationSetVariables(observationSetId, MEASUREMENT_VARIABLE_TYPES); } else { @@ -223,12 +226,12 @@ private MeasurementVariable buildSampleColumn() { @Override public List getObservationSetVariables(final Integer observationSetId) { - final DatasetDTO datasetDTO = this.getDataset(observationSetId); + final DatasetBasicDTO datasetBasicDTO = this.daoFactory.getDmsProjectDAO().getDataset(observationSetId); final List plotDataSetColumns; - if (datasetDTO.getDatasetTypeId().equals(DatasetTypeEnum.PLOT_DATA.getId())) { + if (datasetBasicDTO.getDatasetTypeId().equals(DatasetTypeEnum.PLOT_DATA.getId())) { plotDataSetColumns = - this.daoFactory.getDmsProjectDAO().getObservationSetVariables(datasetDTO.getDatasetId(), PLOT_COLUMNS_ALL_VARIABLE_TYPES); + this.daoFactory.getDmsProjectDAO().getObservationSetVariables(datasetBasicDTO.getDatasetId(), PLOT_COLUMNS_ALL_VARIABLE_TYPES); } else { final DmsProject plotDataset = this.daoFactory.getDmsProjectDAO().getById(observationSetId).getParent(); @@ -305,8 +308,7 @@ void saveSubObservationUnits( final ObservationUnitIDGenerator observationUnitIdGenerator = new ObservationUnitIDGeneratorImpl(); for (final ExperimentModel plotObservationUnit : plotObservationUnits) { for (int i = 1; i <= numberOfSubObservationUnits; i++) { - final ExperimentModel experimentModel = new ExperimentModel(plotObservationUnit.getGeoLocation(), - plotObservationUnit.getTypeId(), subObservationDataset, plotObservationUnit.getStock(), plotObservationUnit, i); + final ExperimentModel experimentModel = new ExperimentModel(plotObservationUnit.getTypeId(), subObservationDataset, plotObservationUnit.getStock(), plotObservationUnit, i); observationUnitIdGenerator.generateObservationUnitIds(crop, Arrays.asList(experimentModel)); this.daoFactory.getExperimentDao().save(experimentModel); } @@ -315,8 +317,8 @@ void saveSubObservationUnits( @Override public Boolean isDatasetNameAvailable(final String name, final int studyId) { - final List datasetDTOs = this.getDatasets(studyId, new HashSet()); - for (final DatasetDTO datasetDTO : datasetDTOs) { + final List datasetDTOs = this.getDatasetBasicDTOs(studyId, new HashSet<>()); + for (final DatasetBasicDTO datasetDTO : datasetDTOs) { if (datasetDTO.getName().equals(name)) { return false; } @@ -330,8 +332,14 @@ public Integer getNumberOfChildren(final Integer parentId) { } @Override - public List getDatasetInstances(final Integer datasetId) { - return this.daoFactory.getDmsProjectDAO().getDatasetInstances(datasetId); + public List getDatasetInstances(final Integer datasetId) { + final DatasetType datasetType = this.getDatasetType(datasetId); + return this.daoFactory.getDmsProjectDAO().getDatasetInstances(datasetId, datasetType); + } + + private DatasetType getDatasetType(final Integer datasetId) { + final DatasetDTO datasetDTO = this.daoFactory.getDmsProjectDAO().getDataset(datasetId); + return this.daoFactory.getDatasetTypeDao().getById(datasetDTO.getDatasetTypeId()); } private List buildDefaultDatasetProperties( @@ -363,6 +371,18 @@ private ProjectProperty buildDatasetProperty( return new ProjectProperty(dmsProject, typeId, value, rank, variableId, (alias == null) ? variable.getName() : alias); } + @Override + public List getDatasetBasicDTOs(final Integer studyId, final Set datasetTypeIds) { + final List datasetDTOs = this.daoFactory.getDmsProjectDAO().getDatasets(studyId); + final List datasetBasicDTOS = new ArrayList<>(); + for (final DatasetDTO datasetDTO : datasetDTOs) { + if (datasetTypeIds.isEmpty() || datasetTypeIds.contains(datasetDTO.getDatasetTypeId())) { + datasetBasicDTOS.add(datasetDTO); + } + } + return datasetBasicDTOS; + } + @Override public List getDatasets(final Integer studyId, final Set datasetTypeIds) { final List datasetDTOList = new ArrayList<>(); @@ -413,6 +433,11 @@ public boolean isValidObservationUnit(final Integer datasetId, final Integer obs return this.daoFactory.getExperimentDao().isValidExperiment(datasetId, observationUnitId); } + @Override + public boolean isValidDatasetId(final Integer datasetId) { + return this.daoFactory.getDmsProjectDAO().isValidDatasetId(datasetId); + } + @Override public Phenotype getPhenotype(final Integer observationUnitId, final Integer observationId) { return this.daoFactory.getPhenotypeDAO().getPhenotype(observationUnitId, observationId); @@ -536,7 +561,7 @@ public Integer apply(final Formula formula) { } }); this.daoFactory.getPhenotypeDAO() - .updateOutOfSyncPhenotypesByGeolocation(geolocation, Sets.newHashSet(targetVariableIds)); + .updateOutOfSyncPhenotypesByEnvironment(geolocation, Sets.newHashSet(targetVariableIds)); } } @@ -544,7 +569,8 @@ public Integer apply(final Formula formula) { public DatasetDTO getDataset(final Integer datasetId) { final DatasetDTO datasetDTO = this.daoFactory.getDmsProjectDAO().getDataset(datasetId); if (datasetDTO != null) { - datasetDTO.setInstances(this.daoFactory.getDmsProjectDAO().getDatasetInstances(datasetId)); + final DatasetType datasetType = this.daoFactory.getDatasetTypeDao().getById(datasetDTO.getDatasetTypeId()); + datasetDTO.setInstances(this.daoFactory.getDmsProjectDAO().getDatasetInstances(datasetId, datasetType)); datasetDTO.setVariables( this.daoFactory.getDmsProjectDAO().getObservationSetVariables(datasetId, DatasetServiceImpl.DATASET_VARIABLE_TYPES)); datasetDTO.setHasPendingData(this.daoFactory.getPhenotypeDAO().countPendingDataOfDataset(datasetId) > 0); @@ -554,6 +580,11 @@ public DatasetDTO getDataset(final Integer datasetId) { return datasetDTO; } + @Override + public DatasetBasicDTO getDatasetBasicDTO(final Integer datasetId) { + return this.daoFactory.getDmsProjectDAO().getDataset(datasetId); + } + @Override public DatasetDTO getDatasetByObsUnitDbId(final String observationUnitDbId) { return this.daoFactory.getDmsProjectDAO().getDatasetByObsUnitDbId(observationUnitDbId); @@ -593,6 +624,7 @@ private void fillSearchDTO(final int studyId, final int datasetId, final Observa searchDTO.setDatasetId(datasetId); searchDTO.setGenericGermplasmDescriptors(this.findGenericGermplasmDescriptors(studyId)); searchDTO.setAdditionalDesignFactors(this.findAdditionalDesignFactors(studyId)); + searchDTO.setSubobservationDataset(this.getDatasetType(datasetId).isSubObservationType()); final List selectionMethodsAndTraits = this.daoFactory.getProjectPropertyDAO().getVariablesForDataset(datasetId, VariableType.TRAIT.getId(), VariableType.SELECTION_METHOD.getId()); @@ -612,10 +644,11 @@ public List getAllObservationUnitRows(final int studyId, fin Lists.newArrayList(VariableType.STUDY_DETAIL.getId())); final ObservationUnitsSearchDTO searchDTO = - new ObservationUnitsSearchDTO(datasetId, null, germplasmDescriptors, designFactors, new ArrayList()); + new ObservationUnitsSearchDTO(datasetId, null, germplasmDescriptors, designFactors, new ArrayList<>()); searchDTO.setEnvironmentDetails(this.findAdditionalEnvironmentFactors(environmentDataset.getProjectId())); searchDTO.setEnvironmentConditions(this.getEnvironmentConditionVariableNames(environmentDataset.getProjectId())); searchDTO.setEnvironmentDatasetId(environmentDataset.getProjectId()); + searchDTO.setSubobservationDataset(this.getDatasetType(datasetId).isSubObservationType()); final List observationUnits = this.daoFactory.getObservationUnitsSearchDAO().getObservationUnitTable(searchDTO); this.addStudyVariablesToUnitRows(observationUnits, studyVariables); @@ -658,14 +691,17 @@ List findAdditionalEnvironmentFactors(final Integer tria @Override public Integer countAllObservationUnitsForDataset( final Integer datasetId, final Integer instanceId, final Boolean draftMode) { - return this.daoFactory.getObservationUnitsSearchDAO().countObservationUnitsForDataset(datasetId, instanceId, draftMode, null); + final DatasetType datasetType = this.getDatasetType(datasetId); + return this.daoFactory.getObservationUnitsSearchDAO().countObservationUnitsForDataset(datasetId, instanceId, draftMode, null, datasetType.isSubObservationType()); } @Override public long countFilteredObservationUnitsForDataset( final Integer datasetId, final Integer instanceId, final Boolean draftMode, final ObservationUnitsSearchDTO.Filter filter) { - return this.daoFactory.getObservationUnitsSearchDAO().countObservationUnitsForDataset(datasetId, instanceId, draftMode, filter); + final DatasetType datasetType = this.getDatasetType(datasetId); + return this.daoFactory.getObservationUnitsSearchDAO().countObservationUnitsForDataset(datasetId, instanceId, draftMode, filter, + datasetType.isSubObservationType()); } @Override @@ -956,6 +992,11 @@ public void setValueToVariable(final Integer datasetId, final ObservationUnitsPa } } + @Override + public boolean allDatasetIdsBelongToStudy(final Integer studyId, final List datasetIds) { + return this.daoFactory.getDmsProjectDAO().allDatasetIdsBelongToStudy(studyId, datasetIds); + } + private void acceptDraftData(final Phenotype phenotype) { if (StringUtils.isEmpty(phenotype.getDraftValue())) { // Set isChanged to true so that the derived traits that depend on it will be tagged as OUT_OF_SYNC later. @@ -1126,6 +1167,7 @@ public Map> getInstanceIdToObservationUnitRows searchDTO.setEnvironmentDetails(this.findAdditionalEnvironmentFactors(environmentDataset.getProjectId())); searchDTO.setEnvironmentConditions(this.getEnvironmentConditionVariableNames(environmentDataset.getProjectId())); searchDTO.setEnvironmentDatasetId(environmentDataset.getProjectId()); + searchDTO.setSubobservationDataset(this.getDatasetType(datasetId).isSubObservationType()); final List observationUnits = this.daoFactory.getObservationUnitsSearchDAO().getObservationUnitTable(searchDTO); @@ -1282,6 +1324,7 @@ public Map countObservationsGroupedByInstance(final Integer datase @Override public FilteredPhenotypesInstancesCountDTO countFilteredInstancesAndPhenotypes( final Integer datasetId, final ObservationUnitsSearchDTO filter) { - return this.daoFactory.getObservationUnitsSearchDAO().countFilteredInstancesAndPhenotypes(datasetId, filter); + final DatasetType datasetType = this.getDatasetType(datasetId); + return this.daoFactory.getObservationUnitsSearchDAO().countFilteredInstancesAndPhenotypes(datasetId, filter, datasetType.isSubObservationType()); } } diff --git a/src/main/java/org/generationcp/middleware/service/impl/derived_variables/DerivedVariableServiceImpl.java b/src/main/java/org/generationcp/middleware/service/impl/derived_variables/DerivedVariableServiceImpl.java index 917feb3dae..a66a5c79bc 100644 --- a/src/main/java/org/generationcp/middleware/service/impl/derived_variables/DerivedVariableServiceImpl.java +++ b/src/main/java/org/generationcp/middleware/service/impl/derived_variables/DerivedVariableServiceImpl.java @@ -186,7 +186,7 @@ public Map createVariableDatasetsMap(final Integer } final Integer plotDatasetId = - this.datasetService.getDatasets(studyId, Sets.newHashSet(DatasetTypeEnum.PLOT_DATA.getId())).get(0).getDatasetId(); + this.datasetService.getDatasetBasicDTOs(studyId, Sets.newHashSet(DatasetTypeEnum.PLOT_DATA.getId())).get(0).getDatasetId(); final List projectProperties; // if the calculated variable is executed from a plot dataset, the system should be able to read all input variables added in a study diff --git a/src/main/java/org/generationcp/middleware/service/impl/gdms/DatasetServiceImpl.java b/src/main/java/org/generationcp/middleware/service/impl/gdms/DatasetServiceImpl.java index 7dc7767f82..7ef6365200 100644 --- a/src/main/java/org/generationcp/middleware/service/impl/gdms/DatasetServiceImpl.java +++ b/src/main/java/org/generationcp/middleware/service/impl/gdms/DatasetServiceImpl.java @@ -87,7 +87,7 @@ public Integer saveDataset(final DatasetUploadDto datasetUploadDto) { try { return this.datasetDAO.save(dataset).getDatasetId(); - } catch (MiddlewareQueryException e) { + } catch (final MiddlewareQueryException e) { LOGGER.error(e.getMessage(), e); throw new MiddlewareException("An error has occurred while saving the dataset"); } @@ -99,12 +99,12 @@ public DatasetRetrieveDto getDataset(final String datasetName) { try { final Dataset dataset = this.datasetDAO.getByName(datasetName); if (dataset != null) { - List charValueElements = this.charValuesDAO.getCharValueElementsByDatasetId(dataset.getDatasetId()); + final List charValueElements = this.charValuesDAO.getCharValueElementsByDatasetId(dataset.getDatasetId()); return DatasetRetrieveDtoBuilder.build(dataset, charValueElements); } else { return null; } - } catch (MiddlewareQueryException e) { + } catch (final MiddlewareQueryException e) { LOGGER.error(e.getMessage(), e); throw new MiddlewareException("An error has occurred while querying the dataset"); } @@ -130,7 +130,7 @@ private Set getSampleUIDList(final DatasetUploadDto datasetUploadDto) { private Map getMarkersMap(final List markers) { final Map mappedMarkers = Maps.uniqueIndex(markers, new Function() { - public String apply(Marker from) { + public String apply(final Marker from) { return from.getMarkerName(); } }); @@ -140,7 +140,7 @@ public String apply(Marker from) { private void validateMarkers(final DatasetUploadDto datasetUploadDto, final Map markerMap) { if (markerMap.size() != datasetUploadDto.getMarkers().size()) { - List markersNotFound = new ArrayList<>(); + final List markersNotFound = new ArrayList<>(); for (final String marker : datasetUploadDto.getMarkers()) { if (!markerMap.containsKey(marker)) { @@ -158,7 +158,7 @@ private void validateMarkers(final DatasetUploadDto datasetUploadDto, final Map< private void validateSamples(final Set sampleUIDSet, final Map sampleDTOMap) { if (sampleDTOMap.size() != sampleUIDSet.size()) { - List samplesNotFound = new ArrayList<>(); + final List samplesNotFound = new ArrayList<>(); for (final String sample : sampleUIDSet) { if (!sampleDTOMap.containsKey(sample)) { @@ -175,8 +175,8 @@ private void validateSamples(final Set sampleUIDSet, final Map 0 && numberOfColums > 0 && numberOfColums == datasetUploadDto.getMarkers().size() && numberOfRows == datasetUploadDto diff --git a/src/main/java/org/generationcp/middleware/service/impl/study/ObservationQuery.java b/src/main/java/org/generationcp/middleware/service/impl/study/ObservationQuery.java index af3d6a1508..c69d1bc576 100644 --- a/src/main/java/org/generationcp/middleware/service/impl/study/ObservationQuery.java +++ b/src/main/java/org/generationcp/middleware/service/impl/study/ObservationQuery.java @@ -14,23 +14,29 @@ class ObservationQuery { - public static final String DEFAULT_SORT_COLUMN = "PLOT_NO"; - public static final String DEFAULT_SORT_ORDER = "asc"; - public static final String PHENOTYPE_ID = "_PhenotypeId"; + static final String DEFAULT_SORT_COLUMN = "PLOT_NO"; + static final String DEFAULT_SORT_ORDER = "asc"; + private static final String PHENOTYPE_ID = "_PhenotypeId"; public static final String STATUS = "_Status"; - public static final String INSTANCE_NUMBER_CLAUSE = " AND gl.nd_geolocation_id = :instanceId "; - public static final String GROUPING_CLAUSE = " GROUP BY nde.nd_experiment_id "; - public static final String OBSERVATIONS_FOR_SAMPLES = "SELECT " + " nde.nd_experiment_id as nd_experiment_id, " + private static final String INSTANCE_NUMBER_CLAUSE = " AND env.nd_experiment_id = :instanceId "; + private static final String GROUPING_CLAUSE = " GROUP BY nde.nd_experiment_id "; + private static final String OBSERVATIONS_FOR_SAMPLES = "SELECT " + " nde.nd_experiment_id as nd_experiment_id, " + " (select na.nval from names na where na.gid = s.dbxref_id and na.nstat = 1 limit 1) as preferred_name, " + " ph.value" - + " as value, s.dbxref_id as gid" - + " FROM " + " project p " - + " INNER JOIN nd_experiment nde ON nde.project_id = p.project_id " - + " INNER JOIN nd_geolocation gl ON nde.nd_geolocation_id = gl.nd_geolocation_id " - + " INNER JOIN stock s ON s.stock_id = nde.stock_id " - + " LEFT JOIN phenotype ph ON nde.nd_experiment_id = ph.nd_experiment_id " - + " LEFT JOIN cvterm cvterm_variable ON cvterm_variable.cvterm_id = ph.observable_id " + " WHERE " + + " as value, s.dbxref_id as gid " + + " FROM nd_experiment nde " + + " LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = nde.parent_id " + + " INNER JOIN project p ON p.project_id = nde.project_id " + + " INNER JOIN project env_ds ON env_ds.study_id = p.study_id AND env_ds.dataset_type_id = " + + DatasetTypeEnum.SUMMARY_DATA.getId() + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = " + + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + // handle cases for plot and with/without sub-observations + + " AND (nde.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id)" + + " INNER JOIN stock s ON s.stock_id = nde.stock_id " + + " LEFT JOIN phenotype ph ON nde.nd_experiment_id = ph.nd_experiment_id " + + " LEFT JOIN cvterm cvterm_variable ON cvterm_variable.cvterm_id = ph.observable_id " + " WHERE " + " p.project_id = :datasetId " - + " AND gl.description IN (:instanceIds) " + + " AND env.observation_unit_no IN (:instanceIds) " + " and cvterm_variable.cvterm_id = :selectionVariableId " + " GROUP BY nde.nd_experiment_id"; String getAllObservationsQuery(final List selectionMethodsAndTraits, final List germplasmDescriptors, @@ -47,7 +53,7 @@ String getAllObservationsQuery(final List selectionMetho * This query is used by BMSAPI and is very similar to {@link ObservationQuery#getObservationsMainQuery(List, List, List)} * which is used Trial and Nursery Manager */ - public String getObservationQueryWithBlockRowCol(final List measurementVariables, final Integer instanceId) { + String getObservationQueryWithBlockRowCol(final List measurementVariables, final Integer instanceId) { final String orderByMeasurementVariableId = getOrderByMeasurementVariableId(measurementVariables); final String orderByText = (null == measurementVariables || measurementVariables.isEmpty() ? "" : " ORDER BY " + orderByMeasurementVariableId); @@ -55,14 +61,14 @@ public String getObservationQueryWithBlockRowCol(final List selectionMeth sqlBuilder.append("SELECT ") .append(" nde.nd_experiment_id, ") - .append(" gl.description AS TRIAL_INSTANCE, ") + .append(" env.nd_experiment_id AS TRIAL_INSTANCE, ") .append(" (SELECT iispcvt.definition FROM stockprop isp INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = isp.type_id INNER JOIN cvterm iispcvt ON iispcvt.cvterm_id = isp.value WHERE isp.stock_id = s.stock_id AND ispcvt.name = 'ENTRY_TYPE') ENTRY_TYPE, ") .append(" s.dbxref_id AS GID, ") .append(" s.name DESIGNATION, ") @@ -213,7 +220,7 @@ String getObservationsMainQuery(final List selectionMeth sqlBuilder.append(String.format(germplasmDescriptorClauseFormat, gpFactor, gpFactor)); } } - + if (!designFactors.isEmpty()) { final String designFactorClauseFormat = " (SELECT xprop.value FROM nd_experimentprop xprop INNER JOIN cvterm xpropcvt ON xpropcvt.cvterm_id = xprop.type_id WHERE xprop.nd_experiment_id = nde.nd_experiment_id AND xpropcvt.name = '%s') '%s', "; @@ -225,7 +232,8 @@ String getObservationsMainQuery(final List selectionMeth sqlBuilder.append(" 1=1 FROM ") .append(" project p ") .append(" INNER JOIN nd_experiment nde ON nde.project_id = p.project_id ") - .append(" INNER JOIN nd_geolocation gl ON nde.nd_geolocation_id = gl.nd_geolocation_id ") + .append(" INNER JOIN nd_experiment env ON env.nd_experiment_id = nde.parent_id AND env.type_id = ") + .append(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()).append(" ") .append(" INNER JOIN stock s ON s.stock_id = nde.stock_id ") .append(" LEFT JOIN phenotype ph ON nde.nd_experiment_id = ph.nd_experiment_id ") .append(" LEFT JOIN cvterm cvterm_variable ON cvterm_variable.cvterm_id = ph.observable_id ") @@ -239,7 +247,7 @@ String getInstanceNumberClause() { } String getOrderingClause(final String sortBy, final String sortOrder) { - String orderColumn = StringUtils.isNotBlank(sortBy) ? sortBy : DEFAULT_SORT_COLUMN; + final String orderColumn = StringUtils.isNotBlank(sortBy) ? sortBy : DEFAULT_SORT_COLUMN; final String direction = StringUtils.isNotBlank(sortOrder) ? sortOrder : DEFAULT_SORT_ORDER; /** * Values of these columns are numbers but the database stores it in string format (facepalm). Sorting on them requires multiplying diff --git a/src/main/java/org/generationcp/middleware/service/impl/study/PhenotypeQuery.java b/src/main/java/org/generationcp/middleware/service/impl/study/PhenotypeQuery.java index e4a37d63f6..e9056a3056 100644 --- a/src/main/java/org/generationcp/middleware/service/impl/study/PhenotypeQuery.java +++ b/src/main/java/org/generationcp/middleware/service/impl/study/PhenotypeQuery.java @@ -14,9 +14,9 @@ public class PhenotypeQuery { + " NULL AS plantNumber, " // Until we have plant level observation + " s.dbxref_id AS germplasmDbId, " // + " s.name AS germplasmName, " // - + " gl.description AS instanceNumber, " // - + " gl.nd_geolocation_id AS studyDbId, " // - + " concat(p.name, '_', gl.description) AS studyName, " // + + " env_experiment.observation_unit_no AS instanceNumber, " // + + " nde.parent_id AS studyDbId, " // + + " concat(p.name, '_', env_experiment.observation_unit_no) AS studyName, " // + " wp.project_name AS programName, " // + " FieldMapRow.value AS FieldMapRow, " // + " FieldMapCol.value AS FieldMapCol, " // @@ -35,7 +35,7 @@ public class PhenotypeQuery { + " FROM " // + " project dataset " // + " INNER JOIN nd_experiment nde ON nde.project_id = dataset.project_id " // - + " INNER JOIN nd_geolocation gl ON nde.nd_geolocation_id = gl.nd_geolocation_id " // + + " INNER JOIN nd_experiment env_experiment ON nde.parent_id = env_experiment.nd_experiment_id " // + " INNER JOIN stock s ON s.stock_id = nde.stock_id " // + " INNER JOIN project p ON p.project_id = dataset.study_id " // + " LEFT JOIN workbench.workbench_project wp ON p.program_uuid = wp.project_uuid " // @@ -43,12 +43,12 @@ public class PhenotypeQuery { + " LEFT JOIN nd_experimentprop FieldMapRow ON FieldMapRow.nd_experiment_id = nde.nd_experiment_id AND FieldMapRow.type_id = " + TermId.FIELDMAP_RANGE.getId() // + " LEFT JOIN nd_experimentprop FieldMapCol ON FieldMapCol.nd_experiment_id = nde.nd_experiment_id AND FieldMapCol.type_id = " + TermId.FIELDMAP_COLUMN.getId() // + " LEFT JOIN dataset_type ON dataset_type.dataset_type_id = dataset.dataset_type_id " // - + " LEFT JOIN nd_geolocationprop gp ON gl.nd_geolocation_id = gp.nd_geolocation_id AND gp.type_id = " + TermId.LOCATION_ID.getId() + " AND gp.nd_geolocation_id = gl.nd_geolocation_id " // - + " LEFT JOIN location l ON l.locid = gp.value " // + + " LEFT JOIN nd_experimentprop loc_prop ON loc_prop.nd_experiment_id = env_experiment.nd_experiment_id AND loc_prop.type_id = " + TermId.LOCATION_ID.getId()// + + " LEFT JOIN location l ON l.locid = loc_prop.value " // + " WHERE 1 = 1" // ; // - public static final String PHENOTYPE_SEARCH_STUDY_DB_ID_FILTER = " AND gl.nd_geolocation_id in (:studyDbIds) "; + public static final String PHENOTYPE_SEARCH_STUDY_DB_ID_FILTER = " AND nde.parent_id in (:studyDbIds) "; public static final String PHENOTYPE_SEARCH_OBSERVATION_FILTER = " AND exists(SELECT 1 " // + " FROM phenotype ph " // diff --git a/src/main/java/org/generationcp/middleware/service/impl/study/SampleServiceImpl.java b/src/main/java/org/generationcp/middleware/service/impl/study/SampleServiceImpl.java index 892aba8ab6..0951300615 100644 --- a/src/main/java/org/generationcp/middleware/service/impl/study/SampleServiceImpl.java +++ b/src/main/java/org/generationcp/middleware/service/impl/study/SampleServiceImpl.java @@ -16,7 +16,6 @@ import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.pojos.dms.ExperimentProperty; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; import org.generationcp.middleware.pojos.dms.ProjectProperty; import org.generationcp.middleware.pojos.dms.StockModel; import org.generationcp.middleware.service.api.SampleService; @@ -164,14 +163,14 @@ private SampleDetailsDTO getSampleDetailsDTO(final Sample sample) { this.fillPlotNoByExperimentProperty(experiment.getProperties(), samplesDetailsDto); this.fillProjectProperties(study.getProperties(), samplesDetailsDto); - this.fillLocationByGeoLocationProperties(experiment.getGeoLocation().getProperties(), samplesDetailsDto); + this.fillLocationByGeoLocationProperties(experiment.getParent().getProperties(), samplesDetailsDto); return samplesDetailsDto; } - private void fillLocationByGeoLocationProperties(final List geolocationProperties, + private void fillLocationByGeoLocationProperties(final List experimentProperties, final SampleDetailsDTO samplesDetailsDto) { - for (final GeolocationProperty properties : geolocationProperties) { + for (final ExperimentProperty properties : experimentProperties) { if (properties.getTypeId().equals(TermId.TRIAL_LOCATION.getId()) && StringUtils.isNotBlank(properties.getValue())) { samplesDetailsDto.setLocationName(properties.getValue()); } else if (properties.getTypeId().equals(TermId.LOCATION_ID.getId()) && StringUtils.isNotBlank(properties.getValue())) { diff --git a/src/main/java/org/generationcp/middleware/service/impl/study/StudyInstance.java b/src/main/java/org/generationcp/middleware/service/impl/study/StudyInstance.java index b3e7813b27..aae181af10 100644 --- a/src/main/java/org/generationcp/middleware/service/impl/study/StudyInstance.java +++ b/src/main/java/org/generationcp/middleware/service/impl/study/StudyInstance.java @@ -8,7 +8,6 @@ public class StudyInstance { - private int instanceDbId; private int experimentId; private Integer locationId; private String locationName; @@ -27,10 +26,9 @@ public StudyInstance() { } - public StudyInstance(final int instanceDbId, final int experimentId, final int instanceNumber, final boolean hasFieldmap, + public StudyInstance(final int experimentId, final int instanceNumber, final boolean hasFieldmap, final Boolean hasExperimentalDesign, final Boolean hasMeasurements, final Boolean canBeDeleted) { - this.instanceDbId = instanceDbId; this.experimentId = experimentId; this.instanceNumber = instanceNumber; this.hasFieldmap = hasFieldmap; @@ -39,10 +37,9 @@ public StudyInstance(final int instanceDbId, final int experimentId, final int i this.canBeDeleted = canBeDeleted; } - public StudyInstance(final int instanceDbId, final Integer experimentId, final Integer locationId, final String locationName, + public StudyInstance(final Integer experimentId, final Integer locationId, final String locationName, final String locationAbbreviation, final int instanceNumber, final String customLocationAbbreviation, final boolean hasFieldMap) { - this.instanceDbId = instanceDbId; this.locationId = locationId; this.locationName = locationName; this.locationAbbreviation = locationAbbreviation; @@ -52,14 +49,6 @@ public StudyInstance(final int instanceDbId, final Integer experimentId, final I this.experimentId = experimentId; } - public int getInstanceDbId() { - return this.instanceDbId; - } - - public void setInstanceDbId(final int instanceDbId) { - this.instanceDbId = instanceDbId; - } - public String getLocationName() { return this.locationName; } @@ -142,7 +131,7 @@ public void setHasMeasurements(final Boolean hasMeasurements) { } public Boolean getCanBeDeleted() { - return canBeDeleted; + return this.canBeDeleted; } public void setCanBeDeleted(final Boolean canBeDeleted) { @@ -164,12 +153,12 @@ public boolean equals(final Object other) { return false; } final StudyInstance castOther = (StudyInstance) other; - return new EqualsBuilder().append(this.instanceDbId, castOther.instanceDbId).isEquals(); + return new EqualsBuilder().append(this.experimentId, castOther.experimentId).isEquals(); } @Override public int hashCode() { - return new HashCodeBuilder().append(this.instanceDbId).toHashCode(); + return new HashCodeBuilder().append(this.experimentId).toHashCode(); } @Override diff --git a/src/main/java/org/generationcp/middleware/service/impl/study/StudyInstanceServiceImpl.java b/src/main/java/org/generationcp/middleware/service/impl/study/StudyInstanceServiceImpl.java index f621d912cf..9316f0f181 100644 --- a/src/main/java/org/generationcp/middleware/service/impl/study/StudyInstanceServiceImpl.java +++ b/src/main/java/org/generationcp/middleware/service/impl/study/StudyInstanceServiceImpl.java @@ -1,22 +1,22 @@ package org.generationcp.middleware.service.impl.study; import com.google.common.base.Optional; -import org.generationcp.middleware.dao.dms.GeolocationDao; import org.generationcp.middleware.domain.dms.ExperimentType; import org.generationcp.middleware.domain.etl.MeasurementVariable; +import org.generationcp.middleware.domain.oms.TermId; import org.generationcp.middleware.domain.ontology.VariableType; import org.generationcp.middleware.enumeration.DatasetTypeEnum; import org.generationcp.middleware.hibernate.HibernateSessionProvider; import org.generationcp.middleware.manager.DaoFactory; import org.generationcp.middleware.manager.Operation; import org.generationcp.middleware.pojos.Location; +import org.generationcp.middleware.pojos.dms.DatasetType; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; +import org.generationcp.middleware.pojos.dms.ExperimentProperty; import org.generationcp.middleware.pojos.workbench.CropType; import org.generationcp.middleware.service.api.study.StudyInstanceService; import org.generationcp.middleware.service.api.study.StudyService; import org.generationcp.middleware.service.impl.study.generation.ExperimentModelGenerator; -import org.generationcp.middleware.service.impl.study.generation.GeolocationGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -32,7 +32,6 @@ public class StudyInstanceServiceImpl implements StudyInstanceService { private StudyService studyService; private ExperimentModelGenerator experimentModelGenerator; - private GeolocationGenerator geolocationGenerator; private DaoFactory daoFactory; @@ -42,8 +41,7 @@ public StudyInstanceServiceImpl() { public StudyInstanceServiceImpl(final HibernateSessionProvider sessionProvider) { this.daoFactory = new DaoFactory(sessionProvider); - this.experimentModelGenerator = new ExperimentModelGenerator(sessionProvider); - this.geolocationGenerator = new GeolocationGenerator(sessionProvider); + this.experimentModelGenerator = new ExperimentModelGenerator(); this.studyService = new StudyServiceImpl(sessionProvider); } @@ -55,22 +53,24 @@ public StudyInstance createStudyInstance(final CropType crop, final int studyId, final List measurementVariables = this.daoFactory.getDmsProjectDAO().getObservationSetVariables(datasetId, Arrays.asList(VariableType.ENVIRONMENT_DETAIL.getId(), VariableType.STUDY_CONDITION.getId())); - final int instanceNumber = this.daoFactory.getGeolocationDao().getNextInstanceNumber(datasetId); + final int instanceNumber = this.daoFactory.getInstanceDao().getNextInstanceNumber(datasetId); // The default value of an instance's location name is "Unspecified Location" final Optional location = this.getUnspecifiedLocation(); - final Geolocation geolocation = - this.geolocationGenerator - .createGeolocation(measurementVariables, instanceNumber, location.isPresent() ? location.get().getLocid() : null); final ExperimentModel experimentModel = - this.experimentModelGenerator.generate(crop, datasetId, Optional.of(geolocation), ExperimentType.TRIAL_ENVIRONMENT); - + this.experimentModelGenerator.generate(crop, datasetId, ExperimentType.TRIAL_ENVIRONMENT); + experimentModel.setObservationUnitNo(instanceNumber); + final boolean locationPresent = location.isPresent(); + if (locationPresent) { + experimentModel.setProperties(Collections.singletonList( + new ExperimentProperty(experimentModel, String.valueOf(location.get().getLocid()), 1, TermId.LOCATION_ID.getId()))); + } this.daoFactory.getExperimentDao().save(experimentModel); final StudyInstance studyInstance = - new StudyInstance(geolocation.getLocationId(), experimentModel.getNdExperimentId(), instanceNumber, false, false, false, true); - if (location.isPresent()) { + new StudyInstance(experimentModel.getNdExperimentId(), instanceNumber, false, false, false, true); + if (locationPresent) { studyInstance.setLocationId(location.get().getLocid()); studyInstance.setLocationName(location.get().getLname()); studyInstance.setLocationAbbreviation(location.get().getLabbr()); @@ -81,14 +81,15 @@ public StudyInstance createStudyInstance(final CropType crop, final int studyId, @Override public List getStudyInstances(final int studyId) { - return this.getStudyInstances(studyId, Collections.emptyList()); + return this.getStudyInstances(studyId, Collections.emptyList()); } private List getStudyInstances(final int studyId, final List instanceIds) { final int environmentDatasetId = this.daoFactory.getDmsProjectDAO().getDatasetsByTypeForStudy(studyId, DatasetTypeEnum.SUMMARY_DATA.getId()).get(0) .getProjectId(); - final List instances = this.daoFactory.getDmsProjectDAO().getDatasetInstances(environmentDatasetId, instanceIds); + final DatasetType datasetType = this.daoFactory.getDatasetTypeDao().getById(DatasetTypeEnum.SUMMARY_DATA.getId()); + final List instances = this.daoFactory.getDmsProjectDAO().getDatasetInstances(environmentDatasetId, instanceIds, datasetType); // If study has advance or cross list and instance has experiment design, mark instance as cannot be deleted final boolean hasAdvancedOrCrossesList = this.daoFactory.getGermplasmListDAO().hasAdvancedOrCrossesList(studyId); if (hasAdvancedOrCrossesList) { @@ -103,19 +104,14 @@ private List getStudyInstances(final int studyId, final List mapResults(final List results, } @SuppressWarnings("unchecked") - public List getAllStudyDetailsAsTable(final int projectBusinessIdentifier, + List getAllStudyDetailsAsTable(final int projectBusinessIdentifier, final List measurementVariables, final Integer instanceId) { final String generateQuery = this.measurementQuery.getObservationQueryWithBlockRowCol(measurementVariables, instanceId); @@ -202,7 +202,7 @@ private SQLQuery createQueryAndAddScalarWithBlockRowCol(final List search(final StudySearchParameters serchParameters) { return studySummaries; } - @Override - public boolean hasMeasurementDataOnEnvironment(final int studyIdentifier, final int instanceId) { - try { - - final SQLQuery query = - this.getCurrentSession().createSQLQuery(StudyServiceImpl.SQL_FOR_COUNT_TOTAL_OBSERVATION_UNITS_NO_NULL_VALUES); - query.addScalar("totalObservationUnits", new IntegerType()); - query.setParameter("studyIdentifier", studyIdentifier); - query.setParameter("instanceId", instanceId); - return (int) query.uniqueResult() > 0; - } catch (final HibernateException he) { - throw new MiddlewareQueryException( - String.format("Unexpected error in executing countTotalObservations(studyId = %s, instanceNumber = %s) : ", - studyIdentifier, instanceId) + he.getMessage(), - he); - } - } - @Override public boolean hasAdvancedOrCrossesList(final int studyId) { return this.daoFactory.getGermplasmListDAO().hasAdvancedOrCrossesList(studyId); } - @Override - public int countTotalObservationUnits(final int studyIdentifier, final int instanceId) { - try { - final SQLQuery query = this.getCurrentSession().createSQLQuery(StudyServiceImpl.SQL_FOR_COUNT_TOTAL_OBSERVATION_UNITS_SELECT - + StudyServiceImpl.SQL_FOR_COUNT_TOTAL_OBSERVATION_UNITS_WHERE); - query.addScalar("totalObservationUnits", new IntegerType()); - query.setParameter("studyIdentifier", studyIdentifier); - query.setParameter("instanceId", instanceId); - return (int) query.uniqueResult(); - } catch (final HibernateException he) { - throw new MiddlewareQueryException( - String.format("Unexpected error in executing countTotalObservations(studyId = %s, instanceNumber = %s) : ", - studyIdentifier, instanceId) + he.getMessage(), - he); - } - } + @Override public List getObservations(final int studyIdentifier, final int instanceId, final int pageNumber, final int pageSize, @@ -481,7 +421,7 @@ public int compare(final MeasurementVariableDto o1, final MeasurementVariableDto if (rowValue != null) { entry.add(String.valueOf(rowValue)); } else { - entry.add((String) null); + entry.add(null); } // get every other column skipping over PhenotypeId column @@ -502,9 +442,9 @@ public int compare(final MeasurementVariableDto o1, final MeasurementVariableDto } @Override - public StudyDetailsDto getStudyDetailsByGeolocation(final Integer geolocationId) { + public StudyDetailsDto getStudyDetailsByEnvironment(final Integer environmentId) { try { - final StudyMetadata studyMetadata = this.studyDataManager.getStudyMetadataForGeolocationId(geolocationId); + final StudyMetadata studyMetadata = this.studyDataManager.getStudyMetadataForEnvironmentId(environmentId); if (studyMetadata != null) { final StudyDetailsDto studyDetailsDto = new StudyDetailsDto(); studyDetailsDto.setMetadata(studyMetadata); @@ -514,41 +454,25 @@ public StudyDetailsDto getStudyDetailsByGeolocation(final Integer geolocationId) users.addAll(this.studyDataManager.getUsersAssociatedToStudy(studyMetadata.getNurseryOrTrialId())); studyDetailsDto.setContacts(users); - final DmsProject environmentDataset = - this.daoFactory.getDmsProjectDAO().getDatasetsByTypeForStudy(studyMetadata.getTrialDbId(), DatasetTypeEnum.SUMMARY_DATA.getId()).get(0); - final List environmentConditions = this.daoFactory.getDmsProjectDAO() - .getObservationSetVariables(environmentDataset.getProjectId(), Lists.newArrayList(VariableType.STUDY_CONDITION.getId())); final List environmentParameters = new ArrayList<>(); - List variableIds = this.getVariableIds(environmentConditions); - if(!variableIds.isEmpty()) { - environmentParameters.addAll( - this.studyDataManager.getEnvironmentConditionVariablesByGeoLocationIdAndVariableIds(geolocationId, variableIds)); - } - final List environmentDetails = this.daoFactory.getDmsProjectDAO() - .getObservationSetVariables(environmentDataset.getProjectId(), Lists.newArrayList(VariableType.ENVIRONMENT_DETAIL.getId())); - variableIds = this.getVariableIds(environmentDetails); - if(!variableIds.isEmpty()) { - environmentParameters.addAll( - this.studyDataManager.getEnvironmentDetailVariablesByGeoLocationIdAndVariableIds(geolocationId, variableIds)); - } - - - final List environmentVariables = new ArrayList<>(environmentConditions); - environmentVariables.addAll(environmentDetails); - environmentParameters.addAll(createGeolocationVariables(environmentVariables, geolocationId)); + environmentParameters.addAll(this.daoFactory.getPhenotypeDAO().getEnvironmentConditionVariables(environmentId)); + // Exclude trial instance, location and experiment design as environment parameters as they have their own field in DTO + final List environmentVariables = + this.daoFactory.getEnvironmentPropertyDao().getEnvironmentDetailVariablesExcludeVariableIds(environmentId, + Arrays.asList(TermId.LOCATION_ID.getId(), TermId.EXPERIMENT_DESIGN_FACTOR.getId(), + TermId.TRIAL_INSTANCE_FACTOR.getId())); + environmentParameters.addAll(environmentVariables); studyDetailsDto.setEnvironmentParameters(environmentParameters); final Map properties = new HashMap<>(); - variableIds = this.getVariableIds(environmentVariables); properties.put("studyObjective", studyMetadata.getStudyObjective()); - properties.putAll(this.studyDataManager.getGeolocationPropsAndValuesByGeolocation(geolocationId, variableIds)); - properties.putAll(this.studyDataManager.getProjectPropsAndValuesByStudy(studyMetadata.getNurseryOrTrialId(), variableIds)); + properties.putAll(this.studyDataManager.getProjectPropsAndValuesByStudy(studyMetadata.getNurseryOrTrialId(), this.getVariableIds(environmentVariables))); studyDetailsDto.setAdditionalInfo(properties); return studyDetailsDto; } return null; } catch (final MiddlewareQueryException e) { - final String message = "Error with getStudyDetailsForGeolocation() query with geolocationId: " + geolocationId; + final String message = "Error with getStudyDetailsByEnvironments() query with environmentId: " + environmentId; StudyServiceImpl.LOG.error(message, e); throw new MiddlewareQueryException(message, e); } @@ -562,54 +486,6 @@ private List getVariableIds(final List measurement return varIds; } - - private List createGeolocationVariables(final List measurementVariables, final Integer geolocationId) { - final List geolocationVariables = new ArrayList<>(); - final List variableIds = this.getVariableIds(measurementVariables); - if(variableIds.contains(TermId.ALTITUDE.getId()) || variableIds.contains(TermId.LATITUDE.getId()) - || variableIds.contains(TermId.LONGITUDE.getId()) || variableIds.contains(TermId.GEODETIC_DATUM.getId())) { - final Geolocation geolocation = this.daoFactory.getGeolocationDao().getById(geolocationId); - Map variableMap = new HashMap<>(); - for(MeasurementVariable mvar: measurementVariables) { - variableMap.put(mvar.getTermId(), mvar); - } - if(variableIds.contains(TermId.ALTITUDE.getId())) { - variableMap.get(TermId.ALTITUDE.getId()).setValue(geolocation.getAltitude().toString()); - geolocationVariables.add(variableMap.get(TermId.ALTITUDE.getId())); - } - if(variableIds.contains(TermId.LATITUDE.getId())) { - variableMap.get(TermId.LATITUDE.getId()).setValue(geolocation.getLatitude().toString()); - geolocationVariables.add(variableMap.get(TermId.LATITUDE.getId())); - } - if(variableIds.contains(TermId.LONGITUDE.getId())) { - variableMap.get(TermId.LONGITUDE.getId()).setValue(geolocation.getLongitude().toString()); - geolocationVariables.add(variableMap.get(TermId.LONGITUDE.getId())); - } - if(variableIds.contains(TermId.GEODETIC_DATUM.getId())) { - variableMap.get(TermId.GEODETIC_DATUM.getId()).setValue(geolocation.getGeodeticDatum()); - geolocationVariables.add(variableMap.get(TermId.GEODETIC_DATUM.getId())); - } - - } - return geolocationVariables; - } - @Override - public boolean hasMeasurementDataEntered(final List ids, final int studyId) { - final List queryResults; - try { - final SQLQuery query = this.getCurrentSession().createSQLQuery(StudyServiceImpl.SQL_FOR_HAS_MEASUREMENT_DATA_ENTERED); - query.setParameter("studyId", studyId); - query.setParameterList("cvtermIds", ids); - queryResults = query.list(); - - } catch (final HibernateException he) { - throw new MiddlewareQueryException( - "Unexpected error in executing hasMeasurementDataEntered(studyId = " + studyId + ") query: " + he.getMessage(), he); - } - - return !queryResults.isEmpty(); - } - @Override public List searchPhenotypes(final Integer pageSize, final Integer pageNumber, final PhenotypeSearchRequestDTO requestDTO) { diff --git a/src/main/java/org/generationcp/middleware/service/impl/study/generation/ExperimentDesignServiceImpl.java b/src/main/java/org/generationcp/middleware/service/impl/study/generation/ExperimentDesignServiceImpl.java index 742bf12a2b..b1b66cf912 100644 --- a/src/main/java/org/generationcp/middleware/service/impl/study/generation/ExperimentDesignServiceImpl.java +++ b/src/main/java/org/generationcp/middleware/service/impl/study/generation/ExperimentDesignServiceImpl.java @@ -1,7 +1,6 @@ package org.generationcp.middleware.service.impl.study.generation; import com.google.common.base.Function; -import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; @@ -16,8 +15,7 @@ import org.generationcp.middleware.manager.DaoFactory; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; +import org.generationcp.middleware.pojos.dms.ExperimentProperty; import org.generationcp.middleware.pojos.dms.ProjectProperty; import org.generationcp.middleware.pojos.dms.StockModel; import org.generationcp.middleware.pojos.workbench.CropType; @@ -33,6 +31,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; @Transactional @@ -61,7 +60,7 @@ public ExperimentDesignServiceImpl() { public ExperimentDesignServiceImpl(final HibernateSessionProvider sessionProvider) { this.daoFactory = new DaoFactory(sessionProvider); - this.experimentGenerator = new ExperimentModelGenerator(sessionProvider); + this.experimentGenerator = new ExperimentModelGenerator(); } @Override @@ -82,12 +81,12 @@ public void saveExperimentDesign(final CropType crop, final int studyId, final L this.deleteTrialInstanceExperiments(plotDatasetId, environmentDatasetId, instanceNumbers); // Save variables at trial and plot dataset level - final List geolocations = this.daoFactory.getGeolocationDao() - .getEnvironmentGeolocationsForInstances(studyId, instanceNumbers); - this.saveVariables(variables, plotDatasetId, environmentDatasetId, geolocations); + final List environments = this.daoFactory.getInstanceDao() + .getEnvironmentsForInstances(studyId, instanceNumbers); + this.saveVariables(variables, plotDatasetId, environmentDatasetId, environments); // Save experiments and stocks (if applicable) in plot dataset - this.saveObservationUnitRows(crop, plotDatasetId, variables, instanceRowsMap, geolocations); + this.saveObservationUnitRows(crop, plotDatasetId, variables, instanceRowsMap, environments); } @@ -99,10 +98,10 @@ public Optional getStudyExperimentDesignTypeTermId(final int studyId) { if (projectProp != null && projectProp.getValue() != null && NumberUtils.isDigits(projectProp.getValue())) { return Optional.of(Integer.valueOf(projectProp.getValue())); } - return Optional.absent(); + return Optional.empty(); } - private void saveVariables(final List variables, final Integer plotDatasetId, final Integer environmentDatasetId, final List geolocations) { + private void saveVariables(final List variables, final Integer plotDatasetId, final Integer environmentDatasetId, final List environments) { int plotDatasetNextRank = this.daoFactory.getProjectPropertyDAO().getNextRank(plotDatasetId); final List plotVariableIds = this.daoFactory.getProjectPropertyDAO().getVariableIdsForDataset(plotDatasetId); @@ -113,7 +112,7 @@ private void saveVariables(final List variables, final Inte final int variableId = variable.getTermId(); final VariableType variableType = variable.getVariableType(); final boolean isEnvironmentVariable = VariableType.ENVIRONMENT_DETAIL.equals(variableType); - Integer rank = 1; + int rank = 1; final String value = variable.getValue(); if (!this.variableExists(variableId, isEnvironmentVariable, envVariableIds, plotVariableIds)) { Integer projectId = plotDatasetId; @@ -139,11 +138,11 @@ private void saveVariables(final List variables, final Inte this.daoFactory.getProjectPropertyDAO().save(property); } - // FIXME Undo this duplicate saving in nd_geolocationprop (logged as part of IBP-3150) + // FIXME Undo this duplicate saving in nd_experimentprop (logged as part of IBP-3150) if (isEnvironmentVariable && EXPERIMENTAL_DESIGN_VARIABLES.contains(variableId)) { - for (final Geolocation geolocation : geolocations) { - final GeolocationProperty geolocationProperty = new GeolocationProperty(geolocation, value, rank, variableId); - this.daoFactory.getGeolocationPropertyDao().save(geolocationProperty); + for (final ExperimentModel environment : environments) { + final ExperimentProperty environmentProperty = new ExperimentProperty(environment, value, rank, variableId); + this.daoFactory.getEnvironmentPropertyDao().save(environmentProperty); } } @@ -155,16 +154,15 @@ private boolean variableExists(final Integer variableId,final Boolean isEnvironm } private void saveObservationUnitRows(final CropType crop, final Integer plotDatasetId, - final List variables, final Map> instanceRowsMap, final List geolocations) { + final List variables, final Map> instanceRowsMap, final List environments) { // Retrieved any previously saved stocks. We are not using Immutable map for the case of no stocks yet final Set stocks = this.daoFactory.getStockDao().findInDataSet(plotDatasetId); - final ImmutableMap trialInstanceGeolocationMap = - Maps.uniqueIndex(geolocations, new Function() { - + final ImmutableMap trialInstanceEnvironmentMap = + Maps.uniqueIndex(environments, new Function() { @Override - public String apply(final Geolocation geolocation) { - return geolocation.getDescription(); + public Integer apply(final ExperimentModel environment) { + return environment.getObservationUnitNo(); } }); @@ -184,10 +182,9 @@ public Integer apply(final MeasurementVariable measurementVariable) { for (final Map.Entry> instanceRows : instanceRowsMap.entrySet()) { final Integer trialInstance = instanceRows.getKey(); - final Optional geolocation = this.getGeolocation(trialInstanceGeolocationMap, trialInstance); for (final ObservationUnitRow row: instanceRowsMap.get(trialInstance)) { final ExperimentModel - experimentModel = this.experimentGenerator.generate(crop, plotDatasetId, row, ExperimentType.PLOT, geolocation, variablesMap); + experimentModel = this.experimentGenerator.generate(crop, plotDatasetId, row, ExperimentType.PLOT, variablesMap); final String entryNumber = String.valueOf(row.getEntryNumber()); StockModel stockModel = stocksMap.get(entryNumber); if (stockModel == null) { @@ -196,34 +193,30 @@ public Integer apply(final MeasurementVariable measurementVariable) { stocksMap.put(entryNumber, stockModel); } experimentModel.setStock(stockModel); + final ExperimentModel environment = trialInstanceEnvironmentMap.get(trialInstance); + if (environment != null) { + experimentModel.setParent(environment); + } this.daoFactory.getExperimentDao().save(experimentModel); } } } - private Optional getGeolocation(final ImmutableMap trialInstanceGeolocationMap, final Integer trialInstance) { - final Geolocation geolocation = trialInstanceGeolocationMap.get(trialInstance.toString()); - if (geolocation != null) { - return Optional.of(geolocation); - } - return Optional.absent(); - } - private void deleteTrialInstanceExperiments(final Integer plotDatasetId, final Integer environmentDatasetId, final List instanceNumbers) { this.daoFactory.getExperimentDao().deleteExperimentsForDatasetInstances(plotDatasetId, instanceNumbers); - final List geolocVariables = Lists.newArrayList(Iterables.concat(EXPERIMENTAL_DESIGN_VARIABLES, FIELDMAP_ENVT_VARIABLES)); - this.daoFactory.getGeolocationPropertyDao().deletePropertiesInDatasetInstances(environmentDatasetId, instanceNumbers, geolocVariables); + final List environmentVariables = Lists.newArrayList(Iterables.concat(EXPERIMENTAL_DESIGN_VARIABLES, FIELDMAP_ENVT_VARIABLES)); + this.daoFactory.getEnvironmentPropertyDao().deletePropertiesInDatasetInstances(environmentDatasetId, instanceNumbers, environmentVariables); } @Override public void deleteStudyExperimentDesign(final int studyId) { // Delete environment variables related to experiment design and fieldmap - final List geolocVariables = Lists.newArrayList(Iterables.concat(EXPERIMENTAL_DESIGN_VARIABLES, FIELDMAP_ENVT_VARIABLES)); + final List environmentVariables = Lists.newArrayList(Iterables.concat(EXPERIMENTAL_DESIGN_VARIABLES, FIELDMAP_ENVT_VARIABLES)); final Integer environmentDatasetId = this.studyService.getEnvironmentDatasetId(studyId); this.daoFactory.getProjectPropertyDAO() - .deleteProjectVariables(environmentDatasetId, geolocVariables); - this.daoFactory.getGeolocationPropertyDao().deletePropertiesInDataset(environmentDatasetId, geolocVariables); + .deleteProjectVariables(environmentDatasetId, environmentVariables); + this.daoFactory.getEnvironmentPropertyDao().deletePropertiesInDataset(environmentDatasetId, environmentVariables); // Delete variables related to experiment design and experiments of plot dataset final Integer plotDatasetId = this.studyService.getPlotDatasetId(studyId); diff --git a/src/main/java/org/generationcp/middleware/service/impl/study/generation/ExperimentModelGenerator.java b/src/main/java/org/generationcp/middleware/service/impl/study/generation/ExperimentModelGenerator.java index 1f88fe8d24..8f0b45eb4d 100644 --- a/src/main/java/org/generationcp/middleware/service/impl/study/generation/ExperimentModelGenerator.java +++ b/src/main/java/org/generationcp/middleware/service/impl/study/generation/ExperimentModelGenerator.java @@ -1,14 +1,11 @@ package org.generationcp.middleware.service.impl.study.generation; -import com.google.common.base.Optional; import org.generationcp.middleware.domain.dms.ExperimentType; import org.generationcp.middleware.domain.etl.MeasurementVariable; import org.generationcp.middleware.domain.ontology.VariableType; -import org.generationcp.middleware.hibernate.HibernateSessionProvider; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.pojos.dms.ExperimentProperty; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.workbench.CropType; import org.generationcp.middleware.service.api.ObservationUnitIDGenerator; import org.generationcp.middleware.service.api.dataset.ObservationUnitData; @@ -26,28 +23,21 @@ public class ExperimentModelGenerator { private static final List EXPT_DESIGN_TYPES = Arrays.asList(VariableType.EXPERIMENTAL_DESIGN, VariableType.TREATMENT_FACTOR); - private final GeolocationGenerator geolocationGenerator; - - public ExperimentModelGenerator(final HibernateSessionProvider sessionProvider) { - this.geolocationGenerator = new GeolocationGenerator(sessionProvider); - } - public ExperimentModel generate(final CropType crop, final Integer projectId, final ObservationUnitRow row, - final ExperimentType expType, final Optional geolocation, final Map variablesMap) { + final ExperimentType expType, final Map variablesMap) { - final ExperimentModel experimentModel = this.createExperimentModel(crop, projectId, expType, geolocation); + final ExperimentModel experimentModel = this.createExperimentModel(crop, projectId, expType); experimentModel.setProperties(this.createTrialDesignExperimentProperties(experimentModel, row, variablesMap)); return experimentModel; } - public ExperimentModel generate(final CropType crop, final Integer projectId, final Optional geolocation, + public ExperimentModel generate(final CropType crop, final Integer projectId, final ExperimentType expType) { - return this.createExperimentModel(crop, projectId, expType, geolocation); + return this.createExperimentModel(crop, projectId, expType); } - private ExperimentModel createExperimentModel(final CropType crop, final Integer projectId, final ExperimentType expType, - final Optional geolocation) { + private ExperimentModel createExperimentModel(final CropType crop, final Integer projectId, final ExperimentType expType) { final ExperimentModel experimentModel = new ExperimentModel(); final DmsProject project = new DmsProject(); @@ -55,9 +45,6 @@ private ExperimentModel createExperimentModel(final CropType crop, final Integer experimentModel.setProject(project); experimentModel.setTypeId(expType.getTermId()); - final Geolocation location = geolocation.isPresent() ? geolocation.get() : this.geolocationGenerator.createGeoLocation(); - experimentModel.setGeoLocation(location); - final ObservationUnitIDGenerator observationUnitIDGenerator = new ObservationUnitIDGeneratorImpl(); observationUnitIDGenerator.generateObservationUnitIds(crop, Collections.singletonList(experimentModel)); diff --git a/src/main/java/org/generationcp/middleware/service/impl/study/generation/GeolocationGenerator.java b/src/main/java/org/generationcp/middleware/service/impl/study/generation/GeolocationGenerator.java deleted file mode 100644 index f0081ff32a..0000000000 --- a/src/main/java/org/generationcp/middleware/service/impl/study/generation/GeolocationGenerator.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.generationcp.middleware.service.impl.study.generation; - -import org.generationcp.middleware.domain.etl.MeasurementVariable; -import org.generationcp.middleware.domain.oms.TermId; -import org.generationcp.middleware.domain.ontology.VariableType; -import org.generationcp.middleware.hibernate.HibernateSessionProvider; -import org.generationcp.middleware.manager.DaoFactory; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; - -import java.util.ArrayList; -import java.util.List; - -public class GeolocationGenerator { - - private final DaoFactory daoFactory; - - public GeolocationGenerator(final HibernateSessionProvider sessionProvider) { - this.daoFactory = new DaoFactory(sessionProvider); - } - - public Geolocation createGeoLocation() { - final Geolocation location = new Geolocation(); - location.setDescription("1"); - this.daoFactory.getGeolocationDao().save(location); - return location; - } - - public Geolocation createGeolocation(final List measurementVariables, final int instanceNumber, - final Integer locationId) { - final Geolocation geolocation = new Geolocation(); - geolocation.setDescription(String.valueOf(instanceNumber)); - geolocation.setProperties(new ArrayList()); - - int rank = 1; - for (final MeasurementVariable measurementVariable : measurementVariables) { - if (VariableType.ENVIRONMENT_DETAIL == measurementVariable.getVariableType()) { - String value = ""; - if (measurementVariable.getTermId() == TermId.LOCATION_ID.getId()) { - value = String.valueOf(locationId); - } - final GeolocationProperty geolocationProperty = - new GeolocationProperty(geolocation, value, rank, measurementVariable.getTermId()); - geolocation.getProperties().add(geolocationProperty); - rank++; - } - - } - this.daoFactory.getGeolocationDao().save(geolocation); - return geolocation; - } - -} diff --git a/src/main/java/org/generationcp/middleware/util/DatabaseBroker.java b/src/main/java/org/generationcp/middleware/util/DatabaseBroker.java index 746bb7d600..ec6565eb23 100644 --- a/src/main/java/org/generationcp/middleware/util/DatabaseBroker.java +++ b/src/main/java/org/generationcp/middleware/util/DatabaseBroker.java @@ -31,8 +31,6 @@ import org.generationcp.middleware.dao.dms.DmsProjectDao; import org.generationcp.middleware.dao.dms.ExperimentDao; import org.generationcp.middleware.dao.dms.ExperimentPropertyDao; -import org.generationcp.middleware.dao.dms.GeolocationDao; -import org.generationcp.middleware.dao.dms.GeolocationPropertyDao; import org.generationcp.middleware.dao.dms.LocationSearchDao; import org.generationcp.middleware.dao.dms.PhenotypeDao; import org.generationcp.middleware.dao.dms.PhenotypeOutlierDao; @@ -170,12 +168,6 @@ public LocationSearchDao getLocationSearchDao() { return dao; } - public GeolocationPropertyDao getGeolocationPropertyDao() { - final GeolocationPropertyDao geolocationPropertyDao = new GeolocationPropertyDao(); - geolocationPropertyDao.setSession(this.getActiveSession()); - return geolocationPropertyDao; - } - public ExperimentDao getExperimentDao() { final ExperimentDao experimentDao = new ExperimentDao(); experimentDao.setSession(this.getActiveSession()); @@ -200,12 +192,6 @@ public ProjectPropertyDao getProjectPropertyDao() { return projectPropertyDao; } - public GeolocationDao getGeolocationDao() { - final GeolocationDao geolocationDao = new GeolocationDao(); - geolocationDao.setSession(this.getActiveSession()); - return geolocationDao; - } - public PhenotypeDao getPhenotypeDao() { final PhenotypeDao phenotypeDao = new PhenotypeDao(); phenotypeDao.setSession(this.getActiveSession()); diff --git a/src/main/resources/liquibase/crop_changelog/14_1_0.xml b/src/main/resources/liquibase/crop_changelog/14_1_0.xml index d6747deda4..eb3021f8f5 100644 --- a/src/main/resources/liquibase/crop_changelog/14_1_0.xml +++ b/src/main/resources/liquibase/crop_changelog/14_1_0.xml @@ -1,7 +1,7 @@ diff --git a/src/main/resources/liquibase/crop_changelog/14_3_0.xml b/src/main/resources/liquibase/crop_changelog/14_3_0.xml index 42ccb35661..1edd937ce2 100644 --- a/src/main/resources/liquibase/crop_changelog/14_3_0.xml +++ b/src/main/resources/liquibase/crop_changelog/14_3_0.xml @@ -39,4 +39,281 @@ + + + + + + SELECT COUNT(1) + FROM nd_geolocation g + INNER JOIN nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id + WHERE e.type_id = 1020 AND e.observation_unit_no IS NULL; + + + + Save Trial Instance Number to ND_EXPERIMENT.observation_unit_no field + + + UPDATE nd_geolocation g + INNER join nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id + SET e.observation_unit_no = g.description + WHERE e.type_id = 1020 AND e.observation_unit_no IS NULL; + + + + + + + + + SELECT COUNT(1) + FROM nd_experiment e + INNER JOIN nd_experiment env ON e.nd_geolocation_id = env.nd_geolocation_id AND env.type_id = 1020 + WHERE e.type_id in (1155, 1170) AND e.parent_id is null; + + + + Update Environment experiments as parent of Plot and Means Experiments + + + UPDATE nd_experiment e + INNER JOIN nd_experiment env ON e.nd_geolocation_id = env.nd_geolocation_id AND env.type_id = 1020 + SET e.parent_id = env.nd_experiment_id + WHERE e.type_id in (1155, 1170) AND e.parent_id is null; + + + + + + + + + SELECT COUNT(1) + FROM nd_geolocation g + INNER JOIN nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id + WHERE e.type_id = 1020 and g.latitude IS NOT NULL + AND NOT EXISTS ( + SELECT 1 FROM nd_experimentprop xp + WHERE xp.nd_experiment_id = e.nd_experiment_id and xp.type_id = 8191); + + + + Move Latitude data to ND_EXPERIMENTPROP table + + + INSERT INTO `nd_experimentprop`(`nd_experiment_id`,`type_id`,`value`,`rank`) + SELECT e.nd_experiment_id, 8191, g.latitude, 1 + FROM nd_geolocation g + INNER JOIN nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id + WHERE e.type_id = 1020 and g.latitude IS NOT NULL + AND NOT EXISTS ( + SELECT 1 FROM nd_experimentprop xp + WHERE xp.nd_experiment_id = e.nd_experiment_id and xp.type_id = 8191); + + + + + + + + SELECT COUNT(1) + FROM nd_geolocation g + INNER JOIN nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id + WHERE e.type_id = 1020 and g.longitude IS NOT NULL + AND NOT EXISTS ( + SELECT 1 FROM nd_experimentprop xp + WHERE xp.nd_experiment_id = e.nd_experiment_id and xp.type_id = 8192); + + + + Move Longitude data to ND_EXPERIMENTPROP table + + + INSERT INTO `nd_experimentprop`(`nd_experiment_id`,`type_id`,`value`,`rank`) + SELECT e.nd_experiment_id, 8192, g.longitude, 2 + FROM nd_geolocation g + INNER JOIN nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id + WHERE e.type_id = 1020 and g.longitude IS NOT NULL + AND NOT EXISTS ( + SELECT 1 FROM nd_experimentprop xp + WHERE xp.nd_experiment_id = e.nd_experiment_id and xp.type_id = 8192); + + + + + + + + SELECT COUNT(1) + FROM nd_geolocation g + INNER JOIN nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id + WHERE e.type_id = 1020 and g.geodetic_datum IS NOT NULL + AND NOT EXISTS ( + SELECT 1 FROM nd_experimentprop xp + WHERE xp.nd_experiment_id = e.nd_experiment_id and xp.type_id = 8193); + + + + Move Geodetic Datum to ND_EXPERIMENTPROP table + + + INSERT INTO `nd_experimentprop`(`nd_experiment_id`,`type_id`,`value`,`rank`) + SELECT e.nd_experiment_id, 8193, g.geodetic_datum, 3 + FROM nd_geolocation g + INNER JOIN nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id + WHERE e.type_id = 1020 and g.geodetic_datum IS NOT NULL + AND NOT EXISTS ( + SELECT 1 FROM nd_experimentprop xp + WHERE xp.nd_experiment_id = e.nd_experiment_id and xp.type_id = 8193); + + + + + + + + SELECT COUNT(1) + FROM nd_geolocation g + INNER JOIN nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id + WHERE e.type_id = 1020 and g.altitude IS NOT NULL + AND NOT EXISTS ( + SELECT 1 FROM nd_experimentprop xp + WHERE xp.nd_experiment_id = e.nd_experiment_id and xp.type_id = 8194); + + + + Move Altitude Data to ND_EXPERIMENTPROP table + + + INSERT INTO `nd_experimentprop`(`nd_experiment_id`,`type_id`,`value`,`rank`) + SELECT e.nd_experiment_id, 8194, g.altitude, 4 + FROM nd_geolocation g + INNER JOIN nd_experiment e ON e.nd_geolocation_id = g.nd_geolocation_id + WHERE e.type_id = 1020 and g.altitude IS NOT NULL + AND NOT EXISTS ( + SELECT 1 FROM nd_experimentprop xp + WHERE xp.nd_experiment_id = e.nd_experiment_id and xp.type_id = 8194); + + + + + + + + SELECT COUNT(1) + FROM nd_geolocationprop gp + INNER JOIN nd_experiment e ON e.nd_geolocation_id = gp.nd_geolocation_id + WHERE e.type_id = 1020 + AND NOT EXISTS ( + SELECT 1 FROM nd_experimentprop xp + WHERE xp.nd_experiment_id = e.nd_experiment_id and xp.type_id = gp.type_id); + + + + Move data from ND_GEOLOCATIONPROP to ND_EXPERIMENTPROP table + + + INSERT INTO `nd_experimentprop`(`nd_experiment_id`,`type_id`,`value`,`rank`) + SELECT e.nd_experiment_id, gp.type_id, gp.value, gp.rank + FROM nd_geolocationprop gp + INNER JOIN nd_experiment e ON e.nd_geolocation_id = gp.nd_geolocation_id + WHERE e.type_id = 1020 + AND NOT EXISTS ( + SELECT 1 FROM nd_experimentprop xp + WHERE xp.nd_experiment_id = e.nd_experiment_id and xp.type_id = gp.type_id); + + + + + + + + + + + + + + + + + + + + + Copy nd_geolocation_id values of ND_EXPERIMENT table into backup field + + + + + + + + UPDATE nd_experiment + SET nd_geolocation_id_bkp = nd_geolocation_id; + + UPDATE nd_experiment + SET nd_geolocation_id = NULL; + + + + + + + + + + + + Temporary for testing: Backup then delete contents of ND_GEOLOCATIONPROP table + + + CREATE TABLE `nd_geolocationprop_bkp` ( + `nd_geolocationprop_id` int(11) NOT NULL AUTO_INCREMENT, + `nd_geolocation_id` int(11) NOT NULL, + `type_id` int(11) NOT NULL, + `value` varchar(255) DEFAULT NULL, + `rank` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`nd_geolocationprop_id`), + UNIQUE KEY `nd_geolocationprop_bkp_idx1` (`nd_geolocation_id`,`type_id`,`rank`), + KEY `nd_geolocationprop_bkp_idx2` (`type_id`), + CONSTRAINT `nd_geolocationprop_bkp_fk2` FOREIGN KEY (`type_id`) REFERENCES `cvterm` (`cvterm_id`) ON DELETE CASCADE + ); + + INSERT INTO nd_geolocationprop_bkp + SELECT * FROM nd_geolocationprop; + + DELETE FROM nd_geolocationprop; + + + + + + + + + + + + Temporary for testing: Backup then delete contents of ND_GEOLOCATION table + + + CREATE TABLE `nd_geolocation_bkp` ( + `nd_geolocation_id` int(11) NOT NULL AUTO_INCREMENT, + `description` varchar(255) DEFAULT NULL, + `latitude` float DEFAULT NULL, + `longitude` float DEFAULT NULL, + `geodetic_datum` varchar(32) DEFAULT NULL, + `altitude` float DEFAULT NULL, + PRIMARY KEY (`nd_geolocation_id`) + ); + + INSERT INTO nd_geolocation_bkp + SELECT * FROM nd_geolocation; + + DELETE FROM nd_geolocation; + + + + diff --git a/src/test/java/org/generationcp/middleware/DataSetupTest.java b/src/test/java/org/generationcp/middleware/DataSetupTest.java index ede06f8413..763f1af8d3 100644 --- a/src/test/java/org/generationcp/middleware/DataSetupTest.java +++ b/src/test/java/org/generationcp/middleware/DataSetupTest.java @@ -73,7 +73,7 @@ public class DataSetupTest extends IntegrationTestBase { public static final int NUMBER_OF_GERMPLASM = 20; public static final String GERMPLSM_PREFIX = "GP-VARIETY-"; - public static final String LOCATION_NAME = "LOCATION_NAME"; + public static final String SITE_LONG = "SITE_LONG"; private static final String PROP_BREEDING_METHOD = "Breeding Method"; private static final String PROP_INSTITUTE = "Institute"; @@ -243,10 +243,6 @@ public int createNurseryForGermplasm(final String programUUID, final Integer[] g DataSetupTest.PROP_INSTITUTE, DataSetupTest.CONDUCTED, DataSetupTest.DBCV, DataSetupTest.CHAR, "CIMMYT", DataSetupTest.STUDY, PhenotypicType.STUDY, true)); - conditions.add(this.createMeasurementVariable(TermId.TRIAL_LOCATION.getId(), LOCATION_NAME, LOCATION_NAME + " - description", - LOCATION, DataSetupTest.ASSIGNED, LOCATION_NAME_PROP, DataSetupTest.CHAR, - "Default Breeding Location", DataSetupTest.STUDY, PhenotypicType.TRIAL_ENVIRONMENT, true)); - // Need to set TRIAL_INSTANCE # manually since we're adding other environment level conditions conditions.add(this.createMeasurementVariable(TermId.TRIAL_INSTANCE_FACTOR.getId(), "TRIAL_INSTANCE", "Trial instance - enumerated (number)", "Trial Instance", DataSetupTest.ENUMERATED, DataSetupTest.NUMBER, DataSetupTest.NUMERIC, @@ -257,7 +253,7 @@ public int createNurseryForGermplasm(final String programUUID, final Integer[] g conditions.add(this.createMeasurementVariable(TermId.LATITUDE.getId(), "SITE_LAT", "Latitude of site - observed (decimal + for N, - for S)", "Latitude", DataSetupTest.OBSERVED, "Decimal + for N, - for S", DataSetupTest.NUMERIC, "422", DataSetupTest.TRIAL, PhenotypicType.TRIAL_ENVIRONMENT, true)); - conditions.add(this.createMeasurementVariable(TermId.LONGITUDE.getId(), "SITE_LONG", "Longitude of site - observed (decimal + for E , - for W)", + conditions.add(this.createMeasurementVariable(TermId.LONGITUDE.getId(), DataSetupTest.SITE_LONG, "Longitude of site - observed (decimal + for E , - for W)", "Longitude", DataSetupTest.OBSERVED, "Decimal + for E, - for W", DataSetupTest.NUMERIC, "242", DataSetupTest.TRIAL, PhenotypicType.TRIAL_ENVIRONMENT, true)); conditions.add(this.createMeasurementVariable(TermId.GEODETIC_DATUM.getId(), "SITE_DATUM", "Geodetic datum for lat, long - observed (text)", diff --git a/src/test/java/org/generationcp/middleware/dao/ListDataProjectDAOTest.java b/src/test/java/org/generationcp/middleware/dao/ListDataProjectDAOTest.java index 203835f280..670f71d836 100644 --- a/src/test/java/org/generationcp/middleware/dao/ListDataProjectDAOTest.java +++ b/src/test/java/org/generationcp/middleware/dao/ListDataProjectDAOTest.java @@ -76,7 +76,7 @@ public void beforeTest() { // setup test data studyId = this.createNurseryTestData(); final List listDataProjectList = - this.listDataProjectDAO.getByStudy(studyId, GermplasmListType.STUDY, Arrays.asList(0), "1"); + this.listDataProjectDAO.getByStudy(studyId, GermplasmListType.STUDY); this.testListDataProject = listDataProjectList.get(0); } @@ -232,38 +232,19 @@ public void testGetByStudy() { final String instanceNumber = "3"; final GermplasmListType listType = GermplasmListType.STUDY; final int studyID = 5678; - this.listDataProjectDAO.getByStudy(studyID, listType, plotNumbers, instanceNumber); - - final String expectedSql = "select ldp.* FROM nd_experiment e," - + " nd_experimentprop nd_ep, stock," - + " listdata_project ldp, project p, listnms nms, nd_geolocation geo" - + " WHERE nd_ep.type_id IN (:PLOT_NO_TERM_IDS)" + " AND nms.projectid = p.study_id" - + " AND nms.listid = ldp.list_id" - + " AND nms.projectid = :STUDY_ID" + " AND p.dataset_type_id = :DATASET_TYPE" - + " AND e.project_id = p.project_id" - + " AND e.nd_experiment_id = nd_ep.nd_experiment_id" - + " AND stock.stock_id = e.stock_id" + " AND ldp.germplasm_id = stock.dbxref_id" - + " AND nd_ep.value in (:PLOT_NO)" - + " AND nd_ep.nd_experiment_id = e.nd_experiment_id" - + " AND e.nd_geolocation_id = geo.nd_geolocation_id" - + " AND geo.description = :INSTANCE_NUMBER" - + " AND ( EXISTS (" + " SELECT 1" + " FROM listnms cl" - + " WHERE cl.listid = ldp.list_id" + " AND cl.listtype = 'CHECK'" + " AND NOT EXISTS (" - + " SELECT 1 FROM listnms nl" + " WHERE nl.listid = ldp.list_id" + " AND nl.listtype = :LIST_TYPE" - + " )) OR EXISTS (" + " SELECT 1 FROM listnms nl" + " WHERE nl.listid = ldp.list_id" - + " AND nl.listtype = :LIST_TYPE" + " ))"; + this.listDataProjectDAO.getByStudy(studyID, listType); + + final String expectedSql = "select ldp.* FROM listdata_project ldp " + + " INNER JOIN listnms nms on nms.listid = ldp.list_id " + + " INNER JOIN project p on nms.projectid = p.project_id " + + " WHERE p.project_id = :STUDY_ID " + + " AND nms.listtype = :LIST_TYPE "; final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(mockSession).createSQLQuery(sqlCaptor.capture()); Assert.assertEquals(expectedSql, sqlCaptor.getValue()); Mockito.verify(mockQuery).addEntity("ldp", ListDataProject.class); Mockito.verify(mockQuery).setParameter("LIST_TYPE", listType.name()); Mockito.verify(mockQuery).setParameter("STUDY_ID", studyID); - Mockito.verify(mockQuery).setParameterList("PLOT_NO", plotNumbers); - Mockito.verify(mockQuery).setParameter("INSTANCE_NUMBER", instanceNumber); - Mockito.verify(mockQuery).setParameter("DATASET_TYPE", DatasetTypeEnum.PLOT_DATA.getId()); - Mockito.verify(mockQuery).setParameterList( - "PLOT_NO_TERM_IDS", - new Integer[] {TermId.PLOT_NO.getId(), TermId.PLOT_NNO.getId()}); } private List createListDataProject( diff --git a/src/test/java/org/generationcp/middleware/dao/SampleDaoTest.java b/src/test/java/org/generationcp/middleware/dao/SampleDaoTest.java index 5ff51c4e2a..1e87ffe601 100644 --- a/src/test/java/org/generationcp/middleware/dao/SampleDaoTest.java +++ b/src/test/java/org/generationcp/middleware/dao/SampleDaoTest.java @@ -4,20 +4,16 @@ import org.generationcp.middleware.IntegrationTestBase; import org.generationcp.middleware.dao.dms.DmsProjectDao; import org.generationcp.middleware.dao.dms.ExperimentDao; -import org.generationcp.middleware.dao.dms.GeolocationDao; import org.generationcp.middleware.dao.dms.ProjectPropertyDao; import org.generationcp.middleware.dao.dms.StockDao; import org.generationcp.middleware.data.initializer.GermplasmTestDataInitializer; -import org.generationcp.middleware.data.initializer.PersonTestDataInitializer; import org.generationcp.middleware.data.initializer.SampleListTestDataInitializer; import org.generationcp.middleware.data.initializer.SampleTestDataInitializer; -import org.generationcp.middleware.data.initializer.UserTestDataInitializer; import org.generationcp.middleware.domain.oms.TermId; import org.generationcp.middleware.domain.sample.SampleDTO; import org.generationcp.middleware.enumeration.DatasetTypeEnum; import org.generationcp.middleware.manager.DaoFactory; import org.generationcp.middleware.pojos.Germplasm; -import org.generationcp.middleware.pojos.Person; import org.generationcp.middleware.pojos.Sample; import org.generationcp.middleware.pojos.SampleList; import org.generationcp.middleware.pojos.dms.DatasetType; @@ -46,16 +42,15 @@ public class SampleDaoTest extends IntegrationTestBase { public static final String USER_NAME = "JohnDoe"; public static final String USER_FIRST_NAME = "John"; public static final String USER_LAST_NAME = "Doe"; - public static final Integer TEST_SAMPLE_RECORD_COUNT = 23; + private static final Integer TEST_SAMPLE_RECORD_COUNT = 23; public static final String STUDY_NAME = "Study1"; - public static final String STUDY_DESCRIPTION = "Study Project"; + private static final String STUDY_DESCRIPTION = "Study Project"; private static final String SAMPLE_LIST_NAME_FOR_PLOT_DATA = "PlotSampleList"; private static final String SAMPLE_LIST_NAME_FOR_SUBOBSERVATION_DATA = "SubObsSampleList"; private SampleListDao sampleListDao; private SampleDao sampleDao; private ExperimentDao experimentDao; - private GeolocationDao geolocationDao; private StockDao stockDao; private PersonDAO personDAO; private DmsProjectDao dmsProjectDao; @@ -81,9 +76,6 @@ public void setUp() throws Exception { this.experimentDao = new ExperimentDao(); this.experimentDao.setSession(this.sessionProvder.getSession()); - this.geolocationDao = new GeolocationDao(); - this.geolocationDao.setSession(this.sessionProvder.getSession()); - this.stockDao = new StockDao(); this.stockDao.setSession(this.sessionProvder.getSession()); @@ -296,8 +288,7 @@ public void testCountBySampleUIDs() { @Test public void testGetBySampleBks() { - final Integer listId = - this.createStudyWithPlot(this.study, this.workbenchUser, SAMPLE_LIST_NAME_FOR_PLOT_DATA, TEST_SAMPLE_RECORD_COUNT); + this.createStudyWithPlot(this.study, this.workbenchUser, SAMPLE_LIST_NAME_FOR_PLOT_DATA, TEST_SAMPLE_RECORD_COUNT); final Set sampleUIDs = new HashSet<>(); for (int i = 1; i < TEST_SAMPLE_RECORD_COUNT + 1; i++) { @@ -427,9 +418,6 @@ private SampleList createExperimentsWithSampleList( sampleList.setDescription("DESCRIPTION-" + listName); this.sampleListDao.saveOrUpdate(sampleList); - final Geolocation geolocation = new Geolocation(); - this.geolocationDao.saveOrUpdate(geolocation); - // Create one sample for each experiment. for (int i = 1; i < sampleSize + 1; i++) { final Germplasm germplasm = GermplasmTestDataInitializer.createGermplasm(1); @@ -444,7 +432,6 @@ private SampleList createExperimentsWithSampleList( this.stockDao.saveOrUpdate(stockModel); final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(geolocation); experimentModel.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experimentModel.setProject(dmsProject); experimentModel.setStock(stockModel); diff --git a/src/test/java/org/generationcp/middleware/dao/SampleListDaoTest.java b/src/test/java/org/generationcp/middleware/dao/SampleListDaoTest.java index b5e91d1a43..2e4acc3d73 100644 --- a/src/test/java/org/generationcp/middleware/dao/SampleListDaoTest.java +++ b/src/test/java/org/generationcp/middleware/dao/SampleListDaoTest.java @@ -5,7 +5,6 @@ import org.generationcp.middleware.dao.dms.DmsProjectDao; import org.generationcp.middleware.dao.dms.ExperimentDao; import org.generationcp.middleware.dao.dms.ExperimentPropertyDao; -import org.generationcp.middleware.dao.dms.GeolocationDao; import org.generationcp.middleware.dao.dms.ProjectPropertyDao; import org.generationcp.middleware.dao.dms.StockDao; import org.generationcp.middleware.data.initializer.GermplasmTestDataInitializer; @@ -27,7 +26,6 @@ import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.pojos.dms.ExperimentProperty; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.dms.StockModel; import org.generationcp.middleware.pojos.workbench.WorkbenchUser; import org.generationcp.middleware.service.api.user.UserService; @@ -59,7 +57,6 @@ public class SampleListDaoTest extends IntegrationTestBase { private PersonDAO personDAO; private SampleDao sampleDao; private ExperimentDao experimentDao; - private GeolocationDao geolocationDao; private DmsProjectDao dmsProjectDao; private StockDao stockDao; private ExperimentPropertyDao experimentPropertyDao; @@ -91,9 +88,6 @@ public void setUp() throws Exception { this.experimentPropertyDao = new ExperimentPropertyDao(); this.experimentPropertyDao.setSession(this.sessionProvder.getSession()); - this.geolocationDao = new GeolocationDao(); - this.geolocationDao.setSession(this.sessionProvder.getSession()); - this.dmsProjectDao = new DmsProjectDao(); this.dmsProjectDao.setSession(this.sessionProvder.getSession()); @@ -133,7 +127,7 @@ public void testCreateSampleList() { } @Test - public void testGetSampleListByParentAndNameOk() throws Exception { + public void testGetSampleListByParentAndNameOk() { final WorkbenchUser workbenchUser = this.userService.getUserByUsername(SampleListDaoTest.ADMIN); final SampleList sampleList = SampleListTestDataInitializer.createSampleList(workbenchUser.getUserid()); @@ -152,12 +146,12 @@ public void testGetSampleListByParentAndNameOk() throws Exception { } @Test(expected = NullPointerException.class) - public void testGetSampleListByParentAndNameNullSampleName() throws Exception { + public void testGetSampleListByParentAndNameNullSampleName() { this.sampleListDao.getSampleListByParentAndName(null, 1, PROGRAM_UUID); } @Test(expected = NullPointerException.class) - public void testGetSampleListByParentAndNameNullParent() throws Exception { + public void testGetSampleListByParentAndNameNullParent() { this.sampleListDao.getSampleListByParentAndName("name", null, PROGRAM_UUID); } @@ -352,10 +346,6 @@ private WorkbenchUser createTestUser() { private ExperimentModel createTestExperiment(final DmsProject project) { final ExperimentModel experimentModel = new ExperimentModel(); - final Geolocation geolocation = new Geolocation(); - this.geolocationDao.saveOrUpdate(geolocation); - - experimentModel.setGeoLocation(geolocation); experimentModel.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experimentModel.setProject(project); experimentModel.setObservationUnitNo(1); diff --git a/src/test/java/org/generationcp/middleware/dao/dms/DataSetDaoTest.java b/src/test/java/org/generationcp/middleware/dao/dms/DataSetDaoTest.java deleted file mode 100644 index d5728fc837..0000000000 --- a/src/test/java/org/generationcp/middleware/dao/dms/DataSetDaoTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package org.generationcp.middleware.dao.dms; - -import java.util.List; - -import org.generationcp.middleware.domain.oms.TermId; -import org.hibernate.SQLQuery; -import org.hibernate.Session; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Matchers; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -public class DataSetDaoTest { - - @Mock - private Session mockSession; - - @Mock - private SQLQuery mockQuery; - - private DataSetDao dao; - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - - this.dao = new DataSetDao(); - this.dao.setSession(this.mockSession); - Mockito.when(this.mockSession.createSQLQuery(Matchers.anyString())).thenReturn(this.mockQuery); - } - - @Test - public void testDeleteExperimentsByLocation_WithExperimentProperties() { - Mockito.doReturn(1).when(this.mockQuery).executeUpdate(); - final int datasetId = 1234; - final int locationId = 555; - this.dao.deleteExperimentsByLocation(datasetId, locationId); - - Mockito.verify(this.mockSession).flush(); - final String deleteExperimentSql = "delete e, pheno, eprop " + "from nd_experiment e, " - + "phenotype pheno, nd_experimentprop eprop " - + "where e.project_id = " + datasetId + " and e.nd_geolocation_id = " + locationId - + " and e.nd_experiment_id = pheno.nd_experiment_id " - + " and e.nd_experiment_id = eprop.nd_experiment_id"; - final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); - Mockito.verify(this.mockSession).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(deleteExperimentSql, sqlCaptor.getValue()); - Mockito.verify(this.mockQuery).executeUpdate(); - } - - @Test - public void testDeleteExperimentsByLocation_NoExperimentProperties() { - final int datasetId = 1234; - final int locationId = 555; - this.dao.deleteExperimentsByLocation(datasetId, locationId); - - Mockito.verify(this.mockSession).flush(); - final String deleteExperimentSqlQuery1 = "delete e, pheno, eprop " + "from nd_experiment e, " - + "phenotype pheno, nd_experimentprop eprop " - + "where e.project_id = " + datasetId + " and e.nd_geolocation_id = " + locationId - + " and e.nd_experiment_id = pheno.nd_experiment_id " - + " and e.nd_experiment_id = eprop.nd_experiment_id"; - final String deleteExperimentSqlQuery2 = "delete e, pheno " + "from nd_experiment e, " - + "phenotype pheno " - + "where e.project_id = " + datasetId + " and e.nd_geolocation_id = " + locationId - + " and e.nd_experiment_id = pheno.nd_experiment_id "; - final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); - Mockito.verify(this.mockSession, Mockito.times(2)).createSQLQuery(sqlCaptor.capture()); - final List queries = sqlCaptor.getAllValues(); - Assert.assertEquals(deleteExperimentSqlQuery1, queries.get(0)); - Assert.assertEquals(deleteExperimentSqlQuery2, queries.get(1)); - Mockito.verify(this.mockQuery, Mockito.times(2)).executeUpdate(); - } - - @Test - public void testDeleteExperimentsByLocationAndType() { - final int datasetId = 1234; - final int locationId = 555; - final int typeId = TermId.PLOT_EXPERIMENT.getId(); - this.dao.deleteExperimentsByLocationAndType(datasetId, locationId, typeId); - - Mockito.verify(this.mockSession).flush(); - final String deleteExperimentSql = "delete e, pheno, eprop " + "from nd_experiment e, " - + "phenotype pheno, nd_experimentprop eprop " - + "where e.project_id = " + datasetId + " and e.nd_geolocation_id = " + locationId - + " and e.type_id = " + typeId - + " and e.nd_experiment_id = pheno.nd_experiment_id " - + " and e.nd_experiment_id = eprop.nd_experiment_id"; - final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); - Mockito.verify(this.mockSession).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(deleteExperimentSql, sqlCaptor.getValue()); - Mockito.verify(this.mockQuery).executeUpdate(); - } - -} diff --git a/src/test/java/org/generationcp/middleware/dao/dms/DmsProjectDaoIntegrationTest.java b/src/test/java/org/generationcp/middleware/dao/dms/DmsProjectDaoIntegrationTest.java index e7fba8c93b..9b36511efb 100644 --- a/src/test/java/org/generationcp/middleware/dao/dms/DmsProjectDaoIntegrationTest.java +++ b/src/test/java/org/generationcp/middleware/dao/dms/DmsProjectDaoIntegrationTest.java @@ -13,6 +13,7 @@ import org.generationcp.middleware.data.initializer.GermplasmTestDataInitializer; import org.generationcp.middleware.data.initializer.SampleListTestDataInitializer; import org.generationcp.middleware.data.initializer.SampleTestDataInitializer; +import org.generationcp.middleware.domain.dms.DatasetBasicDTO; import org.generationcp.middleware.domain.dms.DatasetDTO; import org.generationcp.middleware.domain.dms.DatasetReference; import org.generationcp.middleware.domain.etl.MeasurementVariable; @@ -27,8 +28,6 @@ import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.pojos.dms.ExperimentProperty; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; import org.generationcp.middleware.pojos.dms.StockModel; import org.generationcp.middleware.pojos.dms.StudyType; import org.generationcp.middleware.pojos.workbench.Project; @@ -53,10 +52,6 @@ public class DmsProjectDaoIntegrationTest extends IntegrationTestBase { private ExperimentPropertyDao experimentPropertyDao; - private GeolocationDao geolocationDao; - - private GeolocationPropertyDao geolocPropDao; - private ExperimentDao experimentDao; private StockDao stockDao; @@ -86,16 +81,6 @@ public void setUp() { this.experimentPropertyDao = new ExperimentPropertyDao(); this.experimentPropertyDao.setSession(this.sessionProvder.getSession()); - if (this.geolocationDao == null) { - this.geolocationDao = new GeolocationDao(); - this.geolocationDao.setSession(this.sessionProvder.getSession()); - } - - if (this.geolocPropDao == null) { - this.geolocPropDao = new GeolocationPropertyDao(); - this.geolocPropDao.setSession(this.sessionProvder.getSession()); - } - if (this.germplasmDao == null) { this.germplasmDao = new GermplasmDAO(); this.germplasmDao.setSession(this.sessionProvder.getSession()); @@ -157,15 +142,18 @@ public void setUp() { @Test public void testGetDatasetInstances() { - final Integer env1 = this.createEnvironmentData("1", 1, Optional.absent(), Optional.of(1)); - final Integer env2 = this.createEnvironmentData("2", 2, Optional.absent(), Optional.of(2)); - final String customLocation = RandomStringUtils.randomAlphabetic(10); - final Integer env3 = this.createEnvironmentData("3", 3, Optional.of(customLocation), Optional.absent()); - final List instances = this.dmsProjectDao.getDatasetInstances(this.study.getProjectId()); + final DmsProject summaryDataset = this.testDataInitializer + .createDmsProject("Summary Dataset", "Summary Dataset-Description", this.study, this.study, DatasetTypeEnum.SUMMARY_DATA); + final ExperimentModel instanceModel1 = this.testDataInitializer.createInstanceExperimentModel(summaryDataset, 1, "1"); + this.testDataInitializer.addExperimentProp(instanceModel1, TermId.BLOCK_ID.getId(), "1", 2); + final ExperimentModel instanceModel2= this.testDataInitializer.createInstanceExperimentModel(summaryDataset, 2, "2"); + this.testDataInitializer.addExperimentProp(instanceModel2, TermId.BLOCK_ID.getId(), "1", 2); + final ExperimentModel instanceModel3 = this.testDataInitializer.createInstanceExperimentModel(summaryDataset, 3, "3"); + final List instances = this.dmsProjectDao.getDatasetInstances(summaryDataset.getProjectId(), new DatasetType( DatasetTypeEnum.SUMMARY_DATA.getId())); Assert.assertEquals(3, instances.size()); final StudyInstance instance1 = instances.get(0); - Assert.assertEquals(env1.intValue(), instance1.getInstanceDbId()); + Assert.assertEquals(instanceModel1.getNdExperimentId().intValue(), instance1.getExperimentId()); Assert.assertEquals(1, instance1.getInstanceNumber()); Assert.assertEquals("Afghanistan", instance1.getLocationName()); Assert.assertEquals("AFG", instance1.getLocationAbbreviation()); @@ -173,7 +161,7 @@ public void testGetDatasetInstances() { Assert.assertTrue(instance1.isHasFieldmap()); final StudyInstance instance2 = instances.get(1); - Assert.assertEquals(env2.intValue(), instance2.getInstanceDbId()); + Assert.assertEquals(instanceModel2.getNdExperimentId().intValue(), instance2.getExperimentId()); Assert.assertEquals(2, instance2.getInstanceNumber()); Assert.assertEquals("Albania", instance2.getLocationName()); Assert.assertEquals("ALB", instance2.getLocationAbbreviation()); @@ -181,11 +169,11 @@ public void testGetDatasetInstances() { Assert.assertTrue(instance2.isHasFieldmap()); final StudyInstance instance3 = instances.get(2); - Assert.assertEquals(env3.intValue(), instance3.getInstanceDbId()); + Assert.assertEquals(instanceModel3.getNdExperimentId().intValue(), instance3.getExperimentId()); Assert.assertEquals(3, instance3.getInstanceNumber()); Assert.assertEquals("Algeria", instance3.getLocationName()); Assert.assertEquals("DZA", instance3.getLocationAbbreviation()); - Assert.assertEquals(customLocation, instance3.getCustomLocationAbbreviation()); + Assert.assertNull(instance3.getCustomLocationAbbreviation()); Assert.assertFalse(instance3.isHasFieldmap()); } @@ -220,12 +208,7 @@ public void testGetProjectIdByStudyDbId() { final DmsProject summary = this.createDataset(studyName + " - Summary Dataset", programUUID, DatasetTypeEnum.SUMMARY_DATA.getId(), study, study); - final Geolocation geolocation = new Geolocation(); - geolocation.setDescription("1"); - this.geolocationDao.saveOrUpdate(geolocation); - final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(geolocation); experimentModel.setTypeId(TermId.SUMMARY_EXPERIMENT.getId()); experimentModel.setProject(summary); this.experimentDao.saveOrUpdate(experimentModel); @@ -233,9 +216,9 @@ public void testGetProjectIdByStudyDbId() { // Need to flush session to sync with underlying database before querying this.sessionProvder.getSessionFactory().getCurrentSession().flush(); - final Integer result = this.dmsProjectDao.getProjectIdByStudyDbId(geolocation.getLocationId()); - Assert.assertEquals(study.getProjectId(), result); - + // TODO IBP-3389 Fix assertions +// final Integer result = this.dmsProjectDao.getProjectIdByStudyDbId(geolocation.getLocationId()); +// Assert.assertEquals(study.getProjectId(), result); } @Test @@ -247,7 +230,7 @@ public void testGetDataset() { final DmsProject summary = this.createDataset(studyName + " - Summary Dataset", programUUID, DatasetTypeEnum.SUMMARY_DATA.getId(), study, study); - final DatasetDTO retrievedProject = this.dmsProjectDao.getDataset(summary.getProjectId()); + final DatasetBasicDTO retrievedProject = this.dmsProjectDao.getDataset(summary.getProjectId()); Assert.assertNotNull(retrievedProject); Assert.assertEquals(summary.getName(), retrievedProject.getName()); Assert.assertEquals(summary.getDatasetType().getDatasetTypeId(), retrievedProject.getDatasetTypeId()); @@ -280,10 +263,6 @@ public void testGetDatasetOfSampleList() { final WorkbenchUser user = this.testDataInitializer.createUserForTesting(); final ExperimentModel experimentModel = new ExperimentModel(); - final Geolocation geolocation = new Geolocation(); - this.geolocationDao.saveOrUpdate(geolocation); - - experimentModel.setGeoLocation(geolocation); experimentModel.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experimentModel.setProject(plot); experimentModel.setObservationUnitNo(1); @@ -403,15 +382,15 @@ public void testGetStudyDetails() { } @Test - public void testGetStudyMetadataForGeolocationId() { - final DmsProject plot = - this.createDataset(this.study.getName() + " - Plot Dataset", this.study.getProgramUUID(), DatasetTypeEnum.PLOT_DATA.getId(), + public void testGetStudyMetadataForEnvironmentId() { + final DmsProject summary = + this.createDataset(this.study.getName() + " - Summary Dataset", this.study.getProgramUUID(), DatasetTypeEnum.SUMMARY_DATA.getId(), study, study); - final Integer locationId = 3; - final Integer envId = this.createEnvironmentData(plot, "1", locationId, Optional.absent(), Optional.absent()); - final StudyMetadata studyMetadata = this.dmsProjectDao.getStudyMetadataForGeolocationId(envId); + final Integer locationId = 1; + final Integer instanceId = this.testDataInitializer.createInstanceExperimentModel(summary, 1, "1").getNdExperimentId(); + final StudyMetadata studyMetadata = this.dmsProjectDao.getStudyMetadataForEnvironmentId(instanceId); Assert.assertNotNull(studyMetadata); - Assert.assertEquals(envId, studyMetadata.getStudyDbId()); + Assert.assertEquals(instanceId, studyMetadata.getStudyDbId()); Assert.assertEquals(locationId, studyMetadata.getLocationId()); Assert.assertEquals(this.study.getProjectId(), studyMetadata.getTrialDbId()); Assert.assertEquals(this.study.getProjectId(), studyMetadata.getNurseryOrTrialId()); @@ -448,8 +427,7 @@ public void testGetStudies() { this.createDataset(studyName + " - Summary Dataset", workbenchProject.getUniqueID(), DatasetTypeEnum.SUMMARY_DATA.getId(), study, study); - final Geolocation instance1 = this.testDataInitializer.createInstance(summary, locationId, 1); - this.testDataInitializer.addGeolocationProp(instance1, TermId.SEASON_VAR.getId(), String.valueOf(TermId.SEASON_DRY.getId()), 1); + this.testDataInitializer.createInstanceExperimentModel(summary, 1, "1"); final StudySearchFilter studySearchFilter = new StudySearchFilter(); final Long count = (Long) this.dmsProjectDao.countStudies(studySearchFilter); @@ -468,16 +446,19 @@ public void testGetStudiesWithStudyFilter() { // Afghanistan location final String locationId = "1"; final DmsProject study = this.createProject(studyName, workbenchProject.getUniqueID(), true); + final DmsProject plot = + this.createDataset(studyName + " - Plot Dataset", workbenchProject.getUniqueID(), DatasetTypeEnum.PLOT_DATA.getId(), + study, study); final DmsProject summary = this.createDataset(studyName + " - Summary Dataset", workbenchProject.getUniqueID(), DatasetTypeEnum.SUMMARY_DATA.getId(), study, study); - final Geolocation instance1 = this.testDataInitializer.createInstance(summary, locationId, 1); - this.testDataInitializer.addGeolocationProp(instance1, TermId.SEASON_VAR.getId(), String.valueOf(TermId.SEASON_DRY.getId()), 1); + final ExperimentModel instance = this.testDataInitializer.createInstanceExperimentModel(summary, 1, locationId); + this.testDataInitializer.addExperimentProp(instance, TermId.SEASON_VAR.getId(), String.valueOf(TermId.SEASON_DRY.getId()), 2); final StudySearchFilter studySearchFilter = new StudySearchFilter(); studySearchFilter.setTrialDbId(study.getProjectId().toString()); - studySearchFilter.setStudyDbId(String.valueOf(instance1.getLocationId())); + studySearchFilter.setStudyDbId(String.valueOf(instance.getObservationUnitNo())); studySearchFilter.setLocationDbId(locationId); studySearchFilter.setStudyTypeDbId(String.valueOf(STUDY_TYPE_ID)); studySearchFilter.setSeasonDbId(String.valueOf(TermId.SEASON_DRY.getId())); @@ -497,7 +478,7 @@ public void testGetStudiesWithStudyFilter() { Assert.assertEquals(study.getEndDate(), dateFormat.format(studyDto.getEndDate())); Assert.assertEquals(String.valueOf(study.getStudyType().getStudyTypeId()), studyDto.getStudyTypeDbId()); Assert.assertEquals(study.getStudyType().getLabel(), studyDto.getStudyTypeName()); - Assert.assertEquals(String.valueOf(instance1.getLocationId()), studyDto.getStudyDbId()); + Assert.assertEquals(String.valueOf(instance.getObservationUnitNo()), studyDto.getStudyDbId()); Assert.assertEquals(study.getName() + " Environment Number 1", studyDto.getStudyName()); Assert.assertEquals("true", studyDto.getActive()); Assert.assertEquals("1", studyDto.getLocationDbId()); @@ -547,65 +528,4 @@ private DmsProject createDataset(final String name, final String programUUID, fi return dataset; } - private Integer createEnvironmentData( - final String instanceNumber, final Integer locationId, final Optional customAbbev, final Optional blockId) { - return this.createEnvironmentData(this.study, instanceNumber, locationId, customAbbev, blockId); - } - - private Integer createEnvironmentData(final DmsProject project, - final String instanceNumber, final Integer locationId, final Optional customAbbev, final Optional blockId) { - final Geolocation geolocation = new Geolocation(); - geolocation.setDescription(instanceNumber); - this.geolocationDao.saveOrUpdate(geolocation); - - final GeolocationProperty prop = new GeolocationProperty(); - prop.setGeolocation(geolocation); - prop.setType(TermId.LOCATION_ID.getId()); - prop.setRank(1); - prop.setValue(locationId.toString()); - this.geolocPropDao.save(prop); - - if (customAbbev.isPresent()) { - final GeolocationProperty prop2 = new GeolocationProperty(); - prop2.setGeolocation(geolocation); - prop2.setType(TermId.LOCATION_ABBR.getId()); - prop2.setRank(2); - prop2.setValue(customAbbev.get()); - this.geolocPropDao.save(prop2); - } - - if (blockId.isPresent()) { - final GeolocationProperty prop3 = new GeolocationProperty(); - prop3.setGeolocation(geolocation); - prop3.setType(TermId.BLOCK_ID.getId()); - prop3.setRank(3); - prop3.setValue(blockId.get().toString()); - this.geolocPropDao.save(prop3); - } - - for (int i = 1; i < NO_OF_GERMPLASM + 1; i++) { - final Germplasm germplasm = GermplasmTestDataInitializer.createGermplasm(1); - germplasm.setGid(null); - this.germplasmDao.save(germplasm); - - final StockModel stockModel = new StockModel(); - stockModel.setName("Germplasm " + i); - stockModel.setIsObsolete(false); - stockModel.setTypeId(TermId.ENTRY_CODE.getId()); - stockModel.setUniqueName(String.valueOf(i)); - stockModel.setGermplasm(germplasm); - this.stockDao.saveOrUpdate(stockModel); - - final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(geolocation); - experimentModel.setTypeId(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()); - experimentModel.setObsUnitId(RandomStringUtils.randomAlphabetic(13)); - experimentModel.setProject(project); - experimentModel.setStock(stockModel); - this.experimentDao.saveOrUpdate(experimentModel); - } - - return geolocation.getLocationId(); - } - } diff --git a/src/test/java/org/generationcp/middleware/dao/dms/ExperimentDaoIntegrationTest.java b/src/test/java/org/generationcp/middleware/dao/dms/ExperimentDaoIntegrationTest.java index 9c042f1e8d..4981287673 100644 --- a/src/test/java/org/generationcp/middleware/dao/dms/ExperimentDaoIntegrationTest.java +++ b/src/test/java/org/generationcp/middleware/dao/dms/ExperimentDaoIntegrationTest.java @@ -11,7 +11,6 @@ import org.generationcp.middleware.pojos.SampleList; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.oms.CVTerm; import org.generationcp.middleware.pojos.workbench.WorkbenchUser; import org.generationcp.middleware.utils.test.IntegrationTestDataInitializer; @@ -37,6 +36,7 @@ public class ExperimentDaoIntegrationTest extends IntegrationTestBase { private IntegrationTestDataInitializer testDataInitializer; private DmsProject study; + private DmsProject summary; private DmsProject plot; @Before @@ -51,13 +51,14 @@ public void setUp() { this.study = this.testDataInitializer.createDmsProject("Study1", "Study-Description", null, this.dmsProjectDao.getById(1), null); this.plot = this.testDataInitializer .createDmsProject("Plot Dataset", "Plot Dataset-Description", this.study, this.study, DatasetTypeEnum.PLOT_DATA); + this.summary = this.testDataInitializer + .createDmsProject("Summary Dataset", "Summary Dataset-Description", this.study, this.study, DatasetTypeEnum.SUMMARY_DATA); } @Test public void testSaveOrUpdate() { - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); - final List experimentModels = this.testDataInitializer.createTestExperiments(this.plot, null, geolocation, 5); + final List experimentModels = this.testDataInitializer.createTestExperiments(this.plot, null, null, 5); // Verify that new experiments have auto-generated UUIDs as values for obs_unit_id for (final ExperimentModel experiment : experimentModels) { @@ -69,13 +70,11 @@ public void testSaveOrUpdate() { @Test public void testSaveOrUpdateWithCustomObsUnitId() { - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); final ExperimentModel existingExperiment = - this.testDataInitializer.createTestExperiment(this.plot, geolocation, TermId.PLOT_EXPERIMENT.getId(), null, null); + this.testDataInitializer.createTestExperiment(this.plot, null, TermId.PLOT_EXPERIMENT.getId(), null, null); // Save a new experiment final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(existingExperiment.getGeoLocation()); experimentModel.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experimentModel.setProject(this.study); experimentModel.setStock(existingExperiment.getStock()); @@ -91,13 +90,11 @@ public void testSaveOrUpdateWithCustomObsUnitId() { @Test public void testSave() { - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); final ExperimentModel existingExperiment = - this.testDataInitializer.createTestExperiment(this.plot, geolocation, TermId.PLOT_EXPERIMENT.getId(), null, null); + this.testDataInitializer.createTestExperiment(this.plot, null, TermId.PLOT_EXPERIMENT.getId(), null, null); // Save a new experiment final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(existingExperiment.getGeoLocation()); experimentModel.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experimentModel.setProject(this.study); experimentModel.setStock(existingExperiment.getStock()); @@ -119,12 +116,11 @@ public void testGetValuesFromObservations() { DatasetTypeEnum.PLANT_SUBOBSERVATIONS); this.testDataInitializer.addProjectProp(plantSubObsDataset, 8206, observationUnitVariableName, VariableType.OBSERVATION_UNIT, "", 1); - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); final ExperimentModel plotExperimentModel = - this.testDataInitializer.createTestExperiment(this.plot, geolocation, TermId.PLOT_EXPERIMENT.getId(), null, null); + this.testDataInitializer.createTestExperiment(this.plot, null, TermId.PLOT_EXPERIMENT.getId(), null, null); final List subObsExperimentsInstance = this.testDataInitializer - .createTestExperiments(plantSubObsDataset, plotExperimentModel, geolocation, noOfSubObservationExperiment); + .createTestExperiments(plantSubObsDataset, plotExperimentModel, null, noOfSubObservationExperiment); final CVTerm trait1 = this.testDataInitializer.createTrait(traitName); this.testDataInitializer.addPhenotypes(subObsExperimentsInstance, trait1.getCvTermId(), RandomStringUtils.randomNumeric(5)); @@ -133,7 +129,8 @@ public void testGetValuesFromObservations() { this.sessionProvder.getSession().flush(); - Map>> map = this.experimentDao.getValuesFromObservations(study.getProjectId(), Lists.newArrayList(DatasetTypeEnum.PLOT_DATA.getId(), DatasetTypeEnum.PLANT_SUBOBSERVATIONS.getId()), inputVariableDatasetMap); + final Map>> map = this.experimentDao.getValuesFromObservations( + this.study.getProjectId(), Lists.newArrayList(DatasetTypeEnum.PLOT_DATA.getId(), DatasetTypeEnum.PLANT_SUBOBSERVATIONS.getId()), inputVariableDatasetMap); Assert.assertNotNull(map.get(plotExperimentModel.getNdExperimentId())); Assert.assertNotNull(map.get(plotExperimentModel.getNdExperimentId()).get(trait1.getCvTermId().toString())); @@ -142,13 +139,11 @@ public void testGetValuesFromObservations() { @Test public void testSaveWithCustomObsUnitId() { - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); final ExperimentModel existingExperiment = - this.testDataInitializer.createTestExperiment(this.plot, geolocation, TermId.PLOT_EXPERIMENT.getId(), null, null); + this.testDataInitializer.createTestExperiment(this.plot, null, TermId.PLOT_EXPERIMENT.getId(), null, null); // Save a new experiment final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(existingExperiment.getGeoLocation()); experimentModel.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experimentModel.setProject(this.study); experimentModel.setStock(existingExperiment.getStock()); @@ -163,9 +158,8 @@ public void testSaveWithCustomObsUnitId() { @Test public void testIsValidExperiment() { - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation(GEOLOCATION_DESCRIPTION, 101); final ExperimentModel experimentModel = - this.testDataInitializer.createTestExperiment(this.plot, geolocation, TermId.PLOT_EXPERIMENT.getId(), null, null); + this.testDataInitializer.createTestExperiment(this.plot, null, TermId.PLOT_EXPERIMENT.getId(), null, null); final Integer validExperimentId = experimentModel.getNdExperimentId(); Assert.assertFalse(this.experimentDao.isValidExperiment(this.study.getProjectId(), validExperimentId)); @@ -175,8 +169,8 @@ public void testIsValidExperiment() { @Test public void testCountObservationsPerInstance() { - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation(GEOLOCATION_DESCRIPTION, 101); - this.testDataInitializer.createTestExperiments(this.plot, null, geolocation, 10); + final ExperimentModel instance = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "1"); + this.testDataInitializer.createTestExperiments(this.plot, instance, null, 10); final Map result = this.experimentDao.countObservationsPerInstance(this.plot.getProjectId()); assertEquals(result.get(GEOLOCATION_DESCRIPTION), Long.valueOf(10)); } @@ -184,8 +178,7 @@ public void testCountObservationsPerInstance() { @Test public void testGetExperimentSamplesDTOMap() { - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); - final List experimentModels = this.testDataInitializer.createTestExperiments(this.plot, null, geolocation, 1); + final List experimentModels = this.testDataInitializer.createTestExperiments(this.plot, null, null, 1); final WorkbenchUser user = this.testDataInitializer.createUserForTesting(); final SampleList sampleList = this.testDataInitializer.createTestSampleList("MyList", user.getUserid()); @@ -210,39 +203,12 @@ public void testGetLocationIdsOfStudy() { this.testDataInitializer .createDmsProject("Summary Dataset", "Summary Dataset-Description", someStudy, someStudy, DatasetTypeEnum.SUMMARY_DATA); - final Geolocation instance1 = this.testDataInitializer.createTestGeolocation("1", 101); - final Geolocation instance2 = this.testDataInitializer.createTestGeolocation("2", 102); - this.testDataInitializer.createTestExperiment(someSummary, instance1, TermId.SUMMARY_EXPERIMENT.getId(), "1", null); - this.testDataInitializer.createTestExperiment(someSummary, instance2, TermId.SUMMARY_EXPERIMENT.getId(), "2", null); + final ExperimentModel instance1 = this.testDataInitializer.createInstanceExperimentModel(someSummary, 1, "1"); + final ExperimentModel instance2 = this.testDataInitializer.createInstanceExperimentModel(someSummary, 2, "2"); - final List instanceIds = this.experimentDao.getLocationIdsOfStudy(someStudy.getProjectId()); - Assert.assertTrue(instanceIds.contains(instance1.getLocationId())); - Assert.assertTrue(instanceIds.contains(instance2.getLocationId())); - - } - - @Test - public void testGetLocationIdsOfStudyWithFieldmap() { - - final DmsProject someStudy = this.testDataInitializer - .createDmsProject("Study1", "Study-Description", null, this.dmsProjectDao.getById(1), null); - final DmsProject someSummary = - this.testDataInitializer - .createDmsProject("Summary Dataset", "Summary Dataset-Description", someStudy, someStudy, DatasetTypeEnum.SUMMARY_DATA); - - final Geolocation instance1 = this.testDataInitializer.createTestGeolocation("1", 101); - final Geolocation instance2 = this.testDataInitializer.createTestGeolocation("2", 102); - final ExperimentModel instance1Experiment = - this.testDataInitializer.createTestExperiment(someSummary, instance1, TermId.SUMMARY_EXPERIMENT.getId(), "1", null); - this.testDataInitializer.createTestExperiment(someSummary, instance2, TermId.SUMMARY_EXPERIMENT.getId(), "2", null); - - // Add fieldmap variable to istance 1 - this.testDataInitializer.addExperimentProp(instance1Experiment, TermId.COLUMN_NO.getId(), "1", 1); - - final List instanceIds = this.experimentDao.getLocationIdsOfStudyWithFieldmap(someStudy.getProjectId()); - // Only instance 1 has fieldmap. - Assert.assertTrue(instanceIds.contains(instance1.getLocationId())); - Assert.assertFalse(instanceIds.contains(instance2.getLocationId())); + final List instanceIds = this.experimentDao.getInstanceIds(someStudy.getProjectId()); + Assert.assertTrue(instanceIds.contains(instance1.getNdExperimentId())); + Assert.assertTrue(instanceIds.contains(instance2.getNdExperimentId())); } diff --git a/src/test/java/org/generationcp/middleware/dao/dms/ExperimentDaoTest.java b/src/test/java/org/generationcp/middleware/dao/dms/ExperimentDaoTest.java index 49b83171f0..905a2b2122 100644 --- a/src/test/java/org/generationcp/middleware/dao/dms/ExperimentDaoTest.java +++ b/src/test/java/org/generationcp/middleware/dao/dms/ExperimentDaoTest.java @@ -102,13 +102,13 @@ public void testGetSampledPlants_ThrowsException() { @Test public void testGetEnvironmentsOfGermplasms() { this.setupEnvironmentsOfGermplasmMocks(); - final Set gids = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5)); + final Set gids = new HashSet<>(Arrays.asList(1, 2, 3)); final Map> environmentsMap = - this.experimentDao.getEnvironmentsOfGermplasms(gids, ExperimentDaoTest.PROGRAM_UUID); + this.experimentDao.getStudyInstancesForGermplasm(gids, ExperimentDaoTest.PROGRAM_UUID); - final String expectedSql = "SELECT DISTINCT s.dbxref_id, e.nd_geolocation_id " + "FROM nd_experiment e " - + " INNER JOIN stock s ON e.stock_id = s.stock_id AND s.dbxref_id IN (:gids) " - + "INNER JOIN project p ON p.project_id = e.project_id and p.program_uuid = :programUUID " + " ORDER BY s.dbxref_id "; + final String expectedSql = "SELECT DISTINCT s.dbxref_id, e.parent_id FROM nd_experiment e " + + "INNER JOIN stock s ON e.stock_id = s.stock_id AND s.dbxref_id IN (:gids) " + + "INNER JOIN project p ON p.project_id = e.project_id and p.program_uuid = :programUUID ORDER BY s.dbxref_id "; final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.mockSession).createSQLQuery(sqlCaptor.capture()); Assert.assertEquals(expectedSql, sqlCaptor.getValue()); @@ -124,11 +124,11 @@ public void testGetEnvironmentsOfGermplasms() { @Test public void testGetEnvironmentsOfGermplasmsWithNullProgramUUID() { this.setupEnvironmentsOfGermplasmMocks(); - final Set gids = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5)); - final Map> environmentsMap = this.experimentDao.getEnvironmentsOfGermplasms(gids, null); + final Set gids = new HashSet<>(Arrays.asList(1, 2, 3)); + final Map> environmentsMap = this.experimentDao.getStudyInstancesForGermplasm(gids, null); - final String expectedSql = "SELECT DISTINCT s.dbxref_id, e.nd_geolocation_id " + "FROM nd_experiment e " - + " INNER JOIN stock s ON e.stock_id = s.stock_id AND s.dbxref_id IN (:gids) " + " ORDER BY s.dbxref_id "; + final String expectedSql = "SELECT DISTINCT s.dbxref_id, e.parent_id FROM nd_experiment e" + + " INNER JOIN stock s ON e.stock_id = s.stock_id AND s.dbxref_id IN (:gids) ORDER BY s.dbxref_id "; final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.mockSession).createSQLQuery(sqlCaptor.capture()); Assert.assertEquals(expectedSql, sqlCaptor.getValue()); @@ -162,7 +162,7 @@ private void setupEnvironmentsOfGermplasmMocks() { public void testGetEnvironmentsOfGermplasmsWithNoGids() { final Set gids = new HashSet<>(); final Map> environmentsMap = - this.experimentDao.getEnvironmentsOfGermplasms(gids, ExperimentDaoTest.PROGRAM_UUID); + this.experimentDao.getStudyInstancesForGermplasm(gids, ExperimentDaoTest.PROGRAM_UUID); Mockito.verify(this.mockSession, Mockito.never()).createSQLQuery(ArgumentMatchers.anyString()); Assert.assertTrue(environmentsMap.isEmpty()); @@ -191,22 +191,6 @@ public void testGetExperimentIdsByStockIds() { Assert.assertEquals(this.dummyIds, returnedIds); } - @Test - public void testGetExperimentIdByLocationIdStockId() { - final int expectedValue = 1111; - Mockito.doReturn(expectedValue).when(this.mockQuery).uniqueResult(); - final int projectId = 2022; - final int locationId = 3033; - final int stockId = 4044; - final int experimentId = this.experimentDao.getExperimentIdByLocationIdStockId(projectId, locationId, stockId); - final String expectedSql = "SELECT exp.nd_experiment_id " + "FROM nd_experiment exp " + " WHERE exp.project_id = " + projectId - + " AND exp.nd_geolocation_id = " + locationId + " AND exp.type_id = 1170 " + " AND exp.stock_id = " + stockId; - final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); - Mockito.verify(this.mockSession).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql, sqlCaptor.getValue()); - Assert.assertEquals(expectedValue, experimentId); - } - @Test public void testDeleteExperimentsByIds() { final List experimentIds = Arrays.asList(11, 22, 33); @@ -232,13 +216,21 @@ public void testDeleteExperimentsForDataset() { final int dataset = 1234; this.experimentDao.deleteExperimentsForDataset(dataset); - Mockito.verify(this.mockSession).flush(); - final String deletePhenotypeSql = "DELETE pheno FROM nd_experiment e" - + " INNER JOIN nd_geolocation g on g.nd_geolocation_id = e.nd_geolocation_id" - + " LEFT JOIN phenotype pheno ON pheno.nd_experiment_id = e.nd_experiment_id" + " WHERE e.project_id IN (:datasetIds) "; - final String deleteExperimentSql = "DELETE e, eprop " + "FROM nd_experiment e " - + " INNER JOIN nd_geolocation g on g.nd_geolocation_id = e.nd_geolocation_id" - + " LEFT JOIN nd_experimentprop eprop ON eprop.nd_experiment_id = e.nd_experiment_id " + " WHERE e.project_id IN (:datasetIds) "; + final String deletePhenotypeSql = "DELETE pheno FROM phenotype pheno" + + " INNER JOIN nd_experiment e ON pheno.nd_experiment_id = e.nd_experiment_id" + + " LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = e.parent_id" + + " INNER JOIN project pr ON pr.project_id = e.project_id" + + " INNER JOIN project env_ds ON env_ds.study_id = pr.study_id AND env_ds.dataset_type_id = 3" + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = 1020" + + " AND (e.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id or e.nd_experiment_id = env.nd_experiment_id)" + + " WHERE e.project_id IN (:datasetIds) "; + final String deleteExperimentSql = "DELETE eprop, e FROM nd_experiment e" + + " LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = e.parent_id" + + " INNER JOIN project pr ON pr.project_id = e.project_id" + + " INNER JOIN project env_ds ON env_ds.study_id = pr.study_id AND env_ds.dataset_type_id = 3" + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = 1020" + + " AND (e.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id or e.nd_experiment_id = env.nd_experiment_id)" + + " LEFT JOIN nd_experimentprop eprop ON eprop.nd_experiment_id = e.nd_experiment_id WHERE e.project_id IN (:datasetIds) "; final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.mockSession, Mockito.times(2)).createSQLQuery(sqlCaptor.capture()); final List queries = sqlCaptor.getAllValues(); @@ -251,65 +243,70 @@ public void testDeleteExperimentsForDataset() { @Test public void testDeleteTrialExperimentsOfStudy() { final int studyId = 1234; - this.experimentDao.deleteTrialExperimentsOfStudy(studyId); - - Mockito.verify(this.mockSession).flush(); - final String deletePhenotypeSql = "DELETE pheno FROM nd_experiment e" - + " LEFT JOIN phenotype pheno ON pheno.nd_experiment_id = e.nd_experiment_id" + " WHERE e.project_id = :datasetId "; - final String deleteExperimentSql = "DELETE g, gp, e, eprop " + "FROM nd_geolocation g " - + "LEFT JOIN nd_geolocationprop gp on g.nd_geolocation_id = gp.nd_geolocation_id " - + "LEFT join nd_experiment e on g.nd_geolocation_id = e.nd_geolocation_id " - + "LEFT JOIN nd_experimentprop eprop ON eprop.nd_experiment_id = e.nd_experiment_id " + "WHERE e.project_id = :datasetId "; + this.experimentDao.deleteExperimentsForDataset(studyId); + + final String deletePhenotypeSql = "DELETE pheno FROM phenotype pheno" + + " INNER JOIN nd_experiment e ON pheno.nd_experiment_id = e.nd_experiment_id" + + " LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = e.parent_id INNER JOIN project pr ON pr.project_id = e.project_id" + + " INNER JOIN project env_ds ON env_ds.study_id = pr.study_id AND env_ds.dataset_type_id = 3" + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = 1020" + + " AND (e.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id or e.nd_experiment_id = env.nd_experiment_id)" + + " WHERE e.project_id IN (:datasetIds) "; + final String deleteExperimentSql = "DELETE eprop, e FROM nd_experiment e" + + " LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = e.parent_id" + + " INNER JOIN project pr ON pr.project_id = e.project_id" + + " INNER JOIN project env_ds ON env_ds.study_id = pr.study_id AND env_ds.dataset_type_id = 3" + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = 1020" + + " AND (e.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id or e.nd_experiment_id = env.nd_experiment_id)" + + " LEFT JOIN nd_experimentprop eprop ON eprop.nd_experiment_id = e.nd_experiment_id WHERE e.project_id IN (:datasetIds) "; final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.mockSession, Mockito.times(2)).createSQLQuery(sqlCaptor.capture()); final List queries = sqlCaptor.getAllValues(); Assert.assertEquals(deletePhenotypeSql, queries.get(0)); Assert.assertEquals(deleteExperimentSql, queries.get(1)); - Mockito.verify(this.mockQuery, Mockito.times(2)).setParameter("datasetId", studyId); + Mockito.verify(this.mockQuery, Mockito.times(2)).setParameterList("datasetIds", Collections.singletonList(studyId)); Mockito.verify(this.mockQuery, Mockito.times(2)).executeUpdate(); } @Test public void testGetExperiments_FirstInstance() { - final Query query = Mockito.mock(Query.class); - Mockito.when(this.mockSession.createQuery(ArgumentMatchers.anyString())).thenReturn(query); + final SQLQuery query = Mockito.mock(SQLQuery.class); + Mockito.when(this.mockSession.createSQLQuery(ArgumentMatchers.anyString())).thenReturn(query); final int projectId = 1011; final int start = 1000; final int numOfRows = 5000; this.experimentDao.getExperiments(projectId, Arrays.asList(TermId.PLOT_EXPERIMENT, TermId.SAMPLE_EXPERIMENT), start, numOfRows, true); - final String sql = "select distinct exp from ExperimentModel as exp " - + "left outer join exp.properties as plot with plot.typeId IN (8200,8380) " - + "left outer join exp.properties as rep with rep.typeId = 8210 " + "left outer join exp.stock as st " - + "where exp.project.projectId =:p_id and exp.typeId in (:type_ids) " + "and exp.geoLocation.description = 1 " - + "order by (exp.geoLocation.description * 1) ASC, " + "(plot.value * 1) ASC, " + "(rep.value * 1) ASC, " - + "(st.uniqueName * 1) ASC, " + "exp.ndExperimentId ASC"; - Mockito.verify(this.mockSession).createQuery(ArgumentMatchers.eq(sql)); + final String sql = "select distinct exp.* from nd_experiment exp inner join project pr on exp.project_id = pr.project_id inner join project env_ds on env_ds.study_id = pr.study_id and env_ds.dataset_type_id = 3 inner join nd_experiment env ON env_ds.project_id = env.project_id and env.type_id = 1020 where exp.project_id =:p_id and exp.type_id in (:type_ids) and env.observation_unit_no = 1 order by (env.observation_unit_no * 1) ASC, exp.nd_experiment_id ASC"; + final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); + Mockito.verify(this.mockSession).createSQLQuery(sqlCaptor.capture()); + Assert.assertEquals(sql, sqlCaptor.getValue()); Mockito.verify(query).setParameter("p_id", projectId); Mockito.verify(query).setParameterList("type_ids", Arrays.asList(TermId.PLOT_EXPERIMENT.getId(), TermId.SAMPLE_EXPERIMENT.getId())); Mockito.verify(query).setMaxResults(numOfRows); Mockito.verify(query).setFirstResult(start); } - + @Test public void testGetExperiments_NotFirstInstance() { - final Query query = Mockito.mock(Query.class); - Mockito.when(this.mockSession.createQuery(ArgumentMatchers.anyString())).thenReturn(query); + final SQLQuery query = Mockito.mock(SQLQuery.class); + Mockito.when(this.mockSession.createSQLQuery(ArgumentMatchers.anyString())).thenReturn(query); final int projectId = 1011; final int start = 1000; final int numOfRows = 5000; this.experimentDao.getExperiments(projectId, Arrays.asList(TermId.PLOT_EXPERIMENT, TermId.SAMPLE_EXPERIMENT), start, numOfRows, false); - final String sql = "select distinct exp from ExperimentModel as exp " - + "left outer join exp.properties as plot with plot.typeId IN (8200,8380) " - + "left outer join exp.properties as rep with rep.typeId = 8210 " + "left outer join exp.stock as st " - + "where exp.project.projectId =:p_id and exp.typeId in (:type_ids) " - + "order by (exp.geoLocation.description * 1) ASC, " + "(plot.value * 1) ASC, " + "(rep.value * 1) ASC, " - + "(st.uniqueName * 1) ASC, " + "exp.ndExperimentId ASC"; - Mockito.verify(this.mockSession).createQuery(ArgumentMatchers.eq(sql)); + final String sql = "select distinct exp.* from nd_experiment exp" + + " inner join project pr on exp.project_id = pr.project_id" + + " inner join project env_ds on env_ds.study_id = pr.study_id" + + " and env_ds.dataset_type_id = 3 inner join nd_experiment env ON env_ds.project_id = env.project_id and env.type_id = 1020" + + " where exp.project_id =:p_id and exp.type_id in (:type_ids) order by (env.observation_unit_no * 1) ASC, exp.nd_experiment_id ASC"; + final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); + Mockito.verify(this.mockSession).createSQLQuery(sqlCaptor.capture()); + Assert.assertEquals(sql, sqlCaptor.getValue()); Mockito.verify(query).setParameter("p_id", projectId); Mockito.verify(query).setParameterList("type_ids", Arrays.asList(TermId.PLOT_EXPERIMENT.getId(), TermId.SAMPLE_EXPERIMENT.getId())); @@ -330,7 +327,11 @@ public void testIsAreAllInstancesExistInDataset() { Assert.assertTrue(this.experimentDao.areAllInstancesExistInDataset(datasetId, instanceIds)); Mockito.verify(this.mockSession).createSQLQuery( - "SELECT COUNT(DISTINCT e.nd_geolocation_id) FROM nd_experiment e WHERE e.project_id = :datasetId and e.nd_geolocation_id in (:instanceIds)"); + "SELECT COUNT(DISTINCT env.nd_experiment_id) FROM nd_experiment e" + + " INNER JOIN project pr ON pr.project_id = e.project_id" + + " INNER JOIN project env_ds ON env_ds.study_id = pr.study_id AND env_ds.dataset_type_id = 3" + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = 1020" + + " WHERE e.project_id = :datasetId and env.nd_experiment_id in (:instanceIds)"); Mockito.verify(query).setParameter("datasetId", datasetId); Mockito.verify(query).setParameterList("instanceIds", instanceIds); } diff --git a/src/test/java/org/generationcp/middleware/dao/dms/ExperimentPropertyDaoIntegrationTest.java b/src/test/java/org/generationcp/middleware/dao/dms/ExperimentPropertyDaoIntegrationTest.java index 882edee664..199094fcc5 100644 --- a/src/test/java/org/generationcp/middleware/dao/dms/ExperimentPropertyDaoIntegrationTest.java +++ b/src/test/java/org/generationcp/middleware/dao/dms/ExperimentPropertyDaoIntegrationTest.java @@ -17,7 +17,6 @@ import org.generationcp.middleware.operation.saver.ExperimentModelSaver; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.workbench.CropType; import org.generationcp.middleware.utils.test.IntegrationTestDataInitializer; import org.junit.Before; @@ -38,6 +37,7 @@ public class ExperimentPropertyDaoIntegrationTest extends IntegrationTestBase { private DmsProject study; private DmsProject plot; + private DmsProject summary; @Before public void setUp() { @@ -52,6 +52,8 @@ public void setUp() { this.study = this.testDataInitializer.createDmsProject("Study1", "Study-Description", null, this.dmsProjectDao.getById(1), null); this.plot = this.testDataInitializer .createDmsProject("Plot Dataset", "Plot Dataset-Description", this.study, this.study, DatasetTypeEnum.PLOT_DATA); + this.summary = this.testDataInitializer + .createDmsProject("Summary Dataset", "Summary Dataset-Description", this.study, this.study, DatasetTypeEnum.SUMMARY_DATA); } @Test @@ -63,7 +65,6 @@ public void testGetTreatmentFactorValues() { DMSVariableTestDataInitializer.createVariable(1002, "Value", DataType.NUMERIC_VARIABLE.getId(), VariableType.TREATMENT_FACTOR)); final ExperimentValues values = new ExperimentValues(); values.setVariableList(factors); - values.setLocationId(this.experimentModelSaver.createNewGeoLocation().getLocationId()); values.setGermplasmId(1); //Save the experiment this.experimentModelSaver.addOrUpdateExperiment(new CropType(), 1, ExperimentType.STUDY_INFORMATION, values); @@ -75,12 +76,12 @@ public void testGetTreatmentFactorValues() { @Test public void testGetFieldMapLabels() { - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); - this.testDataInitializer.addGeolocationProp(geolocation, TermId.SEASON_VAR.getId(), "10101", 1); - this.testDataInitializer.addGeolocationProp(geolocation, TermId.TRIAL_LOCATION.getId(), "India", 2); + final ExperimentModel instanceModel1 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "1"); + this.testDataInitializer.addExperimentProp(instanceModel1, TermId.SEASON_VAR.getId(), "10101", 1); + this.testDataInitializer.addExperimentProp(instanceModel1, TermId.TRIAL_LOCATION.getId(), "India", 2); final ExperimentModel experimentModel = - this.testDataInitializer.createTestExperiment(this.plot, geolocation, TermId.PLOT_EXPERIMENT.getId(), "1", null); + this.testDataInitializer.createTestExperiment(this.plot, null, TermId.PLOT_EXPERIMENT.getId(), "1", instanceModel1); this.testDataInitializer.createTestStock(experimentModel); this.testDataInitializer.addExperimentProp(experimentModel, TermId.REP_NO.getId(), RandomStringUtils.randomNumeric(5), 2); this.testDataInitializer.addExperimentProp(experimentModel, TermId.BLOCK_NO.getId(), RandomStringUtils.randomNumeric(5), 3); @@ -115,26 +116,26 @@ public void testGetFieldMapLabels() { @Test public void testGetAllFieldMapsInBlockByTrialInstanceId() { - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); - this.testDataInitializer.addGeolocationProp(geolocation, TermId.SEASON_VAR.getId(), "10101", 1); - this.testDataInitializer.addGeolocationProp(geolocation, TermId.TRIAL_LOCATION.getId(), "India", 2); - this.testDataInitializer.addGeolocationProp(geolocation, TermId.BLOCK_ID.getId(), "1234", 3); + final ExperimentModel instanceModel1 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "1"); + this.testDataInitializer.addExperimentProp(instanceModel1, TermId.SEASON_VAR.getId(), "10101", 1); + this.testDataInitializer.addExperimentProp(instanceModel1, TermId.TRIAL_LOCATION.getId(), "India", 2); + this.testDataInitializer.addExperimentProp(instanceModel1, TermId.BLOCK_ID.getId(), "1234", 3); final ExperimentModel experimentModel = - this.testDataInitializer.createTestExperiment(this.plot, geolocation, TermId.PLOT_EXPERIMENT.getId(), "1", null); + this.testDataInitializer.createTestExperiment(this.plot, null, TermId.PLOT_EXPERIMENT.getId(), "1", instanceModel1); this.testDataInitializer.createTestStock(experimentModel); // Need to flush session to sync with underlying database before querying this.sessionProvder.getSession().flush(); final List fieldMapInfos1 = this.experimentPropertyDao - .getAllFieldMapsInBlockByTrialInstanceId(this.study.getProjectId(), geolocation.getLocationId(), 1234); + .getAllFieldMapsInBlockByTrialInstanceId(this.study.getProjectId(), instanceModel1.getNdExperimentId(), 1234); assertEquals(1, fieldMapInfos1.size()); assertEquals(1, fieldMapInfos1.get(0).getDatasets().size()); final List fieldMapInfos2 = this.experimentPropertyDao - .getAllFieldMapsInBlockByTrialInstanceId(this.study.getProjectId(), geolocation.getLocationId(), 9999); + .getAllFieldMapsInBlockByTrialInstanceId(this.study.getProjectId(), instanceModel1.getNdExperimentId(), 9999); assertEquals(0, fieldMapInfos2.size()); } diff --git a/src/test/java/org/generationcp/middleware/dao/dms/ExperimentPropertyDaoTest.java b/src/test/java/org/generationcp/middleware/dao/dms/ExperimentPropertyDaoTest.java index 7ac23b8e8f..b7be1aa39a 100644 --- a/src/test/java/org/generationcp/middleware/dao/dms/ExperimentPropertyDaoTest.java +++ b/src/test/java/org/generationcp/middleware/dao/dms/ExperimentPropertyDaoTest.java @@ -15,34 +15,38 @@ import org.generationcp.middleware.domain.oms.TermId; import org.hibernate.SQLQuery; import org.hibernate.Session; +import org.hibernate.jdbc.util.BasicFormatterImpl; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; public class ExperimentPropertyDaoTest { - + @Mock private Session mockSession; - + @Mock private SQLQuery mockQuery; private ExperimentPropertyDao dao; + final private BasicFormatterImpl formattedSQL = new BasicFormatterImpl(); + @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - + this.dao = new ExperimentPropertyDao(); this.dao.setSession(this.mockSession); - Mockito.when(this.mockSession.createSQLQuery(Matchers.anyString())).thenReturn(this.mockQuery); - Mockito.when(this.mockQuery.addScalar(Matchers.anyString())).thenReturn(this.mockQuery); + Mockito.when(this.mockSession.createSQLQuery(ArgumentMatchers.anyString())).thenReturn(this.mockQuery); + Mockito.when(this.mockQuery.addScalar(ArgumentMatchers.anyString())).thenReturn(this.mockQuery); } @Test @@ -50,64 +54,62 @@ public void setUp() throws Exception { public void testGetFieldMapLabels() { final int projectId = 112; this.dao.getFieldMapLabels(projectId); - + final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.mockSession).createSQLQuery(sqlCaptor.capture()); Assert.assertEquals(this.getFieldmapLabelsQuery(), sqlCaptor.getValue()); Mockito.verify(this.mockQuery).setParameter("projectId", projectId); } - + @Test public void testGetAllFieldMapsInBlockByTrialInstanceId_WithBlockId() { final int datasetId = 11; final int geolocationId = 22; final int blockId = 33; this.dao.getAllFieldMapsInBlockByTrialInstanceId(datasetId, geolocationId, blockId); - + final String expectedSql = this.getFieldmapsInBlockMainQuery() + " AND blk.value = :blockId ORDER BY e.nd_experiment_id ASC"; final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.mockSession).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql.replace(" ", ""), sqlCaptor.getValue().replace(" ", "")); + Assert.assertEquals(this.formatString(expectedSql), this.formatString(sqlCaptor.getValue())); Mockito.verify(this.mockQuery).setParameter("blockId", blockId); Mockito.verify(this.mockQuery, Mockito.never()).setParameter("datasetId", datasetId); Mockito.verify(this.mockQuery, Mockito.never()).setParameter("geolocationId", geolocationId); } - + @Test public void testGetAllFieldMapsInBlockByTrialInstanceId_WithNullBlockId() { final int datasetId = 11; final int geolocationId = 22; this.dao.getAllFieldMapsInBlockByTrialInstanceId(datasetId, geolocationId, null); - + final String expectedSql = this.getFieldmapsInBlockMainQuery() + - " AND blk.value IN (SELECT DISTINCT bval.value FROM nd_geolocationprop bval " + - " INNER JOIN nd_experiment bexp ON bexp.nd_geolocation_id = bval.nd_geolocation_id " + - " AND bexp.nd_geolocation_id = :geolocationId " + + " AND blk.value IN (SELECT DISTINCT bval.value FROM nd_experimentprop bval " + + " INNER JOIN nd_experiment bexp ON bexp.parent_id = bval.nd_experiment_id " + + " AND bexp.parent_id = :instanceId " + " AND bexp.project_id = :datasetId WHERE bval.type_id = " + TermId.BLOCK_ID.getId() + ") ORDER BY e.nd_experiment_id ASC"; final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.mockSession).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql.replace(" ", ""), sqlCaptor.getValue().replace(" ", "")); - Mockito.verify(this.mockQuery, Mockito.never()).setParameter(Matchers.eq("blockId"), Matchers.any()); + Assert.assertEquals(this.formatString(expectedSql), this.formatString(sqlCaptor.getValue())); + Mockito.verify(this.mockQuery, Mockito.never()).setParameter(ArgumentMatchers.eq("blockId"), Matchers.any()); Mockito.verify(this.mockQuery).setParameter("datasetId", datasetId); - Mockito.verify(this.mockQuery).setParameter("geolocationId", geolocationId); + Mockito.verify(this.mockQuery).setParameter("instanceId", geolocationId); } - + private String getFieldmapsInBlockMainQuery() { return " SELECT p.project_id AS datasetId , p.name AS datasetName " - + " , st.name AS studyName , e.nd_geolocation_id AS geolocationId " + + " , st.name AS studyName , env.nd_experiment_id AS instanceId " + " , site.value AS siteName , siteId.value AS siteId" + " , e.nd_experiment_id AS experimentId , s.uniqueName AS entryNumber " + " , s.name AS germplasmName , epropRep.value AS rep " + " , epropPlot.value AS plotNo , row.value AS row , col.value AS col " + " , blk.value AS blockId , st.project_id AS studyId " - + " , geo.description AS trialInstance , s.dbxref_id AS gid " - + " , st.start_date as startDate , gpSeason.value as season " + + " , env.observation_unit_no AS trialInstance , s.dbxref_id AS gid " + + " , st.start_date as startDate , season.value as season " + " , epropBlock.value AS blockNo " + " , e.obs_unit_id as obsUnitId " - + " FROM nd_geolocationprop blk " - + " INNER JOIN nd_experiment e ON e.nd_geolocation_id = blk.nd_geolocation_id " - + " INNER JOIN nd_geolocation geo ON geo.nd_geolocation_id = e.nd_geolocation_id " + + " FROM nd_experiment e " + " INNER JOIN project p ON p.project_id = e.project_id " + " INNER JOIN project st ON st.project_id = p.study_id " + " INNER JOIN stock s ON e.stock_id = s.stock_id " @@ -118,19 +120,23 @@ private String getFieldmapsInBlockMainQuery() { + " INNER JOIN nd_experimentprop epropPlot ON epropPlot.nd_experiment_id = e.nd_experiment_id " + " AND epropPlot.type_id IN (" + TermId.PLOT_NO.getId()+ ", " + TermId.PLOT_NNO.getId() + ") AND epropPlot.value <> '' " - + " LEFT JOIN nd_geolocationprop site ON site.nd_geolocation_id = e.nd_geolocation_id " + + " INNER JOIN nd_experimentenv ON e.parent_id = env.nd_experiment_id AND env.type_id = " + + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + + " LEFT JOIN nd_experimentprop site ON site.nd_experiment_id=env.nd_experiment_id " + " AND site.type_id = " + TermId.TRIAL_LOCATION.getId() - + " LEFT JOIN nd_geolocationprop siteId ON siteId.nd_geolocation_id = e.nd_geolocation_id " + + " LEFT JOIN nd_experimentprop siteId ON siteId.nd_experiment_id = env.nd_experiment_id " + " AND siteId.type_id = "+ TermId.LOCATION_ID.getId() + " LEFT JOIN nd_experimentprop row ON row.nd_experiment_id = e.nd_experiment_id " + " AND row.type_id = "+ TermId.RANGE_NO.getId() + " LEFT JOIN nd_experimentprop col ON col.nd_experiment_id = e.nd_experiment_id " + " AND col.type_id = "+ TermId.COLUMN_NO.getId() - + " LEFT JOIN nd_geolocationprop gpSeason ON geo.nd_geolocation_id = gpSeason.nd_geolocation_id " - + " AND gpSeason.type_id = "+ TermId.SEASON_VAR.getId() + " " - + " WHERE blk.type_id = "+ TermId.BLOCK_ID.getId(); + + " LEFT JOIN nd_experimentpropseason " + + " ON season.nd_experiment_id = env.nd_experiment_id" + + " AND season.type_id = " + TermId.SEASON_VAR.getId() + + " INNER JOIN nd_experimentprop blk on blk.nd_experiment_id = env.nd_experiment_id " + + " AND blk.type_id = "+ TermId.BLOCK_ID.getId(); } - + private String getFieldmapLabelsQuery() { return " SELECT " + " nde.project_id AS datasetId " + @@ -193,5 +199,9 @@ private String getFieldmapLabelsQuery() { " WHERE st.project_id = :studyId" + " ORDER BY casted_trialInstance, inst.description, nde.nd_experiment_id ASC"; } + + private String formatString(final String format) { + return this.formattedSQL.format(format).replace(" ", ""); + } } diff --git a/src/test/java/org/generationcp/middleware/dao/dms/GeolocationDaoTest.java b/src/test/java/org/generationcp/middleware/dao/dms/GeolocationDaoTest.java deleted file mode 100644 index af4c455e97..0000000000 --- a/src/test/java/org/generationcp/middleware/dao/dms/GeolocationDaoTest.java +++ /dev/null @@ -1,304 +0,0 @@ -/******************************************************************************* - * - * Copyright (c) 2012, All Rights Reserved. - * - * Generation Challenge Programme (GCP) - * - * - * This software is licensed for use under the terms of the GNU General Public License (http://bit.ly/8Ztv8M) and the provisions of Part F - * of the Generation Challenge Programme Amended Consortium Agreement (http://bit.ly/KQX1nL) - * - *******************************************************************************/ - -package org.generationcp.middleware.dao.dms; - -import com.google.common.base.Function; -import com.google.common.collect.Lists; -import org.apache.commons.lang3.RandomStringUtils; -import org.generationcp.middleware.IntegrationTestBase; -import org.generationcp.middleware.dao.GermplasmDAO; -import org.generationcp.middleware.dao.oms.CVTermDao; -import org.generationcp.middleware.data.initializer.CVTermTestDataInitializer; -import org.generationcp.middleware.data.initializer.GermplasmTestDataInitializer; -import org.generationcp.middleware.domain.dms.LocationDto; -import org.generationcp.middleware.domain.dms.StudyReference; -import org.generationcp.middleware.domain.dms.TrialEnvironment; -import org.generationcp.middleware.domain.dms.TrialEnvironmentProperty; -import org.generationcp.middleware.domain.dms.TrialEnvironments; -import org.generationcp.middleware.domain.oms.CvId; -import org.generationcp.middleware.domain.oms.TermId; -import org.generationcp.middleware.enumeration.DatasetTypeEnum; -import org.generationcp.middleware.pojos.Germplasm; -import org.generationcp.middleware.pojos.dms.DatasetType; -import org.generationcp.middleware.pojos.dms.DmsProject; -import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; -import org.generationcp.middleware.pojos.dms.Phenotype; -import org.generationcp.middleware.pojos.dms.StockModel; -import org.generationcp.middleware.pojos.oms.CVTerm; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.UUID; - -public class GeolocationDaoTest extends IntegrationTestBase { - - private static final int NO_OF_GERMPLASM = 5; - public static final Integer LOCATION_ID = 9001; - - private GeolocationDao geolocationDao; - private GeolocationPropertyDao geolocationPropertyDao; - private ExperimentDao experimentDao; - private StockDao stockDao; - private GermplasmDAO germplasmDao; - private DmsProjectDao dmsProjectDao; - private CVTermDao cvTermDao; - private PhenotypeDao phenotypeDao; - - private DmsProject study; - private DmsProject dataset; - private Geolocation geolocation; - private List germplasm; - - @Before - public void setUp() throws Exception { - if (this.geolocationDao == null) { - this.geolocationDao = new GeolocationDao(); - this.geolocationDao.setSession(this.sessionProvder.getSession()); - } - - if (this.germplasmDao == null) { - this.germplasmDao = new GermplasmDAO(); - this.germplasmDao.setSession(this.sessionProvder.getSession()); - } - - if (this.experimentDao == null) { - this.experimentDao = new ExperimentDao(); - this.experimentDao.setSession(this.sessionProvder.getSession()); - } - - if (this.stockDao == null) { - this.stockDao = new StockDao(); - this.stockDao.setSession(this.sessionProvder.getSession()); - } - - if (this.dmsProjectDao == null) { - this.dmsProjectDao = new DmsProjectDao(); - this.dmsProjectDao.setSession(this.sessionProvder.getSession()); - } - - if (this.cvTermDao == null) { - this.cvTermDao = new CVTermDao(); - this.cvTermDao.setSession(this.sessionProvder.getSession()); - } - - if (this.phenotypeDao == null) { - this.phenotypeDao = new PhenotypeDao(); - this.phenotypeDao.setSession(this.sessionProvder.getSession()); - } - - if (this.geolocationPropertyDao == null) { - this.geolocationPropertyDao = new GeolocationPropertyDao(); - this.geolocationPropertyDao.setSession(this.sessionProvder.getSession()); - } - - if (this.study == null) { - this.study = this.createStudy(); - this.dataset = - this.createDataset(this.study.getName() + " - Environment Dataset", this.study.getProgramUUID(), - DatasetTypeEnum.SUMMARY_DATA.getId(), - study, study); - this.createGermplasm(); - this.geolocation = this.createEnvironmentData(this.dataset, "1", Collections.emptyList()); - } - } - - private DmsProject createStudy() { - final DmsProject study = new DmsProject(); - study.setName("Test Project " + RandomStringUtils.randomAlphanumeric(10)); - study.setDescription("Test Project"); - study.setProgramUUID(UUID.randomUUID().toString()); - this.dmsProjectDao.save(study); - return study; - } - - @Test - public void testGetStudyEnvironmentDetails() { - final Integer geolocationId = this.geolocation.getLocationId(); - final List environments = - this.geolocationDao.getTrialEnvironmentDetails(Collections.singleton(geolocationId)); - Assert.assertNotNull(environments); - Assert.assertEquals(1, environments.size()); - - final TrialEnvironment trialEnvironment = environments.get(0); - Assert.assertEquals(geolocationId.intValue(), trialEnvironment.getId()); - - final LocationDto locationDto = trialEnvironment.getLocation(); - Assert.assertEquals(LOCATION_ID, locationDto.getId()); - Assert.assertEquals("Africa Rice Centre", locationDto.getLocationName()); - - final StudyReference studyReference = trialEnvironment.getStudy(); - Assert.assertEquals(this.study.getProjectId(), studyReference.getId()); - Assert.assertEquals(this.study.getName(), studyReference.getName()); - Assert.assertEquals(this.study.getDescription(), studyReference.getDescription()); - } - - @Test - public void testGetPropertiesForStudyEnvironments() { - final CVTerm trait = CVTermTestDataInitializer.createTerm(RandomStringUtils.randomAlphanumeric(50), CvId.VARIABLES.getId()); - this.cvTermDao.save(trait); - final String traitValue = String.valueOf(new Random().nextDouble()); - this.createGeolocationProperty(this.geolocation, trait.getCvTermId(), traitValue); - - final Integer geolocationId = this.geolocation.getLocationId(); - final List properties = this.geolocationDao - .getPropertiesForTrialEnvironments(Collections.singletonList(geolocationId)); - Assert.assertNotNull(properties); - Assert.assertEquals(2, properties.size()); - final TrialEnvironmentProperty property1 = properties.get(0); - Assert.assertEquals(TermId.LOCATION_ID.getId(), property1.getId().intValue()); - Assert.assertEquals("LOCATION_ID", property1.getName()); - Assert.assertEquals("Location - selected (DBID)", property1.getDescription()); - final Map environmentValuesMap = property1.getEnvironmentValuesMap(); - Assert.assertEquals( - LOCATION_ID.toString(), environmentValuesMap.get(geolocationId)); - final TrialEnvironmentProperty property2 = properties.get(1); - Assert.assertEquals(trait.getCvTermId(), property2.getId()); - Assert.assertEquals(trait.getName(), property2.getName()); - Assert.assertEquals(trait.getDefinition(), property2.getDescription()); - final Map environmentValuesMap2 = property2.getEnvironmentValuesMap(); - Assert.assertEquals( - traitValue, environmentValuesMap2.get(geolocationId)); - } - - @Test - public void testGetEnvironmentGeolocations() { - Assert.assertEquals(Collections.singletonList(this.geolocation), - this.geolocationDao.getEnvironmentGeolocations(this.study.getProjectId())); - } - - @Test - public void testGetLocationIdByProjectNameAndDescriptionAndProgramUUID() { - Assert.assertEquals(this.geolocation.getLocationId(), this.geolocationDao - .getLocationIdByProjectNameAndDescriptionAndProgramUUID(this.study.getName(), "1", this.study.getProgramUUID())); - } - - @Test - public void testGetAllTrialEnvironments() { - final long previousCount = this.geolocationDao.getAllTrialEnvironments().size(); - final Geolocation geolocation2 = this.createEnvironmentData(this.dataset, "2", Collections.emptyList()); - - final List allTrialEnvironments = this.geolocationDao.getAllTrialEnvironments(); - Assert.assertEquals(previousCount + 1, allTrialEnvironments.size()); - final List environmentIds = Lists.transform(allTrialEnvironments, new Function() { - - @Nullable - @Override - public Integer apply(@Nullable final TrialEnvironment input) { - return input.getId(); - } - }); - Assert.assertTrue(environmentIds.contains(geolocation.getLocationId())); - Assert.assertTrue(environmentIds.contains(geolocation2.getLocationId())); - } - - @Test - public void testGetEnvironmentsForTraits() { - final CVTerm trait = CVTermTestDataInitializer.createTerm(RandomStringUtils.randomAlphanumeric(50), CvId.VARIABLES.getId()); - this.cvTermDao.save(trait); - final List traitIds = Collections.singletonList(trait.getCvTermId()); - final Geolocation geolocation2 = this.createEnvironmentData(this.dataset, "2", traitIds); - final Geolocation geolocation3 = this.createEnvironmentData(this.dataset, "3", traitIds); - - final TrialEnvironments environmentsForTraits = this.geolocationDao.getEnvironmentsForTraits(traitIds, this.study.getProgramUUID()); - Assert.assertNotNull(environmentsForTraits); - final List environmentIds = - Lists.transform(Lists.newArrayList(environmentsForTraits.getTrialEnvironments()), new Function() { - - @Nullable - @Override - public Integer apply(@Nullable final TrialEnvironment input) { - return input.getId(); - } - }); - Assert.assertFalse(environmentIds.contains(geolocation.getLocationId())); - Assert.assertTrue(environmentIds.contains(geolocation2.getLocationId())); - Assert.assertTrue(environmentIds.contains(geolocation3.getLocationId())); - } - - private DmsProject createDataset(final String name, final String programUUID, final int datasetType, final DmsProject parent, - final DmsProject study) { - final DmsProject dataset = new DmsProject(); - dataset.setName(name); - dataset.setDescription(name); - dataset.setProgramUUID(programUUID); - dataset.setDatasetType(new DatasetType(datasetType)); - dataset.setParent(parent); - dataset.setStudy(study); - this.dmsProjectDao.save(dataset); - return dataset; - } - - private void createGermplasm() { - this.germplasm = new ArrayList<>(); - for (int i = 0; i < NO_OF_GERMPLASM; i++) { - final Germplasm germplasm = GermplasmTestDataInitializer.createGermplasm(1); - germplasm.setGid(null); - this.germplasmDao.save(germplasm); - this.germplasm.add(germplasm); - } - } - - private Geolocation createEnvironmentData(final DmsProject project, final String instance, final List traitIds) { - final Geolocation geolocation = new Geolocation(); - geolocation.setDescription(instance); - this.geolocationDao.saveOrUpdate(geolocation); - - this.createGeolocationProperty(geolocation, TermId.LOCATION_ID.getId(), LOCATION_ID.toString()); - - for (final Germplasm germplasm : this.germplasm) { - final StockModel stockModel = new StockModel(); - stockModel.setName("Germplasm " + RandomStringUtils.randomAlphanumeric(5)); - stockModel.setIsObsolete(false); - stockModel.setTypeId(TermId.ENTRY_CODE.getId()); - stockModel.setUniqueName(RandomStringUtils.randomAlphanumeric(10)); - stockModel.setGermplasm(germplasm); - this.stockDao.saveOrUpdate(stockModel); - - final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(geolocation); - experimentModel.setTypeId(TermId.PLOT_EXPERIMENT.getId()); - experimentModel.setProject(project); - experimentModel.setStock(stockModel); - this.experimentDao.saveOrUpdate(experimentModel); - - for (final Integer traitId : traitIds) { - final Phenotype phenotype = new Phenotype(); - phenotype.setObservableId(traitId); - phenotype.setExperiment(experimentModel); - phenotype.setValue(String.valueOf(new Random().nextDouble())); - this.phenotypeDao.save(phenotype); - } - - } - - return geolocation; - } - - private void createGeolocationProperty(final Geolocation geolocation, final Integer variableId, final String value) { - final GeolocationProperty geolocationProperty = new GeolocationProperty(); - geolocationProperty.setType(variableId); - geolocationProperty.setValue(value); - geolocationProperty.setRank(1); - geolocationProperty.setGeolocation(geolocation); - this.geolocationPropertyDao.save(geolocationProperty); - } -} diff --git a/src/test/java/org/generationcp/middleware/dao/dms/GeolocationPropertyDaoTest.java b/src/test/java/org/generationcp/middleware/dao/dms/GeolocationPropertyDaoTest.java deleted file mode 100644 index cdde86ff8b..0000000000 --- a/src/test/java/org/generationcp/middleware/dao/dms/GeolocationPropertyDaoTest.java +++ /dev/null @@ -1,156 +0,0 @@ -package org.generationcp.middleware.dao.dms; - -import org.apache.commons.lang3.RandomStringUtils; -import org.generationcp.middleware.IntegrationTestBase; -import org.generationcp.middleware.dao.oms.CVTermDao; -import org.generationcp.middleware.data.initializer.CVTermTestDataInitializer; -import org.generationcp.middleware.domain.oms.CvId; -import org.generationcp.middleware.domain.oms.TermId; -import org.generationcp.middleware.enumeration.DatasetTypeEnum; -import org.generationcp.middleware.pojos.dms.DatasetType; -import org.generationcp.middleware.pojos.dms.DmsProject; -import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; -import org.generationcp.middleware.pojos.oms.CVTerm; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -public class GeolocationPropertyDaoTest extends IntegrationTestBase { - - private GeolocationDao geolocationDao; - private GeolocationPropertyDao geolocationPropDao; - private DmsProjectDao dmsProjectDao; - private ExperimentDao experimentDao; - private CVTermDao cvTermDao; - - private DmsProject study; - private CVTerm variable1; - private CVTerm variable2; - - @Before - public void test() { - if (this.geolocationDao == null) { - this.geolocationDao = new GeolocationDao(); - this.geolocationDao.setSession(this.sessionProvder.getSession()); - } - - if (this.geolocationPropDao == null) { - this.geolocationPropDao = new GeolocationPropertyDao(); - this.geolocationPropDao.setSession(this.sessionProvder.getSession()); - } - - if (this.dmsProjectDao == null) { - this.dmsProjectDao = new DmsProjectDao(); - this.dmsProjectDao.setSession(this.sessionProvder.getSession()); - } - - if (this.experimentDao == null) { - this.experimentDao = new ExperimentDao(); - this.experimentDao.setSession(this.sessionProvder.getSession()); - } - - if (this.cvTermDao == null) { - this.cvTermDao = new CVTermDao(); - this.cvTermDao.setSession(this.sessionProvder.getSession()); - } - - if (this.study == null) { - this.study = this.createStudy(RandomStringUtils.randomAlphabetic(20)); - } - - if (this.variable1 == null) { - this.variable1 = CVTermTestDataInitializer.createTerm(RandomStringUtils.randomAlphanumeric(50), CvId.VARIABLES.getId()); - this.variable2 = CVTermTestDataInitializer.createTerm(RandomStringUtils.randomAlphanumeric(50), CvId.VARIABLES.getId()); - this.cvTermDao.save(this.variable1); - this.cvTermDao.save(this.variable2); - } - } - - @Test - public void testGetGeolocationPropsAndValuesByGeolocation() { - final DmsProject dataset = - this.createDataset(RandomStringUtils.randomAlphabetic(20), DatasetTypeEnum.SUMMARY_DATA.getId(), this.study); - final Integer geolocationId = - this.createEnvironmentData(dataset, Arrays.asList(this.variable1.getCvTermId(), this.variable2.getCvTermId())); - - final Map propertiesMap = - this.geolocationPropDao.getGeolocationPropsAndValuesByGeolocation(geolocationId, Collections.emptyList()); - Assert.assertNotNull(propertiesMap); - Assert.assertEquals(2, propertiesMap.size()); - Assert.assertNotNull(propertiesMap.get(this.variable1.getDefinition())); - Assert.assertNotNull(propertiesMap.get(this.variable2.getDefinition())); - } - - @Test - public void testDeleteGeolocationPropertyValueInProject() { - final Integer geolocationIdMain = - this.createEnvironmentData(this.study, Arrays.asList(this.variable1.getCvTermId(), this.variable2.getCvTermId())); - final DmsProject dataset = - this.createDataset(RandomStringUtils.randomAlphabetic(20), DatasetTypeEnum.SUMMARY_DATA.getId(), this.study); - final Integer geolocationIdDataset = - this.createEnvironmentData(dataset, Arrays.asList(this.variable1.getCvTermId(), this.variable2.getCvTermId())); - - // Verify that geolocation props exist before deletion - final Map studyProperties = - this.geolocationPropDao.getGeolocationPropsAndValuesByGeolocation(geolocationIdMain, Collections.emptyList()); - Assert.assertNotNull(studyProperties); - Assert.assertFalse(studyProperties.isEmpty()); - final Map datasetProperties = - this.geolocationPropDao.getGeolocationPropsAndValuesByGeolocation(geolocationIdDataset, Collections.emptyList()); - Assert.assertNotNull(datasetProperties); - Assert.assertFalse(datasetProperties.isEmpty()); - } - - private DmsProject createStudy(final String name) { - final DmsProject project = new DmsProject(); - project.setName(name); - project.setDescription(name); - this.dmsProjectDao.save(project); - return project; - } - - private DmsProject createDataset(final String name, final int datasetType, final DmsProject parent) { - final DmsProject dataset = new DmsProject(); - dataset.setName(name); - dataset.setDescription(name); - dataset.setDatasetType(new DatasetType(datasetType)); - dataset.setParent(parent); - dataset.setStudy(parent); - this.dmsProjectDao.save(dataset); - return dataset; - } - - private Integer createEnvironmentData(final DmsProject project, final List geolocPropVariables) { - final Geolocation geolocation = new Geolocation(); - this.geolocationDao.saveOrUpdate(geolocation); - - // Create experiments for environment - for (int j = 0; j < 2; j++) { - final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(geolocation); - experimentModel.setTypeId(TermId.PLOT_EXPERIMENT.getId()); - experimentModel.setProject(project); - this.experimentDao.saveOrUpdate(experimentModel); - } - - int rank = 1; - for (final Integer variableId : geolocPropVariables) { - final GeolocationProperty prop = new GeolocationProperty(); - prop.setType(variableId); - prop.setGeolocation(geolocation); - prop.setRank(rank++); - prop.setValue(RandomStringUtils.randomAlphabetic(10)); - this.geolocationPropDao.save(prop); - } - - return geolocation.getLocationId(); - } - -} diff --git a/src/test/java/org/generationcp/middleware/dao/dms/ObservationUnitsSearchDaoTest.java b/src/test/java/org/generationcp/middleware/dao/dms/ObservationUnitsSearchDaoTest.java index 45467763f1..ba845571ec 100644 --- a/src/test/java/org/generationcp/middleware/dao/dms/ObservationUnitsSearchDaoTest.java +++ b/src/test/java/org/generationcp/middleware/dao/dms/ObservationUnitsSearchDaoTest.java @@ -16,7 +16,6 @@ import org.generationcp.middleware.manager.ontology.daoElements.OntologyVariableInfo; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.dms.Phenotype; import org.generationcp.middleware.pojos.dms.StockModel; import org.generationcp.middleware.pojos.oms.CVTerm; @@ -100,16 +99,14 @@ public void testGetObservationUnitTable() { this.testDataInitializer .addProjectProp(plantSubObsDataset, 8206, observationUnitVariableName, VariableType.OBSERVATION_UNIT, "", 1); - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); - this.testDataInitializer.addGeolocationProp(geolocation, environmentDetailVariable.getCvTermId(), "100", 1); + final ExperimentModel instanceModel = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "101"); + this.testDataInitializer.addExperimentProp(instanceModel, environmentDetailVariable.getCvTermId(), "100", 1); - final ExperimentModel environmentExperimentModel = - this.testDataInitializer.createTestExperiment(this.summary, geolocation, TermId.SUMMARY_EXPERIMENT.getId(), null, null); final ExperimentModel plotExperimentModel = - this.testDataInitializer.createTestExperiment(this.plot, geolocation, TermId.PLOT_EXPERIMENT.getId(), null, null); + this.testDataInitializer.createTestExperiment(this.plot, null, TermId.PLOT_EXPERIMENT.getId(), null, instanceModel); final List plantExperimentModels = this.testDataInitializer - .createTestExperiments(plantSubObsDataset, plotExperimentModel, geolocation, noOfSubObservationExperiment); + .createTestExperiments(plantSubObsDataset, plotExperimentModel, null, noOfSubObservationExperiment); this.testDataInitializer.addPhenotypes(plantExperimentModels, trait1.getCvTermId(), RandomStringUtils.randomNumeric(5)); @@ -121,7 +118,7 @@ public void testGetObservationUnitTable() { final ObservationUnitsSearchDTO observationUnitsSearchDTO = this.testDataInitializer.createTestObservationUnitsDTO(); observationUnitsSearchDTO.setDatasetId(plantSubObsDataset.getProjectId()); - observationUnitsSearchDTO.setInstanceId(geolocation.getLocationId()); + observationUnitsSearchDTO.setInstanceId(instanceModel.getNdExperimentId()); observationUnitsSearchDTO.setSelectionMethodsAndTraits(Collections.singletonList(measurementVariableDto)); observationUnitsSearchDTO.setEnvironmentDetails(Collections.singletonList(environmentDetailDto)); observationUnitsSearchDTO.setEnvironmentConditions(Collections.singletonList(environmentConditionDto)); @@ -182,27 +179,24 @@ public void testGetObservationUnitsByVariable() { final int noOfSubObservationExperiment = 3; final CVTerm trait1 = this.testDataInitializer.createTrait(traitName); - final DmsProject plantSubObsDataset = - this.testDataInitializer.createDmsProject("Plant SubObs Dataset", "Plot Dataset-Description", this.study, this.plot, - DatasetTypeEnum.PLANT_SUBOBSERVATIONS); this.testDataInitializer - .addProjectProp(plantSubObsDataset, 8206, observationUnitVariableName, VariableType.OBSERVATION_UNIT, "", 1); + .addProjectProp(plot, 8206, observationUnitVariableName, VariableType.OBSERVATION_UNIT, "", 1); - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); + final ExperimentModel instanceModel1 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "101"); final ExperimentModel plotExperimentModel = - this.testDataInitializer.createTestExperiment(this.plot, geolocation, TermId.PLOT_EXPERIMENT.getId(), null, null); + this.testDataInitializer.createTestExperiment(this.plot, null, TermId.PLOT_EXPERIMENT.getId(), null, instanceModel1); final List plantExperimentModels = this.testDataInitializer - .createTestExperiments(plantSubObsDataset, plotExperimentModel, geolocation, noOfSubObservationExperiment); + .createTestExperiments(plot, instanceModel1, null, noOfSubObservationExperiment); this.testDataInitializer.addPhenotypes(plantExperimentModels, trait1.getCvTermId(), RandomStringUtils.randomNumeric(5)); final MeasurementVariableDto measurementVariableDto = new MeasurementVariableDto(trait1.getCvTermId(), trait1.getName()); final ObservationUnitsSearchDTO observationUnitsSearchDTO = this.testDataInitializer.createTestObservationUnitsDTO(); - observationUnitsSearchDTO.setDatasetId(plantSubObsDataset.getProjectId()); - observationUnitsSearchDTO.setInstanceId(geolocation.getLocationId()); + observationUnitsSearchDTO.setDatasetId(plot.getProjectId()); + observationUnitsSearchDTO.setInstanceId(instanceModel1.getNdExperimentId()); observationUnitsSearchDTO.setSelectionMethodsAndTraits(Collections.singletonList(measurementVariableDto)); // Filter by Overwritten @@ -246,18 +240,19 @@ public void testCountObservationUnitsForSubObsDataset() { this.testDataInitializer .addProjectProp(plantSubObsDataset, 8206, observationUnitVariableName, VariableType.OBSERVATION_UNIT, "", 1); - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); + + final ExperimentModel instanceModel1 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "101"); final ExperimentModel plotExperimentModel1 = - this.testDataInitializer.createTestExperiment(this.plot, geolocation, TermId.PLOT_EXPERIMENT.getId(), null, null); + this.testDataInitializer.createTestExperiment(this.plot, null, TermId.PLOT_EXPERIMENT.getId(), null, instanceModel1); final List subObsExperimentsInstance1 = this.testDataInitializer - .createTestExperiments(plantSubObsDataset, plotExperimentModel1, geolocation, noOfSubObservationExperiment); + .createTestExperiments(plantSubObsDataset, plotExperimentModel1, null, noOfSubObservationExperiment); - final Geolocation geolocation2 = this.testDataInitializer.createTestGeolocation("2", 101); + final ExperimentModel instanceModel2 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 2, "101"); final ExperimentModel plotExperimentModel2 = - this.testDataInitializer.createTestExperiment(this.plot, geolocation2, TermId.PLOT_EXPERIMENT.getId(), null, null); + this.testDataInitializer.createTestExperiment(this.plot, null, TermId.PLOT_EXPERIMENT.getId(), null, instanceModel2); final List subObsExperimentsInstance2 = this.testDataInitializer - .createTestExperiments(plantSubObsDataset, plotExperimentModel2, geolocation2, noOfSubObservationExperiment); + .createTestExperiments(plantSubObsDataset, plotExperimentModel2, null, noOfSubObservationExperiment); // Only first instance has observations final CVTerm trait1 = this.testDataInitializer.createTrait(traitName); @@ -283,33 +278,33 @@ public void testCountObservationUnitsForSubObsDataset() { this.sessionProvder.getSession().flush(); assertEquals((noOfSubObservationExperiment * 2), - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter, true).intValue()); assertEquals(noOfSubObservationExperiment, - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, geolocation.getLocationId(), false, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, instanceModel1.getNdExperimentId(), false, filter, true).intValue()); assertEquals(noOfSubObservationExperiment, - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, geolocation2.getLocationId(), false, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, instanceModel1.getNdExperimentId(), false, filter, true).intValue()); // Filter by draft phenotype filter.setVariableId(trait1.getCvTermId()); assertEquals(noOfSubObservationExperiment, - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, true, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, true, filter, true).intValue()); filter.setVariableId(null); // Filter by TRIAL_INSTANCE filteredValues.put(String.valueOf(TermId.TRIAL_INSTANCE_FACTOR.getId()), Collections.singletonList("1")); assertEquals(noOfSubObservationExperiment, - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter, true).intValue()); // Filter by GID filteredValues.put(String.valueOf(TermId.GID.getId()), Collections.singletonList(subObsExperimentsInstance1.get(0).getStock().getGermplasm().getGid().toString())); - assertEquals(1, this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter).intValue()); + assertEquals(1, this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter, true).intValue()); filteredValues.clear(); filteredValues.put(String.valueOf(TermId.TRIAL_INSTANCE_FACTOR.getId()), Collections.singletonList("2")); // Filter by DESIGNATION using LIKE operation filteredTextValues.put(String.valueOf(TermId.DESIG.getId()), "Germplasm"); assertEquals(noOfSubObservationExperiment, - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter, true).intValue()); } @Test @@ -318,12 +313,12 @@ public void testCountObservationUnitsForPlotDataset() { final String traitName = "MyTrait"; final int numberOfPlotExperiments = 3; - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); + final ExperimentModel instanceModel1 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "1"); final List instance1Units = - this.testDataInitializer.createTestExperiments(this.plot, null, geolocation, numberOfPlotExperiments); - final Geolocation geolocation2 = this.testDataInitializer.createTestGeolocation("2", 101); + this.testDataInitializer.createTestExperiments(this.plot, instanceModel1, null, numberOfPlotExperiments); + final ExperimentModel instanceModel2 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 2, "101"); final List instance2Units = - this.testDataInitializer.createTestExperiments(this.plot, null, geolocation2, numberOfPlotExperiments); + this.testDataInitializer.createTestExperiments(this.plot, instanceModel2, null, numberOfPlotExperiments); // Only 2 experiments in first instance have observations final CVTerm trait1 = this.testDataInitializer.createTrait(traitName); @@ -350,47 +345,47 @@ public void testCountObservationUnitsForPlotDataset() { this.sessionProvder.getSession().flush(); assertEquals(instance1Units.size() + instance2Units.size(), - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter, false).intValue()); assertEquals(instance1Units.size(), - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, geolocation.getLocationId(), false, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, instanceModel1.getNdExperimentId(), false, filter, false).intValue()); assertEquals(instance2Units.size(), - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, geolocation2.getLocationId(), false, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, instanceModel2.getNdExperimentId(), false, filter, false).intValue()); // Filter by draft phenotype filter.setVariableId(trait1.getCvTermId()); assertEquals(unitsWithObservations.size(), - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, true, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, true, filter, false).intValue()); filter.setVariableId(null); // Filter by PLOT_NO filteredValues.put(String.valueOf(TermId.PLOT_NO.getId()), Collections.singletonList("2")); assertEquals(2, - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter, false).intValue()); // Filter by TRIAL_INSTANCE filteredValues.clear(); filteredValues.put(String.valueOf(TermId.TRIAL_INSTANCE_FACTOR.getId()), Collections.singletonList("1")); assertEquals(3, - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter, false).intValue()); // Filter by GID filteredValues.put(String.valueOf(TermId.GID.getId()), Collections.singletonList(unitsWithObservations.get(0).getStock().getGermplasm().getGid().toString())); - assertEquals(1, this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter).intValue()); + assertEquals(1, this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter, false).intValue()); filteredValues.clear(); filteredValues.put(String.valueOf(TermId.TRIAL_INSTANCE_FACTOR.getId()), Collections.singletonList("2")); // Filter by DESIGNATION using LIKE operation filteredTextValues.put(String.valueOf(TermId.DESIG.getId()), "Germplasm"); assertEquals(3, - this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter).intValue()); + this.obsUnitSearchDao.countObservationUnitsForDataset(datasetId, null, false, filter, false).intValue()); } @Test public void testFilterByOutOfBoundsWithoutOutOfBounds() { final String traitName = "MyTrait"; - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); - final List instance1Units = this.testDataInitializer.createTestExperiments(this.plot, null, geolocation, 2); + final ExperimentModel instanceModel1 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "101"); + final List instance1Units = this.testDataInitializer.createTestExperiments(this.plot, instanceModel1, null, 2); final Integer traitId = this.createTrait(traitName); final List unitsWithObservations = Collections.singletonList(instance1Units.get(0)); final List unitsWithObservations2 = Collections.singletonList(instance1Units.get(1)); @@ -402,7 +397,7 @@ public void testFilterByOutOfBoundsWithoutOutOfBounds() { final Integer datasetId = this.plot.getProjectId(); observationUnitsSearchDTO.setDatasetId(datasetId); observationUnitsSearchDTO.setSelectionMethodsAndTraits(Collections.singletonList(measurementVariableDto)); - observationUnitsSearchDTO.setInstanceId(geolocation.getLocationId()); + observationUnitsSearchDTO.setInstanceId(instanceModel1.getNdExperimentId()); final ObservationUnitsSearchDTO.Filter filter = observationUnitsSearchDTO.new Filter(); filter.setByOutOfBound(true); @@ -420,8 +415,8 @@ public void testFilterByOutOfBoundsWithoutOutOfBounds() { public void testFilterByOutOfBoundsSomeOutOfBounds() { final String traitName = "MyTrait"; - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); - final List instance1Units = this.testDataInitializer.createTestExperiments(this.plot, null, geolocation, 3); + final ExperimentModel instanceModel1 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "101"); + final List instance1Units = this.testDataInitializer.createTestExperiments(this.plot, instanceModel1, null, 3); final Integer traitId = this.createTrait(traitName); final List unitsWithObservations = Collections.singletonList(instance1Units.get(0)); final List unitsWithObservations2 = Collections.singletonList(instance1Units.get(1)); @@ -435,7 +430,7 @@ public void testFilterByOutOfBoundsSomeOutOfBounds() { final Integer datasetId = this.plot.getProjectId(); observationUnitsSearchDTO.setDatasetId(datasetId); observationUnitsSearchDTO.setSelectionMethodsAndTraits(Collections.singletonList(measurementVariableDto)); - observationUnitsSearchDTO.setInstanceId(geolocation.getLocationId()); + observationUnitsSearchDTO.setInstanceId(instanceModel1.getNdExperimentId()); final ObservationUnitsSearchDTO.Filter filter = observationUnitsSearchDTO.new Filter(); filter.setByOutOfBound(true); @@ -453,8 +448,8 @@ public void testFilterByOutOfBoundsSomeOutOfBounds() { public void testFilterByOutOfBoundsAllIsOutOfBounds() { final String traitName = "MyTrait"; - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); - final List instance1Units = this.testDataInitializer.createTestExperiments(this.plot, null, geolocation, 3); + final ExperimentModel instanceModel1 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "101"); + final List instance1Units = this.testDataInitializer.createTestExperiments(this.plot, instanceModel1, null, 3); final Integer traitId = this.createTrait(traitName); final List unitsWithObservations = Collections.singletonList(instance1Units.get(0)); final List unitsWithObservations2 = Collections.singletonList(instance1Units.get(1)); @@ -468,7 +463,7 @@ public void testFilterByOutOfBoundsAllIsOutOfBounds() { final Integer datasetId = this.plot.getProjectId(); observationUnitsSearchDTO.setDatasetId(datasetId); observationUnitsSearchDTO.setSelectionMethodsAndTraits(Collections.singletonList(measurementVariableDto)); - observationUnitsSearchDTO.setInstanceId(geolocation.getLocationId()); + observationUnitsSearchDTO.setInstanceId(instanceModel1.getNdExperimentId()); final ObservationUnitsSearchDTO.Filter filter = observationUnitsSearchDTO.new Filter(); filter.setByOutOfBound(true); @@ -497,15 +492,13 @@ public void testGetObservationUnitRowsAsMapList() { this.testDataInitializer .addProjectProp(plantSubObsDataset, 8206, observationUnitVariableName, VariableType.OBSERVATION_UNIT, "", 1); - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); + final ExperimentModel instanceModel1 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "101"); - final ExperimentModel environmentExperimentModel = - this.testDataInitializer.createTestExperiment(this.summary, geolocation, TermId.SUMMARY_EXPERIMENT.getId(), null, null); final ExperimentModel plotExperimentModel = - this.testDataInitializer.createTestExperiment(this.plot, geolocation, TermId.PLOT_EXPERIMENT.getId(), null, null); + this.testDataInitializer.createTestExperiment(this.plot, null, TermId.PLOT_EXPERIMENT.getId(), null, instanceModel1); final List plantExperimentModels = this.testDataInitializer - .createTestExperiments(plantSubObsDataset, plotExperimentModel, geolocation, noOfSubObservationExperiment); + .createTestExperiments(plantSubObsDataset, plotExperimentModel, null, noOfSubObservationExperiment); this.testDataInitializer.addPhenotypes(plantExperimentModels, trait1.getCvTermId(), RandomStringUtils.randomNumeric(5)); @@ -513,7 +506,7 @@ public void testGetObservationUnitRowsAsMapList() { final ObservationUnitsSearchDTO observationUnitsSearchDTO = this.testDataInitializer.createTestObservationUnitsDTO(); observationUnitsSearchDTO.setDatasetId(plantSubObsDataset.getProjectId()); - observationUnitsSearchDTO.setInstanceId(geolocation.getLocationId()); + observationUnitsSearchDTO.setInstanceId(instanceModel1.getNdExperimentId()); observationUnitsSearchDTO.setSelectionMethodsAndTraits(Collections.singletonList(measurementVariableDto)); observationUnitsSearchDTO.setFilter(observationUnitsSearchDTO.new Filter()); final List filterColumns = observationUnitsSearchDTO.getFilterColumns(); @@ -548,7 +541,7 @@ public void testGetObservationUnitRowsAsMapList() { final StockModel stock = plantExperimentModels.get(0).getStock(); - assertEquals("1", dataMap.get(ObservationUnitsSearchDao.TRIAL_INSTANCE)); + assertEquals(1, dataMap.get(ObservationUnitsSearchDao.TRIAL_INSTANCE)); assertEquals(stock.getGermplasm().getGid(), dataMap.get(ObservationUnitsSearchDao.GID)); assertEquals(stock.getName(), dataMap.get(ObservationUnitsSearchDao.DESIGNATION)); assertNull(dataMap.get(ObservationUnitsSearchDao.ENTRY_TYPE)); diff --git a/src/test/java/org/generationcp/middleware/dao/dms/PhenotypeDaoIntegrationTest.java b/src/test/java/org/generationcp/middleware/dao/dms/PhenotypeDaoIntegrationTest.java index f2908d369c..dbdad329ec 100644 --- a/src/test/java/org/generationcp/middleware/dao/dms/PhenotypeDaoIntegrationTest.java +++ b/src/test/java/org/generationcp/middleware/dao/dms/PhenotypeDaoIntegrationTest.java @@ -34,7 +34,6 @@ import org.generationcp.middleware.pojos.dms.DatasetType; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.dms.Phenotype; import org.generationcp.middleware.pojos.dms.ProjectProperty; import org.generationcp.middleware.pojos.dms.StockModel; @@ -68,8 +67,6 @@ public class PhenotypeDaoIntegrationTest extends IntegrationTestBase { private PhenotypeDao phenotypeDao; - private GeolocationDao geolocationDao; - private ExperimentDao experimentDao; private StockDao stockDao; @@ -102,11 +99,6 @@ public void setUp() throws Exception { this.phenotypeDao.setSession(this.sessionProvder.getSession()); } - if (this.geolocationDao == null) { - this.geolocationDao = new GeolocationDao(); - this.geolocationDao.setSession(this.sessionProvder.getSession()); - } - if (this.germplasmDao == null) { this.germplasmDao = new GermplasmDAO(); this.germplasmDao.setSession(this.sessionProvder.getSession()); @@ -215,11 +207,9 @@ public void testGetPhenotypeByExperimentIdAndObservableId() { factors.add(DMSVariableTestDataInitializer.createVariable(1001, "999", DataType.NUMERIC_VARIABLE.getId(), VariableType.TRAIT)); final ExperimentValues values = new ExperimentValues(); values.setVariableList(factors); - values.setLocationId(this.experimentModelSaver.createNewGeoLocation().getLocationId()); values.setGermplasmId(1); //Save the experiment - this.studyDataManager.addExperiment(this.crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); - final ExperimentModel experiment = this.experimentDao.getExperimentByProjectIdAndLocation(1, values.getLocationId()); + final ExperimentModel experiment = this.experimentModelSaver.addExperiment(this.crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); final Phenotype phenotype = this.phenotypeDao.getPhenotypeByExperimentIdAndObservableId(experiment.getNdExperimentId(), 1001); Assert.assertEquals("999", phenotype.getValue()); } @@ -230,12 +220,11 @@ public void testUpdatePhenotypesByExperimentIdAndObervableId() { factors.add(DMSVariableTestDataInitializer.createVariable(1001, "999", DataType.NUMERIC_VARIABLE.getId(), VariableType.TRAIT)); final ExperimentValues values = new ExperimentValues(); values.setVariableList(factors); - values.setLocationId(this.experimentModelSaver.createNewGeoLocation().getLocationId()); values.setGermplasmId(1); + values.setLocationId(1); //Save the experiment - this.studyDataManager.addExperiment(this.crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); - final ExperimentModel experiment = this.experimentDao.getExperimentByProjectIdAndLocation(1, values.getLocationId()); + final ExperimentModel experiment = this.experimentModelSaver.addExperiment(this.crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); Phenotype phenotype = this.phenotypeDao.getPhenotypeByExperimentIdAndObservableId(experiment.getNdExperimentId(), 1001); Assert.assertEquals("999", phenotype.getValue()); @@ -262,16 +251,57 @@ public void testCountPhenotypesForDataset() { @Test public void testCountPhenotypesForDatasetAndInstance() { final int numberOfReps = 2; - final int instanceId = this.createEnvironmentData(numberOfReps, true); - Assert.assertEquals(NO_OF_GERMPLASM * numberOfReps, - this.phenotypeDao.countPhenotypesForDatasetAndInstance(this.study.getProjectId(), instanceId)); + final DmsProject plot = + this.createDataset(this.study.getName() + " - Plot Dataset", study.getProgramUUID(), DatasetTypeEnum.PLOT_DATA.getId(), + this.study, this.study); + final DmsProject summary = + this.createDataset(this.study.getName() + " - Summary Dataset", study.getProgramUUID(), DatasetTypeEnum.SUMMARY_DATA.getId(), + this.study, this.study); + + final ExperimentModel model = new ExperimentModel(); + model.setObservationUnitNo(1); + model.setTypeId(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()); + model.setProject(summary); + final ExperimentModel environmentExperiment = this.experimentDao.saveOrUpdate(model); + + this.phenotypes = new ArrayList<>(); + for (final Germplasm germplasm : this.germplasm) { + final StockModel stockModel = new StockModel(); + stockModel.setName("Germplasm " + RandomStringUtils.randomAlphanumeric(5)); + stockModel.setIsObsolete(false); + stockModel.setTypeId(TermId.ENTRY_CODE.getId()); + stockModel.setUniqueName(RandomStringUtils.randomAlphanumeric(10)); + stockModel.setGermplasm(germplasm); + this.stockDao.saveOrUpdate(stockModel); + + // Create N experiments for the same stock + for (int j = 0; j < numberOfReps; j++) { + final ExperimentModel experimentModel = new ExperimentModel(); + experimentModel.setTypeId(TermId.PLOT_EXPERIMENT.getId()); + experimentModel.setProject(plot); + experimentModel.setStock(stockModel); + experimentModel.setParent(environmentExperiment); + this.experimentDao.saveOrUpdate(experimentModel); + this.experiments.put(experimentModel.getObsUnitId(), experimentModel); + + final Phenotype phenotype = new Phenotype(); + phenotype.setObservableId(this.trait.getCvTermId()); + phenotype.setExperiment(experimentModel); + phenotype.setValue(String.valueOf(new Random().nextDouble())); + this.phenotypes.add(this.phenotypeDao.save(phenotype)); + } + + } + this.sessionProvder.getSession().flush(); + Assert.assertEquals(this.phenotypes.size(), + this.phenotypeDao.countPhenotypesForDatasetAndInstance(plot.getProjectId(), false, model.getNdExperimentId())); } @Test public void testCountPhenotypesForDatasetAndInstanceNoPhenotypes() { final int numberOfReps = 2; final int instanceId = this.createEnvironmentData(numberOfReps, false); - Assert.assertEquals(0, this.phenotypeDao.countPhenotypesForDatasetAndInstance(this.study.getProjectId(), instanceId)); + Assert.assertEquals(0, this.phenotypeDao.countPhenotypesForDatasetAndInstance(this.study.getProjectId(), false, instanceId)); } @Test @@ -286,17 +316,6 @@ public void testDeletePhenotypesByProjectIdAndTraitIds() { Assert.assertEquals(0, this.phenotypeDao.countPhenotypesForDataset(projectId, traitIds)); } - @Test - public void testDeletePhenotypesByProjectIdAndLocationId() { - final Integer locationId = this.createEnvironmentData(1, true); - final List traitIds =Collections.singletonList(this.trait.getCvTermId()); - final Integer projectId = this.study.getProjectId(); - Assert.assertEquals(NO_OF_GERMPLASM, this.phenotypeDao.countPhenotypesForDataset(projectId, traitIds)); - - this.phenotypeDao.deletePhenotypesByProjectIdAndLocationId(projectId, locationId); - Assert.assertEquals(0, this.phenotypeDao.countPhenotypesForDataset(projectId, traitIds)); - } - @Test public void testUpdateOutOfSyncPhenotypes() { this.createEnvironmentData(1, true); @@ -319,7 +338,7 @@ public void testUpdateOutOfSyncPhenotypesByGeolocation() { final Integer variableId = this.trait.getCvTermId(); final Integer datasetId = this.study.getProjectId(); Assert.assertFalse(this.phenotypeDao.hasOutOfSync(datasetId)); - this.phenotypeDao.updateOutOfSyncPhenotypesByGeolocation(geolocationId, new HashSet<>(Arrays.asList(variableId))); + this.phenotypeDao.updateOutOfSyncPhenotypesByEnvironment(geolocationId, new HashSet<>(Arrays.asList(variableId))); Assert.assertTrue(this.phenotypeDao.hasOutOfSync(datasetId)); final Phenotype phenotype = this.phenotypeDao.getPhenotypeByExperimentIdAndObservableId(experimentId, variableId); Assert.assertEquals(Phenotype.ValueStatus.OUT_OF_SYNC, phenotype.getValueStatus()); @@ -390,7 +409,6 @@ public void testSearchPhenotypes() { } final boolean isFirstStudy = result.getStudyName().equals(this.study.getName() + "_1"); Assert.assertEquals(isFirstStudy? this.study.getName() + "_1": study2.getName() + "_1", result.getStudyName()); - Assert.assertNull(result.getPlantNumber()); final String obsUnitId = result.getObservationUnitDbId(); Assert.assertNotNull(obsUnitId); final ExperimentModel experimentModel = this.experiments.get(obsUnitId); @@ -398,7 +416,8 @@ public void testSearchPhenotypes() { Assert.assertEquals(experimentModel.getStock().getGermplasm().getGid().toString(), result.getGermplasmDbId()); Assert.assertEquals(experimentModel.getStock().getName(), result.getGermplasmName()); Assert.assertEquals(experimentModel.getStock().getUniqueName(), result.getEntryNumber()); - Assert.assertEquals(experimentModel.getGeoLocation().getLocationId().toString(), result.getStudyDbId()); + // TODO IBP-3389 fix assertion +// Assert.assertEquals(experimentModel.getGeoLocation().getLocationId().toString(), result.getStudyDbId()); } // Search by Study ID @@ -462,9 +481,12 @@ private void createProjectProperties(final DmsProject project, final List traitIds) { this.phenotypes = new ArrayList<>(); - final Geolocation geolocation = new Geolocation(); - geolocation.setDescription("1"); - this.geolocationDao.saveOrUpdate(geolocation); + + final ExperimentModel model = new ExperimentModel(); + model.setObservationUnitNo(1); + model.setTypeId(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()); + model.setProject(project); + final ExperimentModel environmentExperiment = this.experimentDao.saveOrUpdate(model); for (final Germplasm germplasm : this.germplasm) { final StockModel stockModel = new StockModel(); @@ -478,10 +500,10 @@ private Integer createEnvironmentData(final DmsProject project, final Integer nu // Create N experiments for the same stock for (int j = 0; j < numberOfReps; j++) { final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(geolocation); experimentModel.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experimentModel.setProject(project); experimentModel.setStock(stockModel); + experimentModel.setParent(environmentExperiment); this.experimentDao.saveOrUpdate(experimentModel); this.experiments.put(experimentModel.getObsUnitId(), experimentModel); @@ -495,7 +517,7 @@ private Integer createEnvironmentData(final DmsProject project, final Integer nu } } + return environmentExperiment.getNdExperimentId(); - return geolocation.getLocationId(); } } diff --git a/src/test/java/org/generationcp/middleware/dao/dms/PhenotypeDaoTest.java b/src/test/java/org/generationcp/middleware/dao/dms/PhenotypeDaoTest.java index 29ce2f2a05..221b96ca9e 100644 --- a/src/test/java/org/generationcp/middleware/dao/dms/PhenotypeDaoTest.java +++ b/src/test/java/org/generationcp/middleware/dao/dms/PhenotypeDaoTest.java @@ -1,26 +1,14 @@ package org.generationcp.middleware.dao.dms; -import static org.hamcrest.Matchers.empty; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; - -import java.math.BigInteger; -import java.util.Arrays; -import java.util.List; - import org.generationcp.middleware.domain.oms.TermId; -import org.generationcp.middleware.domain.ontology.VariableType; -import org.generationcp.middleware.manager.api.StudyDataManager; -import org.generationcp.middleware.service.api.DataImportService; -import org.generationcp.middleware.service.api.phenotype.PhenotypeSearchDTO; +import org.generationcp.middleware.enumeration.DatasetTypeEnum; import org.generationcp.middleware.service.api.phenotype.PhenotypeSearchRequestDTO; -import org.generationcp.middleware.service.impl.study.PhenotypeQuery; import org.hibernate.SQLQuery; import org.hibernate.Session; +import org.hibernate.jdbc.util.BasicFormatterImpl; import org.hibernate.type.Type; import org.junit.Assert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Matchers; @@ -28,20 +16,19 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import java.math.BigInteger; +import java.util.Arrays; +import java.util.List; + public class PhenotypeDaoTest { - public static final int CURRENT_IBDB_USER_ID = 1; private PhenotypeDao dao; - @Mock - private DataImportService dataImportService; - - @Mock - private StudyDataManager studyDataManager; + final private BasicFormatterImpl formattedSQL = new BasicFormatterImpl(); @Mock private Session session; - + @Mock private SQLQuery query; @@ -50,7 +37,7 @@ public void setUp() throws Exception { MockitoAnnotations.initMocks(this); this.dao = new PhenotypeDao(); this.dao.setSession(this.session); - + Mockito.when(this.query.addScalar(Matchers.anyString())).thenReturn(this.query); Mockito.when(this.query.addScalar(Matchers.anyString(), Matchers.any(Type.class))).thenReturn(this.query); Mockito.when(this.session.createSQLQuery(Matchers.anyString())).thenReturn(this.query); @@ -68,7 +55,7 @@ public void testCountPhenotypes() { final List termIds = Arrays.asList("111", "222"); request.setObservationVariableDbIds(termIds); final long count = this.dao.countPhenotypes(request); - + final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.session).createSQLQuery(sqlCaptor.capture()); Mockito.verify(this.query).setParameterList("cvTermIds", termIds); @@ -82,17 +69,17 @@ public void testGetObservationForTraitOnGermplasms() { final List germplasmIds = Arrays.asList(51, 52, 53, 54, 55); final List environmentIds = Arrays.asList(1, 2, 3); this.dao.getObservationForTraitOnGermplasms(traitIds, germplasmIds, environmentIds); - + final String expectedSql = this.getObservationsForTraitMainQuery() + " AND s.dbxref_id IN (:germplasmIds) " - + "ORDER BY p.observable_id, s.dbxref_id, e.nd_geolocation_id, p.value "; + + "ORDER BY p.observable_id, s.dbxref_id, plot.parent_id, p.value "; final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.session).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql, sqlCaptor.getValue()); + Assert.assertEquals(this.formatString(expectedSql), this.formatString(sqlCaptor.getValue())); Mockito.verify(this.query).setParameterList("traitIds", traitIds); Mockito.verify(this.query).setParameterList("germplasmIds", germplasmIds); Mockito.verify(this.query).setParameterList("environmentIds", environmentIds); } - + @Test public void testGetObservationForTraits() { final List traitIds = Arrays.asList(5134, 7645); @@ -100,102 +87,81 @@ public void testGetObservationForTraits() { final int start = 100; final int numOfRows = 500; this.dao.getObservationForTraits(traitIds, environmentIds, start, numOfRows); - + final String expectedSql = this.getObservationsForTraitMainQuery() - + "ORDER BY p.observable_id, s.dbxref_id, e.nd_geolocation_id, p.value "; + + "ORDER BY p.observable_id, s.dbxref_id, plot.parent_id, p.value "; final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.session).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql, sqlCaptor.getValue()); + Assert.assertEquals(this.formatString(expectedSql), this.formatString(sqlCaptor.getValue())); Mockito.verify(this.query).setParameterList("traitIds", traitIds); Mockito.verify(this.query).setParameterList("environmentIds", environmentIds); Mockito.verify(this.query).setFirstResult(start); Mockito.verify(this.query).setMaxResults(numOfRows); } - - @Test - public void testCountObservationForTraits() { - Mockito.doReturn(new BigInteger("100")).when(this.query).uniqueResult(); - final List traitIds = Arrays.asList(5134, 7645); - final List environmentIds = Arrays.asList(1, 2, 3); - final long count = this.dao.countObservationForTraits(traitIds, environmentIds); - - final String expectedSql = "SELECT COUNT(*) " + "FROM nd_experiment e " - + "INNER JOIN stock s ON e.stock_id = s.stock_id " - + "INNER JOIN phenotype p ON e.nd_experiment_id = p.nd_experiment_id " - + "WHERE e.nd_geolocation_id IN (:environmentIds) " - + "AND p.observable_id IN (:traitIds) "; - final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); - Mockito.verify(this.session).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql, sqlCaptor.getValue()); - Mockito.verify(this.query).setParameterList("traitIds", traitIds); - Mockito.verify(this.query).setParameterList("environmentIds", environmentIds); - Assert.assertEquals(100L, count); - } - + @Test public void testGetNumericTraitInfoList() { final List traitIds = Arrays.asList(5134, 7645); final List environmentIds = Arrays.asList(1, 2, 3); this.dao.getNumericTraitInfoList(environmentIds, traitIds); - - final String expectedSql = "SELECT p.observable_id, " + "COUNT(DISTINCT e.nd_geolocation_id) AS location_count, " - + "COUNT(DISTINCT s.dbxref_id) AS germplasm_count, " - + "COUNT(DISTINCT e.nd_experiment_id) AS observation_count , " - + "IF (MIN(p.value * 1) IS NULL, 0, MIN(p.value * 1)) AS min_value, " - + "IF (MAX(p.value * 1) IS NULL, 0, MAX(p.value * 1)) AS max_value " + "FROM phenotype p " - + " INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id " - + " INNER JOIN stock s ON e.stock_id = s.stock_id " + "WHERE e.nd_geolocation_id IN (:environmentIds) " - + " AND p.observable_id IN (:numericVariableIds) " + "GROUP by p.observable_id "; + + final String expectedSql = "SELECT p.observable_id, COUNT(DISTINCT env.nd_experiment_id) AS location_count," + + " COUNT(DISTINCT s.dbxref_id) AS germplasm_count," + + " COUNT(DISTINCT e.nd_experiment_id) AS observation_count ," + + " IF (MIN(p.value * 1) IS NULL, 0, MIN(p.value * 1)) AS min_value," + + " IF (MAX(p.value * 1) IS NULL, 0, MAX(p.value * 1)) AS max_value FROM phenotype p" + + " INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id" + + " LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = e.parent_id and plot.type_id = 1155" + + " INNER JOIN project pr ON pr.project_id = e.project_id" + + " INNER JOIN project env_ds ON env_ds.study_id = pr.study_id" + + " AND env_ds.dataset_type_id = " + DatasetTypeEnum.SUMMARY_DATA.getId() + "" + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = 1020" + + " AND (e.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id)" + + " INNER JOIN stock s ON e.stock_id = s.stock_id" + + " WHERE env.nd_experiment_id IN (:environmentIds)" + + " AND p.observable_id IN (:numericVariableIds)" + + " GROUP by p.observable_id "; final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.session).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql, sqlCaptor.getValue()); + Assert.assertEquals(this.formatString(expectedSql), this.formatString(sqlCaptor.getValue())); Mockito.verify(this.query).setParameterList("numericVariableIds", traitIds); Mockito.verify(this.query).setParameterList("environmentIds", environmentIds); } - + @Test public void testGetTraitInfoCountsForTraits() { final List traitIds = Arrays.asList(5134, 7645); final List environmentIds = Arrays.asList(1, 2, 3); this.dao.getTraitInfoCounts(environmentIds, traitIds); - - final String expectedSql = "SELECT p.observable_id, " + "COUNT(DISTINCT e.nd_geolocation_id) AS location_count, " - + "COUNT(DISTINCT s.dbxref_id) AS germplasm_count, " - + "COUNT(DISTINCT e.nd_experiment_id) AS observation_count " + "FROM phenotype p " - + " INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id " - + " INNER JOIN stock s ON e.stock_id = s.stock_id " + "WHERE e.nd_geolocation_id IN (:environmentIds) " - + " AND p.observable_id IN (:variableIds) " + "GROUP by p.observable_id "; + + final String expectedSql = "SELECT p.observable_id," + + " COUNT(DISTINCT env.nd_experiment_id) AS location_count," + + " COUNT(DISTINCT s.dbxref_id) AS germplasm_count," + + " COUNT(DISTINCT e.nd_experiment_id) AS observation_count FROM phenotype p" + + " INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id" + + " LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = e.parent_id and plot.type_id = 1155" + + " INNER JOIN project pr ON pr.project_id = e.project_id " + + "INNER JOIN project env_ds ON env_ds.study_id = pr.study_id AND env_ds.dataset_type_id = " + + DatasetTypeEnum.SUMMARY_DATA.getId() + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = 1020" + + " AND (e.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id)" + + " INNER JOIN stock s ON e.stock_id = s.stock_id" + + " WHERE env.nd_experiment_id IN (:environmentIds)" + + " AND p.observable_id IN (:variableIds) GROUP by p.observable_id "; final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.session).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql, sqlCaptor.getValue()); + Assert.assertEquals(this.formatString(expectedSql), this.formatString(sqlCaptor.getValue())); Mockito.verify(this.query).setParameterList("variableIds", traitIds); Mockito.verify(this.query).setParameterList("environmentIds", environmentIds); } - - @Test - public void testGetTraitInfoCounts() { - final List environmentIds = Arrays.asList(1, 2, 3); - this.dao.getTraitInfoCounts(environmentIds); - - final String expectedSql = "SELECT p.observable_id, " + "COUNT(DISTINCT e.nd_geolocation_id) AS location_count, " - + "COUNT(DISTINCT s.dbxref_id) AS germplasm_count, " - + "COUNT(DISTINCT e.nd_experiment_id) AS observation_count " + "FROM phenotype p " - + " INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id " - + " INNER JOIN stock s ON e.stock_id = s.stock_id " + "WHERE e.nd_geolocation_id IN (:environmentIds) " - + "GROUP by p.observable_id "; - final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); - Mockito.verify(this.session).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql, sqlCaptor.getValue()); - Mockito.verify(this.query).setParameterList("environmentIds", environmentIds); - } - + @Test public void testUpdatePhenotypesByProjectIdAndLocationId() { final int projectId = 1; final int cvTermId = 5157; final String value = "1.5678"; this.dao.updatePhenotypesByExperimentIdAndObervableId(projectId, cvTermId, value); - + Mockito.verify(this.session).flush(); final String updateSql = "UPDATE phenotype pheno " + "SET pheno.value = '" + value + "'" @@ -206,72 +172,76 @@ public void testUpdatePhenotypesByProjectIdAndLocationId() { Assert.assertEquals(updateSql, sqlCaptor.getValue()); Mockito.verify(this.query).executeUpdate(); } - + @Test public void testContainsAtLeast2CommonEntriesWithValues_WithDesignationGermplasmFactor() { - final int projectId = 1; - final int locationId = 2; - this.dao.containsAtLeast2CommonEntriesWithValues(projectId, locationId, TermId.DESIG.getId()); - - final String expectedSql = this.getContainsAtLeast2CommonEntriesQuery(projectId, locationId, "stock.name"); + this.dao.containsAtLeast2CommonEntriesWithValues(1, 2, TermId.DESIG.getId()); + + final String expectedSql = this.getContainsAtLeast2CommonEntriesQuery("stock.name"); final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.session).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql, sqlCaptor.getValue()); + Assert.assertEquals(this.formatString(expectedSql), this.formatString(sqlCaptor.getValue())); } - + @Test public void testContainsAtLeast2CommonEntriesWithValues_WithGIDGermplasmFactor() { - final int projectId = 1; - final int locationId = 2; - this.dao.containsAtLeast2CommonEntriesWithValues(projectId, locationId, TermId.GID.getId()); - - final String expectedSql = this.getContainsAtLeast2CommonEntriesQuery(projectId, locationId, "stock.dbxref_id"); + this.dao.containsAtLeast2CommonEntriesWithValues(1, 2, TermId.GID.getId()); + + final String expectedSql = this.getContainsAtLeast2CommonEntriesQuery("stock.dbxref_id"); final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.session).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql, sqlCaptor.getValue()); + Assert.assertEquals(this.formatString(expectedSql), this.formatString(sqlCaptor.getValue())); } - + @Test public void testContainsAtLeast2CommonEntriesWithValues_WithEntryNoGermplasmFactor() { - final int projectId = 1; - final int locationId = 2; - this.dao.containsAtLeast2CommonEntriesWithValues(projectId, locationId, TermId.ENTRY_NO.getId()); - - final String expectedSql = this.getContainsAtLeast2CommonEntriesQuery(projectId, locationId, "stock.uniquename"); + this.dao.containsAtLeast2CommonEntriesWithValues(1, 2, TermId.ENTRY_NO.getId()); + + final String expectedSql = this.getContainsAtLeast2CommonEntriesQuery("stock.uniquename"); final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.session).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql, sqlCaptor.getValue()); + Assert.assertEquals(this.formatString(expectedSql), this.formatString(sqlCaptor.getValue())); } - + @Test public void testContainsAtLeast2CommonEntriesWithValues_WithOtherGermplasmFactor() { - final int projectId = 1; - final int locationId = 2; - this.dao.containsAtLeast2CommonEntriesWithValues(projectId, locationId, TermId.CROSS.getId()); - - final String expectedSql = this.getContainsAtLeast2CommonEntriesQuery(projectId, locationId, "stock.stock_id"); + this.dao.containsAtLeast2CommonEntriesWithValues(1, 2, TermId.CROSS.getId()); + + final String expectedSql = this.getContainsAtLeast2CommonEntriesQuery("stock.stock_id"); final ArgumentCaptor sqlCaptor = ArgumentCaptor.forClass(String.class); Mockito.verify(this.session).createSQLQuery(sqlCaptor.capture()); - Assert.assertEquals(expectedSql, sqlCaptor.getValue()); + Assert.assertEquals(this.formatString(expectedSql), this.formatString(sqlCaptor.getValue())); + } + + private String formatString(final String format) { + return this.formattedSQL.format(format).replace(" ", ""); } - private String getContainsAtLeast2CommonEntriesQuery(final Integer projectId, final Integer locationId, final String germplasmGroupBy) { - return " SELECT phenotype.observable_id,count(phenotype.observable_id) " - + " FROM nd_experiment nd_exp " - + " INNER JOIN stock ON nd_exp.stock_id = stock.stock_id " - + " LEFT JOIN phenotype ON nd_exp.nd_experiment_id = phenotype.nd_experiment_id where nd_exp.project_id = " - + projectId + " and nd_exp.nd_geolocation_id = " + locationId - + " and ((phenotype.value <> '' and phenotype.value is not null) or " - + " (phenotype.cvalue_id <> '' and phenotype.cvalue_id is not null)) group by nd_exp.nd_geolocation_id, " - + germplasmGroupBy + " , phenotype.observable_id " - + " having count(phenotype.observable_id) >= 2 LIMIT 1 "; + private String getContainsAtLeast2CommonEntriesQuery(final String germplasmGroupBy) { + return " SELECT phenotype.observable_id, " + + " count(phenotype.observable_id) " + + " FROM nd_experiment nd_exp " + + " INNER JOIN stock ON nd_exp.stock_id = stock.stock_id " + + " LEFT JOIN phenotype ON nd_exp.nd_experiment_id = phenotype.nd_experiment_id " + + " INNER JOIN project pr ON pr.project_id = nd_exp.project_id " + + " INNER JOIN project plot_ds on plot_ds.study_id = pr.study_id and plot_ds.dataset_type_id = " + DatasetTypeEnum.PLOT_DATA.getId() + + " INNER JOIN nd_experiment plot ON plot_ds.project_id = plot.project_id " + + " where nd_exp.project_id = :projectId and plot.parent_id = :environmentId " + + " and ((phenotype.value <> '' and phenotype.value is not null) or (phenotype.cvalue_id <> '' " + + " and phenotype.cvalue_id is not null)) group by plot.parent_id, " + germplasmGroupBy + " , " + + " phenotype.observable_id having count(phenotype.observable_id) >= 2 LIMIT 1"; } private String getObservationsForTraitMainQuery() { - return "SELECT p.observable_id, s.dbxref_id, e.nd_geolocation_id, p.value " - + "FROM nd_experiment e " - + "INNER JOIN stock s ON e.stock_id = s.stock_id " - + "INNER JOIN phenotype p ON e.nd_experiment_id = p.nd_experiment_id " + "WHERE e.nd_geolocation_id IN (:environmentIds) " - + "AND p.observable_id IN (:traitIds) "; + return "SELECT p.observable_id, s.dbxref_id, env.nd_experiment_id, p.value FROM phenotype p" + + " INNER JOIN nd_experiment e ON e.nd_experiment_id = p.nd_experiment_id" + + " LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = e.parent_id and plot.type_id = 1155" + + " INNER JOIN project pr ON pr.project_id = e.project_id INNER JOIN project env_ds ON env_ds.study_id = pr.study_id" + + " AND env_ds.dataset_type_id = " + DatasetTypeEnum.SUMMARY_DATA.getId() + " " + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = 1020" + + " AND (e.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id)" + + " INNER JOIN stock s ON e.stock_id = s.stock_id" + + " WHERE env.nd_experiment_id IN (:environmentIds)" + + " AND p.observable_id IN (:traitIds) "; } diff --git a/src/test/java/org/generationcp/middleware/dao/dms/PhenotypeSaverTest.java b/src/test/java/org/generationcp/middleware/dao/dms/PhenotypeSaverTest.java index c0900458c6..509d817413 100644 --- a/src/test/java/org/generationcp/middleware/dao/dms/PhenotypeSaverTest.java +++ b/src/test/java/org/generationcp/middleware/dao/dms/PhenotypeSaverTest.java @@ -54,14 +54,13 @@ public void testSaveOrUpdate() { final VariableList factors = new VariableList(); final ExperimentValues values = new ExperimentValues(); values.setVariableList(factors); - values.setLocationId(this.experimentModelSaver.createNewGeoLocation().getLocationId()); values.setGermplasmId(1); //Save the experiment final CropType crop = new CropType(); crop.setUseUUID(true); this.studyDataManager.addExperiment(crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); - final ExperimentModel experiment = this.experimentDao.getExperimentByProjectIdAndLocation(1, values.getLocationId()); + final ExperimentModel experiment = this.experimentDao.getById(values.getLocationId()); final Phenotype toBeSaved = new Phenotype(); toBeSaved.setValue("999"); diff --git a/src/test/java/org/generationcp/middleware/dao/dms/ProjectPropertyDaoTest.java b/src/test/java/org/generationcp/middleware/dao/dms/ProjectPropertyDaoTest.java index 07aa4f7ba1..f8c7a0c4e3 100644 --- a/src/test/java/org/generationcp/middleware/dao/dms/ProjectPropertyDaoTest.java +++ b/src/test/java/org/generationcp/middleware/dao/dms/ProjectPropertyDaoTest.java @@ -106,7 +106,7 @@ public void setUp() throws Exception { public void testGetStandardVariableIdsWithTypeByPropertyNames() { final List propertyNames = new ArrayList<>(); - propertyNames.add(DataSetupTest.LOCATION_NAME); + propertyNames.add(DataSetupTest.SITE_LONG); final String programUUID = UUID.randomUUID().toString(); this.createNurseryTestData(programUUID); @@ -114,8 +114,8 @@ public void testGetStandardVariableIdsWithTypeByPropertyNames() { final Map> results = this.projectPropDao.getStandardVariableIdsWithTypeByAlias(propertyNames, programUUID); - Assert.assertTrue(results.get(DataSetupTest.LOCATION_NAME).containsValue(VariableType.ENVIRONMENT_DETAIL)); - Assert.assertTrue(results.get(DataSetupTest.LOCATION_NAME).containsKey(TermId.TRIAL_LOCATION.getId())); + Assert.assertTrue(results.get(DataSetupTest.SITE_LONG).containsValue(VariableType.ENVIRONMENT_DETAIL)); + Assert.assertTrue(results.get(DataSetupTest.SITE_LONG).containsKey(TermId.LONGITUDE.getId())); } @Test @@ -148,7 +148,7 @@ public void testConvertToVariablestandardVariableIdsWithTypeMap() { @Test public void testGetStandardVariableIdsWithTypeByAliasWhenVariableIsObsolete() { - final List aliases = Collections.singletonList(DataSetupTest.LOCATION_NAME); + final List aliases = Collections.singletonList(DataSetupTest.SITE_LONG); final String programUUID = UUID.randomUUID().toString(); this.createNurseryTestData(programUUID); @@ -160,7 +160,7 @@ public void testGetStandardVariableIdsWithTypeByAliasWhenVariableIsObsolete() { Assert.assertFalse(results.isEmpty()); // Then mark the location name variable as obsolete to test if we can still retrieve it - final CVTerm locationName = this.cvTermDao.getByName(DataSetupTest.LOCATION_NAME); + final CVTerm locationName = this.cvTermDao.getByName(DataSetupTest.SITE_LONG); locationName.setIsObsolete(true); this.cvTermDao.merge(locationName); this.sessionProvder.getSession().flush(); @@ -168,7 +168,7 @@ public void testGetStandardVariableIdsWithTypeByAliasWhenVariableIsObsolete() { final Map> results2 = this.projectPropDao .getStandardVariableIdsWithTypeByAlias(aliases, programUUID); - // The LOCATION_NAME variable is obsolete so the result should be empty + // The SITE_LONG variable is obsolete so the result should be empty Assert.assertTrue(results2.isEmpty()); } @@ -178,17 +178,17 @@ public void testGetStandardVariableIdsWithTypeByAliasExcludeStudyDetail() { final String programUUID = UUID.randomUUID().toString(); this.createNurseryTestData(programUUID); - final List aliases = Arrays.asList(DataSetupTest.LOCATION_NAME, DataSetupTest.STUDY_INSTITUTE); + final List aliases = Arrays.asList(DataSetupTest.SITE_LONG, DataSetupTest.STUDY_INSTITUTE); final Map> results = this.projectPropDao .getStandardVariableIdsWithTypeByAlias(aliases, programUUID); Assert.assertNotNull(results); Assert.assertFalse(results.isEmpty()); Assert.assertFalse(results.containsKey(DataSetupTest.STUDY_INSTITUTE)); - Assert.assertTrue(results.containsKey(DataSetupTest.LOCATION_NAME)); + Assert.assertTrue(results.containsKey(DataSetupTest.SITE_LONG)); Assert.assertEquals( VariableType.ENVIRONMENT_DETAIL, - results.get(DataSetupTest.LOCATION_NAME).entrySet().iterator().next().getValue()); + results.get(DataSetupTest.SITE_LONG).entrySet().iterator().next().getValue()); } diff --git a/src/test/java/org/generationcp/middleware/dao/dms/StockDaoTest.java b/src/test/java/org/generationcp/middleware/dao/dms/StockDaoTest.java index df8cbb8725..b83ad78f86 100644 --- a/src/test/java/org/generationcp/middleware/dao/dms/StockDaoTest.java +++ b/src/test/java/org/generationcp/middleware/dao/dms/StockDaoTest.java @@ -31,7 +31,6 @@ import org.generationcp.middleware.pojos.Germplasm; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.dms.Phenotype; import org.generationcp.middleware.pojos.dms.StockModel; import org.generationcp.middleware.pojos.oms.CVTerm; @@ -51,12 +50,10 @@ import java.util.stream.Collectors; public class StockDaoTest extends IntegrationTestBase { - private static final int TEST_COUNT = 3; private DmsProjectDao dmsProjectDao; private GermplasmDAO germplasmDao; private ExperimentDao experimentDao; - private GeolocationDao geolocationDao; private StockDao stockDao; private StockPropertyDao stockPropertyDao; private CVTermDao cvtermDao; @@ -66,7 +63,7 @@ public class StockDaoTest extends IntegrationTestBase { private DmsProject project; private List testStocks; private List experiments; - private Geolocation environment; + private ExperimentModel environmentExperiment; private WorkbenchUser workbenchUser; private IntegrationTestDataInitializer testDataInitializer; @@ -82,9 +79,6 @@ public void setUp() throws Exception { this.experimentDao = new ExperimentDao(); this.experimentDao.setSession(this.sessionProvder.getSession()); - this.geolocationDao = new GeolocationDao(); - this.geolocationDao.setSession(this.sessionProvder.getSession()); - this.stockDao = new StockDao(); this.stockDao.setSession(this.sessionProvder.getSession()); @@ -110,7 +104,7 @@ public void setUp() throws Exception { this.testStocks = new ArrayList<>(); this.experiments = new ArrayList<>(); - this.createSampleStocks(TEST_COUNT, project); + this.createSampleStocks(TEST_COUNT, this.project); } @@ -126,7 +120,7 @@ private DmsProject createProject(final DmsProject parent) { project.setParent(parent); project.setStudy(parent); } - dmsProjectDao.save(project); + this.dmsProjectDao.save(project); return project; } @@ -170,7 +164,7 @@ public void testFindInDataset() { final Set stocks = this.stockDao.findInDataSet(this.project.getProjectId()); Assert.assertNotNull(stocks); - Assert.assertEquals(TEST_COUNT, stocks.size()); + Assert.assertEquals(4, stocks.size()); } @Test @@ -188,13 +182,13 @@ public void testGetStocksByIds() { @Test public void testCountStocks() { - final CVTerm variateTerm = createVariate(); - for (final ExperimentModel experiment : experiments) { + final CVTerm variateTerm = this.createVariate(); + for (final ExperimentModel experiment : this.experiments) { this.createTestObservations(experiment, variateTerm); } // Need to flush session to sync with underlying database before querying this.sessionProvder.getSession().flush(); - final long count = this.stockDao.countStocks(project.getProjectId(), environment.getLocationId(), variateTerm.getCvTermId()); + final long count = this.stockDao.countStocks(this.project.getProjectId(), this.environmentExperiment.getNdExperimentId(), variateTerm.getCvTermId()); Assert.assertEquals(TEST_COUNT, count); } @@ -280,26 +274,24 @@ private void createTestObservations(final ExperimentModel experiment, final CVTe phenotype.setObservableId(variateTerm.getCvTermId()); phenotype.setValue(RandomStringUtils.randomNumeric(5)); phenotype.setExperiment(experiment); - phenotypeDao.save(phenotype); + this.phenotypeDao.save(phenotype); } private CVTerm createVariate() { final CVTerm variateTerm = CVTermTestDataInitializer.createTerm(RandomStringUtils.randomAlphanumeric(50), CvId.VARIABLES.getId()); - cvtermDao.save(variateTerm); + this.cvtermDao.save(variateTerm); return variateTerm; } private void createSampleStocks(final Integer count, final DmsProject study) { - // Save the experiments in the same instance - environment = new Geolocation(); - geolocationDao.saveOrUpdate(environment); + this.createTestEnvExperiment(study, null); for (int i = 0; i < count; i++) { final Germplasm germplasm = GermplasmTestDataInitializer.createGermplasm(1); germplasm.setGid(null); this.germplasmDao.save(germplasm); - final StockModel stockModel = createTestStock(germplasm); + final StockModel stockModel = this.createTestStock(germplasm); this.createTestExperiment(study, stockModel); } @@ -321,11 +313,20 @@ private StockModel createTestStock(final Germplasm germplasm) { private void createTestExperiment(final DmsProject study, final StockModel stockModel) { final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(environment); experimentModel.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experimentModel.setProject(study); experimentModel.setStock(stockModel); - experimentDao.saveOrUpdate(experimentModel); + experimentModel.setParent(this.environmentExperiment); + this.experimentDao.saveOrUpdate(experimentModel); this.experiments.add(experimentModel); } + + private void createTestEnvExperiment(final DmsProject study, final StockModel stockModel) { + final ExperimentModel experimentModel = new ExperimentModel(); + experimentModel.setObservationUnitNo(1); + experimentModel.setTypeId(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()); + experimentModel.setProject(study); + experimentModel.setStock(stockModel); + this.environmentExperiment = this.experimentDao.saveOrUpdate(experimentModel); + } } diff --git a/src/test/java/org/generationcp/middleware/dao/oms/CVTermRelationshipDaoTest.java b/src/test/java/org/generationcp/middleware/dao/oms/CVTermRelationshipDaoTest.java index aa8624e120..80f0615cae 100644 --- a/src/test/java/org/generationcp/middleware/dao/oms/CVTermRelationshipDaoTest.java +++ b/src/test/java/org/generationcp/middleware/dao/oms/CVTermRelationshipDaoTest.java @@ -1,18 +1,11 @@ package org.generationcp.middleware.dao.oms; -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; -import java.util.List; - import org.apache.commons.lang3.RandomStringUtils; import org.generationcp.middleware.IntegrationTestBase; import org.generationcp.middleware.dao.GermplasmDAO; import org.generationcp.middleware.dao.dms.DmsProjectDao; import org.generationcp.middleware.dao.dms.ExperimentDao; import org.generationcp.middleware.dao.dms.ExperimentPropertyDao; -import org.generationcp.middleware.dao.dms.GeolocationDao; -import org.generationcp.middleware.dao.dms.GeolocationPropertyDao; import org.generationcp.middleware.dao.dms.PhenotypeDao; import org.generationcp.middleware.dao.dms.ProjectPropertyDao; import org.generationcp.middleware.dao.dms.StockDao; @@ -26,8 +19,6 @@ import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.pojos.dms.ExperimentProperty; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; import org.generationcp.middleware.pojos.dms.Phenotype; import org.generationcp.middleware.pojos.dms.ProjectProperty; import org.generationcp.middleware.pojos.dms.StockModel; @@ -37,10 +28,15 @@ import org.junit.Before; import org.junit.Test; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; + public class CVTermRelationshipDaoTest extends IntegrationTestBase { - + private static final int NO_OF_CATEGORIES = 12; - + private CVTermRelationshipDao cvtermRelationshipDao; private CVTermDao cvtermDao; private DmsProjectDao projectDao; @@ -51,11 +47,8 @@ public class CVTermRelationshipDaoTest extends IntegrationTestBase { private GermplasmDAO germplasmDao; private StockDao stockDao; private StockPropertyDao stockPropDao; - private GeolocationDao geolocationDao; - private GeolocationPropertyDao geolocPropDao; - + private DmsProject study; - private Geolocation geolocation; private Germplasm germplasm; private StockModel stock; private CVTerm variable; @@ -64,69 +57,60 @@ public class CVTermRelationshipDaoTest extends IntegrationTestBase { @Before public void setUp() throws Exception { - if (this.cvtermRelationshipDao == null) { + if (this.cvtermRelationshipDao == null) { this.cvtermRelationshipDao = new CVTermRelationshipDao(); this.cvtermRelationshipDao.setSession(this.sessionProvder.getSession()); } - - if (this.cvtermDao == null) { + + if (this.cvtermDao == null) { this.cvtermDao = new CVTermDao(); this.cvtermDao.setSession(this.sessionProvder.getSession()); } - - if (this.projectDao == null) { + + if (this.projectDao == null) { this.projectDao = new DmsProjectDao(); this.projectDao.setSession(this.sessionProvder.getSession()); } - - if (this.projectPropDao == null) { + + if (this.projectPropDao == null) { this.projectPropDao = new ProjectPropertyDao(); this.projectPropDao.setSession(this.sessionProvder.getSession()); } - - if (this.experimentDao == null) { + + if (this.experimentDao == null) { this.experimentDao = new ExperimentDao(); this.experimentDao.setSession(this.sessionProvder.getSession()); } - - if (this.experimentPropDao == null) { + + if (this.experimentPropDao == null) { this.experimentPropDao = new ExperimentPropertyDao(); this.experimentPropDao.setSession(this.sessionProvder.getSession()); } - - if (this.phenotypeDao == null) { + + if (this.phenotypeDao == null) { this.phenotypeDao = new PhenotypeDao(); this.phenotypeDao.setSession(this.sessionProvder.getSession()); } - + if (this.germplasmDao == null) { this.germplasmDao = new GermplasmDAO(); this.germplasmDao.setSession(this.sessionProvder.getSession()); } - - if (this.stockDao == null) { + + if (this.stockDao == null) { this.stockDao = new StockDao(); this.stockDao.setSession(this.sessionProvder.getSession()); } - - if (this.stockPropDao == null) { + + if (this.stockPropDao == null) { this.stockPropDao = new StockPropertyDao(); this.stockPropDao.setSession(this.sessionProvder.getSession()); } - - if (this.geolocationDao == null) { - this.geolocationDao = new GeolocationDao(); - this.geolocationDao.setSession(this.sessionProvder.getSession()); - } - - if (this.geolocPropDao == null) { - this.geolocPropDao = new GeolocationPropertyDao(); - this.geolocPropDao.setSession(this.sessionProvder.getSession()); - } - + + this.createTestStudy(); this.createTestOntologyData(); - + } private void createTestStudy() { @@ -135,20 +119,20 @@ private void createTestStudy() { this.study.setDescription("Test Project"); this.projectDao.save(this.study); } - + private void createTestOntologyData() { if (this.scale == null) { this.scale = CVTermTestDataInitializer.createTerm(RandomStringUtils.randomAlphanumeric(50), CvId.SCALES.getId()); this.cvtermDao.save(this.scale); } - + if (this.categories == null) { this.categories = new ArrayList<>(); for (int i = 0; i < NO_OF_CATEGORIES; i++) { final CVTerm category = this.cvtermDao .save(CVTermTestDataInitializer.createTerm(RandomStringUtils.randomAlphanumeric(20), CvId.IBDB_TERMS.getId())); this.categories.add(category); - + final CVTermRelationship hasValueRelationship = new CVTermRelationship(); hasValueRelationship.setTypeId(TermId.HAS_VALUE.getId()); hasValueRelationship.setSubjectId(this.scale.getCvTermId()); @@ -156,11 +140,11 @@ private void createTestOntologyData() { this.cvtermRelationshipDao.save(hasValueRelationship); } } - + if (this.variable == null) { this.variable = CVTermTestDataInitializer.createTerm(RandomStringUtils.randomAlphanumeric(50), CvId.VARIABLES.getId()); this.cvtermDao.save(this.variable); - + final CVTermRelationship hasScaleRelationship = new CVTermRelationship(); hasScaleRelationship.setTypeId(TermId.HAS_SCALE.getId()); hasScaleRelationship.setSubjectId(this.variable.getCvTermId()); @@ -168,7 +152,7 @@ private void createTestOntologyData() { this.cvtermRelationshipDao.save(hasScaleRelationship); } } - + @Test public void testGetScaleCategoriesUsedInStudies() { this.createStudyData(); @@ -198,7 +182,7 @@ public void testGetScaleCategoriesUsedInObservations() { assertEquals(this.categories.get(0).getName(), usedCategories.get(0)); assertEquals(this.categories.get(1).getName(), usedCategories.get(1)); } - + @Test public void testGetScaleCategoriesUsedInObservationsWithStudyDeleted() { this.markTestStudyAsDeleted(); @@ -208,8 +192,8 @@ public void testGetScaleCategoriesUsedInObservationsWithStudyDeleted() { final List usedCategories = this.cvtermRelationshipDao.getScaleCategoriesUsedInObservations(this.scale.getCvTermId()); assertEquals(0, usedCategories.size()); } - - + + @Test public void testGetScaleCategoriesUsedAsConditions() { this.createStudyConstant(); @@ -217,7 +201,7 @@ public void testGetScaleCategoriesUsedAsConditions() { assertEquals(1, usedCategories.size()); assertEquals(this.categories.get(2).getName(), usedCategories.get(0)); } - + @Test public void testGetScaleCategoriesUsedAsConditionsWithStudyDeleted() { this.markTestStudyAsDeleted(); @@ -227,7 +211,7 @@ public void testGetScaleCategoriesUsedAsConditionsWithStudyDeleted() { final List usedCategories = this.cvtermRelationshipDao.getScaleCategoriesUsedAsConditions(this.scale.getCvTermId()); assertEquals(0, usedCategories.size()); } - + @Test public void testGetScaleCategoriesUsedAsGermplasmDescriptor() { this.createGermplasmDescriptor(); @@ -235,7 +219,7 @@ public void testGetScaleCategoriesUsedAsGermplasmDescriptor() { assertEquals(1, usedCategories.size()); assertEquals(this.categories.get(3).getName(), usedCategories.get(0)); } - + @Test public void testGetScaleCategoriesUsedAsGermplasmDescriptorWithStudyDeleted() { this.markTestStudyAsDeleted(); @@ -245,7 +229,7 @@ public void testGetScaleCategoriesUsedAsGermplasmDescriptorWithStudyDeleted() { final List usedCategories = this.cvtermRelationshipDao.getScaleCategoriesUsedAsGermplasmDescriptors(this.scale.getCvTermId()); assertEquals(0, usedCategories.size()); } - + @Test public void testGetScaleCategoriesUsedAsTrialDesignFactors() { this.createTrialDesignFactor(); @@ -253,7 +237,7 @@ public void testGetScaleCategoriesUsedAsTrialDesignFactors() { assertEquals(1, usedCategories.size()); assertEquals(this.categories.get(4).getName(), usedCategories.get(0)); } - + @Test public void testGetScaleCategoriesUsedAsTrialDesignFactorsWithStudyDeleted() { this.markTestStudyAsDeleted(); @@ -263,31 +247,12 @@ public void testGetScaleCategoriesUsedAsTrialDesignFactorsWithStudyDeleted() { final List usedCategories = this.cvtermRelationshipDao.getScaleCategoriesUsedAsTrialDesignFactors(this.scale.getCvTermId()); assertEquals(0, usedCategories.size()); } - - @Test - public void testgetScaleCategoriesUsedAsEnvironmentFactors() { - this.createEnvironmentFactor(); - final List usedCategories = this.cvtermRelationshipDao.getScaleCategoriesUsedAsEnvironmentFactors(this.scale.getCvTermId()); - assertEquals(1, usedCategories.size()); - assertEquals(this.categories.get(5).getName(), usedCategories.get(0)); - } - - @Test - public void testgetScaleCategoriesUsedAsEnvironmentFactorsWithStudyDeleted() { - this.markTestStudyAsDeleted(); - this.createEnvironmentFactor(); - // For some reason, need to flush to be able to get the latest state of test study as deleted - this.sessionProvder.getSession().flush(); - final List usedCategories = this.cvtermRelationshipDao.getScaleCategoriesUsedAsEnvironmentFactors(this.scale.getCvTermId()); - assertEquals(0, usedCategories.size()); - } - + private void createObservations() { final ExperimentModel experiment1 = new ExperimentModel(); - experiment1.setGeoLocation(getGeolocation()); experiment1.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experiment1.setProject(this.study); - experiment1.setStock(getStock()); + experiment1.setStock(this.getStock()); this.experimentDao.save(experiment1); final Phenotype phenotype1 = new Phenotype(); @@ -297,14 +262,13 @@ private void createObservations() { phenotype1.setValue(category.getName()); phenotype1.setcValue(category.getCvTermId()); this.phenotypeDao.save(phenotype1); - + final ExperimentModel experiment2 = new ExperimentModel(); - experiment2.setGeoLocation(getGeolocation()); experiment2.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experiment2.setProject(this.study); - experiment2.setStock(getStock()); + experiment2.setStock(this.getStock()); this.experimentDao.save(experiment2); - + final Phenotype phenotype2 = new Phenotype(); phenotype2.setObservableId(this.variable.getCvTermId()); phenotype2.setExperiment(experiment2); @@ -312,36 +276,34 @@ private void createObservations() { phenotype2.setValue(category2.getName()); phenotype2.setcValue(category2.getCvTermId()); this.phenotypeDao.save(phenotype2); - + // For some reason, need to flush to be able to get the phenotypes created this.sessionProvder.getSession().flush(); } - + private void createGermplasmDescriptor() { final ExperimentModel experiment = new ExperimentModel(); - experiment.setGeoLocation(getGeolocation()); experiment.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experiment.setProject(this.study); - experiment.setStock(getStock()); + experiment.setStock(this.getStock()); this.experimentDao.save(experiment); - + final StockProperty prop = new StockProperty(); prop.setRank(1); - prop.setStock(getStock()); + prop.setStock(this.getStock()); prop.setTypeId(this.variable.getCvTermId()); prop.setValue(String.valueOf(this.categories.get(3).getCvTermId())); this.stockPropDao.save(prop); } - + private void createTrialDesignFactor() { final ExperimentModel experiment = new ExperimentModel(); - experiment.setGeoLocation(getGeolocation()); experiment.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experiment.setProject(this.study); - experiment.setStock(getStock()); + experiment.setStock(this.getStock()); this.experimentDao.save(experiment); - + final ExperimentProperty prop = new ExperimentProperty(); prop.setRank(1); prop.setExperiment(experiment); @@ -349,53 +311,45 @@ private void createTrialDesignFactor() { prop.setValue(String.valueOf(this.categories.get(4).getCvTermId())); this.experimentPropDao.save(prop); } - + private void createEnvironmentFactor() { final ExperimentModel experiment = new ExperimentModel(); - experiment.setGeoLocation(getGeolocation()); experiment.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experiment.setProject(this.study); - experiment.setStock(getStock()); + experiment.setStock(this.getStock()); this.experimentDao.save(experiment); - - final GeolocationProperty prop = new GeolocationProperty(); - prop.setRank(1); - prop.setGeolocation(getGeolocation()); - prop.setType(this.variable.getCvTermId()); - prop.setValue(String.valueOf(this.categories.get(5).getCvTermId())); - this.geolocPropDao.save(prop); + + + final ExperimentProperty experimentProperty = new ExperimentProperty(); + experimentProperty.setExperiment(experiment); + experimentProperty.setTypeId(this.variable.getCvTermId()); + experimentProperty.setValue(String.valueOf(this.categories.get(5).getCvTermId())); + experimentProperty.setRank(1); + this.experimentPropDao.save(experimentProperty); } private StockModel getStock() { - if (this.stock == null) { + if (this.stock == null) { this.stock = new StockModel(); this.stock.setName("Germplasm "); this.stock.setIsObsolete(false); this.stock.setTypeId(TermId.ENTRY_CODE.getId()); this.stock.setUniqueName("1"); - this.stock.setGermplasm(getGermplasm()); + this.stock.setGermplasm(this.getGermplasm()); this.stockDao.save(this.stock); } return this.stock; } private Germplasm getGermplasm() { - if (this.germplasm == null) { + if (this.germplasm == null) { this.germplasm = GermplasmTestDataInitializer.createGermplasm(1); - germplasm.setGid(null); - this.germplasmDao.save(germplasm); + this.germplasm.setGid(null); + this.germplasmDao.save(this.germplasm); } - return germplasm; + return this.germplasm; } - private Geolocation getGeolocation() { - if (this.geolocation == null) { - this.geolocation = new Geolocation(); - this.geolocationDao.save(this.geolocation); - } - return this.geolocation; - } - private void createStudyConstant() { final ProjectProperty prop = new ProjectProperty(); prop.setProject(this.study); @@ -406,7 +360,7 @@ private void createStudyConstant() { prop.setValue(String.valueOf(this.categories.get(2).getCvTermId())); this.projectPropDao.save(prop); } - + private void markTestStudyAsDeleted() { this.study.setDeleted(true); this.projectDao.save(this.study); diff --git a/src/test/java/org/generationcp/middleware/data/initializer/SimplifiedWorkbookTestDataInitializer.java b/src/test/java/org/generationcp/middleware/data/initializer/SimplifiedWorkbookTestDataInitializer.java index 5a6723ea0d..e9f3d6e302 100644 --- a/src/test/java/org/generationcp/middleware/data/initializer/SimplifiedWorkbookTestDataInitializer.java +++ b/src/test/java/org/generationcp/middleware/data/initializer/SimplifiedWorkbookTestDataInitializer.java @@ -167,6 +167,11 @@ public List createFactors(final int trialInstanceNumber) { FIELD_PLOT, NUMERIC, NUMERIC_VALUE, PLOT, TermId.NUMERIC_VARIABLE.getId(), PhenotypicType.TRIAL_DESIGN, false)); + factors.add(createMeasurementVariable(TermId.ENTRY_NO.getId(), ENTRY, + "Entry number ", NESTED_NUMBER, ENUMERATED, + FIELD_PLOT, NUMERIC, NUMERIC_VALUE, + ENTRY, TermId.NUMERIC_VARIABLE.getId(), PhenotypicType.TRIAL_DESIGN, false)); + factors.add(createMeasurementVariable(TermId.OBS_UNIT_ID.getId(), OBS_UNIT_ID, "Field Observation Unit id - enumerated (number) ", TEXT, ASSIGNED, FIELD_PLOT, CHAR, STUDY, diff --git a/src/test/java/org/generationcp/middleware/data/initializer/StudyTestDataInitializer.java b/src/test/java/org/generationcp/middleware/data/initializer/StudyTestDataInitializer.java index 64c4590a07..3d7c0d1f94 100644 --- a/src/test/java/org/generationcp/middleware/data/initializer/StudyTestDataInitializer.java +++ b/src/test/java/org/generationcp/middleware/data/initializer/StudyTestDataInitializer.java @@ -36,7 +36,7 @@ public class StudyTestDataInitializer { public static final String STUDY_NAME = "STUDY NAME"; public static final String STUDY_DESCRIPTION = "STUDY DESCRIPTION"; public static final Integer STUDY_ID = 10010; - public static final int PARENT_FOLDER_ID = 1; + private static final int PARENT_FOLDER_ID = 1; private static final String TEST_FOLDER_NAME = "TEST_FOLDER_NAME"; private static final String TEST_FOLDER_DESC = "TEST_FOLDER_DESC"; public static final String DATASET_NAME = "DATA SET NAME"; @@ -135,7 +135,6 @@ private StudyValues createStudyValues(final VariableList variableList) throws Ex studyValues.setVariableList(variableList); final VariableList locationVariableList = this.createEnvironment("Description", "1.0", "2.0", "data", "3.0", "RCBD"); - this.geolocationId = this.studyDataManager.addTrialEnvironment(locationVariableList); studyValues.setLocationId(this.geolocationId); final Germplasm germplasm = GermplasmTestDataInitializer.createGermplasm(1); @@ -148,7 +147,14 @@ private StudyValues createStudyValues(final VariableList variableList) throws Ex return studyValues; } - private Variable createVariable(final int termId, final String value, final int rank, final PhenotypicType type) throws Exception { + private Variable createVariable(final int termId, final String value, final int rank, final String name) { + final Variable variable = new Variable(); + variable.setValue(value); + variable.setVariableType(this.createVariableType(termId, name, "", rank)); + return variable; + } + + private Variable createVariable(final int termId, final String value, final int rank, final PhenotypicType type) { final StandardVariable stVar = this.ontologyManager.getStandardVariable(termId, this.commonTestProject.getUniqueID()); final DMSVariableType vtype = new DMSVariableType(); @@ -177,13 +183,12 @@ private VariableList createEnvironment( } public VariableList createEnvironmentWithLocationAndSeason( - final String trialInstance, final String siteName, final String locationId, final String seasonId) - throws Exception { + final String trialInstance, final String siteName, final String locationId, final String seasonId) { final VariableList variableList = new VariableList(); - variableList.add(this.createVariable(TermId.TRIAL_INSTANCE_FACTOR.getId(), trialInstance, 0, PhenotypicType.TRIAL_ENVIRONMENT)); - variableList.add(this.createVariable(TermId.TRIAL_LOCATION.getId(), siteName, 0, PhenotypicType.TRIAL_ENVIRONMENT)); - variableList.add(this.createVariable(TermId.LOCATION_ID.getId(), locationId, 0, PhenotypicType.TRIAL_ENVIRONMENT)); - variableList.add(this.createVariable(TermId.SEASON_VAR.getId(), seasonId, 0, PhenotypicType.TRIAL_ENVIRONMENT)); + variableList.add(this.createVariable(TermId.TRIAL_INSTANCE_FACTOR.getId(), trialInstance, 1, TermId.TRIAL_INSTANCE_FACTOR.name())); + variableList.add(this.createVariable(TermId.TRIAL_LOCATION.getId(), siteName, 2, TermId.TRIAL_LOCATION.name())); + variableList.add(this.createVariable(TermId.LOCATION_ID.getId(), locationId, 3, TermId.LOCATION_ID.name())); + variableList.add(this.createVariable(TermId.SEASON_VAR.getId(), seasonId, 4, TermId.SEASON_VAR.name())); return variableList; } @@ -201,7 +206,7 @@ private VariableList createGermplasm( } public DmsProject createFolderTestData(final String uniqueId) { - return createFolderTestData(uniqueId, null); + return this.createFolderTestData(uniqueId, null); } public DmsProject createFolderTestData(final String uniqueId, final Integer parentId) { @@ -244,7 +249,7 @@ public DatasetReference addTestDataset(final int studyId) throws Exception { return this.studyDataManager.addDataSet(studyId, typeList, datasetValues, null, DatasetTypeEnum.MEANS_DATA.getId()); } - public DatasetReference addTestDataset(final int studyId, final int datasetTypeId) throws Exception { + public DatasetReference addTestDataset(final int studyId, final int datasetTypeId) { final VariableTypeList typeList = new VariableTypeList(); final DatasetValues datasetValues = new DatasetValues(); @@ -272,26 +277,22 @@ public Integer createEnvironmentDataset(final CropType crop, final int studyId, final DatasetReference dataSet = this.studyDataManager.addDataSet(studyId, new VariableTypeList(), datasetValues, null, DatasetTypeEnum.SUMMARY_DATA.getId()); - this.geolocationId = this.addEnvironmentToDataset(crop, dataSet.getId(), 1, locationId, seasonId); + this.addEnvironmentToDataset(crop, dataSet.getId(), 1, locationId, seasonId); return dataSet.getId(); } - public Integer addEnvironmentToDataset(final CropType crop, final Integer datasetId, final Integer trialInstance, final String locationId, final String seasonId) + public void addEnvironmentToDataset(final CropType crop, final Integer datasetId, final Integer trialInstance, final String locationId, final String seasonId) throws Exception { final VariableList locationVariableList = this.createEnvironmentWithLocationAndSeason(String.valueOf(trialInstance), "SOME SITE NAME", locationId, seasonId); - final int geolocationId = this.studyDataManager.addTrialEnvironment(locationVariableList); - final ExperimentValues experimentValue = new ExperimentValues(); - experimentValue.setLocationId(geolocationId); + experimentValue.setVariableList(locationVariableList); + experimentValue.setObservationUnitNo(trialInstance); this.studyDataManager.addExperiment(crop, datasetId, ExperimentType.TRIAL_ENVIRONMENT, experimentValue); - - return geolocationId; } - private DMSVariableType createVariableType(final int termId, final String name, final String description, final int rank) - throws Exception { + private DMSVariableType createVariableType(final int termId, final String name, final String description, final int rank) { final StandardVariable stdVar = this.ontologyManager.getStandardVariable(termId, this.commonTestProject.getUniqueID()); final DMSVariableType vtype = new DMSVariableType(); vtype.setLocalName(name); @@ -308,11 +309,11 @@ public Integer getGid() { } public Integer getStockId() { - return stockId; + return this.stockId; } public Integer getGeolocationId() { - return geolocationId; + return this.geolocationId; } public Integer addTestLocation(final String locationName) { diff --git a/src/test/java/org/generationcp/middleware/manager/CrossStudyDataManagerImplTest.java b/src/test/java/org/generationcp/middleware/manager/CrossStudyDataManagerImplTest.java index 911a5542c5..4eea53aae6 100644 --- a/src/test/java/org/generationcp/middleware/manager/CrossStudyDataManagerImplTest.java +++ b/src/test/java/org/generationcp/middleware/manager/CrossStudyDataManagerImplTest.java @@ -13,14 +13,6 @@ import org.apache.commons.lang3.RandomStringUtils; import org.generationcp.middleware.IntegrationTestBase; -import org.generationcp.middleware.dao.GermplasmDAO; -import org.generationcp.middleware.dao.dms.DmsProjectDao; -import org.generationcp.middleware.dao.dms.ExperimentDao; -import org.generationcp.middleware.dao.dms.GeolocationDao; -import org.generationcp.middleware.dao.dms.GeolocationPropertyDao; -import org.generationcp.middleware.dao.dms.PhenotypeDao; -import org.generationcp.middleware.dao.dms.StockDao; -import org.generationcp.middleware.dao.oms.CVTermDao; import org.generationcp.middleware.data.initializer.CVTermTestDataInitializer; import org.generationcp.middleware.data.initializer.GermplasmTestDataInitializer; import org.generationcp.middleware.domain.dms.TrialEnvironment; @@ -38,8 +30,7 @@ import org.generationcp.middleware.pojos.Germplasm; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; +import org.generationcp.middleware.pojos.dms.ExperimentProperty; import org.generationcp.middleware.pojos.dms.Phenotype; import org.generationcp.middleware.pojos.dms.StockModel; import org.generationcp.middleware.pojos.oms.CVTerm; @@ -51,6 +42,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.UUID; @@ -61,71 +53,12 @@ public class CrossStudyDataManagerImplTest extends IntegrationTestBase { @Autowired private CrossStudyDataManager crossStudyDataManager; - private DmsProjectDao dmsProjectDao; - - private ExperimentDao experimentDao; - - private GeolocationDao geolocationDao; - - private GeolocationPropertyDao geolocationPropertyDao; - - private StockDao stockDao; - - private GermplasmDAO germplasmDao; - - private PhenotypeDao phenotypeDao; - - private CVTermDao cvTermDao; - - private int trait; + private DaoFactory daoFactory; @Before public void setUp() throws Exception { - if (this.geolocationDao == null) { - this.geolocationDao = new GeolocationDao(); - this.geolocationDao.setSession(this.sessionProvder.getSession()); - } - - if (this.geolocationDao == null) { - this.geolocationDao = new GeolocationDao(); - this.geolocationDao.setSession(this.sessionProvder.getSession()); - } - - if (this.geolocationPropertyDao == null) { - this.geolocationPropertyDao = new GeolocationPropertyDao(); - this.geolocationPropertyDao.setSession(this.sessionProvder.getSession()); - } - - if (this.germplasmDao == null) { - this.germplasmDao = new GermplasmDAO(); - this.germplasmDao.setSession(this.sessionProvder.getSession()); - } - - if (this.experimentDao == null) { - this.experimentDao = new ExperimentDao(); - this.experimentDao.setSession(this.sessionProvder.getSession()); - } - - if (this.stockDao == null) { - this.stockDao = new StockDao(); - this.stockDao.setSession(this.sessionProvder.getSession()); - } - - if (this.dmsProjectDao == null) { - this.dmsProjectDao = new DmsProjectDao(); - this.dmsProjectDao.setSession(this.sessionProvder.getSession()); - } - - if (this.phenotypeDao == null) { - this.phenotypeDao = new PhenotypeDao(); - this.phenotypeDao.setSession(this.sessionProvder.getSession()); - } - - if (this.cvTermDao == null) { - this.cvTermDao = new CVTermDao(); - this.cvTermDao.setSession(this.sessionProvder.getSession()); - } + this.daoFactory = new DaoFactory(this.sessionProvder); } @@ -156,7 +89,8 @@ public void testGetPropertiesForStudyEnvironments() { @Test public void testGetTraitsForNumericVariates() { final List environmentIds = Arrays.asList(10081, 10082, 10083, 10084, 10085, 10086, 10087); // Rice - final List result = this.crossStudyDataManager.getTraitsForNumericVariates(environmentIds); + final List traitIds = Arrays.asList(20081, 20082, 20083); + final List result = this.crossStudyDataManager.getTraitsForNumericVariates(environmentIds, traitIds); for (final NumericTraitInfo trait : result) { trait.print(IntegrationTestBase.INDENT); } @@ -166,7 +100,8 @@ public void testGetTraitsForNumericVariates() { @Test public void testGetTraitsForCharacterVariates() { final List environmentIds = Arrays.asList(10040, 10050, 10060, 10070); // Rice - final List result = this.crossStudyDataManager.getTraitsForCharacterVariates(environmentIds); + final List traitIds = Arrays.asList(20081, 20082, 20083); + final List result = this.crossStudyDataManager.getTraitsForCharacterVariates(environmentIds, traitIds); for (final CharacterTraitInfo trait : result) { trait.print(IntegrationTestBase.INDENT); } @@ -176,7 +111,8 @@ public void testGetTraitsForCharacterVariates() { @Test public void testGetTraitsForCategoricalVariates() { final List environmentIds = Arrays.asList(10010, 10020, 10030, 10040, 10050, 10060, 10070); // Rice - final List result = this.crossStudyDataManager.getTraitsForCategoricalVariates(environmentIds); + final List traitIds = Arrays.asList(20081, 20082, 20083); + final List result = this.crossStudyDataManager.getTraitsForCategoricalVariates(environmentIds, traitIds); for (final CategoricalTraitInfo trait : result) { trait.print(IntegrationTestBase.INDENT); } @@ -202,7 +138,7 @@ public void testGetEnvironmentsForGermplasmPairs() { public void testGetObservationsForTraitOnGermplasms() { final List traitIds = Arrays.asList(18020, 18180, 18190, 18200); - final List germplasmIds = Arrays.asList(1709); + final List germplasmIds = Collections.singletonList(1709); final List environmentIds = Arrays.asList(10081, 10084, 10085, 10086); final List result = @@ -256,13 +192,13 @@ public void testGetEnvironmentsForTraits() { } - int createTestData(final String studyName, final String programUUID, final String locationId) { + private int createTestData(final String studyName, final String programUUID, final String locationId) { final DmsProject study = new DmsProject(); study.setName(studyName); study.setDescription(studyName); study.setProgramUUID(programUUID); - this.dmsProjectDao.save(study); + this.daoFactory.getDmsProjectDAO().save(study); final DmsProject plot = new DmsProject(); plot.setName(studyName + " - Plot Dataset"); @@ -270,22 +206,11 @@ int createTestData(final String studyName, final String programUUID, final Strin plot.setProgramUUID(programUUID); plot.setParent(study); plot.setStudy(study); - this.dmsProjectDao.save(plot); - - final Geolocation geolocation = new Geolocation(); - geolocation.setDescription("1"); - this.geolocationDao.saveOrUpdate(geolocation); - - final GeolocationProperty geolocationProperty = new GeolocationProperty(); - geolocationProperty.setGeolocation(geolocation); - geolocationProperty.setType(TermId.LOCATION_ID.getId()); - geolocationProperty.setRank(1); - geolocationProperty.setValue(locationId); - this.geolocationPropertyDao.save(geolocationProperty); + this.daoFactory.getDmsProjectDAO().save(plot); final Germplasm germplasm = GermplasmTestDataInitializer.createGermplasm(1); germplasm.setGid(null); - this.germplasmDao.save(germplasm); + this.daoFactory.getGermplasmDao().save(germplasm); final StockModel stockModel = new StockModel(); stockModel.setName("Germplasm 1"); @@ -293,25 +218,31 @@ int createTestData(final String studyName, final String programUUID, final Strin stockModel.setTypeId(TermId.ENTRY_CODE.getId()); stockModel.setUniqueName("1"); stockModel.setGermplasm(germplasm); - this.stockDao.saveOrUpdate(stockModel); + this.daoFactory.getStockDao().saveOrUpdate(stockModel); final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(geolocation); experimentModel.setTypeId(TermId.PLOT_EXPERIMENT.getId()); experimentModel.setProject(plot); experimentModel.setStock(stockModel); final String customUnitID = RandomStringUtils.randomAlphabetic(10); experimentModel.setObsUnitId(customUnitID); - this.experimentDao.saveOrUpdate(experimentModel); + this.daoFactory.getExperimentDao().saveOrUpdate(experimentModel); + + final ExperimentProperty experimentProperty = new ExperimentProperty(); + experimentProperty.setExperiment(experimentModel); + experimentProperty.setTypeId(TermId.LOCATION_ID.getId()); + experimentProperty.setRank(1); + experimentProperty.setValue(locationId); + this.daoFactory.getExperimentPropertyDao().saveOrUpdate(experimentProperty); final CVTerm trait = CVTermTestDataInitializer.createTerm(RandomStringUtils.randomAlphanumeric(50), CvId.VARIABLES.getId()); - this.cvTermDao.save(trait); + this.daoFactory.getCvTermDao().save(trait); final Phenotype phenotype = new Phenotype(); phenotype.setObservableId(trait.getCvTermId()); phenotype.setExperiment(experimentModel); phenotype.setValue("data"); - this.phenotypeDao.save(phenotype); + this.daoFactory.getPhenotypeDAO().save(phenotype); return trait.getCvTermId(); diff --git a/src/test/java/org/generationcp/middleware/manager/StudyDataManagerImplTest.java b/src/test/java/org/generationcp/middleware/manager/StudyDataManagerImplTest.java index 6fa55c460a..747e01d844 100644 --- a/src/test/java/org/generationcp/middleware/manager/StudyDataManagerImplTest.java +++ b/src/test/java/org/generationcp/middleware/manager/StudyDataManagerImplTest.java @@ -34,7 +34,6 @@ import org.generationcp.middleware.domain.dms.StudyReference; import org.generationcp.middleware.domain.dms.StudySearchMatchingOption; import org.generationcp.middleware.domain.dms.StudySummary; -import org.generationcp.middleware.domain.dms.TrialEnvironments; import org.generationcp.middleware.domain.dms.Variable; import org.generationcp.middleware.domain.dms.VariableList; import org.generationcp.middleware.domain.dms.VariableTypeList; @@ -58,7 +57,6 @@ import org.generationcp.middleware.operation.builder.TrialEnvironmentBuilder; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.dms.Phenotype; import org.generationcp.middleware.pojos.dms.StudyType; import org.generationcp.middleware.pojos.workbench.CropType; @@ -252,7 +250,8 @@ public void testSearchStudiesByGid() throws Exception { for (final StudyReference study : studyReferences) { Assert.assertNotNull(study.getOwnerId()); final WorkbenchUser workbenchUser = this.userService.getUserById(study.getOwnerId()); - Assert.assertEquals(workbenchUser.getPerson().getFirstName() + " " + workbenchUser.getPerson().getLastName(), study.getOwnerName()); + Assert.assertEquals(workbenchUser.getPerson().getFirstName() + " " + workbenchUser.getPerson().getLastName(), + study.getOwnerName()); } } @@ -307,7 +306,8 @@ public void testGetChildrenOfFolder() { Assert.assertFalse(study.getIsLocked()); Assert.assertEquals(this.studyReference.getOwnerId(), study.getOwnerId()); final WorkbenchUser workbenchUser = this.userService.getUserById(this.studyReference.getOwnerId()); - Assert.assertEquals(workbenchUser.getPerson().getFirstName() + " " + workbenchUser.getPerson().getLastName(), study.getOwnerName()); + Assert.assertEquals(workbenchUser.getPerson().getFirstName() + " " + workbenchUser.getPerson().getLastName(), + study.getOwnerName()); } } } @@ -416,7 +416,11 @@ public void testGetAllStudyDetails() throws Exception { final List nurseryStudyDetails = this.manager.getAllStudyDetails(StudyTypeDto.getNurseryDto(), this.commonTestProject.getUniqueID()); final int sizeBeforeAddingNewNursery = nurseryStudyDetails.size(); - this.studyTDI.addTestStudy(StudyTypeDto.getNurseryDto(), "NEW NURSERY"); + + final StudyReference study = this.studyTDI.addTestStudy(StudyTypeDto.getNurseryDto(), "NEW NURSERY"); + final DatasetReference environment = + this.addTestDataset(study.getId(), study.getName() + ENVIRONMENT, DatasetTypeEnum.SUMMARY_DATA.getId()); + final List updatedNurseryStudyDetails = this.manager.getAllStudyDetails(StudyTypeDto.getNurseryDto(), this.commonTestProject.getUniqueID()); final int sizeAfterAddingNewNursery = updatedNurseryStudyDetails.size(); @@ -581,7 +585,11 @@ public void testGetStudyDetailsByStudyType() throws Exception { final List trialStudyDetails = this.manager.getStudyDetails(StudyTypeDto.getTrialDto(), this.commonTestProject.getUniqueID(), 0, 50); final int sizeBeforeAddingNewTrial = trialStudyDetails.size(); + final StudyReference newStudy = this.studyTDI.addTestStudy(StudyTypeDto.getTrialDto(), "NEW STUDY"); + final DatasetReference environment = + this.addTestDataset(newStudy.getId(), newStudy.getName() + ENVIRONMENT, DatasetTypeEnum.SUMMARY_DATA.getId()); + final List updatedStudyDetails = this.manager.getStudyDetails(StudyTypeDto.getTrialDto(), this.commonTestProject.getUniqueID(), 0, 50); final int sizeAfterAddingNewStudy = updatedStudyDetails.size(); @@ -619,7 +627,11 @@ public void testGetNurseryAndTrialStudyDetails() throws Exception { this.manager.getNurseryAndTrialStudyDetails(this.commonTestProject.getUniqueID(), -1, -1); final int sizeBeforeAddingNewStudy = studyDetailsList.size(); final StudyReference nursery = this.studyTDI.addTestStudy(StudyTypeDto.getNurseryDto(), "NEW NURSERY"); + this.addTestDataset(nursery.getId(), nursery.getName() + ENVIRONMENT, DatasetTypeEnum.SUMMARY_DATA.getId()); + final StudyReference trial = this.studyTDI.addTestStudy(StudyTypeDto.getTrialDto(), "NEW TRIAL"); + this.addTestDataset(trial.getId(), trial.getName() + ENVIRONMENT, DatasetTypeEnum.SUMMARY_DATA.getId()); + final List newStudyDetailsList = this.manager.getNurseryAndTrialStudyDetails(this.commonTestProject.getUniqueID(), -1, -1); final int sizeAfterAddingNewStudy = newStudyDetailsList.size(); @@ -641,7 +653,12 @@ public void testGetNurseryAndTrialStudyDetails() throws Exception { } @Test - public void testGetStudyDetails() { + public void testGetStudyDetails() throws Exception { + + final DatasetReference environment = + this.addTestDataset(this.studyReference.getId(), this.studyReference.getName() + ENVIRONMENT, + DatasetTypeEnum.SUMMARY_DATA.getId()); + final StudyDetails studyDetails = this.manager.getStudyDetails(this.studyReference.getId()); Assert.assertNotNull("Study should not be null", studyDetails); Assert.assertEquals(this.studyReference.getId(), studyDetails.getId()); @@ -650,20 +667,6 @@ public void testGetStudyDetails() { this.verifyCommonStudyDetails(studyDetails); } - @Test - public void testGetTrialInstanceNumberByGeolocationId() throws Exception { - final Integer studyId = this.studyReference.getId(); - final Integer dataSetId = this.studyTDI.createEnvironmentDataset(this.crop, studyId, "1", "1"); - final TrialEnvironments trialEnvironments = this.manager.getTrialEnvironmentsInDataset(dataSetId); - Assert.assertNotNull(trialEnvironments.getTrialEnvironments()); - Assert.assertFalse(trialEnvironments.getTrialEnvironments().isEmpty()); - - final String trialInstanceNumberActual = - this.manager.getTrialInstanceNumberByGeolocationId(trialEnvironments.getTrialEnvironments().iterator().next().getId()); - Assert.assertEquals("1", trialInstanceNumberActual); - - } - @Test public void testGetAllSharedProjectNames() { final List sharedProjectNames = this.manager.getAllSharedProjectNames(); @@ -768,12 +771,11 @@ public void testIsVariableUsedInStudEnvironmentInOtherProgramsVariableExistsInEn variable.setVariableType(dmsVariableType); variable.setValue(locationNameIdValue); variableList.add(variable); - final Geolocation geolocation = this.manager.getGeolocationSaver().saveGeolocation(variableList, null, false); + // final Geolocation geolocation = this.manager.getGeolocationSaver().saveGeolocation(variableList, null, false); // Create experiment record final ExperimentModel experimentModel = new ExperimentModel(); experimentModel.setTypeId(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()); - experimentModel.setGeoLocation(geolocation); experimentModel.setProject(project); this.manager.getExperimentDao().save(experimentModel); @@ -807,12 +809,11 @@ public void testIsVariableUsedInStudyEnvironmentInOtherProgramsVariableExistsInE variable.setVariableType(dmsVariableType); variable.setValue(locationNameIdValue); variableList.add(variable); - final Geolocation geolocation = this.manager.getGeolocationSaver().saveGeolocation(variableList, null, false); + // final Geolocation geolocation = this.manager.getGeolocationSaver().saveGeolocation(variableList, null, false); // Create experiment record final ExperimentModel experimentModel = new ExperimentModel(); experimentModel.setTypeId(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()); - experimentModel.setGeoLocation(geolocation); experimentModel.setProject(project); this.manager.getExperimentDao().save(experimentModel); @@ -839,7 +840,7 @@ public void testGetProjectStartDateByProjectId() { } @Test - public void testIsLocationIdVariable() throws Exception { + public void testIsLocationIdVariable() { this.studyTDI.addTestDataset(this.studyReference.getId(), DatasetTypeEnum.SUMMARY_DATA.getId()); Assert.assertTrue(this.manager.isLocationIdVariable(this.studyReference.getId(), "LOCATION_NAME")); @@ -902,12 +903,15 @@ public void testGetStudyReference() { Assert.assertFalse(studyFromDB.getIsLocked()); Assert.assertEquals(this.studyReference.getOwnerId(), studyFromDB.getOwnerId()); final WorkbenchUser workbenchUser = this.userService.getUserById(this.studyReference.getOwnerId()); - Assert.assertEquals(workbenchUser.getPerson().getFirstName() + " " + workbenchUser.getPerson().getLastName(), studyFromDB.getOwnerName()); + Assert.assertEquals(workbenchUser.getPerson().getFirstName() + " " + workbenchUser.getPerson().getLastName(), + studyFromDB.getOwnerName()); } @Test - public void testUpdateStudyLockedStatus() { + public void testUpdateStudyLockedStatus() throws Exception { final Integer studyId = this.studyReference.getId(); + this.addTestDataset(this.studyReference.getId(), this.studyReference.getName() + ENVIRONMENT, DatasetTypeEnum.SUMMARY_DATA.getId()); + Assert.assertFalse(this.manager.getStudyDetails(studyId).getIsLocked()); this.manager.updateStudyLockedStatus(studyId, true); // Flushing to force Hibernate to synchronize with the underlying database @@ -972,10 +976,9 @@ public void testUpdateExperimentValues() { factors.add(DMSVariableTestDataInitializer.createVariable(1001, "999", DataType.NUMERIC_VARIABLE.getId(), VariableType.TRAIT)); final ExperimentValues values = new ExperimentValues(); values.setVariableList(factors); - values.setLocationId(this.manager.getExperimentModelSaver().createNewGeoLocation().getLocationId()); //Save the experiment this.manager.addExperiment(this.crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); - final ExperimentModel experiment = this.manager.getExperimentDao().getExperimentByProjectIdAndLocation(1, values.getLocationId()); + final ExperimentModel experiment = this.manager.getExperimentDao().getById(values.getLocationId()); Phenotype updatedPhenotype = this.manager.getPhenotypeDao().getPhenotypeByExperimentIdAndObservableId(experiment.getNdExperimentId(), 1001); Assert.assertEquals("999", updatedPhenotype.getValue()); @@ -987,7 +990,7 @@ public void testUpdateExperimentValues() { values.getVariableList().add( DMSVariableTestDataInitializer.createVariable(1002, "1000", DataType.NUMERIC_VARIABLE.getId(), VariableType.TRAIT)); - this.manager.updateExperimentValues(Arrays.asList(values), 1); + this.manager.updateExperimentValues(Arrays.asList(values)); updatedPhenotype = this.manager.getPhenotypeDao().getPhenotypeByExperimentIdAndObservableId(experiment.getNdExperimentId(), 1001); final Phenotype savedPhenotype = diff --git a/src/test/java/org/generationcp/middleware/operation/builder/ExperimentBuilderTest.java b/src/test/java/org/generationcp/middleware/operation/builder/ExperimentBuilderTest.java index 403e419bb4..eb101381e0 100644 --- a/src/test/java/org/generationcp/middleware/operation/builder/ExperimentBuilderTest.java +++ b/src/test/java/org/generationcp/middleware/operation/builder/ExperimentBuilderTest.java @@ -1,44 +1,56 @@ package org.generationcp.middleware.operation.builder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Set; - import org.apache.commons.lang.RandomStringUtils; import org.generationcp.middleware.IntegrationTestBase; +import org.generationcp.middleware.dao.dms.ExperimentDao; +import org.generationcp.middleware.dao.dms.PhenotypeDao; +import org.generationcp.middleware.data.initializer.DMSVariableTestDataInitializer; import org.generationcp.middleware.domain.dms.DMSVariableType; +import org.generationcp.middleware.domain.dms.ExperimentType; +import org.generationcp.middleware.domain.dms.ExperimentValues; import org.generationcp.middleware.domain.dms.PhenotypicType; import org.generationcp.middleware.domain.dms.StandardVariable; -import org.generationcp.middleware.domain.dms.Stock; import org.generationcp.middleware.domain.dms.Variable; import org.generationcp.middleware.domain.dms.VariableList; import org.generationcp.middleware.domain.dms.VariableTypeList; +import org.generationcp.middleware.domain.oms.Term; import org.generationcp.middleware.domain.oms.TermId; -import org.generationcp.middleware.exceptions.MiddlewareQueryException; +import org.generationcp.middleware.domain.ontology.DataType; +import org.generationcp.middleware.domain.ontology.VariableType; +import org.generationcp.middleware.operation.saver.ExperimentModelSaver; import org.generationcp.middleware.pojos.Germplasm; import org.generationcp.middleware.pojos.dms.ExperimentModel; import org.generationcp.middleware.pojos.dms.ExperimentProperty; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; import org.generationcp.middleware.pojos.dms.StockModel; import org.generationcp.middleware.pojos.dms.StockProperty; +import org.generationcp.middleware.pojos.workbench.CropType; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; + public class ExperimentBuilderTest extends IntegrationTestBase { + private static final String CROP_PREFIX = org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric(5); + private ExperimentDao experimentDao; + private ExperimentModelSaver experimentModelSaver; - static ExperimentBuilder builder; + private static ExperimentBuilder builder; @Before public void setUp() throws Exception { builder = new ExperimentBuilder(this.sessionProvder); + experimentDao = new ExperimentDao(); + this.experimentDao.setSession(this.sessionProvder.getSession()); + this.experimentModelSaver = new ExperimentModelSaver(this.sessionProvder); } @Test @@ -59,55 +71,82 @@ public void testCreateVariable() { @Test public void testCreateLocationFactorThereIsMatching() { - final Geolocation geoLocation = new Geolocation(); - final String description = "XXX"; - geoLocation.setDescription(description); + final VariableList factors = new VariableList(); + factors.add(DMSVariableTestDataInitializer.createVariable(1001, "999", DataType.NUMERIC_VARIABLE.getId(), VariableType.TRAIT)); + final ExperimentValues values = new ExperimentValues(); + values.setVariableList(factors); + values.setGermplasmId(1); + values.setObservationUnitNo(3); + + //Save the experiment + final CropType crop = new CropType(); + crop.setUseUUID(false); + crop.setPlotCodePrefix(CROP_PREFIX); + final ExperimentModel environmentExperiment = this.experimentModelSaver.addExperiment(crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); + + final ExperimentModel experiment = this.experimentModelSaver.addExperiment(crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); final DMSVariableType variableType = new DMSVariableType(); final StandardVariable standardVariable = new StandardVariable(); standardVariable.setId(TermId.TRIAL_INSTANCE_FACTOR.getId()); variableType.setStandardVariable(standardVariable); - final Variable variable = builder.createLocationFactor(geoLocation, variableType); - Assert.assertEquals("The variable description should be set properly since there is a mathcing variable", variable.getValue(), - description); + final Variable variable = builder.createLocationFactor(experiment, variableType, environmentExperiment); + Assert.assertEquals("The variable instance should be set properly since there is a mathcing variable", + environmentExperiment.getObservationUnitNo().toString(), variable.getValue()); } @Test public void testCreateLocationFactorThereIsLocationValue() { - final int typeId = 1000; - final Geolocation geoLocation = new Geolocation(); - final List properties = new ArrayList(); - final GeolocationProperty e = new GeolocationProperty(); - e.setType(typeId); - e.setValue("XXX"); - properties.add(e); - geoLocation.setProperties(properties); - final String description = "XXX"; - geoLocation.setDescription(description); + final VariableList factors = new VariableList(); + final Variable envVariable = DMSVariableTestDataInitializer.createVariable(1001, "999", DataType.NUMERIC_VARIABLE.getId(), VariableType.ENVIRONMENT_DETAIL); final DMSVariableType variableType = new DMSVariableType(); + variableType.setRole(PhenotypicType.TRIAL_ENVIRONMENT); + final StandardVariable standardVariable = new StandardVariable(); - standardVariable.setId(typeId); + standardVariable.setId(1001); + standardVariable.setDataType(new Term(DataType.NUMERIC_VARIABLE.getId(), DataType.NUMERIC_VARIABLE.getName(), DataType.NUMERIC_VARIABLE.getName())); variableType.setStandardVariable(standardVariable); - final Variable variable = builder.createLocationFactor(geoLocation, variableType); - Assert.assertEquals("The variable description should be set properly since there is a mathcing variable", variable.getValue(), - description); + envVariable.setVariableType(variableType); + factors.add(envVariable); + + final ExperimentValues values = new ExperimentValues(); + values.setVariableList(factors); + values.setGermplasmId(1); + values.setObservationUnitNo(3); + + //Save the experiment + final CropType crop = new CropType(); + crop.setUseUUID(false); + crop.setPlotCodePrefix(CROP_PREFIX); + final ExperimentModel environmentExperiment = this.experimentModelSaver.addExperiment(crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); + + final ExperimentModel experiment = this.experimentModelSaver.addExperiment(crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); + + final Variable variable = builder.createLocationFactor(experiment, variableType, environmentExperiment); + Assert.assertEquals("The variable description should be set properly since there is a mathcing variable", + envVariable.getValue(), variable.getValue()); } @Test public void testCreateLocationFactorThereIsNoMatchingLocationValue() { - final int typeId = 1000; - final Geolocation geoLocation = new Geolocation(); - final List properties = new ArrayList(); - final GeolocationProperty e = new GeolocationProperty(); - e.setType(typeId); - properties.add(e); - geoLocation.setProperties(properties); - final String description = "XXX"; - geoLocation.setDescription(description); + final VariableList factors = new VariableList(); + factors.add(DMSVariableTestDataInitializer.createVariable(1000, "999", DataType.NUMERIC_VARIABLE.getId(), VariableType.TRAIT)); + final ExperimentValues values = new ExperimentValues(); + values.setVariableList(factors); + values.setGermplasmId(1); + values.setObservationUnitNo(3); + + //Save the experiment + final CropType crop = new CropType(); + crop.setUseUUID(false); + crop.setPlotCodePrefix(CROP_PREFIX); + final ExperimentModel environmentExperiment = this.experimentModelSaver.addExperiment(crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); + + final ExperimentModel experiment = this.experimentModelSaver.addExperiment(crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); final DMSVariableType variableType = new DMSVariableType(); final StandardVariable standardVariable = new StandardVariable(); standardVariable.setId(1001); variableType.setStandardVariable(standardVariable); - final Variable variable = builder.createLocationFactor(geoLocation, variableType); + final Variable variable = builder.createLocationFactor(experiment, variableType, environmentExperiment); Assert.assertNull("The variable be null", variable); } @@ -182,13 +221,13 @@ public void testCreateGermplasmFactorForNonGermplasmTermId() { Assert.assertNull(variable); } - + @Test public void testAddGermplasmFactors() { final StockModel stockModel = this.createStockModel(); final ExperimentModel experimentModel = new ExperimentModel(); experimentModel.setStock(stockModel); - final Map stockMap = new HashMap(); + final Map stockMap = new HashMap<>(); stockMap.put(stockModel.getStockId(), stockModel); final VariableTypeList variableTypes = new VariableTypeList(); variableTypes.add(this.createDMSVariableType(TermId.ENTRY_NO)); @@ -196,24 +235,24 @@ public void testAddGermplasmFactors() { variableTypes.add(this.createDMSVariableType(TermId.DESIG)); variableTypes.add(this.createDMSVariableType(TermId.ENTRY_CODE)); variableTypes.add(this.createDMSVariableType(TermId.ENTRY_TYPE)); - + final VariableList factors = new VariableList(); builder.addGermplasmFactors(factors, experimentModel, variableTypes, stockMap); final List variables = factors.getVariables(); Assert.assertEquals(5, variables.size()); final Iterator iterator = variables.iterator(); - verifyFactorVariable(iterator.next(), TermId.ENTRY_NO.getId(), stockModel.getUniqueName()); - verifyFactorVariable(iterator.next(), TermId.GID.getId(), String.valueOf(stockModel.getGermplasm().getGid())); - verifyFactorVariable(iterator.next(), TermId.DESIG.getId(), stockModel.getName()); - verifyFactorVariable(iterator.next(), TermId.ENTRY_CODE.getId(), stockModel.getValue()); - verifyFactorVariable(iterator.next(), TermId.ENTRY_TYPE.getId(), stockModel.getProperties().iterator().next().getValue()); + this.verifyFactorVariable(iterator.next(), TermId.ENTRY_NO.getId(), stockModel.getUniqueName()); + this.verifyFactorVariable(iterator.next(), TermId.GID.getId(), String.valueOf(stockModel.getGermplasm().getGid())); + this.verifyFactorVariable(iterator.next(), TermId.DESIG.getId(), stockModel.getName()); + this.verifyFactorVariable(iterator.next(), TermId.ENTRY_CODE.getId(), stockModel.getValue()); + this.verifyFactorVariable(iterator.next(), TermId.ENTRY_TYPE.getId(), stockModel.getProperties().iterator().next().getValue()); } - + @Test public void testAddGermplasmFactors_NoStock() { final StockModel stockModel = this.createStockModel(); final ExperimentModel experimentModel = new ExperimentModel(); - final Map stockMap = new HashMap(); + final Map stockMap = new HashMap<>(); stockMap.put(stockModel.getStockId(), stockModel); final VariableTypeList variableTypes = new VariableTypeList(); variableTypes.add(this.createDMSVariableType(TermId.ENTRY_NO)); @@ -221,12 +260,12 @@ public void testAddGermplasmFactors_NoStock() { variableTypes.add(this.createDMSVariableType(TermId.DESIG)); variableTypes.add(this.createDMSVariableType(TermId.ENTRY_CODE)); variableTypes.add(this.createDMSVariableType(TermId.ENTRY_TYPE)); - + final VariableList factors = new VariableList(); builder.addGermplasmFactors(factors, experimentModel, variableTypes, stockMap); Assert.assertTrue(factors.getVariables().isEmpty()); } - + private void verifyFactorVariable(final Variable variable, final int id, final String value) { Assert.assertEquals(id, variable.getVariableType().getId()); Assert.assertEquals(value, variable.getValue()); diff --git a/src/test/java/org/generationcp/middleware/operation/saver/ExperimentModelSaverTest.java b/src/test/java/org/generationcp/middleware/operation/saver/ExperimentModelSaverTest.java index 1489842789..a7b915d476 100644 --- a/src/test/java/org/generationcp/middleware/operation/saver/ExperimentModelSaverTest.java +++ b/src/test/java/org/generationcp/middleware/operation/saver/ExperimentModelSaverTest.java @@ -5,7 +5,10 @@ import org.generationcp.middleware.dao.dms.ExperimentDao; import org.generationcp.middleware.dao.dms.PhenotypeDao; import org.generationcp.middleware.data.initializer.DMSVariableTestDataInitializer; -import org.generationcp.middleware.domain.dms.*; +import org.generationcp.middleware.domain.dms.ExperimentType; +import org.generationcp.middleware.domain.dms.ExperimentValues; +import org.generationcp.middleware.domain.dms.Variable; +import org.generationcp.middleware.domain.dms.VariableList; import org.generationcp.middleware.domain.oms.TermId; import org.generationcp.middleware.domain.ontology.DataType; import org.generationcp.middleware.domain.ontology.VariableType; @@ -25,7 +28,7 @@ public class ExperimentModelSaverTest extends IntegrationTestBase { private ExperimentModelSaver experimentModelSaver; private ExperimentDao experimentDao; private PhenotypeDao phenotypeDao; - + @Before public void setUp() throws Exception { this.experimentModelSaver = new ExperimentModelSaver(this.sessionProvder); @@ -48,15 +51,17 @@ public void testCreateStudyDesignExperimentProperties() { factors.add(DMSVariableTestDataInitializer.createVariable(104, "1", TermId.NUMERIC_VARIABLE.getId(), VariableType.EXPERIMENTAL_DESIGN)); factors.add(DMSVariableTestDataInitializer.createVariable(105, "Environment", TermId.CHARACTER_VARIABLE.getId(), VariableType.ENVIRONMENT_DETAIL)); - final List experimentProperties = experimentModelSaver.createTrialDesignExperimentProperties(experimentModel, factors); + final List experimentProperties = this.experimentModelSaver + .createTrialDesignExperimentProperties(experimentModel, factors); - Assert.assertEquals(4, experimentProperties.size()); + Assert.assertEquals(5, experimentProperties.size()); // Verify that only Study Design Factors are created Assert.assertEquals(Integer.valueOf(101), experimentProperties.get(0).getTypeId()); Assert.assertEquals(Integer.valueOf(102), experimentProperties.get(1).getTypeId()); Assert.assertEquals(Integer.valueOf(103), experimentProperties.get(2).getTypeId()); Assert.assertEquals(Integer.valueOf(104), experimentProperties.get(3).getTypeId()); + Assert.assertEquals(Integer.valueOf(105), experimentProperties.get(4).getTypeId()); } @@ -70,7 +75,7 @@ public void testCreateTrialDesignPropertyVariableIsCategorical() { final ExperimentModel experimentModel = new ExperimentModel(); final Variable variable = DMSVariableTestDataInitializer.createVariable(variableId, variableValue, TermId.CATEGORICAL_VARIABLE.getId(), VariableType.TREATMENT_FACTOR); - final ExperimentProperty experimentProperty = experimentModelSaver.createTrialDesignProperty(experimentModel, variable); + final ExperimentProperty experimentProperty = this.experimentModelSaver.createTrialDesignProperty(experimentModel, variable); Assert.assertEquals(String.valueOf(1234), experimentProperty.getValue()); Assert.assertSame(experimentModel, experimentProperty.getExperiment()); @@ -88,7 +93,7 @@ public void testCreateTrialDesignPropertyVariableIsNumeric() { final ExperimentModel experimentModel = new ExperimentModel(); final Variable variable = DMSVariableTestDataInitializer.createVariable(variableId, variableValue, TermId.NUMERIC_VARIABLE.getId(), VariableType.TREATMENT_FACTOR); - final ExperimentProperty experimentProperty = experimentModelSaver.createTrialDesignProperty(experimentModel, variable); + final ExperimentProperty experimentProperty = this.experimentModelSaver.createTrialDesignProperty(experimentModel, variable); Assert.assertEquals(variableValue, experimentProperty.getValue()); Assert.assertSame(experimentModel, experimentProperty.getExperiment()); @@ -106,7 +111,7 @@ public void testCreateStudyDesignPropertyVariableIsText() { final ExperimentModel experimentModel = new ExperimentModel(); final Variable variable = DMSVariableTestDataInitializer.createVariable(variableId, variableValue, TermId.CHARACTER_VARIABLE.getId(), VariableType.TREATMENT_FACTOR); - final ExperimentProperty experimentProperty = experimentModelSaver.createTrialDesignProperty(experimentModel, variable); + final ExperimentProperty experimentProperty = this.experimentModelSaver.createTrialDesignProperty(experimentModel, variable); Assert.assertEquals(variableValue, experimentProperty.getValue()); Assert.assertSame(experimentModel, experimentProperty.getExperiment()); @@ -121,7 +126,6 @@ public void testAddOrUpdateExperiment() { factors.add(DMSVariableTestDataInitializer.createVariable(1001, "999", DataType.NUMERIC_VARIABLE.getId(), VariableType.TRAIT)); final ExperimentValues values = new ExperimentValues(); values.setVariableList(factors); - values.setLocationId(this.experimentModelSaver.createNewGeoLocation().getLocationId()); values.setGermplasmId(1); //Save the experiment @@ -129,7 +133,7 @@ public void testAddOrUpdateExperiment() { crop.setUseUUID(false); crop.setPlotCodePrefix(CROP_PREFIX); this.experimentModelSaver.addOrUpdateExperiment(crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); - final ExperimentModel experiment = this.experimentDao.getExperimentByProjectIdAndLocation(1, values.getLocationId()); + final ExperimentModel experiment = this.experimentDao.getById(values.getLocationId()); Assert.assertNotNull(experiment.getObsUnitId()); Assert.assertFalse(experiment.getObsUnitId().matches(ObservationUnitIDGeneratorImplTest.UUID_REGEX)); final Phenotype phenotype = this.phenotypeDao.getPhenotypeByExperimentIdAndObservableId(experiment.getNdExperimentId(), 1001); @@ -142,16 +146,16 @@ public void testAddExperiment() { factors.add(DMSVariableTestDataInitializer.createVariable(1001, "999", DataType.NUMERIC_VARIABLE.getId(), VariableType.TRAIT)); final ExperimentValues values = new ExperimentValues(); values.setVariableList(factors); - values.setLocationId(this.experimentModelSaver.createNewGeoLocation().getLocationId()); values.setGermplasmId(1); + values.setObservationUnitNo(1); //Save the experiment final CropType crop = new CropType(); crop.setUseUUID(false); crop.setPlotCodePrefix(CROP_PREFIX); - this.experimentModelSaver.addExperiment(crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); - final ExperimentModel experiment = this.experimentDao.getExperimentByProjectIdAndLocation(1, values.getLocationId()); - Assert.assertNotNull(experiment.getObsUnitId()); + final ExperimentModel createdExperiment = this.experimentModelSaver.addExperiment(crop, 1, ExperimentType.TRIAL_ENVIRONMENT, values); + final ExperimentModel experiment = this.experimentDao.getById(createdExperiment.getNdExperimentId()); + Assert.assertEquals(values.getObservationUnitNo(), experiment.getObservationUnitNo()); Assert.assertFalse(experiment.getObsUnitId().matches(ObservationUnitIDGeneratorImplTest.UUID_REGEX)); final Phenotype phenotype = this.phenotypeDao.getPhenotypeByExperimentIdAndObservableId(experiment.getNdExperimentId(), 1001); Assert.assertEquals("999", phenotype.getValue()); diff --git a/src/test/java/org/generationcp/middleware/operation/saver/GeolocationSaverTest.java b/src/test/java/org/generationcp/middleware/operation/saver/GeolocationSaverTest.java deleted file mode 100644 index 3b771177a4..0000000000 --- a/src/test/java/org/generationcp/middleware/operation/saver/GeolocationSaverTest.java +++ /dev/null @@ -1,232 +0,0 @@ - -package org.generationcp.middleware.operation.saver; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.List; - -import org.generationcp.middleware.domain.dms.DMSVariableType; -import org.generationcp.middleware.domain.dms.Enumeration; -import org.generationcp.middleware.domain.dms.PhenotypicType; -import org.generationcp.middleware.domain.dms.StandardVariable; -import org.generationcp.middleware.domain.dms.Variable; -import org.generationcp.middleware.domain.dms.VariableList; -import org.generationcp.middleware.domain.etl.MeasurementData; -import org.generationcp.middleware.domain.etl.MeasurementRow; -import org.generationcp.middleware.domain.oms.TermId; -import org.generationcp.middleware.exceptions.MiddlewareQueryException; -import org.generationcp.middleware.hibernate.HibernateSessionProvider; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; - -public class GeolocationSaverTest { - - public static final String EXPERIMENT_DESIGN_FACTOR_RCBD = "RCBD"; - public static final int EXPERIMENT_DESIGN_FACTOR_RCBD_ID = 10110; - - private GeolocationSaver geolocationSaver; - private Geolocation geolocation; - - private enum EnvironmentVariable { - - TRIAL_INSTANCE( - TermId.TRIAL_INSTANCE_FACTOR.getId(), - TermId.TRIAL_INSTANCE_FACTOR.toString(), - PhenotypicType.TRIAL_ENVIRONMENT, - "1"), - LATITUDE(TermId.LATITUDE.getId(), TermId.LATITUDE.toString(), PhenotypicType.TRIAL_ENVIRONMENT, "1.5"), - LONGITUDE(TermId.LONGITUDE.getId(), TermId.LONGITUDE.toString(), PhenotypicType.TRIAL_ENVIRONMENT, "3.6"), - GEODETIC_DATUM(TermId.GEODETIC_DATUM.getId(), TermId.GEODETIC_DATUM.toString(), PhenotypicType.TRIAL_ENVIRONMENT, "1"), - ALTITUDE(TermId.ALTITUDE.getId(), TermId.ALTITUDE.toString(), PhenotypicType.TRIAL_ENVIRONMENT, "5.5"), - ENV_1(1, "ENV_1", PhenotypicType.TRIAL_ENVIRONMENT, "3"), - ENV_2(2, "ENV_2", PhenotypicType.TRIAL_ENVIRONMENT, "4"), - ENV_3(3, "ENV_2", PhenotypicType.TRIAL_ENVIRONMENT, "5"), - ENV_4(TermId.EXPERIMENT_DESIGN_FACTOR.getId(), TermId.EXPERIMENT_DESIGN_FACTOR.name(), PhenotypicType.TRIAL_ENVIRONMENT, - EXPERIMENT_DESIGN_FACTOR_RCBD), - VARIATE_1(4, "VARIATE_1", PhenotypicType.VARIATE, "7"), - VARIATE_2(5, "VARIATE_2", PhenotypicType.VARIATE, "2"); - - private int id; - private String name; - private PhenotypicType role; - private String value; - - EnvironmentVariable(int id, String name, PhenotypicType role, String value) { - this.id = id; - this.name = name; - this.role = role; - this.value = value; - } - - public int getId() { - return this.id; - } - - public String getName() { - return this.name; - } - - public PhenotypicType getRole() { - return this.role; - } - - public String getValue() { - return this.value; - } - } - - @Before - public void setUp() throws MiddlewareQueryException { - this.geolocationSaver = Mockito.spy(new GeolocationSaver(Mockito.mock(HibernateSessionProvider.class))); - Mockito.doReturn(this.geolocation).when(this.geolocationSaver).getGeolocationById(1); - } - - @Test - public void testCreateOrUpdate() throws MiddlewareQueryException { - MeasurementRow row = this.createMeasurementRow(); - VariableList factors = this.createVariableList(); - Geolocation geolocation = this.geolocationSaver.createOrUpdate(factors, row, null); - assertNotNull(geolocation); - assertEquals(EnvironmentVariable.TRIAL_INSTANCE.getValue(), geolocation.getDescription()); - assertEquals(EnvironmentVariable.LATITUDE.getValue(), geolocation.getLatitude().toString()); - assertEquals(EnvironmentVariable.LONGITUDE.getValue(), geolocation.getLongitude().toString()); - assertEquals(EnvironmentVariable.GEODETIC_DATUM.getValue(), geolocation.getGeodeticDatum()); - assertEquals(EnvironmentVariable.ALTITUDE.getValue(), geolocation.getAltitude().toString()); - assertNotNull(geolocation.getProperties()); - assertEquals(4, geolocation.getProperties().size()); - int propertyIndex = 0; - for (GeolocationProperty property : geolocation.getProperties()) { - propertyIndex++; - EnvironmentVariable environmentVariable = null; - if (propertyIndex == 4) { - assertEquals(String.valueOf(GeolocationSaverTest.EXPERIMENT_DESIGN_FACTOR_RCBD_ID), property.getValue()); - continue; - } - switch (propertyIndex) { - case 1: - environmentVariable = EnvironmentVariable.ENV_1; - break; - case 2: - environmentVariable = EnvironmentVariable.ENV_2; - break; - case 3: - environmentVariable = EnvironmentVariable.ENV_3; - break; - } - assertTrue(environmentVariable.getId() == property.getTypeId()); - assertEquals(environmentVariable.getValue(), property.getValue()); - } - assertEquals(2, geolocation.getVariates().size()); - int variateIndex = 0; - for (Variable variable : geolocation.getVariates().getVariables()) { - variateIndex++; - EnvironmentVariable environmentVariable = null; - switch (variateIndex) { - case 1: - environmentVariable = EnvironmentVariable.VARIATE_1; - break; - case 2: - environmentVariable = EnvironmentVariable.VARIATE_2; - break; - } - assertEquals(environmentVariable.getValue(), variable.getValue()); - } - } - - private MeasurementRow createMeasurementRow() { - MeasurementRow row = new MeasurementRow(); - row.setDataList(this.createMeasurementDataList()); - return row; - } - - private List createMeasurementDataList() { - List dataList = new ArrayList(); - for (int i = 0; i < EnvironmentVariable.values().length; i++) { - EnvironmentVariable variable = EnvironmentVariable.values()[i]; - String label = variable.getName(); - String value = variable.getValue(); - dataList.add(this.createMeasurementData(label, value)); - } - return dataList; - } - - private MeasurementData createMeasurementData(String label, String value) { - MeasurementData measurementData = new MeasurementData(); - measurementData.setLabel(label); - measurementData.setValue(value); - return measurementData; - } - - private VariableList createVariableList() { - VariableList variableList = new VariableList(); - for (int i = 0; i < EnvironmentVariable.values().length; i++) { - EnvironmentVariable variable = EnvironmentVariable.values()[i]; - int standardVariableId = variable.getId(); - String name = variable.getName(); - String description = variable.getName() + "_DESC"; - String value = variable.getValue(); - PhenotypicType role = variable.getRole(); - variableList.add(this.createVariable(standardVariableId, name, description, value, i + 1, role)); - } - return variableList; - } - - private Variable createVariable(int standardVariableId, String name, String description, String value, int rank, PhenotypicType role) { - Variable variable = new Variable(); - variable.setVariableType(this.createVariableType(standardVariableId, name, description, rank, role)); - variable.setValue(value); - return variable; - } - - private DMSVariableType createVariableType(int standardVariableId, String name, String description, int rank, PhenotypicType role) { - DMSVariableType variableType = new DMSVariableType(); - variableType.setLocalName(name); - variableType.setLocalDescription(description); - variableType.setRole(role); - variableType.setStandardVariable(this.createStandardVariable(standardVariableId)); - variableType.setRank(rank); - return variableType; - } - - private StandardVariable createStandardVariable(int id) { - StandardVariable standardVariable = new StandardVariable(); - standardVariable.setId(id); - standardVariable.setEnumerations(new ArrayList()); - standardVariable.getEnumerations() - .add(new Enumeration(GeolocationSaverTest.EXPERIMENT_DESIGN_FACTOR_RCBD_ID, GeolocationSaverTest.EXPERIMENT_DESIGN_FACTOR_RCBD, - "", 1)); - return standardVariable; - } - - @Test - public void testSetGeolocation() { - Geolocation geolocation = new Geolocation(); - for (int i = 0; i < 5; i++) { - EnvironmentVariable variable = EnvironmentVariable.values()[i]; - this.geolocationSaver.setGeolocation(geolocation, variable.getId(), variable.getValue()); - switch (i) { - case 0: - assertEquals(variable.getValue(), geolocation.getDescription()); - break; - case 1: - assertEquals(variable.getValue(), geolocation.getLatitude().toString()); - break; - case 2: - assertEquals(variable.getValue(), geolocation.getLongitude().toString()); - break; - case 3: - assertEquals(variable.getValue(), geolocation.getGeodeticDatum()); - break; - case 4: - assertEquals(variable.getValue(), geolocation.getAltitude().toString()); - break; - } - } - } -} diff --git a/src/test/java/org/generationcp/middleware/operation/saver/StudySaverTest.java b/src/test/java/org/generationcp/middleware/operation/saver/StudySaverTest.java index 0536860fac..d6e2ce2d96 100644 --- a/src/test/java/org/generationcp/middleware/operation/saver/StudySaverTest.java +++ b/src/test/java/org/generationcp/middleware/operation/saver/StudySaverTest.java @@ -3,7 +3,6 @@ import org.apache.commons.lang3.RandomStringUtils; import org.generationcp.middleware.IntegrationTestBase; import org.generationcp.middleware.dao.dms.ExperimentDao; -import org.generationcp.middleware.domain.dms.ExperimentType; import org.generationcp.middleware.domain.dms.StudyValues; import org.generationcp.middleware.domain.dms.VariableList; import org.generationcp.middleware.domain.oms.TermId; @@ -30,18 +29,18 @@ public void setup() { } @Test - public void testSaveStudyExperiment() throws Exception { + public void testSaveStudyExperiment() { final StudyValues values = new StudyValues(); values.setVariableList(new VariableList()); - values.setLocationId(this.experimentModelSaver.createNewGeoLocation().getLocationId()); values.setGermplasmId(1); + values.setLocationId(1); //Save the experiment final CropType crop = new CropType(); crop.setUseUUID(false); crop.setPlotCodePrefix(CROP_PREFIX); - this.studySaver.saveStudyExperiment(crop, 1, values); - final ExperimentModel experiment = this.experimentDao.getExperimentByProjectIdAndLocation(1, values.getLocationId()); + final ExperimentModel savedStudyExperiment = this.studySaver.saveStudyExperiment(crop, 1, values); + final ExperimentModel experiment = this.experimentDao.getById(savedStudyExperiment.getNdExperimentId()); Assert.assertNotNull(experiment.getObsUnitId()); Assert.assertFalse(experiment.getObsUnitId().matches(ObservationUnitIDGeneratorImplTest.UUID_REGEX)); Assert.assertEquals(TermId.STUDY_INFORMATION.getId(), experiment.getTypeId().intValue()); diff --git a/src/test/java/org/generationcp/middleware/operation/saver/WorkbookSaverTest.java b/src/test/java/org/generationcp/middleware/operation/saver/WorkbookSaverTest.java index 3a55746ef4..48fc0611b7 100644 --- a/src/test/java/org/generationcp/middleware/operation/saver/WorkbookSaverTest.java +++ b/src/test/java/org/generationcp/middleware/operation/saver/WorkbookSaverTest.java @@ -33,16 +33,20 @@ import org.generationcp.middleware.domain.ontology.Scale; import org.generationcp.middleware.domain.study.StudyTypeDto; import org.generationcp.middleware.hibernate.HibernateSessionProvider; +import org.generationcp.middleware.manager.DaoFactory; import org.generationcp.middleware.manager.Operation; import org.generationcp.middleware.manager.ontology.OntologyDataHelper; import org.generationcp.middleware.operation.transformer.etl.VariableTypeListTransformer; import org.generationcp.middleware.pojos.Location; +import org.generationcp.middleware.util.StringUtil; import org.generationcp.middleware.utils.test.TestOutputFormatter; import org.generationcp.middleware.utils.test.VariableTypeListDataUtil; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; +import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.Arrays; @@ -55,14 +59,19 @@ public class WorkbookSaverTest extends TestOutputFormatter { - private static WorkbookSaver workbookSaver; + private WorkbookSaver workbookSaver; private static final String COOPERATOR = "Cooperator"; private static final int COOPERATOR_NAME = 8373; - @BeforeClass - public static void setUp() { - WorkbookSaverTest.workbookSaver = new WorkbookSaver(Mockito.mock(HibernateSessionProvider.class)); + @Mock + private DaoFactory daoFactory; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + this.workbookSaver = new WorkbookSaver(Mockito.mock(HibernateSessionProvider.class)); + this.workbookSaver.setDaoFactory(this.daoFactory); } @Test @@ -71,7 +80,7 @@ public void testPropagationOfStudyFactorsWithStudyVariablesAndWOStudyFactorWithE final VariableTypeList trialVariables = VariableTypeListDataUtil.createVariableTypeList(true); final VariableTypeList plotVariables = - WorkbookSaverTest.workbookSaver.propagateTrialFactorsIfNecessary(effectVariables, trialVariables); + this.workbookSaver.propagateTrialFactorsIfNecessary(effectVariables, trialVariables); Assert.assertEquals("Expected an aditional entry for trial instance but found none.", effectVariables.size() + 1, plotVariables.size()); @@ -110,7 +119,7 @@ public void testPropagationOfStudyFactorsWithStudyVariablesAndWOStudyFactorWOEnv final VariableTypeList trialVariables = VariableTypeListDataUtil.createVariableTypeList(false); final VariableTypeList plotVariables = - WorkbookSaverTest.workbookSaver.propagateTrialFactorsIfNecessary(effectVariables, trialVariables); + this.workbookSaver.propagateTrialFactorsIfNecessary(effectVariables, trialVariables); Assert.assertEquals("Expected an aditional entry for trial instance but found none.", effectVariables.size() + 1, plotVariables.size()); @@ -124,7 +133,7 @@ public void testPropagationOfStudyFactorsWithStudyVariablesAndStudyFactor() { final VariableTypeList trialVariables = VariableTypeListDataUtil.createVariableTypeList(false); final VariableTypeList plotVariables = - WorkbookSaverTest.workbookSaver.propagateTrialFactorsIfNecessary(effectVariables, trialVariables); + this.workbookSaver.propagateTrialFactorsIfNecessary(effectVariables, trialVariables); Assert.assertEquals("Expected no change in the plot dataset but found one.", effectVariables.size(), plotVariables.size()); } @@ -135,7 +144,7 @@ public void testPropagationOfStudyFactorsWOStudyVariablesWithStudyFactor() { final VariableTypeList trialVariables = null; final VariableTypeList plotVariables = - WorkbookSaverTest.workbookSaver.propagateTrialFactorsIfNecessary(effectVariables, trialVariables); + this.workbookSaver.propagateTrialFactorsIfNecessary(effectVariables, trialVariables); Assert.assertEquals("Expected no change in the plot dataset but found one.", effectVariables.size(), plotVariables.size()); } @@ -145,7 +154,7 @@ public void testRemoveConstantsVariables() { final Workbook workbook = WorkbookTestDataInitializer.createTestWorkbook(2, StudyTypeDto.getNurseryDto(), "TEST STUDY", 1, true); final VariableTypeList variableTypeList = this.createVariableTypeList(workbook.getConstants(), 1); Assert.assertTrue("The variable type list should have contents.", variableTypeList.getVariableTypes().size() > 0); - WorkbookSaverTest.workbookSaver.removeConstantsVariables(variableTypeList, workbook.getConstants()); + this.workbookSaver.removeConstantsVariables(variableTypeList, workbook.getConstants()); Assert.assertEquals("All the variable should be removed.", 0, variableTypeList.getVariableTypes().size()); } @@ -154,14 +163,14 @@ public void testSetVariableListValues() { final Workbook workbook = WorkbookTestDataInitializer.createTestWorkbook(2, StudyTypeDto.getNurseryDto(), "TEST STUDY", 1, true); WorkbookTestDataInitializer.setTrialObservations(workbook); final VariableTypeList variableTypeList = this.createVariableTypeList(workbook.getConditions(), 1); - final VariableList variableList = WorkbookSaverTest.workbookSaver.getVariableListTransformer() + final VariableList variableList = this.workbookSaver.getVariableListTransformer() .transformTrialEnvironment(workbook.getTrialObservation(0), variableTypeList); for (final Variable variable : variableList.getVariables()) { // set values to null to check if the values are really set properly variable.setValue(null); } - WorkbookSaverTest.workbookSaver.setVariableListValues(variableList, workbook.getConditions()); + this.workbookSaver.setVariableListValues(variableList, workbook.getConditions()); for (final Variable variable : variableList.getVariables()) { Assert.assertNotNull(variable.getValue()); @@ -173,7 +182,7 @@ public void testSetCategoricalVariableValues() { final MeasurementVariable mvar = MeasurementVariableTestDataInitializer.createMeasurementVariable(1001, "1"); mvar.setPossibleValues(ValueReferenceTestDataInitializer.createPossibleValues()); final Variable variable = new Variable(); - WorkbookSaverTest.workbookSaver.setCategoricalVariableValues(mvar, variable); + this.workbookSaver.setCategoricalVariableValues(mvar, variable); Assert.assertNotNull(variable.getValue()); Assert.assertEquals("1", variable.getValue()); } @@ -183,14 +192,14 @@ public void testPropagationOfStudyFactorsWOStudyVariablesAndStudyFactor() { final VariableTypeList effectVariables = VariableTypeListDataUtil.createPlotVariableTypeList(false); final VariableTypeList variables = null; - final VariableTypeList plotVariables = WorkbookSaverTest.workbookSaver.propagateTrialFactorsIfNecessary(effectVariables, variables); + final VariableTypeList plotVariables = this.workbookSaver.propagateTrialFactorsIfNecessary(effectVariables, variables); Assert.assertEquals("Expected no change in the plot dataset but found one.", effectVariables.size(), plotVariables.size()); } @SuppressWarnings({"unchecked", "rawtypes"}) @Test - public void testSaveVariables() throws Exception { + public void testSaveVariables() { final String programUUID = "abc"; final String studyName = "nursery_1" + new Random().nextInt(10000); @@ -255,9 +264,9 @@ private StandardVariable transformMeasurementVariableToVariable(final Measuremen standardVariable.setName(measurementVariable.getName()); standardVariable.setDescription(measurementVariable.getDescription()); - final Integer methodId = new Random().nextInt(10000); - final Integer propertyId = new Random().nextInt(10000); - final Integer scaleId = new Random().nextInt(10000); + final int methodId = new Random().nextInt(10000); + final int propertyId = new Random().nextInt(10000); + final int scaleId = new Random().nextInt(10000); standardVariable.setMethod(new Method(new Term(methodId, measurementVariable.getMethod(), "Method Description"))); standardVariable.setProperty(new Property(new Term(propertyId, measurementVariable.getProperty(), "Property Description"))); @@ -317,7 +326,7 @@ public void testRemoveDeletedStudyObservations() throws Exception { } - WorkbookSaverTest.workbookSaver.removeDeletedVariablesAndObservations(workbook); + this.workbookSaver.removeDeletedVariablesAndObservations(workbook); Assert.assertEquals(0, workbook.getTrialObservations().get(0).getMeasurementVariables().size()); } @@ -326,10 +335,11 @@ public void testRemoveDeletedStudyObservations() throws Exception { public void testAssignLocationVariableWithUnspecifiedLocationIfEmptyValueIsEmpty() { final LocationDAO locationDAO = Mockito.mock(LocationDAO.class); + Mockito.when(this.daoFactory.getLocationDAO()).thenReturn(locationDAO); final VariableList variableList = new VariableList(); // Set the LOCATION_ID variable value to empty - final Variable locationVariable = createLocationVariable(); + final Variable locationVariable = this.createLocationVariable(); locationVariable.setValue(null); variableList.add(locationVariable); @@ -339,7 +349,7 @@ public void testAssignLocationVariableWithUnspecifiedLocationIfEmptyValueIsEmpty final List locations = Arrays.asList(unspecifiedLocation); Mockito.when(locationDAO.getByName(Location.UNSPECIFIED_LOCATION, Operation.EQUAL)).thenReturn(locations); - workbookSaver.assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid(variableList, locationDAO); + workbookSaver.assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid(variableList, locations); Assert.assertEquals(String.valueOf(unspecifiedLocationlocid), locationVariable.getValue()); @@ -351,17 +361,18 @@ public void testAssignLocationVariableWithUnspecifiedLocationIfEmptyValueIsEmpty final List nullLocation = new ArrayList<>(); Mockito.when(locationDAO.getByIds(invalidLocationId)).thenReturn(nullLocation); - workbookSaver.assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid(variableList, locationDAO); - Assert.assertEquals(String.valueOf(unspecifiedLocationlocid), locationVariable.getValue()); + workbookSaver.assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid(variableList, nullLocation); + Assert.assertEquals("", locationVariable.getValue()); } @Test public void testAssignLocationVariableWithUnspecifiedLocationIfLocationIdExists() { final LocationDAO locationDAO = Mockito.mock(LocationDAO.class); + Mockito.when(this.daoFactory.getLocationDAO()).thenReturn(locationDAO); final VariableList variableList = new VariableList(); - final Variable locationVariable = createLocationVariable(); + final Variable locationVariable = this.createLocationVariable(); // Set the value of LOCATION_ID variable final String locationIdVariableValue = "999"; locationVariable.setValue(locationIdVariableValue); @@ -379,7 +390,7 @@ public void testAssignLocationVariableWithUnspecifiedLocationIfLocationIdExists( retrievedLocation.add(existingLocation); Mockito.when(locationDAO.getByIds(existingLocationId)).thenReturn(retrievedLocation); - workbookSaver.assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid(variableList, locationDAO); + workbookSaver.assignLocationVariableWithUnspecifiedLocationIfEmptyOrInvalid(variableList, retrievedLocation); Assert.assertEquals(Integer.valueOf(locationIdVariableValue), retrievedLocation.get(0).getLocid()); @@ -399,14 +410,14 @@ private Variable createLocationVariable() { } private List createObservations(final int noOfTrialInstances, final Workbook workbook) { - final List observations = new ArrayList(); + final List observations = new ArrayList<>(); MeasurementRow row; List dataList; for (int i = 0; i < noOfTrialInstances; i++) { row = new MeasurementRow(); - dataList = new ArrayList(); + dataList = new ArrayList<>(); MeasurementData data = new MeasurementData(); data = new MeasurementData(WorkbookSaverTest.COOPERATOR, "COOPERATOR_NAME"); diff --git a/src/test/java/org/generationcp/middleware/operation/transformer/etl/ExperimentValuesTransformerTest.java b/src/test/java/org/generationcp/middleware/operation/transformer/etl/ExperimentValuesTransformerTest.java index 453620ea64..15f3b7d590 100644 --- a/src/test/java/org/generationcp/middleware/operation/transformer/etl/ExperimentValuesTransformerTest.java +++ b/src/test/java/org/generationcp/middleware/operation/transformer/etl/ExperimentValuesTransformerTest.java @@ -12,6 +12,7 @@ package org.generationcp.middleware.operation.transformer.etl; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import org.generationcp.middleware.domain.dms.DMSVariableType; @@ -34,16 +35,16 @@ public class ExperimentValuesTransformerTest extends TestOutputFormatter { private static ExperimentValuesTransformer transformer; @BeforeClass - public static void setUp() throws Exception { + public static void setUp() { ExperimentValuesTransformerTest.transformer = new ExperimentValuesTransformer(Mockito.mock(HibernateSessionProvider.class)); } @Test - public void testTransform() throws Exception { - MeasurementRow mRow = this.createMeasurementRowTestData(); - VariableTypeList varTypeList = this.createVariableTypeListTestData(); + public void testTransform() { + final MeasurementRow mRow = this.createMeasurementRowTestData(); + final VariableTypeList varTypeList = this.createVariableTypeListTestData(); - ExperimentValues expVal = ExperimentValuesTransformerTest.transformer.transform(mRow, varTypeList, null); + final ExperimentValues expVal = ExperimentValuesTransformerTest.transformer.transform(mRow, varTypeList, null, new HashMap<>()); Assert.assertNotNull(expVal); Debug.println(TestOutputFormatter.INDENT, expVal.toString()); @@ -51,8 +52,8 @@ public void testTransform() throws Exception { } private VariableTypeList createVariableTypeListTestData() { - VariableTypeList varTypeList = new VariableTypeList(); - StandardVariable standardVariable = new StandardVariable(); + final VariableTypeList varTypeList = new VariableTypeList(); + final StandardVariable standardVariable = new StandardVariable(); standardVariable.setId(2); varTypeList.add(new DMSVariableType("ENTRY", "localDescription1", standardVariable, 1)); @@ -64,25 +65,25 @@ private VariableTypeList createVariableTypeListTestData() { } private MeasurementRow createMeasurementRowTestData() { - MeasurementRow mRow = new MeasurementRow(); + final MeasurementRow mRow = new MeasurementRow(); mRow.setStockId(1); mRow.setLocationId(1); - List dataList = new ArrayList(); + final List dataList = new ArrayList<>(); - MeasurementData data1 = new MeasurementData("ENTRY", "1"); + final MeasurementData data1 = new MeasurementData("ENTRY", "1"); data1.setMeasurementVariable(new MeasurementVariable()); dataList.add(data1); - MeasurementData data2 = new MeasurementData("GID", "-1"); + final MeasurementData data2 = new MeasurementData("GID", "-1"); data2.setMeasurementVariable(new MeasurementVariable()); dataList.add(data2); - MeasurementData data3 = new MeasurementData("DESIG", "TIANDOUGOU-9"); + final MeasurementData data3 = new MeasurementData("DESIG", "TIANDOUGOU-9"); data3.setMeasurementVariable(new MeasurementVariable()); dataList.add(data3); - MeasurementData data4 = new MeasurementData("CROSS", "-"); + final MeasurementData data4 = new MeasurementData("CROSS", "-"); data4.setMeasurementVariable(new MeasurementVariable()); dataList.add(data4); diff --git a/src/test/java/org/generationcp/middleware/operation/transformer/etl/StudyValuesTransformerTest.java b/src/test/java/org/generationcp/middleware/operation/transformer/etl/StudyValuesTransformerTest.java index 1a9d3d8a48..b69c38a7f6 100644 --- a/src/test/java/org/generationcp/middleware/operation/transformer/etl/StudyValuesTransformerTest.java +++ b/src/test/java/org/generationcp/middleware/operation/transformer/etl/StudyValuesTransformerTest.java @@ -40,16 +40,14 @@ public void setUp() throws Exception { } @Test - public void testTransform() throws Exception { + public void testTransform() { - final Integer germplasmId = Integer.valueOf(1); - final Integer locationId = Integer.valueOf(1); - final StudyDetails studyDetails = this.createStudyDetailsTestData(); + this.createStudyDetailsTestData(); final List measurementVariables = this.createMeasurementVariableListTestData(); final VariableTypeList varTypeList = this.createVariableTypeListTestData(); final StudyValues studyVal = - StudyValuesTransformerTest.transformer.transform(germplasmId, locationId, measurementVariables, varTypeList); + StudyValuesTransformerTest.transformer.transform(measurementVariables, varTypeList); final VariableList result = studyVal.getVariableList(); @@ -72,7 +70,7 @@ private StudyDetails createStudyDetailsTestData() { } private List createMeasurementVariableListTestData() { - final List mVarList = new ArrayList(); + final List mVarList = new ArrayList<>(); mVarList.add(new MeasurementVariable("STUDY1", "Name of Principal Investigator", "DBCV", "ASSIGNED", "PERSON", "C", "value0", "STUDY")); diff --git a/src/test/java/org/generationcp/middleware/service/DataImportServiceImplITTest.java b/src/test/java/org/generationcp/middleware/service/DataImportServiceImplITTest.java index f4ccb37c67..daac211eda 100644 --- a/src/test/java/org/generationcp/middleware/service/DataImportServiceImplITTest.java +++ b/src/test/java/org/generationcp/middleware/service/DataImportServiceImplITTest.java @@ -11,17 +11,9 @@ package org.generationcp.middleware.service; -import java.io.File; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Random; - import org.generationcp.middleware.IntegrationTestBase; import org.generationcp.middleware.dao.GermplasmDAO; import org.generationcp.middleware.dao.LocationDAO; -import org.generationcp.middleware.dao.dms.GeolocationDao; import org.generationcp.middleware.data.initializer.WorkbookTestDataInitializer; import org.generationcp.middleware.domain.etl.Workbook; import org.generationcp.middleware.domain.study.StudyTypeDto; @@ -29,7 +21,6 @@ import org.generationcp.middleware.exceptions.WorkbookParserException; import org.generationcp.middleware.operation.parser.WorkbookParser; import org.generationcp.middleware.pojos.Location; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.workbench.CropType; import org.generationcp.middleware.service.api.DataImportService; import org.generationcp.middleware.service.api.FieldbookService; @@ -39,21 +30,24 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Test; -import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Random; + public class DataImportServiceImplITTest extends IntegrationTestBase { - public static final int CURRENT_IBDB_USER_ID = 1; + private static final int CURRENT_IBDB_USER_ID = 1; @Autowired private DataImportService dataImportService; @Autowired private FieldbookService fieldbookService; - // TODO need setup - private GeolocationDao geolocationDao; - private static final String PROGRAM_UUID = "123456789"; private final String cropPrefix = "ABCD"; private CropType cropType; @@ -63,9 +57,6 @@ public class DataImportServiceImplITTest extends IntegrationTestBase { @Before public void setUp() { - this.geolocationDao = new GeolocationDao(); - this.geolocationDao.setSession(this.sessionProvder.getSession()); - this.cropType = new CropType(); this.cropType.setPlotCodePrefix(this.cropPrefix); @@ -343,7 +334,7 @@ protected void testFileAgainstExpectedErrorCondition(final String qualifiedFilen @Ignore @Test - public void testCheckIfProjectNameIsExisting() throws Exception { + public void testCheckIfProjectNameIsExisting() { // try to save first then use the name of the saved study final Workbook workbook = WorkbookTestDataInitializer.getTestWorkbook(); workbook.print(IntegrationTestBase.INDENT); @@ -362,25 +353,6 @@ public void testCheckIfProjectNameIsExisting() throws Exception { Assert.assertFalse(isExisting); } - @Ignore - @Test - public void getLocationIdByProjectNameAndDescription() { - // try to save first then use the name of the saved study - final Workbook workbook = WorkbookTestDataInitializer.getTestWorkbook(); - workbook.print(IntegrationTestBase.INDENT); - this.dataImportService.saveDataset(workbook, true, false, DataImportServiceImplITTest.PROGRAM_UUID, - this.cropType); - final String name = workbook.getStudyDetails().getStudyName(); - Debug.println(IntegrationTestBase.INDENT, "Name: " + name); - final Integer locationId = this.dataImportService.getLocationIdByProjectNameAndDescriptionAndProgramUUID(name, - "1", DataImportServiceImplITTest.PROGRAM_UUID); - Assert.assertNotNull(locationId); - final Geolocation geolocation = this.geolocationDao.getById(locationId); - Assert.assertNotNull(geolocation); - Assert.assertEquals(locationId, geolocation.getLocationId()); - Assert.assertEquals("1", geolocation.getDescription()); - } - @Ignore @Test public void testSaveProjectOntology() { diff --git a/src/test/java/org/generationcp/middleware/service/impl/dataset/DatasetServiceImplIntegrationTest.java b/src/test/java/org/generationcp/middleware/service/impl/dataset/DatasetServiceImplIntegrationTest.java index 585be00a81..4d10646581 100644 --- a/src/test/java/org/generationcp/middleware/service/impl/dataset/DatasetServiceImplIntegrationTest.java +++ b/src/test/java/org/generationcp/middleware/service/impl/dataset/DatasetServiceImplIntegrationTest.java @@ -160,7 +160,7 @@ private void createTestStudyWithSubObservations() { .createChildrenGermplasm(DataSetupTest.NUMBER_OF_GERMPLASM, "PREFF", parentGermplasm); this.studyId = this.dataSetupTest.createNurseryForGermplasm(this.commonTestProject.getUniqueID(), gids, "ABCD"); - this.instanceIds = new ArrayList<>(this.studyDataManager.getInstanceGeolocationIdsMap(this.studyId).values()); +// this.instanceIds = new ArrayList<>(this.studyDataManager.getInstanceGeolocationIdsMap(this.studyId).values()); final DatasetDTO datasetDTO = this.datasetService.generateSubObservationDataset(this.studyId, "TEST NURSERY SUB OBS", DatasetTypeEnum.PLANT_SUBOBSERVATIONS.getId(), this.instanceIds, 8206, 2, this.studyId + 2); diff --git a/src/test/java/org/generationcp/middleware/service/impl/dataset/DatasetServiceImplTest.java b/src/test/java/org/generationcp/middleware/service/impl/dataset/DatasetServiceImplTest.java index 3730010c3e..25246ecbda 100644 --- a/src/test/java/org/generationcp/middleware/service/impl/dataset/DatasetServiceImplTest.java +++ b/src/test/java/org/generationcp/middleware/service/impl/dataset/DatasetServiceImplTest.java @@ -187,7 +187,7 @@ public void testUpdateDependentPhenotypesStatusByGeolocation() { when(this.formulaDao.getByInputIds(Arrays.asList(inputId))).thenReturn(Arrays.asList(formula)); this.datasetService.updateDependentPhenotypesStatusByGeolocation(1, Arrays.asList(inputId)); verify(this.formulaDao).getByInputIds(Arrays.asList(inputId)); - verify(this.phenotypeDao).updateOutOfSyncPhenotypesByGeolocation(1, Sets.newHashSet(targetCVTerm.getCvTermId())); + verify(this.phenotypeDao).updateOutOfSyncPhenotypesByEnvironment(1, Sets.newHashSet(targetCVTerm.getCvTermId())); } @Test @@ -367,7 +367,7 @@ public void testIsValidObservation() { @Test public void testCountPhenotypesByInstance() { final long count = 6; - Mockito.when(this.phenotypeDao.countPhenotypesForDatasetAndInstance(ArgumentMatchers.anyInt(), ArgumentMatchers.anyInt())).thenReturn(count); + Mockito.when(this.phenotypeDao.countPhenotypesForDatasetAndInstance(ArgumentMatchers.anyInt(), ArgumentMatchers.anyBoolean(), ArgumentMatchers.anyInt())).thenReturn(count); Assert.assertEquals(count, this.datasetService.countObservationsByInstance(1, 2)); } @@ -572,7 +572,7 @@ public void testGetDatasetInstances() { final Random random = new Random(); final int datasetId = random.nextInt(); this.datasetService.getDatasetInstances(datasetId); - Mockito.verify(this.dmsProjectDao).getDatasetInstances(datasetId); + Mockito.verify(this.dmsProjectDao).getDatasetInstances(datasetId, null); } @Test @@ -816,7 +816,7 @@ public void testDiscardDraftDataDeletingRowWithEmpty() { @Test public void testAcceptDraftDataDeletingRowWithEmpty() { - final Integer studyId = 2; + final int studyId = 2; final Integer datasetId = 3; final DmsProject project = new DmsProject(); @@ -859,7 +859,7 @@ public void testAcceptDraftDataDeletingRowWithEmpty() { @Test public void testSetAsMissingDraftDataValidValue() { - final Integer studyId = 2; + final int studyId = 2; final Integer datasetId = 3; final DmsProject project = new DmsProject(); @@ -993,7 +993,8 @@ public void testSaveSubObservationUnits() { final List plotSubObsUnits = subObsExperiments.subList(i * numberOfSubObsUnits, (i + 1) * numberOfSubObsUnits); for (final ExperimentModel subObsUnit : plotSubObsUnits) { Assert.assertEquals(plotExperiment, subObsUnit.getParent()); - Assert.assertEquals(plotExperiment.getGeoLocation(), subObsUnit.getGeoLocation()); + // TODO IBP-3389 Fix assertion +// Assert.assertEquals(plotExperiment.getGeoLocation(), subObsUnit.getGeoLocation()); Assert.assertEquals(plotExperiment.getStock(), subObsUnit.getStock()); Assert.assertEquals(plotExperiment.getTypeId(), subObsUnit.getTypeId()); Assert.assertNotNull(subObsUnit.getObsUnitId()); @@ -1085,7 +1086,7 @@ private List getPlotExperiments(final Integer count) { final ExperimentModel plot= new ExperimentModel(); final Geolocation geoLocation = new Geolocation(); geoLocation.setLocationId(random.nextInt()); - plot.setGeoLocation(geoLocation); +// plot.setGeoLocation(geoLocation); final StockModel stock = new StockModel(); stock.setStockId(random.nextInt()); plot.setStock(stock); diff --git a/src/test/java/org/generationcp/middleware/service/impl/study/ObservationQueryTest.java b/src/test/java/org/generationcp/middleware/service/impl/study/ObservationQueryTest.java index 3bc991fcd0..93fbd15216 100644 --- a/src/test/java/org/generationcp/middleware/service/impl/study/ObservationQueryTest.java +++ b/src/test/java/org/generationcp/middleware/service/impl/study/ObservationQueryTest.java @@ -6,6 +6,7 @@ import java.util.LinkedList; import java.util.List; +import org.generationcp.middleware.domain.oms.TermId; import org.generationcp.middleware.enumeration.DatasetTypeEnum; import org.generationcp.middleware.pojos.gdms.Dataset; import org.generationcp.middleware.service.api.study.MeasurementVariableDto; @@ -19,8 +20,7 @@ /** * The class QueryTest contains tests for the class {@link ObservationQuery}. * - * @generatedBy CodePro at 17/04/15 3:08 PM - * @author Akhil + * @author Akhil * @version $Revision: 1.0 $ */ public class ObservationQueryTest { @@ -28,10 +28,10 @@ public class ObservationQueryTest { private static final String PH_CM = "PH_cm"; private static final String STOCK_ID = "STOCK_ID"; private static final String FACT1 = "FACT1"; - final BasicFormatterImpl formattedSQL = new BasicFormatterImpl(); - final List germplasmDescriptors = Lists.newArrayList(STOCK_ID); - final List designFactors = Lists.newArrayList(FACT1); - List traitNames = new LinkedList<>(); + final private BasicFormatterImpl formattedSQL = new BasicFormatterImpl(); + private final List germplasmDescriptors = Lists.newArrayList(STOCK_ID); + private final List designFactors = Lists.newArrayList(FACT1); + private List traitNames = new LinkedList<>(); private ObservationQuery observationQuery; @@ -45,19 +45,16 @@ public void setup() { /** * Run the String generateQuery(String,List) method test. * - * @throws Exception - * - * @generatedBy CodePro at 17/04/15 3:08 PM */ @Test - public void testGetAllMeasurementsQueryGeneration() throws Exception { + public void testGetAllMeasurementsQueryGeneration() { final String result = this.observationQuery.getAllObservationsQuery(this.traitNames, this.germplasmDescriptors, this.designFactors, null, null); assertEquals("The generated query must match the expected query.", this.formatString(this.expectedQueryForAllMeasurements()), this.formatString(result)); } @Test - public void testGetSingleMeasurementQueryGeneration() throws Exception { + public void testGetSingleMeasurementQueryGeneration() { final String result = this.observationQuery.getSingleObservationQuery(this.traitNames, this.germplasmDescriptors, this.designFactors); assertEquals("The generated query must match the expected query.", this.formatString(this.expectedQueryForSingleMeasurement()), this.formatString(result)); @@ -65,18 +62,22 @@ public void testGetSingleMeasurementQueryGeneration() throws Exception { @Test public void testGetSampleObservationQuery() { - final String sql = "SELECT \n" + " nde.nd_experiment_id as nd_experiment_id,\n" - + " (select na.nval from names na where na.gid = s.dbxref_id and na.nstat = 1 limit 1) as preferred_name,\n" + " ph.value" - + " as value, s.dbxref_id as gid" - + " FROM \n" + " project p \n" - + " INNER JOIN nd_experiment nde ON nde.project_id = p.project_id \n" - + " INNER JOIN nd_geolocation gl ON nde.nd_geolocation_id = gl.nd_geolocation_id \n" - + " INNER JOIN stock s ON s.stock_id = nde.stock_id \n" - + " LEFT JOIN phenotype ph ON nde.nd_experiment_id = ph.nd_experiment_id \n" - + " LEFT JOIN cvterm cvterm_variable ON cvterm_variable.cvterm_id = ph.observable_id \n" - + " WHERE \n" - + "\tp.project_id = :datasetId \n" + " AND gl.description IN (:instanceIds) \n" - + " and cvterm_variable.cvterm_id = :selectionVariableId\n" + " GROUP BY nde.nd_experiment_id"; + final String sql = "SELECT nde.nd_experiment_id as nd_experiment_id, " + + " (select na.nval from names na where na.gid = s.dbxref_id and na.nstat = 1 limit 1) as preferred_name, " + + " ph.value as value, " + + " s.dbxref_id as gid " + + " FROM nd_experiment nde " + + " LEFT JOIN nd_experiment plot ON plot.nd_experiment_id = nde.parent_id " + + " INNER JOIN project p ON p.project_id = nde.project_id " + + " INNER JOIN project env_ds ON env_ds.study_id = p.study_id AND env_ds.dataset_type_id = " + + DatasetTypeEnum.SUMMARY_DATA.getId() + + " INNER JOIN nd_experiment env ON env_ds.project_id = env.project_id AND env.type_id = " + + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + " AND (nde.parent_id = env.nd_experiment_id OR plot.parent_id = env.nd_experiment_id) " + + " INNER JOIN stock s ON s.stock_id = nde.stock_id " + + " LEFT JOIN phenotype ph ON nde.nd_experiment_id = ph.nd_experiment_id " + + " LEFT JOIN cvterm cvterm_variable ON cvterm_variable.cvterm_id = ph.observable_id " + + " WHERE p.project_id = :datasetId AND env.observation_unit_no IN (:instanceIds) and cvterm_variable.cvterm_id = :selectionVariableId " + + " GROUP BY nde.nd_experiment_id"; assertEquals("The generated query must match the expected query.", this.formatString(sql), this.formatString(this.observationQuery.getSampleObservationQuery())); } @@ -97,74 +98,66 @@ private String formatString(final String format) { } private String expectedQueryForAllMeasurements() { - return "SELECT \n" - + " nde.nd_experiment_id,\n" - + " gl.description AS TRIAL_INSTANCE,\n" - + " (SELECT iispcvt.definition FROM stockprop isp INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = isp.type_id INNER JOIN cvterm iispcvt ON iispcvt.cvterm_id = isp.value WHERE isp.stock_id = s.stock_id AND ispcvt.name = 'ENTRY_TYPE') ENTRY_TYPE, \n" - + " s.dbxref_id AS GID,\n" - + " s.name DESIGNATION,\n" - + " s.uniquename ENTRY_NO,\n" - + " s.value as ENTRY_CODE,\n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'REP_NO') REP_NO, \n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'PLOT_NO') PLOT_NO, \n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'BLOCK_NO') BLOCK_NO, \n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'ROW') ROW, \n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'COL') COL, \n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'FIELDMAP COLUMN') 'FIELDMAP COLUMN', \n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'FIELDMAP RANGE') 'FIELDMAP RANGE', \n" - + " (SELECT coalesce(nullif(count(sp.sample_id), 0), '-') FROM sample AS sp INNER JOIN nd_experiment sp_nde ON sp.nd_experiment_id = sp_nde.nd_experiment_id WHERE sp_nde.nd_experiment_id = nde.nd_experiment_id OR sp_nde.parent_id = nde.nd_experiment_id) 'SUM_OF_SAMPLES', \n" - + " nde.obs_unit_id as OBS_UNIT_ID," - + " MAX(IF(cvterm_variable.name = '" + ObservationQueryTest.PH_CM + "', ph.value, NULL)) AS '" + ObservationQueryTest.PH_CM + "', \n" - + " MAX(IF(cvterm_variable.name = '" + ObservationQueryTest.PH_CM + "', ph.phenotype_id, NULL)) AS '" + ObservationQueryTest.PH_CM + "_PhenotypeId', \n" - + " MAX(IF(cvterm_variable.name = '" + ObservationQueryTest.PH_CM + "', ph.status, NULL)) AS '" + ObservationQueryTest.PH_CM + "_Status', \n" - + " (SELECT sprop.value FROM stockprop sprop INNER JOIN cvterm spropcvt ON spropcvt.cvterm_id = sprop.type_id WHERE sprop.stock_id = s.stock_id AND spropcvt.name = '" + ObservationQueryTest.STOCK_ID + "') '" + ObservationQueryTest.STOCK_ID + "', \n" - + " (SELECT xprop.value FROM nd_experimentprop xprop INNER JOIN cvterm xpropcvt ON xpropcvt.cvterm_id = xprop.type_id WHERE xprop.nd_experiment_id = nde.nd_experiment_id AND xpropcvt.name = '" + ObservationQueryTest.FACT1 + "') '" + ObservationQueryTest.FACT1 + "', \n" - + " 1=1 FROM \n" - + " project p \n" - + " INNER JOIN nd_experiment nde ON nde.project_id = p.project_id \n" - + " INNER JOIN nd_geolocation gl ON nde.nd_geolocation_id = gl.nd_geolocation_id \n" - + " INNER JOIN stock s ON s.stock_id = nde.stock_id \n" - + " LEFT JOIN phenotype ph ON nde.nd_experiment_id = ph.nd_experiment_id \n" - + " LEFT JOIN cvterm cvterm_variable ON cvterm_variable.cvterm_id = ph.observable_id " - + " WHERE p.study_id = :studyId AND p.dataset_type_id = " + DatasetTypeEnum.PLOT_DATA.getId() + " \n" - + " AND gl.nd_geolocation_id = :instanceId \n" - + " GROUP BY nde.nd_experiment_id " - + " ORDER BY (1*PLOT_NO) asc "; + return "SELECT nde.nd_experiment_id," + + " env.nd_experiment_id AS TRIAL_INSTANCE, " + + " (SELECT iispcvt.definition FROM stockprop isp INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = isp.type_id INNER JOIN cvterm iispcvt ON iispcvt.cvterm_id = isp.value WHERE isp.stock_id = s.stock_id AND ispcvt.name = 'ENTRY_TYPE') ENTRY_TYPE, " + + " s.dbxref_id AS GID, " + + " s.name DESIGNATION, " + + " s.uniquename ENTRY_NO, " + + " s.value as ENTRY_CODE, " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'REP_NO') REP_NO, " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'PLOT_NO') PLOT_NO, " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'BLOCK_NO') BLOCK_NO, " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'ROW') ROW, " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'COL') COL, " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'FIELDMAP COLUMN') 'FIELDMAP COLUMN', " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'FIELDMAP RANGE') 'FIELDMAP RANGE', " + + " (SELECT coalesce(nullif(count(sp.sample_id), 0), '-') FROM sample AS sp INNER JOIN nd_experiment sp_nde ON sp.nd_experiment_id = sp_nde.nd_experiment_id WHERE sp_nde.nd_experiment_id = nde.nd_experiment_id OR sp_nde.parent_id = nde.nd_experiment_id) 'SUM_OF_SAMPLES', " + + " nde.obs_unit_id as OBS_UNIT_ID, MAX(IF(cvterm_variable.name = 'PH_cm', ph.value, NULL)) AS 'PH_cm', MAX(IF(cvterm_variable.name = 'PH_cm', ph.phenotype_id, NULL)) AS 'PH_cm_PhenotypeId', MAX(IF(cvterm_variable.name = 'PH_cm', ph.status, NULL)) AS 'PH_cm_Status', " + + " (SELECT sprop.value FROM stockprop sprop INNER JOIN cvterm spropcvt ON spropcvt.cvterm_id = sprop.type_id WHERE sprop.stock_id = s.stock_id AND spropcvt.name = 'STOCK_ID') 'STOCK_ID', " + + " (SELECT xprop.value FROM nd_experimentprop xprop INNER JOIN cvterm xpropcvt ON xpropcvt.cvterm_id = xprop.type_id WHERE xprop.nd_experiment_id = nde.nd_experiment_id AND xpropcvt.name = 'FACT1') 'FACT1', " + + " 1=1 FROM project p " + + " INNER JOIN nd_experiment nde ON nde.project_id = p.project_id " + + " INNER JOIN nd_experiment env ON env.nd_experiment_id = nde.parent_id AND env.type_id = " + + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + + " INNER JOIN stock s ON s.stock_id = nde.stock_id \tLEFT JOIN phenotype ph ON nde.nd_experiment_id = ph.nd_experiment_id " + + " LEFT JOIN cvterm cvterm_variable ON cvterm_variable.cvterm_id = ph.observable_id " + + " WHERE p.study_id = :studyId AND p.dataset_type_id = " + DatasetTypeEnum.PLOT_DATA.getId() + + " AND env.nd_experiment_id = :instanceId GROUP BY nde.nd_experiment_id ORDER BY (1 * PLOT_NO) asc "; } private String expectedQueryForSingleMeasurement() { - return "SELECT \n" + " nde.nd_experiment_id,\n" + " gl.description AS TRIAL_INSTANCE,\n" - + " (SELECT iispcvt.definition FROM stockprop isp INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = isp.type_id INNER JOIN cvterm iispcvt ON iispcvt.cvterm_id = isp.value WHERE isp.stock_id = s.stock_id AND ispcvt.name = 'ENTRY_TYPE') ENTRY_TYPE, \n" - + " s.dbxref_id AS GID,\n" - + " s.name DESIGNATION,\n" - + " s.uniquename ENTRY_NO,\n" - + " s.value as ENTRY_CODE,\n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'REP_NO') REP_NO, \n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'PLOT_NO') PLOT_NO, \n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'BLOCK_NO') BLOCK_NO, \n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'ROW') ROW, \n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'COL') COL, \n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'FIELDMAP COLUMN') 'FIELDMAP COLUMN', \n" - + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'FIELDMAP RANGE') 'FIELDMAP RANGE', \n" - + " (SELECT coalesce(nullif(count(sp.sample_id), 0), '-') FROM sample AS sp " - + " INNER JOIN nd_experiment sp_nde ON sp.nd_experiment_id = sp_nde.nd_experiment_id WHERE sp_nde.nd_experiment_id = nde.nd_experiment_id OR sp_nde.parent_id = nde.nd_experiment_id) 'SUM_OF_SAMPLES'," - + " nde.obs_unit_id as OBS_UNIT_ID," - + " MAX(IF(cvterm_variable.name = '" + ObservationQueryTest.PH_CM + "', ph.value, NULL)) AS '" + ObservationQueryTest.PH_CM + "', \n" - + " MAX(IF(cvterm_variable.name = '" + ObservationQueryTest.PH_CM + "', ph.phenotype_id, NULL)) AS '" + ObservationQueryTest.PH_CM + "_PhenotypeId', \n" - + " MAX(IF(cvterm_variable.name = '" + ObservationQueryTest.PH_CM + "', ph.status, NULL)) AS '" + ObservationQueryTest.PH_CM + "_Status', \n" - + " (SELECT sprop.value FROM stockprop sprop INNER JOIN cvterm spropcvt ON spropcvt.cvterm_id = sprop.type_id WHERE sprop.stock_id = s.stock_id AND spropcvt.name = '" + ObservationQueryTest.STOCK_ID + "') '" + ObservationQueryTest.STOCK_ID + "', \n" - + " (SELECT xprop.value FROM nd_experimentprop xprop INNER JOIN cvterm xpropcvt ON xpropcvt.cvterm_id = xprop.type_id WHERE xprop.nd_experiment_id = nde.nd_experiment_id AND xpropcvt.name = '" + ObservationQueryTest.FACT1 + "') '" + ObservationQueryTest.FACT1 + "', \n" - + " 1=1 FROM \n" - + " project p \n" - + " INNER JOIN nd_experiment nde ON nde.project_id = p.project_id \n" - + " INNER JOIN nd_geolocation gl ON nde.nd_geolocation_id = gl.nd_geolocation_id \n" - + " INNER JOIN stock s ON s.stock_id = nde.stock_id \n" - + " LEFT JOIN phenotype ph ON nde.nd_experiment_id = ph.nd_experiment_id \n" - + " LEFT JOIN cvterm cvterm_variable ON cvterm_variable.cvterm_id = ph.observable_id" - + " WHERE p.study_id = :studyId AND p.dataset_type_id = " + DatasetTypeEnum.PLOT_DATA.getId() + " \n" - + " AND nde.nd_experiment_id=:experiment_id \n" - + " GROUP BY nde.nd_experiment_id "; + return "SELECT nde.nd_experiment_id," + + " env.nd_experiment_id AS TRIAL_INSTANCE, " + + " (SELECT iispcvt.definition FROM stockprop isp INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = isp.type_id INNER JOIN cvterm iispcvt ON iispcvt.cvterm_id = isp.value WHERE isp.stock_id = s.stock_id AND ispcvt.name = 'ENTRY_TYPE') ENTRY_TYPE," + + " s.dbxref_id AS GID, " + + " s.name DESIGNATION, " + + " s.uniquename ENTRY_NO, " + + " s.value as ENTRY_CODE, " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'REP_NO') REP_NO, " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'PLOT_NO') PLOT_NO," + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'BLOCK_NO') BLOCK_NO, " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'ROW') ROW, " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'COL') COL, " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'FIELDMAP COLUMN') 'FIELDMAP COLUMN', " + + " (SELECT ndep.value FROM nd_experimentprop ndep INNER JOIN cvterm ispcvt ON ispcvt.cvterm_id = ndep.type_id WHERE ndep.nd_experiment_id = nde.nd_experiment_id AND ispcvt.name = 'FIELDMAP RANGE') 'FIELDMAP RANGE', " + + " (SELECT coalesce(nullif(count(sp.sample_id), 0), '-') FROM sample AS sp INNER JOIN nd_experiment sp_nde ON sp.nd_experiment_id = sp_nde.nd_experiment_id WHERE sp_nde.nd_experiment_id = nde.nd_experiment_id OR sp_nde.parent_id = nde.nd_experiment_id) 'SUM_OF_SAMPLES', " + + " nde.obs_unit_id as OBS_UNIT_ID, " + + " MAX(IF(cvterm_variable.name = 'PH_cm', ph.value, NULL)) AS 'PH_cm', " + + " MAX(IF(cvterm_variable.name = 'PH_cm', ph.phenotype_id, NULL)) AS 'PH_cm_PhenotypeId', " + + " MAX(IF(cvterm_variable.name = 'PH_cm', ph.status, NULL)) AS 'PH_cm_Status', " + + " (SELECT sprop.value FROM stockprop sprop INNER JOIN cvterm spropcvt ON spropcvt.cvterm_id = sprop.type_id WHERE sprop.stock_id = s.stock_id AND spropcvt.name = 'STOCK_ID') 'STOCK_ID', " + + " (SELECT xprop.value FROM nd_experimentprop xprop INNER JOIN cvterm xpropcvt ON xpropcvt.cvterm_id = xprop.type_id WHERE xprop.nd_experiment_id = nde.nd_experiment_id AND xpropcvt.name = 'FACT1') 'FACT1'," + + " 1=1 FROM project p " + + " INNER JOIN nd_experiment nde ON nde.project_id = p.project_id " + + " INNER JOIN nd_experiment env ON env.nd_experiment_id = nde.parent_id AND env.type_id = " + + TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId() + + " INNER JOIN stock s ON s.stock_id = nde.stock_id " + + " LEFT JOIN phenotype ph ON nde.nd_experiment_id = ph.nd_experiment_id " + + " LEFT JOIN cvterm cvterm_variable ON cvterm_variable.cvterm_id = ph.observable_id " + + " WHERE p.study_id = :studyId AND p.dataset_type_id = " + DatasetTypeEnum.PLOT_DATA.getId() + + " AND nde.nd_experiment_id = :experiment_id GROUP BY nde.nd_experiment_id "; } diff --git a/src/test/java/org/generationcp/middleware/service/impl/study/StudyInstanceServiceImplTest.java b/src/test/java/org/generationcp/middleware/service/impl/study/StudyInstanceServiceImplTest.java index 400d8727c3..cc0a4af5d6 100644 --- a/src/test/java/org/generationcp/middleware/service/impl/study/StudyInstanceServiceImplTest.java +++ b/src/test/java/org/generationcp/middleware/service/impl/study/StudyInstanceServiceImplTest.java @@ -3,28 +3,18 @@ import org.apache.commons.lang3.RandomStringUtils; import org.generationcp.middleware.IntegrationTestBase; import org.generationcp.middleware.WorkbenchTestDataUtil; -import org.generationcp.middleware.data.initializer.GermplasmListTestDataInitializer; import org.generationcp.middleware.data.initializer.StudyTestDataInitializer; -import org.generationcp.middleware.domain.dms.DMSVariableType; -import org.generationcp.middleware.domain.dms.DatasetReference; -import org.generationcp.middleware.domain.dms.DatasetValues; import org.generationcp.middleware.domain.dms.ExperimentDesignType; -import org.generationcp.middleware.domain.dms.StudyReference; -import org.generationcp.middleware.domain.dms.VariableTypeList; -import org.generationcp.middleware.domain.gms.GermplasmListType; import org.generationcp.middleware.domain.oms.TermId; import org.generationcp.middleware.enumeration.DatasetTypeEnum; -import org.generationcp.middleware.exceptions.MiddlewareQueryException; import org.generationcp.middleware.manager.DaoFactory; import org.generationcp.middleware.manager.StudyDataManagerImpl; import org.generationcp.middleware.manager.api.GermplasmDataManager; import org.generationcp.middleware.manager.api.LocationDataManager; import org.generationcp.middleware.manager.api.OntologyDataManager; import org.generationcp.middleware.manager.api.WorkbenchDataManager; -import org.generationcp.middleware.pojos.GermplasmList; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; import org.generationcp.middleware.pojos.oms.CVTerm; import org.generationcp.middleware.pojos.workbench.CropType; import org.generationcp.middleware.pojos.workbench.Project; @@ -78,15 +68,16 @@ public class StudyInstanceServiceImplTest extends IntegrationTestBase { private StudyInstanceService studyInstanceService; private Project commonTestProject; private CropType cropType; - private StudyReference studyReference; - private DatasetReference environmentDataset; - private Geolocation instance1; - private Geolocation instance2; - private Geolocation instance3; + private DmsProject study; + private DmsProject summary; + private DmsProject plot; + private ExperimentModel instance1; + private ExperimentModel instance2; + private ExperimentModel instance3; @Before - public void setup() throws Exception { + public void setup() { this.studyInstanceService = new StudyInstanceServiceImpl(this.sessionProvder); this.studyDataManager = new StudyDataManagerImpl(this.sessionProvder); @@ -104,27 +95,15 @@ public void setup() throws Exception { this.cropType = this.workbenchDataManager.getCropTypeByName(CropType.CropEnum.MAIZE.name()); - this.studyReference = this.studyTestDataInitializer.addTestStudy(); - - // Create an environment dataset with TRIAL_INSTANCE and LOCATION_NAME properties. - final VariableTypeList environmentVariables = new VariableTypeList(); - environmentVariables - .add(new DMSVariableType(TRIAL_INSTANCE, "Trial instance - enumerated (number)", this.ontologyDataManager.getStandardVariable( - TermId.TRIAL_INSTANCE_FACTOR.getId(), null), 1)); - environmentVariables.add(new DMSVariableType(LOCATION_NAME, "Location Name", this.ontologyDataManager.getStandardVariable( - TermId.LOCATION_ID.getId(), null), 2)); - final DatasetValues datasetValues = new DatasetValues(); - datasetValues.setName(RandomStringUtils.randomAlphanumeric(10)); - datasetValues.setDescription(RandomStringUtils.randomAlphanumeric(10)); - this.environmentDataset = - this.studyDataManager - .addDataSet(this.studyReference.getId(), environmentVariables, datasetValues, null, DatasetTypeEnum.SUMMARY_DATA.getId()); - - if (this.instance1 == null){ - this.instance1 = this.testDataInitializer.createTestGeolocation("1", 1); - this.instance2 = this.testDataInitializer.createTestGeolocation("2", 2); - this.instance3 = this.testDataInitializer.createTestGeolocation("3", 3); - } + this.study = + this.testDataInitializer + .createDmsProject("Study1", "Study-Description", null, this.daoFactory.getDmsProjectDAO().getById(1), null); + this.summary = + this.testDataInitializer + .createDmsProject("Summary Dataset", "Summary Dataset-Description", study, study, DatasetTypeEnum.SUMMARY_DATA); + this.plot = + this.testDataInitializer + .createDmsProject("Plot Dataset", "Plot Dataset-Description", study, study, DatasetTypeEnum.PLOT_DATA); } @@ -132,13 +111,11 @@ public void setup() throws Exception { public void testCreateStudyInstance() { // Create instance 1 - final Integer studyId = this.studyReference.getId(); final StudyInstance studyInstance1 = - this.studyInstanceService.createStudyInstance(this.cropType, studyId, this.environmentDataset.getId()); + this.studyInstanceService.createStudyInstance(this.cropType, this.study.getProjectId(), this.summary.getProjectId()); // Need to flush session to sync with underlying database before querying this.sessionProvder.getSession().flush(); assertEquals(1, studyInstance1.getInstanceNumber()); - assertNotNull(studyInstance1.getInstanceDbId()); assertNotNull(studyInstance1.getExperimentId()); assertNotNull(studyInstance1.getLocationId()); assertFalse(studyInstance1.isHasFieldmap()); @@ -151,11 +128,10 @@ public void testCreateStudyInstance() { // Create instance 2 final StudyInstance studyInstance2 = - this.studyInstanceService.createStudyInstance(this.cropType, studyId, this.environmentDataset.getId()); + this.studyInstanceService.createStudyInstance(this.cropType, this.study.getProjectId(), this.summary.getProjectId()); // Need to flush session to sync with underlying database before querying this.sessionProvder.getSession().flush(); assertEquals(2, studyInstance2.getInstanceNumber()); - assertNotNull(studyInstance2.getInstanceDbId()); assertNotNull(studyInstance2.getExperimentId()); assertNotNull(studyInstance2.getLocationId()); assertFalse(studyInstance2.isHasFieldmap()); @@ -166,22 +142,22 @@ public void testCreateStudyInstance() { assertFalse(studyInstance2.isHasMeasurements()); assertFalse(studyInstance2.isHasExperimentalDesign()); - final List studyInstances = - this.daoFactory.getGeolocationDao().getEnvironmentGeolocations(studyId); + final List studyInstances = + this.daoFactory.getInstanceDao().getEnvironments(this.study.getProjectId()); Assert.assertEquals(2, studyInstances.size()); } @Test public void testGetStudyInstances() { - final DmsProject study = this.createTestStudy(); + this.createStudyInstances(); final List studyInstances = this.studyInstanceService.getStudyInstances(study.getProjectId()); Assert.assertEquals(3, studyInstances.size()); final StudyInstance studyInstance1 = studyInstances.get(0); - Assert.assertEquals(instance1.getLocationId().intValue(), studyInstance1.getInstanceDbId()); + Assert.assertEquals(instance1.getNdExperimentId().intValue(), studyInstance1.getExperimentId()); Assert.assertEquals(1, studyInstance1.getInstanceNumber()); Assert.assertNull(studyInstance1.getCustomLocationAbbreviation()); Assert.assertEquals("AFG", studyInstance1.getLocationAbbreviation()); @@ -193,19 +169,18 @@ public void testGetStudyInstances() { Assert.assertTrue(studyInstance1.isHasMeasurements()); final StudyInstance studyInstance2 = studyInstances.get(1); - Assert.assertEquals(instance2.getLocationId().intValue(), studyInstance2.getInstanceDbId()); + Assert.assertEquals(instance2.getNdExperimentId().intValue(), studyInstance2.getExperimentId()); Assert.assertEquals(2, studyInstance2.getInstanceNumber()); Assert.assertNull(studyInstance2.getCustomLocationAbbreviation()); Assert.assertEquals("ALB", studyInstance2.getLocationAbbreviation()); Assert.assertEquals("Albania", studyInstance2.getLocationName()); Assert.assertTrue(studyInstance2.isHasFieldmap()); Assert.assertTrue(studyInstance2.isHasExperimentalDesign()); - // Instance deletion not allowed because study has advance list and design already generated for instance - Assert.assertFalse(studyInstance2.getCanBeDeleted()); + Assert.assertTrue(studyInstance2.getCanBeDeleted()); Assert.assertFalse(studyInstance2.isHasMeasurements()); final StudyInstance studyInstance3 = studyInstances.get(2); - Assert.assertEquals(instance3.getLocationId().intValue(), studyInstance3.getInstanceDbId()); + Assert.assertEquals(instance3.getNdExperimentId().intValue(), studyInstance3.getExperimentId()); Assert.assertEquals(3, studyInstance3.getInstanceNumber()); Assert.assertNull(studyInstance3.getCustomLocationAbbreviation()); Assert.assertEquals("DZA", studyInstance3.getLocationAbbreviation()); @@ -219,10 +194,9 @@ public void testGetStudyInstances() { @Test public void testGetStudyInstance() { - final DmsProject study = this.createTestStudy(); - - final StudyInstance studyInstance1 = this.studyInstanceService.getStudyInstance(study.getProjectId(), instance1.getLocationId()).get(); - Assert.assertEquals(instance1.getLocationId().intValue(), studyInstance1.getInstanceDbId()); + this.createStudyInstances(); + final StudyInstance studyInstance1 = this.studyInstanceService.getStudyInstance(study.getProjectId(), instance1.getNdExperimentId()).get(); + Assert.assertEquals(instance1.getNdExperimentId().intValue(), studyInstance1.getExperimentId()); Assert.assertEquals(1, studyInstance1.getInstanceNumber()); Assert.assertNull(studyInstance1.getCustomLocationAbbreviation()); Assert.assertEquals("AFG", studyInstance1.getLocationAbbreviation()); @@ -233,20 +207,19 @@ public void testGetStudyInstance() { Assert.assertFalse(studyInstance1.getCanBeDeleted()); Assert.assertTrue(studyInstance1.isHasMeasurements()); - final StudyInstance studyInstance2 = this.studyInstanceService.getStudyInstance(study.getProjectId(), instance2.getLocationId()).get(); - Assert.assertEquals(instance2.getLocationId().intValue(), studyInstance2.getInstanceDbId()); + final StudyInstance studyInstance2 = this.studyInstanceService.getStudyInstance(study.getProjectId(), instance2.getNdExperimentId()).get(); + Assert.assertEquals(instance2.getNdExperimentId().intValue(), studyInstance2.getExperimentId()); Assert.assertEquals(2, studyInstance2.getInstanceNumber()); Assert.assertNull(studyInstance2.getCustomLocationAbbreviation()); Assert.assertEquals("ALB", studyInstance2.getLocationAbbreviation()); Assert.assertEquals("Albania", studyInstance2.getLocationName()); Assert.assertTrue(studyInstance2.isHasFieldmap()); Assert.assertTrue(studyInstance2.isHasExperimentalDesign()); - // Instance deletion not allowed because study has advance list and design already generated for instance - Assert.assertFalse(studyInstance2.getCanBeDeleted()); + Assert.assertTrue(studyInstance2.getCanBeDeleted()); Assert.assertFalse(studyInstance2.isHasMeasurements()); - final StudyInstance studyInstance3 = this.studyInstanceService.getStudyInstance(study.getProjectId(), instance3.getLocationId()).get(); - Assert.assertEquals(instance3.getLocationId().intValue(), studyInstance3.getInstanceDbId()); + final StudyInstance studyInstance3 = this.studyInstanceService.getStudyInstance(study.getProjectId(), instance3.getNdExperimentId()).get(); + Assert.assertEquals(instance3.getNdExperimentId().intValue(), studyInstance3.getExperimentId()); Assert.assertEquals(3, studyInstance3.getInstanceNumber()); Assert.assertNull(studyInstance3.getCustomLocationAbbreviation()); Assert.assertEquals("DZA", studyInstance3.getLocationAbbreviation()); @@ -257,145 +230,62 @@ public void testGetStudyInstance() { Assert.assertFalse(studyInstance3.isHasMeasurements()); } - private DmsProject createTestStudy() { - final DmsProject study = - this.testDataInitializer - .createDmsProject("Study1", "Study-Description", null, this.daoFactory.getDmsProjectDAO().getById(1), null); - final DmsProject environmentDataset = - this.testDataInitializer - .createDmsProject("Summary Dataset", "Summary Dataset-Description", study, study, DatasetTypeEnum.SUMMARY_DATA); - final DmsProject plotDataset = - this.testDataInitializer - .createDmsProject("Plot Dataset", "Plot Dataset-Description", study, study, DatasetTypeEnum.PLOT_DATA); - final DmsProject subObsDataset = - this.testDataInitializer - .createDmsProject("Subobs Dataset", "Subobs Dataset-Description", study, plotDataset, DatasetTypeEnum.QUADRAT_SUBOBSERVATIONS); - final GermplasmList advanceList = GermplasmListTestDataInitializer.createGermplasmListWithType(null, - GermplasmListType.ADVANCED.name()); - advanceList.setProjectId(study.getProjectId()); - this.daoFactory.getGermplasmListDAO().save(advanceList); - - this.testDataInitializer.addGeolocationProp(instance1, TermId.EXPERIMENT_DESIGN_FACTOR.getId(), - ExperimentDesignType.RANDOMIZED_COMPLETE_BLOCK.getTermId().toString(), 1); - this.testDataInitializer.addGeolocationProp(instance2, TermId.BLOCK_ID.getId(), RandomStringUtils.randomAlphabetic(5), 1); - - // Instance 1 - this.testDataInitializer.createTestExperiment(environmentDataset, instance1, TermId.SUMMARY_EXPERIMENT.getId(), "0", null); - final ExperimentModel instance1PlotExperiment = - this.testDataInitializer.createTestExperiment(plotDataset, instance1, TermId.PLOT_EXPERIMENT.getId(), "1", null); - // Create 2 Sub-obs records - final ExperimentModel instance1SubObsExperiment1 = - this.testDataInitializer - .createTestExperiment(subObsDataset, instance1, TermId.PLOT_EXPERIMENT.getId(), "1", instance1PlotExperiment); - this.savePhenotype(instance1SubObsExperiment1); - final ExperimentModel instance1SubObsExperiment2 = this.testDataInitializer - .createTestExperiment(subObsDataset, instance1, TermId.PLOT_EXPERIMENT.getId(), "1", instance1PlotExperiment); - this.savePhenotype(instance1SubObsExperiment2); - - // Instance 2 - this.testDataInitializer.createTestExperiment(environmentDataset, instance2, TermId.SUMMARY_EXPERIMENT.getId(), "0", null); - this.testDataInitializer.createTestExperiment(plotDataset, instance2, TermId.PLOT_EXPERIMENT.getId(), "1", null); - - // Instance 3 has no plot experiments - this.testDataInitializer.createTestExperiment(environmentDataset, instance3, TermId.SUMMARY_EXPERIMENT.getId(), "0", null); - return study; - } - @Test public void testDeleteEnvironment() { - final DmsProject study = - this.testDataInitializer - .createDmsProject("Study1", "Study-Description", null, this.daoFactory.getDmsProjectDAO().getById(1), null); - final DmsProject environmentDataset = - this.testDataInitializer - .createDmsProject("Summary Dataset", "Summary Dataset-Description", study, study, DatasetTypeEnum.SUMMARY_DATA); - final DmsProject plotDataset = - this.testDataInitializer - .createDmsProject("Plot Dataset", "Plot Dataset-Description", study, study, DatasetTypeEnum.PLOT_DATA); - - final Geolocation instance1 = this.testDataInitializer.createTestGeolocation("1", 1); - final Geolocation instance2 = this.testDataInitializer.createTestGeolocation("2", 2); - final Geolocation instance3 = this.testDataInitializer.createTestGeolocation("3", 3); - this.testDataInitializer.addGeolocationProp(instance1, TermId.EXPERIMENT_DESIGN_FACTOR.getId(), + this.createStudyInstances(); + this.testDataInitializer.addExperimentProp(instance1, TermId.EXPERIMENT_DESIGN_FACTOR.getId(), ExperimentDesignType.RANDOMIZED_COMPLETE_BLOCK.getTermId().toString(), 1); - this.testDataInitializer.addGeolocationProp(instance2, TermId.EXPERIMENT_DESIGN_FACTOR.getId(), + this.testDataInitializer.addExperimentProp(instance2, TermId.EXPERIMENT_DESIGN_FACTOR.getId(), ExperimentDesignType.RANDOMIZED_COMPLETE_BLOCK.getTermId().toString(), 1); - this.testDataInitializer.addGeolocationProp(instance3, TermId.EXPERIMENT_DESIGN_FACTOR.getId(), + this.testDataInitializer.addExperimentProp(instance3, TermId.EXPERIMENT_DESIGN_FACTOR.getId(), ExperimentDesignType.RANDOMIZED_COMPLETE_BLOCK.getTermId().toString(), 1); - final Integer studyExperimentId = this.createTestExperiments(study, environmentDataset, plotDataset, instance1, instance2, instance3); final Integer studyId = study.getProjectId(); // Delete Instance 2 - final Integer instance2LocationId = instance2.getLocationId(); + final Integer instance2LocationId = instance2.getNdExperimentId(); this.studyInstanceService.deleteStudyInstance(studyId, instance2LocationId); + this.sessionProvder.getSession().flush(); + List studyInstances = this.studyInstanceService.getStudyInstances(studyId); Assert.assertEquals(2, studyInstances.size()); - final Integer instance1LocationId = instance1.getLocationId(); - Assert.assertEquals(instance1LocationId, this.daoFactory.getExperimentDao().getById(studyExperimentId).getGeoLocation().getLocationId()); + final Integer instance1LocationId = instance1.getNdExperimentId(); + Assert.assertEquals(instance1LocationId, this.daoFactory.getExperimentDao().getById(instance1.getNdExperimentId()).getNdExperimentId()); for (final StudyInstance instance : studyInstances) { Assert.assertNotEquals(2, instance.getInstanceNumber()); - Assert.assertNotEquals(instance2LocationId.intValue(), instance.getInstanceDbId()); + Assert.assertNotEquals(instance2LocationId.intValue(), instance.getExperimentId()); } // Confirm geolocation and its properties have been deleted - Assert.assertNull(this.daoFactory.getGeolocationDao().getById(instance2LocationId)); - Assert.assertTrue(CollectionUtils.isEmpty(this.daoFactory.getGeolocationPropertyDao().getByGeolocation(instance2LocationId))); - - - // Delete Instance 1 - study experiment Geolocation ID will be updated to next available geolocation - this.studyInstanceService.deleteStudyInstance(studyId, instance1LocationId); - this.sessionProvder.getSession().flush(); - - studyInstances = - this.studyInstanceService.getStudyInstances(studyId); - Assert.assertEquals(1, studyInstances.size()); - Assert.assertNotEquals(2, studyInstances.get(0).getInstanceNumber()); - Assert.assertNotEquals(instance2LocationId.intValue(), studyInstances.get(0).getInstanceDbId()); - final Integer instance3LocationId = instance3.getLocationId(); - Assert.assertEquals(instance3LocationId, this.daoFactory.getExperimentDao().getById(studyExperimentId).getGeoLocation().getLocationId()); - // Confirm geolocation and its properties have been deleted - Assert.assertNull(this.daoFactory.getGeolocationDao().getById(instance1LocationId)); - Assert.assertTrue(CollectionUtils.isEmpty(this.daoFactory.getGeolocationPropertyDao().getByGeolocation(instance1LocationId))); - - - // Delete Instance 3 - should throw exception - try { - this.studyInstanceService.deleteStudyInstance(studyId, instance3LocationId); - Assert.fail("Should have thrown exception when attempting to delete last environment."); - } catch (final MiddlewareQueryException e) { - // Perform assertions outside - } - studyInstances = - this.studyInstanceService.getStudyInstances(studyId); - Assert.assertEquals(1, studyInstances.size()); - Assert.assertEquals(instance3LocationId, this.daoFactory.getExperimentDao().getById(studyExperimentId).getGeoLocation().getLocationId()); - Assert.assertNotNull(this.daoFactory.getGeolocationDao().getById(instance3LocationId)); - Assert.assertFalse(CollectionUtils.isEmpty(this.daoFactory.getGeolocationPropertyDao().getByGeolocation(instance3LocationId))); + Assert.assertFalse(this.studyInstanceService.getStudyInstance(study.getProjectId(), instance2LocationId).isPresent()); + Assert.assertTrue(CollectionUtils.isEmpty(this.daoFactory.getEnvironmentPropertyDao().getEnvironmentVariableNameValuesMap(instance2LocationId))); } - private Integer createTestExperiments(final DmsProject study, final DmsProject environmentDataset, final DmsProject plotDataset, - final Geolocation instance1, final Geolocation instance2, final Geolocation instance3) { - // Study experiment - final ExperimentModel studyExperiment = - this.testDataInitializer.createTestExperiment(study, instance1, TermId.STUDY_EXPERIMENT.getId(), "0", null); + private void createStudyInstances() { + //Study Experiment + this.testDataInitializer.createTestExperiment(study, null, TermId.STUDY_EXPERIMENT.getId(), "0", null); - // Instance 1 - this.testDataInitializer.createTestExperiment(environmentDataset, instance1, TermId.SUMMARY_EXPERIMENT.getId(), "0", null); + this.instance1 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "1"); final ExperimentModel instance1PlotExperiment = - this.testDataInitializer.createTestExperiment(plotDataset, instance1, TermId.PLOT_EXPERIMENT.getId(), "1", null); - this.savePhenotype(instance1PlotExperiment); - - // Instance 2 - this.testDataInitializer.createTestExperiment(environmentDataset, instance2, TermId.SUMMARY_EXPERIMENT.getId(), "0", null); - final ExperimentModel instance2PlotExperiment = - this.testDataInitializer.createTestExperiment(plotDataset, instance2, TermId.PLOT_EXPERIMENT.getId(), "1", null); + this.testDataInitializer.createTestExperiment(plot, null, TermId.PLOT_EXPERIMENT.getId(), "1", instance1); + final DmsProject subobs = + this.testDataInitializer + .createDmsProject("Subobs Dataset", "Subobs Dataset-Description", study, plot, DatasetTypeEnum.PLANT_SUBOBSERVATIONS); + // Create 2 Sub-obs records + final ExperimentModel instance1SubObsExperiment1 = + this.testDataInitializer + .createTestExperiment(subobs, null, TermId.PLOT_EXPERIMENT.getId(), "1", instance1PlotExperiment); + this.savePhenotype(instance1SubObsExperiment1); + final ExperimentModel instance1SubObsExperiment2 = this.testDataInitializer + .createTestExperiment(subobs, null, TermId.PLOT_EXPERIMENT.getId(), "1", instance1PlotExperiment); + this.savePhenotype(instance1SubObsExperiment2); - // Instance 3 has no plot experiments - this.testDataInitializer.createTestExperiment(environmentDataset, instance3, TermId.SUMMARY_EXPERIMENT.getId(), "0", null); + this.instance2 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 2, "2"); + this.testDataInitializer.addExperimentProp(instance2, TermId.BLOCK_ID.getId(), "", 1); + this.testDataInitializer.createTestExperiment(plot, null, TermId.PLOT_EXPERIMENT.getId(), "1", instance2); - return studyExperiment.getNdExperimentId(); + this.instance3 = this.testDataInitializer.createInstanceExperimentModel(this.summary, 3, "3"); } private void savePhenotype(final ExperimentModel experiment) { diff --git a/src/test/java/org/generationcp/middleware/service/impl/study/StudyMeasurementsTest.java b/src/test/java/org/generationcp/middleware/service/impl/study/StudyMeasurementsTest.java index badfd07495..c84ed81680 100644 --- a/src/test/java/org/generationcp/middleware/service/impl/study/StudyMeasurementsTest.java +++ b/src/test/java/org/generationcp/middleware/service/impl/study/StudyMeasurementsTest.java @@ -20,7 +20,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.mockito.Matchers; +import org.mockito.ArgumentMatchers; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @@ -135,7 +135,7 @@ public void setup() { StudyMeasurementsTest.FACT1_VALUE2, StudyMeasurementsTest.FACT2_VALUE2}; this.singleMeasurement = Arrays.asList(this.testRow1); - this.allMeasurements = Arrays.asList(this.testRow1, this.testRow2); + this.allMeasurements = Arrays.asList(this.testRow1, this.testRow2); Mockito.when(this.mockSqlQueryForAllMeasurements.list()).thenReturn(this.allMeasurements); Mockito.when(this.mockSqlQueryForSingleMeasurement.list()).thenReturn(this.singleMeasurement); } @@ -146,7 +146,7 @@ public void setup() { * */ @Test - public void allPlotsMeasurementQueryRetrievesDataCorrectly() throws Exception { + public void allPlotsMeasurementQueryRetrievesDataCorrectly() { Mockito.when(this.session.createSQLQuery(new ObservationQuery().getAllObservationsQuery(this.testTraits, this.germplasmDescriptors, this.designFactors, null, null))) @@ -160,10 +160,11 @@ public void allPlotsMeasurementQueryRetrievesDataCorrectly() throws Exception { this.designFactors, instanceId, pageNumber, pageSize, null, null); this.verifyScalarSetting(this.mockSqlQueryForAllMeasurements); - Mockito.verify(this.mockSqlQueryForAllMeasurements).setParameter(Matchers.eq("studyId"), - Matchers.eq(StudyMeasurementsTest.PROJECT_IDENTIFIER)); - Mockito.verify(this.mockSqlQueryForAllMeasurements).setParameter(Matchers.eq("instanceId"), - Matchers.eq(String.valueOf(instanceId))); + Mockito.verify(this.mockSqlQueryForAllMeasurements).setParameter( + ArgumentMatchers.eq("studyId"), + ArgumentMatchers.eq(StudyMeasurementsTest.PROJECT_IDENTIFIER)); + Mockito.verify(this.mockSqlQueryForAllMeasurements).setParameter(ArgumentMatchers.eq("instanceId"), + ArgumentMatchers.eq(String.valueOf(instanceId))); Assert.assertEquals("Make sure that we have all measurements returned", this.allMeasurements.size(), returnedMeasurements.size()); @@ -220,12 +221,12 @@ public void testGetAllStudyDetailsAsTable() { } Mockito.verify(query).addScalar(StudyMeasurements.PROJECT_NAME); Mockito.verify(query).addScalar(StudyMeasurements.LOCATION_DB_ID); - Mockito.verify(query).addScalar(StudyMeasurements.ND_GEOLOCATION_ID); + Mockito.verify(query).addScalar(StudyMeasurements.ENVIRONMENT_ID); Mockito.verify(query).addScalar(StudyMeasurements.FIELD_MAP_ROW); Mockito.verify(query).addScalar(StudyMeasurements.FIELD_MAP_COLUMN); Mockito.verify(query).addScalar(StudyMeasurements.LOCATION_ABBREVIATION); Mockito.verify(query).addScalar(StudyMeasurements.LOCATION_NAME); - Mockito.verify(query).addScalar(Matchers.eq(StudyMeasurements.OBS_UNIT_ID), Matchers.any(StringType.class)); + Mockito.verify(query).addScalar(ArgumentMatchers.eq(StudyMeasurements.OBS_UNIT_ID), ArgumentMatchers.any(StringType.class)); Mockito.verify(query).addScalar(StudyMeasurements.COL); Mockito.verify(query).addScalar(StudyMeasurements.ROW); Mockito.verify(query).addScalar(StudyMeasurements.BLOCK_NO); @@ -239,8 +240,8 @@ public void testGetAllStudyDetailsAsTable() { Mockito.verify(query).addScalar(StudyMeasurements.TRIAL_INSTANCE); Mockito.verify(query).addScalar(StudyMeasurements.ND_EXPERIMENT_ID); Mockito.verify(query).addScalar(TermId.ALTITUDE.name()); - Mockito.verify(query).addScalar(Matchers.eq(TermId.ALTITUDE.name() + "_PhenotypeId"), - Matchers.any(IntegerType.class)); + Mockito.verify(query).addScalar(ArgumentMatchers.eq(TermId.ALTITUDE.name() + "_PhenotypeId"), + ArgumentMatchers.any(IntegerType.class)); } /** @@ -249,7 +250,7 @@ public void testGetAllStudyDetailsAsTable() { * */ @Test - public void singlePlotMeasurementsQueryRetrievesDataCorrectly() throws Exception { + public void singlePlotMeasurementsQueryRetrievesDataCorrectly() { Mockito.when(this.session.createSQLQuery(new ObservationQuery().getSingleObservationQuery(this.testTraits, this.germplasmDescriptors, this.designFactors))).thenReturn(this.mockSqlQueryForSingleMeasurement); @@ -258,10 +259,10 @@ public void singlePlotMeasurementsQueryRetrievesDataCorrectly() throws Exception this.designFactors, StudyMeasurementsTest.OBS_UNIT_IDENTIFIER1); this.verifyScalarSetting(this.mockSqlQueryForSingleMeasurement); - Mockito.verify(this.mockSqlQueryForSingleMeasurement).setParameter(Matchers.eq("studyId"), - Matchers.eq(StudyMeasurementsTest.PROJECT_IDENTIFIER)); - Mockito.verify(this.mockSqlQueryForSingleMeasurement).setParameter(Matchers.eq("experiment_id"), - Matchers.eq(StudyMeasurementsTest.OBS_UNIT_IDENTIFIER1)); + Mockito.verify(this.mockSqlQueryForSingleMeasurement).setParameter(ArgumentMatchers.eq("studyId"), + ArgumentMatchers.eq(StudyMeasurementsTest.PROJECT_IDENTIFIER)); + Mockito.verify(this.mockSqlQueryForSingleMeasurement).setParameter(ArgumentMatchers.eq("experiment_id"), + ArgumentMatchers.eq(StudyMeasurementsTest.OBS_UNIT_IDENTIFIER1)); final ObservationDto measurement1 = returnedMeasurements.get(0); this.verifyObservationValues(measurement1, StudyMeasurementsTest.OBS_UNIT_IDENTIFIER1, StudyMeasurementsTest.GID1, @@ -337,7 +338,7 @@ private void verifyObservationValues(final ObservationDto measurement, final int private void verifyScalarSetting(final SQLQuery query) { // Fixed columns + Trait name - no type Mockito.verify(query, Mockito.times(StudyMeasurementsTest.STRING_COLUMNS.size() + this.testTraits.size() + 2)) - .addScalar(Matchers.anyString()); + .addScalar(ArgumentMatchers.anyString()); for (final String column : StudyMeasurementsTest.STRING_COLUMNS) { Mockito.verify(query).addScalar(column); } @@ -345,21 +346,21 @@ private void verifyScalarSetting(final SQLQuery query) { Mockito.verify(query).addScalar(variable.getName()); } // OBS_UNIT_ID with StringType - Mockito.verify(query).addScalar(Matchers.eq("OBS_UNIT_ID"), Matchers.any(StringType.class)); + Mockito.verify(query).addScalar(ArgumentMatchers.eq("OBS_UNIT_ID"), ArgumentMatchers.any(StringType.class)); // Once for each non-fixed germplasm factor as StringType for (final String gpDesc : this.germplasmDescriptors) { - Mockito.verify(query).addScalar(Matchers.eq(gpDesc), Matchers.any(StringType.class)); + Mockito.verify(query).addScalar(ArgumentMatchers.eq(gpDesc), ArgumentMatchers.any(StringType.class)); } // Once for each non-fixed design factor as StringType for (final String designFactor : this.designFactors) { - Mockito.verify(query).addScalar(Matchers.eq(designFactor), Matchers.any(StringType.class)); + Mockito.verify(query).addScalar(ArgumentMatchers.eq(designFactor), ArgumentMatchers.any(StringType.class)); } // Trait PhenotypeIds as IntegerType for each trait for (final MeasurementVariableDto t : this.testTraits) { - Mockito.verify(query).addScalar(Matchers.eq(t.getName() + "_PhenotypeId"), Matchers.any(IntegerType.class)); + Mockito.verify(query).addScalar(ArgumentMatchers.eq(t.getName() + "_PhenotypeId"), ArgumentMatchers.any(IntegerType.class)); } } } diff --git a/src/test/java/org/generationcp/middleware/service/impl/study/StudyServiceImplIntegrationTest.java b/src/test/java/org/generationcp/middleware/service/impl/study/StudyServiceImplIntegrationTest.java index 31f9ab4c2e..95c89f5e87 100644 --- a/src/test/java/org/generationcp/middleware/service/impl/study/StudyServiceImplIntegrationTest.java +++ b/src/test/java/org/generationcp/middleware/service/impl/study/StudyServiceImplIntegrationTest.java @@ -1,6 +1,5 @@ package org.generationcp.middleware.service.impl.study; -import org.apache.commons.lang3.RandomStringUtils; import org.generationcp.middleware.IntegrationTestBase; import org.generationcp.middleware.dao.dms.DmsProjectDao; import org.generationcp.middleware.domain.oms.TermId; @@ -8,8 +7,6 @@ import org.generationcp.middleware.enumeration.DatasetTypeEnum; import org.generationcp.middleware.pojos.dms.DmsProject; import org.generationcp.middleware.pojos.dms.ExperimentModel; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.oms.CVTerm; import org.generationcp.middleware.pojos.workbench.WorkbenchUser; import org.generationcp.middleware.service.api.study.StudyDetailsDto; import org.generationcp.middleware.service.api.study.StudyService; @@ -20,9 +17,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; -import java.util.Collections; -import java.util.List; - public class StudyServiceImplIntegrationTest extends IntegrationTestBase { @Autowired @@ -30,7 +24,7 @@ public class StudyServiceImplIntegrationTest extends IntegrationTestBase { private IntegrationTestDataInitializer testDataInitializer; private DmsProject study; private DmsProject plot; - private CVTerm testTrait; + private DmsProject summary; @Before public void setUp() { @@ -42,83 +36,40 @@ public void setUp() { this.plot = this.testDataInitializer .createDmsProject("Plot Dataset", "Plot Dataset-Description", this.study, this.study, DatasetTypeEnum.PLOT_DATA); - this.testTrait = this.testDataInitializer.createTrait("SomeTrait"); - } - - @Test - public void testCountTotalObservationUnits() { - - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); - this.testDataInitializer.createTestExperiments(this.plot, null, geolocation, 5); - - Assert.assertEquals(5, this.studyService.countTotalObservationUnits(this.study.getProjectId(), geolocation.getLocationId())); - } - - @Test - public void testHasMeasurementDataEntered() { - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); - final List experimentModels = this.testDataInitializer.createTestExperiments(this.plot, null, geolocation, 5); - - Assert.assertFalse( - this.studyService.hasMeasurementDataEntered(Collections.singletonList(this.testTrait.getCvTermId()), this.study.getProjectId())); - - this.testDataInitializer.addPhenotypes(experimentModels, this.testTrait.getCvTermId(), RandomStringUtils.randomNumeric(5)); - // Need to flush session to sync with underlying database before querying - this.sessionProvder.getSession().flush(); - Assert.assertTrue( - this.studyService.hasMeasurementDataEntered(Collections.singletonList(this.testTrait.getCvTermId()), this.study.getProjectId())); - } - - @Test - public void testHasMeasurementDataOnEnvironment() { - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", 101); - final List experimentModels = this.testDataInitializer.createTestExperiments(this.plot, null, geolocation, 5); - Assert.assertFalse(this.studyService.hasMeasurementDataOnEnvironment(this.study.getProjectId(), geolocation.getLocationId())); - - this.testDataInitializer.addPhenotypes(experimentModels, this.testTrait.getCvTermId(), RandomStringUtils.randomNumeric(5)); - // Need to flush session to sync with underlying database before querying - this.sessionProvder.getSession().flush(); - Assert.assertTrue(this.studyService.hasMeasurementDataOnEnvironment(this.study.getProjectId(), geolocation.getLocationId())); + this.summary = this.testDataInitializer + .createDmsProject("Summary Dataset", "Summary Dataset-Description", this.study, this.study, DatasetTypeEnum.SUMMARY_DATA); } @Test - public void testGetStudyDetailsForGeolocation() { - final DmsProject environmentDataset = - this.testDataInitializer - .createDmsProject("Summary Dataset", "Summary Dataset-Description", this.study, this.study, DatasetTypeEnum.SUMMARY_DATA); + public void testGetStudyDetailsByEnvironment() { + final ExperimentModel instanceModel = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "1"); - final int locationId = 101; - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", locationId); this.testDataInitializer - .createTestExperiment(environmentDataset, geolocation, TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId(), "0", null); - final StudyDetailsDto studyDetailsDto = this.studyService.getStudyDetailsByGeolocation(geolocation.getLocationId()); + .createTestExperiment(this.plot, null, TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId(), "0", instanceModel); + final StudyDetailsDto studyDetailsDto = this.studyService.getStudyDetailsByEnvironment(instanceModel.getNdExperimentId()); Assert.assertTrue(CollectionUtils.isEmpty(studyDetailsDto.getContacts())); - Assert.assertEquals(locationId, studyDetailsDto.getMetadata().getLocationId().intValue()); - Assert.assertEquals(geolocation.getLocationId(), studyDetailsDto.getMetadata().getStudyDbId()); + Assert.assertEquals(1, studyDetailsDto.getMetadata().getLocationId().intValue()); + Assert.assertEquals(instanceModel.getNdExperimentId(), studyDetailsDto.getMetadata().getStudyDbId()); Assert.assertEquals(this.study.getProjectId(), studyDetailsDto.getMetadata().getTrialDbId()); Assert.assertEquals(this.study.getName() + " Environment Number 1", studyDetailsDto.getMetadata().getStudyName()); } @Test - public void testGetStudyDetailsForGeolocationWithPI_ID() { - final DmsProject environmentDataset = - this.testDataInitializer - .createDmsProject("Summary Dataset", "Summary Dataset-Description", this.study, this.study, DatasetTypeEnum.SUMMARY_DATA); + public void testGetStudyDetailsByEnvironmentWithPI_ID() { final WorkbenchUser user = this.testDataInitializer.createUserForTesting(); - final int locationId = 101; + final ExperimentModel instanceModel = this.testDataInitializer.createInstanceExperimentModel(this.summary, 1, "1"); - final Geolocation geolocation = this.testDataInitializer.createTestGeolocation("1", locationId); this.testDataInitializer - .createTestExperiment(environmentDataset, geolocation, TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId(), "0", null); + .createTestExperiment(this.plot, null, TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId(), "0", null); this.testDataInitializer.addProjectProp(this.study, TermId.PI_ID.getId(), "", VariableType.STUDY_DETAIL, String.valueOf(user.getPerson().getId()), 6); - final StudyDetailsDto studyDetailsDto = this.studyService.getStudyDetailsByGeolocation(geolocation.getLocationId()); + final StudyDetailsDto studyDetailsDto = this.studyService.getStudyDetailsByEnvironment(instanceModel.getNdExperimentId()); Assert.assertFalse(CollectionUtils.isEmpty(studyDetailsDto.getContacts())); Assert.assertEquals(user.getUserid(), studyDetailsDto.getContacts().get(0).getUserId()); - Assert.assertEquals(locationId, studyDetailsDto.getMetadata().getLocationId().intValue()); - Assert.assertEquals(geolocation.getLocationId(), studyDetailsDto.getMetadata().getStudyDbId()); + Assert.assertEquals(1, studyDetailsDto.getMetadata().getLocationId().intValue()); + Assert.assertEquals(instanceModel.getNdExperimentId(), studyDetailsDto.getMetadata().getStudyDbId()); Assert.assertEquals(this.study.getProjectId(), studyDetailsDto.getMetadata().getTrialDbId()); Assert.assertEquals(this.study.getName() + " Environment Number 1", studyDetailsDto.getMetadata().getStudyName()); } diff --git a/src/test/java/org/generationcp/middleware/service/impl/study/StudyServiceImplTest.java b/src/test/java/org/generationcp/middleware/service/impl/study/StudyServiceImplTest.java index c28354229e..d30937b167 100644 --- a/src/test/java/org/generationcp/middleware/service/impl/study/StudyServiceImplTest.java +++ b/src/test/java/org/generationcp/middleware/service/impl/study/StudyServiceImplTest.java @@ -38,10 +38,6 @@ import java.util.List; import java.util.Random; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.core.Is.is; - /** * The class StudyServiceImplTest contains tests for the class {@link StudyServiceImpl}. * @@ -81,9 +77,9 @@ public class StudyServiceImplTest { private StudyServiceImpl studyServiceImpl; - final List additionalGermplasmDescriptors = Lists.newArrayList(STOCK_ID); + private final List additionalGermplasmDescriptors = Lists.newArrayList(STOCK_ID); - final List additionalDesignFactors = Lists.newArrayList(FACT1); + private final List additionalDesignFactors = Lists.newArrayList(FACT1); @Before public void setUp() { @@ -105,51 +101,6 @@ public void setUp() { } - @Test - public void testHasMeasurementDataOnEnvironmentAssertTrue() { - Mockito.when(this.mockSqlQuery.uniqueResult()).thenReturn(1); - Mockito.when( - this.mockSessionProvider.getSession().createSQLQuery(StudyServiceImpl.SQL_FOR_COUNT_TOTAL_OBSERVATION_UNITS_NO_NULL_VALUES)) - .thenReturn(this.mockSqlQuery); - - Assert.assertTrue(this.studyServiceImpl.hasMeasurementDataOnEnvironment(123, 4)); - } - - @Test - public void testHasMeasurementDataOnEnvironmentAssertFalse() { - Mockito.when(this.mockSqlQuery.uniqueResult()).thenReturn(0); - Mockito.when( - this.mockSessionProvider.getSession().createSQLQuery(StudyServiceImpl.SQL_FOR_COUNT_TOTAL_OBSERVATION_UNITS_NO_NULL_VALUES)) - .thenReturn(this.mockSqlQuery); - - Assert.assertFalse(this.studyServiceImpl.hasMeasurementDataOnEnvironment(123, 4)); - } - - @Test - public void testHasMeasurementDataEnteredAssertTrue() { - final Object[] testDBRow = {2503, 51547, "AleuCol_E_1to5", 43}; - final List testResult = Collections.singletonList(testDBRow); - Mockito.when(this.mockSqlQuery.list()).thenReturn(testResult); - - Mockito.when(this.mockSessionProvider.getSession().createSQLQuery(StudyServiceImpl.SQL_FOR_HAS_MEASUREMENT_DATA_ENTERED)) - .thenReturn(this.mockSqlQuery); - - final List ids = Arrays.asList(1000, 1002); - assertThat(true, is(equalTo(this.studyServiceImpl.hasMeasurementDataEntered(ids, 4)))); - } - - @Test - public void testHasMeasurementDataEnteredAssertFalse() { - final List testResult = Collections.emptyList(); - - Mockito.when(this.mockSqlQuery.list()).thenReturn(testResult); - Mockito.when(this.mockSessionProvider.getSession().createSQLQuery(StudyServiceImpl.SQL_FOR_HAS_MEASUREMENT_DATA_ENTERED)) - .thenReturn(this.mockSqlQuery); - - final List ids = Arrays.asList(1000, 1002); - assertThat(false, is(equalTo(this.studyServiceImpl.hasMeasurementDataEntered(ids, 4)))); - } - @Test public void testHasAdvancedOrCrossesList() { final GermplasmListDAO listDao = Mockito.mock(GermplasmListDAO.class); @@ -171,14 +122,14 @@ public void testGetObservations() { studyServiceImpl.setDaoFactory(this.daoFactory); final List projectTraits = - Arrays.asList(new MeasurementVariableDto(1, "Trait1"), new MeasurementVariableDto(1, "Trait2")); + Arrays.asList(new MeasurementVariableDto(1, "Trait1"), new MeasurementVariableDto(1, "Trait2")); Mockito.when(this.projectPropertyDao.getVariables(StudyServiceImplTest.STUDY_ID, VariableType.TRAIT.getId(), VariableType.SELECTION_METHOD.getId())).thenReturn(projectTraits); final List traits = new ArrayList<>(); traits.add(new MeasurementDto(new MeasurementVariableDto(1, "traitName"), 9999, "traitValue", Phenotype.ValueStatus.OUT_OF_SYNC)); final ObservationDto measurement = new ObservationDto(1, "trialInstance", "entryType", StudyServiceImplTest.STUDY_ID, "designation", "entryNo", "seedSource", "repitionNumber", "plotNumber", "blockNumber", traits); - final List testMeasurements = Collections.singletonList(measurement); + final List testMeasurements = Collections.singletonList(measurement); final int instanceId = 1; final int pageNumber = 1; final int pageSize = 100; @@ -319,8 +270,6 @@ public void testGetStudyDetailsForAStudy() { Mockito.when(this.studyDataManager.getUsersForEnvironment(metadata.getStudyDbId())).thenReturn(users2); Mockito.when(this.studyDataManager.getStudyMetadataForGeolocationId(metadata.getStudyDbId())).thenReturn(metadata); Mockito.when(this.studyDataManager.getProjectPropsAndValuesByStudy(metadata.getNurseryOrTrialId())).thenReturn(properties1); - Mockito.when(this.studyDataManager.getGeolocationPropsAndValuesByGeolocation(metadata.getNurseryOrTrialId())) - .thenReturn(properties2); final StudyDetailsDto studyDetailsDto = this.studyServiceImpl.getStudyDetailsForGeolocation(metadata.getStudyDbId()); @@ -412,7 +361,7 @@ public void testGetTrialObservationTable() { @Test public void testGetPlotDatasetId() { final Integer plotDatasetId = new Random().nextInt(); - final Integer studyId = new Random().nextInt(); + final int studyId = new Random().nextInt(); Mockito.doReturn(Collections.singletonList(new DmsProject(plotDatasetId))).when(this.dmsProjectDao).getDatasetsByTypeForStudy( studyId, DatasetTypeEnum.PLOT_DATA.getId()); Assert.assertEquals(plotDatasetId, this.studyServiceImpl.getPlotDatasetId(studyId)); @@ -421,7 +370,7 @@ public void testGetPlotDatasetId() { @Test public void testEnvironmentDatasetId() { final Integer envDatasetId = new Random().nextInt(); - final Integer studyId = new Random().nextInt(); + final int studyId = new Random().nextInt(); Mockito.doReturn(Collections.singletonList(new DmsProject(envDatasetId))).when(this.dmsProjectDao).getDatasetsByTypeForStudy( studyId, DatasetTypeEnum.SUMMARY_DATA.getId()); Assert.assertEquals(envDatasetId, this.studyServiceImpl.getEnvironmentDatasetId(studyId)); diff --git a/src/test/java/org/generationcp/middleware/service/impl/study/generation/ExperimentDesignServiceImplTest.java b/src/test/java/org/generationcp/middleware/service/impl/study/generation/ExperimentDesignServiceImplTest.java index 075c81f065..56b9d2601d 100644 --- a/src/test/java/org/generationcp/middleware/service/impl/study/generation/ExperimentDesignServiceImplTest.java +++ b/src/test/java/org/generationcp/middleware/service/impl/study/generation/ExperimentDesignServiceImplTest.java @@ -26,8 +26,8 @@ import org.generationcp.middleware.manager.api.OntologyDataManager; import org.generationcp.middleware.pojos.Germplasm; import org.generationcp.middleware.pojos.dms.DmsProject; -import org.generationcp.middleware.pojos.dms.Geolocation; -import org.generationcp.middleware.pojos.dms.GeolocationProperty; +import org.generationcp.middleware.pojos.dms.ExperimentModel; +import org.generationcp.middleware.pojos.dms.ExperimentProperty; import org.generationcp.middleware.pojos.dms.ProjectProperty; import org.generationcp.middleware.pojos.oms.CVTerm; import org.generationcp.middleware.pojos.workbench.CropType; @@ -156,7 +156,7 @@ public void testSaveExperimentDesign_ForAllStudyInstancesAtOnce() { for (final ObservationUnitRow row : rows) { final Integer trialInstance = row.getTrialInstance(); if (instancesRowMap.get(trialInstance) == null) { - instancesRowMap.put(trialInstance, new ArrayList()); + instancesRowMap.put(trialInstance, new ArrayList<>()); } instancesRowMap.get(trialInstance).add(row); } @@ -211,14 +211,14 @@ public void testSaveExperimentDesign_IterativeAndRegeneratePreviousInstance() { final List previousRows = this.datasetService.getAllObservationUnitRows(this.studyId, this.plotDatasetId); Assert.assertEquals(2 * NO_ENTRIES * NO_REPS * NO_TREATMENTS, previousRows.size()); // Save fieldmap info for instance1 - final Integer geolocationId1 = this.daoFactory.getGeolocationDao() - .getEnvironmentGeolocationsForInstances(this.studyId, Collections.singletonList(1)).get(0).getLocationId(); - Assert.assertFalse(this.daoFactory.getGeolocationPropertyDao() - .getGeoLocationPropertyByVariableId(this.environmentDatasetId, geolocationId1) + final Integer geolocationId1 = this.daoFactory.getInstanceDao() + .getEnvironmentsForInstances(this.studyId, Collections.singletonList(1)).get(0).getNdExperimentId(); + Assert.assertFalse(this.daoFactory.getEnvironmentPropertyDao() + .getEnvironmentVariablesMap(this.environmentDatasetId, geolocationId1) .containsKey(TermId.BLOCK_ID.getId())); - this.daoFactory.getGeolocationPropertyDao().save(this.createGeolocationProperty(geolocationId1, TermId.BLOCK_ID.getId(), RandomStringUtils.randomAlphabetic(5))); - Assert.assertTrue(this.daoFactory.getGeolocationPropertyDao() - .getGeoLocationPropertyByVariableId(this.environmentDatasetId, geolocationId1) + this.daoFactory.getEnvironmentPropertyDao().save(this.createEnvironmentProperty(geolocationId1, TermId.BLOCK_ID.getId(), RandomStringUtils.randomAlphabetic(5))); + Assert.assertTrue(this.daoFactory.getEnvironmentPropertyDao() + .getEnvironmentVariablesMap(this.environmentDatasetId, geolocationId1) .containsKey(TermId.BLOCK_ID.getId())); // Save design - overwrite first instance, generate experiments for 3rd @@ -234,8 +234,8 @@ public void testSaveExperimentDesign_IterativeAndRegeneratePreviousInstance() { this.verifyEnvironmentVariablesWereSaved(); this.verifyPlotVariablesWereSaved(); this.verifyGeolocationPropRecords(true, Arrays.asList(1, 2, 3)); - final Map map = this.daoFactory.getGeolocationPropertyDao() - .getGeoLocationPropertyByVariableId(this.environmentDatasetId, geolocationId1); + final Map map = this.daoFactory.getEnvironmentPropertyDao() + .getEnvironmentVariablesMap(this.environmentDatasetId, geolocationId1); for (final Integer id : map.keySet()) { System.out.println("TEST ASSERTION LOC = " + geolocationId1 + ":: Found geolocprop variable= " + id); } @@ -248,7 +248,7 @@ public void testSaveExperimentDesign_IterativeAndRegeneratePreviousInstance() { for (final ObservationUnitRow row : rows) { final Integer trialInstance = row.getTrialInstance(); if (instancesRowMap.get(trialInstance) == null) { - instancesRowMap.put(trialInstance, new ArrayList()); + instancesRowMap.put(trialInstance, new ArrayList<>()); } instancesRowMap.get(trialInstance).add(row); } @@ -280,7 +280,7 @@ public void testSaveExperimentDesign_SubsetOfInstances() { for (final ObservationUnitRow row : rows) { final Integer trialInstance = row.getTrialInstance(); if (instancesRowMap.get(trialInstance) == null) { - instancesRowMap.put(trialInstance, new ArrayList()); + instancesRowMap.put(trialInstance, new ArrayList<>()); } instancesRowMap.get(trialInstance).add(row); } @@ -302,17 +302,17 @@ public void testDeleteExperimentDesign() { this.daoFactory.getProjectPropertyDAO().save( new ProjectProperty(new DmsProject(this.environmentDatasetId), VariableType.ENVIRONMENT_DETAIL.getId(), null, 1, TermId.BLOCK_ID.getId(), "BLOCK_ID")); - final Geolocation geolocation1 = this.daoFactory.getGeolocationDao() - .getEnvironmentGeolocationsForInstances(this.studyId, Collections.singletonList(1)).get(0); - this.daoFactory.getGeolocationPropertyDao().save(this.createGeolocationProperty(geolocation1.getLocationId(), TermId.BLOCK_ID.getId(), RandomStringUtils.randomAlphabetic(5))); + final Integer environmentId = this.daoFactory.getInstanceDao() + .getEnvironmentsForInstances(this.studyId, Collections.singletonList(1)).get(0).getNdExperimentId(); + this.daoFactory.getEnvironmentPropertyDao().save(this.createEnvironmentProperty(environmentId, TermId.BLOCK_ID.getId(), RandomStringUtils.randomAlphabetic(5))); List environmentVariableIds = this.daoFactory.getProjectPropertyDAO().getVariableIdsForDataset(this.environmentDatasetId); Assert.assertTrue(environmentVariableIds.contains(TermId.EXPERIMENT_DESIGN_FACTOR.getId())); Assert.assertTrue(environmentVariableIds.contains(TermId.NUMBER_OF_REPLICATES.getId())); Assert.assertTrue(environmentVariableIds.contains(TermId.BLOCK_ID.getId())); - Assert.assertTrue(this.daoFactory.getGeolocationPropertyDao() - .getGeoLocationPropertyByVariableId(this.environmentDatasetId,geolocation1.getLocationId()) + Assert.assertTrue(this.daoFactory.getEnvironmentPropertyDao() + .getEnvironmentVariablesMap(this.environmentDatasetId, environmentId) .containsKey(TermId.BLOCK_ID.getId())); // Delete experiment design @@ -386,7 +386,7 @@ public void testDeleteThenSaveExperimentDesignAgain() { for (final ObservationUnitRow row : rows) { final Integer trialInstance = row.getTrialInstance(); if (instancesRowMap.get(trialInstance) == null) { - instancesRowMap.put(trialInstance, new ArrayList()); + instancesRowMap.put(trialInstance, new ArrayList<>()); } instancesRowMap.get(trialInstance).add(row); } @@ -468,22 +468,21 @@ public Integer apply(final MeasurementVariable variable) { } private void verifyGeolocationPropRecords(final boolean shouldExist, final List instanceNumbers) { - final List geolocations = this.daoFactory.getGeolocationDao().getEnvironmentGeolocations(this.studyId); - Assert.assertEquals(NO_INSTANCES.intValue(), geolocations.size()); + final List environments = this.daoFactory.getInstanceDao().getEnvironments(this.studyId); + Assert.assertEquals(NO_INSTANCES.intValue(), environments.size()); - for (final Geolocation geolocation : geolocations) { + for (final ExperimentModel env : environments) { - final List properties = - this.daoFactory.getGeolocationPropertyDao().getByGeolocation(geolocation.getLocationId()); - final ImmutableMap propertiesMap = - Maps.uniqueIndex(properties, new Function() { + final List properties = env.getProperties(); + final ImmutableMap propertiesMap = + Maps.uniqueIndex(properties, new Function() { @Override - public Object apply(@Nullable final GeolocationProperty input) { + public Object apply(@Nullable final ExperimentProperty input) { return input.getTypeId(); } }); - final Integer instanceNumber = Integer.valueOf(geolocation.getDescription()); + final Integer instanceNumber = env.getObservationUnitNo(); if (shouldExist && instanceNumbers.contains(instanceNumber)) { Assert.assertNotNull("Expecting EXP_DESIGN factor for instance " + instanceNumber, propertiesMap.get(TermId.EXPERIMENT_DESIGN_FACTOR.getId())); @@ -567,7 +566,7 @@ private Map> createObservationUnitRows(final L for (int instance = 1; instance <= NO_INSTANCES; instance++) { if (instanceNumbers.contains(instance)) { - instanceRowsMap.put(instance, new ArrayList()); + instanceRowsMap.put(instance, new ArrayList<>()); int plotNo = 1; for (int rep = 1; rep <= NO_REPS; rep++) { for (int entry = 1; entry <= NO_ENTRIES; entry++) { @@ -575,7 +574,7 @@ private Map> createObservationUnitRows(final L final ObservationUnitRow row = new ObservationUnitRow(); row.setEntryNumber(entry); row.setTrialInstance(instance); - row.setVariables(new HashMap()); + row.setVariables(new HashMap<>()); row.getVariables().put(String.valueOf(TermId.TRIAL_INSTANCE_FACTOR.getId()), new ObservationUnitData(TermId.TRIAL_INSTANCE_FACTOR.getId(), "1")); row.getVariables() @@ -609,10 +608,10 @@ private Map> createObservationUnitRows(final L return instanceRowsMap; } - private GeolocationProperty createGeolocationProperty(final Integer geolocationId, final Integer variableId, final String value) { - final GeolocationProperty property = new GeolocationProperty(); - property.setGeolocation(this.daoFactory.getGeolocationDao().getById(geolocationId)); - property.setType(variableId); + private ExperimentProperty createEnvironmentProperty(final Integer environmentId, final Integer variableId, final String value) { + final ExperimentProperty property = new ExperimentProperty(); + property.setExperiment(this.daoFactory.getInstanceDao().getById(environmentId)); + property.setTypeId(variableId); property.setRank(1); property.setValue(value); return property; diff --git a/src/test/java/org/generationcp/middleware/utils/test/IntegrationTestDataInitializer.java b/src/test/java/org/generationcp/middleware/utils/test/IntegrationTestDataInitializer.java index b2d60a18e0..b513f122ab 100644 --- a/src/test/java/org/generationcp/middleware/utils/test/IntegrationTestDataInitializer.java +++ b/src/test/java/org/generationcp/middleware/utils/test/IntegrationTestDataInitializer.java @@ -8,8 +8,6 @@ import org.generationcp.middleware.dao.dms.DmsProjectDao; import org.generationcp.middleware.dao.dms.ExperimentDao; import org.generationcp.middleware.dao.dms.ExperimentPropertyDao; -import org.generationcp.middleware.dao.dms.GeolocationDao; -import org.generationcp.middleware.dao.dms.GeolocationPropertyDao; import org.generationcp.middleware.dao.dms.PhenotypeDao; import org.generationcp.middleware.dao.dms.ProjectPropertyDao; import org.generationcp.middleware.dao.dms.StockDao; @@ -48,7 +46,6 @@ import org.generationcp.middleware.pojos.workbench.UserRole; import org.generationcp.middleware.pojos.workbench.WorkbenchUser; import org.generationcp.middleware.service.api.dataset.ObservationUnitsSearchDTO; -import org.generationcp.middleware.service.api.study.MeasurementVariableDto; import org.generationcp.middleware.service.api.user.UserService; import org.generationcp.middleware.service.impl.user.UserServiceImpl; @@ -61,32 +58,31 @@ public class IntegrationTestDataInitializer { - private ExperimentDao experimentDao; - private ExperimentPropertyDao experimentPropertyDao; - private GeolocationDao geolocationDao; - private GeolocationPropertyDao geolocationPropertyDao; - private StockDao stockDao; - private DmsProjectDao dmsProjectDao; - private GermplasmDAO germplasmDao; - private PhenotypeDao phenotypeDao; - private CVTermDao cvTermDao; - private SampleDao sampleDao; - private SampleListDao sampleListDao; - private ProjectPropertyDao projectPropertyDao; - private StudyTypeDAO studyTypeDAO; - - private WorkbenchDaoFactory workbenchDaoFactory; - private DaoFactory daoFactory; - private UserService userService; - private WorkbenchDataManager workbenchDataManager; + private final ExperimentDao experimentDao; + private final ExperimentPropertyDao experimentPropertyDao; + private final StockDao stockDao; + private final DmsProjectDao dmsProjectDao; + private final GermplasmDAO germplasmDao; + private final PhenotypeDao phenotypeDao; + private final CVTermDao cvTermDao; + private final SampleDao sampleDao; + private final SampleListDao sampleListDao; + private final ProjectPropertyDao projectPropertyDao; + + private final DaoFactory daoFactory; + private final UserService userService; + private final WorkbenchDataManager workbenchDataManager; + + + private final StudyTypeDAO studyTypeDAO; + + private final WorkbenchDaoFactory workbenchDaoFactory; public IntegrationTestDataInitializer(final HibernateSessionProvider hibernateSessionProvider, final HibernateSessionProvider workbenchSessionProvider) { this.workbenchDaoFactory = new WorkbenchDaoFactory(workbenchSessionProvider); this.daoFactory = new DaoFactory(hibernateSessionProvider); this.experimentDao = this.daoFactory.getExperimentDao(); - this.geolocationDao = this.daoFactory.getGeolocationDao(); - this.geolocationPropertyDao = this.daoFactory.getGeolocationPropertyDao(); this.stockDao = this.daoFactory.getStockDao(); this.dmsProjectDao = this.daoFactory.getDmsProjectDAO(); this.germplasmDao = this.daoFactory.getGermplasmDao(); @@ -128,6 +124,8 @@ public DmsProject createDmsProject(final String name, final String description, return dmsProject; } + // TODO IBP-3390 + @Deprecated public Geolocation createTestGeolocation(final String trialNumber, final int locationId) { final Geolocation geolocation = new Geolocation(); @@ -140,8 +138,6 @@ public Geolocation createTestGeolocation(final String trialNumber, final int loc geolocation.setProperties(Arrays.asList(geolocationPropertyLocationId)); geolocation.setDescription(trialNumber); - this.geolocationDao.saveOrUpdate(geolocation); - this.geolocationDao.refresh(geolocation); return geolocation; @@ -169,11 +165,20 @@ public List createTestExperiments(final DmsProject project, fin return experimentModels; } + public ExperimentModel createInstanceExperimentModel(final DmsProject project, final Integer instanceNumber, final String locationId) { + ExperimentModel experimentModel = new ExperimentModel(); + experimentModel.setTypeId(TermId.TRIAL_ENVIRONMENT_EXPERIMENT.getId()); + experimentModel.setProject(project); + experimentModel.setObservationUnitNo(instanceNumber); + experimentModel = this.experimentDao.saveOrUpdate(experimentModel); + this.addExperimentProp(experimentModel, TermId.LOCATION_ID.getId(), locationId, 1); + return experimentModel; + } + public ExperimentModel createTestExperiment(final DmsProject project, final Geolocation geolocation, final int experimentType, final String value, final ExperimentModel parent) { final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(geolocation); experimentModel.setTypeId(experimentType); experimentModel.setProject(project); experimentModel.setObservationUnitNo(1); @@ -276,6 +281,8 @@ public void addProjectProp(final DmsProject project, final int variableId, final } + // TODO IBP-3389 + @Deprecated public void addGeolocationProp(final Geolocation geolocation, final int type, final String value, final int rank) { final GeolocationProperty geolocationProperty = new GeolocationProperty(); @@ -283,8 +290,6 @@ public void addGeolocationProp(final Geolocation geolocation, final int type, fi geolocationProperty.setRank(rank); geolocationProperty.setType(type); geolocationProperty.setGeolocation(geolocation); - this.geolocationPropertyDao.save(geolocationProperty); - this.geolocationPropertyDao.refresh(geolocationProperty); } @@ -304,7 +309,6 @@ public ExperimentModel createExperimentModel(final DmsProject dmsProject, final final StockModel stockModel) { final ExperimentModel experimentModel = new ExperimentModel(); - experimentModel.setGeoLocation(geolocation); experimentModel.setTypeId(typeId); experimentModel.setObsUnitId(RandomStringUtils.randomAlphabetic(13)); experimentModel.setProject(dmsProject); @@ -317,10 +321,10 @@ public ExperimentModel createExperimentModel(final DmsProject dmsProject, final public ObservationUnitsSearchDTO createTestObservationUnitsDTO() { final ObservationUnitsSearchDTO observationUnitsSearchDTO = new ObservationUnitsSearchDTO(); - observationUnitsSearchDTO.setSelectionMethodsAndTraits(new ArrayList()); - observationUnitsSearchDTO.setEnvironmentConditions(new ArrayList()); - observationUnitsSearchDTO.setAdditionalDesignFactors(new ArrayList()); - observationUnitsSearchDTO.setGenericGermplasmDescriptors(new ArrayList()); + observationUnitsSearchDTO.setSelectionMethodsAndTraits(new ArrayList<>()); + observationUnitsSearchDTO.setEnvironmentConditions(new ArrayList<>()); + observationUnitsSearchDTO.setAdditionalDesignFactors(new ArrayList<>()); + observationUnitsSearchDTO.setGenericGermplasmDescriptors(new ArrayList<>()); return observationUnitsSearchDTO; }