package com.thinkaurelius.faunus.formats.edgelist;
import com.thinkaurelius.faunus.BaseTest;
import com.thinkaurelius.faunus.FaunusEdge;
import com.thinkaurelius.faunus.FaunusElement;
import com.thinkaurelius.faunus.FaunusVertex;
import com.tinkerpop.blueprints.Direction;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mrunit.mapreduce.MapReduceDriver;
import java.io.IOException;
import java.util.Map;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public class EdgeListInputMapReduceTest extends BaseTest {
MapReduceDriver<NullWritable, FaunusElement, LongWritable, FaunusVertex, NullWritable, FaunusVertex> mapReduceDriver;
public void setUp() {
mapReduceDriver = new MapReduceDriver<NullWritable, FaunusElement, LongWritable, FaunusVertex, NullWritable, FaunusVertex>();
mapReduceDriver.setMapper(new EdgeListInputMapReduce.Map());
mapReduceDriver.setCombiner(new EdgeListInputMapReduce.Combiner());
mapReduceDriver.setReducer(new EdgeListInputMapReduce.Reduce());
}
public void testSimpleElementList() throws IOException {
mapReduceDriver.addInput(NullWritable.get(), new FaunusVertex(1));
mapReduceDriver.addInput(NullWritable.get(), new FaunusVertex(2));
mapReduceDriver.addInput(NullWritable.get(), new FaunusEdge(1, 2, "knows"));
Map<Long, FaunusVertex> results = BaseTest.run(mapReduceDriver);
assertEquals(results.size(), 2);
assertEquals(results.get(1l).getIdAsLong(), 1);
assertEquals(results.get(2l).getIdAsLong(), 2);
assertEquals(count(results.get(1l).getEdges(Direction.OUT)), 1);
assertEquals(count(results.get(1l).getEdges(Direction.IN)), 0);
assertEquals(count(results.get(2l).getEdges(Direction.OUT)), 0);
assertEquals(count(results.get(2l).getEdges(Direction.IN)), 1);
}
public void testMultiVertexElementList() throws IOException {
mapReduceDriver.addInput(NullWritable.get(), new FaunusVertex(1));
mapReduceDriver.addInput(NullWritable.get(), new FaunusVertex(2));
mapReduceDriver.addInput(NullWritable.get(), new FaunusVertex(1));
mapReduceDriver.addInput(NullWritable.get(), new FaunusVertex(2));
mapReduceDriver.addInput(NullWritable.get(), new FaunusVertex(2));
mapReduceDriver.addInput(NullWritable.get(), new FaunusEdge(1, 2, "knows"));
Map<Long, FaunusVertex> results = BaseTest.run(mapReduceDriver);
assertEquals(results.size(), 2);
assertEquals(results.get(1l).getIdAsLong(), 1);
assertEquals(results.get(2l).getIdAsLong(), 2);
assertEquals(count(results.get(1l).getEdges(Direction.OUT)), 1);
assertEquals(count(results.get(1l).getEdges(Direction.IN)), 0);
assertEquals(count(results.get(2l).getEdges(Direction.OUT)), 0);
assertEquals(count(results.get(2l).getEdges(Direction.IN)), 1);
}
public void testMultiVertexMultiEdgeElementList() throws IOException {
mapReduceDriver.addInput(NullWritable.get(), new FaunusVertex(1));
mapReduceDriver.addInput(NullWritable.get(), new FaunusVertex(2));
mapReduceDriver.addInput(NullWritable.get(), new FaunusVertex(3));
mapReduceDriver.addInput(NullWritable.get(), new FaunusVertex(2));
mapReduceDriver.addInput(NullWritable.get(), new FaunusVertex(3));
mapReduceDriver.addInput(NullWritable.get(), new FaunusEdge(1, 2, "likes"));
mapReduceDriver.addInput(NullWritable.get(), new FaunusEdge(2, 3, "hates"));
mapReduceDriver.addInput(NullWritable.get(), new FaunusEdge(3, 1, "likes"));
Map<Long, FaunusVertex> results = BaseTest.run(mapReduceDriver);
assertEquals(results.size(), 3);
assertEquals(results.get(1l).getIdAsLong(), 1);
assertEquals(results.get(2l).getIdAsLong(), 2);
assertEquals(results.get(3l).getIdAsLong(), 3);
assertEquals(count(results.get(1l).getEdges(Direction.OUT)), 1);
assertEquals(results.get(1l).getEdges(Direction.OUT).iterator().next().getVertex(Direction.OUT).getId(), new Long(1));
assertEquals(results.get(1l).getEdges(Direction.OUT).iterator().next().getVertex(Direction.IN).getId(), new Long(2));
assertEquals(count(results.get(1l).getEdges(Direction.OUT, "likes")), 1);
assertEquals(count(results.get(1l).getEdges(Direction.IN)), 1);
assertEquals(count(results.get(1l).getEdges(Direction.IN, "likes")), 1);
assertEquals(results.get(1l).getEdges(Direction.IN).iterator().next().getVertex(Direction.OUT).getId(), new Long(3));
assertEquals(results.get(1l).getEdges(Direction.IN).iterator().next().getVertex(Direction.IN).getId(), new Long(1));
assertEquals(count(results.get(2l).getEdges(Direction.OUT)), 1);
assertEquals(results.get(2l).getEdges(Direction.OUT).iterator().next().getVertex(Direction.OUT).getId(), new Long(2));
assertEquals(results.get(2l).getEdges(Direction.OUT).iterator().next().getVertex(Direction.IN).getId(), new Long(3));
assertEquals(count(results.get(2l).getEdges(Direction.OUT, "hates")), 1);
assertEquals(count(results.get(2l).getEdges(Direction.IN)), 1);
assertEquals(count(results.get(2l).getEdges(Direction.IN, "likes")), 1);
assertEquals(results.get(2l).getEdges(Direction.IN).iterator().next().getVertex(Direction.OUT).getId(), new Long(1));
assertEquals(results.get(2l).getEdges(Direction.IN).iterator().next().getVertex(Direction.IN).getId(), new Long(2));
assertEquals(count(results.get(3l).getEdges(Direction.OUT)), 1);
assertEquals(results.get(3l).getEdges(Direction.OUT).iterator().next().getVertex(Direction.OUT).getId(), new Long(3));
assertEquals(results.get(3l).getEdges(Direction.OUT).iterator().next().getVertex(Direction.IN).getId(), new Long(1));
assertEquals(count(results.get(3l).getEdges(Direction.OUT, "likes")), 1);
assertEquals(count(results.get(3l).getEdges(Direction.IN)), 1);
assertEquals(count(results.get(3l).getEdges(Direction.IN, "hates")), 1);
assertEquals(results.get(3l).getEdges(Direction.IN).iterator().next().getVertex(Direction.OUT).getId(), new Long(2));
assertEquals(results.get(3l).getEdges(Direction.IN).iterator().next().getVertex(Direction.IN).getId(), new Long(3));
}
public void testElementProperties() throws IOException {
FaunusVertex a = new FaunusVertex(1);
a.setProperty("name", "marko");
a.setProperty("age", 33);
FaunusVertex b = new FaunusVertex(2);
b.setProperty("name", "josh");
FaunusVertex c = new FaunusVertex(1);
c.setProperty("name", "marko");
c.setProperty("ssn", "12345");
FaunusEdge e = new FaunusEdge(a.getIdAsLong(), b.getIdAsLong(), "knows");
e.setProperty("weight", 1.2f);
mapReduceDriver.addInput(NullWritable.get(), a);
mapReduceDriver.addInput(NullWritable.get(), b);
mapReduceDriver.addInput(NullWritable.get(), c);
mapReduceDriver.addInput(NullWritable.get(), e);
Map<Long, FaunusVertex> results = BaseTest.run(mapReduceDriver);
assertEquals(results.size(), 2);
assertEquals(results.get(1l).getProperty("name"), "marko");
assertEquals(results.get(1l).getProperty("age"), 33);
assertEquals(results.get(1l).getProperty("ssn"), "12345");
assertEquals(results.get(1l).getPropertyKeys().size(), 3);
assertEquals(results.get(2l).getProperty("name"), "josh");
assertEquals(results.get(2l).getPropertyKeys().size(), 1);
assertEquals(results.get(1l).getEdges(Direction.OUT).iterator().next().getLabel(), "knows");
assertEquals(results.get(2l).getEdges(Direction.IN).iterator().next().getLabel(), "knows");
assertEquals(results.get(1l).getEdges(Direction.OUT).iterator().next().getPropertyKeys().size(), 1);
assertEquals(results.get(2l).getEdges(Direction.IN).iterator().next().getPropertyKeys().size(), 1);
assertEquals(results.get(1l).getEdges(Direction.OUT).iterator().next().getProperty("weight"), 1.2f);
assertEquals(results.get(2l).getEdges(Direction.IN).iterator().next().getProperty("weight"), 1.2f);
}
}