From f4fa226e235b250c0174dfb3ae1866fd5dc0e81b Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Fri, 24 Jun 2011 07:30:01 +0000
Subject: [PATCH] [LMS-2290] minor: add data set search using container

SVN: 21837
---
 .../generic/server/CommonServerLogger.java    | 11 +------
 ...riaToDetailedSearchCriteriaTranslator.java |  3 ++
 .../search/detailed/IndexFieldNameHelper.java |  7 ++++
 .../shared/api/v1/dto/SearchCriteria.java     |  2 +-
 .../shared/api/v1/dto/SearchSubCriteria.java  |  5 +++
 .../api/v1/dto/SearchableEntityKind.java      |  2 +-
 .../basic/dto/AssociatedEntityKind.java       |  2 ++
 .../openbis/generic/shared/dto/DataPE.java    | 15 +++++++++
 ...oDetailedSearchCriteriaTranslatorTest.java | 32 +++++++++++++++++++
 .../api/v1/GeneralInformationServiceTest.java | 21 ++++++++++++
 10 files changed, 88 insertions(+), 12 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index 02a46f3ade1..15e1f22660f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -43,7 +43,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchSubCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DynamicPropertyEvaluationInfo;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
@@ -471,7 +470,7 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
 
     public List<ExternalData> searchForDataSets(String sessionToken, DetailedSearchCriteria criteria)
     {
-        logAccess(sessionToken, "search_for_datasets");
+        logAccess(sessionToken, "search_for_datasets", "criteria(%s)", criteria);
         return null;
     }
 
@@ -481,14 +480,6 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
         return null;
     }
 
-    public List<Sample> searchForSamples(String sessionToken, DetailedSearchCriteria criteria,
-            List<DetailedSearchSubCriteria> subCriterias)
-    {
-        logAccess(sessionToken, "search_for_samples", "criteria(%s) subCriterias(%s)", criteria,
-                subCriterias);
-        return null;
-    }
-
     public ExternalData getDataSetInfo(String sessionToken, TechId datasetId)
     {
         logAccess(sessionToken, "getDataSetInfo", "datasetId(%s)", datasetId.getId());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/SearchCriteriaToDetailedSearchCriteriaTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/SearchCriteriaToDetailedSearchCriteriaTranslator.java
index 3c043796aee..894962f0205 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/SearchCriteriaToDetailedSearchCriteriaTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/SearchCriteriaToDetailedSearchCriteriaTranslator.java
@@ -62,6 +62,7 @@ public class SearchCriteriaToDetailedSearchCriteriaTranslator
         translators.put(SearchableEntityKind.DATA_SET, new DataSetAttributeTranslator());
         translators.put(SearchableEntityKind.DATA_SET_PARENT, new DataSetAttributeTranslator());
         translators.put(SearchableEntityKind.DATA_SET_CHILD, new DataSetAttributeTranslator());
+        translators.put(SearchableEntityKind.DATA_SET_CONTAINER, new DataSetAttributeTranslator());
         translators.put(SearchableEntityKind.SAMPLE_PARENT, new SampleAttributeTranslator());
         translators.put(SearchableEntityKind.SAMPLE_CHILD, new SampleAttributeTranslator());
         translators.put(SearchableEntityKind.SAMPLE_CONTAINER, new SampleAttributeTranslator());
@@ -88,6 +89,8 @@ public class SearchCriteriaToDetailedSearchCriteriaTranslator
                 return AssociatedEntityKind.EXPERIMENT;
             case DATA_SET:
                 return AssociatedEntityKind.DATA_SET;
+            case DATA_SET_CONTAINER:
+                return AssociatedEntityKind.DATA_SET_CONTAINER;
             case DATA_SET_PARENT:
                 return AssociatedEntityKind.DATA_SET_PARENT;
             case DATA_SET_CHILD:
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/IndexFieldNameHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/IndexFieldNameHelper.java
index 467b976d5b5..b657ff7a1da 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/IndexFieldNameHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/IndexFieldNameHelper.java
@@ -65,6 +65,13 @@ class IndexFieldNameHelper
                 }
                 throw createAssociationNotHandledException(entityKind, associationKind);
 
