/* *************************************************************************************** * 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.join.base; import com.espertech.esper.client.EventBean; import com.espertech.esper.collection.MultiKey; import com.espertech.esper.epl.expression.core.ExprEvaluator; import com.espertech.esper.epl.expression.core.ExprEvaluatorContext; import com.espertech.esper.metrics.instrumentation.InstrumentationHelper; import java.util.Iterator; import java.util.Set; /** * Processes join tuple set by filtering out tuples. */ public class JoinSetFilter implements JoinSetProcessor { private ExprEvaluator filterExprNode; /** * Ctor. * * @param filterExprNode - filter tree */ public JoinSetFilter(ExprEvaluator filterExprNode) { this.filterExprNode = filterExprNode; } public void process(Set<MultiKey<EventBean>> newEvents, Set<MultiKey<EventBean>> oldEvents, ExprEvaluatorContext exprEvaluatorContext) { // Filter if (filterExprNode != null) { if (InstrumentationHelper.ENABLED) { if ((newEvents != null && newEvents.size() > 0) || (oldEvents != null && oldEvents.size() > 0)) { InstrumentationHelper.get().qJoinExecFilter(); filter(filterExprNode, newEvents, true, exprEvaluatorContext); if (oldEvents != null) { filter(filterExprNode, oldEvents, false, exprEvaluatorContext); } InstrumentationHelper.get().aJoinExecFilter(newEvents, oldEvents); } return; } filter(filterExprNode, newEvents, true, exprEvaluatorContext); if (oldEvents != null) { filter(filterExprNode, oldEvents, false, exprEvaluatorContext); } } } /** * Filter event by applying the filter nodes evaluation method. * * @param filterExprNode - top node of the filter expression tree. * @param events - set of tuples of events * @param isNewData - true to indicate filter new data (istream) and not old data (rstream) * @param exprEvaluatorContext expression evaluation context */ protected static void filter(ExprEvaluator filterExprNode, Set<MultiKey<EventBean>> events, boolean isNewData, ExprEvaluatorContext exprEvaluatorContext) { for (Iterator<MultiKey<EventBean>> it = events.iterator(); it.hasNext(); ) { MultiKey<EventBean> key = it.next(); EventBean[] eventArr = key.getArray(); Boolean matched = (Boolean) filterExprNode.evaluate(eventArr, isNewData, exprEvaluatorContext); if ((matched == null) || (!matched)) { it.remove(); } } } }