diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java index 65e5de115332bd94679987607c239eb025844785..8c45863eda1b97922c92464c637cfcb18c57cc4d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java @@ -20,6 +20,7 @@ import java.util.List; import ch.systemsx.cisd.authentication.ISessionManager; import ch.systemsx.cisd.openbis.generic.server.business.bo.ICommonBusinessObjectFactory; +import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister; import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister; import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer; @@ -47,11 +48,6 @@ public final class TrackingServer extends AbstractServer<ITrackingServer> implem return businessObjectFactory; } - // private static UserFailureException createUserFailureException(final DataAccessException ex) - // { - // return new UserFailureException(ex.getMostSpecificCause().getMessage(), ex); - // } - // // IInvocationLoggerFactory // @@ -71,13 +67,17 @@ public final class TrackingServer extends AbstractServer<ITrackingServer> implem public List<ExternalData> listDataSets(String sessionToken, TrackingDataSetCriteria criteria) { - // TODO 2009-11-06, Piotr Buczek: implement - return null; + final Session session = getSession(sessionToken); + + final IDatasetLister datasetLister = + businessObjectFactory.createDatasetLister(session, getDataStoreBaseURL()); + return datasetLister.listByTrackingCriteria(criteria); } public List<Sample> listSamples(String sessionToken, TrackingSampleCriteria criteria) { final Session session = getSession(sessionToken); + final ISampleLister sampleLister = businessObjectFactory.createSampleLister(session); return sampleLister.list(new ListOrSearchSampleCriteria(criteria)); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/entity/ISecondaryEntityListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/entity/ISecondaryEntityListingQuery.java index 0c5d253f35721c1e83d838dc3c2f468c007e1e7e..d59f389c85c5c2eb71362994f32517742d3aba80 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/entity/ISecondaryEntityListingQuery.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/entity/ISecondaryEntityListingQuery.java @@ -96,4 +96,12 @@ public interface ISecondaryEntityListingQuery extends TransactionQuery */ @Select("select id from groups where code=?{1}") public long getGroupIdForCode(String groupCode); + + /** + * Returns the technical id of a sample type for given <var>sampleTypeCode</code> or + * <code>null</code> if such sample type doesn't exist. + */ + @Select("select id from sample_types where code=?{1} and dbin_id=?{2}") + public Long getSampleTypeIdForSampleTypeCode(String sampleTypeCode, long dbInstanceId); + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/entity/SecondaryEntityDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/entity/SecondaryEntityDAO.java index 7390a887b4d916299b62591d77e5000dba57d1ea..a836194d7f3ea83739c34fe34311f56289465f02 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/entity/SecondaryEntityDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/entity/SecondaryEntityDAO.java @@ -29,6 +29,7 @@ import org.springframework.dao.EmptyResultDataAccessException; import ch.rinn.restrictions.Friend; import ch.rinn.restrictions.Private; +import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.openbis.generic.server.business.bo.common.DatabaseContextUtils; import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources; @@ -141,6 +142,18 @@ public class SecondaryEntityDAO return registrator; } + public Long getSampleTypeIdForSampleTypeCode(String sampleTypeCode) + { + Long id = query.getSampleTypeIdForSampleTypeCode(sampleTypeCode, databaseInstance.getId()); + if (id == null) + { + throw UserFailureException + .fromTemplate("No sample type with code '%s' could be found in the database.", + sampleTypeCode); + } + return id; + } + public Group[] getAllGroups(long databaseInstanceId) { return query.getAllGroups(databaseInstanceId); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java index 7f6e4a76f712a8da9d9ad0da1a4cff8c497d85a5..70ac7f59eee331932a27e9189ce56068c925e41e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java @@ -50,6 +50,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Invalidation; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LocatorType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria; import ch.systemsx.cisd.openbis.generic.shared.translator.DataStoreTranslator; /** @@ -174,6 +175,15 @@ public class DatasetLister implements IDatasetLister return enrichDatasets(query.getDatasets(new LongOpenHashSet(datasetIds))); } + public List<ExternalData> listByTrackingCriteria(TrackingDataSetCriteria criteria) + { + Long sampleTypeId = + referencedEntityDAO.getSampleTypeIdForSampleTypeCode(criteria + .getConnectedSampleTypeCode()); + return enrichDatasets(query.getNewDataSetsForSampleType(sampleTypeId, criteria + .getLastSeenDataSetId())); + } + private List<ExternalData> enrichDatasets(Iterable<DatasetRecord> datasets) { loadSmallConnectedTables(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java index 10c9ebc7b7ddeccbe3f54d3612a354391ef96cfc..0418e32ed690243f66256e9d6e93dfd6bab2c0f6 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java @@ -21,6 +21,7 @@ import java.util.List; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria; /** * A class for fast dataset listing. @@ -33,6 +34,7 @@ public interface IDatasetLister List<ExternalData> listByExperimentTechId(TechId experimentId); // TODO 2009-09-10, Piotr Buczek: write tests + /** * @return datasets connected to the sample with the specified id * @param showOnlyDirectlyConnected whether to return only directly connected datasets, or also @@ -45,8 +47,12 @@ public interface IDatasetLister /** @return datasets that are parents of a dataset with the specified id */ List<ExternalData> listByParentTechId(TechId parentDatasetId); - // + + // /** @return datasets with given ids */ List<ExternalData> listByDatasetIds(Collection<Long> datasetIds); + + /** @return datasets specified by given criteria */ + List<ExternalData> listByTrackingCriteria(TrackingDataSetCriteria criteria); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java index 741b4076aa3e5dfac7f504d20b06ed0c53f7d3f8..bacfdadb935b0c217b1abc2217ddb763c4b1234c 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetListingQuery.java @@ -58,6 +58,15 @@ public interface IDatasetListingQuery extends TransactionQuery, IPropertyListing @Select(sql = "select * from data join external_data on data.id = external_data.data_id where data.samp_id=?{1}", fetchSize = FETCH_SIZE) public DataIterator<DatasetRecord> getDatasetsForSample(long sampleId); + /** + * Returns datasets that are newer than dataset with given id (<var>lastSeenDatasetId</var>) and + * are directly connected with samples of sample type with given <var>sampleTypeId</var>. + */ + @Select(sql = "SELECT * FROM data JOIN external_data ON data.id = external_data.data_id" + + " WHERE data.id > ?{2} AND data.samp_id IN (SELECT id FROM samples s WHERE s.saty_id=?{1})", fetchSize = FETCH_SIZE) + public DataIterator<DatasetRecord> getNewDataSetsForSampleType(long sampleTypeId, + int lastSeenDatasetId); + /** * Returns the directly connected dataset ids for the given sample id. */ diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java index 5d54cbaa5c18f64814142a1b5fe00206dd3029ac..c203a16118f59be84ed281abf620c1065127bf1e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java @@ -159,17 +159,19 @@ public interface ISampleListingQuery extends TransactionQuery, IPropertyListingQ public DataIterator<SampleRecord> getSamplesForContainer(long sampleContainerId); // - // Samples of type + // New samples of type // /** - * Returns all samples for the given <var>sampleTypeId</var>. + * Returns all samples of sample type with given <var>sampleTypeId</var> that are newer than + * sample with given id (<var>lastSeenSampleId</var>). */ @Select(sql = "select s.id, s.perm_id, s.code, s.expe_id, s.grou_id, s.dbin_id, " + " s.registration_timestamp, s.pers_id_registerer, " + " s.samp_id_generated_from, s.samp_id_part_of, s.saty_id, s.inva_id " - + " from samples s where s.saty_id=?{1} order by s.code", fetchSize = FETCH_SIZE) - public DataIterator<SampleRecord> getSamplesForSampleType(long sampleTypeId); + + " from samples s where s.saty_id=?{1} and s.id > ?{2} order by s.code", fetchSize = FETCH_SIZE) + public DataIterator<SampleRecord> getNewSamplesForSampleType(long sampleTypeId, + int lastSeenSampleId); // // Shared samples diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java index ff3dab63cbf268551c999998826577747445a136..f164ae69487ee3465eb827d54ae8ff4f451e3c56 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java @@ -31,7 +31,6 @@ import org.apache.commons.lang.time.StopWatch; import org.apache.log4j.Logger; import ch.rinn.restrictions.Friend; -import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.openbis.generic.server.business.bo.common.EntityPropertiesEnricher; @@ -395,23 +394,9 @@ final class SampleListingWorker { return null; } - SampleType sampleTypeOrNull = null; - for (SampleType sampleType : sampleTypes.values()) - { - if (sampleType.getCode().equals(sampleTypeCode)) - { - sampleTypeOrNull = sampleType; - } - } - if (sampleTypeOrNull != null) - { - return query.getSamplesForSampleType(sampleTypeOrNull.getId()); - } else - { - throw UserFailureException - .fromTemplate("No sample type with code '%s' could be found in the database.", - sampleTypeCode); - } + Long sampleTypeId = + referencedEntityDAO.getSampleTypeIdForSampleTypeCode(criteria.getSampleTypeCode()); + return query.getNewSamplesForSampleType(sampleTypeId, criteria.getLastSeenSampleId()); } private void retrievePrimaryBasicSamples(final Iterable<SampleRecord> sampleIteratorOrNull) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TrackingDataSetCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TrackingDataSetCriteria.java index 7eb7f31088cfeabda1b3e54c5c991b991c51fa7f..723124b6688c28c26c829d8c52ef88c69ecc4444 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TrackingDataSetCriteria.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TrackingDataSetCriteria.java @@ -40,6 +40,7 @@ public class TrackingDataSetCriteria implements IsSerializable, Serializable public TrackingDataSetCriteria(String connectedSampleTypeCode, int lastSeenDataSetId) { + assert connectedSampleTypeCode != null; this.lastSeenDataSetId = lastSeenDataSetId; this.connectedSampleTypeCode = connectedSampleTypeCode; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TrackingSampleCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TrackingSampleCriteria.java index a5d5191cf8556fc6c6b4b5675cc34ca4c8b3c43f..49afa5e79df3bc39384f4027fff748926eb3995a 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TrackingSampleCriteria.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TrackingSampleCriteria.java @@ -38,6 +38,7 @@ public class TrackingSampleCriteria implements Serializable public TrackingSampleCriteria(String sampleTypeCode, int lastSeenSampleId) { + assert sampleTypeCode != null; this.sampleTypeCode = sampleTypeCode; this.lastSeenSampleId = lastSeenSampleId; } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java index 75b4dbbdaa28586893bfc0abbd25be82aa64bc5d..4cd7442c7abe52191ccc4301818eefd036b7fc7b 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java @@ -100,8 +100,8 @@ public class OpenbisClientTest SessionContextDTO session = trackingServer.tryToAuthenticate(USER_ID, USER_PASSWORD); final String sampleTypeCode = "CELL_PLATE"; - final int lastSeenSampleId = 0; - final int lastSeenDataSetId = 0; + final int lastSeenSampleId = 1000; // compare with 0 + final int lastSeenDataSetId = 3; // compare with 0 final TrackingSampleCriteria sampleCriteria = new TrackingSampleCriteria(sampleTypeCode, lastSeenSampleId);