package org.ariadne_eu.utils.registry.query;
import java.io.File;
import java.io.IOException;
import java.rmi.RemoteException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.apache.axis2.AxisFault;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.RangeQuery;
import org.apache.lucene.store.FSDirectory;
import org.ariadne.config.PropertiesManager;
import org.ariadne_eu.utils.config.RepositoryConstants;
import org.ariadne_eu.utils.lucene.analysis.DocumentAnalyzer;
import org.ariadne_eu.utils.lucene.analysis.DocumentAnalyzerFactory;
import be.cenorm.www.CreateAnonymousSession;
import be.cenorm.www.CreateAnonymousSessionResponse;
import be.cenorm.www.GetTotalResultsCount;
import be.cenorm.www.GetTotalResultsCountResponse;
import be.cenorm.www.SetQueryLanguage;
import be.cenorm.www.SetResultsFormat;
import be.cenorm.www.SetResultsSetSize;
import be.cenorm.www.SqiSessionManagementStub;
import be.cenorm.www.SqiTargetStub;
import be.cenorm.www.SynchronousQuery;
import be.cenorm.www.SynchronousQueryResponse;
import be.cenorm.www._SQIFaultException;
public class Query {
private static SqiSessionManagementStub sqiSessionStub;
private static SqiTargetStub sqiStub;
public static String createAnonymousSession(String target){
try {
sqiSessionStub = new SqiSessionManagementStub(target);
CreateAnonymousSession createASession = new CreateAnonymousSession();
CreateAnonymousSessionResponse sessionResponse = sqiSessionStub.createAnonymousSession(createASession);
String sessionId = sessionResponse.getCreateAnonymousSessionReturn();
return sessionId;
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
return null;
}
}
public static void setQueryLanguage(String sessionId, String language) throws RemoteException, _SQIFaultException {
SetQueryLanguage queryLanguage = new SetQueryLanguage();
queryLanguage.setQueryLanguageID(language);
queryLanguage.setTargetSessionID(sessionId);
sqiStub.setQueryLanguage(queryLanguage);
}
public static void setResultSetSize(String sessionId, int resultSize) throws RemoteException, _SQIFaultException {
SetResultsSetSize resultsSetSize = new SetResultsSetSize();
resultsSetSize.setResultsSetSize(resultSize);
resultsSetSize.setTargetSessionID(sessionId);
sqiStub.setResultsSetSize(resultsSetSize);
}
public static void setResultSetFormat(String sessionId, String format) throws RemoteException, _SQIFaultException {
SetResultsFormat resultsSetFormat = new SetResultsFormat();
resultsSetFormat.setResultsFormat(format);
resultsSetFormat.setTargetSessionID(sessionId);
sqiStub.setResultsFormat(resultsSetFormat);
}
public static String query(String sessionId, String query, int startResult) throws RemoteException, _SQIFaultException {
SynchronousQuery syncQuery = new SynchronousQuery();
syncQuery.setQueryStatement(query);
syncQuery.setStartResult(startResult);
syncQuery.setTargetSessionID(sessionId);
SynchronousQueryResponse result = sqiStub.synchronousQuery(syncQuery);
String synchronousQueryReturn = result.getSynchronousQueryReturn();
return synchronousQueryReturn;
}
public static int countResults(String sessionId, String query) throws RemoteException, _SQIFaultException {
GetTotalResultsCount getTotalResultsCount = new GetTotalResultsCount();
getTotalResultsCount.setQueryStatement(query);
getTotalResultsCount.setTargetSessionID(sessionId);
GetTotalResultsCountResponse countResponse = sqiStub.getTotalResultsCount(getTotalResultsCount);
return countResponse.getGetTotalResultsCountReturn();
}
public static String doQuery(String query, String axis2_url_default, int resultSize){
try {
String sessionId, format, language;
int startResult;
String axis2_url = PropertiesManager.getInstance().getProperty("axis2.url");
if (axis2_url == null) axis2_url = axis2_url_default;
//axis2_url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/services";
sessionId = createAnonymousSession(axis2_url + "/services/SqiSessionManagement");
sqiStub = new SqiTargetStub(axis2_url + "/services/SqiTarget");
//Set the Query language
language = "plql1";
setQueryLanguage(sessionId, language);
setResultSetSize(sessionId, resultSize);
format = "lom";
setResultSetFormat(sessionId, format);
//Do the query
startResult = 1;
String result = query(sessionId, query, startResult);
return result;
} catch (AxisFault e) {
return null;
} catch (RemoteException e) {
return null;
} catch (_SQIFaultException e) {
// TODO Auto-generated catch block
return null;
}
}
public static String doQueryLucene(){
org.apache.lucene.document.Document doc;
try {
IndexReader reader = IndexReader.open(FSDirectory.open(new File(PropertiesManager.getInstance().getProperty("search.lucene.indexdir"))));
IndexSearcher is = new IndexSearcher(reader);
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
Calendar now = Calendar.getInstance();
Calendar thePreviousWeekCalendar = (Calendar) now.clone();
thePreviousWeekCalendar.add(Calendar.DAY_OF_YEAR, -20);
RangeQuery query = new RangeQuery(new Term("date.insert", format.format(thePreviousWeekCalendar.getTime())), new Term("date.insert",format.format(now.getTime())), true);
Hits hits;
hits = is.search(query);
StringBuilder sBuild = new StringBuilder();
sBuild.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<results cardinality=\""+hits.length()+"\">\n");
for (int i = 0; i < hits.length() ; i++) {
doc = hits.doc(i);
sBuild.append(doc.get("md"));
}
sBuild.append("</results>");
return sBuild.toString();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
return null;
}
}
public static String doQueryLuceneDate(String lQuery){
org.apache.lucene.document.Document doc;
try {
IndexReader reader = IndexReader.open(FSDirectory.open(new File(PropertiesManager.getInstance().getProperty("search.lucene.indexdir"))));
IndexSearcher is = new IndexSearcher(reader);
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
/*Calendar now = Calendar.getInstance();
Calendar thePreviousWeekCalendar = (Calendar) now.clone();
thePreviousWeekCalendar.add(Calendar.DAY_OF_YEAR, -20);*/
//RangeQuery query = new RangeQuery(new Term("date.insert", format.format(thePreviousWeekCalendar.getTime())), new Term("date.insert",format.format(now.getTime())), true);
DocumentAnalyzer analyzer = DocumentAnalyzerFactory.getDocumentAnalyzerImpl();
org.apache.lucene.search.Query query = new QueryParser(RepositoryConstants.getInstance().SR_LUCENE_VERSION,"key", analyzer.getAnalyzer()).parse(lQuery);
Hits hits;
hits = is.search(query);
StringBuilder sBuild = new StringBuilder();
for (int i = 0; i < hits.length() ; i++) {
doc = hits.doc(i);
sBuild.append(doc.get("date.insert"));
}
return sBuild.toString();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
return null;
} catch (org.apache.lucene.queryParser.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public static void main(String[] args){
doQueryLucene();
}
}