From 98fc8b59d3a30999213ca3febf5e4c57a528abb5 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Wed, 16 Mar 2011 08:23:14 +0000
Subject: [PATCH] [LMS-1976] fixed indexing issues - it was possible to search
 for ids in top menu search - experiment id and sample id were not always
 stored in index

SVN: 20352
---
 .../dataaccess/db/HibernateSearchDAO.java     | 19 ++++++++++++++-----
 .../openbis/generic/shared/dto/DataPE.java    | 18 +++++++++++++++---
 .../generic/shared/dto/EntityPropertyPE.java  |  7 ++++---
 .../generic/shared/dto/ExperimentPE.java      |  2 +-
 .../generic/shared/dto/MaterialPE.java        |  3 ++-
 .../openbis/generic/shared/dto/SamplePE.java  | 10 ++++++++--
 .../dto/hibernate/SearchFieldConstants.java   | 19 +++++++++++++------
 7 files changed, 57 insertions(+), 21 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
index 6af50dd4f3c..d5c771ffc49 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
@@ -19,9 +19,10 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 import java.io.IOException;
 import java.sql.SQLException;
 import java.util.ArrayList;
-import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
@@ -495,11 +496,19 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate
 
         public String[] getIndexedFields()
         {
-            Collection<?> fieldNames = indexReader.getFieldNames(FieldOption.INDEXED);
-            // TODO 2008-11-27, Tomasz Pylak: get rid of hard-coded name. Specify the same name
-            // attribute for all DocumentId fields.
-            fieldNames.remove("id");
+            // WORKAROUND indexReader.getFieldNames doesn't really return unique field names
+            Set<String> fieldNames = new HashSet<String>();
+            for (Object fieldName : indexReader.getFieldNames(FieldOption.INDEXED))
+            {
+                fieldNames.add(fieldName.toString());
+            }
+
             fieldNames.remove(DocumentBuilder.CLASS_FIELDNAME);
+            fieldNames.remove(SearchFieldConstants.ID);
+            for (String prefix : SearchFieldConstants.PREFIXES)
+            {
+                fieldNames.remove(prefix + SearchFieldConstants.ID);
+            }
             return fieldNames.toArray(new String[fieldNames.size()]);
         }
 
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 408f204bf9b..6db58ad0358 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
@@ -264,7 +264,13 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
     @Field(index = Index.UN_TOKENIZED, store = Store.YES, name = SearchFieldConstants.SAMPLE_ID)
     private Long getSampleId()
     {
-        return getSampleInternal() != null ? getSampleInternal().getId() : null;
+        Long result = null;
+        if (getSampleInternal() != null)
+        {
+            result = HibernateUtils.getId(getSampleInternal());
+            assert result != null;
+        }
+        return result;
     }
 
     /**
@@ -397,7 +403,7 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
     @Id
     @SequenceGenerator(name = SequenceNames.DATA_SEQUENCE, sequenceName = SequenceNames.DATA_SEQUENCE, allocationSize = 1)
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SequenceNames.DATA_SEQUENCE)
-    @DocumentId
+    @DocumentId(name = SearchFieldConstants.ID)
     public Long getId()
     {
         return id;
@@ -446,7 +452,13 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
     @Field(index = Index.UN_TOKENIZED, store = Store.YES, name = SearchFieldConstants.EXPERIMENT_ID)
     private Long getExperimentId()
     {
-        return getExperimentInternal() != null ? getExperimentInternal().getId() : null;
+        Long result = null;
+        if (getExperimentInternal() != null)
+        {
+            result = HibernateUtils.getId(getExperimentInternal());
+            assert result != null;
+        }
+        return result;
     }
 
     private Set<DataSetPropertyPE> properties = new HashSet<DataSetPropertyPE>();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityPropertyPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityPropertyPE.java
index 89854c8b58a..0565185bea0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityPropertyPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/EntityPropertyPE.java
@@ -41,6 +41,7 @@ import ch.systemsx.cisd.common.utilities.ClassUtils;
 import ch.systemsx.cisd.common.utilities.ModifiedShortPrefixToStringStyle;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.util.EqualsHashUtils;
 
@@ -102,8 +103,8 @@ public abstract class EntityPropertyPE extends HibernateAbstractRegistrationHold
             String fieldPrefix = name;
             String fieldFullName = fieldPrefix + getPropertyFieldName(entityProperty);
             Field field =
-                    new Field(fieldFullName, fieldValue, luceneOptions.getStore(), luceneOptions
-                            .getIndex());
+                    new Field(fieldFullName, fieldValue, luceneOptions.getStore(),
+                            luceneOptions.getIndex());
             if (luceneOptions.getBoost() != null)
             {
                 field.setBoost(luceneOptions.getBoost());
@@ -148,7 +149,7 @@ public abstract class EntityPropertyPE extends HibernateAbstractRegistrationHold
 
     @ManyToOne(fetch = FetchType.EAGER)
     @JoinColumn(name = ColumnNames.VOCABULARY_TERM_COLUMN)
-    @IndexedEmbedded
+    @IndexedEmbedded(prefix = SearchFieldConstants.PREFIX_VOCABULARY_TERM)
     public VocabularyTermPE getVocabularyTerm()
     {
         return vocabularyTerm;
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 5c7b7881e6d..27582060753 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
@@ -163,7 +163,7 @@ public class ExperimentPE extends AttachmentHolderPE implements
     @Id
     @SequenceGenerator(name = SequenceNames.EXPERIMENT_SEQUENCE, sequenceName = SequenceNames.EXPERIMENT_SEQUENCE, allocationSize = 1)
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SequenceNames.EXPERIMENT_SEQUENCE)
-    @DocumentId
+    @DocumentId(name = SearchFieldConstants.ID)
     public Long getId()
     {
         return id;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialPE.java
index e4e9010bb38..f3eba2690f9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialPE.java
@@ -152,7 +152,8 @@ public class MaterialPE implements IIdAndCodeHolder, Comparable<MaterialPE>,
     @Id
     @SequenceGenerator(name = SequenceNames.MATERIAL_SEQUENCE, sequenceName = SequenceNames.MATERIAL_SEQUENCE, allocationSize = 1)
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SequenceNames.MATERIAL_SEQUENCE)
-    @DocumentId
+    @DocumentId(name = SearchFieldConstants.ID)
+
     public Long getId()
     {
         return id;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java
index df67e93eb88..4b3ba8ebb3f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java
@@ -467,7 +467,13 @@ public class SamplePE extends AttachmentHolderPE implements IIdAndCodeHolder, Co
     @Field(index = Index.UN_TOKENIZED, store = Store.YES, name = SearchFieldConstants.EXPERIMENT_ID)
     private Long getExperimentId()
     {
-        return getExperimentInternal() != null ? getExperimentInternal().getId() : null;
+        Long result = null;
+        if (getExperimentInternal() != null)
+        {
+            result = HibernateUtils.getId(getExperimentInternal());
+            assert result != null;
+        }
+        return result;
     }
 
     //
@@ -477,7 +483,7 @@ public class SamplePE extends AttachmentHolderPE implements IIdAndCodeHolder, Co
     @SequenceGenerator(name = SequenceNames.SAMPLE_SEQUENCE, sequenceName = SequenceNames.SAMPLE_SEQUENCE, allocationSize = 1)
     @Id
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SequenceNames.SAMPLE_SEQUENCE)
-    @DocumentId
+    @DocumentId(name = SearchFieldConstants.ID)
     public final Long getId()
     {
         return id;
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 e62d9de6852..96d4ca08b1e 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
@@ -48,6 +48,19 @@ public final class SearchFieldConstants
 
     public static final String PREFIX_ATTACHMENT = "attachment" + SEPARATOR;
 
+    public static final String PREFIX_VOCABULARY_TERM = "vocabulary term" + SEPARATOR;
+
+    public static final String[] PREFIXES =
+        { PREFIX_PROPERTIES, PREFIX_EXPERIMENT, PREFIX_SAMPLE, PREFIX_ENTITY_TYPE,
+                PREFIX_FILE_FORMAT_TYPE, PREFIX_FILE_FORMAT_TYPE, PREFIX_PROJECT, PREFIX_SPACE,
+                PREFIX_REGISTRATOR, PREFIX_ATTACHMENT, PREFIX_PROPERTIES + PREFIX_VOCABULARY_TERM };
+
+    public static final String ID = "id";
+
+    public static final String EXPERIMENT_ID = PREFIX_EXPERIMENT + ID;
+
+    public static final String SAMPLE_ID = PREFIX_SAMPLE + ID;
+
     public static final String DELETED = "deleted";
 
     public static final String PERSON_LAST_NAME = "Last Name";
@@ -58,8 +71,6 @@ public final class SearchFieldConstants
 
     public static final String PERSON_USER_ID = "User Id";
 
-    public static final String ID = "id";
-
     public static final String CODE = "code";
 
     public static final String PERM_ID = "perm_id";
@@ -72,8 +83,4 @@ public final class SearchFieldConstants
 
     public static final String FILE_DESCRIPTION = "description";
 
-    public static final String EXPERIMENT_ID = "experiment_id";
-
-    public static final String SAMPLE_ID = "sample_id";
-
 }
-- 
GitLab