ALF-9153 Discussions Topic Finding (lucene based) on the Java Service for getting topics by tag

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@29890 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Nick Burch
2011-08-18 16:11:40 +00:00
parent 6172585955
commit 53778ee973
4 changed files with 190 additions and 1 deletions

View File

@@ -53,10 +53,17 @@ import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.search.LimitBy;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.ResultSetRow;
import org.alfresco.service.cmr.search.SearchParameters;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.site.SiteService;
import org.alfresco.service.cmr.tagging.TaggingService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.ISO9075;
import org.alfresco.util.Pair;
import org.alfresco.util.registry.NamedObjectRegistry;
import org.apache.commons.logging.Log;
@@ -77,14 +84,15 @@ public class DiscussionServiceImpl implements DiscussionService
/**
* The logger
*/
@SuppressWarnings("unused")
private static Log logger = LogFactory.getLog(DiscussionServiceImpl.class);
private NodeDAO nodeDAO;
private NodeService nodeService;
private SiteService siteService;
private SearchService searchService;
private ContentService contentService;
private TaggingService taggingService;
private NamespaceService namespaceService;
private FileFolderService fileFolderService;
private TransactionService transactionService;
private NamedObjectRegistry<CannedQueryFactory<? extends Object>> cannedQueryRegistry;
@@ -104,6 +112,11 @@ public class DiscussionServiceImpl implements DiscussionService
this.siteService = siteService;
}
public void setSearchService(SearchService searchService)
{
this.searchService = searchService;
}
public void setContentService(ContentService contentService)
{
this.contentService = contentService;
@@ -114,6 +127,11 @@ public class DiscussionServiceImpl implements DiscussionService
this.taggingService = taggingService;
}
public void setNamespaceService(NamespaceService namespaceService)
{
this.namespaceService = namespaceService;
}
public void setFileFolderService(FileFolderService fileFolderService)
{
this.fileFolderService = fileFolderService;
@@ -568,6 +586,79 @@ public class DiscussionServiceImpl implements DiscussionService
return wrap(nodes, nodeRef);
}
@Override
public PagingResults<TopicInfo> findTopics(String siteShortName,
String tag, PagingRequest paging) {
NodeRef container = getSiteDiscussionsContainer(siteShortName, false);
if(container == null)
{
// No topics
return new EmptyPagingResults<TopicInfo>();
}
// We can now search by parent nodeRef
return findTopics(container, tag, paging);
}
@Override
public PagingResults<TopicInfo> findTopics(NodeRef nodeRef,
String tag, PagingRequest paging) {
// Build the query
StringBuilder luceneQuery = new StringBuilder();
luceneQuery.append(
" +TYPE:\"" + ForumModel.TYPE_TOPIC + "\""
);
luceneQuery.append(
" +PATH:\"" + nodeService.getPath(nodeRef).toPrefixString(namespaceService) + "/*\""
);
if(tag != null)
{
luceneQuery.append(
" +PATH:\"/cm:taggable/cm:" + ISO9075.encode(tag) + "/member\""
);
}
String sortOn = "@{http://www.alfresco.org/model/content/1.0}created";
// Query
SearchParameters sp = new SearchParameters();
sp.addStore(nodeRef.getStoreRef());
sp.setLanguage(SearchService.LANGUAGE_LUCENE);
sp.setQuery(luceneQuery.toString());
sp.addSort(sortOn, true);
if (paging.getMaxItems() > 0)
{
sp.setLimit(paging.getMaxItems());
sp.setLimitBy(LimitBy.FINAL_SIZE);
}
if (paging.getSkipCount() > 0)
{
sp.setSkipCount(paging.getSkipCount());
}
// Build the results
PagingResults<TopicInfo> pagedResults = new EmptyPagingResults<TopicInfo>();
ResultSet results = null;
try
{
results = searchService.query(sp);
pagedResults = wrap(results, nodeRef);
}
finally
{
if(results != null)
{
results.close();
}
}
return pagedResults;
}
@Override
public PagingResults<PostInfo> listPosts(TopicInfo topic, PagingRequest paging)
{
@@ -730,6 +821,47 @@ public class DiscussionServiceImpl implements DiscussionService
return results;
}
/**
* Our class to wrap up search results as {@link TopicInfo} instances
*/
private PagingResults<TopicInfo> wrap(final ResultSet finalLuceneResults, final NodeRef container)
{
final List<TopicInfo> topics = new ArrayList<TopicInfo>();
for(ResultSetRow row : finalLuceneResults)
{
TopicInfo topic = buildTopic(
row.getNodeRef(), container, row.getQName().getLocalName()
);
topics.add(topic);
}
// Wrap
return new PagingResults<TopicInfo>() {
@Override
public boolean hasMoreItems() {
return finalLuceneResults.hasMore();
}
@Override
public Pair<Integer, Integer> getTotalResultCount() {
int skipCount = finalLuceneResults.getStart();
int itemsRemainingAfterThisPage = finalLuceneResults.length();
final int totalItemsInUnpagedResultSet = skipCount + itemsRemainingAfterThisPage;
return new Pair<Integer, Integer>(totalItemsInUnpagedResultSet, totalItemsInUnpagedResultSet);
}
@Override
public List<TopicInfo> getPage() {
return topics;
}
@Override
public String getQueryExecutionId() {
return null;
}
};
}
/**
* Our class to wrap up paged results of NodeBackedEntities as
* {@link TopicInfo} instances

View File

@@ -546,6 +546,8 @@ public class DiscussionServiceImplTest
{
PagingResults<TopicInfo> topics;
PagingResults<PostInfo> posts;
final String TAG_1 = "topic_tag_one";
final String TAG_2 = "topic_tag_two";
// To start with, there will be no topics
@@ -581,6 +583,46 @@ public class DiscussionServiceImplTest
assertEquals("NT2", topics.getPage().get(1).getTitle());
assertEquals("NT3", topics.getPage().get(2).getTitle());
// Add tags to a few
siteT2.getTags().add(TAG_1);
nodeT2.getTags().add(TAG_1);
nodeT2.getTags().add(TAG_2);
nodeT3.getTags().add(TAG_1);
DISCUSSION_SERVICE.updateTopic(siteT2);
DISCUSSION_SERVICE.updateTopic(nodeT2);
DISCUSSION_SERVICE.updateTopic(nodeT3);
// Find without tags
topics = DISCUSSION_SERVICE.findTopics(DISCUSSION_SITE.getShortName(), null, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("ST1", topics.getPage().get(0).getTitle());
assertEquals("ST2", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.findTopics(FORUM_NODE, null, new PagingRequest(10));
assertEquals(3, topics.getPage().size());
assertEquals("NT1", topics.getPage().get(0).getTitle());
assertEquals("NT2", topics.getPage().get(1).getTitle());
assertEquals("NT3", topics.getPage().get(2).getTitle());
// Find with tags
topics = DISCUSSION_SERVICE.findTopics(DISCUSSION_SITE.getShortName(), TAG_1, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("ST2", topics.getPage().get(0).getTitle());
topics = DISCUSSION_SERVICE.findTopics(FORUM_NODE, TAG_1, new PagingRequest(10));
assertEquals(2, topics.getPage().size());
assertEquals("NT2", topics.getPage().get(0).getTitle());
assertEquals("NT3", topics.getPage().get(1).getTitle());
topics = DISCUSSION_SERVICE.findTopics(DISCUSSION_SITE.getShortName(), TAG_2, new PagingRequest(10));
assertEquals(0, topics.getPage().size());
topics = DISCUSSION_SERVICE.findTopics(FORUM_NODE, TAG_2, new PagingRequest(10));
assertEquals(1, topics.getPage().size());
assertEquals("NT2", topics.getPage().get(0).getTitle());
// Alter the creation date on a couple, see the ordering change
pushAuditableDatesBack(siteT2, 2, 2);