public static void main(final String[] args) throws Exception {

    if (!parseParameters(args)) {
      return;
    }

    // set up the execution environment
    final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

    // get input data
    final DataStream<String> text = getTextDataStream(env);

    final DataStream<Tuple2<String, Integer>> counts =
        text
            // split up the lines in pairs (2-tuples) containing: (word,1)
            // this is done by a bolt that is wrapped accordingly
            .transform(
                "BoltTokenizer",
                TypeExtractor.getForObject(new Tuple2<String, Integer>("", 0)),
                new BoltWrapper<String, Tuple2<String, Integer>>(new BoltTokenizer()))
            // group by the tuple field "0" and sum up tuple field "1"
            .keyBy(0)
            .sum(1);

    // emit result
    if (fileOutput) {
      counts.writeAsText(outputPath);
    } else {
      counts.print();
    }

    // execute program
    env.execute("Streaming WordCount with bolt tokenizer");
  }
  @Test
  public void testAllReduceDriverImmutableEmpty() {
    try {
      TestTaskContext<ReduceFunction<Tuple2<String, Integer>>, Tuple2<String, Integer>> context =
          new TestTaskContext<ReduceFunction<Tuple2<String, Integer>>, Tuple2<String, Integer>>();

      List<Tuple2<String, Integer>> data = DriverTestData.createReduceImmutableData();
      TypeInformation<Tuple2<String, Integer>> typeInfo = TypeExtractor.getForObject(data.get(0));
      MutableObjectIterator<Tuple2<String, Integer>> input = EmptyMutableObjectIterator.get();
      context.setDriverStrategy(DriverStrategy.ALL_REDUCE);

      context.setInput1(input, typeInfo.createSerializer());
      context.setCollector(new DiscardingOutputCollector<Tuple2<String, Integer>>());

      AllReduceDriver<Tuple2<String, Integer>> driver =
          new AllReduceDriver<Tuple2<String, Integer>>();
      driver.setup(context);
      driver.prepare();
      driver.run();
    } catch (Exception e) {
      System.err.println(e.getMessage());
      e.printStackTrace();
      Assert.fail(e.getMessage());
    }
  }
 private TypeSerializer<Object> createSerializer(Object key, int pos) {
   if (key == null) {
     throw new NullKeyFieldException(pos);
   }
   try {
     TypeInformation<Object> info = TypeExtractor.getForObject(key);
     return info.createSerializer(executionConfig);
   } catch (Throwable t) {
     throw new RuntimeException("Could not create key serializer for type " + key);
   }
 }
示例#4
0
  @Test
  public void testTypeInfo() {
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

    DataStream<Long> src1 = env.generateSequence(0, 0);
    assertEquals(TypeExtractor.getForClass(Long.class), src1.getType());

    DataStream<Tuple2<Integer, String>> map =
        src1.map(
            new MapFunction<Long, Tuple2<Integer, String>>() {
              @Override
              public Tuple2<Integer, String> map(Long value) throws Exception {
                return null;
              }
            });

    assertEquals(TypeExtractor.getForObject(new Tuple2<>(0, "")), map.getType());

    DataStream<String> window =
        map.windowAll(GlobalWindows.create())
            .trigger(PurgingTrigger.of(CountTrigger.of(5)))
            .apply(
                new AllWindowFunction<Tuple2<Integer, String>, String, GlobalWindow>() {
                  @Override
                  public void apply(
                      GlobalWindow window,
                      Iterable<Tuple2<Integer, String>> values,
                      Collector<String> out)
                      throws Exception {}
                });

    assertEquals(TypeExtractor.getForClass(String.class), window.getType());

    DataStream<CustomPOJO> flatten =
        window
            .windowAll(GlobalWindows.create())
            .trigger(PurgingTrigger.of(CountTrigger.of(5)))
            .fold(
                new CustomPOJO(),
                new FoldFunction<String, CustomPOJO>() {
                  private static final long serialVersionUID = 1L;

                  @Override
                  public CustomPOJO fold(CustomPOJO accumulator, String value) throws Exception {
                    return null;
                  }
                });

    assertEquals(TypeExtractor.getForClass(CustomPOJO.class), flatten.getType());
  }
  private static DataStream<Tuple1<String>> getTextDataStream(
      final StreamExecutionEnvironment env) {
    if (fileOutput) {
      // read the text file from given input path
      TupleTypeInfo<Tuple1<String>> sourceType =
          (TupleTypeInfo<Tuple1<String>>) TypeExtractor.getForObject(new Tuple1<String>(""));
      return env.createInput(
          new CsvInputFormat<Tuple1<String>>(
              new Path(textPath),
              CsvInputFormat.DEFAULT_LINE_DELIMITER,
              CsvInputFormat.DEFAULT_LINE_DELIMITER,
              sourceType),
          sourceType);
    }

    return env.fromElements(WordCountDataTuple.TUPLES);
  }
