package io.lumify.assignimagemr;
import io.lumify.core.mapreduce.LumifyElementMapperBase;
import io.lumify.core.model.properties.LumifyProperties;
import io.lumify.core.util.LumifyLogger;
import io.lumify.core.util.LumifyLoggerFactory;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Counter;
import org.securegraph.Direction;
import org.securegraph.Element;
import org.securegraph.Vertex;
import org.securegraph.VertexBuilder;
import java.io.IOException;
import static com.google.common.collect.Iterables.isEmpty;
public class AssignImageMRMapper extends LumifyElementMapperBase<Text, Element> {
private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(AssignImageMRMapper.class);
private static final String PROPERTY_KEY = AssignImageMRMapper.class.getName();
private Counter elementsProcessedCounter;
private Counter assignmentsMadeCounter;
private AssignImageConfiguration config;
@Override
protected void setup(Context context) throws IOException, InterruptedException {
super.setup(context);
this.elementsProcessedCounter = context.getCounter(AssignImageCounters.ELEMENTS_PROCESSED);
this.assignmentsMadeCounter = context.getCounter(AssignImageCounters.ASSIGNMENTS_MADE);
this.config = new AssignImageConfiguration(context.getConfiguration());
}
@Override
protected void safeMap(Text key, Element element, Context context) throws Exception {
Vertex vertex = (Vertex) element;
context.setStatus("Processing " + vertex.getId());
if (isEmpty(vertex.getProperties(LumifyProperties.ENTITY_IMAGE_VERTEX_ID.getPropertyName()))
&& isEmpty(vertex.getProperties(LumifyProperties.ENTITY_IMAGE_URL.getPropertyName()))) {
LOGGER.debug("no image on vertex '%s', finding best image.", vertex.getId());
String imageVertexId = findBestImageVertexId(vertex);
if (imageVertexId == null) {
LOGGER.debug("no image found for vertex '%s'", vertex.getId());
} else {
LOGGER.debug("image '%s' found for vertex '%s'. assigning.", imageVertexId, vertex.getId());
VertexBuilder m = prepareVertex(vertex.getId(), vertex.getVisibility());
LumifyProperties.ENTITY_IMAGE_VERTEX_ID.addPropertyValue(m, PROPERTY_KEY, imageVertexId, this.config.getVisibility());
m.save(this.config.getAuthorizations());
assignmentsMadeCounter.increment(1);
}
}
elementsProcessedCounter.increment(1);
}
private String findBestImageVertexId(Vertex vertex) {
Iterable<Vertex> vertices = vertex.getVertices(Direction.OUT, config.getHasImageLabels(), config.getAuthorizations());
for (Vertex v : vertices) {
String mimeType = LumifyProperties.MIME_TYPE.getPropertyValue(v);
if (mimeType != null && mimeType.startsWith("image")) {
return v.getId();
}
}
return null;
}
}