From e2669e5c951695e38586f99754e8c258a28dba0c Mon Sep 17 00:00:00 2001
From: tpylak <tpylak>
Date: Mon, 23 Mar 2009 16:05:52 +0000
Subject: [PATCH] LMS-791 index datasets when experiment properties are changed
 + unit tests + updated test db index

SVN: 10326
---
 .../db/search/LuceneQueryBuilder.java         |  15 +-
 .../generic/shared/dto/AttachmentPE.java      |   2 +
 .../generic/shared/dto/ExperimentPE.java      |   6 +-
 .../generic/shared/dto/ProcedurePE.java       |  10 +-
 .../dto/hibernate/SearchFieldConstants.java   |   2 +-
 .../server/dataaccess/db/AbstractDAOTest.java |   4 +-
 .../dataaccess/db/HibernateSearchDAOTest.java | 238 +++++++++++++++++-
 .../segments_2                                | Bin 58 -> 58 bytes
 .../_0.cfs                                    | Bin 3864 -> 3941 bytes
 .../_1.cfs                                    | Bin 2936 -> 3034 bytes
 .../_2.cfs                                    | Bin 5814 -> 5941 bytes
 .../_2_1.del                                  | Bin 0 -> 9 bytes
 .../_3.cfs                                    | Bin 0 -> 5941 bytes
 .../_3_1.del                                  | Bin 0 -> 9 bytes
 .../_4.cfs                                    | Bin 0 -> 5941 bytes
 .../segments.gen                              | Bin 20 -> 20 bytes
 .../segments_5                                | Bin 118 -> 0 bytes
 .../segments_7                                | Bin 0 -> 178 bytes
 .../segments_7                                | Bin 88 -> 88 bytes
 .../_0.cfs                                    | Bin 0 -> 5769 bytes
 .../_0_1.del                                  | Bin 0 -> 10 bytes
 .../_1.cfs                                    | Bin 0 -> 5769 bytes
 .../segments.gen                              | Bin 0 -> 20 bytes
 .../segments_4                                | Bin 0 -> 88 bytes
 .../segments_3                                | Bin 88 -> 88 bytes
 25 files changed, 262 insertions(+), 15 deletions(-)
 create mode 100644 openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_2_1.del
 create mode 100644 openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_3.cfs
 create mode 100644 openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_3_1.del
 create mode 100644 openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_4.cfs
 delete mode 100644 openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/segments_5
 create mode 100644 openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/segments_7
 create mode 100644 openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/_0.cfs
 create mode 100644 openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/_0_1.del
 create mode 100644 openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/_1.cfs
 create mode 100644 openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/segments.gen
 create mode 100644 openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/segments_4

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/LuceneQueryBuilder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/LuceneQueryBuilder.java
index c6e05961693..69c774be7fe 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/LuceneQueryBuilder.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/LuceneQueryBuilder.java
@@ -20,6 +20,7 @@ import static ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldC
 import static ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants.PREFIX_EXPERIMENT;
 import static ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants.PREFIX_EXPERIMENT_TYPE;
 import static ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants.PREFIX_GROUP;
+import static ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants.PREFIX_PROCEDURE;
 import static ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants.PREFIX_PROJECT;
 import static ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants.PREFIX_SAMPLE;
 import static ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants.PREFIX_SAMPLE_TYPE;
@@ -56,7 +57,8 @@ public class LuceneQueryBuilder
             LogFactory.getLogger(LogCategory.OPERATION, LuceneQueryBuilder.class);
 
     /** @throws UserFailureException when some search patterns are incorrect */
