package com.thinkaurelius.faunus.mapreduce.sideeffect;
import com.thinkaurelius.faunus.BaseTest;
import com.thinkaurelius.faunus.FaunusVertex;
import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Vertex;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mrunit.mapreduce.MapReduceDriver;
import org.apache.hadoop.mrunit.types.Pair;
import java.util.List;
import java.util.Map;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public class GroupCountMapReduceTest extends BaseTest {
MapReduceDriver<NullWritable, FaunusVertex, Text, LongWritable, Text, LongWritable> mapReduceDriver;
public void setUp() throws Exception {
mapReduceDriver = new MapReduceDriver<NullWritable, FaunusVertex, Text, LongWritable, Text, LongWritable>();
mapReduceDriver.setMapper(new GroupCountMapReduce.Map());
mapReduceDriver.setCombiner(new GroupCountMapReduce.Combiner());
mapReduceDriver.setReducer(new GroupCountMapReduce.Reduce());
}
public void testOutDegreeDistribution() throws Exception {
Configuration config = GroupCountMapReduce.createConfiguration(Vertex.class, "{ it -> it.outE.count() }", null);
this.mapReduceDriver.withConfiguration(config);
final Map<Long, FaunusVertex> graph = generateGraph(ExampleGraph.GRAPH_OF_THE_GODS, config);
final List<Pair<Text, LongWritable>> results = runWithGraphNoIndex(startPath(graph, Vertex.class), this.mapReduceDriver);
//System.out.println(results);
assertEquals(results.size(), 5);
for (final Pair<Text, LongWritable> result : results) {
if (result.getFirst().toString().equals("0")) {
assertEquals(result.getSecond().get(), 7);
} else if (result.getFirst().toString().equals("1")) {
assertEquals(result.getSecond().get(), 1);
} else if (result.getFirst().toString().equals("3")) {
assertEquals(result.getSecond().get(), 1);
} else if (result.getFirst().toString().equals("4")) {
assertEquals(result.getSecond().get(), 2);
} else if (result.getFirst().toString().equals("5")) {
assertEquals(result.getSecond().get(), 1);
} else {
assertTrue(false);
}
}
identicalStructure(graph, ExampleGraph.GRAPH_OF_THE_GODS);
assertEquals(0, this.mapReduceDriver.getCounters().findCounter(GroupCountMapReduce.Counters.OUT_EDGES_PROCESSED).getValue());
assertEquals(12, this.mapReduceDriver.getCounters().findCounter(GroupCountMapReduce.Counters.VERTICES_PROCESSED).getValue());
}
public void testEdgePropertySizeDistribution() throws Exception {
Configuration config = GroupCountMapReduce.createConfiguration(Edge.class, "{ it -> it.map.next().size() }", "{ it -> 2}");
this.mapReduceDriver.withConfiguration(config);
final Map<Long, FaunusVertex> graph = generateGraph(ExampleGraph.GRAPH_OF_THE_GODS, config);
final List<Pair<Text, LongWritable>> results = runWithGraphNoIndex(startPath(graph, Edge.class), this.mapReduceDriver);
//System.out.println(results);
assertEquals(results.size(), 2);
for (final Pair<Text, LongWritable> result : results) {
if (result.getFirst().toString().equals("0")) {
assertEquals(result.getSecond().get(), 28);
} else if (result.getFirst().toString().equals("1")) {
assertEquals(result.getSecond().get(), 6);
} else {
assertTrue(false);
}
}
identicalStructure(graph, ExampleGraph.GRAPH_OF_THE_GODS);
assertEquals(17, this.mapReduceDriver.getCounters().findCounter(GroupCountMapReduce.Counters.OUT_EDGES_PROCESSED).getValue());
assertEquals(0, this.mapReduceDriver.getCounters().findCounter(GroupCountMapReduce.Counters.VERTICES_PROCESSED).getValue());
}
public void testVertexDistribution() throws Exception {
Configuration config = GroupCountMapReduce.createConfiguration(Vertex.class, null, "{ it -> 3.2}");
this.mapReduceDriver.withConfiguration(config);
final Map<Long, FaunusVertex> graph = generateGraph(ExampleGraph.GRAPH_OF_THE_GODS, config);
final List<Pair<Text, LongWritable>> results = runWithGraphNoIndex(startPath(graph, Vertex.class), this.mapReduceDriver);
//System.out.println(results);
assertEquals(results.size(), 12);
for (final Pair<Text, LongWritable> result : results) {
assertTrue(result.getFirst().toString().startsWith("v["));
assertEquals(result.getSecond().get(), 3);
}
identicalStructure(graph, ExampleGraph.GRAPH_OF_THE_GODS);
assertEquals(12, this.mapReduceDriver.getCounters().findCounter(GroupCountMapReduce.Counters.VERTICES_PROCESSED).getValue());
assertEquals(0, this.mapReduceDriver.getCounters().findCounter(GroupCountMapReduce.Counters.OUT_EDGES_PROCESSED).getValue());
}
public void testEdgeDistribution() throws Exception {
Configuration config = GroupCountMapReduce.createConfiguration(Edge.class, null, null);
this.mapReduceDriver.withConfiguration(config);
final Map<Long, FaunusVertex> graph = generateGraph(ExampleGraph.GRAPH_OF_THE_GODS, config);
final List<Pair<Text, LongWritable>> results = runWithGraphNoIndex(startPath(graph, Edge.class), this.mapReduceDriver);
//System.out.println(results);
assertEquals(results.size(), 17);
for (final Pair<Text, LongWritable> result : results) {
assertTrue(result.getFirst().toString().startsWith("e["));
assertEquals(result.getSecond().get(), 1);
}
identicalStructure(graph, ExampleGraph.GRAPH_OF_THE_GODS);
assertEquals(0, this.mapReduceDriver.getCounters().findCounter(GroupCountMapReduce.Counters.VERTICES_PROCESSED).getValue());
assertEquals(17, this.mapReduceDriver.getCounters().findCounter(GroupCountMapReduce.Counters.OUT_EDGES_PROCESSED).getValue());
}
}