/*
* Copyright 2016 Hewlett-Packard Development Company, L.P.
* Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License.
*/
package com.hp.autonomy.frontend.find.idol.comparison;
import com.autonomy.aci.client.services.AciErrorException;
import com.hp.autonomy.frontend.find.core.search.DocumentsController;
import com.hp.autonomy.searchcomponents.core.search.QueryRequest;
import com.hp.autonomy.searchcomponents.idol.annotations.IdolService;
import com.hp.autonomy.searchcomponents.idol.search.IdolDocumentsService;
import com.hp.autonomy.searchcomponents.idol.search.IdolQueryRequest;
import com.hp.autonomy.searchcomponents.idol.search.IdolQueryRequestBuilder;
import com.hp.autonomy.searchcomponents.idol.search.IdolQueryRestrictions;
import com.hp.autonomy.searchcomponents.idol.search.IdolQueryRestrictionsBuilder;
import com.hp.autonomy.searchcomponents.idol.search.IdolSearchResult;
import com.hp.autonomy.types.requests.Documents;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service
@IdolService
public class ComparisonServiceImpl implements ComparisonService<IdolSearchResult, AciErrorException> {
private final IdolDocumentsService documentsService;
private final ObjectFactory<IdolQueryRestrictionsBuilder> queryRestrictionsBuilderFactory;
private final ObjectFactory<IdolQueryRequestBuilder> queryRequestBuilderFactory;
@Autowired
public ComparisonServiceImpl(
final IdolDocumentsService documentsService,
final ObjectFactory<IdolQueryRestrictionsBuilder> queryRestrictionsBuilderFactory,
final ObjectFactory<IdolQueryRequestBuilder> queryRequestBuilderFactory
) {
this.documentsService = documentsService;
this.queryRestrictionsBuilderFactory = queryRestrictionsBuilderFactory;
this.queryRequestBuilderFactory = queryRequestBuilderFactory;
}
private Documents<IdolSearchResult> getEmptyResults() {
return new Documents<>(Collections.emptyList(), 0, "", null, null, null);
}
private String generateDifferenceStateToken(final String firstQueryStateToken, final String secondQueryStateToken) throws AciErrorException {
final IdolQueryRestrictions queryRestrictions = queryRestrictionsBuilderFactory.getObject()
.queryText("*")
.fieldText("")
.minScore(0)
.stateMatchId(firstQueryStateToken)
.stateDontMatchId(secondQueryStateToken)
.build();
return documentsService.getStateToken(queryRestrictions, ComparisonController.STATE_TOKEN_MAX_RESULTS, false);
}
@Override
public Documents<IdolSearchResult> getResults(
final List<String> stateMatchIds,
final List<String> stateDontMatchIds,
final String text,
final String fieldText,
final int resultsStart,
final int maxResults,
final String summary,
final String sort,
final boolean highlight
) throws AciErrorException {
if (stateMatchIds.isEmpty()) {
return getEmptyResults();
}
final IdolQueryRestrictions queryRestrictions = queryRestrictionsBuilderFactory.getObject()
.queryText(text)
.fieldText(fieldText)
.minScore(0)
.stateMatchIds(stateMatchIds)
.stateDontMatchIds(stateDontMatchIds)
.build();
final IdolQueryRequest queryRequest = queryRequestBuilderFactory.getObject()
.queryRestrictions(queryRestrictions)
.start(resultsStart)
.maxResults(maxResults)
.summary(summary)
.summaryCharacters(DocumentsController.MAX_SUMMARY_CHARACTERS)
.sort(sort)
.highlight(highlight)
.autoCorrect(false)
.queryType(QueryRequest.QueryType.RAW)
.build();
return documentsService.queryTextIndex(queryRequest);
}
@Override
public ComparisonStateTokens getCompareStateTokens(final String firstStateToken, final String secondStateToken) throws AciErrorException {
// First generate the relative complement state tokens, i.e. A \ B and B \ A
// - where A is the set of documents in our "firstStateToken" and B is the set of
// documents in our "secondStateToken".
final String docsInFirstStateToken = generateDifferenceStateToken(firstStateToken, secondStateToken);
final String docsInSecondStateToken = generateDifferenceStateToken(secondStateToken, firstStateToken);
final ComparisonStateTokens stateTokens = new ComparisonStateTokens();
stateTokens.setFirstQueryStateToken(firstStateToken);
stateTokens.setSecondQueryStateToken(secondStateToken);
stateTokens.setDocumentsOnlyInFirstStateToken(docsInFirstStateToken);
stateTokens.setDocumentsOnlyInSecondStateToken(docsInSecondStateToken);
return stateTokens;
}
}