From ffed26957ea40bdedc201843efb483a87c3610c5 Mon Sep 17 00:00:00 2001 From: felmer <felmer> Date: Tue, 19 Apr 2011 09:25:18 +0000 Subject: [PATCH] LMS-2172 IDataSetPathInfoProvider extended by method listPathInfosByRegularExpression SVN: 20968 --- .../DatabaseBasedDataSetPathsInfoFeeder.java | 8 +- .../cisd/etlserver/path/IPathsInfoDAO.java | 3 + .../path/PathInfoDatabaseFeedingTask.java | 10 +- .../DatabaseBasedDataSetPathInfoProvider.java | 111 +++++++++++++----- .../shared/IDataSetPathInfoProvider.java | 4 + ...tabaseBasedDataSetPathsInfoFeederTest.java | 12 +- 6 files changed, 108 insertions(+), 40 deletions(-) diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeeder.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeeder.java index e70f7ca1876..283f127dca1 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeeder.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeeder.java @@ -59,16 +59,20 @@ public class DatabaseBasedDataSetPathsInfoFeeder implements IDataSetPathsInfoFee { boolean directory = pathInfo.isDirectory(); String fileName = pathInfo.getFileName(); - String relativePath = pathPrefix + fileName; + String relativePath = parentId == null ? "" : pathPrefix + fileName; long id = dao.createDataSetFile(dataSetId, parentId, relativePath, fileName, pathInfo.getSizeInBytes(), directory); + if (relativePath.length() > 0) + { + relativePath += '/'; + } if (directory) { List<PathInfo> children = pathInfo.getChildren(); for (PathInfo child : children) { - addPaths(dataSetId, id, relativePath + "/", child); + addPaths(dataSetId, id, relativePath, child); } } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/IPathsInfoDAO.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/IPathsInfoDAO.java index 71614c37f86..abc6cf3b74e 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/IPathsInfoDAO.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/IPathsInfoDAO.java @@ -26,6 +26,9 @@ import net.lemnik.eodsql.TransactionQuery; */ public interface IPathsInfoDAO extends TransactionQuery { + @Select("select id from data_sets where code = ?{1}") + public Long tryGetDataSetId(String code); + @Select("insert into data_sets (code, location) values (?{1}, ?{2}) returning id") public long createDataSet(String code, String location); diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java index a7f9dc01e05..ed67d991b9e 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java @@ -159,10 +159,14 @@ public class PathInfoDatabaseFeedingTask implements IMaintenanceTask, IPostRegis { DatabaseBasedDataSetPathsInfoFeeder feeder = new DatabaseBasedDataSetPathsInfoFeeder(dao, hierarchicalContentFactory); - feeder.addPaths(dataSetCode, dataSet.getDataSetLocation(), dataSetRoot); + Long id = dao.tryGetDataSetId(dataSetCode); + if (id != null) + { + feeder.addPaths(dataSetCode, dataSet.getDataSetLocation(), dataSetRoot); + } dao.commit(); - operationLog.info("Successfully added paths inside data set " + dataSetCode - + " to database."); + operationLog.info("Paths inside data set " + dataSetCode + + " successfully added to database."); } catch (Exception ex) { handleException(ex, dataSetCode); 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 39535fdb180..d816a8b0708 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 @@ -61,6 +61,14 @@ public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoPro @Select("select id, parent_id, relative_path, size_in_bytes, is_directory from data_set_files where dase_id = ?{1}") public List<DataSetFileRecord> listDataSetFiles(long dataSetId); + + @Select("select id, parent_id, relative_path, size_in_bytes, is_directory from data_set_files where dase_id = ?{1} and relative_path ~ ?{2}") + public List<DataSetFileRecord> listDataSetFilesByRegularExpression(long dataSetId, String regex); + } + + private static interface ILoader + { + List<DataSetFileRecord> listDataSetFiles(long dataSetId); } private IPathInfoDAO dao; @@ -74,52 +82,97 @@ public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoPro this.dao = dao; } + public List<DataSetPathInfo> listPathInfosByRegularExpression(String dataSetCode, + final String regularExpression) + { + return new Loader(dataSetCode, new ILoader() + { + public List<DataSetFileRecord> listDataSetFiles(long dataSetId) + { + return getDao().listDataSetFilesByRegularExpression(dataSetId, + "^" + regularExpression + "$"); + } + }).getInfos(); + } + public DataSetPathInfo tryGetDataSetRootPathInfo(String dataSetCode) { - DataSetPathInfo result = null; - Long dataSetId = getDao().tryToGetDataSetId(dataSetCode); - if (dataSetId != null) - { - List<DataSetFileRecord> dataSetFileRecords = getDao().listDataSetFiles(dataSetId); - Map<Long, DataSetPathInfo> idToInfoMap = new HashMap<Long, DataSetPathInfo>(); - Map<Long, List<DataSetPathInfo>> parentChildrenMap = - new HashMap<Long, List<DataSetPathInfo>>(); - for (DataSetFileRecord dataSetFileRecord : dataSetFileRecords) + return new Loader(dataSetCode, new ILoader() { - DataSetPathInfo dataSetPathInfo = new DataSetPathInfo(); - dataSetPathInfo.setFileName(dataSetFileRecord.file_name); - dataSetPathInfo.setRelativePath(dataSetFileRecord.relative_path); - dataSetPathInfo.setDirectory(dataSetFileRecord.is_directory); - dataSetPathInfo.setSizeInBytes(dataSetFileRecord.size_in_bytes); - idToInfoMap.put(dataSetFileRecord.id, dataSetPathInfo); - Long parentId = dataSetFileRecord.parent_id; - if (parentId == null) + public List<DataSetFileRecord> listDataSetFiles(long dataSetId) { - result = dataSetPathInfo; - } else + return getDao().listDataSetFiles(dataSetId); + } + }).getRoot(); + } + + private final class Loader + { + private Map<Long, DataSetPathInfo> idToInfoMap = new HashMap<Long, DataSetPathInfo>(); + private DataSetPathInfo root; + + Loader(String dataSetCode, ILoader loader) + { + Long dataSetId = getDao().tryToGetDataSetId(dataSetCode); + if (dataSetId != null) + { + List<DataSetFileRecord> dataSetFileRecords = loader.listDataSetFiles(dataSetId); + Map<Long, List<DataSetPathInfo>> parentChildrenMap = + new HashMap<Long, List<DataSetPathInfo>>(); + for (DataSetFileRecord dataSetFileRecord : dataSetFileRecords) { - List<DataSetPathInfo> children = parentChildrenMap.get(parentId); - if (children == null) + DataSetPathInfo dataSetPathInfo = new DataSetPathInfo(); + dataSetPathInfo.setFileName(dataSetFileRecord.file_name); + dataSetPathInfo.setRelativePath(dataSetFileRecord.relative_path); + dataSetPathInfo.setDirectory(dataSetFileRecord.is_directory); + dataSetPathInfo.setSizeInBytes(dataSetFileRecord.size_in_bytes); + idToInfoMap.put(dataSetFileRecord.id, dataSetPathInfo); + Long parentId = dataSetFileRecord.parent_id; + if (parentId == null) + { + root = dataSetPathInfo; + } else { - children = new ArrayList<DataSetPathInfo>(); - parentChildrenMap.put(parentId, children); + List<DataSetPathInfo> children = parentChildrenMap.get(parentId); + if (children == null) + { + children = new ArrayList<DataSetPathInfo>(); + parentChildrenMap.put(parentId, children); + } + children.add(dataSetPathInfo); } - children.add(dataSetPathInfo); } + linkParentsWithChildren(parentChildrenMap); } + } + + private void linkParentsWithChildren(Map<Long, List<DataSetPathInfo>> parentChildrenMap) + { for (Entry<Long, List<DataSetPathInfo>> entry : parentChildrenMap.entrySet()) { Long parentId = entry.getKey(); DataSetPathInfo parent = idToInfoMap.get(parentId); - List<DataSetPathInfo> children = entry.getValue(); - for (DataSetPathInfo child : children) + if (parent != null) { - parent.addChild(child); - child.setParent(parent); + List<DataSetPathInfo> children = entry.getValue(); + for (DataSetPathInfo child : children) + { + parent.addChild(child); + child.setParent(parent); + } } } } - return result; + + DataSetPathInfo getRoot() + { + return root; + } + + List<DataSetPathInfo> getInfos() + { + return new ArrayList<DataSetPathInfo>(idToInfoMap.values()); + } } private IPathInfoDAO getDao() 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 1f9e485fe34..4f5e1024992 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 @@ -17,6 +17,8 @@ package ch.systemsx.cisd.openbis.dss.generic.shared; +import java.util.List; + import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetPathInfo; @@ -27,5 +29,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetPathInfo; */ public interface IDataSetPathInfoProvider { + public List<DataSetPathInfo> listPathInfosByRegularExpression(String dataSetCode, String regularExpression); + public DataSetPathInfo tryGetDataSetRootPathInfo(String dataSetCode); } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeederTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeederTest.java index ae6756a0217..de868dfcc86 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeederTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/path/DatabaseBasedDataSetPathsInfoFeederTest.java @@ -79,22 +79,22 @@ public class DatabaseBasedDataSetPathsInfoFeederTest extends AbstractFileSystemT one(dao).createDataSet("ds-1", "a/b/c/"); will(returnValue(42L)); - one(dao).createDataSetFile(42L, null, ROOT_PATH, ROOT_PATH, 38, true); + one(dao).createDataSetFile(42L, null, "", ROOT_PATH, 38, true); will(returnValue(100L)); - one(dao).createDataSetFile(42L, 100L, ROOT_PATH + "/dir", "dir", 26, true); + one(dao).createDataSetFile(42L, 100L, "dir", "dir", 26, true); will(returnValue(101L)); - one(dao).createDataSetFile(42L, 101L, ROOT_PATH + "/dir/hello.txt", "hello.txt", 11, false); + one(dao).createDataSetFile(42L, 101L, "dir/hello.txt", "hello.txt", 11, false); will(returnValue(102L)); - one(dao).createDataSetFile(42L, 101L, ROOT_PATH + "/dir/read.me", "read.me", 15, false); + one(dao).createDataSetFile(42L, 101L, "dir/read.me", "read.me", 15, false); will(returnValue(103L)); - one(dao).createDataSetFile(42L, 101L, ROOT_PATH + "/dir/dir", "dir", 0, true); + one(dao).createDataSetFile(42L, 101L, "dir/dir", "dir", 0, true); will(returnValue(104L)); - one(dao).createDataSetFile(42L, 100L, ROOT_PATH + "/read.me", "read.me", 12, false); + one(dao).createDataSetFile(42L, 100L, "read.me", "read.me", 12, false); will(returnValue(105L)); } }); -- GitLab