package io.dstream.tez;
import static io.dstream.utils.KVUtils.kv;
import static org.junit.Assert.assertEquals;
import java.util.List;
import java.util.Map.Entry;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import org.junit.After;
import org.junit.Test;
import io.dstream.DStream;
import junit.framework.Assert;
public class AggregateValuesTests extends BaseTezTests {
private final String applicationName = this.getClass().getSimpleName();
@After
public void after(){
clean(applicationName);
}
@Test
public void defaultAggregator() throws Exception {
DStream<String> sourceStream = DStream.ofType(String.class, "ms");
Future<Stream<Stream<Entry<String, List<Integer>>>>> resultFuture = sourceStream
.flatMap(line -> Stream.of(line.split("\\s+")))
.aggregateValues(s -> s, s -> 1)
.executeAs(this.applicationName);
Stream<Stream<Entry<String, List<Integer>>>> result = resultFuture.get(1000000, TimeUnit.MILLISECONDS);
List<Stream<Entry<String, List<Integer>>>> resultStreams = result.collect(Collectors.toList());
Assert.assertEquals(1, resultStreams.size());
Stream<Entry<String, List<Integer>>> firstResultStream = resultStreams.get(0);
List<Entry<String, List<Integer>>> firstResult = firstResultStream.collect(Collectors.toList());
Assert.assertEquals(10, firstResult.size());
Entry<String, List<Integer>> e1 = firstResult.get(0);
assertEquals("bar", e1.getKey());
assertEquals(3, StreamSupport.stream(e1.getValue().spliterator(), false).count());
Entry<String, List<Integer>> e2 = firstResult.get(1);
assertEquals("baz", e2.getKey());
assertEquals(2, StreamSupport.stream(e2.getValue().spliterator(), false).count());
Entry<String, List<Integer>> e4 = firstResult.get(3);
assertEquals("dang", e4.getKey());
assertEquals(1, StreamSupport.stream(e4.getValue().spliterator(), false).count());
result.close();
}
@Test
public void providedAggregator() throws Exception {
DStream<String> sourceStream = DStream.ofType(String.class, "ms");
Future<Stream<Stream<Entry<String, List<Integer>>>>> resultFuture = sourceStream
.flatMap(line -> Stream.of(line.split("\\s+")))
.aggregateValues(s -> s, s -> 1)
.executeAs(this.applicationName);
Stream<Stream<Entry<String, List<Integer>>>> result = resultFuture.get(1000000, TimeUnit.MILLISECONDS);
List<Stream<Entry<String, List<Integer>>>> resultStreams = result.collect(Collectors.toList());
Assert.assertEquals(1, resultStreams.size());
Stream<Entry<String, List<Integer>>> firstResultStream = resultStreams.get(0);
List<Entry<String, List<Integer>>> firstResult = firstResultStream.collect(Collectors.toList());
Assert.assertEquals(10, firstResult.size());
Entry<String, List<Integer>> e1 = firstResult.get(0);
assertEquals("bar", e1.getKey());
assertEquals(3, StreamSupport.stream(e1.getValue().spliterator(), false).count());
Entry<String, List<Integer>> e2 = firstResult.get(1);
assertEquals("baz", e2.getKey());
assertEquals(2, StreamSupport.stream(e2.getValue().spliterator(), false).count());
Entry<String, List<Integer>> e4 = firstResult.get(3);
assertEquals("dang", e4.getKey());
assertEquals(1, StreamSupport.stream(e4.getValue().spliterator(), false).count());
result.close();
}
@Test
public void aggregateWithPreExistingKV() throws Exception {
DStream<String> sourceStream = DStream.ofType(String.class, "ms");
Future<Stream<Stream<Entry<String, List<Integer>>>>> resultFuture = sourceStream
.flatMap(line -> Stream.of(line.split("\\s+")))
.map(word -> kv(word, 1))
.aggregateValues(s -> s.getKey(), s -> s.getValue())
.executeAs(this.applicationName);
Stream<Stream<Entry<String, List<Integer>>>> result = resultFuture.get(1000000, TimeUnit.MILLISECONDS);
List<Stream<Entry<String, List<Integer>>>> resultStreams = result.collect(Collectors.toList());
Assert.assertEquals(1, resultStreams.size());
Stream<Entry<String, List<Integer>>> firstResultStream = resultStreams.get(0);
List<Entry<String, List<Integer>>> firstResult = firstResultStream.collect(Collectors.toList());
Assert.assertEquals(10, firstResult.size());
Entry<String, List<Integer>> e1 = firstResult.get(0);
assertEquals("bar", e1.getKey());
assertEquals(3, StreamSupport.stream(e1.getValue().spliterator(), false).count());
Entry<String, List<Integer>> e2 = firstResult.get(1);
assertEquals("baz", e2.getKey());
assertEquals(2, StreamSupport.stream(e2.getValue().spliterator(), false).count());
Entry<String, List<Integer>> e4 = firstResult.get(3);
assertEquals("dang", e4.getKey());
assertEquals(1, StreamSupport.stream(e4.getValue().spliterator(), false).count());
result.close();
}
}