/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * 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.view; import com.espertech.esper.client.EventBean; import com.espertech.esper.client.EventType; import com.espertech.esper.epl.expression.core.ExprEvaluator; import com.espertech.esper.epl.expression.core.ExprEvaluatorContext; import com.espertech.esper.epl.expression.core.ExprNode; import com.espertech.esper.metrics.instrumentation.InstrumentationHelper; import com.espertech.esper.view.ViewSupport; import java.util.Iterator; /** * Simple filter view filtering events using a filter expression tree. */ public class FilterExprView extends ViewSupport { private final ExprNode exprNode; private final ExprEvaluator exprEvaluator; private final ExprEvaluatorContext exprEvaluatorContext; /** * Ctor. * * @param exprEvaluator - Filter expression evaluation impl * @param exprEvaluatorContext context for expression evalauation * @param exprNode node */ public FilterExprView(ExprNode exprNode, ExprEvaluator exprEvaluator, ExprEvaluatorContext exprEvaluatorContext) { this.exprNode = exprNode; this.exprEvaluator = exprEvaluator; this.exprEvaluatorContext = exprEvaluatorContext; } public EventType getEventType() { return parent.getEventType(); } public Iterator<EventBean> iterator() { return new FilterExprViewIterator(parent.iterator(), exprEvaluator, exprEvaluatorContext); } public void update(EventBean[] newData, EventBean[] oldData) { if (InstrumentationHelper.ENABLED) { InstrumentationHelper.get().qWhereClauseFilter(exprNode, newData, oldData); } EventBean[] filteredNewData = filterEvents(exprEvaluator, newData, true, exprEvaluatorContext); EventBean[] filteredOldData = filterEvents(exprEvaluator, oldData, false, exprEvaluatorContext); if (InstrumentationHelper.ENABLED) { InstrumentationHelper.get().aWhereClauseFilter(filteredNewData, filteredOldData); } if ((filteredNewData != null) || (filteredOldData != null)) { if (InstrumentationHelper.ENABLED) { InstrumentationHelper.get().qWhereClauseIR(filteredNewData, filteredOldData); } this.updateChildren(filteredNewData, filteredOldData); if (InstrumentationHelper.ENABLED) { InstrumentationHelper.get().aWhereClauseIR(); } } } /** * Filters events using the supplied evaluator. * * @param exprEvaluator - evaluator to use * @param events - events to filter * @param isNewData - true to indicate filter new data (istream) and not old data (rstream) * @param exprEvaluatorContext context for expression evalauation * @return filtered events, or null if no events got through the filter */ private EventBean[] filterEvents(ExprEvaluator exprEvaluator, EventBean[] events, boolean isNewData, ExprEvaluatorContext exprEvaluatorContext) { if (events == null) { return null; } EventBean[] evalEventArr = new EventBean[1]; boolean[] passResult = new boolean[events.length]; int passCount = 0; for (int i = 0; i < events.length; i++) { evalEventArr[0] = events[i]; if (InstrumentationHelper.ENABLED) { InstrumentationHelper.get().qWhereClauseFilterEval(i, events[i], isNewData); } Boolean pass = (Boolean) exprEvaluator.evaluate(evalEventArr, isNewData, exprEvaluatorContext); if (InstrumentationHelper.ENABLED) { InstrumentationHelper.get().aWhereClauseFilterEval(pass); } if ((pass != null) && pass) { passResult[i] = true; passCount++; } } if (passCount == 0) { return null; } if (passCount == events.length) { return events; } EventBean[] resultArray = new EventBean[passCount]; int count = 0; for (int i = 0; i < passResult.length; i++) { if (passResult[i]) { resultArray[count] = events[i]; count++; } } return resultArray; } }