/* * Copyright 2016-2017 Hewlett Packard Enterprise 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.core.savedsearches.query; import com.hp.autonomy.frontend.find.core.savedsearches.EmbeddableIndex; import com.hp.autonomy.frontend.find.core.savedsearches.FieldTextParser; import com.hp.autonomy.frontend.find.core.savedsearches.SavedSearchService; import com.hp.autonomy.searchcomponents.core.search.DocumentsService; import com.hp.autonomy.searchcomponents.core.search.QueryRequest; import com.hp.autonomy.searchcomponents.core.search.QueryRequestBuilder; import com.hp.autonomy.searchcomponents.core.search.QueryRestrictions; import com.hp.autonomy.searchcomponents.core.search.QueryRestrictionsBuilder; import com.hp.autonomy.searchcomponents.core.search.SearchResult; import com.hp.autonomy.types.requests.Documents; import org.apache.commons.collections4.CollectionUtils; import org.joda.time.DateTime; import org.springframework.beans.factory.ObjectFactory; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Set; @RequestMapping(SavedQueryController.PATH) public abstract class SavedQueryController<RQ extends QueryRequest<Q>, S extends Serializable, Q extends QueryRestrictions<S>, D extends SearchResult, E extends Exception> { static final String PATH = "/api/bi/saved-query"; static final String NEW_RESULTS_PATH = "/new-results/"; protected final SavedSearchService<SavedQuery, SavedQuery.Builder> service; private final DocumentsService<RQ, ?, ?, Q, D, E> documentsService; private final FieldTextParser fieldTextParser; private final ObjectFactory<? extends QueryRestrictionsBuilder<Q, S, ?>> queryRestrictionsBuilderFactory; private final ObjectFactory<? extends QueryRequestBuilder<RQ, Q, ?>> queryRequestBuilderFactory; protected SavedQueryController(final SavedSearchService<SavedQuery, SavedQuery.Builder> service, final DocumentsService<RQ, ?, ?, Q, D, E> documentsService, final FieldTextParser fieldTextParser, final ObjectFactory<? extends QueryRestrictionsBuilder<Q, S, ?>> queryRestrictionsBuilderFactory, final ObjectFactory<? extends QueryRequestBuilder<RQ, Q, ?>> queryRequestBuilderFactory) { this.service = service; this.documentsService = documentsService; this.fieldTextParser = fieldTextParser; this.queryRestrictionsBuilderFactory = queryRestrictionsBuilderFactory; this.queryRequestBuilderFactory = queryRequestBuilderFactory; } protected abstract S convertEmbeddableIndex(EmbeddableIndex embeddableIndex); protected abstract void addParams(QueryRequestBuilder<RQ, Q, ?> queryRequestBuilder); @RequestMapping(method = RequestMethod.GET) public Set<SavedQuery> getAll() { return service.getAll(); } @RequestMapping(method = RequestMethod.POST) public SavedQuery create( @RequestBody final SavedQuery query ) { return service.create(query); } @RequestMapping(value = "{id}", method = RequestMethod.PUT) public SavedQuery update( @PathVariable("id") final long id, @RequestBody final SavedQuery query ) { return service.update( new SavedQuery.Builder(query).setId(id).build() ); } @RequestMapping(value = "{id}", method = RequestMethod.DELETE) public void delete(@SuppressWarnings("MVCPathVariableInspection") @PathVariable("id") final long id) { service.deleteById(id); } @RequestMapping(value = NEW_RESULTS_PATH + "{id}", method = RequestMethod.GET) public int checkForNewQueryResults(@SuppressWarnings("MVCPathVariableInspection") @PathVariable("id") final long id) throws E { int newResults = 0; final SavedQuery savedQuery = service.get(id); final DateTime dateDocsLastFetched = savedQuery.getDateDocsLastFetched(); if(savedQuery.getMaxDate() == null || savedQuery.getMaxDate().isAfter(dateDocsLastFetched)) { final Q queryRestrictions = queryRestrictionsBuilderFactory.getObject() .queryText(savedQuery.toQueryText()) .fieldText(fieldTextParser.toFieldText(savedQuery)) .databases(convertEmbeddableIndexes(savedQuery.getIndexes())) .minDate(dateDocsLastFetched) .minScore(savedQuery.getMinScore()) .build(); final QueryRequestBuilder<RQ, Q, ?> queryRequestBuilder = queryRequestBuilderFactory.getObject() .queryRestrictions(queryRestrictions) .maxResults(1001) .queryType(QueryRequest.QueryType.MODIFIED); addParams(queryRequestBuilder); final RQ queryRequest = queryRequestBuilder.build(); final Documents<?> searchResults = documentsService.queryTextIndex(queryRequest); newResults = searchResults.getTotalResults(); } return newResults; } private Collection<S> convertEmbeddableIndexes(final Iterable<EmbeddableIndex> embeddableIndexes) { final Collection<S> indexes = new ArrayList<>(CollectionUtils.size(embeddableIndexes)); if(embeddableIndexes != null) { for(final EmbeddableIndex embeddableIndex : embeddableIndexes) { indexes.add(convertEmbeddableIndex(embeddableIndex)); } } return indexes; } }