-    public static Query createQuery(DataSetSearchCriteria dataSetCriteria) throws UserFailureException
+    public static Query createQuery(DataSetSearchCriteria dataSetCriteria)
+            throws UserFailureException
     {
         List<DataSetSearchCriterion> criteria = dataSetCriteria.getCriteria();
         Occur occureCondition = createOccureCondition(dataSetCriteria.getConnection());
@@ -162,6 +164,7 @@ public class LuceneQueryBuilder
     private static String tryGetIndexFieldName(DataSetSearchField searchField)
     {
         DataSetSearchFieldKind fieldKind = searchField.getKind();
+        String experimentField = PREFIX_PROCEDURE + PREFIX_EXPERIMENT;
         switch (fieldKind)
         {
             case DATA_SET_CODE:
@@ -171,15 +174,15 @@ public class LuceneQueryBuilder
             case FILE_TYPE:
                 return SearchFieldConstants.PREFIX_FILE_FORMAT_TYPE + CODE;
             case GROUP:
-                return PREFIX_EXPERIMENT + PREFIX_PROJECT + PREFIX_GROUP + CODE;
+                return experimentField + PREFIX_PROJECT + PREFIX_GROUP + CODE;
             case PROJECT:
-                return PREFIX_EXPERIMENT + PREFIX_PROJECT + CODE;
+                return experimentField + PREFIX_PROJECT + CODE;
             case EXPERIMENT:
-                return PREFIX_EXPERIMENT + CODE;
+                return experimentField + CODE;
             case EXPERIMENT_TYPE:
-                return PREFIX_EXPERIMENT + PREFIX_EXPERIMENT_TYPE + CODE;
+                return experimentField + PREFIX_EXPERIMENT_TYPE + CODE;
             case EXPERIMENT_PROPERTY:
-                return PREFIX_EXPERIMENT + getPropertyIndexField(searchField.getPropertyCode());
+                return experimentField + getPropertyIndexField(searchField.getPropertyCode());
             case SAMPLE:
                 return PREFIX_SAMPLE + CODE;
             case SAMPLE_TYPE:
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AttachmentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AttachmentPE.java
index f7bf5d0a8ec..0a5d25106f5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AttachmentPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AttachmentPE.java
@@ -38,6 +38,7 @@ import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
 import org.hibernate.search.annotations.ClassBridge;
+import org.hibernate.search.annotations.ContainedIn;
 import org.hibernate.search.annotations.Index;
 import org.hibernate.search.annotations.Store;
 import org.hibernate.search.bridge.FieldBridge;
@@ -169,6 +170,7 @@ public class AttachmentPE extends HibernateAbstractRegistrationHolder implements
     @JoinColumn(name = ColumnNames.EXPERIMENT_COLUMN, updatable = false)
     @Private
     // for Hibernate and bean conversion only
+    @ContainedIn
     public ExperimentPE getParentInternal()
     {
         return parent;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
index f66bff73372..6a64b0b7ed8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
@@ -48,6 +48,7 @@ import org.hibernate.annotations.CacheConcurrencyStrategy;
 import org.hibernate.annotations.Cascade;
 import org.hibernate.annotations.Generated;
 import org.hibernate.annotations.GenerationTime;
+import org.hibernate.search.annotations.ContainedIn;
 import org.hibernate.search.annotations.DocumentId;
 import org.hibernate.search.annotations.Field;
 import org.hibernate.search.annotations.Index;
@@ -144,8 +145,6 @@ public class ExperimentPE implements IEntityPropertiesHolder<ExperimentPropertyP
 
     private Date modificationDate;
 
-    // private Date modificationDate;
-
     @Column(name = ColumnNames.REGISTRATION_TIMESTAMP_COLUMN, nullable = false, insertable = false, updatable = false)
     @Generated(GenerationTime.INSERT)
     public Date getRegistrationDate()
@@ -361,7 +360,8 @@ public class ExperimentPE implements IEntityPropertiesHolder<ExperimentPropertyP
     }
 
     @OneToMany(fetch = FetchType.LAZY, mappedBy = "experimentInternal")
-    @JoinColumn(name = ColumnNames.EXPERIMENT_COLUMN, updatable = false)
+    @JoinColumn(name = ColumnNames.EXPERIMENT_COLUMN, updatable = true)
+    @ContainedIn
     private List<ProcedurePE> getExperimentProcedures()
     {
         return procedures;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ProcedurePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ProcedurePE.java
index 7f3a98ab55e..75a25809122 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ProcedurePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ProcedurePE.java
@@ -39,6 +39,9 @@ import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.hibernate.annotations.Generated;
 import org.hibernate.annotations.GenerationTime;
+import org.hibernate.search.annotations.ContainedIn;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Indexed;
 import org.hibernate.search.annotations.IndexedEmbedded;
 import org.hibernate.validator.NotNull;
 
@@ -53,6 +56,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstant
  */
 @Entity
 @Table(name = TableNames.PROCEDURES_TABLE)
+@Indexed
 public class ProcedurePE implements IIdHolder, Serializable
 {
     public final static ProcedurePE[] EMPTY_ARRAY = new ProcedurePE[0];
@@ -114,6 +118,7 @@ public class ProcedurePE implements IIdHolder, Serializable
     @SequenceGenerator(name = SequenceNames.PROCEDURE_SEQUENCE, sequenceName = SequenceNames.PROCEDURE_SEQUENCE, allocationSize = 1)
     @Id
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SequenceNames.PROCEDURE_SEQUENCE)
+    @DocumentId
     public final Long getId()
     {
         return id;
@@ -169,8 +174,9 @@ public class ProcedurePE implements IIdHolder, Serializable
         this.inputSamples = inputSamples;
     }
 
-    @OneToMany(fetch = FetchType.LAZY)
-    @JoinColumn(name = ColumnNames.PROCEDURE_PRODUCED_BY_COLUMN, updatable = false)
+    @OneToMany(fetch = FetchType.LAZY, mappedBy = "procedure")
+    @JoinColumn(name = ColumnNames.PROCEDURE_PRODUCED_BY_COLUMN, updatable = true)
+    @ContainedIn
     public Set<DataPE> getData()
     {
         return data;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/SearchFieldConstants.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/SearchFieldConstants.java
index ffd031c4805..732f929396c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/SearchFieldConstants.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/SearchFieldConstants.java
@@ -68,7 +68,7 @@ public final class SearchFieldConstants
      * bridge class or the field name consists of some other non empty elements).
      */
 
-    public static final String PREFIX_PROCEDURE = "";
+    public static final String PREFIX_PROCEDURE = "in" + SEPARATOR;
 
     public static final String PREFIX_EXPERIMENT_ATTACHMENTS = "";
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAOTest.java
index 0c8e144e104..86b20e4827e 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAOTest.java
@@ -59,6 +59,8 @@ import ch.systemsx.cisd.openbis.generic.shared.util.UuidUtil;
     { AbstractDAO.class })
 public abstract class AbstractDAOTest extends AbstractTransactionalTestNGSpringContextTests
 {
+    static final String LUCENE_INDEX_PATH = "targets/lucene/indices";
+
     static
     {
         LogInitializer.init();
@@ -66,7 +68,7 @@ public abstract class AbstractDAOTest extends AbstractTransactionalTestNGSpringC
         System.setProperty("database.kind", "test");
         System.setProperty("script-folder", "sourceTest");
         System.setProperty("hibernate.search.index-mode", "NO_INDEX");
-        System.setProperty("hibernate.search.index-base", "sourceTest/lucene/indices");
+        System.setProperty("hibernate.search.index-base", LUCENE_INDEX_PATH);
         System.setProperty("mass-upload-folder", "sourceTest/sql/postgresql");
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java
index ee898c2da43..8e72b2d1380 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java
@@ -21,30 +21,44 @@ import static org.testng.AssertJUnit.assertFalse;
 import static org.testng.AssertJUnit.assertTrue;
 import static org.testng.AssertJUnit.fail;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import org.hibernate.classic.Session;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
 import org.testng.AssertJUnit;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import ch.rinn.restrictions.Friend;
+import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.test.AssertionUtil;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IHibernateSearchDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.LuceneQueryBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetSearchCriterion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetSearchField;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetSearchFieldKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SearchCriteriaConnection;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetSearchHitDTO;
+import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPropertyPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.GroupPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.HierarchyType;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityPropertiesHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPropertyPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SearchHit;
 
 /**
@@ -57,6 +71,24 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SearchHit;
 @Friend(toClasses = HibernateSearchDAO.class)
 public final class HibernateSearchDAOTest extends AbstractDAOTest
 {
+    private final static String LUCENE_INDEX_TEMPLATE_PATH = "./sourceTest/lucene/indices";
+
+    @BeforeClass
+    public void setUpIndex()
+    {
+        restoreSearchIndex();
+    }
+
+    // create a fresh copy of the Lucene index
+    private static void restoreSearchIndex()
+    {
+        File targetPath = new File(LUCENE_INDEX_PATH);
+        FileUtilities.deleteRecursively(targetPath);
+        targetPath.mkdirs();
+        File srcPath = new File(LUCENE_INDEX_TEMPLATE_PATH);
+        FileUtilities.copyDirectory(srcPath, targetPath);
+    }
+
     @SuppressWarnings("unused")
     @DataProvider(name = "registratorTerm")
     private final static Object[][] getRegistratorTerm()
@@ -215,7 +247,8 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest
 
     // NOTE: such a check depends strongly on the test database content. Use it only when the better
     // way to check the results is much harder.
-    private void assertCorrectDatasetsFound(DataSetSearchCriteria criteria, DSLoc... expectedLocations)
+    private void assertCorrectDatasetsFound(DataSetSearchCriteria criteria,
+            DSLoc... expectedLocations)
     {
         List<DataSetSearchHitDTO> dataSets = searchForDatasets(criteria);
         AssertJUnit.assertEquals(expectedLocations.length, dataSets.size());
@@ -270,6 +303,26 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest
         assertCorrectDatasetsFound(criteria, DSLoc.LOC1, DSLoc.LOC2, DSLoc.LOC3);
     }
 
+    @Test
+    public final void testSearchForDataSetsSpecificSampleProperty()
+    {
+        String propertyValue = "stuff";
+        DataSetSearchCriterion criterion =
+                mkCriterion(DataSetSearchField.createSampleProperty("USER.COMMENT"), propertyValue);
+        DataSetSearchCriteria criteria = createAndDatasetQuery(criterion);
+        assertCorrectDatasetsFound(criteria, DSLoc.LOC1, DSLoc.LOC2, DSLoc.LOC3);
+    }
+
+    @Test
+    public final void testSearchForDataSetsSimpleField()
+    {
+        DataSetSearchCriterion criterion =
+                mkCriterion(DataSetSearchField.createSimpleField(DataSetSearchFieldKind.PROJECT),
+                        "NEMO");
+        DataSetSearchCriteria criteria = createAndDatasetQuery(criterion);
+        assertCorrectDatasetsFound(criteria, DSLoc.LOC1, DSLoc.LOC3, DSLoc.LOC4, DSLoc.LOC5);
+    }
+
     @Test
     public final void testSearchForDataSetsAnyProperty()
     {
@@ -303,4 +356,185 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest
                 createAndDatasetQuery(criterion1, criterion2, criterion3, criterion4);
         assertCorrectDatasetsFound(criteria, DSLoc.LOC4, DSLoc.LOC5);
     }
+
+    @Test
+    /*
+     * Checks if the dataset search index is properly updated after properties for a connected
+     * sample have changed.
+     */
+    public final void testSearchForDataSetsAfterSamplePropertiesUpdate()
+            throws InterruptedException
+    {
+        String propertyCode = "USER.COMMENT";
+        DataSetSearchCriterion criterion =
+                mkCriterion(DataSetSearchField.createSampleProperty(propertyCode), "stuff");
+
+        DataSetSearchCriteria criteria = createAndDatasetQuery(criterion);
+        assertCorrectDatasetsFound(criteria, DSLoc.LOC1, DSLoc.LOC2, DSLoc.LOC3);
+
+        SamplePE sample = findSample("CP-TEST-3", "CISD");
+
+        String newValue = "Bonanza";
+        changeSampleProperty(sample, propertyCode, newValue);
+
+        flushSearchIndices();
+        assertCorrectDatasetsFound(criteria, DSLoc.LOC2, DSLoc.LOC3);
+        restoreSearchIndex();
+    }
+
+    @Test
+    /*
+     * Checks if the dataset search index is properly updated after properties for a connected
+     * experiment have changed.
+     */
+    public final void testSearchForDataSetsAfterExperimentPropertiesUpdate()
+            throws InterruptedException
+    {
+        String propertyCode = "USER.GENDER";
+        DataSetSearchCriterion criterion =
+                mkCriterion(DataSetSearchField.createExperimentProperty(propertyCode), "female");
+
+        DataSetSearchCriteria criteria = createAndDatasetQuery(criterion);
+        assertCorrectDatasetsFound(criteria, DSLoc.LOC1);
+
+        // This experiment has two datasets. Each of them has "male" value as a gender property.
+        // We change it to "female" and check, if 2 new search results appear.
+        ExperimentPE exp = findExperiment("EXP-TEST-2", "NEMO", "CISD");
+        String newValue = "male";
+        changeExperimentProperty(exp, propertyCode, newValue);
+        flushSearchIndices();
+        assertCorrectDatasetsFound(criteria);
+        restoreSearchIndex();
+    }
+
+    private void flushSearchIndices()
+    {
+        Session currentSession = sessionFactory.getCurrentSession();
+        FullTextSession fullTextSession = Search.getFullTextSession(currentSession);
+        fullTextSession.flushToIndexes();
+    }
+
+    private void flushSession()
+    {
+        sessionFactory.getCurrentSession().flush();
+    }
+
+    private void changeExperimentProperty(ExperimentPE exp, String propertyCode, String newValue)
+    {
+        ExperimentPropertyPE property = findProperty(exp, propertyCode);
+
+        removeProperty(exp, property);
+        flushSession();
+
+        ExperimentPropertyPE newProperty = new ExperimentPropertyPE();
+        copyPropertyWithNewValue(newValue, property, newProperty);
+        addProperty(exp, newProperty);
+        flushSession();
+    }
+
+    private void changeSampleProperty(SamplePE sample, String propertyCode, String newValue)
+    {
+        SamplePropertyPE property = findProperty(sample, propertyCode);
+
+        removeProperty(sample, property);
+        flushSession();
+
+        SamplePropertyPE newProperty = new SamplePropertyPE();
+        copyPropertyWithNewValue(newValue, property, newProperty);
+        addProperty(sample, newProperty);
+        flushSession();
+    }
+
+    private void copyPropertyWithNewValue(String newValue, EntityPropertyPE oldProperty,
+            EntityPropertyPE newProperty)
+    {
+        newProperty.setEntityTypePropertyType(oldProperty.getEntityTypePropertyType());
+        newProperty.setRegistrator(oldProperty.getRegistrator());
+        newProperty.setValue(newValue);
+    }
+
+    private static <T extends EntityPropertyPE> void addProperty(
+            IEntityPropertiesHolder<T> propertiesHolder, T newProperty)
+    {
+        Set<T> properties = getCopiedProperties(propertiesHolder);
+        properties.add(newProperty);
+        propertiesHolder.setProperties(properties);
+    }
+
+    private static <T extends EntityPropertyPE> Set<T> removeProperty(
+            IEntityPropertiesHolder<T> propertiesHolder, T property)
+    {
+        Set<T> properties = getCopiedProperties(propertiesHolder);
+        boolean removed = properties.remove(property);
+        assert removed : "property could not be removed";
+        propertiesHolder.setProperties(properties);
+        return properties;
+    }
+
+    private static <T extends EntityPropertyPE> Set<T> getCopiedProperties(
+            IEntityPropertiesHolder<T> propertiesHolder)
+    {
+        return new HashSet<T>(propertiesHolder.getProperties());
+    }
+
+    private static <T extends EntityPropertyPE> T findProperty(
+            IEntityPropertiesHolder<T> propertiesHolder, String propertyCode)
+    {
+        for (T prop : propertiesHolder.getProperties())
+        {
+            if (prop.getEntityTypePropertyType().getPropertyType().getCode().equals(propertyCode))
+            {
+                return prop;
+            }
+        }
+        fail("property not found: " + propertyCode);
+        return null; // never happens
+    }
+
+    private ExperimentPE findExperiment(String code, String projectCode, String groupCode)
+    {
+        ProjectPE project = findProject(projectCode, groupCode);
+        return findExperiment(code, project);
+    }
+
+    private ExperimentPE findExperiment(String code, ProjectPE project)
+    {
+        ExperimentPE exp = daoFactory.getExperimentDAO().tryFindByCodeAndProject(project, code);
+        assert exp != null : "cannot find experiment: " + code;
+        return exp;
+    }
+
+    private SamplePE findSample(String sampleCode, String groupCode)
+    {
+        GroupPE group = findGroup(groupCode);
+        SamplePE sample = findSample(sampleCode, group);
+        return sample;
+    }
+
+    private SamplePE findSample(String sampleCode, GroupPE group)
+    {
+        SamplePE sample =
+                daoFactory.getSampleDAO().tryFindByCodeAndGroup(sampleCode, group,
+                        HierarchyType.CHILD);
+        assert sample != null : "cannot find sample: " + sampleCode;
+        return sample;
+    }
+
+    private ProjectPE findProject(String code, String groupCode)
+    {
+        ProjectPE result =
+                daoFactory.getProjectDAO().tryFindProject(
+                        daoFactory.getHomeDatabaseInstance().getCode(), groupCode, code);
+        assert result != null : "cannot find the project: " + code;
+        return result;
+    }
+
+    private GroupPE findGroup(String groupCode)
+    {
+        GroupPE group =
+                daoFactory.getGroupDAO().tryFindGroupByCodeAndDatabaseInstance(groupCode,
+                        daoFactory.getHomeDatabaseInstance());
+        assert group != null : "cannot find the group: " + groupCode;
+        return group;
+    }
 }
diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE/segments_2 b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE/segments_2
index f7433b7f3f18e5c12a34ad24c201054971d067bb..d29e9845bfd6804811fb8c9cf8c33a05245913c8 100644
GIT binary patch
delta 23
fcmcDr;`#so|4#-6Mg`;VdQua4v{<|rOUeNNZ$}6D

delta 23
fcmcDr;`#so|4#-6Mg=3Y;*g0vS}bPXOTPdBY(faE

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_0.cfs b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_0.cfs
index 932e04ae52e5fc32f315e3013967e03eb1baad4f..13746f0fbdb9406cf1722a4d2682f62c510b7564 100644
GIT binary patch
literal 3941
zcmdUy>rUfF6vsXGBq0fb01E_mVWVEOQq_%cLbkv+1ZJCxOBCp;{e+A&5bq{-uqQ03
zs;ZCG2kKK)mFPKVY;dYTi?&jQqsg4h|D5<|JCn(TrjB9ybggpUmdZ1JA~(2HF8>W(
zFX%<?A4+_!+|(4h(sd)(RBou;-0vjzqS~pK==KAwWuI%>meZ+(!%&J|cwKSauwC){
z!aH-r%7ySm;5wDCV+W#LX-mIiT}u&oc6Zm7cGG&s7R0sP>vx59-3Mt;crvWWYxy50
zbT(IATiY<rwffp-)vRy4`KI>TEV1mjJIAMugYCDLp{364ZYWk6KWXgkF^yGIj9Wi6
z%`}+NScka=!^|*#XdN778Q*Cf@8%#f0huD3+b)MLqLjrg%Pivu+xylGw1H92Gya|5
z@g|wE>x%*er&#v5(K_5dg>#vPP8?!OELD5A(=?YgV{@bWLY1sg$#a(5vG(^*oBP`*
z*3-N4o94#G>)QA$U#PunwvL*uhIO*t`Vnry`u}$e>i_l@Fhk=y$H9!`OVf272jmm)
z%2Sb1`{~viOr3j7l_dEm`>=Iz^K;_(_%Y#tIUM4^_sh${;F1pXR0d~UfYcJDaW%7F
zZf<V=jAEGk6-E(8PSYTBGYw`bA;B~bCHaJvOw*yuY_yo&Edb#&d=v~^(R4ncWo*xv
z9T6;|!yVD>E<&EC`(0a#5N&4oZGncCZ;Q|g+`e>uj{+Rp*3mN98=5lFib>f?*9&DZ
za8M4NI6Rgg{0}}^Y5(lKa3tw&KZ|pg4SYw0q3c~xKdwYjnpP_rMj4lb_K->u1N$*!
z*oSk(j~Ijq181AMa)SX8q?k!LeF#;ciJ9k6M$Bl%%xDucrIXA`kIZNRGfgowWk;Cj
zZkfr7m`N8gV?4o3{fJo=C}xZ*W-3KyszYYd5i{i!Gn&9mIbfzaW?q1tVn!=wMw^%^
zon%&eWJU{^X^NRCJHoth%S=|pOuC2};|XT!N6e}~F=JFQQz<f29Ws-Sm?@{2(FA77
z0W-}p^E~7fGg>h-+QdxhB(u^ZGg`n*Q_M`+5$5?@X0jq?(nZV|PcTzIVpau;8Ka7s
zN|BlBkePJEOgY7jCNNVDm}wrjv(TBY7t-ptPG^j1M#l+DU}-70XJ3dC^ocec2AYN1
zRX_0ifh(jP3|FCA<I+7pU&UHhg?IclqzP95Gli{~nZ{b!ozPTE<3(ZX<Z(~*{0zo9
z?#8mDFmp;cfm06pL~BP8{pjmXHt*S8F-zj=3{7>K_<Pv7<S}5heKDy71@eJ!3XN3g
z!q$#VW=<;wM;=z^NRg^tIel{p&mXro%c!8XFQ^T)U7--Ji_g(Y(YlD{%i?LrJ;R-&
z6sJzt4nwB9ZN?o~Em@{5x<ZOJOSxVdqO&mF5td0)9F2i$c{Bp|0GB_dE{)GYRe5~o
zBJc-&RlE9-0y=y-nh(T<3k$a`{a~xS=LVrHAKE>^zIZ^kZ^x>Y2UPG`i=$}?&$c?r
z`7sI5zZwnWb14EjEPsD&wJN*T@lLDJJZT&qvZZ^3(BrdvQq<$Eb+~J_*jKicw$s7w
z{ubP-asL3mE?<eDQm(RBciOTCSLVKgM>Ji3gtqnwt;uHE@V_P$vV3=`^C97>>z<7q
zxK72$yi=}5k^3Hrm2vsIXJP)_g+CwXe$ca%pAY*I{4T+OuOf}5rF?#20mFqtsWhFR
z&gbA*S%H15J~^4qWpfh~Q&Wa+==1Q(WEh*t&*Y2nnw@=$wQvPASaYHS7fOv8u=d80
LIQREC&SUjomtR-o

literal 3864
zcmdUyTTkOg6vsXG<W5Mq-!|KH)v8j}jc@{6;0=M<rs5I>x@w;y;|#>Ri5=_-ODa_D
zC+Y|3b3aEvK_z<587CNRkh<zV6i1Uem;V|2H?}8}w5E<>vbA2hXiMc80lC4Ia{2G*
zdO<I8|5D-`<tB7=rRzrS*UAl*oBe~tUR0a^6WxA*wd{qa?KquEI1Hueg*O$)4cisJ
zFT8U%tXv9D1g=vFJ9Z%2mA3RN){PW_XLt8)X*aAnwkU4wUcW1>n?6W;!joY|-pJ3G
z(AivdeSOO`*EiR<tLEm`tM6+s%_WxkVehn6KiYk58Cv4P?uLRhZvEUa6B?^VZ3Frm
zG&9Ngv2}EkW_+)Hx}Ska3Ni&Yw_6Tfy#BHn1I#dfw0me3VHjweS;l|#J6?_%`@Wch
zV4h`8>&@fc7F@tIj8tO$tbTC7AhpaAwKsbWb44?@x2kKZ@)=dGvh1F9c-U$j?w(ms
zZ`QZXt*w`}|JAJLYi}COlSZ>{o$WS%f$87)x6{uIjq4m6GvXgj*L7@=k9{joMIPEu
zyLLnrr})@5*u&Uy^XTq&e7t`@Hpv(cZ*PZi+}>VY4F*?qpodYV#6?FfOBz=_`}OYb
z?(Zmuxew5a(6X8anY#j*%Q4As;D3OoB>!Rc(sUSQHd?^$-~Vt99|HqdF`cKil<oPl
zBZ5VAxFfpVMac7HziUeoqRkAyEzr<%Z4o+w+n28IQGmm+n`jyA6?Lg-m89&H>xD8H
zI4FmaI6RW?{C7TCN&oz<a3tx*=i;1Y0^bo~=z5nl9#<kLO{#?qqm0Wzdq|~-f#We_
z*oSMxQw&0cfvZhiyTO1663nEWK7=aJjF@LpM$Bl9n9(L?O2?U%9+}YsX6i=FlzqTF
zJ7y*;VkTY0jPV#VjYrI?Krv%fF;girQynssj+iN@n9&4g$^kR=BjyFjDQ2`r%xDuc
zrQ^&>kIZNRGj$_o%06IT7&DU<F_SK0#(0dG#v^7`pqMeLn5h(*sScS*N6eH{%xD5L
z<$#&`5%WCc6f;^QX0(Z!(s5>`M`pBunYs}(WgjrlkD1Aem`N8gV?4%8;}NqeP|O%r
z%v6fZRENx@BWB7eW;B7Ba==Xeq}_zhbUmL`zi~QaOfx!8xCEA#aC`QpSb}k)O@@Ic
zzSbs3i<t@Ps;a9ckd$qZ$34;WlcdLORa)sY)YVehWnr9XK`5Xfy~AYlp4}BQB(4^z
z+oX=ah22ON14i2yIVG4PA1*qNMj~`!k47dlr!kVRUH1dOAGku=!LS6l8kg?HMG0Y9
z6~6KJle$Fh+Uc9i2#=eX6)dN7uF*N*oX;qPE8!|y30eu!d|qsI+;iL?O3`w<b{I0<
zZ8Pq``p8mk(G^m(S>YbKOqqNv0P>}n3m1(GoYE~!NPxaHA$%G5gTAU-do&HTFJj3+
zT)MCv+tLqq$_H)`%JQ+@6YR^!G>7&`vig_=PB9<LNqA7zRl(2B=+2iZ3d*lyF}zzM
zki+s%r&hDFZ=LQn>y5Me$uaJ@$CYChRDUrkPSvli<9(~izO|*aoeu8NcVN3aY1{r?
z`C0^(a+Q5^uPu8p36B+g!k`<Upsjs^)?_nn_%jj;sV0&hsa!~SYOXVp1CvyY%=;Vh
zJc>Ma_e+!V_ji8b!i7H%7k<#Q<L8Hs1-=^4;8mlxvXaX!E@C*JUtTWc3b`yCr4npH
z^{J^$Hj_=Kr>70w&==s7N-;K*o5>a7GduefYhea7SVG{y1yN%LES%`!q2eF+DyzO3
F`v+sgMlb*X

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_1.cfs b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_1.cfs
index bd7a57d390e1d92e39de4ad65468532b5c03d2be..d88c1bd64a3431538d8ab9b5077fc3995e87f1ba 100644
GIT binary patch
literal 3034
zcmb_eS#R4$5a#mGVaM_nJC<VyM9>38A%TZ2TX_>C+EJqml3X->sKAITiwPyFByC7Q
z9)kXb{)RsH4;FA|cBNPhWTQYsSUcCZv%`<OvrY;8nI(F9elQ+!OZpAX$PKxf_>)DQ
z>D>Gq&2caXCpXZX1oLR}4?frB;N)LyZty!dQwPj+q8D4eq5F;oV>_a~zGsIa5nYGK
zecz!Z=}?bG)FFyHR>8Xif=(wia7T0;sSL9f_W|lK?wJJsd)l9)4_3!umbyA}9r!mB
zzS4`w5Rl>9cs!ujZWsl2<Oi?R3pWTOwPBAa`Q{N=&0e66A3?!d&*I@|Hle)8y%hn#
ze;;=PC%|GfQ?EK!J72Ln<#x5ztu`AZ`v4GfY&&*jhcr^}S6dJ5(ZriCot_&2-I}ZS
z$QN_ZL#!OHir>?bormLvcdEZy<Y;B6+^pBFMwcw|#wRx0m!(FvQzv@^7s?;_!N^{I
zuOA*@fzj2vYL{P^I##bz>RROGW6(>hQL)<O?(Xg%zVC%MAV0xx3w~?DtNt(_&ccX}
z!fC$mhE5*7%lMre=CA1(ws}7v4()(Cc_;Go)-=L%;#J@?v@Ah_47-M=o$I=Gsud0W
zw5aQPP8W$JWfa3Oa)w9<$tb32=1f!tY1j{UBv2H0WM9)ANs<I*V0$42O%gWDTcjy)
zX=Dep=a5IpOuP><A54}bcQAO4`N%1ZAPQWZF(JVTRdA6+M8hbjE09Mah5{7`qJEwr
zB51_~P81D|NqJ01eiBO*eVPP-AR`%R%tG`vtc{o{5yeRg!-_-0zP<$$WMZHY)>&VO
zSYu$0v^$#kL1d33X3DoTm@zFepd;I($E*NNI|50FendoBSOYqXInBsvMRW_&^(bPB
zsGn{#T!D)-F3!0qq7dZw{&2jGB}<M^pRl5h4HT)q54GHkoeaJLeuRvKFA=)%IWtHz
z(Kj&#F*Z3%1(~sQCbLD)Q3zsxvb#j<E~j-DLJBca2(qr77*9cyh{?qX3L#}XxAwSC
zoh({uI*kH4qTY;|vgdxFOiTFDkOm>wL!i%Nej-OVgFzOTW+Y~@U}@mZ4l!Hu+7DdM
zvzeg`Z$|c*sgiD(2MCZ%L+47NP+$rpYJWl0Gh|5aQ_tH&O__Lb6EIZ}2yAhDWG={e
zT#8qXcKz;S{F%*WamT&22u(kJoPy3xK621>3L*a7g5aybi1jZ$UzjW+0s{P!f<=m-
zE5=w1&JFm)BJSTWABZmX2we0N{CJNLAab_}<^d273$YOtJXK4kLg3ILKw^plk1WFg
z5F8dUlxQzzVjLlhi3|T656hAx;s5k0k*sP`J0$(O-04;8rAuqkgPs$)TfMjdj!qS_
zX8qF2b*)Y}rzfy&B#GRx>diEf%hgV04Ngo7dcqdronRXvr|U%i369_sB2|340f#9=
zp1?KGYF;%eJy>lMTrvO)yChv+B!9|JO_uCpgHRVIMGbM&9}?yDRlU>z=3zVU^Zd_P
z{ynl*wraIrs|J_AS7wOy?$r!!m_N7L%~rc=bxZBHKviLxDg&u1CW+K&T5+aM=1dvL
zRN=oeb+*Km!I?6%WdCymQF)hGkd?e_wyU*T3Fv}D|1e$Z*WFO;ep^jfrd4|r=j-fC
zz6|Z5t#!zD#OG^-|L4hXm}8Q-u<E6nbwrNu?+jJbUa>#*vflks)4@Qx&v7W?aJGW@
sbf?;Gl;-<W$NhP}#Jb5@Kgp79wj)*S)+%q*heW!ly#=zNu|7=pzv2zI;s5{u

literal 2936
zcmb_dTW=ai6yCEJFm~`YPJD?QQdNCu1=?MFBX0=SHZ3;+uA07}4Lg`k7MAX=Es*k%
zpVpWDt4i)UGmDKQP$M-Xm~)+T&U`a-c103nn&=w2{%9y9<tGv&Hxy!`!mZ9E78!}7
zAa+jtMdCP!tw~d?b%k^Cny(H1jK#mX=tM`G-GTd_1tU9R-JWNMA;_)+YR`8VBpv3l
zh&iyqCSw-3LpF*s+>)MCp!>@?aUA#`STFY5U0^`}qXp`lz`q@f=!Z+qxc2)wW590Q
zFbeF*58h@j+#rlHb$iI*%`%^=J##r&=7K4n&)K5sn2D;kztp1V4|6))ID!;SGuLga
zl`C8AQmfMJR2p@7vB(QoZ#i~khb+oGCRq#Z;n<5areXnIH)HnE^SfBH41=RZ_Q(D2
z$L6P1w<~{G@M@u{)Tq_0dIx54pDt{)E{pX_y9T>`7t8Pa!O))H*N=-J;6OF6TcxXF
z+v=8!9SdGB^}Dp{Wvd1E_xJyZJ1kux{fz%j{I5!HdxKm!4I?%TC%K**IypR!(R(+{
z-LMf}-d-*o*a35LPUPpTNkn(vE8_t)ElI%$JEpFm8-{+O7fj=%U>HW$kU>$_HPbY+
zrVIe<T0Wo8=82V*K`-1=kkQ<seZ#gCMUk|=?S%|EMN)7dDlv(Og;CZ}F_H$Rifbj=
zIM+Z%uAosQ+0;2zM{MXPD7fsi1Ug76ZDWO!fRUnLkWb1)j+12892WMB4P2mtNkm%X
z=tcaYaz)A=j{P9AM-dm*I~Ghim*}&h?Xg$909`*s3Sb<9tV*j0L?Nr2S-n7NNx2zD
zoRN)_P40Ip$eAGLf)t2I>IZ)?TBVW|$7gH2X!9A7m7b5a+>V?yZGqrRE3}Ew#e+yA
zJh;hq3IXOip_I<w(G?3^7TLk{fHu57_C7w*QNqaW_Ye5G6Dm%EQ$fx+k$dB9swO^$
zZE+0SXwx81L{bg?*xW%*fxIBcM5GnlxwA(-=IoJ_Vv{IfL*`AnsCw>4#<_$a4OkEg
zK18@Zt_L-`?f3U6H3xl<HmLNy={`kE-uQv*c{Ufc!R^o<aaJ+R{7Z6B@}?n})6-MV
zaA0?5z`h_v)gJS_=fr7a5BoP~B?<5{(@+J0H-gH))?2mvPjh2Boz6*5*qLea>C*&x
zA&Ob}O(tj(;|_^Pfio4)#{=_Vk|Y^zs8=+qO@1hpJic@nGM=VP2mj?j>s%k8jGyr@
z`hbL%`wbKca?HhNWFCGRXfvJ|4Tq}Y#MwDNWJ!q;W>Lt6y!djQXZkoC=7dA(|1=^Q
z7ImR5NL`iM-Ab)^Y0a993ai%d&1}bNcd~{?EhPbJ-KsTKKrL0;<rKcAB=(C95M5#u
zT~1a({RN-r8YpF-J;R5VhG*E;n~m#wxr-^*QFQ=nr*d(D$e(OOsx(WnBi_j#>`)8I
z%-%*Oq-(wp+SPTfSbqt0fp<lg7d*>zSS?xAYPVU%?*5Iz;eGkPz%dD&LIRX}!+MI%
zag2>g*qnYHHtGCt%~qq?s#u+3>m4<lIgm^NQhtv<_;I($h?X$JDS6pwRjSn@B84w}
zIa05`?KR?`t*=4K)R$eO1AgugpOehom*y2DF05LyY8}GS<F_ND>u>olb6M;BtQ#m0
z(C0K2XgXT}d8%D$)r;|6G!9_BS^f1X;AeAy=LO)$d$7gtVTQVLMl|GoP%f(P5NB+l
H%W?h}FbSg(

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_2.cfs b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_2.cfs
index f8262dbb366631519643908ad469f6539fc6e9d1..b7f2872118c7b493814c5625c44333f5826c691e 100644
GIT binary patch
literal 5941
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
QnkO$SSN6>*d^~0U1<0fBmH+?%

literal 5814
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

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_2_1.del b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_2_1.del
new file mode 100644
index 0000000000000000000000000000000000000000..860a7a5ea969fc24bca11aef7f63519b4e376b4a
GIT binary patch
literal 9
OcmZQzU|?kcVtD`nPyi|b

literal 0
HcmV?d00001

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_3.cfs b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_3.cfs
new file mode 100644
index 0000000000000000000000000000000000000000..23122f0b72fc6962aa05d28312d4eb05d1eda7a4
GIT binary patch
literal 5941
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
ZK@tB~6#jXN7yFB#N+egIHshr={|gpW?%n_Z

literal 0
HcmV?d00001

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_3_1.del b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_3_1.del
new file mode 100644
index 0000000000000000000000000000000000000000..860a7a5ea969fc24bca11aef7f63519b4e376b4a
GIT binary patch
literal 9
OcmZQzU|?kcVtD`nPyi|b

literal 0
HcmV?d00001

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_4.cfs b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/_4.cfs
new file mode 100644
index 0000000000000000000000000000000000000000..1c1fafbf505ae09596baa7a6e5038cb3aa87395f
GIT binary patch
literal 5941
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
YIHvL`4i-%19_El1i!YJWX@NxczjZ|KE&u=k

literal 0
HcmV?d00001

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/segments.gen b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/segments.gen
index 53b46562e0e609d5844673f73639ae03d6cf1368..ae67acc2c5924dab767e15c5265ff24ef4f4a1ef 100644
GIT binary patch
literal 20
QcmezW|NlP*2w;cN07?G@3IG5A

literal 20
QcmezW|NlP*2w;WL07>fv1^@s6

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/segments_5 b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/segments_5
deleted file mode 100644
index dbe882dfb185895fad76acaff02d1ed37d92bdbe..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 118
zcmezW|Nl=021W%Vv*JSx3=GU5%oJ|`q?mvh1Q`DV0fYeZm>8Mj4S_UBAqb$#G6Q9e
VfTFA*Jum>*%fJZI5q9(2Z2);^Dr*1$

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/segments_7 b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE/segments_7
new file mode 100644
index 0000000000000000000000000000000000000000..5942a0034494ede032e7931f8bb35ca98fcdcef9
GIT binary patch
literal 178
zcmezW|Nl=021W(r?|Oj@3=FIw%oJ|`q?mvh1Q`DV0fYeZm>8Mj4S_T>ND2s0WtoAp
mMnF-JF(7~{%L<e=28!aAH37+j?1KTgy$p;X^UmbnJ_P_n%sY+%

literal 0
HcmV?d00001

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE/segments_7 b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE/segments_7
index 85e54245c7cf1904e7269682dc07558f6968c3d5..834c4143b4b0328eb519c38abb4fe0bbf75aa9b7 100644
GIT binary patch
delta 23
fcma!u;Q9am|4#-6Mg`;VdZH6~JXkg@J^dK~c=HNB

delta 23
fcma!u;Q9am|4#-6Mg=3YV*iOe9xUgsg<Asvbh`;1

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/_0.cfs b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/_0.cfs
new file mode 100644
index 0000000000000000000000000000000000000000..137969dd04466ff84ec80bbd651ec37d4b529b92
GIT binary patch
literal 5769
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

literal 0
HcmV?d00001

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/_0_1.del b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/_0_1.del
new file mode 100644
index 0000000000000000000000000000000000000000..ceed416c5002901fa90aac41beb4c4eadd8b0b7b
GIT binary patch
literal 10
PcmZQzVBll`;{S{Q0%HLa

literal 0
HcmV?d00001

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/_1.cfs b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/_1.cfs
new file mode 100644
index 0000000000000000000000000000000000000000..0dacba9f08824d1c253977c13fb48ef4414efb05
GIT binary patch
literal 5769
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

literal 0
HcmV?d00001

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/segments.gen b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/segments.gen
new file mode 100644
index 0000000000000000000000000000000000000000..f142fa92b471a7c02d273c463b4395b5e21a01a6
GIT binary patch
literal 20
QcmezW|NlP*2w;KH07>Bl1ONa4

literal 0
HcmV?d00001

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/segments_4 b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE/segments_4
new file mode 100644
index 0000000000000000000000000000000000000000..0a21f06194b34d510d90d79f88d3bce514baca71
GIT binary patch
literal 88
zcmezW|Nl=021W(r?|K>x3=B*l%oJ|`q&R^X1Q`DV0fYeZI2oDZ4M8+W6b9h342&Qh
Ias5|>02ezToB#j-

literal 0
HcmV?d00001

diff --git a/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE/segments_3 b/openbis/sourceTest/lucene/indices/ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE/segments_3
index 4d8d164ee7bb288cb94de1c4f1240908a1d3c3f9..50192fa9b6f8751127a3209de314b0fb14edcecc 100644
GIT binary patch
delta 23
fcma!u;Q9am|4#-6Mg`;Vy6Y$Mc(8aq*tQ4&eCY~B

delta 23
fcma!u;Q9am|4#-6Mg=3Yq8Af+JXj|1-HQbPck&5X

-- 
GitLab