RM-282 (Search with NOT operator in the beginning performs as without NOT operator)

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@54175 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Tuna Aksoy
2013-08-15 21:01:04 +00:00
parent bb1a863d87
commit fe70fdc55a

View File

@@ -48,31 +48,31 @@ import org.json.JSONObject;
/**
* Records management search service implementation
*
*
* @author Roy Wetherall
*/
public class RecordsManagementSearchServiceImpl implements RecordsManagementSearchService
{
public class RecordsManagementSearchServiceImpl implements RecordsManagementSearchService
{
private static final String SITES_SPACE_QNAME_PATH = "/app:company_home/st:sites/";
/** Name of the main site container used to store the saved searches within */
private static final String SEARCH_CONTAINER = "Saved Searches";
/** File folder service */
private FileFolderService fileFolderService;
/** Search service */
private SearchService searchService;
/** Site service */
private SiteService siteService;
/** Namespace service */
private NamespaceService namespaceService;
/** List of report details */
private List<ReportDetails> reports = new ArrayList<ReportDetails>(13);
/**
* @param fileFolderService file folder service
*/
@@ -80,7 +80,7 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
{
this.fileFolderService = fileFolderService;
}
/**
* @param searchService search service
*/
@@ -88,7 +88,7 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
{
this.searchService = searchService;
}
/**
* @param siteService site service
*/
@@ -96,7 +96,7 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
{
this.siteService = siteService;
}
/**
* @param namespaceService namespace service
*/
@@ -104,7 +104,7 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
{
this.namespaceService = namespaceService;
}
/**
* @param reportsJSON
*/
@@ -118,34 +118,34 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
for (int i=0; i < jsonArray.length(); i++)
{
JSONObject report = jsonArray.getJSONObject(i);
// Get the name
if (report.has(SavedSearchDetails.NAME) == false)
{
throw new AlfrescoRuntimeException("Unable to load report details because name has not been specified. \n" + reportsJSON);
}
String name = report.getString(SavedSearchDetails.NAME);
// Get the query
if (report.has(SavedSearchDetails.SEARCH) == false)
{
throw new AlfrescoRuntimeException("Unable to load report details because search has not been specified for report " + name + ". \n" + reportsJSON);
}
String query = report.getString(SavedSearchDetails.SEARCH);
// Get the description
String description = "";
if (report.has(SavedSearchDetails.DESCRIPTION) == true)
{
description = report.getString(SavedSearchDetails.DESCRIPTION);
}
RecordsManagementSearchParameters searchParameters = new RecordsManagementSearchParameters();
if (report.has("searchparams") == true)
{
searchParameters = RecordsManagementSearchParameters.createFromJSON(report.getJSONObject("searchparams"), namespaceService);
}
}
// Create the report details and add to list
ReportDetails reportDetails = new ReportDetails(name, description, query, searchParameters);
reports.add(reportDetails);
@@ -162,46 +162,46 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
* @see org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService#search(java.lang.String, java.lang.String, org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchParameters)
*/
@Override
public List<NodeRef> search(String siteId, String query, RecordsManagementSearchParameters rmSearchParameters)
{
public List<NodeRef> search(String siteId, String query, RecordsManagementSearchParameters rmSearchParameters)
{
// build the full RM query
StringBuilder fullQuery = new StringBuilder(1024);
StringBuilder fullQuery = new StringBuilder(1024);
fullQuery.append("PATH:\"")
.append(SITES_SPACE_QNAME_PATH)
.append("cm:").append(ISO9075.encode(siteId)).append("/cm:documentLibrary//*\"")
.append(" AND (")
.append(buildQueryString(query, rmSearchParameters))
.append(")");
// create the search parameters
// create the search parameters
SearchParameters searchParameters = new SearchParameters();
searchParameters.setQuery(fullQuery.toString());
searchParameters.setLanguage(SearchService.LANGUAGE_FTS_ALFRESCO);
searchParameters.addStore(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
searchParameters.setMaxItems(rmSearchParameters.getMaxItems());
searchParameters.setNamespace(RecordsManagementModel.RM_URI);
// set sort
for(SortItem entry : rmSearchParameters.getSortOrder())
{
searchParameters.addSort(entry.property.toPrefixString(namespaceService), entry.assc);
}
// set templates
for (Entry<String, String> entry : rmSearchParameters.getTemplates().entrySet())
{
searchParameters.addQueryTemplate(entry.getKey(), entry.getValue());
}
// execute query
ResultSet resultSet = searchService.query(searchParameters);
// return results
return resultSet.getNodeRefs();
}
/**
*
*
* @param queryTerm
* @param aspects
* @param types
@@ -209,34 +209,34 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
*/
/*package*/ String buildQueryString(String queryTerm, RecordsManagementSearchParameters searchParameters)
{
StringBuilder aspectQuery = new StringBuilder();
StringBuilder aspectQuery = new StringBuilder();
if (searchParameters.isIncludeRecords() == true)
{
appendAspect(aspectQuery, "rma:record");
appendAspect(aspectQuery, "rma:record");
if (searchParameters.isIncludeUndeclaredRecords() == false)
{
appendAspect(aspectQuery, "rma:declaredRecord");
}
}
if (searchParameters.isIncludeVitalRecords() == true)
{
appendAspect(aspectQuery, "rma:vitalRecord");
}
}
}
StringBuilder typeQuery = new StringBuilder();
if (searchParameters.isIncludeRecordFolders() == true)
{
appendType(typeQuery, "rma:recordFolder");
}
}
List<QName> includedContainerTypes = searchParameters.getIncludedContainerTypes();
if (includedContainerTypes != null && includedContainerTypes.size() != 0)
{
for (QName includedContainerType : includedContainerTypes)
{
appendType(typeQuery, includedContainerType.toPrefixString(namespaceService));
}
}
}
StringBuilder query = new StringBuilder();
if (queryTerm == null || queryTerm.length() == 0)
{
@@ -262,27 +262,27 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
{
fullQuery.append("(");
}
if (aspectQuery.length() != 0)
{
fullQuery.append("(").append(aspectQuery).append(") ");
}
if (typeQuery.length() != 0)
{
fullQuery.append("(").append(typeQuery).append(")");
}
if (aspectQuery.length() != 0 && typeQuery.length() != 0)
{
fullQuery.append(")");
}
}
if (searchParameters.isIncludeFrozen() == true)
{
appendAspect(fullQuery, "rma:frozen");
}
}
else
{
appendNotAspect(fullQuery, "rma:frozen");
@@ -291,40 +291,38 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
{
appendAspect(fullQuery, "rma:cutOff");
}
if (fullQuery.length() != 0)
{
fullQuery.append(" AND ");
}
fullQuery.append("(")
.append(query)
.append(") AND NOT ASPECT:\"rma:versionedRecord\"");
fullQuery.append(query).append(" AND NOT ASPECT:\"rma:versionedRecord\"");
return fullQuery.toString();
}
private boolean isComplexQueryTerm(String query)
{
return query.matches(".*[\":].*");
}
/**
*
*
* @param sb
* @param aspect
*/
private void appendAspect(StringBuilder sb, String aspect)
{
appendWithJoin(sb, " AND ", "ASPECT:\"", aspect, "\"");
appendWithJoin(sb, " AND ", "ASPECT:\"", aspect, "\"");
}
private void appendNotAspect(StringBuilder sb, String aspect)
{
appendWithJoin(sb, " AND ", "NOT ASPECT:\"", aspect, "\"");
appendWithJoin(sb, " AND ", "NOT ASPECT:\"", aspect, "\"");
}
/**
*
*
* @param sb
* @param type
*/
@@ -332,9 +330,9 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
{
appendWithJoin(sb, " ", "TYPE:\"", type, "\"");
}
/**
*
*
* @param sb
* @param withJoin
* @param prefix
@@ -349,15 +347,15 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
}
sb.append(prefix).append(value).append(postfix);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService#getSavedSearches(java.lang.String)
*/
@Override
public List<SavedSearchDetails> getSavedSearches(String siteId)
public List<SavedSearchDetails> getSavedSearches(String siteId)
{
List<SavedSearchDetails> result = new ArrayList<SavedSearchDetails>(17);
NodeRef container = siteService.getContainer(siteId, SEARCH_CONTAINER);
if (container != null)
{
@@ -367,7 +365,7 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
{
addSearchDetailsToList(result, search.getNodeRef());
}
// add the details of any "private" searches for the current user
String userName = AuthenticationUtil.getFullyAuthenticatedUser();
NodeRef userContainer = fileFolderService.searchSimple(container, userName);
@@ -380,10 +378,10 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
}
}
}
return result;
}
/**
* Add the search details to the list.
* @param searches list of search details
@@ -396,65 +394,65 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
SavedSearchDetails savedSearchDetails = SavedSearchDetails.createFromJSON(jsonString, namespaceService, this);
searches.add(savedSearchDetails);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService#getSavedSearch(java.lang.String, java.lang.String)
*/
@Override
public SavedSearchDetails getSavedSearch(String siteId, String name)
public SavedSearchDetails getSavedSearch(String siteId, String name)
{
// check for mandatory parameters
ParameterCheck.mandatory("siteId", siteId);
ParameterCheck.mandatory("name", name);
SavedSearchDetails result = null;
// get the saved search node
NodeRef searchNode = getSearchNodeRef(siteId, name);
if (searchNode != null)
{
{
// get the json content
ContentReader reader = fileFolderService.getReader(searchNode);
String jsonString = reader.getContentString();
// create the saved search details
result = SavedSearchDetails.createFromJSON(jsonString, namespaceService, this);
}
return result;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService#saveSearch(java.lang.String, java.lang.String, java.lang.String, java.lang.String, boolean)
*/
@Override
public SavedSearchDetails saveSearch(String siteId, String name, String description, String query, RecordsManagementSearchParameters searchParameters, boolean isPublic)
{
public SavedSearchDetails saveSearch(String siteId, String name, String description, String query, RecordsManagementSearchParameters searchParameters, boolean isPublic)
{
// Check for mandatory parameters
ParameterCheck.mandatory("siteId", siteId);
ParameterCheck.mandatory("name", name);
ParameterCheck.mandatory("query", query);
ParameterCheck.mandatory("searchParameters", searchParameters);
// Create saved search details
SavedSearchDetails savedSearchDetails = new SavedSearchDetails(siteId, name, description, query, searchParameters, isPublic, false, namespaceService, this);
// Save search details
return saveSearch(savedSearchDetails);
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService#saveSearch(org.alfresco.module.org_alfresco_module_rm.search.SavedSearchDetails)
*/
@Override
public SavedSearchDetails saveSearch(final SavedSearchDetails savedSearchDetails)
public SavedSearchDetails saveSearch(final SavedSearchDetails savedSearchDetails)
{
// Check for mandatory parameters
ParameterCheck.mandatory("savedSearchDetails", savedSearchDetails);
// Get the root saved search container
final String siteId = savedSearchDetails.getSiteId();
final String siteId = savedSearchDetails.getSiteId();
NodeRef container = siteService.getContainer(siteId, SEARCH_CONTAINER);
if (container == null)
{
@@ -465,9 +463,9 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
{
return siteService.createContainer(siteId, SEARCH_CONTAINER, null, null);
}
}, AuthenticationUtil.getSystemUserName());
}, AuthenticationUtil.getSystemUserName());
}
// Get the private container for the current user
if (savedSearchDetails.isPublic() == false)
{
@@ -487,7 +485,7 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
}
container = userContainer;
}
// Get the saved search node
NodeRef searchNode = fileFolderService.searchSimple(container, savedSearchDetails.getName());
if (searchNode == null)
@@ -502,7 +500,7 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
}
}, AuthenticationUtil.getSystemUserName());
}
// Write the JSON content to search node
final NodeRef writableSearchNode = searchNode;
AuthenticationUtil.runAs(new RunAsWork<Void>()
@@ -514,11 +512,11 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
writer.setEncoding("UTF-8");
writer.setMimetype(MimetypeMap.MIMETYPE_JSON);
writer.putContent(savedSearchDetails.toJSONString());
return null;
}
}, AuthenticationUtil.getSystemUserName());
return savedSearchDetails;
}
@@ -531,15 +529,15 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
// Check parameters
ParameterCheck.mandatory("siteId", siteId);
ParameterCheck.mandatory("name", name);
// Get the search node for the saved query
NodeRef searchNode = getSearchNodeRef(siteId, name);
if (searchNode != null && fileFolderService.exists(searchNode) == true)
{
fileFolderService.delete(searchNode);
}
}
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService#deleteSavedSearch(org.alfresco.module.org_alfresco_module_rm.search.SavedSearchDetails)
*/
@@ -548,28 +546,28 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
{
// Check parameters
ParameterCheck.mandatory("savedSearchDetails", savedSearchDetails);
// Delete the saved search
deleteSavedSearch(savedSearchDetails.getSiteId(), savedSearchDetails.getName());
}
/**
* Get the saved search node reference.
* @param siteId site id
* @param name search name
* @param name search name
* @return {@link NodeRef} search node reference
*/
private NodeRef getSearchNodeRef(String siteId, String name)
{
NodeRef searchNode = null;
// Get the root saved search container
// Get the root saved search container
NodeRef container = siteService.getContainer(siteId, SEARCH_CONTAINER);
if (container != null)
{
{
// try and find the search node
searchNode = fileFolderService.searchSimple(container, name);
// can't find it so check the users container
if (searchNode == null)
{
@@ -581,10 +579,10 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
}
}
}
return searchNode;
return searchNode;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService#addReports(java.lang.String)
*/
@@ -595,16 +593,16 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
{
// Create saved search details
SavedSearchDetails savedSearchDetails = new SavedSearchDetails(
siteId,
report.getName(),
report.getDescription(),
report.getSearch(),
siteId,
report.getName(),
report.getDescription(),
report.getSearch(),
report.getSearchParameters(),
true,
true,
true,
namespaceService,
this);
// Save search details
saveSearch(savedSearchDetails);
}