From 382ed97a949ec5d243568c8f0c0ce0dd17d345d8 Mon Sep 17 00:00:00 2001 From: Steven Glover Date: Fri, 5 Aug 2011 13:31:34 +0000 Subject: [PATCH] Fix for ALF-9086 "RINF 52: Lucene Removal: Fix FileFolderService search methods" - changed wildcard character to '*' git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@29567 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../filefolder/FileFolderServiceImpl.java | 27 ---------- .../filefolder/FileFolderServiceImplTest.java | 6 +-- .../getchildren/FilterSortNodeEntity.java | 29 ++++++++++- .../GetChildrenCannedQueryFactory.java | 1 + .../GetChildrenCannedQueryParams.java | 1 - .../GetChildrenCannedQueryTest.java | 52 +++++++++++++++---- .../service/cmr/model/FileFolderService.java | 2 +- 7 files changed, 76 insertions(+), 42 deletions(-) diff --git a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java index bfd5561dad..fbc188eb55 100644 --- a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java +++ b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java @@ -479,33 +479,6 @@ public class FileFolderServiceImpl implements FileFolderService return results; } -// private CannedQueryResults listImpl(NodeRef contextNodeRef, String pattern, List> sortProps, PagingRequest pagingRequest) -// { -// Long start = (logger.isDebugEnabled() ? System.currentTimeMillis() : null); -// -// // get canned query -// GetChildrenCannedQueryFactory getChildrenCannedQueryFactory = (GetChildrenCannedQueryFactory)cannedQueryRegistry.getNamedObject(CANNED_QUERY_FILEFOLDER_LIST); -// -// GetChildrenCannedQuery cq = (GetChildrenCannedQuery)getChildrenCannedQueryFactory.getCannedQuery(contextNodeRef, null, pattern, null, sortProps, pagingRequest); -// -// // execute canned query -// CannedQueryResults results = cq.execute(); -// -// if (start != null) -// { -// int cnt = results.getPagedResultCount(); -// int skipCount = pagingRequest.getSkipCount(); -// int maxItems = pagingRequest.getMaxItems(); -// boolean hasMoreItems = results.hasMoreItems(); -// Pair totalCount = (pagingRequest.getRequestTotalCountMax() > 0 ? results.getTotalResultCount() : null); -// int pageNum = (skipCount / maxItems) + 1; -// -// logger.debug("List: "+cnt+" items in "+(System.currentTimeMillis()-start)+" msecs [pageNum="+pageNum+",skip="+skipCount+",max="+maxItems+",hasMorePages="+hasMoreItems+",totalCount="+totalCount+",parentNodeRef="+contextNodeRef+"]"); -// } -// -// return results; -// } - public List listFiles(NodeRef contextNodeRef) { // execute the query diff --git a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImplTest.java b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImplTest.java index ecc19e2d78..efaeaacfd1 100644 --- a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImplTest.java +++ b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImplTest.java @@ -1147,7 +1147,7 @@ public class FileFolderServiceImplTest extends TestCase // test 1 PagingRequest pagingRequest = new PagingRequest(100, null); - PagingResults pagingResults = fileFolderService.list(workingRootNodeRef, true, true, "L0%", null, null, pagingRequest); + PagingResults pagingResults = fileFolderService.list(workingRootNodeRef, true, true, "L0*", null, null, pagingRequest); assertNotNull(pagingResults); assertFalse(pagingResults.hasMoreItems()); @@ -1161,7 +1161,7 @@ public class FileFolderServiceImplTest extends TestCase checkFileList(files, 2, 3, expectedNames); // test 2 - pagingResults = fileFolderService.list(workingRootNodeRef, true, true, "L1%", null, null, pagingRequest); + pagingResults = fileFolderService.list(workingRootNodeRef, true, true, "L1*", null, null, pagingRequest); assertNotNull(pagingResults); assertFalse(pagingResults.hasMoreItems()); @@ -1175,7 +1175,7 @@ public class FileFolderServiceImplTest extends TestCase checkFileList(files, 0, 0, expectedNames); // test 3 - pagingResults = fileFolderService.list(workingRootNodeRef, true, true, "L0%File%", null, null, pagingRequest); + pagingResults = fileFolderService.list(workingRootNodeRef, true, true, "L0*File*", null, null, pagingRequest); assertNotNull(pagingResults); assertFalse(pagingResults.hasMoreItems()); diff --git a/source/java/org/alfresco/repo/node/getchildren/FilterSortNodeEntity.java b/source/java/org/alfresco/repo/node/getchildren/FilterSortNodeEntity.java index 9752fff8c8..f535b111ab 100644 --- a/source/java/org/alfresco/repo/node/getchildren/FilterSortNodeEntity.java +++ b/source/java/org/alfresco/repo/node/getchildren/FilterSortNodeEntity.java @@ -74,9 +74,36 @@ public class FilterSortNodeEntity return pattern; } + protected String escape(String s, char escapeChar) + { + StringBuilder sb = new StringBuilder(); + int idx = -1; + int offset = 0; + do + { + idx = s.indexOf(escapeChar, offset); + if(idx != -1) + { + sb.append(s.substring(offset, idx)); + sb.append("\\"); + sb.append(escapeChar); + offset = idx + 1; + } + } + while(idx != -1); + sb.append(s.substring(offset)); + return sb.toString(); + } + public void setPattern(String pattern) { - this.pattern = pattern; + if(pattern != null) + { + // escape the '%' character with '\' (standard SQL escape character) + pattern = escape(pattern, '%'); + // replace the wildcard character '*' with the one used in database queries i.e. '%' + this.pattern = pattern.replace('*', '%'); + } } public Long getNamePropertyQNameId() diff --git a/source/java/org/alfresco/repo/node/getchildren/GetChildrenCannedQueryFactory.java b/source/java/org/alfresco/repo/node/getchildren/GetChildrenCannedQueryFactory.java index 5d40adf0fd..fc11f8ed4c 100644 --- a/source/java/org/alfresco/repo/node/getchildren/GetChildrenCannedQueryFactory.java +++ b/source/java/org/alfresco/repo/node/getchildren/GetChildrenCannedQueryFactory.java @@ -116,6 +116,7 @@ public class GetChildrenCannedQueryFactory extends AbstractCannedQueryFactory results = list(parentNodeRef, -1, -1, 0, pattern, null); assertFalse(results.hasMoreItems()); int totalCnt = results.getPage().size(); + assertTrue(totalCnt == 1); + assertEquals(nodeRef5, results.getPage().get(0)); + + pattern = "page.*.user~admin~dashboard.xml"; + results = list(parentNodeRef, -1, -1, 0, pattern, null); + assertFalse(results.hasMoreItems()); + + totalCnt = results.getPage().size(); assertTrue(totalCnt == 2); assertEquals(nodeRef1, results.getPage().get(0)); assertEquals(nodeRef2, results.getPage().get(1)); - pattern = "%"; + pattern = "*"; results = list(parentNodeRef, -1, -1, 0, pattern, null); assertFalse(results.hasMoreItems()); totalCnt = results.getPage().size(); - assertTrue(totalCnt == 4); + assertTrue(totalCnt == 5); assertEquals(nodeRef1, results.getPage().get(0)); assertEquals(nodeRef2, results.getPage().get(1)); assertEquals(nodeRef3, results.getPage().get(2)); assertEquals(nodeRef4, results.getPage().get(3)); + assertEquals(nodeRef5, results.getPage().get(4)); - pattern = "foo%bar"; + pattern = "foo*bar"; results = list(parentNodeRef, -1, -1, 0, pattern, null); assertFalse(results.hasMoreItems()); totalCnt = results.getPage().size(); - assertTrue(totalCnt == 0); + assertEquals("", 0, totalCnt); - pattern = "page.%.admin~dashboard.xml"; + pattern = "page.*.admin~dashboard.xml"; results = list(parentNodeRef, -1, -1, 0, pattern, null); assertFalse(results.hasMoreItems()); totalCnt = results.getPage().size(); - assertTrue(totalCnt == 0); + assertEquals("", 0, totalCnt); + pattern = "page.*.user~admin~*.xml"; + results = list(parentNodeRef, -1, -1, 0, pattern, null); + assertFalse(results.hasMoreItems()); + totalCnt = results.getPage().size(); + assertEquals("", 4, totalCnt); + + pattern = "page.*.user~admin~%*.xml"; + results = list(parentNodeRef, -1, -1, 0, pattern, null); + assertFalse(results.hasMoreItems()); + totalCnt = results.getPage().size(); + assertEquals("", 1, totalCnt); + + pattern = "page.*.user~admin~%dashboard.xml"; + results = list(parentNodeRef, -1, -1, 0, pattern, null); + assertFalse(results.hasMoreItems()); + totalCnt = results.getPage().size(); + assertEquals("", 1, totalCnt); + + pattern = "page.component-1-4.user~admin~%dashboard.xml"; + results = list(parentNodeRef, -1, -1, 0, pattern, null); + assertFalse(results.hasMoreItems()); + totalCnt = results.getPage().size(); + assertEquals("", 1, totalCnt); + pattern = "page.%.user~admin~%.xml"; results = list(parentNodeRef, -1, -1, 0, pattern, null); assertFalse(results.hasMoreItems()); totalCnt = results.getPage().size(); - assertTrue(totalCnt == 3); + assertEquals("", 0, totalCnt); } // test helper method - optional filtering/sorting diff --git a/source/java/org/alfresco/service/cmr/model/FileFolderService.java b/source/java/org/alfresco/service/cmr/model/FileFolderService.java index b3320c5988..32c518adfe 100644 --- a/source/java/org/alfresco/service/cmr/model/FileFolderService.java +++ b/source/java/org/alfresco/service/cmr/model/FileFolderService.java @@ -73,7 +73,7 @@ public interface FileFolderService * Lists page of immediate child files and/or folders of the given context node * with pattern matching and optional filtering (exclusion of certain child file/folder subtypes) and sorting * - * Pattern uses '%' as a wildcard + * Pattern uses '*' as a wildcard * * @since 4.0 */