/************************************************************************************** * 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.join.plan; import com.espertech.esper.collection.Pair; import com.espertech.esper.epl.expression.ExprNode; import com.espertech.esper.epl.join.base.HistoricalIndexLookupStrategy; import com.espertech.esper.epl.join.pollindex.PollResultIndexingStrategy; import com.espertech.esper.epl.join.exec.base.ExecNode; import com.espertech.esper.epl.join.exec.base.HistoricalDataExecNode; import com.espertech.esper.epl.join.exec.base.HistoricalTableLookupStrategy; import com.espertech.esper.epl.join.table.EventTable; import com.espertech.esper.epl.join.table.HistoricalStreamIndexList; import com.espertech.esper.client.EventType; import com.espertech.esper.epl.virtualdw.VirtualDWView; import com.espertech.esper.util.IndentWriter; import com.espertech.esper.view.HistoricalEventViewable; import com.espertech.esper.view.Viewable; import java.lang.annotation.Annotation; import java.util.HashSet; import java.util.Map; /** * Query plan for performing a historical data lookup. * <p> * Translates into a particular execution for use in regular and outer joins. */ public class HistoricalDataPlanNode extends QueryPlanNode { private final int streamNum; private final int rootStreamNum; private final int lookupStreamNum; private final int numStreams; private final ExprNode outerJoinExprNode; /** * Ctor. * @param streamNum the historical stream num * @param rootStreamNum the stream number of the query plan providing incoming events * @param lookupStreamNum the stream that provides polling/lookup events * @param numStreams number of streams in join * @param exprNode outer join expression node or null if none defined */ public HistoricalDataPlanNode(int streamNum, int rootStreamNum, int lookupStreamNum, int numStreams, ExprNode exprNode) { this.streamNum = streamNum; this.rootStreamNum = rootStreamNum; this.lookupStreamNum = lookupStreamNum; this.numStreams = numStreams; this.outerJoinExprNode = exprNode; } public ExecNode makeExec(String statementName, String statementId, Annotation[] annotations, Map<String, EventTable>[] indexesPerStream, EventType[] streamTypes, Viewable[] streamViews, HistoricalStreamIndexList[] historicalStreamIndexLists, VirtualDWView[] viewExternal) { Pair<HistoricalIndexLookupStrategy, PollResultIndexingStrategy> pair = historicalStreamIndexLists[streamNum].getStrategy(lookupStreamNum); HistoricalEventViewable viewable = (HistoricalEventViewable) streamViews[streamNum]; return new HistoricalDataExecNode(viewable, pair.getSecond(), pair.getFirst(), numStreams, streamNum); } public void addIndexes(HashSet<String> usedIndexes) { // none to add } /** * Returns the table lookup strategy for use in outer joins. * @param streamViews all views in join * @param pollingStreamNum the stream number of the stream looking up into the historical * @param historicalStreamIndexLists the index management for the historical stream * @return strategy */ public HistoricalTableLookupStrategy makeOuterJoinStategy(Viewable[] streamViews, int pollingStreamNum, HistoricalStreamIndexList[] historicalStreamIndexLists) { Pair<HistoricalIndexLookupStrategy, PollResultIndexingStrategy> pair = historicalStreamIndexLists[streamNum].getStrategy(pollingStreamNum); HistoricalEventViewable viewable = (HistoricalEventViewable) streamViews[streamNum]; return new HistoricalTableLookupStrategy(viewable, pair.getSecond(), pair.getFirst(), numStreams, streamNum, rootStreamNum, outerJoinExprNode == null ? null : outerJoinExprNode.getExprEvaluator()); } protected void print(IndentWriter writer) { writer.incrIndent(); writer.println("HistoricalDataPlanNode streamNum=" + streamNum); } }