diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/MatchingEntitiesProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/MatchingEntitiesProvider.java index d0d2962a4a6b5b1b702a6aaeef18c6dc6421ab9f..32e1cdc4cc1cd2d5b4c29702f141ce87e1ddca07 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/MatchingEntitiesProvider.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/MatchingEntitiesProvider.java @@ -56,7 +56,7 @@ public class MatchingEntitiesProvider extends AbstractCommonTableModelProvider<M { List<MatchingEntity> entities = commonServer.listMatchingEntities(sessionToken, matchingEntities, queryText, - useWildcardSearchMode); + useWildcardSearchMode, maxSize); TypedTableModelBuilder<MatchingEntity> builder = new TypedTableModelBuilder<MatchingEntity>(); builder.addColumn(ENTITY_KIND); builder.addColumn(ENTITY_TYPE); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java index 6c96e826435fb9fb33dee4ee92de23ec0e660a85..7a0fa9d889b58d0cade03cf3d846e4f2e4244e9e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java @@ -532,7 +532,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt public final List<MatchingEntity> listMatchingEntities(final String sessionToken, final SearchableEntity[] searchableEntities, final String queryText, - final boolean useWildcardSearchMode) + final boolean useWildcardSearchMode, int maxSize) { checkSession(sessionToken); final List<MatchingEntity> list = new ArrayList<MatchingEntity>(); @@ -545,7 +545,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt List<MatchingEntity> entities = getDAOFactory().getHibernateSearchDAO().searchEntitiesByTerm( searchableEntity, queryText, dataProvider, useWildcardSearchMode, - list.size()); + list.size(), maxSize); list.addAll(entities); } } catch (final DataAccessException ex) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java index 839f828031bfc698fab2d6f9ff925c6533c07429..499be84789e2f2774ed9d40e6da052b5f5bcac92 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java @@ -279,11 +279,11 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe public final List<MatchingEntity> listMatchingEntities(final String sessionToken, final SearchableEntity[] searchableEntities, final String queryText, - final boolean useWildcardSearchMode) + final boolean useWildcardSearchMode, int maxSIze) { logAccess(sessionToken, "list_matching_entities", - "SEARCHABLE-ENTITIES(%s) QUERY-TEXT(%s) WILDCARD_MODE(%s)", - abbreviate(searchableEntities), queryText, useWildcardSearchMode); + "SEARCHABLE-ENTITIES(%s) QUERY-TEXT(%s) WILDCARD_MODE(%s) MAX_SIZE(%s)", + abbreviate(searchableEntities), queryText, useWildcardSearchMode, maxSIze); return null; } 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 b7733af01b493af8054a0b34914070653c47c3e8..afd801ea7fb69d6da8c411784e3fc6151ff26366 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 @@ -38,10 +38,11 @@ public interface IHibernateSearchDAO * using all the indexed fields. * * @param searchTerm could be something like "<code>C11 AND System User</code>". + * @param maxSize Maximum number of entries. */ public List<MatchingEntity> searchEntitiesByTerm(final SearchableEntity searchableEntity, final String searchTerm, final HibernateSearchDataProvider dataProvider, - boolean useWildcardSearchMode, int alreadyFoundEntities) throws DataAccessException; + boolean useWildcardSearchMode, int alreadyFoundEntities, int maxSize) throws DataAccessException; /** search for entity ids using the specified criteria */ public List<Long> searchForEntityIds(DetailedSearchCriteria criteria, EntityKind entityKind); 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 399608c21cd0fd73faf3b689dc5584f24cb8705c..234d811411fc4cf5f256caaa1c1aa7168f065d66 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 @@ -105,7 +105,7 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate public List<MatchingEntity> searchEntitiesByTerm(final SearchableEntity searchableEntity, final String searchTerm, final HibernateSearchDataProvider dataProvider, - final boolean useWildcardSearchMode, final int alreadyFoundEntities) + final boolean useWildcardSearchMode, final int alreadyFoundEntities, final int maxSize) throws DataAccessException { assert searchableEntity != null : "Unspecified searchable entity"; @@ -119,7 +119,7 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate throws HibernateException, SQLException { return doSearchEntitiesByTerm(session, searchableEntity, searchTerm, - dataProvider, useWildcardSearchMode, alreadyFoundEntities); + dataProvider, useWildcardSearchMode, alreadyFoundEntities, maxSize); } })); if (operationLog.isDebugEnabled()) @@ -134,7 +134,7 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate private final List<MatchingEntity> doSearchEntitiesByTerm(final Session session, final SearchableEntity searchableEntity, final String userQuery, final HibernateSearchDataProvider dataProvider, final boolean useWildcardSearchMode, - int alreadyFoundEntities) throws DataAccessException, UserFailureException + int alreadyFoundEntities, int maxSize) throws DataAccessException, UserFailureException { final FullTextSession fullTextSession = Search.getFullTextSession(session); Analyzer analyzer = LuceneQueryBuilder.createSearchAnalyzer(); @@ -153,7 +153,7 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate List<MatchingEntity> hits = searchTermInField(fullTextSession, fieldName, searchQuery, searchableEntity, analyzer, indexProvider.getReader(), - dataProvider, result.size() + alreadyFoundEntities); + dataProvider, result.size() + alreadyFoundEntities, maxSize); result.addAll(hits); } return result; @@ -166,10 +166,12 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate private final List<MatchingEntity> searchTermInField(final FullTextSession fullTextSession, final String fieldName, final String searchTerm, final SearchableEntity searchableEntity, Analyzer analyzer, IndexReader indexReader, - final HibernateSearchDataProvider dataProvider, int alreadyFoundResults) + final HibernateSearchDataProvider dataProvider, int alreadyFoundResults, int maxSize) throws DataAccessException, UserFailureException { - int maxResults = Math.max(0, hibernateSearchContext.getMaxResults() - alreadyFoundResults); + int maxResults = + Math.max(0, Math.min(maxSize, hibernateSearchContext.getMaxResults()) + - alreadyFoundResults); if (maxResults == 0) { return new ArrayList<MatchingEntity>(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java index 97efed44048e4b74008724c7109302add888796f..51087382c5523d92c9f6804d38d67636eb51a3a0 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java @@ -345,13 +345,14 @@ public interface ICommonServer extends IServer /** * Performs an <i>Hibernate Search</i> based on given parameters. + * @param maxSize */ @Transactional(readOnly = true) @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER) @ReturnValueFilter(validatorClass = MatchingEntityValidator.class) public List<MatchingEntity> listMatchingEntities(final String sessionToken, final SearchableEntity[] searchableEntities, final String queryText, - final boolean useWildcardSearchMode); + final boolean useWildcardSearchMode, int maxSize); /** * List experiment types. diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java index 8d8f6bbc36b2ccbf073443406ae30251ae232770..186c613ac5cda90bc425b1cf29585d846b6e636c 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java @@ -118,7 +118,7 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest boolean fail = true; try { - hibernateSearchDAO.searchEntitiesByTerm(null, null, createDataProvider(), true, 0); + hibernateSearchDAO.searchEntitiesByTerm(null, null, createDataProvider(), true, 0, Integer.MAX_VALUE); } catch (final AssertionError ex) { fail = false; @@ -128,7 +128,7 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest try { hibernateSearchDAO.searchEntitiesByTerm(SearchableEntity.MATERIAL, "", - createDataProvider(), true, 0); + createDataProvider(), true, 0, Integer.MAX_VALUE); } catch (final AssertionError ex) { fail = false; @@ -148,7 +148,7 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest final String lastName = "John"; final List<MatchingEntity> hits = hibernateSearchDAO.searchEntitiesByTerm(SearchableEntity.SAMPLE, term, - createDataProvider(), false, 0); + createDataProvider(), false, 0, Integer.MAX_VALUE); assertTrue(hits.size() > 0); for (MatchingEntity matchingEntity : hits) { @@ -174,7 +174,7 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest final IHibernateSearchDAO hibernateSearchDAO = daoFactory.getHibernateSearchDAO(); final List<MatchingEntity> hits = hibernateSearchDAO.searchEntitiesByTerm(SearchableEntity.EXPERIMENT, query, - createDataProvider(), useWildcardMode, 0); + createDataProvider(), useWildcardMode, 0, Integer.MAX_VALUE); assertEquals(5, hits.size()); for (MatchingEntity matchingEntity : hits) { @@ -190,7 +190,7 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest String propertyValue = "adenovirus"; final List<MatchingEntity> hits = hibernateSearchDAO.searchEntitiesByTerm(SearchableEntity.MATERIAL, propertyValue, - createDataProvider(), true, 0); + createDataProvider(), true, 0, Integer.MAX_VALUE); assertEquals(2, hits.size()); for (MatchingEntity matchingEntity : hits) {