diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java index 99f960194a431f3fd8e2109b89e49983482920bc..fffd685f2aa78663d8bdfd9a652bc68cbc05a84a 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -85,10 +86,10 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator // IDynamicPropertyEvaluator // - public final <T extends IEntityInformationWithPropertiesHolder> void doEvaluateProperties( + public final <T extends IEntityInformationWithPropertiesHolder> List<Long> doEvaluateProperties( final Session hibernateSession, final Class<T> clazz) throws DataAccessException { - operationLog.info(String.format("Evaluating dynamic properties for '%s'...", + operationLog.info(String.format("Evaluating dynamic properties for all %ss...", clazz.getSimpleName())); Transaction transaction = null; @@ -106,10 +107,10 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator clazz.getSimpleName())); final int maxIndex = idsSize - 1; // need to increment last id because we use 'lt' condition - if (maxIndex > -1) - { - ids.set(maxIndex, ids.get(maxIndex) + 1); - } + if (maxIndex > -1) + { + ids.set(maxIndex, ids.get(maxIndex) + 1); + } while (index < maxIndex) { final int nextIndex = getNextIndex(index, maxIndex); @@ -126,6 +127,7 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator operationLog.info(String.format( "Evaluation of dynamic properties for '%s' is complete. " + "%d entities have been updated.", clazz.getSimpleName(), index)); + return ids; } catch (Exception e) { operationLog.error(e.getMessage()); @@ -134,39 +136,44 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator transaction.rollback(); } } + return new ArrayList<Long>(); } - public <T extends IEntityInformationWithPropertiesHolder> void doEvaluateProperties( + public <T extends IEntityInformationWithPropertiesHolder> List<Long> doEvaluateProperties( final Session hibernateSession, final Class<T> clazz, final List<Long> ids) throws DataAccessException { - operationLog.info(String.format("Evaluating dynamic properties for %s %ss...", ids.size(), + operationLog.info(String.format("Evaluating dynamic properties for %ss...", clazz.getSimpleName())); Transaction transaction = null; try { transaction = hibernateSession.beginTransaction(); - retainDynamicIds(hibernateSession, clazz, ids); + List<Long> dynamicIds = new ArrayList<Long>(ids); + retainDynamicIds(hibernateSession, clazz, dynamicIds); + operationLog.info(String.format("... got %d '%s' ids...", dynamicIds.size(), + clazz.getSimpleName())); // we index entities in batches loading them in groups by id - final int maxIndex = ids.size(); + final int maxIndex = dynamicIds.size(); int index = 0; while (index < maxIndex) { final int nextIndex = getNextIndex(index, maxIndex); - List<Long> subList = ids.subList(index, nextIndex); + List<Long> subList = dynamicIds.subList(index, nextIndex); final List<T> results = listEntitiesWithRestrictedId(hibernateSession, clazz, subList); evaluateProperties(hibernateSession, results, clazz); index = nextIndex; - operationLog.info(String.format("%d/%d %ss have been updated...", index, maxIndex, + operationLog.info(String.format("%d/%d %ss have been updated...", index + 1, maxIndex + 1, clazz.getSimpleName())); } transaction.commit(); operationLog.info(String.format( "Evaluation of dynamic properties for '%s' is complete. " - + "%d entities have been updated.", clazz.getSimpleName(), index)); + + "%d entities have been updated.", clazz.getSimpleName(), index + 1)); + return dynamicIds; } catch (Exception e) { operationLog.error(e.getMessage()); @@ -175,6 +182,7 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator transaction.rollback(); } } + return new ArrayList<Long>(); } private int getNextIndex(int index, int maxIndex) @@ -295,14 +303,14 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator EntityKind entityKind) throws DataAccessException { final String query = - String.format( - "SELECT pv.entity.id FROM %s pa join pa.propertyValues pv WHERE pa.dynamic = true", - entityKind.getEntityTypePropertyTypeAssignmentClass().getSimpleName()); + String.format("SELECT DISTINCT pv.entity.id FROM %s pa join pa.propertyValues pv " + + "WHERE pa.dynamic = true", entityKind + .getEntityTypePropertyTypeAssignmentClass().getSimpleName()); final List<Long> list = list(hibernateSession.createQuery(query)); - if (operationLog.isInfoEnabled()) + if (operationLog.isDebugEnabled()) { - operationLog.info(String.format( + operationLog.debug(String.format( "LIST: found %s ids of entities of class '%s' assigned to dynamic property.", list.size(), entityKind.getEntityTypePropertyTypeAssignmentClass() .getSimpleName())); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java index ae6aa7427b900a3f39139d578e7813e0e813416f..53954d292f5d679e08a285d828840fc043e79ce2 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java @@ -17,6 +17,8 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property; import java.io.File; +import java.util.ArrayList; +import java.util.List; import org.apache.commons.lang.time.StopWatch; import org.apache.log4j.Logger; @@ -134,6 +136,7 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport stopWatch.start(); Session session = null; Class<IEntityInformationWithPropertiesHolder> clazz = null; + List<Long> modifiedIds = null; try { clazz = @@ -143,10 +146,13 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport if (operation.getIds() == null) { - evaluator.doEvaluateProperties(session, clazz); + modifiedIds = evaluator.doEvaluateProperties(session, clazz); } else { - evaluator.doEvaluateProperties(session, clazz, operation.getIds()); + // new collection is passed because it can be modified inside + modifiedIds = + evaluator.doEvaluateProperties(session, clazz, new ArrayList<Long>( + operation.getIds())); } stopWatch.stop(); } catch (RuntimeException e) @@ -161,14 +167,19 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport if (operationLog.isInfoEnabled()) { operationLog.info("Update of " - + (operation.getIds() == null ? "" : operation.getIds().size() - + " ") + operation.getClassName() + "s took " + stopWatch); + + (modifiedIds == null ? "" : modifiedIds.size() + " ") + + operation.getClassName() + "s took " + stopWatch); } if (clazz != null) { - IndexUpdateOperation indexUpdateOperation = - IndexUpdateOperation.reindex(clazz, operation.getIds()); - fullTextIndexUpdateScheduler.scheduleUpdate(indexUpdateOperation); + List<Long> ids = + operation.getIds() == null ? modifiedIds : operation.getIds(); + if (ids.size() > 0) + { + IndexUpdateOperation indexUpdateOperation = + IndexUpdateOperation.reindex(clazz, ids); + fullTextIndexUpdateScheduler.scheduleUpdate(indexUpdateOperation); + } } } evaluatorQueue.take(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/IDynamicPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/IDynamicPropertyEvaluator.java index dc4b67c3359178fe56a34dd7aaba65f8fc9d653d..6b675bbcc65bdeeca29b1eecfadf90631ace0a11 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/IDynamicPropertyEvaluator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/IDynamicPropertyEvaluator.java @@ -35,15 +35,19 @@ public interface IDynamicPropertyEvaluator /** * Evaluates dynamic properties of all entities of given <var>clazz</var> using given * <i>Hibernate</i> session. + * + * @return list of ids of entities with dynamic properties that have been evaluated */ - public <T extends IEntityInformationWithPropertiesHolder> void doEvaluateProperties( + public <T extends IEntityInformationWithPropertiesHolder> List<Long> doEvaluateProperties( final Session hibernateSession, final Class<T> clazz) throws DataAccessException; /** * Evaluates dynamic properties of entities of given <var>clazz</var> with given <var>ids</var> * using given <i>Hibernate</i> session. + * + * @return list of ids of entities with dynamic properties that have been evaluated */ - public <T extends IEntityInformationWithPropertiesHolder> void doEvaluateProperties( + public <T extends IEntityInformationWithPropertiesHolder> List<Long> doEvaluateProperties( final Session hibernateSession, final Class<T> clazz, final List<Long> ids) throws DataAccessException; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java index 2e1915e67707d748a5e6d53d3291bdd86c8d86b8..af997e48a87edc60a786f237c8a4d96906c2d9a7 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java @@ -101,13 +101,13 @@ final class DefaultFullTextIndexer implements IFullTextIndexer listEntitiesWithRestrictedId(fullTextSession, clazz, minId, maxId); indexEntities(fullTextSession, results, clazz); index = nextIndex; - operationLog.info(String.format("%d/%d %ss have been indexed...", index, maxIndex, - clazz.getSimpleName())); + operationLog.info(String.format("%d/%d %ss have been indexed...", index + 1, + maxIndex + 1, clazz.getSimpleName())); } fullTextSession.getSearchFactory().optimize(clazz); transaction.commit(); operationLog.info(String.format("'%s' index complete. %d entities have been indexed.", - clazz.getSimpleName(), index)); + clazz.getSimpleName(), index + 1)); } catch (Exception e) { operationLog.error(e.getMessage()); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/FullTextIndexUpdater.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/FullTextIndexUpdater.java index 2b1cb2acd85cf42a1dc77aae509c64d5f36f5ef5..868fa6a0b23c40dc07accfbfbae5579121d7d4a8 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/FullTextIndexUpdater.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/FullTextIndexUpdater.java @@ -169,14 +169,8 @@ public final class FullTextIndexUpdater extends HibernateDaoSupport implements switch (operation.getOperationKind()) { case REINDEX: - if (operation.getIds() == null) - { - fullTextIndexer.doFullTextIndex(session, clazz); - } else - { - fullTextIndexer.doFullTextIndexUpdate(session, clazz, - operation.getIds()); - } + fullTextIndexer.doFullTextIndexUpdate(session, clazz, + operation.getIds()); break; case REMOVE: fullTextIndexer.removeFromIndex(session, clazz, operation.getIds()); @@ -193,11 +187,9 @@ public final class FullTextIndexUpdater extends HibernateDaoSupport implements } if (operationLog.isInfoEnabled()) { - operationLog.info(operation.getOperationKind() - + " of " - + (operation.getIds() == null ? "all" : operation.getIds() - .size()) + " " + operation.getClassName() + "s took " - + stopWatch); + operationLog.info(operation.getOperationKind() + " of " + + operation.getIds().size() + " " + operation.getClassName() + + "s took " + stopWatch); } } updaterQueue.take(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/IndexUpdateOperation.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/IndexUpdateOperation.java index 66c8ac0e2f6ee734dc9236d9f7f1b582c11b6bd9..b198657e1b340c39bbf006005d3b918ea8820130 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/IndexUpdateOperation.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/IndexUpdateOperation.java @@ -82,8 +82,6 @@ public class IndexUpdateOperation implements Serializable @Override public String toString() { - return operationKind + " " + className + ": " - + (ids == null ? "all" : CollectionUtils.abbreviate(ids, 10)); + return operationKind + " " + className + ": " + CollectionUtils.abbreviate(ids, 10); } - }