示例#6
0
  @Test
  public void testTypeInfo() {
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

    DataStream<Long> src1 = env.generateSequence(0, 0);
    assertEquals(TypeExtractor.getForClass(Long.class), src1.getType());

    DataStream<Tuple2<Integer, String>> map =
        src1.map(
            new MapFunction<Long, Tuple2<Integer, String>>() {
              @Override
              public Tuple2<Integer, String> map(Long value) throws Exception {
                return null;
              }
            });

    assertEquals(TypeExtractor.getForObject(new Tuple2<Integer, String>(0, "")), map.getType());

    WindowedDataStream<String> window =
        map.window(Count.of(5))
            .mapWindow(
                new WindowMapFunction<Tuple2<Integer, String>, String>() {
                  @Override
                  public void mapWindow(
                      Iterable<Tuple2<Integer, String>> values, Collector<String> out)
                      throws Exception {}
                });

    assertEquals(TypeExtractor.getForClass(String.class), window.getType());

    DataStream<CustomPOJO> flatten =
        window
            .foldWindow(
                new CustomPOJO(),
                new FoldFunction<String, CustomPOJO>() {
                  @Override
                  public CustomPOJO fold(CustomPOJO accumulator, String value) throws Exception {
                    return null;
                  }
                })
            .flatten();

    assertEquals(TypeExtractor.getForClass(CustomPOJO.class), flatten.getType());
  }
  @Test
  public void testImmutableEmpty() {
    try {
      TestTaskContext<ReduceFunction<Tuple2<String, Integer>>, Tuple2<String, Integer>> context =
          new TestTaskContext<ReduceFunction<Tuple2<String, Integer>>, Tuple2<String, Integer>>(
              1024 * 1024);
      context.getTaskConfig().setRelativeMemoryDriver(0.5);

      List<Tuple2<String, Integer>> data = DriverTestData.createReduceImmutableData();
      Collections.shuffle(data);

      TupleTypeInfo<Tuple2<String, Integer>> typeInfo =
          (TupleTypeInfo<Tuple2<String, Integer>>) TypeExtractor.getForObject(data.get(0));
      MutableObjectIterator<Tuple2<String, Integer>> input = EmptyMutableObjectIterator.get();

      context.setDriverStrategy(DriverStrategy.SORTED_PARTIAL_REDUCE);
      TypeComparator<Tuple2<String, Integer>> comparator =
          typeInfo.createComparator(new int[] {0}, new boolean[] {true}, 0, new ExecutionConfig());

      GatheringCollector<Tuple2<String, Integer>> result =
          new GatheringCollector<Tuple2<String, Integer>>(
              typeInfo.createSerializer(new ExecutionConfig()));

      context.setInput1(input, typeInfo.createSerializer(new ExecutionConfig()));
      context.setComparator1(comparator);
      context.setCollector(result);

      ReduceCombineDriver<Tuple2<String, Integer>> driver =
          new ReduceCombineDriver<Tuple2<String, Integer>>();
      driver.setup(context);
      driver.prepare();
      driver.run();

      Assert.assertEquals(0, result.getList().size());
    } catch (Exception e) {
      System.err.println(e.getMessage());
      e.printStackTrace();
      Assert.fail(e.getMessage());
    }
  }
  @Test
  public void testReduceDriverMutable() {
    try {
      {
        TestTaskContext<
                ReduceFunction<Tuple2<StringValue, IntValue>>, Tuple2<StringValue, IntValue>>
            context =
                new TestTaskContext<
                    ReduceFunction<Tuple2<StringValue, IntValue>>, Tuple2<StringValue, IntValue>>(
                    1024 * 1024);
        context.getTaskConfig().setRelativeMemoryDriver(0.5);

        List<Tuple2<StringValue, IntValue>> data = DriverTestData.createReduceMutableData();
        TupleTypeInfo<Tuple2<StringValue, IntValue>> typeInfo =
            (TupleTypeInfo<Tuple2<StringValue, IntValue>>) TypeExtractor.getForObject(data.get(0));
        MutableObjectIterator<Tuple2<StringValue, IntValue>> input =
            new RegularToMutableObjectIterator<Tuple2<StringValue, IntValue>>(
                data.iterator(), typeInfo.createSerializer(new ExecutionConfig()));
        TypeComparator<Tuple2<StringValue, IntValue>> comparator =
            typeInfo.createComparator(
                new int[] {0}, new boolean[] {true}, 0, new ExecutionConfig());

        GatheringCollector<Tuple2<StringValue, IntValue>> result =
            new GatheringCollector<Tuple2<StringValue, IntValue>>(
                typeInfo.createSerializer(new ExecutionConfig()));

        context.setDriverStrategy(DriverStrategy.SORTED_PARTIAL_REDUCE);
        context.setInput1(input, typeInfo.createSerializer(new ExecutionConfig()));
        context.setComparator1(comparator);
        context.setCollector(result);
        context.setUdf(new ConcatSumFirstMutableReducer());

        ReduceCombineDriver<Tuple2<StringValue, IntValue>> driver =
            new ReduceCombineDriver<Tuple2<StringValue, IntValue>>();
        driver.setup(context);
        driver.prepare();
        driver.run();

        Object[] res = result.getList().toArray();
        Object[] expected = DriverTestData.createReduceMutableDataGroupedResult().toArray();

        DriverTestData.compareTupleArrays(expected, res);
      }
      {
        TestTaskContext<
                ReduceFunction<Tuple2<StringValue, IntValue>>, Tuple2<StringValue, IntValue>>
            context =
                new TestTaskContext<
                    ReduceFunction<Tuple2<StringValue, IntValue>>, Tuple2<StringValue, IntValue>>(
                    1024 * 1024);
        context.getTaskConfig().setRelativeMemoryDriver(0.5);

        List<Tuple2<StringValue, IntValue>> data = DriverTestData.createReduceMutableData();
        TupleTypeInfo<Tuple2<StringValue, IntValue>> typeInfo =
            (TupleTypeInfo<Tuple2<StringValue, IntValue>>) TypeExtractor.getForObject(data.get(0));
        MutableObjectIterator<Tuple2<StringValue, IntValue>> input =
            new RegularToMutableObjectIterator<Tuple2<StringValue, IntValue>>(
                data.iterator(), typeInfo.createSerializer(new ExecutionConfig()));
        TypeComparator<Tuple2<StringValue, IntValue>> comparator =
            typeInfo.createComparator(
                new int[] {0}, new boolean[] {true}, 0, new ExecutionConfig());

        GatheringCollector<Tuple2<StringValue, IntValue>> result =
            new GatheringCollector<Tuple2<StringValue, IntValue>>(
                typeInfo.createSerializer(new ExecutionConfig()));

        context.setDriverStrategy(DriverStrategy.SORTED_PARTIAL_REDUCE);
        context.setInput1(input, typeInfo.createSerializer(new ExecutionConfig()));
        context.setComparator1(comparator);
        context.setCollector(result);
        context.setUdf(new ConcatSumSecondMutableReducer());

        ReduceCombineDriver<Tuple2<StringValue, IntValue>> driver =
            new ReduceCombineDriver<Tuple2<StringValue, IntValue>>();
        driver.setup(context);
        driver.prepare();
        driver.run();

        Object[] res = result.getList().toArray();
        Object[] expected = DriverTestData.createReduceMutableDataGroupedResult().toArray();

        DriverTestData.compareTupleArrays(expected, res);
      }
    } catch (Exception e) {
      System.err.println(e.getMessage());
      e.printStackTrace();
      Assert.fail(e.getMessage());
    }
  }
