You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by st...@apache.org on 2019/03/18 14:25:07 UTC
svn commit: r1855771 - in /jackrabbit/oak/trunk/oak-core/src:
main/java/org/apache/jackrabbit/oak/security/user/UserPrincipalProvider.java
test/java/org/apache/jackrabbit/oak/security/principal/AbstractPrincipalProviderTest.java
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));
}
}
}