From 39e54fa83169ff9a7570a2c32a3bf54d3589d5a8 Mon Sep 17 00:00:00 2001
From: parkera <parkera>
Date: Mon, 8 Aug 2016 09:25:55 +0000
Subject: [PATCH] SSDM-3726: File search domain first implementation

SVN: 36879
---
 .../DatabaseBasedDataSetPathInfoProvider.java | 33 ++++++++--
 .../sequencedatabases/FileSearchDomain.java   | 66 +++++++++++++++++++
 .../shared/IDataSetPathInfoProvider.java      |  7 +-
 .../systemtests/FileSearchDomainTest.java     | 25 +++++++
 4 files changed, 124 insertions(+), 7 deletions(-)
 create mode 100644 datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v2/sequencedatabases/FileSearchDomain.java
 create mode 100644 datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/FileSearchDomainTest.java

diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatabaseBasedDataSetPathInfoProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatabaseBasedDataSetPathInfoProvider.java
index 90ce73e550b..bf42b3c88c6 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatabaseBasedDataSetPathInfoProvider.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatabaseBasedDataSetPathInfoProvider.java
@@ -26,7 +26,6 @@ import java.util.Map.Entry;
 import net.lemnik.eodsql.BaseQuery;
 import net.lemnik.eodsql.QueryTool;
 import net.lemnik.eodsql.Select;
-
 import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.common.db.DBUtils;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetPathInfoProvider;