public class TumblingGroupedPreReducerTest {

  TypeInformation<Tuple2<Integer, Integer>> type =
      TypeExtractor.getForObject(new Tuple2<Integer, Integer>(1, 1));
  TypeSerializer<Tuple2<Integer, Integer>> serializer = type.createSerializer(null);

  KeySelector<Tuple2<Integer, Integer>, ?> key =
      KeySelectorUtil.getSelectorForKeys(
          new Keys.ExpressionKeys<Tuple2<Integer, Integer>>(new int[] {0}, type), type, null);

  Reducer reducer = new Reducer();

  @SuppressWarnings("unchecked")
  @Test
  public void testEmitWindow() throws Exception {

    List<Tuple2<Integer, Integer>> inputs = new ArrayList<Tuple2<Integer, Integer>>();
    inputs.add(new Tuple2<Integer, Integer>(1, 1));
    inputs.add(new Tuple2<Integer, Integer>(0, 0));
    inputs.add(new Tuple2<Integer, Integer>(1, -1));
    inputs.add(new Tuple2<Integer, Integer>(1, -2));

    TestCollector<StreamWindow<Tuple2<Integer, Integer>>> collector =
        new TestCollector<StreamWindow<Tuple2<Integer, Integer>>>();
    List<StreamWindow<Tuple2<Integer, Integer>>> collected = collector.getCollected();

    WindowBuffer<Tuple2<Integer, Integer>> wb =
        new TumblingGroupedPreReducer<Tuple2<Integer, Integer>>(reducer, key, serializer);

    wb.store(serializer.copy(inputs.get(0)));
    wb.store(serializer.copy(inputs.get(1)));
    wb.emitWindow(collector);
    wb.evict(2);

    assertEquals(1, collected.size());

    assertSetEquals(
        StreamWindow.fromElements(
            new Tuple2<Integer, Integer>(1, 1), new Tuple2<Integer, Integer>(0, 0)),
        collected.get(0));

    wb.store(serializer.copy(inputs.get(0)));
    wb.store(serializer.copy(inputs.get(1)));
    wb.store(serializer.copy(inputs.get(2)));

    wb.store(serializer.copy(inputs.get(3)));

    wb.emitWindow(collector);
    wb.evict(4);

    assertEquals(2, collected.size());

    assertSetEquals(
        StreamWindow.fromElements(
            new Tuple2<Integer, Integer>(3, -2), new Tuple2<Integer, Integer>(0, 0)),
        collected.get(1));

    // Test whether function is mutating inputs or not
    assertEquals(2, reducer.allInputs.size());
    assertEquals(reducer.allInputs.get(0), inputs.get(2));
    assertEquals(reducer.allInputs.get(1), inputs.get(3));
  }

