From c1789759e7c72684a092b0968b72f4cbfa2768ce Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Mon, 8 Aug 2011 13:28:54 +0000
Subject: [PATCH] [LMS-2441] improved speed of revert deletion ~2x (by using
 stateless session)

SVN: 22408
---
 .../server/dataaccess/db/DeletionDAO.java     | 34 ++++++++++++++++++-
 .../shared/dto/properties/EntityKind.java     | 31 +++++++++++------
 2 files changed, 54 insertions(+), 11 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
index 1fc4d336633..a3901b332b1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
@@ -22,8 +22,10 @@ import java.util.List;
 
 import org.apache.log4j.Logger;
 import org.hibernate.HibernateException;
+import org.hibernate.SQLQuery;
 import org.hibernate.Session;
 import org.hibernate.SessionFactory;
+import org.hibernate.StatelessSession;
 import org.hibernate.criterion.Criterion;
 import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.Projections;
@@ -44,6 +46,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
  * <i>Data Access Object</i> implementation for {@link IDeletionDAO}.
@@ -106,7 +109,8 @@ final class DeletionDAO extends AbstractGenericEntityDAO<DeletionPE> implements
         super.delete(deletion);
     }
 
-    private void revertDeletionOfEntities(final DeletionPE deletion, final EntityKind entityKind)
+    @SuppressWarnings("unused")
+    private void revertDeletionOfEntitiesOld(final DeletionPE deletion, final EntityKind entityKind)
     {
         assert deletion != null : "Unspecified deletion";
         assert entityKind != null : "Unspecified entity kind";
@@ -127,6 +131,34 @@ final class DeletionDAO extends AbstractGenericEntityDAO<DeletionPE> implements
         operationLog.info(String.format("%s %s(s) reverted", updatedRows, entityKind.name()));
     }
 
+    private void revertDeletionOfEntities(final DeletionPE deletion, final EntityKind entityKind)
+    {
+        assert deletion != null : "Unspecified deletion";
+        assert entityKind != null : "Unspecified entity kind";
+
+        List<TechId> ids =
+                findTrashedEntityIds(Collections.singletonList(TechId.create(deletion)), entityKind);
+
+        int updatedRows = (Integer) executeStatelessAction(new StatelessHibernateCallback()
+            {
+
+                public Object doInStatelessSession(StatelessSession session)
+                {
+                    String query =
+                            String.format("UPDATE %s SET del_id = NULL WHERE del_id = :dId",
+                                    entityKind.getAllTableName());
+                    final SQLQuery sqlQuery = session.createSQLQuery(query);
+                    sqlQuery.setParameter("dId", HibernateUtils.getId(deletion));
+                    return sqlQuery.executeUpdate();
+                }
+
+            });
+
+        scheduleDynamicPropertiesEvaluationByIds(TechId.asLongs(ids), entityKind);
+
+        operationLog.info(String.format("%s %s(s) reverted", updatedRows, entityKind.name()));
+    }
+
     public List<TechId> findTrashedSampleIds(final List<TechId> deletionIds)
     {
         return findTrashedEntityIds(deletionIds, EntityKind.SAMPLE);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/properties/EntityKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/properties/EntityKind.java
index e7a9502e2e4..2a037276c03 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/properties/EntityKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/properties/EntityKind.java
@@ -49,21 +49,25 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.TableNames;
  */
 public enum EntityKind
 {
-    MATERIAL(TableNames.MATERIALS_TABLE, "material", MaterialPE.class, null, MaterialTypePE.class,
-            MaterialTypePropertyTypePE.class, MaterialPropertyPE.class),
+    MATERIAL(TableNames.MATERIALS_TABLE, null, "material", MaterialPE.class, null,
+            MaterialTypePE.class, MaterialTypePropertyTypePE.class, MaterialPropertyPE.class),
 
-    EXPERIMENT(TableNames.EXPERIMENTS_VIEW, "experiment", ExperimentPE.class,
-            DeletedExperimentPE.class, ExperimentTypePE.class, ExperimentTypePropertyTypePE.class,
-            ExperimentPropertyPE.class),
+    EXPERIMENT(TableNames.EXPERIMENTS_VIEW, TableNames.EXPERIMENTS_ALL_TABLE, "experiment",
+            ExperimentPE.class, DeletedExperimentPE.class, ExperimentTypePE.class,
+            ExperimentTypePropertyTypePE.class, ExperimentPropertyPE.class),
 
-    SAMPLE(TableNames.SAMPLES_VIEW, "sample", SamplePE.class, DeletedSamplePE.class,
-            SampleTypePE.class, SampleTypePropertyTypePE.class, SamplePropertyPE.class),
+    SAMPLE(TableNames.SAMPLES_VIEW, TableNames.SAMPLES_ALL_TABLE, "sample", SamplePE.class,
+            DeletedSamplePE.class, SampleTypePE.class, SampleTypePropertyTypePE.class,
+            SamplePropertyPE.class),
 
-    DATA_SET(TableNames.DATA_VIEW, "dataSet", DataPE.class, DeletedDataPE.class,
-            DataSetTypePE.class, DataSetTypePropertyTypePE.class, DataSetPropertyPE.class);
+    DATA_SET(TableNames.DATA_VIEW, TableNames.DATA_ALL_TABLE, "dataSet", DataPE.class,
+            DeletedDataPE.class, DataSetTypePE.class, DataSetTypePropertyTypePE.class,
+            DataSetPropertyPE.class);
 
     private final String entityTableName;
 
+    private final String allEntitiesTableName;
+
     private final String entityLabel;
 
     private transient final Class<? extends IEntityInformationWithPropertiesHolder> entityClass;
@@ -76,12 +80,14 @@ public enum EntityKind
 
     private transient final Class<?> propertyClass;
 
-    private EntityKind(final String entityTableName, final String entityLabel,
+    private EntityKind(final String entityTableName, final String allEntitiesTableName,
+            final String entityLabel,
             final Class<? extends IEntityInformationWithPropertiesHolder> entityClass,
             final Class<? extends IDeletablePE> deletedEntityClass, final Class<?> typeClass,
             final Class<?> assignmentClass, Class<?> propertyClass)
     {
         this.entityTableName = entityTableName;
+        this.allEntitiesTableName = allEntitiesTableName;
         this.entityLabel = entityLabel;
         this.entityClass = entityClass;
         this.deletedEntityClass = deletedEntityClass;
@@ -106,6 +112,11 @@ public enum EntityKind
         return entityTableName;
     }
 
+    public final String getAllTableName()
+    {
+        return allEntitiesTableName;
+    }
+
     public final <T extends EntityTypePE> Class<T> getTypeClass()
     {
         return cast(typeClass);
-- 
GitLab