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