From 6e1d3ccdc429483c09b16100ca1c97c4ba1f4375 Mon Sep 17 00:00:00 2001 From: buczekp <buczekp> Date: Fri, 30 Apr 2010 13:45:47 +0000 Subject: [PATCH] [LMS-1508] fast count of assignment values SVN: 15699 --- .../openbis/generic/server/CommonServer.java | 3 +-- .../business/bo/EntityTypePropertyTypeBO.java | 12 ++++++++++-- .../business/bo/IEntityTypePropertyTypeBO.java | 6 ++++++ .../dataaccess/IEntityPropertyTypeDAO.java | 2 ++ .../dataaccess/db/EntityPropertyTypeDAO.java | 17 ++++++++++++++++- 5 files changed, 35 insertions(+), 5 deletions(-) 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 4a562c7f690..c3f7ed8094c 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 @@ -641,8 +641,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServer> impl IEntityTypePropertyTypeBO etptBO = businessObjectFactory.createEntityTypePropertyTypeBO(session, DtoConverters .convertEntityKind(entityKind)); - etptBO.loadAssignment(propertyTypeCode, entityTypeCode); - return etptBO.getLoadedAssignment().getPropertyValues().size(); + return etptBO.countAssignmentValues(propertyTypeCode, entityTypeCode); } public final void registerPropertyType(final String sessionToken, diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java index c0a4b11b871..4bae4196747 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; import java.util.List; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.time.StopWatch; import org.springframework.dao.DataAccessException; import ch.rinn.restrictions.Private; @@ -84,12 +85,20 @@ public class EntityTypePropertyTypeBO extends AbstractBusinessObject implements public void loadAssignment(String propertyTypeCode, String entityTypeCode) { + StopWatch watch = new StopWatch(); + watch.start(); EntityTypePE entityType = findEntityType(entityTypeCode); PropertyTypePE propertyType = findPropertyType(propertyTypeCode); IEntityPropertyTypeDAO entityPropertyTypeDAO = getEntityPropertyTypeDAO(entityKind); assignment = entityPropertyTypeDAO.tryFindAssignment(entityType, propertyType); } + public int countAssignmentValues(String propertyTypeCode, String entityTypeCode) + { + IEntityPropertyTypeDAO entityPropertyTypeDAO = getEntityPropertyTypeDAO(entityKind); + return entityPropertyTypeDAO.countAssignmentValues(entityTypeCode, propertyTypeCode); + } + public void createAssignment(String propertyTypeCode, String entityTypeCode, boolean isMandatory, String defaultValue, String section, Long previousETPTOrdinal) { @@ -101,11 +110,11 @@ public class EntityTypePropertyTypeBO extends AbstractBusinessObject implements // fill default property values if (isMandatory) { - List<IEntityPropertiesHolder> entities = getAllEntities(entityType); String errorMsgTemplate = "Cannot create mandatory assignment. " + "Please specify 'Initial Value', which will be used for %s %s%s " + "of type '%s' already existing in the database."; + List<IEntityPropertiesHolder> entities = getAllEntities(entityType); addPropertyWithDefaultValue(entityType, propertyType, defaultValue, entities, errorMsgTemplate); } else if (StringUtils.isEmpty(defaultValue) == false) @@ -132,7 +141,6 @@ public class EntityTypePropertyTypeBO extends AbstractBusinessObject implements .getLabel(), createPlural(size), entityType.getCode())); } } - // TODO 2009-06-01, Piotr Buczek: no validation of default value for (IEntityPropertiesHolder entity : entities) { final EntityPropertyPE property = diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IEntityTypePropertyTypeBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IEntityTypePropertyTypeBO.java index c0c976fb130..55a0fc87423 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IEntityTypePropertyTypeBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IEntityTypePropertyTypeBO.java @@ -37,6 +37,12 @@ public interface IEntityTypePropertyTypeBO */ void loadAssignment(String propertyTypeCode, String entityTypeCode); + /** + * Returns number of property values used by entities for assignment between specified property + * type and entity type. + */ + int countAssignmentValues(String propertyTypeCode, String entityTypeCode); + /** * Returns loaded assignment. */ diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IEntityPropertyTypeDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IEntityPropertyTypeDAO.java index a24c1e9132e..dbf8508c0ca 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IEntityPropertyTypeDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IEntityPropertyTypeDAO.java @@ -51,6 +51,8 @@ public interface IEntityPropertyTypeDAO public EntityTypePropertyTypePE tryFindAssignment(EntityTypePE entityType, PropertyTypePE propertyType); + public int countAssignmentValues(String entityTypeCode, String propertyTypeCode); + /** * Creates a new {@link EntityTypePropertyTypePE} assignment. */ diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java index faad74b2ae4..1aa7c0be941 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java @@ -110,6 +110,21 @@ final class EntityPropertyTypeDAO extends AbstractDAO implements IEntityProperty return etpt; } + public int countAssignmentValues(String entityTypeCode, String propertyTypeCode) + { + assert entityTypeCode != null : "Unspecified entity type."; + assert propertyTypeCode != null : "Unspecified property type."; + + String query = + String.format("select count(pv) from %s pa join pa.propertyValues pv " + + "where pa.propertyTypeInternal.simpleCode = ? " + + "and pa.entityTypeInternal.code = ?", entityKind + .getEntityTypePropertyTypeAssignmentClass().getSimpleName(), entityKind + .getEntityPropertyClass().getSimpleName()); + return ((Long) (getHibernateTemplate().find(query, + toArray(propertyTypeCode, entityTypeCode)).get(0))).intValue(); + } + public final void createEntityPropertyTypeAssignment( final EntityTypePropertyTypePE entityPropertyTypeAssignement) throws DataAccessException @@ -307,7 +322,7 @@ final class EntityPropertyTypeDAO extends AbstractDAO implements IEntityProperty { for (EntityPropertyPE propertyValue : propertyValues) { - propertyValue.getEntity().removeProperty(propertyValue); + propertyValue.getEntity().removeProperty(propertyValue); // FIXME loads entities? } } -- GitLab