/*
***************************************************************************************
* 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.collection.UniformPair;
import com.espertech.esper.epl.expression.core.ExprEvaluatorContext;
import com.espertech.esper.metrics.instrumentation.InstrumentationHelper;
import java.util.Set;
/**
* Join execution strategy based on a 3-step getSelectListEvents of composing a join set, filtering the join set and
* indicating.
*/
public class JoinExecutionStrategyImpl implements JoinExecutionStrategy {
private final JoinSetComposer composer;
private final JoinSetProcessor filter;
private final JoinSetProcessor indicator;
private final ExprEvaluatorContext staticExprEvaluatorContext;
/**
* Ctor.
*
* @param composer - determines join tuple set
* @param filter - for filtering among tuples
* @param indicator - for presenting the info to a view
* @param staticExprEvaluatorContext expression evaluation context for static evaluation (not for runtime eval)
*/
public JoinExecutionStrategyImpl(JoinSetComposer composer, JoinSetProcessor filter, JoinSetProcessor indicator,
ExprEvaluatorContext staticExprEvaluatorContext) {
this.composer = composer;
this.filter = filter;
this.indicator = indicator;
this.staticExprEvaluatorContext = staticExprEvaluatorContext;
}
public void join(EventBean[][] newDataPerStream, EventBean[][] oldDataPerStream) {
if (InstrumentationHelper.ENABLED) {
InstrumentationHelper.get().qJoinExexStrategy();
}
UniformPair<Set<MultiKey<EventBean>>> joinSet = composer.join(newDataPerStream, oldDataPerStream, staticExprEvaluatorContext);
if (InstrumentationHelper.ENABLED) {
InstrumentationHelper.get().aJoinExecStrategy(joinSet);
}
filter.process(joinSet.getFirst(), joinSet.getSecond(), staticExprEvaluatorContext);
if ((!joinSet.getFirst().isEmpty()) || (!joinSet.getSecond().isEmpty())) {
if (InstrumentationHelper.ENABLED) {
InstrumentationHelper.get().qJoinExecProcess(joinSet);
}
indicator.process(joinSet.getFirst(), joinSet.getSecond(), staticExprEvaluatorContext);
if (InstrumentationHelper.ENABLED) {
InstrumentationHelper.get().aJoinExecProcess();
}
}
}
public Set<MultiKey<EventBean>> staticJoin() {
Set<MultiKey<EventBean>> joinSet = composer.staticJoin();
filter.process(joinSet, null, staticExprEvaluatorContext);
return joinSet;
}
}