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