All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.servicerocket.confluence.randombits.supplier.confluence.content.PageGrandchildrenSupplierSearch Maven / Gradle / Ivy

There is a newer version: 2.5.12
Show newest version
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;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy