From 8fd0e78ac111f3520b38330ca1349b6083a215cf Mon Sep 17 00:00:00 2001
From: gpawel <gpawel>
Date: Wed, 8 Jun 2011 08:18:27 +0000
Subject: [PATCH] [LMS-2181] more like expressions

SVN: 21637
---
 .../DatabaseBasedDataSetPathInfoProvider.java | 23 +++++++++++---
 ...abaseBasedDataSetPathInfoProviderTest.java | 31 +++++++++++++++++--
 2 files changed, 48 insertions(+), 6 deletions(-)

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 26b00c77906..244194be21c 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 1c6593ff804..4cb55dc5d78 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,
-- 
GitLab