private List<Integer> seq(int start) { return seq(start, start); }
assertEquals(seq(1, 3), listener.allOnActivationEvents.get(0)); assertEquals(seq(1, 4), listener.allOnActivationEvents.get(1)); assertEquals(seq(4, 5), listener.allOnActivationEvents.get(2)); assertEquals(seq(1, 3), listener.allOnActivationExpiredEvents.get(2)); assertEquals(seq(1, 3), listener.allOnActivationNewEvents.get(0)); assertEquals(seq(4, 4), listener.allOnActivationNewEvents.get(1)); assertEquals(seq(5, 5), listener.allOnActivationNewEvents.get(2)); assertEquals(seq(1, 3), listener.allOnExpiryEvents.get(0)); assertEquals(seq(5, 6), listener.allOnActivationEvents.get(0)); assertEquals(seq(6, 6), listener.allOnActivationEvents.get(1)); assertEquals(seq(7, 9), listener.allOnActivationEvents.get(2)); assertEquals(seq(4, 4), listener.allOnActivationExpiredEvents.get(0)); assertEquals(seq(5, 5), listener.allOnActivationExpiredEvents.get(1)); assertEquals(Collections.emptyList(), listener.allOnActivationExpiredEvents.get(2)); assertEquals(seq(6, 6), listener.allOnActivationNewEvents.get(0)); assertEquals(Collections.emptyList(), listener.allOnActivationNewEvents.get(1)); assertEquals(seq(7, 9), listener.allOnActivationNewEvents.get(2)); assertEquals(seq(4, 4), listener.allOnExpiryEvents.get(0)); assertEquals(seq(5, 5), listener.allOnExpiryEvents.get(1)); assertEquals(seq(6, 6), listener.allOnExpiryEvents.get(2));
@Test public void testExpireThreshold() throws Exception { int threshold = WindowManager.EXPIRE_EVENTS_THRESHOLD; int windowLength = 5; windowManager.setEvictionPolicy(new CountEvictionPolicy<Integer>(5)); TriggerPolicy<Integer, ?> triggerPolicy = new TimeTriggerPolicy<Integer>(new Duration(1, TimeUnit.HOURS).value, windowManager); triggerPolicy.start(); windowManager.setTriggerPolicy(triggerPolicy); for (int i : seq(1, 5)) { windowManager.add(i); } // nothing expired yet assertTrue(listener.onExpiryEvents.isEmpty()); for (int i : seq(6, 10)) { windowManager.add(i); } for (int i : seq(11, threshold)) { windowManager.add(i); } // window should be compacted and events should be expired. assertEquals(seq(1, threshold - windowLength), listener.onExpiryEvents); }
private void testEvictBeforeWatermarkForWatermarkEvictionPolicy(EvictionPolicy watermarkEvictionPolicy, int windowLength) throws Exception { /** * The watermark eviction policy must not evict tuples until the first watermark has been received. * The policies can't make a meaningful decision prior to the first watermark, so the safe decision * is to postpone eviction. */ int threshold = WindowManager.EXPIRE_EVENTS_THRESHOLD; windowManager.setEvictionPolicy(watermarkEvictionPolicy); WatermarkCountTriggerPolicy triggerPolicy = new WatermarkCountTriggerPolicy(windowLength, windowManager, watermarkEvictionPolicy, windowManager); triggerPolicy.start(); windowManager.setTriggerPolicy(triggerPolicy); for (int i : seq(1, threshold)) { windowManager.add(i, i); } assertThat("The watermark eviction policies should never evict events before the first watermark is received", listener.onExpiryEvents, is(empty())); windowManager.add(new WaterMarkEvent<>(threshold)); // The events should be put in a window when the first watermark is received assertEquals(seq(1, threshold), listener.onActivationEvents); //Now add some more events and a new watermark, and check that the previous events are expired for (int i : seq(threshold + 1, threshold * 2)) { windowManager.add(i, i); } windowManager.add(new WaterMarkEvent<>(threshold + windowLength + 1)); //All the events should be expired when the next watermark is received assertThat("All the events should be expired after the second watermark", listener.onExpiryEvents, equalTo(seq(1, threshold))); }
assertEquals(seq(1, 2), listener.onActivationEvents); assertEquals(seq(1, 2), listener.onActivationNewEvents); assertTrue(listener.onActivationExpiredEvents.isEmpty()); windowManager.add(3); assertEquals(seq(1, 4), listener.onActivationEvents); assertEquals(seq(3, 4), listener.onActivationNewEvents); assertTrue(listener.onActivationExpiredEvents.isEmpty()); windowManager.add(5); windowManager.add(6); assertEquals(seq(1), listener.onExpiryEvents); assertEquals(seq(2, 6), listener.onActivationEvents); assertEquals(seq(5, 6), listener.onActivationNewEvents); assertEquals(seq(1), listener.onActivationExpiredEvents); listener.clear(); windowManager.add(7); windowManager.add(8); assertEquals(seq(2, 3), listener.onExpiryEvents); assertEquals(seq(4, 8), listener.onActivationEvents); assertEquals(seq(7, 8), listener.onActivationNewEvents); assertEquals(seq(2, 3), listener.onActivationExpiredEvents);
@Test public void testTumblingWindow() throws Exception { EvictionPolicy<Integer, ?> evictionPolicy = new CountEvictionPolicy<Integer>(3); windowManager.setEvictionPolicy(evictionPolicy); TriggerPolicy<Integer, ?> triggerPolicy = new CountTriggerPolicy<Integer>(3, windowManager, evictionPolicy); triggerPolicy.start(); windowManager.setTriggerPolicy(triggerPolicy); windowManager.add(1); windowManager.add(2); // nothing expired yet assertTrue(listener.onExpiryEvents.isEmpty()); windowManager.add(3); assertTrue(listener.onExpiryEvents.isEmpty()); assertEquals(seq(1, 3), listener.onActivationEvents); assertTrue(listener.onActivationExpiredEvents.isEmpty()); assertEquals(seq(1, 3), listener.onActivationNewEvents); listener.clear(); windowManager.add(4); windowManager.add(5); windowManager.add(6); assertEquals(seq(1, 3), listener.onExpiryEvents); assertEquals(seq(4, 6), listener.onActivationEvents); assertEquals(seq(1, 3), listener.onActivationExpiredEvents); assertEquals(seq(4, 6), listener.onActivationNewEvents); }
@Test public void testCountBasedSlidingWithSameEventTs() throws Exception { EvictionPolicy<Integer, ?> evictionPolicy = new WatermarkCountEvictionPolicy<>(5); windowManager.setEvictionPolicy(evictionPolicy); TriggerPolicy<Integer, ?> triggerPolicy = new WatermarkCountTriggerPolicy<Integer>(2, windowManager, evictionPolicy, windowManager); triggerPolicy.start(); windowManager.setTriggerPolicy(triggerPolicy); windowManager.add(1, 10); windowManager.add(2, 10); windowManager.add(3, 11); windowManager.add(4, 12); windowManager.add(5, 12); windowManager.add(6, 12); windowManager.add(7, 12); windowManager.add(8, 13); windowManager.add(9, 14); windowManager.add(10, 15); windowManager.add(new WaterMarkEvent<Integer>(20)); assertEquals(5, listener.allOnActivationEvents.size()); assertEquals(seq(1, 2), listener.allOnActivationEvents.get(0)); assertEquals(seq(1, 4), listener.allOnActivationEvents.get(1)); assertEquals(seq(2, 6), listener.allOnActivationEvents.get(2)); assertEquals(seq(4, 8), listener.allOnActivationEvents.get(3)); assertEquals(seq(6, 10), listener.allOnActivationEvents.get(4)); }
@Test public void testCountBasedTumblingWithSameEventTs() throws Exception { EvictionPolicy<Integer, ?> evictionPolicy = new WatermarkCountEvictionPolicy<>(2); windowManager.setEvictionPolicy(evictionPolicy); TriggerPolicy<Integer, ?> triggerPolicy = new WatermarkCountTriggerPolicy<Integer>(2, windowManager, evictionPolicy, windowManager); triggerPolicy.start(); windowManager.setTriggerPolicy(triggerPolicy); windowManager.add(1, 10); windowManager.add(2, 10); windowManager.add(3, 11); windowManager.add(4, 12); windowManager.add(5, 12); windowManager.add(6, 12); windowManager.add(7, 12); windowManager.add(8, 13); windowManager.add(9, 14); windowManager.add(10, 15); windowManager.add(new WaterMarkEvent<Integer>(20)); assertEquals(5, listener.allOnActivationEvents.size()); assertEquals(seq(1, 2), listener.allOnActivationEvents.get(0)); assertEquals(seq(3, 4), listener.allOnActivationEvents.get(1)); assertEquals(seq(5, 6), listener.allOnActivationEvents.get(2)); assertEquals(seq(7, 8), listener.allOnActivationEvents.get(3)); assertEquals(seq(9, 10), listener.allOnActivationEvents.get(4)); }
assertEquals(seq(1, 3), listener.allOnActivationEvents.get(0)); assertEquals(seq(2, 4), listener.allOnActivationEvents.get(1)); assertEquals(seq(3, 5), listener.allOnActivationEvents.get(2)); assertEquals(seq(4, 6), listener.allOnActivationEvents.get(0)); assertEquals(seq(4, 6), listener.allOnActivationEvents.get(1)); assertEquals(seq(4, 6), listener.allOnActivationEvents.get(2)); assertEquals(seq(7, 9), listener.allOnActivationEvents.get(3));
for (int i : seq(1, 50)) { windowManager.add(i, now - 1000); for (int i : seq(51, WindowManager.EXPIRE_EVENTS_THRESHOLD)) { windowManager.add(i, now); for (int i : seq(WindowManager.EXPIRE_EVENTS_THRESHOLD + 1, WindowManager.EXPIRE_EVENTS_THRESHOLD + 100)) { windowManager.add(i, now - 1000); assertEquals(seq(WindowManager.EXPIRE_EVENTS_THRESHOLD + 1, WindowManager.EXPIRE_EVENTS_THRESHOLD + 100), listener.onExpiryEvents); List<Integer> activationsEvents = seq(51, WindowManager.EXPIRE_EVENTS_THRESHOLD); assertEquals(seq(51, WindowManager.EXPIRE_EVENTS_THRESHOLD), listener.onActivationEvents); assertEquals(seq(51, WindowManager.EXPIRE_EVENTS_THRESHOLD), listener.onActivationNewEvents); List<Integer> expiredList = seq(1, 50); expiredList.addAll(seq(WindowManager.EXPIRE_EVENTS_THRESHOLD + 1, WindowManager.EXPIRE_EVENTS_THRESHOLD + 100)); assertEquals(expiredList, listener.onActivationExpiredEvents); List<Integer> newEvents = seq(WindowManager.EXPIRE_EVENTS_THRESHOLD + 101, WindowManager.EXPIRE_EVENTS_THRESHOLD + 200); for (int i : newEvents) { windowManager.add(i, now);
@Test public void testEventTimeLag() throws Exception { EvictionPolicy<Integer, ?> evictionPolicy = new WatermarkTimeEvictionPolicy<>(20, 5); windowManager.setEvictionPolicy(evictionPolicy); TriggerPolicy<Integer, ?> triggerPolicy = new WatermarkTimeTriggerPolicy<Integer>(10, windowManager, evictionPolicy, windowManager); triggerPolicy.start(); windowManager.setTriggerPolicy(triggerPolicy); windowManager.add(1, 603); windowManager.add(2, 605); windowManager.add(3, 607); windowManager.add(4, 618); windowManager.add(5, 626); windowManager.add(6, 632); windowManager.add(7, 629); windowManager.add(8, 636); // send a watermark event, which should trigger three windows. windowManager.add(new WaterMarkEvent<Integer>(631)); // System.out.println(listener.allOnActivationEvents); assertEquals(3, listener.allOnActivationEvents.size()); assertEquals(seq(1, 3), listener.allOnActivationEvents.get(0)); assertEquals(seq(1, 4), listener.allOnActivationEvents.get(1)); // out of order events should be processed upto the lag assertEquals(Arrays.asList(4, 5, 7), listener.allOnActivationEvents.get(2)); }
long now = System.currentTimeMillis(); for (int i : seq(1, 10)) { windowManager.add(i); windowManager.onTrigger(); assertEquals(seq(1, 10), listener.onActivationEvents); assertTrue(listener.onActivationExpiredEvents.isEmpty()); listener.clear(); windowManager.onTrigger(); assertEquals(seq(1, 10), listener.onExpiryEvents); assertTrue(listener.onActivationEvents.isEmpty()); listener.clear();