+            case DATA_SET_CONTAINER:
+                if (entityKind == EntityKind.DATA_SET)
+                {
+                    return SearchFieldConstants.CONTAINER_ID;
+                }
+                throw createAssociationNotHandledException(entityKind, associationKind);
+
             case DATA_SET_PARENT:
             case DATA_SET_CHILD:
             case SAMPLE_PARENT:
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SearchCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SearchCriteria.java
index 6150ac9b500..2b8eb0151f5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SearchCriteria.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SearchCriteria.java
@@ -85,7 +85,7 @@ public class SearchCriteria implements Serializable
     public static enum MatchClauseAttribute
     {
         // common
-        CODE, TYPE,
+        CODE, TYPE, // TODO 2011-06-24, Piotr Buczek: add search by PERM_ID
         // for sample or experiment
         SPACE,
         // for experiment
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SearchSubCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SearchSubCriteria.java
index 3679a6629e4..bc6db685d34 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SearchSubCriteria.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SearchSubCriteria.java
@@ -47,6 +47,11 @@ public class SearchSubCriteria implements Serializable
         return new SearchSubCriteria(SearchableEntityKind.EXPERIMENT, criteria);
     }
 
+    public static SearchSubCriteria createDataSetContainerCriteria(SearchCriteria criteria)
+    {
+        return new SearchSubCriteria(SearchableEntityKind.DATA_SET_CONTAINER, criteria);
+    }
+
     public static SearchSubCriteria createDataSetParentCriteria(SearchCriteria criteria)
     {
         return new SearchSubCriteria(SearchableEntityKind.DATA_SET_PARENT, criteria);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SearchableEntityKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SearchableEntityKind.java
index fd61fcdfd11..7db0f5b80f5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SearchableEntityKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/SearchableEntityKind.java
@@ -11,5 +11,5 @@ public enum SearchableEntityKind
     // sample subcriteria
     SAMPLE_CONTAINER, SAMPLE_PARENT, SAMPLE_CHILD,
     // data set subcriteria
-    DATA_SET_PARENT, DATA_SET_CHILD
+    DATA_SET_CONTAINER, DATA_SET_PARENT, DATA_SET_CHILD
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AssociatedEntityKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AssociatedEntityKind.java
index ba4b56f0983..82e387d8b94 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AssociatedEntityKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AssociatedEntityKind.java
@@ -42,6 +42,8 @@ public enum AssociatedEntityKind implements ISerializable
 
     DATA_SET_CHILD("Child", EntityKind.DATA_SET, EnumSet.of(EntityKind.DATA_SET)),
 
+    DATA_SET_CONTAINER("Container", EntityKind.DATA_SET, EnumSet.of(EntityKind.DATA_SET)),
+
     SAMPLE_CONTAINER("Container", EntityKind.SAMPLE, EnumSet.of(EntityKind.SAMPLE)),
 
     SAMPLE_PARENT("Parent", EntityKind.SAMPLE, EnumSet.of(EntityKind.SAMPLE)),
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
index ad24bc227c1..1ddc04fc5ba 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
@@ -446,6 +446,21 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
         this.container = container;
     }
 
