/**************************************************************************************
* 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.view;
import com.espertech.esper.epl.expression.ExprEvaluator;
import com.espertech.esper.epl.expression.ExprEvaluatorContext;
import com.espertech.esper.client.EventType;
import com.espertech.esper.client.EventBean;
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 ExprEvaluator exprEvaluator;
private ExprEvaluatorContext exprEvaluatorContext;
/**
* Ctor.
* @param exprEvaluator - Filter expression evaluation impl
* @param exprEvaluatorContext context for expression evalauation
*/
public FilterExprView(ExprEvaluator exprEvaluator, ExprEvaluatorContext exprEvaluatorContext)
{
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)
{
EventBean[] filteredNewData = filterEvents(exprEvaluator, newData, true, exprEvaluatorContext);
EventBean[] filteredOldData = filterEvents(exprEvaluator, oldData, false, exprEvaluatorContext);
if ((filteredNewData != null) || (filteredOldData != null))
{
this.updateChildren(filteredNewData, filteredOldData);
}
}
/**
* 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
*/
protected static 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];
Boolean pass = (Boolean) exprEvaluator.evaluate(evalEventArr, isNewData, exprEvaluatorContext);
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;
}
}