package esl.cuenet.source.accessors;
import com.hp.hpl.jena.ontology.Individual;
import com.hp.hpl.jena.ontology.OntModel;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.util.JSON;
import esl.cuenet.query.IResultIterator;
import esl.cuenet.query.IResultSet;
import esl.cuenet.query.ResultIterator;
import esl.cuenet.query.drivers.mongodb.MongoDB;
import esl.cuenet.source.AccesorInitializationException;
import esl.cuenet.source.Attribute;
import esl.cuenet.source.IAccessor;
import esl.cuenet.source.SourceQueryException;
import esl.datastructures.Location;
import esl.datastructures.TimeInterval;
import java.util.List;
public class LocalSimpleGeoPlaceDB extends MongoDB implements IAccessor {
private Attribute[] attributes;
private boolean[] setFlags = new boolean[3];
private Double lat, lon;
private String address;
private OntModel model = null;
public LocalSimpleGeoPlaceDB() {
super(AccessorConstants.DBNAME);
}
public LocalSimpleGeoPlaceDB(OntModel model) {
this();
this.model = model;
}
@Override
public void open(String databaseName) {
openDB("128.195.52.175", databaseName);
}
public BasicDBList nearbyPlaces() {
DBReader cursor = startReader("places");
cursor.query(new BasicDBObject());
double rad = 0.002;
BasicDBObject queryObject = (BasicDBObject) JSON.parse("{\"geometry.coordinates\": {\"$within\": {\"$center\": [[" +
+lon + ", " + lat + "], " + rad + "]}}}");
cursor.query(queryObject);
BasicDBList places = new BasicDBList();
int i = 0;
while (cursor.hasNext()) {
BasicDBObject record = (BasicDBObject) cursor.next();
BasicDBObject props = (BasicDBObject) record.get("properties");
BasicDBObject p = new BasicDBObject();
p.put("name", props.getString("name"));
BasicDBList classifiers = (BasicDBList) props.get("classifiers");
if (classifiers != null &&
classifiers.size() > 0 &&
classifiers.get(0) != null &&
((BasicDBObject)classifiers.get(0)).getString("category") != null) {
p.put("category", ((BasicDBObject)classifiers.get(0)).getString("category"));
}
places.add(p);
i++;
}
return places;
}
@Override
public void setAttributeNames(Attribute[] attributes) throws AccesorInitializationException {
if (attributes.length != 3) throw
new AccesorInitializationException("Invalid number of attributes for "
+ YahooPlaceFinderAPI.class.getName());
this.attributes = attributes;
}
@Override
public void start() {
for (int i=0; i<setFlags.length; i++) setFlags[i] = false;
}
@Override
public void associateTimeInterval(Attribute attribute, TimeInterval timeInterval) throws AccesorInitializationException {
throw new AccesorInitializationException("Incorrect Assignment: No time interval attributes in "
+ YahooPlaceFinderAPI.class.getName());
}
@Override
public void associateLocation(Attribute attribute, Location timeInterval) throws AccesorInitializationException {
throw new AccesorInitializationException("Incorrect Assignment: No location attributes in "
+ YahooPlaceFinderAPI.class.getName());
}
@Override
public void associateLong(Attribute attribute, long value) throws AccesorInitializationException {
throw new AccesorInitializationException("Incorrect Assignment: No integer attributes in "
+ LocalSimpleGeoPlaceDB.class.getName());
}
@Override
public void associateString(Attribute attribute, String value) throws AccesorInitializationException {
if (attribute.compareTo(attributes[2]) == 0) {
address = value;
setFlags[2] = true;
}
throw new AccesorInitializationException("Incorrect Assignment: No string attributes in "
+ LocalSimpleGeoPlaceDB.class.getName());
}
@Override
public void associateDouble(Attribute attribute, double value) throws AccesorInitializationException {
if (attribute.compareTo(attributes[0]) == 0) {
setFlags[0] = true;
this.lat = value;
}
else if (attribute.compareTo(attributes[1])==0) {
setFlags[1] = true;
this.lon = value;
}
else throw new AccesorInitializationException("Double value being initialized for wrong attribute "
+ YahooPlaceFinderAPI.class.getName());
}
@Override
public IResultSet executeQuery() throws SourceQueryException {
return new ResultSetImpl(nearbyPlaces().toString(), model);
}
public BasicDBList nearbyPlaces(double lat, double lon) {
this.lat = lat;
this.lon = lon;
return nearbyPlaces();
}
}