Author: stillalex
Date: Mon Mar 18 14:25:06 2019
New Revision: 1855771

URL: http://svn.apache.org/viewvc?rev=1855771&view=rev
Log:
OAK-8140 UserPrincipalProvider support for full text search



Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProvider.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProvider.java?rev=1855771&r1=1855770&r2=1855771&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProvider.java
 Mon Mar 18 14:25:06 2019
@@ -171,14 +171,21 @@ class UserPrincipalProvider implements P
             limit = Long.MAX_VALUE;
         }
         try {
+
+            String lookupClause = "";
+            if (nameHint != null && !nameHint.isEmpty()) {
+                if (fullText) {
+                    lookupClause = String.format("[jcr:contains(.,'%s')]", 
buildSearchPatternFT(nameHint));
+                } else {
+                    lookupClause = 
String.format("[jcr:like(@rep:principalName,'%s')]", 
buildSearchPatternContains(nameHint));
+                }
+            }
             AuthorizableType type = AuthorizableType.getType(searchType);
             StringBuilder statement = new StringBuilder()
                     .append(QueryUtil.getSearchRoot(type, 
config.getParameters()))
                     
.append("//element(*,").append(QueryUtil.getNodeTypeName(type)).append(')')
-                    .append("[jcr:like(@rep:principalName,'")
-                    .append(buildSearchPattern(nameHint))
-                    .append("')] order by @rep:principalName");
-
+                    .append(lookupClause)
+                    .append(" order by @rep:principalName");
             Result result = root.getQueryEngine().executeQuery(
                     statement.toString(), javax.jcr.query.Query.XPATH,
                     limit, offset, NO_BINDINGS, 
namePathMapper.getSessionLocalMappings());
@@ -365,15 +372,19 @@ class UserPrincipalProvider implements P
         return expirationTime > EXPIRATION_NO_CACHE && now < expirationTime;
     }
 
-    private static String buildSearchPattern(String nameHint) {
-        if (nameHint == null) {
-            return "%";
+    private static String buildSearchPatternContains(@NotNull String nameHint) 
{
+        StringBuilder sb = new StringBuilder();
+        sb.append('%');
+        sb.append(nameHint.replace("%", "\\%").replace("_", "\\_"));
+        sb.append('%');
+        return sb.toString();
+    }
+
+    private static String buildSearchPatternFT(@NotNull String nameHint) {
+        if (nameHint.contains("*")) {
+            return QueryUtil.escapeForQuery(nameHint);
         } else {
-            StringBuilder sb = new StringBuilder();
-            sb.append('%');
-            sb.append(nameHint.replace("%", "\\%").replace("_", "\\_"));
-            sb.append('%');
-            return sb.toString();
+            return QueryUtil.escapeForQuery(nameHint) + "*";
         }
     }
 

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java?rev=1855771&r1=1855770&r2=1855771&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java
 Mon Mar 18 14:25:06 2019
@@ -68,6 +68,9 @@ public abstract class AbstractPrincipalP
 
     @Override
     public void before() throws Exception {
+        // because of full text search test #testFindRange
+        getQueryEngineSettings().setFailTraversal(false);
+        getQueryEngineSettings().setFullTextComparisonWithoutIndex(true);
         super.before();
 
         userPrincipal = getTestUser().getPrincipal();
@@ -415,9 +418,12 @@ public abstract class AbstractPrincipalP
                     to = Math.min(offset + limit, to);
                 }
                 List<String> sub = expected.subList(offset, to);
-                Iterator<? extends Principal> i1 = 
principalProvider.findPrincipals("testGroup",
-                        false, PrincipalManager.SEARCH_TYPE_ALL, offset, 
limit);
+                Iterator<? extends Principal> i1 = 
principalProvider.findPrincipals("testGroup", false,
+                        PrincipalManager.SEARCH_TYPE_ALL, offset, limit);
                 assertEquals(sub, getNames(i1));
+                Iterator<? extends Principal> i2 = 
principalProvider.findPrincipals("testGroup", true,
+                        PrincipalManager.SEARCH_TYPE_ALL, offset, limit);
+                assertEquals(sub, getNames(i2));
             }
         }
     }


Reply via email to