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)); } } }