  @SuppressWarnings("unchecked")
  @Test
  public void testEmitWindow2() throws Exception {

    List<Tuple2<Integer, Integer>> inputs = new ArrayList<Tuple2<Integer, Integer>>();
    inputs.add(new Tuple2<Integer, Integer>(1, 1));
    inputs.add(new Tuple2<Integer, Integer>(0, 0));
    inputs.add(new Tuple2<Integer, Integer>(1, -1));
    inputs.add(new Tuple2<Integer, Integer>(1, -2));

    TestCollector<StreamWindow<Tuple2<Integer, Integer>>> collector =
        new TestCollector<StreamWindow<Tuple2<Integer, Integer>>>();
    List<StreamWindow<Tuple2<Integer, Integer>>> collected = collector.getCollected();

    WindowBuffer<Tuple2<Integer, Integer>> wb =
        new TumblingGroupedPreReducer<Tuple2<Integer, Integer>>(reducer, key, serializer)
            .sequentialID();

    wb.store(serializer.copy(inputs.get(0)));
    wb.store(serializer.copy(inputs.get(1)));
    wb.emitWindow(collector);
    wb.evict(2);

    assertSetEquals(StreamWindow.fromElements(inputs.get(0), inputs.get(1)), collected.get(0));

    wb.store(serializer.copy(inputs.get(0)));
    wb.store(serializer.copy(inputs.get(1)));
    wb.store(serializer.copy(inputs.get(2)));
    wb.emitWindow(collector);
    wb.evict(3);

    assertSetEquals(
        StreamWindow.fromElements(new Tuple2<Integer, Integer>(2, 0), inputs.get(1)),
        collected.get(1));
  }