+    // used only by Hibernate Search
+    @SuppressWarnings("unused")
+    @Transient
+    @Field(index = Index.UN_TOKENIZED, store = Store.YES, name = SearchFieldConstants.CONTAINER_ID)
+    private Long getContainerId()
+    {
+        Long result = null;
+        if (getContainer() != null)
+        {
+            result = HibernateUtils.getId(getContainerInternal());
+            assert result != null;
+        }
+        return result;
+    }
+
     public void addComponent(final DataPE component)
     {
         assert component != null;
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/api/v1/SearchCriteriaToDetailedSearchCriteriaTranslatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/api/v1/SearchCriteriaToDetailedSearchCriteriaTranslatorTest.java
index 497ece136c6..d3adb48f5c9 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/api/v1/SearchCriteriaToDetailedSearchCriteriaTranslatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/api/v1/SearchCriteriaToDetailedSearchCriteriaTranslatorTest.java
@@ -174,6 +174,14 @@ public class SearchCriteriaToDetailedSearchCriteriaTranslatorTest extends Assert
         testConvertToDetailedSearchSubCriteria(AssociatedEntityKind.SAMPLE_PARENT, subCriteria);
     }
 
+    @Test
+    public void testBasicSampleChildSubCriteriaTranslator()
+    {
+        SearchCriteria criteria = createBasicSearchCriteria();
+        SearchSubCriteria subCriteria = SearchSubCriteria.createSampleChildCriteria(criteria);
+        testConvertToDetailedSearchSubCriteria(AssociatedEntityKind.SAMPLE_CHILD, subCriteria);
+    }
+
     @Test
     public void testBasicSampleContainerSubCriteriaTranslator()
     {
@@ -182,6 +190,30 @@ public class SearchCriteriaToDetailedSearchCriteriaTranslatorTest extends Assert
         testConvertToDetailedSearchSubCriteria(AssociatedEntityKind.SAMPLE_CONTAINER, subCriteria);
     }
 
+    @Test
+    public void testBasicDataSetParentSubCriteriaTranslator()
+    {
+        SearchCriteria criteria = createBasicSearchCriteria();
+        SearchSubCriteria subCriteria = SearchSubCriteria.createDataSetParentCriteria(criteria);
+        testConvertToDetailedSearchSubCriteria(AssociatedEntityKind.DATA_SET_PARENT, subCriteria);
+    }
+
+    @Test
+    public void testBasicDataSetChildSubCriteriaTranslator()
+    {
+        SearchCriteria criteria = createBasicSearchCriteria();
+        SearchSubCriteria subCriteria = SearchSubCriteria.createDataSetChildCriteria(criteria);
+        testConvertToDetailedSearchSubCriteria(AssociatedEntityKind.DATA_SET_CHILD, subCriteria);
+    }
+
+    @Test
+    public void testBasicDataSetContainerSubCriteriaTranslator()
+    {
+        SearchCriteria criteria = createBasicSearchCriteria();
+        SearchSubCriteria subCriteria = SearchSubCriteria.createDataSetContainerCriteria(criteria);
+        testConvertToDetailedSearchSubCriteria(AssociatedEntityKind.DATA_SET_CONTAINER, subCriteria);
+    }
+
     @Test
     public void testBasicExperimentSubCriteriaTranslator()
     {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
index 6e9e7408a76..9b54cb3b0f1 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
@@ -499,4 +499,25 @@ public class GeneralInformationServiceTest extends SystemTestCase
                 "[DataSet[20081105092259000-9,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=no comment},[]]]",
                 result.toString());
     }
+
+    @Test(groups = "broken")
+    // FIXME rebuild test DB index and commit it to SVN
+    public void testSearchForDataSetsByContainer()
+    {
+        SearchCriteria searchCriteria = new SearchCriteria();
+        SearchCriteria containerCriteria = new SearchCriteria();
+
+        containerCriteria.addMatchClause(MatchClause.createAttributeMatch(
+                MatchClauseAttribute.CODE, "20110509092359990-10"));
+        searchCriteria.addSubCriteria(SearchSubCriteria
+                .createDataSetContainerCriteria(containerCriteria));
+
+        List<DataSet> result =
+                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
+        assertEquals(2, result.size());
+        assertEquals(
+                "[DataSet[20110509092359990-11,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=non-virtual comment},[]], "
+                        + "DataSet[20110509092359990-12,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=non-virtual comment},[]]]",
+                result.toString());
+    }
 }
-- 
GitLab