/* *************************************************************************************** * 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.ExprEvaluatorContext; import com.espertech.esper.epl.join.exec.base.ExecNode; import java.util.ArrayDeque; import java.util.Set; /** * Query strategy for building a join tuple set by using an execution node tree. */ public class ExecNodeQueryStrategy implements QueryStrategy { private int forStream; private int numStreams; private ExecNode execNode; /** * CTor. * * @param forStream - stream the strategy is for * @param numStreams - number of streams in total * @param execNode - execution node for building join tuple set */ public ExecNodeQueryStrategy(int forStream, int numStreams, ExecNode execNode) { this.forStream = forStream; this.numStreams = numStreams; this.execNode = execNode; } public void lookup(EventBean[] lookupEvents, Set<MultiKey<EventBean>> joinSet, ExprEvaluatorContext exprEvaluatorContext) { if (lookupEvents == null || lookupEvents.length == 0) { return; } ArrayDeque<EventBean[]> results = new ArrayDeque<EventBean[]>(); for (EventBean theEvent : lookupEvents) { // Set up prototype row EventBean[] prototype = new EventBean[numStreams]; prototype[forStream] = theEvent; // Perform execution execNode.process(theEvent, prototype, results, exprEvaluatorContext); // Convert results into unique set for (EventBean[] row : results) { joinSet.add(new MultiKey<EventBean>(row)); } results.clear(); } } /** * Return stream number this strategy is for. * * @return stream num */ protected int getForStream() { return forStream; } /** * Returns the total number of streams. * * @return number of streams */ protected int getNumStreams() { return numStreams; } /** * Returns execution node. * * @return execution node */ protected ExecNode getExecNode() { return execNode; } }