/* * Ivory: A Hadoop toolkit for web-scale information retrieval * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. */ package ivory.smrf.retrieval.distributed; import ivory.smrf.retrieval.Accumulator; import ivory.smrf.retrieval.QueryRunner; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; /** * @author Tamer Elsayed */ public class BrokerQueryRunner implements QueryRunner { private static final Logger sLogger = Logger.getLogger(BrokerQueryRunner.class); private Map<String, Accumulator[]> mQueryResults; private Map<String, Map<Integer, String>> mAllQueriesDocnoMapping; private String mBrokerAddress; private Map<Integer, String> mSingleQueryDocnoMapping; public BrokerQueryRunner(String brokerAddress) { mQueryResults = new HashMap<String, Accumulator[]>(); mAllQueriesDocnoMapping = new HashMap<String, Map<Integer, String>>(); this.mBrokerAddress = brokerAddress; } public void clearResults() { mQueryResults.clear(); } public Accumulator[] getResults(String qid) { return mQueryResults.get(qid); } public Map<String, Accumulator[]> getResults() { // TODO Auto-generated method stub return mQueryResults; } private static String join(String[] terms, String sep) { StringBuilder sb = new StringBuilder(); for ( int i=0; i<terms.length; i++ ) { sb.append(terms[i]); if ( i<terms.length-1) sb.append(sep); } return sb.toString(); } public Accumulator[] runQuery(String[] query) { Accumulator[] results = null; sLogger.info("Contacting broker for query: " + query); try { String url = "http://" + mBrokerAddress + RunRetrievalBroker.PlainTextQueryServlet.ACTION + "?" + RunRetrievalBroker.PlainTextQueryServlet.QUERY_FIELD + "=" + join(query, "+"); sLogger.info("fetching " + url); String textResults = HttpUtils.fetchURL(new URL(url)); // sLogger.info("Results\n"+textResults); HashMap<Integer, String> m = new HashMap<Integer, String>(); results = getAccumulator(textResults, m); this.mSingleQueryDocnoMapping = m; sLogger.info("Query done."); } catch (MalformedURLException e) { e.printStackTrace(); } return results; } private Accumulator[] getAccumulator(String textResults, Map<Integer, String> docnoMapping) { String[] lines = textResults.split("\n"); ArrayList<Accumulator> r = new ArrayList<Accumulator>(); for (int i = 0; i < lines.length; i++) { if (lines[i].trim().isEmpty()) { if (i != lines.length - 1 && i != 0) { sLogger.error("Empty line NOT at the beginning nor the end !!! at line: " + i); } continue; } String[] s = lines[i].split("\t"); r.add(new Accumulator(Integer.parseInt(s[0]), Float.parseFloat(s[1]))); docnoMapping.put(Integer.parseInt(s[0]), s[2]); } Accumulator[] results = new Accumulator[r.size()]; for (int i = 0; i < r.size(); i++) results[i] = r.get(i); return results; } public Map<Integer, String> getDocnoMapping(String qid) { return mAllQueriesDocnoMapping.get(qid); } public void runQuery(String qid, String[] query) { Accumulator[] results = runQuery(query); this.mQueryResults.put(qid, results); mAllQueriesDocnoMapping.put(qid, mSingleQueryDocnoMapping); } }