/*
* *************************************************************************************
* Copyright (C) 2008 EsperTech, Inc. All rights reserved. *
* http://esper.codehaus.org *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
* *************************************************************************************
*/
package com.espertech.esper.core.context.factory;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.epl.expression.ExprEvaluatorContext;
import com.espertech.esper.epl.expression.ExprNode;
import com.espertech.esper.epl.expression.ExprNodeUtility;
import com.espertech.esper.epl.join.base.JoinSetComposerDesc;
import com.espertech.esper.epl.named.NamedWindowTailViewInstance;
import com.espertech.esper.filter.FilterSpecCompiled;
import com.espertech.esper.view.HistoricalEventViewable;
import com.espertech.esper.view.Viewable;
import java.lang.annotation.Annotation;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class StatementAgentInstancePostLoadSelect implements StatementAgentInstancePostLoad {
private final Viewable[] streamViews;
private final JoinSetComposerDesc joinSetComposer;
private final NamedWindowTailViewInstance[] namedWindowTailViews;
private final FilterSpecCompiled[] namedWindowPostloadFilters;
private final List<ExprNode>[] namedWindowFilters;
private final Annotation[] annotations;
private final ExprEvaluatorContext exprEvaluatorContext;
public StatementAgentInstancePostLoadSelect(Viewable[] streamViews, JoinSetComposerDesc joinSetComposer, NamedWindowTailViewInstance[] namedWindowTailViews, FilterSpecCompiled[] namedWindowPostloadFilters, List<ExprNode>[] namedWindowFilters, Annotation[] annotations, ExprEvaluatorContext exprEvaluatorContext) {
this.streamViews = streamViews;
this.joinSetComposer = joinSetComposer;
this.namedWindowTailViews = namedWindowTailViews;
this.namedWindowPostloadFilters = namedWindowPostloadFilters;
this.namedWindowFilters = namedWindowFilters;
this.annotations = annotations;
this.exprEvaluatorContext = exprEvaluatorContext;
}
public void executePostLoad() {
if (joinSetComposer == null) {
return;
}
EventBean[][] events = new EventBean[streamViews.length][];
for (int stream = 0; stream < streamViews.length; stream++) {
Viewable streamView = streamViews[stream];
if (streamView instanceof HistoricalEventViewable) {
continue;
}
Collection<EventBean> eventsInWindow;
if (namedWindowTailViews[stream] != null) {
NamedWindowTailViewInstance nwtail = namedWindowTailViews[stream];
Collection<EventBean> snapshot = nwtail.snapshotNoLock(namedWindowPostloadFilters[stream], annotations);
if (namedWindowFilters[stream] != null) {
eventsInWindow = new ArrayList<EventBean>(snapshot.size());
ExprNodeUtility.applyFilterExpressionsIterable(snapshot, namedWindowFilters[stream], exprEvaluatorContext, eventsInWindow);
}
else {
eventsInWindow = snapshot;
}
}
else if (namedWindowFilters[stream] != null && !namedWindowFilters[stream].isEmpty()) {
eventsInWindow = new ArrayDeque<EventBean>();
ExprNodeUtility.applyFilterExpressionsIterable(streamViews[stream], namedWindowFilters[stream], exprEvaluatorContext, eventsInWindow);
}
else {
eventsInWindow = new ArrayDeque<EventBean>();
for (EventBean aConsumerView : streamViews[stream]) {
eventsInWindow.add(aConsumerView);
}
}
events[stream] = eventsInWindow.toArray(new EventBean[eventsInWindow.size()]);
}
joinSetComposer.getJoinSetComposer().init(events);
}
}