use of org.apache.rya.indexing.TemporalInstant in project incubator-rya by apache.
the class EventDocumentConverter method fromDocument.
@Override
public Event fromDocument(final Document document) throws DocumentConverterException {
requireNonNull(document);
final boolean isInstant;
// Preconditions.
if (!document.containsKey(SUBJECT)) {
throw new DocumentConverterException("Could not convert document '" + document + "' because its '" + SUBJECT + "' field is missing.");
}
if (document.containsKey(INSTANT)) {
isInstant = true;
} else {
isInstant = false;
}
final String subject = document.getString(SUBJECT);
final Event.Builder builder = new Event.Builder().setSubject(new RyaURI(subject));
if (document.containsKey(GEO_KEY)) {
final Document geoObj = (Document) document.get(GEO_KEY);
final GeometryFactory geoFact = new GeometryFactory();
final String typeString = (String) geoObj.get("type");
final CoordinateList coords = new CoordinateList();
final Geometry geo;
if (typeString.equals("Point")) {
final List<Double> point = (List<Double>) geoObj.get("coordinates");
final Coordinate coord = new Coordinate(point.get(0), point.get(1));
geo = geoFact.createPoint(coord);
} else if (typeString.equals("LineString")) {
final List<List<Double>> pointsList = (List<List<Double>>) geoObj.get("coordinates");
for (final List<Double> point : pointsList) {
coords.add(new Coordinate(point.get(0), point.get(1)));
}
geo = geoFact.createLineString(coords.toCoordinateArray());
} else {
final List<List<List<Double>>> pointsList = (List<List<List<Double>>>) geoObj.get("coordinates");
if (pointsList.size() == 1) {
final List<List<Double>> poly = pointsList.get(0);
for (final List<Double> point : poly) {
coords.add(new Coordinate(point.get(0), point.get(1)));
}
geo = geoFact.createPolygon(coords.toCoordinateArray());
} else {
final List<List<Double>> first = pointsList.get(0);
final CoordinateList shellCoords = new CoordinateList();
for (final List<Double> point : pointsList.get(0)) {
shellCoords.add(new Coordinate(point.get(0), point.get(1)));
}
final LinearRing shell = geoFact.createLinearRing(shellCoords.toCoordinateArray());
final List<List<List<Double>>> holesPoints = pointsList.subList(1, pointsList.size() - 1);
final LinearRing[] holes = new LinearRing[holesPoints.size()];
for (int ii = 0; ii < holes.length; ii++) {
final List<List<Double>> holePoints = holesPoints.get(ii);
final CoordinateList shells = new CoordinateList();
for (final List<Double> point : pointsList.get(0)) {
shells.add(new Coordinate(point.get(0), point.get(1)));
}
holes[ii] = geoFact.createLinearRing(shells.toCoordinateArray());
}
geo = geoFact.createPolygon(shell, holes);
}
}
builder.setGeometry(geo);
}
if (isInstant) {
// we already know the key exists
final Date date = (Date) document.get(INSTANT);
final DateTime dt = new DateTime(date.getTime());
final TemporalInstant instant = new TemporalInstantRfc3339(dt);
builder.setTemporalInstant(instant);
} else if (document.containsKey(INTERVAL_START)) {
Date date = (Date) document.get(INTERVAL_START);
DateTime dt = new DateTime(date.getTime());
final TemporalInstant begining = new TemporalInstantRfc3339(dt);
date = (Date) document.get(INTERVAL_END);
dt = new DateTime(date.getTime());
final TemporalInstant end = new TemporalInstantRfc3339(dt);
final TemporalInterval interval = new TemporalInterval(begining, end);
builder.setTemporalInterval(interval);
}
return builder.build();
}
use of org.apache.rya.indexing.TemporalInstant in project incubator-rya by apache.
the class EventQueryNode2IT method evaluate_constantSubject.
@Test
public void evaluate_constantSubject() throws Exception {
final EventStorage storage = new MongoEventStorage(super.getMongoClient(), "testDB");
RyaURI subject = new RyaURI("urn:event-1111");
final Geometry geo = GF.createPoint(new Coordinate(1, 1));
final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0);
final Event event = Event.builder().setSubject(subject).setGeometry(geo).setTemporalInstant(temp).build();
subject = new RyaURI("urn:event-2222");
final Event otherEvent = Event.builder().setSubject(subject).setGeometry(geo).setTemporalInstant(temp).build();
storage.create(event);
storage.create(otherEvent);
final String query = "PREFIX time: <http://www.w3.org/2006/time#> \n" + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n" + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>" + "SELECT ?event ?time ?point ?wkt " + "WHERE { " + " <urn:event-1111> time:atTime ?time . " + " <urn:event-1111> geo:asWKT ?wkt . " + " FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 -2, -3 -2))\"^^geo:wktLiteral)) " + " FILTER(tempo:equals(?time, \"" + temp.toString() + "\")) " + "}";
final EventQueryNode node = buildNode(storage, query);
final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(new MapBindingSet());
final MapBindingSet expected = new MapBindingSet();
expected.addBinding("wkt", VF.createLiteral("POINT (1 1)"));
expected.addBinding("time", VF.createLiteral(temp.toString()));
int count = 0;
assertTrue(rez.hasNext());
while (rez.hasNext()) {
assertEquals(expected, rez.next());
count++;
}
assertEquals(1, count);
}
use of org.apache.rya.indexing.TemporalInstant in project incubator-rya by apache.
the class EventQueryNode2IT method evaluate_variableSubject_existingBindingset.
@Test
public void evaluate_variableSubject_existingBindingset() throws Exception {
final EventStorage storage = new MongoEventStorage(super.getMongoClient(), "testDB");
RyaURI subject = new RyaURI("urn:event-1111");
Geometry geo = GF.createPoint(new Coordinate(1, 1));
final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0);
final Event event = Event.builder().setSubject(subject).setGeometry(geo).setTemporalInstant(temp).build();
subject = new RyaURI("urn:event-2222");
geo = GF.createPoint(new Coordinate(-1, -1));
final Event otherEvent = Event.builder().setSubject(subject).setGeometry(geo).setTemporalInstant(temp).build();
storage.create(event);
storage.create(otherEvent);
final String query = "PREFIX time: <http://www.w3.org/2006/time#> \n" + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n" + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>" + "SELECT ?event ?time ?point ?wkt " + "WHERE { " + " ?event time:atTime ?time . " + " ?event geo:asWKT ?wkt . " + " FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 -2, -3 -2))\"^^geo:wktLiteral)) " + " FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) " + "}";
final EventQueryNode node = buildNode(storage, query);
final MapBindingSet existingBindings = new MapBindingSet();
existingBindings.addBinding("event", VF.createURI("urn:event-2222"));
final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(existingBindings);
final MapBindingSet expected = new MapBindingSet();
expected.addBinding("wkt", VF.createLiteral("POINT (-1 -1)"));
expected.addBinding("time", VF.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString()));
final List<BindingSet> actual = new ArrayList<>();
while (rez.hasNext()) {
actual.add(rez.next());
}
assertEquals(1, actual.size());
assertEquals(expected, actual.get(0));
}
use of org.apache.rya.indexing.TemporalInstant in project incubator-rya by apache.
the class GeoTemporalMongoDBStorageStrategy method getTemporalObjs.
private DBObject[] getTemporalObjs(final Collection<IndexingExpr> temporalFilters) {
final List<DBObject> objs = new ArrayList<>();
temporalFilters.forEach(filter -> {
final TemporalPolicy policy = TemporalPolicy.fromURI(filter.getFunction());
final String timeStr = ((Value) filter.getArguments()[0]).stringValue();
final Matcher matcher = TemporalInstantRfc3339.PATTERN.matcher(timeStr);
if (matcher.find()) {
final TemporalInterval interval = TemporalInstantRfc3339.parseInterval(timeStr);
if (policy == TemporalPolicy.INSTANT_AFTER_INSTANT || policy == TemporalPolicy.INSTANT_BEFORE_INSTANT || policy == TemporalPolicy.INSTANT_EQUALS_INSTANT) {
if (interval == null) {
LOG.error("Cannot perform temporal interval based queries on an instant.");
}
}
objs.add(getTemporalObject(interval, policy));
} else {
final TemporalInstant instant = new TemporalInstantRfc3339(DateTime.parse(timeStr));
if (policy != TemporalPolicy.INSTANT_AFTER_INSTANT && policy != TemporalPolicy.INSTANT_BEFORE_INSTANT && policy != TemporalPolicy.INSTANT_EQUALS_INSTANT) {
LOG.error("Cannot perform temporal instant based queries on an interval.");
}
objs.add(getTemporalObject(instant, policy));
}
});
return objs.toArray(new DBObject[] {});
}
use of org.apache.rya.indexing.TemporalInstant in project incubator-rya by apache.
the class MongoGeoTemporalIndexer method deleteStatement.
@Override
public void deleteStatement(final RyaStatement statement) throws IOException {
requireNonNull(statement);
final RyaURI subject = statement.getSubject();
try {
final EventStorage eventStore = events.get();
checkState(events != null, "Must set this indexers configuration before storing statements.");
new EventUpdater(eventStore).update(subject, old -> {
final Event.Builder updated;
if (!old.isPresent()) {
return Optional.empty();
} else {
updated = Event.builder(old.get());
}
final Event currentEvent = updated.build();
final URI pred = statement.getObject().getDataType();
if ((pred.equals(GeoConstants.GEO_AS_WKT) || pred.equals(GeoConstants.GEO_AS_GML) || pred.equals(GeoConstants.XMLSCHEMA_OGC_WKT) || pred.equals(GeoConstants.XMLSCHEMA_OGC_GML)) && currentEvent.getGeometry().isPresent()) {
// is geo and needs to be removed.
try {
if (currentEvent.getGeometry().get().equals(GeoParseUtils.getGeometry(RyaToRdfConversions.convertStatement(statement), new GmlParser()))) {
updated.setGeometry(null);
}
} catch (final Exception e) {
LOG.debug("Unable to parse the stored geometry.");
}
} else {
// is time
final String dateTime = statement.getObject().getData();
final Matcher matcher = TemporalInstantRfc3339.PATTERN.matcher(dateTime);
if (matcher.find()) {
final TemporalInterval interval = TemporalInstantRfc3339.parseInterval(dateTime);
if (currentEvent.getInterval().get().equals(interval)) {
updated.setTemporalInterval(null);
}
} else {
final TemporalInstant instant = new TemporalInstantRfc3339(DateTime.parse(dateTime));
if (currentEvent.getInstant().get().equals(instant)) {
updated.setTemporalInstant(null);
}
}
}
return Optional.of(updated.build());
});
} catch (final IndexingException e) {
throw new IOException("Failed to update the Entity index.", e);
}
}
Aggregations