public static Iterator<EventBean> getIterator(
      JoinExecutionStrategy joinExecutionStrategy,
      ResultSetProcessor resultSetProcessor,
      Viewable parentView,
      boolean distinct) {
    Iterator<EventBean> iterator;
    EventType eventType;
    if (joinExecutionStrategy != null) {
      Set<MultiKey<EventBean>> joinSet = joinExecutionStrategy.staticJoin();
      iterator = resultSetProcessor.getIterator(joinSet);
      eventType = resultSetProcessor.getResultEventType();
    } else if (resultSetProcessor != null) {
      iterator = resultSetProcessor.getIterator(parentView);
      eventType = resultSetProcessor.getResultEventType();
    } else {
      iterator = parentView.iterator();
      eventType = parentView.getEventType();
    }

    if (!distinct) {
      return iterator;
    }
    return new EventDistinctIterator(iterator, eventType);
  }
 public Collection<EventBean> getSnapshot(
     EPStatementHandle createWindowStmtHandle, Viewable parent) {
   createWindowStmtHandle.getStatementLock().acquireReadLock();
   try {
     Iterator<EventBean> it = parent.iterator();
     if (!it.hasNext()) {
       return Collections.EMPTY_LIST;
     }
     ArrayDeque<EventBean> list = new ArrayDeque<EventBean>();
     while (it.hasNext()) {
       RevisionEventBeanDeclared fullRevision = (RevisionEventBeanDeclared) it.next();
       MultiKeyUntyped key = fullRevision.getKey();
       RevisionStateDeclared state = statePerKey.get(key);
       list.add(state.getLastEvent());
     }
     return list;
   } finally {
     createWindowStmtHandle.getStatementLock().releaseReadLock();
   }
 }
 public void setParent(Viewable parent) {
   super.setParent(parent);
   eventType = parent.getEventType();
 }