use of edu.snu.mist.core.MistDataEvent in project mist by snuspl.
the class ReduceByKeyOperatorTest method testReduceByKeyOperatorGetState.
/**
* Test getting state of the ReduceByKeyOperator.
*/
@Test
@SuppressWarnings("unchecked")
public void testReduceByKeyOperatorGetState() throws InterruptedException {
// Generate the current ReduceByKeyOperator state.
final List<MistDataEvent> inputStream = ImmutableList.of(createTupleEvent("a", 1, 1L), createTupleEvent("b", 1, 2L), createTupleEvent("c", 1, 3L), createTupleEvent("a", 1, 4L), createTupleEvent("d", 1, 5L), createTupleEvent("a", 1, 6L), createTupleEvent("b", 1, 7L));
// Generate the expected ReduceByKeyOperator state.
final Map<String, Integer> expectedOperatorState = new HashMap<>();
expectedOperatorState.put("a", 3);
expectedOperatorState.put("b", 2);
expectedOperatorState.put("c", 1);
expectedOperatorState.put("d", 1);
final int keyIndex = 0;
final MISTBiFunction<Integer, Integer, Integer> wordCountFunc = (oldVal, val) -> oldVal + val;
final ReduceByKeyOperator<String, Integer> wcOperator = new ReduceByKeyOperator<>(keyIndex, wordCountFunc);
final List<MistEvent> result = new LinkedList<>();
wcOperator.setOutputEmitter(new OutputBufferEmitter(result));
inputStream.stream().forEach(wcOperator::processLeftData);
// Get the current ReduceByKeyOperator's state.
final Map<String, Object> operatorStateMap = wcOperator.getStateSnapshot();
final Map<String, Integer> operatorState = (Map<String, Integer>) operatorStateMap.get("reduceByKeyState");
// Compare the expected and original operator's state.
Assert.assertEquals(expectedOperatorState, operatorState);
}
use of edu.snu.mist.core.MistDataEvent in project mist by snuspl.
the class ReduceByKeyOperatorTest method testReduceByKeyOperator.
/**
* Test whether reduceByKeyOperator generates correct outputs.
* Input: a list of tuples: ("a", 1), ("b", 1), ("c", 1), ("a", 1), ("d", 1), ("a", 1), ("b", 1)
* Expected outputs: word counts:
* {"a": 1},
* {"a": 1, "b": 1},
* {"a": 1, "b": 1, "c": 1}
* {"a": 2, "b": 1, "c": 1}
* {"a": 2, "b": 1, "c": 1, "d": 1}
* {"a": 3, "b": 1, "c": 1, "d": 1}
* {"a": 3, "b": 2, "c": 1, "d": 1}
*/
@Test
public void testReduceByKeyOperator() throws InjectionException {
// input stream
final List<MistDataEvent> inputStream = ImmutableList.of(createTupleEvent("a", 1, 1L), createTupleEvent("b", 1, 2L), createTupleEvent("c", 1, 3L), createTupleEvent("a", 1, 4L), createTupleEvent("d", 1, 5L), createTupleEvent("a", 1, 6L), createTupleEvent("b", 1, 7L));
// expected output
final Map<String, Integer> o0 = new HashMap<>();
o0.put("a", 1);
final Map<String, Integer> o1 = new HashMap<>(o0);
o1.put("b", 1);
final Map<String, Integer> o2 = new HashMap<>(o1);
o2.put("c", 1);
final Map<String, Integer> o3 = new HashMap<>(o2);
o3.put("a", 2);
final Map<String, Integer> o4 = new HashMap<>(o3);
o4.put("d", 1);
final Map<String, Integer> o5 = new HashMap<>(o4);
o5.put("a", 3);
final Map<String, Integer> o6 = new HashMap<>(o5);
o6.put("b", 2);
final List<MistEvent> expectedStream = ImmutableList.of(new MistDataEvent(o0, 1L), new MistDataEvent(o1, 2L), new MistDataEvent(o2, 3L), new MistDataEvent(o3, 4L), new MistDataEvent(o4, 5L), new MistDataEvent(o5, 6L), new MistDataEvent(o6, 7L));
// Set the key index of tuple
final int keyIndex = 0;
// Reduce function for word count
final MISTBiFunction<Integer, Integer, Integer> wordCountFunc = (oldVal, val) -> oldVal + val;
final ReduceByKeyOperator<String, Integer> wcOperator = new ReduceByKeyOperator<>(keyIndex, wordCountFunc);
// output test
final List<MistEvent> result = new LinkedList<>();
wcOperator.setOutputEmitter(new OutputBufferEmitter(result));
inputStream.stream().forEach(wcOperator::processLeftData);
LOG.info("expected: " + expectedStream);
LOG.info("result: " + result);
Assert.assertEquals(expectedStream, result);
}
use of edu.snu.mist.core.MistDataEvent in project mist by snuspl.
the class ReduceByKeyOperatorTest method testReduceByKeyOperatorSetState.
/**
* Test setting state of the ReduceByKeyOperator.
*/
@Test
@SuppressWarnings("unchecked")
public void testReduceByKeyOperatorSetState() throws InterruptedException {
// Generate a new state and set it to the state of a new ReduceByKeyWindowOperator.
final Map<String, Integer> expectedOperatorState = new HashMap<>();
expectedOperatorState.put("a", 3);
expectedOperatorState.put("b", 2);
expectedOperatorState.put("c", 1);
expectedOperatorState.put("d", 1);
final Map<String, Object> loadStateMap = new HashMap<>();
loadStateMap.put("reduceByKeyState", expectedOperatorState);
final int keyIndex = 0;
final MISTBiFunction<Integer, Integer, Integer> wordCountFunc = (oldVal, val) -> oldVal + val;
final ReduceByKeyOperator reduceByKeyOperator = new ReduceByKeyOperator(keyIndex, wordCountFunc);
reduceByKeyOperator.setState(loadStateMap);
// Compare the original and the set operator.
final Map<String, Object> operatorStateMap = reduceByKeyOperator.getStateSnapshot();
final Map<String, Integer> operatorState = (Map<String, Integer>) operatorStateMap.get("reduceByKeyState");
Assert.assertEquals(expectedOperatorState, operatorState);
// Test if the operator can properly process data.
final List<MistEvent> result = new LinkedList<>();
reduceByKeyOperator.setOutputEmitter(new OutputBufferEmitter(result));
reduceByKeyOperator.setState(operatorStateMap);
final List<MistDataEvent> inputStream = ImmutableList.of(createTupleEvent("a", 1, 10L));
inputStream.stream().forEach(reduceByKeyOperator::processLeftData);
final List<MistEvent> expected = new LinkedList<>();
final Map<String, Integer> o1 = new HashMap<>();
o1.put("a", 4);
o1.put("b", 2);
o1.put("c", 1);
o1.put("d", 1);
expected.add(new MistDataEvent(o1, 10L));
Assert.assertEquals(expected, result);
}
use of edu.snu.mist.core.MistDataEvent in project mist by snuspl.
the class StateTransitionOperatorTest method testStateTransitionOperatorGetState.
/**
* Test getting state of StateTransitionOperator.
*/
@Test
public void testStateTransitionOperatorGetState() throws InterruptedException {
// generate input data event
final Map<String, Integer> value1 = new HashMap<>();
value1.put("number", 1);
final MistDataEvent data1 = new MistDataEvent(value1, 0L);
final Map<String, Integer> value2 = new HashMap<>();
value2.put("number", 2);
final MistDataEvent data2 = new MistDataEvent(value2, 1L);
// generate a set of final states
final Set<String> finalSet = new HashSet<>();
finalSet.add("1");
finalSet.add("2");
// generate a state table
final Map<String, Collection<Tuple2<MISTPredicate, String>>> stateTable = new HashMap<>();
final Collection<Tuple2<MISTPredicate, String>> list0 = new ArrayList<>();
list0.add(new Tuple2<>(new RuleBasedEQPredicate("number", 1), "1"));
final Collection<Tuple2<MISTPredicate, String>> list1 = new ArrayList<>();
list1.add(new Tuple2<>(new RuleBasedEQPredicate("number", 2), "2"));
stateTable.put("0", list0);
stateTable.put("1", list1);
final StateTransitionOperator stateTransitionOperator = new StateTransitionOperator("0", finalSet, stateTable);
final List<MistEvent> result = new ArrayList<>();
stateTransitionOperator.setOutputEmitter(new OutputBufferEmitter(result));
stateTransitionOperator.processLeftData(data1);
stateTransitionOperator.processLeftData(data2);
// Generate the expected state
final String expectedOperatorState = "2";
// Get the
final Map<String, Object> operatorState = stateTransitionOperator.getStateSnapshot();
final String stateTransitionOperatorState = (String) operatorState.get("stateTransitionOperatorState");
Assert.assertEquals(expectedOperatorState, stateTransitionOperatorState);
}
use of edu.snu.mist.core.MistDataEvent in project mist by snuspl.
the class StatelessOperatorTest method testMapOperation.
/**
* Test map operation.
* It converts string to tuple (string, 1).
*/
@Test
public void testMapOperation() throws InjectionException {
// input stream
final List<MistDataEvent> inputStream = ImmutableList.of(new MistDataEvent("a", 1L), new MistDataEvent("b", 2L), new MistDataEvent("d", 3L), new MistDataEvent("b", 4L), new MistDataEvent("c", 5L));
// expected output
final List<MistEvent> expectedStream = ImmutableList.of(new MistDataEvent(new Tuple<>("a", 1), 1L), new MistDataEvent(new Tuple<>("b", 1), 2L), new MistDataEvent(new Tuple<>("d", 1), 3L), new MistDataEvent(new Tuple<>("b", 1), 4L), new MistDataEvent(new Tuple<>("c", 1), 5L));
// map function: convert string to tuple
final MISTFunction<String, Tuple> mapFunc = (mapInput) -> new Tuple<>(mapInput, 1);
final MapOperator<String, Tuple> mapOperator = new MapOperator<>(mapFunc);
testStatelessOperator(inputStream, expectedStream, mapOperator);
}
Aggregations