  private static <T> void assertSetEquals(Collection<T> first, Collection<T> second) {
    assertEquals(new HashSet<T>(first), new HashSet<T>(second));
  }

  @SuppressWarnings("serial")
  private class Reducer implements ReduceFunction<Tuple2<Integer, Integer>> {

    public List<Tuple2<Integer, Integer>> allInputs = new ArrayList<Tuple2<Integer, Integer>>();

    @Override
    public Tuple2<Integer, Integer> reduce(
        Tuple2<Integer, Integer> value1, Tuple2<Integer, Integer> value2) throws Exception {
      allInputs.add(value2);
      value1.f0 = value1.f0 + value2.f0;
      value1.f1 = value1.f1 + value2.f1;
      return value1;
    }
  }
}
public class SlidingTimePreReducerTest {

  TypeSerializer<Integer> serializer = TypeExtractor.getForObject(1).createSerializer(null);
  TypeInformation<Tuple2<Integer, Integer>> tupleType =
      TypeInfoParser.parse("Tuple2<Integer,Integer>");

  ReduceFunction<Integer> reducer = new SumReducer();
  ReduceFunction<Tuple2<Integer, Integer>> tupleReducer = new TupleSumReducer();

  @Test
  @SuppressWarnings("unchecked")
  public void testPreReduce1() throws Exception {
    // This ensures that the buffer is properly cleared after a burst of elements by
    // replaying the same sequence of elements with a later timestamp and expecting the same
    // result.

    TestOutput<StreamWindow<Tuple2<Integer, Integer>>> collector =
        new TestOutput<StreamWindow<Tuple2<Integer, Integer>>>();

    SlidingTimePreReducer<Tuple2<Integer, Integer>> preReducer =
        new SlidingTimePreReducer<Tuple2<Integer, Integer>>(
            tupleReducer,
            tupleType.createSerializer(new ExecutionConfig()),
            3,
            2,
            new TimestampWrapper<Tuple2<Integer, Integer>>(
                new Timestamp<Tuple2<Integer, Integer>>() {

                  private static final long serialVersionUID = 1L;

                  @Override
                  public long getTimestamp(Tuple2<Integer, Integer> value) {
                    return value.f0;
                  }
                },
                1));

    int timeOffset = 0;

    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 1, 1));
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 2, 2));
    preReducer.emitWindow(collector);
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 3, 3));
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 4, 4));
    preReducer.evict(1);
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 5, 5));
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 6, 6));
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 7, 7));
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 8, 8));
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 9, 9));
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 10, 10));
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 11, 11));
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 12, 12));
    preReducer.emitWindow(collector);
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 13, 13));

    // ensure that everything is cleared out
    preReducer.evict(100);

    timeOffset = 25; // a little while later...

    // Repeat the same sequence, this should produce the same result
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 1, 1));
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 2, 2));
    preReducer.emitWindow(collector);
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 3, 3));
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 4, 4));
    preReducer.evict(1);
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 5, 5));
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 6, 6));
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 7, 7));
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 8, 8));
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 9, 9));
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 10, 10));
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 11, 11));
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 12, 12));
    preReducer.emitWindow(collector);
    preReducer.store(new Tuple2<Integer, Integer>(timeOffset + 13, 13));

    List<StreamWindow<Tuple2<Integer, Integer>>> expected =
        new ArrayList<StreamWindow<Tuple2<Integer, Integer>>>();
    timeOffset = 0; // rewind ...
    expected.add(StreamWindow.fromElements(new Tuple2<Integer, Integer>(timeOffset + 1, 3)));
    expected.add(StreamWindow.fromElements(new Tuple2<Integer, Integer>(timeOffset + 2, 9)));
    expected.add(StreamWindow.fromElements(new Tuple2<Integer, Integer>(timeOffset + 4, 15)));
    expected.add(StreamWindow.fromElements(new Tuple2<Integer, Integer>(timeOffset + 6, 21)));
    expected.add(StreamWindow.fromElements(new Tuple2<Integer, Integer>(timeOffset + 8, 27)));
    expected.add(StreamWindow.fromElements(new Tuple2<Integer, Integer>(timeOffset + 10, 33)));

    timeOffset = 25; // and back to the future ...
    expected.add(StreamWindow.fromElements(new Tuple2<Integer, Integer>(timeOffset + 1, 3)));
    expected.add(StreamWindow.fromElements(new Tuple2<Integer, Integer>(timeOffset + 2, 9)));
    expected.add(StreamWindow.fromElements(new Tuple2<Integer, Integer>(timeOffset + 4, 15)));
    expected.add(StreamWindow.fromElements(new Tuple2<Integer, Integer>(timeOffset + 6, 21)));
    expected.add(StreamWindow.fromElements(new Tuple2<Integer, Integer>(timeOffset + 8, 27)));
    expected.add(StreamWindow.fromElements(new Tuple2<Integer, Integer>(timeOffset + 10, 33)));

    assertEquals(expected, collector.getCollected());
  }

  @Test
  public void testPreReduce2() throws Exception {
    TestOutput<StreamWindow<Integer>> collector = new TestOutput<StreamWindow<Integer>>();

    SlidingTimePreReducer<Integer> preReducer =
        new SlidingTimePreReducer<Integer>(
            reducer,
            serializer,
            5,
            2,
            new TimestampWrapper<Integer>(
                new Timestamp<Integer>() {

                  private static final long serialVersionUID = 1L;

                  @Override
                  public long getTimestamp(Integer value) {
                    return value;
                  }
                },
                1));

    preReducer.store(1);
    preReducer.store(2);
    preReducer.emitWindow(collector);
    preReducer.store(3);
    preReducer.store(4);
    preReducer.emitWindow(collector);
    preReducer.store(5);
    preReducer.store(6);
    preReducer.evict(1);
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(7);
    preReducer.store(8);
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(9);
    preReducer.store(10);
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(11);
    preReducer.store(12);
    preReducer.emitWindow(collector);
    preReducer.store(13);

    List<StreamWindow<Integer>> expected = new ArrayList<StreamWindow<Integer>>();
    expected.add(StreamWindow.fromElements(3));
    expected.add(StreamWindow.fromElements(10));
    expected.add(StreamWindow.fromElements(20));
    expected.add(StreamWindow.fromElements(30));
    expected.add(StreamWindow.fromElements(40));
    expected.add(StreamWindow.fromElements(50));

    assertEquals(expected, collector.getCollected());
  }

  @Test
  public void testPreReduce3() throws Exception {
    TestOutput<StreamWindow<Integer>> collector = new TestOutput<StreamWindow<Integer>>();

    SlidingTimePreReducer<Integer> preReducer =
        new SlidingTimePreReducer<Integer>(
            reducer,
            serializer,
            6,
            3,
            new TimestampWrapper<Integer>(
                new Timestamp<Integer>() {

                  private static final long serialVersionUID = 1L;

                  @Override
                  public long getTimestamp(Integer value) {
                    return value;
                  }
                },
                1));

    preReducer.store(1);
    preReducer.store(2);
    preReducer.store(3);
    preReducer.emitWindow(collector);
    preReducer.store(4);
    preReducer.store(5);
    preReducer.store(6);
    preReducer.emitWindow(collector);
    preReducer.evict(3);
    preReducer.store(7);
    preReducer.store(8);
    preReducer.store(9);
    preReducer.emitWindow(collector);
    preReducer.evict(3);
    preReducer.store(10);
    preReducer.store(11);
    preReducer.store(12);
    preReducer.emitWindow(collector);
    preReducer.evict(3);
    preReducer.store(13);

    List<StreamWindow<Integer>> expected = new ArrayList<StreamWindow<Integer>>();
    expected.add(StreamWindow.fromElements(6));
    expected.add(StreamWindow.fromElements(21));
    expected.add(StreamWindow.fromElements(39));
    expected.add(StreamWindow.fromElements(57));

    assertEquals(expected, collector.getCollected());
  }

  @Test
  public void testPreReduce4() throws Exception {
    TestOutput<StreamWindow<Integer>> collector = new TestOutput<StreamWindow<Integer>>();

    SlidingTimePreReducer<Integer> preReducer =
        new SlidingTimePreReducer<Integer>(
            reducer,
            serializer,
            3,
            2,
            new TimestampWrapper<Integer>(
                new Timestamp<Integer>() {

                  private static final long serialVersionUID = 1L;

                  @Override
                  public long getTimestamp(Integer value) {
                    return value;
                  }
                },
                1));

    preReducer.store(1);
    preReducer.store(2);
    preReducer.emitWindow(collector);
    preReducer.store(3);
    preReducer.store(4);
    preReducer.evict(1);
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(5);
    preReducer.store(6);
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(7);
    preReducer.store(8);
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.emitWindow(collector);
    preReducer.emitWindow(collector);
    preReducer.evict(2);
    preReducer.store(14);
    preReducer.emitWindow(collector);
    preReducer.emitWindow(collector);
    preReducer.evict(1);
    preReducer.emitWindow(collector);
    preReducer.emitWindow(collector);
    preReducer.store(21);
    preReducer.emitWindow(collector);
    preReducer.evict(1);
    preReducer.emitWindow(collector);

    preReducer.store(9);

    List<StreamWindow<Integer>> expected = new ArrayList<StreamWindow<Integer>>();
    expected.add(StreamWindow.fromElements(3));
    expected.add(StreamWindow.fromElements(9));
    expected.add(StreamWindow.fromElements(15));
    expected.add(StreamWindow.fromElements(21));
    expected.add(StreamWindow.fromElements(8));
    expected.add(StreamWindow.fromElements(8));
    expected.add(StreamWindow.fromElements(14));
    expected.add(StreamWindow.fromElements(14));
    expected.add(StreamWindow.fromElements(21));

    assertEquals(expected, collector.getCollected());
  }

  private static class SumReducer implements ReduceFunction<Integer> {

    private static final long serialVersionUID = 1L;

    @Override
    public Integer reduce(Integer value1, Integer value2) throws Exception {
      return value1 + value2;
    }
  }

  private static class TupleSumReducer implements ReduceFunction<Tuple2<Integer, Integer>> {

    private static final long serialVersionUID = 1L;

    @Override
    public Tuple2<Integer, Integer> reduce(
        Tuple2<Integer, Integer> value1, Tuple2<Integer, Integer> value2) throws Exception {
      return new Tuple2<Integer, Integer>(value1.f0, value1.f1 + value2.f1);
    }
  }
}
  @Test
  public void testAllReduceDriverImmutable() {
    try {
      {
        TestTaskContext<ReduceFunction<Tuple2<String, Integer>>, Tuple2<String, Integer>> context =
            new TestTaskContext<ReduceFunction<Tuple2<String, Integer>>, Tuple2<String, Integer>>();

        List<Tuple2<String, Integer>> data = DriverTestData.createReduceImmutableData();
        TypeInformation<Tuple2<String, Integer>> typeInfo = TypeExtractor.getForObject(data.get(0));
        MutableObjectIterator<Tuple2<String, Integer>> input =
            new RegularToMutableObjectIterator<Tuple2<String, Integer>>(
                data.iterator(), typeInfo.createSerializer());

        GatheringCollector<Tuple2<String, Integer>> result =
            new GatheringCollector<Tuple2<String, Integer>>(typeInfo.createSerializer());

        context.setDriverStrategy(DriverStrategy.ALL_REDUCE);
        context.setInput1(input, typeInfo.createSerializer());
        context.setCollector(result);
        context.setUdf(new ConcatSumFirstReducer());

        AllReduceDriver<Tuple2<String, Integer>> driver =
            new AllReduceDriver<Tuple2<String, Integer>>();
        driver.setup(context);
        driver.prepare();
        driver.run();

        Tuple2<String, Integer> res = result.getList().get(0);

        char[] foundString = res.f0.toCharArray();
        Arrays.sort(foundString);

        char[] expectedString = "abcddeeeffff".toCharArray();
        Arrays.sort(expectedString);

        Assert.assertArrayEquals(expectedString, foundString);
        Assert.assertEquals(78, res.f1.intValue());
      }

      {
        TestTaskContext<ReduceFunction<Tuple2<String, Integer>>, Tuple2<String, Integer>> context =
            new TestTaskContext<ReduceFunction<Tuple2<String, Integer>>, Tuple2<String, Integer>>();

        List<Tuple2<String, Integer>> data = DriverTestData.createReduceImmutableData();
        TypeInformation<Tuple2<String, Integer>> typeInfo = TypeExtractor.getForObject(data.get(0));
        MutableObjectIterator<Tuple2<String, Integer>> input =
            new RegularToMutableObjectIterator<Tuple2<String, Integer>>(
                data.iterator(), typeInfo.createSerializer());

        GatheringCollector<Tuple2<String, Integer>> result =
            new GatheringCollector<Tuple2<String, Integer>>(typeInfo.createSerializer());

        context.setDriverStrategy(DriverStrategy.ALL_REDUCE);
        context.setInput1(input, typeInfo.createSerializer());
        context.setCollector(result);
        context.setUdf(new ConcatSumSecondReducer());

        AllReduceDriver<Tuple2<String, Integer>> driver =
            new AllReduceDriver<Tuple2<String, Integer>>();
        driver.setup(context);
        driver.prepare();
        driver.run();

        Tuple2<String, Integer> res = result.getList().get(0);

        char[] foundString = res.f0.toCharArray();
        Arrays.sort(foundString);

        char[] expectedString = "abcddeeeffff".toCharArray();
        Arrays.sort(expectedString);

        Assert.assertArrayEquals(expectedString, foundString);
        Assert.assertEquals(78, res.f1.intValue());
      }
    } catch (Exception e) {
      System.err.println(e.getMessage());
      e.printStackTrace();
      Assert.fail(e.getMessage());
    }
  }
