diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/AbstractSearchManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/AbstractSearchManager.java index 985da17c4f0a00eb072462a426d1242674f67bec..fa24878cbd5672054ec0af2bc23e7215021e38a3 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/AbstractSearchManager.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/AbstractSearchManager.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.search; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -48,6 +49,16 @@ public class AbstractSearchManager<T> this.lister = lister; } + protected Collection<Long> restrictResultSetIfNecessary(Collection<Long> ids) + { + int maxSize = searchDAO.getResultSetSizeLimit(); + if (ids.size() <= maxSize) + { + return ids; + } + return new ArrayList<Long>(ids).subList(0, maxSize); + } + protected DetailedSearchAssociationCriteria findAssociatedEntities( DetailedSearchSubCriteria subCriteria) { @@ -70,7 +81,7 @@ public class AbstractSearchManager<T> criteria.setUseWildcardSearchMode(subCriteriaToMerge.getCriteria() .isUseWildcardSearchMode()); } - + interface IRelationshipHandler { Collection<Long> findRelatedIdsByCriteria(DetailedSearchCriteria criteria, @@ -137,6 +148,5 @@ public class AbstractSearchManager<T> } return idsToFilter; } - } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/DataSetSearchManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/DataSetSearchManager.java index 50828177565ce392dd93362ca150bbeb19c60a90..a92f9da3a85a275ebfc25fcd429b8f027e5acf1f 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/DataSetSearchManager.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/DataSetSearchManager.java @@ -46,18 +46,18 @@ public class DataSetSearchManager extends AbstractSearchManager<IDatasetLister> private final IRelationshipHandler CHILDREN_RELATIONSHIP_HANDLER = new IRelationshipHandler() { - public Collection<Long> findRelatedIdsByCriteria(DetailedSearchCriteria criteria, + public Collection<Long> findRelatedIdsByCriteria(DetailedSearchCriteria criteria, List<DetailedSearchSubCriteria> otherSubCriterias) - { + { return findDataSetIds(criteria, otherSubCriterias); } - public Map<Long, Set<Long>> listIdsToRelatedIds(Collection<Long> dataSetIds) + public Map<Long, Set<Long>> listIdsToRelatedIds(Collection<Long> dataSetIds) { return lister.listChildrenIds(dataSetIds); } - public Map<Long, Set<Long>> listRelatedIdsToIds(Collection<Long> childrenDataSetIds) + public Map<Long, Set<Long>> listRelatedIdsToIds(Collection<Long> childrenDataSetIds) { return lister.listParentIds(childrenDataSetIds); } @@ -66,18 +66,18 @@ public class DataSetSearchManager extends AbstractSearchManager<IDatasetLister> private final IRelationshipHandler PARENT_RELATIONSHIP_HANDLER = new IRelationshipHandler() { - public Collection<Long> findRelatedIdsByCriteria(DetailedSearchCriteria criteria, + public Collection<Long> findRelatedIdsByCriteria(DetailedSearchCriteria criteria, List<DetailedSearchSubCriteria> otherSubCriterias) - { + { return findDataSetIds(criteria, otherSubCriterias); } - public Map<Long, Set<Long>> listIdsToRelatedIds(Collection<Long> dataSetIds) + public Map<Long, Set<Long>> listIdsToRelatedIds(Collection<Long> dataSetIds) { return lister.listParentIds(dataSetIds); } - public Map<Long, Set<Long>> listRelatedIdsToIds(Collection<Long> parentDataSetIds) + public Map<Long, Set<Long>> listRelatedIdsToIds(Collection<Long> parentDataSetIds) { return lister.listChildrenIds(parentDataSetIds); } @@ -91,7 +91,7 @@ public class DataSetSearchManager extends AbstractSearchManager<IDatasetLister> public List<ExternalData> searchForDataSets(DetailedSearchCriteria criteria) throws DataAccessException { - + DetailedSearchCriteria parentCriteria = new DetailedSearchCriteria(); DetailedSearchCriteria childCriteria = new DetailedSearchCriteria(); List<DetailedSearchSubCriteria> otherSubCriterias = @@ -116,15 +116,14 @@ public class DataSetSearchManager extends AbstractSearchManager<IDatasetLister> CHILDREN_RELATIONSHIP_HANDLER); } - return lister.listByDatasetIds(filteredDataSetIds); + return lister.listByDatasetIds(restrictResultSetIfNecessary(filteredDataSetIds)); } - private List<Long> findDataSetIds(DetailedSearchCriteria criteria, List<DetailedSearchSubCriteria> otherSubCriterias) { List<DetailedSearchAssociationCriteria> associations = - new ArrayList<DetailedSearchAssociationCriteria>(); + new ArrayList<DetailedSearchAssociationCriteria>(); for (DetailedSearchSubCriteria subCriteria : otherSubCriterias) { associations.add(findAssociatedEntities(subCriteria)); @@ -139,8 +138,8 @@ public class DataSetSearchManager extends AbstractSearchManager<IDatasetLister> } final List<Long> dataSetIds = - searchDAO.searchForEntityIds(criteria, - DtoConverters.convertEntityKind(EntityKind.DATA_SET), associations); + searchDAO.searchForEntityIds(criteria, + DtoConverters.convertEntityKind(EntityKind.DATA_SET), associations); return dataSetIds; } @@ -169,5 +168,4 @@ public class DataSetSearchManager extends AbstractSearchManager<IDatasetLister> } - } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/SampleSearchManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/SampleSearchManager.java index 875ca536f72dd4f730e387fb455d243b6dfff16e..3f199c2307c33c5a03f95963d034e08b36d87185 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/SampleSearchManager.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/SampleSearchManager.java @@ -116,7 +116,8 @@ public class SampleSearchManager extends AbstractSearchManager<ISampleLister> CHILDREN_RELATIONSHIP_HANDLER); } - return lister.list(new ListOrSearchSampleCriteria(filteredSampleIds)); + return lister.list(new ListOrSearchSampleCriteria( + restrictResultSetIfNecessary(filteredSampleIds))); } private void groupSampleSubCriteria(List<DetailedSearchSubCriteria> allSubCriterias, diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IHibernateSearchDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IHibernateSearchDAO.java index ae92be25b8b47b8d073ed37eea8d940bb2ec2019..84c82260e6c6d3e9b641d616bbde35d8ff899e1f 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IHibernateSearchDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IHibernateSearchDAO.java @@ -49,4 +49,11 @@ public interface IHibernateSearchDAO /** search for entity ids using the specified criteria */ public List<Long> searchForEntityIds(DetailedSearchCriteria criteria, EntityKind entityKind, List<DetailedSearchAssociationCriteria> associationCriterias); + + /** + * Returns the maximum size of a search result set. The standard implementations returns + * <code>hibernate.search.maxResults</code> of <code>service.properties</code>. + */ + public int getResultSetSizeLimit(); + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java index d5c771ffc4962a93c7eff695ab45ae916d8da231..4b4ab97a86f871eba506c29c33a123dd77763cff 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java @@ -103,6 +103,11 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate // IHibernateSearchDAO // + public int getResultSetSizeLimit() + { + return hibernateSearchContext.getMaxResults(); + } + // simple search for MatchingEntities public List<MatchingEntity> searchEntitiesByTerm(final SearchableEntity searchableEntity, @@ -250,7 +255,6 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate final FullTextQuery hibernateQuery = fullTextSession.createFullTextQuery(query, entityKind.getEntityClass()); - hibernateQuery.setMaxResults(hibernateSearchContext.getMaxResults()); hibernateQuery.setProjection(FullTextQuery.ID); hibernateQuery.setReadOnly(true); hibernateQuery.setResultTransformer(new PassThroughOneObjectTupleResultTransformer());