package io.lumify.foodTruck; import io.lumify.core.ingest.graphProperty.GraphPropertyWorkData; import io.lumify.core.ingest.graphProperty.GraphPropertyWorker; import io.lumify.core.model.properties.LumifyProperties; import io.lumify.twitter.TwitterOntology; import org.securegraph.*; import org.securegraph.type.GeoPoint; import java.io.InputStream; import java.util.Calendar; import java.util.Date; import static org.securegraph.util.IterableUtils.count; import static org.securegraph.util.IterableUtils.single; import static org.securegraph.util.IterableUtils.singleOrDefault; public class FoodTruckLocationUpdateGraphPropertyWorker extends GraphPropertyWorker { private static final String MULTI_VALUE_KEY = FoodTruckLocationUpdateGraphPropertyWorker.class.getName(); @Override public void execute(InputStream in, GraphPropertyWorkData data) throws Exception { Edge hasKeywordEdge = (Edge) data.getElement(); Vertex tweetVertex = hasKeywordEdge.getVertex(Direction.OUT, getAuthorizations()); if (isRetweet(tweetVertex)) { return; } Vertex keywordVertex = hasKeywordEdge.getVertex(Direction.IN, getAuthorizations()); Vertex tweeter = single(tweetVertex.getVertices(Direction.BOTH, TwitterOntology.EDGE_LABEL_TWEETED, getAuthorizations())); Vertex foodTruck = singleOrDefault(tweeter.getVertices(Direction.BOTH, FoodTruckOntology.EDGE_LABEL_HAS_TWITTER_USER, getAuthorizations()), null); if (foodTruck == null) { return; } String keywordTitle = LumifyProperties.TITLE.getPropertyValue(keywordVertex); GeoPoint geoLocation = FoodTruckOntology.GEO_LOCATION.getPropertyValue(keywordVertex); if (geoLocation != null) { Date geoLocationDate = LumifyProperties.PUBLISHED_DATE.getPropertyValue(tweetVertex); Date currentGetLocationDate = FoodTruckOntology.GEO_LOCATION_DATE.getPropertyValue(foodTruck); if (currentGetLocationDate == null || geoLocationDate.compareTo(currentGetLocationDate) > 0) { Calendar geoLocationCalendar = Calendar.getInstance(); geoLocationCalendar.setTime(geoLocationDate); Calendar nowCalendar = Calendar.getInstance(); nowCalendar.setTime(new Date()); if (geoLocationCalendar.get(Calendar.DAY_OF_YEAR) != nowCalendar.get(Calendar.DAY_OF_YEAR)) { return; } geoLocation = new GeoPoint(geoLocation.getLatitude(), geoLocation.getLongitude(), geoLocation.getAltitude(), keywordTitle); FoodTruckOntology.GEO_LOCATION.addPropertyValue(foodTruck, MULTI_VALUE_KEY, geoLocation, data.getVisibility(), getAuthorizations()); FoodTruckOntology.GEO_LOCATION_DATE.addPropertyValue(foodTruck, MULTI_VALUE_KEY, geoLocationDate, data.getVisibility(), getAuthorizations()); getGraph().flush(); getWorkQueueRepository().pushGraphPropertyQueue(foodTruck, FoodTruckOntology.GEO_LOCATION.getProperty(foodTruck)); } } } private boolean isRetweet(Vertex tweetVertex) { return count(tweetVertex.getEdges(Direction.IN, TwitterOntology.EDGE_LABEL_RETWEET, getAuthorizations())) > 0; } @Override public boolean isHandled(Element element, Property property) { if (!(element instanceof Edge)) { return false; } Edge edge = (Edge) element; if (!edge.getLabel().equals(FoodTruckOntology.EDGE_LABEL_HAS_KEYWORD)) { return false; } return true; } }