com.servicerocket.confluence.randombits.supplier.confluence.content.PageGrandchildrenSupplierSearch Maven / Gradle / Ivy
package com.servicerocket.confluence.randombits.supplier.confluence.content;
import com.atlassian.bonnie.Searchable;
import com.atlassian.confluence.pages.Page;
import com.atlassian.confluence.search.service.ContentTypeEnum;
import com.atlassian.confluence.search.v2.*;
import com.atlassian.confluence.search.v2.query.BooleanQuery;
import com.atlassian.confluence.search.v2.query.ContentTypeQuery;
import com.atlassian.confluence.search.v2.query.InSpaceQuery;
import com.atlassian.confluence.search.v2.query.TermQuery;
import com.atlassian.confluence.search.v2.searchfilter.SiteSearchPermissionsSearchFilter;
import com.atlassian.confluence.search.v2.sort.CreatedSort;
import com.servicerocket.confluence.randombits.performance.PerformanceLogger;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.*;
import java.util.stream.Collectors;
public class PageGrandchildrenSupplierSearch implements PageGrandchildrenSearch {
static final int SEARCH_API_HARD_CAP_LIMIT = 500;
private static final int INITIAL_START_INDEX = 0;
private static final int INITIAL_API_CALL_COUNT = 0;
private static final Logger LOG = Logger.getLogger(PageGrandchildrenSupplierSearch.class);
private SearchManager searchManager;
public List search(Page page) {
long startTime = PerformanceLogger.getCurrentTime();
SearchQuery query = BooleanQuery.andQuery(
new InSpaceQuery(page.getSpaceKey()),
new TermQuery("ancestorIds", page.getIdAsString()),
new ContentTypeQuery(ContentTypeEnum.PAGE)
);
List results = executeSearch(query);
return matchSearchResultsWithGrandchildrenPageObjects(page, results, startTime);
}
private List executeSearch(SearchQuery query) {
long startTime = PerformanceLogger.getCurrentTime();
List searchResults = new ArrayList<>();
SearchResults batchedSearchResults;
int offset = INITIAL_START_INDEX;
int searchApiCalls = INITIAL_API_CALL_COUNT;
do {
ContentSearch searchToPerform = new ContentSearch(
query,
CreatedSort.DESCENDING,
SiteSearchPermissionsSearchFilter.getInstance(),
offset,
SEARCH_API_HARD_CAP_LIMIT
);
try {
batchedSearchResults = searchManager.search(searchToPerform);
List searchablesCurrentBatch = searchManager.convertToEntities(batchedSearchResults, SearchManager.EntityVersionPolicy.LATEST_VERSION);
searchResults.addAll(searchablesCurrentBatch);
offset += batchedSearchResults.size();
searchApiCalls++;
} catch (InvalidSearchException e) {
batchedSearchResults = new DefaultSearchResults(Collections.emptyList(), 0);
LOG.debug("Exception while performing search: " + e.getMessage(), e);
}
} while (!batchedSearchResults.isLastPage());
PerformanceLogger.logSearchManagerPerformance(String.valueOf(searchResults.size()), startTime, searchApiCalls);
return searchResults;
}
private List matchSearchResultsWithGrandchildrenPageObjects(Page page, List searchResults, long startTime) {
Set permittedPageIds = searchResults.stream()
.map(Searchable::getId)
.collect(Collectors.toSet());
Set grandchildrenPages = page.getChildren().stream()
.map(Page::getChildren)
.flatMap(Collection::stream)
.collect(Collectors.toSet());
List results = grandchildrenPages.stream()
.filter(grandchildPage -> permittedPageIds.contains(grandchildPage.getId()))
.collect(Collectors.toList());
PerformanceLogger.logSupplierWithDetails(
"getGrandChildren",
String.valueOf(page.getIdAsString()),
String.valueOf(page.getSpaceKey()),
String.valueOf(grandchildrenPages.size()),
String.valueOf(permittedPageIds.size()),
String.valueOf(results.size()),
startTime
);
return results;
}
@Autowired
public void setSearchManager(SearchManager searchManager) {
this.searchManager = searchManager;
}
}