/************************************************************************************** * 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.epl.subquery; import com.espertech.esper.client.EventBean; import com.espertech.esper.client.EventType; import com.espertech.esper.epl.agg.service.AggregationService; import com.espertech.esper.epl.expression.ExprEvaluator; import com.espertech.esper.epl.expression.ExprEvaluatorContext; import com.espertech.esper.view.ViewSupport; import java.util.Iterator; /** * View handling the insert and remove stream generated by a subselect * for application to aggregation state. */ public class SubselectAggregatorView extends ViewSupport { private final AggregationService aggregationService; private final ExprEvaluator optionalFilterExpr; private final ExprEvaluatorContext exprEvaluatorContext; /** * Ctor. * @param aggregationService for aggregating * @param optionalFilterExpr for filtering the view-posted events before aggregation * @param exprEvaluatorContext expression evaluation context */ public SubselectAggregatorView(AggregationService aggregationService, ExprEvaluator optionalFilterExpr, ExprEvaluatorContext exprEvaluatorContext) { this.aggregationService = aggregationService; this.optionalFilterExpr = optionalFilterExpr; this.exprEvaluatorContext = exprEvaluatorContext; } public void update(EventBean[] newData, EventBean[] oldData) { EventBean[] eventsPerStream = new EventBean[1]; if (newData != null) { for (EventBean theEvent : newData) { eventsPerStream[0] = theEvent; boolean isPass = filter(eventsPerStream, true, exprEvaluatorContext); if (isPass) { aggregationService.applyEnter(eventsPerStream, null, exprEvaluatorContext); } } } if (oldData != null) { for (EventBean theEvent : oldData) { eventsPerStream[0] = theEvent; boolean isPass = filter(eventsPerStream, false, exprEvaluatorContext); if (isPass) { aggregationService.applyLeave(eventsPerStream, null, exprEvaluatorContext); } } } } public EventType getEventType() { return this.getParent().getEventType(); } public Iterator<EventBean> iterator() { return this.getParent().iterator(); } private boolean filter(EventBean[] eventsPerStream, boolean isNewData, ExprEvaluatorContext exprEvaluatorContext) { if (optionalFilterExpr == null) { return true; } Boolean result = (Boolean) optionalFilterExpr.evaluate(eventsPerStream, isNewData, exprEvaluatorContext); if (result == null) { return false; } return result; } }