@@ -40,11 +39,13 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.utils.PathInfoDataSourceProvi
 public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoProvider
 {
     @Private
-    public static final class DataSetFileRecord
+    public static class DataSetFileRecord
     {
         // Attribute names as defined in database schema
         public long id;
 
+        public Long dase_id;
+        
         public Long parent_id;
 
         public String relative_path;
@@ -59,14 +60,26 @@ public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoPro
 
         public Date last_modified;
     }
-
+    
+    @Private
+    public static class ExtendedDataSetFileRecord extends DataSetFileRecord
+    {
+    	public String code;
+    }
+    
     @Private
     static interface IPathInfoDAO extends BaseQuery
     {
+    	
         static String SELECT_DATA_SET_FILES =
                 "SELECT id, parent_id, relative_path, file_name, size_in_bytes, checksum_crc32, "
                         + "is_directory, last_modified FROM data_set_files ";
 
+        static String SELECT_DATA_SET_FILES_WITH_DATA_SET_INFO = 
+        		"SELECT f.id, f.dase_id, f.parent_id, f.relative_path, f.file_name, f.size_in_bytes, " 
+        		+ "f.checksum_crc32, f.is_directory, f.last_modified, s.code "
+        		+ " FROM data_set_files f LEFT JOIN data_sets s ON (s.id = f.dase_id) ";	
+        
         @Select("SELECT id FROM data_sets WHERE code = ?{1}")
         public Long tryToGetDataSetId(String dataSetCode);
 
@@ -85,7 +98,10 @@ public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoPro
         @Select(SELECT_DATA_SET_FILES + "WHERE dase_id = ?{1} AND relative_path ~ ?{2}")
         public List<DataSetFileRecord> listDataSetFilesByRelativePathRegex(long dataSetId,
                 String relativePathRegex);
-
+        
+        @Select(SELECT_DATA_SET_FILES_WITH_DATA_SET_INFO + "WHERE relative_path LIKE ?{1}")
+        public List<ExtendedDataSetFileRecord> listFilesByRelativePathLikeExpression(String relativePathLikeExpression);
+      
         @Select(SELECT_DATA_SET_FILES + "WHERE dase_id = ?{1} AND relative_path LIKE ?{2}")
         public List<DataSetFileRecord> listDataSetFilesByRelativePathLikeExpression(long dataSetId,
                 String relativePathLikeExpression);
@@ -119,7 +135,14 @@ public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoPro
     {
         this.dao = dao;
     }
-
+     
+	@Override
+	public List<ExtendedDataSetFileRecord> listPathInfosByRegularExpression(
+			String substring) {
+		List<ExtendedDataSetFileRecord> fileRecords = getDao().listFilesByRelativePathLikeExpression("%" + substring + "%");
+		return fileRecords; 
+	}	
+	
     @Override
     public List<DataSetPathInfo> listPathInfosByRegularExpression(String dataSetCode,
             final String regularExpression)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v2/sequencedatabases/FileSearchDomain.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v2/sequencedatabases/FileSearchDomain.java
new file mode 100644
index 00000000000..972caedacd0
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v2/sequencedatabases/FileSearchDomain.java
@@ -0,0 +1,66 @@
+package ch.systemsx.cisd.openbis.dss.generic.server.api.v2.sequencedatabases;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import ch.systemsx.cisd.openbis.dss.generic.server.DatabaseBasedDataSetPathInfoProvider.ExtendedDataSetFileRecord;
+import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetPathInfoProvider;
+import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFileSearchResultLocation;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchDomain;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchDomainSearchResult;
+
+public class FileSearchDomain extends AbstractSearchDomainService
+{
+
+    public FileSearchDomain(Properties properties, File storeRoot)
+    {
+        super(properties, storeRoot);
+    }
+
+    @Override
+    public boolean isAvailable()
+    {
+        // TODO Auto-generated method stub
+        return true;
+    }
+
+    
+    @Override
+    public List<SearchDomainSearchResult> search(String searchString, Map<String, String> optionalParametersOrNull)
+    {   	
+    	IDataSetPathInfoProvider dataSetPathInfoProvider = ServiceProvider.getDataSetPathInfoProvider();
+    	List<ExtendedDataSetFileRecord> dataSetPathInfos = dataSetPathInfoProvider.listPathInfosByRegularExpression(searchString);
+        
+    	List<SearchDomainSearchResult> results = new ArrayList<SearchDomainSearchResult>();
+    	
+    	for(ExtendedDataSetFileRecord dataSetPathInfo : dataSetPathInfos){
+        	
+        	SearchDomainSearchResult searchDomainSearchResult = new SearchDomainSearchResult();
+        	
+        	SearchDomain searchDomain = new SearchDomain();
+        	searchDomain.setName("File");
+        	searchDomain.setLabel("File");
+
+        	searchDomainSearchResult.setSearchDomain(searchDomain);
+        	        	
+        	DataSetFileSearchResultLocation dfsrl = new DataSetFileSearchResultLocation();
+        	dfsrl.setPermId(dataSetPathInfo.code);
+        	dfsrl.setCode(dataSetPathInfo.code);
+        	dfsrl.setPathInDataSet(dataSetPathInfo.relative_path);
+        	dfsrl.setIdentifier(dataSetPathInfo.code);
+        	dfsrl.setEntityKind(EntityKind.DATA_SET);
+        	
+        	searchDomainSearchResult.setResultLocation(dfsrl);
+        	results.add(searchDomainSearchResult);
+    	}
+    	
+    	return results;
+    }
+    
+
+}
\ No newline at end of file
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetPathInfoProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetPathInfoProvider.java
index 14338a0f59f..408094b5d76 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetPathInfoProvider.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetPathInfoProvider.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.dss.generic.shared;
 import java.util.List;
 import java.util.Map;
 
+import ch.systemsx.cisd.openbis.dss.generic.server.DatabaseBasedDataSetPathInfoProvider.ExtendedDataSetFileRecord;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetPathInfo;
 
 /**
@@ -28,9 +29,11 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetPathInfo;
  */
 public interface IDataSetPathInfoProvider
 {
-    public List<DataSetPathInfo> listPathInfosByRegularExpression(String dataSetCode,
-            String regularExpression);
+	
+    public List<DataSetPathInfo> listPathInfosByRegularExpression(String dataSetCode, String regularExpression);
 
+    public List<ExtendedDataSetFileRecord> listPathInfosByRegularExpression(String regularExpression);
+	
     public DataSetPathInfo tryGetFullDataSetRootPathInfo(String dataSetCode);
 
     public ISingleDataSetPathInfoProvider tryGetSingleDataSetPathInfoProvider(String dataSetCode);
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/FileSearchDomainTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/FileSearchDomainTest.java
new file mode 100644
index 00000000000..cabb2405ed4
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/FileSearchDomainTest.java
@@ -0,0 +1,25 @@
+package ch.systemsx.cisd.openbis.datastoreserver.systemtests;
+
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchDomainSearchResult;
+
+public class FileSearchDomainTest extends GenericSystemTest
+{
+
+    @Test
+    public void test() throws Exception
+    {
+        System.out.println("HERE");
+        IGeneralInformationService gis = getGeneralInformationService();
+        String sessionToken = gis.tryToAuthenticateForAllServices("test", "test");
+
+        List<SearchDomainSearchResult> results = gis.searchOnSearchDomain(sessionToken, "File", "", null);
+        
+        System.out.println("RESULT: " + results);
+        gis.logout(sessionToken);
+    }
+}
\ No newline at end of file
-- 
GitLab