return volume.getPath();
}
public Search searchMessage(Search search) throws MessageSearchException {
if (search==null)
throw new MessageSearchException("assertion failure: null search",logger);
if (search.getUserRole()==null || search.getUserName()==null)
throw new MessageSearchException("assertion failure: null userRole or userName",logger);
String queryStr = search.getSearchQuery();
Date sentAfter = search.getSentAfter();
Date sentBefore = search.getSentBefore();
if (sentAfter==null)
sentAfter = new Date(0);
if (sentBefore==null)
sentBefore = new Date();
if (queryStr.trim().compareTo("")==0)
queryStr += " sentdate:[d"+format.format(sentAfter) + " TO d" + format.format(sentBefore)+"]";
logger.debug("search {searchquery='"+queryStr+"'}");
ParallelMultiSearcher searcher = null;
ArchivaAnalyzer analyzer = new ArchivaAnalyzer();
Query query = null;
QueryFilter filter = null;
Query filterQuery = null;
try {
query = QueryParser.parse(queryStr,"body",analyzer);
//query = MultiFieldQueryParser.parse(queryStr,fields, analyzer);
//query = QueryParser.parse(queryStr,"body", analyzer);
if (search.getUserRole().compareToIgnoreCase("user")==0) {
filterQuery = QueryParser.parse("to:"+search.getUserName()+" from:"+search.getUserName(),"to",analyzer);
filter = new QueryFilter(filterQuery);
}
} catch (ParseException pe)
{
throw new MessageSearchException("failed to parse search query {searchquery='"+search.getSearchQuery()+"'}",pe,logger);
}
List volumes = Config.getConfig().getVolumes().getVolumes();
ArrayList searchers = new ArrayList();
Iterator vl = volumes.iterator();
while (vl.hasNext()) {
Volume volume = (Volume)vl.next();
if (volume.getModified()!=null && sentAfter.compareTo(volume.getModified())>0)
continue;
if (volume.getCreated()!=null && sentBefore.compareTo(volume.getCreated())<0)
continue;
try {
if (volume.getStatusID()==Volume.ACTIVE || volume.getStatusID()==Volume.CLOSED) {
Searcher volsearcher = new IndexSearcher(volume.getIndexPath());
searchers.add(volsearcher);
}
} catch (IOException io) {
logger.error("failed to open index for search {"+volume+"}.");
}
}
/*Searcher[] searchers = new Searcher[volumes.size()];
for (int j=0;j<volumes.size();j++) {
Volume volume = (Volume)volumes.get(j);
try {
searchers[j] = new IndexSearcher(volume.getIndexPath());
} catch (IOException io) {
throw new MessageSearchException("failed to open index for searching {"+volume+"}",logger);
}
}*/
Searcher[] searcherarraytype = new Searcher[searchers.size()];
Searcher[] allsearchers = (Searcher[])(searchers.toArray(searcherarraytype));
logger.debug("searching for email {query="+queryStr+"}");
try {
searcher = new ParallelMultiSearcher(allsearchers);
} catch (IOException io) {
throw new MessageSearchException("failed to open/create one or more index searchers",logger);
}
Hits hits = null;
try {
Sort sort;
String sortField = search.getSortField();
boolean sortOrder = search.getSortOrder();
if (sortField.compareToIgnoreCase("score")==0)
sort = new Sort(new SortField[]{SortField.FIELD_SCORE,new SortField("sentdate",false)});
else if (sortField.compareToIgnoreCase("sentdate")==0) {
sort = new Sort(new SortField(sortField,SortField.STRING,sortOrder));
} else
sort = new Sort(new SortField[]{new SortField(sortField,SortField.STRING,sortOrder),SortField.FIELD_SCORE,new SortField("sentdate",false)});
//logger.debug("executing search query {query='"+query+"',filter='"+filter+"',sort='"+sort+"'}");
hits = searcher.search(query,filter,sort);
logger.info("search executed successfully {query='"+query.toString()+"', nohits='"+hits.length()+"'}");
} catch (IOException io)
{
throw new MessageSearchException("failed to execute search query {searchquery='"+search.getSearchQuery()+"}",io,logger);
}
String messageUidDebugOutput = "search results returned following unique message ID's:";
long norecords = hits.length() > MAX_SEARCH_RESULTS ? MAX_SEARCH_RESULTS : hits.length();
for (int start = 0; start < norecords; start++)
{
Document doc = null;
try {
doc = hits.doc(start);
float score = hits.score(start);
search.addMessage(new LuceneEmailID(start,hits),score);
messageUidDebugOutput+=doc.get("uid")+",";
} catch (IOException io)
{
throw new MessageSearchException("failed to retrieve indexed value from search query {searchquery='"+search.getSearchQuery()+"'}",io,logger);
}
}
logger.debug(messageUidDebugOutput);
try {
searcher.close();
} catch (IOException io) {
throw new MessageSearchException("failed to close search indexes (opened for read)",io,logger);
}
return search;
}