public class JumpingTimePreReducerTest {

  TypeSerializer<Integer> serializer = TypeExtractor.getForObject(1).createSerializer(null);

  ReduceFunction<Integer> reducer = new SumReducer();

  @Test
  public void testEmitWindow() throws Exception {

    TestCollector<StreamWindow<Integer>> collector = new TestCollector<StreamWindow<Integer>>();
    List<StreamWindow<Integer>> collected = collector.getCollected();

    WindowBuffer<Integer> wb =
        new JumpingTimePreReducer<Integer>(
            reducer,
            serializer,
            3,
            2,
            new TimestampWrapper<Integer>(
                new Timestamp<Integer>() {

                  private static final long serialVersionUID = 1L;

                  @Override
                  public long getTimestamp(Integer value) {
                    return value;
                  }
                },
                1));

    wb.store(1);
    wb.store(2);
    wb.store(3);
    wb.evict(1);
    wb.emitWindow(collector);

    assertEquals(1, collected.size());
    assertEquals(StreamWindow.fromElements(5), collected.get(0));

    wb.store(4);
    wb.store(5);

    // Nothing should happen here
    wb.evict(2);

    wb.store(6);

    wb.emitWindow(collector);
    wb.evict(2);
    wb.emitWindow(collector);
    wb.store(12);
    wb.emitWindow(collector);

    assertEquals(3, collected.size());
    assertEquals(StreamWindow.fromElements(11), collected.get(1));
    assertEquals(StreamWindow.fromElements(12), collected.get(2));
  }

  private static class SumReducer implements ReduceFunction<Integer> {

    private static final long serialVersionUID = 1L;

    @Override
    public Integer reduce(Integer value1, Integer value2) throws Exception {
      return value1 + value2;
    }
  }
}