package org.ariadne_eu.metadata.query; import java.io.File; import net.sourceforge.minor.lucene.core.searcher.IndexSearchDelegate; import net.sourceforge.minor.lucene.core.searcher.MemoryReaderManagement; import org.apache.log4j.Logger; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.TopDocs; import org.ariadne_eu.metadata.query.language.QueryTranslationException; import org.ariadne_eu.metadata.query.language.TranslateLanguage; import org.ariadne_eu.metadata.resultsformat.ResultDelegateARIADNERFJS; import org.ariadne_eu.metadata.resultsformat.ResultDelegateICOPERCompactJS; import org.ariadne_eu.metadata.resultsformat.ResultDelegateICOPERJS; import org.ariadne_eu.metadata.resultsformat.ResultDelegateICOPERLODCompactJS; import org.ariadne_eu.metadata.resultsformat.ResultDelegateLomImpl; import org.ariadne_eu.metadata.resultsformat.ResultDelegateMACEEnrichedLomImpl; import org.ariadne_eu.metadata.resultsformat.ResultDelegateRFMCoAffilList; import org.ariadne_eu.metadata.resultsformat.ResultDelegateRFMList; import org.ariadne_eu.metadata.resultsformat.ResultDelegateRFMEntity; import org.ariadne_eu.metadata.resultsformat.ResultDelegatePlrfImpl; import org.ariadne_eu.metadata.resultsformat.ResultDelegateRLomImpl; import org.ariadne_eu.metadata.resultsformat.ResultDelegateSolrImpl; import org.ariadne_eu.metadata.resultsformat.TranslateResultsformat; import org.ariadne_eu.utils.config.RepositoryConstants; import org.ariadne_eu.utils.lucene.analysis.DocumentAnalyzer; import org.ariadne_eu.utils.lucene.analysis.DocumentAnalyzerFactory; public class QueryMetadataLuceneMImpl extends QueryMetadataImpl { private static Logger log = Logger.getLogger(QueryMetadataLuceneMImpl.class); private File indexDir; private IndexSearcher searcher; void initialize() { super.initialize(); } public synchronized String xQuery(String xQuery) throws QueryMetadataException { throw new QueryMetadataException(new Exception("Not supported query language")); } public synchronized String query(String query, int start, int max, int resultsFormat) throws QueryTranslationException, QueryMetadataException { String lQuery = TranslateLanguage.translateToQuery(query, getLanguage(), TranslateLanguage.LUCENE, start, max, resultsFormat); return luceneQuery(lQuery, start, max, resultsFormat); } public synchronized int count(String query) throws QueryTranslationException, QueryMetadataException { String lQuery = TranslateLanguage.translateToCount(query, getLanguage(), TranslateLanguage.LUCENE); return luceneCount(lQuery, 1); } private synchronized String luceneQuery(String lQuery, int start, int max, int resultsFormat) { try { int n = start + max - 1; TopDocs topDocs = null; IndexSearchDelegate result = null; if (resultsFormat == TranslateResultsformat.LOM) { result = new ResultDelegateLomImpl(start, max); }else if (resultsFormat == TranslateResultsformat.RLOM) { result = new ResultDelegateRLomImpl(start, max); } else if (resultsFormat == TranslateResultsformat.PLRF0 || resultsFormat == TranslateResultsformat.PLRF1 || resultsFormat == TranslateResultsformat.PLRF2 || resultsFormat == TranslateResultsformat.PLRF3) { result = new ResultDelegatePlrfImpl(start, max); } else if (resultsFormat == TranslateResultsformat.SOLR) { result = new ResultDelegateSolrImpl(start,max,lQuery); } else if (resultsFormat == TranslateResultsformat.MELOM) { result = new ResultDelegateMACEEnrichedLomImpl(start,max); } else if (resultsFormat == TranslateResultsformat.ATOM_LOM) { result = new ResultDelegateLomImpl(start, max); } else if (resultsFormat == TranslateResultsformat.ICJS) { result = new ResultDelegateICOPERCompactJS(start,max); } else if (resultsFormat == TranslateResultsformat.ILCJS) { result = new ResultDelegateICOPERLODCompactJS(start,max); } else if (resultsFormat == TranslateResultsformat.IJS) { result = new ResultDelegateICOPERJS(start,max); } else if (resultsFormat == TranslateResultsformat.ARFJS) { result = new ResultDelegateARIADNERFJS(start,max,lQuery); } else if (resultsFormat == TranslateResultsformat.RFME) { result = new ResultDelegateRFMEntity(start,max); } else if (resultsFormat == TranslateResultsformat.RFML) { result = new ResultDelegateRFMList(start,max); } else if (resultsFormat == TranslateResultsformat.RFMCOAFFILL) { result = new ResultDelegateRFMCoAffilList(start,max); } else { //for the VsqlToLucene Implementation, when there is no resultformat defined!! result = new ResultDelegateLomImpl(start, max); } if (resultsFormat == TranslateResultsformat.SOLR || resultsFormat == TranslateResultsformat.ARFJS) { topDocs = null; } else { topDocs = getDocs(lQuery, n); } String searchResult = result.result(topDocs, searcher); return searchResult; } catch (Exception e) { log.error("Lucene query exception",e); return null; } } private synchronized int luceneCount(String lQuery, int n) { try { searcher = MemoryReaderManagement.getInstance().getSearcher(); return getDocs(lQuery, n).totalHits; } catch (Exception e) { log.error("Lucene query exception",e); return -1; } } private synchronized TopDocs getDocs(String lQuery, int n) { try { searcher = MemoryReaderManagement.getInstance().getSearcher(); //XXX Note that QueryParser is not thread-safe. DocumentAnalyzer analyzer = DocumentAnalyzerFactory.getDocumentAnalyzerImpl(); org.apache.lucene.search.Query query = new QueryParser(RepositoryConstants.getInstance().SR_LUCENE_VERSION,"contents", analyzer.getAnalyzer()).parse(lQuery); return searcher.search(query, n); } catch (ParseException e) { log.error("Lucene parse exception",e); } catch (Exception e) { log.error("Lucene query exception",e); } return null; } }