package org.nextprot.api.web.service.impl; import com.google.common.base.Joiner; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nextprot.api.commons.utils.StringUtils; import org.nextprot.api.rdf.service.SparqlEndpoint; import org.nextprot.api.rdf.service.SparqlService; import org.nextprot.api.solr.Query; import org.nextprot.api.solr.QueryRequest; import org.nextprot.api.solr.SolrService; import org.nextprot.api.user.domain.UserProteinList; import org.nextprot.api.user.domain.UserQuery; import org.nextprot.api.user.service.UserProteinListService; import org.nextprot.api.user.service.UserQueryService; import org.nextprot.api.web.service.QueryBuilderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashSet; import java.util.Set; /** * * Service that builds a nextprot query from a query request (http request) * * @author dteixeira * */ @Service public class QueryBuilderServiceImpl implements QueryBuilderService { @Autowired private SolrService queryService; @Autowired private SparqlService sparqlService; @Autowired private SparqlEndpoint sparqlEndpoint; @Autowired private UserQueryService userQueryService; @Autowired private UserProteinListService proteinListService; private static final Log Logger = LogFactory.getLog(QueryBuilderServiceImpl.class); @Override public Query buildQueryForSearch(QueryRequest queryRequest, String indexName) { Logger.debug(queryRequest.toPrettyString()); if (queryRequest.hasList()) { Logger.debug("queryRequest.hasList()"); UserProteinList proteinList = null; if(StringUtils.isWholeNumber(queryRequest.getListId())){ //Private id is used proteinList = this.proteinListService.getUserProteinListById(Long.valueOf(queryRequest.getListId())); } else { //public id is used proteinList = this.proteinListService.getUserProteinListByPublicId(queryRequest.getListId()); } Set<String> accessions = proteinList.getAccessionNumbers(); String queryString = "id:" + (accessions.size() > 1 ? "(" + Joiner.on(" ").join(accessions) + ")" : accessions.iterator().next()); queryRequest.setQuery(queryString); return queryService.buildQueryForSearchIndexes(indexName, "pl_search", queryRequest); } else if (queryRequest.hasNextProtQuery()) { Logger.debug("queryRequest.hasNextProtQuery()"); UserQuery uq = null; //TODO i don t think this is used anymore, checkout the logs if(StringUtils.isWholeNumber(queryRequest.getQueryId())){ //Private id is used Logger.fatal("Yes I am beeing used!!!"); uq = userQueryService.getUserQueryById(Long.valueOf(queryRequest.getQueryId())); }else { //public id is used uq = userQueryService.getUserQueryByPublicId(queryRequest.getQueryId()); } Set<String> accessions = new HashSet<String>(sparqlService.findEntries(uq.getSparql(), sparqlEndpoint.getUrl(), queryRequest.getSparqlTitle())); // In case there is no result if (accessions.isEmpty()) { // There is no entry with NULL value, so the result will be // empty, but the result structure will be maintaned (could be // replace by SearchResult factory where you create an emptry // result) accessions.add("NULL"); } String queryString = "id:" + (accessions.size() > 1 ? "(" + Joiner.on(" ").join(accessions) + ")" : accessions.iterator().next()); queryRequest.setQuery(queryString); return queryService.buildQueryForSearchIndexes(indexName, "pl_search", queryRequest); } else if (queryRequest.hasSparql()) { Logger.debug("queryRequest.hasSparql()"); Set<String> accessions = new HashSet<String>(sparqlService.findEntries(queryRequest.getSparql(), sparqlEndpoint.getUrl(), queryRequest.getSparqlTitle())); // In case there is no result if (accessions.isEmpty()) { // There is no entry with NULL value, so the result will be // empty, but the result structure will be maintaned (could be // replace by SearchResult factory where you create an emptry // result) accessions.add("NULL"); } String queryString = "id:" + (accessions.size() > 1 ? "(" + Joiner.on(" ").join(accessions) + ")" : accessions.iterator().next()); queryRequest.setQuery(queryString); return queryService.buildQueryForSearchIndexes(indexName, "pl_search", queryRequest); } else { Logger.debug("queryRequest.default for simple search"); return queryService.buildQueryForSearchIndexes(indexName, "simple", queryRequest); } } @Override public Query buildQueryForProteinLists(String indexName, String queryString, String quality, String sort, String order, String start, String rows, String filter) { return queryService.buildQueryForProteinLists(indexName, queryString, quality, sort, order, start, rows, filter); } @Override public Query buildQueryForSearchIndexes(String indexName, String configurationName, QueryRequest request) { return queryService.buildQueryForSearchIndexes(indexName, configurationName, request); } @Override public Query buildQueryForAutocomplete(String indexName, String queryString, String quality, String sort, String order, String start, String rows, String filter) { return queryService.buildQueryForAutocomplete(indexName, queryString, quality, sort, order, start, rows, filter); } }