From a0f7d5f2df44297cddf793d44e7c670863438e3b Mon Sep 17 00:00:00 2001 From: buczekp <buczekp> Date: Fri, 22 Oct 2010 15:10:12 +0000 Subject: [PATCH] [LMS-1846] trigger update of index after evaluation of dynamic properties SVN: 18420 --- .../business/bo/AbstractBusinessObject.java | 6 ++++++ .../generic/server/dataaccess/IDAOFactory.java | 4 ++++ .../server/dataaccess/db/AbstractDAO.java | 15 +++++++++++---- ...AbstractGenericEntityWithPropertiesDAO.java | 8 ++------ .../server/dataaccess/db/DAOFactory.java | 8 ++++++++ .../server/dataaccess/db/ExperimentDAO.java | 2 -- .../DefaultDynamicPropertyEvaluator.java | 4 ++-- ...DummyDynamicPropertyEvaluationRunnable.java | 4 +++- .../DynamicPropertyEvaluationRunnable.java | 18 +++++++++++++++--- .../IDynamicPropertyEvaluator.java | 3 ++- .../db/search/FullTextIndexUpdater.java | 10 ++++++++-- .../plugin/generic/server/GenericServer.java | 15 +++++++++++++-- 12 files changed, 74 insertions(+), 23 deletions(-) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java index acb53c38888..914ad644b58 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java @@ -53,6 +53,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources; import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.ICodeSequenceDAO; import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.IPermIdDAO; import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.IDynamicPropertyEvaluationScheduler; +import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler; import ch.systemsx.cisd.openbis.generic.server.util.GroupIdentifierHelper; import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE; import ch.systemsx.cisd.openbis.generic.shared.dto.GroupPE; @@ -323,4 +324,9 @@ abstract class AbstractBusinessObject implements IDAOFactory { return daoFactory.getDynamicPropertyEvaluationScheduler(); } + + public IFullTextIndexUpdateScheduler getFullTextIndexUpdateScheduler() + { + return daoFactory.getFullTextIndexUpdateScheduler(); + } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDAOFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDAOFactory.java index ec88c63f32f..81348678603 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDAOFactory.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDAOFactory.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess; import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.ICodeSequenceDAO; import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.IPermIdDAO; import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.IDynamicPropertyEvaluationScheduler; +import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler; import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; /** @@ -102,4 +103,7 @@ public interface IDAOFactory extends IAuthorizationDAOFactory /** Returns an implementation of {@link IDynamicPropertyEvaluationScheduler}. */ public IDynamicPropertyEvaluationScheduler getDynamicPropertyEvaluationScheduler(); + /** Returns an implementation of {@link IFullTextIndexUpdateScheduler}. */ + public IFullTextIndexUpdateScheduler getFullTextIndexUpdateScheduler(); + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java index e3113ddccab..ecb69ad2634 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java @@ -392,14 +392,21 @@ public abstract class AbstractDAO extends HibernateDaoSupport return result; } - protected static <T extends IEntityInformationWithPropertiesHolder> void scheduleDynamicPropertiesEvaluation( - IDynamicPropertyEvaluationScheduler scheduler, Class<T> entityClass, List<T> entities) + protected static <T extends IEntityInformationWithPropertiesHolder> List<Long> transformEntities2Longs( + Collection<T> entities) { - List<Long> ids = new ArrayList<Long>(); + final List<Long> result = new ArrayList<Long>(); for (IEntityInformationWithPropertiesHolder entity : entities) { - ids.add(entity.getId()); + result.add(entity.getId()); } + return result; + } + + protected static <T extends IEntityInformationWithPropertiesHolder> void scheduleDynamicPropertiesEvaluation( + IDynamicPropertyEvaluationScheduler scheduler, Class<T> entityClass, List<T> entities) + { + List<Long> ids = transformEntities2Longs(entities); scheduleDynamicPropertiesEvaluationForIds(scheduler, entityClass, ids); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractGenericEntityWithPropertiesDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractGenericEntityWithPropertiesDAO.java index 5f1fc5d3575..f6c6221fb66 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractGenericEntityWithPropertiesDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractGenericEntityWithPropertiesDAO.java @@ -65,12 +65,8 @@ public abstract class AbstractGenericEntityWithPropertiesDAO<T extends IEntityIn protected void scheduleRemoveFromFullTextIndex(List<Long> ids) { - getIndexUpdateScheduler().scheduleUpdate(IndexUpdateOperation.remove(getClass(), ids)); - } - - protected void scheduleFullTextIndexUpdate(List<Long> ids) - { - getIndexUpdateScheduler().scheduleUpdate(IndexUpdateOperation.reindex(getClass(), ids)); + getIndexUpdateScheduler() + .scheduleUpdate(IndexUpdateOperation.remove(getEntityClass(), ids)); } protected void scheduleDynamicPropertiesEvaluation(List<T> entities) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java index acd3b911185..31c2b359cf4 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java @@ -61,6 +61,8 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac private final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler; + private final IFullTextIndexUpdateScheduler fullTextIndexUpdateScheduler; + private final ISampleTypeDAO sampleTypeDAO; private final IHibernateSearchDAO hibernateSearchDAO; @@ -107,6 +109,7 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac super(context, sessionFactory, fullTextIndexUpdateScheduler, dynamicPropertyEvaluationScheduler); this.dynamicPropertyEvaluationScheduler = dynamicPropertyEvaluationScheduler; + this.fullTextIndexUpdateScheduler = fullTextIndexUpdateScheduler; final DatabaseInstancePE databaseInstance = getHomeDatabaseInstance(); sampleTypeDAO = new SampleTypeDAO(sessionFactory, databaseInstance); hibernateSearchDAO = new HibernateSearchDAO(sessionFactory, hibernateSearchContext); @@ -234,4 +237,9 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac return dynamicPropertyEvaluationScheduler; } + public IFullTextIndexUpdateScheduler getFullTextIndexUpdateScheduler() + { + return fullTextIndexUpdateScheduler; + } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java index fa14e1ed2ed..afd7c928050 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java @@ -17,7 +17,6 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.db; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Set; @@ -130,7 +129,6 @@ public class ExperimentDAO extends AbstractGenericEntityWithPropertiesDAO<Experi final HibernateTemplate template = getHibernateTemplate(); template.saveOrUpdate(experiment); template.flush(); - scheduleDynamicPropertiesEvaluation(Arrays.asList(experiment)); } public List<ExperimentPE> listExperimentsByProjectAndProperty(String propertyCode, 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 b914b82d77b..2562c407afc 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 @@ -76,8 +76,8 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator try { transaction = hibernateSession.beginTransaction(); - // we evaluate properties of entities in batches loading them in groups restricted by id: - // [ ids[index], ids[min(index+batchSize, maxIndex))] ) + // we evaluate properties of entities in batches loading them in groups restricted by + // id: [ ids[index], ids[min(index+batchSize, maxIndex))] ) int index = 0; final List<Long> ids = getAllIds(hibernateSession, clazz); final int idsSize = ids.size(); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DummyDynamicPropertyEvaluationRunnable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DummyDynamicPropertyEvaluationRunnable.java index ab27ae08cc7..17ad11bc312 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DummyDynamicPropertyEvaluationRunnable.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DummyDynamicPropertyEvaluationRunnable.java @@ -22,6 +22,7 @@ import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; +import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler; /** * @author Piotr Buczek @@ -33,7 +34,8 @@ public final class DummyDynamicPropertyEvaluationRunnable extends HibernateDaoSu private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, DummyDynamicPropertyEvaluationRunnable.class); - public DummyDynamicPropertyEvaluationRunnable(final SessionFactory sessionFactory) + public DummyDynamicPropertyEvaluationRunnable(final SessionFactory sessionFactory, + final IFullTextIndexUpdateScheduler fullTextIFullTextIndexUpdateScheduler) { setSessionFactory(sessionFactory); operationLog.debug("dummy property evaluator created"); 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 bdae8d7b28e..ae6aa7427b9 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 @@ -28,6 +28,8 @@ import ch.systemsx.cisd.common.collections.ExtendedBlockingQueueFactory; import ch.systemsx.cisd.common.collections.IExtendedBlockingQueue; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; +import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler; +import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IndexUpdateOperation; import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder; /** @@ -52,8 +54,12 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport private final IExtendedBlockingQueue<DynamicPropertyEvaluationOperation> evaluatorQueue; - public DynamicPropertyEvaluationRunnable(final SessionFactory sessionFactory) + private final IFullTextIndexUpdateScheduler fullTextIndexUpdateScheduler; + + public DynamicPropertyEvaluationRunnable(final SessionFactory sessionFactory, + final IFullTextIndexUpdateScheduler fullTextIndexUpdateScheduler) { + this.fullTextIndexUpdateScheduler = fullTextIndexUpdateScheduler; setSessionFactory(sessionFactory); evaluator = new DefaultDynamicPropertyEvaluator(BATCH_SIZE); @@ -127,9 +133,10 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport final StopWatch stopWatch = new StopWatch(); stopWatch.start(); Session session = null; + Class<IEntityInformationWithPropertiesHolder> clazz = null; try { - final Class<IEntityInformationWithPropertiesHolder> clazz = + clazz = (Class<IEntityInformationWithPropertiesHolder>) Class.forName(operation .getClassName()); session = getSession(); @@ -157,6 +164,12 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport + (operation.getIds() == null ? "" : operation.getIds().size() + " ") + operation.getClassName() + "s took " + stopWatch); } + if (clazz != null) + { + IndexUpdateOperation indexUpdateOperation = + IndexUpdateOperation.reindex(clazz, operation.getIds()); + fullTextIndexUpdateScheduler.scheduleUpdate(indexUpdateOperation); + } } evaluatorQueue.take(); } @@ -166,5 +179,4 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport .error("A problem has occurred while evaluating dynamic properties.", th); } } - } 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 72b7e48184e..dc4b67c3359 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 @@ -24,7 +24,8 @@ import org.springframework.dao.DataAccessException; import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder; /** - * Each implementation is able to evaluate dynamic properties. + * Each implementation is able to evaluate dynamic properties. After evaluation of properties the + * entities will be reindexed. * * @author Piotr Buczek */ 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 868fa6a0b23..c6229b3cc87 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,8 +169,14 @@ public final class FullTextIndexUpdater extends HibernateDaoSupport implements switch (operation.getOperationKind()) { case REINDEX: - fullTextIndexer.doFullTextIndexUpdate(session, clazz, - operation.getIds()); + if (operation.getIds() == null) + { + fullTextIndexer.doFullTextIndex(session, clazz); + } else + { + fullTextIndexer.doFullTextIndexUpdate(session, clazz, + operation.getIds()); + } break; case REMOVE: fullTextIndexer.removeFromIndex(session, clazz, operation.getIds()); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java index 1486d9b8bb8..265aeaadf8d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java @@ -555,6 +555,9 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen sampleBO.setExperiment(experiment); } } + scheduleDynamicPropertiesEvaluation( + getDAOFactory().getDynamicPropertyEvaluationScheduler(), ExperimentPE.class, + Arrays.asList(experimentBO.getExperiment())); } public void registerMaterials(String sessionToken, String materialTypeCode, @@ -577,7 +580,8 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen public void execute(List<NewMaterial> entities) { - final IMaterialTable materialTable = businessObjectFactory.createMaterialTable(session); + final IMaterialTable materialTable = + businessObjectFactory.createMaterialTable(session); materialTable.add(entities, materialTypePE); materialTable.save(); } @@ -613,7 +617,7 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen { return 0; } - class Counter + class Counter { int count; } @@ -748,6 +752,9 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen ExperimentPE experiment = experimentBO.getExperiment(); result.setModificationDate(experiment.getModificationDate()); result.setSamples(Code.extractCodes(experiment.getSamples())); + scheduleDynamicPropertiesEvaluation( + getDAOFactory().getDynamicPropertyEvaluationScheduler(), ExperimentPE.class, + Arrays.asList(experimentBO.getExperiment())); return result; } @@ -861,6 +868,10 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen return map; } + /** + * Schedules evaluation of dynamic properties on specified entities. After evaluation is done + * the entities will be indexed. + */ private static <T extends IEntityInformationWithPropertiesHolder> void scheduleDynamicPropertiesEvaluation( IDynamicPropertyEvaluationScheduler scheduler, Class<T> entityClass, List<T> entities) { -- GitLab