package org.ariadne_eu.metadata.resultsformat;
import net.sourceforge.minor.lucene.core.searcher.IndexSearchDelegate;
import org.apache.log4j.Logger;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import com.sun.corba.se.spi.orbutil.fsm.Guard.Result;
public class ResultDelegateRFMList implements IndexSearchDelegate {
private static Logger log = Logger.getLogger(ResultDelegateRFMList.class);
private int start;
private int max;
public ResultDelegateRFMList(int start, int max) {
this.start = start;
this.max = max;
}
public String result(TopDocs topDocs, IndexSearcher searcher) throws Exception {
Document doc;
JSONObject resultJSON = new JSONObject();
JSONArray resultsJSON = new JSONArray();
ScoreDoc[] hits = topDocs.scoreDocs;
resultJSON.put("total_results", topDocs.totalHits);
resultJSON.put("total_pages", Math.ceil(Double.valueOf(Integer.toString(topDocs.totalHits)) / max));
resultJSON.put("current_page", (start-1) / max + 1 );
resultJSON.put("items_per_page", max);
for (int i = start-1; i < topDocs.totalHits && (max < 0 || i < start-1+max); i++) {
doc = searcher.doc(hits[i].doc);
try {
JSONObject result = new JSONObject();
JSONArray authorsJSON = new JSONArray();
if (doc.get("rdf.person.about") != null) {
result.put("rdf.person.about", doc.get("rdf.person.about"));
result.put("rdf.person.name", doc.get("rdf.person.name"));
resultsJSON.put(result);
} else if (doc.get("rdf.publication.about") != null) {
result.put("rdf.publication.about", doc.get("rdf.publication.about"));
result.put("rdf.publication.title", doc.get("rdf.publication.title"));
result.put("rdf.publication.year", doc.get("rdf.publication.year"));
Field[] authors = doc.getFields("rdf.publication.author.person.about");
for (int j = 0; j < authors.length; j++) {
JSONObject authorJSON = new JSONObject();
Field author = authors[j];
authorJSON.put("rdf.person.about", author.stringValue());
authorsJSON.put(authorJSON);
}
result.put("rdf.publication.author", authorsJSON);
resultsJSON.put(result);
} else if (doc.get("rdf.organization.about") != null) {
result.put("rdf.organization.about", doc.get("rdf.organization.about"));
result.put("rdf.organization.fn", doc.get("rdf.organization.fn"));
resultsJSON.put(result);
}
} catch (JSONException e) {
log.debug("result :: id=" + doc.get("key"), e);
log.error(e);
}
log.debug(doc.get("key") + " = " + hits[i].score);
}
resultJSON.put("documents", resultsJSON);
return resultJSON.toString();
}
}