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 26b00c779061b991709f4ad42c756f92ccb95128..244194be21c1f7a612c35ac0a6e7b54f4df606a6 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 @@ -84,11 +84,15 @@ public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoPro public List<DataSetFileRecord> listDataSetFilesByRelativePathLikeExpression(long dataSetId, String relativePathLikeExpression); - // FIXME we should have 2 methods, one with regexp one with like @Select(SELECT_DATA_SET_FILES + "WHERE dase_id = ?{1} AND relative_path = '?{2}' AND file_name ~ ?{3}") public List<DataSetFileRecord> listDataSetFilesByFilenameRegex(long dataSetId, String startingPath, String filenameRegex); + + @Select(SELECT_DATA_SET_FILES + + "WHERE dase_id = ?{1} AND relative_path = '?{2}' AND file_name LIKE ?{3}") + public List<DataSetFileRecord> listDataSetFilesByFilenameLikeExpression(long dataSetId, + String startingPath, String filenameLikeExpression); } private static interface ILoader @@ -216,9 +220,20 @@ public class DatabaseBasedDataSetPathInfoProvider implements IDataSetPathInfoPro public List<DataSetPathInfo> listMatchingPathInfos(String startingPath, String fileNamePattern) { - List<DataSetFileRecord> records = - dao.listDataSetFilesByFilenameRegex(dataSetId, startingPath, - prepareDBStyleRegex(fileNamePattern)); + String likeExpressionOrNull = + DBUtils.tryToTranslateRegExpToLikePattern(prepareDBStyleRegex(fileNamePattern)); + List<DataSetFileRecord> records; + if (likeExpressionOrNull == null) + { + records = + dao.listDataSetFilesByFilenameRegex(dataSetId, startingPath, + prepareDBStyleRegex(fileNamePattern)); + } else + { + records = + dao.listDataSetFilesByFilenameLikeExpression(dataSetId, startingPath, + likeExpressionOrNull); + } return asPathInfos(records); } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatabaseBasedDataSetPathInfoProviderTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatabaseBasedDataSetPathInfoProviderTest.java index 1c6593ff80491f7fd13450c9159e1135913c7621..4cb55dc5d78900dfb21a9652c9c1613133f62292 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatabaseBasedDataSetPathInfoProviderTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatabaseBasedDataSetPathInfoProviderTest.java @@ -335,12 +335,12 @@ public class DatabaseBasedDataSetPathInfoProviderTest extends AssertJUnit } @Test - void testListMatchingPathInfosWithFileNamePattern() + void testListMatchingPathInfosWithFileNameRegExpPattern() { ISingleDataSetPathInfoProvider provider = createSingleDataSetPathInfoProvider(); final String startingPath = "dir"; - final String regex = "child.*"; + final String regex = "(child.*|child)"; // NOTE: data in records are not significant final DataSetFileRecord rc1 = record(3L, 2L, "dir/child_dir", "child_dir", 20, true); @@ -361,6 +361,33 @@ public class DatabaseBasedDataSetPathInfoProviderTest extends AssertJUnit check(rc2, list.get(1)); } + @Test + void testListMatchingPathInfosWithFileNameLikePattern() + { + ISingleDataSetPathInfoProvider provider = createSingleDataSetPathInfoProvider(); + + final String startingPath = "dir"; + final String regex = "child.*"; + + // NOTE: data in records are not significant + final DataSetFileRecord rc1 = record(3L, 2L, "dir/child_dir", "child_dir", 20, true); + final DataSetFileRecord rc2 = record(4L, 2L, "dir/child_file", "child_file", 30, false); + + context.checking(new Expectations() + { + { + one(dao).listDataSetFilesByFilenameLikeExpression(DATA_SET_ID, startingPath, + "child%"); + will(returnValue(Arrays.asList(rc1, rc2))); + } + }); + + List<DataSetPathInfo> list = provider.listMatchingPathInfos(startingPath, regex); + sort(list); + check(rc1, list.get(0)); + check(rc2, list.get(1)); + } + private ISingleDataSetPathInfoProvider createSingleDataSetPathInfoProvider() { return new DatabaseBasedDataSetPathInfoProvider.SingleDataSetPathInfoProvider(DATA_SET_ID,