/** * */ package org.ariadne_eu.metadata.query.language; import java.io.IOException; import java.io.StringReader; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import org.apache.log4j.Logger; import org.apache.xpath.XPathAPI; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; /** * @author gonzalo * */ public class Vsql_LuceneHandler extends Translate { private static Logger log = Logger.getLogger(Vsql_LuceneHandler.class); public Vsql_LuceneHandler(int startQueryLanguage, int endQueryLanguage) { super(startQueryLanguage, endQueryLanguage); } public String translateToQuery(String query, int startResult, int nbResults, int resultsFormat) throws QueryTranslationException { if (getStartQueryLanguage() != TranslateLanguage.VSQL && getEndQueryLanguage() != TranslateLanguage.LUCENE) throw new QueryTranslationException(); try { return vsqlToLucene(query); } catch (RuntimeException e) { log.error(e); return null; } } public String translateToCount(String query) throws QueryTranslationException { return translateToQuery(query, -1, -1, -1); } private String vsqlToLucene(String query) { try { InputSource input = new InputSource(new StringReader(query)); Node queryNode = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(input).getFirstChild(); NodeList nl = XPathAPI.selectNodeList(queryNode, "term/text()"); String lquery = ""; for (int i = 0; i < nl.getLength(); i++) { String term =nl.item(i).getNodeValue(); if (i == 0) lquery += term ; else lquery += " AND " + term; } log.debug("vsqlToLucene:translated \"" + query + "\" to \"" + lquery + "\""); return lquery; } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } return null; } }