/* * Copyright 2015 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.hod.search; import com.hp.autonomy.frontend.configuration.ConfigService; import com.hp.autonomy.frontend.find.core.web.FindCacheNames; import com.hp.autonomy.frontend.find.hod.configuration.HodFindConfig; import com.hp.autonomy.hod.caching.CachingConfiguration; import com.hp.autonomy.hod.client.api.resource.ResourceName; import com.hp.autonomy.hod.client.error.HodErrorCode; import com.hp.autonomy.hod.client.error.HodErrorException; import com.hp.autonomy.searchcomponents.core.search.QueryRestrictions; import com.hp.autonomy.searchcomponents.core.search.StateTokenAndResultCount; import com.hp.autonomy.searchcomponents.hod.databases.Database; import com.hp.autonomy.searchcomponents.hod.databases.HodDatabasesRequest; import com.hp.autonomy.searchcomponents.hod.databases.HodDatabasesRequestBuilder; import com.hp.autonomy.searchcomponents.hod.databases.HodDatabasesService; import com.hp.autonomy.searchcomponents.hod.search.*; import com.hp.autonomy.types.requests.Documents; import com.hp.autonomy.types.requests.Warnings; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; import java.util.*; @Primary @Service class FindHodDocumentService implements HodDocumentsService { private final HodDatabasesService databasesService; private final HodDocumentsService documentsService; private final ObjectFactory<HodDatabasesRequestBuilder> databasesRequestBuilderFactory; private final ConfigService<HodFindConfig> findConfigService; @Autowired public FindHodDocumentService( final HodDatabasesService databasesService, @Qualifier(DOCUMENTS_SERVICE_BEAN_NAME) final HodDocumentsService documentsService, final ObjectFactory<HodDatabasesRequestBuilder> databasesRequestBuilderFactory, final ConfigService<HodFindConfig> configService ) { this.databasesService = databasesService; this.documentsService = documentsService; this.databasesRequestBuilderFactory = databasesRequestBuilderFactory; findConfigService = configService; } @Override @Cacheable(value = FindCacheNames.DOCUMENTS, cacheResolver = CachingConfiguration.PER_USER_CACHE_RESOLVER_NAME) public Documents<HodSearchResult> queryTextIndex(final HodQueryRequest queryRequest) throws HodErrorException { try { return documentsService.queryTextIndex(queryRequest); } catch (final HodErrorException e) { if (e.getErrorCode() == HodErrorCode.INDEX_NAME_INVALID) { final Boolean publicIndexesEnabled = findConfigService.getConfig().getHod().getPublicIndexesEnabled(); final HodDatabasesRequest databasesRequest = databasesRequestBuilderFactory.getObject().publicIndexesEnabled(publicIndexesEnabled).build(); final Set<Database> updatedDatabases = databasesService.getDatabases(databasesRequest); final QueryRestrictions<ResourceName> queryRestrictions = queryRequest.getQueryRestrictions(); final Set<ResourceName> badIndexes = new HashSet<>(queryRestrictions.getDatabases()); for (final Database database : updatedDatabases) { final ResourceName resourceIdentifier = new ResourceName(database.getDomain(), database.getName()); badIndexes.remove(resourceIdentifier); } final Collection<ResourceName> goodIndexes = new ArrayList<>(queryRestrictions.getDatabases()); goodIndexes.removeAll(badIndexes); final HodQueryRequest queryRequestWithoutBadIndexes = queryRequest.toBuilder() .queryRestrictions(queryRequest.getQueryRestrictions() .toBuilder() .databases(goodIndexes) .build()) .build(); final Documents<HodSearchResult> resultDocuments = documentsService.queryTextIndex(queryRequestWithoutBadIndexes); final Warnings warnings = new Warnings(badIndexes); return new Documents<>( resultDocuments.getDocuments(), resultDocuments.getTotalResults(), resultDocuments.getExpandedQuery(), resultDocuments.getSuggestion(), resultDocuments.getAutoCorrection(), warnings); } else { throw e; } } } @Override @Cacheable(value = FindCacheNames.SIMILAR_DOCUMENTS, cacheResolver = CachingConfiguration.PER_USER_CACHE_RESOLVER_NAME) public Documents<HodSearchResult> findSimilar(final HodSuggestRequest suggestRequest) throws HodErrorException { return documentsService.findSimilar(suggestRequest); } @Override public List<HodSearchResult> getDocumentContent(final HodGetContentRequest getContentRequest) throws HodErrorException { return documentsService.getDocumentContent(getContentRequest); } @Override public String getStateToken(final HodQueryRestrictions queryRestrictions, final int maxResults, final boolean promotions) throws HodErrorException { return documentsService.getStateToken(queryRestrictions, maxResults, promotions); } @Override public StateTokenAndResultCount getStateTokenAndResultCount(final HodQueryRestrictions queryRestrictions, final int maxResults, final boolean promotions) throws HodErrorException { return documentsService.getStateTokenAndResultCount(queryRestrictions, maxResults, promotions); } }