package de.ifgi.lod4wfs.infrastructure;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
import de.ifgi.lod4wfs.core.GlobalSettings;
import de.ifgi.lod4wfs.core.WFSFeature;
/**
* @author Jim Jones
*/
public class SOLRConnector {
static Logger logger = Logger.getLogger("SOLRConnector");
public SOLRConnector() {
super();
}
@SuppressWarnings("deprecation")
public SolrDocumentList executeQuery(WFSFeature feature){
HttpSolrServer solr = new HttpSolrServer(feature.getEndpoint());
SolrQuery query = new SolrQuery();
SolrDocumentList results = new SolrDocumentList();
try {
logger.info("Performing query for the SOLR Feature [" + feature.getName() + "]:" + GlobalSettings.getCrLf() + GlobalSettings.getCrLf() +
"Title: " + feature.getTitle() + GlobalSettings.getCrLf() +
"Endpoint: " + feature.getEndpoint() + GlobalSettings.getCrLf() +
"Spatial Constraint: \"" + feature.getSOLRGeometryField()+ ":" + feature.getSOLRSpatialConstraint() + "\"" + GlobalSettings.getCrLf() +
"Filter: " + feature.getSOLRFilter() + GlobalSettings.getCrLf() +
"Fields: " + feature.getFields() + GlobalSettings.getCrLf() +
"Sorting: " + feature.getSOLRSorting() + GlobalSettings.getCrLf() +
"Limit: " + feature.getLimit() + GlobalSettings.getCrLf()
);
query.setStart(0);
query.setRows(feature.getLimit());
if(!feature.getSOLRSpatialConstraint().trim().equals("*") || !feature.getSOLRGeometryField().trim().equals("*") ){
query.addFilterQuery(feature.getSOLRGeometryField()+ ":\"" + feature.getSOLRSpatialConstraint() + "\"");
}
if(!feature.getSOLRSorting().trim().equals("*")){
ORDER order = null;
boolean valid = true;
if(feature.getSOLRSorting().split(":")[1].toUpperCase().trim().equals("ASC")){
order = ORDER.asc;
} else if(feature.getSOLRSorting().split(":")[1].toUpperCase().trim().equals("DESC")){
order = ORDER.desc;
} else {
logger.error("Invalid sorting string. Expected \"asc\" or \"desc\", but \"" + feature.getSOLRSorting().split(":")[1] + "\" was given.");
valid = false;
}
if(valid){
query.setSortField(feature.getSOLRSorting().split(":")[0], order);
}
}
if(!feature.getSOLRFilter().equals("*")){
String[] filter = new String[feature.getSOLRFilter().split(",").length];
filter = feature.getSOLRFilter().split(",");
for (int i = 0; i < filter.length; i++) {
query.addFilterQuery(filter[i].trim());
}
}
if (!feature.getFields().equals("*")){
String[] fields = new String[feature.getFields().split(",").length];
fields = feature.getFields().split(",");
for (int i = 0; i < fields.length; i++) {
query.setQuery("*");
query.addField(fields[i].trim());
}
} else {
query.setQuery("*:*");
}
QueryResponse response = solr.query(query);
results = response.getResults();
} catch (SolrServerException e) {
e.printStackTrace();
}
return results;
}
}