mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Fix for ETHREEOH-1243 - improved List Site Members API to correctly search using multiple name filter terms.
Fixed up Site search to only search fields we actually use to reduce search overhead. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@13793 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -31,6 +31,7 @@ import java.util.HashSet;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
@@ -572,35 +573,27 @@ public class SiteServiceImpl implements SiteService, SiteModel
|
|||||||
NodeRef siteRoot = getSiteRoot();
|
NodeRef siteRoot = getSiteRoot();
|
||||||
if (nameFilter != null && nameFilter.length() != 0)
|
if (nameFilter != null && nameFilter.length() != 0)
|
||||||
{
|
{
|
||||||
// Perform a Lucene search under the Site parent node using *name*, *title* and *description* search query
|
String escNameFilter = LuceneQueryParser.escape(nameFilter.replace('"', ' '));
|
||||||
QueryParameterDefinition[] params = new QueryParameterDefinition[3];
|
// Perform a Lucene search under the Site parent node using *name* and *description* search query
|
||||||
|
QueryParameterDefinition[] params = new QueryParameterDefinition[2];
|
||||||
params[0] = new QueryParameterDefImpl(
|
params[0] = new QueryParameterDefImpl(
|
||||||
ContentModel.PROP_NAME,
|
ContentModel.PROP_NAME,
|
||||||
dictionaryService.getDataType(
|
dictionaryService.getDataType(
|
||||||
DataTypeDefinition.TEXT),
|
DataTypeDefinition.TEXT),
|
||||||
true,
|
true,
|
||||||
LuceneQueryParser.escape(nameFilter.replace('"', ' ')));
|
escNameFilter);
|
||||||
|
|
||||||
params[1] = new QueryParameterDefImpl(
|
params[1] = new QueryParameterDefImpl(
|
||||||
ContentModel.PROP_TITLE,
|
|
||||||
dictionaryService.getDataType(
|
|
||||||
DataTypeDefinition.TEXT),
|
|
||||||
true,
|
|
||||||
LuceneQueryParser.escape(nameFilter.replace('"', ' ')));
|
|
||||||
|
|
||||||
params[2] = new QueryParameterDefImpl(
|
|
||||||
ContentModel.PROP_DESCRIPTION,
|
ContentModel.PROP_DESCRIPTION,
|
||||||
dictionaryService.getDataType(
|
dictionaryService.getDataType(
|
||||||
DataTypeDefinition.TEXT),
|
DataTypeDefinition.TEXT),
|
||||||
true,
|
true,
|
||||||
LuceneQueryParser.escape(nameFilter.replace('"', ' ')));
|
escNameFilter);
|
||||||
|
|
||||||
// get the sites that match the specified names
|
// get the sites that match the specified names
|
||||||
StringBuilder query = new StringBuilder(128);
|
StringBuilder query = new StringBuilder(128);
|
||||||
query.append("+PARENT:\"").append(siteRoot.toString())
|
query.append("+PARENT:\"").append(siteRoot.toString())
|
||||||
.append("\" +(@cm\\:name:\"*${cm:name}*\"")
|
.append("\" +(@cm\\:name:\"*${cm:name}*\" @cm\\:description:\"*${cm:description}*\")");
|
||||||
.append(" @cm\\:title:\"*${cm:title}*\"")
|
|
||||||
.append(" @cm\\:description:\"*${cm:description}*\")");
|
|
||||||
ResultSet results = this.searchService.query(
|
ResultSet results = this.searchService.query(
|
||||||
siteRoot.getStoreRef(),
|
siteRoot.getStoreRef(),
|
||||||
SearchService.LANGUAGE_LUCENE,
|
SearchService.LANGUAGE_LUCENE,
|
||||||
@@ -971,9 +964,21 @@ public class SiteServiceImpl implements SiteService, SiteModel
|
|||||||
{
|
{
|
||||||
throw new SiteServiceException(MSG_SITE_NO_EXIST, new Object[]{shortName});
|
throw new SiteServiceException(MSG_SITE_NO_EXIST, new Object[]{shortName});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// build an array of name filter tokens pre lowercased to test against person properties
|
||||||
|
String[] nameFilters = new String[0];
|
||||||
|
if (nameFilter != null && nameFilter.length() != 0)
|
||||||
|
{
|
||||||
|
StringTokenizer t = new StringTokenizer(nameFilter, " ");
|
||||||
|
nameFilters = new String[t.countTokens()];
|
||||||
|
for (int i=0; t.hasMoreTokens(); i++)
|
||||||
|
{
|
||||||
|
nameFilters[i] = t.nextToken().toLowerCase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Map<String, String> members = new HashMap<String, String>(32);
|
Map<String, String> members = new HashMap<String, String>(32);
|
||||||
|
|
||||||
Set<String> permissions = this.permissionService.getSettablePermissions(SiteModel.TYPE_SITE);
|
Set<String> permissions = this.permissionService.getSettablePermissions(SiteModel.TYPE_SITE);
|
||||||
for (String permission : permissions)
|
for (String permission : permissions)
|
||||||
{
|
{
|
||||||
@@ -987,7 +992,7 @@ public class SiteServiceImpl implements SiteService, SiteModel
|
|||||||
if (nameFilter != null && nameFilter.length() != 0 && !nameFilter.equals(user))
|
if (nameFilter != null && nameFilter.length() != 0 && !nameFilter.equals(user))
|
||||||
{
|
{
|
||||||
// found a filter - does it match person first/last name?
|
// found a filter - does it match person first/last name?
|
||||||
addUser = matchPerson(nameFilter, user);
|
addUser = matchPerson(nameFilters, user);
|
||||||
}
|
}
|
||||||
if (addUser)
|
if (addUser)
|
||||||
{
|
{
|
||||||
@@ -1022,7 +1027,7 @@ public class SiteServiceImpl implements SiteService, SiteModel
|
|||||||
if (nameFilter != null && nameFilter.length() != 0 && !nameFilter.equals(subUser))
|
if (nameFilter != null && nameFilter.length() != 0 && !nameFilter.equals(subUser))
|
||||||
{
|
{
|
||||||
// found a filter - does it match person first/last name?
|
// found a filter - does it match person first/last name?
|
||||||
addUser = matchPerson(nameFilter, subUser);
|
addUser = matchPerson(nameFilters, subUser);
|
||||||
}
|
}
|
||||||
if (addUser)
|
if (addUser)
|
||||||
{
|
{
|
||||||
@@ -1045,26 +1050,36 @@ public class SiteServiceImpl implements SiteService, SiteModel
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper to
|
* Helper to match name filters to Person properties
|
||||||
|
*
|
||||||
* @param filter
|
* @param filter
|
||||||
* @param username
|
* @param username
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private boolean matchPerson(String filter, String username)
|
private boolean matchPerson(final String[] nameFilters, final String username)
|
||||||
{
|
{
|
||||||
boolean addUser = false;
|
boolean addUser = false;
|
||||||
|
|
||||||
NodeRef personRef = this.personService.getPerson(username);
|
NodeRef personRef = this.personService.getPerson(username);
|
||||||
Map<QName, Serializable> props = this.nodeService.getProperties(personRef);
|
Map<QName, Serializable> props = this.nodeService.getProperties(personRef);
|
||||||
String firstName = (String)props.get(ContentModel.PROP_FIRSTNAME);
|
String firstName = (String)props.get(ContentModel.PROP_FIRSTNAME);
|
||||||
String lastName = (String)props.get(ContentModel.PROP_LASTNAME);
|
String lastName = (String)props.get(ContentModel.PROP_LASTNAME);
|
||||||
if (firstName != null && firstName.toLowerCase().indexOf(filter.toLowerCase()) != -1)
|
final String lowFirstName = (firstName != null ? firstName.toLowerCase() : "");
|
||||||
|
final String lowLastName = (lastName != null ? lastName.toLowerCase() : "");
|
||||||
|
for (int i=0; i<nameFilters.length; i++)
|
||||||
{
|
{
|
||||||
addUser = true;
|
if (lowFirstName.indexOf(nameFilters[i]) != -1)
|
||||||
}
|
{
|
||||||
else if (lastName != null && lastName.toLowerCase().indexOf(filter.toLowerCase()) != -1)
|
addUser = true;
|
||||||
{
|
break;
|
||||||
addUser = true;
|
}
|
||||||
|
else if (lowLastName.indexOf(nameFilters[i]) != -1)
|
||||||
|
{
|
||||||
|
addUser = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return addUser;
|
return addUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user