/** * ResponseAccumulator * Copyright 2013 by Michael Peter Christen * First released 13.02.2013 at http://yacy.net * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program in the file lgpl21.txt * If not, see <http://www.gnu.org/licenses/>. */ package net.yacy.cora.federate.solr.instance; import java.util.Collection; import java.util.Map; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.SimpleOrderedMap; public class ResponseAccumulator { final SimpleOrderedMap<Object> fieldsAcc; final SimpleOrderedMap<Object> index_countsAcc; final SimpleOrderedMap<Object> facet_countsAcc; final SimpleOrderedMap<Object> highlightingAcc; final SimpleOrderedMap<Object> headerAcc; final SolrDocumentList resultsAcc; public ResponseAccumulator() { this.fieldsAcc = new SimpleOrderedMap<Object>(); this.index_countsAcc = new SimpleOrderedMap<Object>(); this.facet_countsAcc = new SimpleOrderedMap<Object>(); this.highlightingAcc = new SimpleOrderedMap<Object>(); this.headerAcc = new SimpleOrderedMap<Object>(); this.resultsAcc = new SolrDocumentList(); } public void addResponse(NamedList<Object> response) { // set the header; this is mostly always the same (well this is not evaluated much) @SuppressWarnings("unchecked") SimpleOrderedMap<Object> header = (SimpleOrderedMap<Object>) response.get("responseHeader"); //Integer status = (Integer) header.get("status"); //Integer QTime = (Integer) header.get("QTime"); //SimpleOrderedMap<Object> params = (SimpleOrderedMap<Object>) header.get("params"); if (headerAcc.size() == 0) { for (Map.Entry<String, Object> e: header) headerAcc.add(e.getKey(), e.getValue()); } // accumulate the results SolrDocumentList results = (SolrDocumentList) response.get("response"); if (results != null) { long found = results.size(); for (int i = 0; i < found; i++) resultsAcc.add(results.get(i)); resultsAcc.setNumFound(resultsAcc.getNumFound() + results.getNumFound()); resultsAcc.setMaxScore(Math.max(resultsAcc.getMaxScore() == null ? 0f : resultsAcc.getMaxScore().floatValue(), results.getMaxScore() == null ? 0f : results.getMaxScore().floatValue())); } // accumulate the highlighting @SuppressWarnings("unchecked") SimpleOrderedMap<Object> highlighting = (SimpleOrderedMap<Object>) response.get("highlighting"); if (highlighting != null) { for (Map.Entry<String, Object> e: highlighting) highlightingAcc.add(e.getKey(), e.getValue()); } // accumulate the facets (well this is not correct at this time...) @SuppressWarnings("unchecked") SimpleOrderedMap<Object> facet_counts = (SimpleOrderedMap<Object>) response.get("facet_counts"); if (facet_counts != null) { for (Map.Entry<String, Object> e: facet_counts) facet_countsAcc.add(e.getKey(), e.getValue()); } // accumulate the index @SuppressWarnings("unchecked") SimpleOrderedMap<Object> index_counts = (SimpleOrderedMap<Object>) response.get("index"); if (index_counts != null) { for (Map.Entry<String, Object> e: index_counts) index_countsAcc.add(e.getKey(), e.getValue()); } // accumulate the fields @SuppressWarnings("unchecked") SimpleOrderedMap<Object> schema = (SimpleOrderedMap<Object>) response.get("schema"); if (schema != null) { @SuppressWarnings("unchecked") SimpleOrderedMap<Object> fields = (SimpleOrderedMap<Object>) schema.get("fields"); if (fields != null) { for (Map.Entry<String, Object> e: fields) fieldsAcc.add(e.getKey(), e.getValue()); } } @SuppressWarnings("unchecked") SimpleOrderedMap<Object> fields = (SimpleOrderedMap<Object>) response.get("fields"); if (fields != null) { for (Map.Entry<String, Object> e: fields) fieldsAcc.add(e.getKey(), e.getValue()); } } public NamedList<Object> getAccumulatedResponse() { // prepare combined response NamedList<Object> responsesAcc = new NamedList<Object>(); responsesAcc.add("responseHeader", headerAcc); responsesAcc.add("response", resultsAcc); if (highlightingAcc != null && highlightingAcc.size() > 0) responsesAcc.add("highlighting", highlightingAcc); if (facet_countsAcc != null && facet_countsAcc.size() > 0) responsesAcc.add("facet_counts", facet_countsAcc); if (index_countsAcc != null && index_countsAcc.size() > 0) responsesAcc.add("index", index_countsAcc); if (fieldsAcc != null && fieldsAcc.size() > 0) responsesAcc.add("fields", fieldsAcc); return responsesAcc; } public static QueryResponse combineResponses(Collection<QueryResponse> qrl) { ResponseAccumulator acc = new ResponseAccumulator(); for (final QueryResponse rsp: qrl) { NamedList<Object> response = rsp.getResponse(); acc.addResponse(response); } // prepare combined response QueryResponse rspAcc = new QueryResponse(); rspAcc.setResponse(acc.getAccumulatedResponse()); return rspAcc; } }